refactor: use dotenv-extended and auto-parse

This commit is contained in:
Borja Canseco
2020-06-04 22:48:08 -05:00
parent 3a19016c0d
commit 245b80f3d0
5 changed files with 112 additions and 46 deletions

11
.env.defaults Normal file
View File

@@ -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

85
package-lock.json generated
View File

@@ -967,6 +967,14 @@
"integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
"dev": true "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": { "aws-sign2": {
"version": "0.7.0", "version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
@@ -1183,8 +1191,7 @@
"camelcase": { "camelcase": {
"version": "5.3.1", "version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
"dev": true
}, },
"capture-exit": { "capture-exit": {
"version": "2.0.0", "version": "2.0.0",
@@ -1533,12 +1540,45 @@
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
"integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
}, },
"dotenv-safe": { "dotenv-extended": {
"version": "8.2.0", "version": "2.8.0",
"resolved": "https://registry.npmjs.org/dotenv-safe/-/dotenv-safe-8.2.0.tgz", "resolved": "https://registry.npmjs.org/dotenv-extended/-/dotenv-extended-2.8.0.tgz",
"integrity": "sha512-uWwWWdUQkSs5a3mySDB22UtNwyEYi0JtEQu+vDzIqr9OjbDdC2Ip13PnSpi/fctqlYmzkxCeabiyCAOROuAIaA==", "integrity": "sha512-7R3lSD7JcKkIZ+JnVN4LPJmJ2oR3pi+taqRxVpuod0gpCw/ZjYehEXiqceblP9pQinXY0Gt4nEmVh/1um4c2Mw==",
"requires": { "requires": {
"auto-parse": "^1.3.0",
"camelcase": "^5.3.1",
"cross-spawn": "^7.0.1",
"dotenv": "^8.2.0" "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": { "ecc-jsbn": {
@@ -1885,6 +1925,21 @@
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true "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": { "gensync": {
"version": "1.0.0-beta.1", "version": "1.0.0-beta.1",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
@@ -2282,8 +2337,7 @@
"isexe": { "isexe": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
"dev": true
}, },
"isobject": { "isobject": {
"version": "3.0.1", "version": "3.0.1",
@@ -2570,6 +2624,7 @@
"@types/graceful-fs": "^4.1.2", "@types/graceful-fs": "^4.1.2",
"anymatch": "^3.0.3", "anymatch": "^3.0.3",
"fb-watchman": "^2.0.0", "fb-watchman": "^2.0.0",
"fsevents": "^2.1.2",
"graceful-fs": "^4.2.4", "graceful-fs": "^4.2.4",
"jest-serializer": "^26.0.0", "jest-serializer": "^26.0.0",
"jest-util": "^26.0.1", "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": { "normalize-package-data": {
"version": "2.5.0", "version": "2.5.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
@@ -4445,6 +4505,14 @@
"is-typedarray": "^1.0.0" "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": { "union-value": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
@@ -4636,7 +4704,6 @@
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"requires": { "requires": {
"isexe": "^2.0.0" "isexe": "^2.0.0"
} }

View File

@@ -2,15 +2,16 @@
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "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" "test": "node --experimental-vm-modules node_modules/jest/bin/jest"
}, },
"engines": { "engines": {
"node": ">=14.3.0" "node": ">=14.3.0"
}, },
"dependencies": { "dependencies": {
"auto-parse": "^1.8.0",
"date-fns": "^2.14.0", "date-fns": "^2.14.0",
"dotenv-safe": "^8.2.0", "dotenv-extended": "^2.8.0",
"simple-git": "^2.5.0" "simple-git": "^2.5.0"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -1,56 +1,43 @@
import fs from 'fs/promises'; import autoParse from 'auto-parse';
import git from 'simple-git/promise'; import dotenv from 'dotenv-extended'
import subDays from 'date-fns/fp/subDays';
import getUnixTime from 'date-fns/fp/getUnixTime'; import getUnixTime from 'date-fns/fp/getUnixTime';
import fromUnixTime from 'date-fns/fp/fromUnixTime'; import fromUnixTime from 'date-fns/fp/fromUnixTime';
import subDays from 'date-fns/fp/subDays';
import isWeekend from 'date-fns/fp/isWeekend'; import isWeekend from 'date-fns/fp/isWeekend';
import fs from 'fs/promises';
import git from 'simple-git/promise';
import {getRandomInt} from './random'; import {getRandomInt} from './random';
const { const env = autoParse({
GITHUB_ACTOR, ORIGIN_TIMESTAMP: process.env.ORIGIN_TIMESTAMP || getUnixTime(new Date()),
GITHUB_REPOSITORY, ...dotenv.load({errorOnMissing: true, includeProcessEnv: true}),
GITHUB_TOKEN, });
GIT_EMAIL, const repoPath = `https://${env.GITHUB_ACTOR}:${env.GITHUB_TOKEN}@${env.GIT_HOST}/${env.GITHUB_REPOSITORY}`;
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 localPath = './clone'; const localPath = './clone';
const secondLine = 'Committed via https://github.com/marketplace/actions/autopopulate-your-contribution-graph'; const secondLine = 'Committed via https://github.com/marketplace/actions/autopopulate-your-contribution-graph';
const dayOffsets = [...Array(Number(MAX_DAYS)).keys()]; const dayOffsets = [...Array(env.MAX_DAYS).keys()];
const originDay = fromUnixTime(ORIGIN_TIMESTAMP); const originDay = fromUnixTime(env.ORIGIN_TIMESTAMP);
await fs.mkdir(localPath); await fs.mkdir(localPath);
if (JSON.parse(FORCE_PUSH)) { if (env.FORCE_PUSH) {
await git(localPath).init(); await git(localPath).init();
} else { } 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).env({GIT_SSH_COMMAND: env.GIT_SSH_COMMAND});
await git(localPath).addConfig('user.name', GITHUB_ACTOR); await git(localPath).addConfig('user.name', env.GITHUB_ACTOR);
await git(localPath).addConfig('user.email', GIT_EMAIL); await git(localPath).addConfig('user.email', env.GIT_EMAIL);
await dayOffsets await dayOffsets
.map((dayOffset) => subDays(dayOffset, originDay)) .map((dayOffset) => subDays(dayOffset, originDay))
.filter((day) => !(!JSON.parse(INCLUDE_WEEKENDS) && isWeekend(day))) .filter((day) => !(!env.INCLUDE_WEEKENDS && isWeekend(day)))
.filter((day) => !(!JSON.parse(INCLUDE_WEEKDAYS) && !isWeekend(day))) .filter((day) => !(!env.INCLUDE_WEEKDAYS && !isWeekend(day)))
.map((/** @type {Date} */ 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 () => { 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, '--allow-empty': null,
'--date': `format:iso8601:${day.toISOString()}`, '--date': `format:iso8601:${day.toISOString()}`,
}); });
@@ -60,4 +47,4 @@ await dayOffsets
.flat() .flat()
.reduce((commitPromises, nextPromise) => commitPromises.then(nextPromise), Promise.resolve()); .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});