├── .babelrc
├── .gitignore
├── LICENSE
├── README.md
├── package.json
├── pnpm-lock.yaml
└── src
├── index.mjs
└── utils
├── commands
├── init.mjs
└── sync.mjs
├── cookie-cutting
└── replacer.mjs
├── data
├── cmg-config.mjs
├── package-info.mjs
└── templates.mjs
├── git-actions.mjs
└── logger.mjs
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-react"]
3 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 | .pnpm-debug.log*
9 |
10 | # Diagnostic reports (https://nodejs.org/api/report.html)
11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
12 |
13 | # Runtime data
14 | pids
15 | *.pid
16 | *.seed
17 | *.pid.lock
18 |
19 | # Directory for instrumented libs generated by jscoverage/JSCover
20 | lib-cov
21 |
22 | # Coverage directory used by tools like istanbul
23 | coverage
24 | *.lcov
25 |
26 | # nyc test coverage
27 | .nyc_output
28 |
29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
30 | .grunt
31 |
32 | # Bower dependency directory (https://bower.io/)
33 | bower_components
34 |
35 | # node-waf configuration
36 | .lock-wscript
37 |
38 | # Compiled binary addons (https://nodejs.org/api/addons.html)
39 | build/Release
40 |
41 | # Dependency directories
42 | node_modules/
43 | jspm_packages/
44 |
45 | # Snowpack dependency directory (https://snowpack.dev/)
46 | web_modules/
47 |
48 | # TypeScript cache
49 | *.tsbuildinfo
50 |
51 | # Optional npm cache directory
52 | .npm
53 |
54 | # Optional eslint cache
55 | .eslintcache
56 |
57 | # Optional stylelint cache
58 | .stylelintcache
59 |
60 | # Microbundle cache
61 | .rpt2_cache/
62 | .rts2_cache_cjs/
63 | .rts2_cache_es/
64 | .rts2_cache_umd/
65 |
66 | # Optional REPL history
67 | .node_repl_history
68 |
69 | # Output of 'npm pack'
70 | *.tgz
71 |
72 | # Yarn Integrity file
73 | .yarn-integrity
74 |
75 | # dotenv environment variable files
76 | .env
77 | .env.development.local
78 | .env.test.local
79 | .env.production.local
80 | .env.local
81 |
82 | # parcel-bundler cache (https://parceljs.org/)
83 | .cache
84 | .parcel-cache
85 |
86 | # Next.js build output
87 | .next
88 | out
89 |
90 | # Nuxt.js build / generate output
91 | .nuxt
92 | dist
93 |
94 | # Gatsby files
95 | .cache/
96 | # Comment in the public line in if your project uses Gatsby and not Next.js
97 | # https://nextjs.org/blog/next-9-1#public-directory-support
98 | # public
99 |
100 | # vuepress build output
101 | .vuepress/dist
102 |
103 | # vuepress v2.x temp and cache directory
104 | .temp
105 | .cache
106 |
107 | # Docusaurus cache and generated files
108 | .docusaurus
109 |
110 | # Serverless directories
111 | .serverless/
112 |
113 | # FuseBox cache
114 | .fusebox/
115 |
116 | # DynamoDB Local files
117 | .dynamodb/
118 |
119 | # TernJS port file
120 | .tern-port
121 |
122 | # Stores VSCode versions used for testing VSCode extensions
123 | .vscode-test
124 |
125 | # yarn v2
126 | .yarn/cache
127 | .yarn/unplugged
128 | .yarn/build-state.yml
129 | .yarn/install-state.gz
130 | .pnp.*
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Creative Commons Legal Code
2 |
3 | CC0 1.0 Universal
4 |
5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
12 | HEREUNDER.
13 |
14 | Statement of Purpose
15 |
16 | The laws of most jurisdictions throughout the world automatically confer
17 | exclusive Copyright and Related Rights (defined below) upon the creator
18 | and subsequent owner(s) (each and all, an "owner") of an original work of
19 | authorship and/or a database (each, a "Work").
20 |
21 | Certain owners wish to permanently relinquish those rights to a Work for
22 | the purpose of contributing to a commons of creative, cultural and
23 | scientific works ("Commons") that the public can reliably and without fear
24 | of later claims of infringement build upon, modify, incorporate in other
25 | works, reuse and redistribute as freely as possible in any form whatsoever
26 | and for any purposes, including without limitation commercial purposes.
27 | These owners may contribute to the Commons to promote the ideal of a free
28 | culture and the further production of creative, cultural and scientific
29 | works, or to gain reputation or greater distribution for their Work in
30 | part through the use and efforts of others.
31 |
32 | For these and/or other purposes and motivations, and without any
33 | expectation of additional consideration or compensation, the person
34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she
35 | is an owner of Copyright and Related Rights in the Work, voluntarily
36 | elects to apply CC0 to the Work and publicly distribute the Work under its
37 | terms, with knowledge of his or her Copyright and Related Rights in the
38 | Work and the meaning and intended legal effect of CC0 on those rights.
39 |
40 | 1. Copyright and Related Rights. A Work made available under CC0 may be
41 | protected by copyright and related or neighboring rights ("Copyright and
42 | Related Rights"). Copyright and Related Rights include, but are not
43 | limited to, the following:
44 |
45 | i. the right to reproduce, adapt, distribute, perform, display,
46 | communicate, and translate a Work;
47 | ii. moral rights retained by the original author(s) and/or performer(s);
48 | iii. publicity and privacy rights pertaining to a person's image or
49 | likeness depicted in a Work;
50 | iv. rights protecting against unfair competition in regards to a Work,
51 | subject to the limitations in paragraph 4(a), below;
52 | v. rights protecting the extraction, dissemination, use and reuse of data
53 | in a Work;
54 | vi. database rights (such as those arising under Directive 96/9/EC of the
55 | European Parliament and of the Council of 11 March 1996 on the legal
56 | protection of databases, and under any national implementation
57 | thereof, including any amended or successor version of such
58 | directive); and
59 | vii. other similar, equivalent or corresponding rights throughout the
60 | world based on applicable law or treaty, and any national
61 | implementations thereof.
62 |
63 | 2. Waiver. To the greatest extent permitted by, but not in contravention
64 | of, applicable law, Affirmer hereby overtly, fully, permanently,
65 | irrevocably and unconditionally waives, abandons, and surrenders all of
66 | Affirmer's Copyright and Related Rights and associated claims and causes
67 | of action, whether now known or unknown (including existing as well as
68 | future claims and causes of action), in the Work (i) in all territories
69 | worldwide, (ii) for the maximum duration provided by applicable law or
70 | treaty (including future time extensions), (iii) in any current or future
71 | medium and for any number of copies, and (iv) for any purpose whatsoever,
72 | including without limitation commercial, advertising or promotional
73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
74 | member of the public at large and to the detriment of Affirmer's heirs and
75 | successors, fully intending that such Waiver shall not be subject to
76 | revocation, rescission, cancellation, termination, or any other legal or
77 | equitable action to disrupt the quiet enjoyment of the Work by the public
78 | as contemplated by Affirmer's express Statement of Purpose.
79 |
80 | 3. Public License Fallback. Should any part of the Waiver for any reason
81 | be judged legally invalid or ineffective under applicable law, then the
82 | Waiver shall be preserved to the maximum extent permitted taking into
83 | account Affirmer's express Statement of Purpose. In addition, to the
84 | extent the Waiver is so judged Affirmer hereby grants to each affected
85 | person a royalty-free, non transferable, non sublicensable, non exclusive,
86 | irrevocable and unconditional license to exercise Affirmer's Copyright and
87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the
88 | maximum duration provided by applicable law or treaty (including future
89 | time extensions), (iii) in any current or future medium and for any number
90 | of copies, and (iv) for any purpose whatsoever, including without
91 | limitation commercial, advertising or promotional purposes (the
92 | "License"). The License shall be deemed effective as of the date CC0 was
93 | applied by Affirmer to the Work. Should any part of the License for any
94 | reason be judged legally invalid or ineffective under applicable law, such
95 | partial invalidity or ineffectiveness shall not invalidate the remainder
96 | of the License, and in such case Affirmer hereby affirms that he or she
97 | will not (i) exercise any of his or her remaining Copyright and Related
98 | Rights in the Work or (ii) assert any associated claims and causes of
99 | action with respect to the Work, in either case contrary to Affirmer's
100 | express Statement of Purpose.
101 |
102 | 4. Limitations and Disclaimers.
103 |
104 | a. No trademark or patent rights held by Affirmer are waived, abandoned,
105 | surrendered, licensed or otherwise affected by this document.
106 | b. Affirmer offers the Work as-is and makes no representations or
107 | warranties of any kind concerning the Work, express, implied,
108 | statutory or otherwise, including without limitation warranties of
109 | title, merchantability, fitness for a particular purpose, non
110 | infringement, or the absence of latent or other defects, accuracy, or
111 | the present or absence of errors, whether or not discoverable, all to
112 | the greatest extent permissible under applicable law.
113 | c. Affirmer disclaims responsibility for clearing rights of other persons
114 | that may apply to the Work or any use thereof, including without
115 | limitation any person's Copyright and Related Rights in the Work.
116 | Further, Affirmer disclaims responsibility for obtaining any necessary
117 | consents, permissions or other rights required for any use of the
118 | Work.
119 | d. Affirmer understands and acknowledges that Creative Commons is not a
120 | party to this document and has no duty or obligation with respect to
121 | this CC0 or use of the Work.
122 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |

3 |
4 |
5 | # create-multiplayer-game
6 |
7 | > ℹ️ This is a work-in-progress. Star (⭐) this repo to follow updates.
8 |
9 | The web game framework which gets out of your way, and gives you control. Build games in days, not weeks!
10 |
11 | ## Use cases
12 | - You can use it as a base for a fresh project
13 | - As a wrapper for an existing game (e.g. to add start/end screens, to make your game a PWA)
14 | - To quickly test out some logic in a multiplayer scenario
15 |
16 | ## Scaffolding Your First Web Game Project
17 |
18 | > **Compatibility Note:**
19 | > create-multiplayer-game requires [Node.js](https://nodejs.org/en/) version 21+.
20 |
21 | With NPM:
22 |
23 | ```bash
24 | npx create-multiplayer-game@latest
25 | ```
26 |
27 | Then follow the prompts!
28 |
29 | You can also directly specify the project name and the template you want to use via additional command line options. For example, to scaffold a Vite + React project, you can run:
30 |
31 | ```bash
32 | npx create-multiplayer-game@latest my-awesome-game --template vite-react-ts
33 | ```
34 |
35 | Currently supported template presets include:
36 |
37 | - `vite-react-ts`
38 | - `next-ts`
39 | - `vite-react-ts-premium` (coming soon)
40 | - Some community-driven templates
41 |
42 | You can use `.` for the project name to scaffold in the current directory.
43 |
44 | ## Syncing your template
45 | You'll want to periodically pull updates from your base template. This ensures you're always packed with the latest features, bug fixes and more. This may cause merge conflicts.
46 |
47 | To pull the latest from the template, simply run the following command in the **project directory**:
48 |
49 | ```bash
50 | npx create-multiplayer-game sync
51 | ```
52 |
53 | ## Community Templates
54 |
55 | create-multiplayer-game is a tool to quickly start a multiplayer web game project from a basic template for popular frameworks. Check out Awesome Playroom for [community maintained templates](https://github.com/grayhatdevelopers/awesome-playroom?tab=readme-ov-file#open-source-games-and-boilerplates) that include other tools or target different frameworks. You can use a tool like [degit](https://github.com/Rich-Harris/degit) to scaffold your project with one of the templates.
56 |
57 | ```bash
58 | npx degit user/project my-project
59 | cd my-project
60 |
61 | npm install
62 | npm run dev
63 | ```
64 |
65 | If the project uses `main` as the default branch, suffix the project repo with `#main`
66 |
67 | ```bash
68 | npx degit user/project#main my-project
69 | ```
70 |
71 | ### Want to add a template?
72 | Feel free to add a template of your choice to create-multiplayer-game.
73 | 1. Edit this file: https://github.com/grayhatdevelopers/create-multiplayer-game/blob/main/src/utils/data/templates.mjs
74 | 2. Make a Pull Request.
75 |
76 | It'll be reviewed and tested by the maintainers before merging.
77 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "create-multiplayer-game",
3 | "version": "0.0.26",
4 | "description": "Create a multiplayer web game in seconds 👾🚀",
5 | "main": "./src/index.mjs",
6 | "repository": {
7 | "type": "git",
8 | "url": "git+https://github.com/grayhatdevelopers/create-multiplayer-game.git"
9 | },
10 | "scripts": {
11 | "test": "echo \"Error: no test specified\" && exit 1",
12 | "start": "node --experimental-json-modules ./src/index.mjs"
13 | },
14 | "keywords": [],
15 | "author": "",
16 | "license": "ISC",
17 | "bin": {
18 | "create-multiplayer-game": "./src/index.mjs",
19 | "cmg": "./src/index.mjs"
20 | },
21 | "dependencies": {
22 | "chalk": "^5.3.0",
23 | "commander": "^11.1.0",
24 | "download-git-repo": "^3.0.2",
25 | "execa": "^9.0.2",
26 | "inquirer": "^9.2.12",
27 | "lodash": "^4.17.21",
28 | "ora": "^8.0.1",
29 | "react": "^18.2.0"
30 | },
31 | "devDependencies": {
32 | "esm": "^3.2.25"
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '9.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | importers:
8 |
9 | .:
10 | dependencies:
11 | chalk:
12 | specifier: ^5.3.0
13 | version: 5.3.0
14 | commander:
15 | specifier: ^11.1.0
16 | version: 11.1.0
17 | download-git-repo:
18 | specifier: ^3.0.2
19 | version: 3.0.2
20 | execa:
21 | specifier: ^9.0.2
22 | version: 9.0.2
23 | inquirer:
24 | specifier: ^9.2.12
25 | version: 9.2.12
26 | lodash:
27 | specifier: ^4.17.21
28 | version: 4.17.21
29 | ora:
30 | specifier: ^8.0.1
31 | version: 8.0.1
32 | react:
33 | specifier: ^18.2.0
34 | version: 18.2.0
35 | devDependencies:
36 | esm:
37 | specifier: ^3.2.25
38 | version: 3.2.25
39 |
40 | packages:
41 |
42 | '@ljharb/through@2.3.11':
43 | resolution: {integrity: sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==}
44 | engines: {node: '>= 0.4'}
45 |
46 | '@sec-ant/readable-stream@0.4.1':
47 | resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==}
48 |
49 | '@sindresorhus/is@0.7.0':
50 | resolution: {integrity: sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==}
51 | engines: {node: '>=4'}
52 |
53 | '@sindresorhus/merge-streams@4.0.0':
54 | resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
55 | engines: {node: '>=18'}
56 |
57 | '@types/keyv@3.1.4':
58 | resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
59 |
60 | '@types/node@20.11.5':
61 | resolution: {integrity: sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==}
62 |
63 | '@types/responselike@1.0.3':
64 | resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==}
65 |
66 | ansi-escapes@4.3.2:
67 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
68 | engines: {node: '>=8'}
69 |
70 | ansi-regex@5.0.1:
71 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
72 | engines: {node: '>=8'}
73 |
74 | ansi-regex@6.0.1:
75 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
76 | engines: {node: '>=12'}
77 |
78 | ansi-styles@4.3.0:
79 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
80 | engines: {node: '>=8'}
81 |
82 | archive-type@4.0.0:
83 | resolution: {integrity: sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==}
84 | engines: {node: '>=4'}
85 |
86 | balanced-match@1.0.2:
87 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
88 |
89 | base64-js@1.5.1:
90 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
91 |
92 | bl@1.2.3:
93 | resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==}
94 |
95 | bl@4.1.0:
96 | resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
97 |
98 | brace-expansion@1.1.11:
99 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
100 |
101 | buffer-alloc-unsafe@1.1.0:
102 | resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==}
103 |
104 | buffer-alloc@1.2.0:
105 | resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==}
106 |
107 | buffer-crc32@0.2.13:
108 | resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
109 |
110 | buffer-fill@1.0.0:
111 | resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==}
112 |
113 | buffer@5.7.1:
114 | resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
115 |
116 | cacheable-request@2.1.4:
117 | resolution: {integrity: sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==}
118 |
119 | call-bind@1.0.5:
120 | resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==}
121 |
122 | caw@2.0.1:
123 | resolution: {integrity: sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==}
124 | engines: {node: '>=4'}
125 |
126 | chalk@4.1.2:
127 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
128 | engines: {node: '>=10'}
129 |
130 | chalk@5.3.0:
131 | resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
132 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
133 |
134 | chardet@0.7.0:
135 | resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
136 |
137 | cli-cursor@3.1.0:
138 | resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
139 | engines: {node: '>=8'}
140 |
141 | cli-cursor@4.0.0:
142 | resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==}
143 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
144 |
145 | cli-spinners@2.9.2:
146 | resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
147 | engines: {node: '>=6'}
148 |
149 | cli-width@4.1.0:
150 | resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
151 | engines: {node: '>= 12'}
152 |
153 | clone-response@1.0.2:
154 | resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==}
155 |
156 | clone@1.0.4:
157 | resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
158 | engines: {node: '>=0.8'}
159 |
160 | color-convert@2.0.1:
161 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
162 | engines: {node: '>=7.0.0'}
163 |
164 | color-name@1.1.4:
165 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
166 |
167 | commander@11.1.0:
168 | resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
169 | engines: {node: '>=16'}
170 |
171 | commander@2.20.3:
172 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
173 |
174 | concat-map@0.0.1:
175 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
176 |
177 | config-chain@1.1.13:
178 | resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
179 |
180 | content-disposition@0.5.4:
181 | resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
182 | engines: {node: '>= 0.6'}
183 |
184 | core-util-is@1.0.3:
185 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
186 |
187 | cross-spawn@7.0.3:
188 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
189 | engines: {node: '>= 8'}
190 |
191 | decode-uri-component@0.2.2:
192 | resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
193 | engines: {node: '>=0.10'}
194 |
195 | decompress-response@3.3.0:
196 | resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==}
197 | engines: {node: '>=4'}
198 |
199 | decompress-tar@4.1.1:
200 | resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==}
201 | engines: {node: '>=4'}
202 |
203 | decompress-tarbz2@4.1.1:
204 | resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==}
205 | engines: {node: '>=4'}
206 |
207 | decompress-targz@4.1.1:
208 | resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==}
209 | engines: {node: '>=4'}
210 |
211 | decompress-unzip@4.0.1:
212 | resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==}
213 | engines: {node: '>=4'}
214 |
215 | decompress@4.2.1:
216 | resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==}
217 | engines: {node: '>=4'}
218 |
219 | defaults@1.0.4:
220 | resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
221 |
222 | define-data-property@1.1.1:
223 | resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==}
224 | engines: {node: '>= 0.4'}
225 |
226 | download-git-repo@3.0.2:
227 | resolution: {integrity: sha512-N8hWXD4hXqmEcNoR8TBYFntaOcYvEQ7Bz90mgm3bZRTuteGQqwT32VDMnTyD0KTEvb8BWrMc1tVmzuV9u/WrAg==}
228 |
229 | download@7.1.0:
230 | resolution: {integrity: sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==}
231 | engines: {node: '>=6'}
232 |
233 | duplexer3@0.1.5:
234 | resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==}
235 |
236 | emoji-regex@10.3.0:
237 | resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==}
238 |
239 | emoji-regex@8.0.0:
240 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
241 |
242 | end-of-stream@1.4.4:
243 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
244 |
245 | escape-string-regexp@1.0.5:
246 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
247 | engines: {node: '>=0.8.0'}
248 |
249 | escape-string-regexp@5.0.0:
250 | resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
251 | engines: {node: '>=12'}
252 |
253 | esm@3.2.25:
254 | resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==}
255 | engines: {node: '>=6'}
256 |
257 | execa@9.0.2:
258 | resolution: {integrity: sha512-oO281GF7ksH/Ogv1xyDf1prvFta/6/XkGKxRUvA3IB2MU1rCJGlFs86HRZhdooow1ISkR0Np0rOxUCIJVw36Rg==}
259 | engines: {node: '>=18'}
260 |
261 | ext-list@2.2.2:
262 | resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==}
263 | engines: {node: '>=0.10.0'}
264 |
265 | ext-name@5.0.0:
266 | resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==}
267 | engines: {node: '>=4'}
268 |
269 | external-editor@3.1.0:
270 | resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
271 | engines: {node: '>=4'}
272 |
273 | fd-slicer@1.1.0:
274 | resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
275 |
276 | figures@5.0.0:
277 | resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==}
278 | engines: {node: '>=14'}
279 |
280 | figures@6.1.0:
281 | resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==}
282 | engines: {node: '>=18'}
283 |
284 | file-type@3.9.0:
285 | resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==}
286 | engines: {node: '>=0.10.0'}
287 |
288 | file-type@4.4.0:
289 | resolution: {integrity: sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==}
290 | engines: {node: '>=4'}
291 |
292 | file-type@5.2.0:
293 | resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==}
294 | engines: {node: '>=4'}
295 |
296 | file-type@6.2.0:
297 | resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==}
298 | engines: {node: '>=4'}
299 |
300 | file-type@8.1.0:
301 | resolution: {integrity: sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==}
302 | engines: {node: '>=6'}
303 |
304 | filename-reserved-regex@2.0.0:
305 | resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==}
306 | engines: {node: '>=4'}
307 |
308 | filenamify@2.1.0:
309 | resolution: {integrity: sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==}
310 | engines: {node: '>=4'}
311 |
312 | from2@2.3.0:
313 | resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==}
314 |
315 | fs-constants@1.0.0:
316 | resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
317 |
318 | fs.realpath@1.0.0:
319 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
320 |
321 | function-bind@1.1.2:
322 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
323 |
324 | get-east-asian-width@1.2.0:
325 | resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==}
326 | engines: {node: '>=18'}
327 |
328 | get-intrinsic@1.2.2:
329 | resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==}
330 |
331 | get-proxy@2.1.0:
332 | resolution: {integrity: sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==}
333 | engines: {node: '>=4'}
334 |
335 | get-stream@2.3.1:
336 | resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==}
337 | engines: {node: '>=0.10.0'}
338 |
339 | get-stream@3.0.0:
340 | resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==}
341 | engines: {node: '>=4'}
342 |
343 | get-stream@9.0.1:
344 | resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==}
345 | engines: {node: '>=18'}
346 |
347 | git-clone@0.1.0:
348 | resolution: {integrity: sha512-zs9rlfa7HyaJAKG9o+V7C6qfMzyc+tb1IIXdUFcOBcR1U7siKy/uPdauLlrH1mc0vOgUwIv4BF+QxPiiTYz3Rw==}
349 |
350 | glob@7.2.3:
351 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
352 |
353 | gopd@1.0.1:
354 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
355 |
356 | got@8.3.2:
357 | resolution: {integrity: sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==}
358 | engines: {node: '>=4'}
359 |
360 | graceful-fs@4.2.11:
361 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
362 |
363 | has-flag@4.0.0:
364 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
365 | engines: {node: '>=8'}
366 |
367 | has-property-descriptors@1.0.1:
368 | resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==}
369 |
370 | has-proto@1.0.1:
371 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
372 | engines: {node: '>= 0.4'}
373 |
374 | has-symbol-support-x@1.4.2:
375 | resolution: {integrity: sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==}
376 |
377 | has-symbols@1.0.3:
378 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
379 | engines: {node: '>= 0.4'}
380 |
381 | has-to-string-tag-x@1.4.1:
382 | resolution: {integrity: sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==}
383 |
384 | hasown@2.0.0:
385 | resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==}
386 | engines: {node: '>= 0.4'}
387 |
388 | http-cache-semantics@3.8.1:
389 | resolution: {integrity: sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==}
390 |
391 | human-signals@7.0.0:
392 | resolution: {integrity: sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==}
393 | engines: {node: '>=18.18.0'}
394 |
395 | iconv-lite@0.4.24:
396 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
397 | engines: {node: '>=0.10.0'}
398 |
399 | ieee754@1.2.1:
400 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
401 |
402 | inflight@1.0.6:
403 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
404 |
405 | inherits@2.0.4:
406 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
407 |
408 | ini@1.3.8:
409 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
410 |
411 | inquirer@9.2.12:
412 | resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==}
413 | engines: {node: '>=14.18.0'}
414 |
415 | into-stream@3.1.0:
416 | resolution: {integrity: sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==}
417 | engines: {node: '>=4'}
418 |
419 | is-fullwidth-code-point@3.0.0:
420 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
421 | engines: {node: '>=8'}
422 |
423 | is-interactive@1.0.0:
424 | resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
425 | engines: {node: '>=8'}
426 |
427 | is-interactive@2.0.0:
428 | resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==}
429 | engines: {node: '>=12'}
430 |
431 | is-natural-number@4.0.1:
432 | resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==}
433 |
434 | is-object@1.0.2:
435 | resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==}
436 |
437 | is-plain-obj@1.1.0:
438 | resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
439 | engines: {node: '>=0.10.0'}
440 |
441 | is-plain-obj@4.1.0:
442 | resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
443 | engines: {node: '>=12'}
444 |
445 | is-retry-allowed@1.2.0:
446 | resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==}
447 | engines: {node: '>=0.10.0'}
448 |
449 | is-stream@1.1.0:
450 | resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==}
451 | engines: {node: '>=0.10.0'}
452 |
453 | is-stream@4.0.1:
454 | resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==}
455 | engines: {node: '>=18'}
456 |
457 | is-unicode-supported@0.1.0:
458 | resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
459 | engines: {node: '>=10'}
460 |
461 | is-unicode-supported@1.3.0:
462 | resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==}
463 | engines: {node: '>=12'}
464 |
465 | is-unicode-supported@2.0.0:
466 | resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==}
467 | engines: {node: '>=18'}
468 |
469 | isarray@1.0.0:
470 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
471 |
472 | isexe@2.0.0:
473 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
474 |
475 | isurl@1.0.0:
476 | resolution: {integrity: sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==}
477 | engines: {node: '>= 4'}
478 |
479 | js-tokens@4.0.0:
480 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
481 |
482 | json-buffer@3.0.0:
483 | resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==}
484 |
485 | keyv@3.0.0:
486 | resolution: {integrity: sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==}
487 |
488 | lodash@4.17.21:
489 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
490 |
491 | log-symbols@4.1.0:
492 | resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
493 | engines: {node: '>=10'}
494 |
495 | log-symbols@6.0.0:
496 | resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==}
497 | engines: {node: '>=18'}
498 |
499 | loose-envify@1.4.0:
500 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
501 | hasBin: true
502 |
503 | lowercase-keys@1.0.0:
504 | resolution: {integrity: sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==}
505 | engines: {node: '>=0.10.0'}
506 |
507 | lowercase-keys@1.0.1:
508 | resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==}
509 | engines: {node: '>=0.10.0'}
510 |
511 | make-dir@1.3.0:
512 | resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==}
513 | engines: {node: '>=4'}
514 |
515 | mime-db@1.52.0:
516 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
517 | engines: {node: '>= 0.6'}
518 |
519 | mimic-fn@2.1.0:
520 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
521 | engines: {node: '>=6'}
522 |
523 | mimic-response@1.0.1:
524 | resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
525 | engines: {node: '>=4'}
526 |
527 | minimatch@3.1.2:
528 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
529 |
530 | mute-stream@1.0.0:
531 | resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==}
532 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
533 |
534 | normalize-url@2.0.1:
535 | resolution: {integrity: sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==}
536 | engines: {node: '>=4'}
537 |
538 | npm-conf@1.1.3:
539 | resolution: {integrity: sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==}
540 | engines: {node: '>=4'}
541 |
542 | npm-run-path@5.3.0:
543 | resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
544 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
545 |
546 | object-assign@4.1.1:
547 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
548 | engines: {node: '>=0.10.0'}
549 |
550 | once@1.4.0:
551 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
552 |
553 | onetime@5.1.2:
554 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
555 | engines: {node: '>=6'}
556 |
557 | ora@5.4.1:
558 | resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
559 | engines: {node: '>=10'}
560 |
561 | ora@8.0.1:
562 | resolution: {integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==}
563 | engines: {node: '>=18'}
564 |
565 | os-tmpdir@1.0.2:
566 | resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
567 | engines: {node: '>=0.10.0'}
568 |
569 | p-cancelable@0.4.1:
570 | resolution: {integrity: sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==}
571 | engines: {node: '>=4'}
572 |
573 | p-event@2.3.1:
574 | resolution: {integrity: sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==}
575 | engines: {node: '>=6'}
576 |
577 | p-finally@1.0.0:
578 | resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==}
579 | engines: {node: '>=4'}
580 |
581 | p-is-promise@1.1.0:
582 | resolution: {integrity: sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==}
583 | engines: {node: '>=4'}
584 |
585 | p-timeout@2.0.1:
586 | resolution: {integrity: sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==}
587 | engines: {node: '>=4'}
588 |
589 | parse-ms@4.0.0:
590 | resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==}
591 | engines: {node: '>=18'}
592 |
593 | path-is-absolute@1.0.1:
594 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
595 | engines: {node: '>=0.10.0'}
596 |
597 | path-key@3.1.1:
598 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
599 | engines: {node: '>=8'}
600 |
601 | path-key@4.0.0:
602 | resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
603 | engines: {node: '>=12'}
604 |
605 | pend@1.2.0:
606 | resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
607 |
608 | pify@2.3.0:
609 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
610 | engines: {node: '>=0.10.0'}
611 |
612 | pify@3.0.0:
613 | resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==}
614 | engines: {node: '>=4'}
615 |
616 | pinkie-promise@2.0.1:
617 | resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==}
618 | engines: {node: '>=0.10.0'}
619 |
620 | pinkie@2.0.4:
621 | resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==}
622 | engines: {node: '>=0.10.0'}
623 |
624 | prepend-http@2.0.0:
625 | resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==}
626 | engines: {node: '>=4'}
627 |
628 | pretty-ms@9.0.0:
629 | resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==}
630 | engines: {node: '>=18'}
631 |
632 | process-nextick-args@2.0.1:
633 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
634 |
635 | proto-list@1.2.4:
636 | resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
637 |
638 | query-string@5.1.1:
639 | resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==}
640 | engines: {node: '>=0.10.0'}
641 |
642 | react@18.2.0:
643 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
644 | engines: {node: '>=0.10.0'}
645 |
646 | readable-stream@2.3.8:
647 | resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
648 |
649 | readable-stream@3.6.2:
650 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
651 | engines: {node: '>= 6'}
652 |
653 | responselike@1.0.2:
654 | resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==}
655 |
656 | restore-cursor@3.1.0:
657 | resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
658 | engines: {node: '>=8'}
659 |
660 | restore-cursor@4.0.0:
661 | resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==}
662 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
663 |
664 | rimraf@3.0.2:
665 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
666 | hasBin: true
667 |
668 | run-async@3.0.0:
669 | resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==}
670 | engines: {node: '>=0.12.0'}
671 |
672 | rxjs@7.8.1:
673 | resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
674 |
675 | safe-buffer@5.1.2:
676 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
677 |
678 | safe-buffer@5.2.1:
679 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
680 |
681 | safer-buffer@2.1.2:
682 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
683 |
684 | seek-bzip@1.0.6:
685 | resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==}
686 | hasBin: true
687 |
688 | set-function-length@1.2.0:
689 | resolution: {integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==}
690 | engines: {node: '>= 0.4'}
691 |
692 | shebang-command@2.0.0:
693 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
694 | engines: {node: '>=8'}
695 |
696 | shebang-regex@3.0.0:
697 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
698 | engines: {node: '>=8'}
699 |
700 | signal-exit@3.0.7:
701 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
702 |
703 | signal-exit@4.1.0:
704 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
705 | engines: {node: '>=14'}
706 |
707 | sort-keys-length@1.0.1:
708 | resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==}
709 | engines: {node: '>=0.10.0'}
710 |
711 | sort-keys@1.1.2:
712 | resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==}
713 | engines: {node: '>=0.10.0'}
714 |
715 | sort-keys@2.0.0:
716 | resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==}
717 | engines: {node: '>=4'}
718 |
719 | stdin-discarder@0.2.2:
720 | resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==}
721 | engines: {node: '>=18'}
722 |
723 | strict-uri-encode@1.1.0:
724 | resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==}
725 | engines: {node: '>=0.10.0'}
726 |
727 | string-width@4.2.3:
728 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
729 | engines: {node: '>=8'}
730 |
731 | string-width@7.1.0:
732 | resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==}
733 | engines: {node: '>=18'}
734 |
735 | string_decoder@1.1.1:
736 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
737 |
738 | string_decoder@1.3.0:
739 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
740 |
741 | strip-ansi@6.0.1:
742 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
743 | engines: {node: '>=8'}
744 |
745 | strip-ansi@7.1.0:
746 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
747 | engines: {node: '>=12'}
748 |
749 | strip-dirs@2.1.0:
750 | resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==}
751 |
752 | strip-final-newline@4.0.0:
753 | resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==}
754 | engines: {node: '>=18'}
755 |
756 | strip-outer@1.0.1:
757 | resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==}
758 | engines: {node: '>=0.10.0'}
759 |
760 | supports-color@7.2.0:
761 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
762 | engines: {node: '>=8'}
763 |
764 | tar-stream@1.6.2:
765 | resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==}
766 | engines: {node: '>= 0.8.0'}
767 |
768 | through@2.3.8:
769 | resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
770 |
771 | timed-out@4.0.1:
772 | resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==}
773 | engines: {node: '>=0.10.0'}
774 |
775 | tmp@0.0.33:
776 | resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
777 | engines: {node: '>=0.6.0'}
778 |
779 | to-buffer@1.1.1:
780 | resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==}
781 |
782 | trim-repeated@1.0.0:
783 | resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==}
784 | engines: {node: '>=0.10.0'}
785 |
786 | tslib@2.6.2:
787 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
788 |
789 | tunnel-agent@0.6.0:
790 | resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
791 |
792 | type-fest@0.21.3:
793 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
794 | engines: {node: '>=10'}
795 |
796 | unbzip2-stream@1.4.3:
797 | resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==}
798 |
799 | undici-types@5.26.5:
800 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
801 |
802 | url-parse-lax@3.0.0:
803 | resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==}
804 | engines: {node: '>=4'}
805 |
806 | url-to-options@1.0.1:
807 | resolution: {integrity: sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==}
808 | engines: {node: '>= 4'}
809 |
810 | util-deprecate@1.0.2:
811 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
812 |
813 | wcwidth@1.0.1:
814 | resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
815 |
816 | which@2.0.2:
817 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
818 | engines: {node: '>= 8'}
819 | hasBin: true
820 |
821 | wrap-ansi@6.2.0:
822 | resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
823 | engines: {node: '>=8'}
824 |
825 | wrappy@1.0.2:
826 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
827 |
828 | xtend@4.0.2:
829 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
830 | engines: {node: '>=0.4'}
831 |
832 | yauzl@2.10.0:
833 | resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
834 |
835 | yoctocolors@2.0.0:
836 | resolution: {integrity: sha512-esbDnt0Z1zI1KgvOZU90hJbL6BkoUbrP9yy7ArNZ6TmxBxydMJTYMf9FZjmwwcA8ZgEQzriQ3hwZ0NYXhlFo8Q==}
837 | engines: {node: '>=18'}
838 |
839 | snapshots:
840 |
841 | '@ljharb/through@2.3.11':
842 | dependencies:
843 | call-bind: 1.0.5
844 |
845 | '@sec-ant/readable-stream@0.4.1': {}
846 |
847 | '@sindresorhus/is@0.7.0': {}
848 |
849 | '@sindresorhus/merge-streams@4.0.0': {}
850 |
851 | '@types/keyv@3.1.4':
852 | dependencies:
853 | '@types/node': 20.11.5
854 |
855 | '@types/node@20.11.5':
856 | dependencies:
857 | undici-types: 5.26.5
858 |
859 | '@types/responselike@1.0.3':
860 | dependencies:
861 | '@types/node': 20.11.5
862 |
863 | ansi-escapes@4.3.2:
864 | dependencies:
865 | type-fest: 0.21.3
866 |
867 | ansi-regex@5.0.1: {}
868 |
869 | ansi-regex@6.0.1: {}
870 |
871 | ansi-styles@4.3.0:
872 | dependencies:
873 | color-convert: 2.0.1
874 |
875 | archive-type@4.0.0:
876 | dependencies:
877 | file-type: 4.4.0
878 |
879 | balanced-match@1.0.2: {}
880 |
881 | base64-js@1.5.1: {}
882 |
883 | bl@1.2.3:
884 | dependencies:
885 | readable-stream: 2.3.8
886 | safe-buffer: 5.2.1
887 |
888 | bl@4.1.0:
889 | dependencies:
890 | buffer: 5.7.1
891 | inherits: 2.0.4
892 | readable-stream: 3.6.2
893 |
894 | brace-expansion@1.1.11:
895 | dependencies:
896 | balanced-match: 1.0.2
897 | concat-map: 0.0.1
898 |
899 | buffer-alloc-unsafe@1.1.0: {}
900 |
901 | buffer-alloc@1.2.0:
902 | dependencies:
903 | buffer-alloc-unsafe: 1.1.0
904 | buffer-fill: 1.0.0
905 |
906 | buffer-crc32@0.2.13: {}
907 |
908 | buffer-fill@1.0.0: {}
909 |
910 | buffer@5.7.1:
911 | dependencies:
912 | base64-js: 1.5.1
913 | ieee754: 1.2.1
914 |
915 | cacheable-request@2.1.4:
916 | dependencies:
917 | clone-response: 1.0.2
918 | get-stream: 3.0.0
919 | http-cache-semantics: 3.8.1
920 | keyv: 3.0.0
921 | lowercase-keys: 1.0.0
922 | normalize-url: 2.0.1
923 | responselike: 1.0.2
924 |
925 | call-bind@1.0.5:
926 | dependencies:
927 | function-bind: 1.1.2
928 | get-intrinsic: 1.2.2
929 | set-function-length: 1.2.0
930 |
931 | caw@2.0.1:
932 | dependencies:
933 | get-proxy: 2.1.0
934 | isurl: 1.0.0
935 | tunnel-agent: 0.6.0
936 | url-to-options: 1.0.1
937 |
938 | chalk@4.1.2:
939 | dependencies:
940 | ansi-styles: 4.3.0
941 | supports-color: 7.2.0
942 |
943 | chalk@5.3.0: {}
944 |
945 | chardet@0.7.0: {}
946 |
947 | cli-cursor@3.1.0:
948 | dependencies:
949 | restore-cursor: 3.1.0
950 |
951 | cli-cursor@4.0.0:
952 | dependencies:
953 | restore-cursor: 4.0.0
954 |
955 | cli-spinners@2.9.2: {}
956 |
957 | cli-width@4.1.0: {}
958 |
959 | clone-response@1.0.2:
960 | dependencies:
961 | mimic-response: 1.0.1
962 |
963 | clone@1.0.4: {}
964 |
965 | color-convert@2.0.1:
966 | dependencies:
967 | color-name: 1.1.4
968 |
969 | color-name@1.1.4: {}
970 |
971 | commander@11.1.0: {}
972 |
973 | commander@2.20.3: {}
974 |
975 | concat-map@0.0.1: {}
976 |
977 | config-chain@1.1.13:
978 | dependencies:
979 | ini: 1.3.8
980 | proto-list: 1.2.4
981 |
982 | content-disposition@0.5.4:
983 | dependencies:
984 | safe-buffer: 5.2.1
985 |
986 | core-util-is@1.0.3: {}
987 |
988 | cross-spawn@7.0.3:
989 | dependencies:
990 | path-key: 3.1.1
991 | shebang-command: 2.0.0
992 | which: 2.0.2
993 |
994 | decode-uri-component@0.2.2: {}
995 |
996 | decompress-response@3.3.0:
997 | dependencies:
998 | mimic-response: 1.0.1
999 |
1000 | decompress-tar@4.1.1:
1001 | dependencies:
1002 | file-type: 5.2.0
1003 | is-stream: 1.1.0
1004 | tar-stream: 1.6.2
1005 |
1006 | decompress-tarbz2@4.1.1:
1007 | dependencies:
1008 | decompress-tar: 4.1.1
1009 | file-type: 6.2.0
1010 | is-stream: 1.1.0
1011 | seek-bzip: 1.0.6
1012 | unbzip2-stream: 1.4.3
1013 |
1014 | decompress-targz@4.1.1:
1015 | dependencies:
1016 | decompress-tar: 4.1.1
1017 | file-type: 5.2.0
1018 | is-stream: 1.1.0
1019 |
1020 | decompress-unzip@4.0.1:
1021 | dependencies:
1022 | file-type: 3.9.0
1023 | get-stream: 2.3.1
1024 | pify: 2.3.0
1025 | yauzl: 2.10.0
1026 |
1027 | decompress@4.2.1:
1028 | dependencies:
1029 | decompress-tar: 4.1.1
1030 | decompress-tarbz2: 4.1.1
1031 | decompress-targz: 4.1.1
1032 | decompress-unzip: 4.0.1
1033 | graceful-fs: 4.2.11
1034 | make-dir: 1.3.0
1035 | pify: 2.3.0
1036 | strip-dirs: 2.1.0
1037 |
1038 | defaults@1.0.4:
1039 | dependencies:
1040 | clone: 1.0.4
1041 |
1042 | define-data-property@1.1.1:
1043 | dependencies:
1044 | get-intrinsic: 1.2.2
1045 | gopd: 1.0.1
1046 | has-property-descriptors: 1.0.1
1047 |
1048 | download-git-repo@3.0.2:
1049 | dependencies:
1050 | download: 7.1.0
1051 | git-clone: 0.1.0
1052 | rimraf: 3.0.2
1053 |
1054 | download@7.1.0:
1055 | dependencies:
1056 | archive-type: 4.0.0
1057 | caw: 2.0.1
1058 | content-disposition: 0.5.4
1059 | decompress: 4.2.1
1060 | ext-name: 5.0.0
1061 | file-type: 8.1.0
1062 | filenamify: 2.1.0
1063 | get-stream: 3.0.0
1064 | got: 8.3.2
1065 | make-dir: 1.3.0
1066 | p-event: 2.3.1
1067 | pify: 3.0.0
1068 |
1069 | duplexer3@0.1.5: {}
1070 |
1071 | emoji-regex@10.3.0: {}
1072 |
1073 | emoji-regex@8.0.0: {}
1074 |
1075 | end-of-stream@1.4.4:
1076 | dependencies:
1077 | once: 1.4.0
1078 |
1079 | escape-string-regexp@1.0.5: {}
1080 |
1081 | escape-string-regexp@5.0.0: {}
1082 |
1083 | esm@3.2.25: {}
1084 |
1085 | execa@9.0.2:
1086 | dependencies:
1087 | '@sindresorhus/merge-streams': 4.0.0
1088 | cross-spawn: 7.0.3
1089 | figures: 6.1.0
1090 | get-stream: 9.0.1
1091 | human-signals: 7.0.0
1092 | is-plain-obj: 4.1.0
1093 | is-stream: 4.0.1
1094 | npm-run-path: 5.3.0
1095 | pretty-ms: 9.0.0
1096 | signal-exit: 4.1.0
1097 | strip-final-newline: 4.0.0
1098 | yoctocolors: 2.0.0
1099 |
1100 | ext-list@2.2.2:
1101 | dependencies:
1102 | mime-db: 1.52.0
1103 |
1104 | ext-name@5.0.0:
1105 | dependencies:
1106 | ext-list: 2.2.2
1107 | sort-keys-length: 1.0.1
1108 |
1109 | external-editor@3.1.0:
1110 | dependencies:
1111 | chardet: 0.7.0
1112 | iconv-lite: 0.4.24
1113 | tmp: 0.0.33
1114 |
1115 | fd-slicer@1.1.0:
1116 | dependencies:
1117 | pend: 1.2.0
1118 |
1119 | figures@5.0.0:
1120 | dependencies:
1121 | escape-string-regexp: 5.0.0
1122 | is-unicode-supported: 1.3.0
1123 |
1124 | figures@6.1.0:
1125 | dependencies:
1126 | is-unicode-supported: 2.0.0
1127 |
1128 | file-type@3.9.0: {}
1129 |
1130 | file-type@4.4.0: {}
1131 |
1132 | file-type@5.2.0: {}
1133 |
1134 | file-type@6.2.0: {}
1135 |
1136 | file-type@8.1.0: {}
1137 |
1138 | filename-reserved-regex@2.0.0: {}
1139 |
1140 | filenamify@2.1.0:
1141 | dependencies:
1142 | filename-reserved-regex: 2.0.0
1143 | strip-outer: 1.0.1
1144 | trim-repeated: 1.0.0
1145 |
1146 | from2@2.3.0:
1147 | dependencies:
1148 | inherits: 2.0.4
1149 | readable-stream: 2.3.8
1150 |
1151 | fs-constants@1.0.0: {}
1152 |
1153 | fs.realpath@1.0.0: {}
1154 |
1155 | function-bind@1.1.2: {}
1156 |
1157 | get-east-asian-width@1.2.0: {}
1158 |
1159 | get-intrinsic@1.2.2:
1160 | dependencies:
1161 | function-bind: 1.1.2
1162 | has-proto: 1.0.1
1163 | has-symbols: 1.0.3
1164 | hasown: 2.0.0
1165 |
1166 | get-proxy@2.1.0:
1167 | dependencies:
1168 | npm-conf: 1.1.3
1169 |
1170 | get-stream@2.3.1:
1171 | dependencies:
1172 | object-assign: 4.1.1
1173 | pinkie-promise: 2.0.1
1174 |
1175 | get-stream@3.0.0: {}
1176 |
1177 | get-stream@9.0.1:
1178 | dependencies:
1179 | '@sec-ant/readable-stream': 0.4.1
1180 | is-stream: 4.0.1
1181 |
1182 | git-clone@0.1.0: {}
1183 |
1184 | glob@7.2.3:
1185 | dependencies:
1186 | fs.realpath: 1.0.0
1187 | inflight: 1.0.6
1188 | inherits: 2.0.4
1189 | minimatch: 3.1.2
1190 | once: 1.4.0
1191 | path-is-absolute: 1.0.1
1192 |
1193 | gopd@1.0.1:
1194 | dependencies:
1195 | get-intrinsic: 1.2.2
1196 |
1197 | got@8.3.2:
1198 | dependencies:
1199 | '@sindresorhus/is': 0.7.0
1200 | '@types/keyv': 3.1.4
1201 | '@types/responselike': 1.0.3
1202 | cacheable-request: 2.1.4
1203 | decompress-response: 3.3.0
1204 | duplexer3: 0.1.5
1205 | get-stream: 3.0.0
1206 | into-stream: 3.1.0
1207 | is-retry-allowed: 1.2.0
1208 | isurl: 1.0.0
1209 | lowercase-keys: 1.0.1
1210 | mimic-response: 1.0.1
1211 | p-cancelable: 0.4.1
1212 | p-timeout: 2.0.1
1213 | pify: 3.0.0
1214 | safe-buffer: 5.2.1
1215 | timed-out: 4.0.1
1216 | url-parse-lax: 3.0.0
1217 | url-to-options: 1.0.1
1218 |
1219 | graceful-fs@4.2.11: {}
1220 |
1221 | has-flag@4.0.0: {}
1222 |
1223 | has-property-descriptors@1.0.1:
1224 | dependencies:
1225 | get-intrinsic: 1.2.2
1226 |
1227 | has-proto@1.0.1: {}
1228 |
1229 | has-symbol-support-x@1.4.2: {}
1230 |
1231 | has-symbols@1.0.3: {}
1232 |
1233 | has-to-string-tag-x@1.4.1:
1234 | dependencies:
1235 | has-symbol-support-x: 1.4.2
1236 |
1237 | hasown@2.0.0:
1238 | dependencies:
1239 | function-bind: 1.1.2
1240 |
1241 | http-cache-semantics@3.8.1: {}
1242 |
1243 | human-signals@7.0.0: {}
1244 |
1245 | iconv-lite@0.4.24:
1246 | dependencies:
1247 | safer-buffer: 2.1.2
1248 |
1249 | ieee754@1.2.1: {}
1250 |
1251 | inflight@1.0.6:
1252 | dependencies:
1253 | once: 1.4.0
1254 | wrappy: 1.0.2
1255 |
1256 | inherits@2.0.4: {}
1257 |
1258 | ini@1.3.8: {}
1259 |
1260 | inquirer@9.2.12:
1261 | dependencies:
1262 | '@ljharb/through': 2.3.11
1263 | ansi-escapes: 4.3.2
1264 | chalk: 5.3.0
1265 | cli-cursor: 3.1.0
1266 | cli-width: 4.1.0
1267 | external-editor: 3.1.0
1268 | figures: 5.0.0
1269 | lodash: 4.17.21
1270 | mute-stream: 1.0.0
1271 | ora: 5.4.1
1272 | run-async: 3.0.0
1273 | rxjs: 7.8.1
1274 | string-width: 4.2.3
1275 | strip-ansi: 6.0.1
1276 | wrap-ansi: 6.2.0
1277 |
1278 | into-stream@3.1.0:
1279 | dependencies:
1280 | from2: 2.3.0
1281 | p-is-promise: 1.1.0
1282 |
1283 | is-fullwidth-code-point@3.0.0: {}
1284 |
1285 | is-interactive@1.0.0: {}
1286 |
1287 | is-interactive@2.0.0: {}
1288 |
1289 | is-natural-number@4.0.1: {}
1290 |
1291 | is-object@1.0.2: {}
1292 |
1293 | is-plain-obj@1.1.0: {}
1294 |
1295 | is-plain-obj@4.1.0: {}
1296 |
1297 | is-retry-allowed@1.2.0: {}
1298 |
1299 | is-stream@1.1.0: {}
1300 |
1301 | is-stream@4.0.1: {}
1302 |
1303 | is-unicode-supported@0.1.0: {}
1304 |
1305 | is-unicode-supported@1.3.0: {}
1306 |
1307 | is-unicode-supported@2.0.0: {}
1308 |
1309 | isarray@1.0.0: {}
1310 |
1311 | isexe@2.0.0: {}
1312 |
1313 | isurl@1.0.0:
1314 | dependencies:
1315 | has-to-string-tag-x: 1.4.1
1316 | is-object: 1.0.2
1317 |
1318 | js-tokens@4.0.0: {}
1319 |
1320 | json-buffer@3.0.0: {}
1321 |
1322 | keyv@3.0.0:
1323 | dependencies:
1324 | json-buffer: 3.0.0
1325 |
1326 | lodash@4.17.21: {}
1327 |
1328 | log-symbols@4.1.0:
1329 | dependencies:
1330 | chalk: 4.1.2
1331 | is-unicode-supported: 0.1.0
1332 |
1333 | log-symbols@6.0.0:
1334 | dependencies:
1335 | chalk: 5.3.0
1336 | is-unicode-supported: 1.3.0
1337 |
1338 | loose-envify@1.4.0:
1339 | dependencies:
1340 | js-tokens: 4.0.0
1341 |
1342 | lowercase-keys@1.0.0: {}
1343 |
1344 | lowercase-keys@1.0.1: {}
1345 |
1346 | make-dir@1.3.0:
1347 | dependencies:
1348 | pify: 3.0.0
1349 |
1350 | mime-db@1.52.0: {}
1351 |
1352 | mimic-fn@2.1.0: {}
1353 |
1354 | mimic-response@1.0.1: {}
1355 |
1356 | minimatch@3.1.2:
1357 | dependencies:
1358 | brace-expansion: 1.1.11
1359 |
1360 | mute-stream@1.0.0: {}
1361 |
1362 | normalize-url@2.0.1:
1363 | dependencies:
1364 | prepend-http: 2.0.0
1365 | query-string: 5.1.1
1366 | sort-keys: 2.0.0
1367 |
1368 | npm-conf@1.1.3:
1369 | dependencies:
1370 | config-chain: 1.1.13
1371 | pify: 3.0.0
1372 |
1373 | npm-run-path@5.3.0:
1374 | dependencies:
1375 | path-key: 4.0.0
1376 |
1377 | object-assign@4.1.1: {}
1378 |
1379 | once@1.4.0:
1380 | dependencies:
1381 | wrappy: 1.0.2
1382 |
1383 | onetime@5.1.2:
1384 | dependencies:
1385 | mimic-fn: 2.1.0
1386 |
1387 | ora@5.4.1:
1388 | dependencies:
1389 | bl: 4.1.0
1390 | chalk: 4.1.2
1391 | cli-cursor: 3.1.0
1392 | cli-spinners: 2.9.2
1393 | is-interactive: 1.0.0
1394 | is-unicode-supported: 0.1.0
1395 | log-symbols: 4.1.0
1396 | strip-ansi: 6.0.1
1397 | wcwidth: 1.0.1
1398 |
1399 | ora@8.0.1:
1400 | dependencies:
1401 | chalk: 5.3.0
1402 | cli-cursor: 4.0.0
1403 | cli-spinners: 2.9.2
1404 | is-interactive: 2.0.0
1405 | is-unicode-supported: 2.0.0
1406 | log-symbols: 6.0.0
1407 | stdin-discarder: 0.2.2
1408 | string-width: 7.1.0
1409 | strip-ansi: 7.1.0
1410 |
1411 | os-tmpdir@1.0.2: {}
1412 |
1413 | p-cancelable@0.4.1: {}
1414 |
1415 | p-event@2.3.1:
1416 | dependencies:
1417 | p-timeout: 2.0.1
1418 |
1419 | p-finally@1.0.0: {}
1420 |
1421 | p-is-promise@1.1.0: {}
1422 |
1423 | p-timeout@2.0.1:
1424 | dependencies:
1425 | p-finally: 1.0.0
1426 |
1427 | parse-ms@4.0.0: {}
1428 |
1429 | path-is-absolute@1.0.1: {}
1430 |
1431 | path-key@3.1.1: {}
1432 |
1433 | path-key@4.0.0: {}
1434 |
1435 | pend@1.2.0: {}
1436 |
1437 | pify@2.3.0: {}
1438 |
1439 | pify@3.0.0: {}
1440 |
1441 | pinkie-promise@2.0.1:
1442 | dependencies:
1443 | pinkie: 2.0.4
1444 |
1445 | pinkie@2.0.4: {}
1446 |
1447 | prepend-http@2.0.0: {}
1448 |
1449 | pretty-ms@9.0.0:
1450 | dependencies:
1451 | parse-ms: 4.0.0
1452 |
1453 | process-nextick-args@2.0.1: {}
1454 |
1455 | proto-list@1.2.4: {}
1456 |
1457 | query-string@5.1.1:
1458 | dependencies:
1459 | decode-uri-component: 0.2.2
1460 | object-assign: 4.1.1
1461 | strict-uri-encode: 1.1.0
1462 |
1463 | react@18.2.0:
1464 | dependencies:
1465 | loose-envify: 1.4.0
1466 |
1467 | readable-stream@2.3.8:
1468 | dependencies:
1469 | core-util-is: 1.0.3
1470 | inherits: 2.0.4
1471 | isarray: 1.0.0
1472 | process-nextick-args: 2.0.1
1473 | safe-buffer: 5.1.2
1474 | string_decoder: 1.1.1
1475 | util-deprecate: 1.0.2
1476 |
1477 | readable-stream@3.6.2:
1478 | dependencies:
1479 | inherits: 2.0.4
1480 | string_decoder: 1.3.0
1481 | util-deprecate: 1.0.2
1482 |
1483 | responselike@1.0.2:
1484 | dependencies:
1485 | lowercase-keys: 1.0.1
1486 |
1487 | restore-cursor@3.1.0:
1488 | dependencies:
1489 | onetime: 5.1.2
1490 | signal-exit: 3.0.7
1491 |
1492 | restore-cursor@4.0.0:
1493 | dependencies:
1494 | onetime: 5.1.2
1495 | signal-exit: 3.0.7
1496 |
1497 | rimraf@3.0.2:
1498 | dependencies:
1499 | glob: 7.2.3
1500 |
1501 | run-async@3.0.0: {}
1502 |
1503 | rxjs@7.8.1:
1504 | dependencies:
1505 | tslib: 2.6.2
1506 |
1507 | safe-buffer@5.1.2: {}
1508 |
1509 | safe-buffer@5.2.1: {}
1510 |
1511 | safer-buffer@2.1.2: {}
1512 |
1513 | seek-bzip@1.0.6:
1514 | dependencies:
1515 | commander: 2.20.3
1516 |
1517 | set-function-length@1.2.0:
1518 | dependencies:
1519 | define-data-property: 1.1.1
1520 | function-bind: 1.1.2
1521 | get-intrinsic: 1.2.2
1522 | gopd: 1.0.1
1523 | has-property-descriptors: 1.0.1
1524 |
1525 | shebang-command@2.0.0:
1526 | dependencies:
1527 | shebang-regex: 3.0.0
1528 |
1529 | shebang-regex@3.0.0: {}
1530 |
1531 | signal-exit@3.0.7: {}
1532 |
1533 | signal-exit@4.1.0: {}
1534 |
1535 | sort-keys-length@1.0.1:
1536 | dependencies:
1537 | sort-keys: 1.1.2
1538 |
1539 | sort-keys@1.1.2:
1540 | dependencies:
1541 | is-plain-obj: 1.1.0
1542 |
1543 | sort-keys@2.0.0:
1544 | dependencies:
1545 | is-plain-obj: 1.1.0
1546 |
1547 | stdin-discarder@0.2.2: {}
1548 |
1549 | strict-uri-encode@1.1.0: {}
1550 |
1551 | string-width@4.2.3:
1552 | dependencies:
1553 | emoji-regex: 8.0.0
1554 | is-fullwidth-code-point: 3.0.0
1555 | strip-ansi: 6.0.1
1556 |
1557 | string-width@7.1.0:
1558 | dependencies:
1559 | emoji-regex: 10.3.0
1560 | get-east-asian-width: 1.2.0
1561 | strip-ansi: 7.1.0
1562 |
1563 | string_decoder@1.1.1:
1564 | dependencies:
1565 | safe-buffer: 5.1.2
1566 |
1567 | string_decoder@1.3.0:
1568 | dependencies:
1569 | safe-buffer: 5.2.1
1570 |
1571 | strip-ansi@6.0.1:
1572 | dependencies:
1573 | ansi-regex: 5.0.1
1574 |
1575 | strip-ansi@7.1.0:
1576 | dependencies:
1577 | ansi-regex: 6.0.1
1578 |
1579 | strip-dirs@2.1.0:
1580 | dependencies:
1581 | is-natural-number: 4.0.1
1582 |
1583 | strip-final-newline@4.0.0: {}
1584 |
1585 | strip-outer@1.0.1:
1586 | dependencies:
1587 | escape-string-regexp: 1.0.5
1588 |
1589 | supports-color@7.2.0:
1590 | dependencies:
1591 | has-flag: 4.0.0
1592 |
1593 | tar-stream@1.6.2:
1594 | dependencies:
1595 | bl: 1.2.3
1596 | buffer-alloc: 1.2.0
1597 | end-of-stream: 1.4.4
1598 | fs-constants: 1.0.0
1599 | readable-stream: 2.3.8
1600 | to-buffer: 1.1.1
1601 | xtend: 4.0.2
1602 |
1603 | through@2.3.8: {}
1604 |
1605 | timed-out@4.0.1: {}
1606 |
1607 | tmp@0.0.33:
1608 | dependencies:
1609 | os-tmpdir: 1.0.2
1610 |
1611 | to-buffer@1.1.1: {}
1612 |
1613 | trim-repeated@1.0.0:
1614 | dependencies:
1615 | escape-string-regexp: 1.0.5
1616 |
1617 | tslib@2.6.2: {}
1618 |
1619 | tunnel-agent@0.6.0:
1620 | dependencies:
1621 | safe-buffer: 5.2.1
1622 |
1623 | type-fest@0.21.3: {}
1624 |
1625 | unbzip2-stream@1.4.3:
1626 | dependencies:
1627 | buffer: 5.7.1
1628 | through: 2.3.8
1629 |
1630 | undici-types@5.26.5: {}
1631 |
1632 | url-parse-lax@3.0.0:
1633 | dependencies:
1634 | prepend-http: 2.0.0
1635 |
1636 | url-to-options@1.0.1: {}
1637 |
1638 | util-deprecate@1.0.2: {}
1639 |
1640 | wcwidth@1.0.1:
1641 | dependencies:
1642 | defaults: 1.0.4
1643 |
1644 | which@2.0.2:
1645 | dependencies:
1646 | isexe: 2.0.0
1647 |
1648 | wrap-ansi@6.2.0:
1649 | dependencies:
1650 | ansi-styles: 4.3.0
1651 | string-width: 4.2.3
1652 | strip-ansi: 6.0.1
1653 |
1654 | wrappy@1.0.2: {}
1655 |
1656 | xtend@4.0.2: {}
1657 |
1658 | yauzl@2.10.0:
1659 | dependencies:
1660 | buffer-crc32: 0.2.13
1661 | fd-slicer: 1.1.0
1662 |
1663 | yoctocolors@2.0.0: {}
1664 |
--------------------------------------------------------------------------------
/src/index.mjs:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 | import { program } from "commander";
3 |
4 | import { sync } from "./utils/commands/sync.mjs";
5 | import { init, initAction } from "./utils/commands/init.mjs";
6 |
7 | import { getPackageInfo } from "./utils/data/package-info.mjs";
8 | const { version } = getPackageInfo()
9 |
10 | const cmds = {
11 | init,
12 | sync
13 | }
14 |
15 | const isArgumentACommand = !!cmds[process.argv[2]]
16 | const isContainsHelp = process.argv.includes(a => a === "--help")
17 |
18 | program
19 | .version(
20 | version,
21 | "-v, --version",
22 | "Display the version number"
23 | )
24 | .argument("[command]")
25 | .argument("[project-name]")
26 |
27 | if (isArgumentACommand || isContainsHelp) {
28 | Object.values(cmds).forEach(cmd => {
29 | program.addCommand(cmd)
30 | })
31 | }
32 | else {
33 | program
34 | .option("-t, --template ", "Specify the template")
35 | .option("-c, --config ", "Specify the configuration file")
36 | .action(async (command, projectName, options) => {
37 | // If no command is provided, run the default command (init)
38 | await initAction(projectName, options, program);
39 | });
40 | }
41 |
42 | program.parse(process.argv);
43 |
--------------------------------------------------------------------------------
/src/utils/commands/init.mjs:
--------------------------------------------------------------------------------
1 | import { logger } from '../logger.mjs'
2 | import { Command } from "commander"
3 | import inquirer from "inquirer";
4 | // import download from "download-git-repo";
5 | import _ from "lodash";
6 | import ora from "ora";
7 | import chalk from "chalk";
8 | import path from "path";
9 | import { promises as fs } from "fs"; // Import promises version of fs for async file operations
10 |
11 | import templates from "../data/templates.mjs";
12 | import { replaceInDirectory } from "../cookie-cutting/replacer.mjs";
13 | import { addTemplateUpstream, cloneTemplate } from "../git-actions.mjs";
14 |
15 | import { DEFAULT_CONFIG_NAME } from '../data/cmg-config.mjs';
16 |
17 | import { getPackageInfo } from "../data/package-info.mjs";
18 | const { version } = getPackageInfo()
19 |
20 | export const initAction = async (name, options, program) => {
21 |
22 | let projectName = program.args[0];
23 | let gameName = projectName;
24 | let templateId = program.template;
25 | let configPath = program.config || DEFAULT_CONFIG_NAME; // Default config file path
26 | let currentRun = Date.now();
27 | let generatedAt = currentRun;
28 | let lastRunAt = currentRun;
29 |
30 | // Check if config file exists
31 | let configExists = false;
32 | try {
33 | await fs.access(configPath);
34 | configExists = true;
35 | } catch (err) {
36 | // Config file doesn't exist, continue without it
37 | }
38 |
39 | // If config file exists, read configuration from it
40 | if (configExists) {
41 | const spinner = ora(
42 | `Reading config file at ${path.join(process.cwd(), configPath)}...`
43 | ).start();
44 | const configData = await fs.readFile(configPath, "utf-8");
45 | const config = JSON.parse(configData);
46 | if (!projectName && config.projectName) projectName = config.projectName;
47 | if (!gameName && config.gameName) gameName = config.gameName;
48 | if (!templateId && config.templateId) templateId = config.templateId;
49 | if (config.generatedAt) generatedAt = config.generatedAt;
50 | spinner.succeed();
51 | }
52 |
53 | // If config file doesn't exist, prompt user for input
54 | if (!projectName) {
55 | const answersGameName = await inquirer.prompt([
56 | {
57 | type: "input",
58 | name: "gameName",
59 | message: "What will you call your game?",
60 | validate: (input) => !!input.trim(),
61 | },
62 | ]);
63 | gameName = answersGameName.gameName;
64 |
65 | const kebabCaseGameName = _.kebabCase(gameName);
66 |
67 | const answers = await inquirer.prompt([
68 | {
69 | type: "input",
70 | name: "projectName",
71 | message: "Enter the project name:",
72 | default: kebabCaseGameName,
73 | validate: (input) => !!input.trim(),
74 | },
75 | ]);
76 | projectName = answers.projectName;
77 | }
78 |
79 | if (!templateId) {
80 | const answers = await inquirer.prompt([
81 | {
82 | type: "list",
83 | name: "templateId",
84 | message: "Which template would you like to use?",
85 | choices: templates.map((template) => template.id + (template.source === "community" ? " (community)" : "")),
86 | },
87 | ]);
88 | templateId = answers.templateId.split(" ")[0]; // <-- remove any addons to the ID
89 | }
90 |
91 | const chosenTemplate = templates.find(
92 | (template) => template.id === templateId
93 | )
94 |
95 | const templateRepoUrl = chosenTemplate.repository.url;
96 | const cwd = process.cwd()
97 | const targetPath = path.join(cwd, projectName);
98 | const spinner = ora("Downloading project template...").start();
99 |
100 | try {
101 | await cloneTemplate(templateRepoUrl, projectName, cwd)
102 | }
103 | catch (err) {
104 | spinner.fail(chalk.red("Failed to download project template."));
105 | if (chosenTemplate.price === "premium") {
106 | logger.warn("This template is 👑 Premium. We're releasing Premium purchases soon at https://grayhat.studio/games/pricing. Until then, sit tight!")
107 | }
108 | else {
109 | logger.error("Couldn't clone your project. Please check your git configuration, or check if a folder with a similar name to the project you want to create already exists.");
110 | logger.log("Detailed error log:");
111 | }
112 | console.error(err);
113 | }
114 |
115 |
116 | try {
117 | const addTemplateUpstreamOutput = await addTemplateUpstream(templateRepoUrl, targetPath)
118 | // console.log("addTemplateUpstreamOutput", addTemplateUpstreamOutput);
119 | }
120 | catch(error) {
121 | if (!String(error).includes("remote upstream already exists")) {
122 | logger.error("Couldn't configure the repository properly.")
123 | logger.error(error)
124 | }
125 | }
126 |
127 | if (chosenTemplate.editable) {
128 | // Cookie cutting
129 | replaceInDirectory(targetPath, new RegExp("%projectName%", "g"), projectName);
130 | replaceInDirectory(targetPath, new RegExp("%gameName%", "g"), gameName);
131 | }
132 |
133 | spinner.succeed(chalk.green("Project template downloaded successfully."));
134 | logger.warn(`\nProject initialized at ${targetPath}`);
135 |
136 | logger.info("\nHappy coding!");
137 |
138 | // Write configuration to file
139 | const configData = {
140 | projectName,
141 | gameName,
142 | templateId,
143 | generatedAt,
144 | lastRunAt,
145 | version
146 | };
147 |
148 | let configFileWritePath = path.join(targetPath, DEFAULT_CONFIG_NAME);
149 | fs.writeFile(configFileWritePath, JSON.stringify(configData, null, 2))
150 | .then(() =>
151 | logger.success(`Configuration saved to ${configFileWritePath}`)
152 | )
153 | .catch((err) =>
154 | logger.error(`Error writing configuration file: ${err.message}`)
155 | );
156 |
157 | }
158 |
159 | export const init = new Command()
160 | .name("init")
161 | .arguments("[project-name]")
162 | .option("-t, --template ", "Specify the template")
163 | .option("-c, --config ", "Specify the configuration file")
164 | .description("Scaffold a game")
165 | .action(initAction)
166 |
--------------------------------------------------------------------------------
/src/utils/commands/sync.mjs:
--------------------------------------------------------------------------------
1 | import { logger } from "../logger.mjs";
2 | import { Command } from "commander";
3 | import {
4 | addTemplateUpstream,
5 | isGitDirty,
6 | syncTemplate,
7 | } from "../git-actions.mjs";
8 | import inquirer from "inquirer";
9 | import { getCmgConfig } from "../data/cmg-config.mjs";
10 | import templates from "../data/templates.mjs";
11 |
12 | export const syncAction = async (_, options) => {
13 | const config = getCmgConfig();
14 |
15 | // console.log("options", options.yes);
16 |
17 | try {
18 | if (!options.yes && isGitDirty()) {
19 | const answer = await inquirer.prompt({
20 | type: "confirm",
21 | name: "confirmGitDirtyProceed",
22 | message:
23 | "It seems like you haven't committed some files. Are you sure you want to proceed?",
24 | });
25 | if (!answer.confirmGitDirtyProceed) {
26 | logger.warn("Ended operation.");
27 | return;
28 | }
29 | }
30 |
31 | const output = await syncTemplate();
32 | logger.success("Sync operation complete! Here's the git output:")
33 | logger.log(output.stdout)
34 |
35 | } catch (error) {
36 | if (
37 | String(error).includes(
38 | "fatal: 'upstream' does not appear to be a git repository"
39 | )
40 | ) {
41 | try {
42 | const answer = await inquirer.prompt({
43 | type: "confirm",
44 | name: "confirmAddUpstream",
45 | message:
46 | "Your git is not configured to sync with our template. We will need to add a remote origin called 'upstream' to your git configuration. Proceed?",
47 | });
48 | if (!answer.confirmAddUpstream) {
49 | logger.warn("Ended operation.");
50 | return;
51 | }
52 | const template = templates.find(
53 | (template) => template.id === config.templateId
54 | );
55 | await addTemplateUpstream(template.repository.url);
56 | const output = await syncTemplate();
57 | logger.success("Sync with template complete! Here's the git output:")
58 | logger.log(output.stdout)
59 | } catch (error) {
60 | logger.error(error);
61 | }
62 | } else {
63 | logger.error(error);
64 | }
65 | }
66 | }
67 |
68 | export const sync = new Command()
69 | .name("sync")
70 | .description("Sync your game with the latest version of the template.")
71 | // .option("-y, --yes", "Skip confirmation prompt.", false)
72 | .action(syncAction);
73 |
--------------------------------------------------------------------------------
/src/utils/cookie-cutting/replacer.mjs:
--------------------------------------------------------------------------------
1 | import fs from 'fs';
2 | import path from 'path';
3 |
4 | function replaceInFile(filePath, search, replace) {
5 | const content = fs.readFileSync(filePath, 'utf-8');
6 | const updatedContent = content.replace(search, replace);
7 | fs.writeFileSync(filePath, updatedContent, 'utf-8');
8 | }
9 |
10 | export function replaceInDirectory(directoryPath, search, replace) {
11 | const files = fs.readdirSync(directoryPath);
12 |
13 | files.forEach((file) => {
14 | // Ignore .git folder
15 | if (file === '.git') {
16 | return;
17 | }
18 |
19 | const filePath = path.join(directoryPath, file);
20 | const stat = fs.statSync(filePath);
21 |
22 | if (stat.isDirectory()) {
23 | replaceInDirectory(filePath, search, replace);
24 | } else if (stat.isFile()) {
25 | replaceInFile(filePath, search, replace);
26 | }
27 | });
28 | }
29 |
--------------------------------------------------------------------------------
/src/utils/data/cmg-config.mjs:
--------------------------------------------------------------------------------
1 | import fs from 'fs';
2 |
3 | export const DEFAULT_CONFIG_NAME = "create-multiplayer-game.config.json";
4 |
5 | export const getCmgConfig = () => {
6 |
7 | const content = fs.readFileSync(DEFAULT_CONFIG_NAME, 'utf-8');
8 |
9 | return JSON.parse(content)
10 | }
11 |
12 |
--------------------------------------------------------------------------------
/src/utils/data/package-info.mjs:
--------------------------------------------------------------------------------
1 | import packageJson from '../../../package.json' with { type: "json" };
2 |
3 | export const getPackageInfo = () => {
4 | return packageJson
5 | }
--------------------------------------------------------------------------------
/src/utils/data/templates.mjs:
--------------------------------------------------------------------------------
1 | const templates = [
2 | {
3 | id: 'vite-react-ts',
4 | repository: {
5 | url: 'https://github.com/grayhatdevelopers/vite-react-ts-multiplayer-game',
6 | project: 'grayhatdevelopers/vite-react-ts-multiplayer-game',
7 | branch: 'main',
8 | provider: 'github',
9 | },
10 | framework: 'vite',
11 | languages: ['typescript'],
12 | packageManagers: ['npm', 'yarn', 'pnpm'],
13 | type: 'standalone',
14 | source: 'official',
15 | editable: true,
16 | price: 'free',
17 | },
18 | {
19 | id: 'next-ts',
20 | repository: {
21 | url: 'https://github.com/grayhatdevelopers/next-ts-multiplayer-game',
22 | project: 'grayhatdevelopers/next-ts-multiplayer-game',
23 | branch: 'main',
24 | provider: 'github',
25 | },
26 | framework: 'nextjs',
27 | languages: ['typescript'],
28 | packageManagers: ['npm', 'yarn', 'pnpm'],
29 | type: 'standalone',
30 | source: 'official',
31 | editable: true,
32 | price: 'free',
33 | },
34 | {
35 | id: 'vite-ts-premium',
36 | repository: {
37 | url: 'https://github.com/grayhatdevelopers/vite-ts-multiplayer-game-premium',
38 | project: 'grayhatdevelopers/vite-ts-multiplayer-game-premium',
39 | branch: 'main',
40 | provider: 'github',
41 | },
42 | framework: 'vite',
43 | languages: ['typescript'],
44 | packageManagers: ['npm', 'yarn', 'pnpm'],
45 | type: 'standalone',
46 | source: 'official',
47 | editable: true,
48 | price: 'premium',
49 | },
50 | {
51 | id: 'r3f-multiplayer-pirate-card-game',
52 | repository: {
53 | url: 'https://github.com/wass08/r3f-multiplayer-pirate-card-game',
54 | project: 'wass08/r3f-multiplayer-pirate-card-game',
55 | branch: 'main',
56 | provider: 'github',
57 | },
58 | framework: 'vite',
59 | languages: ['typescript'],
60 | packageManagers: ['npm', 'yarn', 'pnpm'],
61 | type: 'standalone',
62 | source: 'community',
63 | editable: false,
64 | price: 'free',
65 | },
66 | {
67 | id: 'discord-activity-starter',
68 | repository: {
69 | url: 'https://github.com/Hugo-Dz/discord-activity-starter',
70 | project: 'Hugo-Dz/discord-activity-starter',
71 | branch: 'main',
72 | provider: 'github',
73 | },
74 | framework: 'svelte',
75 | languages: ['typescript'],
76 | packageManagers: ['npm', 'yarn', 'pnpm'],
77 | type: 'standalone',
78 | source: 'community',
79 | editable: false,
80 | price: 'free',
81 | },
82 | {
83 | id: 'wawa-guys-starter',
84 | repository: {
85 | url: 'https://github.com/wass08/wawa-guys-starter',
86 | project: 'wass08/wawa-guys-starter',
87 | branch: 'main',
88 | provider: 'github',
89 | },
90 | framework: 'svelte',
91 | languages: ['typescript'],
92 | packageManagers: ['npm', 'yarn', 'pnpm'],
93 | type: 'standalone',
94 | source: 'community',
95 | editable: false,
96 | price: 'free',
97 | },
98 | ];
99 |
100 | export default templates
--------------------------------------------------------------------------------
/src/utils/git-actions.mjs:
--------------------------------------------------------------------------------
1 | import {$} from 'execa';
2 |
3 | export const cloneTemplate = async (url, name = "", path = undefined) => {
4 | if (path) process.chdir(path)
5 | const cloned = await $`git clone ${url} ${name}`;
6 | await $`chmod -R 777 ./${name} `;
7 | return cloned
8 | }
9 |
10 | export const addTemplateUpstream = async (url, path = undefined) => {
11 | if (path) process.chdir(path)
12 | return await $`git remote add upstream ${url}`;
13 | }
14 |
15 | export const isGitDirty = async (path = undefined) => {
16 | if (path) process.chdir(path)
17 | const output = await $`git status --porcelain`;
18 | return !!output
19 | }
20 |
21 | export const syncTemplate = async(path = undefined) => {
22 | if (path) process.chdir(path)
23 | return await $`git pull upstream main`;
24 | }
--------------------------------------------------------------------------------
/src/utils/logger.mjs:
--------------------------------------------------------------------------------
1 | import chalk from "chalk"
2 |
3 | export const logger = {
4 | error(...args) {
5 | console.error(chalk.red(...args))
6 | },
7 | warn(...args) {
8 | console.warn(chalk.yellow(...args))
9 | },
10 | info(...args) {
11 | console.info(chalk.cyan(...args))
12 | },
13 | success(...args) {
14 | console.log(chalk.green(...args))
15 | },
16 | log(...args) {
17 | console.log(...args)
18 | },
19 | break() {
20 | console.log("")
21 | },
22 | }
--------------------------------------------------------------------------------