[READ-ONLY] Mirror of https://github.com/probablykasper/readme-template-action. Integrate GitHub API data in your README.md
0

Configure Feed

Select the types of activity you want to include in your feed.

Add support for more variables and custom templates, and more

Lots of stuff in this one

Kasper (Aug 22, 2020, 4:47 AM +0200) ffd8689b 9c75d8f0

+1295 -93
+29
.eslintrc.js
··· 1 + module.exports = { 2 + 'env': { 3 + 'es2020': true, 4 + 'node': true, 5 + 'browser': true 6 + }, 7 + 'extends': 'eslint:recommended', 8 + 'parserOptions': { 9 + 'ecmaVersion': 11 10 + }, 11 + 'rules': { 12 + 'indent': [ 13 + 'error', 14 + 2 15 + ], 16 + 'linebreak-style': [ 17 + 'error', 18 + 'unix' 19 + ], 20 + 'quotes': [ 21 + 'error', 22 + 'single' 23 + ], 24 + 'semi': [ 25 + 'error', 26 + 'never' 27 + ] 28 + } 29 + }
+1 -1
.gitignore
··· 1 1 node_modules 2 2 .env 3 - ./TEST_OUTPUT.md 3 + OUTPUT.md
+56
EXAMPLE_TEMPLATE.md
··· 1 + # Test 2 + 3 + ```js 4 + // {{ TEMPLATE: }} 5 + module.exports = { 6 + MOST_STARRED_REPOS: { 7 + type: 'repos', 8 + params: 'first: 5, orderBy: { field:STARGAZERS, direction: DESC }, privacy: PUBLIC', 9 + }, 10 + CUSTOM_PINNED_REPOS: { 11 + type: 'specificRepos', 12 + repos: [ 13 + 'vidl', 14 + 'golang/go', 15 + 'probablykasper/embler', 16 + ], 17 + modifyVariables: function(repo) { 18 + repo.CREATED_YYYY = new Date(repo.CREATED_DATE).getFullYear() 19 + return repo 20 + }, 21 + }, 22 + } 23 + // {{ :TEMPLATE }} 24 + ``` 25 + 26 + | Stars | Name | Description | 27 + | ----------- | ---------- | ----------------- | 28 + {{ loop CUSTOM_PINNED_REPOS }} 29 + | {{ REPO_STARS }} | {{ REPO_OWNER_USERNAME }} | {{ REPO_DESCRIPTION }} | 30 + {{ end }} 31 + 32 + - USERNAME: {{ USERNAME }} 33 + - NAME: {{ NAME }} 34 + - EMAIL: {{ EMAIL }} 35 + - USER_ID: {{ USER_ID }} 36 + - BIO: {{ BIO }} 37 + - COMPANY: {{ COMPANY }} 38 + - LOCATION: {{ LOCATION }} 39 + - TWITTER_USERNAME: {{ TWITTER_USERNAME }} 40 + - AVATAR_URL: {{ AVATAR_URL }} 41 + - WEBSITE_URL: {{ WEBSITE_URL }} 42 + - SIGNUP_DATE: {{ SIGNUP_DATE }} 43 + - SIGNUP_YYYY: {{ SIGNUP_YYYY }} 44 + - SIGNUP_M: {{ SIGNUP_M }} 45 + - SIGNUP_MMM: {{ SIGNUP_MMM }} 46 + - SIGNUP_MMMM: {{ SIGNUP_MMMM }} 47 + - SIGNUP_D: {{ SIGNUP_D }} 48 + - SIGNUP_DO: {{ SIGNUP_DO }} 49 + 50 + Signed up {{ SIGNUP_MMMM }} {{ SIGNUP_DO }}, {{ SIGNUP_YYYY }} 51 + 52 + |Stars|Name|Description| 53 + |---|---|---| 54 + {{ loop MOST_STARRED_REPOS }} 55 + | {{ REPO_STARS }} | {{ NAME }} | {{ REPO_DESCRIPTION }} | 56 + {{ end }}
-17
TEST.md
··· 1 - <table> 2 - <tbody> 3 - {{ REPOSITORIES: }} 4 - <tr> 5 - <td>{{ STARS }} ⭐</td> 6 - <td>{{ NAME }}</td> 7 - <td>{{ DESCRIPTION }}</td> 8 - </tr> 9 - {{ /REPOSITORIES }} 10 - </tbody> 11 - </table> 12 - 13 - |Stars|Name|Description| 14 - |---|---|---| 15 - {{ REPOSITORIES: }} 16 - | {{ STARS }} | {{ NAME }} | {{ DESCRIPTION }} | 17 - {{ /REPOSITORIES }}
+34
TEST_OUTPUT.md
··· 1 + # Test 2 + 3 + 4 + | Stars | Name | Description | 5 + | ----------- | ---------- | ----------------- | 6 + | 1 | probablykasper | Python script for downloading video/audio | 7 + | 75656 | golang | The Go programming language | 8 + | 0 | probablykasper | Turn binaries into applications | 9 + 10 + - USERNAME: probablykasper 11 + - NAME: Kasper 12 + - EMAIL: 13 + - USER_ID: MDQ6VXNlcjExMzE1NDky 14 + - BIO: 15 + - COMPANY: null 16 + - LOCAITON: Norway 17 + - TWITTER_USERNAME: probablykasper 18 + - AVATAR_URL: https://avatars0.githubusercontent.com/u/11315492?u=c501da00e9b817ffc78faab6c630f236ac2738cf&v=4 19 + - WEBSITE_URL: https://kasper.space/ 20 + - SIGNUP_DATE: 2015-03-04T14:48:35Z 21 + - SIGNUP_YYYY: 2015 22 + - SIGNUP_M: 3 23 + - SIGNUP_MMM: Mar 24 + - SIGNUP_MMMM: March 25 + - SIGNUP_D: 4 26 + - SIGNUP_DO: 4th 27 + 28 + Signed up March 4th, 2015 29 + 30 + |Stars|Name|Description| 31 + |---|---|---| 32 + {{ loop MOST_STARRED_REPOS }} 33 + | {{ REPO_STARS }} | Kasper | {{ REPO_DESCRIPTION }} | 34 + {{ end }}
-3
action.yml
··· 10 10 description: 'The output file' 11 11 required: true 12 12 default: 'README.md' 13 - outputs: 14 - time: # id of output 15 - description: 'The time we greeted you' 16 13 runs: 17 14 using: 'node12' 18 15 main: 'index.js'
+93 -65
index.js
··· 1 - const core = require('@actions/core'); 2 - const github = require('@actions/github'); 3 - const path = require('path') 1 + const core = require('@actions/core') 4 2 const fs = require('fs') 5 - const process = require('process') 3 + const queries = require('./src/queries.js') 4 + const { 5 + newErr, 6 + trimRightChar, 7 + deleteFirstLine, 8 + deleteLastLine, 9 + } = require('./src/utils.js') 10 + 11 + // parses first found only 12 + function parseBlock(str, openStr, closeStr) { 13 + const openIndex = str.indexOf(openStr) 14 + const endIndex = str.indexOf(closeStr) 15 + if (openIndex < 0 || endIndex < 0) return null 16 + 17 + let beforeBlock = str.substring(0, openIndex) 18 + beforeBlock = trimRightChar(beforeBlock, ' ') 19 + beforeBlock = trimRightChar(beforeBlock, '\n') 20 + let block = str.substring(openIndex+openStr.length, endIndex) 21 + block = trimRightChar(block, ' ') 22 + block = trimRightChar(block, '\n') 23 + let afterBlock = str.substring(endIndex+closeStr.length) 24 + 25 + return { beforeBlock, block, afterBlock } 26 + } 27 + 28 + function getCustomTemplate(str) { 29 + const parsed = parseBlock(str, '// {{ TEMPLATE: }}', '// {{ :TEMPLATE }}') 30 + if (!parsed) return {} 31 + parsed.beforeBlock = deleteLastLine(parsed.beforeBlock) 32 + parsed.afterBlock = deleteFirstLine(parsed.afterBlock) 33 + 34 + const requireFromString = require('require-from-string') 35 + const parsedCustomTemplate = requireFromString(parsed.block) 36 + 37 + return { 38 + customTemplate: parsedCustomTemplate, 39 + outputStr: parsed.beforeBlock + parsed.afterBlock, 40 + } 41 + 42 + } 43 + 44 + function inject(str, values) { 45 + for (const [key, value] of Object.entries(values)) { 46 + const valueStr = '{{ '+key+' }}' 47 + str = str.split(valueStr).join(value) 48 + } 49 + return str 50 + } 51 + 52 + function injectLoop(str, name, valuesList) { 53 + const parsed = parseBlock(str, `{{ loop ${name} }}`, '{{ end }}') 54 + if (!parsed) return str 55 + let newBlock = '' 56 + for (const values of valuesList) { 57 + newBlock += inject(parsed.block, values) 58 + } 59 + return parsed.beforeBlock + newBlock + parsed.afterBlock 60 + } 6 61 7 62 run() 8 63 async function run() { 9 64 try { 10 65 11 - let templateInput = core.getInput('TEMPLATE') 12 - console.log('template:', templateInput) 13 - const templatePath = path.resolve(templateInput); 66 + let templatePath = core.getInput('TEMPLATE') 67 + console.log('template:', templatePath) 68 + if (!fs.existsSync(templatePath)) throw newErr('Template file not found') 69 + const templateFile = fs.readFileSync(templatePath).toString() 14 70 15 - let outputInput = core.getInput('OUTPUT'); 16 - console.log('output:', outputInput) 17 - const outputPath = path.resolve(outputInput); 71 + let outputPath = core.getInput('OUTPUT') 72 + console.log('output:', outputPath) 18 73 19 - const ghToken = core.getInput('GITHUB_TOKEN'); 20 - const octokit = github.getOctokit(ghToken); 74 + let { customTemplate, outputStr } = getCustomTemplate(templateFile) 21 75 22 - function trimRightChar(string, charToRemove) { 23 - // while(string.charAt(0)==charToRemove) { 24 - // string = string.substring(1); 25 - // } 26 - while(string.charAt(string.length-1)==charToRemove) { 27 - string = string.substring(0,string.length-1); 76 + console.log('Fetching user data') 77 + const user = await queries.getUser() 78 + console.log('Injecting user data') 79 + outputStr = inject(outputStr, user) 80 + console.log(user) 81 + 82 + console.log('Fetching 5 most starred repos') 83 + const starredRepos = await queries.getRepos(` 84 + first: 100, 85 + privacy: PUBLIC, 86 + orderBy: { field:STARGAZERS, direction: DESC } 87 + `) 88 + outputStr = injectLoop(outputStr, starredRepos) 89 + 90 + for (const [templateName, template] of Object.entries(customTemplate)) { 91 + if (template.type === 'specificRepos') { 92 + console.log('Fetching', templateName) 93 + const repos = await queries.getSpecificRepos(user.USERNAME, template.repos) 94 + for (let i = 0; i < repos.length; i++) { 95 + repos[i] = template.modifyVariables(repos[i]) 28 96 } 29 - return string; 30 - } 31 97 32 - function inject(str, name, valueList) { 33 - const startStr = '{{ '+name+': }}'; 34 - const startIndex = str.indexOf(startStr); 35 - const endStr = '{{ /'+name+' }}'; 36 - const endIndex = str.indexOf(endStr); 37 - if (startIndex >= 0 && endIndex >= 0) { 38 - let beforeLoop = str.substring(0, startIndex); 39 - beforeLoop = trimRightChar(beforeLoop, ' '); 40 - beforeLoop = trimRightChar(beforeLoop, '\n'); 41 - let loopContent = str.substring(startIndex+startStr.length, endIndex); 42 - loopContent = trimRightChar(loopContent, ' '); 43 - loopContent = trimRightChar(loopContent, '\n'); 44 - let newLoopContent = '' 45 - const afterLoop = str.substring(endIndex+endStr.length); 46 - // loop through array 47 - for (const value of valueList) { 48 - // loop through value object 49 - let newNewLoopContent = loopContent 50 - for (const key in value) { 51 - if (!value.hasOwnProperty(key)) return; 52 - const valueStr = '{{ '+key+' }}'; 53 - newNewLoopContent = newNewLoopContent.split(valueStr).join(value[key]); 54 - } 55 - newLoopContent += newNewLoopContent 56 - } 57 - return beforeLoop + newLoopContent + inject(afterLoop, name, valueList); 58 - } else { 59 - return str; 98 + console.log('Injecting', templateName) 99 + outputStr = injectLoop(outputStr, templateName, repos) 60 100 } 61 101 } 62 102 63 - const templateFile = fs.readFileSync(templatePath).toString(); 64 - const result = inject(templateFile, 'REPOSITORIES', [ 65 - { 66 - NAME: 'cpc', 67 - STARS: 2, 68 - DESCRIPTION: 'calculaton + conversion', 69 - }, 70 - { 71 - NAME: 'vidl', 72 - STARS: 5, 73 - DESCRIPTION: 'youtube video downloader', 74 - }, 75 - ]); 76 - 77 - fs.writeFileSync(outputPath, result) 103 + fs.writeFileSync(outputPath, outputStr) 78 104 79 105 } catch (error) { 80 - console.log(error) 81 - core.setFailed(error.message); 106 + if (!error || !error.logMessageOnly) { 107 + console.log(error) 108 + } 109 + core.setFailed(error.message) 82 110 } 83 111 }
+862 -3
package-lock.json
··· 1 1 { 2 - "name": "markdown-template-action", 3 - "version": "0.1.0", 2 + "name": "readme-template", 3 + "requires": true, 4 4 "lockfileVersion": 1, 5 - "requires": true, 6 5 "dependencies": { 7 6 "@actions/core": { 8 7 "version": "1.2.4", ··· 26 25 "integrity": "sha512-G4JjJ6f9Hb3Zvejj+ewLLKLf99ZC+9v+yCxoYf9vSyH+WkzPLB2LuUtRMGNkooMqdugGBFStIKXOuvH1W+EctA==", 27 26 "requires": { 28 27 "tunnel": "0.0.6" 28 + } 29 + }, 30 + "@babel/code-frame": { 31 + "version": "7.10.4", 32 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", 33 + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", 34 + "dev": true, 35 + "requires": { 36 + "@babel/highlight": "^7.10.4" 37 + } 38 + }, 39 + "@babel/helper-validator-identifier": { 40 + "version": "7.10.4", 41 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", 42 + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", 43 + "dev": true 44 + }, 45 + "@babel/highlight": { 46 + "version": "7.10.4", 47 + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", 48 + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", 49 + "dev": true, 50 + "requires": { 51 + "@babel/helper-validator-identifier": "^7.10.4", 52 + "chalk": "^2.0.0", 53 + "js-tokens": "^4.0.0" 54 + }, 55 + "dependencies": { 56 + "chalk": { 57 + "version": "2.4.2", 58 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 59 + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 60 + "dev": true, 61 + "requires": { 62 + "ansi-styles": "^3.2.1", 63 + "escape-string-regexp": "^1.0.5", 64 + "supports-color": "^5.3.0" 65 + } 66 + } 29 67 } 30 68 }, 31 69 "@octokit/auth-token": { ··· 119 157 "@types/node": ">= 8" 120 158 } 121 159 }, 160 + "@types/color-name": { 161 + "version": "1.1.1", 162 + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 163 + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", 164 + "dev": true 165 + }, 122 166 "@types/node": { 123 167 "version": "14.6.0", 124 168 "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.0.tgz", 125 169 "integrity": "sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==" 126 170 }, 171 + "acorn": { 172 + "version": "7.4.0", 173 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", 174 + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", 175 + "dev": true 176 + }, 177 + "acorn-jsx": { 178 + "version": "5.2.0", 179 + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", 180 + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", 181 + "dev": true 182 + }, 183 + "ajv": { 184 + "version": "6.12.4", 185 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", 186 + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", 187 + "dev": true, 188 + "requires": { 189 + "fast-deep-equal": "^3.1.1", 190 + "fast-json-stable-stringify": "^2.0.0", 191 + "json-schema-traverse": "^0.4.1", 192 + "uri-js": "^4.2.2" 193 + } 194 + }, 195 + "ansi-colors": { 196 + "version": "4.1.1", 197 + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 198 + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 199 + "dev": true 200 + }, 201 + "ansi-regex": { 202 + "version": "5.0.0", 203 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 204 + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 205 + "dev": true 206 + }, 207 + "ansi-styles": { 208 + "version": "3.2.1", 209 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 210 + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 211 + "dev": true, 212 + "requires": { 213 + "color-convert": "^1.9.0" 214 + } 215 + }, 216 + "argparse": { 217 + "version": "1.0.10", 218 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 219 + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 220 + "dev": true, 221 + "requires": { 222 + "sprintf-js": "~1.0.2" 223 + } 224 + }, 225 + "astral-regex": { 226 + "version": "1.0.0", 227 + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 228 + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 229 + "dev": true 230 + }, 231 + "balanced-match": { 232 + "version": "1.0.0", 233 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 234 + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 235 + "dev": true 236 + }, 127 237 "before-after-hook": { 128 238 "version": "2.1.0", 129 239 "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", 130 240 "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==" 131 241 }, 242 + "brace-expansion": { 243 + "version": "1.1.11", 244 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 245 + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 246 + "dev": true, 247 + "requires": { 248 + "balanced-match": "^1.0.0", 249 + "concat-map": "0.0.1" 250 + } 251 + }, 252 + "callsites": { 253 + "version": "3.1.0", 254 + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 255 + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 256 + "dev": true 257 + }, 258 + "chalk": { 259 + "version": "4.1.0", 260 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 261 + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 262 + "dev": true, 263 + "requires": { 264 + "ansi-styles": "^4.1.0", 265 + "supports-color": "^7.1.0" 266 + }, 267 + "dependencies": { 268 + "ansi-styles": { 269 + "version": "4.2.1", 270 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 271 + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 272 + "dev": true, 273 + "requires": { 274 + "@types/color-name": "^1.1.1", 275 + "color-convert": "^2.0.1" 276 + } 277 + }, 278 + "color-convert": { 279 + "version": "2.0.1", 280 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 281 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 282 + "dev": true, 283 + "requires": { 284 + "color-name": "~1.1.4" 285 + } 286 + }, 287 + "color-name": { 288 + "version": "1.1.4", 289 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 290 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 291 + "dev": true 292 + }, 293 + "has-flag": { 294 + "version": "4.0.0", 295 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 296 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 297 + "dev": true 298 + }, 299 + "supports-color": { 300 + "version": "7.1.0", 301 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 302 + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 303 + "dev": true, 304 + "requires": { 305 + "has-flag": "^4.0.0" 306 + } 307 + } 308 + } 309 + }, 310 + "color-convert": { 311 + "version": "1.9.3", 312 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 313 + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 314 + "dev": true, 315 + "requires": { 316 + "color-name": "1.1.3" 317 + } 318 + }, 319 + "color-name": { 320 + "version": "1.1.3", 321 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 322 + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 323 + "dev": true 324 + }, 325 + "concat-map": { 326 + "version": "0.0.1", 327 + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 328 + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 329 + "dev": true 330 + }, 331 + "cross-spawn": { 332 + "version": "7.0.3", 333 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 334 + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 335 + "dev": true, 336 + "requires": { 337 + "path-key": "^3.1.0", 338 + "shebang-command": "^2.0.0", 339 + "which": "^2.0.1" 340 + } 341 + }, 342 + "debug": { 343 + "version": "4.1.1", 344 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 345 + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 346 + "dev": true, 347 + "requires": { 348 + "ms": "^2.1.1" 349 + } 350 + }, 351 + "deep-is": { 352 + "version": "0.1.3", 353 + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 354 + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 355 + "dev": true 356 + }, 132 357 "deprecation": { 133 358 "version": "2.3.1", 134 359 "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", 135 360 "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" 136 361 }, 362 + "doctrine": { 363 + "version": "3.0.0", 364 + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 365 + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 366 + "dev": true, 367 + "requires": { 368 + "esutils": "^2.0.2" 369 + } 370 + }, 371 + "emoji-regex": { 372 + "version": "7.0.3", 373 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 374 + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 375 + "dev": true 376 + }, 377 + "enquirer": { 378 + "version": "2.3.6", 379 + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 380 + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 381 + "dev": true, 382 + "requires": { 383 + "ansi-colors": "^4.1.1" 384 + } 385 + }, 386 + "escape-string-regexp": { 387 + "version": "1.0.5", 388 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 389 + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 390 + "dev": true 391 + }, 392 + "eslint": { 393 + "version": "7.7.0", 394 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.7.0.tgz", 395 + "integrity": "sha512-1KUxLzos0ZVsyL81PnRN335nDtQ8/vZUD6uMtWbF+5zDtjKcsklIi78XoE0MVL93QvWTu+E5y44VyyCsOMBrIg==", 396 + "dev": true, 397 + "requires": { 398 + "@babel/code-frame": "^7.0.0", 399 + "ajv": "^6.10.0", 400 + "chalk": "^4.0.0", 401 + "cross-spawn": "^7.0.2", 402 + "debug": "^4.0.1", 403 + "doctrine": "^3.0.0", 404 + "enquirer": "^2.3.5", 405 + "eslint-scope": "^5.1.0", 406 + "eslint-utils": "^2.1.0", 407 + "eslint-visitor-keys": "^1.3.0", 408 + "espree": "^7.2.0", 409 + "esquery": "^1.2.0", 410 + "esutils": "^2.0.2", 411 + "file-entry-cache": "^5.0.1", 412 + "functional-red-black-tree": "^1.0.1", 413 + "glob-parent": "^5.0.0", 414 + "globals": "^12.1.0", 415 + "ignore": "^4.0.6", 416 + "import-fresh": "^3.0.0", 417 + "imurmurhash": "^0.1.4", 418 + "is-glob": "^4.0.0", 419 + "js-yaml": "^3.13.1", 420 + "json-stable-stringify-without-jsonify": "^1.0.1", 421 + "levn": "^0.4.1", 422 + "lodash": "^4.17.19", 423 + "minimatch": "^3.0.4", 424 + "natural-compare": "^1.4.0", 425 + "optionator": "^0.9.1", 426 + "progress": "^2.0.0", 427 + "regexpp": "^3.1.0", 428 + "semver": "^7.2.1", 429 + "strip-ansi": "^6.0.0", 430 + "strip-json-comments": "^3.1.0", 431 + "table": "^5.2.3", 432 + "text-table": "^0.2.0", 433 + "v8-compile-cache": "^2.0.3" 434 + } 435 + }, 436 + "eslint-scope": { 437 + "version": "5.1.0", 438 + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", 439 + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", 440 + "dev": true, 441 + "requires": { 442 + "esrecurse": "^4.1.0", 443 + "estraverse": "^4.1.1" 444 + } 445 + }, 446 + "eslint-utils": { 447 + "version": "2.1.0", 448 + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", 449 + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", 450 + "dev": true, 451 + "requires": { 452 + "eslint-visitor-keys": "^1.1.0" 453 + } 454 + }, 455 + "eslint-visitor-keys": { 456 + "version": "1.3.0", 457 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 458 + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 459 + "dev": true 460 + }, 461 + "espree": { 462 + "version": "7.2.0", 463 + "resolved": "https://registry.npmjs.org/espree/-/espree-7.2.0.tgz", 464 + "integrity": "sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g==", 465 + "dev": true, 466 + "requires": { 467 + "acorn": "^7.3.1", 468 + "acorn-jsx": "^5.2.0", 469 + "eslint-visitor-keys": "^1.3.0" 470 + } 471 + }, 472 + "esprima": { 473 + "version": "4.0.1", 474 + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 475 + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 476 + "dev": true 477 + }, 478 + "esquery": { 479 + "version": "1.3.1", 480 + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", 481 + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", 482 + "dev": true, 483 + "requires": { 484 + "estraverse": "^5.1.0" 485 + }, 486 + "dependencies": { 487 + "estraverse": { 488 + "version": "5.2.0", 489 + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 490 + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 491 + "dev": true 492 + } 493 + } 494 + }, 495 + "esrecurse": { 496 + "version": "4.2.1", 497 + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 498 + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 499 + "dev": true, 500 + "requires": { 501 + "estraverse": "^4.1.0" 502 + } 503 + }, 504 + "estraverse": { 505 + "version": "4.3.0", 506 + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 507 + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 508 + "dev": true 509 + }, 510 + "esutils": { 511 + "version": "2.0.3", 512 + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 513 + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 514 + "dev": true 515 + }, 516 + "fast-deep-equal": { 517 + "version": "3.1.3", 518 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 519 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 520 + "dev": true 521 + }, 522 + "fast-json-stable-stringify": { 523 + "version": "2.1.0", 524 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 525 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 526 + "dev": true 527 + }, 528 + "fast-levenshtein": { 529 + "version": "2.0.6", 530 + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 531 + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 532 + "dev": true 533 + }, 534 + "file-entry-cache": { 535 + "version": "5.0.1", 536 + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 537 + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 538 + "dev": true, 539 + "requires": { 540 + "flat-cache": "^2.0.1" 541 + } 542 + }, 543 + "flat-cache": { 544 + "version": "2.0.1", 545 + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 546 + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 547 + "dev": true, 548 + "requires": { 549 + "flatted": "^2.0.0", 550 + "rimraf": "2.6.3", 551 + "write": "1.0.3" 552 + } 553 + }, 554 + "flatted": { 555 + "version": "2.0.2", 556 + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", 557 + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", 558 + "dev": true 559 + }, 560 + "fs.realpath": { 561 + "version": "1.0.0", 562 + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 563 + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 564 + "dev": true 565 + }, 566 + "functional-red-black-tree": { 567 + "version": "1.0.1", 568 + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 569 + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 570 + "dev": true 571 + }, 572 + "glob": { 573 + "version": "7.1.6", 574 + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 575 + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 576 + "dev": true, 577 + "requires": { 578 + "fs.realpath": "^1.0.0", 579 + "inflight": "^1.0.4", 580 + "inherits": "2", 581 + "minimatch": "^3.0.4", 582 + "once": "^1.3.0", 583 + "path-is-absolute": "^1.0.0" 584 + } 585 + }, 586 + "glob-parent": { 587 + "version": "5.1.1", 588 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 589 + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 590 + "dev": true, 591 + "requires": { 592 + "is-glob": "^4.0.1" 593 + } 594 + }, 595 + "globals": { 596 + "version": "12.4.0", 597 + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", 598 + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", 599 + "dev": true, 600 + "requires": { 601 + "type-fest": "^0.8.1" 602 + } 603 + }, 604 + "has-flag": { 605 + "version": "3.0.0", 606 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 607 + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 608 + "dev": true 609 + }, 610 + "ignore": { 611 + "version": "4.0.6", 612 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 613 + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 614 + "dev": true 615 + }, 616 + "import-fresh": { 617 + "version": "3.2.1", 618 + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", 619 + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", 620 + "dev": true, 621 + "requires": { 622 + "parent-module": "^1.0.0", 623 + "resolve-from": "^4.0.0" 624 + } 625 + }, 626 + "imurmurhash": { 627 + "version": "0.1.4", 628 + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 629 + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 630 + "dev": true 631 + }, 632 + "inflight": { 633 + "version": "1.0.6", 634 + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 635 + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 636 + "dev": true, 637 + "requires": { 638 + "once": "^1.3.0", 639 + "wrappy": "1" 640 + } 641 + }, 642 + "inherits": { 643 + "version": "2.0.4", 644 + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 645 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 646 + "dev": true 647 + }, 648 + "is-extglob": { 649 + "version": "2.1.1", 650 + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 651 + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 652 + "dev": true 653 + }, 654 + "is-fullwidth-code-point": { 655 + "version": "2.0.0", 656 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 657 + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 658 + "dev": true 659 + }, 660 + "is-glob": { 661 + "version": "4.0.1", 662 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 663 + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 664 + "dev": true, 665 + "requires": { 666 + "is-extglob": "^2.1.1" 667 + } 668 + }, 137 669 "is-plain-object": { 138 670 "version": "4.1.1", 139 671 "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-4.1.1.tgz", 140 672 "integrity": "sha512-5Aw8LLVsDlZsETVMhoMXzqsXwQqr/0vlnBYzIXJbYo2F4yYlhLHs+Ez7Bod7IIQKWkJbJfxrWD7pA1Dw1TKrwA==" 141 673 }, 674 + "isexe": { 675 + "version": "2.0.0", 676 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 677 + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 678 + "dev": true 679 + }, 680 + "js-tokens": { 681 + "version": "4.0.0", 682 + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 683 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 684 + "dev": true 685 + }, 686 + "js-yaml": { 687 + "version": "3.14.0", 688 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", 689 + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", 690 + "dev": true, 691 + "requires": { 692 + "argparse": "^1.0.7", 693 + "esprima": "^4.0.0" 694 + } 695 + }, 696 + "json-schema-traverse": { 697 + "version": "0.4.1", 698 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 699 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 700 + "dev": true 701 + }, 702 + "json-stable-stringify-without-jsonify": { 703 + "version": "1.0.1", 704 + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 705 + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 706 + "dev": true 707 + }, 708 + "levn": { 709 + "version": "0.4.1", 710 + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 711 + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 712 + "dev": true, 713 + "requires": { 714 + "prelude-ls": "^1.2.1", 715 + "type-check": "~0.4.0" 716 + } 717 + }, 718 + "lodash": { 719 + "version": "4.17.20", 720 + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 721 + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", 722 + "dev": true 723 + }, 724 + "minimatch": { 725 + "version": "3.0.4", 726 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 727 + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 728 + "dev": true, 729 + "requires": { 730 + "brace-expansion": "^1.1.7" 731 + } 732 + }, 733 + "minimist": { 734 + "version": "1.2.5", 735 + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 736 + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 737 + "dev": true 738 + }, 739 + "mkdirp": { 740 + "version": "0.5.5", 741 + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 742 + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 743 + "dev": true, 744 + "requires": { 745 + "minimist": "^1.2.5" 746 + } 747 + }, 748 + "ms": { 749 + "version": "2.1.2", 750 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 751 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 752 + "dev": true 753 + }, 754 + "natural-compare": { 755 + "version": "1.4.0", 756 + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 757 + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 758 + "dev": true 759 + }, 142 760 "node-fetch": { 143 761 "version": "2.6.0", 144 762 "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", ··· 152 770 "wrappy": "1" 153 771 } 154 772 }, 773 + "optionator": { 774 + "version": "0.9.1", 775 + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 776 + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 777 + "dev": true, 778 + "requires": { 779 + "deep-is": "^0.1.3", 780 + "fast-levenshtein": "^2.0.6", 781 + "levn": "^0.4.1", 782 + "prelude-ls": "^1.2.1", 783 + "type-check": "^0.4.0", 784 + "word-wrap": "^1.2.3" 785 + } 786 + }, 787 + "parent-module": { 788 + "version": "1.0.1", 789 + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 790 + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 791 + "dev": true, 792 + "requires": { 793 + "callsites": "^3.0.0" 794 + } 795 + }, 796 + "path-is-absolute": { 797 + "version": "1.0.1", 798 + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 799 + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 800 + "dev": true 801 + }, 802 + "path-key": { 803 + "version": "3.1.1", 804 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 805 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 806 + "dev": true 807 + }, 808 + "prelude-ls": { 809 + "version": "1.2.1", 810 + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 811 + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 812 + "dev": true 813 + }, 814 + "progress": { 815 + "version": "2.0.3", 816 + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 817 + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 818 + "dev": true 819 + }, 820 + "punycode": { 821 + "version": "2.1.1", 822 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 823 + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 824 + "dev": true 825 + }, 826 + "regexpp": { 827 + "version": "3.1.0", 828 + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", 829 + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", 830 + "dev": true 831 + }, 832 + "require-from-string": { 833 + "version": "2.0.2", 834 + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 835 + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" 836 + }, 837 + "resolve-from": { 838 + "version": "4.0.0", 839 + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 840 + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 841 + "dev": true 842 + }, 843 + "rimraf": { 844 + "version": "2.6.3", 845 + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 846 + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 847 + "dev": true, 848 + "requires": { 849 + "glob": "^7.1.3" 850 + } 851 + }, 852 + "semver": { 853 + "version": "7.3.2", 854 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", 855 + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", 856 + "dev": true 857 + }, 858 + "shebang-command": { 859 + "version": "2.0.0", 860 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 861 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 862 + "dev": true, 863 + "requires": { 864 + "shebang-regex": "^3.0.0" 865 + } 866 + }, 867 + "shebang-regex": { 868 + "version": "3.0.0", 869 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 870 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 871 + "dev": true 872 + }, 873 + "slice-ansi": { 874 + "version": "2.1.0", 875 + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 876 + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 877 + "dev": true, 878 + "requires": { 879 + "ansi-styles": "^3.2.0", 880 + "astral-regex": "^1.0.0", 881 + "is-fullwidth-code-point": "^2.0.0" 882 + } 883 + }, 884 + "sprintf-js": { 885 + "version": "1.0.3", 886 + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 887 + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 888 + "dev": true 889 + }, 890 + "string-width": { 891 + "version": "3.1.0", 892 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 893 + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 894 + "dev": true, 895 + "requires": { 896 + "emoji-regex": "^7.0.1", 897 + "is-fullwidth-code-point": "^2.0.0", 898 + "strip-ansi": "^5.1.0" 899 + }, 900 + "dependencies": { 901 + "ansi-regex": { 902 + "version": "4.1.0", 903 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 904 + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 905 + "dev": true 906 + }, 907 + "strip-ansi": { 908 + "version": "5.2.0", 909 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 910 + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 911 + "dev": true, 912 + "requires": { 913 + "ansi-regex": "^4.1.0" 914 + } 915 + } 916 + } 917 + }, 918 + "strip-ansi": { 919 + "version": "6.0.0", 920 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 921 + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 922 + "dev": true, 923 + "requires": { 924 + "ansi-regex": "^5.0.0" 925 + } 926 + }, 927 + "strip-json-comments": { 928 + "version": "3.1.1", 929 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 930 + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 931 + "dev": true 932 + }, 933 + "supports-color": { 934 + "version": "5.5.0", 935 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 936 + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 937 + "dev": true, 938 + "requires": { 939 + "has-flag": "^3.0.0" 940 + } 941 + }, 942 + "table": { 943 + "version": "5.4.6", 944 + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 945 + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 946 + "dev": true, 947 + "requires": { 948 + "ajv": "^6.10.2", 949 + "lodash": "^4.17.14", 950 + "slice-ansi": "^2.1.0", 951 + "string-width": "^3.0.0" 952 + } 953 + }, 954 + "text-table": { 955 + "version": "0.2.0", 956 + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 957 + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 958 + "dev": true 959 + }, 155 960 "tunnel": { 156 961 "version": "0.0.6", 157 962 "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", 158 963 "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" 159 964 }, 965 + "type-check": { 966 + "version": "0.4.0", 967 + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 968 + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 969 + "dev": true, 970 + "requires": { 971 + "prelude-ls": "^1.2.1" 972 + } 973 + }, 974 + "type-fest": { 975 + "version": "0.8.1", 976 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 977 + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 978 + "dev": true 979 + }, 160 980 "universal-user-agent": { 161 981 "version": "6.0.0", 162 982 "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", 163 983 "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" 164 984 }, 985 + "uri-js": { 986 + "version": "4.2.2", 987 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 988 + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 989 + "dev": true, 990 + "requires": { 991 + "punycode": "^2.1.0" 992 + } 993 + }, 994 + "v8-compile-cache": { 995 + "version": "2.1.1", 996 + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", 997 + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", 998 + "dev": true 999 + }, 1000 + "which": { 1001 + "version": "2.0.2", 1002 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1003 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1004 + "dev": true, 1005 + "requires": { 1006 + "isexe": "^2.0.0" 1007 + } 1008 + }, 1009 + "word-wrap": { 1010 + "version": "1.2.3", 1011 + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1012 + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1013 + "dev": true 1014 + }, 165 1015 "wrappy": { 166 1016 "version": "1.0.2", 167 1017 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 168 1018 "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1019 + }, 1020 + "write": { 1021 + "version": "1.0.3", 1022 + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 1023 + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 1024 + "dev": true, 1025 + "requires": { 1026 + "mkdirp": "^0.5.1" 1027 + } 169 1028 } 170 1029 } 171 1030 }
+7 -4
package.json
··· 1 1 { 2 2 "name": "readme-template", 3 3 "main": "index.js", 4 - "scripts" :{ 5 - "test-no-env": "INPUT_TEMPLATE=TEST.md INPUT_OUTPUT=TEST_OUTPUT.md node .", 6 - "test": "export $(cat .env | xargs) && INPUT_TEMPLATE=TEST.md INPUT_OUTPUT=TEST_OUTPUT.md node ." 4 + "scripts": { 5 + "test": "export $(cat .env | xargs) && INPUT_TEMPLATE=EXAMPLE_TEMPLAte.md INPUT_OUTPUT=OUTPUT.md node ." 7 6 }, 8 7 "dependencies": { 9 8 "@actions/core": "^1.2.4", 10 - "@actions/github": "^4.0.0" 9 + "@actions/github": "^4.0.0", 10 + "require-from-string": "^2.0.2" 11 + }, 12 + "devDependencies": { 13 + "eslint": "^7.7.0" 11 14 } 12 15 }
+175
src/queries.js
··· 1 + const core = require('@actions/core') 2 + const github = require('@actions/github') 3 + 4 + const ghToken = core.getInput('GITHUB_TOKEN') 5 + const octokit = github.getOctokit(ghToken) 6 + 7 + const graphqlQuery = async function(...args) { 8 + const queryResult = await octokit.graphql(...args) 9 + if (queryResult.errors) throw queryResult.errors 10 + return queryResult 11 + } 12 + 13 + module.exports.getUser = async function() { 14 + const queryResult = await graphqlQuery(` 15 + query { 16 + viewer { 17 + USERNAME: login 18 + NAME: name 19 + EMAIL: email 20 + USER_ID: id 21 + BIO: bio 22 + COMPANY: company 23 + SIGNUP_DATE: createdAt 24 + LOCATION: location 25 + TWITTER_USERNAME: twitterUsername 26 + AVATAR_URL: avatarUrl 27 + WEBSITE_URL: websiteUrl 28 + repositories { 29 + totalCount 30 + totalDiskUsage 31 + } 32 + } 33 + } 34 + `) 35 + 36 + const user = queryResult.viewer 37 + 38 + const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] 39 + const userCreatedAt = new Date(user.SIGNUP_DATE) 40 + user.SIGNUP_YYYY = userCreatedAt.getFullYear() 41 + user.SIGNUP_M = userCreatedAt.getMonth() + 1 42 + user.SIGNUP_MMM = months[userCreatedAt.getMonth()].substring(0, 3) 43 + user.SIGNUP_MMMM = months[userCreatedAt.getMonth()] 44 + user.SIGNUP_D = userCreatedAt.getDate() 45 + user.SIGNUP_DO = userCreatedAt.getDate() 46 + if (user.SIGNUP_DO === 1) user.SIGNUP_DO += 'st' 47 + if (user.SIGNUP_DO === 2) user.SIGNUP_DO += 'nd' 48 + if (user.SIGNUP_DO === 3) user.SIGNUP_DO += 'rd' 49 + if (user.SIGNUP_DO === 4) user.SIGNUP_DO += 'th' 50 + user.TOTAL_REPOS_SIZE_KB = user.repositories.totalDiskUsage 51 + user.TOTAL_REPOS_SIZE_MB = Math.round(user.repositories.totalDiskUsage/1000*10)/10 52 + user.TOTAL_REPOS_SIZE_GB = Math.round(user.repositories.totalDiskUsage/1000/1000*100)/100 53 + user.TOTAL_REPOSITORIES = user.repositories.totalDiskUsage 54 + delete user.repositories 55 + 56 + return user 57 + } 58 + 59 + function fixRepoValues(repo) { 60 + repo.REPO_STARS = repo.stargazers.totalCount 61 + delete repo.stargazers 62 + if (repo.primaryLanguage) { 63 + repo.REPO_LANGUAGE = repo.primaryLanguage.name 64 + } else { 65 + repo.REPO_LANGUAGE = 'None' 66 + } 67 + delete repo.primaryLanguage 68 + repo.REPO_OWNER_USERNAME = repo.owner.login 69 + delete repo.owner 70 + repo.REPO_SIZE_KB = repo.diskUsage 71 + repo.REPO_SIZE_MB = Math.round(repo.diskUsage/1000*10)/10 72 + repo.REPO_SIZE_GB = Math.round(repo.diskUsage/1000/1000*100)/100 73 + delete repo.diskUsage 74 + return repo 75 + } 76 + 77 + module.exports.getRepos = async function(args) { 78 + 79 + const queryResult = await graphqlQuery(` 80 + query { 81 + viewer { 82 + repositories(${args}) { 83 + edges { 84 + node { 85 + REPO_NAME: name 86 + owner { 87 + login 88 + } 89 + REPO_FULL_NAME: nameWithOwner 90 + REPO_DESCRIPTION: description 91 + REPO_URL: url 92 + REPO_HOMEPAGE_URL: homepageUrl 93 + REPO_CREATED_DATE: createdAt 94 + REPO_PUSHED_DATE: pushedAt 95 + REPO_UPDATED_DATE: updatedAt 96 + diskUsage 97 + REPO_FORK_COUNT: forkCount 98 + REPO_ID: id 99 + stargazers { 100 + totalCount 101 + } 102 + primaryLanguage { 103 + name 104 + } 105 + } 106 + } 107 + } 108 + } 109 + } 110 + `) 111 + 112 + const repoEdges = queryResult.viewer.repositories.edges 113 + const repos = [] 114 + for (const repoEdge of repoEdges) { 115 + let repo = repoEdge.node 116 + repo = fixRepoValues(repo) 117 + repos.push(repo) 118 + } 119 + return repos 120 + 121 + } 122 + 123 + module.exports.getSpecificRepos = async function(username, repoNames) { 124 + 125 + let repoQueryProperties = '' 126 + let index = -1 127 + for (let repoName of repoNames) { 128 + index += 1 129 + let repoOwner = '' 130 + if (repoName.includes('/')) { 131 + repoOwner = repoName.split('/')[0] 132 + repoName = repoName.split('/')[1] 133 + } else { 134 + repoOwner = username 135 + } 136 + 137 + repoQueryProperties += ` 138 + repo${index}: repository(owner: "${repoOwner}" name: "${repoName}") { 139 + REPO_NAME: name 140 + owner { 141 + login 142 + } 143 + REPO_FULL_NAME: nameWithOwner 144 + REPO_DESCRIPTION: description 145 + REPO_URL: url 146 + REPO_HOMEPAGE_URL: homepageUrl 147 + REPO_CREATED_DATE: createdAt 148 + REPO_PUSHED_DATE: pushedAt 149 + REPO_UPDATED_DATE: updatedAt 150 + REPO_FORK_COUNT: forkCount 151 + REPO_ID: id 152 + diskUsage 153 + stargazers { 154 + totalCount 155 + } 156 + primaryLanguage { 157 + name 158 + } 159 + } 160 + ` 161 + } 162 + const queryResult = await graphqlQuery(` 163 + query { 164 + ${repoQueryProperties} 165 + } 166 + `) 167 + let repos = [] 168 + for (let i = 0; i !== null; i++) { 169 + let repo = queryResult['repo'+i] 170 + if (!repo) break 171 + repo = fixRepoValues(repo) 172 + repos.push(repo) 173 + } 174 + return repos 175 + }
+38
src/utils.js
··· 1 + module.exports.newErr = function(...args) { 2 + const err = new Error(...args) 3 + err.logMessageOnly = true 4 + return err 5 + } 6 + 7 + module.exports.trimLeftChar = function(string, charToRemove) { 8 + while(string.charAt(0)==charToRemove) { 9 + string = string.substring(1) 10 + } 11 + return string 12 + } 13 + module.exports.trimRightChar = function(string, charToRemove) { 14 + while(string.charAt(string.length-1)==charToRemove) { 15 + string = string.substring(0,string.length-1) 16 + } 17 + return string 18 + } 19 + 20 + module.exports.deleteFirstLine = function(str) { 21 + const lines = str.split('\n') 22 + if (lines[0] === '') { 23 + lines.splice(1, 1) 24 + } else { 25 + lines.splice(0, 1) 26 + } 27 + return lines.join('\n') 28 + } 29 + module.exports.deleteLastLine = function(str) { 30 + const lines = str.split('\n') 31 + if (lines[lines.length-1] === '') { 32 + lines.splice(-2, 1) 33 + } else { 34 + lines.splice(-1, 1) 35 + } 36 + console.log(lines) 37 + return lines.join('\n') 38 + }