mirror of
https://github.com/bcanseco/github-contribution-graph-action.git
synced 2025-10-09 13:41:58 +03:00
refactor: use dotenv-extended and auto-parse
This commit is contained in:
11
.env.defaults
Normal file
11
.env.defaults
Normal 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
85
package-lock.json
generated
@@ -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"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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": {
|
||||||
|
|||||||
57
src/index.js
57
src/index.js
@@ -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});
|
||||||
|
|||||||
Reference in New Issue
Block a user