diff --git a/package.json b/package.json index 7567335..dafeebe 100644 --- a/package.json +++ b/package.json @@ -71,10 +71,9 @@ }, "devDependencies": { "@oclif/test": "^4.0.9", - "@types/jest": "^29.2.5", + "@types/jest": "^29.5.13", "docdash": "^2.0.1", "prettier": "^3.0.0", - "ts-jest": "^29.0.4", "ts-node": "^10.9.2", "tsup": "^8.0.2", "typedoc": "^0.24.8", diff --git a/src/commands/init.ts b/src/commands/init.ts index 90013dc..af7e368 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -16,6 +16,7 @@ import { OptionFlag } from '@oclif/core/lib/interfaces' import { spawn } from 'child_process' type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun' +type ExtraTool = 'gh-actions' | 'test' export default class Init extends Command { static override args = {} @@ -63,17 +64,38 @@ installation.`, }), } + // TODO: refactor to have a unique project object which is built and passed + // to the methods before writing it in one go. public async run(): Promise { p.intro(chalk.bgHex('#2975d1')(' publicodes init ')) const { flags } = await this.parse(Init) const currentDir = path.basename(process.cwd()) - const pkgJSON = await getPackageJson(currentDir, flags.yes) + const pkgJSON = await this.getPackageJson(currentDir, flags.yes) + + // TODO: check for existing 'test' directory and '.github/workflows' directory + const extraTools = await getExtraTools(flags.yes) + // TODO: factorize this + if (p.isCancel(extraTools)) { + p.cancel('init cancelled') + process.exit(1) + } - this.updatePackageJson(pkgJSON) + if (extraTools.includes('gh-actions')) { + // TODO + // setupGithubActions() + } + if (extraTools.includes('test')) { + setupTests(pkgJSON) + } const pkgManager = await getPackageManager(flags['pkg-manager'], flags.yes) - // const extraTools = await getExtraTools(flags.yes) + if (p.isCancel(pkgManager)) { + p.cancel('init cancelled') + process.exit(1) + } + + await generateBaseFiles(pkgJSON, pkgManager) const shouldInstall = flags['no-install'] === undefined && !flags.yes @@ -86,8 +108,6 @@ installation.`, await installDeps(pkgManager) } - await generateBaseFiles(pkgJSON, pkgManager) - p.note( `${chalk.bold('You can now:')} - write your Publicodes rules in ${chalk.bold.yellow('.src/')} @@ -100,8 +120,18 @@ installation.`, ) } - private updatePackageJson(pkgJSON: PackageJson): void { - const packageJsonPath = path.join(process.cwd(), 'package.json') + private async getPackageJson( + currentDir: string, + useDefault: boolean, + ): Promise { + let pkgJSON = readPackageJson() + + if (!pkgJSON && useDefault) { + pkgJSON = { ...basePackageJson, name: currentDir } + } + if (!pkgJSON) { + pkgJSON = await askPackageJsonInfo(currentDir) + } pkgJSON.type = basePackageJson.type pkgJSON.main = basePackageJson.main @@ -128,33 +158,8 @@ installation.`, pkgJSON.publishConfig = { access: 'public' } } - try { - fs.writeFileSync(packageJsonPath, JSON.stringify(pkgJSON, null, 2)) - p.log.step(`${chalk.bold('package.json')} file written`) - } catch (error) { - exitWithError({ - ctx: `An error occurred while writing the ${chalk.bold('package.json')} file`, - msg: error.message, - }) - } - } -} - -async function getPackageJson( - currentDir: string, - useDefault: boolean, -): Promise { - const localPkgJson = readPackageJson() - - if (localPkgJson) { - return localPkgJson + return pkgJSON } - - if (useDefault) { - return { ...basePackageJson, name: currentDir } - } - - return await askPackageJsonInfo(currentDir) } async function getPackageManager( @@ -237,13 +242,45 @@ function askPackageManager(): Promise { }) as Promise } +async function getExtraTools(useDefault: boolean): Promise { + if (useDefault) { + return ['gh-actions', 'test'] + } + return p.multiselect({ + message: `Select extra tools (press ${chalk.bold.italic('space')} to unselect)`, + options: [ + { + value: 'gh-actions', + label: 'GitHub Actions', + hint: 'automate build, test and publishing', + }, + { value: 'test', label: 'Unit test', hint: 'Vitest + example' }, + ], + required: false, + initialValues: ['gh-actions', 'test'], + }) as Promise +} + +function setupTests(pkgJSON: PackageJson) { + pkgJSON.devDependencies = { + ...pkgJSON.devDependencies, + vitest: '^2.1.2', + '@types/jest': '^29.5.13', + } + pkgJSON.scripts = { + ...pkgJSON.scripts, + test: 'vitest --globals', + } + return pkgJSON +} + async function installDeps(pkgManager: PackageManager): Promise { return runAsyncWithSpinner( 'Installing dependencies', 'Dependencies installed', (spinner: Spinner) => { return new Promise((resolve) => { - const program = spawn(pkgManager, ['install', '-y'], { + const program = spawn(pkgManager, ['install'], { stdio: 'ignore', }) @@ -258,7 +295,7 @@ async function installDeps(pkgManager: PackageManager): Promise { program.on('close', (code) => { if (code !== 0) { exitWithError({ - ctx: `An error occurred while installing dependencies (exec: ${pkgManager} install -y)`, + ctx: `An error occurred while installing dependencies (exec: ${pkgManager} install)`, msg: `Process exited with code ${code}`, spinner, }) @@ -276,6 +313,10 @@ async function generateBaseFiles( ): Promise { return runWithSpinner('Generating files', 'Files generated', (spinner) => { try { + // Generate package.json + const packageJsonPath = path.join(process.cwd(), 'package.json') + fs.writeFileSync(packageJsonPath, JSON.stringify(pjson, null, 2)) + // Generate README.md if (!fs.existsSync('README.md')) { fs.writeFileSync('README.md', getReadmeContent(pjson, pkgManager)) @@ -285,9 +326,28 @@ async function generateBaseFiles( if (!fs.existsSync('src')) { fs.mkdirSync('src') } - if (!fs.existsSync('src/base.publicodes')) { - fs.writeFileSync('src/base.publicodes', BASE_PUBLICODES) + if (!fs.existsSync('src/salaire.publicodes')) { + fs.writeFileSync('src/salaire.publicodes', BASE_PUBLICODES) + } + if (!fs.existsSync('.gitignore')) { + try { + execSync('git init', { stdio: 'ignore' }) + } catch (error) { + p.log.warn( + `Could not initialize a git repository (make sure ${chalk.bold.italic('git')} is installed)`, + ) + } + fs.writeFileSync( + '.gitignore', + `node_modules\n${pjson.files?.join('\n')}`, + ) + } + + if (!fs.existsSync('test')) { + fs.mkdirSync('test') } + + fs.writeFileSync('test/salaire.test.ts', BASE_TEST_FILE) } catch (error) { exitWithError({ ctx: 'An error occurred while generating files', @@ -309,7 +369,7 @@ ${pjson.description} ## Installation \`\`\`sh -npm install ${pjson.name} publicodes +${pkgManager} install ${pjson.name} publicodes \`\`\` ## Usage @@ -337,6 +397,13 @@ ${pkgManager} install // Compile the Publicodes rules ${pkgManager} run compile +${ + pjson.scripts?.test + ? `// Run the tests +${pkgManager} run test` + : '' +} + // Run the documentation server ${pkgManager} run doc \`\`\` @@ -350,7 +417,8 @@ salaire net: salaire brut - cotisations salariales salaire brut: titre: Salaire brut mensuel - par défaut: 2500 €/mois + par défaut: 2500 + unité: €/mois cotisations salariales: produit: @@ -359,3 +427,30 @@ cotisations salariales: avec: taux: 21.7% ` + +const BASE_TEST_FILE = `import Engine, { serializeEvaluation, serializeUnit } from "publicodes"; +import rules from "../build"; + +describe("Salaire net", () => { + test("salaire brut par défaut", () => { + const engine = new Engine(rules); + const result = engine.evaluate("salaire net"); + + expect(result.nodeValue).toBe(1957.5); + expect(serializeEvaluation(result)).toBe("1957.5€/mois"); + }); + + test.each([ + [1957.5, 2500], + [2740.5, 3500], + [0, 0], + ])("%f €/mois, avec salaire brut = %f €/mois", (salaireNet, salaireBrut) => { + const engine = new Engine(rules); + engine.setSituation({ "salaire brut": salaireBrut }); + const result = engine.evaluate("salaire net"); + + expect(result.nodeValue).toBe(salaireNet); + expect(serializeUnit(result.unit)).toBe("€/mois"); + }); +}); +` diff --git a/test/commands/init.test.ts b/test/commands/init.test.ts index e2af78d..04a1de0 100644 --- a/test/commands/init.test.ts +++ b/test/commands/init.test.ts @@ -13,7 +13,6 @@ describe('publicodes init', () => { const { stdout } = await cli.execCommand('init -y -p yarn') - expect(stdout).toContain('package.json file written') expect(stdout).toContain('Dependencies installed') expect(stdout).toContain('Files generated') expect(stdout).toContain('New to Publicodes?') @@ -26,7 +25,8 @@ describe('publicodes init', () => { expect(fs.existsSync('node_modules')).toBe(true) expect(fs.existsSync('yarn.lock')).toBe(true) expect(fs.existsSync('README.md')).toBe(true) - expect(fs.existsSync('src/base.publicodes')).toBe(true) + expect(fs.existsSync('src/salaire.publicodes')).toBe(true) + expect(fs.existsSync('test/salaire.test.ts')).toBe(true) }) }) @@ -36,7 +36,6 @@ describe('publicodes init', () => { const { stdout } = await cli.execCommand('init -y --no-install -p yarn') - expect(stdout).toContain('package.json file written') expect(stdout).toContain('Files generated') expect(stdout).toContain('New to Publicodes?') @@ -48,7 +47,7 @@ describe('publicodes init', () => { expect(fs.existsSync('node_modules')).toBe(false) expect(fs.existsSync('yarn.lock')).toBe(false) expect(fs.existsSync('README.md')).toBe(true) - expect(fs.existsSync('src/base.publicodes')).toBe(true) + expect(fs.existsSync('src/salaire.publicodes')).toBe(true) }) }) }) diff --git a/yarn.lock b/yarn.lock index 31004e2..a0d7916 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,24 +3,24 @@ "@babel/code-frame@^7.12.13": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" - integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.7.tgz#438f2c524071531d643c6f0188e1e28f130cebc7" + integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g== dependencies: - "@babel/highlight" "^7.24.7" + "@babel/highlight" "^7.25.7" picocolors "^1.0.0" -"@babel/helper-validator-identifier@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" - integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== +"@babel/helper-validator-identifier@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5" + integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg== -"@babel/highlight@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" - integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== +"@babel/highlight@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.7.tgz#20383b5f442aa606e7b5e3043b0b1aafe9f37de5" + integrity sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw== dependencies: - "@babel/helper-validator-identifier" "^7.24.7" + "@babel/helper-validator-identifier" "^7.25.7" chalk "^2.4.2" js-tokens "^4.0.0" picocolors "^1.0.0" @@ -526,20 +526,20 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^29.2.5": - version "29.5.12" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" - integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== +"@types/jest@^29.5.13": + version "29.5.13" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.13.tgz#8bc571659f401e6a719a7bf0dbcb8b78c71a8adc" + integrity sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg== dependencies: expect "^29.0.0" pretty-format "^29.0.0" "@types/node@*": - version "20.14.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.10.tgz#a1a218290f1b6428682e3af044785e5874db469a" - integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ== + version "22.7.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.4.tgz#e35d6f48dca3255ce44256ddc05dee1c23353fcc" + integrity sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg== dependencies: - undici-types "~5.26.4" + undici-types "~6.19.2" "@types/node@^18.11.18": version "18.19.39" @@ -559,9 +559,9 @@ integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": - version "17.0.32" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" - integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== dependencies: "@types/yargs-parser" "*" @@ -752,13 +752,6 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - bundle-require@^4.0.0: version "4.2.1" resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-4.2.1.tgz#4c450a5807381d20ade987bde8ac391544257919" @@ -1042,11 +1035,6 @@ fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@2.x: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" @@ -1272,7 +1260,7 @@ jest-message-util@^29.7.0: slash "^3.0.0" stack-utils "^2.0.3" -jest-util@^29.0.0, jest-util@^29.7.0: +jest-util@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== @@ -1294,11 +1282,6 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - jsonc-parser@^3.2.0: version "3.3.1" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" @@ -1319,11 +1302,6 @@ load-tsconfig@^0.2.3: resolved "https://registry.yarnpkg.com/load-tsconfig/-/load-tsconfig-0.2.5.tgz#453b8cd8961bfb912dea77eb6c168fe8cca3d3a1" integrity sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg== -lodash.memoize@4.x: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -1358,7 +1336,7 @@ magic-string@^0.30.11: dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" -make-error@1.x, make-error@^1.1.1: +make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== @@ -1656,11 +1634,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -semver@^7.5.3: - version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== - semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" @@ -1892,20 +1865,6 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -ts-jest@^29.0.4: - version "29.1.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.5.tgz#d6c0471cc78bffa2cb4664a0a6741ef36cfe8f69" - integrity sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^29.0.0" - json5 "^2.2.3" - lodash.memoize "4.x" - make-error "1.x" - semver "^7.5.3" - yargs-parser "^21.0.1" - ts-node@^10.9.2: version "10.9.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" @@ -1975,6 +1934,11 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + util@^0.10.3: version "0.10.4" resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" @@ -2116,11 +2080,6 @@ yaml@^2.3.4, yaml@^2.4.5: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== -yargs-parser@^21.0.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"