瀏覽代碼

Merge branch '0.21'

Loris Leiva 1 年之前
父節點
當前提交
18f86336fa

+ 4 - 4
package.json

@@ -22,18 +22,18 @@
         "@typescript-eslint/parser": "^6.0.0",
         "@typescript-eslint/parser": "^6.0.0",
         "agadoo": "^3.0.0",
         "agadoo": "^3.0.0",
         "eslint": "^8.57.0",
         "eslint": "^8.57.0",
-        "eslint-config-turbo": "^2.0.14",
+        "eslint-config-turbo": "^2.1.1",
         "eslint-plugin-simple-import-sort": "^10.0.0",
         "eslint-plugin-simple-import-sort": "^10.0.0",
         "eslint-plugin-sort-keys-fix": "^1.1.2",
         "eslint-plugin-sort-keys-fix": "^1.1.2",
         "eslint-plugin-typescript-sort-keys": "^3.2.0",
         "eslint-plugin-typescript-sort-keys": "^3.2.0",
-        "happy-dom": "^14.12.3",
+        "happy-dom": "^15.7.3",
         "prettier": "^3.3.3",
         "prettier": "^3.3.3",
         "rimraf": "6.0.1",
         "rimraf": "6.0.1",
         "tsup": "^8.2.4",
         "tsup": "^8.2.4",
-        "turbo": "^2.0.14",
+        "turbo": "^2.1.1",
         "typescript": "^5.5.4",
         "typescript": "^5.5.4",
         "vitest": "^2.0.5",
         "vitest": "^2.0.5",
