From e3ae1ff8bdf5d626094f9f289880046f3f0f6fb8 Mon Sep 17 00:00:00 2001 From: ghdtjgus76 Date: Wed, 22 May 2024 17:07:41 +0900 Subject: [PATCH 01/12] chore: move react from devDependency to dependency in basic example --- examples/basic/packages/ui/package.json | 4 +++- examples/basic/pnpm-lock.yaml | 8 +++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/examples/basic/packages/ui/package.json b/examples/basic/packages/ui/package.json index 4d5e99ef7783a..680a1e70da4aa 100644 --- a/examples/basic/packages/ui/package.json +++ b/examples/basic/packages/ui/package.json @@ -20,7 +20,9 @@ "@types/react": "^18.2.61", "@types/react-dom": "^18.2.19", "eslint": "^8.57.0", - "react": "^18.2.0", "typescript": "^5.3.3" + }, + "dependencies": { + "react": "^18.2.0" } } diff --git a/examples/basic/pnpm-lock.yaml b/examples/basic/pnpm-lock.yaml index e27dca6a8f3a7..e8ec7621ea0d2 100644 --- a/examples/basic/pnpm-lock.yaml +++ b/examples/basic/pnpm-lock.yaml @@ -134,6 +134,10 @@ importers: packages/typescript-config: {} packages/ui: + dependencies: + react: + specifier: ^18.2.0 + version: 18.2.0 devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -159,9 +163,6 @@ importers: eslint: specifier: ^8.57.0 version: 8.57.0 - react: - specifier: ^18.2.0 - version: 18.2.0 typescript: specifier: ^5.3.3 version: 5.3.3 @@ -3987,6 +3988,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 + dev: false /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} From 871749bcffeb2be76e81d293bf75cfaa67e69774 Mon Sep 17 00:00:00 2001 From: ghdtjgus76 Date: Wed, 22 May 2024 17:10:11 +0900 Subject: [PATCH 02/12] chore: move react from devDependency to dependency in kitchen sink example --- examples/kitchen-sink/packages/ui/package.json | 8 +++++--- examples/kitchen-sink/pnpm-lock.yaml | 18 ++++++++++++------ 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/examples/kitchen-sink/packages/ui/package.json b/examples/kitchen-sink/packages/ui/package.json index fa04f8385ff54..488e6a543e21a 100644 --- a/examples/kitchen-sink/packages/ui/package.json +++ b/examples/kitchen-sink/packages/ui/package.json @@ -30,9 +30,11 @@ "@types/react": "^18.2.62", "@types/react-dom": "^18.2.19", "jest": "^29.7.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", "tsup": "^8.0.2", "typescript": "^5.3.3" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" } -} \ No newline at end of file +} diff --git a/examples/kitchen-sink/pnpm-lock.yaml b/examples/kitchen-sink/pnpm-lock.yaml index 476d89df832bb..2977858b9a075 100644 --- a/examples/kitchen-sink/pnpm-lock.yaml +++ b/examples/kitchen-sink/pnpm-lock.yaml @@ -257,6 +257,13 @@ importers: version: 5.3.3 packages/ui: + dependencies: + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -282,12 +289,6 @@ importers: jest: specifier: ^29.7.0 version: 29.7.0(@types/node@20.11.24) - react: - specifier: ^18.2.0 - version: 18.2.0 - react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) tsup: specifier: ^8.0.2 version: 8.0.2(typescript@5.3.3) @@ -576,11 +577,13 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@babel/types': 7.24.0 + /@babel/parser@7.24.0: resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} engines: {node: '>=6.0.0'} dependencies: '@babel/types': 7.24.0 + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.0): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -8414,6 +8417,7 @@ packages: loose-envify: 1.4.0 react: 18.2.0 scheduler: 0.23.0 + dev: false /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -8455,6 +8459,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 + dev: false /read-package-json-fast@3.0.2: resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} @@ -8791,6 +8796,7 @@ packages: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 + dev: false /semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} From 39bcf8414f90bc0b04b802becde06fcd091d31f1 Mon Sep 17 00:00:00 2001 From: ghdtjgus76 Date: Wed, 22 May 2024 17:12:44 +0900 Subject: [PATCH 03/12] chore: move react from devDependency to dependency in with berry example --- examples/with-berry/packages/ui/package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/with-berry/packages/ui/package.json b/examples/with-berry/packages/ui/package.json index 3323d7d077b88..fc14c67e016f0 100644 --- a/examples/with-berry/packages/ui/package.json +++ b/examples/with-berry/packages/ui/package.json @@ -14,7 +14,9 @@ "@types/react": "^18.2.61", "@types/react-dom": "^18.2.19", "eslint": "^8.57.0", - "react": "^18.2.0", "typescript": "^5.3.3" + }, + "dependencies": { + "react": "^18.2.0" } } From 8d87d067223530e896ec565348b5b4681086b16e Mon Sep 17 00:00:00 2001 From: ghdtjgus76 Date: Wed, 22 May 2024 17:14:14 +0900 Subject: [PATCH 04/12] chore: move react from devDependency to dependency in with changesets example --- .../packages/acme-core/package.json | 4 +++- .../packages/acme-utils/package.json | 4 +++- examples/with-changesets/pnpm-lock.yaml | 15 +++++++++------ 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/examples/with-changesets/packages/acme-core/package.json b/examples/with-changesets/packages/acme-core/package.json index 3f1330bef3c7c..d465d4ca05354 100644 --- a/examples/with-changesets/packages/acme-core/package.json +++ b/examples/with-changesets/packages/acme-core/package.json @@ -21,10 +21,12 @@ "@types/react-dom": "^18.2.19", "eslint": "^8.57.0", "@acme/eslint-config": "workspace:*", - "react": "^18.2.0", "tsup": "^8.0.2", "typescript": "^5.3.3" }, + "dependencies": { + "react": "^18.2.0" + }, "publishConfig": { "access": "public" } diff --git a/examples/with-changesets/packages/acme-utils/package.json b/examples/with-changesets/packages/acme-utils/package.json index d642382db2c64..0a3ca2d7bb06f 100644 --- a/examples/with-changesets/packages/acme-utils/package.json +++ b/examples/with-changesets/packages/acme-utils/package.json @@ -21,10 +21,12 @@ "@types/react-dom": "^18.2.19", "eslint": "^8.57.0", "@acme/eslint-config": "workspace:*", - "react": "^18.2.0", "tsup": "^8.0.2", "typescript": "^5.3.3" }, + "dependencies": { + "react": "^18.2.0" + }, "publishConfig": { "access": "public" } diff --git a/examples/with-changesets/pnpm-lock.yaml b/examples/with-changesets/pnpm-lock.yaml index 1e320936fef99..4876f72509c77 100644 --- a/examples/with-changesets/pnpm-lock.yaml +++ b/examples/with-changesets/pnpm-lock.yaml @@ -65,6 +65,10 @@ importers: version: 5.3.3 packages/acme-core: + dependencies: + react: + specifier: ^18.2.0 + version: 18.2.0 devDependencies: '@acme/eslint-config': specifier: workspace:* @@ -81,9 +85,6 @@ importers: eslint: specifier: ^8.57.0 version: 8.57.0 - react: - specifier: ^18.2.0 - version: 18.2.0 tsup: specifier: ^8.0.2 version: 8.0.2(typescript@5.3.3) @@ -94,6 +95,10 @@ importers: packages/acme-tsconfig: {} packages/acme-utils: + dependencies: + react: + specifier: ^18.2.0 + version: 18.2.0 devDependencies: '@acme/eslint-config': specifier: workspace:* @@ -110,9 +115,6 @@ importers: eslint: specifier: ^8.57.0 version: 8.57.0 - react: - specifier: ^18.2.0 - version: 18.2.0 tsup: specifier: ^8.0.2 version: 8.0.2(typescript@5.3.3) @@ -4156,6 +4158,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 + dev: false /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} From dea66f4f3d812389d447b1575349a30e45a658c9 Mon Sep 17 00:00:00 2001 From: ghdtjgus76 Date: Wed, 22 May 2024 17:15:28 +0900 Subject: [PATCH 05/12] chore: move react from devDependency to dependency in with docker example --- examples/with-docker/packages/ui/package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/with-docker/packages/ui/package.json b/examples/with-docker/packages/ui/package.json index 6e3546b8371f8..656892bb5e021 100644 --- a/examples/with-docker/packages/ui/package.json +++ b/examples/with-docker/packages/ui/package.json @@ -12,8 +12,10 @@ "@types/react-dom": "^18.2.19", "eslint": "^8.57.0", "@repo/eslint-config": "*", - "react": "^18.2.0", "@repo/typescript-config": "*", "typescript": "^5.3.3" + }, + "dependencies": { + "react": "^18.2.0" } } From 40b67d18c00e7fb44bcc3d1ac1394733d63bf8f9 Mon Sep 17 00:00:00 2001 From: ghdtjgus76 Date: Wed, 22 May 2024 17:16:38 +0900 Subject: [PATCH 06/12] chore: move react from devDependency to dependency in with gatsby example --- examples/with-gatsby/packages/ui/package.json | 4 +++- examples/with-gatsby/pnpm-lock.yaml | 8 +++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/examples/with-gatsby/packages/ui/package.json b/examples/with-gatsby/packages/ui/package.json index 4d8f7dc961813..4a432bd58cc73 100644 --- a/examples/with-gatsby/packages/ui/package.json +++ b/examples/with-gatsby/packages/ui/package.json @@ -13,7 +13,9 @@ "@types/react": "^18.2.61", "@types/react-dom": "^18.2.19", "eslint": "^8.57.0", - "react": "^18.2.0", "typescript": "^5.3.3" + }, + "dependencies": { + "react": "^18.2.0" } } diff --git a/examples/with-gatsby/pnpm-lock.yaml b/examples/with-gatsby/pnpm-lock.yaml index df8de0889410a..a0cc27ad1379c 100644 --- a/examples/with-gatsby/pnpm-lock.yaml +++ b/examples/with-gatsby/pnpm-lock.yaml @@ -125,6 +125,10 @@ importers: packages/typescript-config: {} packages/ui: + dependencies: + react: + specifier: ^18.2.0 + version: 18.2.0 devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -141,9 +145,6 @@ importers: eslint: specifier: ^8.57.0 version: 8.57.0 - react: - specifier: ^18.2.0 - version: 18.2.0 typescript: specifier: ^5.3.3 version: 5.4.4 @@ -9923,6 +9924,7 @@ packages: /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + requiresBuild: true dependencies: safe-buffer: 5.2.1 From 1aa4d18a356c67d2a2feb9ab3eb7cba85862d925 Mon Sep 17 00:00:00 2001 From: ghdtjgus76 Date: Wed, 22 May 2024 17:17:26 +0900 Subject: [PATCH 07/12] chore: move react from devDependency to dependency in with npm example --- examples/with-npm/package-lock.json | 6 ++++-- examples/with-npm/packages/ui/package.json | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/examples/with-npm/package-lock.json b/examples/with-npm/package-lock.json index cc64e5ce621d3..dc5b74402c2a4 100644 --- a/examples/with-npm/package-lock.json +++ b/examples/with-npm/package-lock.json @@ -8591,6 +8591,9 @@ "packages/ui": { "name": "@repo/ui", "version": "0.0.0", + "dependencies": { + "react": "^18.2.0" + }, "devDependencies": { "@repo/eslint-config": "*", "@repo/typescript-config": "*", @@ -8600,9 +8603,8 @@ "@types/react": "^18.2.61", "@types/react-dom": "^18.2.19", "eslint": "^8.57.0", - "react": "^18.2.0", "typescript": "^5.3.3" } } } -} \ No newline at end of file +} diff --git a/examples/with-npm/packages/ui/package.json b/examples/with-npm/packages/ui/package.json index cd61216f9c2ed..c93c6d97805c5 100644 --- a/examples/with-npm/packages/ui/package.json +++ b/examples/with-npm/packages/ui/package.json @@ -19,7 +19,9 @@ "@types/react": "^18.2.61", "@types/react-dom": "^18.2.19", "eslint": "^8.57.0", - "react": "^18.2.0", "typescript": "^5.3.3" + }, + "dependencies": { + "react": "^18.2.0" } } From e948db0cd1d71d161791437e72e048458df47130 Mon Sep 17 00:00:00 2001 From: ghdtjgus76 Date: Wed, 22 May 2024 17:19:15 +0900 Subject: [PATCH 08/12] chore: move react from devDependency to dependency in with rollup example --- examples/with-rollup/packages/ui/package.json | 4 +- examples/with-rollup/pnpm-lock.yaml | 2209 ++++++++--------- 2 files changed, 1072 insertions(+), 1141 deletions(-) diff --git a/examples/with-rollup/packages/ui/package.json b/examples/with-rollup/packages/ui/package.json index dcc0c47b13202..48d50820c3af9 100644 --- a/examples/with-rollup/packages/ui/package.json +++ b/examples/with-rollup/packages/ui/package.json @@ -24,8 +24,10 @@ "@types/react": "^18.2.61", "@types/react-dom": "^18.2.19", "eslint": "^8.57.0", - "react": "^18.2.0", "rollup": "^4.12.0", "typescript": "^5.3.3" + }, + "dependencies": { + "react": "^18.2.0" } } diff --git a/examples/with-rollup/pnpm-lock.yaml b/examples/with-rollup/pnpm-lock.yaml index 644de879ffc33..ba750b9bc96ec 100644 --- a/examples/with-rollup/pnpm-lock.yaml +++ b/examples/with-rollup/pnpm-lock.yaml @@ -19,7 +19,7 @@ importers: version: 3.2.5 turbo: specifier: ^1.12.2 - version: 1.12.4 + version: 1.13.3 apps/web: dependencies: @@ -28,17 +28,17 @@ importers: version: link:../../packages/ui next: specifier: ^14.1.1 - version: 14.1.1(react-dom@18.2.0)(react@18.2.0) + version: 14.2.3(react-dom@18.3.1)(react@18.3.1) react: specifier: ^18.2.0 - version: 18.2.0 + version: 18.3.1 react-dom: specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) + version: 18.3.1(react@18.3.1) devDependencies: '@next/eslint-plugin-next': specifier: ^14.1.1 - version: 14.1.1 + version: 14.2.3 '@repo/eslint-config': specifier: workspace:* version: link:../../packages/config-eslint @@ -47,44 +47,48 @@ importers: version: link:../../packages/config-typescript '@types/node': specifier: ^20.11.24 - version: 20.11.24 + version: 20.12.12 '@types/react': specifier: ^18.2.61 - version: 18.2.61 + version: 18.3.2 '@types/react-dom': specifier: ^18.2.19 - version: 18.2.19 + version: 18.3.0 typescript: specifier: ^5.3.3 - version: 5.3.3 + version: 5.4.5 packages/config-eslint: devDependencies: '@typescript-eslint/eslint-plugin': specifier: ^7.1.0 - version: 7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.3.3) + version: 7.10.0(@typescript-eslint/parser@7.10.0)(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/parser': specifier: ^7.1.0 - version: 7.1.0(eslint@8.57.0)(typescript@5.3.3) + version: 7.10.0(eslint@8.57.0)(typescript@5.4.5) '@vercel/style-guide': specifier: ^5.2.0 - version: 5.2.0(eslint@8.57.0)(prettier@3.2.5)(typescript@5.3.3) + version: 5.2.0(eslint@8.57.0)(prettier@3.2.5)(typescript@5.4.5) eslint-config-prettier: specifier: ^9.1.0 version: 9.1.0(eslint@8.57.0) eslint-config-turbo: specifier: ^1.12.4 - version: 1.12.4(eslint@8.57.0) + version: 1.13.3(eslint@8.57.0) eslint-plugin-only-warn: specifier: ^1.1.0 version: 1.1.0 typescript: specifier: ^5.3.3 - version: 5.3.3 + version: 5.4.5 packages/config-typescript: {} packages/ui: + dependencies: + react: + specifier: ^18.2.0 + version: 18.3.1 devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -94,68 +98,60 @@ importers: version: link:../config-typescript '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.18.0)(typescript@5.4.5) '@types/react': specifier: ^18.2.61 - version: 18.2.61 + version: 18.3.2 '@types/react-dom': specifier: ^18.2.19 - version: 18.2.19 + version: 18.3.0 eslint: specifier: ^8.57.0 version: 8.57.0 - react: - specifier: ^18.2.0 - version: 18.2.0 rollup: specifier: ^4.12.0 - version: 4.12.0 + version: 4.18.0 typescript: specifier: ^5.3.3 - version: 5.3.3 + version: 5.4.5 packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 dev: true - /@babel/code-frame@7.23.4: - resolution: {integrity: sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==} + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 + '@babel/highlight': 7.24.5 + picocolors: 1.0.1 dev: true - /@babel/compat-data@7.23.3: - resolution: {integrity: sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==} + /@babel/compat-data@7.24.4: + resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.23.3: - resolution: {integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==} + /@babel/core@7.24.5: + resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} engines: {node: '>=6.9.0'} dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.23.4 - '@babel/generator': 7.23.4 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) - '@babel/helpers': 7.23.4 - '@babel/parser': 7.23.4 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.4 - '@babel/types': 7.23.4 + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) + '@babel/helpers': 7.24.5 + '@babel/parser': 7.24.5 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -165,37 +161,37 @@ packages: - supports-color dev: true - /@babel/eslint-parser@7.23.3(@babel/core@7.23.3)(eslint@8.57.0): - resolution: {integrity: sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==} + /@babel/eslint-parser@7.24.5(@babel/core@7.24.5)(eslint@8.57.0): + resolution: {integrity: sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 + eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.24.5 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 eslint: 8.57.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 dev: true - /@babel/generator@7.23.4: - resolution: {integrity: sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==} + /@babel/generator@7.24.5: + resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@babel/types': 7.24.5 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 dev: true - /@babel/helper-compilation-targets@7.22.15: - resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.23.3 - '@babel/helper-validator-option': 7.22.15 - browserslist: 4.22.1 + '@babel/compat-data': 7.24.4 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 lru-cache: 5.1.1 semver: 6.3.1 dev: true @@ -209,135 +205,136 @@ packages: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.4 + '@babel/template': 7.24.0 + '@babel/types': 7.24.5 dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.24.5 dev: true - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + /@babel/helper-module-imports@7.24.3: + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.24.5 dev: true - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + /@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5): + resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.24.5 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-simple-access': 7.24.5 + '@babel/helper-split-export-declaration': 7.24.5 + '@babel/helper-validator-identifier': 7.24.5 dev: true - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + /@babel/helper-simple-access@7.24.5: + resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.24.5 dev: true - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + /@babel/helper-split-export-declaration@7.24.5: + resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.24.5 dev: true - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + /@babel/helper-string-parser@7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + /@babel/helper-validator-identifier@7.24.5: + resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option@7.22.15: - resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helpers@7.23.4: - resolution: {integrity: sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==} + /@babel/helpers@7.24.5: + resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.4 - '@babel/types': 7.23.4 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 transitivePeerDependencies: - supports-color dev: true - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + /@babel/highlight@7.24.5: + resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.24.5 chalk: 2.4.2 js-tokens: 4.0.0 + picocolors: 1.0.1 dev: true - /@babel/parser@7.23.4: - resolution: {integrity: sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==} + /@babel/parser@7.24.5: + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.24.5 dev: true - /@babel/runtime@7.23.4: - resolution: {integrity: sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==} + /@babel/runtime@7.24.5: + resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} engines: {node: '>=6.9.0'} dependencies: - regenerator-runtime: 0.14.0 + regenerator-runtime: 0.14.1 dev: true - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + /@babel/template@7.24.0: + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.4 - '@babel/parser': 7.23.4 - '@babel/types': 7.23.4 + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 dev: true - /@babel/traverse@7.23.4: - resolution: {integrity: sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==} + /@babel/traverse@7.24.5: + resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.4 - '@babel/generator': 7.23.4 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.4 - '@babel/types': 7.23.4 + '@babel/helper-split-export-declaration': 7.24.5 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.23.4: - resolution: {integrity: sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==} + /@babel/types@7.24.5: + resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.24.5 to-fast-properties: 2.0.0 dev: true @@ -382,7 +379,7 @@ packages: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 2.0.2 + '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: @@ -394,8 +391,8 @@ packages: engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema@2.0.2: - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} dev: true /@isaacs/cliui@8.0.2: @@ -410,22 +407,22 @@ packages: wrap-ansi-cjs: /wrap-ansi@7.0.0 dev: true - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/set-array': 1.1.2 + '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.25 dev: true - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} dev: true @@ -433,10 +430,10 @@ packages: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true - /@jridgewell/trace-mapping@0.3.20: - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: - '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 dev: true @@ -453,18 +450,18 @@ packages: resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} dev: true - /@next/env@14.1.1: - resolution: {integrity: sha512-7CnQyD5G8shHxQIIg3c7/pSeYFeMhsNbpU/bmvH7ZnDql7mNRgg8O2JZrhrc/soFnfBnKP4/xXNiiSIPn2w8gA==} + /@next/env@14.2.3: + resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} dev: false - /@next/eslint-plugin-next@14.1.1: - resolution: {integrity: sha512-NP1WoGFnFLpqqCWgGFjnn/sTwUExdPyjeFKRdQP1X/bL/tjAQ/TXDmYqw6vzGaP5NaZ2u6xzg+N/0nd7fOPOGQ==} + /@next/eslint-plugin-next@14.2.3: + resolution: {integrity: sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw==} dependencies: glob: 10.3.10 dev: true - /@next/swc-darwin-arm64@14.1.1: - resolution: {integrity: sha512-yDjSFKQKTIjyT7cFv+DqQfW5jsD+tVxXTckSe1KIouKk75t1qZmj/mV3wzdmFb0XHVGtyRjDMulfVG8uCKemOQ==} + /@next/swc-darwin-arm64@14.2.3: + resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -472,8 +469,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64@14.1.1: - resolution: {integrity: sha512-KCQmBL0CmFmN8D64FHIZVD9I4ugQsDBBEJKiblXGgwn7wBCSe8N4Dx47sdzl4JAg39IkSN5NNrr8AniXLMb3aw==} + /@next/swc-darwin-x64@14.2.3: + resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -481,8 +478,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu@14.1.1: - resolution: {integrity: sha512-YDQfbWyW0JMKhJf/T4eyFr4b3tceTorQ5w2n7I0mNVTFOvu6CGEzfwT3RSAQGTi/FFMTFcuspPec/7dFHuP7Eg==} + /@next/swc-linux-arm64-gnu@14.2.3: + resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -490,8 +487,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl@14.1.1: - resolution: {integrity: sha512-fiuN/OG6sNGRN/bRFxRvV5LyzLB8gaL8cbDH5o3mEiVwfcMzyE5T//ilMmaTrnA8HLMS6hoz4cHOu6Qcp9vxgQ==} + /@next/swc-linux-arm64-musl@14.2.3: + resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -499,8 +496,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu@14.1.1: - resolution: {integrity: sha512-rv6AAdEXoezjbdfp3ouMuVqeLjE1Bin0AuE6qxE6V9g3Giz5/R3xpocHoAi7CufRR+lnkuUjRBn05SYJ83oKNQ==} + /@next/swc-linux-x64-gnu@14.2.3: + resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -508,8 +505,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl@14.1.1: - resolution: {integrity: sha512-YAZLGsaNeChSrpz/G7MxO3TIBLaMN8QWMr3X8bt6rCvKovwU7GqQlDu99WdvF33kI8ZahvcdbFsy4jAFzFX7og==} + /@next/swc-linux-x64-musl@14.2.3: + resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -517,8 +514,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc@14.1.1: - resolution: {integrity: sha512-1L4mUYPBMvVDMZg1inUYyPvFSduot0g73hgfD9CODgbr4xiTYe0VOMTZzaRqYJYBA9mana0x4eaAaypmWo1r5A==} + /@next/swc-win32-arm64-msvc@14.2.3: + resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -526,8 +523,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc@14.1.1: - resolution: {integrity: sha512-jvIE9tsuj9vpbbXlR5YxrghRfMuG0Qm/nZ/1KDHc+y6FpnZ/apsgh+G6t15vefU0zp3WSpTMIdXRUsNl/7RSuw==} + /@next/swc-win32-ia32-msvc@14.2.3: + resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -535,8 +532,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc@14.1.1: - resolution: {integrity: sha512-S6K6EHDU5+1KrBDLko7/c1MNy/Ya73pIAmvKeFwsF4RmBFJSO7/7YeD4FnZ4iBdzE69PpQ4sOMU9ORKeNuxe8A==} + /@next/swc-win32-x64-msvc@14.2.3: + resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -578,19 +575,12 @@ packages: dev: true optional: true - /@pkgr/utils@2.4.2: - resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + /@pkgr/core@0.1.1: + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dependencies: - cross-spawn: 7.0.3 - fast-glob: 3.3.2 - is-glob: 4.0.3 - open: 9.1.0 - picocolors: 1.0.0 - tslib: 2.6.2 dev: true - /@rollup/plugin-typescript@11.1.6(rollup@4.12.0)(typescript@5.3.3): + /@rollup/plugin-typescript@11.1.6(rollup@4.18.0)(typescript@5.4.5): resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -603,13 +593,13 @@ packages: tslib: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.12.0) + '@rollup/pluginutils': 5.1.0(rollup@4.18.0) resolve: 1.22.8 - rollup: 4.12.0 - typescript: 5.3.3 + rollup: 4.18.0 + typescript: 5.4.5 dev: true - /@rollup/pluginutils@5.1.0(rollup@4.12.0): + /@rollup/pluginutils@5.1.0(rollup@4.18.0): resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: @@ -621,120 +611,149 @@ packages: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 4.12.0 + rollup: 4.18.0 dev: true - /@rollup/rollup-android-arm-eabi@4.12.0: - resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} + /@rollup/rollup-android-arm-eabi@4.18.0: + resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.12.0: - resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} + /@rollup/rollup-android-arm64@4.18.0: + resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.12.0: - resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} + /@rollup/rollup-darwin-arm64@4.18.0: + resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.12.0: - resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} + /@rollup/rollup-darwin-x64@4.18.0: + resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.12.0: - resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} + /@rollup/rollup-linux-arm-gnueabihf@4.18.0: + resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.18.0: + resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.12.0: - resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} + /@rollup/rollup-linux-arm64-gnu@4.18.0: + resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.12.0: - resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} + /@rollup/rollup-linux-arm64-musl@4.18.0: + resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.12.0: - resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} + /@rollup/rollup-linux-powerpc64le-gnu@4.18.0: + resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.18.0: + resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.12.0: - resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} - resolution: {integrity: sha512-ym5x1cj4mUAMBummxxRkI4pG5Vht1QMsJexwGP8547TZ0sox9fCLDHw9KCH9c1FO5d9GopvkaJsBIOkTKxksdw==} + + /@rollup/rollup-linux-s390x-gnu@4.18.0: + resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.18.0: + resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.12.0: - resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} - resolution: {integrity: sha512-m0hYELHGXdYx64D6IDDg/1vOJEaiV8f1G/iO+tejvRCJNSwK4jJ15e38JQy5Q6dGkn1M/9KcyEOwqmlZ2kqaZg==} + + /@rollup/rollup-linux-x64-musl@4.18.0: + resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.12.0: - resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} - resolution: {integrity: sha512-x1CWburlbN5JjG+juenuNa4KdedBdXLjZMp56nHFSHTOsb/MI2DYiGzLtRGHNMyydPGffGId+VgjOMrcltOksA==} + + /@rollup/rollup-win32-arm64-msvc@4.18.0: + resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.12.0: - resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} - resolution: {integrity: sha512-VVzCB5yXR1QlfsH1Xw1zdzQ4Pxuzv+CPr5qpElpKhVxlxD3CRdfubAG9mJROl6/dmj5gVYDDWk8sC+j9BI9/kQ==} + + /@rollup/rollup-win32-ia32-msvc@4.18.0: + resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.12.0: - resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} - resolution: {integrity: sha512-SYRedJi+mweatroB+6TTnJYLts0L0bosg531xnQWtklOI6dezEagx4Q0qDyvRdK+qgdA3YZpjjGuPFtxBmddBA==} + + /@rollup/rollup-win32-x64-msvc@4.18.0: + resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /@rushstack/eslint-patch@1.6.0: - resolution: {integrity: sha512-2/U3GXA6YiPYQDLGwtGlnNgKYBSwCFIHf8Y9LUY5VATHdtbLlU0Y1R3QoBnT0aB4qv/BEiVVsj7LJXoQCgJ2vA==} + /@rushstack/eslint-patch@1.10.3: + resolution: {integrity: sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==} dev: true - /@swc/helpers@0.5.2: - resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + dev: false + + /@swc/helpers@0.5.5: + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} dependencies: + '@swc/counter': 0.1.3 tslib: 2.6.2 dev: false @@ -749,9 +768,9 @@ packages: /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true - /@types/node@20.11.24: - resolution: {integrity: sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==} - resolution: {integrity: sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==} + + /@types/node@20.12.12: + resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} dependencies: undici-types: 5.26.5 dev: true @@ -760,34 +779,29 @@ packages: resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} dev: true - /@types/prop-types@15.7.11: - resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} - dev: true - /@types/react-dom@18.2.19: - resolution: {integrity: sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==} - resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} - '@types/react': 18.2.61 - '@types/react': 18.2.46 + /@types/prop-types@15.7.12: + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} dev: true - /@types/react@18.2.61: - resolution: {integrity: sha512-NURTN0qNnJa7O/k4XUkEW2yfygA+NxS0V5h1+kp9jPwhzZy95q3ADoGMP0+JypMhrZBTTgjKAUlTctde1zzeQA==} - resolution: {integrity: sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w==} + + /@types/react-dom@18.3.0: + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} dependencies: - '@types/prop-types': 15.7.11 - '@types/scheduler': 0.16.8 - csstype: 3.1.2 + '@types/react': 18.3.2 dev: true - /@types/scheduler@0.16.8: - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + /@types/react@18.3.2: + resolution: {integrity: sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==} + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 dev: true - /@types/semver@7.5.6: - resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + /@types/semver@7.5.8: + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} dev: true - /@typescript-eslint/eslint-plugin@6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.57.0)(typescript@5.3.3): - /@typescript-eslint/eslint-plugin@6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-Vih/4xLXmY7V490dGwBQJTpIZxH4ZFH6eCVmQ4RFkB+wmaCTDAx4dtgoWwMNGKLkqRY1L6rPqzEbjorRnDo4rQ==} + + /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -797,26 +811,27 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 6.17.0(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/type-utils': 6.17.0(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.17.0(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.17.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.17.0 + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4 eslint: 8.57.0 - eslint: 8.56.0 + graphemer: 1.4.0 ignore: 5.3.1 - ignore: 5.3.0 natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/eslint-plugin@7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.3.3): - resolution: {integrity: sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==} - engines: {node: ^16.0.0 || >=18.0.0} + + /@typescript-eslint/eslint-plugin@7.10.0(@typescript-eslint/parser@7.10.0)(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 eslint: ^8.56.0 @@ -826,26 +841,23 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.1.0(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 7.1.0 - '@typescript-eslint/type-utils': 7.1.0(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/utils': 7.1.0(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 7.1.0 - debug: 4.3.4 + '@typescript-eslint/parser': 7.10.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.10.0 + '@typescript-eslint/type-utils': 7.10.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.10.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.10.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.17.0(eslint@8.57.0)(typescript@5.3.3): - /@typescript-eslint/parser@6.17.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==} + /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -854,19 +866,20 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.17.0 - '@typescript-eslint/types': 6.17.0 - '@typescript-eslint/typescript-estree': 6.17.0(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.17.0 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4 eslint: 8.57.0 - typescript: 5.3.3 + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@7.1.0(eslint@8.57.0)(typescript@5.3.3): - resolution: {integrity: sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/parser@7.10.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 typescript: '*' @@ -874,14 +887,13 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.1.0 - '@typescript-eslint/types': 7.1.0 - '@typescript-eslint/typescript-estree': 7.1.0(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 7.1.0 + '@typescript-eslint/scope-manager': 7.10.0 + '@typescript-eslint/types': 7.10.0 + '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.10.0 debug: 4.3.4 eslint: 8.57.0 - eslint: 8.56.0 - typescript: 5.3.3 + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true @@ -894,24 +906,24 @@ packages: '@typescript-eslint/visitor-keys': 5.62.0 dev: true - /@typescript-eslint/scope-manager@6.17.0: - resolution: {integrity: sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==} + /@typescript-eslint/scope-manager@6.21.0: + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.17.0 - '@typescript-eslint/visitor-keys': 6.17.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 dev: true - /@typescript-eslint/scope-manager@7.1.0: - resolution: {integrity: sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==} - engines: {node: ^16.0.0 || >=18.0.0} + + /@typescript-eslint/scope-manager@7.10.0: + resolution: {integrity: sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==} + engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.1.0 - '@typescript-eslint/visitor-keys': 7.1.0 + '@typescript-eslint/types': 7.10.0 + '@typescript-eslint/visitor-keys': 7.10.0 dev: true - /@typescript-eslint/type-utils@6.17.0(eslint@8.57.0)(typescript@5.3.3): - /@typescript-eslint/type-utils@6.17.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-hDXcWmnbtn4P2B37ka3nil3yi3VCQO2QEB9gBiHJmQp5wmyQWqnjA85+ZcE8c4FqnaB6lBwMrPkgd4aBYz3iNg==} + /@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -920,18 +932,19 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 6.17.0(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.17.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + debug: 4.3.4 eslint: 8.57.0 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils@7.1.0(eslint@8.57.0)(typescript@5.3.3): - resolution: {integrity: sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/type-utils@7.10.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 typescript: '*' @@ -939,13 +952,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.1.0(typescript@5.3.3) - '@typescript-eslint/utils': 7.1.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.10.0(eslint@8.57.0)(typescript@5.4.5) debug: 4.3.4 eslint: 8.57.0 - eslint: 8.56.0 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true @@ -955,17 +967,17 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/types@6.17.0: - resolution: {integrity: sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true - /@typescript-eslint/types@7.1.0: - resolution: {integrity: sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==} + /@typescript-eslint/types@6.21.0: + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} dev: true + /@typescript-eslint/types@7.10.0: + resolution: {integrity: sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==} + engines: {node: ^18.18.0 || >=20.0.0} + dev: true - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3): + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.5): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -979,15 +991,15 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 - tsutils: 3.21.0(typescript@5.3.3) - typescript: 5.3.3 + semver: 7.6.2 + tsutils: 3.21.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@6.17.0(typescript@5.3.3): - resolution: {integrity: sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==} + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.5): + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -995,94 +1007,91 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.17.0 - '@typescript-eslint/visitor-keys': 6.17.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@7.1.0(typescript@5.3.3): - resolution: {integrity: sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==} - engines: {node: ^16.0.0 || >=18.0.0} + + /@typescript-eslint/typescript-estree@7.10.0(typescript@5.4.5): + resolution: {integrity: sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/types': 7.1.0 - '@typescript-eslint/visitor-keys': 7.1.0 + '@typescript-eslint/types': 7.10.0 + '@typescript-eslint/visitor-keys': 7.10.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 + minimatch: 9.0.4 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.3.3): - /@typescript-eslint/utils@5.62.0(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 + '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) eslint: 8.57.0 - eslint: 8.56.0 eslint-scope: 5.1.1 - semver: 7.5.4 + semver: 7.6.2 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/utils@6.17.0(eslint@8.57.0)(typescript@5.3.3): - /@typescript-eslint/utils@6.17.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-LofsSPjN/ITNkzV47hxas2JCsNCEnGhVvocfyOcLzT9c/tSZE7SfhS/iWtzP1lKNOEfLhRTZz6xqI8N2RzweSQ==} + + /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 + dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 6.17.0 - '@typescript-eslint/types': 6.17.0 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) eslint: 8.57.0 - semver: 7.5.4 + semver: 7.6.2 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/utils@7.1.0(eslint@8.57.0)(typescript@5.3.3): - resolution: {integrity: sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/utils@7.10.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 7.1.0 - '@typescript-eslint/types': 7.1.0 - '@typescript-eslint/typescript-estree': 7.1.0(typescript@5.3.3) + '@typescript-eslint/scope-manager': 7.10.0 + '@typescript-eslint/types': 7.10.0 + '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.4.5) eslint: 8.57.0 - eslint: 8.56.0 - semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript @@ -1096,28 +1105,28 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@6.17.0: - resolution: {integrity: sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==} + /@typescript-eslint/visitor-keys@6.21.0: + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.17.0 + '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@7.1.0: - resolution: {integrity: sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==} - engines: {node: ^16.0.0 || >=18.0.0} + + /@typescript-eslint/visitor-keys@7.10.0: + resolution: {integrity: sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==} + engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.1.0 + '@typescript-eslint/types': 7.10.0 eslint-visitor-keys: 3.4.3 dev: true - /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true - /@vercel/style-guide@5.2.0(eslint@8.57.0)(prettier@3.2.5)(typescript@5.3.3): + + /@vercel/style-guide@5.2.0(eslint@8.57.0)(prettier@3.2.5)(typescript@5.4.5): resolution: {integrity: sha512-fNSKEaZvSkiBoF6XEefs8CcgAV9K9e+MbcsDZjUsktHycKdA0jvjAzQi1W/FzLS+Nr5zZ6oejCwq/97dHUKe0g==} - resolution: {integrity: sha512-L9lWYePIycm7vIOjDLj+mmMdmmPkW3/brHjgq+nJdvMOrL7Hdk/19w8X583HYSk0vWsq494o5Qkh6x5+uW7ljg==} engines: {node: '>=16'} peerDependencies: '@next/eslint-plugin-next': '>=12.3.0 <15' @@ -1134,28 +1143,28 @@ packages: typescript: optional: true dependencies: - '@babel/eslint-parser': 7.23.3(@babel/core@7.23.3)(eslint@8.57.0) - '@babel/eslint-parser': 7.23.3(@babel/core@7.23.3)(eslint@8.56.0) - '@typescript-eslint/eslint-plugin': 6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/parser': 6.17.0(eslint@8.57.0)(typescript@5.3.3) + '@babel/core': 7.24.5 + '@babel/eslint-parser': 7.24.5(@babel/core@7.24.5)(eslint@8.57.0) + '@rushstack/eslint-patch': 1.10.3 + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 eslint-config-prettier: 9.1.0(eslint@8.57.0) - eslint-config-prettier: 9.1.0(eslint@8.56.0) - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.17.0)(eslint-plugin-import@2.29.0)(eslint@8.57.0) + eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.29.1) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0) - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0) - eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@6.17.0)(eslint@8.57.0)(typescript@5.3.3) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.10.0)(eslint@8.57.0) + eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.0)(typescript@5.4.5) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) - eslint-plugin-playwright: 0.16.0(eslint-plugin-jest@27.6.0)(eslint@8.57.0) - eslint-plugin-react: 7.33.2(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) - eslint-plugin-testing-library: 6.2.0(eslint@8.57.0)(typescript@5.3.3) - eslint-plugin-testing-library: 6.2.0(eslint@8.56.0)(typescript@5.3.3) + eslint-plugin-playwright: 0.16.0(eslint-plugin-jest@27.9.0)(eslint@8.57.0) + eslint-plugin-react: 7.34.1(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) + eslint-plugin-testing-library: 6.2.2(eslint@8.57.0)(typescript@5.4.5) + eslint-plugin-tsdoc: 0.2.17 eslint-plugin-unicorn: 48.0.1(eslint@8.57.0) prettier: 3.2.5 - prettier-plugin-packagejson: 2.4.6(prettier@3.2.5) - prettier-plugin-packagejson: 2.4.6(prettier@3.1.1) - typescript: 5.3.3 + prettier-plugin-packagejson: 2.5.0(prettier@3.2.5) + typescript: 5.4.5 transitivePeerDependencies: - eslint-import-resolver-node - eslint-import-resolver-webpack @@ -1225,21 +1234,23 @@ packages: dequal: 2.0.3 dev: true - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + /array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - is-array-buffer: 3.0.2 + call-bind: 1.0.7 + is-array-buffer: 3.0.4 dev: true - /array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + /array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 is-string: 1.0.7 dev: true @@ -1248,24 +1259,37 @@ packages: engines: {node: '>=8'} dev: true - /array.prototype.findlastindex@1.2.3: - resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} + /array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - get-intrinsic: 1.2.2 dev: true /array.prototype.flat@1.3.2: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 dev: true @@ -1273,48 +1297,54 @@ packages: resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + dependencies: + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 dev: true - /array.prototype.tosorted@1.1.2: - resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} + /array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.3 + es-errors: 1.3.0 es-shim-unscopables: 1.0.2 - get-intrinsic: 1.2.2 dev: true - /arraybuffer.prototype.slice@1.0.2: - resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + /arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.5 + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 - is-array-buffer: 3.0.2 - is-shared-array-buffer: 1.0.2 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 dev: true /ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} dev: true - /asynciterator.prototype@1.0.0: - resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} - dependencies: - has-symbols: 1.0.3 - dev: true - - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 dev: true /axe-core@4.7.0: @@ -1332,18 +1362,6 @@ packages: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} - dev: true - - /bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} - dependencies: - big-integer: 1.6.52 - dev: true - /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -1357,22 +1375,22 @@ packages: balanced-match: 1.0.2 dev: true - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 dev: true - /browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - caniuse-lite: 1.0.30001593 - caniuse-lite: 1.0.30001564 - electron-to-chromium: 1.4.593 - node-releases: 2.0.13 - update-browserslist-db: 1.0.13(browserslist@4.22.1) + dependencies: + caniuse-lite: 1.0.30001621 + electron-to-chromium: 1.4.777 + node-releases: 2.0.14 + update-browserslist-db: 1.0.16(browserslist@4.23.0) dev: true /builtin-modules@3.3.0: @@ -1380,13 +1398,6 @@ packages: engines: {node: '>=6'} dev: true - /bundle-name@3.0.0: - resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} - engines: {node: '>=12'} - dependencies: - run-applescript: 5.0.0 - dev: true - /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -1394,21 +1405,24 @@ packages: streamsearch: 1.1.0 dev: false - /call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.2 - set-function-length: 1.1.1 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 dev: true /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} dev: true - /caniuse-lite@1.0.30001593: - resolution: {integrity: sha512-UWM1zlo3cZfkpBysd7AS+z+v007q9G1+fLTUU42rQnY6t2axoogPW/xol6T7juU5EUoOhML4WgBIdG+9yYqAjQ==} - resolution: {integrity: sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==} + + /caniuse-lite@1.0.30001621: + resolution: {integrity: sha512-+NLXZiviFFKX0fk8Piwv3PfLPGtRqJeq2TiNoUff/qB5KJgwecJTvCXDpmlyP/eCI/GUEmp/h/y5j0yckiiZrA==} /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -1481,14 +1495,41 @@ packages: which: 2.0.2 dev: true - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} dev: true /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dev: true + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -1516,44 +1557,21 @@ packages: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} - dependencies: - bplist-parser: 0.2.0 - untildify: 4.0.0 - dev: true - - /default-browser@4.0.0: - resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} - engines: {node: '>=14.16'} - dependencies: - bundle-name: 3.0.0 - default-browser-id: 3.0.0 - execa: 7.2.0 - titleize: 3.0.0 - dev: true - - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.2 + es-define-property: 1.0.0 + es-errors: 1.3.0 gopd: 1.0.1 - has-property-descriptors: 1.0.1 - dev: true - - /define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} dev: true /define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.1 - has-property-descriptors: 1.0.1 + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 object-keys: 1.1.1 dev: true @@ -1602,8 +1620,8 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /electron-to-chromium@1.4.593: - resolution: {integrity: sha512-c7+Hhj87zWmdpmjDONbvNKNo24tvmD4mjal1+qqTYTrlF0/sNpAcDlU0Ki84ftA/5yj3BF2QhSGEC0Rky6larg==} + /electron-to-chromium@1.4.777: + resolution: {integrity: sha512-n02NCwLJ3wexLfK/yQeqfywCblZqLcXphzmid5e8yVPdtEcida7li0A5WQKghHNG0FeOMCzeFOzEbtAh5riXFw==} dev: true /emoji-regex@8.0.0: @@ -1614,8 +1632,8 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + /enhanced-resolve@5.16.1: + resolution: {integrity: sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 @@ -1628,83 +1646,110 @@ packages: is-arrayish: 0.2.1 dev: true - /es-abstract@1.22.3: - resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} + /es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} dependencies: - array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.2 - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - es-set-tostringtag: 2.0.2 + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 - get-intrinsic: 1.2.2 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 gopd: 1.0.1 - has-property-descriptors: 1.0.1 - has-proto: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.0 - internal-slot: 1.0.6 - is-array-buffer: 3.0.2 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 is-callable: 1.2.7 - is-negative-zero: 2.0.2 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 + is-shared-array-buffer: 1.0.3 is-string: 1.0.7 - is-typed-array: 1.1.12 + is-typed-array: 1.1.13 is-weakref: 1.0.2 object-inspect: 1.13.1 object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.1 - safe-array-concat: 1.0.1 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 - string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.0 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.0 - typed-array-length: 1.0.4 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 unbox-primitive: 1.0.2 - which-typed-array: 1.1.13 + which-typed-array: 1.1.15 + dev: true + + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 dev: true - /es-iterator-helpers@1.0.15: - resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: true + + /es-iterator-helpers@1.0.19: + resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} + engines: {node: '>= 0.4'} dependencies: - asynciterator.prototype: 1.0.0 - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 - es-set-tostringtag: 2.0.2 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 function-bind: 1.1.2 - get-intrinsic: 1.2.2 - globalthis: 1.0.3 - has-property-descriptors: 1.0.1 - has-proto: 1.0.1 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 has-symbols: 1.0.3 - internal-slot: 1.0.6 + internal-slot: 1.0.7 iterator.prototype: 1.1.2 - safe-array-concat: 1.0.1 + safe-array-concat: 1.1.2 + dev: true + + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 dev: true - /es-set-tostringtag@2.0.2: - resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} + /es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.2 - has-tostringtag: 1.0.0 - hasown: 2.0.0 + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 dev: true /es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: - hasown: 2.0.0 + hasown: 2.0.2 dev: true /es-to-primitive@1.2.1: @@ -1716,8 +1761,8 @@ packages: is-symbol: 1.0.4 dev: true - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} dev: true @@ -1730,32 +1775,32 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} dev: true + /eslint-config-prettier@9.1.0(eslint@8.57.0): - /eslint-config-prettier@9.1.0(eslint@8.56.0): resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true peerDependencies: eslint: '>=7.0.0' + dependencies: eslint: 8.57.0 - eslint: 8.56.0 dev: true - /eslint-config-turbo@1.12.4(eslint@8.57.0): - resolution: {integrity: sha512-5hqEaV6PNmAYLL4RTmq74OcCt8pgzOLnfDVPG/7PUXpQ0Mpz0gr926oCSFukywKKXjdum3VHD84S7Z9A/DqTAw==} - resolution: {integrity: sha512-v7CHpAHodBKlj+r+R3B2DJlZbCjpZLnK7gO/vCRk/Lc+tlD/f04wM6rmHlerevOlchtmwARilRLBnmzNLffTyQ==} + + /eslint-config-turbo@1.13.3(eslint@8.57.0): + resolution: {integrity: sha512-if/QtwEiWZ5b7Bg8yZBPSvS0TeCG2Zvfa/+XBYANS7uSYucjmW+BBC8enJB0PqpB/YLGGOumeo3x7h1Nuba9iw==} peerDependencies: eslint: '>6.6.0' + dependencies: eslint: 8.57.0 - eslint-plugin-turbo: 1.12.4(eslint@8.57.0) - eslint-plugin-turbo: 1.11.3(eslint@8.56.0) + eslint-plugin-turbo: 1.13.3(eslint@8.57.0) dev: true - /eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.29.0): + /eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.29.1): resolution: {integrity: sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==} engines: {node: '>= 4'} peerDependencies: eslint-plugin-import: '>=1.4.0' - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0) - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + dependencies: + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.10.0)(eslint@8.57.0) dev: true /eslint-import-resolver-node@0.3.9: @@ -1767,8 +1812,8 @@ packages: transitivePeerDependencies: - supports-color dev: true - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.17.0)(eslint-plugin-import@2.29.0)(eslint@8.57.0): - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.17.0)(eslint-plugin-import@2.29.0)(eslint@8.56.0): + + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -1776,12 +1821,12 @@ packages: eslint-plugin-import: '*' dependencies: debug: 4.3.4 + enhanced-resolve: 5.16.1 eslint: 8.57.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0) - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.10.0)(eslint@8.57.0) fast-glob: 3.3.2 - get-tsconfig: 4.7.2 + get-tsconfig: 4.7.5 is-core-module: 2.13.1 is-glob: 4.0.3 transitivePeerDependencies: @@ -1790,9 +1835,9 @@ packages: - eslint-import-resolver-webpack - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + + /eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -1811,16 +1856,17 @@ packages: optional: true eslint-import-resolver-webpack: optional: true - '@typescript-eslint/parser': 6.17.0(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) + dependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + debug: 3.2.7 eslint: 8.57.0 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.17.0)(eslint-plugin-import@2.29.0)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@7.1.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.10.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -1840,28 +1886,27 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 7.1.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/parser': 7.10.0(eslint@8.57.0)(typescript@5.4.5) debug: 3.2.7 eslint: 8.57.0 - eslint: 8.56.0 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.17.0)(eslint-plugin-import@2.29.0)(eslint@8.56.0) + eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color dev: true + /eslint-plugin-eslint-comments@3.2.0(eslint@8.57.0): - /eslint-plugin-eslint-comments@3.2.0(eslint@8.56.0): resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} engines: {node: '>=6.5.0'} peerDependencies: eslint: '>=4.19.1' dependencies: + escape-string-regexp: 1.0.5 eslint: 8.57.0 ignore: 5.3.1 - ignore: 5.3.0 dev: true - /eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0): - /eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): - resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} + + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.10.0)(eslint@8.57.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -1869,37 +1914,37 @@ packages: peerDependenciesMeta: '@typescript-eslint/parser': optional: true - '@typescript-eslint/parser': 7.1.0(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) - array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.3 + dependencies: + '@typescript-eslint/parser': 7.10.0(eslint@8.57.0)(typescript@5.4.5) + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 + doctrine: 2.1.0 eslint: 8.57.0 - eslint: 8.56.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.1.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) - hasown: 2.0.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.10.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.1 - object.values: 1.1.7 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 semver: 6.3.1 - tsconfig-paths: 3.14.2 + tsconfig-paths: 3.15.0 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color dev: true - /eslint-plugin-jest@27.6.0(@typescript-eslint/eslint-plugin@6.17.0)(eslint@8.57.0)(typescript@5.3.3): - /eslint-plugin-jest@27.6.0(@typescript-eslint/eslint-plugin@6.17.0)(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==} + + /eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 + '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 || ^7.0.0 eslint: ^7.0.0 || ^8.0.0 jest: '*' peerDependenciesMeta: @@ -1907,46 +1952,46 @@ packages: optional: true jest: optional: true - '@typescript-eslint/eslint-plugin': 6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.3.3) + dependencies: + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 - eslint: 8.56.0 transitivePeerDependencies: - supports-color - typescript dev: true + /eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): - /eslint-plugin-jsx-a11y@6.8.0(eslint@8.56.0): resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.24.5 aria-query: 5.3.0 - array-includes: 3.1.7 + array-includes: 3.1.8 array.prototype.flatmap: 1.3.2 ast-types-flow: 0.0.8 axe-core: 4.7.0 axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 + es-iterator-helpers: 1.0.19 eslint: 8.57.0 - eslint: 8.56.0 - hasown: 2.0.0 + hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 + object.entries: 1.1.8 + object.fromentries: 2.0.8 dev: true /eslint-plugin-only-warn@1.1.0: resolution: {integrity: sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==} engines: {node: '>=6'} dev: true - /eslint-plugin-playwright@0.16.0(eslint-plugin-jest@27.6.0)(eslint@8.57.0): - /eslint-plugin-playwright@0.16.0(eslint-plugin-jest@27.6.0)(eslint@8.56.0): + + /eslint-plugin-playwright@0.16.0(eslint-plugin-jest@27.9.0)(eslint@8.57.0): resolution: {integrity: sha512-DcHpF0SLbNeh9MT4pMzUGuUSnJ7q5MWbP8sSEFIMS6j7Ggnduq8ghNlfhURgty4c1YFny7Ge9xYTO1FSAoV2Vw==} peerDependencies: eslint: '>=7' @@ -1954,53 +1999,55 @@ packages: peerDependenciesMeta: eslint-plugin-jest: optional: true + dependencies: eslint: 8.57.0 - eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@6.17.0)(eslint@8.57.0)(typescript@5.3.3) - eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@6.17.0)(eslint@8.56.0)(typescript@5.3.3) + eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.0)(typescript@5.4.5) dev: true - /eslint-plugin-react-hooks@4.6.0(eslint@8.57.0): - /eslint-plugin-react-hooks@4.6.0(eslint@8.56.0): - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + + /eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: eslint: 8.57.0 - eslint: 8.56.0 dev: true - /eslint-plugin-react@7.33.2(eslint@8.57.0): - /eslint-plugin-react@7.33.2(eslint@8.56.0): - resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + + /eslint-plugin-react@7.34.1(eslint@8.57.0): + resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - array-includes: 3.1.7 + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.2 - array.prototype.tosorted: 1.1.2 + array.prototype.toreversed: 1.1.2 + array.prototype.tosorted: 1.1.3 doctrine: 2.1.0 + es-iterator-helpers: 1.0.19 eslint: 8.57.0 - eslint: 8.56.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 - object.hasown: 1.1.3 - object.values: 1.1.7 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.hasown: 1.1.4 + object.values: 1.2.0 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.10 + string.prototype.matchall: 4.0.11 dev: true - /eslint-plugin-testing-library@6.2.0(eslint@8.57.0)(typescript@5.3.3): - /eslint-plugin-testing-library@6.2.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-+LCYJU81WF2yQ+Xu4A135CgK8IszcFcyMF4sWkbiu6Oj+Nel0TrkZq/HvDw0/1WuO3dhDQsZA/OpEMGd0NfcUw==} + + /eslint-plugin-testing-library@6.2.2(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-1E94YOTUDnOjSLyvOwmbVDzQi/WkKm3WVrMXu6SmBr6DN95xTGZmI6HJ/eOkSXh/DlheRsxaPsJvZByDBhWLVQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.3.3) + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 - eslint: 8.56.0 transitivePeerDependencies: - supports-color - typescript @@ -2012,27 +2059,27 @@ packages: '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 dev: true - /eslint-plugin-turbo@1.12.4(eslint@8.57.0): - resolution: {integrity: sha512-3AGmXvH7E4i/XTWqBrcgu+G7YKZJV/8FrEn79kTd50ilNsv+U3nS2IlcCrQB6Xm2m9avGD9cadLzKDR1/UF2+g==} - resolution: {integrity: sha512-R5ftTTWQzEYaKzF5g6m/MInCU8pIN+2TLL+S50AYBr1enwUovdZmnZ1HDwFMaxIjJ8x5ah+jvAzql5IJE9VWaA==} + + /eslint-plugin-turbo@1.13.3(eslint@8.57.0): + resolution: {integrity: sha512-RjmlnqYsEqnJ+U3M3IS5jLJDjWv5NsvReCpsC61n5pJ4JMHTZ/lU0EIoL1ccuL1L5wP0APzdXdByBxERcPQ+Nw==} peerDependencies: eslint: '>6.6.0' dependencies: + dotenv: 16.0.3 eslint: 8.57.0 - eslint: 8.56.0 dev: true + /eslint-plugin-unicorn@48.0.1(eslint@8.57.0): - /eslint-plugin-unicorn@48.0.1(eslint@8.56.0): resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} engines: {node: '>=16'} peerDependencies: eslint: '>=8.44.0' dependencies: + '@babel/helper-validator-identifier': 7.24.5 '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) ci-info: 3.9.0 + clean-regexp: 1.0.0 eslint: 8.57.0 - eslint: 8.56.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -2042,7 +2089,7 @@ packages: read-pkg-up: 7.0.1 regexp-tree: 0.1.27 regjsparser: 0.10.0 - semver: 7.5.4 + semver: 7.6.2 strip-indent: 3.0.0 dev: true @@ -2071,17 +2118,17 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true + dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.0 '@humanwhocodes/config-array': 0.11.14 - '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.2.0 @@ -2101,8 +2148,8 @@ packages: find-up: 5.0.0 glob-parent: 6.0.2 globals: 13.24.0 + graphemer: 1.4.0 ignore: 5.3.1 - ignore: 5.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -2112,7 +2159,7 @@ packages: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: @@ -2161,36 +2208,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 4.3.1 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.1.0 - onetime: 6.0.0 - signal-exit: 3.0.7 - strip-final-newline: 3.0.0 - dev: true - /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true @@ -2203,7 +2220,7 @@ packages: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.7 dev: true /fast-json-stable-stringify@2.1.0: @@ -2213,9 +2230,9 @@ packages: /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true + /fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} dependencies: reusify: 1.0.4 dev: true @@ -2227,8 +2244,8 @@ packages: flat-cache: 3.2.0 dev: true - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 @@ -2253,14 +2270,14 @@ packages: /flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} + dependencies: flatted: 3.3.1 - flatted: 3.2.9 keyv: 4.5.4 rimraf: 3.0.2 dev: true + /flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true /for-each@0.3.3: @@ -2297,9 +2314,9 @@ packages: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.3 functions-have-names: 1.2.3 dev: true @@ -2312,13 +2329,15 @@ packages: engines: {node: '>=6.9.0'} dev: true - /get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} dependencies: + es-errors: 1.3.0 function-bind: 1.1.2 - has-proto: 1.0.1 + has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.0 + hasown: 2.0.2 dev: true /get-stdin@9.0.0: @@ -2326,21 +2345,17 @@ packages: engines: {node: '>=12'} dev: true - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true - - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + /get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 dev: true - /get-tsconfig@4.7.2: - resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + /get-tsconfig@4.7.5: + resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} dependencies: resolve-pkg-maps: 1.0.0 dev: true @@ -2370,9 +2385,9 @@ packages: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 - minimatch: 9.0.3 - minipass: 7.0.4 - path-scurry: 1.10.1 + minimatch: 9.0.4 + minipass: 7.1.1 + path-scurry: 1.11.1 dev: true /glob@7.2.3: @@ -2398,11 +2413,12 @@ packages: type-fest: 0.20.2 dev: true - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + /globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.1 + gopd: 1.0.1 dev: true /globby@11.1.0: @@ -2411,8 +2427,8 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 + fast-glob: 3.3.2 ignore: 5.3.1 - ignore: 5.3.0 merge2: 1.4.1 slash: 3.0.0 dev: true @@ -2422,8 +2438,8 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: dir-glob: 3.0.1 + fast-glob: 3.3.2 ignore: 5.3.1 - ignore: 5.3.0 merge2: 1.4.1 slash: 4.0.0 dev: true @@ -2431,7 +2447,7 @@ packages: /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 dev: true /graceful-fs@4.2.11: @@ -2455,14 +2471,14 @@ packages: engines: {node: '>=8'} dev: true - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: - get-intrinsic: 1.2.2 + es-define-property: 1.0.0 dev: true - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} dev: true @@ -2471,15 +2487,15 @@ packages: engines: {node: '>= 0.4'} dev: true - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 @@ -2489,18 +2505,8 @@ packages: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true - - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - dev: true /ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} engines: {node: '>= 4'} dev: true @@ -2533,21 +2539,21 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true - /internal-slot@1.0.6: - resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.2 - hasown: 2.0.0 - side-channel: 1.0.4 + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 dev: true - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 dev: true /is-arrayish@0.2.1: @@ -2558,7 +2564,7 @@ packages: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-bigint@1.0.4: @@ -2571,8 +2577,8 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 + call-bind: 1.0.7 + has-tostringtag: 1.0.2 dev: true /is-builtin-module@3.2.1: @@ -2590,26 +2596,21 @@ packages: /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - hasown: 2.0.0 + hasown: 2.0.2 dev: true - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true + is-typed-array: 1.1.13 dev: true - /is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 dev: true /is-extglob@2.1.1: @@ -2620,7 +2621,7 @@ packages: /is-finalizationregistry@1.0.2: resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 dev: true /is-fullwidth-code-point@3.0.0: @@ -2632,7 +2633,7 @@ packages: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-glob@4.0.3: @@ -2642,20 +2643,13 @@ packages: is-extglob: 2.1.1 dev: true - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - dependencies: - is-docker: 3.0.0 - dev: true - - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} dev: true - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} dev: true @@ -2663,7 +2657,7 @@ packages: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-number@7.0.0: @@ -2685,35 +2679,27 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 + call-bind: 1.0.7 + has-tostringtag: 1.0.2 dev: true - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} dev: true - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - dev: true - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + call-bind: 1.0.7 dev: true /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-symbol@1.0.4: @@ -2723,35 +2709,30 @@ packages: has-symbols: 1.0.3 dev: true - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.13 + which-typed-array: 1.1.15 dev: true - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} dev: true /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: - call-bind: 1.0.5 - dev: true - - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 dev: true - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + /is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} dependencies: - is-docker: 2.2.1 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 dev: true /isarray@2.0.5: @@ -2766,10 +2747,10 @@ packages: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} dependencies: define-properties: 1.2.1 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.4 - set-function-name: 2.0.1 + reflect.getprototypeof: 1.0.6 + set-function-name: 2.0.2 dev: true /jackspeak@2.3.6: @@ -2845,10 +2826,10 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} dependencies: - array-includes: 3.1.7 + array-includes: 3.1.8 array.prototype.flat: 1.3.2 - object.assign: 4.1.4 - object.values: 1.1.7 + object.assign: 4.1.5 + object.values: 1.2.0 dev: true /keyv@4.5.4: @@ -2857,15 +2838,15 @@ packages: json-buffer: 3.0.1 dev: true - /language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + /language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} dev: true /language-tags@1.0.9: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} engines: {node: '>=0.10'} dependencies: - language-subtag-registry: 0.3.22 + language-subtag-registry: 0.3.23 dev: true /levn@0.4.1: @@ -2908,8 +2889,8 @@ packages: dependencies: js-tokens: 4.0.0 - /lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + /lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} dev: true @@ -2919,40 +2900,19 @@ packages: yallist: 3.1.1 dev: true - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: true - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + /micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 dev: true - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true - - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true - /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -2971,12 +2931,19 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + /minipass@7.1.1: + resolution: {integrity: sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==} engines: {node: '>=16 || 14 >=14.17'} dev: true @@ -2997,48 +2964,51 @@ packages: /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /next@14.1.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-McrGJqlGSHeaz2yTRPkEucxQKe5Zq7uPwyeHNmJaZNY4wx9E9QdxmTp310agFRoMuIYgQrCrT3petg13fSVOww==} - resolution: {integrity: sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA==} + + /next@14.2.3(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 react: ^18.2.0 react-dom: ^18.2.0 sass: ^1.3.0 peerDependenciesMeta: '@opentelemetry/api': optional: true + '@playwright/test': + optional: true sass: optional: true - '@next/env': 14.1.1 - '@next/env': 14.0.4 - '@swc/helpers': 0.5.2 - caniuse-lite: 1.0.30001593 - caniuse-lite: 1.0.30001564 + dependencies: + '@next/env': 14.2.3 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001621 graceful-fs: 4.2.11 postcss: 8.4.31 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - watchpack: 2.4.0 - '@next/swc-darwin-arm64': 14.1.1 - '@next/swc-darwin-x64': 14.1.1 - '@next/swc-linux-arm64-gnu': 14.1.1 - '@next/swc-linux-arm64-musl': 14.1.1 - '@next/swc-linux-x64-gnu': 14.1.1 - '@next/swc-linux-x64-musl': 14.1.1 - '@next/swc-win32-arm64-msvc': 14.1.1 - '@next/swc-win32-ia32-msvc': 14.1.1 - '@next/swc-win32-x64-msvc': 14.1.1 - '@next/swc-win32-x64-msvc': 14.0.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.3 + '@next/swc-darwin-x64': 14.2.3 + '@next/swc-linux-arm64-gnu': 14.2.3 + '@next/swc-linux-arm64-musl': 14.2.3 + '@next/swc-linux-x64-gnu': 14.2.3 + '@next/swc-linux-x64-musl': 14.2.3 + '@next/swc-win32-arm64-msvc': 14.2.3 + '@next/swc-win32-ia32-msvc': 14.2.3 + '@next/swc-win32-x64-msvc': 14.2.3 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros dev: false - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} dev: true /normalize-package-data@2.5.0: @@ -3050,20 +3020,6 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: true - - /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: 4.0.0 - dev: true - /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -3078,57 +3034,60 @@ packages: engines: {node: '>= 0.4'} dev: true - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 dev: true - /object.entries@1.1.7: - resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + /object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-object-atoms: 1.0.0 dev: true - /object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 dev: true - /object.groupby@1.0.1: - resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 + es-abstract: 1.23.3 dev: true - /object.hasown@1.1.3: - resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + /object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 dev: true - /object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + /object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-object-atoms: 1.0.0 dev: true /once@1.4.0: @@ -3137,40 +3096,16 @@ packages: wrappy: 1.0.2 dev: true - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: true - - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 - dev: true - - /open@9.1.0: - resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} - engines: {node: '>=14.16'} - dependencies: - default-browser: 4.0.0 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - is-wsl: 2.2.0 - dev: true - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 dev: true /p-limit@2.3.0: @@ -3217,7 +3152,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.23.4 + '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -3238,21 +3173,16 @@ packages: engines: {node: '>=8'} dev: true - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true - /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} dependencies: - lru-cache: 10.2.0 - minipass: 7.0.4 + lru-cache: 10.2.2 + minipass: 7.1.1 dev: true /path-type@4.0.0: @@ -3260,8 +3190,8 @@ packages: engines: {node: '>=8'} dev: true - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -3273,35 +3203,40 @@ packages: engines: {node: '>=4'} dev: true + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + dev: true + /postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 + picocolors: 1.0.1 + source-map-js: 1.2.0 dev: false /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} dev: true - /prettier-plugin-packagejson@2.4.6(prettier@3.2.5): - /prettier-plugin-packagejson@2.4.6(prettier@3.1.1): - resolution: {integrity: sha512-5JGfzkJRL0DLNyhwmiAV9mV0hZLHDwddFCs2lc9CNxOChpoWUQVe8K4qTMktmevmDlMpok2uT10nvHUyU59sNw==} + + /prettier-plugin-packagejson@2.5.0(prettier@3.2.5): + resolution: {integrity: sha512-6XkH3rpin5QEQodBSVNg+rBo4r91g/1mCaRwS1YGdQJZ6jwqrg2UchBsIG9tpS1yK1kNBvOt84OILsX8uHzBGg==} peerDependencies: prettier: '>= 1.16.0' peerDependenciesMeta: prettier: optional: true + dependencies: prettier: 3.2.5 - prettier: 3.1.1 - sort-package-json: 2.6.0 - synckit: 0.8.5 + sort-package-json: 2.10.0 + synckit: 0.9.0 dev: true + /prettier@3.2.5: resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} - resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==} engines: {node: '>=14'} hasBin: true dev: true @@ -3323,25 +3258,26 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + /react-dom@18.3.1(react@18.3.1): + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: - react: ^18.2.0 + react: ^18.3.1 dependencies: loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 + react: 18.3.1 + scheduler: 0.23.2 dev: false /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: true - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + /react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 + dev: false /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} @@ -3362,20 +3298,21 @@ packages: type-fest: 0.6.0 dev: true - /reflect.getprototypeof@1.0.4: - resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} + /reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 - globalthis: 1.0.3 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 which-builtin-type: 1.1.3 dev: true - /regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} dev: true /regexp-tree@0.1.27: @@ -3383,13 +3320,14 @@ packages: hasBin: true dev: true - /regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - set-function-name: 2.0.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 dev: true /regjsparser@0.10.0: @@ -3444,63 +3382,60 @@ packages: dependencies: glob: 7.2.3 dev: true - /rollup@4.12.0: - resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} - resolution: {integrity: sha512-66RB8OtFKUTozmVEh3qyNfH+b+z2RXBVloqO2KCC/pjFaGaHtxP9fVfOQKPSGXg2mElmjmxjW/fZ7iKrEpMH5Q==} + + /rollup@4.18.0: + resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true dependencies: '@types/estree': 1.0.5 - hasBin: true - '@rollup/rollup-android-arm-eabi': 4.12.0 - '@rollup/rollup-android-arm64': 4.12.0 - '@rollup/rollup-darwin-arm64': 4.12.0 - '@rollup/rollup-darwin-x64': 4.12.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 - '@rollup/rollup-linux-arm64-gnu': 4.12.0 - '@rollup/rollup-linux-arm64-musl': 4.12.0 - '@rollup/rollup-linux-riscv64-gnu': 4.12.0 - '@rollup/rollup-linux-x64-gnu': 4.12.0 - '@rollup/rollup-linux-x64-musl': 4.12.0 - '@rollup/rollup-win32-arm64-msvc': 4.12.0 - '@rollup/rollup-win32-ia32-msvc': 4.12.0 - '@rollup/rollup-win32-x64-msvc': 4.12.0 - '@rollup/rollup-win32-x64-msvc': 4.9.2 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.18.0 + '@rollup/rollup-android-arm64': 4.18.0 + '@rollup/rollup-darwin-arm64': 4.18.0 + '@rollup/rollup-darwin-x64': 4.18.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 + '@rollup/rollup-linux-arm-musleabihf': 4.18.0 + '@rollup/rollup-linux-arm64-gnu': 4.18.0 + '@rollup/rollup-linux-arm64-musl': 4.18.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 + '@rollup/rollup-linux-riscv64-gnu': 4.18.0 + '@rollup/rollup-linux-s390x-gnu': 4.18.0 + '@rollup/rollup-linux-x64-gnu': 4.18.0 + '@rollup/rollup-linux-x64-musl': 4.18.0 + '@rollup/rollup-win32-arm64-msvc': 4.18.0 + '@rollup/rollup-win32-ia32-msvc': 4.18.0 + '@rollup/rollup-win32-x64-msvc': 4.18.0 fsevents: 2.3.3 dev: true - /run-applescript@5.0.0: - resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} - engines: {node: '>=12'} - dependencies: - execa: 5.1.1 - dev: true - /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: true - /safe-array-concat@1.0.1: - resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 dev: true - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + /safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + es-errors: 1.3.0 is-regex: 1.1.4 dev: true - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + /scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} dependencies: loose-envify: 1.4.0 dev: false @@ -3515,31 +3450,32 @@ packages: hasBin: true dev: true - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + /semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} engines: {node: '>=10'} hasBin: true - dependencies: - lru-cache: 6.0.0 dev: true - /set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.1 - get-intrinsic: 1.2.2 + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 gopd: 1.0.1 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 dev: true - /set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.1 + define-data-property: 1.1.4 + es-errors: 1.3.0 functions-have-names: 1.2.3 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 dev: true /shebang-command@2.0.0: @@ -3554,18 +3490,16 @@ packages: engines: {node: '>=8'} dev: true - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 object-inspect: 1.13.1 dev: true - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true - /signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -3585,8 +3519,8 @@ packages: resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} dev: true - /sort-package-json@2.6.0: - resolution: {integrity: sha512-XSQ+lY9bAYA8ZsoChcEoPlgcSMaheziEp1beox1JVxy1SV4F2jSq9+h2rJ+3mC/Dhu9Ius1DLnInD5AWcsDXZw==} + /sort-package-json@2.10.0: + resolution: {integrity: sha512-MYecfvObMwJjjJskhxYfuOADkXp1ZMMnCFC8yhp+9HDsk7HhR336hd7eiBs96lTXfiqmUNI+WQCeCMRBhl251g==} hasBin: true dependencies: detect-indent: 7.0.1 @@ -3595,11 +3529,12 @@ packages: git-hooks-list: 3.1.0 globby: 13.2.2 is-plain-obj: 4.1.0 + semver: 7.6.2 sort-object-keys: 1.1.3 dev: true - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} dev: false @@ -3607,22 +3542,22 @@ packages: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.16 + spdx-license-ids: 3.0.17 dev: true - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + /spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} dev: true /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.16 + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.17 dev: true - /spdx-license-ids@3.0.16: - resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + /spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} dev: true /streamsearch@1.1.0: @@ -3648,43 +3583,49 @@ packages: strip-ansi: 7.1.0 dev: true - /string.prototype.matchall@4.0.10: - resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + /string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 has-symbols: 1.0.3 - internal-slot: 1.0.6 - regexp.prototype.flags: 1.5.1 - set-function-name: 2.0.1 - side-channel: 1.0.4 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.6 dev: true - /string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 dev: true - /string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-object-atoms: 1.0.0 dev: true - /string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-object-atoms: 1.0.0 dev: true /strip-ansi@6.0.1: @@ -3706,16 +3647,6 @@ packages: engines: {node: '>=4'} dev: true - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true - - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true - /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -3728,7 +3659,7 @@ packages: engines: {node: '>=8'} dev: true - /styled-jsx@5.1.1(react@18.2.0): + /styled-jsx@5.1.1(react@18.3.1): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -3742,7 +3673,7 @@ packages: optional: true dependencies: client-only: 0.0.1 - react: 18.2.0 + react: 18.3.1 dev: false /supports-color@5.5.0: @@ -3764,11 +3695,11 @@ packages: engines: {node: '>= 0.4'} dev: true - /synckit@0.8.5: - resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + /synckit@0.9.0: + resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} engines: {node: ^14.18.0 || >=16.0.0} dependencies: - '@pkgr/utils': 2.4.2 + '@pkgr/core': 0.1.1 tslib: 2.6.2 dev: true @@ -3781,11 +3712,6 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /titleize@3.0.0: - resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} - engines: {node: '>=12'} - dev: true - /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -3798,17 +3724,17 @@ packages: is-number: 7.0.0 dev: true - /ts-api-utils@1.0.3(typescript@5.3.3): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} + /ts-api-utils@1.3.0(typescript@5.4.5): + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.3.3 + typescript: 5.4.5 dev: true - /tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} dependencies: '@types/json5': 0.0.29 json5: 1.0.2 @@ -3823,74 +3749,74 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - /tsutils@3.21.0(typescript@5.3.3): + /tsutils@3.21.0(typescript@5.4.5): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 5.3.3 + typescript: 5.4.5 dev: true - /turbo-darwin-64@1.12.4: - resolution: {integrity: sha512-dBwFxhp9isTa9RS/fz2gDVk5wWhKQsPQMozYhjM7TT4jTrnYn0ZJMzr7V3B/M/T8QF65TbniW7w1gtgxQgX5Zg==} - resolution: {integrity: sha512-Cq760v0vJH5vQbK0uJZS8msqzYuZZXYdcpFeqBqrdIT5Kfd7tHjo94d9L1lZLP4eoSyXs4CUVnOw7MqD8dHnfQ==} + + /turbo-darwin-64@1.13.3: + resolution: {integrity: sha512-glup8Qx1qEFB5jerAnXbS8WrL92OKyMmg5Hnd4PleLljAeYmx+cmmnsmLT7tpaVZIN58EAAwu8wHC6kIIqhbWA==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-darwin-arm64@1.12.4: - resolution: {integrity: sha512-1Uo5iI6xsJ1j9ObsqxYRsa3W26mEbUe6fnj4rQYV6kDaqYD54oAMJ6hM53q9rB8JvFxwdrUXGp3PwTw9A0qqkA==} - resolution: {integrity: sha512-RlKegAYEvHBa1K+fl9d4iz0jFUw7LdEsTXlg1ppFIrl234bQ5y3ON8LBhLsf9M2ADzNzgT7Io33H0Cju0zneMg==} + + /turbo-darwin-arm64@1.13.3: + resolution: {integrity: sha512-/np2xD+f/+9qY8BVtuOQXRq5f9LehCFxamiQnwdqWm5iZmdjygC5T3uVSYuagVFsZKMvX3ycySwh8dylGTl6lg==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-linux-64@1.12.4: - resolution: {integrity: sha512-ONg2aSqKP7LAQOg7ysmU5WpEQp4DGNxSlAiR7um+LKtbmC/UxogbR5+T+Uuq6zGuQ5kJyKjWJ4NhtvUswOqBsA==} - resolution: {integrity: sha512-S6bvCEEkJvPxH7hMcGDDJFCFWk4/lpDGsQun6vzcj0gqbj5BMqw3xNrpPQDhg18+9oRQJG5F6M48pSgim7XZDg==} + + /turbo-linux-64@1.13.3: + resolution: {integrity: sha512-G+HGrau54iAnbXLfl+N/PynqpDwi/uDzb6iM9hXEDG+yJnSJxaHMShhOkXYJPk9offm9prH33Khx2scXrYVW1g==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-linux-arm64@1.12.4: - resolution: {integrity: sha512-9FPufkwdgfIKg/9jj87Cdtftw8o36y27/S2vLN7FTR2pp9c0MQiTBOLVYadUr1FlShupddmaMbTkXEhyt9SdrA==} - resolution: {integrity: sha512-QLy+Q3rIHXbTT1m49Sv7FO+z0TqH8L2Q18UlUu3TULm5bWzv5DVnvOebvFtTOHF3nAdr1CK0QiqhMrEPn++IKg==} + + /turbo-linux-arm64@1.13.3: + resolution: {integrity: sha512-qWwEl5VR02NqRyl68/3pwp3c/olZuSp+vwlwrunuoNTm6JXGLG5pTeme4zoHNnk0qn4cCX7DFrOboArlYxv0wQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-windows-64@1.12.4: - resolution: {integrity: sha512-2mOtxHW5Vjh/5rDVu/aFwsMzI+chs8XcEuJHlY1sYOpEymYTz+u6AXbnzRvwZFMrLKr7J7fQOGl+v96sLKbNdA==} - resolution: {integrity: sha512-Ih7SP/jJ1rlNbti7RTvdV3u9GeM91mOaAtZssShBrncqV5Mzb+MDqF4aAv1prDVo56ME0GXEd6tFNrQRFYjgEA==} + + /turbo-windows-64@1.13.3: + resolution: {integrity: sha512-Nudr4bRChfJzBPzEmpVV85VwUYRCGKecwkBFpbp2a4NtrJ3+UP1VZES653ckqCu2FRyRuS0n03v9euMbAvzH+Q==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /turbo-windows-arm64@1.12.4: - resolution: {integrity: sha512-nOY5wae9qnxPOpT1fRuYO0ks6dTwpKMPV6++VkDkamFDLFHUDVM/9kmD2UTeh1yyrKnrZksbb9zmShhmfj1wog==} - resolution: {integrity: sha512-jzUMzaBsGHq2NHotAT/jRaoxetdohmDNEt2WjiN1B8AM6wNKcufGVHk0GMoDbm1pcSi4HZOSf1gN+AlII6l3Dg==} + + /turbo-windows-arm64@1.13.3: + resolution: {integrity: sha512-ouJCgsVLd3icjRLmRvHQDDZnmGzT64GBupM1Y+TjtYn2LVaEBoV6hicFy8x5DUpnqdLy+YpCzRMkWlwhmkX7sQ==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /turbo@1.12.4: - resolution: {integrity: sha512-yUJ7elEUSToiGwFZogXpYKJpQ0BvaMbkEuQECIWtkBLcmWzlMOt6bActsIm29oN83mRU0WbzGt4e8H1KHWedhg==} - resolution: {integrity: sha512-7e+BYijfIuVtv6kfBl/KKOsu67JVdsHK3FNI4++NTYe/Ju+DAKQDKoPJ8wqthZo1QzUzeabvc/WCL41pwY7xug==} + + /turbo@1.13.3: + resolution: {integrity: sha512-n17HJv4F4CpsYTvKzUJhLbyewbXjq1oLCi90i5tW1TiWDz16ML1eDG7wi5dHaKxzh5efIM56SITnuVbMq5dk4g==} hasBin: true - turbo-darwin-64: 1.12.4 - turbo-darwin-arm64: 1.12.4 - turbo-linux-64: 1.12.4 - turbo-linux-arm64: 1.12.4 - turbo-windows-64: 1.12.4 - turbo-windows-arm64: 1.12.4 - turbo-windows-arm64: 1.12.1 + optionalDependencies: + turbo-darwin-64: 1.13.3 + turbo-darwin-arm64: 1.13.3 + turbo-linux-64: 1.13.3 + turbo-linux-arm64: 1.13.3 + turbo-windows-64: 1.13.3 + turbo-windows-arm64: 1.13.3 dev: true /type-check@0.4.0: @@ -3915,46 +3841,52 @@ packages: engines: {node: '>=8'} dev: true - /typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + /typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 dev: true - /typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + /typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 dev: true - /typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + /typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 dev: true - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + /typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 for-each: 0.3.3 - is-typed-array: 1.1.12 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 dev: true - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + /typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} hasBin: true dev: true @@ -3962,7 +3894,7 @@ packages: /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 @@ -3972,20 +3904,15 @@ packages: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - dev: true - - /update-browserslist-db@1.0.13(browserslist@4.22.1): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + /update-browserslist-db@1.0.16(browserslist@4.23.0): + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.22.1 - escalade: 3.1.1 - picocolors: 1.0.0 + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.1 dev: true /uri-js@4.4.1: @@ -4016,7 +3943,7 @@ packages: engines: {node: '>= 0.4'} dependencies: function.prototype.name: 1.1.6 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 is-async-function: 2.0.0 is-date-object: 1.0.5 is-finalizationregistry: 1.0.2 @@ -4025,28 +3952,29 @@ packages: is-weakref: 1.0.2 isarray: 2.0.5 which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.13 + which-collection: 1.0.2 + which-typed-array: 1.1.15 dev: true - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 dev: true - /which-typed-array@1.1.13: - resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /which@2.0.2: @@ -4057,6 +3985,11 @@ packages: isexe: 2.0.0 dev: true + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -4083,10 +4016,6 @@ packages: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} From 6bd32057aa6c68e108191c10c18e86167b44e9a5 Mon Sep 17 00:00:00 2001 From: ghdtjgus76 Date: Wed, 22 May 2024 17:22:14 +0900 Subject: [PATCH 09/12] chore: remove duplicated react dependency from devDependency --- examples/with-tailwind/packages/ui/package.json | 3 +-- examples/with-tailwind/pnpm-lock.yaml | 16 +++++----------- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/examples/with-tailwind/packages/ui/package.json b/examples/with-tailwind/packages/ui/package.json index 27ffe0c1a7e0d..205a9c54941ef 100644 --- a/examples/with-tailwind/packages/ui/package.json +++ b/examples/with-tailwind/packages/ui/package.json @@ -25,8 +25,7 @@ "@types/react": "^18.2.61", "autoprefixer": "^10.4.18", "postcss": "^8.4.35", - "react": "^18.2.0", "tailwindcss": "^3.4.1", "typescript": "^5.3.3" } -} \ No newline at end of file +} diff --git a/examples/with-tailwind/pnpm-lock.yaml b/examples/with-tailwind/pnpm-lock.yaml index 3432a828155b9..14ed2fed8c6cc 100644 --- a/examples/with-tailwind/pnpm-lock.yaml +++ b/examples/with-tailwind/pnpm-lock.yaml @@ -143,6 +143,10 @@ importers: packages/config-typescript: {} packages/ui: + dependencies: + react: + specifier: ^18.2.0 + version: 18.2.0 devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -162,9 +166,6 @@ importers: postcss: specifier: ^8.4.35 version: 8.4.35 - react: - specifier: ^18.2.0 - version: 18.2.0 tailwindcss: specifier: ^3.4.1 version: 3.4.1 @@ -3360,6 +3361,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 + dev: false /read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -4074,14 +4076,6 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - dev: false - /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: From 59d1ea879c2d0162809d61425531eac2d1cf4408 Mon Sep 17 00:00:00 2001 From: ghdtjgus76 Date: Wed, 22 May 2024 17:23:54 +0900 Subject: [PATCH 10/12] chore: move react from devDependency to dependency in with yarn example --- examples/with-yarn/packages/ui/package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/with-yarn/packages/ui/package.json b/examples/with-yarn/packages/ui/package.json index cd61216f9c2ed..c93c6d97805c5 100644 --- a/examples/with-yarn/packages/ui/package.json +++ b/examples/with-yarn/packages/ui/package.json @@ -19,7 +19,9 @@ "@types/react": "^18.2.61", "@types/react-dom": "^18.2.19", "eslint": "^8.57.0", - "react": "^18.2.0", "typescript": "^5.3.3" + }, + "dependencies": { + "react": "^18.2.0" } } From ee09b78234c5e425ac739cde424deedbd9f8d33c Mon Sep 17 00:00:00 2001 From: ghdtjgus76 Date: Sun, 16 Jun 2024 12:38:14 +0900 Subject: [PATCH 11/12] fix: fix merge conflict --- .cargo/config.toml | 3 + .../actions/install-global-turbo/action.yml | 2 +- .github/workflows/test-js-packages.yml | 48 +- .github/workflows/turborepo-test.yml | 58 +- .prettierrc | 10 + CONTRIBUTING.md | 11 +- Cargo.lock | 363 +- Cargo.toml | 24 +- LICENSE | 374 +- cli/LICENSE | 374 +- .../template/template.package.json | 2 +- cli/turbo.json | 2 +- crates/node-file-trace/Cargo.toml | 2 + crates/node-file-trace/src/lib.rs | 44 +- crates/node-file-trace/src/nft_json.rs | 4 +- crates/turbo-prehash/Cargo.toml | 10 + crates/turbo-prehash/src/lib.rs | 145 + crates/turbo-static/.gitignore | 2 + crates/turbo-static/Cargo.toml | 25 + crates/turbo-static/readme.md | 33 + crates/turbo-static/src/call_resolver.rs | 165 + crates/turbo-static/src/identifier.rs | 95 + crates/turbo-static/src/lsp_client.rs | 161 + crates/turbo-static/src/main.rs | 303 + crates/turbo-static/src/visitor.rs | 275 + crates/turbo-tasks-env/src/command_line.rs | 4 +- crates/turbo-tasks-env/src/custom.rs | 4 +- crates/turbo-tasks-env/src/dotenv.rs | 8 +- crates/turbo-tasks-env/src/filter.rs | 17 +- crates/turbo-tasks-env/src/lib.rs | 20 +- crates/turbo-tasks-fetch/src/lib.rs | 42 +- crates/turbo-tasks-fetch/tests/fetch.rs | 18 +- .../turbo-tasks-fs/examples/hash_directory.rs | 22 +- crates/turbo-tasks-fs/examples/hash_glob.rs | 28 +- crates/turbo-tasks-fs/src/attach.rs | 12 +- crates/turbo-tasks-fs/src/embed/dir.rs | 10 +- crates/turbo-tasks-fs/src/embed/file.rs | 16 +- crates/turbo-tasks-fs/src/embed/fs.rs | 19 +- crates/turbo-tasks-fs/src/glob.rs | 4 +- crates/turbo-tasks-fs/src/invalidation.rs | 4 +- crates/turbo-tasks-fs/src/lib.rs | 155 +- crates/turbo-tasks-fs/src/read_glob.rs | 6 +- crates/turbo-tasks-fs/src/virtual_fs.rs | 10 +- crates/turbo-tasks-fs/src/watcher.rs | 14 +- crates/turbo-tasks-hash/Cargo.toml | 2 - crates/turbo-tasks-hash/src/base16.rs | 4 - crates/turbo-tasks-hash/src/hex.rs | 5 - crates/turbo-tasks-hash/src/lib.rs | 4 +- .../turbo-tasks-macros-shared/src/expand.rs | 38 +- .../src/derive/deterministic_hash_macro.rs | 4 +- .../src/derive/trace_raw_vcs_macro.rs | 4 +- .../src/derive/value_debug_format_macro.rs | 73 +- crates/turbo-tasks-macros/src/lib.rs | 2 +- crates/turbo-tasks-malloc/Cargo.toml | 10 +- crates/turbo-tasks-malloc/src/counter.rs | 34 + crates/turbo-tasks-malloc/src/lib.rs | 71 +- crates/turbo-tasks-memory/Cargo.toml | 2 + .../src/aggregation/tests.rs | 1 + .../turbo-tasks-memory/src/memory_backend.rs | 14 +- crates/turbo-tasks-memory/src/task.rs | 18 +- crates/turbo-tasks-memory/tests/all_in_one.rs | 24 +- .../turbo-tasks-memory/tests/collectibles.rs | 45 +- crates/turbo-tasks/src/debug/internal.rs | 51 +- crates/turbo-tasks/src/debug/mod.rs | 2 +- crates/turbo-tasks/src/display.rs | 4 +- crates/turbo-tasks/src/lib.rs | 3 + crates/turbo-tasks/src/manager.rs | 10 +- crates/turbo-tasks/src/primitives.rs | 20 +- crates/turbo-tasks/src/rcstr.rs | 154 + .../src/task/concrete_task_input.rs | 4 +- crates/turbo-tasks/src/task/function.rs | 130 +- crates/turbo-tasks/src/task/task_input.rs | 18 +- crates/turbo-tasks/src/trace.rs | 4 +- crates/turbopack-binding/Cargo.toml | 2 + .../turbopack-browser/src/chunking_context.rs | 77 +- .../turbopack-browser/src/ecmascript/chunk.rs | 30 +- .../src/ecmascript/content.rs | 4 +- .../src/ecmascript/content_entry.rs | 4 +- .../src/ecmascript/evaluate/chunk.rs | 16 +- .../src/ecmascript/list/asset.rs | 26 +- .../src/ecmascript/list/version.rs | 6 +- .../src/ecmascript/merged/version.rs | 6 +- .../src/ecmascript/runtime.rs | 8 +- .../src/ecmascript/version.rs | 6 +- crates/turbopack-browser/src/react_refresh.rs | 17 +- crates/turbopack-cli-utils/src/issue.rs | 28 +- .../turbopack-cli-utils/src/runtime_entry.rs | 2 + crates/turbopack-cli/src/build/mod.rs | 39 +- crates/turbopack-cli/src/contexts.rs | 10 +- crates/turbopack-cli/src/dev/mod.rs | 53 +- .../turbopack-cli/src/dev/web_entry_source.rs | 19 +- crates/turbopack-cli/src/embed_js.rs | 6 +- crates/turbopack-cli/src/util.rs | 30 +- crates/turbopack-core/src/asset.rs | 4 +- .../turbopack-core/src/chunk/chunk_group.rs | 4 +- crates/turbopack-core/src/chunk/chunking.rs | 8 +- .../src/chunk/chunking_context.rs | 116 +- crates/turbopack-core/src/chunk/data.rs | 6 +- crates/turbopack-core/src/chunk/mod.rs | 20 +- .../turbopack-core/src/compile_time_info.rs | 40 +- crates/turbopack-core/src/context.rs | 10 +- crates/turbopack-core/src/diagnostics/mod.rs | 14 +- crates/turbopack-core/src/environment.rs | 44 +- crates/turbopack-core/src/file_source.rs | 8 +- crates/turbopack-core/src/ident.rs | 44 +- crates/turbopack-core/src/introspect/mod.rs | 14 +- .../turbopack-core/src/introspect/module.rs | 12 +- .../src/introspect/output_asset.rs | 12 +- .../turbopack-core/src/introspect/source.rs | 12 +- crates/turbopack-core/src/introspect/utils.rs | 34 +- crates/turbopack-core/src/issue/analyze.rs | 16 +- crates/turbopack-core/src/issue/mod.rs | 43 +- crates/turbopack-core/src/issue/resolve.rs | 16 +- .../src/issue/unsupported_module.rs | 57 - crates/turbopack-core/src/package_json.rs | 8 +- crates/turbopack-core/src/reference/mod.rs | 16 +- .../src/reference/source_map.rs | 15 +- crates/turbopack-core/src/reference_type.rs | 34 +- .../turbopack-core/src/resolve/alias_map.rs | 39 +- crates/turbopack-core/src/resolve/mod.rs | 247 +- crates/turbopack-core/src/resolve/node.rs | 30 +- crates/turbopack-core/src/resolve/options.rs | 70 +- crates/turbopack-core/src/resolve/origin.rs | 8 +- crates/turbopack-core/src/resolve/parse.rs | 147 +- crates/turbopack-core/src/resolve/pattern.rs | 211 +- crates/turbopack-core/src/resolve/plugin.rs | 38 +- crates/turbopack-core/src/resolve/remap.rs | 35 +- crates/turbopack-core/src/server_fs.rs | 6 +- crates/turbopack-core/src/source_map/mod.rs | 12 +- .../src/source_map/source_map_asset.rs | 20 +- crates/turbopack-core/src/version.rs | 16 +- crates/turbopack-css/src/asset.rs | 12 +- crates/turbopack-css/src/chunk/mod.rs | 32 +- .../src/chunk/single_item_chunk/chunk.rs | 24 +- .../src/chunk/single_item_chunk/source_map.rs | 2 +- crates/turbopack-css/src/chunk/source_map.rs | 2 +- crates/turbopack-css/src/module_asset.rs | 18 +- crates/turbopack-css/src/process.rs | 240 +- .../turbopack-css/src/references/compose.rs | 11 +- crates/turbopack-css/src/references/import.rs | 32 +- .../turbopack-css/src/references/internal.rs | 11 +- crates/turbopack-css/src/references/mod.rs | 10 +- crates/turbopack-css/src/references/url.rs | 18 +- crates/turbopack-dev-server/src/html.rs | 29 +- crates/turbopack-dev-server/src/http.rs | 6 +- .../src/introspect/mod.rs | 39 +- .../src/source/asset_graph.rs | 70 +- .../src/source/combined.rs | 12 +- .../src/source/conditional.rs | 26 +- .../src/source/issue_context.rs | 28 +- .../src/source/lazy_instantiated.rs | 12 +- crates/turbopack-dev-server/src/source/mod.rs | 43 +- .../src/source/resolve.rs | 28 +- .../src/source/route_tree.rs | 18 +- .../turbopack-dev-server/src/source/router.rs | 38 +- .../src/source/static_assets.rs | 16 +- .../src/source/wrapping_source.rs | 4 +- .../turbopack-dev-server/src/update/server.rs | 2 +- .../turbopack-dev-server/src/update/stream.rs | 17 +- .../turbopack-ecmascript-plugins/Cargo.toml | 1 + .../src/transform/directives/client.rs | 7 +- .../transform/directives/client_disallowed.rs | 33 + .../src/transform/directives/mod.rs | 1 + .../src/transform/directives/server.rs | 7 +- .../directives/server_to_client_proxy.rs | 29 +- .../src/transform/emotion.rs | 1 + .../src/transform/modularize_imports.rs | 1 + .../src/transform/relay.rs | 1 + .../src/transform/styled_components.rs | 1 + .../src/transform/styled_jsx.rs | 1 + .../transform/swc_ecma_transform_plugins.rs | 5 +- .../js/src/dev/runtime/base/runtime-base.ts | 16 +- .../js/src/shared/runtime-utils.ts | 71 +- .../src/asset_context.rs | 2 +- .../src/build_runtime.rs | 18 +- .../src/dev_runtime.rs | 37 +- .../src/embed_js.rs | 8 +- .../turbopack-ecmascript-runtime/src/lib.rs | 1 - crates/turbopack-ecmascript/Cargo.toml | 1 + .../turbopack-ecmascript/benches/analyzer.rs | 3 +- .../src/analyzer/graph.rs | 23 +- .../src/analyzer/imports.rs | 113 +- .../turbopack-ecmascript/src/analyzer/mod.rs | 37 +- .../src/async_chunk/chunk_item.rs | 10 +- .../src/async_chunk/module.rs | 10 +- .../src/chunk/chunk_type.rs | 8 +- crates/turbopack-ecmascript/src/chunk/item.rs | 6 +- crates/turbopack-ecmascript/src/chunk/mod.rs | 37 +- .../src/chunk/placeable.rs | 44 +- .../src/chunk_group_files_asset.rs | 30 +- crates/turbopack-ecmascript/src/lib.rs | 13 +- .../src/manifest/chunk_asset.rs | 13 +- .../src/manifest/chunk_item.rs | 2 +- .../src/manifest/loader_item.rs | 14 +- crates/turbopack-ecmascript/src/minify.rs | 3 + crates/turbopack-ecmascript/src/parse.rs | 71 +- .../turbopack-ecmascript/src/path_visitor.rs | 1 + .../src/references/amd.rs | 12 +- .../src/references/async_module.rs | 16 +- .../src/references/cjs.rs | 29 +- .../src/references/esm/base.rs | 53 +- .../src/references/esm/binding.rs | 38 +- .../src/references/esm/dynamic.rs | 13 +- .../src/references/esm/export.rs | 108 +- .../src/references/esm/module_id.rs | 13 +- .../src/references/esm/url.rs | 21 +- .../src/references/external_module.rs | 244 + .../src/references/mod.rs | 158 +- .../src/references/node.rs | 28 +- .../src/references/pattern_mapping.rs | 51 +- .../src/references/raw.rs | 11 +- .../src/references/require_context.rs | 50 +- .../src/references/type_issue.rs | 12 +- .../src/references/typescript.rs | 43 +- .../src/references/util.rs | 4 +- .../side_effect_optimization/facade/module.rs | 29 +- .../locals/chunk_item.rs | 1 + .../side_effect_optimization/locals/module.rs | 7 +- .../src/side_effect_optimization/reference.rs | 8 +- crates/turbopack-ecmascript/src/text/mod.rs | 10 +- .../turbopack-ecmascript/src/transform/mod.rs | 50 +- .../src/tree_shake/asset.rs | 117 +- .../src/tree_shake/chunk_item.rs | 5 + .../src/tree_shake/cjs_finder.rs | 11 + .../src/tree_shake/graph.rs | 494 +- .../src/tree_shake/merge.rs | 6 +- .../src/tree_shake/mod.rs | 370 +- .../src/tree_shake/tests.rs | 36 +- .../src/tree_shake/util.rs | 234 +- .../src/typescript/mod.rs | 67 +- crates/turbopack-ecmascript/src/utils.rs | 16 +- .../turbopack-ecmascript/src/webpack/mod.rs | 25 +- .../src/webpack/references.rs | 2 +- .../analyzer/graph/concat/graph.snapshot | 4 +- .../graph/esbuild/graph-effects.snapshot | 2 +- .../analyzer/graph/esbuild/graph.snapshot | 2 +- .../tests/tree-shaker/analyzer/1/output.md | 383 +- .../tests/tree-shaker/analyzer/2/output.md | 415 +- .../tests/tree-shaker/analyzer/3/output.md | 328 +- .../tree-shaker/analyzer/app-route/input.js | 31 + .../tree-shaker/analyzer/app-route/output.md | 812 +++ .../analyzer/combined-export/input.js | 4 + .../analyzer/combined-export/output.md | 169 + .../tree-shaker/analyzer/complex/output.md | 487 +- .../analyzer/export-named/input.js | 1 + .../analyzer/export-named/output.md | 134 + .../tree-shaker/analyzer/failed-1/input.js | 57 + .../tree-shaker/analyzer/failed-1/output.md | 502 ++ .../tree-shaker/analyzer/failed-2/input.js | 98 + .../tree-shaker/analyzer/failed-2/output.md | 1098 ++++ .../tree-shaker/analyzer/failed-3/input.js | 172 + .../tree-shaker/analyzer/failed-3/output.md | 2369 ++++++++ .../tree-shaker/analyzer/grouping/input.js | 13 + .../tree-shaker/analyzer/grouping/output.md | 348 ++ .../analyzer/ipc-evaluate/input.js | 94 + .../analyzer/ipc-evaluate/output.md | 480 ++ .../tree-shaker/analyzer/ipc-index/input.js | 172 + .../tree-shaker/analyzer/ipc-index/output.md | 2369 ++++++++ .../analyzer/multi-export/input.js | 4 + .../analyzer/multi-export/output.md | 169 + .../analyzer/node-globals/input.js | 2 + .../analyzer/node-globals/output.md | 91 + .../tree-shaker/analyzer/route-kind/input.js | 19 + .../tree-shaker/analyzer/route-kind/output.md | 192 + .../tree-shaker/analyzer/shared-2/input.js | 9 + .../tree-shaker/analyzer/shared-2/output.md | 512 ++ .../analyzer/shared-and-side-effects/input.js | 11 + .../shared-and-side-effects/output.md | 647 +++ .../analyzer/simple-vars-1/input.js | 4 + .../analyzer/simple-vars-1/output.md | 169 + .../tree-shaker/analyzer/simple/output.md | 82 +- .../analyzer/template-pages/input.js | 59 + .../analyzer/template-pages/output.md | 1492 +++++ .../analyzer/test-config-1/output.md | 462 +- .../tree-shaker/analyzer/tla-1/input.js} | 0 .../tree-shaker/analyzer/tla-1/output.md | 221 + .../tree-shaker/analyzer/write-order/input.js | 11 + .../analyzer/write-order/output.md | 538 ++ crates/turbopack-env/src/asset.rs | 2 +- crates/turbopack-env/src/dotenv.rs | 6 +- crates/turbopack-env/src/embeddable.rs | 11 +- crates/turbopack-env/src/issue.rs | 2 +- crates/turbopack-env/src/try_env.rs | 2 +- crates/turbopack-image/src/process/mod.rs | 14 +- crates/turbopack-json/src/lib.rs | 6 +- crates/turbopack-mdx/src/lib.rs | 26 +- .../src/compiled/stacktrace-parser/index.js | 227 +- crates/turbopack-node/js/src/ipc/index.ts | 1 + crates/turbopack-node/src/bootstrap.rs | 72 - crates/turbopack-node/src/embed_js.rs | 6 +- crates/turbopack-node/src/evaluate.rs | 38 +- crates/turbopack-node/src/lib.rs | 28 +- crates/turbopack-node/src/node_entry.rs | 7 +- crates/turbopack-node/src/pool.rs | 13 +- .../turbopack-node/src/render/error_page.rs | 20 +- crates/turbopack-node/src/render/issue.rs | 6 +- crates/turbopack-node/src/render/mod.rs | 22 +- .../src/render/node_api_source.rs | 39 +- .../turbopack-node/src/render/render_proxy.rs | 24 +- .../src/render/render_static.rs | 14 +- .../src/render/rendered_source.rs | 37 +- crates/turbopack-node/src/route_matcher.rs | 12 +- crates/turbopack-node/src/source_map/mod.rs | 4 +- crates/turbopack-node/src/source_map/trace.rs | 13 +- .../turbopack-node/src/transforms/postcss.rs | 32 +- crates/turbopack-node/src/transforms/util.rs | 6 +- .../turbopack-node/src/transforms/webpack.rs | 88 +- .../turbopack-nodejs/src/chunking_context.rs | 160 +- .../src/ecmascript/node/chunk.rs | 28 +- .../src/ecmascript/node/content.rs | 2 +- .../src/ecmascript/node/entry/chunk.rs | 14 +- .../src/ecmascript/node/entry/runtime.rs | 10 +- .../src/ecmascript/node/version.rs | 6 +- crates/turbopack-nodejs/src/lib.rs | 4 +- crates/turbopack-resolve/src/ecmascript.rs | 8 +- .../src/node_native_binding.rs | 100 +- crates/turbopack-resolve/src/resolve.rs | 53 +- .../src/resolve_options_context.rs | 6 +- crates/turbopack-resolve/src/typescript.rs | 64 +- crates/turbopack-static/src/lib.rs | 17 +- crates/turbopack-static/src/output_asset.rs | 2 +- crates/turbopack-swc-utils/src/emitter.rs | 14 +- crates/turbopack-test-utils/src/snapshot.rs | 11 +- crates/turbopack-tests/Cargo.toml | 1 + crates/turbopack-tests/index.d.ts | 4 +- crates/turbopack-tests/js/jest-entry.ts | 23 +- crates/turbopack-tests/js/jest-runtime.ts | 17 - crates/turbopack-tests/js/types.d.ts | 3 + crates/turbopack-tests/tests/execution.rs | 100 +- .../async-modules/esm-external/input/index.js | 8 + .../node_modules/package/index.mjs | 4 + .../node_modules/package/package.json | 3 + .../pack-3039-top-level-await/input/index.js | 6 + .../pack-3039-top-level-await/input/repro.js | 7 + .../input/wrapper.js | 5 + .../minification/paren-remover/input/index.js | 34 + .../basic}/input/index.js | 0 .../input/node_modules/package-full/a.js | 0 .../input/node_modules/package-full/b.js | 0 .../input/node_modules/package-full/c.js | 0 .../node_modules/package-full/default.js | 0 .../input/node_modules/package-full/index.js | 0 .../node_modules/package-full}/package.json | 0 .../input/node_modules/package-full/x.js | 0 .../input/node_modules/package-named/a.js | 0 .../input/node_modules/package-named/b.js | 0 .../node_modules/package-named/default.js | 0 .../input/node_modules/package-named/index.js | 0 .../package-named/not-compiled.js | 0 .../package-named/not-executed.js | 0 .../node_modules/package-named}/package.json | 0 .../input/node_modules/package-named/x.js | 0 .../input/node_modules/package-named/y.js | 0 .../input/node_modules/package-partial/a.js | 0 .../input/node_modules/package-partial/b.js | 0 .../node_modules/package-partial/dir/file.js | 0 .../node_modules/package-partial/effect.js | 0 .../node_modules/package-partial/file.side.js | 0 .../node_modules/package-partial/index.js | 0 .../package-partial/not-compiled.js | 0 .../package-partial/not-executed.js | 0 .../node_modules/package-partial/package.json | 0 .../check-side-effect.js | 0 .../package-reexport-side-effect/index.js | 0 .../package-reexport-side-effect/package.json | 0 .../side-effect.js | 0 .../side-effect2.js | 0 .../check-side-effect.js | 7 + .../package-reexport-tla-side-effect/index.js | 0 .../package.json | 0 .../side-effect.js | 0 .../side-effect2.js | 0 .../package-reexport-unused/index.js | 0 .../package-reexport-unused/package.json | 0 .../node_modules/package-reexport/index.js | 0 .../package-reexport/package.json | 0 .../check-side-effect.js | 0 .../package-require-side-effect/index.js | 0 .../package-require-side-effect/package.json | 0 .../side-effect.js | 0 .../side-effect2.js | 0 .../input/node_modules/package-star/a.js | 0 .../input/node_modules/package-star/b.js | 0 .../input/node_modules/package-star/index.js | 0 .../node_modules/package-star/not-compiled.js | 0 .../node_modules/package-star/not-executed.js | 0 .../node_modules/package-star}/package.json | 0 .../basic}/input/node_modules/tla/both.js | 0 .../basic}/input/node_modules/tla/local.js | 0 .../input/node_modules/tla}/package.json | 0 .../basic}/input/node_modules/tla/reexport.js | 0 .../input/node_modules/tla/reexported.js | 0 .../input/node_modules/tla/tla-reexported.js | 0 .../basic}/options.json | 0 .../mui-utils/input/index.js | 21 + .../generateUtilityClass/index.js | 0 .../node_modules/mui-material}/package.json | 0 .../generateUtilityClass.js | 0 .../mui-utils/generateUtilityClass/index.js | 0 .../mui-utils/node_modules/mui-utils/index.js | 0 .../node_modules/mui-utils/not-correct.js | 0 .../node_modules/mui-utils}/package.json | 0 .../mui-utils/options.json | 3 + .../namespace-object-identity/input/esm.js | 6 + .../namespace-object-identity/input/index.js | 11 + .../namespace-object-identity/options.json | 3 + .../tree-shaking/.basic/input/index.js | 1 + .../tree-shaking/.basic/options.json | 3 + .../duplicate-modules/input/cjs.js | 10 + .../duplicate-modules/input/esm.js | 9 + .../duplicate-modules/input/index.js | 10 + .../duplicate-modules/options.json | 3 + .../tree-shaking/mui-utils/input/index.js | 22 +- .../tree-shaking/mui-utils/options.json | 2 +- .../tree-shaking/no-write-access/input/esm.js | 5 + .../no-write-access/input/index.js | 12 + .../tree-shaking/no-write-access/options.json | 3 + .../split-chunks-shared-state/input/a.js | 3 + .../split-chunks-shared-state/input/b.js | 3 + .../split-chunks-shared-state/input/index.js | 14 + .../split-chunks-shared-state/input/module.js | 9 + .../split-chunks-shared-state/input/order.js | 3 + .../split-chunks-shared-state/options.json | 3 + .../tree-shaking/split-chunks/input/a.js | 3 + .../tree-shaking/split-chunks/input/b.js | 3 + .../tree-shaking/split-chunks/input/index.js | 7 + .../tree-shaking/split-chunks/input/module.js | 2 + .../tree-shaking/split-chunks/options.json | 3 + .../turbopack/wasm/complex/input/index.js | 2 +- .../turbopack/wasm/simple/input/math.js | 8 +- .../.reexport-unknown/input/async-unknown.js | 3 + .../.reexport-unknown/input/index.js | 3 + .../input/reexport-async-unknown.js | 3 + .../.reexport-unknown/input/test.js | 23 + .../.reexport-unknown/input/unknown.js | 7 + .../async-modules/double-import/input/a.js | 3 + .../async-modules/double-import/input/b.js | 3 + .../double-import/input/index.js | 4 + .../async-modules/double-import/input/main.js | 4 + .../double-import/input/shared.js | 3 + .../async-modules/issue-16097/input/index.js | 6 + .../issue-16097/input/won't-run-tla.js | 4 + .../micro-ticks-parents/input/case-a/a.js | 4 + .../micro-ticks-parents/input/case-a/async.js | 7 + .../input/case-a/async2.js | 8 + .../micro-ticks-parents/input/case-a/b.js | 4 + .../micro-ticks-parents/input/case-a/c.js | 4 + .../micro-ticks-parents/input/case-a/d.js | 5 + .../micro-ticks-parents/input/case-a/e.js | 3 + .../micro-ticks-parents/input/case-a/f.js | 5 + .../micro-ticks-parents/input/case-b/a.js | 5 + .../micro-ticks-parents/input/case-b/async.js | 7 + .../micro-ticks-parents/input/case-b/b.js | 4 + .../micro-ticks-parents/input/case-b/c.js | 4 + .../micro-ticks-parents/input/case-b/d.js | 4 + .../micro-ticks-parents/input/case-b/e.js | 9 + .../micro-ticks-parents/input/case-c/a.js | 7 + .../micro-ticks-parents/input/case-c/b.js | 3 + .../micro-ticks-parents/input/case-d/a.js | 6 + .../micro-ticks-parents/input/case-d/b.js | 6 + .../micro-ticks-parents/input/case-d/c.js | 6 + .../micro-ticks-parents/input/case-d/index.js | 5 + .../micro-ticks-parents/input/case-d/x.js | 4 + .../micro-ticks-parents/input/case-d/y.js | 4 + .../micro-ticks-parents/input/case-e/a.js | 4 + .../micro-ticks-parents/input/case-e/async.js | 7 + .../micro-ticks-parents/input/case-e/b.js | 4 + .../micro-ticks-parents/input/case-e/index.js | 6 + .../micro-ticks-parents/input/case-e/x.js | 4 + .../micro-ticks-parents/input/index.js | 74 + .../micro-ticks-parents/input/tick.js | 23 + .../runtime-performance/input/async.js | 2 + .../runtime-performance/input/index.js | 5 + .../runtime-performance/input/loader.js | 14 + .../top-level-await/input/index.js | 6 + .../top-level-await/input/module.js | 3 + .../top-level-await/input/reexport.js | 4 + .../top-level-error/input/counter.js | 6 + .../top-level-error/input/index.js | 39 + .../top-level-error/input/main.js | 2 + .../top-level-error/input/module.js | 6 + .../top-level-error/input/reexport.js | 1 + crates/turbopack-tests/tests/snapshot.rs | 74 +- .../dynamic-import/input/index.js | 7 + .../dynamic-import/input/lib.js | 35 + .../dynamic-import/options.json | 3 + ...e-shake_dynamic-import_input_lib_029950.js | 14 + ...ake_dynamic-import_input_lib_029950.js.map | 5 + ...e-shake_dynamic-import_input_lib_a8786a.js | 205 + ...ake_dynamic-import_input_lib_a8786a.js.map | 27 + ...shake_dynamic-import_input_index_26d958.js | 14 + ...e_dynamic-import_input_index_26d958.js.map | 7 + .../export-named/input/index.js | 4 + .../export-named/input/lib.js | 35 + .../export-named/input/module.js | 2 + .../export-named/options.json | 3 + ...-tree-shake_export-named_input_0f4a04._.js | 106 + ...e-shake_export-named_input_0f4a04._.js.map | 21 + .../export-namespace/input/index.js | 3 + .../export-namespace/input/lib.js | 35 + .../export-namespace/input/module.js | 2 + .../export-namespace/options.json | 3 + ...e-shake_export-namespace_input_086000._.js | 256 + ...ake_export-namespace_input_086000._.js.map | 35 + .../import-named-all/input/index.js | 5 + .../import-named-all/input/lib.js | 35 + .../import-named-all/options.json | 3 + ...e-shake_import-named-all_input_b950f0._.js | 85 + ...ake_import-named-all_input_b950f0._.js.map | 17 + .../import-named/input/index.js | 3 + .../import-named/input/lib.js | 35 + .../import-named/options.json | 3 + ...-tree-shake_import-named_input_b153a7._.js | 84 + ...e-shake_import-named_input_b153a7._.js.map | 17 + .../import-namespace/input/index.js | 3 + .../import-namespace/input/lib.js | 35 + .../import-namespace/options.json | 3 + ...e-shake_import-namespace_input_bf8716._.js | 231 + ...ake_import-namespace_input_bf8716._.js.map | 31 + .../import-side-effect/input/index.js | 1 + .../import-side-effect/input/lib.js | 35 + .../import-side-effect/options.json | 3 + ...shake_import-side-effect_input_4d9584._.js | 55 + ...e_import-side-effect_input_4d9584._.js.map | 13 + .../require-side-effect/input/index.js | 1 + .../require-side-effect/input/lib.js | 35 + .../require-side-effect/options.json | 3 + ...hake_require-side-effect_input_050f3c._.js | 210 + ..._require-side-effect_input_050f3c._.js.map | 29 + .../tree-shake-test-1/input/index.js | 35 + .../tree-shake-test-1/options.json | 3 + ...ke_tree-shake-test-1_input_index_2c45e0.js | 205 + ...ree-shake-test-1_input_index_2c45e0.js.map | 27 + .../basic/async_chunk_build/options.json | 2 +- .../basic/ecmascript_minify/options.json | 2 +- ...ot_basic_top-level-await_input_e71653._.js | 2 +- ...asic_top-level-await_input_e71653._.js.map | 2 +- ...s_snapshot_mdx_error_input_index_743c8b.js | 6 + ...apshot_mdx_error_input_index_743c8b.js.map | 5 + ...s_snapshot_mdx_error_input_index_a3c4fd.js | 9 + ...apshot_mdx_error_input_index_a3c4fd.js.map | 5 + .../minification/paren-remover/input/index.js | 30 + .../minification/paren-remover/options.json | 3 + ...cation_paren-remover_input_index_80e2cf.js | 29 + ...on_paren-remover_input_index_80e2cf.js.map | 7 + ...cation_paren-remover_input_index_eab450.js | 6 + ...on_paren-remover_input_index_eab450.js.map | 5 + .../default_build_runtime/options.json | 2 +- .../output/[turbopack]_runtime.js | 56 +- .../output/[turbopack]_runtime.js.map | 10 +- ..._default_dev_runtime_input_index_40d141.js | 67 +- ...ault_dev_runtime_input_index_40d141.js.map | 8 +- crates/turbopack-tests/tests/util.rs | 9 +- crates/turbopack-trace-server/src/server.rs | 17 + crates/turbopack-trace-server/src/viewer.rs | 113 +- crates/turbopack-wasm/src/loader.rs | 13 +- crates/turbopack-wasm/src/module_asset.rs | 8 +- crates/turbopack-wasm/src/output_asset.rs | 8 +- crates/turbopack-wasm/src/raw.rs | 11 +- crates/turbopack-wasm/src/source.rs | 2 +- crates/turbopack/benches/node_file_trace.rs | 10 +- crates/turbopack/examples/turbopack.rs | 16 +- crates/turbopack/src/evaluate_context.rs | 18 +- crates/turbopack/src/lib.rs | 149 +- crates/turbopack/src/module_options/mod.rs | 32 +- .../module_options/module_options_context.rs | 22 +- .../src/module_options/module_rule.rs | 1 + .../src/transition/context_transition.rs | 8 +- crates/turbopack/src/transition/mod.rs | 6 +- crates/turbopack/src/unsupported_sass.rs | 24 +- crates/turbopack/tests/node-file-trace.rs | 30 +- crates/turborepo-analytics/Cargo.toml | 2 +- crates/turborepo-api-client/Cargo.toml | 2 +- crates/turborepo-auth/Cargo.toml | 2 +- crates/turborepo-cache/Cargo.toml | 2 +- crates/turborepo-cache/src/async_cache.rs | 24 +- crates/turborepo-cache/src/fs.rs | 2 +- crates/turborepo-ci/Cargo.toml | 2 +- crates/turborepo-dirs/Cargo.toml | 2 +- crates/turborepo-env/Cargo.toml | 2 +- crates/turborepo-env/src/lib.rs | 16 - crates/turborepo-errors/Cargo.toml | 2 +- crates/turborepo-filewatch/Cargo.toml | 2 +- .../turborepo-filewatch/src/hash_watcher.rs | 4 +- crates/turborepo-filewatch/src/lib.rs | 1 + .../src/package_watcher.rs | 30 +- crates/turborepo-fs/Cargo.toml | 2 +- crates/turborepo-globwalk/Cargo.toml | 2 +- crates/turborepo-globwalk/src/lib.rs | 138 +- crates/turborepo-graph-utils/Cargo.toml | 2 +- crates/turborepo-lib/Cargo.toml | 5 +- .../fixtures/local_config/turbo.v1.json | 6 + .../fixtures/local_config/turbo.v2.json | 6 + .../local_config/turbov2.package-lock.json | 116 + crates/turborepo-lib/src/cli/mod.rs | 341 +- crates/turborepo-lib/src/commands/link.rs | 2 +- crates/turborepo-lib/src/commands/mod.rs | 10 +- crates/turborepo-lib/src/commands/run.rs | 2 +- crates/turborepo-lib/src/config.rs | 106 +- crates/turborepo-lib/src/daemon/mod.rs | 2 +- crates/turborepo-lib/src/engine/builder.rs | 160 +- crates/turborepo-lib/src/engine/mod.rs | 7 - crates/turborepo-lib/src/hash/mod.rs | 75 +- crates/turborepo-lib/src/hash/proto.capnp | 19 +- crates/turborepo-lib/src/lib.rs | 5 +- crates/turborepo-lib/src/opts.rs | 135 +- crates/turborepo-lib/src/panic_handler.rs | 59 + crates/turborepo-lib/src/process/mod.rs | 3 +- crates/turborepo-lib/src/run/builder.rs | 16 +- crates/turborepo-lib/src/run/cache.rs | 28 +- crates/turborepo-lib/src/run/error.rs | 3 + crates/turborepo-lib/src/run/global_hash.rs | 61 +- crates/turborepo-lib/src/run/mod.rs | 58 +- crates/turborepo-lib/src/run/scope/filter.rs | 233 +- .../src/run/scope/simple_glob.rs | 4 + .../src/run/scope/target_selector.rs | 32 +- .../src/run/summary/global_hash.rs | 12 +- crates/turborepo-lib/src/run/summary/mod.rs | 58 +- .../turborepo-lib/src/run/summary/spaces.rs | 5 +- crates/turborepo-lib/src/run/summary/task.rs | 16 +- .../src/run/summary/task_factory.rs | 20 +- crates/turborepo-lib/src/run/watch.rs | 2 +- crates/turborepo-lib/src/shim.rs | 822 --- .../src/shim/local_turbo_config.rs | 214 + .../src/shim/local_turbo_state.rs | 223 + crates/turborepo-lib/src/shim/mod.rs | 330 ++ crates/turborepo-lib/src/shim/parser.rs | 278 + crates/turborepo-lib/src/shim/turbo_state.rs | 70 + crates/turborepo-lib/src/task_graph/mod.rs | 9 +- .../turborepo-lib/src/task_graph/visitor.rs | 15 +- crates/turborepo-lib/src/task_hash.rs | 200 +- crates/turborepo-lib/src/tracing.rs | 4 +- crates/turborepo-lib/src/turbo_json/mod.rs | 297 +- crates/turborepo-lib/src/turbo_json/parser.rs | 8 +- crates/turborepo-lockfiles/Cargo.toml | 2 +- .../fixtures/pnpm6turbo.yaml | 96 + .../fixtures/pnpm8turbo.yaml | 96 + crates/turborepo-lockfiles/src/berry/mod.rs | 19 +- crates/turborepo-lockfiles/src/bun/mod.rs | 4 + crates/turborepo-lockfiles/src/lib.rs | 3 + crates/turborepo-lockfiles/src/npm.rs | 12 + crates/turborepo-lockfiles/src/pnpm/data.rs | 26 + crates/turborepo-lockfiles/src/yarn1/mod.rs | 17 + crates/turborepo-lsp/Cargo.toml | 2 +- crates/turborepo-lsp/src/lib.rs | 106 +- crates/turborepo-paths/Cargo.toml | 2 +- .../turborepo-paths/src/relative_unix_path.rs | 4 + .../src/relative_unix_path_buf.rs | 4 - crates/turborepo-repository/Cargo.toml | 2 +- .../src/change_mapper/mod.rs | 5 + crates/turborepo-repository/src/discovery.rs | 5 +- crates/turborepo-repository/src/inference.rs | 41 +- .../src/package_graph/builder.rs | 4 + .../src/package_graph/mod.rs | 117 +- .../turborepo-repository/src/package_json.rs | 35 +- .../src/package_manager/bun.rs | 62 - .../src/package_manager/mod.rs | 116 +- .../src/package_manager/npm.rs | 62 - .../src/package_manager/pnpm.rs | 55 +- .../src/package_manager/yarn.rs | 85 +- crates/turborepo-scm/Cargo.toml | 2 +- crates/turborepo-scm/src/git.rs | 21 +- crates/turborepo-scm/src/ls_tree.rs | 1 + crates/turborepo-scm/src/status.rs | 1 + crates/turborepo-telemetry/Cargo.toml | 2 +- .../turborepo-telemetry/src/events/generic.rs | 23 - crates/turborepo-ui/Cargo.toml | 4 +- crates/turborepo-ui/src/tui/app.rs | 33 +- crates/turborepo-ui/src/tui/input.rs | 15 +- crates/turborepo-ui/src/tui/mod.rs | 4 +- crates/turborepo-updater/Cargo.toml | 2 +- crates/turborepo-vercel-api-mock/Cargo.toml | 2 +- crates/turborepo-vercel-api/Cargo.toml | 2 +- crates/turborepo-vt100/src/screen.rs | 2 +- crates/turborepo/Cargo.toml | 4 +- crates/turborepo/src/main.rs | 7 +- crates/turborepo/src/panic_handler.rs | 43 - deny.toml | 7 +- .../docs => pack-docs}/advanced/profiling.mdx | 14 +- docs/pack-docs/benchmarks.mdx | 11 + .../pack/docs => pack-docs}/core-concepts.mdx | 2 - .../pack/docs => pack-docs}/features/css.mdx | 29 +- .../features/dev-server.mdx | 5 +- .../features/frameworks.mdx | 9 +- .../docs => pack-docs}/features/imports.mdx | 17 +- docs/pack-docs/features/index.mdx | 62 + .../features/javascript.mdx | 20 +- docs/pack-docs/features/meta.json | 11 + .../features/static-assets.mdx | 21 +- .../features/typescript.mdx | 18 +- docs/{pages/pack/docs => pack-docs}/index.mdx | 68 +- docs/pack-docs/meta.json | 12 + .../migrating-from-webpack.mdx | 6 +- .../pack/docs => pack-docs}/roadmap.mdx | 9 +- .../pack/docs => pack-docs}/why-turbopack.mdx | 2 - docs/pages/messages/_meta.json | 6 - docs/pages/pack/_meta.json | 15 - docs/pages/pack/docs/_meta.json | 10 - docs/pages/pack/docs/benchmarks.mdx | 7 - docs/pages/pack/docs/features.mdx | 22 - docs/pages/pack/docs/features/_meta.json | 9 - docs/pages/pack/index.mdx | 8 - docs/pages/repo/_meta.json | 15 - docs/pages/repo/docs/_meta.json | 27 - docs/pages/repo/docs/ci.mdx | 28 - docs/pages/repo/docs/ci/_meta.json | 7 - docs/pages/repo/docs/core-concepts/_meta.json | 8 - .../pages/repo/docs/core-concepts/caching.mdx | 191 - .../docs/core-concepts/caching/_meta.json | 6 - .../caching/environment-variable-inputs.mdx | 283 - .../core-concepts/caching/file-inputs.mdx | 133 - .../caching/to-cache-or-not-to-cache.mdx | 51 - .../core-concepts/caching/what-to-cache.mdx | 83 - .../repo/docs/core-concepts/monorepos.mdx | 23 - .../docs/core-concepts/monorepos/_meta.json | 8 - .../monorepos/configuring-workspaces.mdx | 267 - .../core-concepts/monorepos/filtering.mdx | 208 - .../core-concepts/monorepos/running-tasks.mdx | 252 - .../monorepos/task-dependencies.mdx | 255 - .../docs/core-concepts/remote-caching.mdx | 121 - docs/pages/repo/docs/core-concepts/scopes.mdx | 50 - docs/pages/repo/docs/faq.mdx | 106 - .../repo/docs/getting-started/_meta.json | 6 - .../docs/getting-started/add-to-project.mdx | 135 - .../repo/docs/getting-started/create-new.mdx | 516 -- .../getting-started/existing-monorepo.mdx | 233 - .../docs/getting-started/from-example.mdx | 14 - docs/pages/repo/docs/handbook.mdx | 25 - docs/pages/repo/docs/handbook/_meta.json | 16 - .../repo/docs/handbook/building-your-app.mdx | 76 - docs/pages/repo/docs/handbook/dev.mdx | 242 - .../docs/handbook/environment-variables.mdx | 140 - docs/pages/repo/docs/handbook/linting.mdx | 50 - .../repo/docs/handbook/linting/_meta.json | 4 - .../repo/docs/handbook/linting/eslint.mdx | 166 - .../repo/docs/handbook/linting/typescript.mdx | 128 - .../docs/handbook/migrating-to-a-monorepo.mdx | 77 - .../docs/handbook/package-installation.mdx | 157 - .../docs/handbook/publishing-packages.mdx | 15 - .../handbook/publishing-packages/_meta.json | 4 - .../handbook/publishing-packages/bundling.mdx | 133 - .../versioning-and-publishing.mdx | 57 - .../pages/repo/docs/handbook/sharing-code.mdx | 70 - .../docs/handbook/sharing-code/_meta.json | 3 - .../sharing-code/internal-packages.mdx | 240 - docs/pages/repo/docs/handbook/testing.mdx | 116 - .../pages/repo/docs/handbook/tools/_meta.json | 4 - .../pages/repo/docs/handbook/tools/prisma.mdx | 212 - .../repo/docs/handbook/tools/storybook.mdx | 211 - .../repo/docs/handbook/troubleshooting.mdx | 31 - .../repo/docs/handbook/what-is-a-monorepo.mdx | 85 - docs/pages/repo/docs/handbook/workspaces.mdx | 168 - docs/pages/repo/docs/index.mdx | 42 - docs/pages/repo/docs/installing.mdx | 83 - docs/pages/repo/docs/reference/_meta.json | 5 - docs/pages/repo/docs/reference/codemods.mdx | 384 -- .../docs/reference/command-line-reference.mdx | 101 - .../command-line-reference/_meta.json | 12 - .../reference/command-line-reference/bin.mdx | 8 - .../reference/command-line-reference/gen.mdx | 74 - .../reference/command-line-reference/link.mdx | 17 - .../command-line-reference/login.mdx | 32 - .../command-line-reference/logout.mdx | 8 - .../command-line-reference/prune.mdx | 102 - .../reference/command-line-reference/run.mdx | 571 -- .../reference/command-line-reference/scan.mdx | 25 - .../command-line-reference/telemetry.mdx | 34 - .../command-line-reference/unlink.mdx | 8 - .../repo/docs/reference/configuration.mdx | 504 -- docs/pages/repo/docs/support.mdx | 90 - docs/pages/repo/docs/troubleshooting.mdx | 190 - docs/pages/repo/docs/upgrading-to-v1.mdx | 78 - docs/pages/repo/index.mdx | 7 - docs/public/schema.json | 1 - .../acknowledgments.mdx} | 10 +- docs/repo-docs/community.mdx | 58 + docs/repo-docs/core-concepts/index.mdx | 35 + .../core-concepts/internal-packages.mdx | 137 + docs/repo-docs/core-concepts/meta.json | 8 + .../core-concepts/package-and-task-graph.mdx} | 83 +- .../repo-docs/core-concepts/package-types.mdx | 27 + .../core-concepts/remote-caching.mdx | 193 + .../crafting-your-repository/caching.mdx | 202 + .../configuring-tasks.mdx | 381 ++ .../constructing-ci.mdx | 170 + .../creating-an-internal-package.mdx | 318 ++ .../developing-applications.mdx | 150 + .../crafting-your-repository/index.mdx | 87 + .../managing-dependencies.mdx | 176 + .../crafting-your-repository/meta.json | 15 + .../running-tasks.mdx | 172 + .../structuring-a-repository.mdx | 367 ++ .../crafting-your-repository/upgrading.mdx | 118 + .../using-environment-variables.mdx | 277 + .../add-to-existing-repository.mdx | 245 + .../getting-started/editor-integration.mdx | 48 + docs/repo-docs/getting-started/index.mdx | 69 + .../getting-started/installation.mdx | 154 + docs/repo-docs/getting-started/meta.json | 10 + .../getting-started/support-policy.mdx | 66 + .../guides/ci-vendors}/circleci.mdx | 62 +- .../guides/ci-vendors}/github-actions.mdx | 118 +- .../guides/ci-vendors/gitlab-ci.mdx} | 39 +- docs/repo-docs/guides/ci-vendors/index.mdx | 42 + docs/repo-docs/guides/ci-vendors/meta.json | 1 + .../guides/ci-vendors/travis-ci.mdx} | 37 +- .../guides/ci-vendors}/vercel.mdx | 8 +- docs/repo-docs/guides/frameworks/index.mdx | 22 + docs/repo-docs/guides/frameworks/meta.json | 3 + docs/repo-docs/guides/frameworks/nextjs.mdx | 120 + docs/repo-docs/guides/frameworks/nuxt.mdx | 120 + .../repo-docs/guides/frameworks/sveltekit.mdx | 120 + docs/repo-docs/guides/frameworks/vite.mdx | 120 + .../guides/generating-code.mdx} | 233 +- docs/repo-docs/guides/handling-platforms.mdx | 79 + docs/repo-docs/guides/index.mdx | 65 + docs/repo-docs/guides/meta.json | 15 + docs/repo-docs/guides/multi-language.mdx | 134 + .../repo-docs/guides/publishing-libraries.mdx | 176 + .../guides/single-package-workspaces.mdx | 154 + .../guides}/skipping-tasks.mdx | 31 +- docs/repo-docs/guides/tools/biome.mdx | 61 + .../guides/tools/create-turbo-callout.tsx | 15 + .../guides/tools/docker.mdx} | 134 +- docs/repo-docs/guides/tools/eslint.mdx | 236 + docs/repo-docs/guides/tools/index.mdx | 19 + docs/repo-docs/guides/tools/jest.mdx | 185 + docs/repo-docs/guides/tools/meta.json | 3 + docs/repo-docs/guides/tools/prisma.mdx | 238 + docs/repo-docs/guides/tools/storybook.mdx | 388 ++ docs/repo-docs/guides/tools/typescript.mdx | 266 + docs/repo-docs/guides/tools/vitest.mdx | 113 + docs/repo-docs/index.mdx | 42 + .../messages/invalid-env-prefix.mdx | 14 +- .../missing-root-task-in-turbo-json.mdx | 18 +- ...kage-task-in-single-package-workspace.mdx} | 18 +- .../unnecessary-package-task-syntax.mdx | 20 +- docs/repo-docs/meta.json | 13 + docs/repo-docs/reference/bin.mdx | 10 + docs/repo-docs/reference/configuration.mdx | 415 ++ docs/repo-docs/reference/create-turbo.mdx | 80 + .../reference/eslint-config-turbo.mdx | 46 + docs/repo-docs/reference/generate.mdx | 90 + docs/repo-docs/reference/globs.mdx | 33 + docs/repo-docs/reference/index.mdx | 155 + docs/repo-docs/reference/link.mdx | 18 + docs/repo-docs/reference/login.mdx | 34 + docs/repo-docs/reference/logout.mdx | 6 + docs/repo-docs/reference/meta.json | 28 + .../reference/package-configurations.mdx | 245 + docs/repo-docs/reference/prune.mdx | 201 + docs/repo-docs/reference/run.mdx | 486 ++ docs/repo-docs/reference/scan.mdx | 15 + .../system-environment-variables.mdx} | 21 +- docs/repo-docs/reference/telemetry.mdx | 40 + docs/repo-docs/reference/turbo-codemod.mdx | 384 ++ docs/repo-docs/reference/turbo-gen.mdx | 28 + docs/repo-docs/reference/turbo-ignore.mdx | 23 + docs/repo-docs/reference/unlink.mdx | 6 + docs/repo-docs/reference/watch.mdx | 27 + .../repo/docs => repo-docs}/telemetry.mdx | 14 +- examples/basic/.eslintrc.js | 10 - examples/basic/apps/docs/.gitignore | 36 + examples/basic/apps/docs/README.md | 20 +- examples/basic/apps/docs/app/favicon.ico | Bin 8267 -> 25931 bytes .../apps/docs/app/fonts/GeistMonoVF.woff | Bin 0 -> 67864 bytes .../basic/apps/docs/app/fonts/GeistVF.woff | Bin 0 -> 66268 bytes examples/basic/apps/docs/app/globals.css | 57 +- examples/basic/apps/docs/app/layout.tsx | 25 +- examples/basic/apps/docs/app/page.module.css | 335 -- examples/basic/apps/docs/app/page.tsx | 223 +- examples/basic/apps/docs/next.config.js | 4 - examples/basic/apps/docs/next.config.mjs | 4 + examples/basic/apps/docs/package.json | 27 +- examples/basic/apps/docs/postcss.config.mjs | 8 + examples/basic/apps/docs/public/circles.svg | 17 - examples/basic/apps/docs/public/file-text.svg | 3 + examples/basic/apps/docs/public/globe.svg | 10 + examples/basic/apps/docs/public/turborepo.svg | 32 - examples/basic/apps/docs/public/vercel.svg | 11 +- examples/basic/apps/docs/public/window.svg | 3 + examples/basic/apps/docs/tailwind.config.ts | 23 + examples/basic/apps/web/.gitignore | 36 + examples/basic/apps/web/README.md | 18 +- examples/basic/apps/web/app/favicon.ico | Bin 8267 -> 25931 bytes .../basic/apps/web/app/fonts/GeistMonoVF.woff | Bin 0 -> 67864 bytes .../basic/apps/web/app/fonts/GeistVF.woff | Bin 0 -> 66268 bytes examples/basic/apps/web/app/globals.css | 57 +- examples/basic/apps/web/app/layout.tsx | 25 +- examples/basic/apps/web/app/page.module.css | 335 -- examples/basic/apps/web/app/page.tsx | 223 +- examples/basic/apps/web/next.config.js | 4 - examples/basic/apps/web/next.config.mjs | 4 + examples/basic/apps/web/package.json | 27 +- examples/basic/apps/web/postcss.config.mjs | 8 + examples/basic/apps/web/public/circles.svg | 17 - examples/basic/apps/web/public/file-text.svg | 3 + examples/basic/apps/web/public/globe.svg | 10 + examples/basic/apps/web/public/turborepo.svg | 32 - examples/basic/apps/web/public/vercel.svg | 11 +- examples/basic/apps/web/public/window.svg | 3 + examples/basic/apps/web/tailwind.config.ts | 23 + examples/basic/package.json | 7 +- .../basic/packages/eslint-config/library.js | 2 +- examples/basic/packages/eslint-config/next.js | 2 +- .../basic/packages/eslint-config/package.json | 2 +- .../packages/eslint-config/react-internal.js | 2 +- .../packages/ui/turbo/generators/config.ts | 2 +- examples/basic/pnpm-lock.yaml | 898 ++- examples/basic/tsconfig.json | 3 - examples/basic/turbo.json | 4 +- .../apps/docs/.storybook/main.js | 1 - examples/design-system/apps/docs/package.json | 3 +- examples/design-system/package.json | 5 +- .../packages/eslint-config/package.json | 2 +- examples/design-system/pnpm-lock.yaml | 61 +- examples/design-system/turbo.json | 15 +- examples/kitchen-sink/apps/admin/turbo.json | 10 +- examples/kitchen-sink/apps/api/turbo.json | 10 +- examples/kitchen-sink/apps/blog/turbo.json | 11 +- .../kitchen-sink/apps/storefront/turbo.json | 11 +- examples/kitchen-sink/package.json | 9 +- .../packages/config-eslint/index.js | 2 +- .../packages/config-eslint/next.js | 16 +- .../packages/config-eslint/package.json | 2 +- .../kitchen-sink/packages/logger/turbo.json | 10 +- examples/kitchen-sink/packages/ui/turbo.json | 10 +- examples/kitchen-sink/pnpm-lock.yaml | 59 +- examples/kitchen-sink/turbo.json | 31 +- examples/non-monorepo/package-lock.json | 56 +- examples/non-monorepo/package.json | 4 +- examples/non-monorepo/turbo.json | 7 +- examples/turbo.json | 2 +- examples/with-berry/package.json | 3 +- .../packages/eslint-config/library.js | 2 +- .../with-berry/packages/eslint-config/next.js | 2 +- .../packages/eslint-config/package.json | 2 +- .../packages/eslint-config/react-internal.js | 2 +- examples/with-berry/turbo.json | 2 +- examples/with-berry/yarn.lock | 100 +- .../.github/workflows/release.yml | 2 +- examples/with-changesets/package.json | 7 +- .../packages/eslint-config/library.js | 2 +- .../packages/eslint-config/next.js | 2 +- .../packages/eslint-config/package.json | 2 +- .../packages/eslint-config/react-internal.js | 2 +- examples/with-changesets/pnpm-lock.yaml | 58 +- examples/with-changesets/turbo.json | 20 +- examples/with-docker/apps/api/Dockerfile | 4 +- examples/with-docker/apps/web/Dockerfile | 4 +- examples/with-docker/package.json | 2 +- .../packages/eslint-config/library.js | 2 +- .../packages/eslint-config/next.js | 2 +- .../packages/eslint-config/package.json | 2 +- .../packages/eslint-config/react-internal.js | 2 +- .../with-docker/packages/logger/package.json | 9 +- examples/with-docker/yarn.lock | 98 +- examples/with-gatsby/apps/docs/turbo.json | 11 +- examples/with-gatsby/apps/web/turbo.json | 17 +- examples/with-gatsby/package.json | 4 +- .../packages/eslint-config/library.js | 2 +- .../packages/eslint-config/next.js | 2 +- .../packages/eslint-config/package.json | 2 +- .../packages/eslint-config/react-internal.js | 2 +- examples/with-gatsby/pnpm-lock.yaml | 59 +- examples/with-gatsby/turbo.json | 7 +- examples/with-npm/package-lock.json | 72 +- examples/with-npm/package.json | 6 +- .../packages/eslint-config/library.js | 2 +- .../with-npm/packages/eslint-config/next.js | 2 +- .../packages/eslint-config/package.json | 2 +- .../packages/eslint-config/react-internal.js | 2 +- examples/with-npm/packages/ui/turbo.json | 10 +- examples/with-npm/turbo.json | 19 +- examples/with-prisma/apps/web/package.json | 2 +- examples/with-prisma/package.json | 9 +- .../packages/config-eslint/library.js | 2 +- .../packages/config-eslint/next.js | 2 +- .../packages/config-eslint/package.json | 6 +- examples/with-prisma/turbo.json | 24 +- examples/with-prisma/yarn.lock | 2713 ++++----- .../apps/native/package.json | 4 +- .../apps/web/package.json | 4 +- examples/with-react-native-web/package.json | 5 +- .../packages/ui/package.json | 2 +- examples/with-react-native-web/turbo.json | 16 +- examples/with-react-native-web/yarn.lock | 4864 +++++++++-------- examples/with-rollup/package.json | 7 +- .../packages/config-eslint/library.js | 2 +- .../packages/config-eslint/next.js | 2 +- .../packages/config-eslint/package.json | 2 +- .../packages/config-eslint/react-internal.js | 2 +- examples/with-rollup/pnpm-lock.yaml | 464 +- examples/with-rollup/turbo.json | 12 +- examples/with-shell-commands/package.json | 4 +- examples/with-shell-commands/pnpm-lock.yaml | 44 +- examples/with-shell-commands/turbo.json | 12 +- examples/with-svelte/apps/docs/.prettierrc | 1 - examples/with-svelte/apps/web/.prettierrc | 1 - examples/with-svelte/package.json | 9 +- .../packages/config-eslint/package.json | 2 +- examples/with-svelte/pnpm-lock.yaml | 58 +- examples/with-svelte/turbo.json | 11 +- examples/with-tailwind/apps/docs/package.json | 14 +- examples/with-tailwind/apps/web/package.json | 14 +- examples/with-tailwind/package.json | 11 +- .../packages/config-eslint/next.js | 16 +- .../packages/config-eslint/package.json | 2 +- examples/with-tailwind/pnpm-lock.yaml | 308 +- examples/with-tailwind/turbo.json | 16 +- examples/with-vite/package.json | 7 +- examples/with-vite/pnpm-lock.yaml | 44 +- examples/with-vite/turbo.json | 10 +- examples/with-vue-nuxt/package.json | 4 +- .../packages/eslint-config-custom/nuxt.js | 2 +- .../eslint-config-custom/package.json | 2 +- examples/with-vue-nuxt/pnpm-lock.yaml | 58 +- examples/with-vue-nuxt/turbo.json | 16 +- examples/with-yarn/package.json | 6 +- .../packages/eslint-config/library.js | 2 +- .../with-yarn/packages/eslint-config/next.js | 2 +- .../packages/eslint-config/package.json | 6 +- .../packages/eslint-config/react-internal.js | 2 +- examples/with-yarn/packages/ui/package.json | 2 +- examples/with-yarn/packages/ui/turbo.json | 10 +- examples/with-yarn/turbo.json | 19 +- examples/with-yarn/yarn.lock | 2407 ++++---- packages/create-turbo/LICENSE | 374 +- packages/create-turbo/__tests__/index.test.ts | 32 +- packages/create-turbo/package.json | 4 +- packages/create-turbo/src/cli.ts | 3 - .../create-turbo/src/commands/create/index.ts | 11 +- .../src/transforms/official-starter.ts | 14 +- packages/create-turbo/turbo.json | 2 +- packages/devlow-bench/package.json | 5 +- packages/eslint-config-turbo/LICENSE | 374 +- packages/eslint-config-turbo/package.json | 4 +- packages/eslint-plugin-turbo/LICENSE | 374 +- .../lib/utils/calculate-inputs.ts | 11 +- packages/eslint-plugin-turbo/package.json | 4 +- packages/eslint-plugin-turbo/turbo.json | 2 +- packages/turbo-benchmark/src/generate.mjs | 6 +- packages/turbo-benchmark/turbo.json | 2 +- packages/turbo-codemod/LICENSE | 374 +- .../correct-names/package.json | 10 + .../correct-names/packages/ui/package.json | 6 + .../correct-names/packages/utils/package.json | 6 + .../duplicate-names/package.json | 10 + .../packages/apps/docs/package.json | 6 + .../packages/apps/web/package.json | 6 + .../duplicate-names/packages/ui/package.json | 6 + .../packages/utils/package.json | 6 + .../ignored-packages/package.json | 11 + .../ignored-packages/packages/ui/package.json | 5 + .../packages/utils/package.json | 6 + .../ignored-packages/pnpm-workspace.yaml | 3 + .../missing-names/package.json | 10 + .../missing-names/packages/ui/package.json | 5 + .../missing-names/packages/utils/package.json | 5 + .../migrate-dot-env/no-dot-env/package.json | 7 + .../migrate-dot-env/no-dot-env/turbo.json | 14 + .../migrate-dot-env/no-pipeline/package.json | 7 + .../migrate-dot-env/no-pipeline/turbo.json | 5 + .../no-turbo-json/package.json | 7 + .../migrate-dot-env/with-dot-env/package.json | 7 + .../migrate-dot-env/with-dot-env/turbo.json | 14 + .../workspace-configs/apps/docs/index.js | 6 + .../workspace-configs/apps/docs/package.json | 4 + .../workspace-configs/apps/docs/turbo.json | 7 + .../workspace-configs/apps/web/index.js | 6 + .../workspace-configs/apps/web/package.json | 4 + .../workspace-configs/apps/web/turbo.json | 11 + .../workspace-configs/package.json | 14 + .../workspace-configs/packages/ui/index.js | 6 + .../packages/ui/package.json | 4 + .../workspace-configs/packages/ui/turbo.json | 9 + .../workspace-configs/turbo.json | 13 + .../__fixtures__/migrate/turbo-1/package.json | 8 + .../__fixtures__/migrate/turbo-1/turbo.json | 20 + .../invalid-output-mode/package.json | 7 + .../invalid-output-mode/turbo.json | 36 + .../no-output-mode/package.json | 7 + .../no-output-mode/turbo.json | 14 + .../no-pipeline/package.json | 7 + .../rename-output-mode/no-pipeline/turbo.json | 5 + .../no-turbo-json/package.json | 7 + .../old-config/package.json | 18 + .../rename-output-mode/old-config/turbo.json | 12 + .../old-output-mode/package.json | 7 + .../old-output-mode/turbo.json | 12 + .../workspace-configs/apps/docs/index.js | 6 + .../workspace-configs/apps/docs/package.json | 4 + .../workspace-configs/apps/docs/turbo.json | 7 + .../workspace-configs/apps/web/index.js | 6 + .../workspace-configs/apps/web/package.json | 4 + .../workspace-configs/apps/web/turbo.json | 10 + .../workspace-configs/package.json | 14 + .../workspace-configs/packages/ui/index.js | 6 + .../packages/ui/package.json | 4 + .../workspace-configs/packages/ui/turbo.json | 9 + .../workspace-configs/turbo.json | 12 + .../no-turbo-json/package.json | 7 + .../rename-pipeline/root-only/important.txt | 1 + .../rename-pipeline/root-only/package.json | 1 + .../rename-pipeline/root-only/turbo.json | 9 + .../rename-pipeline/with-tasks/turbo.json | 8 + .../workspace-configs/apps/docs/index.js | 6 + .../workspace-configs/apps/docs/package.json | 4 + .../workspace-configs/apps/docs/turbo.json | 9 + .../workspace-configs/apps/web/index.js | 6 + .../workspace-configs/apps/web/package.json | 4 + .../workspace-configs/apps/web/turbo.json | 9 + .../workspace-configs/package.json | 14 + .../workspace-configs/packages/ui/index.js | 6 + .../packages/ui/package.json | 4 + .../workspace-configs/packages/ui/turbo.json | 9 + .../workspace-configs/turbo.json | 18 + .../stabilize-ui/disabled/package.json | 1 + .../stabilize-ui/disabled/turbo.json | 9 + .../stabilize-ui/enabled/package.json | 1 + .../stabilize-ui/enabled/turbo.json | 9 + .../stabilize-ui/no-config/package.json | 1 + .../stabilize-ui/no-config/turbo.json | 8 + .../stabilize-ui/no-turbo-json/package.json | 7 + .../__tests__/add-package-manager.test.ts | 32 +- .../__tests__/add-package-names.test.ts | 149 + .../__tests__/clean-globs.test.ts | 2 +- .../__tests__/create-turbo-config.test.ts | 22 +- .../__tests__/generate-package-name.test.ts | 29 + .../__tests__/migrate-dot-env.test.ts | 313 ++ .../migrate-env-var-dependencies.test.ts | 25 +- .../turbo-codemod/__tests__/migrate.test.ts | 118 +- .../__tests__/rename-output-mode.test.ts | 390 ++ .../__tests__/rename-pipeline.ts | 166 + .../__tests__/set-default-outputs.test.ts | 20 +- .../__tests__/stabilize-env-mode.test.ts | 20 +- .../__tests__/stabilize-ui.test.ts | 130 + ...ransform-env-literals-to-wildcards.test.ts | 12 +- .../turbo-codemod/__tests__/transform.test.ts | 10 +- packages/turbo-codemod/package.json | 5 +- packages/turbo-codemod/src/cli.ts | 12 +- .../src/commands/migrate/index.ts | 6 +- .../steps/getTransformsForMigration.ts | 16 +- .../src/commands/transform/index.ts | 2 +- packages/turbo-codemod/src/runner/Runner.ts | 2 +- .../src/transforms/add-package-manager.ts | 4 +- .../src/transforms/add-package-names.ts | 127 + .../src/transforms/clean-globs.ts | 26 +- .../src/transforms/create-turbo-config.ts | 4 +- .../src/transforms/migrate-dot-env.ts | 109 + .../migrate-env-var-dependencies.ts | 18 +- .../src/transforms/rename-output-mode.ts | 95 + .../src/transforms/rename-pipeline.ts | 75 + .../src/transforms/set-default-outputs.ts | 23 +- .../src/transforms/stabilize-env-mode.ts | 16 +- .../src/transforms/stabilize-ui.ts | 63 + .../transform-env-literals-to-wildcards.ts | 17 +- packages/turbo-codemod/src/types.ts | 3 +- .../turbo-codemod/src/utils/loadTurboJson.ts | 7 + packages/turbo-codemod/src/utils/logger.ts | 2 +- .../generators/templates/transformer.hbs | 15 +- packages/turbo-exe-stub/turbo.json | 2 +- packages/turbo-gen/LICENSE | 374 +- packages/turbo-gen/package.json | 4 +- packages/turbo-gen/turbo.json | 2 +- .../invalid_turbo_json/package.json | 11 + .../invalid_turbo_json/turbo.json | 3 + .../__fixtures__/no_turbo_deps/package.json | 11 + .../__fixtures__/no_turbo_deps/turbo.json | 6 + .../no_turbo_deps_v1/package.json | 11 + .../__fixtures__/no_turbo_deps_v1/turbo.json | 5 + .../__fixtures__/turbo_in_deps/package.json | 14 + .../__fixtures__/turbo_in_deps/turbo.json | 5 + .../__tests__/getTurboVersion.test.ts | 69 + .../turbo-ignore/__tests__/ignore.test.ts | 67 +- packages/turbo-ignore/package.json | 7 +- packages/turbo-ignore/src/cli.ts | 6 + packages/turbo-ignore/src/getTurboVersion.ts | 56 + packages/turbo-ignore/src/ignore.ts | 8 +- packages/turbo-ignore/src/types.ts | 2 + packages/turbo-repository/js/package.json | 2 +- .../npm/darwin-arm64/package.json | 2 +- .../npm/darwin-x64/package.json | 2 +- .../npm/linux-arm64-gnu/package.json | 2 +- .../npm/linux-arm64-musl/package.json | 2 +- .../npm/linux-x64-gnu/package.json | 2 +- .../npm/linux-x64-musl/package.json | 2 +- .../npm/win32-arm64-msvc/package.json | 2 +- .../npm/win32-x64-msvc/package.json | 2 +- packages/turbo-repository/package.json | 2 +- packages/turbo-repository/rust/Cargo.toml | 2 +- packages/turbo-repository/turbo.json | 2 +- packages/turbo-telemetry/LICENSE | 374 +- packages/turbo-telemetry/package.json | 2 +- packages/turbo-test-utils/package.json | 2 +- packages/turbo-types/package.json | 4 +- packages/turbo-types/src/index.ts | 1 + packages/turbo-types/src/types/config.ts | 48 +- packages/turbo-types/turbo.json | 2 +- packages/turbo-utils/LICENSE | 374 +- .../common/old-workspace-config/turbo.json | 2 +- .../common/single-package/turbo.json | 2 +- .../workspace-configs/apps/web/turbo.json | 2 +- .../workspace-configs/packages/ui/turbo.json | 2 +- .../packages/utils/turbo.json | 2 +- .../common/workspace-configs/turbo.json | 2 +- .../__tests__/getTurboConfigs.test.ts | 10 +- packages/turbo-utils/package.json | 2 +- packages/turbo-utils/src/getTurboConfigs.ts | 21 +- packages/turbo-utils/src/index.ts | 6 +- packages/turbo-vsc/ARCHITECTURE.md | 155 + packages/turbo-vsc/LICENSE | 374 +- packages/turbo-vsc/package.json | 2 +- packages/turbo-vsc/src/extension.ts | 44 +- packages/turbo-workspaces/LICENSE | 374 +- packages/turbo-workspaces/package.json | 4 +- packages/turbo-workspaces/src/utils.ts | 7 +- packages/turbo-workspaces/turbo.json | 2 +- packages/turbo/package.json | 16 +- pnpm-lock.yaml | 7 + rust-toolchain.toml | 2 +- turbo.json | 5 +- turborepo-tests/example-basic/turbo.json | 2 +- .../example-design-system/turbo.json | 2 +- .../example-kitchen-sink/turbo.json | 2 +- .../example-non-monorepo/turbo.json | 2 +- turborepo-tests/example-with-berry/turbo.json | 2 +- .../example-with-changesets/turbo.json | 2 +- turborepo-tests/example-with-npm/turbo.json | 2 +- .../example-with-react-native-web/turbo.json | 2 +- .../example-with-rollup/turbo.json | 2 +- .../example-with-svelte/turbo.json | 2 +- .../example-with-tailwind/turbo.json | 2 +- turborepo-tests/example-with-vite/turbo.json | 2 +- turborepo-tests/example-with-yarn/turbo.json | 2 +- turborepo-tests/helpers/setup.sh | 2 + turborepo-tests/helpers/setup_example_test.sh | 1 + .../helpers/setup_integration_test.sh | 8 +- turborepo-tests/helpers/turbo.json | 2 +- .../fixtures/basic_monorepo/turbo.json | 6 +- .../apps/add-keys/turbo.json | 21 +- .../apps/add-tasks/turbo.json | 2 +- .../composable_config/apps/cached/turbo.json | 2 +- .../apps/config-change/turbo-changed.json | 2 +- .../apps/config-change/turbo.json | 2 +- .../apps/cross-workspace/turbo.json | 2 +- .../apps/invalid-config/turbo.json | 2 +- .../apps/omit-keys/turbo.json | 2 +- .../apps/override-values/turbo.json | 17 +- .../apps/persistent/turbo.json | 2 +- .../packages/blank-pkg/turbo.json | 2 +- .../fixtures/composable_config/turbo.json | 100 +- .../integration/fixtures/dir_globs/.gitignore | 3 + .../dir_globs/apps/my-app/package.json | 10 + .../fixtures/dir_globs/package.json | 10 + .../dir_globs/packages/util/package.json | 6 + .../dir_globs/packages/util/src/boo.txt | 1 + .../integration/fixtures/dir_globs/turbo.json | 9 + .../fixtures/framework_inference/turbo.json | 2 +- .../fixtures/global_deps/README.md | 3 + .../fixtures/global_deps/turbo.json | 6 +- .../packages/ui-library/turbo.json | 2 +- .../inference/has_workspaces/turbo.json | 2 +- .../outer-no-turbo/inner/turbo.json | 2 +- .../nested_workspaces/outer/inner/turbo.json | 2 +- .../nested_workspaces/outer/turbo.json | 2 +- .../lockfile_aware_caching/turbo.json | 9 +- .../monorepo_dependency_error/turbo.json | 2 +- .../monorepo_one_script_error/turbo.json | 2 +- .../apps/docs/turbo.json | 2 +- .../monorepo_with_root_dep/turbo.json | 5 +- .../fixtures/nested_packages/turbo.json | 2 +- .../integration/fixtures/ordered/turbo.json | 2 +- .../1-topological/turbo.json | 2 +- .../10-too-many/turbo.json | 2 +- .../2-same-workspace/turbo.json | 2 +- .../3-workspace-specific/turbo.json | 2 +- .../4-cross-workspace/turbo.json | 2 +- .../5-root-workspace/turbo.json | 2 +- .../6-topological-unimplemented/turbo.json | 2 +- .../7-topological-nested/turbo.json | 2 +- .../8-topological-with-extra/turbo.json | 2 +- .../9-cross-workspace-nested/turbo.json | 2 +- .../integration/fixtures/root_deps/.gitignore | 4 + .../root_deps/apps/my-app/package.json | 9 + .../fixtures/root_deps/package.json | 11 + .../root_deps/packages/another/package.json | 6 + .../root_deps/packages/util/package.json | 6 + .../packages/yet-another/package.json | 6 + .../integration/fixtures/root_deps/turbo.json | 12 + .../fixtures/run_logging/turbo.json | 7 +- .../fixtures/single_package/turbo.json | 2 +- .../fixtures/strict_env_vars/turbo.json | 2 +- .../task_dependencies/complex/turbo.json | 2 +- .../task_dependencies/overwriting/turbo.json | 2 +- .../root-to-workspace/turbo.json | 6 +- .../task_dependencies/topological/turbo.json | 2 +- .../workspace-tasks/turbo.json | 2 +- .../turbo-configs/abs-path-inputs-win.json | 2 +- .../turbo-configs/abs-path-inputs.json | 2 +- .../turbo-configs/abs-path-outputs-win.json | 2 +- .../turbo-configs/abs-path-outputs.json | 2 +- .../turbo-configs/gitignored-inputs.json | 2 +- .../fixtures/turbo-configs/interactive.json | 2 +- .../turbo-configs/invalid-env-var.json | 4 +- .../fixtures/turbo-configs/package-task.json | 4 +- .../fixtures/turbo-configs/parse-error.json | 4 +- .../turbo-configs/spaces-failure.json | 4 +- .../turbo-configs/strict_env_vars/all.json | 2 +- .../strict_env_vars/global_pt-empty.json | 2 +- .../strict_env_vars/global_pt.json | 2 +- .../strict_env_vars/task_pt-empty.json | 2 +- .../strict_env_vars/task_pt.json | 2 +- .../fixtures/turbo-configs/syntax-error.json | 4 +- .../fixtures/with-pkg-deps/turbo.json | 6 +- turborepo-tests/integration/tests/bad-flag.t | 2 +- .../integration/tests/bad-turbo-json.t | 6 +- .../integration/tests/conflicting-flags.t | 37 - .../tests/dry-json/monorepo-no-changes.t | 12 +- .../integration/tests/dry-json/monorepo.t | 36 +- .../tests/dry-json/single-package-no-change.t | 2 +- .../tests/dry-json/single-package-no-config.t | 23 +- .../tests/dry-json/single-package-with-deps.t | 39 +- .../tests/dry-json/single-package.t | 25 +- turborepo-tests/integration/tests/dry-run.t | 14 +- .../fixture-configs/1-baseline.json | 2 +- .../fixture-configs/2-update-pipeline.json | 2 +- .../fixture-configs/3-update-global-env.json | 2 +- .../fixture-configs/4-update-global-deps.json | 2 +- .../5-update-global-deps-materially.json | 2 +- .../6-update-passthrough-env.json | 2 +- .../fixture-configs/a-baseline.json | 2 +- .../fixture-configs/b-change-only-my-app.json | 2 +- .../fixture-configs/c-my-app-depends-on.json | 2 +- .../fixture-configs/d-depends-on-util.json | 2 +- .../e-depends-on-util-but-modified.json | 2 +- .../integration/tests/edit-turbo-json/task.t | 30 +- turborepo-tests/integration/tests/engines.t | 21 + .../integration/tests/filter-run.t | 5 + .../integration/tests/find-turbo/setup.sh | 1 + .../integration/tests/global-deps.t | 15 +- .../integration/tests/global-env.t | 10 +- .../tests/inference/has-workspaces.t | 15 +- .../tests/inference/nested-workspaces.t | 18 +- .../tests/inference/no-workspaces.t | 31 +- .../integration/tests/invalid-package-json.t | 9 + .../tests/lockfile-aware-caching/setup.sh | 2 + turborepo-tests/integration/tests/no-args.t | 13 +- .../integration/tests/package-manager.t | 45 - .../6-topological-unimplemented.t | 2 +- .../integration/tests/pkg-inference.t | 2 +- .../tests/prune/composable-config.t | 2 +- .../tests/prune/produces-valid-turbo-json.t | 5 +- .../integration/tests/prune/resolutions.t | 1 + .../integration/tests/prune/yarn-pnp.t | 1 + .../tests/run-caching/cache-state.t | 2 +- .../excluded-inputs/excluded-inputs.t | 4 +- .../run-caching/excluded-inputs/turbo.json | 2 +- .../integration/tests/run-caching/root-deps.t | 87 + .../tests/run-logging/errors-only.t | 12 +- .../tests/run-logging/log-order-github.t | 8 +- .../tests/run-logging/log-prefix.t | 6 +- .../integration/tests/run-logging/verbosity.t | 4 +- .../integration/tests/run-summary/discovery.t | 2 +- .../integration/tests/run-summary/error.t | 8 +- .../tests/run-summary/single-package.t | 1 - .../tests/run-summary/strict-env.t | 8 +- .../integration/tests/run/continue.t | 9 +- turborepo-tests/integration/tests/run/force.t | 26 +- .../integration/tests/run/gitignored-inputs.t | 4 +- turborepo-tests/integration/tests/run/globs.t | 39 + .../integration/tests/run/one-script-error.t | 14 +- .../tests/run/single-package/dry-run.t | 21 +- .../tests/run/single-package/no-config.t | 35 +- .../tests/run/single-package/run-yarn.t | 6 +- .../tests/run/single-package/run.t | 6 +- .../run/single-package/with-deps-dry-run.t | 38 +- .../tests/run/single-package/with-deps-run.t | 12 +- .../tests/strict-env-vars/usage-infer.t | 44 - .../tests/task-dependencies/overwriting.t | 6 +- .../{root-worksapce.t => root-workspace.t} | 6 +- .../tests/task-dependencies/topological.t | 4 +- .../integration/tests/turbo-help.t | 30 +- .../tests/workspace-configs/add-keys.t | 22 +- .../tests/workspace-configs/add-tasks.t | 4 +- .../tests/workspace-configs/bad-json.t | 2 +- .../tests/workspace-configs/cache.t | 16 +- .../tests/workspace-configs/config-change.t | 6 +- .../tests/workspace-configs/cross-workspace.t | 4 +- .../missing-workspace-config-deps.t | 6 +- .../missing-workspace-config.t | 16 +- .../tests/workspace-configs/omit-keys-deps.t | 8 +- .../tests/workspace-configs/omit-keys.t | 12 +- .../workspace-configs/override-values-deps.t | 8 +- .../tests/workspace-configs/override-values.t | 16 +- .../tests/workspace-configs/persistent.t | 44 +- turborepo-tests/integration/turbo.json | 2 +- version.txt | 4 +- 1398 files changed, 48114 insertions(+), 27817 deletions(-) create mode 100644 .prettierrc create mode 100644 crates/turbo-prehash/Cargo.toml create mode 100644 crates/turbo-prehash/src/lib.rs create mode 100644 crates/turbo-static/.gitignore create mode 100644 crates/turbo-static/Cargo.toml create mode 100644 crates/turbo-static/readme.md create mode 100644 crates/turbo-static/src/call_resolver.rs create mode 100644 crates/turbo-static/src/identifier.rs create mode 100644 crates/turbo-static/src/lsp_client.rs create mode 100644 crates/turbo-static/src/main.rs create mode 100644 crates/turbo-static/src/visitor.rs delete mode 100644 crates/turbo-tasks-hash/src/base16.rs create mode 100644 crates/turbo-tasks/src/rcstr.rs delete mode 100644 crates/turbopack-core/src/issue/unsupported_module.rs create mode 100644 crates/turbopack-ecmascript-plugins/src/transform/directives/client_disallowed.rs create mode 100644 crates/turbopack-ecmascript/src/references/external_module.rs create mode 100644 crates/turbopack-ecmascript/src/tree_shake/cjs_finder.rs create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/app-route/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/combined-export/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/combined-export/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/export-named/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-1/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-1/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-2/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/failed-3/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/grouping/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/grouping/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-evaluate/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/ipc-index/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/multi-export/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-globals/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/node-globals/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-kind/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/route-kind/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-2/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/shared-and-side-effects/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple-vars-1/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/simple-vars-1/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/template-pages/output.md rename crates/{turbopack-tests/tests/execution/turbopack/tree-shaking/side-effects/input/node_modules/package-reexport-tla-side-effect/check-side-effect.js => turbopack-ecmascript/tests/tree-shaker/analyzer/tla-1/input.js} (100%) create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/tla-1/output.md create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/input.js create mode 100644 crates/turbopack-ecmascript/tests/tree-shaker/analyzer/write-order/output.md delete mode 100644 crates/turbopack-node/src/bootstrap.rs delete mode 100644 crates/turbopack-tests/js/jest-runtime.ts create mode 100644 crates/turbopack-tests/js/types.d.ts create mode 100644 crates/turbopack-tests/tests/execution/turbopack/async-modules/esm-external/input/index.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/async-modules/esm-external/node_modules/package/index.mjs create mode 100644 crates/turbopack-tests/tests/execution/turbopack/async-modules/esm-external/node_modules/package/package.json create mode 100644 crates/turbopack-tests/tests/execution/turbopack/async-modules/pack-3039-top-level-await/input/index.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/async-modules/pack-3039-top-level-await/input/repro.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/async-modules/pack-3039-top-level-await/input/wrapper.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/minification/paren-remover/input/index.js rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/index.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-full/a.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-full/b.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-full/c.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-full/default.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-full/index.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/mui-utils/node_modules/mui-material => side-effects-optimization/basic/input/node_modules/package-full}/package.json (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-full/x.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-named/a.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-named/b.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-named/default.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-named/index.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-named/not-compiled.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-named/not-executed.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/mui-utils/node_modules/mui-utils => side-effects-optimization/basic/input/node_modules/package-named}/package.json (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-named/x.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-named/y.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-partial/a.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-partial/b.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-partial/dir/file.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-partial/effect.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-partial/file.side.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-partial/index.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-partial/not-compiled.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-partial/not-executed.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-partial/package.json (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-reexport-side-effect/check-side-effect.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-reexport-side-effect/index.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-reexport-side-effect/package.json (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-reexport-side-effect/side-effect.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-reexport-side-effect/side-effect2.js (100%) create mode 100644 crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-reexport-tla-side-effect/check-side-effect.js rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-reexport-tla-side-effect/index.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-reexport-tla-side-effect/package.json (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-reexport-tla-side-effect/side-effect.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-reexport-tla-side-effect/side-effect2.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-reexport-unused/index.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-reexport-unused/package.json (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-reexport/index.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-reexport/package.json (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-require-side-effect/check-side-effect.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-require-side-effect/index.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-require-side-effect/package.json (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-require-side-effect/side-effect.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-require-side-effect/side-effect2.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-star/a.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-star/b.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-star/index.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-star/not-compiled.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/package-star/not-executed.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects/input/node_modules/package-full => side-effects-optimization/basic/input/node_modules/package-star}/package.json (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/tla/both.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/tla/local.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects/input/node_modules/package-named => side-effects-optimization/basic/input/node_modules/tla}/package.json (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/tla/reexport.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/tla/reexported.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/input/node_modules/tla/tla-reexported.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects => side-effects-optimization/basic}/options.json (100%) create mode 100644 crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/mui-utils/input/index.js rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking => side-effects-optimization}/mui-utils/node_modules/mui-material/generateUtilityClass/index.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects/input/node_modules/package-star => side-effects-optimization/mui-utils/node_modules/mui-material}/package.json (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking => side-effects-optimization}/mui-utils/node_modules/mui-utils/generateUtilityClass/generateUtilityClass.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking => side-effects-optimization}/mui-utils/node_modules/mui-utils/generateUtilityClass/index.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking => side-effects-optimization}/mui-utils/node_modules/mui-utils/index.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking => side-effects-optimization}/mui-utils/node_modules/mui-utils/not-correct.js (100%) rename crates/turbopack-tests/tests/execution/turbopack/{tree-shaking/side-effects/input/node_modules/tla => side-effects-optimization/mui-utils/node_modules/mui-utils}/package.json (100%) create mode 100644 crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/mui-utils/options.json create mode 100644 crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/namespace-object-identity/input/esm.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/namespace-object-identity/input/index.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/namespace-object-identity/options.json create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/.basic/input/index.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/.basic/options.json create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/duplicate-modules/input/cjs.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/duplicate-modules/input/esm.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/duplicate-modules/input/index.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/duplicate-modules/options.json create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/no-write-access/input/esm.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/no-write-access/input/index.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/no-write-access/options.json create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/split-chunks-shared-state/input/a.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/split-chunks-shared-state/input/b.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/split-chunks-shared-state/input/index.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/split-chunks-shared-state/input/module.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/split-chunks-shared-state/input/order.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/split-chunks-shared-state/options.json create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/split-chunks/input/a.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/split-chunks/input/b.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/split-chunks/input/index.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/split-chunks/input/module.js create mode 100644 crates/turbopack-tests/tests/execution/turbopack/tree-shaking/split-chunks/options.json create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/.reexport-unknown/input/async-unknown.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/.reexport-unknown/input/index.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/.reexport-unknown/input/reexport-async-unknown.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/.reexport-unknown/input/test.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/.reexport-unknown/input/unknown.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/double-import/input/a.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/double-import/input/b.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/double-import/input/index.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/double-import/input/main.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/double-import/input/shared.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/issue-16097/input/index.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/issue-16097/input/won't-run-tla.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-a/a.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-a/async.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-a/async2.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-a/b.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-a/c.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-a/d.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-a/e.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-a/f.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-b/a.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-b/async.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-b/b.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-b/c.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-b/d.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-b/e.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-c/a.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-c/b.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-d/a.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-d/b.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-d/c.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-d/index.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-d/x.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-d/y.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-e/a.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-e/async.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-e/b.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-e/index.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/case-e/x.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/index.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/micro-ticks-parents/input/tick.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/runtime-performance/input/async.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/runtime-performance/input/index.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/runtime-performance/input/loader.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/top-level-await/input/index.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/top-level-await/input/module.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/top-level-await/input/reexport.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/top-level-error/input/counter.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/top-level-error/input/index.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/top-level-error/input/main.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/top-level-error/input/module.js create mode 100644 crates/turbopack-tests/tests/execution/webpack/async-modules/top-level-error/input/reexport.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/index.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/lib.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/options.json create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_029950.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_029950.js.map create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_a8786a.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_a8786a.js.map create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/a587c_tests_snapshot_basic-tree-shake_dynamic-import_input_index_26d958.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/a587c_tests_snapshot_basic-tree-shake_dynamic-import_input_index_26d958.js.map create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/index.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/lib.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/input/module.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/options.json create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_0f4a04._.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_export-named_input_0f4a04._.js.map create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/index.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/lib.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/input/module.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/options.json create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_086000._.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/export-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_export-namespace_input_086000._.js.map create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/index.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/input/lib.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/options.json create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_b950f0._.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named-all/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-named-all_input_b950f0._.js.map create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/index.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/input/lib.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/options.json create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_b153a7._.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-named/output/crates_turbopack-tests_tests_snapshot_basic-tree-shake_import-named_input_b153a7._.js.map create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/index.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/input/lib.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/options.json create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_bf8716._.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-namespace/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-namespace_input_bf8716._.js.map create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/index.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/input/lib.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/options.json create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_4d9584._.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/import-side-effect/output/79fb1_turbopack-tests_tests_snapshot_basic-tree-shake_import-side-effect_input_4d9584._.js.map create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/index.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/input/lib.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/options.json create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_050f3c._.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/require-side-effect/output/a587c_tests_snapshot_basic-tree-shake_require-side-effect_input_050f3c._.js.map create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/input/index.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/options.json create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2c45e0.js create mode 100644 crates/turbopack-tests/tests/snapshot/basic-tree-shake/tree-shake-test-1/output/a587c_tests_snapshot_basic-tree-shake_tree-shake-test-1_input_index_2c45e0.js.map create mode 100644 crates/turbopack-tests/tests/snapshot/mdx/error/output/crates_turbopack-tests_tests_snapshot_mdx_error_input_index_743c8b.js create mode 100644 crates/turbopack-tests/tests/snapshot/mdx/error/output/crates_turbopack-tests_tests_snapshot_mdx_error_input_index_743c8b.js.map create mode 100644 crates/turbopack-tests/tests/snapshot/mdx/error/output/crates_turbopack-tests_tests_snapshot_mdx_error_input_index_a3c4fd.js create mode 100644 crates/turbopack-tests/tests/snapshot/mdx/error/output/crates_turbopack-tests_tests_snapshot_mdx_error_input_index_a3c4fd.js.map create mode 100644 crates/turbopack-tests/tests/snapshot/minification/paren-remover/input/index.js create mode 100644 crates/turbopack-tests/tests/snapshot/minification/paren-remover/options.json create mode 100644 crates/turbopack-tests/tests/snapshot/minification/paren-remover/output/79fb1_turbopack-tests_tests_snapshot_minification_paren-remover_input_index_80e2cf.js create mode 100644 crates/turbopack-tests/tests/snapshot/minification/paren-remover/output/79fb1_turbopack-tests_tests_snapshot_minification_paren-remover_input_index_80e2cf.js.map create mode 100644 crates/turbopack-tests/tests/snapshot/minification/paren-remover/output/79fb1_turbopack-tests_tests_snapshot_minification_paren-remover_input_index_eab450.js create mode 100644 crates/turbopack-tests/tests/snapshot/minification/paren-remover/output/79fb1_turbopack-tests_tests_snapshot_minification_paren-remover_input_index_eab450.js.map create mode 100644 crates/turborepo-lib/fixtures/local_config/turbo.v1.json create mode 100644 crates/turborepo-lib/fixtures/local_config/turbo.v2.json create mode 100644 crates/turborepo-lib/fixtures/local_config/turbov2.package-lock.json create mode 100644 crates/turborepo-lib/src/panic_handler.rs delete mode 100644 crates/turborepo-lib/src/shim.rs create mode 100644 crates/turborepo-lib/src/shim/local_turbo_config.rs create mode 100644 crates/turborepo-lib/src/shim/local_turbo_state.rs create mode 100644 crates/turborepo-lib/src/shim/mod.rs create mode 100644 crates/turborepo-lib/src/shim/parser.rs create mode 100644 crates/turborepo-lib/src/shim/turbo_state.rs create mode 100644 crates/turborepo-lockfiles/fixtures/pnpm6turbo.yaml create mode 100644 crates/turborepo-lockfiles/fixtures/pnpm8turbo.yaml delete mode 100644 crates/turborepo/src/panic_handler.rs rename docs/{pages/pack/docs => pack-docs}/advanced/profiling.mdx (92%) create mode 100644 docs/pack-docs/benchmarks.mdx rename docs/{pages/pack/docs => pack-docs}/core-concepts.mdx (99%) rename docs/{pages/pack/docs => pack-docs}/features/css.mdx (83%) rename docs/{pages/pack/docs => pack-docs}/features/dev-server.mdx (92%) rename docs/{pages/pack/docs => pack-docs}/features/frameworks.mdx (86%) rename docs/{pages/pack/docs => pack-docs}/features/imports.mdx (78%) create mode 100644 docs/pack-docs/features/index.mdx rename docs/{pages/pack/docs => pack-docs}/features/javascript.mdx (76%) create mode 100644 docs/pack-docs/features/meta.json rename docs/{pages/pack/docs => pack-docs}/features/static-assets.mdx (72%) rename docs/{pages/pack/docs => pack-docs}/features/typescript.mdx (81%) rename docs/{pages/pack/docs => pack-docs}/index.mdx (65%) create mode 100644 docs/pack-docs/meta.json rename docs/{pages/pack/docs => pack-docs}/migrating-from-webpack.mdx (92%) rename docs/{pages/pack/docs => pack-docs}/roadmap.mdx (74%) rename docs/{pages/pack/docs => pack-docs}/why-turbopack.mdx (99%) delete mode 100644 docs/pages/messages/_meta.json delete mode 100644 docs/pages/pack/_meta.json delete mode 100644 docs/pages/pack/docs/_meta.json delete mode 100644 docs/pages/pack/docs/benchmarks.mdx delete mode 100644 docs/pages/pack/docs/features.mdx delete mode 100644 docs/pages/pack/docs/features/_meta.json delete mode 100644 docs/pages/pack/index.mdx delete mode 100644 docs/pages/repo/_meta.json delete mode 100644 docs/pages/repo/docs/_meta.json delete mode 100644 docs/pages/repo/docs/ci.mdx delete mode 100644 docs/pages/repo/docs/ci/_meta.json delete mode 100644 docs/pages/repo/docs/core-concepts/_meta.json delete mode 100644 docs/pages/repo/docs/core-concepts/caching.mdx delete mode 100644 docs/pages/repo/docs/core-concepts/caching/_meta.json delete mode 100644 docs/pages/repo/docs/core-concepts/caching/environment-variable-inputs.mdx delete mode 100644 docs/pages/repo/docs/core-concepts/caching/file-inputs.mdx delete mode 100644 docs/pages/repo/docs/core-concepts/caching/to-cache-or-not-to-cache.mdx delete mode 100644 docs/pages/repo/docs/core-concepts/caching/what-to-cache.mdx delete mode 100644 docs/pages/repo/docs/core-concepts/monorepos.mdx delete mode 100644 docs/pages/repo/docs/core-concepts/monorepos/_meta.json delete mode 100644 docs/pages/repo/docs/core-concepts/monorepos/configuring-workspaces.mdx delete mode 100644 docs/pages/repo/docs/core-concepts/monorepos/filtering.mdx delete mode 100644 docs/pages/repo/docs/core-concepts/monorepos/running-tasks.mdx delete mode 100644 docs/pages/repo/docs/core-concepts/monorepos/task-dependencies.mdx delete mode 100644 docs/pages/repo/docs/core-concepts/remote-caching.mdx delete mode 100644 docs/pages/repo/docs/core-concepts/scopes.mdx delete mode 100644 docs/pages/repo/docs/faq.mdx delete mode 100644 docs/pages/repo/docs/getting-started/_meta.json delete mode 100644 docs/pages/repo/docs/getting-started/add-to-project.mdx delete mode 100644 docs/pages/repo/docs/getting-started/create-new.mdx delete mode 100644 docs/pages/repo/docs/getting-started/existing-monorepo.mdx delete mode 100644 docs/pages/repo/docs/getting-started/from-example.mdx delete mode 100644 docs/pages/repo/docs/handbook.mdx delete mode 100644 docs/pages/repo/docs/handbook/_meta.json delete mode 100644 docs/pages/repo/docs/handbook/building-your-app.mdx delete mode 100644 docs/pages/repo/docs/handbook/dev.mdx delete mode 100644 docs/pages/repo/docs/handbook/environment-variables.mdx delete mode 100644 docs/pages/repo/docs/handbook/linting.mdx delete mode 100644 docs/pages/repo/docs/handbook/linting/_meta.json delete mode 100644 docs/pages/repo/docs/handbook/linting/eslint.mdx delete mode 100644 docs/pages/repo/docs/handbook/linting/typescript.mdx delete mode 100644 docs/pages/repo/docs/handbook/migrating-to-a-monorepo.mdx delete mode 100644 docs/pages/repo/docs/handbook/package-installation.mdx delete mode 100644 docs/pages/repo/docs/handbook/publishing-packages.mdx delete mode 100644 docs/pages/repo/docs/handbook/publishing-packages/_meta.json delete mode 100644 docs/pages/repo/docs/handbook/publishing-packages/bundling.mdx delete mode 100644 docs/pages/repo/docs/handbook/publishing-packages/versioning-and-publishing.mdx delete mode 100644 docs/pages/repo/docs/handbook/sharing-code.mdx delete mode 100644 docs/pages/repo/docs/handbook/sharing-code/_meta.json delete mode 100644 docs/pages/repo/docs/handbook/sharing-code/internal-packages.mdx delete mode 100644 docs/pages/repo/docs/handbook/testing.mdx delete mode 100644 docs/pages/repo/docs/handbook/tools/_meta.json delete mode 100644 docs/pages/repo/docs/handbook/tools/prisma.mdx delete mode 100644 docs/pages/repo/docs/handbook/tools/storybook.mdx delete mode 100644 docs/pages/repo/docs/handbook/troubleshooting.mdx delete mode 100644 docs/pages/repo/docs/handbook/what-is-a-monorepo.mdx delete mode 100644 docs/pages/repo/docs/handbook/workspaces.mdx delete mode 100644 docs/pages/repo/docs/index.mdx delete mode 100644 docs/pages/repo/docs/installing.mdx delete mode 100644 docs/pages/repo/docs/reference/_meta.json delete mode 100644 docs/pages/repo/docs/reference/codemods.mdx delete mode 100644 docs/pages/repo/docs/reference/command-line-reference.mdx delete mode 100644 docs/pages/repo/docs/reference/command-line-reference/_meta.json delete mode 100644 docs/pages/repo/docs/reference/command-line-reference/bin.mdx delete mode 100644 docs/pages/repo/docs/reference/command-line-reference/gen.mdx delete mode 100644 docs/pages/repo/docs/reference/command-line-reference/link.mdx delete mode 100644 docs/pages/repo/docs/reference/command-line-reference/login.mdx delete mode 100644 docs/pages/repo/docs/reference/command-line-reference/logout.mdx delete mode 100644 docs/pages/repo/docs/reference/command-line-reference/prune.mdx delete mode 100644 docs/pages/repo/docs/reference/command-line-reference/run.mdx delete mode 100644 docs/pages/repo/docs/reference/command-line-reference/scan.mdx delete mode 100644 docs/pages/repo/docs/reference/command-line-reference/telemetry.mdx delete mode 100644 docs/pages/repo/docs/reference/command-line-reference/unlink.mdx delete mode 100644 docs/pages/repo/docs/reference/configuration.mdx delete mode 100644 docs/pages/repo/docs/support.mdx delete mode 100644 docs/pages/repo/docs/troubleshooting.mdx delete mode 100644 docs/pages/repo/docs/upgrading-to-v1.mdx delete mode 100644 docs/pages/repo/index.mdx delete mode 100644 docs/public/schema.json rename docs/{pages/repo/docs/acknowledgements.mdx => repo-docs/acknowledgments.mdx} (83%) create mode 100644 docs/repo-docs/community.mdx create mode 100644 docs/repo-docs/core-concepts/index.mdx create mode 100644 docs/repo-docs/core-concepts/internal-packages.mdx create mode 100644 docs/repo-docs/core-concepts/meta.json rename docs/{pages/repo/docs/core-concepts/monorepos/task-graph.mdx => repo-docs/core-concepts/package-and-task-graph.mdx} (68%) create mode 100644 docs/repo-docs/core-concepts/package-types.mdx create mode 100644 docs/repo-docs/core-concepts/remote-caching.mdx create mode 100644 docs/repo-docs/crafting-your-repository/caching.mdx create mode 100644 docs/repo-docs/crafting-your-repository/configuring-tasks.mdx create mode 100644 docs/repo-docs/crafting-your-repository/constructing-ci.mdx create mode 100644 docs/repo-docs/crafting-your-repository/creating-an-internal-package.mdx create mode 100644 docs/repo-docs/crafting-your-repository/developing-applications.mdx create mode 100644 docs/repo-docs/crafting-your-repository/index.mdx create mode 100644 docs/repo-docs/crafting-your-repository/managing-dependencies.mdx create mode 100644 docs/repo-docs/crafting-your-repository/meta.json create mode 100644 docs/repo-docs/crafting-your-repository/running-tasks.mdx create mode 100644 docs/repo-docs/crafting-your-repository/structuring-a-repository.mdx create mode 100644 docs/repo-docs/crafting-your-repository/upgrading.mdx create mode 100644 docs/repo-docs/crafting-your-repository/using-environment-variables.mdx create mode 100644 docs/repo-docs/getting-started/add-to-existing-repository.mdx create mode 100644 docs/repo-docs/getting-started/editor-integration.mdx create mode 100644 docs/repo-docs/getting-started/index.mdx create mode 100644 docs/repo-docs/getting-started/installation.mdx create mode 100644 docs/repo-docs/getting-started/meta.json create mode 100644 docs/repo-docs/getting-started/support-policy.mdx rename docs/{pages/repo/docs/ci => repo-docs/guides/ci-vendors}/circleci.mdx (69%) rename docs/{pages/repo/docs/ci => repo-docs/guides/ci-vendors}/github-actions.mdx (65%) rename docs/{pages/repo/docs/ci/gitlabci.mdx => repo-docs/guides/ci-vendors/gitlab-ci.mdx} (83%) create mode 100644 docs/repo-docs/guides/ci-vendors/index.mdx create mode 100644 docs/repo-docs/guides/ci-vendors/meta.json rename docs/{pages/repo/docs/ci/travisci.mdx => repo-docs/guides/ci-vendors/travis-ci.mdx} (85%) rename docs/{pages/repo/docs/ci => repo-docs/guides/ci-vendors}/vercel.mdx (62%) create mode 100644 docs/repo-docs/guides/frameworks/index.mdx create mode 100644 docs/repo-docs/guides/frameworks/meta.json create mode 100644 docs/repo-docs/guides/frameworks/nextjs.mdx create mode 100644 docs/repo-docs/guides/frameworks/nuxt.mdx create mode 100644 docs/repo-docs/guides/frameworks/sveltekit.mdx create mode 100644 docs/repo-docs/guides/frameworks/vite.mdx rename docs/{pages/repo/docs/core-concepts/monorepos/code-generation.mdx => repo-docs/guides/generating-code.mdx} (51%) create mode 100644 docs/repo-docs/guides/handling-platforms.mdx create mode 100644 docs/repo-docs/guides/index.mdx create mode 100644 docs/repo-docs/guides/meta.json create mode 100644 docs/repo-docs/guides/multi-language.mdx create mode 100644 docs/repo-docs/guides/publishing-libraries.mdx create mode 100644 docs/repo-docs/guides/single-package-workspaces.mdx rename docs/{pages/repo/docs/core-concepts/monorepos => repo-docs/guides}/skipping-tasks.mdx (67%) create mode 100644 docs/repo-docs/guides/tools/biome.mdx create mode 100644 docs/repo-docs/guides/tools/create-turbo-callout.tsx rename docs/{pages/repo/docs/handbook/deploying-with-docker.mdx => repo-docs/guides/tools/docker.mdx} (60%) create mode 100644 docs/repo-docs/guides/tools/eslint.mdx create mode 100644 docs/repo-docs/guides/tools/index.mdx create mode 100644 docs/repo-docs/guides/tools/jest.mdx create mode 100644 docs/repo-docs/guides/tools/meta.json create mode 100644 docs/repo-docs/guides/tools/prisma.mdx create mode 100644 docs/repo-docs/guides/tools/storybook.mdx create mode 100644 docs/repo-docs/guides/tools/typescript.mdx create mode 100644 docs/repo-docs/guides/tools/vitest.mdx create mode 100644 docs/repo-docs/index.mdx rename docs/{pages => repo-docs}/messages/invalid-env-prefix.mdx (62%) rename docs/{pages => repo-docs}/messages/missing-root-task-in-turbo-json.mdx (82%) rename docs/{pages/messages/package-task-in-single-package-mode.mdx => repo-docs/messages/package-task-in-single-package-workspace.mdx} (62%) rename docs/{pages => repo-docs}/messages/unnecessary-package-task-syntax.mdx (63%) create mode 100644 docs/repo-docs/meta.json create mode 100644 docs/repo-docs/reference/bin.mdx create mode 100644 docs/repo-docs/reference/configuration.mdx create mode 100644 docs/repo-docs/reference/create-turbo.mdx create mode 100644 docs/repo-docs/reference/eslint-config-turbo.mdx create mode 100644 docs/repo-docs/reference/generate.mdx create mode 100644 docs/repo-docs/reference/globs.mdx create mode 100644 docs/repo-docs/reference/index.mdx create mode 100644 docs/repo-docs/reference/link.mdx create mode 100644 docs/repo-docs/reference/login.mdx create mode 100644 docs/repo-docs/reference/logout.mdx create mode 100644 docs/repo-docs/reference/meta.json create mode 100644 docs/repo-docs/reference/package-configurations.mdx create mode 100644 docs/repo-docs/reference/prune.mdx create mode 100644 docs/repo-docs/reference/run.mdx create mode 100644 docs/repo-docs/reference/scan.mdx rename docs/{pages/repo/docs/reference/system-variables.mdx => repo-docs/reference/system-environment-variables.mdx} (77%) create mode 100644 docs/repo-docs/reference/telemetry.mdx create mode 100644 docs/repo-docs/reference/turbo-codemod.mdx create mode 100644 docs/repo-docs/reference/turbo-gen.mdx create mode 100644 docs/repo-docs/reference/turbo-ignore.mdx create mode 100644 docs/repo-docs/reference/unlink.mdx create mode 100644 docs/repo-docs/reference/watch.mdx rename docs/{pages/repo/docs => repo-docs}/telemetry.mdx (87%) delete mode 100644 examples/basic/.eslintrc.js create mode 100644 examples/basic/apps/docs/.gitignore create mode 100644 examples/basic/apps/docs/app/fonts/GeistMonoVF.woff create mode 100644 examples/basic/apps/docs/app/fonts/GeistVF.woff delete mode 100644 examples/basic/apps/docs/app/page.module.css delete mode 100644 examples/basic/apps/docs/next.config.js create mode 100644 examples/basic/apps/docs/next.config.mjs create mode 100644 examples/basic/apps/docs/postcss.config.mjs delete mode 100644 examples/basic/apps/docs/public/circles.svg create mode 100644 examples/basic/apps/docs/public/file-text.svg create mode 100644 examples/basic/apps/docs/public/globe.svg delete mode 100644 examples/basic/apps/docs/public/turborepo.svg create mode 100644 examples/basic/apps/docs/public/window.svg create mode 100644 examples/basic/apps/docs/tailwind.config.ts create mode 100644 examples/basic/apps/web/.gitignore create mode 100644 examples/basic/apps/web/app/fonts/GeistMonoVF.woff create mode 100644 examples/basic/apps/web/app/fonts/GeistVF.woff delete mode 100644 examples/basic/apps/web/app/page.module.css delete mode 100644 examples/basic/apps/web/next.config.js create mode 100644 examples/basic/apps/web/next.config.mjs create mode 100644 examples/basic/apps/web/postcss.config.mjs delete mode 100644 examples/basic/apps/web/public/circles.svg create mode 100644 examples/basic/apps/web/public/file-text.svg create mode 100644 examples/basic/apps/web/public/globe.svg delete mode 100644 examples/basic/apps/web/public/turborepo.svg create mode 100644 examples/basic/apps/web/public/window.svg create mode 100644 examples/basic/apps/web/tailwind.config.ts delete mode 100644 examples/basic/tsconfig.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/add-package-names/correct-names/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/add-package-names/correct-names/packages/ui/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/add-package-names/correct-names/packages/utils/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/add-package-names/duplicate-names/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/add-package-names/duplicate-names/packages/apps/docs/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/add-package-names/duplicate-names/packages/apps/web/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/add-package-names/duplicate-names/packages/ui/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/add-package-names/duplicate-names/packages/utils/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/add-package-names/ignored-packages/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/add-package-names/ignored-packages/packages/ui/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/add-package-names/ignored-packages/packages/utils/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/add-package-names/ignored-packages/pnpm-workspace.yaml create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/add-package-names/missing-names/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/add-package-names/missing-names/packages/ui/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/add-package-names/missing-names/packages/utils/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate-dot-env/no-dot-env/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate-dot-env/no-dot-env/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate-dot-env/no-pipeline/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate-dot-env/no-pipeline/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate-dot-env/no-turbo-json/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate-dot-env/with-dot-env/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate-dot-env/with-dot-env/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate-dot-env/workspace-configs/apps/docs/index.js create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate-dot-env/workspace-configs/apps/docs/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate-dot-env/workspace-configs/apps/docs/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate-dot-env/workspace-configs/apps/web/index.js create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate-dot-env/workspace-configs/apps/web/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate-dot-env/workspace-configs/apps/web/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate-dot-env/workspace-configs/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate-dot-env/workspace-configs/packages/ui/index.js create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate-dot-env/workspace-configs/packages/ui/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate-dot-env/workspace-configs/packages/ui/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate-dot-env/workspace-configs/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate/turbo-1/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/migrate/turbo-1/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/invalid-output-mode/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/invalid-output-mode/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/no-output-mode/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/no-output-mode/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/no-pipeline/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/no-pipeline/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/no-turbo-json/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/old-config/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/old-config/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/old-output-mode/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/old-output-mode/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/workspace-configs/apps/docs/index.js create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/workspace-configs/apps/docs/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/workspace-configs/apps/docs/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/workspace-configs/apps/web/index.js create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/workspace-configs/apps/web/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/workspace-configs/apps/web/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/workspace-configs/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/workspace-configs/packages/ui/index.js create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/workspace-configs/packages/ui/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/workspace-configs/packages/ui/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-output-mode/workspace-configs/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-pipeline/no-turbo-json/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-pipeline/root-only/important.txt create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-pipeline/root-only/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-pipeline/root-only/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-pipeline/with-tasks/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-pipeline/workspace-configs/apps/docs/index.js create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-pipeline/workspace-configs/apps/docs/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-pipeline/workspace-configs/apps/docs/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-pipeline/workspace-configs/apps/web/index.js create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-pipeline/workspace-configs/apps/web/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-pipeline/workspace-configs/apps/web/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-pipeline/workspace-configs/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-pipeline/workspace-configs/packages/ui/index.js create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-pipeline/workspace-configs/packages/ui/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-pipeline/workspace-configs/packages/ui/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/rename-pipeline/workspace-configs/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/stabilize-ui/disabled/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/stabilize-ui/disabled/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/stabilize-ui/enabled/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/stabilize-ui/enabled/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/stabilize-ui/no-config/package.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/stabilize-ui/no-config/turbo.json create mode 100644 packages/turbo-codemod/__tests__/__fixtures__/stabilize-ui/no-turbo-json/package.json create mode 100644 packages/turbo-codemod/__tests__/add-package-names.test.ts create mode 100644 packages/turbo-codemod/__tests__/generate-package-name.test.ts create mode 100644 packages/turbo-codemod/__tests__/migrate-dot-env.test.ts create mode 100644 packages/turbo-codemod/__tests__/rename-output-mode.test.ts create mode 100644 packages/turbo-codemod/__tests__/rename-pipeline.ts create mode 100644 packages/turbo-codemod/__tests__/stabilize-ui.test.ts create mode 100644 packages/turbo-codemod/src/transforms/add-package-names.ts create mode 100644 packages/turbo-codemod/src/transforms/migrate-dot-env.ts create mode 100644 packages/turbo-codemod/src/transforms/rename-output-mode.ts create mode 100644 packages/turbo-codemod/src/transforms/rename-pipeline.ts create mode 100644 packages/turbo-codemod/src/transforms/stabilize-ui.ts create mode 100644 packages/turbo-codemod/src/utils/loadTurboJson.ts create mode 100644 packages/turbo-ignore/__fixtures__/invalid_turbo_json/package.json create mode 100644 packages/turbo-ignore/__fixtures__/invalid_turbo_json/turbo.json create mode 100644 packages/turbo-ignore/__fixtures__/no_turbo_deps/package.json create mode 100644 packages/turbo-ignore/__fixtures__/no_turbo_deps/turbo.json create mode 100644 packages/turbo-ignore/__fixtures__/no_turbo_deps_v1/package.json create mode 100644 packages/turbo-ignore/__fixtures__/no_turbo_deps_v1/turbo.json create mode 100644 packages/turbo-ignore/__fixtures__/turbo_in_deps/package.json create mode 100644 packages/turbo-ignore/__fixtures__/turbo_in_deps/turbo.json create mode 100644 packages/turbo-ignore/__tests__/getTurboVersion.test.ts create mode 100644 packages/turbo-ignore/src/getTurboVersion.ts create mode 100644 packages/turbo-vsc/ARCHITECTURE.md create mode 100644 turborepo-tests/integration/fixtures/dir_globs/.gitignore create mode 100644 turborepo-tests/integration/fixtures/dir_globs/apps/my-app/package.json create mode 100644 turborepo-tests/integration/fixtures/dir_globs/package.json create mode 100644 turborepo-tests/integration/fixtures/dir_globs/packages/util/package.json create mode 100644 turborepo-tests/integration/fixtures/dir_globs/packages/util/src/boo.txt create mode 100644 turborepo-tests/integration/fixtures/dir_globs/turbo.json create mode 100644 turborepo-tests/integration/fixtures/global_deps/README.md create mode 100644 turborepo-tests/integration/fixtures/root_deps/.gitignore create mode 100644 turborepo-tests/integration/fixtures/root_deps/apps/my-app/package.json create mode 100644 turborepo-tests/integration/fixtures/root_deps/package.json create mode 100644 turborepo-tests/integration/fixtures/root_deps/packages/another/package.json create mode 100644 turborepo-tests/integration/fixtures/root_deps/packages/util/package.json create mode 100644 turborepo-tests/integration/fixtures/root_deps/packages/yet-another/package.json create mode 100644 turborepo-tests/integration/fixtures/root_deps/turbo.json create mode 100644 turborepo-tests/integration/tests/engines.t create mode 100644 turborepo-tests/integration/tests/invalid-package-json.t create mode 100644 turborepo-tests/integration/tests/run-caching/root-deps.t create mode 100644 turborepo-tests/integration/tests/run/globs.t delete mode 100644 turborepo-tests/integration/tests/strict-env-vars/usage-infer.t rename turborepo-tests/integration/tests/task-dependencies/{root-worksapce.t => root-workspace.t} (85%) diff --git a/.cargo/config.toml b/.cargo/config.toml index 1a821b151c4aa..6ff8f1c41f2cd 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -15,6 +15,9 @@ rustdocflags = ["-Znormalize-docs"] [target.x86_64-pc-windows-msvc] linker = "rust-lld" +[target.aarch64-pc-windows-msvc] +linker = "rust-lld" + [target.'cfg(target_os = "macos")'] linker = "rust-lld" diff --git a/.github/actions/install-global-turbo/action.yml b/.github/actions/install-global-turbo/action.yml index ca71be15286e7..43dd99a8324a9 100644 --- a/.github/actions/install-global-turbo/action.yml +++ b/.github/actions/install-global-turbo/action.yml @@ -7,6 +7,6 @@ runs: - name: Install Turbo globally shell: bash run: | - VERSION=$(npm view turbo --json | jq -r '.versions | last') + VERSION=$(npm view turbo --json | jq -r '.versions | map(select(test("2."))) | last') echo "Latest published version: $VERSION" npm i -g turbo@$VERSION diff --git a/.github/workflows/test-js-packages.yml b/.github/workflows/test-js-packages.yml index 0f0b68dd31251..f1870cccadf6a 100644 --- a/.github/workflows/test-js-packages.yml +++ b/.github/workflows/test-js-packages.yml @@ -21,6 +21,9 @@ jobs: contents: read pull-requests: write steps: + - name: Checkout + uses: actions/checkout@v3 + - name: CI related changes id: ci uses: technote-space/get-diff-action@v6 @@ -100,4 +103,47 @@ jobs: # to run when turbo core changes. This job (`js_packages`) does not run on turborpeo core # changes, and we don't want to enable that beahvior for _all_ our JS packages. run: | - TURBO_API= turbo run check-types test --filter=docs --filter="!turborepo-repository" --filter={./packages/*}...[${{ github.event.pull_request.base.sha || 'HEAD^1' }}] --color --env-mode=strict + TURBO_API= turbo run check-types test --filter="!turborepo-repository" --filter={./packages/*}...[${{ github.event.pull_request.base.sha || 'HEAD^1' }}] --color --env-mode=strict + + summary: + name: Turborepo JS Test Summary + runs-on: ubuntu-latest + if: always() + needs: + - determine_jobs + - js_packages + steps: + - name: Compute info + id: info + if: always() + run: | + cancelled=false + failure=false + + subjob () { + local result=$1 + if [ "$result" = "cancelled" ]; then + cancelled=true + elif [ "$result" != "success" ] && [ "$result" != "skipped" ]; then + failure=true + fi + } + + subjob ${{needs.determine_jobs.result}} + subjob ${{needs.js_packages.result}} + + if [ "$cancelled" = "true" ]; then + echo "cancelled=true" >> $GITHUB_OUTPUT + elif [ "$failure" = "true" ]; then + echo "failure=true" >> $GITHUB_OUTPUT + else + echo "success=true" >> $GITHUB_OUTPUT + fi + + - name: Failed + if: steps.info.outputs.failure == 'true' + run: exit 1 + + - name: Succeeded + if: steps.info.outputs.success == 'true' + run: echo Ok diff --git a/.github/workflows/turborepo-test.yml b/.github/workflows/turborepo-test.yml index 9317e74322e57..c48db48e79eed 100644 --- a/.github/workflows/turborepo-test.yml +++ b/.github/workflows/turborepo-test.yml @@ -138,6 +138,7 @@ jobs: with: windows: ${{ matrix.os.runner == 'windows-latest' }} github-token: "${{ secrets.GITHUB_TOKEN }}" + node-version: "18.20.2" - name: Install Global Turbo uses: ./.github/actions/install-global-turbo @@ -147,7 +148,7 @@ jobs: if [ -z "${RUSTC_WRAPPER}" ]; then unset RUSTC_WRAPPER fi - turbo run build --filter=cli --color --env-mode=strict --token=${{ secrets.TURBO_TOKEN }} --team=${{ vars.TURBO_TEAM }} + TURBO_API= turbo run build --filter=cli --color --env-mode=strict --token=${{ secrets.TURBO_TOKEN }} --team=${{ vars.TURBO_TEAM }} shell: bash env: SCCACHE_BUCKET: turborepo-sccache @@ -194,6 +195,7 @@ jobs: with: windows: ${{ matrix.os.runner == 'windows-latest' }} github-token: "${{ secrets.GITHUB_TOKEN }}" + node-version: "18.20.2" - name: Install Global Turbo uses: ./.github/actions/install-global-turbo @@ -236,6 +238,7 @@ jobs: uses: ./.github/actions/setup-turborepo-environment with: github-token: "${{ secrets.GITHUB_TOKEN }}" + node-version: "18.20.2" - name: Install Global Turbo uses: ./.github/actions/install-global-turbo @@ -305,6 +308,7 @@ jobs: uses: ./.github/actions/setup-turborepo-environment with: github-token: "${{ secrets.GITHUB_TOKEN }}" + node-version: "18.20.2" - name: Run cargo check run: | @@ -371,14 +375,17 @@ jobs: with: windows: ${{ matrix.os.runner == 'windows-latest' }} github-token: "${{ secrets.GITHUB_TOKEN }}" + node-version: "18.20.2" - name: Run tests timeout-minutes: 120 run: | cargo groups test turborepo-libraries - cleanup: - name: Cleanup + summary: + name: Turborepo Test Summary + runs-on: ubuntu-latest + if: always() needs: - determine_jobs - build_turborepo @@ -388,6 +395,51 @@ jobs: - rust_check - rust_clippy - rust_test + steps: + - name: Compute info + id: info + if: always() + run: | + cancelled=false + failure=false + + subjob () { + local result=$1 + if [ "$result" = "cancelled" ]; then + cancelled=true + elif [ "$result" != "success" ] && [ "$result" != "skipped" ]; then + failure=true + fi + } + + subjob ${{needs.determine_jobs.result}} + subjob ${{needs.build_turborepo.result}} + subjob ${{needs.integration.result}} + subjob ${{needs.examples.result}} + subjob ${{needs.rust_lint.result}} + subjob ${{needs.rust_check.result}} + subjob ${{needs.rust_clippy.result}} + subjob ${{needs.rust_test.result}} + + if [ "$cancelled" = "true" ]; then + echo "cancelled=true" >> $GITHUB_OUTPUT + elif [ "$failure" = "true" ]; then + echo "failure=true" >> $GITHUB_OUTPUT + else + echo "success=true" >> $GITHUB_OUTPUT + fi + + - name: Failed + if: steps.info.outputs.failure == 'true' + run: exit 1 + + - name: Succeeded + if: steps.info.outputs.success == 'true' + run: echo Ok + + cleanup: + name: Cleanup + needs: summary if: always() uses: ./.github/workflows/pr-clean-caches.yml secrets: inherit diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000000000..5c39c68bf8c2a --- /dev/null +++ b/.prettierrc @@ -0,0 +1,10 @@ +{ + "overrides": [ + { + "files": ["./docs/**/*.mdx"], + "options": { + "singleQuote": true + } + } + ] +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ea423f2217251..31df18c33743f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,6 +6,7 @@ Thanks for your interest in contributing to Turbo! - [Contributing to Turbo](#contributing-to-turbo) - [General Dependencies](#general-dependencies) + - [Linux Dependencies](#linux-dependencies) - [Contributing to Turborepo](#contributing-to-turborepo) - [Building Turborepo](#building-turborepo) - [TLS Implementation](#tls-implementation) @@ -45,7 +46,7 @@ Dependencies Building -- Building `turbo` CLI: In `cli` run `make turbo` +- Building `turbo` CLI: `cargo build -p turbo` - Using `turbo` to build `turbo` CLI: `./turbow.js` ### TLS Implementation @@ -290,6 +291,14 @@ You can also create a little demo app and run cargo run -p node-file-trace -- print demo/index.js ``` +Updating snapshot tests: + +In case of changes that involve updating snapshots you can use the `UPDATE=1` environment variable. + +``` +UPDATE=1 cargo nextest run +``` + ### Profiling Turbopack See [the profiling docs for Turbopack](https://turbo.build/pack/docs/advanced/profiling) for details. diff --git a/Cargo.lock b/Cargo.lock index 7ddd81ee0b35f..877d6e159bae1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -645,12 +645,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a17bd29f7c70f32e9387f4d4acfa5ea7b7749ef784fb78cf382df97069337b8c" -[[package]] -name = "base16" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d27c3610c36aee21ce8ac510e6224498de4228ad772a171ed65643a24693a5a8" - [[package]] name = "base64" version = "0.13.1" @@ -721,9 +715,9 @@ dependencies = [ [[package]] name = "binding_macros" -version = "0.66.0" +version = "0.67.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee3f426fc63b42e1c6e6e0974d3fa3fe08513c5b441d80fd24d0c0a54b661dfa" +checksum = "4cb67bba3eb7ac48982404ebec9fabdb26b8263fcabe23b99d8c0e6f5b97cc81" dependencies = [ "anyhow", "console_error_panic_hook", @@ -1059,7 +1053,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c" dependencies = [ "memchr", - "regex-automata 0.4.5", + "regex-automata 0.4.6", "serde", ] @@ -1283,6 +1277,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + [[package]] name = "chromiumoxide" version = "0.5.0" @@ -1981,11 +1981,10 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ - "cfg-if", "crossbeam-utils", ] @@ -2025,12 +2024,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crossterm" @@ -2150,12 +2146,12 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.4.0" +version = "3.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a011bbe2c35ce9c1f143b7af6f94f29a167beb4cd1d29e6740ce836f723120e" +checksum = "672465ae37dc1bc6380a6547a8883d5dd397b0f1faaad4f265726cc7042a5345" dependencies = [ - "nix 0.26.2", - "windows-sys 0.48.0", + "nix 0.28.0", + "windows-sys 0.52.0", ] [[package]] @@ -2166,24 +2162,24 @@ checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" [[package]] name = "curl" -version = "0.4.46" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e2161dd6eba090ff1594084e95fd67aeccf04382ffea77999ea94ed42ec67b6" +checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22" dependencies = [ "curl-sys", "libc", "openssl-probe", "openssl-sys", "schannel", - "socket2 0.5.7", - "windows-sys 0.52.0", + "socket2 0.4.9", + "winapi", ] [[package]] name = "curl-sys" -version = "0.4.72+curl-8.6.0" +version = "0.4.60+curl-7.88.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29cbdc8314c447d11e8fd156dcdd031d9e02a7a976163e396b548c03153bc9ea" +checksum = "717abe2cb465a5da6ce06617388a3980c9a2844196734bec8ccb8e575250f13f" dependencies = [ "cc", "libc", @@ -2192,7 +2188,7 @@ dependencies = [ "openssl-sys", "pkg-config", "vcpkg", - "windows-sys 0.52.0", + "winapi", ] [[package]] @@ -3149,8 +3145,8 @@ dependencies = [ "aho-corasick", "bstr 1.8.0", "log", - "regex-automata 0.4.5", - "regex-syntax 0.8.2", + "regex-automata 0.4.6", + "regex-syntax 0.8.3", ] [[package]] @@ -3457,9 +3453,9 @@ dependencies = [ [[package]] name = "human-panic" -version = "1.2.1" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b82da652938b83f94cfdaaf9ae7aaadb8430d84b0dfda226998416318727eac2" +checksum = "c4f016c89920bbb30951a8405ecacbb4540db5524313b9445736e7e1855cf370" dependencies = [ "anstream", "anstyle", @@ -3467,7 +3463,7 @@ dependencies = [ "os_info", "serde", "serde_derive", - "toml 0.7.8", + "toml 0.8.14", "uuid", ] @@ -3500,7 +3496,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.7", + "socket2 0.5.4", "tokio", "tower-service", "tracing", @@ -3619,7 +3615,7 @@ dependencies = [ "globset", "log", "memchr", - "regex-automata 0.4.5", + "regex-automata 0.4.6", "same-file", "walkdir", "winapi-util", @@ -4162,9 +4158,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.152" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libfuzzer-sys" @@ -4216,9 +4212,9 @@ checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" [[package]] name = "libmimalloc-sys" -version = "0.1.30" +version = "0.1.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8c7cbf8b89019683667e347572e6d55a7df7ea36b0c4ce69961b0cde67b174" +checksum = "0e7bb23d733dfcc8af652a78b7bf232f0e967710d044732185e561e47c0336b6" dependencies = [ "cc", "libc", @@ -4248,9 +4244,9 @@ dependencies = [ [[package]] name = "lightningcss" -version = "1.0.0-alpha.56" +version = "1.0.0-alpha.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668e9f1774a4dda9e2233ad0f78c6987878bcf4201d2085bc3517a7f84d0ee92" +checksum = "10bc10261f46b8df263b80e7779d1748b1880488cd951fbb9e096430cead10e6" dependencies = [ "ahash 0.8.9", "bitflags 2.5.0", @@ -4260,7 +4256,6 @@ dependencies = [ "dashmap", "data-encoding", "getrandom", - "indexmap 2.2.6", "itertools 0.10.5", "lazy_static", "lightningcss-derive", @@ -4371,6 +4366,18 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "lsp-server" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248f65b78f6db5d8e1b1604b4098a28b43d21a8eb1deeca22b1c421b276c7095" +dependencies = [ + "crossbeam-channel", + "log", + "serde", + "serde_json", +] + [[package]] name = "lsp-types" version = "0.94.1" @@ -4384,6 +4391,19 @@ dependencies = [ "url", ] +[[package]] +name = "lsp-types" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e34d33a8e9b006cd3fc4fe69a921affa097bae4bb65f76271f4644f9a334365" +dependencies = [ + "bitflags 1.3.2", + "serde", + "serde_json", + "serde_repr", + "url", +] + [[package]] name = "mach" version = "0.3.2" @@ -4459,9 +4479,9 @@ dependencies = [ [[package]] name = "mdxjs" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5860860bfc09972a5d99bfb866dde39485fe397210f8a9ccf68a6c6740d687b" +checksum = "08b14a30b8511133accf39b86da3d07ebbead12aa98a220accf43a99300d9620" dependencies = [ "markdown", "serde", @@ -4603,9 +4623,9 @@ dependencies = [ [[package]] name = "mimalloc" -version = "0.1.34" +version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dcb174b18635f7561a0c6c9fc2ce57218ac7523cf72c50af80e2d79ab8f3ba1" +checksum = "e9186d86b79b52f4a77af65604b51225e8db1d6ee7e3f41aec1e40829c71a176" dependencies = [ "libmimalloc-sys", ] @@ -4676,9 +4696,9 @@ dependencies = [ [[package]] name = "modularize_imports" -version = "0.68.14" +version = "0.68.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440dfda6d4b4cfa76c0b12b564c9b8d643b5c2bc8a63ed5dfc2a46cf1c68ac61" +checksum = "3d1ed4453f3dcc7ed01304aadd254f804a915e4725243e92822e18774593dea3" dependencies = [ "convert_case 0.6.0", "handlebars", @@ -4855,6 +4875,18 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "nix" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" +dependencies = [ + "bitflags 2.5.0", + "cfg-if", + "cfg_aliases", + "libc", +] + [[package]] name = "node-file-trace" version = "0.1.0" @@ -4984,6 +5016,12 @@ dependencies = [ "serde", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-derive" version = "0.3.3" @@ -5177,13 +5215,13 @@ dependencies = [ [[package]] name = "os_info" -version = "3.7.0" +version = "3.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "006e42d5b888366f1880eda20371fedde764ed2213dc8496f49622fa0c99cd5e" +checksum = "ae99c7fa6dd38c7cafe1ec085e804f8f555a2f8659b0dbe03f1f9963a9b51092" dependencies = [ "log", "serde", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -5348,7 +5386,7 @@ dependencies = [ [[package]] name = "pathfinder_simd" version = "0.5.3" -source = "git+https://github.com/servo/pathfinder?rev=30419d#30419d07660dc11a21e42ef4a7fa329600cff152" +source = "git+https://github.com/vercel/pathfinder?branch=rm-stdarch_arm_crc32#ddc0696d4c8b7d0f7af8de1a271c62aec016d45f" dependencies = [ "rustc_version 0.4.0", ] @@ -6297,8 +6335,8 @@ checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.5", - "regex-syntax 0.8.2", + "regex-automata 0.4.6", + "regex-syntax 0.8.3", ] [[package]] @@ -6312,13 +6350,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.8.3", ] [[package]] @@ -6329,9 +6367,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "region" @@ -6915,10 +6953,11 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.11" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7f05c1d5476066defcdfacce1f52fc3cae3af1d3089727100c02ae92e5abbe0" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" dependencies = [ + "itoa", "serde", ] @@ -6956,9 +6995,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" dependencies = [ "serde", ] @@ -7318,12 +7357,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.48.0", ] [[package]] @@ -7559,9 +7598,9 @@ dependencies = [ [[package]] name = "styled_components" -version = "0.96.15" +version = "0.96.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d7e14a22b6bf299ed8c2072e719c27324be5060a39b2bd70e62ad2a9505fe71" +checksum = "b661b68dbffeb5e9186523957c3586f609c99df3ee36fa6da0e12377101f54a1" dependencies = [ "Inflector", "once_cell", @@ -7577,9 +7616,9 @@ dependencies = [ [[package]] name = "styled_jsx" -version = "0.73.21" +version = "0.73.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17e38b2334f6613c9e811cc776bc9d2329c288f4dc125df68615fe6cf19b48ae" +checksum = "598108b5402971bd12dd8936ad1b3165b44505d34e5dd7ec4afa413190453a34" dependencies = [ "anyhow", "lightningcss", @@ -7680,9 +7719,9 @@ dependencies = [ [[package]] name = "swc" -version = "0.275.1" +version = "0.276.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ac38cd938ce20693b58b26a5d1926a46074db09cf90a251d83cf17cdaea6031" +checksum = "0fecebc2d47ba1e6a0b125ea6e55d111014c78ea5bbf519f9b378dfd54f19020" dependencies = [ "anyhow", "base64 0.21.4", @@ -7725,6 +7764,7 @@ dependencies = [ "swc_plugin_proxy", "swc_plugin_runner", "swc_timer", + "swc_transform_common", "swc_visit", "tokio", "tracing", @@ -7758,9 +7798,9 @@ dependencies = [ [[package]] name = "swc_bundler" -version = "0.227.0" +version = "0.228.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1a212bd08b1121c7204a04407ea055779fc00cf80024fc666dd97b00749cf87" +checksum = "43e4698d94115ea10fe3c6fdde2d1e736c6ba6601abab0a61d95e1015d13359f" dependencies = [ "anyhow", "crc", @@ -7837,9 +7877,9 @@ dependencies = [ [[package]] name = "swc_compiler_base" -version = "0.9.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "754058388d4f51df61f9aced73dfca96d81fed1c0a46583dc7b3da07688af80d" +checksum = "95ef85116a4d22dd66ebc8d1d1c7634565569fa4b80bf6728686b38e407f00f1" dependencies = [ "anyhow", "base64 0.21.4", @@ -7847,7 +7887,9 @@ dependencies = [ "napi-derive", "once_cell", "pathdiff", + "rustc-hash", "serde", + "serde_json", "sourcemap", "swc_atoms", "swc_common", @@ -7862,9 +7904,9 @@ dependencies = [ [[package]] name = "swc_config" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be1a689e146be1eae53139482cb061dcf0fa01dff296bbe7b96fff92d8e2936" +checksum = "84b67e115ab136fe0eb03558bb0508ca7782eeb446a96d165508c48617e3fd94" dependencies = [ "anyhow", "indexmap 2.2.6", @@ -7889,9 +7931,9 @@ dependencies = [ [[package]] name = "swc_core" -version = "0.92.5" +version = "0.93.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e317f6f8b15019358d1e48631c0e6d098d9a3d00d666ea99650201661abea855" +checksum = "f331506bd57c03b006b5585797c23bf10077bc8ef949d80efce3ef4b9ee8a664" dependencies = [ "binding_macros", "swc", @@ -8078,9 +8120,9 @@ dependencies = [ [[package]] name = "swc_ecma_ast" -version = "0.113.4" +version = "0.113.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1690cc0c9ab60b44ac0225ba1e231ac532f7ba1d754df761c6ee607561afae" +checksum = "98a534a8360a076a030989f6d121ba6044345594bdf0457c4629f432742026b8" dependencies = [ "bitflags 2.5.0", "bytecheck", @@ -8098,9 +8140,9 @@ dependencies = [ [[package]] name = "swc_ecma_codegen" -version = "0.149.1" +version = "0.149.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fef147127a2926ca26171c7afcbf028ff86dc543ced87d316713f25620a15b9" +checksum = "efb2bef3f4998865b2d466fb2ef9410a03449d255d199f3eb807fb19acc3862b" dependencies = [ "memchr", "num-bigint", @@ -8159,9 +8201,9 @@ dependencies = [ [[package]] name = "swc_ecma_compat_es2015" -version = "0.5.1" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248532f9ae603be6bf4763f66f74ad0dfd82d6307be876ccf4c5d081826a1161" +checksum = "d5f902caf95f4475a8963a3f7c0d645c1d7fcd81464cfb8165b78d5aeb0bcff2" dependencies = [ "arrayvec 0.7.4", "indexmap 2.2.6", @@ -8323,9 +8365,9 @@ dependencies = [ [[package]] name = "swc_ecma_ext_transforms" -version = "0.114.1" +version = "0.114.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "259b7b69630aafde63c6304eeacb93fd54619cbdb199c978549acc76cd512d76" +checksum = "91b55ddf8b600f07d0086a9a782d55aa048d3c1ac5eabaa27733d9f45d960e52" dependencies = [ "phf 0.11.2", "swc_atoms", @@ -8379,9 +8421,9 @@ dependencies = [ [[package]] name = "swc_ecma_minifier" -version = "0.194.5" +version = "0.195.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535bbb8adbdf730302f477948557a26e5cd73854d4543c0630e05132ffa16d8a" +checksum = "94ed053fe91ab7c1ea79a577a49fdc3da895df802bcf9df04de4ccb51a075ff7" dependencies = [ "arrayvec 0.7.4", "indexmap 2.2.6", @@ -8413,9 +8455,9 @@ dependencies = [ [[package]] name = "swc_ecma_parser" -version = "0.144.1" +version = "0.144.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0499e69683ae5d67a20ff0279b94bc90f29df7922a46331b54d5dd367bf89570" +checksum = "fc0b4193b9c127db1990a5a08111aafe0122bc8b138646807c63f2a6521b7da4" dependencies = [ "either", "new_debug_unreachable", @@ -8510,9 +8552,9 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_base" -version = "0.138.2" +version = "0.138.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddb95c2bdad1c9c29edf35712e1e0f9b9ddc1cdb5ba2d582fd93468cb075a03" +checksum = "f7b76d09313cdd8f99bc1519fb04f8a93427c7a6f4bfbc64b39fcc5a378ab1b7" dependencies = [ "better_scoped_tls", "bitflags 2.5.0", @@ -8624,9 +8666,9 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_optimization" -version = "0.199.1" +version = "0.199.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32ea30b3df748236c619409f222f0ba68ebeebc08dfff109d2195664a15689f9" +checksum = "25982d69c91cd64cbfae714d9e953810b3f2835486d08108967cbd15016e7720" dependencies = [ "dashmap", "indexmap 2.2.6", @@ -8737,9 +8779,9 @@ dependencies = [ [[package]] name = "swc_ecma_usage_analyzer" -version = "0.24.2" +version = "0.24.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d140be135c1af1726ee02406ad210c6598b3399303974d884b1b681563602c9" +checksum = "104d474b77f73db1467f31d5bceb1e4821e9b471c97baa7f208e2d8edd63c107" dependencies = [ "indexmap 2.2.6", "rustc-hash", @@ -8754,15 +8796,16 @@ dependencies = [ [[package]] name = "swc_ecma_utils" -version = "0.128.1" +version = "0.128.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe5242670bc74e0a0b64b9d4912b37be36944517ce0881314162aeb4381272c3" +checksum = "02f470d8cc31adf6189b228636201ee3cdd268c0b5a2d0407f83093dfa96ff91" dependencies = [ "indexmap 2.2.6", "num_cpus", "once_cell", "rayon", "rustc-hash", + "ryu-js", "swc_atoms", "swc_common", "swc_ecma_ast", @@ -8788,9 +8831,9 @@ dependencies = [ [[package]] name = "swc_emotion" -version = "0.72.13" +version = "0.72.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b454c1b99da4da9aab3731ab34d7582d2eab96e47670d0c62711053886ef7e2" +checksum = "038b284022103a111078a012760423d6e88ba48fabe1a9fcb9229e661e6300c3" dependencies = [ "base64 0.22.1", "byteorder", @@ -8932,9 +8975,9 @@ dependencies = [ [[package]] name = "swc_plugin_runner" -version = "0.107.1" +version = "0.107.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73640537e0967a88a537c853de4a41ba6cdf77bfff1999f7c6c449e5bc550eed" +checksum = "0cc31ec32964d3ebaebfd5a2466a2aaa909aa00722d677f89994b2b6c27d105c" dependencies = [ "anyhow", "enumset", @@ -8957,9 +9000,9 @@ dependencies = [ [[package]] name = "swc_relay" -version = "0.44.13" +version = "0.44.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b36a22861087d88f0ae4d78800b6fd44e2dc5b541f8da53e81388c611bab0ef9" +checksum = "89b9cc7f85e3bd8fdd8a81a96d34e1a589c2b4deb7b5a08cd59918f612b1b3c0" dependencies = [ "once_cell", "regex", @@ -8993,6 +9036,19 @@ dependencies = [ "syn 2.0.58", ] +[[package]] +name = "swc_transform_common" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda3e80e1ad638d3575bc07745a914af13dcb02215098659f864731078271f2c" +dependencies = [ + "better_scoped_tls", + "once_cell", + "rustc-hash", + "serde", + "serde_json", +] + [[package]] name = "swc_visit" version = "0.5.14" @@ -9295,9 +9351,9 @@ dependencies = [ [[package]] name = "testing" -version = "0.35.24" +version = "0.35.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71dd5265f4921fe51b386b1496c63ac058589d8cd38de6b61489a98c6019a16" +checksum = "15028f8ec7f95006f4e00e6c5ab6620f322bc6dc208a6cba09afa36375981cec" dependencies = [ "ansi_term", "cargo_metadata", @@ -9405,12 +9461,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.30" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", + "num-conv", "powerfmt", "serde", "time-core", @@ -9425,10 +9482,11 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ + "num-conv", "time-core", ] @@ -9477,9 +9535,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" dependencies = [ "backtrace", "bytes", @@ -9489,7 +9547,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.7", + "socket2 0.5.4", "tokio-macros", "tracing", "windows-sys 0.48.0", @@ -9507,9 +9565,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", @@ -9619,21 +9677,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.2" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.20.2", + "toml_edit 0.22.14", ] [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" dependencies = [ "serde", ] @@ -9648,20 +9706,20 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.5.15", ] [[package]] name = "toml_edit" -version = "0.20.2" +version = "0.22.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" dependencies = [ "indexmap 2.2.6", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.6.13", ] [[package]] @@ -9774,7 +9832,7 @@ dependencies = [ "dashmap", "futures", "httparse", - "lsp-types", + "lsp-types 0.94.1", "memchr", "serde", "serde_json", @@ -10029,7 +10087,6 @@ dependencies = [ "anyhow", "assert_cmd", "build-target", - "human-panic", "itertools 0.10.5", "miette 5.10.0", "pretty_assertions", @@ -10037,6 +10094,31 @@ dependencies = [ "winapi", ] +[[package]] +name = "turbo-prehash" +version = "0.1.0" + +[[package]] +name = "turbo-static" +version = "0.1.0" +dependencies = [ + "bincode", + "clap 4.5.2", + "ctrlc", + "ignore", + "itertools 0.10.5", + "lsp-server", + "lsp-types 0.95.1", + "proc-macro2", + "serde", + "serde_json", + "serde_path_to_error", + "syn 2.0.58", + "tracing", + "tracing-subscriber", + "walkdir", +] + [[package]] name = "turbo-tasks" version = "0.1.0" @@ -10166,8 +10248,6 @@ dependencies = [ name = "turbo-tasks-hash" version = "0.1.0" dependencies = [ - "base16", - "hex", "md4", "turbo-tasks-macros", "twox-hash", @@ -10240,6 +10320,7 @@ dependencies = [ "smallvec", "tokio", "tracing", + "turbo-prehash", "turbo-tasks", "turbo-tasks-build", "turbo-tasks-hash", @@ -10634,6 +10715,7 @@ dependencies = [ "swc_core", "swc_emotion", "swc_relay", + "tracing", "turbo-tasks", "turbo-tasks-build", "turbo-tasks-fs", @@ -10835,6 +10917,7 @@ dependencies = [ "anyhow", "dunce", "futures", + "indexmap 1.9.3", "once_cell", "serde", "serde_json", @@ -11161,6 +11244,7 @@ dependencies = [ "globwatch", "go-parse-duration", "hex", + "human-panic", "human_format", "humantime", "ignore", @@ -11379,7 +11463,7 @@ dependencies = [ "anyhow", "atty", "console", - "crossterm 0.26.1", + "crossterm 0.27.0", "dialoguer", "indicatif", "indoc", @@ -11446,7 +11530,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", - "rand 0.8.5", + "rand 0.4.6", "static_assertions", ] @@ -11972,9 +12056,9 @@ checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -12199,7 +12283,7 @@ dependencies = [ "serde_json", "serde_yaml 0.9.27", "thiserror", - "toml 0.8.2", + "toml 0.8.14", ] [[package]] @@ -12840,6 +12924,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.10.1" diff --git a/Cargo.toml b/Cargo.toml index bc8f5c8ece8ec..b12c9dfec27b3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,9 @@ resolver = "2" members = [ "crates/node-file-trace", "crates/tower-uds", + "crates/turbo-static", "crates/turbo-tasks*", + "crates/turbo-prehash", "crates/turbopack*", "crates/turborepo*", "packages/turbo-repository/rust", @@ -108,17 +110,17 @@ async-recursion = "1.0.2" # Keep consistent with preset_env_base through swc_core browserslist-rs = { version = "0.15.0" } miette = { version = "5.10.0", features = ["fancy"] } -mdxjs = "0.2.2" -modularize_imports = { version = "0.68.14" } -styled_components = { version = "0.96.15" } -styled_jsx = { version = "0.73.21" } -swc_core = { version = "0.92.5", features = [ +mdxjs = "0.2.3" +modularize_imports = { version = "0.68.15" } +styled_components = { version = "0.96.16" } +styled_jsx = { version = "0.73.23" } +swc_core = { version = "0.93.4", features = [ "ecma_loader_lru", "ecma_loader_parking_lot", ] } -swc_emotion = { version = "0.72.13" } -swc_relay = { version = "0.44.13" } -testing = { version = "0.35.24" } +swc_emotion = { version = "0.72.14" } +swc_relay = { version = "0.44.15" } +testing = { version = "0.35.25" } # Temporary: Reference the latest git minor version of pathfinder_simd until it's published. pathfinder_simd = "0.5.3" @@ -128,6 +130,7 @@ signposter = { path = "crates/turbo-tasks-signposter" } signposter-sys = { path = "crates/turbo-tasks-signposter-sys" } tracing-signpost = { path = "crates/turbo-tasks-tracing-signpost" } swc-ast-explorer = { path = "crates/turbopack-swc-ast-explorer" } +turbo-prehash = { path = "crates/turbo-prehash" } turbo-tasks-malloc = { path = "crates/turbo-tasks-malloc", default-features = false } turbo-tasks = { path = "crates/turbo-tasks" } turbo-tasks-build = { path = "crates/turbo-tasks-build" } @@ -240,7 +243,7 @@ indicatif = "0.17.3" indoc = "2.0.0" itertools = "0.10.5" lazy_static = "1.4.0" -lightningcss = { version = "1.0.0-alpha.56", features = [ +lightningcss = { version = "1.0.0-alpha.57", features = [ "serde", "visitor", "into_owned", @@ -303,4 +306,5 @@ which = "4.4.0" unicode-segmentation = "1.10.1" [patch.crates-io] -pathfinder_simd = { git = "https://github.com/servo/pathfinder", rev = "30419d" } +# TODO: Use upstream when https://github.com/servo/pathfinder/pull/566 lands +pathfinder_simd = { git = "https://github.com/vercel/pathfinder", branch = "rm-stdarch_arm_crc32" } diff --git a/LICENSE b/LICENSE index fa0086a952236..5c3db8bb6f857 100644 --- a/LICENSE +++ b/LICENSE @@ -1,373 +1,7 @@ -Mozilla Public License Version 2.0 -================================== +Copyright (c) 2024 Vercel, Inc -1. Definitions --------------- +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. \ No newline at end of file +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cli/LICENSE b/cli/LICENSE index fa0086a952236..5c3db8bb6f857 100644 --- a/cli/LICENSE +++ b/cli/LICENSE @@ -1,373 +1,7 @@ -Mozilla Public License Version 2.0 -================================== +Copyright (c) 2024 Vercel, Inc -1. Definitions --------------- +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. \ No newline at end of file +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cli/scripts/npm-native-packages/template/template.package.json b/cli/scripts/npm-native-packages/template/template.package.json index fdc72c01b6bfb..08bef48a2aaee 100644 --- a/cli/scripts/npm-native-packages/template/template.package.json +++ b/cli/scripts/npm-native-packages/template/template.package.json @@ -5,7 +5,7 @@ "repository": "https://github.com/vercel/turbo", "bugs": "https://github.com/vercel/turbo/issues", "homepage": "https://turbo.build/repo", - "license": "MPL-2.0", + "license": "MIT", "os": ["{{Os}}"], "cpu": ["{{Arch}}"], "preferUnplugged": true diff --git a/cli/turbo.json b/cli/turbo.json index 7cf7189beb640..2d13abd706d82 100644 --- a/cli/turbo.json +++ b/cli/turbo.json @@ -1,7 +1,7 @@ { "$schema": "../docs/public/schema.json", "extends": ["//"], - "pipeline": { + "tasks": { // A task that is used for detecting if any turborepo Rust sources change "rust-src": { "env": ["RUNNER_OS"], diff --git a/crates/node-file-trace/Cargo.toml b/crates/node-file-trace/Cargo.toml index 981efc5f6a0d7..febd05f0d04b0 100644 --- a/crates/node-file-trace/Cargo.toml +++ b/crates/node-file-trace/Cargo.toml @@ -13,6 +13,8 @@ bench = false [features] default = ["cli", "custom_allocator"] cli = ["dep:clap", "turbo-tasks-malloc"] +persistent_cache = [] +serializable = [] tokio_console = [ "dep:console-subscriber", "tokio/tracing", diff --git a/crates/node-file-trace/src/lib.rs b/crates/node-file-trace/src/lib.rs index 34e21c08c5702..8a7e3377c2fda 100644 --- a/crates/node-file-trace/src/lib.rs +++ b/crates/node-file-trace/src/lib.rs @@ -22,8 +22,8 @@ use serde::Deserialize; use serde::Serialize; use tokio::sync::mpsc::channel; use turbo_tasks::{ - backend::Backend, util::FormatDuration, TaskId, TransientInstance, TransientValue, TurboTasks, - UpdateInfo, Value, Vc, + backend::Backend, util::FormatDuration, RcStr, TaskId, TransientInstance, TransientValue, + TurboTasks, UpdateInfo, Value, Vc, }; use turbo_tasks_fs::{ glob::Glob, DirectoryEntry, DiskFileSystem, FileSystem, FileSystemPath, ReadGlobResult, @@ -188,7 +188,7 @@ impl Args { } async fn create_fs(name: &str, root: &str, watch: bool) -> Result>> { - let fs = DiskFileSystem::new(name.to_string(), root.to_string(), vec![]); + let fs = DiskFileSystem::new(name.into(), root.into(), vec![]); if watch { fs.await?.start_watching()?; } else { @@ -232,17 +232,17 @@ async fn add_glob_results( #[turbo_tasks::function] async fn input_to_modules( fs: Vc>, - input: Vec, + input: Vec, exact: bool, - process_cwd: Option, - context_directory: String, + process_cwd: Option, + context_directory: RcStr, module_options: TransientInstance, resolve_options: TransientInstance, ) -> Result> { let root = fs.root(); let process_cwd = process_cwd .clone() - .map(|p| format!("/ROOT{}", p.trim_start_matches(&context_directory))); + .map(|p| format!("/ROOT{}", p.trim_start_matches(&*context_directory)).into()); let asset_context: Vc> = Vc::upcast(create_module_asset( root, @@ -283,7 +283,7 @@ fn process_context(dir: &Path, context_directory: Option<&String>) -> Result Result { +fn make_relative_path(dir: &Path, context_directory: &str, input: &str) -> Result { let mut input = PathBuf::from(input); if !input.is_absolute() { input = dir.join(input); @@ -299,10 +299,11 @@ fn make_relative_path(dir: &Path, context_directory: &str, input: &str) -> Resul Ok(input .to_str() .ok_or_else(|| anyhow!("input contains invalid characters"))? - .replace('\\', "/")) + .replace('\\', "/") + .into()) } -fn process_input(dir: &Path, context_directory: &str, input: &[String]) -> Result> { +fn process_input(dir: &Path, context_directory: &str, input: &[String]) -> Result> { input .iter() .map(|input| make_relative_path(dir, context_directory, input)) @@ -314,7 +315,7 @@ pub async fn start( turbo_tasks: Option<&Arc>>, module_options: Option, resolve_options: Option, -) -> Result> { +) -> Result> { register(); let &CommonArgs { memory_limit, @@ -394,7 +395,7 @@ async fn run>( final_finish: impl FnOnce(Arc>, TaskId, Duration) -> F, module_options: Option, resolve_options: Option, -) -> Result> { +) -> Result> { let &CommonArgs { watch, show_all, @@ -494,7 +495,7 @@ async fn run>( if has_return_value { let output_read_ref = output.await?; let output_iter = output_read_ref.iter().cloned(); - sender.send(output_iter.collect::>()).await?; + sender.send(output_iter.collect::>()).await?; drop(sender); } Ok::, _>(Default::default()) @@ -515,7 +516,7 @@ async fn main_operation( args: TransientInstance, module_options: TransientInstance, resolve_options: TransientInstance, -) -> Result>> { +) -> Result>> { let dir = current_dir.into_value(); let args = &*args; let &CommonArgs { @@ -526,8 +527,11 @@ async fn main_operation( ref process_cwd, .. } = args.common(); - let context_directory = process_context(&dir, context_directory.as_ref()).unwrap(); + let context_directory: RcStr = process_context(&dir, context_directory.as_ref()) + .unwrap() + .into(); let fs = create_fs("context directory", &context_directory, watch).await?; + let process_cwd = process_cwd.clone().map(RcStr::from); match *args { Args::Print { common: _ } => { @@ -549,7 +553,7 @@ async fn main_operation( .await?; for asset in set.await?.iter() { let path = asset.ident().path().await?; - result.insert(path.path.to_string()); + result.insert(RcStr::from(&*path.path)); } } @@ -620,7 +624,7 @@ async fn main_operation( #[turbo_tasks::function] async fn create_module_asset( root: Vc, - process_cwd: Option, + process_cwd: Option, module_options: TransientInstance, resolve_options: TransientInstance, ) -> Result> { @@ -635,12 +639,12 @@ async fn create_module_asset( let glob_mappings = vec![ ( root, - Glob::new("**/*/next/dist/server/next.js".to_string()), + Glob::new("**/*/next/dist/server/next.js".into()), ImportMapping::Ignore.into(), ), ( root, - Glob::new("**/*/next/dist/bin/next".to_string()), + Glob::new("**/*/next/dist/bin/next".into()), ImportMapping::Ignore.into(), ), ]; @@ -662,7 +666,7 @@ async fn create_module_asset( compile_time_info, ModuleOptionsContext::clone(&*module_options).cell(), resolve_options.cell(), - Vc::cell("node_file_trace".to_string()), + Vc::cell("node_file_trace".into()), )) } diff --git a/crates/node-file-trace/src/nft_json.rs b/crates/node-file-trace/src/nft_json.rs index 0d800b417a427..1e57d80a5d5f2 100644 --- a/crates/node-file-trace/src/nft_json.rs +++ b/crates/node-file-trace/src/nft_json.rs @@ -29,7 +29,9 @@ impl OutputAsset for NftJsonAsset { async fn ident(&self) -> Result> { let path = self.entry.ident().path().await?; Ok(AssetIdent::from_path( - path.fs.root().join(format!("{}.nft.json", path.path)), + path.fs + .root() + .join(format!("{}.nft.json", path.path).into()), )) } } diff --git a/crates/turbo-prehash/Cargo.toml b/crates/turbo-prehash/Cargo.toml new file mode 100644 index 0000000000000..e2f6856763c65 --- /dev/null +++ b/crates/turbo-prehash/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "turbo-prehash" +version = "0.1.0" +edition = "2021" +license = "MPL-2.0" + +[dependencies] + +[lints] +workspace = true diff --git a/crates/turbo-prehash/src/lib.rs b/crates/turbo-prehash/src/lib.rs new file mode 100644 index 0000000000000..bf187fd72602c --- /dev/null +++ b/crates/turbo-prehash/src/lib.rs @@ -0,0 +1,145 @@ +//! turbo-prehash +//! +//! A small wrapper around `std::hash::Hasher` that allows you to pre-hash a +//! value before hashing it. +//! +//! This is useful for when you want to hash a value that is expensive to +//! compute (e.g. a large string) but you want to avoid re-hashing it every +//! time. +//! +//! # Example +//! +//! ``` +//! use turbo_prehash::{BuildHasherExt, PreHashed}; +//! use std::collections::HashMap; +//! use std::hash::{BuildHasherDefault, RandomState, Hash}; +//! +//! /// hash a key, returning a prehashed value +//! fn hash_key(key: T) -> PreHashed { +//! RandomState::new().prehash(key) +//! } +//! +//! // create hashmap to hold pre-hashed values +//! let mut map: HashMap, String> = Default::default(); +//! +//! // insert a prehashed value +//! let hashed_key = hash_key("hello".to_string()); +//! map.insert(hashed_key.clone(), "world".to_string()); +//! +//! // get the value +//! assert_eq!(map.get(&hashed_key), Some(&"world".to_string())); +//! ``` + +use std::{ + fmt, + hash::{BuildHasher, Hash, Hasher}, + ops::Deref, +}; + +/// A wrapper type that hashes some `inner` on creation, implementing [Hash] +/// by simply returning the pre-computed hash. +#[derive(Copy, Debug, Clone)] +pub struct PreHashed { + hash: H, + inner: I, +} + +impl PreHashed { + /// Create a new [PreHashed] value with the given hash and inner value. + /// + /// SAFETY: The hash must be a valid hash of the inner value. + pub fn new(hash: H, inner: I) -> Self { + Self { hash, inner } + } + + /// Split the [PreHashed] value into its hash and inner value. + pub fn into_parts(self) -> (H, I) { + (self.hash, self.inner) + } + + fn inner(&self) -> &I { + &self.inner + } +} + +impl PreHashed { + /// Create a new [PreHashed] value from a [BuildHasher]. + fn new_from_builder(hasher: &B, inner: I) -> Self { + Self::new(hasher.hash_one(&inner), inner) + } +} + +impl Deref for PreHashed { + type Target = I; + + fn deref(&self) -> &Self::Target { + self.inner() + } +} + +impl AsRef for PreHashed { + fn as_ref(&self) -> &I { + self.inner() + } +} + +impl Hash for PreHashed { + fn hash(&self, state: &mut S) { + self.hash.hash(state) + } +} + +impl Eq for PreHashed {} + +impl PartialEq for PreHashed { + // note: we compare the values, not the hashes + fn eq(&self, other: &Self) -> bool { + self.inner.eq(&other.inner) + } +} + +impl fmt::Display for PreHashed { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.inner.fmt(f) + } +} + +/// An implementer of [Hash] that simply returns the pre-computed hash. +#[derive(Copy, Clone, Debug, Default)] +pub struct PassThroughHash(u64); + +impl PassThroughHash { + pub fn new() -> Self { + Default::default() + } +} + +impl Hasher for PassThroughHash { + fn write(&mut self, _bytes: &[u8]) { + unimplemented!("do not use") + } + + fn write_u64(&mut self, i: u64) { + self.0 = i; + } + + fn finish(&self) -> u64 { + self.0 + } +} + +/// An extension trait for [BuildHasher] that provides the +/// [BuildHasherExt::prehash] method. +pub trait BuildHasherExt: BuildHasher { + type Hash; + + fn prehash(&self, value: T) -> PreHashed; +} + +impl BuildHasherExt for B { + type Hash = u64; + + fn prehash(&self, value: T) -> PreHashed { + PreHashed::new_from_builder(self, value) + } +} diff --git a/crates/turbo-static/.gitignore b/crates/turbo-static/.gitignore new file mode 100644 index 0000000000000..32d96908cdc6b --- /dev/null +++ b/crates/turbo-static/.gitignore @@ -0,0 +1,2 @@ +call_resolver.bincode +graph.cypherl diff --git a/crates/turbo-static/Cargo.toml b/crates/turbo-static/Cargo.toml new file mode 100644 index 0000000000000..699c00f64f88c --- /dev/null +++ b/crates/turbo-static/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "turbo-static" +version = "0.1.0" +edition = "2021" +license = "MPL-2.0" + +[dependencies] +bincode = "1.3.3" +clap = { workspace = true, features = ["derive"] } +ctrlc = "3.4.4" +ignore = "0.4.22" +itertools.workspace = true +lsp-server = "0.7.6" +lsp-types = "0.95.1" +proc-macro2 = { workspace = true, features = ["span-locations"] } +serde = { workspace = true, features = ["derive"] } +serde_json.workspace = true +serde_path_to_error = "0.1.16" +syn = { version = "2", features = ["parsing", "full", "visit", "extra-traits"] } +tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } +tracing.workspace = true +walkdir = "2.5.0" + +[lints] +workspace = true diff --git a/crates/turbo-static/readme.md b/crates/turbo-static/readme.md new file mode 100644 index 0000000000000..4ad86f1490410 --- /dev/null +++ b/crates/turbo-static/readme.md @@ -0,0 +1,33 @@ +# Turbo Static + +Leverages rust-analyzer to build a complete view into the static dependency +graph for your turbo tasks project. + +## How it works + +- find all occurences of #[turbo_tasks::function] across all the packages you + want to query +- for each of the tasks we find, query rust analyzer to see which tasks call + them +- apply some very basis control flow analysis to determine whether the call is + made 1 time, 0/1 times, or 0+ times, corresponding to direct calls, + conditionals, or for loops +- produce a cypher file that can be loaded into a graph database to query the + static dependency graph + +## Usage + +This uses an in memory persisted database to cache rust-analyzer queries. +To reset the cache, pass the `--reindex` flag. Running will produce a +`graph.cypherl` file which can be loaded into any cypher-compatible database. + +```bash +# pass in the root folders you want to analyze. the system will recursively +# parse all rust code looking for turbo tasks functions +cargo run --release -- ../../../turbo ../../../next.js +# now you can load graph.cypherl into your database of choice, such as neo4j +docker run \ + --publish=7474:7474 --publish=7687:7687 \ + --volume=$HOME/neo4j/data:/data \ + neo4j +``` diff --git a/crates/turbo-static/src/call_resolver.rs b/crates/turbo-static/src/call_resolver.rs new file mode 100644 index 0000000000000..aec97607a9438 --- /dev/null +++ b/crates/turbo-static/src/call_resolver.rs @@ -0,0 +1,165 @@ +use std::{collections::HashMap, fs::OpenOptions, path::PathBuf}; + +use crate::{lsp_client::RAClient, Identifier, IdentifierReference}; + +/// A wrapper around a rust-analyzer client that can resolve call references. +/// This is quite expensive so we cache the results in an on-disk key-value +/// store. +pub struct CallResolver<'a> { + client: &'a mut RAClient, + state: HashMap>, + path: Option, +} + +/// On drop, serialize the state to disk +impl<'a> Drop for CallResolver<'a> { + fn drop(&mut self) { + let file = OpenOptions::new() + .create(true) + .truncate(false) + .write(true) + .open(self.path.as_ref().unwrap()) + .unwrap(); + bincode::serialize_into(file, &self.state).unwrap(); + } +} + +impl<'a> CallResolver<'a> { + pub fn new(client: &'a mut RAClient, path: Option) -> Self { + // load bincode-encoded HashMap from path + let state = path + .as_ref() + .and_then(|path| { + let file = OpenOptions::new() + .create(true) + .truncate(false) + .read(true) + .write(true) + .open(path) + .unwrap(); + let reader = std::io::BufReader::new(file); + bincode::deserialize_from::<_, HashMap>>( + reader, + ) + .map_err(|e| { + tracing::warn!("failed to load existing cache, restarting"); + e + }) + .ok() + }) + .unwrap_or_default(); + Self { + client, + state, + path, + } + } + + pub fn cached_count(&self) -> usize { + self.state.len() + } + + pub fn cleared(mut self) -> Self { + // delete file if exists and clear state + self.state = Default::default(); + if let Some(path) = self.path.as_ref() { + std::fs::remove_file(path).unwrap(); + } + self + } + + pub fn resolve(&mut self, ident: &Identifier) -> Vec { + if let Some(data) = self.state.get(ident) { + tracing::info!("skipping {}", ident); + return data.to_owned(); + }; + + tracing::info!("checking {}", ident); + + let mut count = 0; + let _response = loop { + let Some(response) = self.client.request(lsp_server::Request { + id: 1.into(), + method: "textDocument/prepareCallHierarchy".to_string(), + params: serde_json::to_value(&lsp_types::CallHierarchyPrepareParams { + text_document_position_params: lsp_types::TextDocumentPositionParams { + position: ident.range.start, + text_document: lsp_types::TextDocumentIdentifier { + uri: lsp_types::Url::from_file_path(&ident.path).unwrap(), + }, + }, + work_done_progress_params: lsp_types::WorkDoneProgressParams { + work_done_token: Some(lsp_types::ProgressToken::String( + "prepare".to_string(), + )), + }, + }) + .unwrap(), + }) else { + tracing::warn!("RA server shut down"); + return vec![]; + }; + + if let Some(Some(value)) = response.result.as_ref().map(|r| r.as_array()) { + if !value.is_empty() { + break value.to_owned(); + } + count += 1; + } + + // textDocument/prepareCallHierarchy will sometimes return an empty array so try + // at most 5 times + if count > 5 { + tracing::warn!("discovered isolated task {}", ident); + break vec![]; + } + + std::thread::sleep(std::time::Duration::from_secs(1)); + }; + + // callHierarchy/incomingCalls + let Some(response) = self.client.request(lsp_server::Request { + id: 1.into(), + method: "callHierarchy/incomingCalls".to_string(), + params: serde_json::to_value(lsp_types::CallHierarchyIncomingCallsParams { + partial_result_params: lsp_types::PartialResultParams::default(), + item: lsp_types::CallHierarchyItem { + name: ident.name.to_owned(), + kind: lsp_types::SymbolKind::FUNCTION, + data: None, + tags: None, + detail: None, + uri: lsp_types::Url::from_file_path(&ident.path).unwrap(), + range: ident.range, + selection_range: ident.range, + }, + work_done_progress_params: lsp_types::WorkDoneProgressParams { + work_done_token: Some(lsp_types::ProgressToken::String("prepare".to_string())), + }, + }) + .unwrap(), + }) else { + tracing::warn!("RA server shut down"); + return vec![]; + }; + + let links = if let Some(e) = response.error { + tracing::warn!("unable to resolve {}: {:?}", ident, e); + vec![] + } else { + let response: Result, _> = + serde_path_to_error::deserialize(response.result.unwrap()); + + response + .unwrap() + .into_iter() + .map(|i| i.into()) + .collect::>() + }; + + tracing::debug!("links: {:?}", links); + + self.state.insert(ident.to_owned(), links.clone()); + links + } +} diff --git a/crates/turbo-static/src/identifier.rs b/crates/turbo-static/src/identifier.rs new file mode 100644 index 0000000000000..c92a3da7bb5d2 --- /dev/null +++ b/crates/turbo-static/src/identifier.rs @@ -0,0 +1,95 @@ +use std::{fs, path::PathBuf}; + +use lsp_types::{CallHierarchyIncomingCall, CallHierarchyItem, Range}; + +/// A task that references another, with the range of the reference +#[derive(Hash, PartialEq, Eq, serde::Deserialize, serde::Serialize, Clone, Debug)] +pub struct IdentifierReference { + pub identifier: Identifier, + pub references: Vec, // the places where this identifier is used +} + +/// identifies a task by its file, and range in the file +#[derive(Hash, PartialEq, Eq, serde::Deserialize, serde::Serialize, Clone)] +pub struct Identifier { + pub path: String, + // technically you can derive this from the name and range but it's easier to just store it + pub name: String, + // post_transform_name: Option, + pub range: lsp_types::Range, +} + +impl Identifier { + /// check the span matches and the text matches + /// + /// `same_location` is used to check if the location of the identifier is + /// the same as the other + pub fn equals_ident(&self, other: &syn::Ident, match_location: bool) -> bool { + *other == self.name + && (!match_location + || (self.range.start.line == other.span().start().line as u32 + && self.range.start.character == other.span().start().column as u32)) + } + + /// We cannot use `item.name` here in all cases as, during testing, the name + /// does not always align with the exact text in the range. + fn get_name(item: &CallHierarchyItem) -> String { + // open file, find range inside, extract text + let file = fs::read_to_string(item.uri.path()).unwrap(); + let start = item.selection_range.start; + let end = item.selection_range.end; + file.lines() + .nth(start.line as usize) + .unwrap() + .chars() + .skip(start.character as usize) + .take(end.character as usize - start.character as usize) + .collect() + } +} + +impl From<(PathBuf, syn::Ident)> for Identifier { + fn from((path, ident): (PathBuf, syn::Ident)) -> Self { + Self { + path: path.display().to_string(), + name: ident.to_string(), + // post_transform_name: None, + range: Range { + start: lsp_types::Position { + line: ident.span().start().line as u32 - 1, + character: ident.span().start().column as u32, + }, + end: lsp_types::Position { + line: ident.span().end().line as u32 - 1, + character: ident.span().end().column as u32, + }, + }, + } + } +} + +impl From for IdentifierReference { + fn from(item: CallHierarchyIncomingCall) -> Self { + Self { + identifier: Identifier { + name: Identifier::get_name(&item.from), + // post_transform_name: Some(item.from.name), + path: item.from.uri.path().to_owned(), + range: item.from.selection_range, + }, + references: item.from_ranges, + } + } +} + +impl std::fmt::Debug for Identifier { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + std::fmt::Display::fmt(self, f) + } +} + +impl std::fmt::Display for Identifier { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}:{}#{}", self.path, self.range.start.line, self.name,) + } +} diff --git a/crates/turbo-static/src/lsp_client.rs b/crates/turbo-static/src/lsp_client.rs new file mode 100644 index 0000000000000..25d29a7efd26d --- /dev/null +++ b/crates/turbo-static/src/lsp_client.rs @@ -0,0 +1,161 @@ +use std::{path::PathBuf, process, sync::mpsc}; + +use lsp_server::Message; + +/// An LSP client for Rust Analyzer (RA) that launches it as a subprocess. +pub struct RAClient { + /// Handle to the client + handle: process::Child, + sender: Option>, + receiver: Option>, +} + +impl RAClient { + /// Create a new LSP client for Rust Analyzer. + pub fn new() -> Self { + let stdin = process::Stdio::piped(); + let stdout = process::Stdio::piped(); + let stderr = process::Stdio::inherit(); + + let child = process::Command::new("rust-analyzer") + .stdin(stdin) + .stdout(stdout) + .stderr(stderr) + // .env("RA_LOG", "info") + .env("RUST_BACKTRACE", "1") + .spawn() + .expect("Failed to start RA LSP server"); + Self { + handle: child, + sender: None, + receiver: None, + } + } + + pub fn start(&mut self, folders: &[PathBuf]) { + let stdout = self.handle.stdout.take().unwrap(); + let mut stdin = self.handle.stdin.take().unwrap(); + + let (writer_sender, writer_receiver) = mpsc::sync_channel::(0); + _ = std::thread::spawn(move || { + writer_receiver + .into_iter() + .try_for_each(|it| it.write(&mut stdin)) + }); + + let (reader_sender, reader_receiver) = mpsc::sync_channel::(0); + _ = std::thread::spawn(move || { + let mut reader = std::io::BufReader::new(stdout); + while let Ok(Some(msg)) = Message::read(&mut reader) { + reader_sender + .send(msg) + .expect("receiver was dropped, failed to send a message"); + } + }); + + self.sender = Some(writer_sender); + self.receiver = Some(reader_receiver); + + let workspace_paths = folders + .iter() + .map(|p| std::fs::canonicalize(p).unwrap()) + .map(|p| lsp_types::WorkspaceFolder { + name: p.file_name().unwrap().to_string_lossy().to_string(), + uri: lsp_types::Url::from_file_path(p).unwrap(), + }) + .collect::>(); + + _ = self.request(lsp_server::Request { + id: 1.into(), + method: "initialize".to_string(), + params: serde_json::to_value(lsp_types::InitializeParams { + workspace_folders: Some(workspace_paths), + process_id: Some(std::process::id()), + capabilities: lsp_types::ClientCapabilities { + workspace: Some(lsp_types::WorkspaceClientCapabilities { + workspace_folders: Some(true), + ..Default::default() + }), + ..Default::default() + }, + work_done_progress_params: lsp_types::WorkDoneProgressParams { + work_done_token: Some(lsp_types::ProgressToken::String("prepare".to_string())), + }, + // we use workspace_folders so root_path and root_uri can be + // empty + ..Default::default() + }) + .unwrap(), + }); + + self.notify(lsp_server::Notification { + method: "initialized".to_string(), + params: serde_json::to_value(lsp_types::InitializedParams {}).unwrap(), + }); + } + + /// Send an LSP request to the server. This returns an option + /// in the case of an error such as the server being shut down + /// from pressing `Ctrl+C`. + pub fn request(&mut self, message: lsp_server::Request) -> Option { + tracing::debug!("sending {:?}", message); + self.sender + .as_mut() + .unwrap() + .send(Message::Request(message)) + .ok()?; + + loop { + match self.receiver.as_mut().unwrap().recv() { + Ok(lsp_server::Message::Response(response)) => { + tracing::debug!("received {:?}", response); + return Some(response); + } + Ok(m) => tracing::trace!("unexpected message: {:?}", m), + Err(_) => { + tracing::trace!("error receiving message"); + return None; + } + } + } + } + + pub fn notify(&mut self, message: lsp_server::Notification) { + self.sender + .as_mut() + .unwrap() + .send(Message::Notification(message)) + .expect("failed to send message"); + } +} + +impl Drop for RAClient { + fn drop(&mut self) { + if self.sender.is_some() { + let Some(resp) = self.request(lsp_server::Request { + id: 1.into(), + method: "shutdown".to_string(), + params: serde_json::to_value(()).unwrap(), + }) else { + return; + }; + + if resp.error.is_none() { + tracing::info!("shutting down RA LSP server"); + self.notify(lsp_server::Notification { + method: "exit".to_string(), + params: serde_json::to_value(()).unwrap(), + }); + self.handle + .wait() + .expect("failed to wait for RA LSP server"); + tracing::info!("shut down RA LSP server"); + } else { + tracing::error!("failed to shutdown RA LSP server: {:#?}", resp); + } + } + + self.sender = None; + self.receiver = None; + } +} diff --git a/crates/turbo-static/src/main.rs b/crates/turbo-static/src/main.rs new file mode 100644 index 0000000000000..a3eece260d62c --- /dev/null +++ b/crates/turbo-static/src/main.rs @@ -0,0 +1,303 @@ +#![feature(entry_insert)] + +use std::{ + collections::{HashMap, HashSet}, + error::Error, + fs, + path::PathBuf, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, + }, +}; + +use call_resolver::CallResolver; +use clap::Parser; +use identifier::{Identifier, IdentifierReference}; +use itertools::Itertools; +use syn::visit::Visit; +use visitor::CallingStyleVisitor; + +use crate::visitor::CallingStyle; + +mod call_resolver; +mod identifier; +mod lsp_client; +mod visitor; + +#[derive(Parser)] +struct Opt { + #[clap(required = true)] + paths: Vec, + + /// reparse all files + #[clap(long)] + reparse: bool, + + /// reindex all files + #[clap(long)] + reindex: bool, +} + +fn main() -> Result<(), Box> { + tracing_subscriber::fmt::init(); + let opt = Opt::parse(); + + let mut connection = lsp_client::RAClient::new(); + connection.start(&opt.paths); + + let call_resolver = CallResolver::new(&mut connection, Some("call_resolver.bincode".into())); + let mut call_resolver = if opt.reindex { + call_resolver.cleared() + } else { + call_resolver + }; + + let halt = Arc::new(AtomicBool::new(false)); + let halt_clone = halt.clone(); + ctrlc::set_handler({ + move || { + halt_clone.store(true, Ordering::SeqCst); + } + })?; + + tracing::info!("getting tasks"); + let mut tasks = get_all_tasks(&opt.paths); + let dep_tree = resolve_tasks(&mut tasks, &mut call_resolver, halt.clone()); + let concurrency = resolve_concurrency(&tasks, &dep_tree, halt.clone()); + + write_dep_tree(&tasks, concurrency, std::path::Path::new("graph.cypherl")); + + if halt.load(Ordering::Relaxed) { + tracing::info!("ctrl-c detected, exiting"); + } + + Ok(()) +} + +/// search the given folders recursively and attempt to find all tasks inside +#[tracing::instrument(skip_all)] +fn get_all_tasks(folders: &[PathBuf]) -> HashMap> { + let mut out = HashMap::new(); + + for folder in folders { + let walker = ignore::Walk::new(folder); + for entry in walker { + let entry = entry.unwrap(); + let rs_file = if let Some(true) = entry.file_type().map(|t| t.is_file()) { + let path = entry.path(); + let ext = path.extension().unwrap_or_default(); + if ext == "rs" { + std::fs::canonicalize(path).unwrap() + } else { + continue; + } + } else { + continue; + }; + + let file = fs::read_to_string(&rs_file).unwrap(); + let lines = file.lines(); + let mut occurences = vec![]; + + tracing::debug!("processing {}", rs_file.display()); + + for ((_, line), (line_no, _)) in lines.enumerate().tuple_windows() { + if line.contains("turbo_tasks::function") { + tracing::debug!("found at {:?}:L{}", rs_file, line_no); + occurences.push(line_no + 1); + } + } + + if occurences.is_empty() { + continue; + } + + // parse the file using syn and get the span of the functions + let file = syn::parse_file(&file).unwrap(); + let occurences_count = occurences.len(); + let mut visitor = visitor::TaskVisitor::new(); + syn::visit::visit_file(&mut visitor, &file); + if visitor.results.len() != occurences_count { + tracing::warn!( + "file {:?} passed the heuristic with {:?} but the visitor found {:?}", + rs_file, + occurences_count, + visitor.results.len() + ); + } + + out.extend( + visitor + .results + .into_iter() + .map(move |(ident, tags)| ((rs_file.clone(), ident).into(), tags)), + ) + } + } + + out +} + +/// Given a list of tasks, get all the tasks that call that one +fn resolve_tasks( + tasks: &mut HashMap>, + client: &mut CallResolver, + halt: Arc, +) -> HashMap> { + tracing::info!( + "found {} tasks, of which {} cached", + tasks.len(), + client.cached_count() + ); + + let mut unresolved = tasks.keys().cloned().collect::>(); + let mut resolved = HashMap::new(); + + while let Some(top) = unresolved.iter().next().cloned() { + unresolved.remove(&top); + + let callers = client.resolve(&top); + + // add all non-task callers to the unresolved list if they are not in the + // resolved list + for caller in callers.iter() { + if !resolved.contains_key(&caller.identifier) + && !unresolved.contains(&caller.identifier) + { + tracing::debug!("adding {} to unresolved", caller.identifier); + unresolved.insert(caller.identifier.to_owned()); + } + } + resolved.insert(top.to_owned(), callers); + + if halt.load(Ordering::Relaxed) { + break; + } + } + + resolved +} + +/// given a map of tasks and functions that call it, produce a map of tasks and +/// those tasks that it calls +/// +/// returns a list of pairs with a task, the task that calls it, and the calling +/// style +fn resolve_concurrency( + task_list: &HashMap>, + dep_tree: &HashMap>, // pairs of tasks and call trees + halt: Arc, +) -> Vec<(Identifier, Identifier, CallingStyle)> { + // println!("{:?}", dep_tree); + // println!("{:#?}", task_list); + + let mut edges = vec![]; + + for (ident, references) in dep_tree { + for reference in references { + if !dep_tree.contains_key(&reference.identifier) { + // this is a task that is not in the task list + // so we can't resolve it + tracing::error!("missing task for {}: {}", ident, reference.identifier); + for task in task_list.keys() { + if task.name == reference.identifier.name { + // we found a task that is not in the task list + // so we can't resolve it + tracing::trace!("- found {}", task); + continue; + } + } + continue; + } else { + // load the source file and get the calling style + let target = IdentifierReference { + identifier: ident.clone(), + references: reference.references.clone(), + }; + let mut visitor = CallingStyleVisitor::new(target); + tracing::info!("looking for {} from {}", ident, reference.identifier); + let file = + syn::parse_file(&fs::read_to_string(&reference.identifier.path).unwrap()) + .unwrap(); + visitor.visit_file(&file); + + edges.push(( + ident.clone(), + reference.identifier.clone(), + visitor.result().unwrap_or(CallingStyle::Once), + )); + } + + if halt.load(Ordering::Relaxed) { + break; + } + } + } + + // parse each fn between parent and child and get the max calling style + + edges +} + +/// Write the dep tree into the given file using cypher syntax +fn write_dep_tree( + task_list: &HashMap>, + dep_tree: Vec<(Identifier, Identifier, CallingStyle)>, + out: &std::path::Path, +) { + use std::io::Write; + + let mut node_ids = HashMap::new(); + let mut counter = 0; + + let mut file = std::fs::File::create(out).unwrap(); + + let empty = vec![]; + + // collect all tasks as well as all intermediate nodes + // tasks come last to ensure the tags are preserved + let node_list = dep_tree + .iter() + .flat_map(|(dest, src, _)| [(src, &empty), (dest, &empty)]) + .chain(task_list) + .collect::>(); + + for (ident, tags) in node_list { + counter += 1; + + let label = if !task_list.contains_key(ident) { + "Function" + } else if tags.contains(&"fs".to_string()) || tags.contains(&"network".to_string()) { + "ImpureTask" + } else { + "Task" + }; + + _ = writeln!( + file, + "CREATE (n_{}:{} {{name: '{}', file: '{}', line: {}, tags: [{}]}})", + counter, + label, + ident.name, + ident.path, + ident.range.start.line, + tags.iter().map(|t| format!("\"{}\"", t)).join(",") + ); + node_ids.insert(ident, counter); + } + + for (dest, src, style) in &dep_tree { + let style = match style { + CallingStyle::Once => "ONCE", + CallingStyle::ZeroOrOnce => "ZERO_OR_ONCE", + CallingStyle::ZeroOrMore => "ZERO_OR_MORE", + CallingStyle::OneOrMore => "ONE_OR_MORE", + }; + + let src_id = *node_ids.get(src).unwrap(); + let dst_id = *node_ids.get(dest).unwrap(); + + _ = writeln!(file, "CREATE (n_{})-[:{}]->(n_{})", src_id, style, dst_id,); + } +} diff --git a/crates/turbo-static/src/visitor.rs b/crates/turbo-static/src/visitor.rs new file mode 100644 index 0000000000000..113c1a4e1218f --- /dev/null +++ b/crates/turbo-static/src/visitor.rs @@ -0,0 +1,275 @@ +//! A visitor that traverses the AST and collects all functions or methods that +//! are annotated with `#[turbo_tasks::function]`. + +use std::{collections::VecDeque, ops::Add}; + +use lsp_types::Range; +use syn::{visit::Visit, Expr, Meta}; + +use crate::identifier::Identifier; + +pub struct TaskVisitor { + /// the list of results as pairs of an identifier and its tags + pub results: Vec<(syn::Ident, Vec)>, +} + +impl TaskVisitor { + pub fn new() -> Self { + Self { + results: Default::default(), + } + } +} + +impl Visit<'_> for TaskVisitor { + #[tracing::instrument(skip_all)] + fn visit_item_fn(&mut self, i: &syn::ItemFn) { + if let Some(tags) = extract_tags(i.attrs.iter()) { + tracing::trace!("L{}: {}", i.sig.ident.span().start().line, i.sig.ident,); + self.results.push((i.sig.ident.clone(), tags)); + } + } + + #[tracing::instrument(skip_all)] + fn visit_impl_item_fn(&mut self, i: &syn::ImplItemFn) { + if let Some(tags) = extract_tags(i.attrs.iter()) { + tracing::trace!("L{}: {}", i.sig.ident.span().start().line, i.sig.ident,); + self.results.push((i.sig.ident.clone(), tags)); + } + } +} + +fn extract_tags<'a>(mut meta: impl Iterator) -> Option> { + meta.find_map(|a| match &a.meta { + // path has two segments, turbo_tasks and function + Meta::Path(path) if path.segments.len() == 2 => { + let first = &path.segments[0]; + let second = &path.segments[1]; + (first.ident == "turbo_tasks" && second.ident == "function").then(std::vec::Vec::new) + } + Meta::List(list) if list.path.segments.len() == 2 => { + let first = &list.path.segments[0]; + let second = &list.path.segments[1]; + if first.ident != "turbo_tasks" || second.ident != "function" { + return None; + } + + // collect ident tokens as args + let tags: Vec<_> = list + .tokens + .clone() + .into_iter() + .filter_map(|t| { + if let proc_macro2::TokenTree::Ident(ident) = t { + Some(ident.to_string()) + } else { + None + } + }) + .collect(); + + Some(tags) + } + _ => { + tracing::trace!("skipping unknown annotation"); + None + } + }) +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd)] +pub enum CallingStyle { + Once = 0b0010, + ZeroOrOnce = 0b0011, + ZeroOrMore = 0b0111, + OneOrMore = 0b0110, +} + +impl CallingStyle { + fn bitset(self) -> u8 { + self as u8 + } +} + +impl Add for CallingStyle { + type Output = Self; + + /// Add two calling styles together to determine the calling style of the + /// target function within the source function. + /// + /// Consider it as a bitset over properties. + /// - 0b000: Nothing + /// - 0b001: Zero + /// - 0b010: Once + /// - 0b011: Zero Or Once + /// - 0b100: More Than Once + /// - 0b101: Zero Or More Than Once (?) + /// - 0b110: Once Or More + /// - 0b111: Zero Or More + /// + /// Note that zero is not a valid calling style. + fn add(self, rhs: Self) -> Self { + let left = self.bitset(); + let right = rhs.bitset(); + + // we treat this as a bitset under addition + #[allow(clippy::suspicious_arithmetic_impl)] + match left | right { + 0b0010 => CallingStyle::Once, + 0b011 => CallingStyle::ZeroOrOnce, + 0b0111 => CallingStyle::ZeroOrMore, + 0b0110 => CallingStyle::OneOrMore, + // the remaining 4 (null, zero, more than once, zero or more than once) + // are unreachable because we don't detect 'zero' or 'more than once' + _ => unreachable!(), + } + } +} + +pub struct CallingStyleVisitor { + pub reference: crate::IdentifierReference, + state: VecDeque, + halt: bool, +} + +impl CallingStyleVisitor { + /// Create a new visitor that will traverse the AST and determine the + /// calling style of the target function within the source function. + pub fn new(reference: crate::IdentifierReference) -> Self { + Self { + reference, + state: Default::default(), + halt: false, + } + } + + pub fn result(self) -> Option { + self.state + .into_iter() + .map(|b| match b { + CallingStyleVisitorState::Block => CallingStyle::Once, + CallingStyleVisitorState::Loop => CallingStyle::ZeroOrMore, + CallingStyleVisitorState::If => CallingStyle::ZeroOrOnce, + CallingStyleVisitorState::Closure => CallingStyle::ZeroOrMore, + }) + .reduce(|a, b| a + b) + } +} + +#[derive(Debug, Clone, Copy)] +enum CallingStyleVisitorState { + Block, + Loop, + If, + Closure, +} + +impl Visit<'_> for CallingStyleVisitor { + fn visit_item_fn(&mut self, i: &'_ syn::ItemFn) { + self.state.push_back(CallingStyleVisitorState::Block); + syn::visit::visit_item_fn(self, i); + if !self.halt { + self.state.pop_back(); + } + } + + fn visit_impl_item_fn(&mut self, i: &'_ syn::ImplItemFn) { + self.state.push_back(CallingStyleVisitorState::Block); + syn::visit::visit_impl_item_fn(self, i); + if !self.halt { + self.state.pop_back(); + } + } + + fn visit_expr_loop(&mut self, i: &'_ syn::ExprLoop) { + self.state.push_back(CallingStyleVisitorState::Loop); + syn::visit::visit_expr_loop(self, i); + if !self.halt { + self.state.pop_back(); + } + } + + fn visit_expr_for_loop(&mut self, i: &'_ syn::ExprForLoop) { + self.state.push_back(CallingStyleVisitorState::Loop); + syn::visit::visit_expr_for_loop(self, i); + if !self.halt { + self.state.pop_back(); + } + } + + fn visit_expr_if(&mut self, i: &'_ syn::ExprIf) { + self.state.push_back(CallingStyleVisitorState::If); + syn::visit::visit_expr_if(self, i); + if !self.halt { + self.state.pop_back(); + } + } + + fn visit_expr_closure(&mut self, i: &'_ syn::ExprClosure) { + self.state.push_back(CallingStyleVisitorState::Closure); + syn::visit::visit_expr_closure(self, i); + if !self.halt { + self.state.pop_back(); + } + } + + fn visit_expr_call(&mut self, i: &'_ syn::ExprCall) { + syn::visit::visit_expr_call(self, i); + if let Expr::Path(p) = i.func.as_ref() { + if let Some(last) = p.path.segments.last() { + if is_match( + &self.reference.identifier, + &last.ident, + &self.reference.references, + ) { + self.halt = true; + } + } + } + } + + // to validate this, we first check if the name is the same and then compare it + // against any of the references we are holding + fn visit_expr_method_call(&mut self, i: &'_ syn::ExprMethodCall) { + if is_match( + &self.reference.identifier, + &i.method, + &self.reference.references, + ) { + self.halt = true; + } + + syn::visit::visit_expr_method_call(self, i); + } +} + +/// Check if some ident referenced by `check` is calling the `target` by +/// looking it up in the list of known `ranges`. +fn is_match(target: &Identifier, check: &syn::Ident, ranges: &[Range]) -> bool { + if target.equals_ident(check, false) { + let span = check.span(); + // syn is 1-indexed, range is not + for reference in ranges { + if reference.start.line != span.start().line as u32 - 1 { + continue; + } + + if reference.start.character != span.start().column as u32 { + continue; + } + + if reference.end.line != span.end().line as u32 - 1 { + continue; + } + + if reference.end.character != span.end().column as u32 { + continue; + } + + // match, just exit the visitor + return true; + } + } + + false +} diff --git a/crates/turbo-tasks-env/src/command_line.rs b/crates/turbo-tasks-env/src/command_line.rs index 51b763183ddc2..e3ffa7e70765c 100644 --- a/crates/turbo-tasks-env/src/command_line.rs +++ b/crates/turbo-tasks-env/src/command_line.rs @@ -1,5 +1,5 @@ use indexmap::IndexMap; -use turbo_tasks::Vc; +use turbo_tasks::{RcStr, Vc}; use crate::{sorted_env_vars, EnvMap, ProcessEnv, GLOBAL_ENV_LOCK}; @@ -16,7 +16,7 @@ impl CommandLineProcessEnv { } /// Clones the current env vars into a IndexMap. -fn env_snapshot() -> IndexMap { +fn env_snapshot() -> IndexMap { let _lock = GLOBAL_ENV_LOCK.lock().unwrap(); sorted_env_vars() } diff --git a/crates/turbo-tasks-env/src/custom.rs b/crates/turbo-tasks-env/src/custom.rs index f24f63e499fad..2f3eec2c770dd 100644 --- a/crates/turbo-tasks-env/src/custom.rs +++ b/crates/turbo-tasks-env/src/custom.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use turbo_tasks::Vc; +use turbo_tasks::{RcStr, Vc}; use crate::{case_insensitive_read, EnvMap, ProcessEnv}; @@ -32,7 +32,7 @@ impl ProcessEnv for CustomProcessEnv { } #[turbo_tasks::function] - async fn read(&self, name: String) -> Result>> { + async fn read(&self, name: RcStr) -> Result>> { let custom = case_insensitive_read(self.custom, name.clone()); match &*custom.await? { Some(_) => Ok(custom), diff --git a/crates/turbo-tasks-env/src/dotenv.rs b/crates/turbo-tasks-env/src/dotenv.rs index d32cde2af6004..9f65765cf7001 100644 --- a/crates/turbo-tasks-env/src/dotenv.rs +++ b/crates/turbo-tasks-env/src/dotenv.rs @@ -2,7 +2,7 @@ use std::{env, sync::MutexGuard}; use anyhow::{anyhow, Context, Result}; use indexmap::IndexMap; -use turbo_tasks::{ValueToString, Vc}; +use turbo_tasks::{RcStr, ValueToString, Vc}; use turbo_tasks_fs::{FileContent, FileSystemPath}; use crate::{sorted_env_vars, EnvMap, ProcessEnv, GLOBAL_ENV_LOCK}; @@ -84,11 +84,7 @@ impl ProcessEnv for DotenvProcessEnv { } /// Restores the global env variables to mirror `to`. -fn restore_env( - from: &IndexMap, - to: &IndexMap, - _lock: &MutexGuard<()>, -) { +fn restore_env(from: &IndexMap, to: &IndexMap, _lock: &MutexGuard<()>) { for key in from.keys() { if !to.contains_key(key) { env::remove_var(key); diff --git a/crates/turbo-tasks-env/src/filter.rs b/crates/turbo-tasks-env/src/filter.rs index bd8fb1f86abe8..5b5da3639e3ee 100644 --- a/crates/turbo-tasks-env/src/filter.rs +++ b/crates/turbo-tasks-env/src/filter.rs @@ -1,6 +1,6 @@ use anyhow::Result; use indexmap::IndexMap; -use turbo_tasks::Vc; +use turbo_tasks::{RcStr, Vc}; use crate::{EnvMap, ProcessEnv}; @@ -9,16 +9,19 @@ use crate::{EnvMap, ProcessEnv}; #[turbo_tasks::value] pub struct FilterProcessEnv { prior: Vc>, - filters: Vec, + filters: Vec, } #[turbo_tasks::value_impl] impl FilterProcessEnv { #[turbo_tasks::function] - pub fn new(prior: Vc>, filters: Vec) -> Vc { + pub fn new(prior: Vc>, filters: Vec) -> Vc { FilterProcessEnv { prior, - filters: filters.into_iter().map(|f| f.to_uppercase()).collect(), + filters: filters + .into_iter() + .map(|f| f.to_uppercase().into()) + .collect(), } .cell() } @@ -33,7 +36,7 @@ impl ProcessEnv for FilterProcessEnv { for (key, value) in &*prior { let uppercase = key.to_uppercase(); for filter in &self.filters { - if uppercase.starts_with(filter) { + if uppercase.starts_with(&**filter) { filtered.insert(key.clone(), value.clone()); break; } @@ -43,9 +46,9 @@ impl ProcessEnv for FilterProcessEnv { } #[turbo_tasks::function] - fn read(&self, name: String) -> Vc> { + fn read(&self, name: RcStr) -> Vc> { for filter in &self.filters { - if name.to_uppercase().starts_with(filter) { + if name.to_uppercase().starts_with(&**filter) { return self.prior.read(name); } } diff --git a/crates/turbo-tasks-env/src/lib.rs b/crates/turbo-tasks-env/src/lib.rs index db35acfd2d90b..6d4880ff6fbaf 100644 --- a/crates/turbo-tasks-env/src/lib.rs +++ b/crates/turbo-tasks-env/src/lib.rs @@ -9,7 +9,7 @@ use std::{env, sync::Mutex}; use anyhow::Result; use indexmap::IndexMap; -use turbo_tasks::Vc; +use turbo_tasks::{RcStr, Vc}; pub use self::{ command_line::CommandLineProcessEnv, custom::CustomProcessEnv, dotenv::DotenvProcessEnv, @@ -17,7 +17,7 @@ pub use self::{ }; #[turbo_tasks::value(transparent)] -pub struct EnvMap(#[turbo_tasks(trace_ignore)] IndexMap); +pub struct EnvMap(#[turbo_tasks(trace_ignore)] IndexMap); #[turbo_tasks::value_impl] impl EnvMap { @@ -35,7 +35,7 @@ impl ProcessEnv for EnvMap { } #[turbo_tasks::function] - async fn read(self: Vc, name: String) -> Vc> { + async fn read(self: Vc, name: RcStr) -> Vc> { case_insensitive_read(self, name) } } @@ -51,23 +51,25 @@ pub trait ProcessEnv { fn read_all(self: Vc) -> Vc; /// Reads a single env variable. Ignores casing. - fn read(self: Vc, name: String) -> Vc> { + fn read(self: Vc, name: RcStr) -> Vc> { case_insensitive_read(self.read_all(), name) } } -pub fn sorted_env_vars() -> IndexMap { - let mut vars = env::vars().collect::>(); +pub fn sorted_env_vars() -> IndexMap { + let mut vars = env::vars() + .map(|(k, v)| (k.into(), v.into())) + .collect::>(); vars.sort_keys(); vars } #[turbo_tasks::function] -pub async fn case_insensitive_read(map: Vc, name: String) -> Result>> { +pub async fn case_insensitive_read(map: Vc, name: RcStr) -> Result>> { Ok(Vc::cell( to_uppercase_map(map) .await? - .get(&name.to_uppercase()) + .get(&RcStr::from(name.to_uppercase())) .cloned(), )) } @@ -77,7 +79,7 @@ async fn to_uppercase_map(map: Vc) -> Result> { let map = &*map.await?; let mut new = IndexMap::with_capacity(map.len()); for (k, v) in map { - new.insert(k.to_uppercase(), v.clone()); + new.insert(k.to_uppercase().into(), v.clone()); } Ok(Vc::cell(new)) } diff --git a/crates/turbo-tasks-fetch/src/lib.rs b/crates/turbo-tasks-fetch/src/lib.rs index 7684fab16dbea..7cb59d1039b37 100644 --- a/crates/turbo-tasks-fetch/src/lib.rs +++ b/crates/turbo-tasks-fetch/src/lib.rs @@ -2,7 +2,7 @@ #![feature(arbitrary_self_types)] use anyhow::Result; -use turbo_tasks::Vc; +use turbo_tasks::{RcStr, Vc}; use turbo_tasks_fs::FileSystemPath; use turbopack_core::issue::{Issue, IssueSeverity, IssueStage, OptionStyledString, StyledString}; @@ -30,9 +30,9 @@ pub struct HttpResponseBody(pub Vec); #[turbo_tasks::value_impl] impl HttpResponseBody { #[turbo_tasks::function] - pub async fn to_string(self: Vc) -> Result> { + pub async fn to_string(self: Vc) -> Result> { let this = &*self.await?; - Ok(Vc::cell(std::str::from_utf8(&this.0)?.to_owned())) + Ok(Vc::cell(std::str::from_utf8(&this.0)?.into())) } } @@ -48,8 +48,8 @@ pub struct OptionProxyConfig(Option); #[turbo_tasks::function] pub async fn fetch( - url: Vc, - user_agent: Vc>, + url: Vc, + user_agent: Vc>, proxy_option: Vc, ) -> Result> { let url = &*url.await?; @@ -65,9 +65,9 @@ pub async fn fetch( let client = client_builder.build()?; - let mut builder = client.get(url); + let mut builder = client.get(url.as_str()); if let Some(user_agent) = user_agent { - builder = builder.header("User-Agent", user_agent); + builder = builder.header("User-Agent", user_agent.as_str()); } let response = builder.send().await.and_then(|r| r.error_for_status()); @@ -99,7 +99,7 @@ pub enum FetchErrorKind { #[turbo_tasks::value(shared)] pub struct FetchError { - pub url: Vc, + pub url: Vc, pub kind: Vc, pub detail: Vc, } @@ -117,8 +117,8 @@ impl FetchError { }; FetchError { - detail: StyledString::Text(error.to_string()).cell(), - url: Vc::cell(url.to_owned()), + detail: StyledString::Text(error.to_string().into()).cell(), + url: Vc::cell(url.into()), kind: kind.into(), } } @@ -148,7 +148,7 @@ impl FetchError { pub struct FetchIssue { pub issue_context: Vc, pub severity: Vc, - pub url: Vc, + pub url: Vc, pub kind: Vc, pub detail: Vc, } @@ -167,7 +167,7 @@ impl Issue for FetchIssue { #[turbo_tasks::function] fn title(&self) -> Vc { - StyledString::Text("Error while requesting resource".to_string()).cell() + StyledString::Text("Error while requesting resource".into()).cell() } #[turbo_tasks::function] @@ -185,15 +185,17 @@ impl Issue for FetchIssue { FetchErrorKind::Connect => format!( "There was an issue establishing a connection while requesting {}.", url - ), - FetchErrorKind::Status(status) => { - format!( - "Received response with status {} when requesting {}", - status, url - ) + ) + .into(), + FetchErrorKind::Status(status) => format!( + "Received response with status {} when requesting {}", + status, url + ) + .into(), + FetchErrorKind::Timeout => { + format!("Connection timed out when requesting {}", url).into() } - FetchErrorKind::Timeout => format!("Connection timed out when requesting {}", url), - FetchErrorKind::Other => format!("There was an issue requesting {}", url), + FetchErrorKind::Other => format!("There was an issue requesting {}", url).into(), }) .cell(), ))) diff --git a/crates/turbo-tasks-fetch/tests/fetch.rs b/crates/turbo-tasks-fetch/tests/fetch.rs index 0ccdcabce5168..531ad8f7ca354 100644 --- a/crates/turbo-tasks-fetch/tests/fetch.rs +++ b/crates/turbo-tasks-fetch/tests/fetch.rs @@ -21,7 +21,7 @@ async fn basic_get() { }); - let result = &*fetch(Vc::cell(server.url("/foo.woff")), Vc::cell(None), Vc::cell(None)).await?; + let result = &*fetch(Vc::cell(server.url("/foo.woff").into()), Vc::cell(None), Vc::cell(None)).await?; resource_mock.assert(); match result { @@ -47,7 +47,7 @@ async fn sends_user_agent() { .body("responsebody"); }); - let result = &*fetch(Vc::cell(server.url("/foo.woff")), Vc::cell(Some("foo".to_owned())), Vc::cell(None)).await?; + let result = &*fetch(Vc::cell(server.url("/foo.woff").into()), Vc::cell(Some("foo".into())), Vc::cell(None)).await?; resource_mock.assert(); let Ok(response) = result else { @@ -74,8 +74,8 @@ async fn invalidation_does_not_invalidate() { .body("responsebody"); }); - let url = Vc::cell(server.url("/foo.woff")); - let user_agent = Vc::cell(Some("foo".to_owned())); + let url = Vc::cell(server.url("/foo.woff").into()); + let user_agent = Vc::cell(Some("foo".into())); let proxy = Vc::cell(None); let result = &*fetch(url, user_agent, proxy).await?; resource_mock.assert(); @@ -105,7 +105,7 @@ async fn errors_on_failed_connection() { register(); let url = "https://doesnotexist/foo.woff"; - let result = &*fetch(Vc::cell(url.to_owned()), Vc::cell(None), Vc::cell(None)).await?; + let result = &*fetch(Vc::cell(url.into()), Vc::cell(None), Vc::cell(None)).await?; let Err(err_vc) = result else { panic!() }; @@ -115,7 +115,7 @@ async fn errors_on_failed_connection() { let issue = err_vc.to_issue(IssueSeverity::Error.into(), get_issue_context()); assert_eq!(*issue.severity().await?, IssueSeverity::Error); - assert_eq!(*issue.description().await?.unwrap().await?, StyledString::Text("There was an issue establishing a connection while requesting https://doesnotexist/foo.woff.".to_string())); + assert_eq!(*issue.description().await?.unwrap().await?, StyledString::Text("There was an issue establishing a connection while requesting https://doesnotexist/foo.woff.".into())); } } @@ -126,7 +126,7 @@ async fn errors_on_404() { let server = httpmock::MockServer::start(); let resource_url = server.url("/"); - let result = &*fetch(Vc::cell(resource_url.clone()), Vc::cell(None), Vc::cell(None)).await?; + let result = &*fetch(Vc::cell(resource_url.clone().into()), Vc::cell(None), Vc::cell(None)).await?; let Err(err_vc) = result else { panic!() }; @@ -136,10 +136,10 @@ async fn errors_on_404() { let issue = err_vc.to_issue(IssueSeverity::Error.into(), get_issue_context()); assert_eq!(*issue.severity().await?, IssueSeverity::Error); - assert_eq!(*issue.description().await?.unwrap().await?, StyledString::Text(format!("Received response with status 404 when requesting {}", &resource_url))); + assert_eq!(*issue.description().await?.unwrap().await?, StyledString::Text(format!("Received response with status 404 when requesting {}", &resource_url).into())); } } fn get_issue_context() -> Vc { - DiskFileSystem::new("root".to_owned(), "/".to_owned(), vec![]).root() + DiskFileSystem::new("root".into(), "/".into(), vec![]).root() } diff --git a/crates/turbo-tasks-fs/examples/hash_directory.rs b/crates/turbo-tasks-fs/examples/hash_directory.rs index 032e4f4ae667c..a8d3fb72502dc 100644 --- a/crates/turbo-tasks-fs/examples/hash_directory.rs +++ b/crates/turbo-tasks-fs/examples/hash_directory.rs @@ -9,7 +9,7 @@ use std::{ use anyhow::Result; use sha2::{Digest, Sha256}; -use turbo_tasks::{util::FormatDuration, TurboTasks, UpdateInfo, Vc}; +use turbo_tasks::{util::FormatDuration, RcStr, TurboTasks, UpdateInfo, Vc}; use turbo_tasks_fs::{ register, DirectoryContent, DirectoryEntry, DiskFileSystem, FileContent, FileSystem, FileSystemPath, @@ -29,13 +29,13 @@ async fn main() -> Result<()> { let task = tt.spawn_root_task(|| { Box::pin(async { - let root = current_dir().unwrap().to_str().unwrap().to_string(); - let disk_fs = DiskFileSystem::new("project".to_string(), root, vec![]); + let root = current_dir().unwrap().to_str().unwrap().into(); + let disk_fs = DiskFileSystem::new("project".into(), root, vec![]); disk_fs.await?.start_watching()?; // Smart Pointer cast let fs: Vc> = Vc::upcast(disk_fs); - let input = fs.root().join("demo".to_string()); + let input = fs.root().join("demo".into()); let dir_hash = hash_directory(input); print_hash(dir_hash).await?; Ok::, _>(Default::default()) @@ -55,7 +55,7 @@ async fn main() -> Result<()> { } #[turbo_tasks::function] -async fn print_hash(dir_hash: Vc) -> Result> { +async fn print_hash(dir_hash: Vc) -> Result> { println!("DIR HASH: {}", dir_hash.await?.as_str()); Ok(Default::default()) } @@ -65,7 +65,7 @@ async fn filename(path: Vc) -> Result { } #[turbo_tasks::function] -async fn hash_directory(directory: Vc) -> Result> { +async fn hash_directory(directory: Vc) -> Result> { let dir_path = &directory.await?.path; let content = directory.read_dir(); let mut hashes = BTreeMap::new(); @@ -92,7 +92,7 @@ async fn hash_directory(directory: Vc) -> Result> { let hash = hash_content( &mut hashes .into_values() - .collect::>() + .collect::>() .join(",") .as_bytes(), ); @@ -101,18 +101,18 @@ async fn hash_directory(directory: Vc) -> Result> { } #[turbo_tasks::function] -async fn hash_file(file_path: Vc) -> Result> { +async fn hash_file(file_path: Vc) -> Result> { let content = file_path.read().await?; Ok(match &*content { FileContent::Content(file) => hash_content(&mut file.read()), FileContent::NotFound => { // report error - Vc::cell("".to_string()) + Vc::cell(Default::default()) } }) } -fn hash_content(content: &mut R) -> Vc { +fn hash_content(content: &mut R) -> Vc { let mut hasher = Sha256::new(); let mut buf = [0; 1024]; while let Ok(size) = content.read(&mut buf) { @@ -120,5 +120,5 @@ fn hash_content(content: &mut R) -> Vc { } let result = format!("{:x}", hasher.finalize()); - Vc::cell(result) + Vc::cell(result.into()) } diff --git a/crates/turbo-tasks-fs/examples/hash_glob.rs b/crates/turbo-tasks-fs/examples/hash_glob.rs index 28e3231682d3f..50dcdad53f05e 100644 --- a/crates/turbo-tasks-fs/examples/hash_glob.rs +++ b/crates/turbo-tasks-fs/examples/hash_glob.rs @@ -9,7 +9,7 @@ use std::{ use anyhow::Result; use sha2::{Digest, Sha256}; -use turbo_tasks::{util::FormatDuration, TurboTasks, UpdateInfo, Vc}; +use turbo_tasks::{util::FormatDuration, RcStr, TurboTasks, UpdateInfo, Vc}; use turbo_tasks_fs::{ glob::Glob, register, DirectoryEntry, DiskFileSystem, FileContent, FileSystem, FileSystemPath, ReadGlobResult, @@ -26,14 +26,14 @@ async fn main() -> Result<()> { let task = tt.spawn_root_task(|| { Box::pin(async { - let root = current_dir().unwrap().to_str().unwrap().to_string(); - let disk_fs = DiskFileSystem::new("project".to_string(), root, vec![]); + let root = current_dir().unwrap().to_str().unwrap().into(); + let disk_fs = DiskFileSystem::new("project".into(), root, vec![]); disk_fs.await?.start_watching()?; // Smart Pointer cast let fs: Vc> = Vc::upcast(disk_fs); - let input = fs.root().join("crates".to_string()); - let glob = Glob::new("**/*.rs".to_string()); + let input = fs.root().join("crates".into()); + let glob = Glob::new("**/*.rs".into()); let glob_result = input.read_glob(glob, true); let dir_hash = hash_glob_result(glob_result); print_hash(dir_hash).await?; @@ -54,18 +54,18 @@ async fn main() -> Result<()> { } #[turbo_tasks::function] -pub fn empty_string() -> Vc { - Vc::cell("".to_string()) +pub fn empty_string() -> Vc { + Vc::cell(Default::default()) } #[turbo_tasks::function] -async fn print_hash(dir_hash: Vc) -> Result> { +async fn print_hash(dir_hash: Vc) -> Result> { println!("DIR HASH: {}", dir_hash.await?.as_str()); Ok(Default::default()) } #[turbo_tasks::function] -async fn hash_glob_result(result: Vc) -> Result> { +async fn hash_glob_result(result: Vc) -> Result> { let result = result.await?; let mut hashes = BTreeMap::new(); for (name, entry) in result.results.iter() { @@ -85,7 +85,7 @@ async fn hash_glob_result(result: Vc) -> Result> { let hash = hash_content( &mut hashes .into_values() - .collect::>() + .collect::>() .join(",") .as_bytes(), ); @@ -93,18 +93,18 @@ async fn hash_glob_result(result: Vc) -> Result> { } #[turbo_tasks::function] -async fn hash_file(file_path: Vc) -> Result> { +async fn hash_file(file_path: Vc) -> Result> { let content = file_path.read().await?; Ok(match &*content { FileContent::Content(file) => hash_content(&mut file.read()), FileContent::NotFound => { // report error - Vc::cell("".to_string()) + Vc::cell(Default::default()) } }) } -fn hash_content(content: &mut R) -> Vc { +fn hash_content(content: &mut R) -> Vc { let mut hasher = Sha256::new(); let mut buf = [0; 1024]; while let Ok(size) = content.read(&mut buf) { @@ -112,5 +112,5 @@ fn hash_content(content: &mut R) -> Vc { } let result = format!("{:x}", hasher.finalize()); - Vc::cell(result) + Vc::cell(result.into()) } diff --git a/crates/turbo-tasks-fs/src/attach.rs b/crates/turbo-tasks-fs/src/attach.rs index 7fc1af31ec9e1..f9b70352f660d 100644 --- a/crates/turbo-tasks-fs/src/attach.rs +++ b/crates/turbo-tasks-fs/src/attach.rs @@ -1,6 +1,6 @@ use anyhow::{bail, Result}; use auto_hash_map::AutoMap; -use turbo_tasks::{Completion, ValueToString, Vc}; +use turbo_tasks::{Completion, RcStr, ValueToString, Vc}; use crate::{ DirectoryContent, DirectoryEntry, FileContent, FileMeta, FileSystem, FileSystemPath, @@ -16,7 +16,7 @@ pub struct AttachedFileSystem { root_fs: Vc>, // we turn this into a string because creating a FileSystemPath requires the filesystem which // we are creating (circular reference) - child_path: String, + child_path: RcStr, child_fs: Vc>, } @@ -112,7 +112,7 @@ impl AttachedFileSystem { .root() .resolve() .await? - .join(inner_path.to_string()) + .join(inner_path.into()) } else { this.root_fs.root().resolve().await?.join(path.path.clone()) }) @@ -185,9 +185,11 @@ impl FileSystem for AttachedFileSystem { #[turbo_tasks::value_impl] impl ValueToString for AttachedFileSystem { #[turbo_tasks::function] - async fn to_string(&self) -> Result> { + async fn to_string(&self) -> Result> { let root_fs_str = self.root_fs.to_string().await?; let child_fs_str = self.child_fs.to_string().await?; - Ok(Vc::cell(format!("{}-with-{}", root_fs_str, child_fs_str))) + Ok(Vc::cell( + format!("{}-with-{}", root_fs_str, child_fs_str).into(), + )) } } diff --git a/crates/turbo-tasks-fs/src/embed/dir.rs b/crates/turbo-tasks-fs/src/embed/dir.rs index 90e34fc5b86e7..93031ecf60aef 100644 --- a/crates/turbo-tasks-fs/src/embed/dir.rs +++ b/crates/turbo-tasks-fs/src/embed/dir.rs @@ -2,14 +2,14 @@ pub use ::include_dir::{ include_dir, {self}, }; use anyhow::Result; -use turbo_tasks::{TransientInstance, Vc}; +use turbo_tasks::{RcStr, TransientInstance, Vc}; use crate::{embed::EmbeddedFileSystem, DiskFileSystem, FileSystem}; #[turbo_tasks::function] pub async fn directory_from_relative_path( - name: String, - path: String, + name: RcStr, + path: RcStr, ) -> Result>> { let disk_fs = DiskFileSystem::new(name, path, vec![]); disk_fs.await?.start_watching()?; @@ -19,7 +19,7 @@ pub async fn directory_from_relative_path( #[turbo_tasks::function] pub async fn directory_from_include_dir( - name: String, + name: RcStr, dir: TransientInstance<&'static include_dir::Dir<'static>>, ) -> Result>> { Ok(Vc::upcast(EmbeddedFileSystem::new(name, dir))) @@ -72,7 +72,7 @@ macro_rules! embed_directory_internal { static dir: include_dir::Dir<'static> = turbo_tasks_fs::embed::include_dir!($path); turbo_tasks_fs::embed::directory_from_include_dir( - $name.to_string(), + $name.into(), turbo_tasks::TransientInstance::new(&dir), ) }}; diff --git a/crates/turbo-tasks-fs/src/embed/file.rs b/crates/turbo-tasks-fs/src/embed/file.rs index 6dcc925f13ae1..74646862b8ff4 100644 --- a/crates/turbo-tasks-fs/src/embed/file.rs +++ b/crates/turbo-tasks-fs/src/embed/file.rs @@ -2,14 +2,14 @@ use std::path::PathBuf; use anyhow::{Context, Result}; use dunce::canonicalize; -use turbo_tasks::Vc; +use turbo_tasks::{RcStr, Vc}; use crate::{DiskFileSystem, File, FileContent, FileSystem}; #[turbo_tasks::function] pub async fn content_from_relative_path( - package_path: String, - path: String, + package_path: RcStr, + path: RcStr, ) -> Result> { let package_path = PathBuf::from(package_path); let resolved_path = package_path.join(path); @@ -19,18 +19,18 @@ pub async fn content_from_relative_path( let path = resolved_path.file_name().unwrap().to_str().unwrap(); let disk_fs = DiskFileSystem::new( - root_path.to_string_lossy().to_string(), - root_path.to_string_lossy().to_string(), + root_path.to_string_lossy().into(), + root_path.to_string_lossy().into(), vec![], ); disk_fs.await?.start_watching()?; - let fs_path = disk_fs.root().join(path.to_string()); + let fs_path = disk_fs.root().join(path.into()); Ok(fs_path.read()) } #[turbo_tasks::function] -pub async fn content_from_str(string: String) -> Result> { +pub async fn content_from_str(string: RcStr) -> Result> { Ok(File::from(string).into()) } @@ -57,7 +57,7 @@ macro_rules! embed_file { macro_rules! embed_file { ($path:expr) => { turbo_tasks_fs::embed::content_from_str( - include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/", $path)).to_string(), + include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/", $path)).into(), ) }; } diff --git a/crates/turbo-tasks-fs/src/embed/fs.rs b/crates/turbo-tasks-fs/src/embed/fs.rs index 7e5862a71427b..e0f24c32e54c4 100644 --- a/crates/turbo-tasks-fs/src/embed/fs.rs +++ b/crates/turbo-tasks-fs/src/embed/fs.rs @@ -1,6 +1,6 @@ use anyhow::{bail, Result}; use include_dir::{Dir, DirEntry}; -use turbo_tasks::{Completion, TransientInstance, ValueToString, Vc}; +use turbo_tasks::{Completion, RcStr, TransientInstance, ValueToString, Vc}; use crate::{ DirectoryContent, DirectoryEntry, File, FileContent, FileMeta, FileSystem, FileSystemPath, @@ -9,7 +9,7 @@ use crate::{ #[turbo_tasks::value(serialization = "none")] pub struct EmbeddedFileSystem { - name: String, + name: RcStr, #[turbo_tasks(trace_ignore)] dir: TransientInstance<&'static Dir<'static>>, } @@ -18,7 +18,7 @@ pub struct EmbeddedFileSystem { impl EmbeddedFileSystem { #[turbo_tasks::function] pub(super) fn new( - name: String, + name: RcStr, dir: TransientInstance<&'static Dir<'static>>, ) -> Vc { EmbeddedFileSystem { name, dir }.cell() @@ -55,11 +55,16 @@ impl FileSystem for EmbeddedFileSystem { .entries() .iter() .map(|e| { - let entry_name = e.path().file_name().unwrap_or_default().to_string_lossy(); - let entry_path = path.join(entry_name.to_string()); + let entry_name: RcStr = e + .path() + .file_name() + .unwrap_or_default() + .to_string_lossy() + .into(); + let entry_path = path.join(entry_name.clone()); ( - entry_name.to_string(), + entry_name, match e { DirEntry::Dir(_) => DirectoryEntry::Directory(entry_path), DirEntry::File(_) => DirectoryEntry::File(entry_path), @@ -107,7 +112,7 @@ impl FileSystem for EmbeddedFileSystem { #[turbo_tasks::value_impl] impl ValueToString for EmbeddedFileSystem { #[turbo_tasks::function] - fn to_string(&self) -> Vc { + fn to_string(&self) -> Vc { Vc::cell(self.name.clone()) } } diff --git a/crates/turbo-tasks-fs/src/glob.rs b/crates/turbo-tasks-fs/src/glob.rs index f68be03ca9ec0..43e72853ed1f5 100644 --- a/crates/turbo-tasks-fs/src/glob.rs +++ b/crates/turbo-tasks-fs/src/glob.rs @@ -2,7 +2,7 @@ use std::mem::take; use anyhow::{anyhow, bail, Context, Result}; use serde::{Deserialize, Serialize}; -use turbo_tasks::{trace::TraceRawVcs, TryJoinIterExt, Vc}; +use turbo_tasks::{trace::TraceRawVcs, RcStr, TryJoinIterExt, Vc}; use unicode_segmentation::GraphemeCursor; #[derive(PartialEq, Eq, Debug, Clone, TraceRawVcs, Serialize, Deserialize)] @@ -395,7 +395,7 @@ impl TryFrom<&str> for Glob { #[turbo_tasks::value_impl] impl Glob { #[turbo_tasks::function] - pub fn new(glob: String) -> Result> { + pub fn new(glob: RcStr) -> Result> { Ok(Self::cell(Glob::try_from(glob.as_str())?)) } diff --git a/crates/turbo-tasks-fs/src/invalidation.rs b/crates/turbo-tasks-fs/src/invalidation.rs index cbb46ddd2659d..22976c49dc4e4 100644 --- a/crates/turbo-tasks-fs/src/invalidation.rs +++ b/crates/turbo-tasks-fs/src/invalidation.rs @@ -1,7 +1,7 @@ use std::fmt::{Display, Formatter}; use indexmap::IndexSet; -use turbo_tasks::{util::StaticOrArc, InvalidationReason, InvalidationReasonKind}; +use turbo_tasks::{util::StaticOrArc, InvalidationReason, InvalidationReasonKind, RcStr}; /// Invalidation was caused by a file change detected by the file watcher #[derive(PartialEq, Eq, Hash)] @@ -50,7 +50,7 @@ impl InvalidationReasonKind for WatchChangeKind { /// before. #[derive(PartialEq, Eq, Hash)] pub struct WatchStart { - pub name: String, + pub name: RcStr, } impl InvalidationReason for WatchStart { diff --git a/crates/turbo-tasks-fs/src/lib.rs b/crates/turbo-tasks-fs/src/lib.rs index e828fbe69ce90..75409f6ee39d5 100644 --- a/crates/turbo-tasks-fs/src/lib.rs +++ b/crates/turbo-tasks-fs/src/lib.rs @@ -6,6 +6,7 @@ #![feature(round_char_boundary)] #![feature(arbitrary_self_types)] #![feature(lint_reasons)] +#![allow(clippy::mutable_key_type)] pub mod attach; pub mod embed; @@ -57,7 +58,7 @@ use tokio::{ }; use tracing::Instrument; use turbo_tasks::{ - mark_stateful, trace::TraceRawVcs, Completion, InvalidationReason, Invalidator, ReadRef, + mark_stateful, trace::TraceRawVcs, Completion, InvalidationReason, Invalidator, RcStr, ReadRef, ValueToString, Vc, }; use turbo_tasks_hash::{hash_xxh3_hash64, DeterministicHash, DeterministicHasher}; @@ -76,7 +77,7 @@ use crate::{ pub trait FileSystem: ValueToString { /// Returns the path to the root of the file system. fn root(self: Vc) -> Vc { - FileSystemPath::new_normalized(self, String::new()) + FileSystemPath::new_normalized(self, RcStr::default()) } fn read(self: Vc, fs_path: Vc) -> Vc; fn read_link(self: Vc, fs_path: Vc) -> Vc; @@ -97,8 +98,8 @@ pub trait FileSystem: ValueToString { #[turbo_tasks::value(cell = "new", eq = "manual")] pub struct DiskFileSystem { - pub name: String, - pub root: String, + pub name: RcStr, + pub root: RcStr, #[turbo_tasks(debug_ignore, trace_ignore)] #[serde(skip)] mutex_map: MutexMap, @@ -118,7 +119,7 @@ pub struct DiskFileSystem { impl DiskFileSystem { /// Returns the root as Path fn root_path(&self) -> &Path { - simplified(Path::new(&self.root)) + simplified(Path::new(&*self.root)) } /// registers the path as an invalidator for the current task, @@ -287,11 +288,7 @@ impl DiskFileSystem { /// root & project dir is different and requires to ignore specific /// subpaths from each. #[turbo_tasks::function] - pub async fn new( - name: String, - root: String, - ignored_subpaths: Vec, - ) -> Result> { + pub async fn new(name: RcStr, root: RcStr, ignored_subpaths: Vec) -> Result> { mark_stateful(); // create the directory for the filesystem on disk, if it doesn't exist fs::create_dir_all(&root).await?; @@ -382,10 +379,10 @@ impl FileSystem for DiskFileSystem { let path = e.path(); // we filter out any non unicode names and paths without the same root here - let file_name = path.file_name()?.to_str()?.to_string(); + let file_name: RcStr = path.file_name()?.to_str()?.into(); let path_to_root = sys_to_unix(path.strip_prefix(&self.root).ok()?.to_str()?); - let fs_path = FileSystemPath::new_normalized(fs_path.fs, path_to_root.to_string()); + let fs_path = FileSystemPath::new_normalized(fs_path.fs, path_to_root.into()); let entry = match e.file_type() { Ok(t) if t.is_file() => DirectoryEntry::File(fs_path), @@ -455,7 +452,7 @@ impl FileSystem for DiskFileSystem { }; let (target, file_type) = if is_link_absolute { - let target_string = relative_to_root_path.to_string_lossy().to_string(); + let target_string: RcStr = relative_to_root_path.to_string_lossy().into(); ( target_string.clone(), FileSystemPath::new_normalized(fs_path.fs(), target_string) @@ -464,14 +461,10 @@ impl FileSystem for DiskFileSystem { ) } else { let link_path_string_cow = link_path.to_string_lossy(); - let link_path_unix = sys_to_unix(&link_path_string_cow); + let link_path_unix: RcStr = sys_to_unix(&link_path_string_cow).into(); ( - link_path_unix.to_string(), - fs_path - .parent() - .join(link_path_unix.to_string()) - .get_type() - .await?, + link_path_unix.clone(), + fs_path.parent().join(link_path_unix).get_type().await?, ) }; @@ -720,7 +713,7 @@ impl FileSystem for DiskFileSystem { #[turbo_tasks::value_impl] impl ValueToString for DiskFileSystem { #[turbo_tasks::function] - fn to_string(&self) -> Vc { + fn to_string(&self) -> Vc { Vc::cell(self.name.clone()) } } @@ -729,12 +722,12 @@ impl ValueToString for DiskFileSystem { #[derive(Debug, Clone)] pub struct FileSystemPath { pub fs: Vc>, - pub path: String, + pub path: RcStr, } impl FileSystemPath { pub fn is_inside_ref(&self, other: &FileSystemPath) -> bool { - if self.fs == other.fs && self.path.starts_with(&other.path) { + if self.fs == other.fs && self.path.starts_with(&*other.path) { if other.path.is_empty() { true } else { @@ -746,7 +739,7 @@ impl FileSystemPath { } pub fn is_inside_or_equal_ref(&self, other: &FileSystemPath) -> bool { - if self.fs == other.fs && self.path.starts_with(&other.path) { + if self.fs == other.fs && self.path.starts_with(&*other.path) { if other.path.is_empty() { true } else { @@ -771,7 +764,7 @@ impl FileSystemPath { if self.fs != inner.fs { return None; } - let path = inner.path.strip_prefix(&self.path)?; + let path = inner.path.strip_prefix(&*self.path)?; if self.path.is_empty() { Some(path) } else if let Some(stripped) = path.strip_prefix('/') { @@ -781,7 +774,7 @@ impl FileSystemPath { } } - pub fn get_relative_path_to(&self, other: &FileSystemPath) -> Option { + pub fn get_relative_path_to(&self, other: &FileSystemPath) -> Option { if self.fs != other.fs { return None; } @@ -798,7 +791,7 @@ impl FileSystemPath { while self_segments.peek() == other_segments.peek() { self_segments.next(); if other_segments.next().is_none() { - return Some(".".to_string()); + return Some(".".into()); } } let mut result = Vec::new(); @@ -812,7 +805,7 @@ impl FileSystemPath { for segment in other_segments { result.push(segment); } - Some(result.join("/")) + Some(result.join("/").into()) } /// Returns the final component of the FileSystemPath, or an empty string @@ -889,7 +882,7 @@ impl FileSystemPath { /// /-separated path is expected to be already normalized (this is asserted /// in dev mode). #[turbo_tasks::function] - fn new_normalized(fs: Vc>, path: String) -> Vc { + fn new_normalized(fs: Vc>, path: RcStr) -> Vc { // On Windows, the path must be converted to a unix path before creating. But on // Unix, backslashes are a valid char in file names, and the path can be // provided by the user, so we allow it. @@ -899,7 +892,7 @@ impl FileSystemPath { path, ); debug_assert!( - normalize_path(&path).as_ref() == Some(&path), + normalize_path(&path).as_deref() == Some(&*path), "path {} must be normalized", path, ); @@ -910,10 +903,10 @@ impl FileSystemPath { /// contain ".." or "." seqments, but it must not leave the root of the /// filesystem. #[turbo_tasks::function] - pub async fn join(self: Vc, path: String) -> Result> { + pub async fn join(self: Vc, path: RcStr) -> Result> { let this = self.await?; if let Some(path) = join_path(&this.path, &path) { - Ok(Self::new_normalized(this.fs, path)) + Ok(Self::new_normalized(this.fs, path.into())) } else { bail!( "Vc(\"{}\").join(\"{}\") leaves the filesystem root", @@ -925,7 +918,7 @@ impl FileSystemPath { /// Adds a suffix to the filename. [path] must not contain `/`. #[turbo_tasks::function] - pub async fn append(self: Vc, path: String) -> Result> { + pub async fn append(self: Vc, path: RcStr) -> Result> { let this = self.await?; if path.contains('/') { bail!( @@ -936,14 +929,14 @@ impl FileSystemPath { } Ok(Self::new_normalized( this.fs, - format!("{}{}", this.path, path), + format!("{}{}", this.path, path).into(), )) } /// Adds a suffix to the basename of the filename. [appending] must not /// contain `/`. Extension will stay intact. #[turbo_tasks::function] - pub async fn append_to_stem(self: Vc, appending: String) -> Result> { + pub async fn append_to_stem(self: Vc, appending: RcStr) -> Result> { let this = self.await?; if appending.contains('/') { bail!( @@ -955,23 +948,23 @@ impl FileSystemPath { if let (path, Some(ext)) = this.split_extension() { return Ok(Self::new_normalized( this.fs, - format!("{}{}.{}", path, appending, ext), + format!("{}{}.{}", path, appending, ext).into(), )); } Ok(Self::new_normalized( this.fs, - format!("{}{}", this.path, appending), + format!("{}{}", this.path, appending).into(), )) } /// Similar to [FileSystemPath::join], but returns an Option that will be /// None when the joined path would leave the filesystem root. #[turbo_tasks::function] - pub async fn try_join(self: Vc, path: String) -> Result> { + pub async fn try_join(self: Vc, path: RcStr) -> Result> { let this = self.await?; if let Some(path) = join_path(&this.path, &path) { Ok(Vc::cell(Some( - Self::new_normalized(this.fs, path).resolve().await?, + Self::new_normalized(this.fs, path.into()).resolve().await?, ))) } else { Ok(FileSystemPathOption::none()) @@ -981,12 +974,12 @@ impl FileSystemPath { /// Similar to [FileSystemPath::join], but returns an Option that will be /// None when the joined path would leave the current path. #[turbo_tasks::function] - pub async fn try_join_inside(self: Vc, path: String) -> Result> { + pub async fn try_join_inside(self: Vc, path: RcStr) -> Result> { let this = self.await?; if let Some(path) = join_path(&this.path, &path) { - if path.starts_with(&this.path) { + if path.starts_with(&*this.path) { return Ok(Vc::cell(Some( - Self::new_normalized(this.fs, path).resolve().await?, + Self::new_normalized(this.fs, path.into()).resolve().await?, ))); } } @@ -1013,9 +1006,9 @@ impl FileSystemPath { } #[turbo_tasks::function] - pub async fn extension(self: Vc) -> Result> { + pub async fn extension(self: Vc) -> Result> { let this = self.await?; - Ok(Vc::cell(this.extension_ref().unwrap_or("").to_string())) + Ok(Vc::cell(this.extension_ref().unwrap_or("").into())) } #[turbo_tasks::function] @@ -1031,7 +1024,7 @@ impl FileSystemPath { /// Creates a new [`Vc`] like `self` but with the given /// extension. #[turbo_tasks::function] - pub async fn with_extension(self: Vc, extension: String) -> Result> { + pub async fn with_extension(self: Vc, extension: RcStr) -> Result> { let this = self.await?; let (path_without_extension, _) = this.split_extension(); Ok(Self::new_normalized( @@ -1039,8 +1032,8 @@ impl FileSystemPath { // Like `Path::with_extension` and `PathBuf::set_extension`, if the extension is empty, // we remove the extension altogether. match extension.is_empty() { - true => path_without_extension.to_string(), - false => format!("{path_without_extension}.{extension}"), + true => path_without_extension.into(), + false => format!("{path_without_extension}.{extension}").into(), }, )) } @@ -1055,13 +1048,13 @@ impl FileSystemPath { /// `.`s within; /// * Otherwise, the portion of the file name before the final `.` #[turbo_tasks::function] - pub async fn file_stem(self: Vc) -> Result>> { + pub async fn file_stem(self: Vc) -> Result>> { let this = self.await?; let (_, file_stem, _) = this.split_file_stem_extension(); if file_stem.is_empty() { return Ok(Vc::cell(None)); } - Ok(Vc::cell(Some(file_stem.to_string()))) + Ok(Vc::cell(Some(file_stem.into()))) } } @@ -1085,7 +1078,7 @@ pub async fn rebase( if new_base.path.is_empty() { new_path = fs_path.path.clone(); } else { - new_path = [new_base.path.as_str(), "/", &fs_path.path].concat(); + new_path = [new_base.path.as_str(), "/", &fs_path.path].concat().into(); } } else { let base_path = [&old_base.path, "/"].concat(); @@ -1098,9 +1091,11 @@ pub async fn rebase( ); } if new_base.path.is_empty() { - new_path = [&fs_path.path[base_path.len()..]].concat(); + new_path = [&fs_path.path[base_path.len()..]].concat().into(); } else { - new_path = [new_base.path.as_str(), &fs_path.path[old_base.path.len()..]].concat(); + new_path = [new_base.path.as_str(), &fs_path.path[old_base.path.len()..]] + .concat() + .into(); } } Ok(new_base.fs.root().join(new_path)) @@ -1170,7 +1165,7 @@ impl FileSystemPath { Some(index) => path[..index].to_string(), None => "".to_string(), }; - Ok(FileSystemPath::new_normalized(this.fs, p)) + Ok(FileSystemPath::new_normalized(this.fs, p.into())) } #[turbo_tasks::function] @@ -1221,11 +1216,7 @@ impl FileSystemPath { .rsplit_once('/') .map_or(this.path.as_str(), |(_, name)| name); let real_self = if parent_result.path != parent { - parent_result - .path - .join(basename.to_string()) - .resolve() - .await? + parent_result.path.join(basename.into()).resolve().await? } else { self }; @@ -1238,7 +1229,7 @@ impl FileSystemPath { } else { result.path } - .join(target.to_string()) + .join(target.clone()) .resolve() .await?; return Ok(result.cell()); @@ -1252,12 +1243,10 @@ impl FileSystemPath { #[turbo_tasks::value_impl] impl ValueToString for FileSystemPath { #[turbo_tasks::function] - async fn to_string(&self) -> Result> { - Ok(Vc::cell(format!( - "[{}]/{}", - self.fs.to_string().await?, - self.path - ))) + async fn to_string(&self) -> Result> { + Ok(Vc::cell( + format!("[{}]/{}", self.fs.to_string().await?, self.path).into(), + )) } } @@ -1428,7 +1417,7 @@ pub enum LinkContent { // normalized, which means in `fn write_link` we couldn't restore the raw value of the file // link because there is only **dist** path in `fn write_link`, and we need the raw path if // we want to restore the link value in `fn write_link` - Link { target: String, link_type: LinkType }, + Link { target: RcStr, link_type: LinkType }, Invalid, NotFound, } @@ -1498,14 +1487,20 @@ impl Debug for File { } } +impl From for File { + fn from(s: RcStr) -> Self { + s.into_owned().into() + } +} + impl From for File { fn from(s: String) -> Self { File::from_bytes(s.into_bytes()) } } -impl From> for File { - fn from(s: ReadRef) -> Self { +impl From> for File { + fn from(s: ReadRef) -> Self { File::from_bytes(s.as_bytes().to_vec()) } } @@ -1761,9 +1756,9 @@ impl ValueToString for FileJsonContent { /// This operation will only succeed if the file contents are a valid JSON /// value. #[turbo_tasks::function] - async fn to_string(&self) -> Result> { + async fn to_string(&self) -> Result> { match self { - FileJsonContent::Content(json) => Ok(Vc::cell(json.to_string())), + FileJsonContent::Content(json) => Ok(Vc::cell(json.to_string().into())), FileJsonContent::Unparseable(e) => Err(anyhow!("File is not valid JSON: {}", e)), FileJsonContent::NotFound => Err(anyhow!("File not found")), } @@ -1855,12 +1850,12 @@ impl From<&DirectoryEntry> for FileSystemEntryType { #[turbo_tasks::value] #[derive(Debug)] pub enum DirectoryContent { - Entries(AutoMap), + Entries(AutoMap), NotFound, } impl DirectoryContent { - pub fn new(entries: AutoMap) -> Vc { + pub fn new(entries: AutoMap) -> Vc { Self::cell(DirectoryContent::Entries(entries)) } @@ -1913,8 +1908,8 @@ impl FileSystem for NullFileSystem { #[turbo_tasks::value_impl] impl ValueToString for NullFileSystem { #[turbo_tasks::function] - fn to_string(&self) -> Vc { - Vc::cell(String::from("null")) + fn to_string(&self) -> Vc { + Vc::cell(RcStr::from("null")) } } @@ -1952,24 +1947,24 @@ mod tests { let path_txt = FileSystemPath::new_normalized(fs, "foo/bar.txt".into()); - let path_json = path_txt.with_extension("json".to_string()); + let path_json = path_txt.with_extension("json".into()); assert_eq!(&*path_json.await.unwrap().path, "foo/bar.json"); - let path_no_ext = path_txt.with_extension("".to_string()); + let path_no_ext = path_txt.with_extension("".into()); assert_eq!(&*path_no_ext.await.unwrap().path, "foo/bar"); - let path_new_ext = path_no_ext.with_extension("json".to_string()); + let path_new_ext = path_no_ext.with_extension("json".into()); assert_eq!(&*path_new_ext.await.unwrap().path, "foo/bar.json"); let path_no_slash_txt = FileSystemPath::new_normalized(fs, "bar.txt".into()); - let path_no_slash_json = path_no_slash_txt.with_extension("json".to_string()); + let path_no_slash_json = path_no_slash_txt.with_extension("json".into()); assert_eq!(path_no_slash_json.await.unwrap().path.as_str(), "bar.json"); - let path_no_slash_no_ext = path_no_slash_txt.with_extension("".to_string()); + let path_no_slash_no_ext = path_no_slash_txt.with_extension("".into()); assert_eq!(path_no_slash_no_ext.await.unwrap().path.as_str(), "bar"); - let path_no_slash_new_ext = path_no_slash_no_ext.with_extension("json".to_string()); + let path_no_slash_new_ext = path_no_slash_no_ext.with_extension("json".into()); assert_eq!( path_no_slash_new_ext.await.unwrap().path.as_str(), "bar.json" diff --git a/crates/turbo-tasks-fs/src/read_glob.rs b/crates/turbo-tasks-fs/src/read_glob.rs index 35bffa372dc0a..f026d23bca269 100644 --- a/crates/turbo-tasks-fs/src/read_glob.rs +++ b/crates/turbo-tasks-fs/src/read_glob.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use anyhow::Result; -use turbo_tasks::Vc; +use turbo_tasks::{RcStr, Vc}; use crate::{glob::Glob, DirectoryContent, DirectoryEntry, FileSystemPath}; @@ -27,7 +27,7 @@ pub async fn read_glob( #[turbo_tasks::function] async fn read_glob_inner( - prefix: String, + prefix: RcStr, directory: Vc, glob: Vc, include_dot_files: bool, @@ -50,7 +50,7 @@ async fn read_glob_internal( match item { (segment, DirectoryEntry::Directory(path)) => { let full_path = format!("{prefix}{segment}"); - let full_path_prefix = format!("{full_path}/"); + let full_path_prefix: RcStr = format!("{full_path}/").into(); if glob_value.execute(&full_path) { result .results diff --git a/crates/turbo-tasks-fs/src/virtual_fs.rs b/crates/turbo-tasks-fs/src/virtual_fs.rs index 7608c06bf5622..f578e6b037bd8 100644 --- a/crates/turbo-tasks-fs/src/virtual_fs.rs +++ b/crates/turbo-tasks-fs/src/virtual_fs.rs @@ -1,11 +1,11 @@ use anyhow::{bail, Result}; -use turbo_tasks::{Completion, ValueDefault, ValueToString, Vc}; +use turbo_tasks::{Completion, RcStr, ValueDefault, ValueToString, Vc}; use super::{DirectoryContent, FileContent, FileMeta, FileSystem, FileSystemPath, LinkContent}; #[turbo_tasks::value] pub struct VirtualFileSystem { - name: String, + name: RcStr, } impl VirtualFileSystem { @@ -19,7 +19,7 @@ impl VirtualFileSystem { /// [`Vc`]. pub fn new() -> Vc { Self::cell(VirtualFileSystem { - name: "virtual file system".to_string(), + name: "virtual file system".into(), }) } @@ -31,7 +31,7 @@ impl VirtualFileSystem { /// will never be equivalent, nor be interoperable, with a /// [`Vc`] created from another /// [`Vc`]. - pub fn new_with_name(name: String) -> Vc { + pub fn new_with_name(name: RcStr) -> Vc { Self::cell(VirtualFileSystem { name }) } } @@ -91,7 +91,7 @@ impl FileSystem for VirtualFileSystem { #[turbo_tasks::value_impl] impl ValueToString for VirtualFileSystem { #[turbo_tasks::function] - fn to_string(&self) -> Vc { + fn to_string(&self) -> Vc { Vc::cell(self.name.clone()) } } diff --git a/crates/turbo-tasks-fs/src/watcher.rs b/crates/turbo-tasks-fs/src/watcher.rs index 6af75e426bca6..371777bcbfc97 100644 --- a/crates/turbo-tasks-fs/src/watcher.rs +++ b/crates/turbo-tasks-fs/src/watcher.rs @@ -18,7 +18,7 @@ use notify_debouncer_full::{DebounceEventResult, DebouncedEvent, Debouncer, File use serde::{Deserialize, Serialize}; use tokio::sync::RwLock; use tracing::instrument; -use turbo_tasks::{spawn_thread, Invalidator}; +use turbo_tasks::{spawn_thread, Invalidator, RcStr}; use crate::{ format_absolute_fs_path, @@ -124,9 +124,9 @@ impl DiskWatcher { /// - Doesn't emit Modify events after a Create event pub(crate) fn start_watching( self: Arc, - name: String, + name: RcStr, root_path: PathBuf, - report_invalidation_reason: Option<(String, PathBuf)>, + report_invalidation_reason: Option<(RcStr, PathBuf)>, invalidation_lock: Arc>, invalidator_map: Arc, dir_invalidator_map: Arc, @@ -209,7 +209,7 @@ impl DiskWatcher { &self, rx: Receiver, root_path: PathBuf, - report_invalidation_reason: Option<(String, PathBuf)>, + report_invalidation_reason: Option<(RcStr, PathBuf)>, invalidation_lock: Arc>, invalidator_map: Arc, dir_invalidator_map: Arc, @@ -428,7 +428,7 @@ impl DiskWatcher { #[instrument(parent = None, level = "info", name = "DiskFileSystem file change", skip_all, fields(name = display(path.display())))] fn invalidate( - report_invalidation_reason: &Option<(String, PathBuf)>, + report_invalidation_reason: &Option<(RcStr, PathBuf)>, path: &Path, invalidator: Invalidator, ) { @@ -442,7 +442,7 @@ fn invalidate( } fn invalidate_path( - report_invalidation_reason: &Option<(String, PathBuf)>, + report_invalidation_reason: &Option<(RcStr, PathBuf)>, invalidator_map: &mut HashMap>, paths: impl Iterator, ) { @@ -457,7 +457,7 @@ fn invalidate_path( } fn invalidate_path_and_children_execute( - report_invalidation_reason: &Option<(String, PathBuf)>, + report_invalidation_reason: &Option<(RcStr, PathBuf)>, invalidator_map: &mut HashMap>, paths: impl Iterator, ) { diff --git a/crates/turbo-tasks-hash/Cargo.toml b/crates/turbo-tasks-hash/Cargo.toml index 64e20a1cd8d21..05dcad51392ff 100644 --- a/crates/turbo-tasks-hash/Cargo.toml +++ b/crates/turbo-tasks-hash/Cargo.toml @@ -13,8 +13,6 @@ bench = false workspace = true [dependencies] -base16 = "0.2.1" -hex = "0.4.3" md4 = "0.10.1" turbo-tasks-macros = { workspace = true } twox-hash = "1.6.3" diff --git a/crates/turbo-tasks-hash/src/base16.rs b/crates/turbo-tasks-hash/src/base16.rs deleted file mode 100644 index 9d4b11b4bfcd9..0000000000000 --- a/crates/turbo-tasks-hash/src/base16.rs +++ /dev/null @@ -1,4 +0,0 @@ -/// Encodes an array of bytes as a base16 string. -pub fn encode_base16(input: &[u8]) -> String { - base16::encode_lower(input) -} diff --git a/crates/turbo-tasks-hash/src/hex.rs b/crates/turbo-tasks-hash/src/hex.rs index 771412320e054..9fd35fa975f22 100644 --- a/crates/turbo-tasks-hash/src/hex.rs +++ b/crates/turbo-tasks-hash/src/hex.rs @@ -2,8 +2,3 @@ pub fn encode_hex(n: u64) -> String { format!("{:01$x}", n, std::mem::size_of::() * 2) } - -/// Encodes a byte slice into a hex string. -pub fn encode_hex_string(bytes: &[u8]) -> String { - hex::encode(bytes) -} diff --git a/crates/turbo-tasks-hash/src/lib.rs b/crates/turbo-tasks-hash/src/lib.rs index 628c5c9f4175d..d6ab4c13e44f8 100644 --- a/crates/turbo-tasks-hash/src/lib.rs +++ b/crates/turbo-tasks-hash/src/lib.rs @@ -4,16 +4,14 @@ //! invalidation, and encoding the hash to an hexadecimal string for use in a //! file name. -mod base16; mod deterministic_hash; mod hex; mod md4; mod xxh3_hash64; pub use crate::{ - base16::encode_base16, deterministic_hash::{DeterministicHash, DeterministicHasher}, - hex::{encode_hex, encode_hex_string}, + hex::encode_hex, md4::hash_md4, xxh3_hash64::{hash_xxh3_hash64, Xxh3Hash64Hasher}, }; diff --git a/crates/turbo-tasks-macros-shared/src/expand.rs b/crates/turbo-tasks-macros-shared/src/expand.rs index 3be16b7a33b1f..7f27c42130f9d 100644 --- a/crates/turbo-tasks-macros-shared/src/expand.rs +++ b/crates/turbo-tasks-macros-shared/src/expand.rs @@ -11,18 +11,18 @@ use syn::{ /// Requires several Fn helpers which perform expand different structures: /// /// - [expand_named] handles the expansion of a struct or enum variant with -/// named fields (e.g. `struct Foo { bar: u32 }`, `Foo::Bar { baz: u32 }`). +/// named fields (e.g. `struct Foo { bar: u32 }`, `Foo::Bar { baz: u32 }`). /// - [expand_unnamed] handles the expansion of a struct or enum variant with -/// unnamed fields (e.g. `struct Foo(u32)`, `Foo::Bar(u32)`). -/// - [expand_unit] handles the expansion of a unit struct or enum (e.g. -/// `struct Foo;`, `Foo::Bar`). +/// unnamed fields (e.g. `struct Foo(u32)`, `Foo::Bar(u32)`). +/// - [expand_unit] handles the expansion of a unit struct or enum (e.g. `struct +/// Foo;`, `Foo::Bar`). /// /// These helpers should themselves call [generate_destructuring] to generate /// the destructure necessary to access the fields of the value. pub fn match_expansion< EN: Fn(&Ident, &FieldsNamed) -> (TokenStream, TokenStream), EU: Fn(&Ident, &FieldsUnnamed) -> (TokenStream, TokenStream), - U: Fn(&Ident) -> (TokenStream, TokenStream), + U: Fn(&Ident) -> TokenStream, >( derive_input: &DeriveInput, expand_named: &EN, @@ -30,6 +30,7 @@ pub fn match_expansion< expand_unit: &U, ) -> TokenStream { let ident = &derive_input.ident; + let expand_unit = move |ident| (TokenStream::new(), expand_unit(ident)); match &derive_input.data { Data::Enum(DataEnum { variants, .. }) => { let (variants_idents, (variants_fields_capture, expansion)): ( @@ -63,9 +64,19 @@ pub fn match_expansion< let (captures, expansion) = expand_fields(ident, fields, expand_named, expand_unnamed, expand_unit); - quote! { - match self { - #ident #captures => #expansion + if fields.is_empty() { + assert!(captures.is_empty()); + // a match expression here doesn't make sense as there's no fields to capture, + // just pass through the inner expression. + expansion + } else { + match fields { + Fields::Named(_) | Fields::Unnamed(_) => quote! { + match self { + #ident #captures => #expansion + } + }, + Fields::Unit => unreachable!(), } } } @@ -82,6 +93,10 @@ pub fn match_expansion< } /// Formats the fields of any structure or enum variant. +/// +/// Empty lists of named or unnamed fields are treated as unit structs, as they +/// are semantically identical, and the `expand_unit` codepath can usually +/// generate better code. pub fn expand_fields< 'ident, 'fields, @@ -96,10 +111,15 @@ pub fn expand_fields< expand_unnamed: EU, expand_unit: U, ) -> R { + if fields.is_empty() { + // any empty struct (regardless of the syntax used during declaration) is + // equivalent to a unit struct + return expand_unit(ident); + } match fields { Fields::Named(named) => expand_named(ident, named), Fields::Unnamed(unnamed) => expand_unnamed(ident, unnamed), - Fields::Unit => expand_unit(ident), + Fields::Unit => unreachable!(), } } diff --git a/crates/turbo-tasks-macros/src/derive/deterministic_hash_macro.rs b/crates/turbo-tasks-macros/src/derive/deterministic_hash_macro.rs index 6d4714999baea..8e92839505555 100644 --- a/crates/turbo-tasks-macros/src/derive/deterministic_hash_macro.rs +++ b/crates/turbo-tasks-macros/src/derive/deterministic_hash_macro.rs @@ -62,6 +62,6 @@ fn hash_unnamed(_ident: &Ident, fields: &FieldsUnnamed) -> (TokenStream2, TokenS } /// Hashes a unit struct or enum variant (e.g. `struct Foo;`, `Foo::Bar`). -fn hash_unit(_ident: &Ident) -> (TokenStream2, TokenStream2) { - (quote! {}, quote! { { } }) +fn hash_unit(_ident: &Ident) -> TokenStream2 { + quote! { { } } } diff --git a/crates/turbo-tasks-macros/src/derive/trace_raw_vcs_macro.rs b/crates/turbo-tasks-macros/src/derive/trace_raw_vcs_macro.rs index ae77e53e7560d..95e38814eacde 100644 --- a/crates/turbo-tasks-macros/src/derive/trace_raw_vcs_macro.rs +++ b/crates/turbo-tasks-macros/src/derive/trace_raw_vcs_macro.rs @@ -56,6 +56,6 @@ fn trace_unnamed(_ident: &Ident, fields: &FieldsUnnamed) -> (TokenStream2, Token ) } -fn trace_unit(_ident: &Ident) -> (TokenStream2, TokenStream2) { - (quote! {}, quote! { { } }) +fn trace_unit(_ident: &Ident) -> TokenStream2 { + quote! { { } } } diff --git a/crates/turbo-tasks-macros/src/derive/value_debug_format_macro.rs b/crates/turbo-tasks-macros/src/derive/value_debug_format_macro.rs index 4b42935f2dfc5..52d6fa1e52961 100644 --- a/crates/turbo-tasks-macros/src/derive/value_debug_format_macro.rs +++ b/crates/turbo-tasks-macros/src/derive/value_debug_format_macro.rs @@ -56,7 +56,7 @@ pub fn derive_value_debug_format(input: TokenStream) -> TokenStream { /// Formats a single field nested inside named or unnamed fields. fn format_field(value: TokenStream2) -> TokenStream2 { quote! { - turbo_tasks::macro_helpers::value_debug_format_field(#value.value_debug_format(depth.saturating_sub(1))).await + turbo_tasks::macro_helpers::value_debug_format_field(#value.value_debug_format(depth.saturating_sub(1))) } } @@ -64,19 +64,27 @@ fn format_field(value: TokenStream2) -> TokenStream2 { /// bar: u32 }`, `Foo::Bar { baz: u32 }`). fn format_named(ident: &Ident, fields: &FieldsNamed) -> (TokenStream2, TokenStream2) { let (captures, fields_idents) = generate_destructuring(fields.named.iter(), &filter_field); - let fields_values = fields_idents.iter().cloned().map(format_field); ( captures, - quote! { - FormattingStruct::new_named( - stringify!(#ident), - vec![#( - FormattingField::new( - stringify!(#fields_idents), - #fields_values, - ), - )*], - ) + if fields_idents.is_empty() { + // this can happen if all fields are ignored, we must special-case this to avoid + // rustc being unable to infer the type of an empty vec of futures + quote! { + FormattingStruct::new_named(stringify!(#ident), vec![]) + } + } else { + let fields_values = fields_idents.iter().cloned().map(format_field); + quote! { + FormattingStruct::new_named_async( + stringify!(#ident), + vec![#( + AsyncFormattingField::new( + stringify!(#fields_idents), + #fields_values, + ), + )*], + ).await + } }, ) } @@ -85,29 +93,34 @@ fn format_named(ident: &Ident, fields: &FieldsNamed) -> (TokenStream2, TokenStre /// Foo(u32)`, `Foo::Bar(u32)`). fn format_unnamed(ident: &Ident, fields: &FieldsUnnamed) -> (TokenStream2, TokenStream2) { let (captures, fields_idents) = generate_destructuring(fields.unnamed.iter(), &filter_field); - let fields_values = fields_idents.into_iter().map(format_field); ( captures, - quote! { - FormattingStruct::new_unnamed( - stringify!(#ident), - vec![#( - #fields_values, - )*], - ) + if fields_idents.is_empty() { + // this can happen if all fields are ignored, we must special-case this to avoid + // rustc being unable to infer the type of an empty vec of futures + quote! { + FormattingStruct::new_unnamed(stringify!(#ident), vec![]) + } + } else { + let fields_values = fields_idents.into_iter().map(format_field); + quote! { + FormattingStruct::new_unnamed_async( + stringify!(#ident), + vec![#( + #fields_values, + )*], + ).await + } }, ) } /// Formats a unit struct or enum variant (e.g. `struct Foo;`, `Foo::Bar`). -fn format_unit(ident: &Ident) -> (TokenStream2, TokenStream2) { - ( - quote! {}, - quote! { - FormattingStruct::new_unnamed( - stringify!(#ident), - vec![], - ) - }, - ) +fn format_unit(ident: &Ident) -> TokenStream2 { + quote! { + FormattingStruct::new_unnamed( + stringify!(#ident), + vec![], + ) + } } diff --git a/crates/turbo-tasks-macros/src/lib.rs b/crates/turbo-tasks-macros/src/lib.rs index 0e5f3b77b49d2..f9977e5afd1c4 100644 --- a/crates/turbo-tasks-macros/src/lib.rs +++ b/crates/turbo-tasks-macros/src/lib.rs @@ -161,7 +161,7 @@ pub fn primitive(input: TokenStream) -> TokenStream { /// /// // Now you can do the following, for any `A` and `B` value types: /// -/// let vc: Vc, Vc>> = Vc::cell( +/// let vc: Vc, Vc>> = Vc::cell( /// GenericType::new( /// Vc::cell(42), /// Vc::cell("hello".to_string()) diff --git a/crates/turbo-tasks-malloc/Cargo.toml b/crates/turbo-tasks-malloc/Cargo.toml index b6338017da80a..78b29a88759b1 100644 --- a/crates/turbo-tasks-malloc/Cargo.toml +++ b/crates/turbo-tasks-malloc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "turbo-tasks-malloc" version = "0.1.0" -description = "TBD" +description = "A wrapper around mimalloc or the system allocator that tracks allocations" license = "MPL-2.0" edition = "2021" autobenches = false @@ -9,11 +9,11 @@ autobenches = false [lib] bench = false -[target.'cfg(not(target_os = "linux"))'.dependencies] -mimalloc = { version = "0.1.32", features = [], optional = true } +[target.'cfg(not(any(target_os = "linux", target_family = "wasm", target_env = "musl")))'.dependencies] +mimalloc = { version = "0.1.42", features = [], optional = true } -[target.'cfg(all(target_os = "linux", not(target_arch = "aarch64")))'.dependencies] -mimalloc = { version = "0.1.32", features = [ +[target.'cfg(all(target_os = "linux", not(any(target_family = "wasm", target_env = "musl"))))'.dependencies] +mimalloc = { version = "0.1.42", features = [ "local_dynamic_tls", ], optional = true } diff --git a/crates/turbo-tasks-malloc/src/counter.rs b/crates/turbo-tasks-malloc/src/counter.rs index e0765f51101d1..b3cc5b07219f9 100644 --- a/crates/turbo-tasks-malloc/src/counter.rs +++ b/crates/turbo-tasks-malloc/src/counter.rs @@ -49,6 +49,35 @@ impl ThreadLocalCounter { } } + fn update(&mut self, old_size: usize, new_size: usize) { + self.allocation_counters.deallocations += old_size; + self.allocation_counters.deallocation_count += 1; + self.allocation_counters.allocations += new_size; + self.allocation_counters.allocation_count += 1; + match old_size.cmp(&new_size) { + std::cmp::Ordering::Equal => {} + std::cmp::Ordering::Less => { + let size = new_size - old_size; + if self.buffer >= size { + self.buffer -= size; + } else { + let offset = size - self.buffer + TARGET_BUFFER; + self.buffer = TARGET_BUFFER; + ALLOCATED.fetch_add(offset, Ordering::Relaxed); + } + } + std::cmp::Ordering::Greater => { + let size = old_size - new_size; + self.buffer += size; + if self.buffer > MAX_BUFFER { + let offset = self.buffer - TARGET_BUFFER; + self.buffer = TARGET_BUFFER; + ALLOCATED.fetch_sub(offset, Ordering::Relaxed); + } + } + } + } + fn unload(&mut self) { if self.buffer > 0 { ALLOCATED.fetch_sub(self.buffer, Ordering::Relaxed); @@ -93,6 +122,11 @@ pub fn remove(size: usize) { with_local_counter(|local| local.remove(size)); } +/// Adds some `size` to the global counter in a thread-local buffered way. +pub fn update(old_size: usize, new_size: usize) { + with_local_counter(|local| local.update(old_size, new_size)); +} + /// Flushes the thread-local buffer to the global counter. This should be called /// e. g. when a thread is stopped or goes to sleep for a long time. pub fn flush() { diff --git a/crates/turbo-tasks-malloc/src/lib.rs b/crates/turbo-tasks-malloc/src/lib.rs index 5fa6cc4c7d7cf..3eb6acf24e046 100644 --- a/crates/turbo-tasks-malloc/src/lib.rs +++ b/crates/turbo-tasks-malloc/src/lib.rs @@ -5,7 +5,7 @@ use std::{ marker::PhantomData, }; -use self::counter::{add, flush, get, remove}; +use self::counter::{add, flush, get, remove, update}; #[derive(Default, Clone, Debug)] pub struct AllocationInfo { @@ -67,53 +67,24 @@ impl TurboMalloc { } } -#[cfg(all( - feature = "custom_allocator", - not(all(target_os = "linux", target_arch = "aarch64")) -))] -unsafe impl GlobalAlloc for TurboMalloc { - unsafe fn alloc(&self, layout: Layout) -> *mut u8 { - let ret = mimalloc::MiMalloc.alloc(layout); - if !ret.is_null() { - add(layout.size()); - } - ret - } - - unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { - mimalloc::MiMalloc.dealloc(ptr, layout); - remove(layout.size()); - } - - unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 { - let ret = mimalloc::MiMalloc.alloc_zeroed(layout); - if !ret.is_null() { - add(layout.size()); - } - ret - } - - unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 { - let ret = mimalloc::MiMalloc.realloc(ptr, layout, new_size); - if !ret.is_null() { - let old_size = layout.size(); - if old_size < new_size { - add(new_size - old_size); - } else { - remove(old_size - new_size); - } - } - ret - } +/// Get the allocator for this platform that we should wrap with TurboMalloc. +#[inline] +fn base_alloc() -> &'static impl GlobalAlloc { + #[cfg(all( + feature = "custom_allocator", + not(any(target_family = "wasm", target_env = "musl")) + ))] + return &mimalloc::MiMalloc; + #[cfg(any( + not(feature = "custom_allocator"), + any(target_family = "wasm", target_env = "musl") + ))] + return &std::alloc::System; } -#[cfg(any( - not(feature = "custom_allocator"), - all(target_os = "linux", target_arch = "aarch64") -))] unsafe impl GlobalAlloc for TurboMalloc { unsafe fn alloc(&self, layout: Layout) -> *mut u8 { - let ret = std::alloc::System.alloc(layout); + let ret = base_alloc().alloc(layout); if !ret.is_null() { add(layout.size()); } @@ -121,12 +92,12 @@ unsafe impl GlobalAlloc for TurboMalloc { } unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { - std::alloc::System.dealloc(ptr, layout); + base_alloc().dealloc(ptr, layout); remove(layout.size()); } unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 { - let ret = std::alloc::System.alloc_zeroed(layout); + let ret = base_alloc().alloc_zeroed(layout); if !ret.is_null() { add(layout.size()); } @@ -134,14 +105,10 @@ unsafe impl GlobalAlloc for TurboMalloc { } unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 { - let ret = std::alloc::System.realloc(ptr, layout, new_size); + let ret = base_alloc().realloc(ptr, layout, new_size); if !ret.is_null() { let old_size = layout.size(); - if old_size < new_size { - add(new_size - old_size); - } else { - remove(old_size - new_size); - } + update(old_size, new_size); } ret } diff --git a/crates/turbo-tasks-memory/Cargo.toml b/crates/turbo-tasks-memory/Cargo.toml index d7a615371236e..a7408fb16c723 100644 --- a/crates/turbo-tasks-memory/Cargo.toml +++ b/crates/turbo-tasks-memory/Cargo.toml @@ -28,6 +28,7 @@ rustc-hash = { workspace = true } smallvec = { workspace = true } tokio = { workspace = true } tracing = { workspace = true } +turbo-prehash = { workspace = true } turbo-tasks = { workspace = true } turbo-tasks-hash = { workspace = true } turbo-tasks-malloc = { workspace = true, default-features = false } @@ -47,6 +48,7 @@ turbo-tasks-build = { workspace = true } [features] track_unfinished = [] +track_wait_dependencies = [] unsafe_once_map = [] log_running_tasks = [] log_scheduled_tasks = [] diff --git a/crates/turbo-tasks-memory/src/aggregation/tests.rs b/crates/turbo-tasks-memory/src/aggregation/tests.rs index 12af07a9e7453..1412c48693b93 100644 --- a/crates/turbo-tasks-memory/src/aggregation/tests.rs +++ b/crates/turbo-tasks-memory/src/aggregation/tests.rs @@ -116,6 +116,7 @@ fn check_invariants<'a>( false } }); + #[allow(clippy::never_loop)] for missing_upper in missing_uppers { let upper_value = { let upper = ctx.node(missing_upper); diff --git a/crates/turbo-tasks-memory/src/memory_backend.rs b/crates/turbo-tasks-memory/src/memory_backend.rs index a2822316d400c..e83dd0bb5a6d1 100644 --- a/crates/turbo-tasks-memory/src/memory_backend.rs +++ b/crates/turbo-tasks-memory/src/memory_backend.rs @@ -17,6 +17,7 @@ use dashmap::{mapref::entry::Entry, DashMap}; use rustc_hash::FxHasher; use tokio::task::futures::TaskLocalFuture; use tracing::trace_span; +use turbo_prehash::{BuildHasherExt, PassThroughHash, PreHashed}; use turbo_tasks::{ backend::{ Backend, BackendJobId, CellContent, PersistentTaskType, TaskExecutionSpec, @@ -34,11 +35,16 @@ use crate::{ task::{Task, TaskDependency, TaskDependencySet, DEPENDENCIES_TO_TRACK}, }; +fn prehash_task_type(task_type: PersistentTaskType) -> PreHashed { + BuildHasherDefault::::prehash(&Default::default(), task_type) +} + pub struct MemoryBackend { memory_tasks: NoMoveVec, backend_jobs: NoMoveVec, backend_job_id_factory: IdFactory, - task_cache: DashMap, TaskId, BuildHasherDefault>, + task_cache: + DashMap>, TaskId, BuildHasherDefault>, memory_limit: usize, gc_queue: Option, idle_gc_active: AtomicBool, @@ -513,10 +519,11 @@ impl Backend for MemoryBackend { fn get_or_create_persistent_task( &self, - mut task_type: PersistentTaskType, + task_type: PersistentTaskType, parent_task: TaskId, turbo_tasks: &dyn TurboTasksBackendApi, ) -> TaskId { + let task_type = prehash_task_type(task_type); if let Some(task) = self.lookup_and_connect_task(parent_task, &self.task_cache, &task_type, turbo_tasks) { @@ -525,8 +532,9 @@ impl Backend for MemoryBackend { } else { // It's important to avoid overallocating memory as this will go into the task // cache and stay there forever. We can to be as small as possible. + let (task_type_hash, mut task_type) = PreHashed::into_parts(task_type); task_type.shrink_to_fit(); - let task_type = Arc::new(task_type); + let task_type = Arc::new(PreHashed::new(task_type_hash, task_type)); // slow pass with key lock let id = turbo_tasks.get_fresh_task_id(); let task = Task::new_persistent( diff --git a/crates/turbo-tasks-memory/src/task.rs b/crates/turbo-tasks-memory/src/task.rs index cd9e3cd4fca69..20232fec49d9f 100644 --- a/crates/turbo-tasks-memory/src/task.rs +++ b/crates/turbo-tasks-memory/src/task.rs @@ -18,6 +18,7 @@ use rustc_hash::FxHasher; use smallvec::SmallVec; use tokio::task_local; use tracing::Span; +use turbo_prehash::PreHashed; use turbo_tasks::{ backend::{PersistentTaskType, TaskExecutionSpec}, event::{Event, EventListener}, @@ -76,13 +77,15 @@ enum TaskType { Once(Box), /// A normal persistent task - Persistent { ty: Arc }, + Persistent { + ty: Arc>, + }, } enum TaskTypeForDescription { Root, Once, - Persistent(Arc), + Persistent(Arc>), } impl TaskTypeForDescription { @@ -406,7 +409,10 @@ use self::{ }; impl Task { - pub(crate) fn new_persistent(id: TaskId, task_type: Arc) -> Self { + pub(crate) fn new_persistent( + id: TaskId, + task_type: Arc>, + ) -> Self { let ty = TaskType::Persistent { ty: task_type }; let description = Self::get_event_description_static(id, &ty); Self { @@ -516,7 +522,7 @@ impl Task { pub(crate) fn get_function_name(&self) -> Option> { if let TaskType::Persistent { ty, .. } = &self.ty { - match &**ty { + match &***ty { PersistentTaskType::Native(native_fn, _) | PersistentTaskType::ResolveNative(native_fn, _) => { return Some(Cow::Borrowed(®istry::get_function(*native_fn).name)); @@ -539,7 +545,7 @@ impl Task { match ty { TaskTypeForDescription::Root => format!("[{}] root", id), TaskTypeForDescription::Once => format!("[{}] once", id), - TaskTypeForDescription::Persistent(ty) => match &**ty { + TaskTypeForDescription::Persistent(ty) => match &***ty { PersistentTaskType::Native(native_fn, _) => { format!("[{}] {}", id, registry::get_function(*native_fn).name) } @@ -742,7 +748,7 @@ impl Task { tracing::trace_span!("turbo_tasks::once_task"), ) } - TaskType::Persistent { ty, .. } => match &**ty { + TaskType::Persistent { ty, .. } => match &***ty { PersistentTaskType::Native(native_fn, inputs) => { let result = if let PrepareTaskType::Native(func, bound_fn) = &state.prepared_type { diff --git a/crates/turbo-tasks-memory/tests/all_in_one.rs b/crates/turbo-tasks-memory/tests/all_in_one.rs index d9223c442dcc8..f83d05b6ca8e9 100644 --- a/crates/turbo-tasks-memory/tests/all_in_one.rs +++ b/crates/turbo-tasks-memory/tests/all_in_one.rs @@ -2,7 +2,7 @@ use anyhow::{anyhow, Result}; use indexmap::{IndexMap, IndexSet}; -use turbo_tasks::{debug::ValueDebug, Value, ValueToString, Vc}; +use turbo_tasks::{debug::ValueDebug, RcStr, Value, ValueToString, Vc}; use turbo_tasks_testing::{register, run}; register!(); @@ -133,10 +133,10 @@ impl MyEnumValue { #[turbo_tasks::value_impl] impl ValueToString for MyEnumValue { #[turbo_tasks::function] - fn to_string(&self) -> Vc { + fn to_string(&self) -> Vc { match self { - MyEnumValue::Yeah(value) => Vc::cell(value.to_string()), - MyEnumValue::Nah => Vc::cell("nah".to_string()), + MyEnumValue::Yeah(value) => Vc::cell(value.to_string().into()), + MyEnumValue::Nah => Vc::cell("nah".into()), MyEnumValue::More(more) => more.to_string(), } } @@ -162,30 +162,30 @@ impl MyStructValue { #[turbo_tasks::value_impl] impl ValueToString for MyStructValue { #[turbo_tasks::function] - fn to_string(&self) -> Vc { - Vc::cell(self.value.to_string()) + fn to_string(&self) -> Vc { + Vc::cell(self.value.to_string().into()) } } #[turbo_tasks::value_impl] impl MyTrait for MyStructValue { #[turbo_tasks::function] - fn my_trait_function2(self: Vc) -> Vc { + fn my_trait_function2(self: Vc) -> Vc { self.to_string() } #[turbo_tasks::function] - async fn my_trait_function3(&self) -> Result> { + async fn my_trait_function3(&self) -> Result> { if let Some(next) = self.next { return Ok(next.my_trait_function3()); } - Ok(Vc::cell(self.value.to_string())) + Ok(Vc::cell(self.value.to_string().into())) } } #[turbo_tasks::value_trait] trait MyTrait: ValueToString { // TODO #[turbo_tasks::function] - async fn my_trait_function(self: Vc) -> Result> { + async fn my_trait_function(self: Vc) -> Result> { if *self.to_string().await? != "42" { return Err(anyhow!( "my_trait_function must only be called with 42 as value" @@ -195,8 +195,8 @@ trait MyTrait: ValueToString { Ok(self.to_string()) } - fn my_trait_function2(self: Vc) -> Vc; - fn my_trait_function3(self: Vc) -> Vc; + fn my_trait_function2(self: Vc) -> Vc; + fn my_trait_function3(self: Vc) -> Vc; } #[turbo_tasks::function] diff --git a/crates/turbo-tasks-memory/tests/collectibles.rs b/crates/turbo-tasks-memory/tests/collectibles.rs index 35d48f7f42fb7..779b20246c20e 100644 --- a/crates/turbo-tasks-memory/tests/collectibles.rs +++ b/crates/turbo-tasks-memory/tests/collectibles.rs @@ -5,14 +5,14 @@ use std::{collections::HashSet, time::Duration}; use anyhow::Result; use auto_hash_map::AutoSet; use tokio::time::sleep; -use turbo_tasks::{emit, CollectiblesSource, ValueToString, Vc}; +use turbo_tasks::{emit, CollectiblesSource, RcStr, ValueToString, Vc}; use turbo_tasks_testing::{register, run}; register!(); #[tokio::test] async fn transitive_emitting() { run! { - let result = my_transitive_emitting_function("".to_string(), "".to_string()); + let result = my_transitive_emitting_function("".into(), "".into()); result.strongly_consistent().await?; let list = result.peek_collectibles::>(); assert_eq!(list.len(), 2); @@ -27,8 +27,8 @@ async fn transitive_emitting() { #[tokio::test] async fn transitive_emitting_indirect() { run! { - let result = my_transitive_emitting_function("".to_string(), "".to_string()); - let collectibles = my_transitive_emitting_function_collectibles("".to_string(), "".to_string()); + let result = my_transitive_emitting_function("".into(), "".into()); + let collectibles = my_transitive_emitting_function_collectibles("".into(), "".into()); let list = collectibles.strongly_consistent().await?; assert_eq!(list.len(), 2); let mut expected = ["123", "42"].into_iter().collect::>(); @@ -82,31 +82,31 @@ async fn taking_collectibles_extra_layer() { #[tokio::test] async fn taking_collectibles_parallel() { run! { - let result = my_transitive_emitting_function("".to_string(), "a".to_string()); + let result = my_transitive_emitting_function("".into(), "a".into()); result.strongly_consistent().await?; let list = result.take_collectibles::>(); assert_eq!(list.len(), 2); assert_eq!(result.await?.0, 0); - let result = my_transitive_emitting_function("".to_string(), "b".to_string()); + let result = my_transitive_emitting_function("".into(), "b".into()); result.strongly_consistent().await?; let list = result.take_collectibles::>(); assert_eq!(list.len(), 2); assert_eq!(result.await?.0, 0); - let result = my_transitive_emitting_function_with_child_scope("".to_string(), "b".to_string(), "1".to_string()); + let result = my_transitive_emitting_function_with_child_scope("".into(), "b".into(), "1".into()); result.strongly_consistent().await?; let list = result.take_collectibles::>(); assert_eq!(list.len(), 2); assert_eq!(result.await?.0, 0); - let result = my_transitive_emitting_function_with_child_scope("".to_string(), "b".to_string(), "2".to_string()); + let result = my_transitive_emitting_function_with_child_scope("".into(), "b".into(), "2".into()); result.strongly_consistent().await?; let list = result.take_collectibles::>(); assert_eq!(list.len(), 2); assert_eq!(result.await?.0, 0); - let result = my_transitive_emitting_function_with_child_scope("".to_string(), "c".to_string(), "3".to_string()); + let result = my_transitive_emitting_function_with_child_scope("".into(), "c".into(), "3".into()); result.strongly_consistent().await?; let list = result.take_collectibles::>(); assert_eq!(list.len(), 2); @@ -119,7 +119,7 @@ struct Collectibles(AutoSet>>); #[turbo_tasks::function] async fn my_collecting_function() -> Result> { - let result = my_transitive_emitting_function("".to_string(), "".to_string()); + let result = my_transitive_emitting_function("".into(), "".into()); result.take_collectibles::>(); Ok(result) } @@ -137,32 +137,29 @@ async fn my_collecting_function_indirect() -> Result> { #[turbo_tasks::function] async fn my_multi_emitting_function() -> Result> { - my_transitive_emitting_function("".to_string(), "a".to_string()).await?; - my_transitive_emitting_function("".to_string(), "b".to_string()).await?; - my_emitting_function("".to_string()).await?; + my_transitive_emitting_function("".into(), "a".into()).await?; + my_transitive_emitting_function("".into(), "b".into()).await?; + my_emitting_function("".into()).await?; Ok(Thing::cell(Thing(0))) } #[turbo_tasks::function] -async fn my_transitive_emitting_function(key: String, _key2: String) -> Result> { +async fn my_transitive_emitting_function(key: RcStr, _key2: RcStr) -> Result> { my_emitting_function(key).await?; Ok(Thing::cell(Thing(0))) } #[turbo_tasks::function] -async fn my_transitive_emitting_function_collectibles( - key: String, - key2: String, -) -> Vc { +async fn my_transitive_emitting_function_collectibles(key: RcStr, key2: RcStr) -> Vc { let result = my_transitive_emitting_function(key, key2); Vc::cell(result.peek_collectibles::>()) } #[turbo_tasks::function] async fn my_transitive_emitting_function_with_child_scope( - key: String, - key2: String, - _key3: String, + key: RcStr, + key2: RcStr, + _key3: RcStr, ) -> Result> { let thing = my_transitive_emitting_function(key, key2); thing.strongly_consistent().await?; @@ -172,7 +169,7 @@ async fn my_transitive_emitting_function_with_child_scope( } #[turbo_tasks::function] -async fn my_emitting_function(_key: String) -> Result<()> { +async fn my_emitting_function(_key: RcStr) -> Result<()> { sleep(Duration::from_millis(100)).await; emit(Vc::upcast::>(Thing::new(123))); emit(Vc::upcast::>(Thing::new(42))); @@ -191,7 +188,7 @@ impl Thing { #[turbo_tasks::value_impl] impl ValueToString for Thing { #[turbo_tasks::function] - fn to_string(&self) -> Vc { - Vc::cell(self.0.to_string()) + fn to_string(&self) -> Vc { + Vc::cell(self.0.to_string().into()) } } diff --git a/crates/turbo-tasks/src/debug/internal.rs b/crates/turbo-tasks/src/debug/internal.rs index 3afea735f86c4..6299dd36828c9 100644 --- a/crates/turbo-tasks/src/debug/internal.rs +++ b/crates/turbo-tasks/src/debug/internal.rs @@ -1,5 +1,6 @@ -use std::borrow::Cow; +use std::{borrow::Cow, future::Future}; +use futures::future::join_all; pub use turbo_tasks_macros::ValueDebug; /// Representation of a named field of a structure for formatting purposes of @@ -16,6 +17,34 @@ impl<'a> FormattingField<'a> { } } +/// Representation of a named field of a structure for formatting purposes of +/// `ValueDebug` implementations. +#[derive(Debug)] +pub struct AsyncFormattingField<'a, Fut> +where + Fut: Future, +{ + name: &'a str, + contents: Fut, +} + +impl<'a, Fut: Future> AsyncFormattingField<'a, Fut> +where + Fut: Future, +{ + pub fn new(name: &'a str, contents: Fut) -> Self { + Self { name, contents } + } + + pub async fn resolve(self) -> FormattingField<'a> { + let Self { name, contents } = self; + FormattingField { + name, + contents: contents.await, + } + } +} + /// Representation of a structure for formatting purposes of `ValueDebug` /// implementations. pub enum FormattingStruct<'a> { @@ -36,6 +65,26 @@ impl<'a> FormattingStruct<'a> { pub fn new_unnamed(name: &'a str, fields: Vec) -> Self { Self::Unnamed { name, fields } } + + pub async fn new_named_async( + name: &'a str, + fields: Vec>>, + ) -> Self { + Self::Named { + name, + fields: join_all(fields.into_iter().map(AsyncFormattingField::resolve)).await, + } + } + + pub async fn new_unnamed_async( + name: &'a str, + fields: Vec>, + ) -> Self { + Self::Unnamed { + name, + fields: join_all(fields).await, + } + } } impl<'a> std::fmt::Debug for FormattingStruct<'a> { diff --git a/crates/turbo-tasks/src/debug/mod.rs b/crates/turbo-tasks/src/debug/mod.rs index 57721d68b3cc1..b4e8697f52a7f 100644 --- a/crates/turbo-tasks/src/debug/mod.rs +++ b/crates/turbo-tasks/src/debug/mod.rs @@ -15,7 +15,7 @@ use internal::PassthroughDebug; /// The return type of `ValueDebug::dbg`. /// -/// We don't use `Vc` directly because we don't want the +/// We don't use `Vc` directly because we don't want the /// `Debug`/`Display` representations to be escaped. #[turbo_tasks::value] pub struct ValueDebugString(String); diff --git a/crates/turbo-tasks/src/display.rs b/crates/turbo-tasks/src/display.rs index 3e975c1527329..78a8e05cb965f 100644 --- a/crates/turbo-tasks/src/display.rs +++ b/crates/turbo-tasks/src/display.rs @@ -1,8 +1,8 @@ use turbo_tasks::Vc; -use crate::{self as turbo_tasks}; +use crate::{self as turbo_tasks, RcStr}; #[turbo_tasks::value_trait] pub trait ValueToString { - fn to_string(self: Vc) -> Vc; + fn to_string(self: Vc) -> Vc; } diff --git a/crates/turbo-tasks/src/lib.rs b/crates/turbo-tasks/src/lib.rs index 93bda5364a01f..297ffeb717138 100644 --- a/crates/turbo-tasks/src/lib.rs +++ b/crates/turbo-tasks/src/lib.rs @@ -60,6 +60,7 @@ pub mod persisted_graph; pub mod primitives; mod raw_vc; mod raw_vc_set; +mod rcstr; mod read_ref; pub mod registry; pub mod small_duration; @@ -110,6 +111,8 @@ pub use vc::{ VcDefaultRead, VcRead, VcTransparentRead, VcValueTrait, VcValueType, }; +pub use crate::rcstr::RcStr; + pub type TaskIdSet = AutoSet, 2>; pub mod test_helpers { diff --git a/crates/turbo-tasks/src/manager.rs b/crates/turbo-tasks/src/manager.rs index 2dd0691dc99e1..996440bcd8e74 100644 --- a/crates/turbo-tasks/src/manager.rs +++ b/crates/turbo-tasks/src/manager.rs @@ -871,10 +871,12 @@ impl TurboTasksApi for TurboTasks { fn notify_scheduled_tasks(&self) { let _ = CURRENT_TASK_STATE.try_with(|cell| { - let CurrentTaskState { - tasks_to_notify, .. - } = &mut *cell.borrow_mut(); - let tasks = take(tasks_to_notify); + let tasks = { + let CurrentTaskState { + tasks_to_notify, .. + } = &mut *cell.borrow_mut(); + take(tasks_to_notify) + }; if tasks.is_empty() { return; } diff --git a/crates/turbo-tasks/src/primitives.rs b/crates/turbo-tasks/src/primitives.rs index b14773ecb8edd..0d433ed7e376d 100644 --- a/crates/turbo-tasks/src/primitives.rs +++ b/crates/turbo-tasks/src/primitives.rs @@ -6,37 +6,39 @@ use futures::TryFutureExt; use turbo_tasks_macros::primitive as __turbo_tasks_internal_primitive; use crate::{ - TryJoinIterExt, Vc, {self as turbo_tasks}, + RcStr, TryJoinIterExt, Vc, {self as turbo_tasks}, }; __turbo_tasks_internal_primitive!(()); __turbo_tasks_internal_primitive!(String); +__turbo_tasks_internal_primitive!(RcStr); #[turbo_tasks::function] -fn empty_string() -> Vc { - Vc::cell(String::new()) +fn empty_string() -> Vc { + Vc::cell(RcStr::default()) } -impl Vc { +impl Vc { #[deprecated(note = "use Default::default() instead")] #[inline(always)] - pub fn empty() -> Vc { + pub fn empty() -> Vc { empty_string() } } __turbo_tasks_internal_primitive!(Option); -__turbo_tasks_internal_primitive!(Vec); +__turbo_tasks_internal_primitive!(Option); +__turbo_tasks_internal_primitive!(Vec); #[turbo_tasks::function] -fn empty_string_vec() -> Vc> { +fn empty_string_vec() -> Vc> { Vc::cell(Vec::new()) } -impl Vc> { +impl Vc> { #[deprecated(note = "use Default::default() instead")] #[inline(always)] - pub fn empty() -> Vc> { + pub fn empty() -> Vc> { empty_string_vec() } } diff --git a/crates/turbo-tasks/src/rcstr.rs b/crates/turbo-tasks/src/rcstr.rs new file mode 100644 index 0000000000000..7e2c7433eb55b --- /dev/null +++ b/crates/turbo-tasks/src/rcstr.rs @@ -0,0 +1,154 @@ +use std::{ + borrow::{Borrow, Cow}, + ffi::OsStr, + fmt::{Debug, Display}, + ops::Deref, + path::{Path, PathBuf}, + sync::Arc, +}; + +use serde::{Deserialize, Serialize}; +use turbo_tasks_hash::{DeterministicHash, DeterministicHasher}; + +use crate::debug::{ValueDebugFormat, ValueDebugFormatString}; + +/// This type exists to allow swapping out the underlying string type easily. +// +// If you want to change the underlying string type to `Arc`, please ensure that you profile +// perforamnce. The current implementation offers very cheap `String -> RcStr -> String`, meaning we +// only pay for the allocation for `Arc` when we pass `format!("").into()` to a function. +#[derive(Clone, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] +#[serde(transparent)] +pub struct RcStr(Arc); + +impl RcStr { + pub fn as_str(&self) -> &str { + self.0.as_str() + } + + /// This implementation is more efficient than `.to_string()` + pub fn into_owned(self) -> String { + match Arc::try_unwrap(self.0) { + Ok(v) => v, + Err(arc) => arc.to_string(), + } + } + + pub fn map(self, f: impl FnOnce(String) -> String) -> Self { + RcStr(Arc::new(f(self.into_owned()))) + } +} + +impl DeterministicHash for RcStr { + fn deterministic_hash(&self, state: &mut H) { + state.write_usize(self.len()); + state.write_bytes(self.as_bytes()); + } +} + +impl Deref for RcStr { + type Target = str; + + fn deref(&self) -> &Self::Target { + self.0.as_str() + } +} + +impl Borrow for RcStr { + fn borrow(&self) -> &str { + self.0.as_str() + } +} + +impl From> for RcStr { + fn from(s: Arc) -> Self { + RcStr(s) + } +} + +impl From for RcStr { + fn from(s: String) -> Self { + RcStr(Arc::new(s)) + } +} + +impl From<&'_ str> for RcStr { + fn from(s: &str) -> Self { + RcStr(Arc::new(s.to_string())) + } +} + +impl From> for RcStr { + fn from(s: Cow) -> Self { + RcStr(Arc::new(s.into_owned())) + } +} + +/// Mimic `&str` +impl AsRef for RcStr { + fn as_ref(&self) -> &Path { + (*self.0).as_ref() + } +} + +/// Mimic `&str` +impl AsRef for RcStr { + fn as_ref(&self) -> &OsStr { + (*self.0).as_ref() + } +} + +/// Mimic `&str` +impl AsRef<[u8]> for RcStr { + fn as_ref(&self) -> &[u8] { + (*self.0).as_ref() + } +} + +impl PartialEq for RcStr { + fn eq(&self, other: &str) -> bool { + self.0.as_str() == other + } +} + +impl PartialEq<&'_ str> for RcStr { + fn eq(&self, other: &&str) -> bool { + self.0.as_str() == *other + } +} + +impl PartialEq for RcStr { + fn eq(&self, other: &String) -> bool { + self.as_str() == other.as_str() + } +} + +impl Debug for RcStr { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + Debug::fmt(&self.0, f) + } +} + +impl Display for RcStr { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + Display::fmt(&self.0, f) + } +} + +impl From for String { + fn from(s: RcStr) -> Self { + s.into_owned() + } +} + +impl From for PathBuf { + fn from(s: RcStr) -> Self { + String::from(s).into() + } +} + +impl ValueDebugFormat for RcStr { + fn value_debug_format(&self, _: usize) -> ValueDebugFormatString { + ValueDebugFormatString::Sync(self.to_string()) + } +} diff --git a/crates/turbo-tasks/src/task/concrete_task_input.rs b/crates/turbo-tasks/src/task/concrete_task_input.rs index c591d652bc658..c583856e4845c 100644 --- a/crates/turbo-tasks/src/task/concrete_task_input.rs +++ b/crates/turbo-tasks/src/task/concrete_task_input.rs @@ -16,7 +16,7 @@ use crate::{ id::{FunctionId, TraitTypeId}, magic_any::MagicAny, manager::{read_task_cell, read_task_output}, - registry, turbo_tasks, CellId, RawVc, TaskId, TraitType, ValueTypeId, + registry, turbo_tasks, CellId, RawVc, RcStr, TaskId, TraitType, ValueTypeId, }; #[derive(Clone)] @@ -330,7 +330,7 @@ pub enum ConcreteTaskInput { TaskOutput(TaskId), TaskCell(TaskId, CellId), List(Vec), - String(String), + String(RcStr), Bool(bool), Usize(usize), I8(i8), diff --git a/crates/turbo-tasks/src/task/function.rs b/crates/turbo-tasks/src/task/function.rs index b753f468158b8..58bd10fb1f225 100644 --- a/crates/turbo-tasks/src/task/function.rs +++ b/crates/turbo-tasks/src/task/function.rs @@ -109,8 +109,44 @@ macro_rules! task_inputs_impl { } } +macro_rules! as_concrete_task_input { + ( $arg:ident ) => { + ConcreteTaskInput + }; +} + macro_rules! task_fn_impl { - ( $async_fn_trait:ident , $( $arg:ident )* ) => { + ( $helper_module:ident $async_fn_trait:ident $arg_len:literal $( $arg:ident )* ) => { + mod $helper_module { + use super::*; + + // this is a non-generic helper method to allow code-sharing across monomorphized + // instances of this function + pub fn get_args( + inputs: &[ConcreteTaskInput], + ) -> Result<($(&as_concrete_task_input!($arg),)*)> { + get_args_iter(inputs.iter()) + } + + pub fn get_method_args( + inputs: &[ConcreteTaskInput], + ) -> Result<(&ConcreteTaskInput, ($(&as_concrete_task_input!($arg),)*))> { + let mut iter = inputs.iter(); + let recv = iter.next().context("task is missing receiver")?; + Ok((recv, get_args_iter(iter)?)) + } + + fn get_args_iter( + mut iter: std::slice::Iter<'_, ConcreteTaskInput>, + ) -> Result<($(&as_concrete_task_input!($arg),)*)> { + let args = ($(next_arg(&mut iter, stringify!($arg))?,)*); + if iter.next().is_some() { + bail!("task was called with too many arguments"); + } + Ok(args) + } + } + impl TaskFnInputFunction for F where $($arg: TaskInput + 'static,)* @@ -119,17 +155,9 @@ macro_rules! task_fn_impl { { #[allow(non_snake_case)] fn functor(&self, inputs: &[ConcreteTaskInput]) -> Result { - let task_fn = self.clone(); - let mut iter = inputs.iter(); - - $( - let $arg = iter.next().context(format!("task is missing argument {}", stringify!($arg)))?; - )* - - if iter.next().is_some() { - bail!("task was called with too many arguments"); - } + let ($($arg,)*) = $helper_module::get_args(inputs)?; + let task_fn = self.clone(); $( let $arg = $arg::try_from_concrete($arg)?; )* @@ -156,17 +184,9 @@ macro_rules! task_fn_impl { { #[allow(non_snake_case)] fn functor(&self, inputs: &[ConcreteTaskInput]) -> Result { - let task_fn = self.clone(); - let mut iter = inputs.iter(); - - $( - let $arg = iter.next().context(format!("task is missing argument {}", stringify!($arg)))?; - )* - - if iter.next().is_some() { - bail!("task was called with too many arguments"); - } + let ($($arg,)*) = $helper_module::get_args(inputs)?; + let task_fn = self.clone(); $( let $arg = $arg::try_from_concrete($arg)?; )* @@ -193,18 +213,9 @@ macro_rules! task_fn_impl { { #[allow(non_snake_case)] fn functor(&self, inputs: &[ConcreteTaskInput]) -> Result { - let task_fn = self.clone(); - let mut iter = inputs.iter(); - - let recv = iter.next().context("task is missing receiver")?; - $( - let $arg = iter.next().context(format!("task is missing argument {}", stringify!($arg)))?; - )* - - if iter.next().is_some() { - bail!("task was called with too many arguments"); - } + let (recv, ($($arg,)*)) = $helper_module::get_method_args(inputs)?; + let task_fn = self.clone(); let recv = Vc::::try_from_concrete(recv)?; $( let $arg = $arg::try_from_concrete($arg)?; @@ -254,7 +265,7 @@ macro_rules! task_fn_impl { let recv = iter.next().context("task is missing receiver")?; $( - let $arg = iter.next().context(format!("task is missing argument {}", stringify!($arg)))?; + let $arg = next_arg(&mut iter, stringify!($arg))?; )* if iter.next().is_some() { @@ -284,23 +295,23 @@ macro_rules! task_fn_impl { }; } -task_fn_impl! { AsyncFn0, } -task_fn_impl! { AsyncFn1, A1 } -task_fn_impl! { AsyncFn2, A1 A2 } -task_fn_impl! { AsyncFn3, A1 A2 A3 } -task_fn_impl! { AsyncFn4, A1 A2 A3 A4 } -task_fn_impl! { AsyncFn5, A1 A2 A3 A4 A5 } -task_fn_impl! { AsyncFn6, A1 A2 A3 A4 A5 A6 } -task_fn_impl! { AsyncFn7, A1 A2 A3 A4 A5 A6 A7 } -task_fn_impl! { AsyncFn8, A1 A2 A3 A4 A5 A6 A7 A8 } -task_fn_impl! { AsyncFn9, A1 A2 A3 A4 A5 A6 A7 A8 A9 } -task_fn_impl! { AsyncFn10, A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 } -task_fn_impl! { AsyncFn11, A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 } -task_fn_impl! { AsyncFn12, A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 } -task_fn_impl! { AsyncFn13, A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 } -task_fn_impl! { AsyncFn14, A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 } -task_fn_impl! { AsyncFn15, A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 } -task_fn_impl! { AsyncFn16, A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 } +task_fn_impl! { async_fn_0 AsyncFn0 0 } +task_fn_impl! { async_fn_1 AsyncFn1 1 A1 } +task_fn_impl! { async_fn_2 AsyncFn2 2 A1 A2 } +task_fn_impl! { async_fn_3 AsyncFn3 3 A1 A2 A3 } +task_fn_impl! { async_fn_4 AsyncFn4 4 A1 A2 A3 A4 } +task_fn_impl! { async_fn_5 AsyncFn5 5 A1 A2 A3 A4 A5 } +task_fn_impl! { async_fn_6 AsyncFn6 6 A1 A2 A3 A4 A5 A6 } +task_fn_impl! { async_fn_7 AsyncFn7 7 A1 A2 A3 A4 A5 A6 A7 } +task_fn_impl! { async_fn_8 AsyncFn8 8 A1 A2 A3 A4 A5 A6 A7 A8 } +task_fn_impl! { async_fn_9 AsyncFn9 9 A1 A2 A3 A4 A5 A6 A7 A8 A9 } +task_fn_impl! { async_fn_10 AsyncFn10 10 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 } +task_fn_impl! { async_fn_11 AsyncFn11 11 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 } +task_fn_impl! { async_fn_12 AsyncFn12 12 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 } +task_fn_impl! { async_fn_13 AsyncFn13 13 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 } +task_fn_impl! { async_fn_14 AsyncFn14 14 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 } +task_fn_impl! { async_fn_15 AsyncFn15 15 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 } +task_fn_impl! { async_fn_16 AsyncFn16 16 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 } // There needs to be one more implementation than task_fn_impl to account for // the receiver. @@ -323,10 +334,18 @@ task_inputs_impl! { A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 } task_inputs_impl! { A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 } task_inputs_impl! { A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 } +fn next_arg<'a>( + iter: &mut std::slice::Iter<'a, ConcreteTaskInput>, + arg_name: &'static str, +) -> Result<&'a ConcreteTaskInput> { + iter.next() + .with_context(move || format!("task is missing argument {}", arg_name)) +} + #[cfg(test)] mod tests { use super::*; - use crate::{VcCellNewMode, VcDefaultRead}; + use crate::{RcStr, VcCellNewMode, VcDefaultRead}; #[test] fn test_task_fn() { @@ -350,18 +369,15 @@ mod tests { todo!() } - fn with_recv_and_str(_a: &i32, _s: String) -> crate::Vc { + fn with_recv_and_str(_a: &i32, _s: RcStr) -> crate::Vc { todo!() } - async fn async_with_recv_and_str(_a: &i32, _s: String) -> crate::Vc { + async fn async_with_recv_and_str(_a: &i32, _s: RcStr) -> crate::Vc { todo!() } - async fn async_with_recv_and_str_and_result( - _a: &i32, - _s: String, - ) -> Result> { + async fn async_with_recv_and_str_and_result(_a: &i32, _s: RcStr) -> Result> { todo!() } diff --git a/crates/turbo-tasks/src/task/task_input.rs b/crates/turbo-tasks/src/task/task_input.rs index 9d1e2ffc40ea3..855a2d309acf0 100644 --- a/crates/turbo-tasks/src/task/task_input.rs +++ b/crates/turbo-tasks/src/task/task_input.rs @@ -8,7 +8,7 @@ use anyhow::{anyhow, bail, Result}; use super::concrete_task_input::TransientSharedValue; use crate::{ - magic_any::MagicAny, ConcreteTaskInput, RawVc, SharedValue, TaskId, TransientInstance, + magic_any::MagicAny, ConcreteTaskInput, RawVc, RcStr, SharedValue, TaskId, TransientInstance, TransientValue, TypedForInput, Value, ValueTypeId, Vc, VcValueType, }; @@ -31,7 +31,7 @@ impl TaskInput for ConcreteTaskInput { } } -impl TaskInput for String { +impl TaskInput for RcStr { fn try_from_concrete(input: &ConcreteTaskInput) -> Result { match input { ConcreteTaskInput::String(s) => Ok(s.clone()), @@ -406,7 +406,7 @@ mod tests { #[test] fn test_multiple_unnamed_fields() -> Result<()> { #[derive(Clone, TaskInput, Eq, PartialEq, Debug)] - struct MultipleUnnamedFields(u32, String); + struct MultipleUnnamedFields(u32, RcStr); test_conversion!(MultipleUnnamedFields(42, "42".into())); Ok(()) @@ -428,7 +428,7 @@ mod tests { #[derive(Clone, TaskInput, Eq, PartialEq, Debug)] struct MultipleNamedFields { named: u32, - other: String, + other: RcStr, } test_conversion!(MultipleNamedFields { @@ -444,7 +444,7 @@ mod tests { struct GenericField(T); test_conversion!(GenericField(42)); - test_conversion!(GenericField("42".to_string())); + test_conversion!(GenericField(RcStr::from("42"))); Ok(()) } @@ -485,8 +485,8 @@ mod tests { Variant1, Variant2(u32), Variant3 { named: u32 }, - Variant4(u32, String), - Variant5 { named: u32, other: String }, + Variant4(u32, RcStr), + Variant5 { named: u32, other: RcStr }, } #[test] @@ -505,8 +505,8 @@ mod tests { Variant1, Variant2(MultipleVariantsAndHeterogeneousFields), Variant3 { named: OneVariant }, - Variant4(OneVariant, String), - Variant5 { named: OneVariant, other: String }, + Variant4(OneVariant, RcStr), + Variant5 { named: OneVariant, other: RcStr }, } test_conversion!(NestedVariants::Variant5 { diff --git a/crates/turbo-tasks/src/trace.rs b/crates/turbo-tasks/src/trace.rs index da7000c8501cd..17fa1c185a8a1 100644 --- a/crates/turbo-tasks/src/trace.rs +++ b/crates/turbo-tasks/src/trace.rs @@ -9,7 +9,7 @@ use std::{ use auto_hash_map::{AutoMap, AutoSet}; use indexmap::{IndexMap, IndexSet}; -use crate::RawVc; +use crate::{RawVc, RcStr}; pub struct TraceRawVcsContext { list: Vec, @@ -70,7 +70,7 @@ ignore!( AtomicBool, AtomicUsize ); -ignore!((), String, Duration, anyhow::Error); +ignore!((), String, Duration, anyhow::Error, RcStr); ignore!(Path, PathBuf); ignore!(serde_json::Value); diff --git a/crates/turbopack-binding/Cargo.toml b/crates/turbopack-binding/Cargo.toml index 0457caf89e6af..d33e7b4d08c9a 100644 --- a/crates/turbopack-binding/Cargo.toml +++ b/crates/turbopack-binding/Cargo.toml @@ -153,6 +153,7 @@ __turbopack_node_dynamic_embed_contents = [ ] __turbopack_static = ["__turbopack", "turbopack-static"] __turbopack_swc_utils = ["__turbopack", "turbopack-swc-utils"] +__turbopack_tests = [] __turbopack_test_utils = ["__turbopack", "turbopack-test-utils"] __features = [] @@ -163,6 +164,7 @@ __feature_node_file_trace_custom_allocator = [ "node-file-trace/custom_allocator", ] __feature_auto_hash_map = ["__features", "auto-hash-map"] +__feature_swc_ast_explorer = [] __feature_tracing_signpost = ["__features", "tracing-signpost"] __swc_custom_transform = [] diff --git a/crates/turbopack-browser/src/chunking_context.rs b/crates/turbopack-browser/src/chunking_context.rs index 1827006f21e45..9e56f7a4d0561 100644 --- a/crates/turbopack-browser/src/chunking_context.rs +++ b/crates/turbopack-browser/src/chunking_context.rs @@ -1,13 +1,13 @@ use anyhow::{bail, Context, Result}; use tracing::Instrument; -use turbo_tasks::{Value, ValueToString, Vc}; +use turbo_tasks::{RcStr, Value, ValueToString, Vc}; use turbo_tasks_fs::FileSystemPath; use turbopack_core::{ chunk::{ availability_info::AvailabilityInfo, chunk_group::{make_chunk_group, MakeChunkGroupResult}, - Chunk, ChunkGroupResult, ChunkItem, ChunkableModule, ChunkingContext, EvaluatableAssets, - MinifyType, ModuleId, + Chunk, ChunkGroupResult, ChunkItem, ChunkableModule, ChunkingContext, + EntryChunkGroupResult, EvaluatableAssets, MinifyType, ModuleId, }, environment::Environment, ident::AssetIdent, @@ -32,7 +32,7 @@ pub struct BrowserChunkingContextBuilder { } impl BrowserChunkingContextBuilder { - pub fn name(mut self, name: String) -> Self { + pub fn name(mut self, name: RcStr) -> Self { self.chunking_context.name = Some(name); self } @@ -42,12 +42,12 @@ impl BrowserChunkingContextBuilder { self } - pub fn asset_base_path(mut self, asset_base_path: Vc>) -> Self { + pub fn asset_base_path(mut self, asset_base_path: Vc>) -> Self { self.chunking_context.asset_base_path = asset_base_path; self } - pub fn chunk_base_path(mut self, chunk_base_path: Vc>) -> Self { + pub fn chunk_base_path(mut self, chunk_base_path: Vc>) -> Self { self.chunking_context.chunk_base_path = chunk_base_path; self } @@ -90,7 +90,7 @@ impl BrowserChunkingContextBuilder { #[turbo_tasks::value(serialization = "auto_for_input")] #[derive(Debug, Clone, Hash, PartialOrd, Ord)] pub struct BrowserChunkingContext { - name: Option, + name: Option, /// This path get stripped off of chunk paths before generating output asset /// paths. context_path: Vc, @@ -108,10 +108,10 @@ pub struct BrowserChunkingContext { asset_root_path: Vc, /// Base path that will be prepended to all chunk URLs when loading them. /// This path will not appear in chunk paths or chunk data. - chunk_base_path: Vc>, + chunk_base_path: Vc>, /// URL prefix that will be prepended to all static asset URLs when loading /// them. - asset_base_path: Vc>, + asset_base_path: Vc>, /// Enable HMR for this chunking enable_hot_module_replacement: bool, /// The environment chunks will be evaluated in. @@ -166,7 +166,7 @@ impl BrowserChunkingContext { } /// Returns the asset base path. - pub fn chunk_base_path(&self) -> Vc> { + pub fn chunk_base_path(&self) -> Vc> { self.chunk_base_path } @@ -239,11 +239,11 @@ impl BrowserChunkingContext { #[turbo_tasks::value_impl] impl ChunkingContext for BrowserChunkingContext { #[turbo_tasks::function] - fn name(&self) -> Vc { + fn name(&self) -> Vc { if let Some(name) = &self.name { Vc::cell(name.clone()) } else { - Vc::cell("unknown".to_string()) + Vc::cell("unknown".into()) } } @@ -266,7 +266,7 @@ impl ChunkingContext for BrowserChunkingContext { async fn chunk_path( &self, ident: Vc, - extension: String, + extension: RcStr, ) -> Result> { let root_path = self.chunk_root_path; let name = ident.output_name(self.context_path, extension).await?; @@ -274,22 +274,25 @@ impl ChunkingContext for BrowserChunkingContext { } #[turbo_tasks::function] - async fn asset_url(self: Vc, ident: Vc) -> Result> { + async fn asset_url(self: Vc, ident: Vc) -> Result> { let this = self.await?; let asset_path = ident.path().await?.to_string(); let asset_path = asset_path .strip_prefix(&format!("{}/", this.client_root.await?.path)) .context("expected asset_path to contain client_root")?; - Ok(Vc::cell(format!( - "{}{}", - this.asset_base_path - .await? - .as_ref() - .map(|s| s.as_str()) - .unwrap_or("/"), - asset_path - ))) + Ok(Vc::cell( + format!( + "{}{}", + this.asset_base_path + .await? + .as_ref() + .map(|s| s.as_str()) + .unwrap_or("/"), + asset_path + ) + .into(), + )) } #[turbo_tasks::function] @@ -313,7 +316,7 @@ impl ChunkingContext for BrowserChunkingContext { #[turbo_tasks::function] async fn asset_path( &self, - content_hash: String, + content_hash: RcStr, original_asset_ident: Vc, ) -> Result> { let source_path = original_asset_ident.path().await?; @@ -329,7 +332,7 @@ impl ChunkingContext for BrowserChunkingContext { content_hash = &content_hash[..8] ), }; - Ok(self.asset_root_path.join(asset_path)) + Ok(self.asset_root_path.join(asset_path.into())) } #[turbo_tasks::function] @@ -343,7 +346,10 @@ impl ChunkingContext for BrowserChunkingContext { module: Vc>, availability_info: Value, ) -> Result> { - let span = tracing::info_span!("chunking", module = *module.ident().to_string().await?); + let span = tracing::info_span!( + "chunking", + module = module.ident().to_string().await?.to_string() + ); async move { let this = self.await?; let input_availability_info = availability_info.into_value(); @@ -367,13 +373,13 @@ impl ChunkingContext for BrowserChunkingContext { match input_availability_info { AvailabilityInfo::Root => {} AvailabilityInfo::Untracked => { - ident = ident.with_modifier(Vc::cell("untracked".to_string())); + ident = ident.with_modifier(Vc::cell("untracked".into())); } AvailabilityInfo::Complete { available_chunk_items, } => { ident = ident.with_modifier(Vc::cell( - available_chunk_items.hash().await?.to_string(), + available_chunk_items.hash().await?.to_string().into(), )); } } @@ -408,8 +414,8 @@ impl ChunkingContext for BrowserChunkingContext { availability_info: Value, ) -> Result> { let span = { - let ident = ident.to_string().await?; - tracing::info_span!("chunking", chunking_type = "evaluated", ident = *ident) + let ident = ident.to_string().await?.to_string(); + tracing::info_span!("chunking", chunking_type = "evaluated", ident = ident) }; async move { let this = self.await?; @@ -462,6 +468,17 @@ impl ChunkingContext for BrowserChunkingContext { .await } + #[turbo_tasks::function] + fn entry_chunk_group( + self: Vc, + _path: Vc, + _module: Vc>, + _evaluatable_assets: Vc, + _availability_info: Value, + ) -> Result> { + bail!("Browser chunking context does not support entry chunk groups") + } + #[turbo_tasks::function] async fn async_loader_chunk_item( self: Vc, diff --git a/crates/turbopack-browser/src/ecmascript/chunk.rs b/crates/turbopack-browser/src/ecmascript/chunk.rs index 7a1007d4600a4..7e6c651b8cbd7 100644 --- a/crates/turbopack-browser/src/ecmascript/chunk.rs +++ b/crates/turbopack-browser/src/ecmascript/chunk.rs @@ -1,6 +1,6 @@ use anyhow::Result; use indexmap::IndexSet; -use turbo_tasks::{ValueToString, Vc}; +use turbo_tasks::{RcStr, ValueToString, Vc}; use turbopack_core::{ asset::{Asset, AssetContent}, chunk::{Chunk, ChunkingContext, OutputChunk, OutputChunkRuntimeInfo}, @@ -40,8 +40,8 @@ impl EcmascriptDevChunk { #[turbo_tasks::value_impl] impl ValueToString for EcmascriptDevChunk { #[turbo_tasks::function] - async fn to_string(&self) -> Result> { - Ok(Vc::cell("Ecmascript Dev Chunk".to_string())) + async fn to_string(&self) -> Result> { + Ok(Vc::cell("Ecmascript Dev Chunk".into())) } } @@ -58,8 +58,8 @@ impl OutputChunk for EcmascriptDevChunk { } #[turbo_tasks::function] -fn modifier() -> Vc { - Vc::cell("ecmascript dev chunk".to_string()) +fn modifier() -> Vc { + Vc::cell("ecmascript dev chunk".into()) } #[turbo_tasks::value_impl] @@ -80,7 +80,7 @@ impl OutputAsset for EcmascriptDevChunk { #[turbo_tasks::function] fn ident(&self) -> Vc { let ident = self.chunk.ident().with_modifier(modifier()); - AssetIdent::from_path(self.chunking_context.chunk_path(ident, ".js".to_string())) + AssetIdent::from_path(self.chunking_context.chunk_path(ident, ".js".into())) } #[turbo_tasks::function] @@ -125,35 +125,35 @@ impl GenerateSourceMap for EcmascriptDevChunk { } #[turbo_tasks::function] - fn by_section(self: Vc, section: String) -> Vc { + fn by_section(self: Vc, section: RcStr) -> Vc { self.own_content().by_section(section) } } #[turbo_tasks::function] -fn introspectable_type() -> Vc { - Vc::cell("dev ecmascript chunk".to_string()) +fn introspectable_type() -> Vc { + Vc::cell("dev ecmascript chunk".into()) } #[turbo_tasks::function] -fn introspectable_details() -> Vc { - Vc::cell("generates a development ecmascript chunk".to_string()) +fn introspectable_details() -> Vc { + Vc::cell("generates a development ecmascript chunk".into()) } #[turbo_tasks::value_impl] impl Introspectable for EcmascriptDevChunk { #[turbo_tasks::function] - fn ty(&self) -> Vc { + fn ty(&self) -> Vc { introspectable_type() } #[turbo_tasks::function] - fn title(self: Vc) -> Vc { + fn title(self: Vc) -> Vc { self.ident().to_string() } #[turbo_tasks::function] - fn details(&self) -> Vc { + fn details(&self) -> Vc { introspectable_details() } @@ -163,7 +163,7 @@ impl Introspectable for EcmascriptDevChunk { let chunk = Vc::upcast::>(self.chunk) .resolve() .await?; - children.insert((Vc::cell("chunk".to_string()), chunk)); + children.insert((Vc::cell("chunk".into()), chunk)); Ok(Vc::cell(children)) } } diff --git a/crates/turbopack-browser/src/ecmascript/content.rs b/crates/turbopack-browser/src/ecmascript/content.rs index b3273c608a3b0..f74dad4f42fe4 100644 --- a/crates/turbopack-browser/src/ecmascript/content.rs +++ b/crates/turbopack-browser/src/ecmascript/content.rs @@ -2,7 +2,7 @@ use std::io::Write; use anyhow::{bail, Result}; use indoc::writedoc; -use turbo_tasks::Vc; +use turbo_tasks::{RcStr, Vc}; use turbo_tasks_fs::File; use turbopack_core::{ asset::AssetContent, @@ -159,7 +159,7 @@ impl GenerateSourceMap for EcmascriptDevChunkContent { } #[turbo_tasks::function] - async fn by_section(&self, section: String) -> Result> { + async fn by_section(&self, section: RcStr) -> Result> { // Weirdly, the ContentSource will have already URL decoded the ModuleId, and we // can't reparse that via serde. if let Ok(id) = ModuleId::parse(§ion) { diff --git a/crates/turbopack-browser/src/ecmascript/content_entry.rs b/crates/turbopack-browser/src/ecmascript/content_entry.rs index 6221f0263c2d5..2aa8bd4ac61a1 100644 --- a/crates/turbopack-browser/src/ecmascript/content_entry.rs +++ b/crates/turbopack-browser/src/ecmascript/content_entry.rs @@ -103,9 +103,9 @@ async fn item_code( CodeGenerationIssue { severity: IssueSeverity::Error.cell(), path: item.asset_ident().path(), - title: StyledString::Text("Code generation for chunk item errored".to_string()) + title: StyledString::Text("Code generation for chunk item errored".into()) .cell(), - message: StyledString::Text(error_message).cell(), + message: StyledString::Text(error_message.into()).cell(), } .cell() .emit(); diff --git a/crates/turbopack-browser/src/ecmascript/evaluate/chunk.rs b/crates/turbopack-browser/src/ecmascript/evaluate/chunk.rs index 46372b4f8b201..57b5bc6390f8a 100644 --- a/crates/turbopack-browser/src/ecmascript/evaluate/chunk.rs +++ b/crates/turbopack-browser/src/ecmascript/evaluate/chunk.rs @@ -3,7 +3,7 @@ use std::io::Write; use anyhow::{bail, Result}; use indoc::writedoc; use serde::Serialize; -use turbo_tasks::{ReadRef, TryJoinIterExt, Value, ValueToString, Vc}; +use turbo_tasks::{RcStr, ReadRef, TryJoinIterExt, Value, ValueToString, Vc}; use turbo_tasks_fs::File; use turbopack_core::{ asset::{Asset, AssetContent}, @@ -147,7 +147,7 @@ impl EcmascriptDevEvaluateChunk { let runtime_code = turbopack_ecmascript_runtime::get_browser_runtime_code( environment, chunking_context.chunk_base_path(), - Vc::cell(output_root.to_string()), + Vc::cell(output_root.to_string().into()), ); code.push_code(&*runtime_code.await?); } @@ -155,7 +155,7 @@ impl EcmascriptDevEvaluateChunk { let runtime_code = turbopack_ecmascript_runtime::get_browser_runtime_code( environment, chunking_context.chunk_base_path(), - Vc::cell(output_root.to_string()), + Vc::cell(output_root.to_string().into()), ); code.push_code(&*runtime_code.await?); } @@ -190,14 +190,14 @@ impl EcmascriptDevEvaluateChunk { #[turbo_tasks::value_impl] impl ValueToString for EcmascriptDevEvaluateChunk { #[turbo_tasks::function] - async fn to_string(&self) -> Result> { - Ok(Vc::cell("Ecmascript Dev Evaluate Chunk".to_string())) + async fn to_string(&self) -> Result> { + Ok(Vc::cell("Ecmascript Dev Evaluate Chunk".into())) } } #[turbo_tasks::function] -fn modifier() -> Vc { - Vc::cell("ecmascript dev evaluate chunk".to_string()) +fn modifier() -> Vc { + Vc::cell("ecmascript dev evaluate chunk".into()) } #[turbo_tasks::value_impl] @@ -221,7 +221,7 @@ impl OutputAsset for EcmascriptDevEvaluateChunk { let ident = AssetIdent::new(Value::new(ident)); Ok(AssetIdent::from_path( - self.chunking_context.chunk_path(ident, ".js".to_string()), + self.chunking_context.chunk_path(ident, ".js".into()), )) } diff --git a/crates/turbopack-browser/src/ecmascript/list/asset.rs b/crates/turbopack-browser/src/ecmascript/list/asset.rs index cae5cb3eee07e..88deb66bf9055 100644 --- a/crates/turbopack-browser/src/ecmascript/list/asset.rs +++ b/crates/turbopack-browser/src/ecmascript/list/asset.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use turbo_tasks::{Value, ValueToString, Vc}; +use turbo_tasks::{RcStr, Value, ValueToString, Vc}; use turbopack_core::{ asset::{Asset, AssetContent}, chunk::{ChunkingContext, EvaluatableAssets}, @@ -62,29 +62,29 @@ impl EcmascriptDevChunkList { #[turbo_tasks::value_impl] impl ValueToString for EcmascriptDevChunkList { #[turbo_tasks::function] - async fn to_string(&self) -> Result> { - Ok(Vc::cell("Ecmascript Dev Chunk List".to_string())) + async fn to_string(&self) -> Result> { + Ok(Vc::cell("Ecmascript Dev Chunk List".into())) } } #[turbo_tasks::function] -fn modifier() -> Vc { - Vc::cell("ecmascript dev chunk list".to_string()) +fn modifier() -> Vc { + Vc::cell("ecmascript dev chunk list".into()) } #[turbo_tasks::function] -fn dynamic_modifier() -> Vc { - Vc::cell("dynamic".to_string()) +fn dynamic_modifier() -> Vc { + Vc::cell("dynamic".into()) } #[turbo_tasks::function] -fn chunk_list_chunk_reference_description() -> Vc { - Vc::cell("chunk list chunk".to_string()) +fn chunk_list_chunk_reference_description() -> Vc { + Vc::cell("chunk list chunk".into()) } #[turbo_tasks::function] -fn chunk_key() -> Vc { - Vc::cell("chunk".to_string()) +fn chunk_key() -> Vc { + Vc::cell("chunk".into()) } #[turbo_tasks::value_impl] @@ -93,7 +93,7 @@ impl OutputAsset for EcmascriptDevChunkList { async fn ident(&self) -> Result> { let mut ident = self.ident.await?.clone_value(); for &evaluatable_asset in self.evaluatable_assets.await?.iter() { - ident.add_asset(Vc::::default(), evaluatable_asset.ident()); + ident.add_asset(Vc::::default(), evaluatable_asset.ident()); } ident.add_modifier(modifier()); @@ -111,7 +111,7 @@ impl OutputAsset for EcmascriptDevChunkList { let ident = AssetIdent::new(Value::new(ident)); Ok(AssetIdent::from_path( - self.chunking_context.chunk_path(ident, ".js".to_string()), + self.chunking_context.chunk_path(ident, ".js".into()), )) } diff --git a/crates/turbopack-browser/src/ecmascript/list/version.rs b/crates/turbopack-browser/src/ecmascript/list/version.rs index d13458fad92a7..7dd142e36609c 100644 --- a/crates/turbopack-browser/src/ecmascript/list/version.rs +++ b/crates/turbopack-browser/src/ecmascript/list/version.rs @@ -1,6 +1,6 @@ use anyhow::Result; use indexmap::IndexMap; -use turbo_tasks::{TraitRef, TryJoinIterExt, Vc}; +use turbo_tasks::{RcStr, TraitRef, TryJoinIterExt, Vc}; use turbo_tasks_hash::{encode_hex, Xxh3Hash64Hasher}; use turbopack_core::version::{Version, VersionedContentMerger}; @@ -22,7 +22,7 @@ pub(super) struct EcmascriptDevChunkListVersion { #[turbo_tasks::value_impl] impl Version for EcmascriptDevChunkListVersion { #[turbo_tasks::function] - async fn id(&self) -> Result> { + async fn id(&self) -> Result> { let by_path = { let mut by_path = self .by_path @@ -60,6 +60,6 @@ impl Version for EcmascriptDevChunkListVersion { } let hash = hasher.finish(); let hex_hash = encode_hex(hash); - Ok(Vc::cell(hex_hash)) + Ok(Vc::cell(hex_hash.into())) } } diff --git a/crates/turbopack-browser/src/ecmascript/merged/version.rs b/crates/turbopack-browser/src/ecmascript/merged/version.rs index a20bfc27e0d3f..dd55cf5216b0f 100644 --- a/crates/turbopack-browser/src/ecmascript/merged/version.rs +++ b/crates/turbopack-browser/src/ecmascript/merged/version.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use turbo_tasks::{ReadRef, TryJoinIterExt, Vc}; +use turbo_tasks::{RcStr, ReadRef, TryJoinIterExt, Vc}; use turbo_tasks_hash::{encode_hex, Xxh3Hash64Hasher}; use turbopack_core::version::Version; @@ -16,7 +16,7 @@ pub(super) struct EcmascriptDevMergedChunkVersion { #[turbo_tasks::value_impl] impl Version for EcmascriptDevMergedChunkVersion { #[turbo_tasks::function] - async fn id(&self) -> Result> { + async fn id(&self) -> Result> { let mut hasher = Xxh3Hash64Hasher::new(); hasher.write_value(self.versions.len()); let sorted_ids = { @@ -34,6 +34,6 @@ impl Version for EcmascriptDevMergedChunkVersion { } let hash = hasher.finish(); let hex_hash = encode_hex(hash); - Ok(Vc::cell(hex_hash)) + Ok(Vc::cell(hex_hash.into())) } } diff --git a/crates/turbopack-browser/src/ecmascript/runtime.rs b/crates/turbopack-browser/src/ecmascript/runtime.rs index c306b2cc043a7..68b103bed10c9 100644 --- a/crates/turbopack-browser/src/ecmascript/runtime.rs +++ b/crates/turbopack-browser/src/ecmascript/runtime.rs @@ -6,8 +6,8 @@ use turbopack_core::{ ident::AssetIdent, }; use turbopack_ecmascript::chunk::{ - EcmascriptChunk, EcmascriptChunkPlaceables, EcmascriptChunkRuntime, - EcmascriptChunkRuntimeContent, ChunkingContext, + ChunkingContext, EcmascriptChunk, EcmascriptChunkPlaceables, EcmascriptChunkRuntime, + EcmascriptChunkRuntimeContent, }; use crate::ecmascript::content::EcmascriptDevChunkContent; @@ -46,13 +46,13 @@ impl EcmascriptDevChunkRuntime { #[turbo_tasks::value_impl] impl ValueToString for EcmascriptDevChunkRuntime { #[turbo_tasks::function] - async fn to_string(&self) -> Result> { + async fn to_string(&self) -> Result> { Ok(Vc::cell("Ecmascript Dev Runtime".to_string())) } } #[turbo_tasks::function] -fn modifier() -> Vc { +fn modifier() -> Vc { Vc::cell("ecmascript dev chunk".to_string()) } diff --git a/crates/turbopack-browser/src/ecmascript/version.rs b/crates/turbopack-browser/src/ecmascript/version.rs index f6ec41f44e6ad..a666b3f11bca4 100644 --- a/crates/turbopack-browser/src/ecmascript/version.rs +++ b/crates/turbopack-browser/src/ecmascript/version.rs @@ -1,6 +1,6 @@ use anyhow::{bail, Result}; use indexmap::IndexMap; -use turbo_tasks::{ReadRef, Vc}; +use turbo_tasks::{RcStr, ReadRef, Vc}; use turbo_tasks_fs::FileSystemPath; use turbo_tasks_hash::{encode_hex, Xxh3Hash64Hasher}; use turbopack_core::{chunk::ModuleId, version::Version}; @@ -48,7 +48,7 @@ impl EcmascriptDevChunkVersion { #[turbo_tasks::value_impl] impl Version for EcmascriptDevChunkVersion { #[turbo_tasks::function] - fn id(&self) -> Vc { + fn id(&self) -> Vc { let mut hasher = Xxh3Hash64Hasher::new(); hasher.write_ref(&self.chunk_path); let sorted_hashes = { @@ -61,6 +61,6 @@ impl Version for EcmascriptDevChunkVersion { } let hash = hasher.finish(); let hex_hash = encode_hex(hash); - Vc::cell(hex_hash) + Vc::cell(hex_hash.into()) } } diff --git a/crates/turbopack-browser/src/react_refresh.rs b/crates/turbopack-browser/src/react_refresh.rs index 54e2a64e4e9b0..359a7703fc7fe 100644 --- a/crates/turbopack-browser/src/react_refresh.rs +++ b/crates/turbopack-browser/src/react_refresh.rs @@ -12,12 +12,12 @@ use turbopack_resolve::{ #[turbo_tasks::function] fn react_refresh_request() -> Vc { - Request::parse_string("@next/react-refresh-utils/dist/runtime".to_string()) + Request::parse_string("@next/react-refresh-utils/dist/runtime".into()) } #[turbo_tasks::function] fn react_refresh_request_in_next() -> Vc { - Request::parse_string("next/dist/compiled/@next/react-refresh-utils/dist/runtime".to_string()) + Request::parse_string("next/dist/compiled/@next/react-refresh-utils/dist/runtime".into()) } #[turbo_tasks::value] @@ -84,7 +84,7 @@ impl Issue for ReactRefreshResolvingIssue { #[turbo_tasks::function] fn title(&self) -> Vc { - StyledString::Text("Could not resolve React Refresh runtime".to_string()).cell() + StyledString::Text("Could not resolve React Refresh runtime".into()).cell() } #[turbo_tasks::function] @@ -102,13 +102,12 @@ impl Issue for ReactRefreshResolvingIssue { Vc::cell(Some( StyledString::Line(vec![ StyledString::Text( - "React Refresh will be disabled.\nTo enable React Refresh, install the " - .to_string(), + "React Refresh will be disabled.\nTo enable React Refresh, install the ".into(), ), - StyledString::Code("react-refresh".to_string()), - StyledString::Text(" and ".to_string()), - StyledString::Code("@next/react-refresh-utils".to_string()), - StyledString::Text(" modules.".to_string()), + StyledString::Code("react-refresh".into()), + StyledString::Text(" and ".into()), + StyledString::Code("@next/react-refresh-utils".into()), + StyledString::Text(" modules.".into()), ]) .cell(), )) diff --git a/crates/turbopack-cli-utils/src/issue.rs b/crates/turbopack-cli-utils/src/issue.rs index 034b5956a4904..fd73e10ff7e0b 100644 --- a/crates/turbopack-cli-utils/src/issue.rs +++ b/crates/turbopack-cli-utils/src/issue.rs @@ -39,14 +39,14 @@ impl<'de> serde::Deserialize<'de> for IssueSeverityCliOption { impl clap::ValueEnum for IssueSeverityCliOption { fn value_variants<'a>() -> &'a [Self] { const VARIANTS: [IssueSeverityCliOption; 8] = [ - Self(IssueSeverity::Bug), - Self(IssueSeverity::Fatal), - Self(IssueSeverity::Error), - Self(IssueSeverity::Warning), - Self(IssueSeverity::Hint), - Self(IssueSeverity::Note), - Self(IssueSeverity::Suggestion), - Self(IssueSeverity::Info), + IssueSeverityCliOption(IssueSeverity::Bug), + IssueSeverityCliOption(IssueSeverity::Fatal), + IssueSeverityCliOption(IssueSeverity::Error), + IssueSeverityCliOption(IssueSeverity::Warning), + IssueSeverityCliOption(IssueSeverity::Hint), + IssueSeverityCliOption(IssueSeverity::Note), + IssueSeverityCliOption(IssueSeverity::Suggestion), + IssueSeverityCliOption(IssueSeverity::Info), ]; &VARIANTS } @@ -218,14 +218,14 @@ pub struct LogOptions { /// graph, there are a few possibilities: /// /// 1. An issue from this pull is brand new to all sources, in which case it -/// will be logged and the issue's count is inremented. +/// will be logged and the issue's count is inremented. /// 2. An issue from this pull is brand new to this source but another source -/// has already pulled it, in which case it will be logged and the issue's count -/// is incremented. +/// has already pulled it, in which case it will be logged and the issue's +/// count is incremented. /// 3. The previous pull from this source had already seen the issue, in which -/// case the issue will be skipped and the issue's count remains constant. -/// 4. An issue seen in a previous pull was not repulled, and the issue's -/// count is decremented. +/// case the issue will be skipped and the issue's count remains constant. +/// 4. An issue seen in a previous pull was not repulled, and the issue's count +/// is decremented. /// /// Once an issue's count reaches zero, it's removed. If it is ever seen again, /// it is considered new and will be relogged. diff --git a/crates/turbopack-cli-utils/src/runtime_entry.rs b/crates/turbopack-cli-utils/src/runtime_entry.rs index d1690d1560f2a..8d20decbdb90b 100644 --- a/crates/turbopack-cli-utils/src/runtime_entry.rs +++ b/crates/turbopack-cli-utils/src/runtime_entry.rs @@ -39,6 +39,8 @@ impl RuntimeEntry { None, IssueSeverity::Error.cell(), ) + .resolve() + .await? .primary_modules() .await?; diff --git a/crates/turbopack-cli/src/build/mod.rs b/crates/turbopack-cli/src/build/mod.rs index ff5ee97fa7bd5..ea28d84326762 100644 --- a/crates/turbopack-cli/src/build/mod.rs +++ b/crates/turbopack-cli/src/build/mod.rs @@ -6,7 +6,7 @@ use std::{ }; use anyhow::{bail, Context, Result}; -use turbo_tasks::{TransientInstance, TryJoinIterExt, TurboTasks, Value, Vc}; +use turbo_tasks::{RcStr, TransientInstance, TryJoinIterExt, TurboTasks, Value, Vc}; use turbo_tasks_fs::FileSystem; use turbo_tasks_memory::MemoryBackend; use turbopack::ecmascript::EcmascriptModuleAsset; @@ -14,7 +14,7 @@ use turbopack_cli_utils::issue::{ConsoleUi, LogOptions}; use turbopack_core::{ asset::Asset, chunk::{ - availability_info::AvailabilityInfo, ChunkableModule, ChunkingContextExt, + availability_info::AvailabilityInfo, ChunkableModule, ChunkingContext, ChunkingContextExt, EvaluatableAssets, MinifyType, }, environment::{BrowserEnvironment, Environment, ExecutionEnvironment}, @@ -49,10 +49,10 @@ pub fn register() { pub struct TurbopackBuildBuilder { turbo_tasks: Arc>, - project_dir: String, - root_dir: String, + project_dir: RcStr, + root_dir: RcStr, entry_requests: Vec, - browserslist_query: String, + browserslist_query: RcStr, log_level: IssueSeverity, show_all: bool, log_detail: bool, @@ -62,15 +62,15 @@ pub struct TurbopackBuildBuilder { impl TurbopackBuildBuilder { pub fn new( turbo_tasks: Arc>, - project_dir: String, - root_dir: String, + project_dir: RcStr, + root_dir: RcStr, ) -> Self { TurbopackBuildBuilder { turbo_tasks, project_dir, root_dir, entry_requests: vec![], - browserslist_query: "chrome 64, edge 79, firefox 67, opera 51, safari 12".to_owned(), + browserslist_query: "chrome 64, edge 79, firefox 67, opera 51, safari 12".into(), log_level: IssueSeverity::Warning, show_all: false, log_detail: false, @@ -83,7 +83,7 @@ impl TurbopackBuildBuilder { self } - pub fn browserslist_query(mut self, browserslist_query: String) -> Self { + pub fn browserslist_query(mut self, browserslist_query: RcStr) -> Self { self.browserslist_query = browserslist_query; self } @@ -157,10 +157,10 @@ impl TurbopackBuildBuilder { #[turbo_tasks::function] async fn build_internal( - project_dir: String, - root_dir: String, + project_dir: RcStr, + root_dir: RcStr, entry_requests: Vc, - browserslist_query: String, + browserslist_query: RcStr, minify_type: MinifyType, ) -> Result> { let env = Environment::new(Value::new(ExecutionEnvironment::Browser( @@ -174,13 +174,14 @@ async fn build_internal( ))); let output_fs = output_fs(project_dir.clone()); let project_fs = project_fs(root_dir.clone()); - let project_relative = project_dir.strip_prefix(&root_dir).unwrap(); - let project_relative = project_relative + let project_relative = project_dir.strip_prefix(&*root_dir).unwrap(); + let project_relative: RcStr = project_relative .strip_prefix(MAIN_SEPARATOR) .unwrap_or(project_relative) - .replace(MAIN_SEPARATOR, "/"); + .replace(MAIN_SEPARATOR, "/") + .into(); let project_path = project_fs.root().join(project_relative); - let build_output_root = output_fs.root().join("dist".to_string()); + let build_output_root = output_fs.root().join("dist".into()); let node_env = NodeEnv::Production.cell(); @@ -231,7 +232,7 @@ async fn build_internal( .await?) .to_vec(); - let origin = PlainResolveOrigin::new(asset_context, output_fs.root().join("_".to_string())); + let origin = PlainResolveOrigin::new(asset_context, output_fs.root().join("_".into())); let project_dir = &project_dir; let entries = entry_requests .into_iter() @@ -274,9 +275,9 @@ async fn build_internal( .await? .as_deref() .unwrap() - .to_string(), + .into(), ) - .with_extension("entry.js".to_string()), + .with_extension("entry.js".into()), Vc::upcast(ecmascript), EvaluatableAssets::one(Vc::upcast(ecmascript)), Value::new(AvailabilityInfo::Root), diff --git a/crates/turbopack-cli/src/contexts.rs b/crates/turbopack-cli/src/contexts.rs index 8b20656471dbb..9b439048978e7 100644 --- a/crates/turbopack-cli/src/contexts.rs +++ b/crates/turbopack-cli/src/contexts.rs @@ -1,7 +1,7 @@ use std::{collections::HashMap, fmt}; use anyhow::Result; -use turbo_tasks::{Value, Vc}; +use turbo_tasks::{RcStr, Value, Vc}; use turbo_tasks_fs::{FileSystem, FileSystemPath}; use turbopack::{ ecmascript::{EcmascriptInputTransform, TreeShakingMode}, @@ -61,7 +61,7 @@ pub async fn get_client_import_map(project_path: Vc) -> Result Vc { #[turbo_tasks::function] pub async fn get_client_compile_time_info( - browserslist_query: String, + browserslist_query: RcStr, node_env: Vc, ) -> Result> { Ok( diff --git a/crates/turbopack-cli/src/dev/mod.rs b/crates/turbopack-cli/src/dev/mod.rs index 17695ec11651f..2cae47fb83c52 100644 --- a/crates/turbopack-cli/src/dev/mod.rs +++ b/crates/turbopack-cli/src/dev/mod.rs @@ -13,13 +13,12 @@ use anyhow::{Context, Result}; use owo_colors::OwoColorize; use turbo_tasks::{ util::{FormatBytes, FormatDuration}, - TransientInstance, TurboTasks, UpdateInfo, Value, Vc, + RcStr, TransientInstance, TurboTasks, UpdateInfo, Value, Vc, }; use turbo_tasks_fs::FileSystem; use turbo_tasks_malloc::TurboMalloc; use turbo_tasks_memory::MemoryBackend; use turbopack::evaluate_context::node_build_environment; -use turbopack_browser::BrowserChunkingContext; use turbopack_cli_utils::issue::{ConsoleUi, LogOptions}; use turbopack_core::{ issue::{IssueReporter, IssueSeverity}, @@ -37,6 +36,7 @@ use turbopack_dev_server::{ use turbopack_ecmascript_runtime::RuntimeType; use turbopack_env::dotenv::load_env; use turbopack_node::execution_context::ExecutionContext; +use turbopack_nodejs::NodeJsChunkingContext; use self::web_entry_source::create_web_entry_source; use crate::{ @@ -51,14 +51,14 @@ pub(crate) mod web_entry_source; pub struct TurbopackDevServerBuilder { turbo_tasks: Arc>, - project_dir: String, - root_dir: String, + project_dir: RcStr, + root_dir: RcStr, entry_requests: Vec, eager_compile: bool, hostname: Option, issue_reporter: Option>, port: Option, - browserslist_query: String, + browserslist_query: RcStr, log_level: IssueSeverity, show_all: bool, log_detail: bool, @@ -68,8 +68,8 @@ pub struct TurbopackDevServerBuilder { impl TurbopackDevServerBuilder { pub fn new( turbo_tasks: Arc>, - project_dir: String, - root_dir: String, + project_dir: RcStr, + root_dir: RcStr, ) -> TurbopackDevServerBuilder { TurbopackDevServerBuilder { turbo_tasks, @@ -82,7 +82,7 @@ impl TurbopackDevServerBuilder { port: None, browserslist_query: "last 1 Chrome versions, last 1 Firefox versions, last 1 Safari \ versions, last 1 Edge versions" - .to_owned(), + .into(), log_level: IssueSeverity::Warning, show_all: false, log_detail: false, @@ -110,7 +110,7 @@ impl TurbopackDevServerBuilder { self } - pub fn browserslist_query(mut self, browserslist_query: String) -> TurbopackDevServerBuilder { + pub fn browserslist_query(mut self, browserslist_query: RcStr) -> TurbopackDevServerBuilder { self.browserslist_query = browserslist_query; self } @@ -190,12 +190,12 @@ impl TurbopackDevServerBuilder { let server = self.find_port(host, port, 10)?; let turbo_tasks = self.turbo_tasks; - let project_dir = self.project_dir; - let root_dir = self.root_dir; + let project_dir: RcStr = self.project_dir; + let root_dir: RcStr = self.root_dir; let eager_compile = self.eager_compile; let show_all = self.show_all; - let log_detail = self.log_detail; - let browserslist_query = self.browserslist_query; + let log_detail: bool = self.log_detail; + let browserslist_query: RcStr = self.browserslist_query; let log_args = Arc::new(LogOptions { current_dir: current_dir().unwrap(), project_dir: PathBuf::from(project_dir.clone()), @@ -227,31 +227,32 @@ impl TurbopackDevServerBuilder { #[turbo_tasks::function] async fn source( - root_dir: String, - project_dir: String, + root_dir: RcStr, + project_dir: RcStr, entry_requests: TransientInstance>, eager_compile: bool, - browserslist_query: String, + browserslist_query: RcStr, ) -> Result>> { - let project_relative = project_dir.strip_prefix(&root_dir).unwrap(); - let project_relative = project_relative + let project_relative = project_dir.strip_prefix(&*root_dir).unwrap(); + let project_relative: RcStr = project_relative .strip_prefix(MAIN_SEPARATOR) .unwrap_or(project_relative) - .replace(MAIN_SEPARATOR, "/"); + .replace(MAIN_SEPARATOR, "/") + .into(); let output_fs = output_fs(project_dir); let fs = project_fs(root_dir); let project_path: Vc = fs.root().join(project_relative); let env = load_env(project_path); - let build_output_root = output_fs.root().join(".turbopack/build".to_string()); + let build_output_root = output_fs.root().join(".turbopack/build".into()); - let build_chunking_context = BrowserChunkingContext::builder( + let build_chunking_context = NodeJsChunkingContext::builder( project_path, build_output_root, build_output_root, - build_output_root.join("chunks".to_string()), - build_output_root.join("assets".to_string()), + build_output_root.join("chunks".into()), + build_output_root.join("assets".into()), node_build_environment(), RuntimeType::Development, ) @@ -291,8 +292,8 @@ async fn source( browserslist_query, ); let static_source = Vc::upcast(StaticAssetsContentSource::new( - String::new(), - project_path.join("public".to_string()), + Default::default(), + project_path.join("public".into()), )); let main_source = CombinedContentSource::new(vec![static_source, web_source]); let introspect = Vc::upcast( @@ -304,7 +305,7 @@ async fn source( let main_source = Vc::upcast(main_source); let source = Vc::upcast(PrefixedRouterContentSource::new( Default::default(), - vec![("__turbopack__".to_string(), introspect)], + vec![("__turbopack__".into(), introspect)], main_source, )); diff --git a/crates/turbopack-cli/src/dev/web_entry_source.rs b/crates/turbopack-cli/src/dev/web_entry_source.rs index 73a752d5cffed..70029791c00c6 100644 --- a/crates/turbopack-cli/src/dev/web_entry_source.rs +++ b/crates/turbopack-cli/src/dev/web_entry_source.rs @@ -1,5 +1,5 @@ use anyhow::{anyhow, Result}; -use turbo_tasks::{TryJoinIterExt, Value, Vc}; +use turbo_tasks::{RcStr, TryJoinIterExt, Value, Vc}; use turbo_tasks_env::ProcessEnv; use turbo_tasks_fs::FileSystemPath; use turbopack::ecmascript::EcmascriptModuleAsset; @@ -41,8 +41,8 @@ pub fn get_client_chunking_context( project_path, server_root, server_root, - server_root.join("/_chunks".to_string()), - server_root.join("/_assets".to_string()), + server_root.join("/_chunks".into()), + server_root.join("/_assets".into()), environment, RuntimeType::Development, ) @@ -67,13 +67,12 @@ pub async fn get_client_runtime_entries( // because the bootstrap contains JSX which requires Refresh's global // functions to be available. if let Some(request) = enable_react_refresh { - runtime_entries - .push(RuntimeEntry::Request(request, project_path.join("_".to_string())).cell()) + runtime_entries.push(RuntimeEntry::Request(request, project_path.join("_".into())).cell()) }; runtime_entries.push( RuntimeEntry::Source(Vc::upcast(FileSource::new(embed_file_path( - "entry/bootstrap.ts".to_string(), + "entry/bootstrap.ts".into(), )))) .cell(), ); @@ -90,7 +89,7 @@ pub async fn create_web_entry_source( _env: Vc>, eager_compile: bool, node_env: Vc, - browserslist_query: String, + browserslist_query: RcStr, ) -> Result>> { let compile_time_info = get_client_compile_time_info(browserslist_query, node_env); let asset_context = @@ -101,13 +100,15 @@ pub async fn create_web_entry_source( let runtime_entries = entries.resolve_entries(asset_context); - let origin = PlainResolveOrigin::new(asset_context, project_path.join("_".to_string())); + let origin = PlainResolveOrigin::new(asset_context, project_path.join("_".into())); let entries = entry_requests .into_iter() .map(|request| async move { let ty = Value::new(ReferenceType::Entry(EntryReferenceSubType::Web)); Ok(origin .resolve_asset(request, origin.resolve_options(ty.clone()), ty) + .resolve() + .await? .primary_modules() .await? .first() @@ -146,7 +147,7 @@ pub async fn create_web_entry_source( .await?; let entry_asset = Vc::upcast(DevHtmlAsset::new( - server_root.join("index.html".to_string()), + server_root.join("index.html".into()), entries, )); diff --git a/crates/turbopack-cli/src/embed_js.rs b/crates/turbopack-cli/src/embed_js.rs index 793fe320013ae..676341316d70b 100644 --- a/crates/turbopack-cli/src/embed_js.rs +++ b/crates/turbopack-cli/src/embed_js.rs @@ -1,4 +1,4 @@ -use turbo_tasks::Vc; +use turbo_tasks::{RcStr, Vc}; use turbo_tasks_fs::{embed_directory, FileContent, FileSystem, FileSystemPath}; #[turbo_tasks::function] @@ -7,11 +7,11 @@ fn embed_fs() -> Vc> { } #[turbo_tasks::function] -pub(crate) fn embed_file(path: String) -> Vc { +pub(crate) fn embed_file(path: RcStr) -> Vc { embed_fs().root().join(path).read() } #[turbo_tasks::function] -pub(crate) fn embed_file_path(path: String) -> Vc { +pub(crate) fn embed_file_path(path: RcStr) -> Vc { embed_fs().root().join(path) } diff --git a/crates/turbopack-cli/src/util.rs b/crates/turbopack-cli/src/util.rs index 1c230e22d5be0..7ab0ee363a795 100644 --- a/crates/turbopack-cli/src/util.rs +++ b/crates/turbopack-cli/src/util.rs @@ -2,7 +2,7 @@ use std::{env::current_dir, path::PathBuf}; use anyhow::{Context, Result}; use dunce::canonicalize; -use turbo_tasks::Vc; +use turbo_tasks::{RcStr, Vc}; use turbo_tasks_fs::{DiskFileSystem, FileSystem}; #[turbo_tasks::value(transparent)] @@ -11,15 +11,15 @@ pub struct EntryRequests(pub Vec>); #[turbo_tasks::value(shared)] #[derive(Clone)] pub enum EntryRequest { - Relative(String), - Module(String, String), + Relative(RcStr), + Module(RcStr, RcStr), } pub struct NormalizedDirs { /// Normalized project directory path as an absolute path - pub project_dir: String, + pub project_dir: RcStr, /// Normalized root directory path as an absolute path - pub root_dir: String, + pub root_dir: RcStr, } /// Normalizes (canonicalizes and represents as an absolute path in a String) @@ -28,21 +28,21 @@ pub fn normalize_dirs( project_dir: &Option, root_dir: &Option, ) -> Result { - let project_dir = project_dir + let project_dir: RcStr = project_dir .as_ref() .map(canonicalize) .unwrap_or_else(current_dir) .context("project directory can't be found")? .to_str() .context("project directory contains invalid characters")? - .to_string(); + .into(); let root_dir = match root_dir.as_ref() { Some(root) => canonicalize(root) .context("root directory can't be found")? .to_str() .context("root directory contains invalid characters")? - .to_string(), + .into(), None => project_dir.clone(), }; @@ -52,23 +52,23 @@ pub fn normalize_dirs( }) } -pub fn normalize_entries(entries: &Option>) -> Vec { +pub fn normalize_entries(entries: &Option>) -> Vec { entries .as_ref() - .cloned() - .unwrap_or_else(|| vec!["src/entry".to_owned()]) + .map(|v| v.iter().map(|v| RcStr::from(&**v)).collect()) + .unwrap_or_else(|| vec!["src/entry".into()]) } #[turbo_tasks::function] -pub async fn project_fs(project_dir: String) -> Result>> { - let disk_fs = DiskFileSystem::new("project".to_string(), project_dir.to_string(), vec![]); +pub async fn project_fs(project_dir: RcStr) -> Result>> { + let disk_fs = DiskFileSystem::new("project".into(), project_dir, vec![]); disk_fs.await?.start_watching()?; Ok(Vc::upcast(disk_fs)) } #[turbo_tasks::function] -pub async fn output_fs(project_dir: String) -> Result>> { - let disk_fs = DiskFileSystem::new("output".to_string(), project_dir.to_string(), vec![]); +pub async fn output_fs(project_dir: RcStr) -> Result>> { + let disk_fs = DiskFileSystem::new("output".into(), project_dir, vec![]); disk_fs.await?.start_watching()?; Ok(Vc::upcast(disk_fs)) } diff --git a/crates/turbopack-core/src/asset.rs b/crates/turbopack-core/src/asset.rs index 9d1873b42afd6..dddcb3b674653 100644 --- a/crates/turbopack-core/src/asset.rs +++ b/crates/turbopack-core/src/asset.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use turbo_tasks::{Completion, Vc}; +use turbo_tasks::{Completion, RcStr, Vc}; use turbo_tasks_fs::{ FileContent, FileJsonContent, FileLinesContent, FileSystemPath, LinkContent, LinkType, }; @@ -25,7 +25,7 @@ pub enum AssetContent { // for the relative link, the target is raw value read from the link // for the absolute link, the target is stripped of the root path while reading // See [LinkContent::Link] for more details. - Redirect { target: String, link_type: LinkType }, + Redirect { target: RcStr, link_type: LinkType }, } #[turbo_tasks::value_impl] diff --git a/crates/turbopack-core/src/chunk/chunk_group.rs b/crates/turbopack-core/src/chunk/chunk_group.rs index 6a39862e1a82d..b2b3f5dec36dc 100644 --- a/crates/turbopack-core/src/chunk/chunk_group.rs +++ b/crates/turbopack-core/src/chunk/chunk_group.rs @@ -143,7 +143,7 @@ pub async fn make_chunk_group( let mut chunks = make_chunks( chunking_context, Vc::cell(chunk_items.into_iter().collect()), - "".to_string(), + "".into(), references_to_output_assets(external_module_references).await?, ) .await? @@ -156,7 +156,7 @@ pub async fn make_chunk_group( let async_loader_chunks = make_chunks( chunking_context, Vc::cell(async_loader_chunk_items.into_iter().collect()), - "async-loader-".to_string(), + "async-loader-".into(), references_to_output_assets(async_loader_external_module_references).await?, ) .await?; diff --git a/crates/turbopack-core/src/chunk/chunking.rs b/crates/turbopack-core/src/chunk/chunking.rs index d43acf36a35c9..bfdb09e339406 100644 --- a/crates/turbopack-core/src/chunk/chunking.rs +++ b/crates/turbopack-core/src/chunk/chunking.rs @@ -10,7 +10,7 @@ use indexmap::IndexMap; use once_cell::sync::Lazy; use regex::Regex; use tracing::Level; -use turbo_tasks::{ReadRef, TryJoinIterExt, ValueToString, Vc}; +use turbo_tasks::{RcStr, ReadRef, TryJoinIterExt, ValueToString, Vc}; use super::{ AsyncModuleInfo, Chunk, ChunkItem, ChunkItemsWithAsyncModuleInfo, ChunkType, ChunkingContext, @@ -21,7 +21,7 @@ use crate::output::OutputAssets; #[turbo_tasks::value] struct ChunkItemInfo { ty: Vc>, - name: Vc, + name: Vc, size: usize, } @@ -48,7 +48,7 @@ async fn chunk_item_info( pub async fn make_chunks( chunking_context: Vc>, chunk_items: Vc, - key_prefix: String, + key_prefix: RcStr, mut referenced_output_assets: Vc, ) -> Result> { let chunk_items = chunk_items @@ -107,7 +107,7 @@ type ChunkItemWithInfo = ( Vc>, Option>, usize, - ReadRef, + ReadRef, ); struct SplitContext<'a> { diff --git a/crates/turbopack-core/src/chunk/chunking_context.rs b/crates/turbopack-core/src/chunk/chunking_context.rs index 132995a7a8a4b..027fad30732cb 100644 --- a/crates/turbopack-core/src/chunk/chunking_context.rs +++ b/crates/turbopack-core/src/chunk/chunking_context.rs @@ -1,6 +1,6 @@ use anyhow::Result; use serde::{Deserialize, Serialize}; -use turbo_tasks::{trace::TraceRawVcs, TaskInput, Upcast, Value, ValueToString, Vc}; +use turbo_tasks::{trace::TraceRawVcs, RcStr, TaskInput, Upcast, Value, ValueToString, Vc}; use turbo_tasks_fs::FileSystemPath; use turbo_tasks_hash::DeterministicHash; @@ -9,6 +9,7 @@ use crate::{ chunk::{ChunkItem, ModuleId}, environment::Environment, ident::AssetIdent, + module::Module, output::{OutputAsset, OutputAssets}, }; @@ -40,10 +41,16 @@ pub struct ChunkGroupResult { pub availability_info: AvailabilityInfo, } +#[turbo_tasks::value(shared)] +pub struct EntryChunkGroupResult { + pub asset: Vc>, + pub availability_info: AvailabilityInfo, +} + /// A context for the chunking that influences the way chunks are created #[turbo_tasks::value_trait] pub trait ChunkingContext { - fn name(self: Vc) -> Vc; + fn name(self: Vc) -> Vc; fn context_path(self: Vc) -> Vc; fn output_root(self: Vc) -> Vc; @@ -55,7 +62,7 @@ pub trait ChunkingContext { // discretion of chunking context implementors. However, we currently use this // in a couple of places in `turbopack-css`, so we need to remove that // dependency first. - fn chunk_path(self: Vc, ident: Vc, extension: String) -> Vc; + fn chunk_path(self: Vc, ident: Vc, extension: RcStr) -> Vc; // TODO(alexkirsz) Remove this from the chunking context. /// Reference Source Map Assets for chunks @@ -63,11 +70,11 @@ pub trait ChunkingContext { /// Returns a URL (relative or absolute, depending on the asset prefix) to /// the static asset based on its `ident`. - fn asset_url(self: Vc, ident: Vc) -> Result>; + fn asset_url(self: Vc, ident: Vc) -> Result>; fn asset_path( self: Vc, - content_hash: String, + content_hash: RcStr, original_asset_ident: Vc, ) -> Vc; @@ -95,6 +102,18 @@ pub trait ChunkingContext { availability_info: Value, ) -> Vc; + /// Generates an output chunk that: + /// * evaluates the given assets; and + /// * exports the result of evaluating the given module as a CommonJS + /// default export. + fn entry_chunk_group( + self: Vc, + path: Vc, + module: Vc>, + evaluatable_assets: Vc, + availability_info: Value, + ) -> Result>; + async fn chunk_item_id_from_ident( self: Vc, ident: Vc, @@ -131,6 +150,34 @@ pub trait ChunkingContextExt { where Self: Send; + fn entry_chunk_group_asset( + self: Vc, + path: Vc, + module: Vc>, + evaluatable_assets: Vc, + availability_info: Value, + ) -> Vc> + where + Self: Send; + + fn root_entry_chunk_group( + self: Vc, + path: Vc, + module: Vc>, + evaluatable_assets: Vc, + ) -> Vc + where + Self: Send; + + fn root_entry_chunk_group_asset( + self: Vc, + path: Vc, + module: Vc>, + evaluatable_assets: Vc, + ) -> Vc> + where + Self: Send; + fn chunk_group_assets( self: Vc, module: Vc>, @@ -169,6 +216,51 @@ impl>> ChunkingConte ) } + fn entry_chunk_group_asset( + self: Vc, + path: Vc, + module: Vc>, + evaluatable_assets: Vc, + availability_info: Value, + ) -> Vc> { + entry_chunk_group_asset( + path, + Vc::upcast(self), + module, + evaluatable_assets, + availability_info, + ) + } + + fn root_entry_chunk_group( + self: Vc, + path: Vc, + module: Vc>, + evaluatable_assets: Vc, + ) -> Vc { + self.entry_chunk_group( + path, + module, + evaluatable_assets, + Value::new(AvailabilityInfo::Root), + ) + } + + fn root_entry_chunk_group_asset( + self: Vc, + path: Vc, + module: Vc>, + evaluatable_assets: Vc, + ) -> Vc> { + entry_chunk_group_asset( + path, + Vc::upcast(self), + module, + evaluatable_assets, + Value::new(AvailabilityInfo::Root), + ) + } + fn chunk_group_assets( self: Vc, module: Vc>, @@ -199,6 +291,20 @@ async fn evaluated_chunk_group_assets( .assets) } +#[turbo_tasks::function] +async fn entry_chunk_group_asset( + path: Vc, + chunking_context: Vc>, + module: Vc>, + evaluatable_assets: Vc, + availability_info: Value, +) -> Result>> { + Ok(chunking_context + .entry_chunk_group(path, module, evaluatable_assets, availability_info) + .await? + .asset) +} + #[turbo_tasks::function] async fn chunk_group_assets( chunking_context: Vc>, diff --git a/crates/turbopack-core/src/chunk/data.rs b/crates/turbopack-core/src/chunk/data.rs index 9dd8de750578a..900ebd9edff5c 100644 --- a/crates/turbopack-core/src/chunk/data.rs +++ b/crates/turbopack-core/src/chunk/data.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use turbo_tasks::{ReadRef, TryJoinIterExt, Vc}; +use turbo_tasks::{RcStr, ReadRef, TryJoinIterExt, Vc}; use turbo_tasks_fs::FileSystemPath; use crate::{ @@ -27,8 +27,8 @@ pub struct ChunkDataOption(Option>); pub struct ChunksData(Vec>); #[turbo_tasks::function] -fn module_chunk_reference_description() -> Vc { - Vc::cell("module chunk".to_string()) +fn module_chunk_reference_description() -> Vc { + Vc::cell("module chunk".into()) } #[turbo_tasks::value_impl] diff --git a/crates/turbopack-core/src/chunk/mod.rs b/crates/turbopack-core/src/chunk/mod.rs index 7c68e1cdd469c..ffdffc6ce8d17 100644 --- a/crates/turbopack-core/src/chunk/mod.rs +++ b/crates/turbopack-core/src/chunk/mod.rs @@ -24,14 +24,16 @@ use turbo_tasks::{ debug::ValueDebugFormat, graph::{AdjacencyMap, GraphTraversal, GraphTraversalResult, Visit, VisitControlFlow}, trace::TraceRawVcs, - ReadRef, TaskInput, TryFlatJoinIterExt, TryJoinIterExt, Upcast, ValueToString, Vc, + RcStr, ReadRef, TaskInput, TryFlatJoinIterExt, TryJoinIterExt, Upcast, ValueToString, Vc, }; use turbo_tasks_fs::FileSystemPath; use turbo_tasks_hash::DeterministicHash; use self::{availability_info::AvailabilityInfo, available_chunk_items::AvailableChunkItems}; pub use self::{ - chunking_context::{ChunkGroupResult, ChunkingContext, ChunkingContextExt, MinifyType}, + chunking_context::{ + ChunkGroupResult, ChunkingContext, ChunkingContextExt, EntryChunkGroupResult, MinifyType, + }, data::{ChunkData, ChunkDataOption, ChunksData}, evaluate::{EvaluatableAsset, EvaluatableAssetExt, EvaluatableAssets}, }; @@ -50,7 +52,7 @@ use crate::{ #[serde(untagged)] pub enum ModuleId { Number(u32), - String(String), + String(RcStr), } impl Display for ModuleId { @@ -65,8 +67,8 @@ impl Display for ModuleId { #[turbo_tasks::value_impl] impl ValueToString for ModuleId { #[turbo_tasks::function] - fn to_string(&self) -> Vc { - Vc::cell(self.to_string()) + fn to_string(&self) -> Vc { + Vc::cell(self.to_string().into()) } } @@ -74,7 +76,7 @@ impl ModuleId { pub fn parse(id: &str) -> Result { Ok(match id.parse::() { Ok(i) => ModuleId::Number(i), - Err(_) => ModuleId::String(id.to_string()), + Err(_) => ModuleId::String(id.into()), }) } } @@ -226,7 +228,7 @@ enum ChunkContentGraphNode { // Chunk items that are placed into the current chunk group ChunkItem { item: Vc>, - ident: ReadRef, + ident: ReadRef, }, // Async module that is referenced from the chunk group AsyncModule { @@ -352,6 +354,8 @@ async fn graph_node_to_referenced_nodes( let module_data = reference .resolve_reference() + .resolve() + .await? .primary_modules() .await? .into_iter() @@ -420,7 +424,7 @@ async fn graph_node_to_referenced_nodes( ChunkingType::Async => { let chunk_loading = chunking_context.environment().chunk_loading().await?; - if matches!(*chunk_loading, ChunkLoading::None) { + if matches!(*chunk_loading, ChunkLoading::Edge) { let chunk_item = chunkable_module .as_chunk_item(chunking_context) .resolve() diff --git a/crates/turbopack-core/src/compile_time_info.rs b/crates/turbopack-core/src/compile_time_info.rs index b0375d34de00f..e33d4006b604b 100644 --- a/crates/turbopack-core/src/compile_time_info.rs +++ b/crates/turbopack-core/src/compile_time_info.rs @@ -1,6 +1,6 @@ use anyhow::Result; use indexmap::IndexMap; -use turbo_tasks::Vc; +use turbo_tasks::{RcStr, Vc}; use turbo_tasks_fs::FileSystemPath; use crate::environment::Environment; @@ -37,16 +37,16 @@ macro_rules! definable_name_map_internal { $crate::definable_name_map_internal!($map, $($more)+); }; ($name:ident) => { - [stringify!($name).to_string()] + [stringify!($name).into()] }; ($name:ident . $($more:ident).+) => { - $crate::definable_name_map_internal!($($more).+, [stringify!($name).to_string()]) + $crate::definable_name_map_internal!($($more).+, [stringify!($name).into()]) }; ($name:ident, [$($array:expr),+]) => { - [$($array),+, stringify!($name).to_string()] + [$($array),+, stringify!($name).into()] }; ($name:ident . $($more:ident).+, [$($array:expr),+]) => { - $crate::definable_name_map_internal!($($more).+, [$($array),+, stringify!($name).to_string()]) + $crate::definable_name_map_internal!($($more).+, [$($array),+, stringify!($name).into()]) }; } @@ -78,8 +78,8 @@ macro_rules! free_var_references { #[derive(Debug, Clone, Hash, PartialOrd, Ord)] pub enum CompileTimeDefineValue { Bool(bool), - String(String), - JSON(String), + String(RcStr), + JSON(RcStr), } impl From for CompileTimeDefineValue { @@ -88,31 +88,37 @@ impl From for CompileTimeDefineValue { } } +impl From for CompileTimeDefineValue { + fn from(value: RcStr) -> Self { + Self::String(value) + } +} + impl From for CompileTimeDefineValue { fn from(value: String) -> Self { - Self::String(value) + Self::String(value.into()) } } impl From<&str> for CompileTimeDefineValue { fn from(value: &str) -> Self { - Self::String(value.to_string()) + Self::String(value.into()) } } impl From for CompileTimeDefineValue { fn from(value: serde_json::Value) -> Self { - Self::JSON(value.to_string()) + Self::JSON(value.to_string().into()) } } #[turbo_tasks::value(transparent)] #[derive(Debug, Clone)] -pub struct CompileTimeDefines(pub IndexMap, CompileTimeDefineValue>); +pub struct CompileTimeDefines(pub IndexMap, CompileTimeDefineValue>); impl IntoIterator for CompileTimeDefines { - type Item = (Vec, CompileTimeDefineValue); - type IntoIter = indexmap::map::IntoIter, CompileTimeDefineValue>; + type Item = (Vec, CompileTimeDefineValue); + type IntoIter = indexmap::map::IntoIter, CompileTimeDefineValue>; fn into_iter(self) -> Self::IntoIter { self.0.into_iter() @@ -131,12 +137,12 @@ impl CompileTimeDefines { #[derive(Debug, Clone)] pub enum FreeVarReference { EcmaScriptModule { - request: String, + request: RcStr, lookup_path: Option>, - export: Option, + export: Option, }, Value(CompileTimeDefineValue), - Error(String), + Error(RcStr), } impl From for FreeVarReference { @@ -165,7 +171,7 @@ impl From for FreeVarReference { #[turbo_tasks::value(transparent)] #[derive(Debug, Clone)] -pub struct FreeVarReferences(pub IndexMap, FreeVarReference>); +pub struct FreeVarReferences(pub IndexMap, FreeVarReference>); #[turbo_tasks::value_impl] impl FreeVarReferences { diff --git a/crates/turbopack-core/src/context.rs b/crates/turbopack-core/src/context.rs index e95c991b85393..30f7052fa0606 100644 --- a/crates/turbopack-core/src/context.rs +++ b/crates/turbopack-core/src/context.rs @@ -1,6 +1,6 @@ use anyhow::{bail, Result}; -use turbo_tasks::{Value, Vc}; -use turbo_tasks_fs::FileSystemPath; +use turbo_tasks::{RcStr, Value, Vc}; +use turbo_tasks_fs::{glob::Glob, FileSystemPath}; use crate::{ compile_time_info::CompileTimeInfo, @@ -42,7 +42,7 @@ pub trait AssetContext { fn compile_time_info(self: Vc) -> Vc; /// Gets the layer of the asset context. - fn layer(self: Vc) -> Vc; + fn layer(self: Vc) -> Vc; /// Gets the resolve options for a given path. fn resolve_options( @@ -75,5 +75,7 @@ pub trait AssetContext { ) -> Vc; /// Gets a new AssetContext with the transition applied. - fn with_transition(self: Vc, transition: String) -> Vc>; + fn with_transition(self: Vc, transition: RcStr) -> Vc>; + + fn side_effect_free_packages(self: Vc) -> Vc; } diff --git a/crates/turbopack-core/src/diagnostics/mod.rs b/crates/turbopack-core/src/diagnostics/mod.rs index 4c2a3b247a7d6..9a7aa25bb576a 100644 --- a/crates/turbopack-core/src/diagnostics/mod.rs +++ b/crates/turbopack-core/src/diagnostics/mod.rs @@ -2,18 +2,18 @@ use std::collections::HashMap; use anyhow::Result; use async_trait::async_trait; -use turbo_tasks::{emit, CollectiblesSource, Upcast, Vc}; +use turbo_tasks::{emit, CollectiblesSource, RcStr, Upcast, Vc}; #[turbo_tasks::value(serialization = "none")] #[derive(Clone, Debug)] pub struct PlainDiagnostic { - pub category: String, - pub name: String, - pub payload: HashMap, + pub category: RcStr, + pub name: RcStr, + pub payload: HashMap, } #[turbo_tasks::value(transparent)] -pub struct DiagnosticPayload(pub HashMap); +pub struct DiagnosticPayload(pub HashMap); /// An arbitrary payload can be used to analyze, diagnose /// Turbopack's behavior. @@ -25,9 +25,9 @@ pub trait Diagnostic { /// `slow_perf_event`, or something else. This is not strongly typed /// though; since consumer or implementation may need to define own /// category. - fn category(&self) -> Vc; + fn category(&self) -> Vc; /// Name of the specific diagnostic event. - fn name(&self) -> Vc; + fn name(&self) -> Vc; /// Arbitarary payload included in the diagnostic event. fn payload(&self) -> Vc; diff --git a/crates/turbopack-core/src/environment.rs b/crates/turbopack-core/src/environment.rs index 05813151aedf0..b858816e02b4f 100644 --- a/crates/turbopack-core/src/environment.rs +++ b/crates/turbopack-core/src/environment.rs @@ -5,7 +5,7 @@ use std::{ use anyhow::{anyhow, Context, Result}; use swc_core::ecma::preset_env::{Version, Versions}; -use turbo_tasks::{Value, Vc}; +use turbo_tasks::{RcStr, Value, Vc}; use turbo_tasks_env::ProcessEnv; use crate::target::CompileTarget; @@ -28,10 +28,8 @@ impl Rendering { } #[turbo_tasks::value] -#[derive(Default)] pub enum ChunkLoading { - #[default] - None, + Edge, /// CommonJS in Node.js NodeJs, ///