├── .github └── workflows │ ├── ci.yml │ └── cla.yml ├── .gitignore ├── console.js ├── create-project.js ├── index.js ├── package-lock.json ├── package.json ├── readme.md └── test └── index-test.js /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Node CI 2 | 3 | # Push tests commits; pull_request tests PR merges 4 | on: [ push, pull_request ] 5 | 6 | defaults: 7 | run: 8 | shell: bash 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | strategy: 14 | matrix: 15 | node-version: [ 16.x, 18.x, 20.x ] 16 | os: [ windows-latest, ubuntu-latest, macOS-latest ] 17 | steps: 18 | - name: Check out repo 19 | uses: actions/checkout@v4 20 | - name: Set up Node.js 21 | uses: actions/setup-node@v4 22 | with: 23 | node-version: ${{ matrix.node-version }} 24 | - name: Env 25 | run: | 26 | echo "Event name: ${{ github.event_name }}" 27 | echo "Git ref: ${{ github.ref }}" 28 | echo "GH actor: ${{ github.actor }}" 29 | echo "SHA: ${{ github.sha }}" 30 | VER=`node --version`; echo "Node ver: $VER" 31 | VER=`npm --version`; echo "npm ver: $VER" 32 | - name: Install 33 | run: npm install 34 | - name: Test 35 | run: npm test 36 | 37 | # ----- Only git tag testing + package publishing beyond this point ----- # 38 | 39 | # Publish to package registries 40 | publish: 41 | # Setup 42 | if: startsWith(github.ref, 'refs/tags/v') 43 | runs-on: ubuntu-latest 44 | 45 | # Go 46 | steps: 47 | - name: Check out repo 48 | uses: actions/checkout@v4 49 | 50 | - name: Set up Node.js 51 | uses: actions/setup-node@v4 52 | with: 53 | node-version: 16 54 | registry-url: https://registry.npmjs.org/ 55 | 56 | # npm i 57 | - name: Install dependencies 58 | run: npm i 59 | 60 | # Publish to npm 61 | - name: Publish @RC to npm 62 | if: contains(github.ref, 'RC') 63 | run: npm publish --tag RC --access public 64 | env: 65 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 66 | 67 | - name: Publish @latest to npm 68 | if: contains(github.ref, 'RC') == false 69 | run: npm publish --access public 70 | env: 71 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 72 | -------------------------------------------------------------------------------- /.github/workflows/cla.yml: -------------------------------------------------------------------------------- 1 | name: "CLA Assistant" 2 | on: 3 | issue_comment: 4 | types: [created] 5 | pull_request_target: 6 | types: [opened,closed,synchronize] 7 | 8 | permissions: 9 | actions: write 10 | contents: write 11 | pull-requests: write 12 | statuses: write 13 | 14 | jobs: 15 | CLAAssistant: 16 | runs-on: ubuntu-latest 17 | steps: 18 | - name: "CLA Assistant" 19 | if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target' 20 | uses: contributor-assistant/github-action@v2.4.0 21 | env: 22 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 23 | PERSONAL_ACCESS_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} 24 | with: 25 | path-to-signatures: 'signatures/v1/cla.json' 26 | path-to-document: 'https://github.com/enhance-dev/.github/blob/main/CLA.md' 27 | branch: 'main' 28 | allowlist: brianleroux,colepeters,kristoferjoseph,macdonst,ryanbethel,ryanblock,tbeseda 29 | remote-organization-name: enhance-dev 30 | remote-repository-name: .github 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | template/ 3 | test/test-app 4 | -------------------------------------------------------------------------------- /console.js: -------------------------------------------------------------------------------- 1 | // silly helpers 2 | const red = msg => console.log('\x1b[31m%s\x1b[0m', msg) 3 | const green = msg => console.log('\x1b[32m%s\x1b[0m', msg) 4 | const grey = msg => console.log('\x1b[2m%s\x1b[0m', msg) 5 | const cyan = msg => console.log('\x1b[1m\x1b[36m%s\x1b[0m', msg) 6 | 7 | export function success ({ path, dest }) { 8 | green(`\nCreated ${ dest }\n`) 9 | grey('--- to get started run the following commands ---') 10 | cyan(`cd ${ path }`) 11 | cyan('npm install') 12 | cyan('npm start') 13 | console.log('') 14 | } 15 | 16 | export function failure ({ path, message }) { 17 | red(`\nFailed to create! ${ path || '' }\n`) 18 | grey(message) 19 | console.log('') 20 | } 21 | -------------------------------------------------------------------------------- /create-project.js: -------------------------------------------------------------------------------- 1 | import { createRequire } from 'module' 2 | import { isAbsolute, join, resolve } from 'path' 3 | import fs from 'fs' 4 | import git from 'isomorphic-git' 5 | import parse from '@architect/parser' 6 | 7 | const { existsSync, lstatSync, readFileSync, renameSync, rmSync, unlinkSync, writeFileSync } = fs 8 | 9 | const require = createRequire(import.meta.url) 10 | 11 | export const STARTER_PROJECT = 'https://github.com/enhance-dev/enhance-starter-project' 12 | 13 | export async function createProject ({ dest, path, name, template = STARTER_PROJECT }) { 14 | let looseName = /^[a-z][a-zA-Z0-9-_]+$/ 15 | let appName = 'my-enhance-app' 16 | if (name) { 17 | appName = name 18 | } else if (path) { 19 | const parts = path.trim().split('/') 20 | appName = parts[parts.length - 1] 21 | } 22 | 23 | if (!looseName.test(appName)) { 24 | throw Error('Invalid app name') 25 | } 26 | 27 | if (template) { 28 | try { 29 | new URL(template) 30 | } catch (error) { 31 | throw Error('Invalid template URL') 32 | } 33 | } 34 | 35 | // Project folder 36 | const projectDir = isAbsolute(dest) ? dest : resolve(dest) 37 | if (existsSync(projectDir)) { 38 | throw Error('Path already exists.') 39 | } 40 | 41 | await createFromTemplate(projectDir, dest, appName, template) 42 | } 43 | 44 | async function createFromTemplate(projectDir, dest, appName, template) { 45 | const http = require('isomorphic-git/http/node') 46 | try { 47 | // Clone the template project 48 | await git.clone({ fs, http, dir: projectDir, url: template }) 49 | 50 | // Check 51 | if (!existsSync(join(projectDir, '.arc')) && !existsSync(join(projectDir, 'app.arc')) ) { 52 | throw Error('Invalid Enhance template') 53 | } 54 | 55 | // Remove git folders 56 | remove(join(projectDir, '.git')) 57 | remove(join(projectDir, '.github')) 58 | 59 | // Clean up miscellaneous starter project files 60 | if (template === STARTER_PROJECT) { 61 | cleanStarterProject(projectDir) 62 | } 63 | 64 | updatePackageJson(dest, appName) 65 | updateArcFile(dest, appName) 66 | } catch (err) { 67 | throw Error('Unable to create project', err) 68 | } 69 | } 70 | 71 | function cleanStarterProject(projectDir) { 72 | renameSync(join(projectDir, 'template.gitignore'), join(projectDir, '.gitignore')) 73 | remove(join(projectDir, '.npmignore')) 74 | remove(join(projectDir, '.npmrc')) 75 | remove(join(projectDir, 'LICENSE')) 76 | remove(join(projectDir, 'manifest.json')) 77 | remove(join(projectDir, 'readme.md')) 78 | remove(join(projectDir, 'scripts')) 79 | } 80 | 81 | function remove(filePath) { 82 | if (existsSync(filePath)) { 83 | if (lstatSync(filePath).isDirectory()) { 84 | rmSync(filePath, { recursive: true, force: true }); 85 | } else { 86 | unlinkSync(filePath) 87 | } 88 | } 89 | } 90 | 91 | function updatePackageJson(dest, appName) { 92 | const pkgFile = require(join(dest, 'package.json')) 93 | pkgFile.name = appName 94 | pkgFile.version = '0.0.1' 95 | const newPkgFile = Object.assign({ 96 | name: null, 97 | version: null, 98 | scripts: null, 99 | dependencies: null, 100 | devDependencies: null, 101 | }, 102 | pkgFile) 103 | 104 | writeFileSync( 105 | join(dest, 'package.json'), 106 | JSON.stringify(newPkgFile, null, 2), 107 | ) 108 | } 109 | 110 | function updateArcFile(dest, appName) { 111 | const arcFilePath = existsSync(join(dest, '.arc')) ? join(dest, '.arc') : join(dest, 'app.arc') 112 | const text = readFileSync(arcFilePath, 'utf8').toString() 113 | const result = parse(text) 114 | let arcFile = result.app.length === 1 && result.app[0] ? text.replace(result.app[0], appName) : text 115 | 116 | writeFileSync(arcFilePath, arcFile) 117 | } 118 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | // executed in userland 3 | import process from 'process' 4 | import { resolve } from 'path' 5 | 6 | import { failure, success } from './console.js' 7 | import { createProject, STARTER_PROJECT } from './create-project.js' 8 | 9 | const args = process.argv.slice(2, process.argv.length) 10 | const path = args[0] 11 | const template = args[1] !== '-y' ? args[1] : STARTER_PROJECT 12 | 13 | if (!path) { 14 | throw Error('Missing path. Pass a pathname to create a new project.') 15 | } 16 | 17 | const dest = resolve(process.cwd(), path) 18 | 19 | try { 20 | await createProject({ path, dest, template }) 21 | success({ path, dest }) 22 | } 23 | catch (e) { 24 | failure({ path, message: e.message }) 25 | process.exit(1) 26 | } 27 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@enhance/create", 3 | "version": "4.1.4", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@enhance/create", 9 | "version": "4.1.4", 10 | "dependencies": { 11 | "@architect/parser": "^6.0.3", 12 | "isomorphic-git": "^1.25.6" 13 | }, 14 | "bin": { 15 | "enhance-create": "index.js" 16 | }, 17 | "devDependencies": { 18 | "tap-arc": "^0.3.5", 19 | "tape": "^5.6.3" 20 | }, 21 | "engines": { 22 | "node": ">=14" 23 | } 24 | }, 25 | "node_modules/@architect/parser": { 26 | "version": "6.0.3", 27 | "resolved": "https://registry.npmjs.org/@architect/parser/-/parser-6.0.3.tgz", 28 | "integrity": "sha512-g03zlsXO0YBVMDFbXHRL3JpVpru4kUeaQIe53tNhs1C9+fMguNCSWq1tNSmwqhBYq43O/R3hleg8VSOI0NFwgA==", 29 | "engines": { 30 | "node": ">=14" 31 | } 32 | }, 33 | "node_modules/ansi-regex": { 34 | "version": "5.0.1", 35 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 36 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 37 | "dev": true, 38 | "engines": { 39 | "node": ">=8" 40 | } 41 | }, 42 | "node_modules/array.prototype.every": { 43 | "version": "1.1.4", 44 | "resolved": "https://registry.npmjs.org/array.prototype.every/-/array.prototype.every-1.1.4.tgz", 45 | "integrity": "sha512-Aui35iRZk1HHLRAyF7QP0KAnOnduaQ6fo6k1NVWfRc0xTs2AZ70ytlXvOmkC6Di4JmUs2Wv3DYzGtCQFSk5uGg==", 46 | "dev": true, 47 | "dependencies": { 48 | "call-bind": "^1.0.2", 49 | "define-properties": "^1.1.4", 50 | "es-abstract": "^1.20.4", 51 | "is-string": "^1.0.7" 52 | }, 53 | "engines": { 54 | "node": ">= 0.4" 55 | }, 56 | "funding": { 57 | "url": "https://github.com/sponsors/ljharb" 58 | } 59 | }, 60 | "node_modules/async-lock": { 61 | "version": "1.4.1", 62 | "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", 63 | "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==" 64 | }, 65 | "node_modules/available-typed-arrays": { 66 | "version": "1.0.5", 67 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 68 | "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", 69 | "dev": true, 70 | "engines": { 71 | "node": ">= 0.4" 72 | }, 73 | "funding": { 74 | "url": "https://github.com/sponsors/ljharb" 75 | } 76 | }, 77 | "node_modules/balanced-match": { 78 | "version": "1.0.2", 79 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 80 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 81 | "dev": true 82 | }, 83 | "node_modules/call-bind": { 84 | "version": "1.0.2", 85 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 86 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 87 | "dev": true, 88 | "dependencies": { 89 | "function-bind": "^1.1.1", 90 | "get-intrinsic": "^1.0.2" 91 | }, 92 | "funding": { 93 | "url": "https://github.com/sponsors/ljharb" 94 | } 95 | }, 96 | "node_modules/clean-git-ref": { 97 | "version": "2.0.1", 98 | "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", 99 | "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==" 100 | }, 101 | "node_modules/concat-map": { 102 | "version": "0.0.1", 103 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 104 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 105 | "dev": true 106 | }, 107 | "node_modules/crc-32": { 108 | "version": "1.2.2", 109 | "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", 110 | "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", 111 | "bin": { 112 | "crc32": "bin/crc32.njs" 113 | }, 114 | "engines": { 115 | "node": ">=0.8" 116 | } 117 | }, 118 | "node_modules/decompress-response": { 119 | "version": "6.0.0", 120 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 121 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 122 | "dependencies": { 123 | "mimic-response": "^3.1.0" 124 | }, 125 | "engines": { 126 | "node": ">=10" 127 | }, 128 | "funding": { 129 | "url": "https://github.com/sponsors/sindresorhus" 130 | } 131 | }, 132 | "node_modules/deep-equal": { 133 | "version": "2.2.0", 134 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", 135 | "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", 136 | "dev": true, 137 | "dependencies": { 138 | "call-bind": "^1.0.2", 139 | "es-get-iterator": "^1.1.2", 140 | "get-intrinsic": "^1.1.3", 141 | "is-arguments": "^1.1.1", 142 | "is-array-buffer": "^3.0.1", 143 | "is-date-object": "^1.0.5", 144 | "is-regex": "^1.1.4", 145 | "is-shared-array-buffer": "^1.0.2", 146 | "isarray": "^2.0.5", 147 | "object-is": "^1.1.5", 148 | "object-keys": "^1.1.1", 149 | "object.assign": "^4.1.4", 150 | "regexp.prototype.flags": "^1.4.3", 151 | "side-channel": "^1.0.4", 152 | "which-boxed-primitive": "^1.0.2", 153 | "which-collection": "^1.0.1", 154 | "which-typed-array": "^1.1.9" 155 | }, 156 | "funding": { 157 | "url": "https://github.com/sponsors/ljharb" 158 | } 159 | }, 160 | "node_modules/define-properties": { 161 | "version": "1.1.4", 162 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", 163 | "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", 164 | "dev": true, 165 | "dependencies": { 166 | "has-property-descriptors": "^1.0.0", 167 | "object-keys": "^1.1.1" 168 | }, 169 | "engines": { 170 | "node": ">= 0.4" 171 | }, 172 | "funding": { 173 | "url": "https://github.com/sponsors/ljharb" 174 | } 175 | }, 176 | "node_modules/defined": { 177 | "version": "1.0.1", 178 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", 179 | "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", 180 | "dev": true, 181 | "funding": { 182 | "url": "https://github.com/sponsors/ljharb" 183 | } 184 | }, 185 | "node_modules/diff": { 186 | "version": "4.0.2", 187 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 188 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 189 | "dev": true, 190 | "engines": { 191 | "node": ">=0.3.1" 192 | } 193 | }, 194 | "node_modules/diff3": { 195 | "version": "0.0.3", 196 | "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", 197 | "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==" 198 | }, 199 | "node_modules/dotignore": { 200 | "version": "0.1.2", 201 | "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", 202 | "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", 203 | "dev": true, 204 | "dependencies": { 205 | "minimatch": "^3.0.4" 206 | }, 207 | "bin": { 208 | "ignored": "bin/ignored" 209 | } 210 | }, 211 | "node_modules/dotignore/node_modules/brace-expansion": { 212 | "version": "1.1.11", 213 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 214 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 215 | "dev": true, 216 | "dependencies": { 217 | "balanced-match": "^1.0.0", 218 | "concat-map": "0.0.1" 219 | } 220 | }, 221 | "node_modules/dotignore/node_modules/minimatch": { 222 | "version": "3.1.2", 223 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 224 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 225 | "dev": true, 226 | "dependencies": { 227 | "brace-expansion": "^1.1.7" 228 | }, 229 | "engines": { 230 | "node": "*" 231 | } 232 | }, 233 | "node_modules/es-abstract": { 234 | "version": "1.20.5", 235 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", 236 | "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", 237 | "dev": true, 238 | "dependencies": { 239 | "call-bind": "^1.0.2", 240 | "es-to-primitive": "^1.2.1", 241 | "function-bind": "^1.1.1", 242 | "function.prototype.name": "^1.1.5", 243 | "get-intrinsic": "^1.1.3", 244 | "get-symbol-description": "^1.0.0", 245 | "gopd": "^1.0.1", 246 | "has": "^1.0.3", 247 | "has-property-descriptors": "^1.0.0", 248 | "has-symbols": "^1.0.3", 249 | "internal-slot": "^1.0.3", 250 | "is-callable": "^1.2.7", 251 | "is-negative-zero": "^2.0.2", 252 | "is-regex": "^1.1.4", 253 | "is-shared-array-buffer": "^1.0.2", 254 | "is-string": "^1.0.7", 255 | "is-weakref": "^1.0.2", 256 | "object-inspect": "^1.12.2", 257 | "object-keys": "^1.1.1", 258 | "object.assign": "^4.1.4", 259 | "regexp.prototype.flags": "^1.4.3", 260 | "safe-regex-test": "^1.0.0", 261 | "string.prototype.trimend": "^1.0.6", 262 | "string.prototype.trimstart": "^1.0.6", 263 | "unbox-primitive": "^1.0.2" 264 | }, 265 | "engines": { 266 | "node": ">= 0.4" 267 | }, 268 | "funding": { 269 | "url": "https://github.com/sponsors/ljharb" 270 | } 271 | }, 272 | "node_modules/es-get-iterator": { 273 | "version": "1.1.3", 274 | "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", 275 | "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", 276 | "dev": true, 277 | "dependencies": { 278 | "call-bind": "^1.0.2", 279 | "get-intrinsic": "^1.1.3", 280 | "has-symbols": "^1.0.3", 281 | "is-arguments": "^1.1.1", 282 | "is-map": "^2.0.2", 283 | "is-set": "^2.0.2", 284 | "is-string": "^1.0.7", 285 | "isarray": "^2.0.5", 286 | "stop-iteration-iterator": "^1.0.0" 287 | }, 288 | "funding": { 289 | "url": "https://github.com/sponsors/ljharb" 290 | } 291 | }, 292 | "node_modules/es-to-primitive": { 293 | "version": "1.2.1", 294 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 295 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 296 | "dev": true, 297 | "dependencies": { 298 | "is-callable": "^1.1.4", 299 | "is-date-object": "^1.0.1", 300 | "is-symbol": "^1.0.2" 301 | }, 302 | "engines": { 303 | "node": ">= 0.4" 304 | }, 305 | "funding": { 306 | "url": "https://github.com/sponsors/ljharb" 307 | } 308 | }, 309 | "node_modules/events-to-array": { 310 | "version": "1.1.2", 311 | "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", 312 | "integrity": "sha512-inRWzRY7nG+aXZxBzEqYKB3HPgwflZRopAjDCHv0whhRx+MTUr1ei0ICZUypdyE0HRm4L2d5VEcIqLD6yl+BFA==", 313 | "dev": true 314 | }, 315 | "node_modules/for-each": { 316 | "version": "0.3.3", 317 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 318 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 319 | "dev": true, 320 | "dependencies": { 321 | "is-callable": "^1.1.3" 322 | } 323 | }, 324 | "node_modules/fs.realpath": { 325 | "version": "1.0.0", 326 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 327 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 328 | "dev": true 329 | }, 330 | "node_modules/function-bind": { 331 | "version": "1.1.1", 332 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 333 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 334 | "dev": true 335 | }, 336 | "node_modules/function.prototype.name": { 337 | "version": "1.1.5", 338 | "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", 339 | "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", 340 | "dev": true, 341 | "dependencies": { 342 | "call-bind": "^1.0.2", 343 | "define-properties": "^1.1.3", 344 | "es-abstract": "^1.19.0", 345 | "functions-have-names": "^1.2.2" 346 | }, 347 | "engines": { 348 | "node": ">= 0.4" 349 | }, 350 | "funding": { 351 | "url": "https://github.com/sponsors/ljharb" 352 | } 353 | }, 354 | "node_modules/functions-have-names": { 355 | "version": "1.2.3", 356 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 357 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 358 | "dev": true, 359 | "funding": { 360 | "url": "https://github.com/sponsors/ljharb" 361 | } 362 | }, 363 | "node_modules/get-intrinsic": { 364 | "version": "1.1.3", 365 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", 366 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", 367 | "dev": true, 368 | "dependencies": { 369 | "function-bind": "^1.1.1", 370 | "has": "^1.0.3", 371 | "has-symbols": "^1.0.3" 372 | }, 373 | "funding": { 374 | "url": "https://github.com/sponsors/ljharb" 375 | } 376 | }, 377 | "node_modules/get-package-type": { 378 | "version": "0.1.0", 379 | "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", 380 | "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", 381 | "dev": true, 382 | "engines": { 383 | "node": ">=8.0.0" 384 | } 385 | }, 386 | "node_modules/get-symbol-description": { 387 | "version": "1.0.0", 388 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", 389 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", 390 | "dev": true, 391 | "dependencies": { 392 | "call-bind": "^1.0.2", 393 | "get-intrinsic": "^1.1.1" 394 | }, 395 | "engines": { 396 | "node": ">= 0.4" 397 | }, 398 | "funding": { 399 | "url": "https://github.com/sponsors/ljharb" 400 | } 401 | }, 402 | "node_modules/gopd": { 403 | "version": "1.0.1", 404 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 405 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 406 | "dev": true, 407 | "dependencies": { 408 | "get-intrinsic": "^1.1.3" 409 | }, 410 | "funding": { 411 | "url": "https://github.com/sponsors/ljharb" 412 | } 413 | }, 414 | "node_modules/has": { 415 | "version": "1.0.3", 416 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 417 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 418 | "dev": true, 419 | "dependencies": { 420 | "function-bind": "^1.1.1" 421 | }, 422 | "engines": { 423 | "node": ">= 0.4.0" 424 | } 425 | }, 426 | "node_modules/has-bigints": { 427 | "version": "1.0.2", 428 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", 429 | "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", 430 | "dev": true, 431 | "funding": { 432 | "url": "https://github.com/sponsors/ljharb" 433 | } 434 | }, 435 | "node_modules/has-dynamic-import": { 436 | "version": "2.0.1", 437 | "resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.0.1.tgz", 438 | "integrity": "sha512-X3fbtsZmwb6W7fJGR9o7x65fZoodygCrZ3TVycvghP62yYQfS0t4RS0Qcz+j5tQYUKeSWS09tHkWW6WhFV3XhQ==", 439 | "dev": true, 440 | "dependencies": { 441 | "call-bind": "^1.0.2", 442 | "get-intrinsic": "^1.1.1" 443 | }, 444 | "funding": { 445 | "url": "https://github.com/sponsors/ljharb" 446 | } 447 | }, 448 | "node_modules/has-property-descriptors": { 449 | "version": "1.0.0", 450 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", 451 | "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", 452 | "dev": true, 453 | "dependencies": { 454 | "get-intrinsic": "^1.1.1" 455 | }, 456 | "funding": { 457 | "url": "https://github.com/sponsors/ljharb" 458 | } 459 | }, 460 | "node_modules/has-symbols": { 461 | "version": "1.0.3", 462 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 463 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 464 | "dev": true, 465 | "engines": { 466 | "node": ">= 0.4" 467 | }, 468 | "funding": { 469 | "url": "https://github.com/sponsors/ljharb" 470 | } 471 | }, 472 | "node_modules/has-tostringtag": { 473 | "version": "1.0.0", 474 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 475 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 476 | "dev": true, 477 | "dependencies": { 478 | "has-symbols": "^1.0.2" 479 | }, 480 | "engines": { 481 | "node": ">= 0.4" 482 | }, 483 | "funding": { 484 | "url": "https://github.com/sponsors/ljharb" 485 | } 486 | }, 487 | "node_modules/ignore": { 488 | "version": "5.3.1", 489 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", 490 | "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", 491 | "engines": { 492 | "node": ">= 4" 493 | } 494 | }, 495 | "node_modules/inflight": { 496 | "version": "1.0.6", 497 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 498 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 499 | "dev": true, 500 | "dependencies": { 501 | "once": "^1.3.0", 502 | "wrappy": "1" 503 | } 504 | }, 505 | "node_modules/inherits": { 506 | "version": "2.0.4", 507 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 508 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 509 | }, 510 | "node_modules/internal-slot": { 511 | "version": "1.0.4", 512 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", 513 | "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", 514 | "dev": true, 515 | "dependencies": { 516 | "get-intrinsic": "^1.1.3", 517 | "has": "^1.0.3", 518 | "side-channel": "^1.0.4" 519 | }, 520 | "engines": { 521 | "node": ">= 0.4" 522 | } 523 | }, 524 | "node_modules/is-arguments": { 525 | "version": "1.1.1", 526 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 527 | "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 528 | "dev": true, 529 | "dependencies": { 530 | "call-bind": "^1.0.2", 531 | "has-tostringtag": "^1.0.0" 532 | }, 533 | "engines": { 534 | "node": ">= 0.4" 535 | }, 536 | "funding": { 537 | "url": "https://github.com/sponsors/ljharb" 538 | } 539 | }, 540 | "node_modules/is-array-buffer": { 541 | "version": "3.0.1", 542 | "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", 543 | "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", 544 | "dev": true, 545 | "dependencies": { 546 | "call-bind": "^1.0.2", 547 | "get-intrinsic": "^1.1.3", 548 | "is-typed-array": "^1.1.10" 549 | }, 550 | "funding": { 551 | "url": "https://github.com/sponsors/ljharb" 552 | } 553 | }, 554 | "node_modules/is-bigint": { 555 | "version": "1.0.4", 556 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 557 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 558 | "dev": true, 559 | "dependencies": { 560 | "has-bigints": "^1.0.1" 561 | }, 562 | "funding": { 563 | "url": "https://github.com/sponsors/ljharb" 564 | } 565 | }, 566 | "node_modules/is-boolean-object": { 567 | "version": "1.1.2", 568 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 569 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 570 | "dev": true, 571 | "dependencies": { 572 | "call-bind": "^1.0.2", 573 | "has-tostringtag": "^1.0.0" 574 | }, 575 | "engines": { 576 | "node": ">= 0.4" 577 | }, 578 | "funding": { 579 | "url": "https://github.com/sponsors/ljharb" 580 | } 581 | }, 582 | "node_modules/is-callable": { 583 | "version": "1.2.7", 584 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 585 | "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 586 | "dev": true, 587 | "engines": { 588 | "node": ">= 0.4" 589 | }, 590 | "funding": { 591 | "url": "https://github.com/sponsors/ljharb" 592 | } 593 | }, 594 | "node_modules/is-core-module": { 595 | "version": "2.11.0", 596 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 597 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 598 | "dev": true, 599 | "dependencies": { 600 | "has": "^1.0.3" 601 | }, 602 | "funding": { 603 | "url": "https://github.com/sponsors/ljharb" 604 | } 605 | }, 606 | "node_modules/is-date-object": { 607 | "version": "1.0.5", 608 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 609 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 610 | "dev": true, 611 | "dependencies": { 612 | "has-tostringtag": "^1.0.0" 613 | }, 614 | "engines": { 615 | "node": ">= 0.4" 616 | }, 617 | "funding": { 618 | "url": "https://github.com/sponsors/ljharb" 619 | } 620 | }, 621 | "node_modules/is-map": { 622 | "version": "2.0.2", 623 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", 624 | "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", 625 | "dev": true, 626 | "funding": { 627 | "url": "https://github.com/sponsors/ljharb" 628 | } 629 | }, 630 | "node_modules/is-negative-zero": { 631 | "version": "2.0.2", 632 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", 633 | "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", 634 | "dev": true, 635 | "engines": { 636 | "node": ">= 0.4" 637 | }, 638 | "funding": { 639 | "url": "https://github.com/sponsors/ljharb" 640 | } 641 | }, 642 | "node_modules/is-number-object": { 643 | "version": "1.0.7", 644 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", 645 | "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", 646 | "dev": true, 647 | "dependencies": { 648 | "has-tostringtag": "^1.0.0" 649 | }, 650 | "engines": { 651 | "node": ">= 0.4" 652 | }, 653 | "funding": { 654 | "url": "https://github.com/sponsors/ljharb" 655 | } 656 | }, 657 | "node_modules/is-regex": { 658 | "version": "1.1.4", 659 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 660 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 661 | "dev": true, 662 | "dependencies": { 663 | "call-bind": "^1.0.2", 664 | "has-tostringtag": "^1.0.0" 665 | }, 666 | "engines": { 667 | "node": ">= 0.4" 668 | }, 669 | "funding": { 670 | "url": "https://github.com/sponsors/ljharb" 671 | } 672 | }, 673 | "node_modules/is-set": { 674 | "version": "2.0.2", 675 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", 676 | "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", 677 | "dev": true, 678 | "funding": { 679 | "url": "https://github.com/sponsors/ljharb" 680 | } 681 | }, 682 | "node_modules/is-shared-array-buffer": { 683 | "version": "1.0.2", 684 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", 685 | "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", 686 | "dev": true, 687 | "dependencies": { 688 | "call-bind": "^1.0.2" 689 | }, 690 | "funding": { 691 | "url": "https://github.com/sponsors/ljharb" 692 | } 693 | }, 694 | "node_modules/is-string": { 695 | "version": "1.0.7", 696 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 697 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 698 | "dev": true, 699 | "dependencies": { 700 | "has-tostringtag": "^1.0.0" 701 | }, 702 | "engines": { 703 | "node": ">= 0.4" 704 | }, 705 | "funding": { 706 | "url": "https://github.com/sponsors/ljharb" 707 | } 708 | }, 709 | "node_modules/is-symbol": { 710 | "version": "1.0.4", 711 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 712 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 713 | "dev": true, 714 | "dependencies": { 715 | "has-symbols": "^1.0.2" 716 | }, 717 | "engines": { 718 | "node": ">= 0.4" 719 | }, 720 | "funding": { 721 | "url": "https://github.com/sponsors/ljharb" 722 | } 723 | }, 724 | "node_modules/is-typed-array": { 725 | "version": "1.1.10", 726 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", 727 | "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", 728 | "dev": true, 729 | "dependencies": { 730 | "available-typed-arrays": "^1.0.5", 731 | "call-bind": "^1.0.2", 732 | "for-each": "^0.3.3", 733 | "gopd": "^1.0.1", 734 | "has-tostringtag": "^1.0.0" 735 | }, 736 | "engines": { 737 | "node": ">= 0.4" 738 | }, 739 | "funding": { 740 | "url": "https://github.com/sponsors/ljharb" 741 | } 742 | }, 743 | "node_modules/is-weakmap": { 744 | "version": "2.0.1", 745 | "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", 746 | "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", 747 | "dev": true, 748 | "funding": { 749 | "url": "https://github.com/sponsors/ljharb" 750 | } 751 | }, 752 | "node_modules/is-weakref": { 753 | "version": "1.0.2", 754 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", 755 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", 756 | "dev": true, 757 | "dependencies": { 758 | "call-bind": "^1.0.2" 759 | }, 760 | "funding": { 761 | "url": "https://github.com/sponsors/ljharb" 762 | } 763 | }, 764 | "node_modules/is-weakset": { 765 | "version": "2.0.2", 766 | "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", 767 | "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", 768 | "dev": true, 769 | "dependencies": { 770 | "call-bind": "^1.0.2", 771 | "get-intrinsic": "^1.1.1" 772 | }, 773 | "funding": { 774 | "url": "https://github.com/sponsors/ljharb" 775 | } 776 | }, 777 | "node_modules/isarray": { 778 | "version": "2.0.5", 779 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 780 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 781 | "dev": true 782 | }, 783 | "node_modules/isomorphic-git": { 784 | "version": "1.25.6", 785 | "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.25.6.tgz", 786 | "integrity": "sha512-zA3k3QOO7doqOnBgwsaXJwHKSIIl5saEdH4xxalu082WHVES4KghsG6RE2SDwjXMCIlNa1bWocbitH6bRIrmLQ==", 787 | "dependencies": { 788 | "async-lock": "^1.1.0", 789 | "clean-git-ref": "^2.0.1", 790 | "crc-32": "^1.2.0", 791 | "diff3": "0.0.3", 792 | "ignore": "^5.1.4", 793 | "minimisted": "^2.0.0", 794 | "pako": "^1.0.10", 795 | "pify": "^4.0.1", 796 | "readable-stream": "^3.4.0", 797 | "sha.js": "^2.4.9", 798 | "simple-get": "^4.0.1" 799 | }, 800 | "bin": { 801 | "isogit": "cli.cjs" 802 | }, 803 | "engines": { 804 | "node": ">=12" 805 | } 806 | }, 807 | "node_modules/json5": { 808 | "version": "2.2.2", 809 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", 810 | "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", 811 | "dev": true, 812 | "bin": { 813 | "json5": "lib/cli.js" 814 | }, 815 | "engines": { 816 | "node": ">=6" 817 | } 818 | }, 819 | "node_modules/mimic-response": { 820 | "version": "3.1.0", 821 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 822 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 823 | "engines": { 824 | "node": ">=10" 825 | }, 826 | "funding": { 827 | "url": "https://github.com/sponsors/sindresorhus" 828 | } 829 | }, 830 | "node_modules/minimist": { 831 | "version": "1.2.7", 832 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", 833 | "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", 834 | "funding": { 835 | "url": "https://github.com/sponsors/ljharb" 836 | } 837 | }, 838 | "node_modules/minimisted": { 839 | "version": "2.0.1", 840 | "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", 841 | "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==", 842 | "dependencies": { 843 | "minimist": "^1.2.5" 844 | } 845 | }, 846 | "node_modules/minipass": { 847 | "version": "3.3.6", 848 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 849 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 850 | "dev": true, 851 | "dependencies": { 852 | "yallist": "^4.0.0" 853 | }, 854 | "engines": { 855 | "node": ">=8" 856 | } 857 | }, 858 | "node_modules/object-inspect": { 859 | "version": "1.12.3", 860 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 861 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 862 | "dev": true, 863 | "funding": { 864 | "url": "https://github.com/sponsors/ljharb" 865 | } 866 | }, 867 | "node_modules/object-is": { 868 | "version": "1.1.5", 869 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", 870 | "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", 871 | "dev": true, 872 | "dependencies": { 873 | "call-bind": "^1.0.2", 874 | "define-properties": "^1.1.3" 875 | }, 876 | "engines": { 877 | "node": ">= 0.4" 878 | }, 879 | "funding": { 880 | "url": "https://github.com/sponsors/ljharb" 881 | } 882 | }, 883 | "node_modules/object-keys": { 884 | "version": "1.1.1", 885 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 886 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 887 | "dev": true, 888 | "engines": { 889 | "node": ">= 0.4" 890 | } 891 | }, 892 | "node_modules/object.assign": { 893 | "version": "4.1.4", 894 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", 895 | "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", 896 | "dev": true, 897 | "dependencies": { 898 | "call-bind": "^1.0.2", 899 | "define-properties": "^1.1.4", 900 | "has-symbols": "^1.0.3", 901 | "object-keys": "^1.1.1" 902 | }, 903 | "engines": { 904 | "node": ">= 0.4" 905 | }, 906 | "funding": { 907 | "url": "https://github.com/sponsors/ljharb" 908 | } 909 | }, 910 | "node_modules/once": { 911 | "version": "1.4.0", 912 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 913 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 914 | "dependencies": { 915 | "wrappy": "1" 916 | } 917 | }, 918 | "node_modules/pako": { 919 | "version": "1.0.11", 920 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 921 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 922 | }, 923 | "node_modules/path-is-absolute": { 924 | "version": "1.0.1", 925 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 926 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 927 | "dev": true, 928 | "engines": { 929 | "node": ">=0.10.0" 930 | } 931 | }, 932 | "node_modules/path-parse": { 933 | "version": "1.0.7", 934 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 935 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 936 | "dev": true 937 | }, 938 | "node_modules/picocolors": { 939 | "version": "1.0.0", 940 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 941 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 942 | "dev": true 943 | }, 944 | "node_modules/pify": { 945 | "version": "4.0.1", 946 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 947 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", 948 | "engines": { 949 | "node": ">=6" 950 | } 951 | }, 952 | "node_modules/readable-stream": { 953 | "version": "3.6.0", 954 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 955 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 956 | "dependencies": { 957 | "inherits": "^2.0.3", 958 | "string_decoder": "^1.1.1", 959 | "util-deprecate": "^1.0.1" 960 | }, 961 | "engines": { 962 | "node": ">= 6" 963 | } 964 | }, 965 | "node_modules/regexp.prototype.flags": { 966 | "version": "1.4.3", 967 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", 968 | "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", 969 | "dev": true, 970 | "dependencies": { 971 | "call-bind": "^1.0.2", 972 | "define-properties": "^1.1.3", 973 | "functions-have-names": "^1.2.2" 974 | }, 975 | "engines": { 976 | "node": ">= 0.4" 977 | }, 978 | "funding": { 979 | "url": "https://github.com/sponsors/ljharb" 980 | } 981 | }, 982 | "node_modules/resumer": { 983 | "version": "0.0.0", 984 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 985 | "integrity": "sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w==", 986 | "dev": true, 987 | "dependencies": { 988 | "through": "~2.3.4" 989 | } 990 | }, 991 | "node_modules/safe-buffer": { 992 | "version": "5.2.1", 993 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 994 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 995 | "funding": [ 996 | { 997 | "type": "github", 998 | "url": "https://github.com/sponsors/feross" 999 | }, 1000 | { 1001 | "type": "patreon", 1002 | "url": "https://www.patreon.com/feross" 1003 | }, 1004 | { 1005 | "type": "consulting", 1006 | "url": "https://feross.org/support" 1007 | } 1008 | ] 1009 | }, 1010 | "node_modules/safe-regex-test": { 1011 | "version": "1.0.0", 1012 | "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", 1013 | "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", 1014 | "dev": true, 1015 | "dependencies": { 1016 | "call-bind": "^1.0.2", 1017 | "get-intrinsic": "^1.1.3", 1018 | "is-regex": "^1.1.4" 1019 | }, 1020 | "funding": { 1021 | "url": "https://github.com/sponsors/ljharb" 1022 | } 1023 | }, 1024 | "node_modules/sha.js": { 1025 | "version": "2.4.11", 1026 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 1027 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 1028 | "dependencies": { 1029 | "inherits": "^2.0.1", 1030 | "safe-buffer": "^5.0.1" 1031 | }, 1032 | "bin": { 1033 | "sha.js": "bin.js" 1034 | } 1035 | }, 1036 | "node_modules/side-channel": { 1037 | "version": "1.0.4", 1038 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1039 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1040 | "dev": true, 1041 | "dependencies": { 1042 | "call-bind": "^1.0.0", 1043 | "get-intrinsic": "^1.0.2", 1044 | "object-inspect": "^1.9.0" 1045 | }, 1046 | "funding": { 1047 | "url": "https://github.com/sponsors/ljharb" 1048 | } 1049 | }, 1050 | "node_modules/simple-concat": { 1051 | "version": "1.0.1", 1052 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 1053 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", 1054 | "funding": [ 1055 | { 1056 | "type": "github", 1057 | "url": "https://github.com/sponsors/feross" 1058 | }, 1059 | { 1060 | "type": "patreon", 1061 | "url": "https://www.patreon.com/feross" 1062 | }, 1063 | { 1064 | "type": "consulting", 1065 | "url": "https://feross.org/support" 1066 | } 1067 | ] 1068 | }, 1069 | "node_modules/simple-get": { 1070 | "version": "4.0.1", 1071 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", 1072 | "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", 1073 | "funding": [ 1074 | { 1075 | "type": "github", 1076 | "url": "https://github.com/sponsors/feross" 1077 | }, 1078 | { 1079 | "type": "patreon", 1080 | "url": "https://www.patreon.com/feross" 1081 | }, 1082 | { 1083 | "type": "consulting", 1084 | "url": "https://feross.org/support" 1085 | } 1086 | ], 1087 | "dependencies": { 1088 | "decompress-response": "^6.0.0", 1089 | "once": "^1.3.1", 1090 | "simple-concat": "^1.0.0" 1091 | } 1092 | }, 1093 | "node_modules/stop-iteration-iterator": { 1094 | "version": "1.0.0", 1095 | "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", 1096 | "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", 1097 | "dev": true, 1098 | "dependencies": { 1099 | "internal-slot": "^1.0.4" 1100 | }, 1101 | "engines": { 1102 | "node": ">= 0.4" 1103 | } 1104 | }, 1105 | "node_modules/string_decoder": { 1106 | "version": "1.3.0", 1107 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1108 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1109 | "dependencies": { 1110 | "safe-buffer": "~5.2.0" 1111 | } 1112 | }, 1113 | "node_modules/string.prototype.trim": { 1114 | "version": "1.2.7", 1115 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", 1116 | "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", 1117 | "dev": true, 1118 | "dependencies": { 1119 | "call-bind": "^1.0.2", 1120 | "define-properties": "^1.1.4", 1121 | "es-abstract": "^1.20.4" 1122 | }, 1123 | "engines": { 1124 | "node": ">= 0.4" 1125 | }, 1126 | "funding": { 1127 | "url": "https://github.com/sponsors/ljharb" 1128 | } 1129 | }, 1130 | "node_modules/string.prototype.trimend": { 1131 | "version": "1.0.6", 1132 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", 1133 | "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", 1134 | "dev": true, 1135 | "dependencies": { 1136 | "call-bind": "^1.0.2", 1137 | "define-properties": "^1.1.4", 1138 | "es-abstract": "^1.20.4" 1139 | }, 1140 | "funding": { 1141 | "url": "https://github.com/sponsors/ljharb" 1142 | } 1143 | }, 1144 | "node_modules/string.prototype.trimstart": { 1145 | "version": "1.0.6", 1146 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", 1147 | "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", 1148 | "dev": true, 1149 | "dependencies": { 1150 | "call-bind": "^1.0.2", 1151 | "define-properties": "^1.1.4", 1152 | "es-abstract": "^1.20.4" 1153 | }, 1154 | "funding": { 1155 | "url": "https://github.com/sponsors/ljharb" 1156 | } 1157 | }, 1158 | "node_modules/strip-ansi": { 1159 | "version": "6.0.1", 1160 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1161 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1162 | "dev": true, 1163 | "dependencies": { 1164 | "ansi-regex": "^5.0.1" 1165 | }, 1166 | "engines": { 1167 | "node": ">=8" 1168 | } 1169 | }, 1170 | "node_modules/supports-preserve-symlinks-flag": { 1171 | "version": "1.0.0", 1172 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1173 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1174 | "dev": true, 1175 | "engines": { 1176 | "node": ">= 0.4" 1177 | }, 1178 | "funding": { 1179 | "url": "https://github.com/sponsors/ljharb" 1180 | } 1181 | }, 1182 | "node_modules/tap-arc": { 1183 | "version": "0.3.5", 1184 | "resolved": "https://registry.npmjs.org/tap-arc/-/tap-arc-0.3.5.tgz", 1185 | "integrity": "sha512-uGqN8JM+BmBwJhfDwTtGVGyZ0HLxcoPJMzTqBHJjfKS4M6+CcKHS+PFJBhJoGtpBrpeMPBoLyLaP3zb8vsccOA==", 1186 | "dev": true, 1187 | "dependencies": { 1188 | "json5": "^2.2.1", 1189 | "minimist": "^1.2.6", 1190 | "picocolors": "^1.0.0", 1191 | "strip-ansi": "6.0.1", 1192 | "tap-parser": "^11.0.1", 1193 | "tcompare": "^5.0.7", 1194 | "through2": "^4.0.2" 1195 | }, 1196 | "bin": { 1197 | "tap-arc": "index.js" 1198 | }, 1199 | "engines": { 1200 | "node": ">=14" 1201 | } 1202 | }, 1203 | "node_modules/tap-parser": { 1204 | "version": "11.0.2", 1205 | "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-11.0.2.tgz", 1206 | "integrity": "sha512-6qGlC956rcORw+fg7Fv1iCRAY8/bU9UabUAhs3mXRH6eRmVZcNPLheSXCYaVaYeSwx5xa/1HXZb1537YSvwDZg==", 1207 | "dev": true, 1208 | "dependencies": { 1209 | "events-to-array": "^1.0.1", 1210 | "minipass": "^3.1.6", 1211 | "tap-yaml": "^1.0.0" 1212 | }, 1213 | "bin": { 1214 | "tap-parser": "bin/cmd.js" 1215 | }, 1216 | "engines": { 1217 | "node": ">= 8" 1218 | } 1219 | }, 1220 | "node_modules/tap-yaml": { 1221 | "version": "1.0.2", 1222 | "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-1.0.2.tgz", 1223 | "integrity": "sha512-GegASpuqBnRNdT1U+yuUPZ8rEU64pL35WPBpCISWwff4dErS2/438barz7WFJl4Nzh3Y05tfPidZnH+GaV1wMg==", 1224 | "dev": true, 1225 | "dependencies": { 1226 | "yaml": "^1.10.2" 1227 | } 1228 | }, 1229 | "node_modules/tape": { 1230 | "version": "5.6.3", 1231 | "resolved": "https://registry.npmjs.org/tape/-/tape-5.6.3.tgz", 1232 | "integrity": "sha512-cUDDGSbyoSIpdUAqbqLI/r7i/S4BHuCB9M5j7E/LrLs/x/i4zeAJ798aqo+FGo+kr9seBZwr8AkZW6rjceyAMQ==", 1233 | "dev": true, 1234 | "dependencies": { 1235 | "array.prototype.every": "^1.1.4", 1236 | "call-bind": "^1.0.2", 1237 | "deep-equal": "^2.2.0", 1238 | "defined": "^1.0.1", 1239 | "dotignore": "^0.1.2", 1240 | "for-each": "^0.3.3", 1241 | "get-package-type": "^0.1.0", 1242 | "glob": "^7.2.3", 1243 | "has": "^1.0.3", 1244 | "has-dynamic-import": "^2.0.1", 1245 | "inherits": "^2.0.4", 1246 | "is-regex": "^1.1.4", 1247 | "minimist": "^1.2.7", 1248 | "object-inspect": "^1.12.3", 1249 | "object-is": "^1.1.5", 1250 | "object-keys": "^1.1.1", 1251 | "object.assign": "^4.1.4", 1252 | "resolve": "^2.0.0-next.4", 1253 | "resumer": "^0.0.0", 1254 | "string.prototype.trim": "^1.2.7", 1255 | "through": "^2.3.8" 1256 | }, 1257 | "bin": { 1258 | "tape": "bin/tape" 1259 | }, 1260 | "funding": { 1261 | "url": "https://github.com/sponsors/ljharb" 1262 | } 1263 | }, 1264 | "node_modules/tape/node_modules/brace-expansion": { 1265 | "version": "1.1.11", 1266 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1267 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1268 | "dev": true, 1269 | "dependencies": { 1270 | "balanced-match": "^1.0.0", 1271 | "concat-map": "0.0.1" 1272 | } 1273 | }, 1274 | "node_modules/tape/node_modules/glob": { 1275 | "version": "7.2.3", 1276 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1277 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1278 | "dev": true, 1279 | "dependencies": { 1280 | "fs.realpath": "^1.0.0", 1281 | "inflight": "^1.0.4", 1282 | "inherits": "2", 1283 | "minimatch": "^3.1.1", 1284 | "once": "^1.3.0", 1285 | "path-is-absolute": "^1.0.0" 1286 | }, 1287 | "engines": { 1288 | "node": "*" 1289 | }, 1290 | "funding": { 1291 | "url": "https://github.com/sponsors/isaacs" 1292 | } 1293 | }, 1294 | "node_modules/tape/node_modules/minimatch": { 1295 | "version": "3.1.2", 1296 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1297 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1298 | "dev": true, 1299 | "dependencies": { 1300 | "brace-expansion": "^1.1.7" 1301 | }, 1302 | "engines": { 1303 | "node": "*" 1304 | } 1305 | }, 1306 | "node_modules/tape/node_modules/resolve": { 1307 | "version": "2.0.0-next.4", 1308 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", 1309 | "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", 1310 | "dev": true, 1311 | "dependencies": { 1312 | "is-core-module": "^2.9.0", 1313 | "path-parse": "^1.0.7", 1314 | "supports-preserve-symlinks-flag": "^1.0.0" 1315 | }, 1316 | "bin": { 1317 | "resolve": "bin/resolve" 1318 | }, 1319 | "funding": { 1320 | "url": "https://github.com/sponsors/ljharb" 1321 | } 1322 | }, 1323 | "node_modules/tcompare": { 1324 | "version": "5.0.7", 1325 | "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-5.0.7.tgz", 1326 | "integrity": "sha512-d9iddt6YYGgyxJw5bjsN7UJUO1kGOtjSlNy/4PoGYAjQS5pAT/hzIoLf1bZCw+uUxRmZJh7Yy1aA7xKVRT9B4w==", 1327 | "dev": true, 1328 | "dependencies": { 1329 | "diff": "^4.0.2" 1330 | }, 1331 | "engines": { 1332 | "node": ">=10" 1333 | } 1334 | }, 1335 | "node_modules/through": { 1336 | "version": "2.3.8", 1337 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1338 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 1339 | "dev": true 1340 | }, 1341 | "node_modules/through2": { 1342 | "version": "4.0.2", 1343 | "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", 1344 | "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", 1345 | "dev": true, 1346 | "dependencies": { 1347 | "readable-stream": "3" 1348 | } 1349 | }, 1350 | "node_modules/unbox-primitive": { 1351 | "version": "1.0.2", 1352 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", 1353 | "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", 1354 | "dev": true, 1355 | "dependencies": { 1356 | "call-bind": "^1.0.2", 1357 | "has-bigints": "^1.0.2", 1358 | "has-symbols": "^1.0.3", 1359 | "which-boxed-primitive": "^1.0.2" 1360 | }, 1361 | "funding": { 1362 | "url": "https://github.com/sponsors/ljharb" 1363 | } 1364 | }, 1365 | "node_modules/util-deprecate": { 1366 | "version": "1.0.2", 1367 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1368 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 1369 | }, 1370 | "node_modules/which-boxed-primitive": { 1371 | "version": "1.0.2", 1372 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 1373 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 1374 | "dev": true, 1375 | "dependencies": { 1376 | "is-bigint": "^1.0.1", 1377 | "is-boolean-object": "^1.1.0", 1378 | "is-number-object": "^1.0.4", 1379 | "is-string": "^1.0.5", 1380 | "is-symbol": "^1.0.3" 1381 | }, 1382 | "funding": { 1383 | "url": "https://github.com/sponsors/ljharb" 1384 | } 1385 | }, 1386 | "node_modules/which-collection": { 1387 | "version": "1.0.1", 1388 | "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", 1389 | "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", 1390 | "dev": true, 1391 | "dependencies": { 1392 | "is-map": "^2.0.1", 1393 | "is-set": "^2.0.1", 1394 | "is-weakmap": "^2.0.1", 1395 | "is-weakset": "^2.0.1" 1396 | }, 1397 | "funding": { 1398 | "url": "https://github.com/sponsors/ljharb" 1399 | } 1400 | }, 1401 | "node_modules/which-typed-array": { 1402 | "version": "1.1.9", 1403 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", 1404 | "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", 1405 | "dev": true, 1406 | "dependencies": { 1407 | "available-typed-arrays": "^1.0.5", 1408 | "call-bind": "^1.0.2", 1409 | "for-each": "^0.3.3", 1410 | "gopd": "^1.0.1", 1411 | "has-tostringtag": "^1.0.0", 1412 | "is-typed-array": "^1.1.10" 1413 | }, 1414 | "engines": { 1415 | "node": ">= 0.4" 1416 | }, 1417 | "funding": { 1418 | "url": "https://github.com/sponsors/ljharb" 1419 | } 1420 | }, 1421 | "node_modules/wrappy": { 1422 | "version": "1.0.2", 1423 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1424 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 1425 | }, 1426 | "node_modules/yallist": { 1427 | "version": "4.0.0", 1428 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1429 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1430 | "dev": true 1431 | }, 1432 | "node_modules/yaml": { 1433 | "version": "1.10.2", 1434 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 1435 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 1436 | "dev": true, 1437 | "engines": { 1438 | "node": ">= 6" 1439 | } 1440 | } 1441 | } 1442 | } 1443 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@enhance/create", 3 | "version": "4.1.4", 4 | "main": "index.js", 5 | "type": "module", 6 | "engines": { 7 | "node": ">=14" 8 | }, 9 | "files": [ 10 | "index.js", 11 | "console.js", 12 | "create-project.js" 13 | ], 14 | "scripts": { 15 | "test": "tape test/*-test.js | tap-arc" 16 | }, 17 | "bin": { 18 | "enhance-create": "./index.js" 19 | }, 20 | "devDependencies": { 21 | "tap-arc": "^0.3.5", 22 | "tape": "^5.6.3" 23 | }, 24 | "dependencies": { 25 | "@architect/parser": "^6.0.3", 26 | "isomorphic-git": "^1.25.6" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | ![enhance-type](https://user-images.githubusercontent.com/76308/224389189-af75b792-4c26-43bb-bc89-75777614869b.svg) 2 | # `@enhance/create` 3 | 4 | 5 | Learn more at [enhance.dev](https://enhance.dev). 6 | -------------------------------------------------------------------------------- /test/index-test.js: -------------------------------------------------------------------------------- 1 | import { execSync } from 'child_process' 2 | import { readdirSync, readFileSync, rmSync } from 'fs' 3 | import { fileURLToPath } from 'url' 4 | import { join, dirname } from 'path' 5 | import test from 'tape' 6 | 7 | const here = dirname(fileURLToPath(import.meta.url)) 8 | const TEST_APP_NAME = 'test-name' 9 | const TEST_APP_PATH = 'test-app' 10 | const TEST_APP_PATH_INVALID_NAME = 'Test-App' 11 | const BASE_FILES = [ 12 | 'app', 13 | 'public', 14 | '.arc', 15 | 'LICENSE.md', 16 | 'package.json', 17 | ].sort() 18 | const TEMPLATE_FILES = [ 19 | 'template.gitignore', 20 | ...BASE_FILES 21 | ].sort() 22 | const EXPECTED_FILES = [ 23 | '.gitignore', 24 | ...BASE_FILES 25 | ].sort() 26 | 27 | function cleanup() { 28 | cleanTemplate() 29 | cleanProj() 30 | } 31 | 32 | function cleanTemplate() { 33 | rmSync('template', { recursive: true, force: true }) 34 | } 35 | 36 | function cleanProj() { 37 | rmSync('test/test-app', { recursive: true, force: true }) 38 | } 39 | 40 | test('setup', (t) => { 41 | cleanup() 42 | t.end() 43 | }) 44 | 45 | // run index.js in subprocess with path arg 46 | test('index.js', (t) => { 47 | t.plan(5) 48 | 49 | const stdout = execSync(`node index.js test/${TEST_APP_PATH}`).toString() 50 | t.ok(stdout.includes('cd test/test-app'), 'index.js ran') 51 | 52 | t.deepEqual( 53 | readdirSync(join(here, TEST_APP_PATH)), 54 | EXPECTED_FILES, 55 | 'new app file structure is correct' 56 | ) 57 | 58 | // verify output in test/test-app/ 59 | let pkg = readFileSync(join(here, TEST_APP_PATH, 'package.json'), 'utf8').toString() 60 | pkg = JSON.parse(pkg) 61 | t.equal(pkg['name'], TEST_APP_PATH, 'package: name is correct') 62 | t.equal(pkg['version'], '0.0.1', 'package: version is correct') 63 | 64 | const arcFile = readFileSync(join(here, TEST_APP_PATH, '.arc'), 'utf8').toString() 65 | t.ok(arcFile.indexOf(`@app\n${TEST_APP_PATH}`) === 0, 'arc: app name is correct') 66 | t.teardown(() => { 67 | cleanProj() 68 | }) 69 | }) 70 | 71 | // run index.js in subprocess with path arg that generates invalid name 72 | test('index.js', (t) => { 73 | t.plan(1) 74 | 75 | try { 76 | execSync(`node index.js test/${TEST_APP_PATH_INVALID_NAME}`).toString() 77 | } catch (err) { 78 | const stdout = err.stdout.toString() 79 | t.ok(stdout.includes('Invalid app name'), 'index.js did not run') 80 | } 81 | 82 | t.teardown(() => { 83 | cleanProj() 84 | }) 85 | }) 86 | 87 | // run create-project.js in subprocess with path and name args 88 | test('index.js', async (t) => { 89 | t.plan(4) 90 | 91 | let { createProject } = await import('../create-project.js') 92 | await createProject({ path: `test/${TEST_APP_PATH}`, dest: join(process.cwd(), `test/${TEST_APP_PATH}`), name: TEST_APP_NAME }) 93 | 94 | t.deepEqual( 95 | readdirSync(join(here, TEST_APP_PATH)), 96 | EXPECTED_FILES, 97 | 'new app file structure is correct' 98 | ) 99 | 100 | // verify output in test/test-app/ 101 | let pkg = readFileSync(join(here, TEST_APP_PATH, 'package.json'), 'utf8').toString() 102 | pkg = JSON.parse(pkg) 103 | t.equal(pkg['name'], TEST_APP_NAME, 'package: name is correct') 104 | t.equal(pkg['version'], '0.0.1', 'package: version is correct') 105 | 106 | const arcFile = readFileSync(join(here, TEST_APP_PATH, '.arc'), 'utf8').toString() 107 | t.ok(arcFile.indexOf(`@app\n${TEST_APP_NAME}`) === 0, 'arc: app name is correct') 108 | t.teardown(() => { 109 | cleanProj() 110 | }) 111 | }) 112 | 113 | // run create-project.js in subprocess with path and name args 114 | test('index.js', async (t) => { 115 | t.plan(4) 116 | 117 | let { createProject } = await import('../create-project.js') 118 | await createProject({ path: `test/${TEST_APP_PATH_INVALID_NAME}`, dest: join(process.cwd(), `test/${TEST_APP_PATH_INVALID_NAME}`), name: TEST_APP_NAME }) 119 | 120 | t.deepEqual( 121 | readdirSync(join(here, TEST_APP_PATH_INVALID_NAME)), 122 | EXPECTED_FILES, 123 | 'new app file structure is correct' 124 | ) 125 | 126 | // verify output in test/test-app/ 127 | let pkg = readFileSync(join(here, TEST_APP_PATH_INVALID_NAME, 'package.json'), 'utf8').toString() 128 | pkg = JSON.parse(pkg) 129 | t.equal(pkg['name'], TEST_APP_NAME, 'package: name is correct') 130 | t.equal(pkg['version'], '0.0.1', 'package: version is correct') 131 | 132 | const arcFile = readFileSync(join(here, TEST_APP_PATH_INVALID_NAME, '.arc'), 'utf8').toString() 133 | t.ok(arcFile.indexOf(`@app\n${TEST_APP_NAME}`) === 0, 'arc: app name is correct') 134 | t.teardown(() => { 135 | cleanProj() 136 | }) 137 | }) 138 | 139 | // run index.js in subprocess with path and template args using app.arc 140 | test('index.js', (t) => { 141 | t.plan(4) 142 | 143 | const stdout = execSync(`node index.js test/${TEST_APP_PATH} https://github.com/macdonst/enhance-arc-template`).toString() 144 | t.ok(stdout.includes('cd test/test-app'), 'index.js ran') 145 | 146 | // verify output in test/test-app/ 147 | let pkg = readFileSync(join(here, TEST_APP_PATH, 'package.json'), 'utf8').toString() 148 | pkg = JSON.parse(pkg) 149 | t.equal(pkg['name'], TEST_APP_PATH, 'package: name is correct') 150 | t.equal(pkg['version'], '0.0.1', 'package: version is correct') 151 | 152 | const arcFile = readFileSync(join(here, TEST_APP_PATH, 'app.arc'), 'utf8').toString() 153 | t.ok(arcFile.indexOf(`@app\n${TEST_APP_PATH}`) === 0, 'arc: app name is correct') 154 | t.teardown(() => { 155 | cleanProj() 156 | }) 157 | }) 158 | 159 | 160 | // run index.js in subprocess with path and template args 161 | test('index.js', (t) => { 162 | t.plan(4) 163 | 164 | const stdout = execSync(`node index.js test/${TEST_APP_PATH} https://github.com/enhance-dev/enhance-starter-project`).toString() 165 | t.ok(stdout.includes('cd test/test-app'), 'index.js ran') 166 | 167 | // verify output in test/test-app/ 168 | let pkg = readFileSync(join(here, TEST_APP_PATH, 'package.json'), 'utf8').toString() 169 | pkg = JSON.parse(pkg) 170 | t.equal(pkg['name'], TEST_APP_PATH, 'package: name is correct') 171 | t.equal(pkg['version'], '0.0.1', 'package: version is correct') 172 | 173 | const arcFile = readFileSync(join(here, TEST_APP_PATH, '.arc'), 'utf8').toString() 174 | t.ok(arcFile.indexOf(`@app\n${TEST_APP_PATH}`) === 0, 'arc: app name is correct') 175 | t.teardown(() => { 176 | cleanProj() 177 | }) 178 | }) 179 | 180 | 181 | // run index.js in subprocess with path and `-y` template arg from `npx "@enhance/create@latest" ./myproject -y` 182 | test('index.js', (t) => { 183 | t.plan(4) 184 | 185 | const stdout = execSync(`node index.js test/${TEST_APP_PATH} -y`).toString() 186 | t.ok(stdout.includes('cd test/test-app'), 'index.js ran') 187 | 188 | // verify output in test/test-app/ 189 | let pkg = readFileSync(join(here, TEST_APP_PATH, 'package.json'), 'utf8').toString() 190 | pkg = JSON.parse(pkg) 191 | t.equal(pkg['name'], TEST_APP_PATH, 'package: name is correct') 192 | t.equal(pkg['version'], '0.0.1', 'package: version is correct') 193 | 194 | const arcFile = readFileSync(join(here, TEST_APP_PATH, '.arc'), 'utf8').toString() 195 | t.ok(arcFile.indexOf(`@app\n${TEST_APP_PATH}`) === 0, 'arc: app name is correct') 196 | t.teardown(() => { 197 | cleanProj() 198 | }) 199 | }) 200 | 201 | // run index.js in subprocess with path and invalid template args 202 | test('index.js', (t) => { 203 | t.plan(1) 204 | 205 | try { 206 | execSync(`node index.js test/${TEST_APP_PATH} heck-nah`).toString() 207 | } catch (error) { 208 | t.ok(true, 'bad template') 209 | } 210 | 211 | t.teardown(() => { 212 | cleanProj() 213 | }) 214 | }) 215 | 216 | // run index.js in subprocess with path and invalid template repo 217 | test('index.js', (t) => { 218 | t.plan(1) 219 | 220 | try { 221 | execSync(`node index.js test/${TEST_APP_PATH} https://github.com/macdonst/read-it-to-me`).toString() 222 | } catch (error) { 223 | t.ok(true, 'bad template repo') 224 | } 225 | 226 | t.teardown(() => { 227 | cleanProj() 228 | }) 229 | }) 230 | 231 | test.onFinish(() => { 232 | cleanup() 233 | }) 234 | --------------------------------------------------------------------------------