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==",
"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"
}

View File

@@ -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": {

View File

@@ -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});