From 245b80f3d0b3b4526cacf4b8f686d1ab2b1cd486 Mon Sep 17 00:00:00 2001 From: Borja Canseco Date: Thu, 4 Jun 2020 22:48:08 -0500 Subject: [PATCH] refactor: use dotenv-extended and auto-parse --- .env.defaults | 11 +++++ .env.example => .env.schema | 0 package-lock.json | 85 +++++++++++++++++++++++++++++++++---- package.json | 5 ++- src/index.js | 57 ++++++++++--------------- 5 files changed, 112 insertions(+), 46 deletions(-) create mode 100644 .env.defaults rename .env.example => .env.schema (100%) diff --git a/.env.defaults b/.env.defaults new file mode 100644 index 0000000..8ca0e0f --- /dev/null +++ b/.env.defaults @@ -0,0 +1,11 @@ +GIT_BRANCH=master +GIT_HOST=github.com +GIT_COMMIT_MESSAGE=chore(actions): empty commit for contribution graph +GIT_SSH_COMMAND=ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no + +MAX_DAYS=1 +MIN_COMMITS_PER_DAY=1 +MAX_COMMITS_PER_DAY=1 +INCLUDE_WEEKDAYS=true +INCLUDE_WEEKENDS=true +FORCE_PUSH=false diff --git a/.env.example b/.env.schema similarity index 100% rename from .env.example rename to .env.schema diff --git a/package-lock.json b/package-lock.json index 576b702..5c6c974 100644 --- a/package-lock.json +++ b/package-lock.json @@ -967,6 +967,14 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, + "auto-parse": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/auto-parse/-/auto-parse-1.8.0.tgz", + "integrity": "sha512-Uri4uC+K5cSi5hjM4snFrqPrjqUpwxeSW5EMTPvN7Ju3PlDzmXXDr5tjdzxPvvwgT3J7bmMDJ3Rm625nbrc72A==", + "requires": { + "typpy": "2.3.11" + } + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -1183,8 +1191,7 @@ "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "capture-exit": { "version": "2.0.0", @@ -1533,12 +1540,45 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" }, - "dotenv-safe": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv-safe/-/dotenv-safe-8.2.0.tgz", - "integrity": "sha512-uWwWWdUQkSs5a3mySDB22UtNwyEYi0JtEQu+vDzIqr9OjbDdC2Ip13PnSpi/fctqlYmzkxCeabiyCAOROuAIaA==", + "dotenv-extended": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/dotenv-extended/-/dotenv-extended-2.8.0.tgz", + "integrity": "sha512-7R3lSD7JcKkIZ+JnVN4LPJmJ2oR3pi+taqRxVpuod0gpCw/ZjYehEXiqceblP9pQinXY0Gt4nEmVh/1um4c2Mw==", "requires": { + "auto-parse": "^1.3.0", + "camelcase": "^5.3.1", + "cross-spawn": "^7.0.1", "dotenv": "^8.2.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + } } }, "ecc-jsbn": { @@ -1885,6 +1925,21 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "function.name": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/function.name/-/function.name-1.0.12.tgz", + "integrity": "sha512-C7Tu+rAFrWW5RjXqtKtXp2xOdCujq+4i8ZH3w0uz/xrYHBwXZrPt96x8cDAEHrIjeyEv/Jm6iDGyqupbaVQTlw==", + "requires": { + "noop6": "^1.0.1" + } + }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", @@ -2282,8 +2337,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", @@ -2570,6 +2624,7 @@ "@types/graceful-fs": "^4.1.2", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", "graceful-fs": "^4.2.4", "jest-serializer": "^26.0.0", "jest-util": "^26.0.1", @@ -3191,6 +3246,11 @@ } } }, + "noop6": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/noop6/-/noop6-1.0.8.tgz", + "integrity": "sha512-+Al5csMVc40I8xRfJsyBcN1IbpyvebOuQmMfxdw+AL6ECELey12ANgNTRhMfTwNIDU4W9W0g8EHLcsb3+3qPFA==" + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -4445,6 +4505,14 @@ "is-typedarray": "^1.0.0" } }, + "typpy": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.3.11.tgz", + "integrity": "sha512-Jh/fykZSaxeKO0ceMAs6agki9T5TNA9kiIR6fzKbvafKpIw8UlNlHhzuqKyi5lfJJ5VojJOx9tooIbyy7vHV/g==", + "requires": { + "function.name": "^1.0.3" + } + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -4636,7 +4704,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "requires": { "isexe": "^2.0.0" } diff --git a/package.json b/package.json index bb74825..c6baef0 100644 --- a/package.json +++ b/package.json @@ -2,15 +2,16 @@ "private": true, "type": "module", "scripts": { - "start": "node --experimental-top-level-await --experimental-specifier-resolution=node -r dotenv-safe/config src", + "start": "node --experimental-top-level-await --experimental-specifier-resolution=node src", "test": "node --experimental-vm-modules node_modules/jest/bin/jest" }, "engines": { "node": ">=14.3.0" }, "dependencies": { + "auto-parse": "^1.8.0", "date-fns": "^2.14.0", - "dotenv-safe": "^8.2.0", + "dotenv-extended": "^2.8.0", "simple-git": "^2.5.0" }, "devDependencies": { diff --git a/src/index.js b/src/index.js index 094243d..a4713a2 100644 --- a/src/index.js +++ b/src/index.js @@ -1,56 +1,43 @@ -import fs from 'fs/promises'; -import git from 'simple-git/promise'; -import subDays from 'date-fns/fp/subDays'; +import autoParse from 'auto-parse'; +import dotenv from 'dotenv-extended' import getUnixTime from 'date-fns/fp/getUnixTime'; import fromUnixTime from 'date-fns/fp/fromUnixTime'; +import subDays from 'date-fns/fp/subDays'; import isWeekend from 'date-fns/fp/isWeekend'; +import fs from 'fs/promises'; +import git from 'simple-git/promise'; import {getRandomInt} from './random'; -const { - GITHUB_ACTOR, - GITHUB_REPOSITORY, - GITHUB_TOKEN, - GIT_EMAIL, - GIT_BRANCH = 'master', - GIT_HOST = 'github.com', - GIT_COMMIT_MESSAGE = 'chore(actions): empty commit for contribution graph', - GIT_SSH_COMMAND = 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no', - - ORIGIN_TIMESTAMP = getUnixTime(new Date()), - MAX_DAYS = 1, - MIN_COMMITS_PER_DAY = 1, - MAX_COMMITS_PER_DAY = 1, - INCLUDE_WEEKDAYS = true, - INCLUDE_WEEKENDS = true, - FORCE_PUSH = false, -} = process.env; - -const repoPath = `https://${GITHUB_ACTOR}:${GITHUB_TOKEN}@${GIT_HOST}/${GITHUB_REPOSITORY}`; +const env = autoParse({ + ORIGIN_TIMESTAMP: process.env.ORIGIN_TIMESTAMP || getUnixTime(new Date()), + ...dotenv.load({errorOnMissing: true, includeProcessEnv: true}), +}); +const repoPath = `https://${env.GITHUB_ACTOR}:${env.GITHUB_TOKEN}@${env.GIT_HOST}/${env.GITHUB_REPOSITORY}`; const localPath = './clone'; const secondLine = 'Committed via https://github.com/marketplace/actions/autopopulate-your-contribution-graph'; -const dayOffsets = [...Array(Number(MAX_DAYS)).keys()]; -const originDay = fromUnixTime(ORIGIN_TIMESTAMP); +const dayOffsets = [...Array(env.MAX_DAYS).keys()]; +const originDay = fromUnixTime(env.ORIGIN_TIMESTAMP); await fs.mkdir(localPath); -if (JSON.parse(FORCE_PUSH)) { +if (env.FORCE_PUSH) { await git(localPath).init(); } else { - await git().clone(repoPath, localPath, ['--single-branch', '-b', GIT_BRANCH]); + await git().clone(repoPath, localPath, ['--single-branch', '-b', env.GIT_BRANCH]); } -await git(localPath).env({GIT_SSH_COMMAND}); -await git(localPath).addConfig('user.name', GITHUB_ACTOR); -await git(localPath).addConfig('user.email', GIT_EMAIL); +await git(localPath).env({GIT_SSH_COMMAND: env.GIT_SSH_COMMAND}); +await git(localPath).addConfig('user.name', env.GITHUB_ACTOR); +await git(localPath).addConfig('user.email', env.GIT_EMAIL); await dayOffsets .map((dayOffset) => subDays(dayOffset, originDay)) - .filter((day) => !(!JSON.parse(INCLUDE_WEEKENDS) && isWeekend(day))) - .filter((day) => !(!JSON.parse(INCLUDE_WEEKDAYS) && !isWeekend(day))) + .filter((day) => !(!env.INCLUDE_WEEKENDS && isWeekend(day))) + .filter((day) => !(!env.INCLUDE_WEEKDAYS && !isWeekend(day))) .map((/** @type {Date} */ day) => { - const commitsToMake = getRandomInt(MIN_COMMITS_PER_DAY, MAX_COMMITS_PER_DAY); + const commitsToMake = getRandomInt(env.MIN_COMMITS_PER_DAY, env.MAX_COMMITS_PER_DAY); return [...Array(commitsToMake)].map((_, i) => async () => { - const {commit: sha} = await git(localPath).commit([GIT_COMMIT_MESSAGE, secondLine], { + const {commit: sha} = await git(localPath).commit([env.GIT_COMMIT_MESSAGE, secondLine], { '--allow-empty': null, '--date': `format:iso8601:${day.toISOString()}`, }); @@ -60,4 +47,4 @@ await dayOffsets .flat() .reduce((commitPromises, nextPromise) => commitPromises.then(nextPromise), Promise.resolve()); -await git(localPath).push(repoPath, GIT_BRANCH, JSON.parse(FORCE_PUSH) && {'--force': null}); +await git(localPath).push(repoPath, env.GIT_BRANCH, env.FORCE_PUSH && {'--force': null});