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
-
-
-
-
-
-
- The fastest way to create universal React apps
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-```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==