diff --git a/README.md b/README.md index f57ce0f..167b5dc 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,25 @@ I hope it works`, }); ``` +If you want to upload non-text data, you can `base64`` encode the content and provide that as the value. Here's an example that would upload a small GitHub icon to a repository: + +```javascript +const commits = await octokit.rest.repos.createOrUpdateFiles({ + owner, + repo, + branch, + createBranch, + changes: [ + { + message: "Add Icon", + files: { + "icon.png": `iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADFUlEQVR42u2WXyjzYRTHvz/N3zZ/5sJyoWEUEleKrYbcaEXKXCBWVsrFkii3LrVwo6Sslj/hhqS4cecOtcWFtUbI34RlNn83786p1fu+F+9+a/Ou982pp56e3+l3Ps855/k+j6BWqwMABMTBPoMmBAE+4xE8ZN8A3wCiAYqKinB8fAy/3/9Hv6ysLCQnJ+P6+jp2AEqlEvPz87i/v8fc3By2t7dRUFCAzMxM/k7rNDo7O1FbWwu73Q6TyRQ7gOrqapjNZtFpvby8RFtbW+wAVCoVrFaraICTkxPORswAhoaG0NzcLBqAbGxsDKurq9EDyGQyrK+vQyKRRARwdnaG9vb26AHKy8sxNTXF8/39fSwsLODx8RGpqalIS0sjPYfP58Pz8zOys7NhMBj4xNB6XV0dPj4+ogMoKyvD9PQ0bm5u0NHRgZaWFg5ssVh+8aOaJyUlYWVlBUtLS5BKpXwiogaQy+VYW1vDxsYGxsfHUV9fj6urK9ze3uLi4oJ9UlJSoNVqcXd3x6kfHBzkzDU2NkZeAhKShIQETiH9mHY7MjKC8/NzDA8Pw9DdDc/TEzY3Nznt5CcIArq6urgU1C8TExO8To1IPjTIh9ZIL8ICkDMNr9eLl5cX3g39rK+vj1NKYA6HgwXq7e2Nz31+fj6X4PX1lcvT39+Pg4MDVkUqBwWn8fDwEFkJEhMT8f7+jtLSUhiNRjidTuzu7rLUymTSIJAfHo+HS1VRUYGamhrMzs5ib28vbPpFAVDNqRFnZmY4lQqFAg0NDejt7eUskdHOSKi2trZwenoqKrBoALKenh4EAgEsLi7yZTQ6OoqqqiqeU3DSiJ2dHQwMDEQUXDRAeno6JicnuSGpLwoLC2Gz2ZCTk8NZcbvdyM3NhV6v/xqAEASda2oq6niqcUlJCQMcHR2hsrISra2tXwfwsy0vL+Pw8BDFxcXc9X8VgBqPhIlqTgB0QlwuFzQaDZqamsI+WKIG0Ol0fOYzMjJY+UgH8vLyWKpJDwjuSwFCRi8ieqL9Po/U/p1H6TfA/wsQvL0CQuhWiYP9AJQGkyweNFh0AAAAAElFTkSuQmCC` + } + }, + ], +}); +``` + In addition, you can set the `mode` of a file change. For example, if you wanted to update a submodule pointer: ```javascript diff --git a/create-or-update-files.js b/create-or-update-files.js index 5f7f60f..c1391f7 100644 --- a/create-or-update-files.js +++ b/create-or-update-files.js @@ -1,3 +1,4 @@ +const isBase64 = require("is-base64"); module.exports = function(octokit, opts) { return new Promise(async (resolve, reject) => { // Up front validation @@ -247,11 +248,17 @@ async function createBlob(octokit, owner, repo, contents, type) { if (type === "commit") { return contents; } else { + let content = contents; + + if (!isBase64(content)) { + content = Buffer.from(contents).toString("base64"); + } + const file = ( await octokit.rest.git.createBlob({ owner, repo, - content: Buffer.from(contents).toString("base64"), + content, encoding: "base64" }) ).data; diff --git a/create-or-update-files.test.js b/create-or-update-files.test.js index b27c7df..95936d0 100644 --- a/create-or-update-files.test.js +++ b/create-or-update-files.test.js @@ -189,6 +189,31 @@ test(`success (branch exists)`, async () => { await expect(run(body)).resolves.toEqual(mockCommitList); }); +test(`success (base64 encoded body)`, async () => { + const body = { + ...validRequest, + changes: [ + { + message: "Your commit message", + files: { + "test.md": "SGVsbG8gV29ybGQ=", + "test2.md": { + contents: `Something else` + } + } + } + ] + }; + mockGetRef(branch, `sha-${branch}`, true); + mockCreateBlobBase64PreEncoded(); + mockCreateBlobFileTwo(); + mockCreateTree(`sha-${branch}`); + mockCommit(`sha-${branch}`); + mockUpdateRef(branch); + + await expect(run(body)).resolves.toEqual(mockCommitList); +}); + test(`success (committer details)`, async () => { const committer = { name: "Ashley Person", @@ -469,6 +494,13 @@ function mockCreateBlobFileFour() { return mockCreateBlob("aGk=", "f65b65200aea4fecbe0db6ddac1c0848cdda1d9b"); } +function mockCreateBlobBase64PreEncoded() { + return mockCreateBlob( + "SGVsbG8gV29ybGQ=", + "afb296bb7f3e327767bdda481c4877ba4a09e02e" + ); +} + function mockCreateTreeSubmodule(baseTree) { const expectedBody = { tree: [ diff --git a/package-lock.json b/package-lock.json index d78a058..77f9802 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,9 +6,10 @@ "packages": { "": { "name": "octokit-commit-multiple-files", - "version": "3.2.1", + "version": "4.0.0", "license": "MIT", "dependencies": { + "is-base64": "^1.1.0", "nock": "^11.7.0" }, "devDependencies": { @@ -2571,6 +2572,15 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/is-base64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-base64/-/is-base64-1.1.0.tgz", + "integrity": "sha512-Nlhg7Z2dVC4/PTvIFkgVVNvPHSO2eR/Yd0XzhGiXCXEvWnptXlXa/clQ8aePPiMuxEGcWfzWbGw2Fe3d+Y3v1g==", + "bin": { + "is_base64": "bin/is-base64", + "is-base64": "bin/is-base64" + } + }, "node_modules/is-core-module": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", @@ -6727,6 +6737,11 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "is-base64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-base64/-/is-base64-1.1.0.tgz", + "integrity": "sha512-Nlhg7Z2dVC4/PTvIFkgVVNvPHSO2eR/Yd0XzhGiXCXEvWnptXlXa/clQ8aePPiMuxEGcWfzWbGw2Fe3d+Y3v1g==" + }, "is-core-module": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", diff --git a/package.json b/package.json index 760cef7..6a84a8f 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "prettier": "^1.19.1" }, "dependencies": { + "is-base64": "^1.1.0", "nock": "^11.7.0" }, "peerDependencies": {