├── .github ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── SECURITY.md └── workflows │ └── node-lint.yml ├── .gitignore ├── LICENSE.md ├── NOTICE.md ├── README.md ├── ghec-audit-log-cli.js ├── ghec-audit-log-client.js ├── ghec-audit-log-entries.js ├── ghec-audit-log-queries.js ├── ghec-audit-log-utils.js ├── package-lock.json ├── package.json └── workflows ├── forward-v3-workflow.yml └── forward-v4-workflow.yml /.github/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | +++ 2 | version = "1.4" 3 | aliases = ["/version/1/4"] 4 | +++ 5 | 6 | # Contributor Covenant Code of Conduct 7 | 8 | ## Our Pledge 9 | 10 | In the interest of fostering an open and welcoming environment, we as 11 | contributors and maintainers pledge to make participation in our project and 12 | our community a harassment-free experience for everyone, regardless of age, body 13 | size, disability, ethnicity, sex characteristics, gender identity and expression, 14 | level of experience, education, socio-economic status, nationality, personal 15 | appearance, race, religion, or sexual identity and orientation. 16 | 17 | ## Our Standards 18 | 19 | Examples of behavior that contributes to creating a positive environment 20 | include: 21 | 22 | * Using welcoming and inclusive language 23 | * Being respectful of differing viewpoints and experiences 24 | * Gracefully accepting constructive criticism 25 | * Focusing on what is best for the community 26 | * Showing empathy towards other community members 27 | 28 | Examples of unacceptable behavior by participants include: 29 | 30 | * The use of sexualized language or imagery and unwelcome sexual attention or 31 | advances 32 | * Trolling, insulting/derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or electronic 35 | address, without explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Our Responsibilities 40 | 41 | Project maintainers are responsible for clarifying the standards of acceptable 42 | behavior and are expected to take appropriate and fair corrective action in 43 | response to any instances of unacceptable behavior. 44 | 45 | Project maintainers have the right and responsibility to remove, edit, or 46 | reject comments, commits, code, wiki edits, issues, and other contributions 47 | that are not aligned to this Code of Conduct, or to ban temporarily or 48 | permanently any contributor for other behaviors that they deem inappropriate, 49 | threatening, offensive, or harmful. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all project spaces, and it also applies when 54 | an individual is representing the project or its community in public spaces. 55 | Examples of representing a project or community include using an official 56 | project e-mail address, posting via an official social media account, or acting 57 | as an appointed representative at an online or offline event. Representation of 58 | a project may be further defined and clarified by project maintainers. 59 | 60 | ## Enforcement 61 | 62 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 63 | reported by contacting the project team at opensource@github.com. All 64 | complaints will be reviewed and investigated and will result in a response that 65 | is deemed necessary and appropriate to the circumstances. The project team is 66 | obligated to maintain confidentiality with regard to the reporter of an incident. 67 | Further details of specific enforcement policies may be posted separately. 68 | 69 | Project maintainers who do not follow or enforce the Code of Conduct in good 70 | faith may face temporary or permanent repercussions as determined by other 71 | members of the project's leadership. 72 | 73 | ## Attribution 74 | 75 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 76 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 77 | 78 | [homepage]: https://www.contributor-covenant.org 79 | 80 | For answers to common questions about this code of conduct, see 81 | https://www.contributor-covenant.org/faq -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Contributing 2 | 3 | [fork]: https://github.com/github/ghec-audit-log-cli/fork 4 | [pr]: https://github.com/github/ghec-audit-log-cli/compare 5 | [style]: https://https://styleguide.github.com/js/ 6 | [code-of-conduct]: .github/CODE_OF_CONDUCT.md 7 | 8 | Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great. 9 | 10 | Contributions to this project are [released](https://help.github.com/articles/github-terms-of-service/#6-contributions-under-repository-license) to the public under the [project's open source license](LICENSE.md). 11 | 12 | Please note that this project is released with a [Contributor Code of Conduct][code-of-conduct]. By participating in this project you agree to abide by its terms. 13 | 14 | ## Submitting a pull request 15 | 16 | 0. [Fork][fork] and clone the repository 17 | 0. Configure and install the dependencies: `script/bootstrap` 18 | 0. Make sure the tests pass on your machine: `rake` 19 | 0. Create a new branch: `git checkout -b my-branch-name` 20 | 0. Make your change, add tests, and make sure the tests still pass 21 | 0. Push to your fork and [submit a pull request][pr] 22 | 0. Pat your self on the back and wait for your pull request to be reviewed and merged. 23 | 24 | Here are a few things you can do that will increase the likelihood of your pull request being accepted: 25 | 26 | - Follow the [style guide][style]. 27 | - Write tests. 28 | - Keep your change as focused as possible. If there are multiple changes you would like to make that are not dependent upon each other, consider submitting them as separate pull requests. 29 | - Write a [good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). 30 | 31 | ## Resources 32 | 33 | - [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/) 34 | - [Using Pull Requests](https://help.github.com/articles/about-pull-requests/) 35 | - [GitHub Help](https://help.github.com) -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/SECURITY.md: -------------------------------------------------------------------------------- 1 | If you discover a security issue in this repo, please submit it through the [GitHub Security Bug Bounty](https://hackerone.com/github) 2 | 3 | Thanks for helping make GitHub Actions safe for everyone. 4 | -------------------------------------------------------------------------------- /.github/workflows/node-lint.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push 3 | 4 | name: Lint ghec-audit-log-cli 5 | 6 | jobs: 7 | test: 8 | runs-on: ubuntu-latest 9 | 10 | strategy: 11 | matrix: 12 | node-version: [12.x, 13.x] 13 | 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v2 17 | 18 | - name: Setup node 19 | uses: actions/setup-node@v1 20 | with: 21 | node-version: ${{ matrix.node-version }} 22 | 23 | - name: Install Dependencies 24 | run: npm install 25 | 26 | - name: Run lint 27 | run: npm run lint -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .ghec-audit-log 2 | .last-cursor-update 3 | .last-v3-cursor-update 4 | 5 | # Created by https://www.gitignore.io/api/node 6 | # Edit at https://www.gitignore.io/?templates=node 7 | 8 | ### Node ### 9 | # Logs 10 | logs 11 | *.log 12 | npm-debug.log* 13 | yarn-debug.log* 14 | yarn-error.log* 15 | lerna-debug.log* 16 | 17 | # Diagnostic reports (https://nodejs.org/api/report.html) 18 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 19 | 20 | # Runtime data 21 | pids 22 | *.pid 23 | *.seed 24 | *.pid.lock 25 | 26 | # Directory for instrumented libs generated by jscoverage/JSCover 27 | lib-cov 28 | 29 | # Coverage directory used by tools like istanbul 30 | coverage 31 | *.lcov 32 | 33 | # nyc test coverage 34 | .nyc_output 35 | 36 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 37 | .grunt 38 | 39 | # Bower dependency directory (https://bower.io/) 40 | bower_components 41 | 42 | # node-waf configuration 43 | .lock-wscript 44 | 45 | # Compiled binary addons (https://nodejs.org/api/addons.html) 46 | build/Release 47 | 48 | # Dependency directories 49 | node_modules/ 50 | jspm_packages/ 51 | 52 | # TypeScript v1 declaration files 53 | typings/ 54 | 55 | # TypeScript cache 56 | *.tsbuildinfo 57 | 58 | # Optional npm cache directory 59 | .npm 60 | 61 | # Optional eslint cache 62 | .eslintcache 63 | 64 | # Optional REPL history 65 | .node_repl_history 66 | 67 | # Output of 'npm pack' 68 | *.tgz 69 | 70 | # Yarn Integrity file 71 | .yarn-integrity 72 | 73 | # dotenv environment variables file 74 | .env 75 | .env.test 76 | 77 | # parcel-bundler cache (https://parceljs.org/) 78 | .cache 79 | 80 | # next.js build output 81 | .next 82 | 83 | # nuxt.js build output 84 | .nuxt 85 | 86 | # rollup.js default build output 87 | dist/ 88 | 89 | # Uncomment the public line if your project uses Gatsby 90 | # https://nextjs.org/blog/next-9-1#public-directory-support 91 | # https://create-react-app.dev/docs/using-the-public-folder/#docsNav 92 | # public 93 | 94 | # Storybook build outputs 95 | .out 96 | .storybook-out 97 | 98 | # vuepress build output 99 | .vuepress/dist 100 | 101 | # Serverless directories 102 | .serverless/ 103 | 104 | # FuseBox cache 105 | .fusebox/ 106 | 107 | # DynamoDB Local files 108 | .dynamodb/ 109 | 110 | # Temporary folders 111 | tmp/ 112 | temp/ 113 | 114 | # End of https://www.gitignore.io/api/node 115 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | 2 | MIT License 3 | 4 | Copyright (c) 2021 GitHub 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /NOTICE.md: -------------------------------------------------------------------------------- 1 | # MIT License 2 | 3 | - @babel/code-frame, 7.10.4, MIT 4 | - @babel/helper-validator-identifier, 7.10.4, MIT 5 | - @babel/highlight, 7.10.4, MIT 6 | - @babel/runtime, 7.9.6, MIT 7 | - @eslint/eslintrc, 0.2.2, MIT 8 | - @octokit/auth-token, 2.4.5, MIT 9 | - @octokit/core, 3.2.5, MIT 10 | - @octokit/endpoint, 6.0.1, MIT 11 | - @octokit/graphql, 4.6.0, MIT 12 | - @octokit/openapi-types, 5.2.1, MIT 13 | - @octokit/plugin-paginate-rest, 2.11.0, MIT 14 | - @octokit/plugin-request-log, 1.0.3, MIT 15 | - @octokit/plugin-rest-endpoint-methods, 4.13.1, MIT 16 | - @octokit/plugin-retry, 3.0.7, MIT 17 | - @octokit/plugin-throttling, 3.4.1, MIT 18 | - @octokit/request, 5.4.14, MIT 19 | - @octokit/request-error, 2.0.0, MIT 20 | - @octokit/rest, 18.3.1, MIT 21 | - @octokit/types, 2.14.0, MIT 22 | - @octokit/types, 6.11.1, MIT 23 | - @types/json5, 0.0.29, MIT 24 | - @types/node, 13.13.5, MIT 25 | - acorn, 7.4.1, MIT 26 | - acorn-jsx, 5.3.1, MIT 27 | - ajv, 6.12.6, MIT 28 | - ansi-colors, 4.1.1, MIT 29 | - ansi-regex, 4.1.0, MIT 30 | - ansi-regex, 5.0.0, MIT 31 | - ansi-styles, 3.2.1, MIT 32 | - ansi-styles, 4.3.0, MIT 33 | - argparse, 1.0.10, MIT 34 | - array-includes, 3.1.2, MIT 35 | - array.prototype.flat, 1.2.4, MIT 36 | - array.prototype.flatmap, 1.2.4, MIT 37 | - astral-regex, 1.0.0, MIT 38 | - balanced-match, 1.0.0, MIT 39 | - bottleneck, 2.19.5, MIT 40 | - brace-expansion, 1.1.11, MIT 41 | - call-bind, 1.0.0, MIT 42 | - callsites, 3.1.0, MIT 43 | - chalk, 2.4.2, MIT 44 | - chalk, 4.1.0, MIT 45 | - color-convert, 1.9.3, MIT 46 | - color-convert, 2.0.1, MIT 47 | - color-name, 1.1.3, MIT 48 | - color-name, 1.1.4, MIT 49 | - commander, 5.1.0, MIT 50 | - concat-map, 0.0.1, MIT 51 | - contains-path, 0.1.0, MIT 52 | - cross-spawn, 6.0.5, MIT 53 | - cross-spawn, 7.0.3, MIT 54 | - debug, 2.6.9, MIT 55 | - debug, 4.3.1, MIT 56 | - deep-is, 0.1.3, MIT 57 | - define-properties, 1.1.3, MIT 58 | - emoji-regex, 7.0.3, MIT 59 | - end-of-stream, 1.4.4, MIT 60 | - enquirer, 2.3.6, MIT 61 | - error-ex, 1.3.2, MIT 62 | - es-abstract, 1.17.7, MIT 63 | - es-abstract, 1.18.0-next.1, MIT 64 | - es-to-primitive, 1.2.1, MIT 65 | - escape-string-regexp, 1.0.5, MIT 66 | - eslint, 7.13.0, MIT 67 | - eslint-config-standard, 16.0.2, MIT 68 | - eslint-config-standard-jsx, 10.0.0, MIT 69 | - eslint-import-resolver-node, 0.3.4, MIT 70 | - eslint-module-utils, 2.6.0, MIT 71 | - eslint-plugin-es, 3.0.1, MIT 72 | - eslint-plugin-import, 2.22.1, MIT 73 | - eslint-plugin-node, 11.1.0, MIT 74 | - eslint-plugin-react, 7.21.5, MIT 75 | - eslint-utils, 2.1.0, MIT 76 | - execa, 1.0.0, MIT 77 | - fast-deep-equal, 3.1.3, MIT 78 | - fast-json-stable-stringify, 2.1.0, MIT 79 | - fast-levenshtein, 2.0.6, MIT 80 | - file-entry-cache, 5.0.1, MIT 81 | - find-up, 2.1.0, MIT 82 | - find-up, 3.0.0, MIT 83 | - flat-cache, 2.0.1, MIT 84 | - function-bind, 1.1.1, MIT 85 | - functional-red-black-tree, 1.0.1, MIT 86 | - get-intrinsic, 1.0.1, MIT 87 | - get-stdin, 8.0.0, MIT 88 | - get-stream, 4.1.0, MIT 89 | - ghec-audit-log-cli, 2.0.0, MIT 90 | - globals, 12.4.0, MIT 91 | - has, 1.0.3, MIT 92 | - has-flag, 3.0.0, MIT 93 | - has-flag, 4.0.0, MIT 94 | - has-symbols, 1.0.1, MIT 95 | - ignore, 4.0.6, MIT 96 | - ignore, 5.1.8, MIT 97 | - import-fresh, 3.2.2, MIT 98 | - imurmurhash, 0.1.4, MIT 99 | - internal-slot, 1.0.2, MIT 100 | - is-arrayish, 0.2.1, MIT 101 | - is-callable, 1.2.2, MIT 102 | - is-core-module, 2.2.0, MIT 103 | - is-date-object, 1.0.2, MIT 104 | - is-extglob, 2.1.1, MIT 105 | - is-fullwidth-code-point, 2.0.0, MIT 106 | - is-glob, 4.0.1, MIT 107 | - is-negative-zero, 2.0.1, MIT 108 | - is-plain-object, 3.0.0, MIT 109 | - is-plain-object, 5.0.0, MIT 110 | - is-regex, 1.1.1, MIT 111 | - is-stream, 1.1.0, MIT 112 | - is-string, 1.0.5, MIT 113 | - is-symbol, 1.0.3, MIT 114 | - isarray, 1.0.0, MIT 115 | - isobject, 4.0.0, MIT 116 | - js-tokens, 4.0.0, MIT 117 | - js-yaml, 3.14.1, MIT 118 | - json-hash, 1.2.0, MIT 119 | - json-parse-better-errors, 1.0.2, MIT 120 | - json-schema-traverse, 0.4.1, MIT 121 | - json-stable-stringify-without-jsonify, 1.0.1, MIT 122 | - json5, 1.0.1, MIT 123 | - jsx-ast-utils, 3.1.0, MIT 124 | - levn, 0.4.1, MIT 125 | - load-json-file, 2.0.0, MIT 126 | - load-json-file, 5.3.0, MIT 127 | - locate-path, 2.0.0, MIT 128 | - locate-path, 3.0.0, MIT 129 | - lodash, 4.17.20, MIT 130 | - loose-envify, 1.4.0, MIT 131 | - macos-release, 2.3.0, MIT 132 | - minimist, 1.2.5, MIT 133 | - mkdirp, 0.5.5, MIT 134 | - ms, 2.0.0, MIT 135 | - ms, 2.1.2, MIT 136 | - natural-compare, 1.4.0, MIT 137 | - nice-try, 1.0.5, MIT 138 | - node-fetch, 2.6.1, MIT 139 | - npm-run-path, 2.0.2, MIT 140 | - object-assign, 4.1.1, MIT 141 | - object-inspect, 1.9.0, MIT 142 | - object-keys, 1.1.1, MIT 143 | - object.assign, 4.1.2, MIT 144 | - object.entries, 1.1.3, MIT 145 | - object.fromentries, 2.0.3, MIT 146 | - object.values, 1.1.2, MIT 147 | - optionator, 0.9.1, MIT 148 | - os-name, 3.1.0, MIT 149 | - p-finally, 1.0.0, MIT 150 | - p-limit, 1.3.0, MIT 151 | - p-limit, 2.3.0, MIT 152 | - p-locate, 2.0.0, MIT 153 | - p-locate, 3.0.0, MIT 154 | - p-try, 1.0.0, MIT 155 | - p-try, 2.2.0, MIT 156 | - parent-module, 1.0.1, MIT 157 | - parse-json, 2.2.0, MIT 158 | - parse-json, 4.0.0, MIT 159 | - path-exists, 3.0.0, MIT 160 | - path-is-absolute, 1.0.1, MIT 161 | - path-key, 2.0.1, MIT 162 | - path-key, 3.1.1, MIT 163 | - path-parse, 1.0.6, MIT 164 | - path-type, 2.0.0, MIT 165 | - pify, 2.3.0, MIT 166 | - pify, 4.0.1, MIT 167 | - pkg-conf, 3.1.0, MIT 168 | - pkg-dir, 2.0.0, MIT 169 | - prelude-ls, 1.2.1, MIT 170 | - progress, 2.0.3, MIT 171 | - prop-types, 15.7.2, MIT 172 | - pump, 3.0.0, MIT 173 | - punycode, 2.1.1, MIT 174 | - react-is, 16.13.1, MIT 175 | - read-pkg, 2.0.0, MIT 176 | - read-pkg-up, 2.0.0, MIT 177 | - regenerator-runtime, 0.13.5, MIT 178 | - regexp.prototype.flags, 1.3.0, MIT 179 | - regexpp, 3.1.0, MIT 180 | - resolve, 1.19.0, MIT 181 | - resolve-from, 4.0.0, MIT 182 | - shebang-command, 1.2.0, MIT 183 | - shebang-command, 2.0.0, MIT 184 | - shebang-regex, 1.0.0, MIT 185 | - shebang-regex, 3.0.0, MIT 186 | - side-channel, 1.0.3, MIT 187 | - slice-ansi, 2.1.0, MIT 188 | - spdx-expression-parse, 3.0.1, MIT 189 | - standard, 16.0.3, MIT 190 | - standard-engine, 14.0.1, MIT 191 | - string-width, 3.1.0, MIT 192 | - string.prototype.matchall, 4.0.3, MIT 193 | - string.prototype.trimend, 1.0.3, MIT 194 | - string.prototype.trimstart, 1.0.3, MIT 195 | - strip-ansi, 5.2.0, MIT 196 | - strip-ansi, 6.0.0, MIT 197 | - strip-bom, 3.0.0, MIT 198 | - strip-eof, 1.0.0, MIT 199 | - strip-json-comments, 3.1.1, MIT 200 | - supports-color, 5.5.0, MIT 201 | - supports-color, 7.2.0, MIT 202 | - text-table, 0.2.0, MIT 203 | - tsconfig-paths, 3.9.0, MIT 204 | - type-check, 0.4.0, MIT 205 | - type-fest, 0.3.1, "(MIT OR CC0-1.0)" 206 | - type-fest, 0.8.1, "(MIT OR CC0-1.0)" 207 | - v8-compile-cache, 2.2.0, MIT 208 | - validate.js, 0.13.1, MIT 209 | - windows-release, 3.3.0, MIT 210 | - word-wrap, 1.2.3, MIT 211 | - write, 1.0.3, MIT 212 | - xdg-basedir, 4.0.0, MIT 213 | 214 | ``` 215 | Permission is hereby granted, free of charge, to any person obtaining 216 | a copy of this software and associated documentation files (the 217 | "Software"), to deal in the Software without restriction, including 218 | without limitation the rights to use, copy, modify, merge, publish, 219 | distribute, sublicense, and/or sell copies of the Software, and to 220 | permit persons to whom the Software is furnished to do so, subject to 221 | the following conditions: 222 | 223 | The above copyright notice and this permission notice shall be 224 | included in all copies or substantial portions of the Software. 225 | 226 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 227 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 228 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 229 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 230 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 231 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 232 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 233 | ``` 234 | 235 | ## ISC license 236 | 237 | - deprecation, 2.3.1, ISC 238 | - eslint-plugin-promise, 4.2.1, ISC 239 | - flatted, 2.0.2, ISC 240 | - fs.realpath, 1.0.0, ISC 241 | - glob, 7.1.6, ISC 242 | - glob-parent, 5.1.1, ISC 243 | - graceful-fs, 4.2.4, ISC 244 | - hosted-git-info, 2.8.8, ISC 245 | - inflight, 1.0.6, ISC 246 | - inherits, 2.0.4, ISC 247 | - isexe, 2.0.0, ISC 248 | - lru-cache, 6.0.0, ISC 249 | - minimatch, 3.0.4, ISC 250 | - once, 1.4.0, ISC 251 | - rimraf, 2.6.3, ISC 252 | - semver, 5.7.1, ISC 253 | - semver, 6.3.0, ISC 254 | - semver, 7.3.4, ISC 255 | - signal-exit, 3.0.3, ISC 256 | - universal-user-agent, 5.0.0, ISC 257 | - universal-user-agent, 6.0.0, ISC 258 | - which, 1.3.1, ISC 259 | - which, 2.0.2, ISC 260 | - wrappy, 1.0.2, ISC 261 | - yallist, 4.0.0, ISC 262 | - yaml, 1.9.2, ISC 263 | 264 | ``` 265 | Permission to use, copy, modify, and/or distribute this software for any 266 | purpose with or without fee is hereby granted, provided that the above 267 | copyright notice and this permission notice appear in all copies. 268 | 269 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 270 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 271 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 272 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 273 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 274 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 275 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 276 | ``` 277 | 278 | ## Apache 2.0 279 | 280 | - before-after-hook, 2.1.1, "Apache 2.0" 281 | - doctrine, 2.1.0, "Apache 2.0" 282 | - doctrine, 3.0.0, "Apache 2.0" 283 | - eslint-visitor-keys, 1.3.0, "Apache 2.0" 284 | - eslint-visitor-keys, 2.0.0, "Apache 2.0" 285 | - spdx-correct, 3.1.1, "Apache 2.0" 286 | - validate-npm-package-license, 3.0.4, "Apache 2.0" 287 | 288 | ``` 289 | Licensed under the Apache License, Version 2.0 (the "License"); 290 | you may not use this file except in compliance with the License. 291 | You may obtain a copy of the License at 292 | 293 | http://www.apache.org/licenses/LICENSE-2.0 294 | 295 | Unless required by applicable law or agreed to in writing, software 296 | distributed under the License is distributed on an "AS IS" BASIS, 297 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 298 | See the License for the specific language governing permissions and 299 | limitations under the License. 300 | ``` 301 | 302 | ## BSD 303 | 304 | - doctrine, 1.5.0, BSD 305 | 306 | ``` 307 | Redistribution and use in source and binary forms, with or without 308 | modification, are permitted provided that the following conditions are met: 309 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 310 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 311 | 3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the . 312 | 4. Neither the name of the nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 313 | 314 | THIS SOFTWARE IS PROVIDED BY ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 315 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 316 | ``` 317 | 318 | ## New BSD 319 | 320 | - esquery, 1.3.1, "New BSD" 321 | - sprintf-js, 1.0.3, "New BSD" 322 | - table, 5.4.6, "New BSD" 323 | 324 | ``` 325 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 326 | 327 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 328 | 329 | 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 330 | 331 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 332 | ``` 333 | 334 | ## CC-BY-3.0 335 | 336 | - spdx-exceptions, 2.3.0, CC-BY-3.0 337 | 338 | See the [license here](https://creativecommons.org/licenses/by/3.0/) 339 | 340 | ## CC0-1.0 341 | 342 | - spdx-license-ids, 3.0.7, CC0-1.0 343 | 344 | See the [license here](https://creativecommons.org/publicdomain/zero/1.0/) 345 | 346 | ## Simplified BSD 347 | 348 | - eslint-scope, 5.1.1, "Simplified BSD" 349 | - espree, 7.3.1, "Simplified BSD" 350 | - esprima, 4.0.1, "Simplified BSD" 351 | - esrecurse, 4.3.0, "Simplified BSD" 352 | - estraverse, 4.3.0, "Simplified BSD" 353 | - estraverse, 5.2.0, "Simplified BSD" 354 | - esutils, 2.0.3, "Simplified BSD" 355 | - normalize-package-data, 2.5.0, "Simplified BSD" 356 | - uri-js, 4.4.0, "Simplified BSD" 357 | 358 | ``` 359 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 360 | 361 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 362 | 363 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 364 | 365 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 366 | ``` 367 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > [!WARNING] 2 | > ### This repository has been deprecated and is no longer maintained 3 | > 4 | > The features of this tool are now natively supported in GitHub, please explore the following options; 5 | > - [Audit Log Streaming](https://docs.github.com/en/enterprise-cloud@latest/admin/monitoring-activity-in-your-enterprise/reviewing-audit-logs-for-your-enterprise/streaming-the-audit-log-for-your-enterprise) 6 | > - Access the Audit Log directly via our APIs 7 | > - [REST API: Audit Log](https://docs.github.com/en/enterprise-cloud@latest/rest/enterprise-admin/audit-log?apiVersion=2022-11-28) 8 | > - [GraphQL: Audit Log](https://docs.github.com/en/enterprise-cloud@latest/graphql/reference/unions#organizationauditentry) 9 | > - Query the Audit Log APIs via our [`gh` CLI](https://cli.github.com/manual/gh_api) 10 | 11 | # CLI for the Audit Log using GHEC 12 | 13 | This CLI made in node helps on querying the audit log. It can query the full 14 | audit providing all the data the API can serve, or, given a cursor, it can 15 | provide the newest entries from that specific moment. 16 | 17 | You can build an sh script on top of this one to store the data or query it. 18 | 19 | ## CLI arguments 20 | 21 | This script can take the following arguments: 22 | 23 | ```shell 24 | > node ghec-audit-log-cli.js "--help" 25 | 26 | Usage: audit-log-ghec-cli [options] 27 | 28 | Options: 29 | -v, --version Output the current version 30 | -t, --token the token to access the API (mandatory) 31 | -o, --org the organization we want to extract the audit log from 32 | -cfg, --config location for the config yaml file. Default ".ghec-audit-log" (default: "./.ghec-audit-log") 33 | -p, --pretty prints the json data in a readable format (default: false) 34 | -l, --limit a maximum limit on the number of items retrieved 35 | -f, --file the output file where the result should be printed 36 | -a, --api the version of GitHub API to call (default: "v4") 37 | -at, --api-type Only if -a is v3. API type to bring, either all, web or git (default: "all") 38 | -c, --cursor if provided, this cursor will be used to query the newest entries from the cursor provided. If not present, the result will contain all the audit log from the org 39 | -s, --source indicate what source to use for the audit logs. Valid options are enterprise or org. Default: "org" 40 | -h, --help display help for command 41 | 42 | ``` 43 | 44 | Optionally, you can create a file called `.ghec-audit-log` that supports 45 | the **token** and **organization**, and omit the parameters while running the script. 46 | 47 | ```yaml 48 | org: org-name 49 | token: xxxxxxxxxxxxxxxx 50 | ``` 51 | 52 | ### About tokens and scopes 53 | 54 | To use this CLI you will need to use a [personal access token (PAT)](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token) with the correct scopes. The scopes will change depending on what source you are going to use to export the audit logs. 55 | 56 | Endpoint source | Needed scopes 57 | --------------- | ------------- 58 | User | `read:user` 59 | Repository | `public_repo` 60 | Organization | `read:org` 61 | Enterprise | `admin:enterprise` 62 | 63 | If you are running this utility against a GHEC account, we recommend that you create your PAT with both scopes. 64 | 65 | ## Running the CLI 66 | 67 | Execute the command using node or npm 68 | 69 | ### Pre-requisites 70 | 71 | Install the node dependencies: 72 | 73 | ```shell script 74 | $ git clone https://github.com/github/ghec-audit-log-cli 75 | $ cd ghec-audit-log-cli 76 | $ npm install 77 | ``` 78 | 79 | ### npm 80 | 81 | ```shell script 82 | $ npm run start -- --pretty 83 | ``` 84 | 85 | ### node 86 | 87 | ```shell script 88 | $ node ghec-audit-log-cli --pretty 89 | ``` 90 | 91 | ## Installing as CLI 92 | 93 | Optionally you can install the script as a CLI and run it from the command line. To install it run: 94 | 95 | ```shell script 96 | $ git clone https://github.com/github/ghec-audit-log-cli 97 | $ cd ghec-audit-log-cli 98 | $ npm link 99 | ``` 100 | 101 | Then you can execute the script as a CLI using: 102 | 103 | ```shell script 104 | $ ghec-audit-log-cli -v 105 | ``` 106 | 107 | ## Forwarding the log using GitHub Actions 108 | 109 | One of the most common uses of the CLI is to forward the log using GitHub actions. You can 110 | use as an starter workflow the ones provided in this repository for [v3](workflows/forward-v3-workflow.yml) or [v4](workflows/forward-v4-workflow.yml) 111 | and integrate it with your favorite service. 112 | 113 | This workflow: 114 | 115 | - Runs periodically 116 | - Grabs any existing cursor as the last item grabbed from the log 117 | - Grabs the latest changes from the audit log 118 | - Forwards those changes to a service 119 | - Commits the latest cursor for the next call 120 | 121 | ## Releases 122 | 123 | To create a new release of the `ghec-audit-log-cli`: 124 | 125 | - Create a new release [in the repository](https://github.com/github/ghec-audit-log-cli/releases/new) using [semantic versioning](https://semver.org/) 126 | - Add the changelog details for the version 127 | - Submit it as a draft until it's ready to be published 128 | 129 | ## How to use 130 | 131 | - Clone the *audit-log-cli* repository to your Organization 132 | - Set the **Action** to run on Cron 133 | - Create the **GitHub Secrets** needed to authenticate 134 | - Enjoy the logs 135 | 136 | ## Secret Values 137 | 138 | You will need to create the following **Github Secrets** To allow the tool to work: 139 | 140 | - **AUDIT_LOG_TOKEN** 141 | - This is a [GitHub Personal Access Token](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token) used to authenticate to your Organization 142 | - **Note:** The token must have the *admin:org* set to be able to pull information 143 | - **ORG_NAME** 144 | - Name of the **GitHub** Organization to poll the audit log 145 | - **WEBHOOK_URL** 146 | - URL to a service where the generated *json* information is piped 147 | - **COMMITTER_EMAIL** 148 | - Email address for one of the primary committers on the repository 149 | 150 | ### Notes 151 | 152 | - Modify the polling workflow to run on a cron, instead of push 153 | - The `Organization` **must** be a part of a **GitHub** Enterprise or the API calls will fail 154 | - The `Personal Access token` **must** be SSO enabled to query the GitHub Organization if it is enabled 155 | 156 | ## Disclaimer 157 | 158 | 1. This CLI provides all the events that the GitHub API offers through the [GraphQL API](https://docs.github.com/en/free-pro-team@latest/graphql/overview/schema-previews#audit-log). This is a subset of all the events that you can see through the UI. 159 | 2. This tool will be deprecated when GitHub adds a forwarding behavior on GHEC. 160 | -------------------------------------------------------------------------------- /ghec-audit-log-cli.js: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env node 2 | const YAML = require('yaml') 3 | const fs = require('fs') 4 | const { Octokit } = require('@octokit/rest') 5 | const { enterpriseCloud } = require('@octokit/plugin-enterprise-cloud') 6 | const { requestV4Entries, requestV3Entries } = require('./ghec-audit-log-client') 7 | const { retry } = require('@octokit/plugin-retry') 8 | const { throttling } = require('@octokit/plugin-throttling') 9 | const { validateInput } = require('./ghec-audit-log-utils') 10 | 11 | // Obtain configuration 12 | const { program } = require('commander') 13 | const mypackage = require('./package.json') 14 | program.version(mypackage.version, '-v, --version', 'Output the current version') 15 | .option('-t, --token ', 'the token to access the API (mandatory)') 16 | .option('-o, --org ', 'the organization we want to extract the audit log from') 17 | .option('-cfg, --config ', 'location for the config yaml file. Default ".ghec-audit-log"', './.ghec-audit-log') 18 | .option('-p, --pretty', 'prints the json data in a readable format', false) 19 | .option('-l, --limit ', 'a maximum limit on the number of items retrieved') 20 | .option('-f, --file ', 'the output file where the result should be printed') 21 | .option('-a, --api ', 'the version of GitHub API to call', 'v4') 22 | .option('-at, --api-type ', 'Only if -a is v3. API type to bring, either all, web or git', 'all') 23 | .option('-c, --cursor ', 'if provided, this cursor will be used to query the newest entries from the cursor provided. If not present, the result will contain all the audit log from the org') 24 | .option('-s, --source ', 'the source of the audit log. The source can ' + 25 | 'be either a GitHub Enterprise or a GitHub Enterprise Organization. ' + 26 | 'Accepts the following values: org | enterprise. Defaults to org', 'org') 27 | program.parse(process.argv) 28 | 29 | const configLocation = program.cfg || './.ghec-audit-log' 30 | let config = {} 31 | try { 32 | config = YAML.parse(fs.readFileSync(configLocation, 'utf8')) 33 | } catch (e) { 34 | console.log(`${configLocation} file missing. Path parameters will apply`) 35 | } 36 | 37 | // TODO idea: maybe add support for other formats like PUTVAL to forward the data in an easier way 38 | const { cursor, pretty, limit, api, apiType, token, org, outputFile, source } = validateInput(program, config) 39 | 40 | function buildGitHubClient () { 41 | const Octo = Octokit.plugin(retry, throttling) 42 | const EnterpiseOcto = Octo.plugin(enterpriseCloud) 43 | 44 | const octokit = new EnterpiseOcto({ 45 | auth: token, 46 | throttle: { 47 | onRateLimit: (retryAfter, _) => { 48 | octokit.log.warn( 49 | `[${new Date().toISOString()}] ${program} Request quota exhausted for request, will retry in ${retryAfter}` 50 | ) 51 | return true 52 | }, 53 | onAbuseLimit: (retryAfter, _) => { 54 | octokit.log.warn( 55 | `[${new Date().toISOString()}] ${program} Abuse detected for request, will retry in ${retryAfter}` 56 | ) 57 | return true 58 | } 59 | } 60 | }) 61 | return octokit 62 | } 63 | 64 | /** 65 | * Function containing the GitHub API v4 Graphql calls for the audit log 66 | */ 67 | async function queryAuditLog () { 68 | // Select the query to run 69 | let queryRunner 70 | const github = buildGitHubClient() 71 | switch (api) { 72 | case 'v4': // API v4 call with cursor 73 | queryRunner = () => requestV4Entries(github, org, limit, cursor || null) 74 | break 75 | case 'v3': // API v3 call with cursor 76 | queryRunner = () => requestV3Entries(github, org, limit, cursor || null, apiType, source) 77 | break 78 | } 79 | 80 | // Sanity check the switch 81 | if (!queryRunner) return [] 82 | 83 | // Run the query and store the most recent cursor 84 | const { data, newestCursorId } = await queryRunner() 85 | const entries = data 86 | if (newestCursorId) { 87 | const cursorFileName = `.last${api === 'v3' ? '-v3-' : '-'}cursor-update` 88 | fs.writeFileSync(cursorFileName, newestCursorId) 89 | } 90 | 91 | // Return the data 92 | if (pretty === true) { 93 | return JSON.stringify(entries, null, 4) 94 | } else { 95 | return JSON.stringify(entries) 96 | } 97 | } 98 | 99 | /* 100 | * Logic to see if we need to run the API v3 vs API v4 101 | */ 102 | queryAuditLog() 103 | .then((data) => { 104 | if (outputFile) { 105 | fs.writeFileSync(outputFile, data) 106 | } else { 107 | console.log(data) 108 | } 109 | }) 110 | .catch((err) => { 111 | console.error(err) 112 | process.exit(1) 113 | }) 114 | -------------------------------------------------------------------------------- /ghec-audit-log-client.js: -------------------------------------------------------------------------------- 1 | const hash = require('json-hash') 2 | const { allEntriesQuery } = require('./ghec-audit-log-queries') 3 | 4 | async function requestV4Entries (octokit, org, limit, cursor) { 5 | let entries = [] 6 | const variables = { 7 | org: org, 8 | page: null 9 | } 10 | 11 | let hasNextPage = true 12 | let firstPageCursorId = null 13 | let foundCursor = false 14 | const hasLimit = limit || false 15 | let limitReached = false 16 | while (hasNextPage && !foundCursor && !limitReached) { 17 | const data = await octokit.graphql(allEntriesQuery, variables) 18 | let newEntries = data.organization.auditLog.nodes 19 | 20 | // Cursor check 21 | if (cursor != null) { 22 | const index = newEntries.findIndex((elem) => elem.id === cursor) 23 | if (index !== -1) { 24 | newEntries = newEntries.slice(0, index) 25 | foundCursor = true 26 | } 27 | } 28 | 29 | entries = entries.concat(newEntries) 30 | hasNextPage = data.organization.auditLog.pageInfo.hasNextPage 31 | variables.page = data.organization.auditLog.pageInfo.endCursor 32 | 33 | // Check limit 34 | if (hasLimit) { 35 | if (entries.length >= limit) { 36 | entries = entries.slice(0, limit) 37 | } 38 | limitReached = true 39 | } 40 | 41 | // Store last cursor request 42 | if (!firstPageCursorId && newEntries.length !== 0) { 43 | firstPageCursorId = newEntries[0].id 44 | } 45 | } 46 | return { data: entries, newestCursorId: firstPageCursorId } 47 | } 48 | 49 | // In this case we are not using the cursors from the header Link as identifies the page and the last element, but wouldn't 50 | // be reliable if pagination, limit and size changes. To avoid that we are using the findHashedEntry method and we are hashing 51 | // each of the elements separately so we can find them in a more reliable way 52 | async function requestV3Entries (octokit, entity, limit, cursor, apiType, auditLogSource = 'org') { 53 | let entries = [] 54 | const hasLimit = limit || false 55 | let foundCursor = false 56 | let foundLimit = false 57 | let endpoint = '' 58 | let options = {} 59 | 60 | // Hardcoded org endpoints. We need to add the enterprise endpoints 61 | switch (auditLogSource) { 62 | case 'enterprise': 63 | endpoint = '/enterprises/{enterprise}/audit-log' 64 | options = { enterprise: entity } 65 | break 66 | default: 67 | endpoint = '/orgs/{org}/audit-log' 68 | options = { org: entity } 69 | } 70 | for await (const { data } of octokit.paginate.iterator(`GET ${endpoint}?include=${apiType}&per_page=${Math.min(100, limit)}`, options)) { 71 | let newEntries = data 72 | 73 | // If we find the entry in the current request, we should add the remaining and stop 74 | if (cursor != null) { 75 | const index = findHashedEntry(cursor, data) 76 | if (index !== -1) { 77 | newEntries = data.slice(0, index) 78 | foundCursor = true 79 | } 80 | } 81 | 82 | // Concat the previous entries and the new ones 83 | entries = entries.concat(newEntries) 84 | 85 | // Limit has been found 86 | if (hasLimit) { 87 | if (entries.length >= limit) { 88 | entries = entries.slice(0, limit) 89 | } 90 | foundLimit = true 91 | } 92 | 93 | // Stop going through the iterator if either we reached limit or found the cursor 94 | if (foundLimit || foundCursor) break 95 | } 96 | 97 | // Calculate the newest element that was provided 98 | let lastCursor = null 99 | if (entries.length > 0) { 100 | lastCursor = generateHashAudit(entries[0]) 101 | } 102 | 103 | // Provide the data 104 | return { data: entries, newestCursorId: lastCursor } 105 | } 106 | 107 | function generateHashAudit (entry) { 108 | const hashed = hash.digest(entry) 109 | return Buffer.from(hashed).toString('base64') 110 | } 111 | 112 | function findHashedEntry (cursor, entries) { 113 | return entries.findIndex((elem) => generateHashAudit(elem) === cursor) 114 | } 115 | 116 | module.exports = { 117 | requestV4Entries, 118 | requestV3Entries 119 | } 120 | -------------------------------------------------------------------------------- /ghec-audit-log-entries.js: -------------------------------------------------------------------------------- 1 | // --- model objects 2 | const sponsorsListing = `{ 3 | createdAt 4 | fullDescription 5 | id 6 | shortDescription 7 | slug 8 | }` 9 | 10 | const userStatus = `{ 11 | createdAt 12 | emoji 13 | expiresAt 14 | id 15 | indicatesLimitedAvailability 16 | message 17 | updatedAt 18 | }` 19 | 20 | const user = `{ 21 | anyPinnableItems 22 | avatarUrl 23 | bio 24 | company 25 | createdAt 26 | databaseId 27 | email 28 | id 29 | isBountyHunter 30 | isCampusExpert 31 | isDeveloperProgramMember 32 | isEmployee 33 | isHireable 34 | isSiteAdmin 35 | isViewer 36 | location 37 | login 38 | name 39 | pinnedItemsRemaining 40 | projectsResourcePath 41 | projectsUrl 42 | resourcePath 43 | sponsorsListing ${sponsorsListing} 44 | status ${userStatus} 45 | updatedAt 46 | url 47 | viewerCanChangePinnedItems 48 | viewerCanCreateProjects 49 | viewerCanFollow 50 | viewerIsFollowing 51 | websiteUrl 52 | }` 53 | 54 | const bot = `{ 55 | createdAt 56 | databaseId 57 | id 58 | login 59 | resourcePath 60 | updatedAt 61 | url 62 | }` 63 | 64 | const orgIdentityProvider = `{ 65 | digestMethod 66 | id 67 | idpCertificate 68 | issuer 69 | signatureMethod 70 | ssoUrl 71 | }` 72 | 73 | const organization = `{ 74 | anyPinnableItems 75 | avatarUrl 76 | createdAt 77 | databaseId 78 | description 79 | email 80 | id 81 | location 82 | login 83 | name 84 | newTeamResourcePath 85 | newTeamUrl 86 | organizationBillingEmail 87 | pinnedItemsRemaining 88 | projectsResourcePath 89 | projectsUrl 90 | requiresTwoFactorAuthentication 91 | resourcePath 92 | samlIdentityProvider ${orgIdentityProvider} 93 | sponsorsListing ${sponsorsListing} 94 | teamsResourcePath 95 | teamsUrl 96 | updatedAt 97 | url 98 | viewerCanAdminister 99 | viewerCanChangePinnedItems 100 | viewerCanCreateProjects 101 | viewerCanCreateRepositories 102 | viewerCanCreateTeams 103 | viewerIsAMember 104 | websiteUrl 105 | }` 106 | 107 | const team = `{ 108 | avatarUrl 109 | combinedSlug 110 | createdAt 111 | description 112 | discussionsResourcePath 113 | discussionsUrl 114 | editTeamResourcePath 115 | editTeamUrl 116 | id 117 | membersResourcePath 118 | membersUrl 119 | name 120 | newTeamResourcePath 121 | newTeamUrl 122 | privacy 123 | repositoriesResourcePath 124 | repositoriesUrl 125 | resourcePath 126 | slug 127 | teamsResourcePath 128 | teamsUrl 129 | updatedAt 130 | url 131 | viewerCanAdminister 132 | viewerCanSubscribe 133 | viewerSubscription 134 | }` 135 | 136 | const codeOfConduct = `{ 137 | body 138 | id 139 | key 140 | name 141 | resourcePath 142 | url 143 | }` 144 | 145 | const gitObjectId = `{ 146 | abbreviatedOid 147 | commitResourcePath 148 | commitUrl 149 | id 150 | }` 151 | 152 | const ref = `{ 153 | id 154 | name 155 | prefix 156 | target ${gitObjectId} 157 | }` 158 | 159 | const fundingLink = `{ 160 | platform 161 | url 162 | }` 163 | 164 | const licenseRule = `{ 165 | description 166 | key 167 | label 168 | }` 169 | 170 | const license = `{ 171 | body 172 | conditions ${licenseRule} 173 | description 174 | featured 175 | hidden 176 | id 177 | implementation 178 | key 179 | limitations ${licenseRule} 180 | name 181 | nickname 182 | permissions ${licenseRule} 183 | pseudoLicense 184 | spdxId 185 | url 186 | }` 187 | 188 | const repositoryOwner = `{ 189 | __typename 190 | login 191 | }` 192 | 193 | const language = `{ 194 | color 195 | id 196 | name 197 | }` 198 | 199 | const repository = `{ 200 | codeOfConduct ${codeOfConduct} 201 | createdAt 202 | databaseId 203 | defaultBranchRef ${ref} 204 | deleteBranchOnMerge 205 | description 206 | diskUsage 207 | forkCount 208 | fundingLinks ${fundingLink} 209 | hasIssuesEnabled 210 | hasProjectsEnabled 211 | hasWikiEnabled 212 | homepageUrl 213 | id 214 | isArchived 215 | isDisabled 216 | isFork 217 | isLocked 218 | isMirror 219 | isPrivate 220 | isTemplate 221 | licenseInfo ${license} 222 | lockReason 223 | mergeCommitAllowed 224 | mirrorUrl 225 | name 226 | nameWithOwner 227 | openGraphImageUrl 228 | owner ${repositoryOwner} 229 | primaryLanguage ${language} 230 | projectsResourcePath 231 | projectsUrl 232 | pushedAt 233 | rebaseMergeAllowed 234 | resourcePath 235 | squashMergeAllowed 236 | sshUrl 237 | tempCloneToken 238 | updatedAt 239 | url 240 | usesCustomOpenGraphImage 241 | viewerCanAdminister 242 | viewerCanCreateProjects 243 | viewerCanSubscribe 244 | viewerCanUpdateTopics 245 | viewerHasStarred 246 | viewerPermission 247 | viewerSubscription 248 | }` 249 | 250 | const actor = `{ 251 | __typename 252 | ... on Bot ${bot} 253 | ... on Organization ${organization} 254 | ... on User ${user} 255 | }` 256 | 257 | const actorLocation = `{ 258 | city 259 | country 260 | countryCode 261 | region 262 | regionCode 263 | }` 264 | 265 | const restoreOrganization = `{ 266 | organization ${organization} 267 | organizationName 268 | organizationResourcePath 269 | organizationUrl 270 | }` 271 | 272 | const restoreRepository = `{ 273 | repository ${repository} 274 | repositoryName 275 | repositoryResourcePath 276 | repositoryUrl 277 | }` 278 | 279 | const restoreTeam = `{ 280 | team ${team} 281 | teamName 282 | teamResourcePath 283 | teamUrl 284 | }` 285 | 286 | const restoreMembership = `{ 287 | ... on OrgRestoreMemberMembershipOrganizationAuditEntryData ${restoreOrganization} 288 | ... on OrgRestoreMemberMembershipRepositoryAuditEntryData ${restoreRepository} 289 | ... on OrgRestoreMemberMembershipTeamAuditEntryData ${restoreTeam} 290 | }` 291 | 292 | const topic = `{ 293 | id 294 | name 295 | viewerHasStarred 296 | }` 297 | 298 | // --- Start of generic audit entries 299 | const nodeEntryData = `... on Node { 300 | id 301 | }` 302 | 303 | const auditEntry = `... on AuditEntry { 304 | action 305 | actor ${actor} 306 | actorIp 307 | actorLocation ${actorLocation} 308 | actorLogin 309 | actorResourcePath 310 | actorUrl 311 | createdAt 312 | operationType 313 | user ${user} 314 | userLogin 315 | userResourcePath 316 | userUrl 317 | }` 318 | 319 | const organizationAuditEntryData = `... on OrganizationAuditEntryData { 320 | # organization {organization} 321 | organizationName 322 | organizationResourcePath 323 | organizationUrl 324 | }` 325 | 326 | const repositoruAuditEntryData = `... on RepositoryAuditEntryData { 327 | # repository {repository} 328 | repositoryName 329 | repositoryResourcePath 330 | repositoryUrl 331 | }` 332 | 333 | const topicAuditEntryData = `... on TopicAuditEntryData { 334 | topic ${topic} 335 | topicName 336 | }` 337 | 338 | const enterpriseAuditEntryData = `... on EnterpriseAuditEntryData { 339 | enterpriseResourcePath 340 | enterpriseSlug 341 | enterpriseUrl 342 | }` 343 | 344 | const teamAuditEntryData = `... on TeamAuditEntryData { 345 | team ${team} 346 | teamName 347 | teamResourcePath 348 | teamUrl 349 | }` 350 | 351 | // --- Start of specific audit entries 352 | const oauthApplicationCreateAuditEntry = `... on OauthApplicationCreateAuditEntry { 353 | applicationUrl 354 | callbackUrl 355 | oauthApplicationResourcePath 356 | oauthApplicationUrl 357 | rateLimit 358 | state 359 | }` 360 | 361 | const orgAddBillingManagerAuditEntry = `... on OrgAddBillingManagerAuditEntry { 362 | invitationEmail 363 | }` 364 | 365 | const orgAddMemberAuditEntry = `... on OrgAddMemberAuditEntry { 366 | permission 367 | }` 368 | 369 | const orgBlockUserAuditEntry = `... on OrgBlockUserAuditEntry { 370 | blockedUserName 371 | blockedUserResourcePath 372 | blockedUserUrl 373 | }` 374 | 375 | const orgCreateAuditEntry = `... on OrgCreateAuditEntry { 376 | billingPlan 377 | }` 378 | 379 | const orgDisableSamlAuditEntry = `... on OrgDisableSamlAuditEntry { 380 | digestMethodUrl 381 | issuerUrl 382 | signatureMethodUrl 383 | singleSignOnUrl 384 | }` 385 | 386 | const orgEnableSamlAuditEntry = `... on OrgEnableSamlAuditEntry { 387 | digestMethodUrl 388 | issuerUrl 389 | signatureMethodUrl 390 | singleSignOnUrl 391 | }` 392 | 393 | const orgInviteMemberAuditEntry = `... on OrgInviteMemberAuditEntry { 394 | email 395 | }` 396 | 397 | const orgOauthAppAccessApprovedAuditEntry = `... on OrgOauthAppAccessApprovedAuditEntry { 398 | oauthApplicationName 399 | oauthApplicationResourcePath 400 | oauthApplicationUrl 401 | }` 402 | 403 | const orgOauthAppAccessDeniedAuditEntry = `... on OrgOauthAppAccessDeniedAuditEntry { 404 | oauthApplicationName 405 | oauthApplicationResourcePath 406 | oauthApplicationUrl 407 | }` 408 | 409 | const orgOauthAppAccessRequestedAuditEntry = `... on OrgOauthAppAccessRequestedAuditEntry { 410 | oauthApplicationName 411 | oauthApplicationResourcePath 412 | oauthApplicationUrl 413 | }` 414 | 415 | const orgRemoveBillingManagerAuditEntry = `... on OrgRemoveBillingManagerAuditEntry { 416 | reason 417 | }` 418 | 419 | const orgRemoveMemberAuditEntry = `... on OrgRemoveMemberAuditEntry { 420 | membershipTypes 421 | reason 422 | }` 423 | 424 | const orgRemoveOutsideCollaboratorAuditEntry = `... on OrgRemoveOutsideCollaboratorAuditEntry { 425 | membershipTypes 426 | reason 427 | }` 428 | 429 | const orgRestoreMemberAuditEntry = `... on OrgRestoreMemberAuditEntry { 430 | restoredCustomEmailRoutingsCount 431 | restoredIssueAssignmentsCount 432 | restoredMemberships ${restoreMembership} 433 | restoredMembershipsCount 434 | restoredRepositoriesCount 435 | restoredRepositoryStarsCount 436 | restoredRepositoryWatchesCount 437 | }` 438 | 439 | const orgUnblockUserAuditEntry = `... on OrgUnblockUserAuditEntry { 440 | blockedUserName 441 | blockedUserResourcePath 442 | blockedUserUrl 443 | }` 444 | 445 | const orgUpdateDefaultRepositoryPermissionAuditEntry = `... on OrgUpdateDefaultRepositoryPermissionAuditEntry { 446 | permission 447 | permissionWas 448 | }` 449 | 450 | const orgUpdateMemberAuditEntry = `... on OrgUpdateMemberAuditEntry { 451 | permission 452 | permissionWas 453 | }` 454 | 455 | const orgUpdateMemberRepositoryCreationPermissionAuditEntry = `... on OrgUpdateMemberRepositoryCreationPermissionAuditEntry { 456 | canCreateRepositories 457 | visibility 458 | }` 459 | 460 | const orgUpdateMemberRepositoryInvitationPermissionAuditEntry = `... on OrgUpdateMemberRepositoryInvitationPermissionAuditEntry { 461 | canInviteOutsideCollaboratorsToRepositories 462 | }` 463 | 464 | const repoAccessAuditEntry = `... on RepoAccessAuditEntry { 465 | visibility 466 | }` 467 | 468 | const repoAddMemberAuditEntry = `... on RepoAddMemberAuditEntry { 469 | visibility 470 | }` 471 | 472 | const repoArchivedAuditEntry = `... on RepoArchivedAuditEntry { 473 | visibility 474 | }` 475 | 476 | const repoChangeMergeSettingAuditEntry = `... on RepoChangeMergeSettingAuditEntry { 477 | isEnabled 478 | mergeType 479 | }` 480 | 481 | const repoCreateAuditEntry = `... on RepoCreateAuditEntry { 482 | forkParentName 483 | forkSourceName 484 | visibility 485 | }` 486 | 487 | const repoDestroyAuditEntry = `... on RepoDestroyAuditEntry { 488 | visibility 489 | }` 490 | 491 | const repoRemoveMemberAuditEntry = `... on RepoRemoveMemberAuditEntry { 492 | visibility 493 | }` 494 | 495 | const teamAddMemberAuditEntry = `... on TeamAddMemberAuditEntry { 496 | isLdapMapped 497 | }` 498 | 499 | const teamAddRepositoryAuditEntry = `... on TeamAddRepositoryAuditEntry { 500 | isLdapMapped 501 | }` 502 | 503 | const teamChangeParentTeamAuditEntry = `... on TeamChangeParentTeamAuditEntry { 504 | isLdapMapped 505 | parentTeam ${team} 506 | parentTeamName 507 | parentTeamNameWas 508 | parentTeamResourcePath 509 | parentTeamUrl 510 | parentTeamWas ${team} 511 | parentTeamWasResourcePath 512 | parentTeamWasUrl 513 | }` 514 | 515 | const teamRemoveMemberAuditEntry = `... on TeamRemoveMemberAuditEntry { 516 | isLdapMapped 517 | }` 518 | 519 | const teamRemoveRepositoryAuditEntry = `... on TeamRemoveRepositoryAuditEntry { 520 | isLdapMapped 521 | }` 522 | 523 | const ghecAuditLogEntries = ` 524 | __typename 525 | 526 | ${nodeEntryData} 527 | ${auditEntry} 528 | ${enterpriseAuditEntryData} 529 | ${organizationAuditEntryData} 530 | ${repositoruAuditEntryData} 531 | ${topicAuditEntryData} 532 | ${teamAuditEntryData} 533 | 534 | ${oauthApplicationCreateAuditEntry} 535 | ${orgAddBillingManagerAuditEntry} 536 | ${orgAddMemberAuditEntry} 537 | ${orgBlockUserAuditEntry} 538 | ${orgCreateAuditEntry} 539 | ${orgDisableSamlAuditEntry} 540 | ${orgEnableSamlAuditEntry} 541 | ${orgInviteMemberAuditEntry} 542 | ${orgOauthAppAccessApprovedAuditEntry} 543 | ${orgOauthAppAccessDeniedAuditEntry} 544 | ${orgOauthAppAccessRequestedAuditEntry} 545 | ${orgRemoveBillingManagerAuditEntry} 546 | ${orgRemoveMemberAuditEntry} 547 | ${orgRemoveOutsideCollaboratorAuditEntry} 548 | ${orgRestoreMemberAuditEntry} 549 | ${orgUnblockUserAuditEntry} 550 | ${orgUpdateDefaultRepositoryPermissionAuditEntry} 551 | ${orgUpdateMemberAuditEntry} 552 | ${orgUpdateMemberRepositoryCreationPermissionAuditEntry} 553 | ${orgUpdateMemberRepositoryInvitationPermissionAuditEntry} 554 | ${repoAccessAuditEntry} 555 | ${repoAddMemberAuditEntry} 556 | ${repoArchivedAuditEntry} 557 | ${repoChangeMergeSettingAuditEntry} 558 | ${repoCreateAuditEntry} 559 | ${repoDestroyAuditEntry} 560 | ${repoRemoveMemberAuditEntry} 561 | ${teamAddMemberAuditEntry} 562 | ${teamAddRepositoryAuditEntry} 563 | ${teamChangeParentTeamAuditEntry} 564 | ${teamRemoveMemberAuditEntry} 565 | ${teamRemoveRepositoryAuditEntry} 566 | ` 567 | 568 | // All this types have no additional properties and are covered by EntryData types 569 | // Empty covered by supertypes 570 | // const membersCanDeleteReposClearAuditEntry = `... on MembersCanDeleteReposClearAuditEntry { 571 | // }`; 572 | // const membersCanDeleteReposDisableAuditEntry = `... on MembersCanDeleteReposDisableAuditEntry { 573 | // }`; 574 | // const membersCanDeleteReposEnableAuditEntry = `... on MembersCanDeleteReposEnableAuditEntry { 575 | // }`; 576 | // const orgConfigDisableCollaboratorsOnlyAuditEntry = `... on OrgConfigDisableCollaboratorsOnlyAuditEntry { 577 | // }`; 578 | // const orgConfigEnableCollaboratorsOnlyAuditEntry = `... on OrgConfigEnableCollaboratorsOnlyAuditEntry { 579 | // }`; 580 | // const orgDisableOauthAppRestrictionsAuditEntry = `... on OrgDisableOauthAppRestrictionsAuditEntry { 581 | // }`; 582 | // const orgDisableTwoFactorRequirementAuditEntry = `... on OrgDisableTwoFactorRequirementAuditEntry { 583 | // }`; 584 | // const orgEnableOauthAppRestrictionsAuditEntry = `... on OrgEnableOauthAppRestrictionsAuditEntry { 585 | // }`; 586 | // const orgEnableTwoFactorRequirementAuditEntry = `... on OrgEnableTwoFactorRequirementAuditEntry { 587 | // }`; 588 | // const orgInviteToBusinessAuditEntry = `... on OrgInviteToBusinessAuditEntry { 589 | // }`; 590 | // const privateRepositoryForkingDisableAuditEntry = `... on PrivateRepositoryForkingDisableAuditEntry { 591 | // }`; 592 | // const privateRepositoryForkingEnableAuditEntry = `... on PrivateRepositoryForkingEnableAuditEntry { 593 | // }`; 594 | // const repoAddTopicAuditEntry = `... on RepoAddTopicAuditEntry { 595 | // }`; 596 | // const repoConfigDisableAnonymousGitAccessAuditEntry = `... on RepoConfigDisableAnonymousGitAccessAuditEntry { 597 | // }`; 598 | // const repoConfigDisableCollaboratorsOnlyAuditEntry = `... on RepoConfigDisableCollaboratorsOnlyAuditEntry { 599 | // }`; 600 | // const repoConfigDisableContributorsOnlyAuditEntry = `... on RepoConfigDisableContributorsOnlyAuditEntry { 601 | // }`; 602 | // const repoConfigDisableSockpuppetDisallowedAuditEntry = `... on RepoConfigDisableSockpuppetDisallowedAuditEntry { 603 | // }`; 604 | // const repoConfigEnableAnonymousGitAccessAuditEntry = `... on RepoConfigEnableAnonymousGitAccessAuditEntry { 605 | // }`; 606 | // const repoConfigEnableCollaboratorsOnlyAuditEntry = `... on RepoConfigEnableCollaboratorsOnlyAuditEntry { 607 | // }`; 608 | // const repoConfigEnableContributorsOnlyAuditEntry = `... on RepoConfigEnableContributorsOnlyAuditEntry { 609 | // }`; 610 | // const repoConfigEnableSockpuppetDisallowedAuditEntry = `... on RepoConfigEnableSockpuppetDisallowedAuditEntry { 611 | // }`; 612 | // const repoConfigLockAnonymousGitAccessAuditEntry = `... on RepoConfigLockAnonymousGitAccessAuditEntry { 613 | // }`; 614 | // const repoConfigUnlockAnonymousGitAccessAuditEntry = `... on RepoConfigUnlockAnonymousGitAccessAuditEntry { 615 | // }`; 616 | // const repoRemoveTopicAuditEntry = `... on RepoRemoveTopicAuditEntry { 617 | // }`; 618 | // const repositoryVisibilityChangeDisableAuditEntry = `... on RepositoryVisibilityChangeDisableAuditEntry { 619 | // }`; 620 | // const repositoryVisibilityChangeEnableAuditEntry = `... on RepositoryVisibilityChangeEnableAuditEntry { 621 | // }`; 622 | // 623 | // ${membersCanDeleteReposClearAuditEntry} 624 | // ${membersCanDeleteReposDisableAuditEntry} 625 | // ${membersCanDeleteReposEnableAuditEntry} 626 | // ${orgConfigDisableCollaboratorsOnlyAuditEntry} 627 | // ${orgConfigEnableCollaboratorsOnlyAuditEntry} 628 | // ${orgDisableOauthAppRestrictionsAuditEntry} 629 | // ${orgDisableTwoFactorRequirementAuditEntry} 630 | // ${orgEnableOauthAppRestrictionsAuditEntry} 631 | // ${orgEnableTwoFactorRequirementAuditEntry} 632 | // ${orgInviteToBusinessAuditEntry} 633 | // ${privateRepositoryForkingDisableAuditEntry} 634 | // ${privateRepositoryForkingEnableAuditEntry} 635 | // ${repoAddTopicAuditEntry} 636 | // ${repoConfigDisableAnonymousGitAccessAuditEntry} 637 | // ${repoConfigDisableCollaboratorsOnlyAuditEntry} 638 | // ${repoConfigDisableContributorsOnlyAuditEntry} 639 | // ${repoConfigDisableSockpuppetDisallowedAuditEntry} 640 | // ${repoConfigEnableAnonymousGitAccessAuditEntry} 641 | // ${repoConfigEnableCollaboratorsOnlyAuditEntry} 642 | // ${repoConfigEnableContributorsOnlyAuditEntry} 643 | // ${repoConfigEnableSockpuppetDisallowedAuditEntry} 644 | // ${repoConfigLockAnonymousGitAccessAuditEntry} 645 | // ${repoConfigUnlockAnonymousGitAccessAuditEntry} 646 | // ${repoRemoveTopicAuditEntry} 647 | // ${repositoryVisibilityChangeDisableAuditEntry} 648 | // ${repositoryVisibilityChangeEnableAuditEntry} 649 | 650 | module.exports = ghecAuditLogEntries 651 | -------------------------------------------------------------------------------- /ghec-audit-log-queries.js: -------------------------------------------------------------------------------- 1 | const auditLogEntries = require('./ghec-audit-log-entries') 2 | 3 | const allEntriesQuery = ` 4 | query($org: String!, $page: String) { 5 | organization(login: $org) { 6 | auditLog(first: 100, after: $page){ 7 | pageInfo { 8 | endCursor 9 | hasNextPage 10 | } 11 | nodes { 12 | ${auditLogEntries} 13 | } 14 | } 15 | } 16 | }` 17 | 18 | module.exports = { 19 | allEntriesQuery 20 | } 21 | -------------------------------------------------------------------------------- /ghec-audit-log-utils.js: -------------------------------------------------------------------------------- 1 | const validate = require('validate.js') 2 | const fs = require('fs') 3 | const path = require('path') 4 | 5 | function validateInput (program, config) { 6 | const parsed = { 7 | cursor: program.cursor || null, 8 | pretty: program.pretty || false, 9 | limit: program.limit || null, 10 | api: program.api || 'v4', 11 | apiType: program.apiType || 'all', 12 | token: program.token || config.token, 13 | org: program.org || config.org, 14 | outputFile: program.file, 15 | source: program.source || 'org' 16 | } 17 | 18 | // Validate correctness 19 | const tokenRegex = /^[g(p|o|u|s|r)1_]{0,1}[A-Za-z0-9_]+$/ 20 | const base64Regex = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/ 21 | const orgRegex = /^[a-z\d]+(?:-?[a-z\d]+)*$/i 22 | const constraints = { 23 | cursor: { 24 | type: 'string', 25 | presence: false, 26 | format: base64Regex 27 | }, 28 | pretty: { 29 | type: 'boolean', 30 | presence: true 31 | }, 32 | limit: { 33 | presence: false, 34 | numericality: { 35 | onlyInteger: true, 36 | greaterThan: 0 37 | } 38 | }, 39 | token: { 40 | type: 'string', 41 | presence: { allowEmpty: false }, 42 | length: { 43 | is: 40 44 | }, 45 | format: tokenRegex 46 | }, 47 | api: { 48 | type: 'string', 49 | presence: { allowEmpty: false }, 50 | length: { 51 | is: 2 52 | }, 53 | inclusion: ['v3', 'v4'] 54 | }, 55 | apiType: { 56 | type: 'string', 57 | presence: { allowEmpty: false }, 58 | length: { 59 | is: 3 60 | }, 61 | inclusion: ['all', 'git', 'web'] 62 | }, 63 | org: { 64 | type: 'string', 65 | presence: { allowEmpty: false }, 66 | length: { 67 | maximum: 39, 68 | minimum: 1 69 | }, 70 | format: orgRegex 71 | }, 72 | outputFile: { 73 | type: 'string', 74 | presence: false 75 | }, 76 | source: { 77 | type: 'string', 78 | presence: { allowEmpty: false }, 79 | inclusion: ['org', 'enterprise'] 80 | } 81 | } 82 | 83 | // Verify validation 84 | const validation = validate(parsed, constraints) 85 | if (!validate.isEmpty(validation)) { 86 | throw new Error(JSON.stringify(validation)) 87 | } 88 | 89 | // Check that we can write into that file 90 | if (parsed.outputFile) { 91 | try { 92 | fs.openSync(parsed.outputFile, 'w') 93 | } catch (e) { 94 | throw new Error(`The output file ${parsed.outputFile} cannot be written or the path does not exist. ${e.message}`) 95 | } 96 | } 97 | // Check that if we are in GitHub actions the file is expected to be within the workspace 98 | if (process.env.GITHUB_ACTIONS) { 99 | const filePath = path.join(process.env.GITHUB_WORKSPACE, parsed.outputFile) 100 | const { dir } = path.parse(filePath) 101 | 102 | if (dir.indexOf(process.env.GITHUB_WORKSPACE) < 0) { 103 | throw new Error(`${parsed.outputFile} is not allowed. The directory should be within ${process.env.GITHUB_WORKSPACE}`) 104 | } 105 | } 106 | 107 | return parsed 108 | } 109 | 110 | module.exports = { 111 | validateInput 112 | } 113 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ghec-audit-log-cli", 3 | "version": "2.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.10.4", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", 10 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.4" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.10.4", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", 19 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.10.4", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", 25 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.10.4", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | }, 32 | "dependencies": { 33 | "chalk": { 34 | "version": "2.4.2", 35 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 36 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 37 | "dev": true, 38 | "requires": { 39 | "ansi-styles": "^3.2.1", 40 | "escape-string-regexp": "^1.0.5", 41 | "supports-color": "^5.3.0" 42 | } 43 | } 44 | } 45 | }, 46 | "@babel/runtime": { 47 | "version": "7.9.6", 48 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz", 49 | "integrity": "sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==", 50 | "requires": { 51 | "regenerator-runtime": "^0.13.4" 52 | } 53 | }, 54 | "@eslint/eslintrc": { 55 | "version": "0.2.2", 56 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz", 57 | "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==", 58 | "dev": true, 59 | "requires": { 60 | "ajv": "^6.12.4", 61 | "debug": "^4.1.1", 62 | "espree": "^7.3.0", 63 | "globals": "^12.1.0", 64 | "ignore": "^4.0.6", 65 | "import-fresh": "^3.2.1", 66 | "js-yaml": "^3.13.1", 67 | "lodash": "^4.17.19", 68 | "minimatch": "^3.0.4", 69 | "strip-json-comments": "^3.1.1" 70 | } 71 | }, 72 | "@octokit/auth-token": { 73 | "version": "2.4.5", 74 | "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz", 75 | "integrity": "sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==", 76 | "requires": { 77 | "@octokit/types": "^6.0.3" 78 | }, 79 | "dependencies": { 80 | "@octokit/types": { 81 | "version": "6.11.1", 82 | "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.11.1.tgz", 83 | "integrity": "sha512-UiSRTG2lrFbMUMwhKNR0uSV33Fzv4bNu1n5iFuuNOg80XCh0VYNhR4TQWgrkLhVxdDuej6s61aP3eQvVm6K6uA==", 84 | "requires": { 85 | "@octokit/openapi-types": "^5.2.1" 86 | } 87 | } 88 | } 89 | }, 90 | "@octokit/core": { 91 | "version": "3.2.5", 92 | "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.2.5.tgz", 93 | "integrity": "sha512-+DCtPykGnvXKWWQI0E1XD+CCeWSBhB6kwItXqfFmNBlIlhczuDPbg+P6BtLnVBaRJDAjv+1mrUJuRsFSjktopg==", 94 | "requires": { 95 | "@octokit/auth-token": "^2.4.4", 96 | "@octokit/graphql": "^4.5.8", 97 | "@octokit/request": "^5.4.12", 98 | "@octokit/types": "^6.0.3", 99 | "before-after-hook": "^2.1.0", 100 | "universal-user-agent": "^6.0.0" 101 | }, 102 | "dependencies": { 103 | "@octokit/types": { 104 | "version": "6.11.1", 105 | "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.11.1.tgz", 106 | "integrity": "sha512-UiSRTG2lrFbMUMwhKNR0uSV33Fzv4bNu1n5iFuuNOg80XCh0VYNhR4TQWgrkLhVxdDuej6s61aP3eQvVm6K6uA==", 107 | "requires": { 108 | "@octokit/openapi-types": "^5.2.1" 109 | } 110 | } 111 | } 112 | }, 113 | "@octokit/endpoint": { 114 | "version": "6.0.1", 115 | "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.1.tgz", 116 | "integrity": "sha512-pOPHaSz57SFT/m3R5P8MUu4wLPszokn5pXcB/pzavLTQf2jbU+6iayTvzaY6/BiotuRS0qyEUkx3QglT4U958A==", 117 | "requires": { 118 | "@octokit/types": "^2.11.1", 119 | "is-plain-object": "^3.0.0", 120 | "universal-user-agent": "^5.0.0" 121 | }, 122 | "dependencies": { 123 | "universal-user-agent": { 124 | "version": "5.0.0", 125 | "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", 126 | "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==", 127 | "requires": { 128 | "os-name": "^3.1.0" 129 | } 130 | } 131 | } 132 | }, 133 | "@octokit/graphql": { 134 | "version": "4.6.0", 135 | "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.6.0.tgz", 136 | "integrity": "sha512-CJ6n7izLFXLvPZaWzCQDjU/RP+vHiZmWdOunaCS87v+2jxMsW9FB5ktfIxybRBxZjxuJGRnxk7xJecWTVxFUYQ==", 137 | "requires": { 138 | "@octokit/request": "^5.3.0", 139 | "@octokit/types": "^6.0.3", 140 | "universal-user-agent": "^6.0.0" 141 | }, 142 | "dependencies": { 143 | "@octokit/types": { 144 | "version": "6.11.1", 145 | "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.11.1.tgz", 146 | "integrity": "sha512-UiSRTG2lrFbMUMwhKNR0uSV33Fzv4bNu1n5iFuuNOg80XCh0VYNhR4TQWgrkLhVxdDuej6s61aP3eQvVm6K6uA==", 147 | "requires": { 148 | "@octokit/openapi-types": "^5.2.1" 149 | } 150 | } 151 | } 152 | }, 153 | "@octokit/openapi-types": { 154 | "version": "5.2.1", 155 | "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-5.2.1.tgz", 156 | "integrity": "sha512-Bf7MBvQ1nMpv15ANaQtRBsC7YnwQFPM0eUztp3luQs9L6sBEiQ6ArM1Wx5CG+N7tXETtd0oE0DMcU4wbLlCZIw==" 157 | }, 158 | "@octokit/plugin-enterprise-cloud": { 159 | "version": "5.0.4", 160 | "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-cloud/-/plugin-enterprise-cloud-5.0.4.tgz", 161 | "integrity": "sha512-QguvIG1jQmtK8wmU+ZgRz1I0uwbnQwG0LEbp+wTE2EeDtN6h+hpXVjKTMXEA+9fZ0v3WiAlQMcQ2vLmwFsPbcg==", 162 | "requires": { 163 | "@octokit/types": "^6.0.0" 164 | }, 165 | "dependencies": { 166 | "@octokit/openapi-types": { 167 | "version": "6.0.0", 168 | "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-6.0.0.tgz", 169 | "integrity": "sha512-CnDdK7ivHkBtJYzWzZm7gEkanA7gKH6a09Eguz7flHw//GacPJLmkHA3f3N++MJmlxD1Fl+mB7B32EEpSCwztQ==" 170 | }, 171 | "@octokit/types": { 172 | "version": "6.13.0", 173 | "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.13.0.tgz", 174 | "integrity": "sha512-W2J9qlVIU11jMwKHUp5/rbVUeErqelCsO5vW5PKNb7wAXQVUz87Rc+imjlEvpvbH8yUb+KHmv8NEjVZdsdpyxA==", 175 | "requires": { 176 | "@octokit/openapi-types": "^6.0.0" 177 | } 178 | } 179 | } 180 | }, 181 | "@octokit/plugin-paginate-rest": { 182 | "version": "2.11.0", 183 | "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.11.0.tgz", 184 | "integrity": "sha512-7L9xQank2G3r1dGqrVPo1z62V5utbykOUzlmNHPz87Pww/JpZQ9KyG5CHtUzgmB4n5iDRKYNK/86A8D98HP0yA==", 185 | "requires": { 186 | "@octokit/types": "^6.11.0" 187 | }, 188 | "dependencies": { 189 | "@octokit/types": { 190 | "version": "6.11.1", 191 | "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.11.1.tgz", 192 | "integrity": "sha512-UiSRTG2lrFbMUMwhKNR0uSV33Fzv4bNu1n5iFuuNOg80XCh0VYNhR4TQWgrkLhVxdDuej6s61aP3eQvVm6K6uA==", 193 | "requires": { 194 | "@octokit/openapi-types": "^5.2.1" 195 | } 196 | } 197 | } 198 | }, 199 | "@octokit/plugin-request-log": { 200 | "version": "1.0.3", 201 | "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz", 202 | "integrity": "sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ==" 203 | }, 204 | "@octokit/plugin-rest-endpoint-methods": { 205 | "version": "4.13.1", 206 | "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.13.1.tgz", 207 | "integrity": "sha512-T9YhQqpbO9Onmg+FYk09uci9pfChg8CZR9GBaPJWj+bDSzictW1xnU0NtCSSKKyrwvpW/opu7CtuDSs/HF1Syg==", 208 | "requires": { 209 | "@octokit/types": "^6.11.1", 210 | "deprecation": "^2.3.1" 211 | }, 212 | "dependencies": { 213 | "@octokit/types": { 214 | "version": "6.11.1", 215 | "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.11.1.tgz", 216 | "integrity": "sha512-UiSRTG2lrFbMUMwhKNR0uSV33Fzv4bNu1n5iFuuNOg80XCh0VYNhR4TQWgrkLhVxdDuej6s61aP3eQvVm6K6uA==", 217 | "requires": { 218 | "@octokit/openapi-types": "^5.2.1" 219 | } 220 | } 221 | } 222 | }, 223 | "@octokit/plugin-retry": { 224 | "version": "3.0.7", 225 | "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-3.0.7.tgz", 226 | "integrity": "sha512-n08BPfVeKj5wnyH7IaOWnuKbx+e9rSJkhDHMJWXLPv61625uWjsN8G7sAW3zWm9n9vnS4friE7LL/XLcyGeG8Q==", 227 | "requires": { 228 | "@octokit/types": "^6.0.3", 229 | "bottleneck": "^2.15.3" 230 | }, 231 | "dependencies": { 232 | "@octokit/types": { 233 | "version": "6.11.1", 234 | "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.11.1.tgz", 235 | "integrity": "sha512-UiSRTG2lrFbMUMwhKNR0uSV33Fzv4bNu1n5iFuuNOg80XCh0VYNhR4TQWgrkLhVxdDuej6s61aP3eQvVm6K6uA==", 236 | "requires": { 237 | "@octokit/openapi-types": "^5.2.1" 238 | } 239 | } 240 | } 241 | }, 242 | "@octokit/plugin-throttling": { 243 | "version": "3.4.1", 244 | "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-3.4.1.tgz", 245 | "integrity": "sha512-qCQ+Z4AnL9OrXvV59EH3GzPxsB+WyqufoCjiCJXJxTbnt3W+leXbXw5vHrMp4NG9ltw00McFWIxIxNQAzLNoTA==", 246 | "requires": { 247 | "@octokit/types": "^6.0.1", 248 | "bottleneck": "^2.15.3" 249 | }, 250 | "dependencies": { 251 | "@octokit/types": { 252 | "version": "6.11.1", 253 | "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.11.1.tgz", 254 | "integrity": "sha512-UiSRTG2lrFbMUMwhKNR0uSV33Fzv4bNu1n5iFuuNOg80XCh0VYNhR4TQWgrkLhVxdDuej6s61aP3eQvVm6K6uA==", 255 | "requires": { 256 | "@octokit/openapi-types": "^5.2.1" 257 | } 258 | } 259 | } 260 | }, 261 | "@octokit/request": { 262 | "version": "5.4.14", 263 | "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.14.tgz", 264 | "integrity": "sha512-VkmtacOIQp9daSnBmDI92xNIeLuSRDOIuplp/CJomkvzt7M18NXgG044Cx/LFKLgjKt9T2tZR6AtJayba9GTSA==", 265 | "requires": { 266 | "@octokit/endpoint": "^6.0.1", 267 | "@octokit/request-error": "^2.0.0", 268 | "@octokit/types": "^6.7.1", 269 | "deprecation": "^2.0.0", 270 | "is-plain-object": "^5.0.0", 271 | "node-fetch": "^2.6.1", 272 | "once": "^1.4.0", 273 | "universal-user-agent": "^6.0.0" 274 | }, 275 | "dependencies": { 276 | "@octokit/types": { 277 | "version": "6.11.1", 278 | "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.11.1.tgz", 279 | "integrity": "sha512-UiSRTG2lrFbMUMwhKNR0uSV33Fzv4bNu1n5iFuuNOg80XCh0VYNhR4TQWgrkLhVxdDuej6s61aP3eQvVm6K6uA==", 280 | "requires": { 281 | "@octokit/openapi-types": "^5.2.1" 282 | } 283 | }, 284 | "is-plain-object": { 285 | "version": "5.0.0", 286 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", 287 | "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" 288 | } 289 | } 290 | }, 291 | "@octokit/request-error": { 292 | "version": "2.0.0", 293 | "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.0.tgz", 294 | "integrity": "sha512-rtYicB4Absc60rUv74Rjpzek84UbVHGHJRu4fNVlZ1mCcyUPPuzFfG9Rn6sjHrd95DEsmjSt1Axlc699ZlbDkw==", 295 | "requires": { 296 | "@octokit/types": "^2.0.0", 297 | "deprecation": "^2.0.0", 298 | "once": "^1.4.0" 299 | } 300 | }, 301 | "@octokit/rest": { 302 | "version": "18.3.1", 303 | "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.3.1.tgz", 304 | "integrity": "sha512-g57ebsk7dtbLjiPBgEYDAiDTsyQM9kvlIt0J5UN6OSjG82K6fQQck6HXPpwcyNIDqbN7lIaWr3nsz56jBfI6qg==", 305 | "requires": { 306 | "@octokit/core": "^3.2.3", 307 | "@octokit/plugin-paginate-rest": "^2.6.2", 308 | "@octokit/plugin-request-log": "^1.0.2", 309 | "@octokit/plugin-rest-endpoint-methods": "4.13.1" 310 | } 311 | }, 312 | "@octokit/types": { 313 | "version": "2.14.0", 314 | "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.14.0.tgz", 315 | "integrity": "sha512-1w2wxpN45rEXPDFeB7rGain7wcJ/aTRg8bdILITVnS0O7a4zEGELa3JmIe+jeLdekQjvZRbVfNPqS+mi5fKCKQ==", 316 | "requires": { 317 | "@types/node": ">= 8" 318 | } 319 | }, 320 | "@types/json5": { 321 | "version": "0.0.29", 322 | "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", 323 | "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", 324 | "dev": true 325 | }, 326 | "@types/node": { 327 | "version": "13.13.5", 328 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.5.tgz", 329 | "integrity": "sha512-3ySmiBYJPqgjiHA7oEaIo2Rzz0HrOZ7yrNO5HWyaE5q0lQ3BppDZ3N53Miz8bw2I7gh1/zir2MGVZBvpb1zq9g==" 330 | }, 331 | "acorn": { 332 | "version": "7.4.1", 333 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 334 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 335 | "dev": true 336 | }, 337 | "acorn-jsx": { 338 | "version": "5.3.1", 339 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", 340 | "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", 341 | "dev": true 342 | }, 343 | "ajv": { 344 | "version": "6.12.6", 345 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 346 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 347 | "dev": true, 348 | "requires": { 349 | "fast-deep-equal": "^3.1.1", 350 | "fast-json-stable-stringify": "^2.0.0", 351 | "json-schema-traverse": "^0.4.1", 352 | "uri-js": "^4.2.2" 353 | } 354 | }, 355 | "ansi-colors": { 356 | "version": "4.1.1", 357 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 358 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 359 | "dev": true 360 | }, 361 | "ansi-regex": { 362 | "version": "5.0.0", 363 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 364 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 365 | "dev": true 366 | }, 367 | "ansi-styles": { 368 | "version": "3.2.1", 369 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 370 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 371 | "dev": true, 372 | "requires": { 373 | "color-convert": "^1.9.0" 374 | } 375 | }, 376 | "argparse": { 377 | "version": "1.0.10", 378 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 379 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 380 | "dev": true, 381 | "requires": { 382 | "sprintf-js": "~1.0.2" 383 | } 384 | }, 385 | "array-includes": { 386 | "version": "3.1.2", 387 | "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.2.tgz", 388 | "integrity": "sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==", 389 | "dev": true, 390 | "requires": { 391 | "call-bind": "^1.0.0", 392 | "define-properties": "^1.1.3", 393 | "es-abstract": "^1.18.0-next.1", 394 | "get-intrinsic": "^1.0.1", 395 | "is-string": "^1.0.5" 396 | } 397 | }, 398 | "array.prototype.flat": { 399 | "version": "1.2.4", 400 | "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", 401 | "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", 402 | "dev": true, 403 | "requires": { 404 | "call-bind": "^1.0.0", 405 | "define-properties": "^1.1.3", 406 | "es-abstract": "^1.18.0-next.1" 407 | } 408 | }, 409 | "array.prototype.flatmap": { 410 | "version": "1.2.4", 411 | "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", 412 | "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", 413 | "dev": true, 414 | "requires": { 415 | "call-bind": "^1.0.0", 416 | "define-properties": "^1.1.3", 417 | "es-abstract": "^1.18.0-next.1", 418 | "function-bind": "^1.1.1" 419 | } 420 | }, 421 | "astral-regex": { 422 | "version": "1.0.0", 423 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 424 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 425 | "dev": true 426 | }, 427 | "balanced-match": { 428 | "version": "1.0.0", 429 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 430 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 431 | "dev": true 432 | }, 433 | "before-after-hook": { 434 | "version": "2.1.1", 435 | "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.1.tgz", 436 | "integrity": "sha512-5ekuQOvO04MDj7kYZJaMab2S8SPjGJbotVNyv7QYFCOAwrGZs/YnoDNlh1U+m5hl7H2D/+n0taaAV/tfyd3KMA==" 437 | }, 438 | "bottleneck": { 439 | "version": "2.19.5", 440 | "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", 441 | "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" 442 | }, 443 | "brace-expansion": { 444 | "version": "1.1.11", 445 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 446 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 447 | "dev": true, 448 | "requires": { 449 | "balanced-match": "^1.0.0", 450 | "concat-map": "0.0.1" 451 | } 452 | }, 453 | "call-bind": { 454 | "version": "1.0.0", 455 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", 456 | "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", 457 | "dev": true, 458 | "requires": { 459 | "function-bind": "^1.1.1", 460 | "get-intrinsic": "^1.0.0" 461 | } 462 | }, 463 | "callsites": { 464 | "version": "3.1.0", 465 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 466 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 467 | "dev": true 468 | }, 469 | "chalk": { 470 | "version": "4.1.0", 471 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 472 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 473 | "dev": true, 474 | "requires": { 475 | "ansi-styles": "^4.1.0", 476 | "supports-color": "^7.1.0" 477 | }, 478 | "dependencies": { 479 | "ansi-styles": { 480 | "version": "4.3.0", 481 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 482 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 483 | "dev": true, 484 | "requires": { 485 | "color-convert": "^2.0.1" 486 | } 487 | }, 488 | "color-convert": { 489 | "version": "2.0.1", 490 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 491 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 492 | "dev": true, 493 | "requires": { 494 | "color-name": "~1.1.4" 495 | } 496 | }, 497 | "color-name": { 498 | "version": "1.1.4", 499 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 500 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 501 | "dev": true 502 | }, 503 | "has-flag": { 504 | "version": "4.0.0", 505 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 506 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 507 | "dev": true 508 | }, 509 | "supports-color": { 510 | "version": "7.2.0", 511 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 512 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 513 | "dev": true, 514 | "requires": { 515 | "has-flag": "^4.0.0" 516 | } 517 | } 518 | } 519 | }, 520 | "color-convert": { 521 | "version": "1.9.3", 522 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 523 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 524 | "dev": true, 525 | "requires": { 526 | "color-name": "1.1.3" 527 | } 528 | }, 529 | "color-name": { 530 | "version": "1.1.3", 531 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 532 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 533 | "dev": true 534 | }, 535 | "commander": { 536 | "version": "5.1.0", 537 | "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", 538 | "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" 539 | }, 540 | "concat-map": { 541 | "version": "0.0.1", 542 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 543 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 544 | "dev": true 545 | }, 546 | "contains-path": { 547 | "version": "0.1.0", 548 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", 549 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", 550 | "dev": true 551 | }, 552 | "cross-spawn": { 553 | "version": "6.0.5", 554 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 555 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 556 | "requires": { 557 | "nice-try": "^1.0.4", 558 | "path-key": "^2.0.1", 559 | "semver": "^5.5.0", 560 | "shebang-command": "^1.2.0", 561 | "which": "^1.2.9" 562 | } 563 | }, 564 | "debug": { 565 | "version": "4.3.1", 566 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 567 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 568 | "dev": true, 569 | "requires": { 570 | "ms": "2.1.2" 571 | } 572 | }, 573 | "deep-is": { 574 | "version": "0.1.3", 575 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 576 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 577 | "dev": true 578 | }, 579 | "define-properties": { 580 | "version": "1.1.3", 581 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 582 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 583 | "dev": true, 584 | "requires": { 585 | "object-keys": "^1.0.12" 586 | } 587 | }, 588 | "deprecation": { 589 | "version": "2.3.1", 590 | "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", 591 | "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" 592 | }, 593 | "doctrine": { 594 | "version": "3.0.0", 595 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 596 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 597 | "dev": true, 598 | "requires": { 599 | "esutils": "^2.0.2" 600 | } 601 | }, 602 | "emoji-regex": { 603 | "version": "7.0.3", 604 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 605 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 606 | "dev": true 607 | }, 608 | "end-of-stream": { 609 | "version": "1.4.4", 610 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 611 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 612 | "requires": { 613 | "once": "^1.4.0" 614 | } 615 | }, 616 | "enquirer": { 617 | "version": "2.3.6", 618 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 619 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 620 | "dev": true, 621 | "requires": { 622 | "ansi-colors": "^4.1.1" 623 | } 624 | }, 625 | "error-ex": { 626 | "version": "1.3.2", 627 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 628 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 629 | "dev": true, 630 | "requires": { 631 | "is-arrayish": "^0.2.1" 632 | } 633 | }, 634 | "es-abstract": { 635 | "version": "1.18.0-next.1", 636 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", 637 | "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", 638 | "dev": true, 639 | "requires": { 640 | "es-to-primitive": "^1.2.1", 641 | "function-bind": "^1.1.1", 642 | "has": "^1.0.3", 643 | "has-symbols": "^1.0.1", 644 | "is-callable": "^1.2.2", 645 | "is-negative-zero": "^2.0.0", 646 | "is-regex": "^1.1.1", 647 | "object-inspect": "^1.8.0", 648 | "object-keys": "^1.1.1", 649 | "object.assign": "^4.1.1", 650 | "string.prototype.trimend": "^1.0.1", 651 | "string.prototype.trimstart": "^1.0.1" 652 | } 653 | }, 654 | "es-to-primitive": { 655 | "version": "1.2.1", 656 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 657 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 658 | "dev": true, 659 | "requires": { 660 | "is-callable": "^1.1.4", 661 | "is-date-object": "^1.0.1", 662 | "is-symbol": "^1.0.2" 663 | } 664 | }, 665 | "escape-string-regexp": { 666 | "version": "1.0.5", 667 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 668 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 669 | "dev": true 670 | }, 671 | "eslint": { 672 | "version": "7.13.0", 673 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.13.0.tgz", 674 | "integrity": "sha512-uCORMuOO8tUzJmsdRtrvcGq5qposf7Rw0LwkTJkoDbOycVQtQjmnhZSuLQnozLE4TmAzlMVV45eCHmQ1OpDKUQ==", 675 | "dev": true, 676 | "requires": { 677 | "@babel/code-frame": "^7.0.0", 678 | "@eslint/eslintrc": "^0.2.1", 679 | "ajv": "^6.10.0", 680 | "chalk": "^4.0.0", 681 | "cross-spawn": "^7.0.2", 682 | "debug": "^4.0.1", 683 | "doctrine": "^3.0.0", 684 | "enquirer": "^2.3.5", 685 | "eslint-scope": "^5.1.1", 686 | "eslint-utils": "^2.1.0", 687 | "eslint-visitor-keys": "^2.0.0", 688 | "espree": "^7.3.0", 689 | "esquery": "^1.2.0", 690 | "esutils": "^2.0.2", 691 | "file-entry-cache": "^5.0.1", 692 | "functional-red-black-tree": "^1.0.1", 693 | "glob-parent": "^5.0.0", 694 | "globals": "^12.1.0", 695 | "ignore": "^4.0.6", 696 | "import-fresh": "^3.0.0", 697 | "imurmurhash": "^0.1.4", 698 | "is-glob": "^4.0.0", 699 | "js-yaml": "^3.13.1", 700 | "json-stable-stringify-without-jsonify": "^1.0.1", 701 | "levn": "^0.4.1", 702 | "lodash": "^4.17.19", 703 | "minimatch": "^3.0.4", 704 | "natural-compare": "^1.4.0", 705 | "optionator": "^0.9.1", 706 | "progress": "^2.0.0", 707 | "regexpp": "^3.1.0", 708 | "semver": "^7.2.1", 709 | "strip-ansi": "^6.0.0", 710 | "strip-json-comments": "^3.1.0", 711 | "table": "^5.2.3", 712 | "text-table": "^0.2.0", 713 | "v8-compile-cache": "^2.0.3" 714 | }, 715 | "dependencies": { 716 | "cross-spawn": { 717 | "version": "7.0.3", 718 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 719 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 720 | "dev": true, 721 | "requires": { 722 | "path-key": "^3.1.0", 723 | "shebang-command": "^2.0.0", 724 | "which": "^2.0.1" 725 | } 726 | }, 727 | "path-key": { 728 | "version": "3.1.1", 729 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 730 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 731 | "dev": true 732 | }, 733 | "semver": { 734 | "version": "7.3.4", 735 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", 736 | "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", 737 | "dev": true, 738 | "requires": { 739 | "lru-cache": "^6.0.0" 740 | } 741 | }, 742 | "shebang-command": { 743 | "version": "2.0.0", 744 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 745 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 746 | "dev": true, 747 | "requires": { 748 | "shebang-regex": "^3.0.0" 749 | } 750 | }, 751 | "shebang-regex": { 752 | "version": "3.0.0", 753 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 754 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 755 | "dev": true 756 | }, 757 | "which": { 758 | "version": "2.0.2", 759 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 760 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 761 | "dev": true, 762 | "requires": { 763 | "isexe": "^2.0.0" 764 | } 765 | } 766 | } 767 | }, 768 | "eslint-config-standard": { 769 | "version": "16.0.2", 770 | "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.2.tgz", 771 | "integrity": "sha512-fx3f1rJDsl9bY7qzyX8SAtP8GBSk6MfXFaTfaGgk12aAYW4gJSyRm7dM790L6cbXv63fvjY4XeSzXnb4WM+SKw==", 772 | "dev": true 773 | }, 774 | "eslint-config-standard-jsx": { 775 | "version": "10.0.0", 776 | "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-10.0.0.tgz", 777 | "integrity": "sha512-hLeA2f5e06W1xyr/93/QJulN/rLbUVUmqTlexv9PRKHFwEC9ffJcH2LvJhMoEqYQBEYafedgGZXH2W8NUpt5lA==", 778 | "dev": true 779 | }, 780 | "eslint-import-resolver-node": { 781 | "version": "0.3.4", 782 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", 783 | "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", 784 | "dev": true, 785 | "requires": { 786 | "debug": "^2.6.9", 787 | "resolve": "^1.13.1" 788 | }, 789 | "dependencies": { 790 | "debug": { 791 | "version": "2.6.9", 792 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 793 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 794 | "dev": true, 795 | "requires": { 796 | "ms": "2.0.0" 797 | } 798 | }, 799 | "ms": { 800 | "version": "2.0.0", 801 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 802 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 803 | "dev": true 804 | } 805 | } 806 | }, 807 | "eslint-module-utils": { 808 | "version": "2.6.0", 809 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", 810 | "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", 811 | "dev": true, 812 | "requires": { 813 | "debug": "^2.6.9", 814 | "pkg-dir": "^2.0.0" 815 | }, 816 | "dependencies": { 817 | "debug": { 818 | "version": "2.6.9", 819 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 820 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 821 | "dev": true, 822 | "requires": { 823 | "ms": "2.0.0" 824 | } 825 | }, 826 | "ms": { 827 | "version": "2.0.0", 828 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 829 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 830 | "dev": true 831 | } 832 | } 833 | }, 834 | "eslint-plugin-es": { 835 | "version": "3.0.1", 836 | "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", 837 | "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", 838 | "dev": true, 839 | "requires": { 840 | "eslint-utils": "^2.0.0", 841 | "regexpp": "^3.0.0" 842 | } 843 | }, 844 | "eslint-plugin-import": { 845 | "version": "2.22.1", 846 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", 847 | "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", 848 | "dev": true, 849 | "requires": { 850 | "array-includes": "^3.1.1", 851 | "array.prototype.flat": "^1.2.3", 852 | "contains-path": "^0.1.0", 853 | "debug": "^2.6.9", 854 | "doctrine": "1.5.0", 855 | "eslint-import-resolver-node": "^0.3.4", 856 | "eslint-module-utils": "^2.6.0", 857 | "has": "^1.0.3", 858 | "minimatch": "^3.0.4", 859 | "object.values": "^1.1.1", 860 | "read-pkg-up": "^2.0.0", 861 | "resolve": "^1.17.0", 862 | "tsconfig-paths": "^3.9.0" 863 | }, 864 | "dependencies": { 865 | "debug": { 866 | "version": "2.6.9", 867 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 868 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 869 | "dev": true, 870 | "requires": { 871 | "ms": "2.0.0" 872 | } 873 | }, 874 | "doctrine": { 875 | "version": "1.5.0", 876 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 877 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 878 | "dev": true, 879 | "requires": { 880 | "esutils": "^2.0.2", 881 | "isarray": "^1.0.0" 882 | } 883 | }, 884 | "ms": { 885 | "version": "2.0.0", 886 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 887 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 888 | "dev": true 889 | } 890 | } 891 | }, 892 | "eslint-plugin-node": { 893 | "version": "11.1.0", 894 | "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", 895 | "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", 896 | "dev": true, 897 | "requires": { 898 | "eslint-plugin-es": "^3.0.0", 899 | "eslint-utils": "^2.0.0", 900 | "ignore": "^5.1.1", 901 | "minimatch": "^3.0.4", 902 | "resolve": "^1.10.1", 903 | "semver": "^6.1.0" 904 | }, 905 | "dependencies": { 906 | "ignore": { 907 | "version": "5.1.8", 908 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", 909 | "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", 910 | "dev": true 911 | }, 912 | "semver": { 913 | "version": "6.3.0", 914 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 915 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 916 | "dev": true 917 | } 918 | } 919 | }, 920 | "eslint-plugin-promise": { 921 | "version": "4.2.1", 922 | "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", 923 | "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", 924 | "dev": true 925 | }, 926 | "eslint-plugin-react": { 927 | "version": "7.21.5", 928 | "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.21.5.tgz", 929 | "integrity": "sha512-8MaEggC2et0wSF6bUeywF7qQ46ER81irOdWS4QWxnnlAEsnzeBevk1sWh7fhpCghPpXb+8Ks7hvaft6L/xsR6g==", 930 | "dev": true, 931 | "requires": { 932 | "array-includes": "^3.1.1", 933 | "array.prototype.flatmap": "^1.2.3", 934 | "doctrine": "^2.1.0", 935 | "has": "^1.0.3", 936 | "jsx-ast-utils": "^2.4.1 || ^3.0.0", 937 | "object.entries": "^1.1.2", 938 | "object.fromentries": "^2.0.2", 939 | "object.values": "^1.1.1", 940 | "prop-types": "^15.7.2", 941 | "resolve": "^1.18.1", 942 | "string.prototype.matchall": "^4.0.2" 943 | }, 944 | "dependencies": { 945 | "doctrine": { 946 | "version": "2.1.0", 947 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 948 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 949 | "dev": true, 950 | "requires": { 951 | "esutils": "^2.0.2" 952 | } 953 | } 954 | } 955 | }, 956 | "eslint-scope": { 957 | "version": "5.1.1", 958 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 959 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 960 | "dev": true, 961 | "requires": { 962 | "esrecurse": "^4.3.0", 963 | "estraverse": "^4.1.1" 964 | } 965 | }, 966 | "eslint-utils": { 967 | "version": "2.1.0", 968 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", 969 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", 970 | "dev": true, 971 | "requires": { 972 | "eslint-visitor-keys": "^1.1.0" 973 | }, 974 | "dependencies": { 975 | "eslint-visitor-keys": { 976 | "version": "1.3.0", 977 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 978 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 979 | "dev": true 980 | } 981 | } 982 | }, 983 | "eslint-visitor-keys": { 984 | "version": "2.0.0", 985 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", 986 | "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", 987 | "dev": true 988 | }, 989 | "espree": { 990 | "version": "7.3.1", 991 | "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", 992 | "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", 993 | "dev": true, 994 | "requires": { 995 | "acorn": "^7.4.0", 996 | "acorn-jsx": "^5.3.1", 997 | "eslint-visitor-keys": "^1.3.0" 998 | }, 999 | "dependencies": { 1000 | "eslint-visitor-keys": { 1001 | "version": "1.3.0", 1002 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 1003 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 1004 | "dev": true 1005 | } 1006 | } 1007 | }, 1008 | "esprima": { 1009 | "version": "4.0.1", 1010 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1011 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1012 | "dev": true 1013 | }, 1014 | "esquery": { 1015 | "version": "1.3.1", 1016 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", 1017 | "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", 1018 | "dev": true, 1019 | "requires": { 1020 | "estraverse": "^5.1.0" 1021 | }, 1022 | "dependencies": { 1023 | "estraverse": { 1024 | "version": "5.2.0", 1025 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 1026 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 1027 | "dev": true 1028 | } 1029 | } 1030 | }, 1031 | "esrecurse": { 1032 | "version": "4.3.0", 1033 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1034 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1035 | "dev": true, 1036 | "requires": { 1037 | "estraverse": "^5.2.0" 1038 | }, 1039 | "dependencies": { 1040 | "estraverse": { 1041 | "version": "5.2.0", 1042 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 1043 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 1044 | "dev": true 1045 | } 1046 | } 1047 | }, 1048 | "estraverse": { 1049 | "version": "4.3.0", 1050 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 1051 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 1052 | "dev": true 1053 | }, 1054 | "esutils": { 1055 | "version": "2.0.3", 1056 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1057 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1058 | "dev": true 1059 | }, 1060 | "execa": { 1061 | "version": "1.0.0", 1062 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 1063 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 1064 | "requires": { 1065 | "cross-spawn": "^6.0.0", 1066 | "get-stream": "^4.0.0", 1067 | "is-stream": "^1.1.0", 1068 | "npm-run-path": "^2.0.0", 1069 | "p-finally": "^1.0.0", 1070 | "signal-exit": "^3.0.0", 1071 | "strip-eof": "^1.0.0" 1072 | } 1073 | }, 1074 | "fast-deep-equal": { 1075 | "version": "3.1.3", 1076 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1077 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1078 | "dev": true 1079 | }, 1080 | "fast-json-stable-stringify": { 1081 | "version": "2.1.0", 1082 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1083 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1084 | "dev": true 1085 | }, 1086 | "fast-levenshtein": { 1087 | "version": "2.0.6", 1088 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1089 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 1090 | "dev": true 1091 | }, 1092 | "file-entry-cache": { 1093 | "version": "5.0.1", 1094 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 1095 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 1096 | "dev": true, 1097 | "requires": { 1098 | "flat-cache": "^2.0.1" 1099 | } 1100 | }, 1101 | "find-up": { 1102 | "version": "2.1.0", 1103 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 1104 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 1105 | "dev": true, 1106 | "requires": { 1107 | "locate-path": "^2.0.0" 1108 | } 1109 | }, 1110 | "flat-cache": { 1111 | "version": "2.0.1", 1112 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 1113 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 1114 | "dev": true, 1115 | "requires": { 1116 | "flatted": "^2.0.0", 1117 | "rimraf": "2.6.3", 1118 | "write": "1.0.3" 1119 | } 1120 | }, 1121 | "flatted": { 1122 | "version": "2.0.2", 1123 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", 1124 | "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", 1125 | "dev": true 1126 | }, 1127 | "fs.realpath": { 1128 | "version": "1.0.0", 1129 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1130 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1131 | "dev": true 1132 | }, 1133 | "function-bind": { 1134 | "version": "1.1.1", 1135 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1136 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1137 | "dev": true 1138 | }, 1139 | "functional-red-black-tree": { 1140 | "version": "1.0.1", 1141 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1142 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 1143 | "dev": true 1144 | }, 1145 | "get-intrinsic": { 1146 | "version": "1.0.1", 1147 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", 1148 | "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", 1149 | "dev": true, 1150 | "requires": { 1151 | "function-bind": "^1.1.1", 1152 | "has": "^1.0.3", 1153 | "has-symbols": "^1.0.1" 1154 | } 1155 | }, 1156 | "get-stdin": { 1157 | "version": "8.0.0", 1158 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", 1159 | "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", 1160 | "dev": true 1161 | }, 1162 | "get-stream": { 1163 | "version": "4.1.0", 1164 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 1165 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 1166 | "requires": { 1167 | "pump": "^3.0.0" 1168 | } 1169 | }, 1170 | "glob": { 1171 | "version": "7.1.6", 1172 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 1173 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 1174 | "dev": true, 1175 | "requires": { 1176 | "fs.realpath": "^1.0.0", 1177 | "inflight": "^1.0.4", 1178 | "inherits": "2", 1179 | "minimatch": "^3.0.4", 1180 | "once": "^1.3.0", 1181 | "path-is-absolute": "^1.0.0" 1182 | } 1183 | }, 1184 | "glob-parent": { 1185 | "version": "5.1.2", 1186 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1187 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1188 | "dev": true, 1189 | "requires": { 1190 | "is-glob": "^4.0.1" 1191 | } 1192 | }, 1193 | "globals": { 1194 | "version": "12.4.0", 1195 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", 1196 | "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", 1197 | "dev": true, 1198 | "requires": { 1199 | "type-fest": "^0.8.1" 1200 | } 1201 | }, 1202 | "graceful-fs": { 1203 | "version": "4.2.4", 1204 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 1205 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", 1206 | "dev": true 1207 | }, 1208 | "has": { 1209 | "version": "1.0.3", 1210 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1211 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1212 | "dev": true, 1213 | "requires": { 1214 | "function-bind": "^1.1.1" 1215 | } 1216 | }, 1217 | "has-flag": { 1218 | "version": "3.0.0", 1219 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1220 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1221 | "dev": true 1222 | }, 1223 | "has-symbols": { 1224 | "version": "1.0.1", 1225 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 1226 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 1227 | "dev": true 1228 | }, 1229 | "hosted-git-info": { 1230 | "version": "2.8.9", 1231 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", 1232 | "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", 1233 | "dev": true 1234 | }, 1235 | "ignore": { 1236 | "version": "4.0.6", 1237 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 1238 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 1239 | "dev": true 1240 | }, 1241 | "import-fresh": { 1242 | "version": "3.2.2", 1243 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", 1244 | "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", 1245 | "dev": true, 1246 | "requires": { 1247 | "parent-module": "^1.0.0", 1248 | "resolve-from": "^4.0.0" 1249 | } 1250 | }, 1251 | "imurmurhash": { 1252 | "version": "0.1.4", 1253 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1254 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1255 | "dev": true 1256 | }, 1257 | "inflight": { 1258 | "version": "1.0.6", 1259 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1260 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1261 | "dev": true, 1262 | "requires": { 1263 | "once": "^1.3.0", 1264 | "wrappy": "1" 1265 | } 1266 | }, 1267 | "inherits": { 1268 | "version": "2.0.4", 1269 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1270 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1271 | "dev": true 1272 | }, 1273 | "internal-slot": { 1274 | "version": "1.0.2", 1275 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", 1276 | "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", 1277 | "dev": true, 1278 | "requires": { 1279 | "es-abstract": "^1.17.0-next.1", 1280 | "has": "^1.0.3", 1281 | "side-channel": "^1.0.2" 1282 | }, 1283 | "dependencies": { 1284 | "es-abstract": { 1285 | "version": "1.17.7", 1286 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", 1287 | "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", 1288 | "dev": true, 1289 | "requires": { 1290 | "es-to-primitive": "^1.2.1", 1291 | "function-bind": "^1.1.1", 1292 | "has": "^1.0.3", 1293 | "has-symbols": "^1.0.1", 1294 | "is-callable": "^1.2.2", 1295 | "is-regex": "^1.1.1", 1296 | "object-inspect": "^1.8.0", 1297 | "object-keys": "^1.1.1", 1298 | "object.assign": "^4.1.1", 1299 | "string.prototype.trimend": "^1.0.1", 1300 | "string.prototype.trimstart": "^1.0.1" 1301 | } 1302 | } 1303 | } 1304 | }, 1305 | "is-arrayish": { 1306 | "version": "0.2.1", 1307 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1308 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1309 | "dev": true 1310 | }, 1311 | "is-callable": { 1312 | "version": "1.2.2", 1313 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", 1314 | "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", 1315 | "dev": true 1316 | }, 1317 | "is-core-module": { 1318 | "version": "2.2.0", 1319 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", 1320 | "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", 1321 | "dev": true, 1322 | "requires": { 1323 | "has": "^1.0.3" 1324 | } 1325 | }, 1326 | "is-date-object": { 1327 | "version": "1.0.2", 1328 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 1329 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 1330 | "dev": true 1331 | }, 1332 | "is-extglob": { 1333 | "version": "2.1.1", 1334 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1335 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1336 | "dev": true 1337 | }, 1338 | "is-fullwidth-code-point": { 1339 | "version": "2.0.0", 1340 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1341 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1342 | "dev": true 1343 | }, 1344 | "is-glob": { 1345 | "version": "4.0.1", 1346 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1347 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1348 | "dev": true, 1349 | "requires": { 1350 | "is-extglob": "^2.1.1" 1351 | } 1352 | }, 1353 | "is-negative-zero": { 1354 | "version": "2.0.1", 1355 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", 1356 | "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", 1357 | "dev": true 1358 | }, 1359 | "is-plain-object": { 1360 | "version": "3.0.0", 1361 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", 1362 | "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", 1363 | "requires": { 1364 | "isobject": "^4.0.0" 1365 | } 1366 | }, 1367 | "is-regex": { 1368 | "version": "1.1.1", 1369 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", 1370 | "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", 1371 | "dev": true, 1372 | "requires": { 1373 | "has-symbols": "^1.0.1" 1374 | } 1375 | }, 1376 | "is-stream": { 1377 | "version": "1.1.0", 1378 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1379 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 1380 | }, 1381 | "is-string": { 1382 | "version": "1.0.5", 1383 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", 1384 | "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", 1385 | "dev": true 1386 | }, 1387 | "is-symbol": { 1388 | "version": "1.0.3", 1389 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 1390 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 1391 | "dev": true, 1392 | "requires": { 1393 | "has-symbols": "^1.0.1" 1394 | } 1395 | }, 1396 | "isarray": { 1397 | "version": "1.0.0", 1398 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1399 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1400 | "dev": true 1401 | }, 1402 | "isexe": { 1403 | "version": "2.0.0", 1404 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1405 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 1406 | }, 1407 | "isobject": { 1408 | "version": "4.0.0", 1409 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", 1410 | "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==" 1411 | }, 1412 | "js-tokens": { 1413 | "version": "4.0.0", 1414 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1415 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1416 | "dev": true 1417 | }, 1418 | "js-yaml": { 1419 | "version": "3.14.1", 1420 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 1421 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 1422 | "dev": true, 1423 | "requires": { 1424 | "argparse": "^1.0.7", 1425 | "esprima": "^4.0.0" 1426 | } 1427 | }, 1428 | "json-hash": { 1429 | "version": "1.2.0", 1430 | "resolved": "https://registry.npmjs.org/json-hash/-/json-hash-1.2.0.tgz", 1431 | "integrity": "sha1-s+cXywd2Atp19IF9OjzESTl/mxA=" 1432 | }, 1433 | "json-parse-better-errors": { 1434 | "version": "1.0.2", 1435 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 1436 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 1437 | "dev": true 1438 | }, 1439 | "json-schema-traverse": { 1440 | "version": "0.4.1", 1441 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1442 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1443 | "dev": true 1444 | }, 1445 | "json-stable-stringify-without-jsonify": { 1446 | "version": "1.0.1", 1447 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1448 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1449 | "dev": true 1450 | }, 1451 | "json5": { 1452 | "version": "1.0.1", 1453 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", 1454 | "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", 1455 | "dev": true, 1456 | "requires": { 1457 | "minimist": "^1.2.0" 1458 | } 1459 | }, 1460 | "jsx-ast-utils": { 1461 | "version": "3.1.0", 1462 | "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz", 1463 | "integrity": "sha512-d4/UOjg+mxAWxCiF0c5UTSwyqbchkbqCvK87aBovhnh8GtysTjWmgC63tY0cJx/HzGgm9qnA147jVBdpOiQ2RA==", 1464 | "dev": true, 1465 | "requires": { 1466 | "array-includes": "^3.1.1", 1467 | "object.assign": "^4.1.1" 1468 | } 1469 | }, 1470 | "levn": { 1471 | "version": "0.4.1", 1472 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1473 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1474 | "dev": true, 1475 | "requires": { 1476 | "prelude-ls": "^1.2.1", 1477 | "type-check": "~0.4.0" 1478 | } 1479 | }, 1480 | "load-json-file": { 1481 | "version": "2.0.0", 1482 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", 1483 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", 1484 | "dev": true, 1485 | "requires": { 1486 | "graceful-fs": "^4.1.2", 1487 | "parse-json": "^2.2.0", 1488 | "pify": "^2.0.0", 1489 | "strip-bom": "^3.0.0" 1490 | } 1491 | }, 1492 | "locate-path": { 1493 | "version": "2.0.0", 1494 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 1495 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 1496 | "dev": true, 1497 | "requires": { 1498 | "p-locate": "^2.0.0", 1499 | "path-exists": "^3.0.0" 1500 | } 1501 | }, 1502 | "lodash": { 1503 | "version": "4.17.21", 1504 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1505 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1506 | "dev": true 1507 | }, 1508 | "loose-envify": { 1509 | "version": "1.4.0", 1510 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1511 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1512 | "dev": true, 1513 | "requires": { 1514 | "js-tokens": "^3.0.0 || ^4.0.0" 1515 | } 1516 | }, 1517 | "lru-cache": { 1518 | "version": "6.0.0", 1519 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1520 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1521 | "dev": true, 1522 | "requires": { 1523 | "yallist": "^4.0.0" 1524 | } 1525 | }, 1526 | "macos-release": { 1527 | "version": "2.3.0", 1528 | "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.3.0.tgz", 1529 | "integrity": "sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==" 1530 | }, 1531 | "minimatch": { 1532 | "version": "3.0.4", 1533 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1534 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1535 | "dev": true, 1536 | "requires": { 1537 | "brace-expansion": "^1.1.7" 1538 | } 1539 | }, 1540 | "minimist": { 1541 | "version": "1.2.5", 1542 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1543 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1544 | "dev": true 1545 | }, 1546 | "mkdirp": { 1547 | "version": "0.5.5", 1548 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 1549 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 1550 | "dev": true, 1551 | "requires": { 1552 | "minimist": "^1.2.5" 1553 | } 1554 | }, 1555 | "ms": { 1556 | "version": "2.1.2", 1557 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1558 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1559 | "dev": true 1560 | }, 1561 | "natural-compare": { 1562 | "version": "1.4.0", 1563 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1564 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1565 | "dev": true 1566 | }, 1567 | "nice-try": { 1568 | "version": "1.0.5", 1569 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1570 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" 1571 | }, 1572 | "node-fetch": { 1573 | "version": "2.6.1", 1574 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 1575 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 1576 | }, 1577 | "normalize-package-data": { 1578 | "version": "2.5.0", 1579 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 1580 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 1581 | "dev": true, 1582 | "requires": { 1583 | "hosted-git-info": "^2.1.4", 1584 | "resolve": "^1.10.0", 1585 | "semver": "2 || 3 || 4 || 5", 1586 | "validate-npm-package-license": "^3.0.1" 1587 | } 1588 | }, 1589 | "npm-run-path": { 1590 | "version": "2.0.2", 1591 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1592 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 1593 | "requires": { 1594 | "path-key": "^2.0.0" 1595 | } 1596 | }, 1597 | "object-assign": { 1598 | "version": "4.1.1", 1599 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1600 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1601 | "dev": true 1602 | }, 1603 | "object-inspect": { 1604 | "version": "1.9.0", 1605 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", 1606 | "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", 1607 | "dev": true 1608 | }, 1609 | "object-keys": { 1610 | "version": "1.1.1", 1611 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1612 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1613 | "dev": true 1614 | }, 1615 | "object.assign": { 1616 | "version": "4.1.2", 1617 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", 1618 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", 1619 | "dev": true, 1620 | "requires": { 1621 | "call-bind": "^1.0.0", 1622 | "define-properties": "^1.1.3", 1623 | "has-symbols": "^1.0.1", 1624 | "object-keys": "^1.1.1" 1625 | } 1626 | }, 1627 | "object.entries": { 1628 | "version": "1.1.3", 1629 | "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", 1630 | "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", 1631 | "dev": true, 1632 | "requires": { 1633 | "call-bind": "^1.0.0", 1634 | "define-properties": "^1.1.3", 1635 | "es-abstract": "^1.18.0-next.1", 1636 | "has": "^1.0.3" 1637 | } 1638 | }, 1639 | "object.fromentries": { 1640 | "version": "2.0.3", 1641 | "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.3.tgz", 1642 | "integrity": "sha512-IDUSMXs6LOSJBWE++L0lzIbSqHl9KDCfff2x/JSEIDtEUavUnyMYC2ZGay/04Zq4UT8lvd4xNhU4/YHKibAOlw==", 1643 | "dev": true, 1644 | "requires": { 1645 | "call-bind": "^1.0.0", 1646 | "define-properties": "^1.1.3", 1647 | "es-abstract": "^1.18.0-next.1", 1648 | "has": "^1.0.3" 1649 | } 1650 | }, 1651 | "object.values": { 1652 | "version": "1.1.2", 1653 | "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", 1654 | "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", 1655 | "dev": true, 1656 | "requires": { 1657 | "call-bind": "^1.0.0", 1658 | "define-properties": "^1.1.3", 1659 | "es-abstract": "^1.18.0-next.1", 1660 | "has": "^1.0.3" 1661 | } 1662 | }, 1663 | "once": { 1664 | "version": "1.4.0", 1665 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1666 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1667 | "requires": { 1668 | "wrappy": "1" 1669 | } 1670 | }, 1671 | "optionator": { 1672 | "version": "0.9.1", 1673 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 1674 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 1675 | "dev": true, 1676 | "requires": { 1677 | "deep-is": "^0.1.3", 1678 | "fast-levenshtein": "^2.0.6", 1679 | "levn": "^0.4.1", 1680 | "prelude-ls": "^1.2.1", 1681 | "type-check": "^0.4.0", 1682 | "word-wrap": "^1.2.3" 1683 | } 1684 | }, 1685 | "os-name": { 1686 | "version": "3.1.0", 1687 | "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", 1688 | "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", 1689 | "requires": { 1690 | "macos-release": "^2.2.0", 1691 | "windows-release": "^3.1.0" 1692 | } 1693 | }, 1694 | "p-finally": { 1695 | "version": "1.0.0", 1696 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1697 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 1698 | }, 1699 | "p-limit": { 1700 | "version": "1.3.0", 1701 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 1702 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 1703 | "dev": true, 1704 | "requires": { 1705 | "p-try": "^1.0.0" 1706 | } 1707 | }, 1708 | "p-locate": { 1709 | "version": "2.0.0", 1710 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1711 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1712 | "dev": true, 1713 | "requires": { 1714 | "p-limit": "^1.1.0" 1715 | } 1716 | }, 1717 | "p-try": { 1718 | "version": "1.0.0", 1719 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 1720 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", 1721 | "dev": true 1722 | }, 1723 | "parent-module": { 1724 | "version": "1.0.1", 1725 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1726 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1727 | "dev": true, 1728 | "requires": { 1729 | "callsites": "^3.0.0" 1730 | } 1731 | }, 1732 | "parse-json": { 1733 | "version": "2.2.0", 1734 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1735 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1736 | "dev": true, 1737 | "requires": { 1738 | "error-ex": "^1.2.0" 1739 | } 1740 | }, 1741 | "path-exists": { 1742 | "version": "3.0.0", 1743 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1744 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1745 | "dev": true 1746 | }, 1747 | "path-is-absolute": { 1748 | "version": "1.0.1", 1749 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1750 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1751 | "dev": true 1752 | }, 1753 | "path-key": { 1754 | "version": "2.0.1", 1755 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1756 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 1757 | }, 1758 | "path-parse": { 1759 | "version": "1.0.6", 1760 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1761 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 1762 | "dev": true 1763 | }, 1764 | "path-type": { 1765 | "version": "2.0.0", 1766 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", 1767 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", 1768 | "dev": true, 1769 | "requires": { 1770 | "pify": "^2.0.0" 1771 | } 1772 | }, 1773 | "pify": { 1774 | "version": "2.3.0", 1775 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1776 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1777 | "dev": true 1778 | }, 1779 | "pkg-conf": { 1780 | "version": "3.1.0", 1781 | "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", 1782 | "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", 1783 | "dev": true, 1784 | "requires": { 1785 | "find-up": "^3.0.0", 1786 | "load-json-file": "^5.2.0" 1787 | }, 1788 | "dependencies": { 1789 | "find-up": { 1790 | "version": "3.0.0", 1791 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 1792 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 1793 | "dev": true, 1794 | "requires": { 1795 | "locate-path": "^3.0.0" 1796 | } 1797 | }, 1798 | "load-json-file": { 1799 | "version": "5.3.0", 1800 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", 1801 | "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", 1802 | "dev": true, 1803 | "requires": { 1804 | "graceful-fs": "^4.1.15", 1805 | "parse-json": "^4.0.0", 1806 | "pify": "^4.0.1", 1807 | "strip-bom": "^3.0.0", 1808 | "type-fest": "^0.3.0" 1809 | } 1810 | }, 1811 | "locate-path": { 1812 | "version": "3.0.0", 1813 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 1814 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 1815 | "dev": true, 1816 | "requires": { 1817 | "p-locate": "^3.0.0", 1818 | "path-exists": "^3.0.0" 1819 | } 1820 | }, 1821 | "p-limit": { 1822 | "version": "2.3.0", 1823 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 1824 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 1825 | "dev": true, 1826 | "requires": { 1827 | "p-try": "^2.0.0" 1828 | } 1829 | }, 1830 | "p-locate": { 1831 | "version": "3.0.0", 1832 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1833 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1834 | "dev": true, 1835 | "requires": { 1836 | "p-limit": "^2.0.0" 1837 | } 1838 | }, 1839 | "p-try": { 1840 | "version": "2.2.0", 1841 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1842 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 1843 | "dev": true 1844 | }, 1845 | "parse-json": { 1846 | "version": "4.0.0", 1847 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 1848 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 1849 | "dev": true, 1850 | "requires": { 1851 | "error-ex": "^1.3.1", 1852 | "json-parse-better-errors": "^1.0.1" 1853 | } 1854 | }, 1855 | "pify": { 1856 | "version": "4.0.1", 1857 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 1858 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", 1859 | "dev": true 1860 | }, 1861 | "type-fest": { 1862 | "version": "0.3.1", 1863 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", 1864 | "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", 1865 | "dev": true 1866 | } 1867 | } 1868 | }, 1869 | "pkg-dir": { 1870 | "version": "2.0.0", 1871 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", 1872 | "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", 1873 | "dev": true, 1874 | "requires": { 1875 | "find-up": "^2.1.0" 1876 | } 1877 | }, 1878 | "prelude-ls": { 1879 | "version": "1.2.1", 1880 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1881 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1882 | "dev": true 1883 | }, 1884 | "progress": { 1885 | "version": "2.0.3", 1886 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1887 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1888 | "dev": true 1889 | }, 1890 | "prop-types": { 1891 | "version": "15.7.2", 1892 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", 1893 | "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", 1894 | "dev": true, 1895 | "requires": { 1896 | "loose-envify": "^1.4.0", 1897 | "object-assign": "^4.1.1", 1898 | "react-is": "^16.8.1" 1899 | } 1900 | }, 1901 | "pump": { 1902 | "version": "3.0.0", 1903 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1904 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1905 | "requires": { 1906 | "end-of-stream": "^1.1.0", 1907 | "once": "^1.3.1" 1908 | } 1909 | }, 1910 | "punycode": { 1911 | "version": "2.1.1", 1912 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1913 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1914 | "dev": true 1915 | }, 1916 | "react-is": { 1917 | "version": "16.13.1", 1918 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 1919 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", 1920 | "dev": true 1921 | }, 1922 | "read-pkg": { 1923 | "version": "2.0.0", 1924 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", 1925 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", 1926 | "dev": true, 1927 | "requires": { 1928 | "load-json-file": "^2.0.0", 1929 | "normalize-package-data": "^2.3.2", 1930 | "path-type": "^2.0.0" 1931 | } 1932 | }, 1933 | "read-pkg-up": { 1934 | "version": "2.0.0", 1935 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", 1936 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", 1937 | "dev": true, 1938 | "requires": { 1939 | "find-up": "^2.0.0", 1940 | "read-pkg": "^2.0.0" 1941 | } 1942 | }, 1943 | "regenerator-runtime": { 1944 | "version": "0.13.5", 1945 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", 1946 | "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" 1947 | }, 1948 | "regexp.prototype.flags": { 1949 | "version": "1.3.0", 1950 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", 1951 | "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", 1952 | "dev": true, 1953 | "requires": { 1954 | "define-properties": "^1.1.3", 1955 | "es-abstract": "^1.17.0-next.1" 1956 | }, 1957 | "dependencies": { 1958 | "es-abstract": { 1959 | "version": "1.17.7", 1960 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", 1961 | "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", 1962 | "dev": true, 1963 | "requires": { 1964 | "es-to-primitive": "^1.2.1", 1965 | "function-bind": "^1.1.1", 1966 | "has": "^1.0.3", 1967 | "has-symbols": "^1.0.1", 1968 | "is-callable": "^1.2.2", 1969 | "is-regex": "^1.1.1", 1970 | "object-inspect": "^1.8.0", 1971 | "object-keys": "^1.1.1", 1972 | "object.assign": "^4.1.1", 1973 | "string.prototype.trimend": "^1.0.1", 1974 | "string.prototype.trimstart": "^1.0.1" 1975 | } 1976 | } 1977 | } 1978 | }, 1979 | "regexpp": { 1980 | "version": "3.1.0", 1981 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", 1982 | "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", 1983 | "dev": true 1984 | }, 1985 | "resolve": { 1986 | "version": "1.19.0", 1987 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", 1988 | "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", 1989 | "dev": true, 1990 | "requires": { 1991 | "is-core-module": "^2.1.0", 1992 | "path-parse": "^1.0.6" 1993 | } 1994 | }, 1995 | "resolve-from": { 1996 | "version": "4.0.0", 1997 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1998 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1999 | "dev": true 2000 | }, 2001 | "rimraf": { 2002 | "version": "2.6.3", 2003 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 2004 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 2005 | "dev": true, 2006 | "requires": { 2007 | "glob": "^7.1.3" 2008 | } 2009 | }, 2010 | "semver": { 2011 | "version": "5.7.1", 2012 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 2013 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 2014 | }, 2015 | "shebang-command": { 2016 | "version": "1.2.0", 2017 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 2018 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 2019 | "requires": { 2020 | "shebang-regex": "^1.0.0" 2021 | } 2022 | }, 2023 | "shebang-regex": { 2024 | "version": "1.0.0", 2025 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 2026 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 2027 | }, 2028 | "side-channel": { 2029 | "version": "1.0.3", 2030 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz", 2031 | "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==", 2032 | "dev": true, 2033 | "requires": { 2034 | "es-abstract": "^1.18.0-next.0", 2035 | "object-inspect": "^1.8.0" 2036 | } 2037 | }, 2038 | "signal-exit": { 2039 | "version": "3.0.3", 2040 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 2041 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 2042 | }, 2043 | "slice-ansi": { 2044 | "version": "2.1.0", 2045 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 2046 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 2047 | "dev": true, 2048 | "requires": { 2049 | "ansi-styles": "^3.2.0", 2050 | "astral-regex": "^1.0.0", 2051 | "is-fullwidth-code-point": "^2.0.0" 2052 | } 2053 | }, 2054 | "spdx-correct": { 2055 | "version": "3.1.1", 2056 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", 2057 | "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", 2058 | "dev": true, 2059 | "requires": { 2060 | "spdx-expression-parse": "^3.0.0", 2061 | "spdx-license-ids": "^3.0.0" 2062 | } 2063 | }, 2064 | "spdx-exceptions": { 2065 | "version": "2.3.0", 2066 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", 2067 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", 2068 | "dev": true 2069 | }, 2070 | "spdx-expression-parse": { 2071 | "version": "3.0.1", 2072 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 2073 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 2074 | "dev": true, 2075 | "requires": { 2076 | "spdx-exceptions": "^2.1.0", 2077 | "spdx-license-ids": "^3.0.0" 2078 | } 2079 | }, 2080 | "spdx-license-ids": { 2081 | "version": "3.0.7", 2082 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", 2083 | "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", 2084 | "dev": true 2085 | }, 2086 | "sprintf-js": { 2087 | "version": "1.0.3", 2088 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2089 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2090 | "dev": true 2091 | }, 2092 | "standard": { 2093 | "version": "16.0.3", 2094 | "resolved": "https://registry.npmjs.org/standard/-/standard-16.0.3.tgz", 2095 | "integrity": "sha512-70F7NH0hSkNXosXRltjSv6KpTAOkUkSfyu3ynyM5dtRUiLtR+yX9EGZ7RKwuGUqCJiX/cnkceVM6HTZ4JpaqDg==", 2096 | "dev": true, 2097 | "requires": { 2098 | "eslint": "~7.13.0", 2099 | "eslint-config-standard": "16.0.2", 2100 | "eslint-config-standard-jsx": "10.0.0", 2101 | "eslint-plugin-import": "~2.22.1", 2102 | "eslint-plugin-node": "~11.1.0", 2103 | "eslint-plugin-promise": "~4.2.1", 2104 | "eslint-plugin-react": "~7.21.5", 2105 | "standard-engine": "^14.0.1" 2106 | } 2107 | }, 2108 | "standard-engine": { 2109 | "version": "14.0.1", 2110 | "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-14.0.1.tgz", 2111 | "integrity": "sha512-7FEzDwmHDOGva7r9ifOzD3BGdTbA7ujJ50afLVdW/tK14zQEptJjbFuUfn50irqdHDcTbNh0DTIoMPynMCXb0Q==", 2112 | "dev": true, 2113 | "requires": { 2114 | "get-stdin": "^8.0.0", 2115 | "minimist": "^1.2.5", 2116 | "pkg-conf": "^3.1.0", 2117 | "xdg-basedir": "^4.0.0" 2118 | } 2119 | }, 2120 | "string-width": { 2121 | "version": "3.1.0", 2122 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 2123 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 2124 | "dev": true, 2125 | "requires": { 2126 | "emoji-regex": "^7.0.1", 2127 | "is-fullwidth-code-point": "^2.0.0", 2128 | "strip-ansi": "^5.1.0" 2129 | }, 2130 | "dependencies": { 2131 | "ansi-regex": { 2132 | "version": "4.1.0", 2133 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 2134 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 2135 | "dev": true 2136 | }, 2137 | "strip-ansi": { 2138 | "version": "5.2.0", 2139 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 2140 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 2141 | "dev": true, 2142 | "requires": { 2143 | "ansi-regex": "^4.1.0" 2144 | } 2145 | } 2146 | } 2147 | }, 2148 | "string.prototype.matchall": { 2149 | "version": "4.0.3", 2150 | "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.3.tgz", 2151 | "integrity": "sha512-OBxYDA2ifZQ2e13cP82dWFMaCV9CGF8GzmN4fljBVw5O5wep0lu4gacm1OL6MjROoUnB8VbkWRThqkV2YFLNxw==", 2152 | "dev": true, 2153 | "requires": { 2154 | "call-bind": "^1.0.0", 2155 | "define-properties": "^1.1.3", 2156 | "es-abstract": "^1.18.0-next.1", 2157 | "has-symbols": "^1.0.1", 2158 | "internal-slot": "^1.0.2", 2159 | "regexp.prototype.flags": "^1.3.0", 2160 | "side-channel": "^1.0.3" 2161 | } 2162 | }, 2163 | "string.prototype.trimend": { 2164 | "version": "1.0.3", 2165 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", 2166 | "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", 2167 | "dev": true, 2168 | "requires": { 2169 | "call-bind": "^1.0.0", 2170 | "define-properties": "^1.1.3" 2171 | } 2172 | }, 2173 | "string.prototype.trimstart": { 2174 | "version": "1.0.3", 2175 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", 2176 | "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", 2177 | "dev": true, 2178 | "requires": { 2179 | "call-bind": "^1.0.0", 2180 | "define-properties": "^1.1.3" 2181 | } 2182 | }, 2183 | "strip-ansi": { 2184 | "version": "6.0.0", 2185 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 2186 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 2187 | "dev": true, 2188 | "requires": { 2189 | "ansi-regex": "^5.0.0" 2190 | } 2191 | }, 2192 | "strip-bom": { 2193 | "version": "3.0.0", 2194 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 2195 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 2196 | "dev": true 2197 | }, 2198 | "strip-eof": { 2199 | "version": "1.0.0", 2200 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 2201 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" 2202 | }, 2203 | "strip-json-comments": { 2204 | "version": "3.1.1", 2205 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2206 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2207 | "dev": true 2208 | }, 2209 | "supports-color": { 2210 | "version": "5.5.0", 2211 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2212 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2213 | "dev": true, 2214 | "requires": { 2215 | "has-flag": "^3.0.0" 2216 | } 2217 | }, 2218 | "table": { 2219 | "version": "5.4.6", 2220 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 2221 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 2222 | "dev": true, 2223 | "requires": { 2224 | "ajv": "^6.10.2", 2225 | "lodash": "^4.17.14", 2226 | "slice-ansi": "^2.1.0", 2227 | "string-width": "^3.0.0" 2228 | } 2229 | }, 2230 | "text-table": { 2231 | "version": "0.2.0", 2232 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2233 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2234 | "dev": true 2235 | }, 2236 | "tsconfig-paths": { 2237 | "version": "3.9.0", 2238 | "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", 2239 | "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", 2240 | "dev": true, 2241 | "requires": { 2242 | "@types/json5": "^0.0.29", 2243 | "json5": "^1.0.1", 2244 | "minimist": "^1.2.0", 2245 | "strip-bom": "^3.0.0" 2246 | } 2247 | }, 2248 | "type-check": { 2249 | "version": "0.4.0", 2250 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2251 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2252 | "dev": true, 2253 | "requires": { 2254 | "prelude-ls": "^1.2.1" 2255 | } 2256 | }, 2257 | "type-fest": { 2258 | "version": "0.8.1", 2259 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 2260 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 2261 | "dev": true 2262 | }, 2263 | "universal-user-agent": { 2264 | "version": "6.0.0", 2265 | "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", 2266 | "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" 2267 | }, 2268 | "uri-js": { 2269 | "version": "4.4.0", 2270 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", 2271 | "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", 2272 | "dev": true, 2273 | "requires": { 2274 | "punycode": "^2.1.0" 2275 | } 2276 | }, 2277 | "v8-compile-cache": { 2278 | "version": "2.2.0", 2279 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", 2280 | "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", 2281 | "dev": true 2282 | }, 2283 | "validate-npm-package-license": { 2284 | "version": "3.0.4", 2285 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 2286 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 2287 | "dev": true, 2288 | "requires": { 2289 | "spdx-correct": "^3.0.0", 2290 | "spdx-expression-parse": "^3.0.0" 2291 | } 2292 | }, 2293 | "validate.js": { 2294 | "version": "0.13.1", 2295 | "resolved": "https://registry.npmjs.org/validate.js/-/validate.js-0.13.1.tgz", 2296 | "integrity": "sha512-PnFM3xiZ+kYmLyTiMgTYmU7ZHkjBZz2/+F0DaALc/uUtVzdCt1wAosvYJ5hFQi/hz8O4zb52FQhHZRC+uVkJ+g==" 2297 | }, 2298 | "which": { 2299 | "version": "1.3.1", 2300 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2301 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2302 | "requires": { 2303 | "isexe": "^2.0.0" 2304 | } 2305 | }, 2306 | "windows-release": { 2307 | "version": "3.3.0", 2308 | "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.0.tgz", 2309 | "integrity": "sha512-2HetyTg1Y+R+rUgrKeUEhAG/ZuOmTrI1NBb3ZyAGQMYmOJjBBPe4MTodghRkmLJZHwkuPi02anbeGP+Zf401LQ==", 2310 | "requires": { 2311 | "execa": "^1.0.0" 2312 | } 2313 | }, 2314 | "word-wrap": { 2315 | "version": "1.2.3", 2316 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 2317 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 2318 | "dev": true 2319 | }, 2320 | "wrappy": { 2321 | "version": "1.0.2", 2322 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2323 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 2324 | }, 2325 | "write": { 2326 | "version": "1.0.3", 2327 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 2328 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 2329 | "dev": true, 2330 | "requires": { 2331 | "mkdirp": "^0.5.1" 2332 | } 2333 | }, 2334 | "xdg-basedir": { 2335 | "version": "4.0.0", 2336 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", 2337 | "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", 2338 | "dev": true 2339 | }, 2340 | "yallist": { 2341 | "version": "4.0.0", 2342 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2343 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2344 | "dev": true 2345 | }, 2346 | "yaml": { 2347 | "version": "1.9.2", 2348 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.9.2.tgz", 2349 | "integrity": "sha512-HPT7cGGI0DuRcsO51qC1j9O16Dh1mZ2bnXwsi0jrSpsLz0WxOLSLXfkABVl6bZO629py3CU+OMJtpNHDLB97kg==", 2350 | "requires": { 2351 | "@babel/runtime": "^7.9.2" 2352 | } 2353 | } 2354 | } 2355 | } 2356 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ghec-audit-log-cli", 3 | "version": "2.1.2", 4 | "description": "Audit Log CLI for Rest and GraphQL APIs", 5 | "main": "ghec-audit-log-cli.js", 6 | "scripts": { 7 | "start": "node ghec-audit-log-cli", 8 | "lint": "./node_modules/.bin/standard" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git://github.com/droidpl/ghec-audit-log-cli.git" 13 | }, 14 | "keywords": [], 15 | "author": { 16 | "name": "GitHub Professional Services", 17 | "email": "services@github.com", 18 | "url": "https://services.github.com" 19 | }, 20 | "contributors": [ 21 | { 22 | "name": "Javier de Pedro López", 23 | "email": "droidpl@github.com", 24 | "url": "https://github.com/droidpl" 25 | }, 26 | { 27 | "name": "Froilán Irizarry Rivera", 28 | "email": "froi@github.com", 29 | "url": "https://github.com/froi" 30 | } 31 | ], 32 | "license": "MIT", 33 | "dependencies": { 34 | "@octokit/plugin-enterprise-cloud": "^5.0.4", 35 | "@octokit/plugin-retry": "*", 36 | "@octokit/plugin-throttling": "^3.3.1", 37 | "@octokit/rest": "^18.3.1", 38 | "commander": "^5.1.0", 39 | "json-hash": "^1.2.0", 40 | "validate.js": "^0.13.1", 41 | "yaml": "^1.9.2" 42 | }, 43 | "bin": { 44 | "ghec-audit-log-cli": "./ghec-audit-log-cli.js" 45 | }, 46 | "devDependencies": { 47 | "standard": "^16.0.3" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /workflows/forward-v3-workflow.yml: -------------------------------------------------------------------------------- 1 | ############################################ 2 | # Github Action Workflow to poll and aggregate logs # 3 | ############################################ 4 | name: POLL/POST Audit Log Data from v3 API 5 | 6 | ############################################## 7 | # Run once an hour and when pushed to main # 8 | ############################################## 9 | on: 10 | push: 11 | branches: main 12 | schedule: 13 | - cron: '59 * * * *' 14 | 15 | ################# 16 | # Build the job # 17 | ################# 18 | jobs: 19 | poll: 20 | runs-on: ubuntu-latest 21 | 22 | strategy: 23 | matrix: 24 | node-version: [12.x] 25 | 26 | steps: 27 | # Clone source code 28 | - name: Checkout source code 29 | uses: actions/checkout@v2 30 | 31 | # Install congiure NodeJS 32 | - name: Use Node.js ${{ matrix.node-version }} 33 | uses: actions/setup-node@v1 34 | with: 35 | node-version: ${{ matrix.node-version }} 36 | 37 | # Need to install NPM 38 | - name: NPM Install 39 | run: npm install 40 | 41 | # If this is the first time we poll, then do a fresh poll. If not, poll from latest cursor. 42 | - name: Poll from Cursor 43 | run: | 44 | if [ -f ".last-v3-cursor-update" ]; then 45 | LAST_CURSOR=$(cat .last-v3-cursor-update) 46 | fi 47 | 48 | if [ -z "$LAST_CURSOR" ]; then 49 | echo "FIRST TIME RUNNING AUDIT LOG POLL" 50 | npm start -- --token ${{secrets.AUDIT_LOG_TOKEN}} --org ${{secrets.ORG_NAME}} --api 'v3' --api-type 'all' --file 'audit-log-output.json' 51 | else 52 | echo "RUNNING AUDIT LOG POLL FROM $LAST_CURSOR" 53 | npm start -- --token ${{secrets.AUDIT_LOG_TOKEN}} --org ${{secrets.ORG_NAME}} --api 'v3' --api-type 'all' --cursor $LAST_CURSOR --file 'audit-log-output.json' 54 | fi 55 | curl -X POST -H "Content-Type: application/json" -d @audit-log-output.json ${{secrets.WEBHOOK_URL}} 56 | 57 | # Commit the cursor back to source 58 | - name: Commit cursor 59 | uses: EndBug/add-and-commit@v5 60 | with: 61 | author_name: Audit Log Integration 62 | author_email: ${{ secrets.COMMITTER_EMAIL }} 63 | message: "Updating cursor for audit log" 64 | add: ".last-v3-cursor-update --force" 65 | env: 66 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 67 | -------------------------------------------------------------------------------- /workflows/forward-v4-workflow.yml: -------------------------------------------------------------------------------- 1 | ############################################ 2 | # Github Action Workflow to poll and aggregate logs # 3 | ############################################ 4 | name: POLL/POST Audit Log Data from V4 API 5 | 6 | ############################################## 7 | # Run once an hour and when pushed to main # 8 | ############################################## 9 | on: 10 | push: 11 | branches: main 12 | schedule: 13 | - cron: '59 * * * *' 14 | 15 | ################# 16 | # Build the job # 17 | ################# 18 | jobs: 19 | poll: 20 | runs-on: ubuntu-latest 21 | 22 | strategy: 23 | matrix: 24 | node-version: [12.x] 25 | 26 | steps: 27 | # Clone source code 28 | - name: Checkout source code 29 | uses: actions/checkout@v2 30 | 31 | # Install congiure NodeJS 32 | - name: Use Node.js ${{ matrix.node-version }} 33 | uses: actions/setup-node@v1 34 | with: 35 | node-version: ${{ matrix.node-version }} 36 | 37 | # Need to install NPM 38 | - name: NPM Install 39 | run: npm install 40 | 41 | # If this is the first time we poll, then do a fresh poll. If not, poll from latest cursor. 42 | - name: Poll from Cursor 43 | run: | 44 | if [ -f ".last-cursor-update" ]; then 45 | LAST_CURSOR=$(cat .last-cursor-update) 46 | fi 47 | 48 | if [ -z "$LAST_CURSOR" ]; then 49 | echo "FIRST TIME RUNNING AUDIT LOG POLL" 50 | npm start -- --token ${{secrets.AUDIT_LOG_TOKEN}} --org ${{secrets.ORG_NAME}} --file 'audit-log-output.json' 51 | else 52 | echo "RUNNING AUDIT LOG POLL FROM $LAST_CURSOR" 53 | npm start -- --token ${{secrets.AUDIT_LOG_TOKEN}} --org ${{secrets.ORG_NAME}} --cursor $LAST_CURSOR --file 'audit-log-output.json' 54 | fi 55 | curl -X POST -H "Content-Type: application/json" -d @audit-log-output.json ${{secrets.WEBHOOK_URL}} 56 | 57 | # Commit the cursor back to source 58 | - name: Commit cursor 59 | uses: EndBug/add-and-commit@v5 60 | with: 61 | author_name: Audit Log Integration 62 | author_email: ${{ secrets.COMMITTER_EMAIL }} 63 | message: "Updating cursor for audit log" 64 | add: ".last-cursor-update --force" 65 | env: 66 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 67 | --------------------------------------------------------------------------------