diff --git a/.changeset/nice-glasses-know.md b/.changeset/nice-glasses-know.md new file mode 100644 index 00000000..e6571aa1 --- /dev/null +++ b/.changeset/nice-glasses-know.md @@ -0,0 +1,5 @@ +--- +"ember-apply": minor +--- + +Add ember.isV2Addon() to the ember family of methods/queries diff --git a/.changeset/pink-melons-tie.md b/.changeset/pink-melons-tie.md new file mode 100644 index 00000000..d2f4e0e2 --- /dev/null +++ b/.changeset/pink-melons-tie.md @@ -0,0 +1,5 @@ +--- +"@ember-apply/typescript": minor +--- + +Initial implementation of 'ember-apply typescript' diff --git a/.changeset/stupid-melons-hang.md b/.changeset/stupid-melons-hang.md new file mode 100644 index 00000000..a80efd9d --- /dev/null +++ b/.changeset/stupid-melons-hang.md @@ -0,0 +1,5 @@ +--- +"ember-apply": minor +--- + +New module, npm. Only one function so far -- pass an array of dependencies and get back an object with the latest version as the value for each dependency as the key diff --git a/README.md b/README.md index 65b0ad72..c75215b4 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,17 @@ where `` is one of the options under [#Features](#features) ## Features +### `typescript` + +```shell +npx ember-apply typescript +``` + +_Automates setting up TypeScript for your V1 Addon or App._ +- correct dependencies +- correct types +- correct configs + ### `volta` ```shell diff --git a/ember-apply/src/-private/ember/queries.js b/ember-apply/src/-private/ember/queries.js index 553b12fc..422443ed 100644 --- a/ember-apply/src/-private/ember/queries.js +++ b/ember-apply/src/-private/ember/queries.js @@ -76,3 +76,40 @@ export async function isAddon(dir) { return false; } } + +/** + * @example + * ```js + * import { ember } from 'ember-apply'; + * + * await ember.isV2Addon(); + * ``` + * + * @param {string} [dir] optionally override the directory to read from -- defaults to the current working directory + * @returns {Promise} true if the project is an ember project and is a v2 addon + */ +export async function isV2Addon(dir) { + let isEmberAddon = await isAddon(dir); + + if (!isEmberAddon) { + return false; + } + + try { + let json = await read(dir); + + // what was implemented + let emberAddon = json['ember-addon']; + // what the RFC/design said to do + let ember = json['ember']; + + return ( + emberAddon?.version === 2 || + ember?.version === 2 || + emberAddon?.version === '2' || + ember?.version === '2' + ); + } catch { + return false; + } +} diff --git a/ember-apply/src/-private/npm/index.js b/ember-apply/src/-private/npm/index.js new file mode 100644 index 00000000..eb73939f --- /dev/null +++ b/ember-apply/src/-private/npm/index.js @@ -0,0 +1,24 @@ +import latestVersion from 'latest-version'; + +/** + * For a list of dependencies, return an object of [depName] => version + * + * Uses [`latest-version`](https://www.npmjs.com/package/latest-version) + * + * @param {string[]} deps + * @param {'^' | '~' | '>=' | '' | string} [ range ] default range is ^ + */ +export async function getLatest(deps, range = '^') { + /** @type {Record} */ + let depsWithVersions = {}; + + await Promise.all( + deps.map(async (dep) => { + let version = await latestVersion(dep); + + depsWithVersions[dep] = `${range}${version}`; + }), + ); + + return depsWithVersions; +} diff --git a/ember-apply/src/index.js b/ember-apply/src/index.js index 87546480..2b22a977 100644 --- a/ember-apply/src/index.js +++ b/ember-apply/src/index.js @@ -10,5 +10,6 @@ export * as ember from './-private/ember/index.js'; export * as files from './-private/files/index.js'; export * as html from './-private/html/index.js'; export * as js from './-private/js/index.js'; +export * as npm from './-private/npm/index.js'; export * as packageJson from './-private/package-json/index.js'; export * as project from './-private/project/index.js'; diff --git a/packages/ember/embroider/package.json b/packages/ember/embroider/package.json index 50997b73..7cb70349 100644 --- a/packages/ember/embroider/package.json +++ b/packages/ember/embroider/package.json @@ -61,4 +61,4 @@ "volta": { "node": "18.19.0" } -} +} \ No newline at end of file diff --git a/packages/ember/typescript/.eslintignore b/packages/ember/typescript/.eslintignore new file mode 100644 index 00000000..7124caf4 --- /dev/null +++ b/packages/ember/typescript/.eslintignore @@ -0,0 +1,3 @@ +declarations/ +node_modules/ +__snapshots__/ diff --git a/packages/ember/typescript/.eslintrc.cjs b/packages/ember/typescript/.eslintrc.cjs new file mode 100644 index 00000000..7701072a --- /dev/null +++ b/packages/ember/typescript/.eslintrc.cjs @@ -0,0 +1,10 @@ +"use strict"; + +const { configs } = require("@nullvoxpopuli/eslint-configs"); + +const config = configs.node(); + +module.exports = { + ...config, + overrides: [...config.overrides], +}; diff --git a/packages/ember/typescript/.prettierignore b/packages/ember/typescript/.prettierignore new file mode 100644 index 00000000..7124caf4 --- /dev/null +++ b/packages/ember/typescript/.prettierignore @@ -0,0 +1,3 @@ +declarations/ +node_modules/ +__snapshots__/ diff --git a/packages/ember/typescript/.prettierrc.cjs b/packages/ember/typescript/.prettierrc.cjs new file mode 100644 index 00000000..3401f9a7 --- /dev/null +++ b/packages/ember/typescript/.prettierrc.cjs @@ -0,0 +1,12 @@ +"use strict"; + +module.exports = { + overrides: [ + { + files: "*.{js,ts}", + options: { + singleQuote: true, + }, + }, + ], +}; diff --git a/packages/ember/typescript/index.js b/packages/ember/typescript/index.js new file mode 100644 index 00000000..ab575c0e --- /dev/null +++ b/packages/ember/typescript/index.js @@ -0,0 +1,127 @@ +// @ts-check +import assert from 'node:assert'; +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { ember, packageJson, project } from 'ember-apply'; + +import { createConfigDTS } from './src/config-directory.js'; +import { + enableTSInAddonIndex, + enableTSInECBuild, +} from './src/ensure-ts-transpilation.js'; +import { setupESLint } from './src/eslint.js'; +import { printDetectedInfo } from './src/info.js'; +import { + adjustAddonScripts, + adjustAppScripts, + configureDependencies, +} from './src/package-json.js'; +import { createAddonTSConfig, createAppTSConfig } from './src/tsconfig.js'; +import { + createAddonTypesDirectory, + createAppTypesDirectory, +} from './src/types-directory.js'; + +/** + * Codemod to transferm a JS ember project to a TS ember project. + * - Support + * - V1 App + * - V1 Addon + * - ember-data presence forcing the ejection of built in types + * (ember-data's types are not compatible with the built in types) + * + * - No Support + * - V2 Addon + * + */ +export default async function run() { + let isEmber = await ember.isEmberProject(); + + assert( + isEmber, + `Project is not an ember project, so typescript will not be applied`, + ); + + let isAddon = await ember.isAddon(); + let isApp = !isAddon; + let isV2Addon = await ember.isV2Addon(); + + assert( + !isV2Addon, + `Project is a V2 addon and cannot be automatically updated to use TypeScript as V2 addons have too much variation. Confer with the V2 addon blueprint's --typescript output for details on using TypeScript: https://github.com/embroider-build/addon-blueprint/`, + ); + + assert( + await packageJson.hasDependency('ember-source', '>= 3.24.0'), + `ember-source version must be at least 3.24`, + ); + + if (isApp) { + return appToTypeScript(); + } + + return addonToTypeScript(); +} + +async function appToTypeScript() { + await printDetectedInfo(); + await enableTSInECBuild(); + await createConfigDTS(); + await createAppTSConfig(); + await createAppTypesDirectory(); + await adjustAppScripts(); + await setupESLint(); + await configureDependencies(); + + // Grrr GlimmerVM + await fixPre1dot0GlimmerAndPnpm(); + + let manager = await project.getPackageManager(); + + console.info(` + ✨✨✨ + + 🥳 Your JavaScript app is now a TypeScript app 🥳 + + Tasks to manually do + - run '${manager} install' + - make sure '${manager} run lint:types' succeeds + - commit! + + ✨✨✨ + `); +} + +async function addonToTypeScript() { + await enableTSInECBuild(); // dummy app + await enableTSInAddonIndex(); + await createAddonTSConfig(); + await createAddonTypesDirectory(); + await adjustAddonScripts(); + await setupESLint(); + await configureDependencies(); +} + +/** + * Without this we get a super old copy of manager/validator in the 0.4x range + */ +async function fixPre1dot0GlimmerAndPnpm() { + let manager = await project.getPackageManager(); + + if (manager !== 'pnpm') return; + + let root = await project.workspaceRoot(); + + await packageJson.modify((json) => { + json.pnpm ||= {}; + json.pnpm.overrides ||= {}; + json.pnpm.overrides['@glimmer/manager'] ||= '>= 0.84.3'; + json.pnpm.overrides['@glimmer/validator'] ||= '>= 0.84.3'; + }, root); +} + +// @ts-ignore +const __dirname = dirname(fileURLToPath(import.meta.url)); + +run.path = __dirname; diff --git a/packages/ember/typescript/package.json b/packages/ember/typescript/package.json new file mode 100644 index 00000000..22005335 --- /dev/null +++ b/packages/ember/typescript/package.json @@ -0,0 +1,75 @@ +{ + "name": "@ember-apply/typescript", + "description": "ember-apply plugin for adding typescript to an existing app", + "version": "1.0.0", + "type": "module", + "license": "MIT", + "preset": "index.js", + "author": "NullVoxPopuli", + "repository": { + "url": "https://github.com/NullVoxPopuli/ember-apply", + "type": "https", + "directory": "packages/ember/tailwind" + }, + "keywords": [ + "ember", + "typescript", + "ember-apply", + "blueprint" + ], + "exports": { + "import": "./index.js" + }, + "files": [ + "index.js", + "src" + ], + "scripts": { + "lint:types": "tsc --noEmit", + "build": "tsc --build", + "lint": "pnpm lint:js", + "lint:js": "eslint .", + "lint:fix": "pnpm lint:js --fix", + "test": "vitest --coverage --no-watch", + "test:watch": "vitest --watch" + }, + "dependencies": { + "chalk": "^5.3.0", + "common-tags": "^1.8.2", + "ember-apply": "workspace:^", + "execa": "^8.0.1", + "fs-extra": "^11.1.1", + "latest-version": "^7.0.0" + }, + "devDependencies": { + "@babel/eslint-parser": "^7.23.3", + "@nullvoxpopuli/eslint-configs": "^3.2.2", + "@types/common-tags": "^1.8.4", + "@types/fs-extra": "^11.0.4", + "@types/jscodeshift": "^0.11.10", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "@vitest/coverage-c8": "^0.33.0", + "@vitest/coverage-v8": "^0.34.6", + "ast-types": "^0.14.2", + "autoprefixer": "^10.4.16", + "c8": "^8.0.1", + "eslint": "^8.54.0", + "eslint-plugin-decorator-position": "^5.0.2", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^5.0.1", + "jscodeshift": "^0.15.1", + "postcss": "^8.4.31", + "prettier": "^3.1.0", + "typescript": "5.2.2", + "vite": "^5.0.0", + "vitest": "^0.34.6" + }, + "engines": { + "node": ">=16.0.0" + }, + "volta": { + "node": "18.18.2" + } +} diff --git a/packages/ember/typescript/src/config-directory.js b/packages/ember/typescript/src/config-directory.js new file mode 100644 index 00000000..d692c2f0 --- /dev/null +++ b/packages/ember/typescript/src/config-directory.js @@ -0,0 +1,32 @@ +import fs from 'node:fs/promises'; + +import { stripIndent } from 'common-tags'; +import fse from 'fs-extra'; + +import { getModuleName } from './utils.js'; + +export async function createConfigDTS() { + let name = await getModuleName(); + + await fse.ensureDir('app/config'); + + await fs.writeFile( + 'app/config/environment.d.ts', + stripIndent` + /** + * Type declarations for + * import config from '${name}/config/environment' + */ + declare const config: { + environment: string; + modulePrefix: string; + podModulePrefix: string; + locationType: 'history' | 'hash' | 'none'; + rootURL: string; + APP: Record; + }; + + export default config; + `, + ); +} diff --git a/packages/ember/typescript/src/deps.js b/packages/ember/typescript/src/deps.js new file mode 100644 index 00000000..e69de29b diff --git a/packages/ember/typescript/src/ensure-ts-transpilation.js b/packages/ember/typescript/src/ensure-ts-transpilation.js new file mode 100644 index 00000000..978e5348 --- /dev/null +++ b/packages/ember/typescript/src/ensure-ts-transpilation.js @@ -0,0 +1,102 @@ +import chalk from 'chalk'; +import { js } from 'ember-apply'; + +export async function enableTSInECBuild() { + await js.transform('ember-cli-build.js', async ({ root, j }) => { + let emberAppName = ''; + + // find const EmberApp = require('ember-cli/lib/broccoli/ember-app'); + root + .find(j.VariableDeclarator, { + init: { + callee: { name: 'require' }, + arguments: [{ value: 'ember-cli/lib/broccoli/ember-app' }], + }, + }) + .forEach((path) => { + let node = path.node; + + if (node.id.type === 'Identifier') { + emberAppName = node.id.name; + } + }); + + if (!emberAppName) { + return couldNot(); + } + + // find the second object passed to EmberApp + // let app = new EmberApp(defaults, { + /** @type {import('ast-types').namedTypes.ObjectExpression | undefined} */ + let config = undefined; + + root + .find(j.NewExpression, { callee: { name: emberAppName } }) + .forEach((path) => { + let secondArg = path.node.arguments[1]; + + if (secondArg.type === 'ObjectExpression') { + config = secondArg; + } + }); + + if (!config) { + return couldNot(); + } + + // TODO: why is `config` type `never`? + // wat + /** @type {import('ast-types').namedTypes.ObjectExpression} */ + let configObject = config; + + // make `ember-cli-babel` exist as a config object + let ecb = configObject.properties.find((property) => { + if (property.type === 'Property') { + if (property.key.type === 'Literal') { + return property.key.value === 'ember-cli-babel'; + } + } + + return false; + }); + + let ts = j.property( + 'init', + j.identifier('enableTypeScriptTransform'), + j.literal(true), + ); + + if (!ecb) { + ecb = j.property( + 'init', + j.literal('ember-cli-babel'), + j.objectExpression([ts]), + ); + configObject.properties.unshift(ecb); + + return; + } + + if (ecb.type === 'Property') { + let theActualObject = ecb.value; + + if (theActualObject.type === 'ObjectExpression') { + theActualObject.properties.unshift(ts); + + return; + } + } + + couldNot(); + }); +} + +function couldNot() { + console.warn( + chalk.yellow( + `Could not determine where to enable TypeScripts in ember-cli-build.js. Please refer to the docs: https://github.com/emberjs/ember-cli-babel#enabling-typescript-transpilation`, + ), + ); +} + +export async function enableTSInAddonIndex() {} diff --git a/packages/ember/typescript/src/eslint.js b/packages/ember/typescript/src/eslint.js new file mode 100644 index 00000000..aa6852b0 --- /dev/null +++ b/packages/ember/typescript/src/eslint.js @@ -0,0 +1,14 @@ +import { npm, packageJson } from 'ember-apply'; + +const standardDeps = [ + '@typescript-eslint/eslint-plugin', + '@typescript-eslint/parser', +]; + +export async function setupESLint() { + let depsWithVersions = await npm.getLatest(standardDeps); + + await packageJson.addDevDependencies(depsWithVersions); + + // TODO: append an overrides entry +} diff --git a/packages/ember/typescript/src/info.js b/packages/ember/typescript/src/info.js new file mode 100644 index 00000000..b40b15a0 --- /dev/null +++ b/packages/ember/typescript/src/info.js @@ -0,0 +1,28 @@ +import { packageJson } from 'ember-apply'; + +import { canUseBuiltInTypes, isEmberDataPresent } from './queries.js'; + +export async function printDetectedInfo() { + /** @type {any} */ + let manifest = await packageJson.read(); + + let allDeps = { + ...(manifest.devDependencies || {}), + ...(manifest.dependencies || {}), + }; + + let emberSource = allDeps['ember-source']; + let emberCli = allDeps['ember-cli']; + let emberCliBabel = allDeps['ember-cli-babel']; + + console.info(` + Specified Versions: + ember-cli: ${emberCli} + ember-source: ${emberSource} + ember-cli-babel: ${emberCliBabel} + + Queries: + has ember-data? ${await isEmberDataPresent()} + can use built in types? ${await canUseBuiltInTypes()} + `); +} diff --git a/packages/ember/typescript/src/package-json.js b/packages/ember/typescript/src/package-json.js new file mode 100644 index 00000000..3d58958c --- /dev/null +++ b/packages/ember/typescript/src/package-json.js @@ -0,0 +1,37 @@ +import { npm, packageJson } from 'ember-apply'; + +export async function adjustAppScripts() { + await packageJson.addScript('lint:types', 'glint'); +} + +import { canUseBuiltInTypes, isEmberDataPresent } from './queries.js'; + +export async function adjustAddonScripts() { + throw new Error(`Addons are not yet supported. PR's welcome!`); +} + +const standardDeps = [ + '@tsconfig/ember', + '@glint/core', + '@glint/template', + '@glint/environment-ember-loose', + '@glint/environment-ember-template-imports', + '@types/qunit', + '@types/rsvp', + 'typescript', +]; + +export async function configureDependencies() { + let depsWithVersions = await npm.getLatest(standardDeps); + + await packageJson.addDevDependencies(depsWithVersions); + + if (await canUseBuiltInTypes()) { + /* nothing to do, types are built in to ember-source and ember-data */ + return; + } else { + if (await isEmberDataPresent()) { + throw new Error(`Ember data isn't yet supported. PR's welcome!`); + } + } +} diff --git a/packages/ember/typescript/src/queries.js b/packages/ember/typescript/src/queries.js new file mode 100644 index 00000000..51a72f59 --- /dev/null +++ b/packages/ember/typescript/src/queries.js @@ -0,0 +1,30 @@ +import { packageJson } from 'ember-apply'; + +/** + * ember-data has not yet published types compatible with ember-source + */ +export async function isEmberDataPresent() { + let manifest = await packageJson.read(); + let allDeps = [ + ...Object.keys(manifest.dependencies || {}), + ...Object.keys(manifest.devDependencies || {}), + ]; + + return allDeps.some( + (dep) => dep.startsWith('@ember-data') || dep === 'ember-data', + ); +} + +export async function canUseBuiltInTypes() { + let newEnoughEmberSource = await packageJson.hasDependency( + 'ember-source', + '>= 5.1', + ); + let noEmberData = !(await isEmberDataPresent()); + + /** + * At some point ember-data will have types compatible with the built in types, + * and at that point, we'll need to add some version checks + */ + return newEnoughEmberSource && noEmberData; +} diff --git a/packages/ember/typescript/src/tsconfig.js b/packages/ember/typescript/src/tsconfig.js new file mode 100644 index 00000000..611d74fe --- /dev/null +++ b/packages/ember/typescript/src/tsconfig.js @@ -0,0 +1,63 @@ +import fs from 'node:fs/promises'; + +import { stripIndent } from 'common-tags'; + +import { getModuleName } from './utils.js'; + +export async function createAppTSConfig() { + let name = await getModuleName(); + + await fs.writeFile( + 'tsconfig.json', + stripIndent` + { + "extends": "@tsconfig/ember/tsconfig.json", + "compilerOptions": { + // The combination of \`baseUrl\` with \`paths\` allows Ember's classic package + // layout, which is not resolvable with the Node resolution algorithm, to + // work with TypeScript. + "baseUrl": ".", + "paths": { + "${name}/tests/*": ["tests/*"], + "${name}/*": ["app/*"], + "*": ["types/*"] + } + }, + "glint": { + "environment": ["ember-loose", "ember-template-imports"] + } + } + `, + ); +} + +export async function createAddonTSConfig() { + let name = await getModuleName(); + + await fs.writeFile( + 'tsconfig.json', + stripIndent` + { + "extends": "@tsconfig/ember/tsconfig.json", + "compilerOptions": { + // The combination of \`baseUrl\` with \`paths\` allows Ember's classic package + // layout, which is not resolvable with the Node resolution algorithm, to + // work with TypeScript. + "baseUrl": ".", + "paths": { + "dummy/tests/*": ["tests/*"], + "dummy/*": ["tests/dummy/app/*", "app/*"], + "${name}": ["addon"], + "${name}/*": ["addon/*"], + "${name}/test-support": ["addon-test-support"], + "${name}/test-support/*": ["addon-test-support/*"], + "*": ["types/*"] + } + }, + "glint": { + "environment": ["ember-loose", "ember-template-imports"] + } + } + `, + ); +} diff --git a/packages/ember/typescript/src/types-directory.js b/packages/ember/typescript/src/types-directory.js new file mode 100644 index 00000000..dc85dd37 --- /dev/null +++ b/packages/ember/typescript/src/types-directory.js @@ -0,0 +1,67 @@ +import { stripIndent } from 'common-tags'; +import fse from 'fs-extra'; + +import { canUseBuiltInTypes } from './queries.js'; + +export async function createAppTypesDirectory() { + await fse.ensureDir('types'); + + if (await canUseBuiltInTypes()) { + await fse.writeFile( + 'types/global.d.ts', + stripIndent` + // Declare the @ember/* packages brought in from ember-source + import 'ember-source/types'; + `, + ); + } + + await fse.writeFile( + `types/glint.d.ts`, + stripIndent` + // Setup Glint Globals + import '@glint/environment-ember-loose'; + import '@glint/environment-ember-template-imports'; + + declare module '@glint/environment-ember-loose/registry' { + // Remove this once entries have been added! 👇 + // eslint-disable-next-line @typescript-eslint/no-empty-interface + export default interface Registry { + // Add any registry entries from other addons here that your addon itself uses (in non-strict mode templates) + // See https://typed-ember.gitbook.io/glint/using-glint/ember/using-addons + } + } + `, + ); +} + +export async function createAddonTypesDirectory() { + if (await canUseBuiltInTypes()) { + await fse.writeFile( + 'types/global.d.ts', + stripIndent` + // Declare the @ember/* packages brought in from ember-source + import 'ember-source/types'; + `, + ); + } + + await fse.writeFile( + `unpublished-development-types/glint.d.ts`, + stripIndent` + // Add any types here that you need for local development only. + // These will *not* be published as part of your addon, so be careful that your published code does not rely on them! + import '@glint/environment-ember-loose'; + import '@glint/environment-ember-template-imports'; + + declare module '@glint/environment-ember-loose/registry' { + // Remove this once entries have been added! 👇 + // eslint-disable-next-line @typescript-eslint/no-empty-interface + export default interface Registry { + // Add any registry entries from other addons here that your addon itself uses (in non-strict mode templates) + // See https://typed-ember.gitbook.io/glint/using-glint/ember/using-addons + } + } + `, + ); +} diff --git a/packages/ember/typescript/src/utils.js b/packages/ember/typescript/src/utils.js new file mode 100644 index 00000000..b19dde30 --- /dev/null +++ b/packages/ember/typescript/src/utils.js @@ -0,0 +1,8 @@ +import { packageJson } from 'ember-apply'; + +export async function getModuleName() { + let manifest = await packageJson.read(); + + // TODO: or config/environment.js something _for some reason_?!?!?!?! + return manifest.name; +} diff --git a/packages/ember/typescript/tests/__snapshots__/e2e.test.ts.snap b/packages/ember/typescript/tests/__snapshots__/e2e.test.ts.snap new file mode 100644 index 00000000..b353fe4e --- /dev/null +++ b/packages/ember/typescript/tests/__snapshots__/e2e.test.ts.snap @@ -0,0 +1,139 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`typescript > applying to an ember app > works via CLI 1`] = ` +" app/templates/application.hbs | 8 +------- + ember-cli-build.js | 4 +++- + package.json | 21 ++++++++++++++++++--- + 3 files changed, 22 insertions(+), 11 deletions(-)" +`; + +exports[`typescript > applying to an ember app > works via CLI 2`] = ` +"diff --git a/app/templates/application.hbs b/app/templates/application.hbs +index 0eacef7..b6fc4c6 100644 +--- a/app/templates/application.hbs ++++ b/app/templates/application.hbs +@@ -1,7 +1 @@ +-{{page-title \\"TestApp\\"}} +- +-{{! The following component displays Ember's default welcome message. }} +- +-{{! Feel free to remove this! }} +- +-{{outlet}} +\\\\ No newline at end of file ++hello +\\\\ No newline at end of file +diff --git a/ember-cli-build.js b/ember-cli-build.js +index ed991bd..8557327 100644 +--- a/ember-cli-build.js ++++ b/ember-cli-build.js +@@ -4,7 +4,9 @@ const EmberApp = require('ember-cli/lib/broccoli/ember-app'); + + module.exports = function (defaults) { + const app = new EmberApp(defaults, { +- // Add options here ++ \\"ember-cli-babel\\": { ++ enableTypeScriptTransform: true ++ } + }); + + return app.toTree(); + +package.json +{ + \\"name\\": \\"test-app\\", + \\"version\\": \\"0.0.0\\", + \\"private\\": true, + \\"description\\": \\"Small description for test-app goes here\\", + \\"repository\\": \\"\\", + \\"license\\": \\"MIT\\", + \\"author\\": \\"\\", + \\"directories\\": { + \\"doc\\": \\"doc\\", + \\"test\\": \\"tests\\" + }, + \\"scripts\\": { + \\"build\\": \\"ember build --environment=production\\", + \\"lint\\": \\"concurrently \\\\\\"npm:lint:*(!fix)\\\\\\" --names \\\\\\"lint:\\\\\\"\\", + \\"lint:css\\": \\"stylelint \\\\\\"**/*.css\\\\\\"\\", + \\"lint:css:fix\\": \\"concurrently \\\\\\"npm:lint:css -- --fix\\\\\\"\\", + \\"lint:fix\\": \\"concurrently \\\\\\"npm:lint:*:fix\\\\\\" --names \\\\\\"fix:\\\\\\"\\", + \\"lint:hbs\\": \\"ember-template-lint .\\", + \\"lint:hbs:fix\\": \\"ember-template-lint . --fix\\", + \\"lint:js\\": \\"eslint . --cache\\", + \\"lint:js:fix\\": \\"eslint . --fix\\", + \\"start\\": \\"ember serve\\", + \\"test\\": \\"concurrently \\\\\\"npm:lint\\\\\\" \\\\\\"npm:test:*\\\\\\" --names \\\\\\"lint,test:\\\\\\"\\", + \\"test:ember\\": \\"ember test\\", + \\"lint:types\\": \\"glint\\" + }, + \\"devDependencies\\": [ + \\"@babel/core\\", + \\"@babel/eslint-parser\\", + \\"@babel/plugin-proposal-decorators\\", + \\"@ember/optional-features\\", + \\"@ember/string\\", + \\"@ember/test-helpers\\", + \\"@glimmer/component\\", + \\"@glimmer/tracking\\", + \\"@glint/core\\", + \\"@glint/environment-ember-loose\\", + \\"@glint/environment-ember-template-imports\\", + \\"@glint/template\\", + \\"@tsconfig/ember\\", + \\"@types/qunit\\", + \\"@types/rsvp\\", + \\"@typescript-eslint/eslint-plugin\\", + \\"@typescript-eslint/parser\\", + \\"broccoli-asset-rev\\", + \\"concurrently\\", + \\"ember-auto-import\\", + \\"ember-cli\\", + \\"ember-cli-app-version\\", + \\"ember-cli-babel\\", + \\"ember-cli-clean-css\\", + \\"ember-cli-dependency-checker\\", + \\"ember-cli-htmlbars\\", + \\"ember-cli-inject-live-reload\\", + \\"ember-cli-sri\\", + \\"ember-cli-terser\\", + \\"ember-fetch\\", + \\"ember-load-initializers\\", + \\"ember-modifier\\", + \\"ember-page-title\\", + \\"ember-qunit\\", + \\"ember-resolver\\", + \\"ember-source\\", + \\"ember-template-lint\\", + \\"eslint\\", + \\"eslint-config-prettier\\", + \\"eslint-plugin-ember\\", + \\"eslint-plugin-n\\", + \\"eslint-plugin-prettier\\", + \\"eslint-plugin-qunit\\", + \\"loader.js\\", + \\"prettier\\", + \\"qunit\\", + \\"qunit-dom\\", + \\"stylelint\\", + \\"stylelint-config-standard\\", + \\"stylelint-prettier\\", + \\"tracked-built-ins\\", + \\"typescript\\", + \\"webpack\\" + ], + \\"engines\\": [ + \\"node\\" + ], + \\"ember\\": { + \\"edition\\": \\"octane\\" + }, + \\"pnpm\\": { + \\"overrides\\": { + \\"@glimmer/manager\\": \\">= 0.84.3\\", + \\"@glimmer/validator\\": \\">= 0.84.3\\" + } + } +} +" +`; diff --git a/packages/ember/typescript/tests/e2e.test.ts b/packages/ember/typescript/tests/e2e.test.ts new file mode 100644 index 00000000..f2d12a89 --- /dev/null +++ b/packages/ember/typescript/tests/e2e.test.ts @@ -0,0 +1,49 @@ +import fs from 'node:fs/promises'; +import path from 'node:path'; + +import { packageJson } from 'ember-apply'; +import { apply, diff, diffSummary, newEmberApp } from 'ember-apply/test-utils'; +import { execa } from 'execa'; +import { describe, expect, it } from 'vitest'; + +import { default as typescript } from '../index.js'; + +describe('typescript', () => { + it('default export exists', () => { + expect(typeof typescript).toEqual('function'); + }); + + describe('applying to an ember app', () => { + it('works via CLI', async () => { + let appLocation = await newEmberApp(); + + let getManifest = () => packageJson.read(appLocation); + + // Don't currently support ember-data + await packageJson.removeDevDependencies(['ember-data', 'ember-welcome-page'], appLocation); + expect((await getManifest()).devDependencies).to.not.toHaveProperty('ember-data'); + expect((await getManifest()).devDependencies).to.not.toHaveProperty('ember-welcome-page'); + await execa('pnpm', ['install', '--no-frozen-lockfile'], { cwd: appLocation }); + + // ember-page-title doesn't have types yet + // https://github.com/ember-cli/ember-page-title/pull/275 + await fs.writeFile(path.join(appLocation, 'app/templates/application.hbs'), `hello`); + + await apply(appLocation, typescript.path); + expect((await getManifest()).scripts).to.toHaveProperty('lint:types'); + + expect(await diffSummary(appLocation)).toMatchSnapshot(); + expect( + await diff(appLocation, { ignoreVersions: true }) + ).toMatchSnapshot(); + + let install = await execa('pnpm', ['install', '--no-frozen-lockfile'], { cwd: appLocation }); + + expect(install.exitCode, 'pnpm install').toBe(0); + + let lintTypes = await execa('pnpm', ['lint:types'], { cwd: appLocation }); + + expect(lintTypes.exitCode, 'lint:types').toBe(0); + }); + }); +}); diff --git a/packages/ember/typescript/tsconfig.json b/packages/ember/typescript/tsconfig.json new file mode 100644 index 00000000..a332714e --- /dev/null +++ b/packages/ember/typescript/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../../tsconfig.compiler-options.json", + "include": ["src/**/*"], + "references": [ + { "path": "../../../ember-apply" } + ] +} diff --git a/packages/ember/typescript/vitest.config.ts b/packages/ember/typescript/vitest.config.ts new file mode 100644 index 00000000..6aa55430 --- /dev/null +++ b/packages/ember/typescript/vitest.config.ts @@ -0,0 +1,9 @@ +/// +import { defineConfig } from 'vite'; + +export default defineConfig({ + test: { + testTimeout: 60_000, + hookTimeout: 30_000, + }, +}); diff --git a/packages/volta/package.json b/packages/volta/package.json index 115e7c59..7b4cdfb3 100644 --- a/packages/volta/package.json +++ b/packages/volta/package.json @@ -65,4 +65,4 @@ "volta": { "node": "18.19.0" } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8dc92846..96b1697a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -340,6 +340,97 @@ importers: specifier: ^0.34.6 version: 0.34.6(@vitest/ui@0.34.7) + packages/ember/typescript: + dependencies: + chalk: + specifier: ^5.3.0 + version: 5.3.0 + common-tags: + specifier: ^1.8.2 + version: 1.8.2 + ember-apply: + specifier: workspace:^ + version: link:../../../ember-apply + execa: + specifier: ^8.0.1 + version: 8.0.1 + fs-extra: + specifier: ^11.1.1 + version: 11.2.0 + latest-version: + specifier: ^7.0.0 + version: 7.0.0 + devDependencies: + '@babel/eslint-parser': + specifier: ^7.23.3 + version: 7.23.3(@babel/core@7.23.6)(eslint@8.56.0) + '@nullvoxpopuli/eslint-configs': + specifier: ^3.2.2 + version: 3.2.2(@babel/core@7.23.6)(@babel/eslint-parser@7.23.3)(@typescript-eslint/eslint-plugin@6.15.0)(@typescript-eslint/parser@6.15.0)(eslint@8.56.0)(prettier@3.1.1)(typescript@5.2.2) + '@types/common-tags': + specifier: ^1.8.4 + version: 1.8.4 + '@types/fs-extra': + specifier: ^11.0.4 + version: 11.0.4 + '@types/jscodeshift': + specifier: ^0.11.10 + version: 0.11.11 + '@typescript-eslint/eslint-plugin': + specifier: ^6.11.0 + version: 6.15.0(@typescript-eslint/parser@6.15.0)(eslint@8.56.0)(typescript@5.2.2) + '@typescript-eslint/parser': + specifier: ^6.11.0 + version: 6.15.0(eslint@8.56.0)(typescript@5.2.2) + '@vitest/coverage-c8': + specifier: ^0.33.0 + version: 0.33.0(vitest@0.34.6) + '@vitest/coverage-v8': + specifier: ^0.34.6 + version: 0.34.6(vitest@0.34.6) + ast-types: + specifier: ^0.14.2 + version: 0.14.2 + autoprefixer: + specifier: ^10.4.16 + version: 10.4.16(postcss@8.4.32) + c8: + specifier: ^8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.54.0 + version: 8.56.0 + eslint-plugin-decorator-position: + specifier: ^5.0.2 + version: 5.0.2(@babel/eslint-parser@7.23.3)(eslint@8.56.0) + eslint-plugin-import: + specifier: ^2.29.0 + version: 2.29.1(@typescript-eslint/parser@6.15.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-plugin-node: + specifier: ^11.1.0 + version: 11.1.0(eslint@8.56.0) + eslint-plugin-prettier: + specifier: ^5.0.1 + version: 5.1.2(eslint@8.56.0)(prettier@3.1.1) + jscodeshift: + specifier: ^0.15.1 + version: 0.15.1(@babel/preset-env@7.23.6) + postcss: + specifier: ^8.4.31 + version: 8.4.32 + prettier: + specifier: ^3.1.0 + version: 3.1.1 + typescript: + specifier: 5.2.2 + version: 5.2.2 + vite: + specifier: ^5.0.0 + version: 5.0.10(@types/node@20.10.5) + vitest: + specifier: ^0.34.6 + version: 0.34.6(@vitest/ui@0.34.7) + packages/ember/unstable-embroider: dependencies: ember-apply: @@ -552,7 +643,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.6 - dev: false /@babel/helper-compilation-targets@7.23.6: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} @@ -591,7 +681,6 @@ packages: '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 - dev: false /@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.23.6): resolution: {integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==} @@ -606,7 +695,6 @@ packages: resolve: 1.22.8 transitivePeerDependencies: - supports-color - dev: false /@babel/helper-environment-visitor@7.22.20: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} @@ -670,7 +758,6 @@ packages: '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 - dev: false /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.6): resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} @@ -720,7 +807,6 @@ packages: '@babel/helper-function-name': 7.23.0 '@babel/template': 7.22.15 '@babel/types': 7.23.6 - dev: false /@babel/helpers@7.23.6: resolution: {integrity: sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==} @@ -755,7 +841,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} @@ -767,7 +852,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.6) - dev: false /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==} @@ -778,7 +862,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-proposal-decorators@7.23.6(@babel/core@7.23.6): resolution: {integrity: sha512-D7Ccq9LfkBFnow3azZGJvZYgcfeqAw3I1e5LoTpj6UKIFQilh8yqXsIGcRIqbBdsPWIz+Ze7ZZfggSj62Qp+Fg==} @@ -802,7 +885,6 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.6 - dev: false /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.6): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} @@ -811,7 +893,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.6): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} @@ -820,7 +901,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.6): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} @@ -830,7 +910,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==} @@ -849,7 +928,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.6): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} @@ -858,7 +936,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-flow@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==} @@ -868,7 +945,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} @@ -878,7 +954,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} @@ -888,7 +963,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.6): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} @@ -897,7 +971,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.6): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} @@ -906,7 +979,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} @@ -916,7 +988,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.6): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} @@ -925,7 +996,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.6): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} @@ -934,7 +1004,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.6): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} @@ -943,7 +1012,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.6): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} @@ -952,7 +1020,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.6): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} @@ -961,7 +1028,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.6): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} @@ -970,7 +1036,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.6): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} @@ -980,7 +1045,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.6): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} @@ -990,7 +1054,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} @@ -1000,7 +1063,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.6): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} @@ -1011,7 +1073,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} @@ -1021,7 +1082,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-async-generator-functions@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==} @@ -1034,7 +1094,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.6) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.6) - dev: false /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} @@ -1046,7 +1105,6 @@ packages: '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.6) - dev: false /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} @@ -1056,7 +1114,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} @@ -1066,7 +1123,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} @@ -1077,7 +1133,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} @@ -1089,7 +1144,6 @@ packages: '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.6) - dev: false /@babel/plugin-transform-classes@7.23.5(@babel/core@7.23.6): resolution: {integrity: sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==} @@ -1107,7 +1161,6 @@ packages: '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.6) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 - dev: false /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} @@ -1118,7 +1171,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 '@babel/template': 7.22.15 - dev: false /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} @@ -1128,7 +1180,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} @@ -1139,7 +1190,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} @@ -1149,7 +1199,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} @@ -1160,7 +1209,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.6) - dev: false /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} @@ -1171,7 +1219,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==} @@ -1182,7 +1229,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.6) - dev: false /@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==} @@ -1193,7 +1239,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.6) - dev: false /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.6): resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} @@ -1204,7 +1249,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: false /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} @@ -1216,7 +1260,6 @@ packages: '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} @@ -1227,7 +1270,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.6) - dev: false /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} @@ -1237,7 +1279,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} @@ -1248,7 +1289,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.6) - dev: false /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} @@ -1258,7 +1298,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} @@ -1269,7 +1308,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} @@ -1281,7 +1319,6 @@ packages: '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 - dev: false /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==} @@ -1294,7 +1331,6 @@ packages: '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-identifier': 7.22.20 - dev: false /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} @@ -1305,7 +1341,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.6): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} @@ -1316,7 +1351,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} @@ -1326,7 +1360,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} @@ -1337,7 +1370,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.6) - dev: false /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} @@ -1348,7 +1380,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.6) - dev: false /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==} @@ -1362,7 +1393,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.6) '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.6) - dev: false /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} @@ -1373,7 +1403,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.6) - dev: false /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} @@ -1384,7 +1413,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.6) - dev: false /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} @@ -1396,7 +1424,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.6) - dev: false /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} @@ -1406,7 +1433,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} @@ -1417,7 +1443,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} @@ -1430,7 +1455,6 @@ packages: '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.6) - dev: false /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} @@ -1440,7 +1464,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} @@ -1451,7 +1474,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.2 - dev: false /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} @@ -1461,7 +1483,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} @@ -1471,7 +1492,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} @@ -1482,7 +1502,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: false /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} @@ -1492,7 +1511,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} @@ -1502,7 +1520,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} @@ -1512,7 +1529,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.6): resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} @@ -1525,7 +1541,6 @@ packages: '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.6) - dev: false /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} @@ -1535,7 +1550,6 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} @@ -1546,7 +1560,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} @@ -1557,7 +1570,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} @@ -1568,7 +1580,6 @@ packages: '@babel/core': 7.23.6 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/preset-env@7.23.6(@babel/core@7.23.6): resolution: {integrity: sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ==} @@ -1659,7 +1670,6 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: false /@babel/preset-flow@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==} @@ -1671,7 +1681,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.23.5 '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.23.6) - dev: false /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.6): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} @@ -1682,7 +1691,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/types': 7.23.6 esutils: 2.0.3 - dev: false /@babel/preset-typescript@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} @@ -1696,7 +1704,6 @@ packages: '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.6) '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.6) '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.6) - dev: false /@babel/register@7.22.15(@babel/core@7.23.6): resolution: {integrity: sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg==} @@ -1710,11 +1717,9 @@ packages: make-dir: 2.1.0 pirates: 4.0.6 source-map-support: 0.5.21 - dev: false /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - dev: false /@babel/runtime@7.23.6: resolution: {integrity: sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==} @@ -2426,6 +2431,57 @@ packages: - supports-color dev: false + /@nullvoxpopuli/eslint-configs@3.2.2(@babel/core@7.23.6)(@babel/eslint-parser@7.23.3)(@typescript-eslint/eslint-plugin@6.15.0)(@typescript-eslint/parser@6.15.0)(eslint@8.56.0)(prettier@3.1.1)(typescript@5.2.2): + resolution: {integrity: sha512-Qm7TR7K+kb5emAoddPsoznmAgUptL7YWUOdtaBq2T4pgkEyr7JTS1v4TPg07LusfYi2He2nKJBdTcD++hrsNdw==} + engines: {node: '>= v16.0.0'} + peerDependencies: + '@babel/core': ^7.22.10 + '@babel/eslint-parser': ^7.22.10 + '@typescript-eslint/eslint-plugin': ^5.62.0 || >= 6.0.0 + '@typescript-eslint/parser': ^5.62.0 || >= 6.0.0 + eslint: ^7.0.0 || ^8.0.0 + eslint-plugin-ember: '>= 11.10.0' + eslint-plugin-qunit: '>= 8.0.0' + prettier: ^2.8.8 || >= 3.0.0 + peerDependenciesMeta: + '@babel/core': + optional: true + '@babel/eslint-parser': + optional: true + '@typescript-eslint/eslint-plugin': + optional: true + '@typescript-eslint/parser': + optional: true + eslint-plugin-ember: + optional: true + eslint-plugin-qunit: + optional: true + prettier: + optional: true + dependencies: + '@babel/core': 7.23.6 + '@babel/eslint-parser': 7.23.3(@babel/core@7.23.6)(eslint@8.56.0) + '@typescript-eslint/eslint-plugin': 6.15.0(@typescript-eslint/parser@6.15.0)(eslint@8.56.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.15.0(eslint@8.56.0)(typescript@5.2.2) + cosmiconfig: 8.3.6(typescript@5.2.2) + eslint: 8.56.0 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.15.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + eslint-plugin-decorator-position: 5.0.2(@babel/eslint-parser@7.23.3)(eslint@8.56.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.15.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-plugin-json: 3.1.0 + eslint-plugin-n: 16.5.0(eslint@8.56.0) + eslint-plugin-prettier: 4.2.1(eslint@8.56.0)(prettier@3.1.1) + eslint-plugin-simple-import-sort: 10.0.0(eslint@8.56.0) + prettier: 3.1.1 + prettier-plugin-ember-template-tag: 1.1.0(prettier@3.1.1) + transitivePeerDependencies: + - eslint-config-prettier + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + - typescript + dev: true + /@nullvoxpopuli/eslint-configs@3.2.2(@babel/core@7.23.6)(@babel/eslint-parser@7.23.3)(@typescript-eslint/eslint-plugin@6.15.0)(@typescript-eslint/parser@6.15.0)(eslint@8.56.0)(prettier@3.1.1)(typescript@5.3.3): resolution: {integrity: sha512-Qm7TR7K+kb5emAoddPsoznmAgUptL7YWUOdtaBq2T4pgkEyr7JTS1v4TPg07LusfYi2He2nKJBdTcD++hrsNdw==} engines: {node: '>= v16.0.0'} @@ -2726,6 +2782,10 @@ packages: resolution: {integrity: sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==} dev: true + /@types/common-tags@1.8.4: + resolution: {integrity: sha512-S+1hLDJPjWNDhcGxsxEbepzaxWqURP/o+3cP4aa2w7yBXgdcmKGQtZzP8JbyfOd0m+33nh+8+kvxYE2UJtBDkg==} + dev: true + /@types/fs-extra@11.0.4: resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} dependencies: @@ -2856,6 +2916,35 @@ packages: '@types/yargs-parser': 21.0.3 dev: true + /@typescript-eslint/eslint-plugin@6.15.0(@typescript-eslint/parser@6.15.0)(eslint@8.56.0)(typescript@5.2.2): + resolution: {integrity: sha512-j5qoikQqPccq9QoBAupOP+CBu8BaJ8BLjaXSioDISeTZkVO3ig7oSIKh3H+rEpee7xCXtWwSB4KIL5l6hWZzpg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.15.0(eslint@8.56.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.15.0 + '@typescript-eslint/type-utils': 6.15.0(eslint@8.56.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.15.0(eslint@8.56.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.15.0 + debug: 4.3.4 + eslint: 8.56.0 + graphemer: 1.4.0 + ignore: 5.3.0 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/eslint-plugin@6.15.0(@typescript-eslint/parser@6.15.0)(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-j5qoikQqPccq9QoBAupOP+CBu8BaJ8BLjaXSioDISeTZkVO3ig7oSIKh3H+rEpee7xCXtWwSB4KIL5l6hWZzpg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -2885,6 +2974,27 @@ packages: - supports-color dev: true + /@typescript-eslint/parser@6.15.0(eslint@8.56.0)(typescript@5.2.2): + resolution: {integrity: sha512-MkgKNnsjC6QwcMdlNAel24jjkEO/0hQaMDLqP4S9zq5HBAUJNQB6y+3DwLjX7b3l2b37eNAxMPLwb3/kh8VKdA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.15.0 + '@typescript-eslint/types': 6.15.0 + '@typescript-eslint/typescript-estree': 6.15.0(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.15.0 + debug: 4.3.4 + eslint: 8.56.0 + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/parser@6.15.0(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-MkgKNnsjC6QwcMdlNAel24jjkEO/0hQaMDLqP4S9zq5HBAUJNQB6y+3DwLjX7b3l2b37eNAxMPLwb3/kh8VKdA==} engines: {node: ^16.0.0 || >=18.0.0} @@ -2914,6 +3024,26 @@ packages: '@typescript-eslint/visitor-keys': 6.15.0 dev: true + /@typescript-eslint/type-utils@6.15.0(eslint@8.56.0)(typescript@5.2.2): + resolution: {integrity: sha512-CnmHKTfX6450Bo49hPg2OkIm/D/TVYV7jO1MCfPYGwf6x3GO0VU8YMO5AYMn+u3X05lRRxA4fWCz87GFQV6yVQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 6.15.0(typescript@5.2.2) + '@typescript-eslint/utils': 6.15.0(eslint@8.56.0)(typescript@5.2.2) + debug: 4.3.4 + eslint: 8.56.0 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/type-utils@6.15.0(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-CnmHKTfX6450Bo49hPg2OkIm/D/TVYV7jO1MCfPYGwf6x3GO0VU8YMO5AYMn+u3X05lRRxA4fWCz87GFQV6yVQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -2939,6 +3069,27 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true + /@typescript-eslint/typescript-estree@6.15.0(typescript@5.2.2): + resolution: {integrity: sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.15.0 + '@typescript-eslint/visitor-keys': 6.15.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/typescript-estree@6.15.0(typescript@5.3.3): resolution: {integrity: sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew==} engines: {node: ^16.0.0 || >=18.0.0} @@ -2960,6 +3111,25 @@ packages: - supports-color dev: true + /@typescript-eslint/utils@6.15.0(eslint@8.56.0)(typescript@5.2.2): + resolution: {integrity: sha512-eF82p0Wrrlt8fQSRL0bGXzK5nWPRV2dYQZdajcfzOD9+cQz9O7ugifrJxclB+xVOvWvagXfqS4Es7vpLP4augw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.6 + '@typescript-eslint/scope-manager': 6.15.0 + '@typescript-eslint/types': 6.15.0 + '@typescript-eslint/typescript-estree': 6.15.0(typescript@5.2.2) + eslint: 8.56.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/utils@6.15.0(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-eF82p0Wrrlt8fQSRL0bGXzK5nWPRV2dYQZdajcfzOD9+cQz9O7ugifrJxclB+xVOvWvagXfqS4Es7vpLP4augw==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3290,7 +3460,6 @@ packages: object-is: 1.1.5 object.assign: 4.1.5 util: 0.12.5 - dev: false /assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} @@ -3313,7 +3482,6 @@ packages: engines: {node: '>=4'} dependencies: tslib: 2.6.2 - dev: false /async-disk-cache@1.3.5: resolution: {integrity: sha512-VZpqfR0R7CEOJZ/0FOTgWq70lCrZyS1rkI8PXugDUkTKyyAUgZ2zQ09gLhMkEn+wN8LYeUTPxZdXtlX/kmbXKQ==} @@ -3393,7 +3561,6 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.6 - dev: false /babel-import-util@0.2.0: resolution: {integrity: sha512-CtWYYHU/MgK88rxMrLfkD356dApswtR/kWZ/c6JifG1m10e7tBBrs/366dFzWMAoqYmG5/JSh+94tUSpIwh+ag==} @@ -3450,7 +3617,6 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: false /babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.23.6): resolution: {integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==} @@ -3462,7 +3628,6 @@ packages: core-js-compat: 3.34.0 transitivePeerDependencies: - supports-color - dev: false /babel-plugin-polyfill-regenerator@0.5.4(@babel/core@7.23.6): resolution: {integrity: sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==} @@ -3473,7 +3638,6 @@ packages: '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.6) transitivePeerDependencies: - supports-color - dev: false /bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -3764,7 +3928,6 @@ packages: /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: false /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -4048,7 +4211,6 @@ packages: is-plain-object: 2.0.4 kind-of: 6.0.3 shallow-clone: 3.0.1 - dev: false /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} @@ -4096,9 +4258,13 @@ packages: engines: {node: '>= 12'} dev: false + /common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + dev: false + /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - dev: false /component-emitter@1.3.1: resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} @@ -4142,7 +4308,6 @@ packages: resolution: {integrity: sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==} dependencies: browserslist: 4.22.2 - dev: false /cosmiconfig@6.0.0: resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} @@ -4155,6 +4320,22 @@ packages: yaml: 1.10.2 dev: false + /cosmiconfig@8.3.6(typescript@5.2.2): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.2.2 + dev: true + /cosmiconfig@8.3.6(typescript@5.3.3): resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} @@ -5293,14 +5474,12 @@ packages: commondir: 1.0.1 make-dir: 2.1.0 pkg-dir: 3.0.0 - dev: false /find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} dependencies: locate-path: 3.0.0 - dev: false /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} @@ -5359,7 +5538,6 @@ packages: /flow-parser@0.225.1: resolution: {integrity: sha512-50fjR6zbLQcpq5IFNkheUSY/AFPxVeeLiBM5B3NQBSKId2G0cUuExOlDDOguxc49dl9lnh8hI1xcYlPJWNp4KQ==} engines: {node: '>=0.4.0'} - dev: false /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -5991,7 +6169,6 @@ packages: dependencies: call-bind: 1.0.5 has-tostringtag: 1.0.0 - dev: false /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} @@ -6105,7 +6282,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: false /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} @@ -6145,7 +6321,6 @@ packages: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 - dev: false /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} @@ -6190,7 +6365,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 - dev: false /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} @@ -6293,7 +6467,6 @@ packages: /isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} - dev: false /istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} @@ -6410,12 +6583,10 @@ packages: write-file-atomic: 2.4.3 transitivePeerDependencies: - supports-color - dev: false /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true - dev: false /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} @@ -6548,7 +6719,6 @@ packages: dependencies: p-locate: 3.0.0 path-exists: 3.0.0 - dev: false /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} @@ -6573,7 +6743,6 @@ packages: /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - dev: false /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -6665,7 +6834,6 @@ packages: dependencies: pify: 4.0.1 semver: 5.7.2 - dev: false /make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} @@ -7037,7 +7205,6 @@ packages: engines: {node: '>= 0.10.5'} dependencies: minimatch: 3.1.2 - dev: false /node-gyp@10.0.1: resolution: {integrity: sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==} @@ -7196,7 +7363,6 @@ packages: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 - dev: false /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} @@ -7366,7 +7532,6 @@ packages: engines: {node: '>=6'} dependencies: p-limit: 2.3.0 - dev: false /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} @@ -7470,7 +7635,6 @@ packages: /path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} - dev: false /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} @@ -7552,14 +7716,12 @@ packages: /pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - dev: false /pkg-dir@3.0.0: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} engines: {node: '>=6'} dependencies: find-up: 3.0.0 - dev: false /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} @@ -7855,7 +8017,6 @@ packages: esprima: 4.0.1 source-map: 0.6.1 tslib: 2.6.2 - dev: false /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} @@ -7870,11 +8031,9 @@ packages: engines: {node: '>=4'} dependencies: regenerate: 1.4.2 - dev: false /regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - dev: false /regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -7883,7 +8042,6 @@ packages: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: '@babel/runtime': 7.23.6 - dev: false /regex-not@1.0.2: resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} @@ -7917,7 +8075,6 @@ packages: regjsparser: 0.9.1 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 - dev: false /registry-auth-token@5.0.2: resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} @@ -7938,7 +8095,6 @@ packages: hasBin: true dependencies: jsesc: 0.5.0 - dev: false /repeat-element@1.1.4: resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} @@ -8045,7 +8201,6 @@ packages: hasBin: true dependencies: glob: 7.2.3 - dev: false /rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} @@ -8196,7 +8351,6 @@ packages: engines: {node: '>=8'} dependencies: kind-of: 6.0.3 - dev: false /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} @@ -8393,7 +8547,6 @@ packages: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: false /source-map-url@0.4.1: resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} @@ -8697,7 +8850,6 @@ packages: engines: {node: '>=6.0.0'} dependencies: rimraf: 2.6.3 - dev: false /term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} @@ -8832,6 +8984,15 @@ packages: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} dev: false + /ts-api-utils@1.0.3(typescript@5.2.2): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.2.2 + dev: true + /ts-api-utils@1.0.3(typescript@5.3.3): resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} engines: {node: '>=16.13.0'} @@ -9094,7 +9255,6 @@ packages: /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} - dev: false /unicode-match-property-ecmascript@2.0.0: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} @@ -9102,17 +9262,14 @@ packages: dependencies: unicode-canonical-property-names-ecmascript: 2.0.0 unicode-property-aliases-ecmascript: 2.1.0 - dev: false /unicode-match-property-value-ecmascript@2.1.0: resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} engines: {node: '>=4'} - dev: false /unicode-property-aliases-ecmascript@2.1.0: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} - dev: false /unicorn-magic@0.1.0: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} @@ -9223,7 +9380,6 @@ packages: is-generator-function: 1.0.10 is-typed-array: 1.1.12 which-typed-array: 1.1.13 - dev: false /v8-to-istanbul@9.2.0: resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} @@ -9563,7 +9719,6 @@ packages: graceful-fs: 4.2.11 imurmurhash: 0.1.4 signal-exit: 3.0.7 - dev: false /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}