diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bc75d59d0a..4d231267fb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -40,7 +40,6 @@ jobs: babel-preset-cli, expo-cli, expo-doctor, - create-expo-app, expo-codemod, image-utils, json-file, diff --git a/.github/workflows/test_windows.yml b/.github/workflows/test_windows.yml index 826c672920..d299117cc9 100644 --- a/.github/workflows/test_windows.yml +++ b/.github/workflows/test_windows.yml @@ -35,7 +35,6 @@ jobs: node: ['16'] package: [ - create-expo-app, dev-tools, babel-preset-cli, expo-cli, diff --git a/packages/create-expo-app/.gh-assets/banner.svg b/packages/create-expo-app/.gh-assets/banner.svg deleted file mode 100644 index a40c4abcaf..0000000000 --- a/packages/create-expo-app/.gh-assets/banner.svg +++ /dev/null @@ -1,222 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
diff --git a/packages/create-expo-app/README.md b/packages/create-expo-app/README.md index 760a74d319..8c4d2099bf 100644 --- a/packages/create-expo-app/README.md +++ b/packages/create-expo-app/README.md @@ -1,48 +1,3 @@ - +# `create-expo-app` -

- - create-expo-app -

Create Expo App

- -

- - - -

- The fastest way to create universal React apps -
- -

- - Supports Expo iOS - - Supports Expo Android - - Supports Expo Web -

-

- - the best way to bootstrap a react native app - -

- -

- - - -```sh -# With NPM -npx create-expo-app - -# With Yarn -yarn create expo-app - -# With pnpm -pnpm create expo-app - -# With Bun -bunx create-expo-app -``` - -Once you're up and running with Create Expo App, visit [this tutorial](https://docs.expo.dev/tutorial/planning/) for more information on building mobile apps with React. +This package has [moved to the `expo/expo` repo](https://github.com/expo/expo/tree/main/packages/create-expo-app). diff --git a/packages/create-expo-app/babel.config.js b/packages/create-expo-app/babel.config.js deleted file mode 100644 index 981296f1fd..0000000000 --- a/packages/create-expo-app/babel.config.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = function (api) { - api.cache(true); - return { - // Only use this when running tests - env: { - test: { - presets: ['@expo/babel-preset-cli'], - }, - }, - }; -}; diff --git a/packages/create-expo-app/e2e/__tests__/index-test.js b/packages/create-expo-app/e2e/__tests__/index-test.js deleted file mode 100644 index ef662697a0..0000000000 --- a/packages/create-expo-app/e2e/__tests__/index-test.js +++ /dev/null @@ -1,350 +0,0 @@ -/* eslint-env jest */ -import spawnAsync from '@expo/spawn-async'; -import fs from 'fs'; -import os from 'os'; -import path from 'path'; - -const cli = require.resolve('../../build/index.js'); - -const projectRoot = getTemporaryPath(); - -function getTemporaryPath() { - return path.join(os.tmpdir(), Math.random().toString(36).substring(2)); -} - -function execute(args, env) { - return spawnAsync('node', [cli, ...args], { - cwd: projectRoot, - env: { - ...process.env, - ...env, - }, - }); -} - -async function executePassingAsync(args, env) { - const results = await execute(args, env); - expect(results.exitCode).toBe(0); - return results; -} - -function fileExists(projectName, filePath) { - return fs.existsSync(path.join(projectRoot, projectName, filePath)); -} - -function getRoot(...args) { - return path.join(projectRoot, ...args); -} - -// 3 minutes -- React Native takes a while to install -const extendedTimeout = 3 * 1000 * 60; - -beforeAll(async () => { - jest.setTimeout(extendedTimeout); - fs.mkdirSync(projectRoot); -}); - -it('prevents overwriting directories with projects', async () => { - const projectName = 'cannot-overwrite-files'; - const projectRoot = getRoot(projectName); - // Create the project root aot - fs.mkdirSync(projectRoot); - // Create a fake package.json -- this is a terminal file that cannot be overwritten. - fs.writeFileSync(path.join(projectRoot, 'package.json'), '{ "version": "1.0.0" }'); - - expect.assertions(1); - try { - await execute([projectName]); - } catch (e) { - expect(e.stdout).toMatch(/has files that might be overwritten/); - } -}); - -it( - 'creates a full basic project by default', - async () => { - const projectName = 'defaults-to-basic'; - await execute([projectName]); - - expect(fileExists(projectName, 'package.json')).toBeTruthy(); - expect(fileExists(projectName, 'App.js')).toBeTruthy(); - expect(fileExists(projectName, '.gitignore')).toBeTruthy(); - // expect(fileExists(projectName, 'node_modules')).toBeTruthy(); - expect(fileExists(projectName, 'ios/')).not.toBeTruthy(); - expect(fileExists(projectName, 'android/')).not.toBeTruthy(); - expect(fileExists(projectName, 'app.json')).toBeTruthy(); - - // Ensure the app.json is written properly - const appJsonPath = path.join(projectRoot, projectName, 'app.json'); - const appJson = JSON.parse(fs.readFileSync(appJsonPath, { encoding: 'utf8' })); - expect(appJson.expo.name).toBe('defaults-to-basic'); - expect(appJson.expo.slug).toBe('defaults-to-basic'); - }, - extendedTimeout -); - -describe('yes', () => { - it( - 'creates a default project in the current directory', - async () => { - const projectName = 'yes-default-directory'; - const projectRoot = getRoot(projectName); - // Create the project root aot - fs.mkdirSync(projectRoot); - - const results = await spawnAsync('node', [cli, '--yes', '--no-install'], { - cwd: projectRoot, - }); - expect(results.status).toBe(0); - - expect(fileExists(projectName, 'package.json')).toBeTruthy(); - expect(fileExists(projectName, 'App.js')).toBeTruthy(); - expect(fileExists(projectName, '.gitignore')).toBeTruthy(); - expect(fileExists(projectName, 'node_modules')).not.toBeTruthy(); - }, - extendedTimeout - ); - it( - 'creates a default project in a new directory', - async () => { - const projectName = 'yes-new-directory'; - - const results = await spawnAsync('node', [cli, projectName, '-y', '--no-install'], { - cwd: projectRoot, - }); - expect(results.status).toBe(0); - - expect(fileExists(projectName, 'package.json')).toBeTruthy(); - expect(fileExists(projectName, 'App.js')).toBeTruthy(); - expect(fileExists(projectName, '.gitignore')).toBeTruthy(); - expect(fileExists(projectName, 'node_modules')).not.toBeTruthy(); - }, - extendedTimeout - ); - - it( - 'uses pnpm', - async () => { - const projectName = 'uses-pnpm'; - const results = await execute([projectName, '--no-install'], { - // Run: DEBUG=create-expo-app:* pnpm create expo-app - npm_config_user_agent: `pnpm`, - }); - - // Test that the user was warned about deps - expect(results.stdout).toMatch(/make sure you have modules installed/); - expect(results.stdout).toMatch(/pnpm install/); - - expect(fileExists(projectName, 'package.json')).toBeTruthy(); - expect(fileExists(projectName, 'App.js')).toBeTruthy(); - expect(fileExists(projectName, '.gitignore')).toBeTruthy(); - // Check if it skipped install - expect(fileExists(projectName, 'node_modules')).not.toBeTruthy(); - }, - extendedTimeout - ); - it( - 'uses Bun', - async () => { - const projectName = 'uses-bun'; - const results = await execute([projectName, '--no-install'], { - // Run: DEBUG=create-expo-app:* bunx create-expo-app - npm_config_user_agent: `bun`, - }); - - // Test that the user was warned about deps - expect(results.stdout).toMatch(/make sure you have modules installed/); - expect(results.stdout).toMatch(/bun install/); - - expect(fileExists(projectName, 'package.json')).toBeTruthy(); - expect(fileExists(projectName, 'App.js')).toBeTruthy(); - expect(fileExists(projectName, '.gitignore')).toBeTruthy(); - // Check if it skipped install - expect(fileExists(projectName, 'node_modules')).not.toBeTruthy(); - }, - extendedTimeout - ); - it( - 'uses npm', - async () => { - const projectName = 'uses-npm'; - const results = await execute([projectName, '--no-install'], { - // Run: DEBUG=create-expo-app:* npm create expo-app - npm_config_user_agent: `npm/8.1.0 node/v16.13.0 darwin x64 workspaces/false`, - }); - - // Test that the user was warned about deps - expect(results.stdout).toMatch(/make sure you have modules installed/); - expect(results.stdout).toMatch(/npm install/); - - expect(fileExists(projectName, 'package.json')).toBeTruthy(); - expect(fileExists(projectName, 'App.js')).toBeTruthy(); - expect(fileExists(projectName, '.gitignore')).toBeTruthy(); - // Check if it skipped install - expect(fileExists(projectName, 'node_modules')).not.toBeTruthy(); - }, - extendedTimeout - ); - - it( - 'uses yarn', - async () => { - const projectName = 'uses-yarn'; - const results = await execute([projectName, '--no-install'], { - // Run: DEBUG=create-expo-app:* yarn create expo-app - npm_config_user_agent: `yarn/1.22.17 npm/? node/v16.13.0 darwin x64`, - }); - - // Test that the user was warned about deps - expect(results.stdout).toMatch(/make sure you have modules installed/); - expect(results.stdout).toMatch(/yarn install/); - - expect(fileExists(projectName, 'package.json')).toBeTruthy(); - expect(fileExists(projectName, 'App.js')).toBeTruthy(); - expect(fileExists(projectName, '.gitignore')).toBeTruthy(); - // Check if it skipped install - expect(fileExists(projectName, 'node_modules')).not.toBeTruthy(); - }, - extendedTimeout - ); - - xit('creates a default project in a new directory with a custom template', async () => { - const projectName = 'yes-custom-template'; - - const results = await spawnAsync( - 'node', - [cli, projectName, '--yes', '--template', 'blank', '--no-install'], - { - cwd: projectRoot, - } - ); - expect(results.exitCode).toBe(0); - - expect(fileExists(projectName, 'package.json')).toBeTruthy(); - expect(fileExists(projectName, 'App.js')).toBeTruthy(); - expect(fileExists(projectName, '.gitignore')).toBeTruthy(); - expect(fileExists(projectName, 'node_modules')).not.toBeTruthy(); - }); -}); - -xdescribe('templates', () => { - it('allows overwriting directories with tolerable files', async () => { - const projectName = 'can-overwrite'; - const projectRoot = getRoot(projectName); - // Create the project root aot - fs.mkdirSync(projectRoot); - // Create a fake package.json -- this is a terminal file that cannot be overwritten. - fs.writeFileSync(path.join(projectRoot, 'LICENSE'), 'hello world'); - - await executePassingAsync( - projectName, - '--template', - 'https://github.com/expo/examples/tree/master/blank', - '--no-install' - ); - expect(fileExists(projectName, 'package.json')).toBeTruthy(); - expect(fileExists(projectName, 'App.js')).toBeTruthy(); - expect(fileExists(projectName, '.gitignore')).toBeTruthy(); - expect(fileExists(projectName, 'node_modules')).not.toBeTruthy(); - }); - - it('throws when an invalid template is used', async () => { - const projectName = 'invalid-template-name'; - expect.assertions(2); - try { - await execute([ - projectName, - '--template', - 'fake template path that is too obviously long to be real', - ]); - } catch (e) { - expect(e.stderr).toMatch(/Could not locate the template/i); - } - expect(fs.existsSync(getRoot(projectName, 'package.json'))).toBeFalsy(); - }); - - it('downloads a valid template', async () => { - const projectName = 'valid-template-name'; - await executePassingAsync([projectName, '--template', 'blank']); - - expect(fileExists(projectName, 'package.json')).toBeTruthy(); - expect(fileExists(projectName, 'App.js')).toBeTruthy(); - expect(fileExists(projectName, 'README.md')).toBeTruthy(); - expect(fileExists(projectName, '.gitignore')).toBeTruthy(); - // Check if it skipped install - expect(fileExists(projectName, 'node_modules')).toBeTruthy(); - }); - - it(`doesn't prompt to install cocoapods in a project without an ios folder`, async () => { - const projectName = 'no-install-no-pods-no-prompt'; - const results = await executePassingAsync([projectName, '--template', 'blank', '--no-install']); - - // Ensure it doesn't warn to install pods since blank doesn't have an ios folder. - expect(results.stdout).not.toMatch(/make sure you have CocoaPods installed/); - expect(results.stdout).not.toMatch(/npx pod-install/); - - expect(fileExists(projectName, 'package.json')).toBeTruthy(); - expect(fileExists(projectName, 'App.js')).toBeTruthy(); - expect(fileExists(projectName, '.gitignore')).toBeTruthy(); - // Ensure it skipped install - expect(fileExists(projectName, 'node_modules')).not.toBeTruthy(); - }); - - it('uses npm', async () => { - const projectName = 'uses-npm'; - const results = await execute([projectName, '--use-npm', '--no-install']); - - // Test that the user was warned about deps - expect(results.stdout).toMatch(/make sure you have modules installed/); - expect(results.stdout).toMatch(/npm install/); - if (process.platform === 'darwin') { - expect(results.stdout).toMatch(/make sure you have CocoaPods installed/); - expect(results.stdout).toMatch(/npx pod-install/); - } - - expect(fileExists(projectName, 'package.json')).toBeTruthy(); - expect(fileExists(projectName, 'App.js')).toBeTruthy(); - expect(fileExists(projectName, '.gitignore')).toBeTruthy(); - // Check if it skipped install - expect(fileExists(projectName, 'node_modules')).not.toBeTruthy(); - }); - - it('downloads a github repo with sub-project', async () => { - const projectName = 'full-url'; - const results = await executePassingAsync([ - projectName, - '--template', - 'https://github.com/expo/examples/tree/master/blank', - '--no-install', - ]); - - // Test that the user was warned about deps - expect(results.stdout).toMatch(/make sure you have modules installed/); - expect(results.stdout).toMatch(/yarn/); - expect(fileExists(projectName, 'package.json')).toBeTruthy(); - expect(fileExists(projectName, 'App.js')).toBeTruthy(); - expect(fileExists(projectName, 'README.md')).toBeTruthy(); - expect(fileExists(projectName, '.gitignore')).toBeTruthy(); - // Check if it skipped install - expect(fileExists(projectName, 'node_modules')).not.toBeTruthy(); - }); - - it('downloads a github repo with the template path option', async () => { - const projectName = 'partial-url-and-path'; - await executePassingAsync([ - projectName, - '--template', - 'https://github.com/expo/examples/tree/master', - '--template-path', - 'blank', - '--no-install', - ]); - - expect(fileExists(projectName, 'package.json')).toBeTruthy(); - expect(fileExists(projectName, 'App.js')).toBeTruthy(); - expect(fileExists(projectName, 'README.md')).toBeTruthy(); - expect(fileExists(projectName, '.gitignore')).toBeTruthy(); - // Check if it skipped install - expect(fileExists(projectName, 'node_modules')).not.toBeTruthy(); - }); -}); diff --git a/packages/create-expo-app/jest.config.js b/packages/create-expo-app/jest.config.js deleted file mode 100644 index 4577e302b3..0000000000 --- a/packages/create-expo-app/jest.config.js +++ /dev/null @@ -1,19 +0,0 @@ -const path = require('path'); - -const roots = ['./src']; - -const enableE2E = process.env.CI || process.env.E2E; - -if (enableE2E) { - roots.push('e2e'); -} - -module.exports = { - testEnvironment: 'node', - testRegex: '/__tests__/.*(test|spec)\\.[jt]sx?$', - watchPlugins: ['jest-watch-typeahead/filename', 'jest-watch-typeahead/testname'], - rootDir: path.resolve(__dirname), - displayName: require('./package').name, - roots, - testRunner: 'jest-jasmine2', -}; diff --git a/packages/create-expo-app/package.json b/packages/create-expo-app/package.json deleted file mode 100644 index 8f30399052..0000000000 --- a/packages/create-expo-app/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "name": "create-expo", - "version": "2.1.1", - "bin": "./build/index.js", - "main": "build", - "description": "Create universal Expo apps", - "license": "BSD-3-Clause", - "keywords": [ - "expo", - "react-native", - "react" - ], - "homepage": "https://docs.expo.dev", - "repository": { - "type": "git", - "url": "https://github.com/expo/expo-cli.git", - "directory": "packages/create-expo-app" - }, - "author": "Evan Bacon (https://github.com/evanbacon)", - "files": [ - "build", - "template" - ], - "scripts": { - "prepare": "yarn run clean && yarn run build:prod", - "lint": "eslint .", - "test": "jest", - "test:e2e": "cross-env E2E=1 jest", - "watch": "yarn run build -w", - "build": "ncc build ./src/index.ts -o build/", - "build:prod": "ncc build ./src/index.ts -o build/ --minify --no-cache --no-source-map-register", - "clean": "rimraf ./build/" - }, - "devDependencies": { - "@expo/json-file": "8.2.37", - "@expo/package-manager": "1.1.0", - "@expo/spawn-async": "^1.7.0", - "@types/debug": "^4.1.7", - "@types/getenv": "^1.0.0", - "@types/minipass": "^3.3.5", - "@types/node": "^16.11.56", - "@types/node-fetch": "^2.5.8", - "@types/prompts": "2.0.14", - "@types/tar": "^6.1.2", - "arg": "^5.0.2", - "chalk": "^4.0.0", - "debug": "^4.3.4", - "getenv": "^1.0.0", - "minipass": "^3.3.4", - "node-fetch": "^2.6.7", - "ora": "3.4.0", - "prompts": "^2.4.2", - "tar": "^6.1.13", - "update-check": "^1.5.4" - }, - "publishConfig": { - "access": "public" - } -} diff --git a/packages/create-expo-app/src/Examples.ts b/packages/create-expo-app/src/Examples.ts deleted file mode 100644 index 7fc9079e75..0000000000 --- a/packages/create-expo-app/src/Examples.ts +++ /dev/null @@ -1,138 +0,0 @@ -import JsonFile from '@expo/json-file'; -import chalk from 'chalk'; -import fs from 'fs'; -import fetch from 'node-fetch'; -import path from 'path'; -import prompts from 'prompts'; -import { Stream } from 'stream'; -import tar from 'tar'; -import { promisify } from 'util'; - -import { sanitizeTemplateAsync } from './Template'; -import { createEntryResolver, createFileTransform } from './createFileTransform'; -import { env } from './utils/env'; - -const debug = require('debug')('expo:init:template') as typeof console.log; -const pipeline = promisify(Stream.pipeline); - -/** - * The partial GitHub content type, used to filter out examples. - * @see https://docs.github.com/en/rest/repos/contents?apiVersion=2022-11-28 - */ -export type GithubContent = { - name: string; - path: string; - type: 'file' | 'dir'; -}; - -/** List all existing examples directory from https://github.com/expo/examples. */ -async function listExamplesAsync() { - const response = await fetch('https://api.github.com/repos/expo/examples/contents'); - if (!response.ok) { - throw new Error('Unexpected GitHub API response: https://github.com/expo/examples'); - } - - const data: GithubContent[] = await response.json(); - return data.filter(item => item.type === 'dir' && !item.name.startsWith('.')); -} - -/** Determine if an example exists, using only its name */ -async function hasExampleAsync(name: string) { - const response = await fetch( - `https://api.github.com/repos/expo/examples/contents/${encodeURIComponent(name)}/package.json` - ); - - // Either ok or 404 responses are expected - if (response.status === 404 || response.ok) { - return response.ok; - } - - throw new Error(`Unexpected GitHub API response: ${response.status} - ${response.statusText}`); -} - -export async function ensureExampleExists(name: string) { - if (!(await hasExampleAsync(name))) { - throw new Error(`Example "${name}" does not exist, see https://github.com/expo/examples`); - } -} - -/** Ask the user which example to create */ -export async function promptExamplesAsync() { - if (env.CI) { - throw new Error('Cannot prompt for examples in CI'); - } - - const examples = await listExamplesAsync(); - const { answer } = await prompts({ - type: 'select', - name: 'answer', - message: 'Choose an example:', - choices: examples.map(example => ({ - title: example.name, - value: example.path, - })), - }); - - if (!answer) { - console.log(); - console.log(chalk`Please specify the example, example: {cyan --example with-router}`); - console.log(); - process.exit(1); - } - - return answer; -} - -/** Download and move the selected example from https://github.com/expo/examples. */ -export async function downloadAndExtractExampleAsync(root: string, name: string) { - const projectName = path.basename(root); - const response = await fetch('https://codeload.github.com/expo/examples/tar.gz/master'); - if (!response.ok) { - debug(`Failed to fetch the examples code, received status "${response.status}"`); - throw new Error('Failed to fetch the examples code from https://github.com/expo/examples'); - } - - await pipeline( - response.body, - tar.extract( - { - cwd: root, - transform: createFileTransform(projectName), - onentry: createEntryResolver(projectName), - strip: 2, - }, - [`examples-master/${name}`] - ) - ); - - await sanitizeTemplateAsync(root); - await sanitizeScriptsAsync(root); -} - -function exampleHasNativeCode(root: string): boolean { - return [path.join(root, 'android'), path.join(root, 'ios')].some(folder => fs.existsSync(folder)); -} - -export async function sanitizeScriptsAsync(root: string) { - const defaultScripts = exampleHasNativeCode(root) - ? { - start: 'expo start --dev-client', - android: 'expo run:android', - ios: 'expo run:ios', - web: 'expo start --web', - } - : { - start: 'expo start', - android: 'expo start --android', - ios: 'expo start --ios', - web: 'expo start --web', - }; - - const packageFile = new JsonFile(path.join(root, 'package.json')); - const packageJson = await packageFile.readAsync(); - - const scripts = (packageJson.scripts ?? {}) as Record; - packageJson.scripts = { ...defaultScripts, ...scripts }; - - await packageFile.writeAsync(packageJson); -} diff --git a/packages/create-expo-app/src/Template.ts b/packages/create-expo-app/src/Template.ts deleted file mode 100644 index 7d3b970b96..0000000000 --- a/packages/create-expo-app/src/Template.ts +++ /dev/null @@ -1,250 +0,0 @@ -import JsonFile from '@expo/json-file'; -import * as PackageManager from '@expo/package-manager'; -import chalk from 'chalk'; -import fs from 'fs'; -import ora from 'ora'; -import path from 'path'; - -import { Log } from './log'; -import { formatRunCommand, PackageManagerName } from './resolvePackageManager'; -import { env } from './utils/env'; -import { - applyBetaTag, - applyKnownNpmPackageNameRules, - downloadAndExtractNpmModuleAsync, - getResolvedTemplateName, -} from './utils/npm'; - -const debug = require('debug')('expo:init:template') as typeof console.log; - -const isMacOS = process.platform === 'darwin'; - -const FORBIDDEN_NAMES = [ - 'react-native', - 'react', - 'react-dom', - 'react-native-web', - 'expo', - 'expo-router', -]; - -export function isFolderNameForbidden(folderName: string): boolean { - return FORBIDDEN_NAMES.includes(folderName); -} - -function deepMerge(target: any, source: any) { - if (typeof target !== 'object') { - return source; - } - if (Array.isArray(target) && Array.isArray(source)) { - return target.concat(source); - } - Object.keys(source).forEach(key => { - if (typeof source[key] === 'object' && source[key] !== null) { - target[key] = deepMerge(target[key], source[key]); - } else { - target[key] = source[key]; - } - }); - return target; -} - -export function resolvePackageModuleId(moduleId: string) { - if ( - // Supports `file:./path/to/template.tgz` - moduleId?.startsWith('file:') || - // Supports `../path/to/template.tgz` - moduleId?.startsWith('.') || - // Supports `\\path\\to\\template.tgz` - moduleId?.startsWith(path.sep) - ) { - if (moduleId?.startsWith('file:')) { - moduleId = moduleId.substring(5); - } - debug(`Resolved moduleId to file path:`, moduleId); - return { type: 'file', uri: path.resolve(moduleId) }; - } else { - debug(`Resolved moduleId to NPM package:`, moduleId); - return { type: 'npm', uri: moduleId }; - } -} - -/** - * Extract a template app to a given file path and clean up any properties left over from npm to - * prepare it for usage. - */ -export async function extractAndPrepareTemplateAppAsync( - projectRoot: string, - { npmPackage }: { npmPackage?: string | null } -) { - const projectName = path.basename(projectRoot); - - debug(`Extracting template app (pkg: ${npmPackage}, projectName: ${projectName})`); - - const { type, uri } = resolvePackageModuleId(npmPackage || 'expo-template-blank'); - - const resolvedUri = type === 'file' ? uri : getResolvedTemplateName(applyBetaTag(uri)); - - await downloadAndExtractNpmModuleAsync(resolvedUri, { - cwd: projectRoot, - name: projectName, - disableCache: type === 'file', - }); - - await sanitizeTemplateAsync(projectRoot); - - return projectRoot; -} - -/** - * Sanitize a template (or example) with expected `package.json` properties and files. - */ -export async function sanitizeTemplateAsync(projectRoot: string) { - const projectName = path.basename(projectRoot); - - debug(`Sanitizing template or example app (projectName: ${projectName})`); - - const templatePath = path.join(__dirname, '../template/gitignore'); - const ignorePath = path.join(projectRoot, '.gitignore'); - if (!fs.existsSync(ignorePath)) { - await fs.promises.copyFile(templatePath, ignorePath); - } - - const config: Record = { - expo: { - name: projectName, - slug: projectName, - }, - }; - - const appFile = new JsonFile(path.join(projectRoot, 'app.json'), { - default: { expo: {} }, - }); - const appJson = deepMerge(await appFile.readAsync(), config); - await appFile.writeAsync(appJson); - - debug(`Created app.json:\n%O`, appJson); - - const packageFile = new JsonFile(path.join(projectRoot, 'package.json')); - const packageJson = await packageFile.readAsync(); - // name and version are required for yarn workspaces (monorepos) - const inputName = 'name' in config ? config.name : config.expo.name; - packageJson.name = applyKnownNpmPackageNameRules(inputName) || 'app'; - // These are metadata fields related to the template package, let's remove them from the package.json. - // A good place to start - packageJson.version = '1.0.0'; - packageJson.private = true; - delete packageJson.description; - delete packageJson.tags; - delete packageJson.repository; - - await packageFile.writeAsync(packageJson); -} - -export function validateName(name?: string): string | true { - if (typeof name !== 'string' || name === '') { - return 'The project name can not be empty.'; - } - if (!/^[a-z0-9@.\-_]+$/i.test(name)) { - return 'The project name can only contain URL-friendly characters.'; - } - return true; -} - -export function logProjectReady({ - cdPath, - packageManager, -}: { - cdPath: string; - packageManager: PackageManagerName; -}) { - console.log(chalk.bold(`✅ Your project is ready!`)); - console.log(); - - // empty string if project was created in current directory - if (cdPath) { - console.log( - `To run your project, navigate to the directory and run one of the following ${packageManager} commands.` - ); - console.log(); - console.log(`- ${chalk.bold('cd ' + cdPath)}`); - } else { - console.log(`To run your project, run one of the following ${packageManager} commands.`); - console.log(); - } - - console.log(`- ${chalk.bold(formatRunCommand(packageManager, 'android'))}`); - - let macOSComment = ''; - if (!isMacOS) { - macOSComment = - ' # you need to use macOS to build the iOS project - use the Expo app if you need to do iOS development without a Mac'; - } - console.log(`- ${chalk.bold(formatRunCommand(packageManager, 'ios'))}${macOSComment}`); - - console.log(`- ${chalk.bold(formatRunCommand(packageManager, 'web'))}`); -} - -export async function installPodsAsync(projectRoot: string) { - let step = logNewSection('Installing CocoaPods.'); - if (process.platform !== 'darwin') { - step.succeed('Skipped installing CocoaPods because operating system is not macOS.'); - return false; - } - const packageManager = new PackageManager.CocoaPodsPackageManager({ - cwd: path.join(projectRoot, 'ios'), - silent: !env.EXPO_DEBUG, - }); - - if (!(await packageManager.isCLIInstalledAsync())) { - try { - step.text = 'CocoaPods CLI not found in your $PATH, installing it now.'; - step.render(); - await packageManager.installCLIAsync(); - step.succeed('Installed CocoaPods CLI'); - step = logNewSection('Running `pod install` in the `ios` directory.'); - } catch (e: any) { - step.stopAndPersist({ - symbol: '⚠️ ', - text: chalk.red( - 'Unable to install the CocoaPods CLI. Continuing with initializing the project, you can install CocoaPods afterwards.' - ), - }); - if (e.message) { - Log.error(`- ${e.message}`); - } - return false; - } - } - - try { - await packageManager.installAsync(); - step.succeed('Installed pods and initialized Xcode workspace.'); - return true; - } catch (e: any) { - step.stopAndPersist({ - symbol: '⚠️ ', - text: chalk.red( - 'Something went wrong running `pod install` in the `ios` directory. Continuing with initializing the project, you can debug this afterwards.' - ), - }); - if (e.message) { - Log.error(`- ${e.message}`); - } - return false; - } -} - -export function logNewSection(title: string) { - const disabled = env.CI || env.EXPO_DEBUG; - const spinner = ora({ - text: chalk.bold(title), - // Ensure our non-interactive mode emulates CI mode. - isEnabled: !disabled, - // In non-interactive mode, send the stream to stdout so it prevents looking like an error. - stream: disabled ? process.stdout : process.stderr, - }); - - spinner.start(); - return spinner; -} diff --git a/packages/create-expo-app/src/__mocks__/fs.ts b/packages/create-expo-app/src/__mocks__/fs.ts deleted file mode 100644 index 3ec2d35da7..0000000000 --- a/packages/create-expo-app/src/__mocks__/fs.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { fs } from 'memfs'; - -module.exports = fs; diff --git a/packages/create-expo-app/src/__mocks__/ora.ts b/packages/create-expo-app/src/__mocks__/ora.ts deleted file mode 100644 index 716041d28f..0000000000 --- a/packages/create-expo-app/src/__mocks__/ora.ts +++ /dev/null @@ -1,13 +0,0 @@ -const ora = jest.fn(() => { - return { - start: jest.fn(() => { - return { stop: jest.fn(), succeed: jest.fn(), fail: jest.fn() }; - }), - stop: jest.fn(), - stopAndPersist: jest.fn(), - succeed: jest.fn(), - fail: jest.fn(), - }; -}); - -module.exports = ora; diff --git a/packages/create-expo-app/src/__tests__/Examples.test.ts b/packages/create-expo-app/src/__tests__/Examples.test.ts deleted file mode 100644 index d5996a8b2a..0000000000 --- a/packages/create-expo-app/src/__tests__/Examples.test.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { vol } from 'memfs'; -import typedFetch from 'node-fetch'; -import typedPrompts from 'prompts'; - -import { - ensureExampleExists, - GithubContent, - promptExamplesAsync, - sanitizeScriptsAsync, -} from '../Examples'; -import { env } from '../utils/env'; - -jest.mock('fs'); -jest.mock('node-fetch'); -jest.mock('prompts'); - -const fetch = typedFetch as jest.MockedFunction; -const prompts = typedPrompts as jest.MockedFunction; - -describe(ensureExampleExists, () => { - it('resolves when example exists', async () => { - fetch.mockResolvedValue({ ok: true, status: 200 } as any); - await expect(ensureExampleExists('test')).resolves.not.toThrow(); - }); - - it('rejects when example does note exists', async () => { - fetch.mockResolvedValue({ ok: false, status: 404 } as any); - await expect(() => ensureExampleExists('test')).rejects.toThrow(/example.*does not exist/i); - }); - - it('throws when running into rate limits', async () => { - fetch.mockResolvedValue({ ok: false, status: 403 } as any); - await expect(() => ensureExampleExists('test')).rejects.toThrow( - /unexpected GitHub API response/i - ); - }); -}); - -describe(promptExamplesAsync, () => { - it('throws when in CI mode', async () => { - const spy = jest.spyOn(env, 'CI', 'get').mockReturnValue(true); - await expect(() => promptExamplesAsync()).rejects.toThrowError(/cannot prompt/i); - spy.mockRestore(); - }); - - it('prompts examples and return selected example', async () => { - // Make this test run in CI - const spy = jest.spyOn(env, 'CI', 'get').mockReturnValue(false); - const examples: GithubContent[] = [ - { name: 'test-1', path: 'test-1', type: 'dir' }, - { name: 'test-2', path: 'test-2', type: 'dir' }, - ]; - - fetch.mockResolvedValue({ ok: true, json: () => Promise.resolve(examples) } as any); - prompts.mockResolvedValue({ answer: 'test-1' }); - - await expect(promptExamplesAsync()).resolves.toBe('test-1'); - expect(prompts).toHaveBeenCalledWith( - expect.objectContaining({ - choices: expect.arrayContaining([ - { title: 'test-1', value: 'test-1' }, - { title: 'test-2', value: 'test-2' }, - ]), - }) - ); - - spy.mockRestore(); - }); -}); - -describe(sanitizeScriptsAsync, () => { - afterEach(() => vol.reset()); - - it('adds default scripts for managed apps', async () => { - vol.fromJSON({ - '/project/package.json': JSON.stringify({ - name: 'project', - version: '0.0.0', - }), - }); - - await sanitizeScriptsAsync('/project'); - const packageJson = JSON.parse(String(vol.readFileSync('/project/package.json'))); - - expect(packageJson.scripts).toMatchObject({ - start: 'expo start', - android: 'expo start --android', - ios: 'expo start --ios', - web: 'expo start --web', - }); - }); - - it('adds default scripts for bare apps', async () => { - vol.fromJSON({ - '/project/android/build.gradle': 'fake-gradle', - '/project/ios/Podfile': 'fake-podfile', - '/project/package.json': JSON.stringify({ - name: 'project', - version: '0.0.0', - }), - }); - - await sanitizeScriptsAsync('/project'); - const packageJson = JSON.parse(String(vol.readFileSync('/project/package.json'))); - - expect(packageJson.scripts).toMatchObject({ - start: 'expo start --dev-client', - android: 'expo run:android', - ios: 'expo run:ios', - web: 'expo start --web', - }); - }); - - it('does not overwrite existing scripts', async () => { - vol.fromJSON({ - '/project/package.json': JSON.stringify({ - name: 'project', - version: '0.0.0', - scripts: { - start: 'node start.js', - }, - }), - }); - - await sanitizeScriptsAsync('/project'); - const packageJson = JSON.parse(String(vol.readFileSync('/project/package.json'))); - - expect(packageJson.scripts).toMatchObject({ - start: 'node start.js', - android: 'expo start --android', - ios: 'expo start --ios', - web: 'expo start --web', - }); - }); -}); diff --git a/packages/create-expo-app/src/__tests__/Template.test.ts b/packages/create-expo-app/src/__tests__/Template.test.ts deleted file mode 100644 index 2ab7d06749..0000000000 --- a/packages/create-expo-app/src/__tests__/Template.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -import path from 'path'; - -import { resolvePackageModuleId } from '../Template'; - -describe(resolvePackageModuleId, () => { - it(`resolves 'file:' path`, () => { - const result = resolvePackageModuleId('file:./path/to/template.tgz'); - expect(result).toEqual({ - type: 'file', - uri: expect.stringMatching('./path/to/template.tgz'), - }); - expect(path.isAbsolute(result.uri)).toBe(true); - }); - it(`resolves darwin local path`, () => { - expect(resolvePackageModuleId('./path/to/template.tgz')).toEqual({ - type: 'file', - uri: expect.stringMatching('./path/to/template.tgz'), - }); - }); - it(`resolves windows local path`, () => { - expect(resolvePackageModuleId('.\\path\\to\\template.tgz')).toEqual({ - type: 'file', - uri: expect.stringMatching(/template\.tgz$/), - }); - }); - it(`resolves module ID`, () => { - expect(resolvePackageModuleId('@expo/basic@34.0.0')).toEqual({ - type: 'npm', - uri: '@expo/basic@34.0.0', - }); - expect(resolvePackageModuleId('basic')).toEqual({ - type: 'npm', - uri: 'basic', - }); - }); -}); diff --git a/packages/create-expo-app/src/__tests__/createAsync.test.ts b/packages/create-expo-app/src/__tests__/createAsync.test.ts deleted file mode 100644 index e1bdadb8e2..0000000000 --- a/packages/create-expo-app/src/__tests__/createAsync.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { logNodeInstallWarning } from '../createAsync'; - -const asMock = any>(fn: T): jest.MockedFunction => - fn as jest.MockedFunction; - -const originalConsoleLog = console.log; -beforeAll(() => { - console.log = jest.fn(); -}); -afterAll(() => { - console.log = originalConsoleLog; -}); - -describe(logNodeInstallWarning, () => { - beforeEach(() => { - asMock(console.log).mockClear(); - }); - it(`logs correct cd`, () => { - logNodeInstallWarning('/foo/bar', 'npm', false); - - expect(console.log).toHaveBeenNthCalledWith(2, expect.stringContaining('cd /foo/bar/')); - expect(console.log).toHaveBeenNthCalledWith(3, expect.stringContaining('npm install')); - }); - it(`logs correct cd for same directory`, () => { - logNodeInstallWarning('', 'yarn', false); - - expect(console.log).toHaveBeenNthCalledWith(2, expect.stringContaining('cd ./')); - expect(console.log).toHaveBeenNthCalledWith(3, expect.stringContaining('yarn install')); - }); -}); diff --git a/packages/create-expo-app/src/__tests__/resolvePackageManager.test.ts b/packages/create-expo-app/src/__tests__/resolvePackageManager.test.ts deleted file mode 100644 index b0c55a19c9..0000000000 --- a/packages/create-expo-app/src/__tests__/resolvePackageManager.test.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { execSync } from 'child_process'; - -import { resolvePackageManager } from '../resolvePackageManager'; - -// TODO: replace with jest.mocked when jest 27+ is upgraded to -export const asMock = any>(fn: T): jest.MockedFunction => - fn as jest.MockedFunction; - -jest.mock('child_process', () => ({ - execSync: jest.fn(), -})); - -describe(resolvePackageManager, () => { - const originalEnv = process.env; - - afterEach(() => { - process.env = originalEnv; - }); - - it('should use yarn due to the user agent', () => { - process.env.npm_config_user_agent = 'yarn/1.22.17 npm/? node/v16.13.0 darwin x64'; - expect(resolvePackageManager()).toBe('yarn'); - }); - it('should use pnpm due to the user agent', () => { - process.env.npm_config_user_agent = 'pnpm'; - expect(resolvePackageManager()).toBe('pnpm'); - }); - it('should use pnpm due to the user agent', () => { - process.env.npm_config_user_agent = 'bun'; - expect(resolvePackageManager()).toBe('bun'); - }); - it('should use npm due to the user agent', () => { - process.env.npm_config_user_agent = 'npm/8.1.0 node/v16.13.0 darwin x64 workspaces/false'; - expect(resolvePackageManager()).toBe('npm'); - }); - it('should use yarn due to manager being installed', () => { - delete process.env.npm_config_user_agent; - expect(resolvePackageManager()).toBe('yarn'); - expect(execSync).toHaveBeenCalledWith('yarn --version', { stdio: 'ignore' }); - }); - it('should use pnpm due to manager being installed', () => { - delete process.env.npm_config_user_agent; - - // throw for the first check -- yarn - asMock(execSync).mockImplementationOnce(() => { - throw new Error('foobar'); - }); - - expect(resolvePackageManager()).toBe('pnpm'); - expect(execSync).toHaveBeenCalledWith('pnpm --version', { stdio: 'ignore' }); - }); - it('should use bun due to manager being installed', () => { - delete process.env.npm_config_user_agent; - - // throw for the first two checks -- yarn, pnpm - asMock(execSync) - .mockImplementationOnce(() => { - throw new Error('foobar'); - }) - .mockImplementationOnce(() => { - throw new Error('foobar'); - }); - - expect(resolvePackageManager()).toBe('bun'); - expect(execSync).toHaveBeenCalledWith('bun --version', { stdio: 'ignore' }); - }); - it('should default to npm when nothing else is available', () => { - delete process.env.npm_config_user_agent; - - // throw for the first check -- yarn - asMock(execSync) - .mockClear() - .mockImplementationOnce(() => { - throw new Error('foobar'); - }) - .mockImplementationOnce(() => { - throw new Error('foobar'); - }) - .mockImplementationOnce(() => { - throw new Error('foobar'); - }); - - expect(resolvePackageManager()).toBe('npm'); - expect(execSync).toHaveBeenCalledTimes(3); - }); -}); diff --git a/packages/create-expo-app/src/__tests__/telemetry.test.ts b/packages/create-expo-app/src/__tests__/telemetry.test.ts deleted file mode 100644 index a8b9b016ec..0000000000 --- a/packages/create-expo-app/src/__tests__/telemetry.test.ts +++ /dev/null @@ -1,266 +0,0 @@ -import crypto from 'crypto'; -import fs from 'fs'; -import fetch from 'node-fetch'; - -import { dotExpoHomeDirectory, getStateJsonPath } from '../paths'; -import { - _resetGlobals, - AnalyticsEventPhases, - AnalyticsEventTypes, - flushAsync, - identify, - initializeAnalyticsIdentityAsync, - track, -} from '../telemetry'; - -jest.mock('node-fetch'); -jest.mock('crypto', () => { - const actual = jest.requireActual('crypto'); - return { ...actual, randomUUID: jest.fn(actual.randomUUID) }; -}); - -const fetchAsMock = (fetch as any) as jest.Mock; -const randomUUIDAsMock = (crypto as any).randomUUID as jest.Mock; - -function clearGlobals() { - fetchAsMock.mockClear(); - randomUUIDAsMock.mockClear(); - if (!fs.existsSync(dotExpoHomeDirectory())) { - fs.mkdirSync(dotExpoHomeDirectory(), { recursive: true }); - } - - if (fs.existsSync(getStateJsonPath())) { - fs.unlinkSync(getStateJsonPath()); - } - _resetGlobals(); -} - -describe('telemetry', () => { - describe('with no pre-existing state', () => { - beforeEach(() => { - clearGlobals(); - }); - - it('can enqueue events and send them to the proper endpoint with the proper shape', async () => { - await initializeAnalyticsIdentityAsync(); - identify(); - track({ - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { phase: AnalyticsEventPhases.ATTEMPT }, - }); - track({ - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { phase: AnalyticsEventPhases.SUCCESS }, - }); - await flushAsync(); - expect(fetchAsMock.mock.calls.length).toEqual(1); - const [fetchRequestArgs] = fetchAsMock.mock.calls; - const [url, request] = fetchRequestArgs; - expect(url).toEqual('https://cdp.expo.dev/v1/batch'); - const { body } = request; - expect(request).toEqual( - expect.objectContaining({ - headers: { - accept: 'application/json, text/plain, */*', - authorization: expect.stringContaining('Basic '), - 'content-type': 'application/json;charset=utf-8', - 'user-agent': expect.any(String), - }, - method: 'POST', - }) - ); - const bodyAsjson = JSON.parse(body); - const { batch, sentAt }: { batch: any[]; sentAt: string } = bodyAsjson; - expect(Number.isNaN(Date.parse(sentAt))).toBeFalsy(); - expect(batch.length).toEqual(3); - expect(batch[0]).toEqual( - expect.objectContaining({ - type: 'identify', - sentAt: expect.any(String), - originalTimestamp: expect.any(String), - messageId: expect.any(String), - traits: expect.any(Object), - anonymousId: expect.any(String), - }) - ); - expect(batch[1]).toEqual( - expect.objectContaining({ - type: 'track', - sentAt: expect.any(String), - originalTimestamp: expect.any(String), - messageId: expect.any(String), - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { - phase: AnalyticsEventPhases.ATTEMPT, - }, - anonymousId: expect.any(String), - }) - ); - expect(batch[2]).toEqual( - expect.objectContaining({ - type: 'track', - sentAt: expect.any(String), - originalTimestamp: expect.any(String), - messageId: expect.any(String), - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { - phase: AnalyticsEventPhases.SUCCESS, - }, - anonymousId: expect.any(String), - }) - ); - }); - - it('does not enqueue events if not initialized', async () => { - identify(); - track({ - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { phase: AnalyticsEventPhases.ATTEMPT }, - }); - track({ - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { phase: AnalyticsEventPhases.SUCCESS }, - }); - await flushAsync(); - expect(fetchAsMock.mock.calls.length).toEqual(0); - }); - - it('does not enqueue events when the analytics identity is null', async () => { - randomUUIDAsMock.mockImplementationOnce(() => null); - await initializeAnalyticsIdentityAsync(); - identify(); - track({ - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { phase: AnalyticsEventPhases.ATTEMPT }, - }); - track({ - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { phase: AnalyticsEventPhases.SUCCESS }, - }); - await flushAsync(); - expect(fetchAsMock.mock.calls.length).toEqual(0); - }); - }); - - describe('with pre-existing state', () => { - const existingAnonymousId = (crypto as any).randomUUID(); - const existingUserId = (crypto as any).randomUUID(); - - beforeEach(() => { - clearGlobals(); - fs.writeFileSync( - getStateJsonPath(), - JSON.stringify({ analyticsDeviceId: existingAnonymousId, auth: { userId: existingUserId } }) - ); - }); - - it('can enqueue events and send them to the proper endpoint with the proper shape', async () => { - await initializeAnalyticsIdentityAsync(); - identify(); - track({ - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { phase: AnalyticsEventPhases.ATTEMPT }, - }); - track({ - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { phase: AnalyticsEventPhases.SUCCESS }, - }); - await flushAsync(); - expect(fetchAsMock.mock.calls.length).toEqual(1); - const [fetchRequestArgs] = fetchAsMock.mock.calls; - const [url, request] = fetchRequestArgs; - expect(url).toEqual('https://cdp.expo.dev/v1/batch'); - const { body } = request; - expect(request).toEqual( - expect.objectContaining({ - headers: { - accept: 'application/json, text/plain, */*', - authorization: expect.stringContaining('Basic '), - 'content-type': 'application/json;charset=utf-8', - 'user-agent': expect.any(String), - }, - method: 'POST', - }) - ); - const bodyAsjson = JSON.parse(body); - const { batch, sentAt }: { batch: any[]; sentAt: string } = bodyAsjson; - expect(Number.isNaN(Date.parse(sentAt))).toBeFalsy(); - expect(batch.length).toEqual(3); - expect(batch[0]).toEqual( - expect.objectContaining({ - type: 'identify', - sentAt: expect.any(String), - originalTimestamp: expect.any(String), - messageId: expect.any(String), - traits: expect.any(Object), - anonymousId: existingAnonymousId, - userId: existingUserId, - }) - ); - expect(batch[1]).toEqual( - expect.objectContaining({ - type: 'track', - sentAt: expect.any(String), - originalTimestamp: expect.any(String), - messageId: expect.any(String), - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { - phase: AnalyticsEventPhases.ATTEMPT, - }, - anonymousId: existingAnonymousId, - userId: existingUserId, - }) - ); - expect(batch[2]).toEqual( - expect.objectContaining({ - type: 'track', - sentAt: expect.any(String), - originalTimestamp: expect.any(String), - messageId: expect.any(String), - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { - phase: AnalyticsEventPhases.SUCCESS, - }, - anonymousId: existingAnonymousId, - userId: existingUserId, - }) - ); - }); - - it('does not enqueue events if not initialized', async () => { - identify(); - track({ - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { phase: AnalyticsEventPhases.ATTEMPT }, - }); - track({ - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { phase: AnalyticsEventPhases.SUCCESS }, - }); - await flushAsync(); - expect(fetchAsMock.mock.calls.length).toEqual(0); - }); - - it('can enqueue events when randomUUID is missing by loading state from disk', async () => { - randomUUIDAsMock.mockImplementationOnce(() => null); - await initializeAnalyticsIdentityAsync(); - identify(); - track({ - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { phase: AnalyticsEventPhases.ATTEMPT }, - }); - track({ - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { phase: AnalyticsEventPhases.FAIL }, - }); - await flushAsync(); - expect(fetchAsMock.mock.calls.length).toEqual(1); - const [fetchRequestArgs] = fetchAsMock.mock.calls; - const [, request] = fetchRequestArgs; - const { batch }: { batch: any[] } = JSON.parse(request.body); - batch.every( - message => message.anonymousId === existingAnonymousId && message.userId === existingUserId - ); - }); - }); -}); diff --git a/packages/create-expo-app/src/cli.ts b/packages/create-expo-app/src/cli.ts deleted file mode 100644 index 231517c428..0000000000 --- a/packages/create-expo-app/src/cli.ts +++ /dev/null @@ -1,120 +0,0 @@ -#!/usr/bin/env node -import { Spec } from 'arg'; -import chalk from 'chalk'; - -import { CLI_NAME } from './cmd'; -import { ExitError } from './error'; -import { Log } from './log'; -import { assertWithOptionsArgs, printHelp, resolveStringOrBooleanArgsAsync } from './utils/args'; - -const debug = require('debug')('expo:init:cli') as typeof console.log; - -async function run() { - const argv = process.argv.slice(2) ?? []; - const rawArgsMap: Spec = { - // Types - '--yes': Boolean, - '--no-install': Boolean, - '--help': Boolean, - '--version': Boolean, - // Aliases - '-y': '--yes', - '-h': '--help', - '-v': '--version', - }; - const args = assertWithOptionsArgs(rawArgsMap, { - argv, - permissive: true, - }); - - if (args['--version']) { - Log.exit(require('../package.json').version, 0); - } - - if (args['--help']) { - printHelp( - `Creates a new Expo project`, - chalk`npx ${CLI_NAME} {cyan } [options]`, - [ - `-y, --yes Use the default options for creating a project`, - ` --no-install Skip installing npm packages or CocoaPods`, - chalk`-t, --template {gray [pkg]} NPM template to use: blank, tabs, bare-minimum. Default: blank`, - chalk`-e, --example {gray [name]} Example name from {underline https://github.com/expo/examples}.`, - `-v, --version Version number`, - `-h, --help Usage info`, - ].join('\n'), - chalk` - {gray To choose a template pass in the {bold --template} arg:} - - {gray $} npm create expo-app {cyan --template} - - {gray To choose an Expo example pass in the {bold --example} arg:} - - {gray $} npm create expo-app {cyan --example} - {gray $} npm create expo-app {cyan --example with-router} - - {gray The package manager used for installing} - {gray node modules is based on how you invoke the CLI:} - - {bold npm:} {cyan npm create expo-app} - {bold yarn:} {cyan yarn create expo-app} - {bold pnpm:} {cyan pnpm create expo-app} - {bold bun:} {cyan bunx create-expo-app} - ` - ); - } - - const { AnalyticsEventPhases, AnalyticsEventTypes, flushAsync, track } = await import( - './telemetry' - ); - try { - const parsed = await resolveStringOrBooleanArgsAsync(argv, rawArgsMap, { - '--template': Boolean, - '--example': Boolean, - '-t': '--template', - '-e': '--example', - }); - - debug(`Default args:\n%O`, args); - debug(`Parsed:\n%O`, parsed); - - const { createAsync } = await import('./createAsync'); - await createAsync(parsed.projectRoot, { - yes: !!args['--yes'], - template: parsed.args['--template'], - example: parsed.args['--example'], - install: !args['--no-install'], - }); - - // Track successful event. - track({ - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { phase: AnalyticsEventPhases.SUCCESS }, - }); - // Flush all events. - await flushAsync(); - } catch (error: any) { - // ExitError has already been logged, all others should be logged before exiting. - if (!(error instanceof ExitError)) { - Log.exception(error); - } - - // Track the failure. - track({ - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { phase: AnalyticsEventPhases.FAIL, message: error.cause }, - }); - - // Flush all telemetry events. - await flushAsync().finally(() => { - // Exit with the error code or non-zero. - // Ensure we exit even if the telemetry fails. - process.exit(error.code || 1); - }); - } finally { - const shouldUpdate = await (await import('./utils/update-check')).default; - await shouldUpdate(); - } -} - -run(); diff --git a/packages/create-expo-app/src/cmd.ts b/packages/create-expo-app/src/cmd.ts deleted file mode 100644 index fd307f9dda..0000000000 --- a/packages/create-expo-app/src/cmd.ts +++ /dev/null @@ -1 +0,0 @@ -export const CLI_NAME = require('../package.json').name; diff --git a/packages/create-expo-app/src/createAsync.ts b/packages/create-expo-app/src/createAsync.ts deleted file mode 100644 index 64600221cd..0000000000 --- a/packages/create-expo-app/src/createAsync.ts +++ /dev/null @@ -1,226 +0,0 @@ -#!/usr/bin/env node -import chalk from 'chalk'; -import fs from 'fs'; -import path from 'path'; - -import { - downloadAndExtractExampleAsync, - ensureExampleExists, - promptExamplesAsync, -} from './Examples'; -import * as Template from './Template'; -import { promptTemplateAsync } from './legacyTemplates'; -import { Log } from './log'; -import { - installDependenciesAsync, - PackageManagerName, - resolvePackageManager, -} from './resolvePackageManager'; -import { assertFolderEmpty, assertValidName, resolveProjectRootAsync } from './resolveProjectRoot'; -import { - AnalyticsEventPhases, - AnalyticsEventTypes, - identify, - initializeAnalyticsIdentityAsync, - track, -} from './telemetry'; -import { initGitRepoAsync } from './utils/git'; -import { withSectionLog } from './utils/log'; - -export type Options = { - install: boolean; - template?: string | true; - example?: string | true; - yes: boolean; -}; - -const debug = require('debug')('expo:init:create') as typeof console.log; - -async function resolveProjectRootArgAsync( - inputPath: string, - { yes }: Pick -): Promise { - if (!inputPath && yes) { - const projectRoot = path.resolve(process.cwd()); - const folderName = path.basename(projectRoot); - assertValidName(folderName); - assertFolderEmpty(projectRoot, folderName); - return projectRoot; - } else { - return await resolveProjectRootAsync(inputPath); - } -} - -async function setupDependenciesAsync(projectRoot: string, props: Pick) { - // Install dependencies - const shouldInstall = props.install; - const packageManager = resolvePackageManager(); - let podsInstalled: boolean = false; - const needsPodsInstalled = await fs.existsSync(path.join(projectRoot, 'ios')); - if (shouldInstall) { - await installNodeDependenciesAsync(projectRoot, packageManager); - if (needsPodsInstalled) { - podsInstalled = await installCocoaPodsAsync(projectRoot); - } - } - const cdPath = getChangeDirectoryPath(projectRoot); - console.log(); - Template.logProjectReady({ cdPath, packageManager }); - if (!shouldInstall) { - logNodeInstallWarning(cdPath, packageManager, needsPodsInstalled && !podsInstalled); - } -} - -export async function createAsync(inputPath: string, options: Options): Promise { - if (options.example && options.template) { - throw new Error('Cannot use both --example and --template'); - } - - if (options.example) { - return await createExampleAsync(inputPath, options); - } - - return await createTemplateAsync(inputPath, options); -} - -async function createTemplateAsync(inputPath: string, props: Options): Promise { - let resolvedTemplate: string | null = null; - // @ts-ignore: This guards against someone passing --template without a name after it. - if (props.template === true) { - resolvedTemplate = await promptTemplateAsync(); - } else { - resolvedTemplate = props.template ?? null; - } - - const projectRoot = await resolveProjectRootArgAsync(inputPath, props); - await fs.promises.mkdir(projectRoot, { recursive: true }); - - // Setup telemetry attempt after a reasonable point. - // Telemetry is used to ensure safe feature deprecation since the command is unversioned. - // All telemetry can be disabled across Expo tooling by using the env var $EXPO_NO_TELEMETRY. - await initializeAnalyticsIdentityAsync(); - identify(); - track({ - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { phase: AnalyticsEventPhases.ATTEMPT, template: resolvedTemplate }, - }); - - await withSectionLog( - () => Template.extractAndPrepareTemplateAppAsync(projectRoot, { npmPackage: resolvedTemplate }), - { - pending: chalk.bold('Locating project files.'), - success: 'Downloaded and extracted project files.', - error: error => - `Something went wrong in downloading and extracting the project files: ${error.message}`, - } - ); - - await setupDependenciesAsync(projectRoot, props); - - // for now, we will just init a git repo if they have git installed and the - // project is not inside an existing git tree, and do it silently. we should - // at some point check if git is installed and actually bail out if not, because - // npm install will fail with a confusing error if so. - try { - // check if git is installed - // check if inside git repo - await initGitRepoAsync(projectRoot); - } catch (error) { - debug(`Error initializing git: %O`, error); - // todo: check if git is installed, bail out - } -} - -async function createExampleAsync(inputPath: string, props: Options): Promise { - let resolvedExample = ''; - if (props.example === true) { - resolvedExample = await promptExamplesAsync(); - } else if (props.example) { - resolvedExample = props.example; - } - - await ensureExampleExists(resolvedExample); - - const projectRoot = await resolveProjectRootArgAsync(inputPath, props); - await fs.promises.mkdir(projectRoot, { recursive: true }); - - // Setup telemetry attempt after a reasonable point. - // Telemetry is used to ensure safe feature deprecation since the command is unversioned. - // All telemetry can be disabled across Expo tooling by using the env var $EXPO_NO_TELEMETRY. - await initializeAnalyticsIdentityAsync(); - identify(); - track({ - event: AnalyticsEventTypes.CREATE_EXPO_APP, - properties: { phase: AnalyticsEventPhases.ATTEMPT, example: resolvedExample }, - }); - - await withSectionLog(() => downloadAndExtractExampleAsync(projectRoot, resolvedExample), { - pending: chalk.bold('Locating example files...'), - success: 'Downloaded and extracted example files.', - error: error => - `Something went wrong in downloading and extracting the example files: ${error.message}`, - }); - - await setupDependenciesAsync(projectRoot, props); - - // for now, we will just init a git repo if they have git installed and the - // project is not inside an existing git tree, and do it silently. we should - // at some point check if git is installed and actually bail out if not, because - // npm install will fail with a confusing error if so. - try { - // check if git is installed - // check if inside git repo - await initGitRepoAsync(projectRoot); - } catch (error) { - debug(`Error initializing git: %O`, error); - // todo: check if git is installed, bail out - } -} - -function getChangeDirectoryPath(projectRoot: string): string { - const cdPath = path.relative(process.cwd(), projectRoot); - if (cdPath.length <= projectRoot.length) { - return cdPath; - } - return projectRoot; -} - -async function installNodeDependenciesAsync( - projectRoot: string, - packageManager: PackageManagerName -): Promise { - try { - await installDependenciesAsync(projectRoot, packageManager, { silent: false }); - } catch (error: any) { - debug(`Error installing node modules: %O`, error); - Log.error( - `Something went wrong installing JavaScript dependencies. Check your ${packageManager} logs. Continuing to create the app.` - ); - Log.exception(error); - } -} - -async function installCocoaPodsAsync(projectRoot: string): Promise { - let podsInstalled = false; - try { - podsInstalled = await Template.installPodsAsync(projectRoot); - } catch (error) { - debug(`Error installing CocoaPods: %O`, error); - } - - return podsInstalled; -} - -export function logNodeInstallWarning( - cdPath: string, - packageManager: PackageManagerName, - needsPods: boolean -): void { - console.log(`\n⚠️ Before running your app, make sure you have modules installed:\n`); - console.log(` cd ${cdPath || '.'}${path.sep}`); - console.log(` ${packageManager} install`); - if (needsPods && process.platform === 'darwin') { - console.log(` npx pod-install`); - } - console.log(); -} diff --git a/packages/create-expo-app/src/createFileTransform.ts b/packages/create-expo-app/src/createFileTransform.ts deleted file mode 100644 index 1f7da5449d..0000000000 --- a/packages/create-expo-app/src/createFileTransform.ts +++ /dev/null @@ -1,77 +0,0 @@ -import Minipass from 'minipass'; -import path from 'path'; -import { ReadEntry } from 'tar'; - -export function sanitizedName(name: string) { - return name - .replace(/[\W_]+/g, '') - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, ''); -} - -class Transformer extends Minipass { - data: string; - - constructor(private name: string) { - super(); - this.data = ''; - } - write(data: string) { - this.data += data; - return true; - } - end() { - const replaced = this.data - .replace(/Hello App Display Name/g, this.name) - .replace(/HelloWorld/g, sanitizedName(this.name)) - .replace(/helloworld/g, sanitizedName(this.name.toLowerCase())); - super.write(replaced); - return super.end(); - } -} - -export function createEntryResolver(name: string) { - return (entry: ReadEntry) => { - if (name) { - // Rewrite paths for bare workflow - entry.path = entry.path - .replace( - /HelloWorld/g, - entry.path.includes('android') ? sanitizedName(name.toLowerCase()) : sanitizedName(name) - ) - .replace(/helloworld/g, sanitizedName(name).toLowerCase()); - } - if (entry.type && /^file$/i.test(entry.type) && path.basename(entry.path) === 'gitignore') { - // Rename `gitignore` because npm ignores files named `.gitignore` when publishing. - // See: https://github.com/npm/npm/issues/1862 - entry.path = entry.path.replace(/gitignore$/, '.gitignore'); - } - }; -} - -export function createFileTransform(name: string) { - return (entry: ReadEntry) => { - // Binary files, don't process these (avoid decoding as utf8) - if ( - ![ - '.png', - '.jpg', - '.jpeg', - '.gif', - '.webp', - '.psd', - '.tiff', - '.svg', - '.jar', - '.keystore', - // Font files - '.otf', - '.ttf', - ].includes(path.extname(entry.path)) && - name - ) { - return new Transformer(name); - } - return undefined; - }; -} diff --git a/packages/create-expo-app/src/error.ts b/packages/create-expo-app/src/error.ts deleted file mode 100644 index 6ca8fb819c..0000000000 --- a/packages/create-expo-app/src/error.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * A custom error class that is used to surface a `process.exit` event to a higher - * level where it can be tracked through telemetry asynchronously, before exiting. - */ -export class ExitError extends Error { - constructor(public cause: string | Error, public code: number) { - super(cause instanceof Error ? cause.message : cause); - } -} diff --git a/packages/create-expo-app/src/index.ts b/packages/create-expo-app/src/index.ts deleted file mode 100755 index dee0d77fdc..0000000000 --- a/packages/create-expo-app/src/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env node -import Debug from 'debug'; -import { boolish } from 'getenv'; - -import { CLI_NAME } from './cmd'; - -// Set the title of the process -process.title = CLI_NAME; - -// Setup before requiring `debug`. -if (boolish('EXPO_DEBUG', false)) { - Debug.enable('expo:init:*'); -} else if (Debug.enabled('expo:init:')) { - // This enables debug logging in other Expo tooling. - process.env.EXPO_DEBUG = '1'; -} - -require('./cli'); diff --git a/packages/create-expo-app/src/legacyTemplates.ts b/packages/create-expo-app/src/legacyTemplates.ts deleted file mode 100644 index ad4e0dbc13..0000000000 --- a/packages/create-expo-app/src/legacyTemplates.ts +++ /dev/null @@ -1,52 +0,0 @@ -import chalk from 'chalk'; -import prompts from 'prompts'; - -import { env } from './utils/env'; - -export const LEGACY_TEMPLATES = [ - { - title: 'Blank', - value: 'expo-template-blank', - description: 'a minimal app as clean as an empty canvas', - }, - - { - title: 'Blank (TypeScript)', - value: 'expo-template-blank-typescript', - description: 'blank app with TypeScript enabled', - }, - { - title: 'Navigation (TypeScript)', - value: 'expo-template-tabs', - description: 'File-based routing with TypeScript enabled', - }, - - { - title: 'Blank (Bare)', - value: 'expo-template-bare-minimum', - description: 'blank app with the native code exposed (expo prebuild)', - }, -]; - -export const ALIASES = LEGACY_TEMPLATES.map(({ value }) => value); - -export async function promptTemplateAsync() { - if (env.CI) { - throw new Error('Cannot prompt for template in CI'); - } - const { answer } = await prompts({ - type: 'select', - name: 'answer', - message: 'Choose a template:', - choices: LEGACY_TEMPLATES, - }); - - if (!answer) { - console.log(); - console.log(chalk`Please specify the template, example: {cyan --template expo-template-blank}`); - console.log(); - process.exit(1); - } - - return answer; -} diff --git a/packages/create-expo-app/src/log.ts b/packages/create-expo-app/src/log.ts deleted file mode 100644 index 53e69a1c55..0000000000 --- a/packages/create-expo-app/src/log.ts +++ /dev/null @@ -1,43 +0,0 @@ -import chalk from 'chalk'; - -import { ExitError } from './error'; - -export function error(...message: string[]): void { - console.error(...message); -} - -/** Print an error and provide additional info (the stack trace) in debug mode. */ -export function exception(e: Error): void { - const { env } = require('./utils/env'); - error(chalk.red(e.toString()) + (env.EXPO_DEBUG ? '\n' + chalk.gray(e.stack) : '')); -} - -export function log(...message: string[]): void { - console.log(...message); -} - -/** Log a message and exit the current process. If the `code` is non-zero then `console.error` will be used instead of `console.log`. */ -export function exit(message: string | Error, code: number = 1): never { - if (message instanceof Error) { - exception(message); - } else if (message) { - if (code === 0) { - log(message); - } else { - error(message); - } - } - - if (code !== 0) { - throw new ExitError(message, code); - } - process.exit(code); -} - -// The re-export makes auto importing easier. -export const Log = { - error, - exception, - log, - exit, -}; diff --git a/packages/create-expo-app/src/paths.ts b/packages/create-expo-app/src/paths.ts deleted file mode 100644 index bdc8c357bf..0000000000 --- a/packages/create-expo-app/src/paths.ts +++ /dev/null @@ -1,25 +0,0 @@ -import os from 'os'; -import path from 'path'; - -// The ~/.expo directory is used to store authentication sessions, -// which are shared between EAS CLI and Expo CLI. -export function dotExpoHomeDirectory(): string { - const home = os.homedir(); - if (!home) { - throw new Error( - "Can't determine your home directory; make sure your $HOME environment variable is set." - ); - } - - let dirPath; - if (process.env.EXPO_STAGING) { - dirPath = path.join(home, '.expo-staging'); - } else if (process.env.EXPO_LOCAL) { - dirPath = path.join(home, '.expo-local'); - } else { - dirPath = path.join(home, '.expo'); - } - return dirPath; -} - -export const getStateJsonPath = (): string => path.join(dotExpoHomeDirectory(), 'state.json'); diff --git a/packages/create-expo-app/src/resolvePackageManager.ts b/packages/create-expo-app/src/resolvePackageManager.ts deleted file mode 100644 index 9d48f5ca3e..0000000000 --- a/packages/create-expo-app/src/resolvePackageManager.ts +++ /dev/null @@ -1,88 +0,0 @@ -import * as PackageManager from '@expo/package-manager'; -import { execSync } from 'child_process'; - -import { CLI_NAME } from './cmd'; - -export type PackageManagerName = 'npm' | 'pnpm' | 'yarn' | 'bun'; - -const debug = require('debug')('expo:init:resolvePackageManager') as typeof console.log; - -/** Determine which package manager to use for installing dependencies based on how the process was started. */ -export function resolvePackageManager(): PackageManagerName { - // Attempt to detect if the user started the command using `yarn` or `pnpm` or `bun` - const userAgent = process.env.npm_config_user_agent; - debug('npm_config_user_agent:', userAgent); - if (userAgent?.startsWith('yarn')) { - return 'yarn'; - } else if (userAgent?.startsWith('pnpm')) { - return 'pnpm'; - } else if (userAgent?.startsWith('bun')) { - return 'bun'; - } else if (userAgent?.startsWith('npm')) { - return 'npm'; - } - - // Try availability - if (isPackageManagerAvailable('yarn')) { - return 'yarn'; - } else if (isPackageManagerAvailable('pnpm')) { - return 'pnpm'; - } else if (isPackageManagerAvailable('bun')) { - return 'bun'; - } - - return 'npm'; -} - -export function isPackageManagerAvailable(manager: PackageManagerName): boolean { - try { - execSync(`${manager} --version`, { stdio: 'ignore' }); - return true; - } catch {} - return false; -} - -export function formatRunCommand(packageManager: PackageManagerName, cmd: string) { - switch (packageManager) { - case 'pnpm': - return `pnpm run ${cmd}`; - case 'yarn': - return `yarn ${cmd}`; - case 'bun': - return `bun run ${cmd}`; - case 'npm': - default: - return `npm run ${cmd}`; - } -} - -export function formatSelfCommand() { - const packageManager = resolvePackageManager(); - switch (packageManager) { - case 'pnpm': - return `pnpx ${CLI_NAME}`; - case 'bun': - return `bunx ${CLI_NAME}`; - case 'yarn': - case 'npm': - default: - return `npx ${CLI_NAME}`; - } -} - -export async function installDependenciesAsync( - projectRoot: string, - packageManager: PackageManagerName, - flags: { silent: boolean } = { silent: false } -) { - const options = { cwd: projectRoot, silent: flags.silent }; - if (packageManager === 'yarn') { - await new PackageManager.YarnPackageManager(options).installAsync(); - } else if (packageManager === 'pnpm') { - await new PackageManager.PnpmPackageManager(options).installAsync(); - } else if (packageManager === 'bun') { - await new PackageManager.BunPackageManager(options).installAsync(); - } else { - await new PackageManager.NpmPackageManager(options).installAsync(); - } -} diff --git a/packages/create-expo-app/src/resolveProjectRoot.ts b/packages/create-expo-app/src/resolveProjectRoot.ts deleted file mode 100644 index 9e0d30392d..0000000000 --- a/packages/create-expo-app/src/resolveProjectRoot.ts +++ /dev/null @@ -1,83 +0,0 @@ -import chalk from 'chalk'; -import fs from 'fs'; -import path from 'path'; -import prompts from 'prompts'; - -import * as Template from './Template'; -import { Log } from './log'; -import { formatSelfCommand } from './resolvePackageManager'; -import { getConflictsForDirectory } from './utils/dir'; - -export function assertValidName(folderName: string) { - const validation = Template.validateName(folderName); - if (typeof validation === 'string') { - Log.exit(chalk`{red Cannot create an app named {bold "${folderName}"}. ${validation}}`, 1); - } - const isFolderNameForbidden = Template.isFolderNameForbidden(folderName); - if (isFolderNameForbidden) { - Log.exit( - chalk`{red Cannot create an app named {bold "${folderName}"} because it would conflict with a dependency of the same name.}`, - 1 - ); - } -} - -export function assertFolderEmpty(projectRoot: string, folderName: string) { - const conflicts = getConflictsForDirectory(projectRoot); - if (conflicts.length) { - Log.log(chalk`The directory {cyan ${folderName}} has files that might be overwritten:`); - Log.log(); - for (const file of conflicts) { - Log.log(` ${file}`); - } - Log.log(); - Log.exit('Try using a new directory name, or moving these files.\n'); - } -} - -export async function resolveProjectRootAsync(input: string): Promise { - let name = input?.trim(); - - if (!name) { - const { answer } = await prompts({ - type: 'text', - name: 'answer', - message: 'What is your app named?', - initial: 'my-app', - validate: name => { - const validation = Template.validateName(path.basename(path.resolve(name))); - if (typeof validation === 'string') { - return 'Invalid project name: ' + validation; - } - return true; - }, - }); - - if (typeof answer === 'string') { - name = answer.trim(); - } - } - - if (!name) { - const selfCmd = formatSelfCommand(); - Log.log(); - Log.log('Please choose your app name:'); - Log.log(chalk` {dim $} {cyan ${selfCmd} }`); - Log.log(); - Log.log(`For more info, run:`); - Log.log(chalk` {dim $} {cyan ${selfCmd} --help}`); - Log.log(); - Log.exit(''); - } - - const projectRoot = path.resolve(name); - const folderName = path.basename(projectRoot); - - assertValidName(folderName); - - await fs.promises.mkdir(projectRoot, { recursive: true }); - - assertFolderEmpty(projectRoot, folderName); - - return projectRoot; -} diff --git a/packages/create-expo-app/src/sessionStorage.ts b/packages/create-expo-app/src/sessionStorage.ts deleted file mode 100644 index 214a67bf21..0000000000 --- a/packages/create-expo-app/src/sessionStorage.ts +++ /dev/null @@ -1,29 +0,0 @@ -import JsonFile from '@expo/json-file'; - -import { getStateJsonPath } from './paths'; - -// copied from https://github.com/expo/eas-cli/blob/f0c958e58bc7aa90ee8f822e075d40703563708e/packages/eas-cli/src/user/sessionStorage.ts - -type UserSettingsData = { - auth?: SessionData; -}; - -type SessionData = { - sessionSecret: string; - - // These fields are potentially used by Expo CLI. - userId: string; - username: string; - currentConnection: 'Username-Password-Authentication'; -}; - -export function getSession(): SessionData | null { - try { - return JsonFile.read(getStateJsonPath())?.auth ?? null; - } catch (error: any) { - if (error.code === 'ENOENT') { - return null; - } - throw error; - } -} diff --git a/packages/create-expo-app/src/telemetry.ts b/packages/create-expo-app/src/telemetry.ts deleted file mode 100644 index 1c5482320c..0000000000 --- a/packages/create-expo-app/src/telemetry.ts +++ /dev/null @@ -1,225 +0,0 @@ -import JsonFile from '@expo/json-file'; -import crypto from 'crypto'; -import fs from 'fs'; -import fetch from 'node-fetch'; -import os from 'os'; - -import { dotExpoHomeDirectory, getStateJsonPath } from './paths'; -import { getSession } from './sessionStorage'; -import { env } from './utils/env'; - -const packageJSON = require('../package.json'); - -const xdlUnifiedWriteKey = '1wabJGd5IiuF9Q8SGlcI90v8WTs'; -const analyticsEndpoint = 'https://cdp.expo.dev/v1/batch'; -const version = '1.0.0'; -const library = packageJSON.name; - -//#region mostly copied from @expo/rudder-sdk-node https://github.com/expo/rudder-sdk-node/blob/main/index.ts -// some changes include: -// - the identity being injected inside of the enqueue method, rather than as a function argument. -// - a global event queue that gets cleared after each flush -// - no support for large message queues and concurrent flushes -// - using node's crypto library for hashing and uuidv4 (available on node14+) -type AnalyticsPayload = { - messageId: string; - _metadata: any; - context: any; - type: string; - originalTimestamp: Date; - [key: string]: any; -}; -type AnalyticsMessage = { - context?: { - [key: string]: unknown; - }; - integrations?: { - [destination: string]: boolean; - }; - properties?: { - [key: string]: unknown; - }; - timestamp?: Date; - [key: string]: unknown; -}; -type AnalyticsIdentity = - | { - userId: string; - } - | { - userId?: string; - anonymousId: string; - }; - -const messageBatch = [] as AnalyticsPayload[]; - -let analyticsIdentity: AnalyticsIdentity | null = null; - -// jest does not clear global variables inbetween tests so we need this helper -export function _resetGlobals() { - if (env.EXPO_NO_TELEMETRY) return; - - analyticsIdentity = null; - messageBatch.splice(0, messageBatch.length); -} - -// call before tracking any analytics events. -// if track/identify are called before this method they will be dropped -export async function initializeAnalyticsIdentityAsync() { - if (env.EXPO_NO_TELEMETRY) return; - - if (analyticsIdentity) { - return; - } - analyticsIdentity = await getAnalyticsIdentityAsync(); -} - -export function identify() { - if (env.EXPO_NO_TELEMETRY) return; - enqueue('identify', {}); -} - -export function track( - message: AnalyticsMessage & { - event: string; - } -) { - if (env.EXPO_NO_TELEMETRY) return; - enqueue('track', { ...message, context: getAnalyticsContext() }); -} - -function enqueue(type: 'identify' | 'track', message: any) { - if (!analyticsIdentity) { - // do not send messages without identities to our backend - return; - } - - message = { ...message, ...analyticsIdentity }; - message.type = type; - - if (message.type === 'identify') { - message.traits ??= {}; - message.context ??= {}; - message.context.traits = message.traits; - } - - message.context = { - library: { - name: library, - version, - }, - ...message.context, - }; - - message._metadata = { - nodeVersion: process.versions.node, - ...message._metadata, - }; - - if (!message.originalTimestamp) { - message.originalTimestamp = new Date(); - } - - if (!message.messageId) { - // We md5 the messaage to add more randomness. This is primarily meant - // for use in the browser where the uuid package falls back to Math.random() - // which is not a great source of randomness. - // Borrowed from analytics.js (https://github.com/segment-integrations/analytics.js-integration-segmentio/blob/a20d2a2d222aeb3ab2a8c7e72280f1df2618440e/lib/index.js#L255-L256). - message.messageId = `node-${crypto - .createHash('md5') - .update(JSON.stringify(message)) - .digest('hex')}-${uuidv4()}`; - } - messageBatch.push(message); -} - -// very barebones implemention... -// does not support multiple concurrent flushes or large numbers of messages -export async function flushAsync() { - if (env.EXPO_NO_TELEMETRY) return; - - if (!messageBatch.length) { - return; - } - - const request = { - method: 'POST', - headers: { - accept: 'application/json, text/plain, */*', - 'content-type': 'application/json;charset=utf-8', - 'user-agent': `${library}/${version}`, - authorization: 'Basic ' + Buffer.from(`${xdlUnifiedWriteKey}:`).toString('base64'), - }, - body: JSON.stringify({ - batch: messageBatch.map(message => ({ ...message, sentAt: new Date() })), - sentAt: new Date(), - }), - }; - try { - await fetch(analyticsEndpoint, request); - } catch (error) { - // supress errors - likely due to network connectivity or endpoint health - } - // clear array so we don't resend events in subsequent flushes - messageBatch.splice(0, messageBatch.length); -} -//#endregion - -//#region copied from eas cli https://github.com/expo/eas-cli/blob/f0c958e58bc7aa90ee8f822e075d40703563708e/packages/eas-cli/src/analytics/rudderstackClient.ts#L9-L13 -const PLATFORM_TO_ANALYTICS_PLATFORM: { [platform: string]: string } = { - darwin: 'Mac', - win32: 'Windows', - linux: 'Linux', -}; - -function getAnalyticsContext(): Record { - const platform = PLATFORM_TO_ANALYTICS_PLATFORM[os.platform()] || os.platform(); - return { - os: { name: platform, version: os.release() }, - device: { type: platform, model: platform }, - app: { name: library, version: packageJSON.version }, - }; -} -//#endregion - -function uuidv4() { - try { - // available on node 14+ - // https://github.com/denoland/deno/issues/12754 - return (crypto as any).randomUUID(); - } catch (error) { - // supress errors due to node 13 or less not having randomUUID - return null; - } -} - -export enum AnalyticsEventTypes { - CREATE_EXPO_APP = 'create expo app', -} - -export enum AnalyticsEventPhases { - ATTEMPT = 'attempt', - SUCCESS = 'success', - FAIL = 'fail', -} - -async function getAnalyticsIdentityAsync(): Promise { - if (!fs.existsSync(dotExpoHomeDirectory())) { - fs.mkdirSync(dotExpoHomeDirectory(), { recursive: true }); - } - if (!fs.existsSync(getStateJsonPath())) { - fs.writeFileSync(getStateJsonPath(), JSON.stringify({})); - } - const savedDeviceId = await JsonFile.getAsync(getStateJsonPath(), 'analyticsDeviceId', null); - const deviceId = savedDeviceId ?? uuidv4(); - - if (!deviceId) { - // unable to generate an id or load one from disk - return null; - } - if (!savedDeviceId) { - await JsonFile.setAsync(getStateJsonPath(), 'analyticsDeviceId', deviceId); - } - const userId = getSession()?.userId ?? null; - return userId ? { anonymousId: deviceId, userId } : { anonymousId: deviceId }; -} diff --git a/packages/create-expo-app/src/utils/__tests__/args.test.ts b/packages/create-expo-app/src/utils/__tests__/args.test.ts deleted file mode 100644 index 787514931e..0000000000 --- a/packages/create-expo-app/src/utils/__tests__/args.test.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { - _resolveStringOrBooleanArgs, - assertDuplicateArgs, - assertUnknownArgs, - collapseAliases, - resolveStringOrBooleanArgsAsync, -} from '../args'; - -describe(collapseAliases, () => { - it(`will collapse aliases into arguments`, () => { - const arg = { - '--basic': Boolean, - '--help': Boolean, - '-h': '--help', - }; - const args = ['--basic', '-h']; - const actual = collapseAliases(arg, args); - expect(actual).toEqual(['--basic', '--help']); - }); -}); - -describe(_resolveStringOrBooleanArgs, () => { - it(`resolves string or boolean arguments to boolean`, () => { - expect( - _resolveStringOrBooleanArgs( - { - '--basic': Boolean, - // This will be omitted since we should handle collapsing aliases earlier. - '-b': 'foobar', - }, - ['--basic'] - ) - ).toEqual({ - args: { '--basic': true }, - projectRoot: '', - }); - }); - it(`resolves to string`, () => { - expect(_resolveStringOrBooleanArgs({ '--basic': Boolean }, ['--basic', 'foobar'])).toEqual({ - args: { '--basic': 'foobar' }, - // foobar will be used as the string value for basic and not as the project root - projectRoot: '', - }); - }); - it(`asserts dangling arguments`, () => { - expect(() => - _resolveStringOrBooleanArgs({ '--basic': Boolean }, [ - 'possibleProjectRoot', - '--basic', - 'foobar', - 'anotherProjectRoot', - ]) - ).toThrow(/Unknown argument: possibleProjectRoot/); - }); - it(`resolves to string with custom project root`, () => { - expect( - _resolveStringOrBooleanArgs({ '--basic': Boolean }, ['--basic', 'foobar', 'root']) - ).toEqual({ - args: { '--basic': 'foobar' }, - projectRoot: 'root', - }); - }); - it(`asserts invalid arguments`, () => { - expect(() => - _resolveStringOrBooleanArgs({ '--basic': Boolean }, ['foobar', 'root', '--basic']) - ).toThrow(/Unknown argument: root/); - }); -}); - -describe(assertUnknownArgs, () => { - it(`asserts unknown arguments`, () => { - expect(() => assertUnknownArgs({}, ['--foo', '--bar'])).toThrowError( - `Unknown arguments: --foo, --bar` - ); - }); - it(`does not throw when there are no unknown arguments`, () => { - expect(() => - assertUnknownArgs( - { - '--foo': Boolean, - '--bar': Boolean, - }, - ['--foo', '--bar'] - ) - ).not.toThrow(); - }); -}); - -describe(resolveStringOrBooleanArgsAsync, () => { - it(`parses arguments`, async () => { - await expect( - resolveStringOrBooleanArgsAsync( - ['-y', '--no-install'], - { - // Types - '--yes': Boolean, - '--no-install': Boolean, - // Aliases - '-y': '--yes', - }, - { - '--template': Boolean, - '-t': '--template', - } - ) - ).resolves.toEqual({ - args: { - '--yes': true, - '--no-install': true, - }, - projectRoot: '', - }); - }); - it(`parses complex arguments`, async () => { - await expect( - resolveStringOrBooleanArgsAsync( - ['--no-bundler', '--scheme', '-d', 'my-device', 'custom-root'], - { - '--no-bundler': Boolean, - }, - { - '--scheme': Boolean, - '--device': Boolean, - '-d': '--device', - } - ) - ).resolves.toEqual({ - args: { - '--device': 'my-device', - '--no-bundler': true, - '--scheme': true, - }, - projectRoot: 'custom-root', - }); - }); -}); - -describe(assertDuplicateArgs, () => { - it(`does not assert`, () => { - assertDuplicateArgs([], []); - assertDuplicateArgs(['--foo', '--bar'], [['--device', '-d']]); - }); - it(`asserts duplicate arguments`, () => { - expect(() => - assertDuplicateArgs(['--device', '--bar', '--device'], [['--device', '-d']]) - ).toThrowErrorMatchingInlineSnapshot(`"Can only provide one instance of --device or -d"`); - }); -}); diff --git a/packages/create-expo-app/src/utils/__tests__/array.test.ts b/packages/create-expo-app/src/utils/__tests__/array.test.ts deleted file mode 100644 index c67f443425..0000000000 --- a/packages/create-expo-app/src/utils/__tests__/array.test.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { replaceValue } from '../array'; - -describe(replaceValue, () => { - it(`should replace a value in an array`, () => { - expect(replaceValue([1, 2, 3], 1, 2)).toEqual([2, 2, 3]); - expect(replaceValue([1, 2, 3], 4, 5)).toEqual([1, 2, 3]); - }); -}); diff --git a/packages/create-expo-app/src/utils/__tests__/log.test.ts b/packages/create-expo-app/src/utils/__tests__/log.test.ts deleted file mode 100644 index 7e85b20b12..0000000000 --- a/packages/create-expo-app/src/utils/__tests__/log.test.ts +++ /dev/null @@ -1,99 +0,0 @@ -import ora from 'ora'; - -import { env } from '../env'; -import { withSectionLog } from '../log'; - -jest.mock('ora'); - -describe(withSectionLog, () => { - it('it disables the spinner when in CI mode', async () => { - jest.spyOn(env, 'CI', 'get').mockReturnValue(true); - - await withSectionLog(() => Promise.resolve(), { - pending: 'pending', - success: 'success', - error: () => 'error', - }); - - expect(ora).toHaveBeenCalledWith( - expect.objectContaining({ - isEnabled: false, - }) - ); - }); - - it('it uses stdout when in CI mode', async () => { - jest.spyOn(env, 'CI', 'get').mockReturnValue(true); - - await withSectionLog(() => Promise.resolve(), { - pending: 'pending', - success: 'success', - error: () => 'error', - }); - - expect(ora).toHaveBeenCalledWith( - expect.objectContaining({ - stream: process.stdout, - }) - ); - }); - - it('it returns the result of the action', async () => { - const result = await withSectionLog(() => Promise.resolve('hello world'), { - pending: 'pending', - success: 'success', - error: () => 'error', - }); - - expect(result).toBe('hello world'); - }); - - it('it sets pending message', async () => { - await withSectionLog(() => Promise.resolve(), { - pending: 'pending', - success: 'success', - error: () => 'error', - }); - - expect(ora).toHaveBeenCalledWith( - expect.objectContaining({ - text: 'pending', - }) - ); - }); - - it('it sets success message', async () => { - const spinner = await withSectionLog(ora => Promise.resolve(ora), { - pending: 'pending', - success: 'success', - error: () => 'error', - }); - - expect(spinner.succeed).toHaveBeenCalledWith('success'); - }); - - it('it throws the encountered error', async () => { - const error = new Error('error'); - - try { - await withSectionLog(() => Promise.reject(error), { - pending: 'pending', - success: 'success', - error: () => 'error', - }); - expect(true).toBe('Should not be reached'); - } catch (thrown) { - expect(thrown).toBe(error); - } - }); - - it('it sets error message', async () => { - const spinner = await withSectionLog(ora => Promise.reject(ora), { - pending: 'pending', - success: 'success', - error: () => 'error', - }).catch(ora => ora); - - expect(spinner.fail).toHaveBeenCalledWith('error'); - }); -}); diff --git a/packages/create-expo-app/src/utils/__tests__/npm.test.ts b/packages/create-expo-app/src/utils/__tests__/npm.test.ts deleted file mode 100644 index 1ac526ac8d..0000000000 --- a/packages/create-expo-app/src/utils/__tests__/npm.test.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { applyBetaTag, getResolvedTemplateName, splitNpmNameAndTag } from '../npm'; - -describe(applyBetaTag, () => { - const originalEnv = process.env; - - afterEach(() => { - process.env = originalEnv; - }); - - it('should apply the beta tag', () => { - process.env.EXPO_BETA = 'true'; - expect(applyBetaTag('expo-template-blank')).toBe('expo-template-blank@beta'); - }); - it('should not overwrite an existing tag', () => { - process.env.EXPO_BETA = 'true'; - expect(applyBetaTag('expo-template-blank@45')).toBe('expo-template-blank@45'); - }); - it('should not apply the beta tag when EXPO_BETA is not enabled', () => { - delete process.env.EXPO_BETA; - expect(applyBetaTag('expo-template-blank')).toBe('expo-template-blank'); - }); -}); - -describe(splitNpmNameAndTag, () => { - it(`splits without tag`, () => { - expect(splitNpmNameAndTag('expo-template-blank')).toEqual(['expo-template-blank', undefined]); - }); - it(`splits with tag`, () => { - expect(splitNpmNameAndTag('expo-template-blank@45.0')).toEqual(['expo-template-blank', '45.0']); - }); - it(`splits an org without tag`, () => { - expect(splitNpmNameAndTag('@expo/foobar')).toEqual(['@expo/foobar', undefined]); - }); - it(`splits an org with tag`, () => { - expect(splitNpmNameAndTag('@expo/foobar@45.0.0')).toEqual(['@expo/foobar', '45.0.0']); - }); -}); - -describe(getResolvedTemplateName, () => { - it('should expand an alias', () => { - expect(getResolvedTemplateName('@expo/foobar@2.1.0')).toBe('@expo/foobar@2.1.0'); - expect(getResolvedTemplateName('expo-template-blank')).toBe('expo-template-blank@latest'); - expect(getResolvedTemplateName('expo-template-blank@beta')).toBe('expo-template-blank@beta'); - expect(getResolvedTemplateName('blank')).toBe('expo-template-blank@latest'); - expect(getResolvedTemplateName('blank-typescript')).toBe( - 'expo-template-blank-typescript@latest' - ); - expect(getResolvedTemplateName('tabs')).toBe('expo-template-tabs@latest'); - expect(getResolvedTemplateName('bare-minimum')).toBe('expo-template-bare-minimum@latest'); - }); - it('should expand numeric tag to sdk-X', () => { - // expect(expandAlias('blank@sdk-45')).toBe('expo-template-blank@sdk-45'); - expect(getResolvedTemplateName('expo-template-blank@45')).toBe('expo-template-blank@sdk-45'); - // expect(expandAlias('expo-template-blank@45f')).toBe('expo-template-blank@45f'); - }); -}); diff --git a/packages/create-expo-app/src/utils/__tests__/obj.test.ts b/packages/create-expo-app/src/utils/__tests__/obj.test.ts deleted file mode 100644 index b8efc1c660..0000000000 --- a/packages/create-expo-app/src/utils/__tests__/obj.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { deepMerge } from '../obj'; - -describe(deepMerge, () => { - it('should merge objects', () => { - const a = { - a: 1, - b: { - c: 2, - d: [{ f: [{}] }], - e: { - foo: 'bar', - }, - }, - }; - const b = { - a: 2, - b: { - c: 3, - d: [{ g: [{}] }], - e: { - foo: 'bar2', - }, - }, - }; - const c = deepMerge(a, b); - expect(c).toEqual({ a: 2, b: { c: 3, d: [{ f: [{}] }, { g: [{}] }], e: { foo: 'bar2' } } }); - }); -}); diff --git a/packages/create-expo-app/src/utils/args.ts b/packages/create-expo-app/src/utils/args.ts deleted file mode 100644 index cdaff09220..0000000000 --- a/packages/create-expo-app/src/utils/args.ts +++ /dev/null @@ -1,153 +0,0 @@ -// Common utilities for interacting with `args` library. -// These functions should be used by every command. -import arg, { Spec } from 'arg'; -import chalk from 'chalk'; - -import * as Log from '../log'; -import { replaceValue } from './array'; - -/** - * Parse args and assert unknown options. - * - * @param schema the `args` schema for parsing the command line arguments. - * @param argv extra strings - * @returns processed args object. - */ -export function assertWithOptionsArgs( - schema: arg.Spec, - options: arg.Options -): arg.Result { - try { - return arg(schema, options); - } catch (error: any) { - // Ensure unknown options are handled the same way. - if (error.code === 'ARG_UNKNOWN_OPTION') { - Log.exit(error.message, 1); - } - // Otherwise rethrow the error. - throw error; - } -} - -export function printHelp(info: string, usage: string, options: string, extra: string = ''): never { - Log.exit( - chalk` - {bold Info} - ${info} - - {bold Usage} - {dim $} ${usage} - - {bold Options} - ${options.split('\n').join('\n ')} -` + extra, - 0 - ); -} - -/** - * Enables the resolution of arguments that can either be a string or a boolean. - * - * @param args arguments that were passed to the command. - * @param rawMap raw map of arguments that are passed to the command. - * @param extraArgs extra arguments and aliases that should be resolved as string or boolean. - * @returns parsed arguments and project root. - */ -export async function resolveStringOrBooleanArgsAsync( - args: string[], - rawMap: arg.Spec, - extraArgs: arg.Spec -) { - const combined = { - ...rawMap, - ...extraArgs, - }; - // Assert any missing arguments - assertUnknownArgs(combined, args); - - // Collapse aliases into fully qualified arguments. - args = collapseAliases(combined, args); - // Resolve all of the string or boolean arguments and the project root. - return _resolveStringOrBooleanArgs(extraArgs, args); -} - -export function _resolveStringOrBooleanArgs(multiTypeArgs: Spec, args: string[]) { - // Default project root, if a custom one is defined then it will overwrite this. - let projectRoot: string = ''; - // The resolved arguments. - const settings: Record = {}; - - // Create a list of possible arguments, this will filter out aliases. - const possibleArgs = Object.entries(multiTypeArgs) - .filter(([, value]) => typeof value !== 'string') - .map(([key]) => key); - - // Loop over arguments in reverse order so we can resolve if a value belongs to a flag. - for (let i = args.length - 1; i > -1; i--) { - const value = args[i]; - // At this point we should have converted all aliases to fully qualified arguments. - if (value.startsWith('--')) { - // If we ever find an argument then it must be a boolean because we are checking in reverse - // and removing arguments from the array if we find a string. - settings[value] = true; - } else { - // Get the previous argument in the array. - const nextValue = i > 0 ? args[i - 1] : null; - if (nextValue && possibleArgs.includes(nextValue)) { - settings[nextValue] = value; - i--; - } else if ( - // Prevent finding two values that are dangling - !projectRoot && - // If the last value is not a flag and it doesn't have a recognized flag before it (instead having a string value or nothing) - // then it must be the project root. - (i === args.length - 1 || i === 0) - ) { - projectRoot = value; - } else { - // This will asserts if two strings are passed in a row and not at the end of the line. - throw new Error(`Unknown argument: ${value}`); - } - } - } - - return { - args: settings, - projectRoot, - }; -} - -/** Convert all aliases to fully qualified flag names. */ -export function collapseAliases(arg: Spec, args: string[]): string[] { - const aliasMap = getAliasTuples(arg); - - for (const [arg, alias] of aliasMap) { - args = replaceValue(args, arg, alias); - } - - // Assert if there are duplicate flags after we collapse the aliases. - assertDuplicateArgs(args, aliasMap); - return args; -} - -/** Assert that the spec has unknown arguments. */ -export function assertUnknownArgs(arg: Spec, args: string[]) { - const allowedArgs = Object.keys(arg); - const unknownArgs = args.filter(arg => !allowedArgs.includes(arg) && arg.startsWith('-')); - if (unknownArgs.length > 0) { - throw new Error(`Unknown arguments: ${unknownArgs.join(', ')}`); - } -} - -function getAliasTuples(arg: Spec): [string, string][] { - return Object.entries(arg).filter(([, value]) => typeof value === 'string') as [string, string][]; -} - -/** Asserts that a duplicate flag has been used, this naively throws without knowing if an alias or flag were used as the duplicate. */ -export function assertDuplicateArgs(args: string[], argNameAliasTuple: [string, string][]) { - for (const [argName, argNameAlias] of argNameAliasTuple) { - if (args.filter(a => [argName, argNameAlias].includes(a)).length > 1) { - throw new Error(`Can only provide one instance of ${argName} or ${argNameAlias}`); - } - } -} diff --git a/packages/create-expo-app/src/utils/array.ts b/packages/create-expo-app/src/utils/array.ts deleted file mode 100644 index 666a12d1bc..0000000000 --- a/packages/create-expo-app/src/utils/array.ts +++ /dev/null @@ -1,7 +0,0 @@ -export function replaceValue(values: T[], original: T, replacement: T): T[] { - const index = values.indexOf(original); - if (index > -1) { - values[index] = replacement; - } - return values; -} diff --git a/packages/create-expo-app/src/utils/dir.ts b/packages/create-expo-app/src/utils/dir.ts deleted file mode 100644 index 82a42268e8..0000000000 --- a/packages/create-expo-app/src/utils/dir.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { readdirSync } from 'fs'; - -// Any of these files are allowed to exist in the projectRoot -const tolerableFiles = [ - // System - '.DS_Store', - 'Thumbs.db', - // Git - '.git', - '.gitattributes', - '.gitignore', - // Project - '.npmignore', - 'LICENSE', - 'docs', - '.idea', - // Package manager - 'npm-debug.log', - 'yarn-debug.log', - 'yarn-error.log', -]; - -export function getConflictsForDirectory(projectRoot: string): string[] { - return readdirSync(projectRoot).filter( - (file: string) => !(/\.iml$/.test(file) || tolerableFiles.includes(file)) - ); -} diff --git a/packages/create-expo-app/src/utils/env.ts b/packages/create-expo-app/src/utils/env.ts deleted file mode 100644 index 232b2de385..0000000000 --- a/packages/create-expo-app/src/utils/env.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { boolish } from 'getenv'; - -class Env { - /** Enable debug logging */ - get EXPO_DEBUG() { - return boolish('EXPO_DEBUG', false); - } - /** Enable the beta version of Expo (TODO: Should this just be in the beta version of expo releases?) */ - get EXPO_BETA() { - return boolish('EXPO_BETA', false); - } - /** Is running in non-interactive CI mode */ - get CI() { - return boolish('CI', false); - } - /** Disable all API caches. Does not disable bundler caches. */ - get EXPO_NO_CACHE() { - return boolish('EXPO_NO_CACHE', false); - } - /** Disable telemetry (analytics) */ - get EXPO_NO_TELEMETRY() { - return boolish('EXPO_NO_TELEMETRY', false); - } -} - -export const env = new Env(); diff --git a/packages/create-expo-app/src/utils/git.ts b/packages/create-expo-app/src/utils/git.ts deleted file mode 100644 index 6ec3b81e9a..0000000000 --- a/packages/create-expo-app/src/utils/git.ts +++ /dev/null @@ -1,39 +0,0 @@ -import spawnAsync from '@expo/spawn-async'; -import chalk from 'chalk'; - -const debug = require('debug')('expo:init:git') as typeof console.log; - -export async function initGitRepoAsync(root: string) { - // let's see if we're in a git tree - try { - await spawnAsync('git', ['rev-parse', '--is-inside-work-tree'], { stdio: 'ignore', cwd: root }); - debug(chalk.dim('New project is already inside of a Git repo, skipping git init.')); - return false; - } catch (e: any) { - if (e.errno === 'ENOENT') { - debug(chalk.dim('Unable to initialize Git repo. `git` not in $PATH.')); - return false; - } - } - - const packageJSON = require('../package.json'); - - // not in git tree, so let's init - try { - await spawnAsync('git', ['init'], { stdio: 'ignore', cwd: root }); - await spawnAsync('git', ['add', '-A'], { stdio: 'ignore', cwd: root }); - - const commitMsg = `Initial commit\n\nGenerated by ${packageJSON.name} ${packageJSON.version}.`; - await spawnAsync('git', ['commit', '-m', commitMsg], { - stdio: 'ignore', - cwd: root, - }); - - debug(chalk.dim('Initialized a Git repository.')); - return true; - } catch (error: any) { - debug('Error initializing Git repo:', error); - // no-op -- this is just a convenience and we don't care if it fails - return false; - } -} diff --git a/packages/create-expo-app/src/utils/log.ts b/packages/create-expo-app/src/utils/log.ts deleted file mode 100644 index e3f86c5c29..0000000000 --- a/packages/create-expo-app/src/utils/log.ts +++ /dev/null @@ -1,34 +0,0 @@ -import ora, { Ora } from 'ora'; - -import { env } from './env'; - -export function withSectionLog( - action: (spinner: Ora) => Promise, - message: { - pending: string; - success: string; - error: (errror: Error) => string; - } -) { - const disabled = env.CI || env.EXPO_DEBUG; - const spinner = ora({ - text: message.pending, - // Ensure our non-interactive mode emulates CI mode. - isEnabled: !disabled, - // In non-interactive mode, send the stream to stdout so it prevents looking like an error. - stream: disabled ? process.stdout : process.stderr, - }); - - spinner.start(); - - return action(spinner).then( - result => { - spinner.succeed(message.success); - return result; - }, - error => { - spinner.fail(message.error(error)); - throw error; - } - ); -} diff --git a/packages/create-expo-app/src/utils/npm.ts b/packages/create-expo-app/src/utils/npm.ts deleted file mode 100644 index e26d1d481d..0000000000 --- a/packages/create-expo-app/src/utils/npm.ts +++ /dev/null @@ -1,295 +0,0 @@ -import spawnAsync from '@expo/spawn-async'; -import fs from 'fs'; -import os from 'os'; -import path from 'path'; -import { Stream } from 'stream'; -import tar from 'tar'; -import { promisify } from 'util'; - -import { createEntryResolver, createFileTransform } from '../createFileTransform'; -import { ALIASES } from '../legacyTemplates'; -import { Log } from '../log'; -import { env } from './env'; - -const debug = require('debug')('expo:init:npm') as typeof console.log; - -type ExtractProps = { - name: string; - cwd: string; - strip?: number; - fileList?: string[]; - disableCache?: boolean; -}; - -// @ts-ignore -const pipeline = promisify(Stream.pipeline); - -function getTemporaryCacheFilePath(subdir: string = 'template-cache') { - // This is cleared when the device restarts - return path.join(os.tmpdir(), '.create-expo-app', subdir); -} - -/** Applies the `@beta` npm tag when `EXPO_BETA` is enabled. */ -export function applyBetaTag(npmPackageName: string): string { - let [name, tag] = splitNpmNameAndTag(npmPackageName); - - if (!tag && env.EXPO_BETA) { - debug('Using beta tag for', name); - tag = 'beta'; - } - - return joinNpmNameAndTag(name, tag); -} - -/** Join an NPM package name and tag together, stripping the tag if it's `undefined`. */ -function joinNpmNameAndTag(name: string, tag: string | undefined): string { - return [name, tag].filter(Boolean).join('@'); -} - -/** Split a package name from its tag. */ -export function splitNpmNameAndTag(npmPackageName: string): [string, string | undefined] { - const components = npmPackageName.split('@').filter(Boolean); - - if (npmPackageName.startsWith('@')) { - return ['@' + components[0], components[1]]; - } - - return [components[0], components[1]]; -} - -/** - * Applies known shortcuts to an NPM package name and tag. - * - If the name is `blank`, `blank-typescript`, `tabs`, or `bare-minimum`, apply the prefix `expo-template-`. - * - If a tag is a numeric value like `45`, and the name is a known template, then convert the tag to `sdk-X`. - * - * @example `blank@45` => `expo-template-blank@sdk-45` - */ -export function getResolvedTemplateName(npmPackageName: string) { - let [name, tag = 'latest'] = splitNpmNameAndTag(npmPackageName); - - if (name.startsWith('@')) { - return joinNpmNameAndTag(name, tag); - } - - const aliasPrefix = 'expo-template-'; - - if (ALIASES.includes(aliasPrefix + name)) { - name = aliasPrefix + name; - } - - // Only apply the numeric conversion if the name is a known template. - if (ALIASES.includes(name)) { - if (tag?.match(/^\d+$/)) { - return name + '@sdk-' + tag; - } - } - - return joinNpmNameAndTag(name, tag); -} - -export function applyKnownNpmPackageNameRules(name: string): string | null { - // https://github.com/npm/validate-npm-package-name/#naming-rules - - // package name cannot start with '.' or '_'. - while (/^(\.|_)/.test(name)) { - name = name.substring(1); - } - - name = name.toLowerCase().replace(/[^a-zA-Z0-9._\-/@]/g, ''); - - return ( - name - // .replace(/![a-z0-9-._~]+/g, '') - // Remove special characters - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') || null - ); -} - -export async function extractLocalNpmTarballAsync( - tarFilePath: string, - props: ExtractProps -): Promise { - const readStream = fs.createReadStream(tarFilePath); - await extractNpmTarballAsync(readStream, props); -} - -export async function extractNpmTarballAsync( - stream: NodeJS.ReadableStream | null, - props: ExtractProps -): Promise { - if (!stream) { - throw new Error('Missing stream'); - } - const { cwd, strip, name, fileList = [] } = props; - - await fs.promises.mkdir(cwd, { recursive: true }); - - await pipeline( - stream, - tar.extract( - { - cwd, - transform: createFileTransform(name), - onentry: createEntryResolver(name), - strip: strip ?? 1, - }, - fileList - ) - ); -} - -async function npmPackAsync( - packageName: string, - cwd: string | undefined = undefined, - ...props: string[] -): Promise { - const npm = getNpmBin(); - - const cmd = ['pack', packageName, ...props]; - - const cmdString = `${npm} ${cmd.join(' ')}`; - debug('Run:', cmdString, `(cwd: ${cwd ?? process.cwd()})`); - - if (cwd) { - await fs.promises.mkdir(cwd, { recursive: true }); - } - - let results: string; - try { - results = (await spawnAsync(npm, [...cmd, '--json'], { cwd })).stdout?.trim(); - } catch (error: any) { - if (error?.stderr.match(/npm ERR! code E404/)) { - const pkg = - error.stderr.match(/npm ERR! 404\s+'(.*)' is not in this registry\./)?.[1] ?? error.stderr; - throw new Error(`NPM package not found: ` + pkg); - } - throw error; - } - - if (!results) { - return null; - } - - try { - const json = JSON.parse(results); - if (Array.isArray(json) && json.every(isNpmPackageInfo)) { - return json.map(sanitizeNpmPackageFilename); - } else { - throw new Error(`Invalid response from npm: ${results}`); - } - } catch (error: any) { - throw new Error( - `Could not parse JSON returned from "${cmdString}".\n\n${results}\n\nError: ${error.message}` - ); - } -} - -export type NpmPackageInfo = { - /** "expo-template-blank@45.0.0" */ - id: string; - /** "expo-template-blank" */ - name: string; - /** "45.0.0" */ - version: string; - /** 73765 */ - size: number; - /** 90909 */ - unpackedSize: number; - /** "2366988b44e4ee16eb2b0e902ee6c12a127b2c2e" */ - shasum: string; - /** "sha512-oc7MjAt3sp8mi3Gf3LkKUNUkbiK7lJ7BecHMqe06n8vrStT4h2cHJKxf5dtAfgmXkBHHsQE/g7RUWrh1KbBjAw==" */ - integrity: string; - /** "expo-template-blank-45.0.0.tgz" */ - filename: string; - files: { - path: string; - size: number; - mode: number; - }[]; - entryCount: number; - bundled: unknown[]; -}; - -function getNpmBin() { - return process.platform === 'win32' ? 'npm.cmd' : 'npm'; -} - -async function getNpmInfoAsync(moduleId: string, cwd: string): Promise { - const infos = await npmPackAsync(moduleId, cwd, '--dry-run'); - if (infos?.[0]) { - return infos[0]; - } - throw new Error(`Could not find npm package "${moduleId}"`); -} - -function isNpmPackageInfo(item: any): item is NpmPackageInfo { - return ( - item && - typeof item === 'object' && - 'id' in item && - 'filename' in item && - 'version' in item && - 'files' in item - ); -} - -/** - * Adjust the tar filename in npm package info for `npm@<9.0.0`. - * - * @see https://github.com/npm/cli/issues/3405 - */ -function sanitizeNpmPackageFilename(item: NpmPackageInfo): NpmPackageInfo { - if (item.filename.startsWith('@') && item.name.startsWith('@')) { - item.filename = item.filename.replace(/^@/, '').replace(/\//, '-'); - } - - return item; -} - -async function fileExistsAsync(path: string): Promise { - try { - const stat = await fs.promises.stat(path); - return stat.isFile(); - } catch { - return false; - } -} - -export async function downloadAndExtractNpmModuleAsync( - npmName: string, - props: ExtractProps -): Promise { - const cachePath = getTemporaryCacheFilePath(); - - debug(`Looking for NPM tarball (id: ${npmName}, cache: ${cachePath})`); - - await fs.promises.mkdir(cachePath, { recursive: true }); - - const info = await getNpmInfoAsync(npmName, cachePath); - - const cacheFilename = path.join(cachePath, info.filename); - try { - // TODO: This cache does not expire. - const fileExists = await fileExistsAsync(cacheFilename); - - const disableCache = env.EXPO_NO_CACHE || props.disableCache; - if (disableCache || !fileExists) { - debug(`Downloading tarball for ${npmName} to ${cachePath}...`); - await npmPackAsync(npmName, cachePath); - } - } catch (error: any) { - Log.error('Error downloading template package: ' + npmName); - throw error; - } - - try { - await extractLocalNpmTarballAsync(cacheFilename, { - cwd: props.cwd, - name: props.name, - }); - } catch (error: any) { - Log.error('Error extracting template package: ' + npmName); - throw error; - } -} diff --git a/packages/create-expo-app/src/utils/obj.ts b/packages/create-expo-app/src/utils/obj.ts deleted file mode 100644 index df42251b39..0000000000 --- a/packages/create-expo-app/src/utils/obj.ts +++ /dev/null @@ -1,16 +0,0 @@ -export function deepMerge(target: any, source: any) { - if (typeof target !== 'object') { - return source; - } - if (Array.isArray(target) && Array.isArray(source)) { - return target.concat(source); - } - Object.keys(source).forEach(key => { - if (typeof source[key] === 'object' && source[key] !== null) { - target[key] = deepMerge(target[key], source[key]); - } else { - target[key] = source[key]; - } - }); - return target; -} diff --git a/packages/create-expo-app/src/utils/update-check.ts b/packages/create-expo-app/src/utils/update-check.ts deleted file mode 100644 index 3397589487..0000000000 --- a/packages/create-expo-app/src/utils/update-check.ts +++ /dev/null @@ -1,20 +0,0 @@ -import chalk from 'chalk'; -import checkForUpdate from 'update-check'; - -const packageJson = require('../package.json'); - -const debug = require('debug')('expo:init:update-check') as typeof console.log; - -export default async function shouldUpdate(): Promise { - try { - const res = await checkForUpdate(packageJson); - if (res?.latest) { - console.log(); - console.log(chalk.yellow.bold(`A new version of \`${packageJson.name}\` is available`)); - console.log(chalk`You can update by running: {cyan npm install -g ${packageJson.name}}`); - console.log(); - } - } catch (error: any) { - debug('Error checking for update:\n%O', error); - } -} diff --git a/packages/create-expo-app/template/gitignore b/packages/create-expo-app/template/gitignore deleted file mode 100644 index ec8a36a257..0000000000 --- a/packages/create-expo-app/template/gitignore +++ /dev/null @@ -1,14 +0,0 @@ -node_modules/ -.expo/ -dist/ -npm-debug.* -*.jks -*.p8 -*.p12 -*.key -*.mobileprovision -*.orig.* -web-build/ - -# macOS -.DS_Store diff --git a/packages/create-expo-app/tsconfig.json b/packages/create-expo-app/tsconfig.json deleted file mode 100644 index ac705e8cfd..0000000000 --- a/packages/create-expo-app/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": "../../tsconfig.base", - "include": ["src/**/*.ts"], - "compilerOptions": { - "outDir": "build", - "resolveJsonModule": true, - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, - "moduleResolution": "node", - "rootDir": "src", - "declaration": false, - "composite": false, - }, - "exclude": ["**/__mocks__/*", "**/__tests__/*"] -} diff --git a/yarn.lock b/yarn.lock index fabbcdbbb2..4a805e50cf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -89,14 +89,7 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.5.5": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/code-frame@^7.22.13": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.5.5": version "7.22.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== @@ -104,12 +97,7 @@ "@babel/highlight" "^7.22.13" chalk "^2.4.2" -"@babel/compat-data@^7.11.0", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.5": - version "7.21.9" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.9.tgz#10a2e7fda4e51742c907938ac3b7229426515514" - integrity sha512-FUGed8kfhyWvbYug/Un/VPJD41rDIgoVVcR+FuzhzOYyRz5uED+Gd3SLZml0Uw2l2aHFb7ZgdW5mGA3G2cCCnQ== - -"@babel/compat-data@^7.22.9": +"@babel/compat-data@^7.11.0", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.5", "@babel/compat-data@^7.22.9": version "7.22.9" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== @@ -134,28 +122,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.12.3", "@babel/core@^7.20.0", "@babel/core@^7.20.2", "@babel/core@^7.4.5", "@babel/core@^7.7.2", "@babel/core@^7.8.0", "@babel/core@^7.9.0": - version "7.21.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.8.tgz#2a8c7f0f53d60100ba4c32470ba0281c92aa9aa4" - integrity sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.5" - "@babel/helper-compilation-targets" "^7.21.5" - "@babel/helper-module-transforms" "^7.21.5" - "@babel/helpers" "^7.21.5" - "@babel/parser" "^7.21.8" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/core@^7.13.16": +"@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.20.0", "@babel/core@^7.20.2", "@babel/core@^7.4.5", "@babel/core@^7.7.2", "@babel/core@^7.8.0", "@babel/core@^7.9.0": version "7.22.17" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.17.tgz#2f9b0b395985967203514b24ee50f9fd0639c866" integrity sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ== @@ -192,7 +159,7 @@ dependencies: eslint-rule-composer "^0.3.0" -"@babel/generator@^7.20.0", "@babel/generator@^7.22.15": +"@babel/generator@^7.20.0", "@babel/generator@^7.22.15", "@babel/generator@^7.7.2", "@babel/generator@^7.7.7": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.15.tgz#1564189c7ec94cb8f77b5e8a90c4d200d21b2339" integrity sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA== @@ -202,24 +169,7 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.21.5", "@babel/generator@^7.7.2", "@babel/generator@^7.7.7": - version "7.21.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.9.tgz#3a1b706e07d836e204aee0650e8ee878d3aaa241" - integrity sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg== - dependencies: - "@babel/types" "^7.21.5" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.13", "@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-annotate-as-pure@^7.22.5": +"@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.13", "@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== @@ -233,18 +183,7 @@ dependencies: "@babel/types" "^7.21.5" -"@babel/helper-compilation-targets@^7.10.4", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz#631e6cc784c7b660417421349aac304c94115366" - integrity sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w== - dependencies: - "@babel/compat-data" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.22.15": +"@babel/helper-compilation-targets@^7.10.4", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.5", "@babel/helper-compilation-targets@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== @@ -255,22 +194,7 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": - version "7.21.8" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz#205b26330258625ef8869672ebca1e0dee5a0f02" - integrity sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.21.5" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.21.5" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.21.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.22.15": +"@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== @@ -306,25 +230,12 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz#c769afefd41d171836f7cb63e295bedf689d48ba" - integrity sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ== - -"@babel/helper-environment-visitor@^7.22.5": +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" - -"@babel/helper-function-name@^7.22.5": +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.21.0", "@babel/helper-function-name@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== @@ -332,27 +243,13 @@ "@babel/template" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-hoist-variables@^7.22.5": +"@babel/helper-hoist-variables@^7.18.6", "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz#3b1a009af932e586af77c1030fba9ee0bde396c0" - integrity sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg== - dependencies: - "@babel/types" "^7.21.5" - "@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz#b95a144896f6d491ca7863576f820f3628818621" @@ -360,35 +257,14 @@ dependencies: "@babel/types" "^7.22.15" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.13.12", "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" - integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== - dependencies: - "@babel/types" "^7.21.4" - -"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.13.12", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== dependencies: "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz#d937c82e9af68d31ab49039136a222b17ac0b420" - integrity sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw== - dependencies: - "@babel/helper-environment-visitor" "^7.21.5" - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-simple-access" "^7.21.5" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" - -"@babel/helper-module-transforms@^7.22.15", "@babel/helper-module-transforms@^7.22.17": +"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.22.15", "@babel/helper-module-transforms@^7.22.17": version "7.22.17" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz#7edf129097a51ccc12443adbc6320e90eab76693" integrity sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ== @@ -399,41 +275,19 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.15" -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-optimise-call-expression@^7.22.5": +"@babel/helper-optimise-call-expression@^7.18.6", "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== dependencies: "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" - integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== - -"@babel/helper-plugin-utils@^7.22.5": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-remap-async-to-generator@^7.22.5": +"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.5": version "7.22.17" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.17.tgz#dabaa50622b3b4670bd6546fc8db23eb12d89da0" integrity sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA== @@ -442,19 +296,7 @@ "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-wrap-function" "^7.22.17" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz#a6ad005ba1c7d9bc2973dfde05a1bba7065dde3c" - integrity sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg== - dependencies: - "@babel/helper-environment-visitor" "^7.21.5" - "@babel/helper-member-expression-to-functions" "^7.21.5" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" - -"@babel/helper-replace-supers@^7.22.9": +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.22.9": version "7.22.9" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== @@ -463,88 +305,42 @@ "@babel/helper-member-expression-to-functions" "^7.22.5" "@babel/helper-optimise-call-expression" "^7.22.5" -"@babel/helper-simple-access@^7.10.4", "@babel/helper-simple-access@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" - integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== - dependencies: - "@babel/types" "^7.21.5" - -"@babel/helper-simple-access@^7.22.5": +"@babel/helper-simple-access@^7.10.4", "@babel/helper-simple-access@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== dependencies: "@babel/types" "^7.22.5" -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== - dependencies: - "@babel/types" "^7.20.0" - -"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-split-export-declaration@^7.22.6": +"@babel/helper-split-export-declaration@^7.18.6", "@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: "@babel/types" "^7.22.5" -"@babel/helper-string-parser@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" - integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== - "@babel/helper-string-parser@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.10.4", "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-identifier@^7.22.15", "@babel/helper-validator-identifier@^7.22.5": +"@babel/helper-validator-identifier@^7.10.4", "@babel/helper-validator-identifier@^7.19.1", "@babel/helper-validator-identifier@^7.22.15", "@babel/helper-validator-identifier@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz#601fa28e4cc06786c18912dca138cec73b882044" integrity sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ== -"@babel/helper-validator-option@^7.12.11", "@babel/helper-validator-option@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== - -"@babel/helper-validator-option@^7.22.15": +"@babel/helper-validator-option@^7.21.0", "@babel/helper-validator-option@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== -"@babel/helper-wrap-function@^7.18.9": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz#89f18335cff1152373222f76a4b37799636ae8b1" - integrity sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" - "@babel/helper-wrap-function@^7.22.17": version "7.22.17" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz#222ac3ff9cc8f9b617cc1e5db75c0b538e722801" @@ -554,16 +350,7 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.22.17" -"@babel/helpers@^7.21.5", "@babel/helpers@^7.7.4": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.5.tgz#5bac66e084d7a4d2d9696bdf0175a93f7fb63c08" - integrity sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" - -"@babel/helpers@^7.22.15": +"@babel/helpers@^7.22.15", "@babel/helpers@^7.7.4": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.15.tgz#f09c3df31e86e3ea0b7ff7556d85cdebd47ea6f1" integrity sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw== @@ -572,16 +359,7 @@ "@babel/traverse" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.22.13": +"@babel/highlight@^7.10.4", "@babel/highlight@^7.22.13": version "7.22.13" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== @@ -590,12 +368,7 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8", "@babel/parser@^7.7.7": - version "7.21.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.9.tgz#ab18ea3b85b4bc33ba98a8d4c2032c557d23cf14" - integrity sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g== - -"@babel/parser@^7.13.16", "@babel/parser@^7.20.0", "@babel/parser@^7.22.15", "@babel/parser@^7.22.16": +"@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.22.15", "@babel/parser@^7.22.16", "@babel/parser@^7.7.7": version "7.22.16" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.16.tgz#180aead7f247305cce6551bea2720934e2fa2c95" integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA== @@ -853,14 +626,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.8.3": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.21.4.tgz#3e37fca4f06d93567c1cd9b75156422e90a67107" - integrity sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.22.5": +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz#163b820b9e7696ce134df3ee716d9c0c98035859" integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== @@ -895,14 +661,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.12.13": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-jsx@^7.22.5": +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== @@ -965,14 +724,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.12.13", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" - integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-syntax-typescript@^7.22.5": +"@babel/plugin-syntax-typescript@^7.22.5", "@babel/plugin-syntax-typescript@^7.7.2": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== @@ -986,16 +738,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.21.5" -"@babel/plugin-transform-async-to-generator@^7.10.4", "@babel/plugin-transform-async-to-generator@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - -"@babel/plugin-transform-async-to-generator@^7.20.0": +"@babel/plugin-transform-async-to-generator@^7.10.4", "@babel/plugin-transform-async-to-generator@^7.20.0", "@babel/plugin-transform-async-to-generator@^7.20.7": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== @@ -1041,14 +784,7 @@ "@babel/helper-plugin-utils" "^7.21.5" "@babel/template" "^7.20.7" -"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.10.4", "@babel/plugin-transform-destructuring@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" - integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-destructuring@^7.20.0": +"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.10.4", "@babel/plugin-transform-destructuring@^7.20.0", "@babel/plugin-transform-destructuring@^7.21.3": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz#e7404ea5bb3387073b9754be654eecb578324694" integrity sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ== @@ -1078,15 +814,7 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.7.4": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz#8a3538aa40434e000b8f44a3c5c9ac7229bd2392" - integrity sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-flow" "^7.8.3" - -"@babel/plugin-transform-flow-strip-types@^7.20.0", "@babel/plugin-transform-flow-strip-types@^7.22.5": +"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.20.0", "@babel/plugin-transform-flow-strip-types@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz#0bb17110c7bf5b35a60754b2f00c58302381dee2" integrity sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA== @@ -1142,16 +870,7 @@ "@babel/helper-simple-access" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.1.0", "@babel/plugin-transform-modules-commonjs@^7.10.4", "@babel/plugin-transform-modules-commonjs@^7.21.5", "@babel/plugin-transform-modules-commonjs@^7.5.0": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc" - integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== - dependencies: - "@babel/helper-module-transforms" "^7.21.5" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-simple-access" "^7.21.5" - -"@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.22.15": +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.1.0", "@babel/plugin-transform-modules-commonjs@^7.10.4", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.21.5", "@babel/plugin-transform-modules-commonjs@^7.22.15", "@babel/plugin-transform-modules-commonjs@^7.5.0": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz#b11810117ed4ee7691b29bd29fd9f3f98276034f" integrity sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg== @@ -1323,16 +1042,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typescript@^7.10.4", "@babel/plugin-transform-typescript@^7.12.13", "@babel/plugin-transform-typescript@^7.5.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz#4a498e1f3600342d2a9e61f60131018f55774853" - integrity sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-typescript" "^7.12.13" - -"@babel/plugin-transform-typescript@^7.22.15": +"@babel/plugin-transform-typescript@^7.10.4", "@babel/plugin-transform-typescript@^7.22.15", "@babel/plugin-transform-typescript@^7.5.0": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz#15adef906451d86349eb4b8764865c960eb54127" integrity sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== @@ -1513,15 +1223,7 @@ core-js-compat "^3.25.1" semver "^6.3.0" -"@babel/preset-flow@^7.0.0": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.7.4.tgz#99c1349b6fd7132783196de181e6b32d0949427e" - integrity sha512-6LbUqcHD8BcRtXMOp5bc5nJeU8RlKh6q5U8TgZeCrf9ebBdW8Wyy5ujAUnbJfmzQ56Kkq5XtwErC/5+5RHyFYA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.7.4" - -"@babel/preset-flow@^7.13.13": +"@babel/preset-flow@^7.0.0", "@babel/preset-flow@^7.13.13": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.22.15.tgz#30318deb9b3ebd9f5738e96da03a531e0cd3165d" integrity sha512-dB5aIMqpkgbTfN5vDdTRPzjqtWiZcRESNR88QYnoPR+bmdYoluOzMX9tQerTv0XzSgZYctPfO1oc0N5zdog1ew== @@ -1573,16 +1275,7 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-typescript" "^7.10.4" -"@babel/preset-typescript@^7.1.0", "@babel/preset-typescript@^7.3.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.12.13.tgz#c859c7c075c531d2cc34c2516b214e5d884efe5c" - integrity sha512-gYry7CeXwD2wtw5qHzrtzKaShEhOfTmKb4i0ZxeYBcBosN5VuAudsNbjX7Oj5EAfQ3K4s4HsVMQRRcqGsPvs2A== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-validator-option" "^7.12.11" - "@babel/plugin-transform-typescript" "^7.12.13" - -"@babel/preset-typescript@^7.13.0": +"@babel/preset-typescript@^7.1.0", "@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.3.3": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.22.15.tgz#43db30516fae1d417d748105a0bc95f637239d48" integrity sha512-HblhNmh6yM+cU4VwbBRpxFhxsTdfS1zsvH9W+gEjD0ARV9+8B4sNfpI6GuhePti84nuvhiwKS539jKPFHskA9A== @@ -1593,18 +1286,7 @@ "@babel/plugin-transform-modules-commonjs" "^7.22.15" "@babel/plugin-transform-typescript" "^7.22.15" -"@babel/register@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.8.3.tgz#5d5d30cfcc918437535d724b8ac1e4a60c5db1f8" - integrity sha512-t7UqebaWwo9nXWClIPLPloa5pN33A2leVs8Hf0e9g9YwUP8/H9NeR7DJU+4CXo23QtjChQv5a3DjEtT83ih1rg== - dependencies: - find-cache-dir "^2.0.0" - lodash "^4.17.13" - make-dir "^2.1.0" - pirates "^4.0.0" - source-map-support "^0.5.16" - -"@babel/register@^7.13.16": +"@babel/register@^7.0.0", "@babel/register@^7.13.16": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.22.15.tgz#c2c294a361d59f5fa7bcc8b97ef7319c32ecaec7" integrity sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg== @@ -1641,16 +1323,7 @@ dependencies: regenerator-runtime "^0.13.11" -"@babel/template@^7.0.0", "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3", "@babel/template@^7.7.4": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/template@^7.22.15", "@babel/template@^7.22.5": +"@babel/template@^7.0.0", "@babel/template@^7.20.7", "@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3", "@babel/template@^7.7.4": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== @@ -1659,23 +1332,7 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.19.0", "@babel/traverse@^7.21.5", "@babel/traverse@^7.7.2", "@babel/traverse@^7.7.4": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133" - integrity sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.5" - "@babel/helper-environment-visitor" "^7.21.5" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.5" - "@babel/types" "^7.21.5" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.20.0", "@babel/traverse@^7.22.15", "@babel/traverse@^7.22.17": +"@babel/traverse@^7.20.0", "@babel/traverse@^7.22.15", "@babel/traverse@^7.22.17", "@babel/traverse@^7.7.2", "@babel/traverse@^7.7.4": version "7.22.17" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.17.tgz#b23c203ab3707e3be816043081b4a994fcacec44" integrity sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg== @@ -1709,16 +1366,7 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babel/types@^7.0.0", "@babel/types@^7.11.5", "@babel/types@^7.13.12", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.4": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" - integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== - dependencies: - "@babel/helper-string-parser" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@babel/types@^7.22.15", "@babel/types@^7.22.17", "@babel/types@^7.22.5": +"@babel/types@^7.0.0", "@babel/types@^7.11.5", "@babel/types@^7.13.12", "@babel/types@^7.20.0", "@babel/types@^7.21.5", "@babel/types@^7.22.15", "@babel/types@^7.22.17", "@babel/types@^7.22.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.4": version "7.22.17" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.17.tgz#f753352c4610ffddf9c8bc6823f9ff03e2303eee" integrity sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg== @@ -2349,23 +1997,6 @@ split "^1.0.1" sudo-prompt "9.1.1" -"@expo/package-manager@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@expo/package-manager/-/package-manager-1.1.0.tgz#13424a6568d56de3779904dab5e562508cc76121" - integrity sha512-QTZbac0SJcnzQSQHNM05gIvx5jU/GUHKRbwxheznsbgU2ZurM5n9xRkX+Gr7uN43W/SJhCfUHECkhrnP/MUlTw== - dependencies: - "@expo/json-file" "^8.2.37" - "@expo/spawn-async" "^1.5.0" - ansi-regex "^5.0.0" - chalk "^4.0.0" - find-up "^5.0.0" - find-yarn-workspace-root "~2.0.0" - js-yaml "^3.13.1" - micromatch "^4.0.2" - npm-package-arg "^7.0.0" - split "^1.0.1" - sudo-prompt "9.1.1" - "@expo/package-manager@~1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/@expo/package-manager/-/package-manager-1.0.1.tgz#d0d6b0937df5016b0155b1d87bbaba9839bbeb9f" @@ -2707,13 +2338,6 @@ terminal-link "^2.0.0" v8-to-istanbul "^8.1.0" -"@jest/schemas@^29.4.0": - version "29.4.0" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.0.tgz#0d6ad358f295cc1deca0b643e6b4c86ebd539f17" - integrity sha512-0E01f/gOZeNTG76i5eWWSupvSHaIINrTie7vCyjiYFKgzNdyEGd12BUv4oNBFHOqlHDbtoJi3HrQ38KCC90NsQ== - dependencies: - "@sinclair/typebox" "^0.25.16" - "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" @@ -2824,18 +2448,6 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" -"@jest/types@^29.4.1": - version "29.4.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.4.1.tgz#f9f83d0916f50696661da72766132729dcb82ecb" - integrity sha512-zbrAXDUOnpJ+FMST2rV7QZOgec8rskg2zv8g2ajeqitp4tvZiyqTCYXANrKsM+ryj5o+LI+ZN2EgU9drrkiwSA== - dependencies: - "@jest/schemas" "^29.4.0" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - "@jest/types@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" @@ -2867,14 +2479,6 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - "@jridgewell/source-map@^0.3.3": version "0.3.5" resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" @@ -3972,11 +3576,6 @@ resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== -"@sinclair/typebox@^0.25.16": - version "0.25.21" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.21.tgz#763b05a4b472c93a8db29b2c3e359d55b29ce272" - integrity sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g== - "@sinclair/typebox@^0.27.8": version "0.27.8" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" @@ -4187,13 +3786,6 @@ resolved "https://registry.yarnpkg.com/@types/dateformat/-/dateformat-3.0.1.tgz#98d747a2e5e9a56070c6bf14e27bff56204e34cc" integrity sha512-KlPPdikagvL6ELjWsljbyDIPzNCeliYkqRpI+zea99vBBbCIA5JNshZAwQKTON139c87y9qvTFVgkFd14rtS4g== -"@types/debug@^4.1.7": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== - dependencies: - "@types/ms" "*" - "@types/envinfo@^7.8.1": version "7.8.1" resolved "https://registry.yarnpkg.com/@types/envinfo/-/envinfo-7.8.1.tgz#1915df82c16d637e92146645c70db9360eb099c6" @@ -4265,13 +3857,6 @@ dependencies: "@types/node" "*" -"@types/getenv@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/getenv/-/getenv-1.0.0.tgz#fa5e6901e9fb84bfb40205d4952fd06c8afcf006" - integrity sha512-w8qs+09o4pfFb/4XkHJzsHEZ2m36s/d9vJhglbOeSiSe9mPu0OmCQbU4iEgGl2DNP9WfOHCVd6fBwIvBd4AZhg== - dependencies: - "@types/node" "*" - "@types/glob@^7.1.1": version "7.1.1" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" @@ -4439,18 +4024,13 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -"@types/minipass@^3.1.2", "@types/minipass@^3.3.5": +"@types/minipass@^3.1.2": version "3.3.5" resolved "https://registry.yarnpkg.com/@types/minipass/-/minipass-3.3.5.tgz#ba65aaae3fe7318520bd4a40bc71c53fc8826e45" integrity sha512-M2BLHQdEmDmH671h0GIlOQQJrgezd1vNqq7PVj1VOsHZ2uQQb4iPiQIl0SlMdhxZPUsLIfEklmeEHXg8DJRewA== dependencies: minipass "*" -"@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== - "@types/multimatch@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@types/multimatch/-/multimatch-2.1.3.tgz#fbc0a7e507ccc9fc58455f83d26971310cedc597" @@ -4458,14 +4038,6 @@ dependencies: "@types/minimatch" "*" -"@types/node-fetch@^2.5.8": - version "2.5.8" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.8.tgz#e199c835d234c7eb0846f6618012e558544ee2fb" - integrity sha512-fbjI6ja0N5ZA8TV53RUqzsKNkl9fv8Oj3T7zxW7FGv1GSH7gwJaNF8dzCjrqKaxKeUpTz4yT1DaJFq/omNpGfw== - dependencies: - "@types/node" "*" - form-data "^3.0.0" - "@types/node-forge@^0.9.7": version "0.9.7" resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-0.9.7.tgz#948f7b52d352a6c4ab22d3328c206f0870672db5" @@ -4483,11 +4055,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.50.tgz#14ba5198f1754ffd0472a2f84ab433b45ee0b65e" integrity sha512-+9axpWx2b2JCVovr7Ilgt96uc6C1zBKOQMpGtRbWT9IoR/8ue32GGMfGA4woP8QyP2gBs6GQWEVM3tCybGCxDA== -"@types/node@^16.11.56": - version "16.11.56" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.56.tgz#dcbb617669481e158e0f1c6204d1c768cd675901" - integrity sha512-aFcUkv7EddxxOa/9f74DINReQ/celqH8DiB3fRYgVDM2Xm5QJL8sl80QKuAnGvwAsMn+H3IFA6WCrQh1CY7m1A== - "@types/node@^9.4.6": version "9.6.55" resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.55.tgz#7cc1358c9c18e71f6c020e410962971863232cf5" @@ -4522,7 +4089,7 @@ dependencies: "@types/node" "*" -"@types/prompts@2.0.14", "@types/prompts@^2.0.6": +"@types/prompts@^2.0.6": version "2.0.14" resolved "https://registry.yarnpkg.com/@types/prompts/-/prompts-2.0.14.tgz#10cb8899844bb0771cabe57c1becaaaca9a3b521" integrity sha512-HZBd99fKxRWpYCErtm2/yxUZv6/PBI9J7N4TNFffl5JbrYMHBwF25DjQGTW3b3jmXq+9P6/8fCIb2ee57BFfYA== @@ -4639,7 +4206,7 @@ resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== -"@types/tar@^6.1.1", "@types/tar@^6.1.2": +"@types/tar@^6.1.1": version "6.1.2" resolved "https://registry.yarnpkg.com/@types/tar/-/tar-6.1.2.tgz#e60108a7d1b08cc91bf2faf1286cc08fdad48bbe" integrity sha512-bnX3RRm70/n1WMwmevdOAeDU4YP7f5JSubgnuU+yrO+xQQjwDboJj3u2NTJI5ngCQhXihqVVAH5h5J8YpdpEvg== @@ -5264,12 +4831,7 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.0, acorn@^8.7.1: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - -acorn@^8.8.2: +acorn@^8.2.4, acorn@^8.7.0, acorn@^8.7.1, acorn@^8.8.2: version "8.10.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== @@ -5686,11 +5248,6 @@ arg@^4.1.0: resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== -arg@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -6561,17 +6118,7 @@ browserslist@4.13.0: escalade "^3.0.1" node-releases "^1.1.58" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: - version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== - dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" - -browserslist@^4.21.9: +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.21.4, browserslist@^4.21.5, browserslist@^4.21.9: version "4.21.10" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== @@ -6897,12 +6444,7 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001093, caniuse-lite@^1.0.30001113, caniuse-lite@^1.0.30001449: - version "1.0.30001489" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz#ca82ee2d4e4dbf2bd2589c9360d3fcc2c7ba3bd8" - integrity sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ== - -caniuse-lite@^1.0.30001517: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001093, caniuse-lite@^1.0.30001113, caniuse-lite@^1.0.30001517: version "1.0.30001532" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001532.tgz#c6a4d5d2da6d2b967f0ee5e12e7f680db6ad2fca" integrity sha512-FbDFnNat3nMnrROzqrsg314zhqN5LGQ1kyyMk2opcrwGbVGpHRhgCWtAgD5YJUqNAiQ+dklreil/c3Qf1dfCTw== @@ -6947,7 +6489,7 @@ chalk@^1.0.0, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.1, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -7124,12 +6666,7 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-spinners@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.2.0.tgz#e8b988d9206c692302d8ee834e7a85c0144d8f77" - integrity sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ== - -cli-spinners@^2.5.0: +cli-spinners@^2.0.0, cli-spinners@^2.5.0: version "2.9.0" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== @@ -8273,12 +7810,7 @@ deep-is@^0.1.3, deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -deepmerge@^4.0.0, deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -deepmerge@^4.3.0: +deepmerge@^4.0.0, deepmerge@^4.2.2, deepmerge@^4.3.0: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== @@ -8723,12 +8255,7 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.488, electron-to-chromium@^1.4.284: - version "1.4.408" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.408.tgz#73e657a24bd0b7481d68c943dded0d097b0d0a52" - integrity sha512-vjeaj0u/UYnzA/CIdGXzzcxRLCqRwREYc9YfaWInjIEr7/XPttZ6ShpyqapchEy0S2r6LpLjDBTnNj7ZxnxJKg== - -electron-to-chromium@^1.4.477: +electron-to-chromium@^1.3.488, electron-to-chromium@^1.4.477: version "1.4.513" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.513.tgz#41a50bf749aa7d8058ffbf7a131fc3327a7b1675" integrity sha512-cOB0xcInjm+E5qIssHeXJ29BaUyWpMyFKT5RB3bsLENDheCja0wMkHJyiPl0NBE/VzDI7JDuNEQWhe6RitEUcw== @@ -9979,12 +9506,7 @@ flow-enums-runtime@^0.0.5: resolved "https://registry.yarnpkg.com/flow-enums-runtime/-/flow-enums-runtime-0.0.5.tgz#95884bfcc82edaf27eef7e1dd09732331cfbafbc" integrity sha512-PSZF9ZuaZD03sT9YaIs0FrGJ7lSUw7rHZIex+73UYVXg46eL/wxN5PaVcPJFudE2cJu5f0fezitV5aBkLHPUOQ== -flow-parser@0.*: - version "0.121.0" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.121.0.tgz#9f9898eaec91a9f7c323e9e992d81ab5c58e618f" - integrity sha512-1gIBiWJNR0tKUNv8gZuk7l9rVX06OuLzY9AoGio7y/JT4V1IZErEMEq2TJS+PFcw/y0RshZ1J/27VfK1UQzYVg== - -flow-parser@^0.206.0: +flow-parser@0.*, flow-parser@^0.206.0: version "0.206.0" resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.206.0.tgz#f4f794f8026535278393308e01ea72f31000bfef" integrity sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w== @@ -11123,16 +10645,11 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== - iferr@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" @@ -11388,14 +10905,7 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.11.0, is-core-module@^2.2.0, is-core-module@^2.8.1: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== - dependencies: - has "^1.0.3" - -is-core-module@^2.13.0: +is-core-module@^2.13.0, is-core-module@^2.2.0, is-core-module@^2.8.1: version "2.13.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== @@ -12361,19 +11871,7 @@ jest-util@^27.2.0, jest-util@^27.5.1: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-util@^29.4.1: - version "29.4.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.1.tgz#2eeed98ff4563b441b5a656ed1a786e3abc3e4c4" - integrity sha512-bQy9FPGxVutgpN4VRc0hk6w7Hx/m6L53QxpDreTZgJd9gfx/AV2MjyPde9tGyZRINAUrSv57p2inGBu2dRLmkQ== - dependencies: - "@jest/types" "^29.4.1" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-util@^29.6.3: +jest-util@^29.4.1, jest-util@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.6.3.tgz#e15c3eac8716440d1ed076f09bc63ace1aebca63" integrity sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA== @@ -14056,7 +13554,7 @@ minipass@^2.3.5, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: safe-buffer "^5.1.2" yallist "^3.0.0" -minipass@^3.0.0, minipass@^3.1.1, minipass@^3.3.4, minipass@^3.3.5: +minipass@^3.0.0, minipass@^3.1.1, minipass@^3.3.5: version "3.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.5.tgz#6da7e53a48db8a856eeb9153d85b230a2119e819" integrity sha512-rQ/p+KfKBkeNwo04U15i+hOwoVBVmekmm/HcfTkTN2t9pbQKCMm4eN5gFeqgrrSp/kH/7BYYhTIHOxGqzbBPaA== @@ -14231,11 +13729,6 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== - nanoid@^3.3.6: version "3.3.6" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" @@ -14533,11 +14026,6 @@ node-releases@^2.0.13: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== -node-releases@^2.0.8: - version "2.0.12" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" - integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== - node-stream-zip@^1.9.1: version "1.15.0" resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.15.0.tgz#158adb88ed8004c6c49a396b50a6a5de3bca33ea" @@ -15478,12 +14966,7 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pirates@^4.0.0, pirates@^4.0.1, pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pirates@^4.0.5: +pirates@^4.0.1, pirates@^4.0.4, pirates@^4.0.5: version "4.0.6" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== @@ -15849,16 +15332,7 @@ postcss@7.0.32, postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0. source-map "^0.6.1" supports-color "^6.1.0" -postcss@^8.3.5, postcss@^8.4.17, postcss@^8.4.19: - version "8.4.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" - integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@~8.4.21: +postcss@^8.3.5, postcss@^8.4.17, postcss@^8.4.19, postcss@~8.4.21: version "8.4.29" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.29.tgz#33bc121cf3b3688d4ddef50be869b2a54185a1dd" integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== @@ -16010,7 +15484,7 @@ promise@^8.3.0: dependencies: asap "~2.0.6" -prompts@^2.0.1, prompts@^2.3.0, prompts@^2.3.2, prompts@^2.4.0, prompts@^2.4.2: +prompts@^2.0.1, prompts@^2.3.0, prompts@^2.3.2, prompts@^2.4.0: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -16545,16 +16019,7 @@ read@1, read@~1.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -"readable-stream@2 || 3", readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.5.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^3.4.0: +"readable-stream@2 || 3", readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.4.0, readable-stream@^3.5.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -16939,16 +16404,7 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== -resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.22.1: +resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1: version "1.22.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== @@ -17271,24 +16727,12 @@ semver@7.5.3: dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^6.3.1: +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.5, semver@^7.3.8, semver@~7.3.2: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -semver@^7.5.3: +semver@^7.3.2, semver@^7.3.5, semver@^7.3.8, semver@^7.5.3: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -17300,6 +16744,13 @@ semver@~5.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= +semver@~7.3.2: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" @@ -17508,12 +16959,7 @@ shell-quote@1.7.2: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== -shell-quote@^1.6.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" - integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== - -shell-quote@^1.7.3: +shell-quote@^1.6.1, shell-quote@^1.7.3: version "1.8.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== @@ -18013,16 +17459,7 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string-width@^4.2.3: +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -18387,7 +17824,7 @@ tar@^4, tar@^4.4.10, tar@^4.4.12, tar@^4.4.8: safe-buffer "^5.1.2" yallist "^3.0.3" -tar@^6.0.2, tar@^6.0.5, tar@^6.1.13: +tar@^6.0.2, tar@^6.0.5: version "6.1.13" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== @@ -18509,17 +17946,7 @@ terser@4.8.0, terser@^4.1.2: source-map "~0.6.1" source-map-support "~0.5.12" -terser@^5.10.0, terser@^5.14.1: - version "5.16.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.1.tgz#5af3bc3d0f24241c7fb2024199d5c461a1075880" - integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== - dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -terser@^5.15.0: +terser@^5.10.0, terser@^5.14.1, terser@^5.15.0: version "5.19.4" resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.4.tgz#941426fa482bf9b40a0308ab2b3cd0cf7c775ebd" integrity sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g== @@ -19070,7 +18497,7 @@ upath@^1.1.1, upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.10, update-browserslist-db@^1.0.11: +update-browserslist-db@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== @@ -19094,14 +18521,6 @@ update-check@1.5.3: registry-auth-token "3.3.2" registry-url "3.1.0" -update-check@^1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/update-check/-/update-check-1.5.4.tgz#5b508e259558f1ad7dbc8b4b0457d4c9d28c8743" - integrity sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ== - dependencies: - registry-auth-token "3.3.2" - registry-url "3.1.0" - uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -19794,12 +19213,7 @@ ws@^6.2.2: dependencies: async-limiter "~1.0.0" -ws@^7, ws@^7.4.6: - version "7.5.8" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a" - integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw== - -ws@^7.5.1: +ws@^7, ws@^7.4.6, ws@^7.5.1: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==