-        "zx": "^8.1.4"
+        "zx": "^8.1.5"
     },
     },
     "engines": {
     "engines": {
         "node": ">=18.0.0"
         "node": ">=18.0.0"

+ 1 - 1
packages/nodes-from-anchor/package.json

@@ -52,7 +52,7 @@
         "@kinobi-so/errors": "workspace:*",
         "@kinobi-so/errors": "workspace:*",
         "@kinobi-so/nodes": "workspace:*",
         "@kinobi-so/nodes": "workspace:*",
         "@kinobi-so/visitors": "workspace:*",
         "@kinobi-so/visitors": "workspace:*",
-        "@noble/hashes": "^1.4.0"
+        "@noble/hashes": "^1.5.0"
     },
     },
     "license": "MIT",
     "license": "MIT",
     "repository": {
     "repository": {

+ 6 - 0
packages/renderers-js/CHANGELOG.md

@@ -1,5 +1,11 @@
 # @kinobi-so/renderers-js
 # @kinobi-so/renderers-js
 
 
+## 0.21.8
+
+### Patch Changes
+
+-   [#200](https://github.com/kinobi-so/kinobi/pull/200) [`6639091`](https://github.com/kinobi-so/kinobi/commit/6639091714ae3b5c4330f0b1f43816fea373d55f) Thanks [@lorisleiva](https://github.com/lorisleiva)! - Fix a bug that reuses the same `ImportMap` within different code fragments
+
 ## 0.21.7
 ## 0.21.7
 
 
 ### Patch Changes
 ### Patch Changes

+ 1 - 1
packages/renderers-js/package.json

@@ -1,6 +1,6 @@
 {
 {
     "name": "@kinobi-so/renderers-js",
     "name": "@kinobi-so/renderers-js",
-    "version": "0.21.7",
+    "version": "0.21.8",
     "description": "JavaScript renderer compatible with the Solana web3.js library",
     "description": "JavaScript renderer compatible with the Solana web3.js library",
     "exports": {
     "exports": {
         "types": "./dist/types/index.d.ts",
         "types": "./dist/types/index.d.ts",

+ 2 - 2
packages/renderers-js/src/fragments/common.ts

@@ -30,8 +30,8 @@ export class Fragment {
 
 
     constructor(render: string, imports?: ImportMap, features?: Set<FragmentFeature>) {
     constructor(render: string, imports?: ImportMap, features?: Set<FragmentFeature>) {
         this.render = render;
         this.render = render;
-        this.imports = imports ?? new ImportMap();
-        this.features = features ?? new Set();
+        this.imports = imports ? new ImportMap().mergeWith(imports) : new ImportMap();
+        this.features = new Set([...(features ?? [])]);
     }
     }
 
 
     setRender(render: string): this {
     setRender(render: string): this {

+ 29 - 0
packages/renderers-js/test/_setup.ts

@@ -21,6 +21,15 @@ export function renderMapContains(renderMap: RenderMap, key: string, expected: (
     return codeContains(renderMap.get(key), expected);
     return codeContains(renderMap.get(key), expected);
 }
 }
 
 
+export function renderMapDoesNotContain(
+    renderMap: RenderMap,
+    key: string,
+    expected: (RegExp | string)[] | RegExp | string,
+) {
+    expect(renderMap.has(key), `RenderMap is missing key "${key}".`).toBe(true);
+    return codeDoesNotContain(renderMap.get(key), expected);
+}
+
 export async function codeContains(actual: string, expected: (RegExp | string)[] | RegExp | string) {
 export async function codeContains(actual: string, expected: (RegExp | string)[] | RegExp | string) {
     const expectedArray = Array.isArray(expected) ? expected : [expected];
     const expectedArray = Array.isArray(expected) ? expected : [expected];
     const normalizedActual = await normalizeCode(actual);
     const normalizedActual = await normalizeCode(actual);
@@ -50,6 +59,15 @@ export function renderMapContainsImports(renderMap: RenderMap, key: string, expe
     return codeContainsImports(renderMap.get(key), expectedImports);
     return codeContainsImports(renderMap.get(key), expectedImports);
 }
 }
 
 
+export function renderMapDoesNotContainImports(
+    renderMap: RenderMap,
+    key: string,
+    expectedImports: Record<string, string[]>,
+) {
+    expect(renderMap.has(key), `RenderMap is missing key "${key}".`).toBe(true);
+    return codeDoesNotContainImports(renderMap.get(key), expectedImports);
+}
+
 export async function codeContainsImports(actual: string, expectedImports: Record<string, string[]>) {
 export async function codeContainsImports(actual: string, expectedImports: Record<string, string[]>) {
     const normalizedActual = await inlineCode(actual);
     const normalizedActual = await inlineCode(actual);
     const importPairs = Object.entries(expectedImports).flatMap(([key, value]) => {
     const importPairs = Object.entries(expectedImports).flatMap(([key, value]) => {
@@ -61,6 +79,17 @@ export async function codeContainsImports(actual: string, expectedImports: Recor
     });
     });
 }
 }
 
 
+export async function codeDoesNotContainImports(actual: string, expectedImports: Record<string, string[]>) {
+    const normalizedActual = await inlineCode(actual);
+    const importPairs = Object.entries(expectedImports).flatMap(([key, value]) => {
+        return value.map(v => [key, v] as const);
+    });
+
+    importPairs.forEach(([importFrom, importValue]) => {
+        expect(normalizedActual).not.toMatch(new RegExp(`import{[^}]*\\b${importValue}\\b[^}]*}from'${importFrom}'`));
+    });
+}
+
 export function codeStringAsRegex(code: string) {
 export function codeStringAsRegex(code: string) {
     const stringAsRegex = escapeRegex(code)
     const stringAsRegex = escapeRegex(code)
         // Transform spaces between words into required whitespace.
         // Transform spaces between words into required whitespace.

+ 29 - 1
packages/renderers-js/test/pdasPage.test.ts

@@ -1,6 +1,7 @@
 import {
 import {
     constantPdaSeedNodeFromString,
     constantPdaSeedNodeFromString,
     numberTypeNode,
     numberTypeNode,
+    optionTypeNode,
     pdaNode,
     pdaNode,
     programNode,
     programNode,
     publicKeyTypeNode,
     publicKeyTypeNode,
@@ -10,7 +11,7 @@ import { visit } from '@kinobi-so/visitors-core';
 import { test } from 'vitest';
 import { test } from 'vitest';
 
 
 import { getRenderMapVisitor } from '../src';
 import { getRenderMapVisitor } from '../src';
-import { renderMapContains } from './_setup';
+import { renderMapContains, renderMapContainsImports, renderMapDoesNotContainImports } from './_setup';
 
 
 test('it renders a PDA helper function and its input type', async () => {
 test('it renders a PDA helper function and its input type', async () => {
     // Given the following PDA node.
     // Given the following PDA node.
@@ -82,3 +83,30 @@ test('it renders an empty array of seeds for seedless PDAs', async () => {
         'getProgramDerivedAddress({ programAddress, seeds: [] })',
         'getProgramDerivedAddress({ programAddress, seeds: [] })',
     ]);
     ]);
 });
 });
+
+test('it does not import strict types for variable seeds', async () => {
+    // Given the following PDA node.
+    const node = programNode({
+        name: 'myProgram',
+        pdas: [
+            pdaNode({
+                name: 'foo',
+                seeds: [variablePdaSeedNode('myAccount', optionTypeNode(publicKeyTypeNode()))],
+            }),
+        ],
+        publicKey: '1111',
+    });
+
+    // When we render it.
+    const renderMap = visit(node, getRenderMapVisitor());
+
+    // Then the `Option` string type should not be imported.
+    await renderMapDoesNotContainImports(renderMap, 'pdas/foo.ts', {
+        '@solana/web3.js': ['type Option'],
+    });
+
+    // But the `OptionOrNullable` loose type should be imported.
+    await renderMapContainsImports(renderMap, 'pdas/foo.ts', {
+        '@solana/web3.js': ['type OptionOrNullable'],
+    });
+});

+ 7 - 0
packages/renderers/CHANGELOG.md

@@ -1,5 +1,12 @@
 # @kinobi-so/renderers
 # @kinobi-so/renderers
 
 
+## 0.21.3
+
+### Patch Changes
+
+-   Updated dependencies [[`6639091`](https://github.com/kinobi-so/kinobi/commit/6639091714ae3b5c4330f0b1f43816fea373d55f)]:
+    -   @kinobi-so/renderers-js@0.21.8
+
 ## 0.21.2
 ## 0.21.2
 
 
 ### Patch Changes
 ### Patch Changes

+ 1 - 1
packages/renderers/package.json

@@ -1,6 +1,6 @@
 {
 {
     "name": "@kinobi-so/renderers",
     "name": "@kinobi-so/renderers",
-    "version": "0.21.2",
+    "version": "0.21.3",
     "description": "Exports all Kinobi renderers",
     "description": "Exports all Kinobi renderers",
     "exports": {
     "exports": {
         "types": "./dist/types/index.d.ts",
         "types": "./dist/types/index.d.ts",

+ 72 - 72
pnpm-lock.yaml

@@ -25,7 +25,7 @@ importers:
         version: 0.0.5(prettier@3.3.3)
         version: 0.0.5(prettier@3.3.3)
       '@types/node':
       '@types/node':
         specifier: ^20
         specifier: ^20
-        version: 20.16.1
+        version: 20.16.4
       '@typescript-eslint/eslint-plugin':
       '@typescript-eslint/eslint-plugin':
         specifier: ^6.21.0
         specifier: ^6.21.0
         version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)
         version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)
@@ -39,8 +39,8 @@ importers:
         specifier: ^8.57.0
         specifier: ^8.57.0
         version: 8.57.0
         version: 8.57.0
       eslint-config-turbo:
       eslint-config-turbo:
-        specifier: ^2.0.14
-        version: 2.0.14(eslint@8.57.0)
+        specifier: ^2.1.1
+        version: 2.1.1(eslint@8.57.0)
       eslint-plugin-simple-import-sort:
       eslint-plugin-simple-import-sort:
         specifier: ^10.0.0
         specifier: ^10.0.0
         version: 10.0.0(eslint@8.57.0)
         version: 10.0.0(eslint@8.57.0)
@@ -51,8 +51,8 @@ importers:
         specifier: ^3.2.0
         specifier: ^3.2.0
         version: 3.2.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)
         version: 3.2.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)
       happy-dom:
       happy-dom:
-        specifier: ^14.12.3
-        version: 14.12.3
+        specifier: ^15.7.3
+        version: 15.7.3
       prettier:
       prettier:
         specifier: ^3.3.3
         specifier: ^3.3.3
         version: 3.3.3
         version: 3.3.3
@@ -63,17 +63,17 @@ importers:
         specifier: ^8.2.4
         specifier: ^8.2.4
         version: 8.2.4(postcss@8.4.38)(typescript@5.5.4)
         version: 8.2.4(postcss@8.4.38)(typescript@5.5.4)
       turbo:
       turbo:
-        specifier: ^2.0.14
-        version: 2.0.14
+        specifier: ^2.1.1
+        version: 2.1.1
       typescript:
       typescript:
         specifier: ^5.5.4
         specifier: ^5.5.4
         version: 5.5.4
         version: 5.5.4
       vitest:
       vitest:
         specifier: ^2.0.5
         specifier: ^2.0.5
-        version: 2.0.5(@types/node@20.16.1)(happy-dom@14.12.3)
+        version: 2.0.5(@types/node@20.16.4)(happy-dom@15.7.3)
       zx:
       zx:
-        specifier: ^8.1.4
-        version: 8.1.4
+        specifier: ^8.1.5
+        version: 8.1.5
 
 
   packages/errors:
   packages/errors:
     dependencies:
     dependencies:
@@ -131,8 +131,8 @@ importers:
         specifier: workspace:*
         specifier: workspace:*
         version: link:../visitors
         version: link:../visitors
       '@noble/hashes':
       '@noble/hashes':
-        specifier: ^1.4.0
-        version: 1.4.0
+        specifier: ^1.5.0
+        version: 1.5.0
 
 
   packages/renderers:
   packages/renderers:
     dependencies:
     dependencies:
@@ -701,9 +701,9 @@ packages:
   '@manypkg/get-packages@1.1.3':
   '@manypkg/get-packages@1.1.3':
     resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==}
     resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==}
 
 
-  '@noble/hashes@1.4.0':
-    resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==}
-    engines: {node: '>= 16'}
+  '@noble/hashes@1.5.0':
+    resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==}
+    engines: {node: ^14.21.3 || >=16}
 
 
   '@nodelib/fs.scandir@2.1.5':
   '@nodelib/fs.scandir@2.1.5':
     resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
     resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
@@ -868,8 +868,8 @@ packages:
   '@types/node@12.20.55':
   '@types/node@12.20.55':
     resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
     resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
 
 
-  '@types/node@20.16.1':
-    resolution: {integrity: sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==}
+  '@types/node@20.16.4':
+    resolution: {integrity: sha512-ioyQ1zK9aGEomJ45zz8S8IdzElyxhvP1RVWnPrXDf6wFaUb+kk1tEcVVJkF7RPGM0VWI7cp5U57oCPIn5iN1qg==}
 
 
   '@types/nunjucks@3.2.6':
   '@types/nunjucks@3.2.6':
     resolution: {integrity: sha512-pHiGtf83na1nCzliuAdq8GowYiXvH5l931xZ0YEHaLMNFgynpEqx+IPStlu7UaDkehfvl01e4x/9Tpwhy7Ue3w==}
     resolution: {integrity: sha512-pHiGtf83na1nCzliuAdq8GowYiXvH5l931xZ0YEHaLMNFgynpEqx+IPStlu7UaDkehfvl01e4x/9Tpwhy7Ue3w==}
@@ -1288,8 +1288,8 @@ packages:
     resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
     resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
     engines: {node: '>=10'}
     engines: {node: '>=10'}
 
 
-  eslint-config-turbo@2.0.14:
-    resolution: {integrity: sha512-VkzAH/AR1/fjMsqzuurfWkEgyGVTTzfZQB1umDB8dMWzFhqo8p/2KEWbvRQLEvSFxjVfeJl5ErQAJ7h7DYglxg==}
+  eslint-config-turbo@2.1.1:
+    resolution: {integrity: sha512-JJF8SZErmgKCGkt124WUmTt0sQ5YLvPo2YxDsfzn9avGJC7/BQIa+3FZoDb3zeYYsZx91pZ6htQAJaKK8NQQAg==}
     peerDependencies:
     peerDependencies:
       eslint: '>6.6.0'
       eslint: '>6.6.0'
 
 
@@ -1321,8 +1321,8 @@ packages:
     resolution: {integrity: sha512-DNPHFGCA0/hZIsfODbeLZqaGY/+q3vgtshF85r+YWDNCQ2apd9PNs/zL6ttKm0nD1IFwvxyg3YOTI7FHl4unrw==}
     resolution: {integrity: sha512-DNPHFGCA0/hZIsfODbeLZqaGY/+q3vgtshF85r+YWDNCQ2apd9PNs/zL6ttKm0nD1IFwvxyg3YOTI7FHl4unrw==}
     engines: {node: '>=0.10.0'}
     engines: {node: '>=0.10.0'}
 
 
-  eslint-plugin-turbo@2.0.14:
-    resolution: {integrity: sha512-E++MSAEeWZTU0FYARrfakMPq+7XeltqeY4JBDQTzbGEWG3kgYJPeYBMWsypcvBujVihQLlMu0S6ImnfV692mHg==}
+  eslint-plugin-turbo@2.1.1:
+    resolution: {integrity: sha512-E/34kdQd0n3RP18+e0DSV0f3YTSCOojUh1p4X0Xrho2PBYmJ3umSnNo9FhkZt6UDACl+nBQcYTFkRHMz76lJdw==}
     peerDependencies:
     peerDependencies:
       eslint: '>6.6.0'
       eslint: '>6.6.0'
 
 
@@ -1528,9 +1528,9 @@ packages:
   graphemer@1.4.0:
   graphemer@1.4.0:
     resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
     resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
 
 
-  happy-dom@14.12.3:
-    resolution: {integrity: sha512-vsYlEs3E9gLwA1Hp+w3qzu+RUDFf4VTT8cyKqVICoZ2k7WM++Qyd2LwzyTi5bqMJFiIC/vNpTDYuxdreENRK/g==}
-    engines: {node: '>=16.0.0'}
+  happy-dom@15.7.3:
+    resolution: {integrity: sha512-w3RUaYNXFJX5LiNVhOJLK4GqCB1bFj1FvELtpon3HrN8gUpS09V0Vvm4/BBRRj7mLUE1+ch8PKv1JxEp/0IHjA==}
+    engines: {node: '>=18.0.0'}
 
 
   has-flag@3.0.0:
   has-flag@3.0.0:
     resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
     resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
@@ -2244,38 +2244,38 @@ packages:
     peerDependencies:
     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'
       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'
 
 
-  turbo-darwin-64@2.0.14:
-    resolution: {integrity: sha512-kwfDmjNwlNfvtrvT29+ZBg5n1Wvxl891bFHchMJyzMoR0HOE9N1NSNdSZb9wG3e7sYNIu4uDkNk+VBEqJW0HzQ==}
+  turbo-darwin-64@2.1.1:
+    resolution: {integrity: sha512-aYNuJpZlCoi0Htd79fl/2DywpewGKijdXeOfg9KzNuPVKzSMYlAXuAlNGh0MKjiOcyqxQGL7Mq9LFhwA0VpDpQ==}
     cpu: [x64]
     cpu: [x64]
     os: [darwin]
     os: [darwin]
 
 
-  turbo-darwin-arm64@2.0.14:
-    resolution: {integrity: sha512-m3LXYEshCx3wc4ZClM6gb01KYpFmtjQ9IBF3A7ofjb6ahux3xlYZJZ3uFCLAGHuvGLuJ3htfiPbwlDPTdknqqw==}
+  turbo-darwin-arm64@2.1.1:
+    resolution: {integrity: sha512-tifJKD8yHY48rHXPMcM8o1jI/Jk2KCaXiNjTKvvy9Zsim61BZksNVLelIbrRoCGwAN6PUBZO2lGU5iL/TQJ5Pw==}
     cpu: [arm64]
     cpu: [arm64]
     os: [darwin]
     os: [darwin]
 
 
-  turbo-linux-64@2.0.14:
-    resolution: {integrity: sha512-7vBzCPdoTtR92SNn2JMgj1FlMmyonGmpMaQdgAB1OVYtuQ6NVGoh7/lODfaILqXjpvmFSVbpBIDrKOT6EvcprQ==}
+  turbo-linux-64@2.1.1:
+    resolution: {integrity: sha512-Js6d/bSQe9DuV9c7ITXYpsU/ADzFHABdz1UIHa7Oqjj9VOEbFeA9WpAn0c+mdJrVD+IXJFbbDZUjN7VYssmtcg==}
     cpu: [x64]
     cpu: [x64]
     os: [linux]
     os: [linux]
 
 
-  turbo-linux-arm64@2.0.14:
-    resolution: {integrity: sha512-jwH+c0bfjpBf26K/tdEFatmnYyXwGROjbr6bZmNcL8R+IkGAc/cglL+OToqJnQZTgZvH7uDGbeSyUo7IsHyjuA==}
+  turbo-linux-arm64@2.1.1:
+    resolution: {integrity: sha512-LidzTCq0yvQ+N8w8Qub9FmhQ/mmEIeoqFi7DSupekEV2EjvE9jw/zYc9Pk67X+g7dHVfgOnvVzmrjChdxpFePw==}
     cpu: [arm64]
     cpu: [arm64]
     os: [linux]
     os: [linux]
 
 
-  turbo-windows-64@2.0.14:
-    resolution: {integrity: sha512-w9/XwkHSzvLjmioo6cl3S1yRfI6swxsV1j1eJwtl66JM4/pn0H2rBa855R0n7hZnmI6H5ywLt/nLt6Ae8RTDmw==}
+  turbo-windows-64@2.1.1:
+    resolution: {integrity: sha512-GKc9ZywKwy4xLDhwXd6H07yzl0TB52HjXMrFLyHGhCVnf/w0oq4sLJv2sjbvuarPjsyx4xnCBJ3m3oyL2XmFtA==}
     cpu: [x64]
     cpu: [x64]
     os: [win32]
     os: [win32]
 
 
-  turbo-windows-arm64@2.0.14:
-    resolution: {integrity: sha512-XaQlyYk+Rf4xS5XWCo8XCMIpssgGGy8blzLfolN6YBp4baElIWMlkLZHDbGyiFmCbNf9I9gJI64XGRG+LVyyjA==}
+  turbo-windows-arm64@2.1.1:
+    resolution: {integrity: sha512-oFKkMj11KKUv3xSK9/fhAEQTxLUp1Ol1EOktwc32+SFtEU0uls7kosAz0b+qe8k3pJGEMFdDPdqoEjyJidbxtQ==}
     cpu: [arm64]
     cpu: [arm64]
     os: [win32]
     os: [win32]
 
 
-  turbo@2.0.14:
-    resolution: {integrity: sha512-00JjdCMD/cpsjP0Izkjcm8Oaor5yUCfDwODtaLb+WyblyadkaDEisGhy3Dbd5az9n+5iLSPiUgf+WjPbns6MRg==}
+  turbo@2.1.1:
+    resolution: {integrity: sha512-u9gUDkmR9dFS8b5kAYqIETK4OnzsS4l2ragJ0+soSMHh6VEeNHjTfSjk1tKxCqLyziCrPogadxP680J+v6yGHw==}
     hasBin: true
     hasBin: true
 
 
   type-check@0.4.0:
   type-check@0.4.0:
@@ -2424,8 +2424,8 @@ packages:
     resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
     resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
     engines: {node: '>=10'}
     engines: {node: '>=10'}
 
 
-  zx@8.1.4:
-    resolution: {integrity: sha512-QFDYYpnzdpRiJ3dL2102Cw26FpXpWshW4QLTGxiYfIcwdAqg084jRCkK/kuP/NOSkxOjydRwNFG81qzA5r1a6w==}
+  zx@8.1.5:
+    resolution: {integrity: sha512-gvmiYPvDDEz2Gcc37x7pJkipTKcFIE18q9QlSI1p5qoPDtoSn3jmGuWD0eEb7HuxEH5aDD7N/RVgH8BqSxbKzA==}
     engines: {node: '>= 12.17.0'}
     engines: {node: '>= 12.17.0'}
     hasBin: true
     hasBin: true
 
 
@@ -2831,7 +2831,7 @@ snapshots:
       globby: 11.1.0
       globby: 11.1.0
       read-yaml-file: 1.1.0
       read-yaml-file: 1.1.0
 
 
-  '@noble/hashes@1.4.0': {}
+  '@noble/hashes@1.5.0': {}
 
 
   '@nodelib/fs.scandir@2.1.5':
   '@nodelib/fs.scandir@2.1.5':
     dependencies:
     dependencies:
@@ -2946,7 +2946,7 @@ snapshots:
   '@types/fs-extra@11.0.4':
   '@types/fs-extra@11.0.4':
     dependencies:
     dependencies:
       '@types/jsonfile': 6.1.4
       '@types/jsonfile': 6.1.4
-      '@types/node': 20.16.1
+      '@types/node': 20.16.4
     optional: true
     optional: true
 
 
   '@types/json-schema@7.0.15': {}
   '@types/json-schema@7.0.15': {}
@@ -2955,12 +2955,12 @@ snapshots:
 
 
   '@types/jsonfile@6.1.4':
   '@types/jsonfile@6.1.4':
     dependencies:
     dependencies:
-      '@types/node': 20.16.1
+      '@types/node': 20.16.4
     optional: true
     optional: true
 
 
   '@types/node@12.20.55': {}
   '@types/node@12.20.55': {}
 
 
-  '@types/node@20.16.1':
+  '@types/node@20.16.4':
     dependencies:
     dependencies:
       undici-types: 6.19.6
       undici-types: 6.19.6
 
 
@@ -3439,10 +3439,10 @@ snapshots:
 
 
   escape-string-regexp@4.0.0: {}
   escape-string-regexp@4.0.0: {}
 
 
-  eslint-config-turbo@2.0.14(eslint@8.57.0):
+  eslint-config-turbo@2.1.1(eslint@8.57.0):
     dependencies:
     dependencies:
       eslint: 8.57.0
       eslint: 8.57.0
-      eslint-plugin-turbo: 2.0.14(eslint@8.57.0)
+      eslint-plugin-turbo: 2.1.1(eslint@8.57.0)
 
 
   eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4):
   eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4):
     dependencies:
     dependencies:
@@ -3469,7 +3469,7 @@ snapshots:
       natural-compare: 1.4.0
       natural-compare: 1.4.0
       requireindex: 1.2.0
       requireindex: 1.2.0
 
 
-  eslint-plugin-turbo@2.0.14(eslint@8.57.0):
+  eslint-plugin-turbo@2.1.1(eslint@8.57.0):
     dependencies:
     dependencies:
       dotenv: 16.0.3
       dotenv: 16.0.3
       eslint: 8.57.0
       eslint: 8.57.0
@@ -3750,7 +3750,7 @@ snapshots:
 
 
   graphemer@1.4.0: {}
   graphemer@1.4.0: {}
 
 
-  happy-dom@14.12.3:
+  happy-dom@15.7.3:
     dependencies:
     dependencies:
       entities: 4.5.0
       entities: 4.5.0
       webidl-conversions: 7.0.0
       webidl-conversions: 7.0.0
@@ -4362,32 +4362,32 @@ snapshots:
       tslib: 1.14.1
       tslib: 1.14.1
       typescript: 5.5.4
       typescript: 5.5.4
 
 
-  turbo-darwin-64@2.0.14:
+  turbo-darwin-64@2.1.1:
     optional: true
     optional: true
 
 
-  turbo-darwin-arm64@2.0.14:
+  turbo-darwin-arm64@2.1.1:
     optional: true
     optional: true
 
 
-  turbo-linux-64@2.0.14:
+  turbo-linux-64@2.1.1:
     optional: true
     optional: true
 
 
-  turbo-linux-arm64@2.0.14:
+  turbo-linux-arm64@2.1.1:
     optional: true
     optional: true
 
 
-  turbo-windows-64@2.0.14:
+  turbo-windows-64@2.1.1:
     optional: true
     optional: true
 
 
-  turbo-windows-arm64@2.0.14:
+  turbo-windows-arm64@2.1.1:
     optional: true
     optional: true
 
 
-  turbo@2.0.14:
+  turbo@2.1.1:
     optionalDependencies:
     optionalDependencies:
-      turbo-darwin-64: 2.0.14
-      turbo-darwin-arm64: 2.0.14
-      turbo-linux-64: 2.0.14
-      turbo-linux-arm64: 2.0.14
-      turbo-windows-64: 2.0.14
-      turbo-windows-arm64: 2.0.14
+      turbo-darwin-64: 2.1.1
+      turbo-darwin-arm64: 2.1.1
+      turbo-linux-64: 2.1.1
+      turbo-linux-arm64: 2.1.1
+      turbo-windows-64: 2.1.1
+      turbo-windows-arm64: 2.1.1
 
 
   type-check@0.4.0:
   type-check@0.4.0:
     dependencies:
     dependencies:
@@ -4411,13 +4411,13 @@ snapshots:
     dependencies:
     dependencies:
       punycode: 2.3.1
       punycode: 2.3.1
 
 
-  vite-node@2.0.5(@types/node@20.16.1):
+  vite-node@2.0.5(@types/node@20.16.4):
     dependencies:
     dependencies:
       cac: 6.7.14
       cac: 6.7.14
       debug: 4.3.5
       debug: 4.3.5
       pathe: 1.1.2
       pathe: 1.1.2
       tinyrainbow: 1.2.0
       tinyrainbow: 1.2.0
-      vite: 5.2.11(@types/node@20.16.1)
+      vite: 5.2.11(@types/node@20.16.4)
     transitivePeerDependencies:
     transitivePeerDependencies:
       - '@types/node'
       - '@types/node'
       - less
       - less
@@ -4428,16 +4428,16 @@ snapshots:
       - supports-color
       - supports-color
       - terser
       - terser
 
 
-  vite@5.2.11(@types/node@20.16.1):
+  vite@5.2.11(@types/node@20.16.4):
     dependencies:
     dependencies:
       esbuild: 0.20.2
       esbuild: 0.20.2
       postcss: 8.4.38
       postcss: 8.4.38
       rollup: 4.19.0
       rollup: 4.19.0
     optionalDependencies:
     optionalDependencies:
-      '@types/node': 20.16.1
+      '@types/node': 20.16.4
       fsevents: 2.3.3
       fsevents: 2.3.3
 
 
-  vitest@2.0.5(@types/node@20.16.1)(happy-dom@14.12.3):
+  vitest@2.0.5(@types/node@20.16.4)(happy-dom@15.7.3):
     dependencies:
     dependencies:
       '@ampproject/remapping': 2.3.0
       '@ampproject/remapping': 2.3.0
       '@vitest/expect': 2.0.5
       '@vitest/expect': 2.0.5
@@ -4455,12 +4455,12 @@ snapshots:
       tinybench: 2.8.0
       tinybench: 2.8.0
       tinypool: 1.0.0
       tinypool: 1.0.0
       tinyrainbow: 1.2.0
       tinyrainbow: 1.2.0
-      vite: 5.2.11(@types/node@20.16.1)
-      vite-node: 2.0.5(@types/node@20.16.1)
+      vite: 5.2.11(@types/node@20.16.4)
+      vite-node: 2.0.5(@types/node@20.16.4)
       why-is-node-running: 2.3.0
       why-is-node-running: 2.3.0
     optionalDependencies:
     optionalDependencies:
-      '@types/node': 20.16.1
-      happy-dom: 14.12.3
+      '@types/node': 20.16.4
+      happy-dom: 15.7.3
     transitivePeerDependencies:
     transitivePeerDependencies:
       - less
       - less
       - lightningcss
       - lightningcss
@@ -4527,7 +4527,7 @@ snapshots:
 
 
   yocto-queue@0.1.0: {}
   yocto-queue@0.1.0: {}
 
 
-  zx@8.1.4:
+  zx@8.1.5:
     optionalDependencies:
     optionalDependencies:
       '@types/fs-extra': 11.0.4
       '@types/fs-extra': 11.0.4
-      '@types/node': 20.16.1
+      '@types/node': 20.16.4