diff --git a/README.md b/README.md index f07ab5f3..2b4cfcc5 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,35 @@ You can check [example](https://github.com/Code-Hex/graphql-codegen-typescript-v The Q&A for each schema is written in the README in the respective example directory. +### TypeScript config and presets + +When you use `codegen.ts` with a preset such as `client`, put this plugin's options under the plugin entry. Some presets do not pass the shared generate-level `config` object to every plugin. + +```ts +import type { CodegenConfig } from '@graphql-codegen/cli'; + +const config: CodegenConfig = { + schema: 'schema.graphql', + generates: { + './src/gql/': { + preset: 'client', + plugins: [ + { + 'typescript-validation-schema': { + schema: 'zod', + scalarSchemas: { + DateTime: 'z.string().datetime()', + }, + }, + }, + ], + }, + }, +}; + +export default config; +``` + ## Config API Reference ### `schema` @@ -283,12 +312,75 @@ It is currently added for the purpose of using simple objects. See also [#20](ht This option currently **does not support fragment** generation. If you are interested, send me PR would be greatly appreciated! +### `withOperationType` + +type: `boolean` default: `false` + +Generates Zod schemas for GraphQL operation result selection sets. +Use this when `withObjectType` is too broad because it describes the full GraphQL object type, while your query only selects a subset of fields. + +```yml +config: + schema: zod + withOperationType: true +``` + +Currently supported for `schema: zod` and `schema: zodv4`. + +### `maxDepth` + +type: `number` + +Limits nested object validation depth for `withObjectType` schemas generated by `schema: zod` and `schema: zodv4`. +This is useful for cyclic output graphs where validating the entire object graph would recurse forever. + +```yml +config: + schema: zod + withObjectType: true + maxDepth: 1 +``` + ### `validationSchemaExportType` type: `ValidationSchemaExportType` default: `'function'` Specify validation schema export type. +### `zodOptionalType` + +type: `'nullish' | 'nullable' | 'optional'` default: `'nullish'` + +Controls how nullable GraphQL fields are generated for `schema: zod` and `schema: zodv4`. +The default `nullish` mode matches GraphQL input coercion, where a nullable input field may be omitted or passed as `null`. +Use `nullable` or `optional` only when your generated TypeScript `Maybe`/`InputMaybe` contract intentionally differs from GraphQL's default input coercion behavior. + +```yml +config: + schema: zod + zodOptionalType: nullable +``` + +`nullishBehavior` is also accepted as an alias. + +### `strictObjectSchemas` + +type: `boolean` default: `false` + +Appends `.strict()` to generated Zod object schemas. + +### `withDescriptions` + +type: `boolean` default: `false` + +Appends `.describe()` to generated Zod fields from GraphQL descriptions. + +### `onlyEnums` + +type: `boolean` default: `false` + +Generates only enum validation schemas. + ### `useEnumTypeAsDefaultValue` type: `boolean` default: `false` diff --git a/package.json b/package.json index 3ad8ac22..300bb1e3 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,7 @@ "ts-jest": "29.4.9", "typescript": "6.0.3", "valibot": "1.3.1", - "vitest": "^4.0.0", + "vitest": "^3.2.4", "yup": "1.7.1", "zod": "4.3.6" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 67d4254f..5a5604d1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,32 +10,32 @@ importers: dependencies: '@graphql-codegen/plugin-helpers': specifier: ^6.0.0 - version: 6.3.0(graphql@16.13.2) + version: 6.0.0(graphql@16.11.0) '@graphql-codegen/schema-ast': specifier: 5.0.2 - version: 5.0.2(graphql@16.13.2) + version: 5.0.2(graphql@16.11.0) '@graphql-codegen/visitor-plugin-common': specifier: ^6.0.0 - version: 6.3.0(graphql@16.13.2) + version: 6.0.0(graphql@16.11.0) '@graphql-tools/utils': specifier: ^11.0.0 - version: 11.1.0(graphql@16.13.2) + version: 11.1.0(graphql@16.11.0) graphlib: specifier: ^2.1.8 version: 2.1.8 graphql: specifier: ^16.6.0 - version: 16.13.2 + version: 16.11.0 devDependencies: '@antfu/eslint-config': specifier: ^8.0.0 - version: 8.2.0(@typescript-eslint/rule-tester@8.56.1(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.3))(@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.12)(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)(vitest@4.1.5(@types/node@24.12.2)(vite@7.3.1(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.2))) + version: 8.2.0(@typescript-eslint/rule-tester@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(@typescript-eslint/typescript-estree@8.59.0(typescript@6.0.3))(@typescript-eslint/utils@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.12)(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.3)) '@graphql-codegen/cli': specifier: 6.3.1 - version: 6.3.1(@types/node@24.12.2)(graphql@16.13.2)(typescript@6.0.3) + version: 6.3.1(@types/node@24.12.2)(graphql@16.11.0)(typescript@6.0.3) '@graphql-codegen/typescript': specifier: ^5.0.0 - version: 5.0.10(graphql@16.13.2) + version: 5.0.0(graphql@16.11.0) '@tsconfig/recommended': specifier: 1.0.13 version: 1.0.13 @@ -62,7 +62,7 @@ importers: version: 2.2.0 ts-jest: specifier: 29.4.9 - version: 29.4.9(@babel/core@7.27.4)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.27.4))(jest-util@30.3.0)(jest@30.3.0(@types/node@24.12.2))(typescript@6.0.3) + version: 29.4.9(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(jest-util@30.3.0)(jest@30.3.0(@types/node@24.12.2))(typescript@6.0.3) typescript: specifier: 6.0.3 version: 6.0.3 @@ -70,8 +70,8 @@ importers: specifier: 1.3.1 version: 1.3.1(typescript@6.0.3) vitest: - specifier: ^4.0.0 - version: 4.1.5(@types/node@24.12.2)(vite@7.3.1(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.2)) + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.3) yup: specifier: 1.7.1 version: 1.7.1 @@ -149,6 +149,12 @@ packages: '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + '@ardatan/relay-compiler@12.0.3': + resolution: {integrity: sha512-mBDFOGvAoVlWaWqs3hm1AciGHSQE1rqFc/liZTyYz/Oek9yZdT5H26pH2zAFuEiTiBVPPyMuqf5VjOFPI2DGsQ==} + hasBin: true + peerDependencies: + graphql: '*' + '@ardatan/relay-compiler@13.0.1': resolution: {integrity: sha512-afG3YPwuSA0E5foouZusz5GlXKs74dObv4cuWyLyfKsYFj2r7oGRNB28v18HvwuLSQtQFCi+DpIe0TZkgQDYyg==} peerDependencies: @@ -158,14 +164,30 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.27.5': resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.29.0': + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + engines: {node: '>=6.9.0'} + '@babel/core@7.27.4': resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} engines: {node: '>=6.9.0'} + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.27.5': + resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.29.1': resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} @@ -174,16 +196,34 @@ packages: resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.27.1': resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.27.3': resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-plugin-utils@7.27.1': resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} @@ -204,8 +244,12 @@ packages: resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.0': - resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + '@babel/helpers@7.29.2': + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} engines: {node: '>=6.0.0'} hasBin: true @@ -311,6 +355,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/runtime@7.27.0': + resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} + engines: {node: '>=6.9.0'} + '@babel/runtime@7.29.2': resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} @@ -319,10 +367,22 @@ packages: resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.27.4': resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + '@babel/types@7.29.0': resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} @@ -356,8 +416,8 @@ packages: '@emnapi/wasi-threads@1.0.2': resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} - '@envelop/core@5.4.0': - resolution: {integrity: sha512-/1fat63pySE8rw/dZZArEVytLD90JApY85deDJ0/34gm+yhQ3k70CloSUevxoOE4YCGveG3s9SJJfQeeB4NAtQ==} + '@envelop/core@5.5.1': + resolution: {integrity: sha512-3DQg8sFskDo386TkL5j12jyRAdip/8yzK3x7YGbZBgobZ4aKXrvDU0GppU0SnmrpQnNaiTUsxBs9LKkwQ/eyvw==} engines: {node: '>=18.0.0'} '@envelop/instrumentation@1.0.0': @@ -380,158 +440,152 @@ packages: resolution: {integrity: sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==} engines: {node: '>=10'} - '@esbuild/aix-ppc64@0.27.7': - resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.7': - resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.7': - resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.7': - resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.7': - resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.7': - resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.7': - resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.7': - resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.7': - resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.7': - resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.7': - resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.7': - resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.7': - resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.7': - resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.7': - resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.7': - resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.7': - resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.7': - resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.7': - resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.7': - resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.7': - resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.7': - resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.27.7': - resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.7': - resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.7': - resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.7': - resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -542,18 +596,28 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint-community/regexpp@4.12.2': resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/compat@2.0.3': - resolution: {integrity: sha512-SjIJhGigp8hmd1YGIBwh7Ovri7Kisl42GYFjrOyHhtfYGGoLW6teYi/5p8W50KSsawUPpuLOSmsq1bD0NGQLBw==} + '@eslint/compat@2.0.5': + resolution: {integrity: sha512-IbHDbHJfkVNv6xjlET8AIVo/K1NQt7YT4Rp6ok/clyBGcpRx1l6gv0Rq3vBvYfPJIZt6ODf66Zq08FJNDpnzgg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: eslint: ^8.40 || 9 || 10 @@ -631,6 +695,12 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + '@graphql-codegen/plugin-helpers@6.0.0': + resolution: {integrity: sha512-Z7P89vViJvQakRyMbq/JF2iPLruRFOwOB6IXsuSvV/BptuuEd7fsGPuEf8bdjjDxUY0pJZnFN8oC7jIQ8p9GKA==} + engines: {node: '>=16'} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + '@graphql-codegen/plugin-helpers@6.3.0': resolution: {integrity: sha512-Auc+/B7okDx9+pVgLVliZtZLYh6iltWXlnzzM+bRE+zh1T4r3hKbnr8xAmtT937ArfSgk5GHcQHr8LfPYnrRBg==} engines: {node: '>=16'} @@ -659,12 +729,24 @@ packages: graphql-sock: optional: true + '@graphql-codegen/typescript@5.0.0': + resolution: {integrity: sha512-u90SGM6+Rdc3Je1EmVQOrGk5fl7hK1cLR4y5Q1MeUenj0aZFxKno65DCW7RcQpcfebvkPsVGA6y3oS02wPFj6Q==} + engines: {node: '>=16'} + peerDependencies: + graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + '@graphql-codegen/typescript@5.0.10': resolution: {integrity: sha512-Pa8OFmL9TdhEYnLYJLYA9EhP8eEeivP/YDYq4Nb8LQaL7GXm4TGX8zELYaCM9Fu8M3iZb7iQGMt7qc+1lXz8XQ==} engines: {node: '>=16'} peerDependencies: graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + '@graphql-codegen/visitor-plugin-common@6.0.0': + resolution: {integrity: sha512-K05Jv2elOeFstH3i+Ah0Pi9do6NYUvrbdhEkP+UvP9fmIro1hCKwcIEP7j4VFz8mt3gAC3dB5KVJDoyaPUgi4Q==} + engines: {node: '>=16'} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + '@graphql-codegen/visitor-plugin-common@6.3.0': resolution: {integrity: sha512-vGBoE+4huzZyNhyGSAhXAkdROHlwKxxuziZm4XtP1mxe7nuI+VgyOmXebafLijbmuDsptPXQN0C/htL54O8hrg==} engines: {node: '>=16'} @@ -675,26 +757,26 @@ packages: resolution: {integrity: sha512-Pz8wB3K0iU6ae9S1fWfsmJX24CcGeTo6hE7T44ucmV/ALKRj+bxClmqrYcDT7v3f0d12Rh4FAXBb6gon+WkDpQ==} engines: {node: '>=20.0.0'} - '@graphql-tools/apollo-engine-loader@8.0.28': - resolution: {integrity: sha512-MzgDrUuoxp6dZeo54zLBL3cEJKJtM3N/2RqK0rbPxPq5X2z6TUA7EGg8vIFTUkt5xelAsUrm8/4ai41ZDdxOng==} + '@graphql-tools/apollo-engine-loader@8.0.30': + resolution: {integrity: sha512-hUydKGGECrWloERMmfoMzHZi12X99AM9geCGF5XVsv4iMRl/Iyuet24th4kC9bZ8MlAdCwAwtUsCyv9uRfYwSA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/batch-execute@10.0.5': - resolution: {integrity: sha512-dL13tXkfGvAzLq2XfzTKAy9logIcltKYRuPketxdh3Ok3U6PN1HKMCHfrE9cmtAsxD96/8Hlghz5AtM+LRv/ig==} + '@graphql-tools/batch-execute@10.0.8': + resolution: {integrity: sha512-Kobt37qrVTFhX4HUK5/vPgMXFw/5f97AzmAlfmDBSRh/GnoAmLKCb48FrEI3gdeIwZB2fEhVHJyDqsojldnLQA==} engines: {node: '>=20.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/code-file-loader@8.1.28': - resolution: {integrity: sha512-BL3Ft/PFlXDE5nNuqA36hYci7Cx+8bDrPDc8X3VSpZy9iKFBY+oQ+IwqnEHCkt8OSp2n2V0gqTg4u3fcQP1Kwg==} + '@graphql-tools/code-file-loader@8.1.32': + resolution: {integrity: sha512-gR5mNQjn0BugDL8a4A+ovS2KEvU52RNOGnbwiq9oWAEHiSv7iqJu77bpWARTzlE1ZFPK5MSQe9218+1t5PbXmQ==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/delegate@12.0.8': - resolution: {integrity: sha512-yltGepWaJ9KsBY3QREJrZUKadhaiT4mO4ZO42hF/vfD2fIIOKZjn99qCSZBJ0YpVbLctPrgWrgDs3WgAl13fsA==} + '@graphql-tools/delegate@12.0.14': + resolution: {integrity: sha512-/xCDM8zlCk1Lccww9asOIpxna9IFpIlol4yGsBD9Y2+3/Zu5k4/HzDC8LKJtw5MxdG+uJN1l9nRepr4GeBC4kA==} engines: {node: '>=20.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -705,80 +787,86 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/executor-common@1.0.4': - resolution: {integrity: sha512-EKkVjo1Fbx+qK5ZeI+KneeoGzk6HU6aL4E0bX4J3lfnjyaZVESbODCDS/9bBcrV1X2dEby9MfWqA6fkFodP+hw==} + '@graphql-tools/executor-common@1.0.6': + resolution: {integrity: sha512-23/K5C+LSlHDI0mj2SwCJ33RcELCcyDUgABm1Z8St7u/4Z5+95i925H/NAjUyggRjiaY8vYtNiMOPE49aPX1sg==} engines: {node: '>=20.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/executor-graphql-ws@3.1.2': - resolution: {integrity: sha512-nlBXYrWkZ+VFIVU2QrRNnWImBwZglY/uuyK0/dkFMFy9FEjZmErLpGv62PZqQUSEjPakNgUil+T94CUHGebR9w==} + '@graphql-tools/executor-graphql-ws@3.1.5': + resolution: {integrity: sha512-WXRsfwu9AkrORD9nShrd61OwwxeQ5+eXYcABRR3XPONFIS8pWQfDJGGqxql9/227o/s0DV5SIfkBURb5Knzv+A==} engines: {node: '>=20.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/executor-http@3.0.6': - resolution: {integrity: sha512-gTcSdaJWbqYKg/aVQ/T+sIC6Isa4jjx+QhVMyawgivmdbLTg0UgsbR6g97eNVoxnRzFq/CuPSy71IHQeq8Q6iA==} + '@graphql-tools/executor-http@3.2.1': + resolution: {integrity: sha512-53i0TYO0cznIlZDJcnq4gQ6SOZ8efGgCDV33MYh6oqEapcp36tCMEVnVGVxcX5qRRyNHkqTY6hkA+/AyK9kicQ==} engines: {node: '>=20.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/executor-legacy-ws@1.1.25': - resolution: {integrity: sha512-6uf4AEXO0QMxJ7AWKVPqEZXgYBJaiz5vf29X0boG8QtcqWy8mqkXKWLND2Swdx0SbEx0efoGFcjuKufUcB0ASQ==} + '@graphql-tools/executor-legacy-ws@1.1.28': + resolution: {integrity: sha512-O4uj93GG9iUb3s32eyhUohvyfA8mLhN8FvGzEdK628hFQPhZN75yurtVFrR08DHex71mQ3wYCCFkErpwdJbDDQ==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/executor@1.4.13': - resolution: {integrity: sha512-2hTSRfH2kb4ua0ANOV/K6xUoCZsHAE6igE1bimtWUK7v0bowPIxGRKRPpF8JLbImpsJuTCC4HGOCMy7otg3FIQ==} + '@graphql-tools/executor@1.5.3': + resolution: {integrity: sha512-mgBFC0bsrZPZLu9EnydpMnAuQ8Iiq0CEbUcsmvXsm2/iYektGHDN/+bmb7hicA6dWZtdPfklYJmr21WD0GnOfA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/git-loader@8.0.32': - resolution: {integrity: sha512-H5HTp2vevv0rRMEnCJBVmVF8md3LpJI1C1+d6OtzvmuONJ8mOX2mkf9rtoqwiztynVegaDUekvMFsc9k5iE2WA==} + '@graphql-tools/git-loader@8.0.36': + resolution: {integrity: sha512-PDDakesRu8FJYHJLf9/gkTweh8M19Bymz9i+vOlk9OTs9XmNcCqKM+1S610KX2AodvuBFz/xbesjTtTJIppLPg==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/github-loader@9.0.6': - resolution: {integrity: sha512-hhlt2MMkRcvDva/qyzqFddXzaMmRnriJ0Ts+/LcNeYnB8hcEqRMpF9RCsHYjo1mFRaiu8i4PSIpXyyFu3To7Ow==} + '@graphql-tools/github-loader@9.1.2': + resolution: {integrity: sha512-jhRJncj9Wkr1Cd8Mo3QI2oG6fTw5ILr1/OXcHIqx744NBj8pPwQBXmQzZqh7MXxbekl2EAcum7SJIjq1HpYcPA==} engines: {node: '>=20.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/graphql-file-loader@8.1.12': - resolution: {integrity: sha512-Nma7gBgJoUbqXWTmdHjouo36tjzewA8MptVcHoH7widzkciaUVzBhriHzqICFB/dVxig//g9MX8s1XawZo7UAg==} + '@graphql-tools/graphql-file-loader@8.1.14': + resolution: {integrity: sha512-CfAcsSEVkkHfEXLFzrd5rUYpcQEGWNV8lfc1Tb1p5m9HnYICzDDH08I5V33iMrEDza3GuujjjRBYqplBkqwIow==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/graphql-tag-pluck@8.3.31': + resolution: {integrity: sha512-ema2RRPZGj8TKruNElyDBHVCNFMxioGIVfLBuiA+GdfmRGt95b/i7Uksnj4EwItA6MCmhxokxZoa/fl6mJt3tw==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/graphql-tag-pluck@8.3.27': - resolution: {integrity: sha512-CJ0WVXhGYsfFngpRrAAcjRHyxSDHx4dEz2W15bkwvt9he/AWhuyXm07wuGcoLrl0q0iQp1BiRjU7D8SxWZo3JQ==} + '@graphql-tools/import@7.1.14': + resolution: {integrity: sha512-aqLcu04aEidszbXM6M0PWWL8bP17eX9sxXwjYWpglLvIRd4NFqb3C9QzBY8pleqXNMtWqXktlm9BQjevgSrirQ==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/import@7.1.12': - resolution: {integrity: sha512-QSsdPsdJ7yCgQ5XODyKYpC7NlB9R1Koi0R3418PT7GiRm+9O8gYXSs/23dumcOnpiLrnf4qR2aytBn1+JOAhnA==} + '@graphql-tools/json-file-loader@8.0.28': + resolution: {integrity: sha512-qgCsSkPArnjlNkcYpgGKiXxCTNkrAT9E+l1LhR+Por2jTlKBBeZ8stortkQ/PNDDjuL0WPrLQmHKhNPHabnB3A==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/json-file-loader@8.0.26': - resolution: {integrity: sha512-kwy9IFi5QtXXTLBgWkvA1RqsZeJDn0CxsTbhNlziCzmga9fNo7qtZ18k9FYIq3EIoQQlok+b7W7yeyJATA2xhw==} + '@graphql-tools/load@8.1.10': + resolution: {integrity: sha512-hjcvfEFtwtc8vGi46wtpmGWadNzfEhzbjqinyFIZuIZPlR4aYdWQtqWtY/RMM4Ew4t1USkMNm6xrqC2TH1vCSA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/load@8.1.8': - resolution: {integrity: sha512-gxO662b64qZSToK3N6XUxWG5E6HOUjlg5jEnmGvD4bMtGJ0HwEe/BaVZbBQemCfLkxYjwRIBiVfOY9o0JyjZJg==} + '@graphql-tools/merge@9.0.24': + resolution: {integrity: sha512-NzWx/Afl/1qHT3Nm1bghGG2l4jub28AdvtG11PoUlmjcIjnFBJMv4vqL0qnxWe8A82peWo4/TkVdjJRLXwgGEw==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/merge@9.1.7': - resolution: {integrity: sha512-Y5E1vTbTabvcXbkakdFUt4zUIzB1fyaEnVmIWN0l0GMed2gdD01TpZWLUm4RNAxpturvolrb24oGLQrBbPLSoQ==} + '@graphql-tools/merge@9.1.9': + resolution: {integrity: sha512-iHUWNjRHeQRYdgIMIuChThOwoKzA9vrzYeslgfBo5eUYEyHGZCoDPjAavssoYXLwstYt1dZj2J22jSzc2DrN0Q==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -789,26 +877,38 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/relay-operation-optimizer@7.1.3': - resolution: {integrity: sha512-Vzh5QORIqX0KtwxgNepl/T16a85Br7YbOxxxmnyVpS7yza9vBjkrERbvAwADcYyPH7kyShmH1Gu5+88+vCVhuA==} + '@graphql-tools/relay-operation-optimizer@7.0.19': + resolution: {integrity: sha512-xnjLpfzw63yIX1bo+BVh4j1attSwqEkUbpJ+HAhdiSUa3FOQFfpWgijRju+3i87CwhjBANqdTZbcsqLT1hEXig==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/relay-operation-optimizer@7.1.4': + resolution: {integrity: sha512-cwOD/GEo/R//1uGCP0/urIxsMFoUgzkJVyMt9BDM2HhQhU6rSgH5l6lFukAFTJyPJVdyeOdYm2i0Jj5vYWbHTw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/schema@10.0.23': + resolution: {integrity: sha512-aEGVpd1PCuGEwqTXCStpEkmheTHNdMayiIKH1xDWqYp9i8yKv9FRDgkGrY4RD8TNxnf7iII+6KOBGaJ3ygH95A==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/schema@10.0.31': - resolution: {integrity: sha512-ZewRgWhXef6weZ0WiP7/MV47HXiuFbFpiDUVLQl6mgXsWSsGELKFxQsyUCBos60Qqy1JEFAIu3Ns6GGYjGkqkQ==} + '@graphql-tools/schema@10.0.33': + resolution: {integrity: sha512-O6P3RIftO0jafnSsFAqpjurUuUxJ43s/AdPVLQsBkI6y4Ic/tKm4C1Qm1KKQsCDTOxXPJClh/v3g7k7yLKCFBQ==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/url-loader@9.0.6': - resolution: {integrity: sha512-QdJI3f7ANDMYfYazRgJzzybznjOrQAOuDXweC9xmKgPZoTqNxEAsatiy69zcpTf6092taJLyrqRH6R7xUTzf4A==} + '@graphql-tools/url-loader@9.1.2': + resolution: {integrity: sha512-pVSiPrfWQKb3jq23Pl7EjbB2uv3tgZLnWo/axkmg4itAEZ5s/vV/jKa8P1HZzUnSVUTR+8tcEZVeNsUbzFCbkg==} engines: {node: '>=20.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/utils@10.11.0': - resolution: {integrity: sha512-iBFR9GXIs0gCD+yc3hoNswViL1O5josI33dUqiNStFI/MHLCEPduasceAcazRH77YONKNiviHBV8f7OgcT4o2Q==} + '@graphql-tools/utils@10.9.1': + resolution: {integrity: sha512-B1wwkXk9UvU7LCBkPs8513WxOQ2H8Fo5p8HR1+Id9WmYE5+bd51vqN+MbrqvWczHCH2gwkREgHJN88tE0n1FCw==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -819,8 +919,8 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/wrap@11.1.8': - resolution: {integrity: sha512-VnU7K6IDvj7kM9Viz6oAQNc6lV380u7oOG1hYau5pzHB+h1VrTYg/jHXNtWrXwB88lhCgGHjrQCJJt4wz4QdQQ==} + '@graphql-tools/wrap@11.1.14': + resolution: {integrity: sha512-ebSVT7apxr+88q3Wy0i4AyRmJ42I0SuMqjPIn1fqW14yCTQRZG8YLuIALG1gKR936+GkfMLOrADh6egJvdlN6Q==} engines: {node: '>=20.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -1073,16 +1173,33 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@kamilkisiela/fast-url-parser@1.1.4': + resolution: {integrity: sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew==} + '@napi-rs/wasm-runtime@0.2.11': resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} @@ -1113,141 +1230,114 @@ packages: '@repeaterjs/repeater@3.0.6': resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==} - '@rollup/rollup-android-arm-eabi@4.60.2': - resolution: {integrity: sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==} + '@rollup/rollup-android-arm-eabi@4.43.0': + resolution: {integrity: sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.60.2': - resolution: {integrity: sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==} + '@rollup/rollup-android-arm64@4.43.0': + resolution: {integrity: sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.60.2': - resolution: {integrity: sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==} + '@rollup/rollup-darwin-arm64@4.43.0': + resolution: {integrity: sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.60.2': - resolution: {integrity: sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==} + '@rollup/rollup-darwin-x64@4.43.0': + resolution: {integrity: sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.60.2': - resolution: {integrity: sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==} + '@rollup/rollup-freebsd-arm64@4.43.0': + resolution: {integrity: sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.60.2': - resolution: {integrity: sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==} + '@rollup/rollup-freebsd-x64@4.43.0': + resolution: {integrity: sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.60.2': - resolution: {integrity: sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==} + '@rollup/rollup-linux-arm-gnueabihf@4.43.0': + resolution: {integrity: sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.60.2': - resolution: {integrity: sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==} + '@rollup/rollup-linux-arm-musleabihf@4.43.0': + resolution: {integrity: sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.60.2': - resolution: {integrity: sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==} + '@rollup/rollup-linux-arm64-gnu@4.43.0': + resolution: {integrity: sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.60.2': - resolution: {integrity: sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==} + '@rollup/rollup-linux-arm64-musl@4.43.0': + resolution: {integrity: sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.60.2': - resolution: {integrity: sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==} + '@rollup/rollup-linux-loongarch64-gnu@4.43.0': + resolution: {integrity: sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.60.2': - resolution: {integrity: sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==} - cpu: [loong64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-ppc64-gnu@4.60.2': - resolution: {integrity: sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': + resolution: {integrity: sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.60.2': - resolution: {integrity: sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==} - cpu: [ppc64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-riscv64-gnu@4.60.2': - resolution: {integrity: sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==} + '@rollup/rollup-linux-riscv64-gnu@4.43.0': + resolution: {integrity: sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.60.2': - resolution: {integrity: sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==} + '@rollup/rollup-linux-riscv64-musl@4.43.0': + resolution: {integrity: sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.60.2': - resolution: {integrity: sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==} + '@rollup/rollup-linux-s390x-gnu@4.43.0': + resolution: {integrity: sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.60.2': - resolution: {integrity: sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==} + '@rollup/rollup-linux-x64-gnu@4.43.0': + resolution: {integrity: sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.60.2': - resolution: {integrity: sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==} + '@rollup/rollup-linux-x64-musl@4.43.0': + resolution: {integrity: sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.60.2': - resolution: {integrity: sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==} - cpu: [x64] - os: [openbsd] - - '@rollup/rollup-openharmony-arm64@4.60.2': - resolution: {integrity: sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==} - cpu: [arm64] - os: [openharmony] - - '@rollup/rollup-win32-arm64-msvc@4.60.2': - resolution: {integrity: sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==} + '@rollup/rollup-win32-arm64-msvc@4.43.0': + resolution: {integrity: sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.60.2': - resolution: {integrity: sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==} + '@rollup/rollup-win32-ia32-msvc@4.43.0': + resolution: {integrity: sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.60.2': - resolution: {integrity: sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==} - cpu: [x64] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.60.2': - resolution: {integrity: sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==} + '@rollup/rollup-win32-x64-msvc@4.43.0': + resolution: {integrity: sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==} cpu: [x64] os: [win32] @@ -1261,11 +1351,8 @@ packages: '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - '@sinonjs/fake-timers@15.1.1': - resolution: {integrity: sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==} - - '@standard-schema/spec@1.1.0': - resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@sinonjs/fake-timers@15.3.2': + resolution: {integrity: sha512-mrn35Jl2pCpns+mE3HaZa1yPN5EYCRgiMI+135COjr2hr8Cls9DXqIZ57vZe2cz7y2XVSq92tcs6kGQcT1J8Rw==} '@stylistic/eslint-plugin@5.10.0': resolution: {integrity: sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==} @@ -1291,8 +1378,8 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - '@types/chai@5.2.3': - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -1303,6 +1390,9 @@ packages: '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1351,117 +1441,69 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@8.58.2': - resolution: {integrity: sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==} + '@typescript-eslint/eslint-plugin@8.59.0': + resolution: {integrity: sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.58.2 + '@typescript-eslint/parser': ^8.59.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.56.1': - resolution: {integrity: sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/parser@8.58.2': - resolution: {integrity: sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==} + '@typescript-eslint/parser@8.59.0': + resolution: {integrity: sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.56.1': - resolution: {integrity: sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/project-service@8.58.2': - resolution: {integrity: sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==} + '@typescript-eslint/project-service@8.59.0': + resolution: {integrity: sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/rule-tester@8.56.1': - resolution: {integrity: sha512-EWuV5Vq1EFYJEOVcILyWPO35PjnT0c6tv99PCpD12PgfZae5/Jo+F17hGjsEs2Moe+Dy1J7KIr8y037cK8+/rQ==} + '@typescript-eslint/rule-tester@8.59.0': + resolution: {integrity: sha512-2Ej6W28DqObFuEUQ+puEpDZFWFXAW7jIZ4TsgfLUCTNz1FID0NMfp1sXc+fQq8m5ysfPdhXAPjti6jYEu1oRcg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - '@typescript-eslint/scope-manager@8.56.1': - resolution: {integrity: sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/scope-manager@8.58.2': - resolution: {integrity: sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.56.1': - resolution: {integrity: sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==} + '@typescript-eslint/scope-manager@8.59.0': + resolution: {integrity: sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/tsconfig-utils@8.58.2': - resolution: {integrity: sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==} + '@typescript-eslint/tsconfig-utils@8.59.0': + resolution: {integrity: sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.58.2': - resolution: {integrity: sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==} + '@typescript-eslint/type-utils@8.59.0': + resolution: {integrity: sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.56.1': - resolution: {integrity: sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.57.1': - resolution: {integrity: sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==} + '@typescript-eslint/types@8.59.0': + resolution: {integrity: sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.58.2': - resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.56.1': - resolution: {integrity: sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/typescript-estree@8.58.2': - resolution: {integrity: sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==} + '@typescript-eslint/typescript-estree@8.59.0': + resolution: {integrity: sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.56.1': - resolution: {integrity: sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/utils@8.58.2': - resolution: {integrity: sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==} + '@typescript-eslint/utils@8.59.0': + resolution: {integrity: sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.56.1': - resolution: {integrity: sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.58.2': - resolution: {integrity: sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==} + '@typescript-eslint/visitor-keys@8.59.0': + resolution: {integrity: sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -1576,34 +1618,34 @@ packages: vitest: optional: true - '@vitest/expect@4.1.5': - resolution: {integrity: sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/mocker@4.1.5': - resolution: {integrity: sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==} + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@4.1.5': - resolution: {integrity: sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==} + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/runner@4.1.5': - resolution: {integrity: sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==} + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - '@vitest/snapshot@4.1.5': - resolution: {integrity: sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==} + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} - '@vitest/spy@4.1.5': - resolution: {integrity: sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/utils@4.1.5': - resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} '@vue/compiler-core@3.5.12': resolution: {integrity: sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==} @@ -1624,12 +1666,20 @@ packages: resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==} engines: {node: '>=18.0.0'} + '@whatwg-node/fetch@0.10.1': + resolution: {integrity: sha512-gmPOLrsjSZWEZlr9Oe5+wWFBq3CG6fN13rGlM91Jsj/vZ95G9CCvrORGBAxMXy0AJGiC83aYiHXn3JzTzXQmbA==} + engines: {node: '>=18.0.0'} + '@whatwg-node/fetch@0.10.13': resolution: {integrity: sha512-b4PhJ+zYj4357zwk4TTuF2nEe0vVtOrwdsrNo5hL+u1ojXNhh1FgJ6pg1jzDlwlT4oBdzfSwaBwMCtFCsIWg8Q==} engines: {node: '>=18.0.0'} - '@whatwg-node/node-fetch@0.8.4': - resolution: {integrity: sha512-AlKLc57loGoyYlrzDbejB9EeR+pfdJdGzbYnkEuZaGekFboBwzfVYVMsy88PMriqPI1ORpiGYGgSSWpx7a2sDA==} + '@whatwg-node/node-fetch@0.7.2': + resolution: {integrity: sha512-OAAEIbyspvQwkcRGutYN3D0a+hzQogvcZ7I3hf6vg742ZEq52yMJTGtkwjl3KZRmzzUltd/oEMxEGsXFLjnuLQ==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/node-fetch@0.8.5': + resolution: {integrity: sha512-4xzCl/zphPqlp9tASLVeUhB5+WJHbuWGYpfoC2q1qh5dw0AqZBW7L27V5roxYWijPxj4sspRAAoOH3d2ztaHUQ==} engines: {node: '>=18.0.0'} '@whatwg-node/promise-helpers@1.3.2': @@ -1641,14 +1691,16 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + acorn@8.16.0: resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} - ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} @@ -1664,8 +1716,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} ansi-styles@4.3.0: @@ -1680,10 +1732,6 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - ansis@4.2.0: resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} engines: {node: '>=14'} @@ -1706,6 +1754,9 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -1746,11 +1797,15 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - baseline-browser-mapping@2.10.8: - resolution: {integrity: sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==} + baseline-browser-mapping@2.10.21: + resolution: {integrity: sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==} engines: {node: '>=6.0.0'} hasBin: true + baseline-browser-mapping@2.8.6: + resolution: {integrity: sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==} + hasBin: true + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -1768,8 +1823,13 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + browserslist@4.26.2: + resolution: {integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1787,6 +1847,14 @@ packages: resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} engines: {node: '>=18.20'} + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + cac@7.0.0: resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} engines: {node: '>=20.19.0'} @@ -1806,8 +1874,11 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001780: - resolution: {integrity: sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==} + caniuse-lite@1.0.30001743: + resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} + + caniuse-lite@1.0.30001790: + resolution: {integrity: sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==} capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -1815,8 +1886,8 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@6.2.2: - resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} chalk@4.1.2: @@ -1842,6 +1913,14 @@ packages: chardet@2.1.0: resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} + engines: {node: '>= 16'} + + ci-info@4.3.0: + resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} + engines: {node: '>=8'} + ci-info@4.4.0: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} @@ -1890,6 +1969,10 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + comment-parser@1.4.5: resolution: {integrity: sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw==} engines: {node: '>= 12.0.0'} @@ -1908,8 +1991,8 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - confbox@0.2.4: - resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} constant-case@3.0.4: resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} @@ -1938,6 +2021,9 @@ packages: typescript: optional: true + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + cross-inspect@1.0.1: resolution: {integrity: sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==} engines: {node: '>=16.0.0'} @@ -1971,8 +2057,8 @@ packages: supports-color: optional: true - decode-named-character-reference@1.3.0: - resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} dedent@1.6.0: resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} @@ -1982,6 +2068,10 @@ packages: babel-plugin-macros: optional: true + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -2019,18 +2109,25 @@ packages: dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.321: - resolution: {integrity: sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==} + electron-to-chromium@1.5.222: + resolution: {integrity: sha512-gA7psSwSwQRE60CEoLz6JBCQPIxNeuzB2nL8vE03GK/OHxlvykbLyeiumQy1iH5C2f3YbRAZpGCMT12a/9ih9w==} + + electron-to-chromium@1.5.344: + resolution: {integrity: sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} - emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + emoji-regex@10.5.0: + resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2042,8 +2139,8 @@ packages: resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} engines: {node: '>=14'} - enhanced-resolve@5.20.1: - resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} entities@4.5.0: @@ -2061,11 +2158,11 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-module-lexer@2.0.0: - resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - esbuild@0.27.7: - resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + esbuild@0.25.5: + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} engines: {node: '>=18'} hasBin: true @@ -2209,8 +2306,8 @@ packages: '@typescript-eslint/eslint-plugin': optional: true - eslint-plugin-vue@10.8.0: - resolution: {integrity: sha512-f1J/tcbnrpgC8suPN5AtdJ5MQjuXbSU9pGRSSYAuF3SHoiYCOdEX6O22pLaRyLHXvDcOe+O5ENgc1owQ587agA==} + eslint-plugin-vue@10.9.0: + resolution: {integrity: sha512-EFNNzu4HqtTRb5DJINpyd+u3bDdzETWDMpCzG+UBHz1tpsnMDCeOcf61u4Wy/cbXnMymK+MT9bjH7KcG1fItSw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@stylistic/eslint-plugin': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 @@ -2235,6 +2332,10 @@ packages: '@vue/compiler-sfc': ^3.3.0 eslint: '>=9.0.0' + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@9.1.2: resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -2274,6 +2375,10 @@ packages: engines: {node: '>=4'} hasBin: true + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + esquery@1.7.0: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} @@ -2315,8 +2420,11 @@ packages: resolution: {integrity: sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - exsolve@1.0.8: - resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2331,6 +2439,9 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + fast-string-truncated-width@1.2.1: resolution: {integrity: sha512-Q9acT/+Uu3GwGj+5w/zsGuQjh9O1TyywhIwAxHudtWrgF09nHOPrvTLhQevPbttcxjr/SNN7mJmfOw/B1bXgow==} @@ -2349,6 +2460,12 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + + fbjs@3.0.5: + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -2429,8 +2546,8 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-tsconfig@4.13.6: - resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -2493,27 +2610,24 @@ packages: peerDependencies: graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - graphql-ws@6.0.6: - resolution: {integrity: sha512-zgfER9s+ftkGKUZgc0xbx8T7/HMO4AV5/YuYiFc+AtgcO5T0v8AxYYNQ+ltzuzDZgNkYJaFspm5MMYLjQzrkmw==} + graphql-ws@6.0.8: + resolution: {integrity: sha512-m3EOaNsUBXwAnkBWbzPfe0Nq8pXUfxsWnolC54sru3FzHvhTZL0Ouf/BoQsaGAXqM+YPerXOJ47BUnmgmoupCw==} engines: {node: '>=20'} peerDependencies: '@fastify/websocket': ^10 || ^11 crossws: ~0.3 graphql: ^15.10.1 || ^16 - uWebSockets.js: ^20 ws: ^8 peerDependenciesMeta: '@fastify/websocket': optional: true crossws: optional: true - uWebSockets.js: - optional: true ws: optional: true - graphql@16.13.2: - resolution: {integrity: sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==} + graphql@16.11.0: + resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} handlebars@4.7.9: @@ -2550,6 +2664,10 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} + immutable@3.7.6: + resolution: {integrity: sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==} + engines: {node: '>=0.8.0'} + immutable@5.1.5: resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} @@ -2824,6 +2942,9 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -2935,6 +3056,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lower-case-first@2.0.2: resolution: {integrity: sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==} @@ -2970,8 +3094,8 @@ packages: mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} - mdast-util-from-markdown@2.0.3: - resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} mdast-util-frontmatter@2.0.1: resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} @@ -3132,8 +3256,8 @@ packages: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} - minimatch@3.1.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} @@ -3146,8 +3270,8 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - mlly@1.8.1: - resolution: {integrity: sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==} + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} module-replacements@2.11.0: resolution: {integrity: sha512-j5sNQm3VCpQQ7nTqGeOZtoJtV3uKERgCBm9QRhmGRiXiqkf7iRFOkfxdJRZWLkqYY8PNf4cDQF/WfXUYLENrRA==} @@ -3190,6 +3314,15 @@ packages: engines: {node: '>=10.5.0'} deprecated: Use your platform's native DOMException instead + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-fetch@3.3.2: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3197,8 +3330,11 @@ packages: node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.36: - resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} + node-releases@2.0.21: + resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} + + node-releases@2.0.38: + resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} normalize-path@2.1.1: resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} @@ -3224,12 +3360,16 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + object-deep-merge@2.0.0: resolution: {integrity: sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==} - obug@2.1.1: - resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -3268,8 +3408,8 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-manager-detector@1.6.0: - resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + package-manager-detector@1.3.0: + resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} @@ -3333,19 +3473,23 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} picomatch@4.0.2: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} pidtree@0.6.0: @@ -3390,6 +3534,9 @@ packages: resolution: {integrity: sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + property-expr@2.0.6: resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} @@ -3417,6 +3564,9 @@ packages: resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + regexp-ast-analysis@0.7.1: resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -3425,10 +3575,13 @@ packages: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true - regjsparser@0.13.0: - resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} + regjsparser@0.13.1: + resolution: {integrity: sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==} hasBin: true + relay-runtime@12.0.0: + resolution: {integrity: sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==} + remedial@1.0.8: resolution: {integrity: sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==} @@ -3472,8 +3625,8 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.60.2: - resolution: {integrity: sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==} + rollup@4.43.0: + resolution: {integrity: sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3491,6 +3644,11 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + semver@7.7.4: resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} @@ -3499,6 +3657,9 @@ packages: sentence-case@3.0.4: resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -3520,6 +3681,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + signedsource@1.0.0: + resolution: {integrity: sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -3555,8 +3719,8 @@ packages: spdx-expression-parse@4.0.0: resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - spdx-license-ids@3.0.23: - resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} sponge-case@1.0.1: resolution: {integrity: sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==} @@ -3571,8 +3735,12 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@4.1.0: - resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} string-env-interpolation@1.0.1: resolution: {integrity: sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==} @@ -3597,8 +3765,8 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} strip-bom@4.0.0: @@ -3617,6 +3785,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -3632,12 +3803,16 @@ packages: resolution: {integrity: sha512-IELLEvzHuCfc1uTsshPK58ViSdNqXxlml1U+fmwJIKLYKOr/rAtBrorE2RYm5IHaMpDNlmC0fr1LAvdXvyheEQ==} engines: {node: '>=18'} + synckit@0.11.11: + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.11.12: resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} engines: {node: ^14.18.0 || >=16.0.0} - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + tapable@2.2.3: + resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} engines: {node: '>=6'} test-exclude@6.0.0: @@ -3654,16 +3829,26 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@1.1.1: - resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} - engines: {node: '>=18'} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinyrainbow@3.1.0: - resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} title-case@3.0.3: @@ -3687,6 +3872,9 @@ packages: toposort@2.0.2: resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} @@ -3732,6 +3920,9 @@ packages: ts-log@2.2.7: resolution: {integrity: sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg==} + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -3760,8 +3951,12 @@ packages: engines: {node: '>=14.17'} hasBin: true - ufo@1.6.3: - resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + ua-parser-js@1.0.40: + resolution: {integrity: sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==} + hasBin: true + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} @@ -3775,8 +3970,8 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - unist-util-is@6.0.1: - resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} unist-util-remove-position@5.0.0: resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} @@ -3784,11 +3979,11 @@ packages: unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - unist-util-visit-parents@6.0.2: - resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - unist-util-visit@5.1.0: - resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} unixify@1.0.0: resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} @@ -3797,6 +3992,12 @@ packages: unrs-resolver@1.7.13: resolution: {integrity: sha512-QUjCYKAgrdJpf3wA73zWjOrO7ra19lfnwQ8HRkNOLah5AVDqOS38UunnyhzsSL8AE+2/AGnAHxlr8cGshCP35A==} + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true @@ -3830,19 +4031,24 @@ packages: typescript: optional: true - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} - engines: {node: ^20.19.0 || >=22.12.0} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@6.3.5: + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 jiti: '>=1.21.0' - less: ^4.0.0 + less: '*' lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 @@ -3870,39 +4076,26 @@ packages: yaml: optional: true - vitest@4.1.5: - resolution: {integrity: sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==} - engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@opentelemetry/api': ^1.9.0 - '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.5 - '@vitest/browser-preview': 4.1.5 - '@vitest/browser-webdriverio': 4.1.5 - '@vitest/coverage-istanbul': 4.1.5 - '@vitest/coverage-v8': 4.1.5 - '@vitest/ui': 4.1.5 + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 happy-dom: '*' jsdom: '*' - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true - '@opentelemetry/api': + '@types/debug': optional: true '@types/node': optional: true - '@vitest/browser-playwright': - optional: true - '@vitest/browser-preview': - optional: true - '@vitest/browser-webdriverio': - optional: true - '@vitest/coverage-istanbul': - optional: true - '@vitest/coverage-v8': + '@vitest/browser': optional: true '@vitest/ui': optional: true @@ -3924,10 +4117,16 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -3973,8 +4172,8 @@ packages: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + ws@8.20.0: + resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -4000,8 +4199,13 @@ packages: resolution: {integrity: sha512-h0uDm97wvT2bokfwwTmY6kJ1hp6YDFL0nRHwNKz8s/VD1FH/vvZjAKoMUE+un0eaYBSG7/c6h+lJTP+31tjgTw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - yaml@2.8.2: - resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + + yaml@2.8.3: + resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} engines: {node: '>= 14.6'} hasBin: true @@ -4034,10 +4238,10 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 - '@antfu/eslint-config@8.2.0(@typescript-eslint/rule-tester@8.56.1(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.3))(@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.12)(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)(vitest@4.1.5(@types/node@24.12.2)(vite@7.3.1(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.2)))': + '@antfu/eslint-config@8.2.0(@typescript-eslint/rule-tester@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(@typescript-eslint/typescript-estree@8.59.0(typescript@6.0.3))(@typescript-eslint/utils@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.12)(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.3))': dependencies: '@antfu/install-pkg': 1.1.0 '@clack/prompts': 1.2.0 @@ -4045,9 +4249,9 @@ snapshots: '@eslint-community/eslint-plugin-eslint-comments': 4.7.1(eslint@10.2.1(jiti@2.4.0)) '@eslint/markdown': 8.0.1 '@stylistic/eslint-plugin': 5.10.0(eslint@10.2.1(jiti@2.4.0)) - '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) - '@typescript-eslint/parser': 8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) - '@vitest/eslint-plugin': 1.6.16(@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)(vitest@4.1.5(@types/node@24.12.2)(vite@7.3.1(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.2))) + '@typescript-eslint/eslint-plugin': 8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) + '@vitest/eslint-plugin': 1.6.16(@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.3)) ansis: 4.2.0 cac: 7.0.0 eslint: 10.2.1(jiti@2.4.0) @@ -4055,7 +4259,7 @@ snapshots: eslint-flat-config-utils: 3.1.0 eslint-merge-processors: 2.0.0(eslint@10.2.1(jiti@2.4.0)) eslint-plugin-antfu: 3.2.2(eslint@10.2.1(jiti@2.4.0)) - eslint-plugin-command: 3.5.2(@typescript-eslint/rule-tester@8.56.1(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.3))(@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0)) + eslint-plugin-command: 3.5.2(@typescript-eslint/rule-tester@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(@typescript-eslint/typescript-estree@8.59.0(typescript@6.0.3))(@typescript-eslint/utils@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0)) eslint-plugin-import-lite: 0.6.0(eslint@10.2.1(jiti@2.4.0)) eslint-plugin-jsdoc: 62.9.0(eslint@10.2.1(jiti@2.4.0)) eslint-plugin-jsonc: 3.1.2(eslint@10.2.1(jiti@2.4.0)) @@ -4066,8 +4270,8 @@ snapshots: eslint-plugin-regexp: 3.1.0(eslint@10.2.1(jiti@2.4.0)) eslint-plugin-toml: 1.3.1(eslint@10.2.1(jiti@2.4.0)) eslint-plugin-unicorn: 64.0.0(eslint@10.2.1(jiti@2.4.0)) - eslint-plugin-unused-imports: 4.4.1(@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0)) - eslint-plugin-vue: 10.8.0(@stylistic/eslint-plugin@5.10.0(eslint@10.2.1(jiti@2.4.0)))(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(vue-eslint-parser@10.4.0(eslint@10.2.1(jiti@2.4.0))) + eslint-plugin-unused-imports: 4.4.1(@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0)) + eslint-plugin-vue: 10.9.0(@stylistic/eslint-plugin@5.10.0(eslint@10.2.1(jiti@2.4.0)))(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(vue-eslint-parser@10.4.0(eslint@10.2.1(jiti@2.4.0))) eslint-plugin-yml: 3.3.1(eslint@10.2.1(jiti@2.4.0)) eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.12)(eslint@10.2.1(jiti@2.4.0)) globals: 17.5.0 @@ -4089,13 +4293,29 @@ snapshots: '@antfu/install-pkg@1.1.0': dependencies: - package-manager-detector: 1.6.0 - tinyexec: 1.1.1 + package-manager-detector: 1.3.0 + tinyexec: 1.0.1 - '@ardatan/relay-compiler@13.0.1(graphql@16.13.2)': + '@ardatan/relay-compiler@12.0.3(graphql@16.11.0)': + dependencies: + '@babel/generator': 7.27.5 + '@babel/parser': 7.28.4 + '@babel/runtime': 7.27.0 + chalk: 4.1.2 + fb-watchman: 2.0.2 + graphql: 16.11.0 + immutable: 3.7.6 + invariant: 2.2.4 + nullthrows: 1.1.1 + relay-runtime: 12.0.0 + signedsource: 1.0.0 + transitivePeerDependencies: + - encoding + + '@ardatan/relay-compiler@13.0.1(graphql@16.11.0)': dependencies: '@babel/runtime': 7.29.2 - graphql: 16.13.2 + graphql: 16.11.0 immutable: 5.1.5 invariant: 2.2.4 @@ -4105,17 +4325,25 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.27.5': {} + '@babel/compat-data@7.29.0': {} + '@babel/core@7.27.4': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 - '@babel/generator': 7.29.1 + '@babel/generator': 7.27.5 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) '@babel/helpers': 7.27.6 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/template': 7.27.2 '@babel/traverse': 7.27.4 '@babel/types': 7.29.0 @@ -4127,6 +4355,34 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.2 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.27.5': + dependencies: + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + '@babel/generator@7.29.1': dependencies: '@babel/parser': 7.29.2 @@ -4139,10 +4395,20 @@ snapshots: dependencies: '@babel/compat-data': 7.27.5 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 + browserslist: 4.26.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.29.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.26.2 lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-globals@7.28.0': {} + '@babel/helper-module-imports@7.27.1': dependencies: '@babel/traverse': 7.27.4 @@ -4150,6 +4416,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 @@ -4159,6 +4432,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-plugin-utils@7.27.1': {} '@babel/helper-string-parser@7.27.1': {} @@ -4172,11 +4454,16 @@ snapshots: '@babel/template': 7.27.2 '@babel/types': 7.29.0 - '@babel/parser@7.29.0': + '@babel/helpers@7.29.2': dependencies: + '@babel/template': 7.28.6 '@babel/types': 7.29.0 - '@babel/parser@7.29.2': + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + + '@babel/parser@7.29.2': dependencies: '@babel/types': 7.29.0 @@ -4185,24 +4472,48 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.27.4)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.27.4)': @@ -4210,16 +4521,34 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 @@ -4230,46 +4559,98 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/runtime@7.27.0': + dependencies: + regenerator-runtime: 0.14.1 + '@babel/runtime@7.29.2': {} '@babel/template@7.27.2': @@ -4278,10 +4659,16 @@ snapshots: '@babel/parser': 7.29.2 '@babel/types': 7.29.0 + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + '@babel/traverse@7.27.4': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.29.1 + '@babel/generator': 7.27.5 '@babel/parser': 7.29.2 '@babel/template': 7.27.2 '@babel/types': 7.29.0 @@ -4290,6 +4677,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.2 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -4331,7 +4735,7 @@ snapshots: tslib: 2.8.1 optional: true - '@envelop/core@5.4.0': + '@envelop/core@5.5.1': dependencies: '@envelop/instrumentation': 1.0.0 '@envelop/types': 5.2.1 @@ -4351,7 +4755,7 @@ snapshots: '@es-joy/jsdoccomment@0.84.0': dependencies: '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.57.1 + '@typescript-eslint/types': 8.59.0 comment-parser: 1.4.5 esquery: 1.7.0 jsdoc-type-pratt-parser: 7.1.1 @@ -4359,89 +4763,86 @@ snapshots: '@es-joy/jsdoccomment@0.86.0': dependencies: '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/types': 8.59.0 comment-parser: 1.4.6 esquery: 1.7.0 jsdoc-type-pratt-parser: 7.2.0 '@es-joy/resolve.exports@1.2.0': {} - '@esbuild/aix-ppc64@0.27.7': + '@esbuild/aix-ppc64@0.25.5': optional: true - '@esbuild/android-arm64@0.27.7': + '@esbuild/android-arm64@0.25.5': optional: true - '@esbuild/android-arm@0.27.7': + '@esbuild/android-arm@0.25.5': optional: true - '@esbuild/android-x64@0.27.7': + '@esbuild/android-x64@0.25.5': optional: true - '@esbuild/darwin-arm64@0.27.7': + '@esbuild/darwin-arm64@0.25.5': optional: true - '@esbuild/darwin-x64@0.27.7': + '@esbuild/darwin-x64@0.25.5': optional: true - '@esbuild/freebsd-arm64@0.27.7': + '@esbuild/freebsd-arm64@0.25.5': optional: true - '@esbuild/freebsd-x64@0.27.7': + '@esbuild/freebsd-x64@0.25.5': optional: true - '@esbuild/linux-arm64@0.27.7': + '@esbuild/linux-arm64@0.25.5': optional: true - '@esbuild/linux-arm@0.27.7': + '@esbuild/linux-arm@0.25.5': optional: true - '@esbuild/linux-ia32@0.27.7': + '@esbuild/linux-ia32@0.25.5': optional: true - '@esbuild/linux-loong64@0.27.7': + '@esbuild/linux-loong64@0.25.5': optional: true - '@esbuild/linux-mips64el@0.27.7': + '@esbuild/linux-mips64el@0.25.5': optional: true - '@esbuild/linux-ppc64@0.27.7': + '@esbuild/linux-ppc64@0.25.5': optional: true - '@esbuild/linux-riscv64@0.27.7': + '@esbuild/linux-riscv64@0.25.5': optional: true - '@esbuild/linux-s390x@0.27.7': + '@esbuild/linux-s390x@0.25.5': optional: true - '@esbuild/linux-x64@0.27.7': + '@esbuild/linux-x64@0.25.5': optional: true - '@esbuild/netbsd-arm64@0.27.7': + '@esbuild/netbsd-arm64@0.25.5': optional: true - '@esbuild/netbsd-x64@0.27.7': + '@esbuild/netbsd-x64@0.25.5': optional: true - '@esbuild/openbsd-arm64@0.27.7': + '@esbuild/openbsd-arm64@0.25.5': optional: true - '@esbuild/openbsd-x64@0.27.7': + '@esbuild/openbsd-x64@0.25.5': optional: true - '@esbuild/openharmony-arm64@0.27.7': + '@esbuild/sunos-x64@0.25.5': optional: true - '@esbuild/sunos-x64@0.27.7': + '@esbuild/win32-arm64@0.25.5': optional: true - '@esbuild/win32-arm64@0.27.7': + '@esbuild/win32-ia32@0.25.5': optional: true - '@esbuild/win32-ia32@0.27.7': - optional: true - - '@esbuild/win32-x64@0.27.7': + '@esbuild/win32-x64@0.25.5': optional: true '@eslint-community/eslint-plugin-eslint-comments@4.7.1(eslint@10.2.1(jiti@2.4.0))': @@ -4450,14 +4851,21 @@ snapshots: eslint: 10.2.1(jiti@2.4.0) ignore: 7.0.5 + '@eslint-community/eslint-utils@4.9.0(eslint@10.2.1(jiti@2.4.0))': + dependencies: + eslint: 10.2.1(jiti@2.4.0) + eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.9.1(eslint@10.2.1(jiti@2.4.0))': dependencies: eslint: 10.2.1(jiti@2.4.0) eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.1': {} + '@eslint-community/regexpp@4.12.2': {} - '@eslint/compat@2.0.3(eslint@10.2.1(jiti@2.4.0))': + '@eslint/compat@2.0.5(eslint@10.2.1(jiti@2.4.0))': dependencies: '@eslint/core': 1.2.1 optionalDependencies: @@ -4484,7 +4892,7 @@ snapshots: '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.6.1 github-slugger: 2.0.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.2 mdast-util-frontmatter: 2.0.1 mdast-util-gfm: 3.1.0 mdast-util-math: 3.0.0 @@ -4509,38 +4917,38 @@ snapshots: '@fastify/busboy@3.2.0': {} - '@graphql-codegen/add@6.0.1(graphql@16.13.2)': + '@graphql-codegen/add@6.0.1(graphql@16.11.0)': dependencies: - '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.13.2) - graphql: 16.13.2 + '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.11.0) + graphql: 16.11.0 tslib: 2.8.1 - '@graphql-codegen/cli@6.3.1(@types/node@24.12.2)(graphql@16.13.2)(typescript@6.0.3)': + '@graphql-codegen/cli@6.3.1(@types/node@24.12.2)(graphql@16.11.0)(typescript@6.0.3)': dependencies: - '@babel/generator': 7.29.1 + '@babel/generator': 7.27.5 '@babel/template': 7.27.2 '@babel/types': 7.29.0 - '@graphql-codegen/client-preset': 5.3.0(graphql@16.13.2) - '@graphql-codegen/core': 5.0.2(graphql@16.13.2) - '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.13.2) - '@graphql-tools/apollo-engine-loader': 8.0.28(graphql@16.13.2) - '@graphql-tools/code-file-loader': 8.1.28(graphql@16.13.2) - '@graphql-tools/git-loader': 8.0.32(graphql@16.13.2) - '@graphql-tools/github-loader': 9.0.6(@types/node@24.12.2)(graphql@16.13.2) - '@graphql-tools/graphql-file-loader': 8.1.12(graphql@16.13.2) - '@graphql-tools/json-file-loader': 8.0.26(graphql@16.13.2) - '@graphql-tools/load': 8.1.8(graphql@16.13.2) - '@graphql-tools/merge': 9.1.7(graphql@16.13.2) - '@graphql-tools/url-loader': 9.0.6(@types/node@24.12.2)(graphql@16.13.2) - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) + '@graphql-codegen/client-preset': 5.3.0(graphql@16.11.0) + '@graphql-codegen/core': 5.0.2(graphql@16.11.0) + '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.11.0) + '@graphql-tools/apollo-engine-loader': 8.0.30(graphql@16.11.0) + '@graphql-tools/code-file-loader': 8.1.32(graphql@16.11.0) + '@graphql-tools/git-loader': 8.0.36(graphql@16.11.0) + '@graphql-tools/github-loader': 9.1.2(@types/node@24.12.2)(graphql@16.11.0) + '@graphql-tools/graphql-file-loader': 8.1.14(graphql@16.11.0) + '@graphql-tools/json-file-loader': 8.0.28(graphql@16.11.0) + '@graphql-tools/load': 8.1.10(graphql@16.11.0) + '@graphql-tools/merge': 9.0.24(graphql@16.11.0) + '@graphql-tools/url-loader': 9.1.2(@types/node@24.12.2)(graphql@16.11.0) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) '@inquirer/prompts': 7.8.4(@types/node@24.12.2) - '@whatwg-node/fetch': 0.10.13 + '@whatwg-node/fetch': 0.10.1 chalk: 4.1.2 cosmiconfig: 9.0.0(typescript@6.0.3) debounce: 2.2.0 detect-indent: 6.1.0 - graphql: 16.13.2 - graphql-config: 5.1.6(@types/node@24.12.2)(graphql@16.13.2)(typescript@6.0.3) + graphql: 16.11.0 + graphql-config: 5.1.6(@types/node@24.12.2)(graphql@16.11.0)(typescript@6.0.3) is-glob: 4.0.3 jiti: 2.4.0 json-to-pretty-yaml: 1.2.2 @@ -4551,7 +4959,7 @@ snapshots: string-env-interpolation: 1.0.1 ts-log: 2.2.7 tslib: 2.8.1 - yaml: 2.8.2 + yaml: 2.8.1 yargs: 17.7.2 transitivePeerDependencies: - '@fastify/websocket' @@ -4562,212 +4970,247 @@ snapshots: - graphql-sock - supports-color - typescript - - uWebSockets.js - utf-8-validate - '@graphql-codegen/client-preset@5.3.0(graphql@16.13.2)': + '@graphql-codegen/client-preset@5.3.0(graphql@16.11.0)': dependencies: '@babel/helper-plugin-utils': 7.27.1 '@babel/template': 7.27.2 - '@graphql-codegen/add': 6.0.1(graphql@16.13.2) - '@graphql-codegen/gql-tag-operations': 5.2.0(graphql@16.13.2) - '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.13.2) - '@graphql-codegen/typed-document-node': 6.1.8(graphql@16.13.2) - '@graphql-codegen/typescript': 5.0.10(graphql@16.13.2) - '@graphql-codegen/typescript-operations': 5.1.0(graphql@16.13.2) - '@graphql-codegen/visitor-plugin-common': 6.3.0(graphql@16.13.2) - '@graphql-tools/documents': 1.0.1(graphql@16.13.2) - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) - '@graphql-typed-document-node/core': 3.2.0(graphql@16.13.2) - graphql: 16.13.2 + '@graphql-codegen/add': 6.0.1(graphql@16.11.0) + '@graphql-codegen/gql-tag-operations': 5.2.0(graphql@16.11.0) + '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.11.0) + '@graphql-codegen/typed-document-node': 6.1.8(graphql@16.11.0) + '@graphql-codegen/typescript': 5.0.10(graphql@16.11.0) + '@graphql-codegen/typescript-operations': 5.1.0(graphql@16.11.0) + '@graphql-codegen/visitor-plugin-common': 6.3.0(graphql@16.11.0) + '@graphql-tools/documents': 1.0.1(graphql@16.11.0) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.11.0) + graphql: 16.11.0 tslib: 2.8.1 - '@graphql-codegen/core@5.0.2(graphql@16.13.2)': + '@graphql-codegen/core@5.0.2(graphql@16.11.0)': dependencies: - '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.13.2) - '@graphql-tools/schema': 10.0.31(graphql@16.13.2) - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) - graphql: 16.13.2 + '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.11.0) + '@graphql-tools/schema': 10.0.23(graphql@16.11.0) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) + graphql: 16.11.0 tslib: 2.8.1 - '@graphql-codegen/gql-tag-operations@5.2.0(graphql@16.13.2)': + '@graphql-codegen/gql-tag-operations@5.2.0(graphql@16.11.0)': dependencies: - '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.13.2) - '@graphql-codegen/visitor-plugin-common': 6.3.0(graphql@16.13.2) - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) + '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.11.0) + '@graphql-codegen/visitor-plugin-common': 6.3.0(graphql@16.11.0) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) auto-bind: 4.0.0 - graphql: 16.13.2 + graphql: 16.11.0 tslib: 2.8.1 - '@graphql-codegen/plugin-helpers@6.3.0(graphql@16.13.2)': + '@graphql-codegen/plugin-helpers@6.0.0(graphql@16.11.0)': + dependencies: + '@graphql-tools/utils': 10.9.1(graphql@16.11.0) + change-case-all: 1.0.15 + common-tags: 1.8.2 + graphql: 16.11.0 + import-from: 4.0.0 + lodash: 4.17.21 + tslib: 2.6.3 + + '@graphql-codegen/plugin-helpers@6.3.0(graphql@16.11.0)': dependencies: - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) change-case-all: 1.0.15 common-tags: 1.8.2 - graphql: 16.13.2 + graphql: 16.11.0 import-from: 4.0.0 tslib: 2.8.1 - '@graphql-codegen/schema-ast@5.0.2(graphql@16.13.2)': + '@graphql-codegen/schema-ast@5.0.2(graphql@16.11.0)': dependencies: - '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.13.2) - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) - graphql: 16.13.2 + '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.11.0) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) + graphql: 16.11.0 tslib: 2.8.1 - '@graphql-codegen/typed-document-node@6.1.8(graphql@16.13.2)': + '@graphql-codegen/typed-document-node@6.1.8(graphql@16.11.0)': dependencies: - '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.13.2) - '@graphql-codegen/visitor-plugin-common': 6.3.0(graphql@16.13.2) + '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.11.0) + '@graphql-codegen/visitor-plugin-common': 6.3.0(graphql@16.11.0) auto-bind: 4.0.0 change-case-all: 1.0.15 - graphql: 16.13.2 + graphql: 16.11.0 tslib: 2.8.1 - '@graphql-codegen/typescript-operations@5.1.0(graphql@16.13.2)': + '@graphql-codegen/typescript-operations@5.1.0(graphql@16.11.0)': dependencies: - '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.13.2) - '@graphql-codegen/typescript': 5.0.10(graphql@16.13.2) - '@graphql-codegen/visitor-plugin-common': 6.3.0(graphql@16.13.2) + '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.11.0) + '@graphql-codegen/typescript': 5.0.10(graphql@16.11.0) + '@graphql-codegen/visitor-plugin-common': 6.3.0(graphql@16.11.0) auto-bind: 4.0.0 - graphql: 16.13.2 + graphql: 16.11.0 tslib: 2.8.1 - '@graphql-codegen/typescript@5.0.10(graphql@16.13.2)': + '@graphql-codegen/typescript@5.0.0(graphql@16.11.0)': dependencies: - '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.13.2) - '@graphql-codegen/schema-ast': 5.0.2(graphql@16.13.2) - '@graphql-codegen/visitor-plugin-common': 6.3.0(graphql@16.13.2) + '@graphql-codegen/plugin-helpers': 6.0.0(graphql@16.11.0) + '@graphql-codegen/schema-ast': 5.0.2(graphql@16.11.0) + '@graphql-codegen/visitor-plugin-common': 6.0.0(graphql@16.11.0) auto-bind: 4.0.0 - graphql: 16.13.2 + graphql: 16.11.0 + tslib: 2.6.3 + transitivePeerDependencies: + - encoding + + '@graphql-codegen/typescript@5.0.10(graphql@16.11.0)': + dependencies: + '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.11.0) + '@graphql-codegen/schema-ast': 5.0.2(graphql@16.11.0) + '@graphql-codegen/visitor-plugin-common': 6.3.0(graphql@16.11.0) + auto-bind: 4.0.0 + graphql: 16.11.0 tslib: 2.8.1 - '@graphql-codegen/visitor-plugin-common@6.3.0(graphql@16.13.2)': + '@graphql-codegen/visitor-plugin-common@6.0.0(graphql@16.11.0)': dependencies: - '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.13.2) - '@graphql-tools/optimize': 2.0.0(graphql@16.13.2) - '@graphql-tools/relay-operation-optimizer': 7.1.3(graphql@16.13.2) - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) + '@graphql-codegen/plugin-helpers': 6.0.0(graphql@16.11.0) + '@graphql-tools/optimize': 2.0.0(graphql@16.11.0) + '@graphql-tools/relay-operation-optimizer': 7.0.19(graphql@16.11.0) + '@graphql-tools/utils': 10.9.1(graphql@16.11.0) auto-bind: 4.0.0 change-case-all: 1.0.15 dependency-graph: 1.0.0 - graphql: 16.13.2 - graphql-tag: 2.12.6(graphql@16.13.2) + graphql: 16.11.0 + graphql-tag: 2.12.6(graphql@16.11.0) + parse-filepath: 1.0.2 + tslib: 2.6.3 + transitivePeerDependencies: + - encoding + + '@graphql-codegen/visitor-plugin-common@6.3.0(graphql@16.11.0)': + dependencies: + '@graphql-codegen/plugin-helpers': 6.3.0(graphql@16.11.0) + '@graphql-tools/optimize': 2.0.0(graphql@16.11.0) + '@graphql-tools/relay-operation-optimizer': 7.1.4(graphql@16.11.0) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) + auto-bind: 4.0.0 + change-case-all: 1.0.15 + dependency-graph: 1.0.0 + graphql: 16.11.0 + graphql-tag: 2.12.6(graphql@16.11.0) parse-filepath: 1.0.2 tslib: 2.8.1 '@graphql-hive/signal@2.0.0': {} - '@graphql-tools/apollo-engine-loader@8.0.28(graphql@16.13.2)': + '@graphql-tools/apollo-engine-loader@8.0.30(graphql@16.11.0)': dependencies: - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) '@whatwg-node/fetch': 0.10.13 - graphql: 16.13.2 + graphql: 16.11.0 sync-fetch: 0.6.0 tslib: 2.8.1 - '@graphql-tools/batch-execute@10.0.5(graphql@16.13.2)': + '@graphql-tools/batch-execute@10.0.8(graphql@16.11.0)': dependencies: - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) '@whatwg-node/promise-helpers': 1.3.2 dataloader: 2.2.3 - graphql: 16.13.2 + graphql: 16.11.0 tslib: 2.8.1 - '@graphql-tools/code-file-loader@8.1.28(graphql@16.13.2)': + '@graphql-tools/code-file-loader@8.1.32(graphql@16.11.0)': dependencies: - '@graphql-tools/graphql-tag-pluck': 8.3.27(graphql@16.13.2) - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) + '@graphql-tools/graphql-tag-pluck': 8.3.31(graphql@16.11.0) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) globby: 11.1.0 - graphql: 16.13.2 + graphql: 16.11.0 tslib: 2.8.1 unixify: 1.0.0 transitivePeerDependencies: - supports-color - '@graphql-tools/delegate@12.0.8(graphql@16.13.2)': + '@graphql-tools/delegate@12.0.14(graphql@16.11.0)': dependencies: - '@graphql-tools/batch-execute': 10.0.5(graphql@16.13.2) - '@graphql-tools/executor': 1.4.13(graphql@16.13.2) - '@graphql-tools/schema': 10.0.31(graphql@16.13.2) - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) + '@graphql-tools/batch-execute': 10.0.8(graphql@16.11.0) + '@graphql-tools/executor': 1.5.3(graphql@16.11.0) + '@graphql-tools/schema': 10.0.33(graphql@16.11.0) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) '@repeaterjs/repeater': 3.0.6 '@whatwg-node/promise-helpers': 1.3.2 dataloader: 2.2.3 - graphql: 16.13.2 + graphql: 16.11.0 tslib: 2.8.1 - '@graphql-tools/documents@1.0.1(graphql@16.13.2)': + '@graphql-tools/documents@1.0.1(graphql@16.11.0)': dependencies: - graphql: 16.13.2 + graphql: 16.11.0 lodash.sortby: 4.7.0 tslib: 2.8.1 - '@graphql-tools/executor-common@1.0.4(graphql@16.13.2)': + '@graphql-tools/executor-common@1.0.6(graphql@16.11.0)': dependencies: - '@envelop/core': 5.4.0 - '@graphql-tools/utils': 10.11.0(graphql@16.13.2) - graphql: 16.13.2 + '@envelop/core': 5.5.1 + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) + graphql: 16.11.0 - '@graphql-tools/executor-graphql-ws@3.1.2(graphql@16.13.2)': + '@graphql-tools/executor-graphql-ws@3.1.5(graphql@16.11.0)': dependencies: - '@graphql-tools/executor-common': 1.0.4(graphql@16.13.2) - '@graphql-tools/utils': 10.11.0(graphql@16.13.2) + '@graphql-tools/executor-common': 1.0.6(graphql@16.11.0) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) '@whatwg-node/disposablestack': 0.0.6 - graphql: 16.13.2 - graphql-ws: 6.0.6(graphql@16.13.2)(ws@8.19.0) - isows: 1.0.7(ws@8.19.0) + graphql: 16.11.0 + graphql-ws: 6.0.8(graphql@16.11.0)(ws@8.20.0) + isows: 1.0.7(ws@8.20.0) tslib: 2.8.1 - ws: 8.19.0 + ws: 8.20.0 transitivePeerDependencies: - '@fastify/websocket' - bufferutil - crossws - - uWebSockets.js - utf-8-validate - '@graphql-tools/executor-http@3.0.6(@types/node@24.12.2)(graphql@16.13.2)': + '@graphql-tools/executor-http@3.2.1(@types/node@24.12.2)(graphql@16.11.0)': dependencies: '@graphql-hive/signal': 2.0.0 - '@graphql-tools/executor-common': 1.0.4(graphql@16.13.2) - '@graphql-tools/utils': 10.11.0(graphql@16.13.2) + '@graphql-tools/executor-common': 1.0.6(graphql@16.11.0) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) '@repeaterjs/repeater': 3.0.6 '@whatwg-node/disposablestack': 0.0.6 '@whatwg-node/fetch': 0.10.13 '@whatwg-node/promise-helpers': 1.3.2 - graphql: 16.13.2 + graphql: 16.11.0 meros: 1.3.2(@types/node@24.12.2) tslib: 2.8.1 transitivePeerDependencies: - '@types/node' - '@graphql-tools/executor-legacy-ws@1.1.25(graphql@16.13.2)': + '@graphql-tools/executor-legacy-ws@1.1.28(graphql@16.11.0)': dependencies: - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) '@types/ws': 8.5.13 - graphql: 16.13.2 - isomorphic-ws: 5.0.0(ws@8.19.0) + graphql: 16.11.0 + isomorphic-ws: 5.0.0(ws@8.20.0) tslib: 2.8.1 - ws: 8.19.0 + ws: 8.20.0 transitivePeerDependencies: - bufferutil - utf-8-validate - '@graphql-tools/executor@1.4.13(graphql@16.13.2)': + '@graphql-tools/executor@1.5.3(graphql@16.11.0)': dependencies: - '@graphql-tools/utils': 10.11.0(graphql@16.13.2) - '@graphql-typed-document-node/core': 3.2.0(graphql@16.13.2) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.11.0) '@repeaterjs/repeater': 3.0.6 '@whatwg-node/disposablestack': 0.0.6 '@whatwg-node/promise-helpers': 1.3.2 - graphql: 16.13.2 + graphql: 16.11.0 tslib: 2.8.1 - '@graphql-tools/git-loader@8.0.32(graphql@16.13.2)': + '@graphql-tools/git-loader@8.0.36(graphql@16.11.0)': dependencies: - '@graphql-tools/graphql-tag-pluck': 8.3.27(graphql@16.13.2) - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) - graphql: 16.13.2 + '@graphql-tools/graphql-tag-pluck': 8.3.31(graphql@16.11.0) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) + graphql: 16.11.0 is-glob: 4.0.3 micromatch: 4.0.8 tslib: 2.8.1 @@ -4775,141 +5218,163 @@ snapshots: transitivePeerDependencies: - supports-color - '@graphql-tools/github-loader@9.0.6(@types/node@24.12.2)(graphql@16.13.2)': + '@graphql-tools/github-loader@9.1.2(@types/node@24.12.2)(graphql@16.11.0)': dependencies: - '@graphql-tools/executor-http': 3.0.6(@types/node@24.12.2)(graphql@16.13.2) - '@graphql-tools/graphql-tag-pluck': 8.3.27(graphql@16.13.2) - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) + '@graphql-tools/executor-http': 3.2.1(@types/node@24.12.2)(graphql@16.11.0) + '@graphql-tools/graphql-tag-pluck': 8.3.31(graphql@16.11.0) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) '@whatwg-node/fetch': 0.10.13 '@whatwg-node/promise-helpers': 1.3.2 - graphql: 16.13.2 + graphql: 16.11.0 sync-fetch: 0.6.0 tslib: 2.8.1 transitivePeerDependencies: - '@types/node' - supports-color - '@graphql-tools/graphql-file-loader@8.1.12(graphql@16.13.2)': + '@graphql-tools/graphql-file-loader@8.1.14(graphql@16.11.0)': dependencies: - '@graphql-tools/import': 7.1.12(graphql@16.13.2) - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) + '@graphql-tools/import': 7.1.14(graphql@16.11.0) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) globby: 11.1.0 - graphql: 16.13.2 + graphql: 16.11.0 tslib: 2.8.1 unixify: 1.0.0 - '@graphql-tools/graphql-tag-pluck@8.3.27(graphql@16.13.2)': + '@graphql-tools/graphql-tag-pluck@8.3.31(graphql@16.11.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.29.0 '@babel/parser': 7.29.2 - '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.27.4) + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.29.0) '@babel/traverse': 7.27.4 '@babel/types': 7.29.0 - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) - graphql: 16.13.2 + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) + graphql: 16.11.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@graphql-tools/import@7.1.12(graphql@16.13.2)': + '@graphql-tools/import@7.1.14(graphql@16.11.0)': dependencies: - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) - graphql: 16.13.2 + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) + graphql: 16.11.0 resolve-from: 5.0.0 tslib: 2.8.1 - '@graphql-tools/json-file-loader@8.0.26(graphql@16.13.2)': + '@graphql-tools/json-file-loader@8.0.28(graphql@16.11.0)': dependencies: - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) globby: 11.1.0 - graphql: 16.13.2 + graphql: 16.11.0 tslib: 2.8.1 unixify: 1.0.0 - '@graphql-tools/load@8.1.8(graphql@16.13.2)': + '@graphql-tools/load@8.1.10(graphql@16.11.0)': dependencies: - '@graphql-tools/schema': 10.0.31(graphql@16.13.2) - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) - graphql: 16.13.2 + '@graphql-tools/schema': 10.0.33(graphql@16.11.0) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) + graphql: 16.11.0 p-limit: 3.1.0 tslib: 2.8.1 - '@graphql-tools/merge@9.1.7(graphql@16.13.2)': + '@graphql-tools/merge@9.0.24(graphql@16.11.0)': dependencies: - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) - graphql: 16.13.2 + '@graphql-tools/utils': 10.9.1(graphql@16.11.0) + graphql: 16.11.0 tslib: 2.8.1 - '@graphql-tools/optimize@2.0.0(graphql@16.13.2)': + '@graphql-tools/merge@9.1.9(graphql@16.11.0)': dependencies: - graphql: 16.13.2 + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) + graphql: 16.11.0 tslib: 2.8.1 - '@graphql-tools/relay-operation-optimizer@7.1.3(graphql@16.13.2)': + '@graphql-tools/optimize@2.0.0(graphql@16.11.0)': dependencies: - '@ardatan/relay-compiler': 13.0.1(graphql@16.13.2) - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) - graphql: 16.13.2 + graphql: 16.11.0 tslib: 2.8.1 - '@graphql-tools/schema@10.0.31(graphql@16.13.2)': + '@graphql-tools/relay-operation-optimizer@7.0.19(graphql@16.11.0)': dependencies: - '@graphql-tools/merge': 9.1.7(graphql@16.13.2) - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) - graphql: 16.13.2 + '@ardatan/relay-compiler': 12.0.3(graphql@16.11.0) + '@graphql-tools/utils': 10.9.1(graphql@16.11.0) + graphql: 16.11.0 tslib: 2.8.1 + transitivePeerDependencies: + - encoding - '@graphql-tools/url-loader@9.0.6(@types/node@24.12.2)(graphql@16.13.2)': + '@graphql-tools/relay-operation-optimizer@7.1.4(graphql@16.11.0)': dependencies: - '@graphql-tools/executor-graphql-ws': 3.1.2(graphql@16.13.2) - '@graphql-tools/executor-http': 3.0.6(@types/node@24.12.2)(graphql@16.13.2) - '@graphql-tools/executor-legacy-ws': 1.1.25(graphql@16.13.2) - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) - '@graphql-tools/wrap': 11.1.8(graphql@16.13.2) + '@ardatan/relay-compiler': 13.0.1(graphql@16.11.0) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) + graphql: 16.11.0 + tslib: 2.8.1 + + '@graphql-tools/schema@10.0.23(graphql@16.11.0)': + dependencies: + '@graphql-tools/merge': 9.0.24(graphql@16.11.0) + '@graphql-tools/utils': 10.9.1(graphql@16.11.0) + graphql: 16.11.0 + tslib: 2.8.1 + + '@graphql-tools/schema@10.0.33(graphql@16.11.0)': + dependencies: + '@graphql-tools/merge': 9.1.9(graphql@16.11.0) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) + graphql: 16.11.0 + tslib: 2.8.1 + + '@graphql-tools/url-loader@9.1.2(@types/node@24.12.2)(graphql@16.11.0)': + dependencies: + '@graphql-tools/executor-graphql-ws': 3.1.5(graphql@16.11.0) + '@graphql-tools/executor-http': 3.2.1(@types/node@24.12.2)(graphql@16.11.0) + '@graphql-tools/executor-legacy-ws': 1.1.28(graphql@16.11.0) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) + '@graphql-tools/wrap': 11.1.14(graphql@16.11.0) '@types/ws': 8.5.13 '@whatwg-node/fetch': 0.10.13 '@whatwg-node/promise-helpers': 1.3.2 - graphql: 16.13.2 - isomorphic-ws: 5.0.0(ws@8.19.0) + graphql: 16.11.0 + isomorphic-ws: 5.0.0(ws@8.20.0) sync-fetch: 0.6.0 tslib: 2.8.1 - ws: 8.19.0 + ws: 8.20.0 transitivePeerDependencies: - '@fastify/websocket' - '@types/node' - bufferutil - crossws - - uWebSockets.js - utf-8-validate - '@graphql-tools/utils@10.11.0(graphql@16.13.2)': + '@graphql-tools/utils@10.9.1(graphql@16.11.0)': dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@16.13.2) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.11.0) '@whatwg-node/promise-helpers': 1.3.2 cross-inspect: 1.0.1 - graphql: 16.13.2 + dset: 3.1.4 + graphql: 16.11.0 tslib: 2.8.1 - '@graphql-tools/utils@11.1.0(graphql@16.13.2)': + '@graphql-tools/utils@11.1.0(graphql@16.11.0)': dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@16.13.2) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.11.0) '@whatwg-node/promise-helpers': 1.3.2 cross-inspect: 1.0.1 - graphql: 16.13.2 + graphql: 16.11.0 tslib: 2.8.1 - '@graphql-tools/wrap@11.1.8(graphql@16.13.2)': + '@graphql-tools/wrap@11.1.14(graphql@16.11.0)': dependencies: - '@graphql-tools/delegate': 12.0.8(graphql@16.13.2) - '@graphql-tools/schema': 10.0.31(graphql@16.13.2) - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) + '@graphql-tools/delegate': 12.0.14(graphql@16.11.0) + '@graphql-tools/schema': 10.0.33(graphql@16.11.0) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) '@whatwg-node/promise-helpers': 1.3.2 - graphql: 16.13.2 + graphql: 16.11.0 tslib: 2.8.1 - '@graphql-typed-document-node/core@3.2.0(graphql@16.13.2)': + '@graphql-typed-document-node/core@3.2.0(graphql@16.11.0)': dependencies: - graphql: 16.13.2 + graphql: 16.11.0 '@humanfs/core@0.19.1': {} @@ -5049,7 +5514,7 @@ snapshots: dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.2.0 + strip-ansi: 7.1.0 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 @@ -5084,7 +5549,7 @@ snapshots: '@types/node': 24.12.2 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 4.4.0 + ci-info: 4.3.0 exit-x: 0.2.2 graceful-fs: 4.2.11 jest-changed-files: 30.3.0 @@ -5131,7 +5596,7 @@ snapshots: '@jest/fake-timers@30.3.0': dependencies: '@jest/types': 30.3.0 - '@sinonjs/fake-timers': 15.1.1 + '@sinonjs/fake-timers': 15.3.2 '@types/node': 24.12.2 jest-message-util: 30.3.0 jest-mock: 30.3.0 @@ -5160,7 +5625,7 @@ snapshots: '@jest/test-result': 30.3.0 '@jest/transform': 30.3.0 '@jest/types': 30.3.0 - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/trace-mapping': 0.3.25 '@types/node': 24.12.2 chalk: 4.1.2 collect-v8-coverage: 1.0.2 @@ -5194,7 +5659,7 @@ snapshots: '@jest/source-map@30.0.1': dependencies: - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/trace-mapping': 0.3.25 callsites: 3.1.0 graceful-fs: 4.2.11 @@ -5216,7 +5681,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@jest/types': 30.3.0 - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 7.0.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -5246,15 +5711,35 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/set-array@1.2.1': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@kamilkisiela/fast-url-parser@1.1.4': {} + '@napi-rs/wasm-runtime@0.2.11': dependencies: '@emnapi/core': 1.4.3 @@ -5283,79 +5768,64 @@ snapshots: '@repeaterjs/repeater@3.0.6': {} - '@rollup/rollup-android-arm-eabi@4.60.2': - optional: true - - '@rollup/rollup-android-arm64@4.60.2': - optional: true - - '@rollup/rollup-darwin-arm64@4.60.2': - optional: true - - '@rollup/rollup-darwin-x64@4.60.2': - optional: true - - '@rollup/rollup-freebsd-arm64@4.60.2': - optional: true - - '@rollup/rollup-freebsd-x64@4.60.2': + '@rollup/rollup-android-arm-eabi@4.43.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.2': + '@rollup/rollup-android-arm64@4.43.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.2': + '@rollup/rollup-darwin-arm64@4.43.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.2': + '@rollup/rollup-darwin-x64@4.43.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.60.2': + '@rollup/rollup-freebsd-arm64@4.43.0': optional: true - '@rollup/rollup-linux-loong64-gnu@4.60.2': + '@rollup/rollup-freebsd-x64@4.43.0': optional: true - '@rollup/rollup-linux-loong64-musl@4.60.2': + '@rollup/rollup-linux-arm-gnueabihf@4.43.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.2': + '@rollup/rollup-linux-arm-musleabihf@4.43.0': optional: true - '@rollup/rollup-linux-ppc64-musl@4.60.2': + '@rollup/rollup-linux-arm64-gnu@4.43.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.2': + '@rollup/rollup-linux-arm64-musl@4.43.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.2': + '@rollup/rollup-linux-loongarch64-gnu@4.43.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.2': + '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.60.2': + '@rollup/rollup-linux-riscv64-gnu@4.43.0': optional: true - '@rollup/rollup-linux-x64-musl@4.60.2': + '@rollup/rollup-linux-riscv64-musl@4.43.0': optional: true - '@rollup/rollup-openbsd-x64@4.60.2': + '@rollup/rollup-linux-s390x-gnu@4.43.0': optional: true - '@rollup/rollup-openharmony-arm64@4.60.2': + '@rollup/rollup-linux-x64-gnu@4.43.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.60.2': + '@rollup/rollup-linux-x64-musl@4.43.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.60.2': + '@rollup/rollup-win32-arm64-msvc@4.43.0': optional: true - '@rollup/rollup-win32-x64-gnu@4.60.2': + '@rollup/rollup-win32-ia32-msvc@4.43.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.60.2': + '@rollup/rollup-win32-x64-msvc@4.43.0': optional: true '@sinclair/typebox@0.34.33': {} @@ -5366,21 +5836,19 @@ snapshots: dependencies: type-detect: 4.0.8 - '@sinonjs/fake-timers@15.1.1': + '@sinonjs/fake-timers@15.3.2': dependencies: '@sinonjs/commons': 3.0.1 - '@standard-schema/spec@1.1.0': {} - '@stylistic/eslint-plugin@5.10.0(eslint@10.2.1(jiti@2.4.0))': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.4.0)) - '@typescript-eslint/types': 8.57.1 + '@typescript-eslint/types': 8.59.0 eslint: 10.2.1(jiti@2.4.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 - picomatch: 4.0.4 + picomatch: 4.0.3 '@tsconfig/recommended@1.0.13': {} @@ -5410,10 +5878,9 @@ snapshots: dependencies: '@babel/types': 7.29.0 - '@types/chai@5.2.3': + '@types/chai@5.2.2': dependencies: '@types/deep-eql': 4.0.2 - assertion-error: 2.0.1 '@types/debug@4.1.12': dependencies: @@ -5423,6 +5890,8 @@ snapshots: '@types/esrecurse@4.3.1': {} + '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} '@types/graphlib@2.1.12': {} @@ -5469,14 +5938,14 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/parser': 8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.0 + '@typescript-eslint/type-utils': 8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.0 eslint: 10.2.1(jiti@2.4.0) ignore: 7.0.5 natural-compare: 1.4.0 @@ -5485,53 +5954,32 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.56.1(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)': + '@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.56.1 - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/typescript-estree': 8.56.1(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.56.1 + '@typescript-eslint/scope-manager': 8.59.0 + '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.0 debug: 4.4.3 eslint: 10.2.1(jiti@2.4.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.58.2 - debug: 4.4.3 - eslint: 10.2.1(jiti@2.4.0) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.56.1(typescript@6.0.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@6.0.3) - '@typescript-eslint/types': 8.56.1 - debug: 4.4.3 - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.58.2(typescript@6.0.3)': + '@typescript-eslint/project-service@8.59.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.3) - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/tsconfig-utils': 8.59.0(typescript@6.0.3) + '@typescript-eslint/types': 8.59.0 debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/rule-tester@8.56.1(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)': + '@typescript-eslint/rule-tester@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/parser': 8.56.1(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.56.1(typescript@6.0.3) - '@typescript-eslint/utils': 8.56.1(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) ajv: 6.15.0 eslint: 10.2.1(jiti@2.4.0) json-stable-stringify-without-jsonify: 1.0.1 @@ -5541,29 +5989,20 @@ snapshots: - supports-color - typescript - '@typescript-eslint/scope-manager@8.56.1': + '@typescript-eslint/scope-manager@8.59.0': dependencies: - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/visitor-keys': 8.56.1 + '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/visitor-keys': 8.59.0 - '@typescript-eslint/scope-manager@8.58.2': - dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 - - '@typescript-eslint/tsconfig-utils@8.56.1(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.59.0(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/tsconfig-utils@8.58.2(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)': dependencies: - typescript: 6.0.3 - - '@typescript-eslint/type-utils@8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)': - dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) debug: 4.4.3 eslint: 10.2.1(jiti@2.4.0) ts-api-utils: 2.5.0(typescript@6.0.3) @@ -5571,72 +6010,37 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.56.1': {} - - '@typescript-eslint/types@8.57.1': {} + '@typescript-eslint/types@8.59.0': {} - '@typescript-eslint/types@8.58.2': {} - - '@typescript-eslint/typescript-estree@8.56.1(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.59.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.56.1(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@6.0.3) - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/visitor-keys': 8.56.1 + '@typescript-eslint/project-service': 8.59.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.0(typescript@6.0.3) + '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/visitor-keys': 8.59.0 debug: 4.4.3 minimatch: 10.2.5 semver: 7.7.4 - tinyglobby: 0.2.16 + tinyglobby: 0.2.15 ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.3)': - dependencies: - '@typescript-eslint/project-service': 8.58.2(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.3) - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 - debug: 4.4.3 - minimatch: 10.2.5 - semver: 7.7.4 - tinyglobby: 0.2.16 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.56.1(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)': + '@typescript-eslint/utils@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.4.0)) - '@typescript-eslint/scope-manager': 8.56.1 - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/typescript-estree': 8.56.1(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.0 + '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) eslint: 10.2.1(jiti@2.4.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)': + '@typescript-eslint/visitor-keys@8.59.0': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.4.0)) - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) - eslint: 10.2.1(jiti@2.4.0) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.56.1': - dependencies: - '@typescript-eslint/types': 8.56.1 - eslint-visitor-keys: 5.0.1 - - '@typescript-eslint/visitor-keys@8.58.2': - dependencies: - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/types': 8.59.0 eslint-visitor-keys: 5.0.1 '@ungap/structured-clone@1.3.0': {} @@ -5694,58 +6098,59 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.7.13': optional: true - '@vitest/eslint-plugin@1.6.16(@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)(vitest@4.1.5(@types/node@24.12.2)(vite@7.3.1(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.2)))': + '@vitest/eslint-plugin@1.6.16(@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.3))': dependencies: - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.0 + '@typescript-eslint/utils': 8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) eslint: 10.2.1(jiti@2.4.0) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) typescript: 6.0.3 - vitest: 4.1.5(@types/node@24.12.2)(vite@7.3.1(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.2)) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.3) transitivePeerDependencies: - supports-color - '@vitest/expect@4.1.5': + '@vitest/expect@3.2.4': dependencies: - '@standard-schema/spec': 1.1.0 - '@types/chai': 5.2.3 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 - chai: 6.2.2 - tinyrainbow: 3.1.0 + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + tinyrainbow: 2.0.0 - '@vitest/mocker@4.1.5(vite@7.3.1(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.2))': + '@vitest/mocker@3.2.4(vite@6.3.5(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.3))': dependencies: - '@vitest/spy': 4.1.5 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.2) + vite: 6.3.5(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.3) - '@vitest/pretty-format@4.1.5': + '@vitest/pretty-format@3.2.4': dependencies: - tinyrainbow: 3.1.0 + tinyrainbow: 2.0.0 - '@vitest/runner@4.1.5': + '@vitest/runner@3.2.4': dependencies: - '@vitest/utils': 4.1.5 + '@vitest/utils': 3.2.4 pathe: 2.0.3 + strip-literal: 3.1.0 - '@vitest/snapshot@4.1.5': + '@vitest/snapshot@3.2.4': dependencies: - '@vitest/pretty-format': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/pretty-format': 3.2.4 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.5': {} + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.4 - '@vitest/utils@4.1.5': + '@vitest/utils@3.2.4': dependencies: - '@vitest/pretty-format': 4.1.5 - convert-source-map: 2.0.0 - tinyrainbow: 3.1.0 + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 + tinyrainbow: 2.0.0 '@vue/compiler-core@3.5.12': dependencies: @@ -5784,12 +6189,24 @@ snapshots: '@whatwg-node/promise-helpers': 1.3.2 tslib: 2.8.1 + '@whatwg-node/fetch@0.10.1': + dependencies: + '@whatwg-node/node-fetch': 0.7.2 + urlpattern-polyfill: 10.0.0 + '@whatwg-node/fetch@0.10.13': dependencies: - '@whatwg-node/node-fetch': 0.8.4 + '@whatwg-node/node-fetch': 0.8.5 urlpattern-polyfill: 10.0.0 - '@whatwg-node/node-fetch@0.8.4': + '@whatwg-node/node-fetch@0.7.2': + dependencies: + '@kamilkisiela/fast-url-parser': 1.1.4 + busboy: 1.6.0 + fast-querystring: 1.1.2 + tslib: 2.8.1 + + '@whatwg-node/node-fetch@0.8.5': dependencies: '@fastify/busboy': 3.2.0 '@whatwg-node/disposablestack': 0.0.6 @@ -5800,18 +6217,17 @@ snapshots: dependencies: tslib: 2.8.1 + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: acorn: 8.16.0 - acorn@8.16.0: {} + acorn@8.15.0: {} - ajv@6.14.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 + acorn@8.16.0: {} ajv@6.15.0: dependencies: @@ -5830,7 +6246,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.2.2: {} + ansi-regex@6.1.0: {} ansi-styles@4.3.0: dependencies: @@ -5840,14 +6256,12 @@ snapshots: ansi-styles@6.2.1: {} - ansi-styles@6.2.3: {} - ansis@4.2.0: {} anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 2.3.2 + picomatch: 2.3.1 are-docs-informative@0.0.2: {} @@ -5859,6 +6273,8 @@ snapshots: array-union@2.1.0: {} + asap@2.0.6: {} + assertion-error@2.0.1: {} auto-bind@4.0.0: {} @@ -5876,6 +6292,20 @@ snapshots: transitivePeerDependencies: - supports-color + babel-jest@30.3.0(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@jest/transform': 30.3.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 7.0.1 + babel-preset-jest: 30.3.0(@babel/core@7.29.0) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + optional: true + babel-plugin-istanbul@7.0.1: dependencies: '@babel/helper-plugin-utils': 7.27.1 @@ -5909,17 +6339,46 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.4) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.4) + babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.29.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) + optional: true + babel-preset-jest@30.3.0(@babel/core@7.27.4): dependencies: '@babel/core': 7.27.4 babel-plugin-jest-hoist: 30.3.0 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.27.4) + babel-preset-jest@30.3.0(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + babel-plugin-jest-hoist: 30.3.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + optional: true + balanced-match@1.0.2: {} balanced-match@4.0.4: {} - baseline-browser-mapping@2.10.8: {} + baseline-browser-mapping@2.10.21: {} + + baseline-browser-mapping@2.8.6: {} boolbase@1.0.0: {} @@ -5940,13 +6399,21 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.28.1: + browserslist@4.26.2: + dependencies: + baseline-browser-mapping: 2.8.6 + caniuse-lite: 1.0.30001743 + electron-to-chromium: 1.5.222 + node-releases: 2.0.21 + update-browserslist-db: 1.1.3(browserslist@4.26.2) + + browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.8 - caniuse-lite: 1.0.30001780 - electron-to-chromium: 1.5.321 - node-releases: 2.0.36 - update-browserslist-db: 1.2.3(browserslist@4.28.1) + baseline-browser-mapping: 2.10.21 + caniuse-lite: 1.0.30001790 + electron-to-chromium: 1.5.344 + node-releases: 2.0.38 + update-browserslist-db: 1.2.3(browserslist@4.28.2) bs-logger@0.2.6: dependencies: @@ -5960,6 +6427,12 @@ snapshots: builtin-modules@5.0.0: {} + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + cac@6.7.14: {} + cac@7.0.0: {} callsites@3.1.0: {} @@ -5973,7 +6446,9 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001780: {} + caniuse-lite@1.0.30001743: {} + + caniuse-lite@1.0.30001790: {} capital-case@1.0.4: dependencies: @@ -5983,7 +6458,13 @@ snapshots: ccount@2.0.1: {} - chai@6.2.2: {} + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.3 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 chalk@4.1.2: dependencies: @@ -6026,6 +6507,10 @@ snapshots: chardet@2.1.0: {} + check-error@2.1.3: {} + + ci-info@4.3.0: {} + ci-info@4.4.0: {} cjs-module-lexer@2.1.0: {} @@ -6065,6 +6550,8 @@ snapshots: commander@8.3.0: {} + comment-parser@1.4.1: {} + comment-parser@1.4.5: {} comment-parser@1.4.6: {} @@ -6075,7 +6562,7 @@ snapshots: confbox@0.1.8: {} - confbox@0.2.4: {} + confbox@0.2.2: {} constant-case@3.0.4: dependencies: @@ -6087,7 +6574,7 @@ snapshots: core-js-compat@3.49.0: dependencies: - browserslist: 4.28.1 + browserslist: 4.28.2 cosmiconfig@8.3.6(typescript@6.0.3): dependencies: @@ -6107,6 +6594,12 @@ snapshots: optionalDependencies: typescript: 6.0.3 + cross-fetch@3.2.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + cross-inspect@1.0.1: dependencies: tslib: 2.8.1 @@ -6129,12 +6622,14 @@ snapshots: dependencies: ms: 2.1.3 - decode-named-character-reference@1.3.0: + decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 dedent@1.6.0: {} + deep-eql@5.0.2: {} + deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -6162,13 +6657,17 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 + dset@3.1.4: {} + eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.321: {} + electron-to-chromium@1.5.222: {} + + electron-to-chromium@1.5.344: {} emittery@0.13.1: {} - emoji-regex@10.6.0: {} + emoji-regex@10.5.0: {} emoji-regex@8.0.0: {} @@ -6176,10 +6675,10 @@ snapshots: empathic@2.0.0: {} - enhanced-resolve@5.20.1: + enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.0 + tapable: 2.2.3 entities@4.5.0: {} @@ -6191,36 +6690,35 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-module-lexer@2.0.0: {} + es-module-lexer@1.7.0: {} - esbuild@0.27.7: + esbuild@0.25.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.7 - '@esbuild/android-arm': 0.27.7 - '@esbuild/android-arm64': 0.27.7 - '@esbuild/android-x64': 0.27.7 - '@esbuild/darwin-arm64': 0.27.7 - '@esbuild/darwin-x64': 0.27.7 - '@esbuild/freebsd-arm64': 0.27.7 - '@esbuild/freebsd-x64': 0.27.7 - '@esbuild/linux-arm': 0.27.7 - '@esbuild/linux-arm64': 0.27.7 - '@esbuild/linux-ia32': 0.27.7 - '@esbuild/linux-loong64': 0.27.7 - '@esbuild/linux-mips64el': 0.27.7 - '@esbuild/linux-ppc64': 0.27.7 - '@esbuild/linux-riscv64': 0.27.7 - '@esbuild/linux-s390x': 0.27.7 - '@esbuild/linux-x64': 0.27.7 - '@esbuild/netbsd-arm64': 0.27.7 - '@esbuild/netbsd-x64': 0.27.7 - '@esbuild/openbsd-arm64': 0.27.7 - '@esbuild/openbsd-x64': 0.27.7 - '@esbuild/openharmony-arm64': 0.27.7 - '@esbuild/sunos-x64': 0.27.7 - '@esbuild/win32-arm64': 0.27.7 - '@esbuild/win32-ia32': 0.27.7 - '@esbuild/win32-x64': 0.27.7 + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 escalade@3.2.0: {} @@ -6235,11 +6733,11 @@ snapshots: eslint-compat-utils@0.5.1(eslint@10.2.1(jiti@2.4.0)): dependencies: eslint: 10.2.1(jiti@2.4.0) - semver: 7.7.4 + semver: 7.7.2 eslint-config-flat-gitignore@2.3.0(eslint@10.2.1(jiti@2.4.0)): dependencies: - '@eslint/compat': 2.0.3(eslint@10.2.1(jiti@2.4.0)) + '@eslint/compat': 2.0.5(eslint@10.2.1(jiti@2.4.0)) eslint: 10.2.1(jiti@2.4.0) eslint-flat-config-utils@3.1.0: @@ -6250,7 +6748,7 @@ snapshots: eslint-json-compat-utils@0.2.3(eslint@10.2.1(jiti@2.4.0))(jsonc-eslint-parser@3.1.0): dependencies: eslint: 10.2.1(jiti@2.4.0) - esquery: 1.7.0 + esquery: 1.6.0 jsonc-eslint-parser: 3.1.0 eslint-merge-processors@2.0.0(eslint@10.2.1(jiti@2.4.0)): @@ -6261,12 +6759,12 @@ snapshots: dependencies: eslint: 10.2.1(jiti@2.4.0) - eslint-plugin-command@3.5.2(@typescript-eslint/rule-tester@8.56.1(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.3))(@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0)): + eslint-plugin-command@3.5.2(@typescript-eslint/rule-tester@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(@typescript-eslint/typescript-estree@8.59.0(typescript@6.0.3))(@typescript-eslint/utils@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0)): dependencies: '@es-joy/jsdoccomment': 0.84.0 - '@typescript-eslint/rule-tester': 8.56.1(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) + '@typescript-eslint/rule-tester': 8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) eslint: 10.2.1(jiti@2.4.0) eslint-plugin-depend@1.5.0(eslint@10.2.1(jiti@2.4.0)): @@ -6274,12 +6772,12 @@ snapshots: empathic: 2.0.0 eslint: 10.2.1(jiti@2.4.0) module-replacements: 2.11.0 - semver: 7.7.4 + semver: 7.7.2 eslint-plugin-es-x@7.8.0(eslint@10.2.1(jiti@2.4.0)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.4.0)) - '@eslint-community/regexpp': 4.12.2 + '@eslint-community/eslint-utils': 4.9.0(eslint@10.2.1(jiti@2.4.0)) + '@eslint-community/regexpp': 4.12.1 eslint: 10.2.1(jiti@2.4.0) eslint-compat-utils: 0.5.1(eslint@10.2.1(jiti@2.4.0)) @@ -6309,7 +6807,7 @@ snapshots: eslint-plugin-jsonc@3.1.2(eslint@10.2.1(jiti@2.4.0)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.4.0)) + '@eslint-community/eslint-utils': 4.9.0(eslint@10.2.1(jiti@2.4.0)) '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.6.1 '@ota-meshi/ast-token-store': 0.3.0 @@ -6324,15 +6822,15 @@ snapshots: eslint-plugin-n@17.24.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.4.0)) - enhanced-resolve: 5.20.1 + '@eslint-community/eslint-utils': 4.9.0(eslint@10.2.1(jiti@2.4.0)) + enhanced-resolve: 5.18.3 eslint: 10.2.1(jiti@2.4.0) eslint-plugin-es-x: 7.8.0(eslint@10.2.1(jiti@2.4.0)) - get-tsconfig: 4.13.6 + get-tsconfig: 4.10.1 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 - semver: 7.7.4 + semver: 7.7.2 ts-declaration-location: 1.0.7(typescript@6.0.3) transitivePeerDependencies: - typescript @@ -6341,7 +6839,7 @@ snapshots: eslint-plugin-perfectionist@5.9.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3): dependencies: - '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) eslint: 10.2.1(jiti@2.4.0) natural-orderby: 5.0.0 transitivePeerDependencies: @@ -6355,17 +6853,17 @@ snapshots: jsonc-eslint-parser: 3.1.0 pathe: 2.0.3 pnpm-workspace-yaml: 1.6.0 - tinyglobby: 0.2.16 - yaml: 2.8.2 + tinyglobby: 0.2.15 + yaml: 2.8.3 yaml-eslint-parser: 2.0.0 eslint-plugin-regexp@3.1.0(eslint@10.2.1(jiti@2.4.0)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.4.0)) - '@eslint-community/regexpp': 4.12.2 - comment-parser: 1.4.5 + '@eslint-community/eslint-utils': 4.9.0(eslint@10.2.1(jiti@2.4.0)) + '@eslint-community/regexpp': 4.12.1 + comment-parser: 1.4.1 eslint: 10.2.1(jiti@2.4.0) - jsdoc-type-pratt-parser: 7.1.1 + jsdoc-type-pratt-parser: 7.2.0 refa: 0.12.1 regexp-ast-analysis: 0.7.1 scslre: 0.3.0 @@ -6397,29 +6895,29 @@ snapshots: jsesc: 3.1.0 pluralize: 8.0.0 regexp-tree: 0.1.27 - regjsparser: 0.13.0 + regjsparser: 0.13.1 semver: 7.7.4 strip-indent: 4.1.1 - eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0)): + eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0)): dependencies: eslint: 10.2.1(jiti@2.4.0) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) - eslint-plugin-vue@10.8.0(@stylistic/eslint-plugin@5.10.0(eslint@10.2.1(jiti@2.4.0)))(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(vue-eslint-parser@10.4.0(eslint@10.2.1(jiti@2.4.0))): + eslint-plugin-vue@10.9.0(@stylistic/eslint-plugin@5.10.0(eslint@10.2.1(jiti@2.4.0)))(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3))(eslint@10.2.1(jiti@2.4.0))(vue-eslint-parser@10.4.0(eslint@10.2.1(jiti@2.4.0))): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.4.0)) + '@eslint-community/eslint-utils': 4.9.0(eslint@10.2.1(jiti@2.4.0)) eslint: 10.2.1(jiti@2.4.0) natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 7.1.1 - semver: 7.7.4 + semver: 7.7.2 vue-eslint-parser: 10.4.0(eslint@10.2.1(jiti@2.4.0)) xml-name-validator: 4.0.0 optionalDependencies: '@stylistic/eslint-plugin': 5.10.0(eslint@10.2.1(jiti@2.4.0)) - '@typescript-eslint/parser': 8.58.2(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.0(eslint@10.2.1(jiti@2.4.0))(typescript@6.0.3) eslint-plugin-yml@3.3.1(eslint@10.2.1(jiti@2.4.0)): dependencies: @@ -6440,6 +6938,11 @@ snapshots: '@vue/compiler-sfc': 3.5.12 eslint: 10.2.1(jiti@2.4.0) + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-scope@9.1.2: dependencies: '@types/esrecurse': 4.3.1 @@ -6455,7 +6958,7 @@ snapshots: eslint@10.2.1(jiti@2.4.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.4.0)) + '@eslint-community/eslint-utils': 4.9.0(eslint@10.2.1(jiti@2.4.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.5.5 @@ -6465,7 +6968,7 @@ snapshots: '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - ajv: 6.14.0 + ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 @@ -6492,8 +6995,8 @@ snapshots: espree@10.4.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 espree@11.2.0: @@ -6504,6 +7007,10 @@ snapshots: esprima@4.0.1: {} + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -6549,7 +7056,9 @@ snapshots: jest-mock: 30.3.0 jest-util: 30.3.0 - exsolve@1.0.8: {} + exsolve@1.0.7: {} + + fast-decode-uri-component@1.0.1: {} fast-deep-equal@3.1.3: {} @@ -6565,6 +7074,10 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-querystring@1.1.2: + dependencies: + fast-decode-uri-component: 1.0.1 + fast-string-truncated-width@1.2.1: {} fast-string-width@1.1.0: @@ -6587,9 +7100,23 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.5.0(picomatch@4.0.4): + fbjs-css-vars@1.0.2: {} + + fbjs@3.0.5: + dependencies: + cross-fetch: 3.2.0 + fbjs-css-vars: 1.0.2 + loose-envify: 1.4.0 + object-assign: 4.1.1 + promise: 7.3.1 + setimmediate: 1.0.5 + ua-parser-js: 1.0.40 + transitivePeerDependencies: + - encoding + + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.3 fetch-blob@3.2.0: dependencies: @@ -6649,7 +7176,7 @@ snapshots: get-stream@6.0.1: {} - get-tsconfig@4.13.6: + get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -6677,7 +7204,7 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.1.5 + minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 @@ -6704,16 +7231,16 @@ snapshots: dependencies: lodash: 4.17.21 - graphql-config@5.1.6(@types/node@24.12.2)(graphql@16.13.2)(typescript@6.0.3): + graphql-config@5.1.6(@types/node@24.12.2)(graphql@16.11.0)(typescript@6.0.3): dependencies: - '@graphql-tools/graphql-file-loader': 8.1.12(graphql@16.13.2) - '@graphql-tools/json-file-loader': 8.0.26(graphql@16.13.2) - '@graphql-tools/load': 8.1.8(graphql@16.13.2) - '@graphql-tools/merge': 9.1.7(graphql@16.13.2) - '@graphql-tools/url-loader': 9.0.6(@types/node@24.12.2)(graphql@16.13.2) - '@graphql-tools/utils': 11.1.0(graphql@16.13.2) + '@graphql-tools/graphql-file-loader': 8.1.14(graphql@16.11.0) + '@graphql-tools/json-file-loader': 8.0.28(graphql@16.11.0) + '@graphql-tools/load': 8.1.10(graphql@16.11.0) + '@graphql-tools/merge': 9.0.24(graphql@16.11.0) + '@graphql-tools/url-loader': 9.1.2(@types/node@24.12.2)(graphql@16.11.0) + '@graphql-tools/utils': 11.1.0(graphql@16.11.0) cosmiconfig: 8.3.6(typescript@6.0.3) - graphql: 16.13.2 + graphql: 16.11.0 jiti: 2.4.0 minimatch: 10.2.5 string-env-interpolation: 1.0.1 @@ -6724,21 +7251,20 @@ snapshots: - bufferutil - crossws - typescript - - uWebSockets.js - utf-8-validate - graphql-tag@2.12.6(graphql@16.13.2): + graphql-tag@2.12.6(graphql@16.11.0): dependencies: - graphql: 16.13.2 + graphql: 16.11.0 tslib: 2.8.1 - graphql-ws@6.0.6(graphql@16.13.2)(ws@8.19.0): + graphql-ws@6.0.8(graphql@16.11.0)(ws@8.20.0): dependencies: - graphql: 16.13.2 + graphql: 16.11.0 optionalDependencies: - ws: 8.19.0 + ws: 8.20.0 - graphql@16.13.2: {} + graphql@16.11.0: {} handlebars@4.7.9: dependencies: @@ -6770,6 +7296,8 @@ snapshots: ignore@7.0.5: {} + immutable@3.7.6: {} + immutable@5.1.5: {} import-fresh@3.3.1: @@ -6854,23 +7382,23 @@ snapshots: isexe@3.1.1: {} - isomorphic-ws@5.0.0(ws@8.19.0): + isomorphic-ws@5.0.0(ws@8.20.0): dependencies: - ws: 8.19.0 + ws: 8.20.0 - isows@1.0.7(ws@8.19.0): + isows@1.0.7(ws@8.20.0): dependencies: - ws: 8.19.0 + ws: 8.20.0 istanbul-lib-coverage@3.2.2: {} istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.27.4 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.4 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -6882,7 +7410,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/trace-mapping': 0.3.25 debug: 4.4.3 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: @@ -6959,7 +7487,7 @@ snapshots: '@jest/types': 30.3.0 babel-jest: 30.3.0(@babel/core@7.27.4) chalk: 4.1.2 - ci-info: 4.4.0 + ci-info: 4.3.0 deepmerge: 4.3.1 glob: 10.5.0 graceful-fs: 4.2.11 @@ -7020,7 +7548,7 @@ snapshots: jest-regex-util: 30.0.1 jest-util: 30.3.0 jest-worker: 30.3.0 - picomatch: 4.0.4 + picomatch: 4.0.3 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 @@ -7044,7 +7572,7 @@ snapshots: '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - picomatch: 4.0.4 + picomatch: 4.0.3 pretty-format: 30.3.0 slash: 3.0.0 stack-utils: 2.0.6 @@ -7136,7 +7664,7 @@ snapshots: jest-snapshot@30.3.0: dependencies: '@babel/core': 7.27.4 - '@babel/generator': 7.29.1 + '@babel/generator': 7.27.5 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) '@babel/types': 7.29.0 @@ -7154,8 +7682,8 @@ snapshots: jest-message-util: 30.3.0 jest-util: 30.3.0 pretty-format: 30.3.0 - semver: 7.7.4 - synckit: 0.11.12 + semver: 7.7.2 + synckit: 0.11.11 transitivePeerDependencies: - supports-color @@ -7164,9 +7692,9 @@ snapshots: '@jest/types': 30.3.0 '@types/node': 24.12.2 chalk: 4.1.2 - ci-info: 4.4.0 + ci-info: 4.3.0 graceful-fs: 4.2.11 - picomatch: 4.0.4 + picomatch: 4.0.3 jest-validate@30.3.0: dependencies: @@ -7213,6 +7741,8 @@ snapshots: js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -7247,9 +7777,9 @@ snapshots: jsonc-eslint-parser@3.1.0: dependencies: - acorn: 8.16.0 + acorn: 8.15.0 eslint-visitor-keys: 5.0.1 - semver: 7.7.4 + semver: 7.7.2 katex@0.16.45: dependencies: @@ -7279,7 +7809,7 @@ snapshots: local-pkg@1.1.2: dependencies: - mlly: 1.8.1 + mlly: 1.8.0 pkg-types: 2.3.0 quansync: 0.2.11 @@ -7309,7 +7839,7 @@ snapshots: ansi-escapes: 7.0.0 cli-cursor: 5.0.0 slice-ansi: 7.1.0 - strip-ansi: 7.2.0 + strip-ansi: 7.1.0 wrap-ansi: 9.0.0 longest-streak@3.1.0: {} @@ -7318,6 +7848,8 @@ snapshots: dependencies: js-tokens: 4.0.0 + loupe@3.2.1: {} + lower-case-first@2.0.2: dependencies: tslib: 2.8.1 @@ -7338,7 +7870,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.4 + semver: 7.7.2 make-error@1.3.6: {} @@ -7354,14 +7886,14 @@ snapshots: dependencies: '@types/mdast': 4.0.4 escape-string-regexp: 5.0.0 - unist-util-is: 6.0.1 - unist-util-visit-parents: 6.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 - mdast-util-from-markdown@2.0.3: + mdast-util-from-markdown@2.0.2: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 - decode-named-character-reference: 1.3.0 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 micromark: 4.0.2 @@ -7379,7 +7911,7 @@ snapshots: '@types/mdast': 4.0.4 devlop: 1.1.0 escape-string-regexp: 5.0.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.2 micromark-extension-frontmatter: 2.0.0 transitivePeerDependencies: @@ -7397,7 +7929,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.2 micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: @@ -7406,7 +7938,7 @@ snapshots: mdast-util-gfm-strikethrough@2.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -7416,7 +7948,7 @@ snapshots: '@types/mdast': 4.0.4 devlop: 1.1.0 markdown-table: 3.0.4 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -7425,14 +7957,14 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color mdast-util-gfm@3.1.0: dependencies: - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.2 mdast-util-gfm-autolink-literal: 2.0.1 mdast-util-gfm-footnote: 2.1.0 mdast-util-gfm-strikethrough: 2.0.0 @@ -7448,7 +7980,7 @@ snapshots: '@types/mdast': 4.0.4 devlop: 1.1.0 longest-streak: 3.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.2 unist-util-remove-position: 5.0.0 transitivePeerDependencies: @@ -7457,7 +7989,7 @@ snapshots: mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.4 - unist-util-is: 6.0.1 + unist-util-is: 6.0.0 mdast-util-to-markdown@2.1.2: dependencies: @@ -7468,7 +8000,7 @@ snapshots: mdast-util-to-string: 4.0.0 micromark-util-classify-character: 2.0.1 micromark-util-decode-string: 2.0.1 - unist-util-visit: 5.1.0 + unist-util-visit: 5.0.0 zwitch: 2.0.4 mdast-util-to-string@4.0.0: @@ -7487,7 +8019,7 @@ snapshots: micromark-core-commonmark@2.0.3: dependencies: - decode-named-character-reference: 1.3.0 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-factory-destination: 2.0.1 micromark-factory-label: 2.0.1 @@ -7637,7 +8169,7 @@ snapshots: micromark-util-decode-string@2.0.1: dependencies: - decode-named-character-reference: 1.3.0 + decode-named-character-reference: 1.2.0 micromark-util-character: 2.1.1 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-symbol: 2.0.1 @@ -7675,7 +8207,7 @@ snapshots: dependencies: '@types/debug': 4.1.12 debug: 4.4.3 - decode-named-character-reference: 1.3.0 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 @@ -7696,7 +8228,7 @@ snapshots: micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.2 + picomatch: 2.3.1 mimic-fn@2.1.0: {} @@ -7706,7 +8238,7 @@ snapshots: dependencies: brace-expansion: 5.0.5 - minimatch@3.1.5: + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -7718,12 +8250,12 @@ snapshots: minipass@7.1.2: {} - mlly@1.8.1: + mlly@1.8.0: dependencies: - acorn: 8.16.0 + acorn: 8.15.0 pathe: 2.0.3 pkg-types: 1.3.1 - ufo: 1.6.3 + ufo: 1.6.1 module-replacements@2.11.0: {} @@ -7750,6 +8282,10 @@ snapshots: node-domexception@1.0.0: {} + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + node-fetch@3.3.2: dependencies: data-uri-to-buffer: 4.0.1 @@ -7758,7 +8294,9 @@ snapshots: node-int64@0.4.0: {} - node-releases@2.0.36: {} + node-releases@2.0.21: {} + + node-releases@2.0.38: {} normalize-path@2.1.1: dependencies: @@ -7787,9 +8325,11 @@ snapshots: dependencies: boolbase: 1.0.0 - object-deep-merge@2.0.0: {} + nullthrows@1.1.1: {} - obug@2.1.1: {} + object-assign@4.1.1: {} + + object-deep-merge@2.0.0: {} once@1.4.0: dependencies: @@ -7832,7 +8372,7 @@ snapshots: package-json-from-dist@1.0.1: {} - package-manager-detector@1.6.0: {} + package-manager-detector@1.3.0: {} param-case@3.0.4: dependencies: @@ -7895,13 +8435,15 @@ snapshots: pathe@2.0.3: {} + pathval@2.0.1: {} + picocolors@1.1.1: {} - picomatch@2.3.2: {} + picomatch@2.3.1: {} picomatch@4.0.2: {} - picomatch@4.0.4: {} + picomatch@4.0.3: {} pidtree@0.6.0: {} @@ -7914,20 +8456,20 @@ snapshots: pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.8.1 + mlly: 1.8.0 pathe: 2.0.3 pkg-types@2.3.0: dependencies: - confbox: 0.2.4 - exsolve: 1.0.8 + confbox: 0.2.2 + exsolve: 1.0.7 pathe: 2.0.3 pluralize@8.0.0: {} pnpm-workspace-yaml@1.6.0: dependencies: - yaml: 2.8.2 + yaml: 2.8.3 postcss-selector-parser@7.1.1: dependencies: @@ -7948,6 +8490,10 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + promise@7.3.1: + dependencies: + asap: 2.0.6 + property-expr@2.0.6: {} punycode@2.3.1: {} @@ -7967,19 +8513,29 @@ snapshots: refa@0.12.1: dependencies: - '@eslint-community/regexpp': 4.12.2 + '@eslint-community/regexpp': 4.12.1 + + regenerator-runtime@0.14.1: {} regexp-ast-analysis@0.7.1: dependencies: - '@eslint-community/regexpp': 4.12.2 + '@eslint-community/regexpp': 4.12.1 refa: 0.12.1 regexp-tree@0.1.27: {} - regjsparser@0.13.0: + regjsparser@0.13.1: dependencies: jsesc: 3.1.0 + relay-runtime@12.0.0: + dependencies: + '@babel/runtime': 7.27.0 + fbjs: 3.0.5 + invariant: 2.2.4 + transitivePeerDependencies: + - encoding + remedial@1.0.8: {} remove-trailing-separator@1.1.0: {} @@ -8009,35 +8565,30 @@ snapshots: rfdc@1.4.1: {} - rollup@4.60.2: + rollup@4.43.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.7 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.60.2 - '@rollup/rollup-android-arm64': 4.60.2 - '@rollup/rollup-darwin-arm64': 4.60.2 - '@rollup/rollup-darwin-x64': 4.60.2 - '@rollup/rollup-freebsd-arm64': 4.60.2 - '@rollup/rollup-freebsd-x64': 4.60.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.60.2 - '@rollup/rollup-linux-arm-musleabihf': 4.60.2 - '@rollup/rollup-linux-arm64-gnu': 4.60.2 - '@rollup/rollup-linux-arm64-musl': 4.60.2 - '@rollup/rollup-linux-loong64-gnu': 4.60.2 - '@rollup/rollup-linux-loong64-musl': 4.60.2 - '@rollup/rollup-linux-ppc64-gnu': 4.60.2 - '@rollup/rollup-linux-ppc64-musl': 4.60.2 - '@rollup/rollup-linux-riscv64-gnu': 4.60.2 - '@rollup/rollup-linux-riscv64-musl': 4.60.2 - '@rollup/rollup-linux-s390x-gnu': 4.60.2 - '@rollup/rollup-linux-x64-gnu': 4.60.2 - '@rollup/rollup-linux-x64-musl': 4.60.2 - '@rollup/rollup-openbsd-x64': 4.60.2 - '@rollup/rollup-openharmony-arm64': 4.60.2 - '@rollup/rollup-win32-arm64-msvc': 4.60.2 - '@rollup/rollup-win32-ia32-msvc': 4.60.2 - '@rollup/rollup-win32-x64-gnu': 4.60.2 - '@rollup/rollup-win32-x64-msvc': 4.60.2 + '@rollup/rollup-android-arm-eabi': 4.43.0 + '@rollup/rollup-android-arm64': 4.43.0 + '@rollup/rollup-darwin-arm64': 4.43.0 + '@rollup/rollup-darwin-x64': 4.43.0 + '@rollup/rollup-freebsd-arm64': 4.43.0 + '@rollup/rollup-freebsd-x64': 4.43.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.43.0 + '@rollup/rollup-linux-arm-musleabihf': 4.43.0 + '@rollup/rollup-linux-arm64-gnu': 4.43.0 + '@rollup/rollup-linux-arm64-musl': 4.43.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.43.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.43.0 + '@rollup/rollup-linux-riscv64-gnu': 4.43.0 + '@rollup/rollup-linux-riscv64-musl': 4.43.0 + '@rollup/rollup-linux-s390x-gnu': 4.43.0 + '@rollup/rollup-linux-x64-gnu': 4.43.0 + '@rollup/rollup-linux-x64-musl': 4.43.0 + '@rollup/rollup-win32-arm64-msvc': 4.43.0 + '@rollup/rollup-win32-ia32-msvc': 4.43.0 + '@rollup/rollup-win32-x64-msvc': 4.43.0 fsevents: 2.3.3 run-parallel@1.2.0: @@ -8048,12 +8599,14 @@ snapshots: scslre@0.3.0: dependencies: - '@eslint-community/regexpp': 4.12.2 + '@eslint-community/regexpp': 4.12.1 refa: 0.12.1 regexp-ast-analysis: 0.7.1 semver@6.3.1: {} + semver@7.7.2: {} + semver@7.7.4: {} sentence-case@3.0.4: @@ -8062,6 +8615,8 @@ snapshots: tslib: 2.8.1 upper-case-first: 2.0.2 + setimmediate@1.0.5: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -8076,18 +8631,20 @@ snapshots: signal-exit@4.1.0: {} + signedsource@1.0.0: {} + sisteransi@1.0.5: {} slash@3.0.0: {} slice-ansi@5.0.0: dependencies: - ansi-styles: 6.2.3 + ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 slice-ansi@7.1.0: dependencies: - ansi-styles: 6.2.3 + ansi-styles: 6.2.1 is-fullwidth-code-point: 5.1.0 snake-case@3.0.4: @@ -8109,9 +8666,9 @@ snapshots: spdx-expression-parse@4.0.0: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.23 + spdx-license-ids: 3.0.22 - spdx-license-ids@3.0.23: {} + spdx-license-ids@3.0.22: {} sponge-case@1.0.1: dependencies: @@ -8125,7 +8682,9 @@ snapshots: stackback@0.0.2: {} - std-env@4.1.0: {} + std-env@3.10.0: {} + + streamsearch@1.1.0: {} string-env-interpolation@1.0.1: {} @@ -8144,21 +8703,21 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.2.0 + strip-ansi: 7.1.0 string-width@7.2.0: dependencies: - emoji-regex: 10.6.0 + emoji-regex: 10.5.0 get-east-asian-width: 1.3.1 - strip-ansi: 7.2.0 + strip-ansi: 7.1.0 strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.2.0: + strip-ansi@7.1.0: dependencies: - ansi-regex: 6.2.2 + ansi-regex: 6.1.0 strip-bom@4.0.0: {} @@ -8168,6 +8727,10 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -8186,17 +8749,21 @@ snapshots: timeout-signal: 2.0.0 whatwg-mimetype: 4.0.0 + synckit@0.11.11: + dependencies: + '@pkgr/core': 0.2.9 + synckit@0.11.12: dependencies: '@pkgr/core': 0.2.9 - tapable@2.3.0: {} + tapable@2.2.3: {} test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 - minimatch: 3.1.5 + minimatch: 3.1.2 timeout-signal@2.0.0: {} @@ -8204,14 +8771,20 @@ snapshots: tinybench@2.9.0: {} - tinyexec@1.1.1: {} + tinyexec@0.3.2: {} + + tinyexec@1.0.1: {} - tinyglobby@0.2.16: + tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} - tinyrainbow@3.1.0: {} + tinyspy@4.0.4: {} title-case@3.0.3: dependencies: @@ -8234,18 +8807,20 @@ snapshots: toposort@2.0.2: {} + tr46@0.0.3: {} + ts-api-utils@2.5.0(typescript@6.0.3): dependencies: typescript: 6.0.3 ts-declaration-location@1.0.7(typescript@6.0.3): dependencies: - picomatch: 4.0.4 + picomatch: 4.0.3 typescript: 6.0.3 ts-dedent@2.2.0: {} - ts-jest@29.4.9(@babel/core@7.27.4)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.27.4))(jest-util@30.3.0)(jest@30.3.0(@types/node@24.12.2))(typescript@6.0.3): + ts-jest@29.4.9(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(jest-util@30.3.0)(jest@30.3.0(@types/node@24.12.2))(typescript@6.0.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -8259,14 +8834,16 @@ snapshots: typescript: 6.0.3 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.29.0 '@jest/transform': 30.3.0 '@jest/types': 30.3.0 - babel-jest: 30.3.0(@babel/core@7.27.4) + babel-jest: 30.3.0(@babel/core@7.29.0) jest-util: 30.3.0 ts-log@2.2.7: {} + tslib@2.6.3: {} + tslib@2.8.1: {} type-check@0.4.0: @@ -8283,7 +8860,9 @@ snapshots: typescript@6.0.3: {} - ufo@1.6.3: {} + ua-parser-js@1.0.40: {} + + ufo@1.6.1: {} uglify-js@3.19.3: optional: true @@ -8292,29 +8871,29 @@ snapshots: undici-types@7.16.0: {} - unist-util-is@6.0.1: + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.3 unist-util-remove-position@5.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-visit: 5.1.0 + unist-util-visit: 5.0.0 unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-visit-parents@6.0.2: + unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.1 + unist-util-is: 6.0.0 - unist-util-visit@5.1.0: + unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.1 - unist-util-visit-parents: 6.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 unixify@1.0.0: dependencies: @@ -8342,9 +8921,15 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.7.13 '@unrs/resolver-binding-win32-x64-msvc': 1.7.13 - update-browserslist-db@1.2.3(browserslist@4.28.1): + update-browserslist-db@1.1.3(browserslist@4.26.2): dependencies: - browserslist: 4.28.1 + browserslist: 4.26.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -8366,7 +8951,7 @@ snapshots: v8-to-istanbul@9.3.0: dependencies: - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 @@ -8374,56 +8959,92 @@ snapshots: optionalDependencies: typescript: 6.0.3 - vite@7.3.1(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.2): + vite-node@3.2.4(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.3): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 6.3.5(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.3) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@6.3.5(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.3): dependencies: - esbuild: 0.27.7 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + esbuild: 0.25.5 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 postcss: 8.5.10 - rollup: 4.60.2 - tinyglobby: 0.2.16 + rollup: 4.43.0 + tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.12.2 fsevents: 2.3.3 jiti: 2.4.0 - yaml: 2.8.2 - - vitest@4.1.5(@types/node@24.12.2)(vite@7.3.1(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.2)): - dependencies: - '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(vite@7.3.1(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.2)) - '@vitest/pretty-format': 4.1.5 - '@vitest/runner': 4.1.5 - '@vitest/snapshot': 4.1.5 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 - es-module-lexer: 2.0.0 + yaml: 2.8.3 + + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.3): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.3)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + debug: 4.4.3 expect-type: 1.3.0 magic-string: 0.30.21 - obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 4.1.0 + picomatch: 4.0.3 + std-env: 3.10.0 tinybench: 2.9.0 - tinyexec: 1.1.1 - tinyglobby: 0.2.16 - tinyrainbow: 3.1.0 - vite: 7.3.1(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.2) + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 6.3.5(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.3) + vite-node: 3.2.4(@types/node@24.12.2)(jiti@2.4.0)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: + '@types/debug': 4.1.12 '@types/node': 24.12.2 transitivePeerDependencies: + - jiti + - less + - lightningcss - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml vue-eslint-parser@10.4.0(eslint@10.2.1(jiti@2.4.0)): dependencies: debug: 4.4.3 eslint: 10.2.1(jiti@2.4.0) - eslint-scope: 9.1.2 - eslint-visitor-keys: 5.0.1 - espree: 11.2.0 - esquery: 1.7.0 - semver: 7.7.4 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -8433,8 +9054,15 @@ snapshots: web-streams-polyfill@3.3.3: {} + webidl-conversions@3.0.1: {} + whatwg-mimetype@4.0.0: {} + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -8466,15 +9094,15 @@ snapshots: wrap-ansi@8.1.0: dependencies: - ansi-styles: 6.2.3 + ansi-styles: 6.2.1 string-width: 5.1.2 - strip-ansi: 7.2.0 + strip-ansi: 7.1.0 wrap-ansi@9.0.0: dependencies: - ansi-styles: 6.2.3 + ansi-styles: 6.2.1 string-width: 7.2.0 - strip-ansi: 7.2.0 + strip-ansi: 7.1.0 wrappy@1.0.2: {} @@ -8483,7 +9111,7 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 - ws@8.19.0: {} + ws@8.20.0: {} xml-name-validator@4.0.0: {} @@ -8494,9 +9122,11 @@ snapshots: yaml-eslint-parser@2.0.0: dependencies: eslint-visitor-keys: 5.0.1 - yaml: 2.8.2 + yaml: 2.8.1 + + yaml@2.8.1: {} - yaml@2.8.2: {} + yaml@2.8.3: {} yargs-parser@21.1.1: {} diff --git a/src/config.ts b/src/config.ts index f75ab40f..0275899d 100644 --- a/src/config.ts +++ b/src/config.ts @@ -3,15 +3,30 @@ import type { NamingConventionMap } from '@graphql-codegen/visitor-plugin-common export type ValidationSchema = 'yup' | 'zod' | 'zodv4' | 'myzod' | 'valibot'; export type ValidationSchemaExportType = 'function' | 'const'; +export type ZodOptionalType = 'nullish' | 'nullable' | 'optional'; + +export type DirectiveSchemaTemplate + = | string + | number + | boolean + | bigint + | null + | undefined + | ((...args: any[]) => any) + | DirectiveSchemaTemplate[] + | { [key: string]: DirectiveSchemaTemplate }; export interface DirectiveConfig { - [directive: string]: { - [argument: string]: string | string[] | DirectiveObjectArguments - } + [directive: string]: + | DirectiveSchemaTemplate + | DirectiveSchemaTemplate[] + | { + [argument: string]: DirectiveSchemaTemplate | DirectiveSchemaTemplate[] | DirectiveObjectArguments + } } export interface DirectiveObjectArguments { - [matched: string]: string | string[] + [matched: string]: DirectiveSchemaTemplate | DirectiveSchemaTemplate[] } interface ScalarSchemas { @@ -252,6 +267,14 @@ export interface ValidationSchemaPluginConfig extends TypeScriptPluginConfig { * ``` */ withObjectType?: boolean + /** + * @description Generates validation schemas for GraphQL operation result selection sets. + * This is separate from withObjectType: object type schemas describe the full GraphQL type, + * while operation schemas describe only the fields selected by each operation document. + * Currently supported by zod and zodv4. + * @default false + */ + withOperationType?: boolean /** * @description Specify validation schema export type. * @default function @@ -268,6 +291,38 @@ export interface ValidationSchemaPluginConfig extends TypeScriptPluginConfig { * ``` */ validationSchemaExportType?: ValidationSchemaExportType + /** + * @description Controls how nullable GraphQL fields are represented in Zod schemas. + * The default `nullish` mode matches GraphQL input coercion. `nullable` and `optional` + * are opt-in compatibility modes for projects that also customize their generated + * TypeScript Maybe/InputMaybe contracts. + * @default nullish + */ + zodOptionalType?: ZodOptionalType + /** + * @description Alias for zodOptionalType. + * The default `nullish` mode matches GraphQL input coercion. `nullable` and `optional` + * are opt-in compatibility modes for projects that also customize their generated + * TypeScript Maybe/InputMaybe contracts. + * @default nullish + */ + nullishBehavior?: ZodOptionalType + /** + * @description Appends `.strict()` to generated Zod object schemas. + * @default false + */ + strictObjectSchemas?: boolean + /** + * @description Appends `.describe()` calls from GraphQL descriptions in generated Zod schemas. + * @default false + */ + withDescriptions?: boolean + /** + * @description Maximum nested object depth to validate from generated object schemas. + * This is useful for cyclic output graphs. The option currently applies to zod and zodv4 + * object type schemas generated with withObjectType. + */ + maxDepth?: number /** * @description Uses the full path of the enum type as the default value instead of the stringified value. * @default false diff --git a/src/directive.ts b/src/directive.ts index 4b0641c6..9b36310e 100644 --- a/src/directive.ts +++ b/src/directive.ts @@ -1,5 +1,5 @@ import type { ConstArgumentNode, ConstDirectiveNode, ConstValueNode } from 'graphql'; -import type { DirectiveConfig, DirectiveObjectArguments } from './config.js'; +import type { DirectiveConfig, DirectiveObjectArguments, DirectiveSchemaTemplate } from './config.js'; import { Kind, valueFromASTUntyped } from 'graphql'; import { isConvertableRegexp } from './regexp.js'; @@ -9,13 +9,15 @@ export interface FormattedDirectiveConfig { } export interface FormattedDirectiveArguments { - [argument: string]: string[] | FormattedDirectiveObjectArguments | undefined + [argument: string]: DirectiveSchemaTemplate[] | FormattedDirectiveObjectArguments | undefined } export interface FormattedDirectiveObjectArguments { - [matched: string]: string[] | undefined + [matched: string]: DirectiveSchemaTemplate[] | undefined } +const DIRECTIVE_SCHEMA_KEY = '__directive'; + function isFormattedDirectiveObjectArguments(arg: FormattedDirectiveArguments[keyof FormattedDirectiveArguments]): arg is FormattedDirectiveObjectArguments { return arg !== undefined && !Array.isArray(arg) } @@ -47,12 +49,18 @@ function isFormattedDirectiveObjectArguments(arg: FormattedDirectiveArguments[ke export function formatDirectiveConfig(config: DirectiveConfig): FormattedDirectiveConfig { return Object.fromEntries( Object.entries(config).map(([directive, arg]) => { + if (Array.isArray(arg)) + return [directive, { [DIRECTIVE_SCHEMA_KEY]: arg }]; + + if (typeof arg !== 'object' || arg === null || typeof arg === 'function') + return [directive, { [DIRECTIVE_SCHEMA_KEY]: [arg] }]; + const formatted = Object.fromEntries( Object.entries(arg).map(([arg, val]) => { if (Array.isArray(val)) return [arg, val]; - if (typeof val === 'string') + if (typeof val !== 'object' || val === null || typeof val === 'function') return [arg, [val, '$1']]; return [arg, formatDirectiveObjectArguments(val)]; @@ -154,13 +162,16 @@ export function buildApiForValibot(config: FormattedDirectiveConfig, directives: .flat() } -function buildApiSchema(validationSchema: string[] | undefined, argValue: ConstValueNode): string { +function buildApiSchema(validationSchema: DirectiveSchemaTemplate[] | undefined, argValue?: ConstValueNode): string { if (!validationSchema) return ''; const schemaApi = validationSchema[0]; + if (typeof schemaApi !== 'string') + return ''; + const schemaApiArgs = validationSchema.slice(1).map((templateArg) => { - const gqlSchemaArgs = apiArgsFromConstValueNode(argValue); + const gqlSchemaArgs = argValue ? apiArgsFromConstValueNode(argValue) : []; return applyArgToApiSchemaTemplate(templateArg, gqlSchemaArgs); }); return `.${schemaApi}(${schemaApiArgs.join(', ')})`; @@ -171,6 +182,11 @@ function buildApiFromDirectiveArguments(config: FormattedDirectiveArguments, arg } function _buildApiFromDirectiveArguments(config: FormattedDirectiveArguments, args: ReadonlyArray): string[] { + if (args.length === 0) { + const validationSchema = config[DIRECTIVE_SCHEMA_KEY]; + return [isFormattedDirectiveObjectArguments(validationSchema) ? '' : buildApiSchema(validationSchema)]; + } + return args .map((arg) => { const argName = arg.name.value; @@ -190,7 +206,10 @@ function buildApiFromDirectiveObjectArguments(config: FormattedDirectiveObjectAr return buildApiSchema(validationSchema, argValue); } -function applyArgToApiSchemaTemplate(template: string, apiArgs: any[]): string { +function applyArgToApiSchemaTemplate(template: DirectiveSchemaTemplate, apiArgs: any[]): string { + if (typeof template !== 'string') + return stringify(applyArgsToTemplateValue(template, apiArgs)); + const matches = template.matchAll(/\$(\d+)/g); for (const match of matches) { const placeholder = match[0]; // `$1` @@ -215,6 +234,9 @@ function stringify(arg: any, quoteString?: boolean): string { if (Array.isArray(arg)) return arg.map(v => stringify(v, true)).join(','); + if (typeof arg === 'function') + return arg.toString(); + if (typeof arg === 'string') { if (isConvertableRegexp(arg)) return arg; @@ -233,6 +255,33 @@ function stringify(arg: any, quoteString?: boolean): string { return JSON.stringify(arg); } +function applyArgsToTemplateValue(template: DirectiveSchemaTemplate, apiArgs: any[]): any { + if (typeof template === 'string') { + if (template === '') + return template; + + let value = template; + for (const match of template.matchAll(/\$(\d+)/g)) { + const placeholder = match[0]; + const idx = Number.parseInt(match[1], 10) - 1; + const apiArg = apiArgs[idx]; + value = value.replace(placeholder, apiArg === undefined ? '' : apiArg); + } + return value; + } + + if (Array.isArray(template)) + return template.map(item => applyArgsToTemplateValue(item, apiArgs)); + + if (template && typeof template === 'object') { + return Object.fromEntries( + Object.entries(template).map(([key, value]) => [key, applyArgsToTemplateValue(value, apiArgs)]), + ); + } + + return template; +} + function apiArgsFromConstValueNode(value: ConstValueNode): any[] { const val = valueFromASTUntyped(value); if (Array.isArray(val)) diff --git a/src/index.ts b/src/index.ts index 7a37065e..dbff7f6a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,7 +3,7 @@ import type { GraphQLSchema } from 'graphql'; import type { ValidationSchemaPluginConfig } from './config.js'; import type { SchemaVisitor } from './types.js'; import { transformSchemaAST } from '@graphql-codegen/schema-ast'; -import { buildSchema, printSchema, visit } from 'graphql'; +import { buildSchema, Kind, printSchema, visit } from 'graphql'; import { isGeneratedByIntrospection, topologicalSortAST } from './graphql.js'; import { MyZodSchemaVisitor } from './myzod/index.js'; @@ -14,19 +14,26 @@ import { ZodV4SchemaVisitor } from './zodv4/index.js'; export const plugin: PluginFunction = ( schema: GraphQLSchema, - _documents: Types.DocumentFile[], + documents: Types.DocumentFile[], config: ValidationSchemaPluginConfig, ): Types.ComplexPluginOutput => { const { schema: _schema, ast } = _transformSchemaAST(schema, config); const visitor = schemaVisitor(_schema, config); - const result = visit(ast, visitor); + const visitAst = config.onlyEnums + ? { ...ast, definitions: ast.definitions.filter(def => def.kind === Kind.ENUM_TYPE_DEFINITION) } + : ast; + + const result = visit(visitAst, visitor); const generated = result.definitions.filter(def => typeof def === 'string'); + const operationDefinitions = config.withOperationType === true && config.onlyEnums !== true + ? visitor.buildOperationDefinitions(documents) + : []; return { prepend: visitor.buildImports(), - content: [visitor.initialEmit(), ...generated].join('\n'), + content: [visitor.initialEmit(), ...generated, ...operationDefinitions].join('\n'), }; }; diff --git a/src/myzod/index.ts b/src/myzod/index.ts index bfbb706a..d84afce7 100644 --- a/src/myzod/index.ts +++ b/src/myzod/index.ts @@ -163,9 +163,11 @@ export class MyZodSchemaVisitor extends BaseSchemaVisitor { return { leave: (node: EnumTypeDefinitionNode) => { const visitor = this.createVisitor('both'); - const enumname = visitor.convertName(node.name.value); + const enumname = visitor.convertSchemaName(node.name.value, node.kind); const enumTypeName = visitor.prefixTypeNamespace(enumname); this.importTypes.push(enumname); + if (!this.config.enumsAsTypes) + this.importValueTypes.push(enumname); // z.enum are basically myzod.literals // hoist enum declarations this.enumDeclarations.push( @@ -300,7 +302,10 @@ function generateFieldTypeMyZodSchema(config: ValidationSchemaPluginConfig, visi if (config.namingConvention?.enumValues) value = convertNameParts(defaultValue.value, resolveExternalModuleAndFn(config.namingConvention?.enumValues), config?.namingConvention?.transformUnderscore); - appliedDirectivesGen = `${appliedDirectivesGen}.default(${visitor.convertName(type.name.value)}.${value})`; + const enumTypeName = visitor.prefixTypeNamespace( + visitor.convertSchemaName(type.name.value, visitor.getType(type.name.value)?.astNode?.kind), + ); + appliedDirectivesGen = `${appliedDirectivesGen}.default(${enumTypeName}.${value})`; } else { appliedDirectivesGen = `${appliedDirectivesGen}.default("${escapeGraphQLCharacters(defaultValue.value)}")`; diff --git a/src/schema_visitor.ts b/src/schema_visitor.ts index ca2daa66..669ce6bb 100644 --- a/src/schema_visitor.ts +++ b/src/schema_visitor.ts @@ -1,3 +1,6 @@ +import type { + Types, +} from '@graphql-codegen/plugin-helpers'; import type { FieldDefinitionNode, GraphQLSchema, @@ -12,6 +15,7 @@ import { Visitor } from './visitor.js'; export abstract class BaseSchemaVisitor implements SchemaVisitor { protected importTypes: string[] = []; + protected importValueTypes: string[] = []; protected enumDeclarations: string[] = []; constructor( @@ -24,21 +28,38 @@ export abstract class BaseSchemaVisitor implements SchemaVisitor { buildImports(): string[] { if (this.config.importFrom && this.importTypes.length > 0) { const namedImportPrefix = this.config.useTypeImports ? 'type ' : ''; + const importValueTypes = [...new Set(this.importValueTypes)]; + const importTypes = [...new Set(this.importTypes)] + .filter(type => this.config.useTypeImports !== true || !importValueTypes.includes(type)); const importCore = this.config.schemaNamespacedImportName ? `* as ${this.config.schemaNamespacedImportName}` - : `${namedImportPrefix}{ ${this.importTypes.join(', ')} }`; + : `${namedImportPrefix}{ ${importTypes.join(', ')} }`; + + const imports = [this.importValidationSchema()]; + + if (this.config.schemaNamespacedImportName) { + imports.push(`import ${importCore} from '${this.config.importFrom}'`); + return imports; + } + + if (this.config.useTypeImports === true && importValueTypes.length > 0) + imports.push(`import { ${importValueTypes.join(', ')} } from '${this.config.importFrom}'`); - return [ - this.importValidationSchema(), - `import ${importCore} from '${this.config.importFrom}'`, - ]; + if (importTypes.length > 0) + imports.push(`import ${importCore} from '${this.config.importFrom}'`); + + return imports; } return [this.importValidationSchema()]; } abstract initialEmit(): string; + buildOperationDefinitions(_documents: Types.DocumentFile[]): string[] { + return []; + } + createVisitor(scalarDirection: 'input' | 'output' | 'both'): Visitor { return new Visitor(scalarDirection, this.schema, this.config); } diff --git a/src/types.ts b/src/types.ts index 6c73e870..b940c984 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,3 +1,4 @@ +import type { Types } from '@graphql-codegen/plugin-helpers'; import type { ASTNode, ASTVisitFn } from 'graphql'; export type NewVisitor = Partial<{ @@ -9,4 +10,5 @@ export type NewVisitor = Partial<{ export interface SchemaVisitor extends NewVisitor { buildImports: () => string[] initialEmit: () => string + buildOperationDefinitions: (documents: Types.DocumentFile[]) => string[] } diff --git a/src/valibot/index.ts b/src/valibot/index.ts index 722c7ecd..c52cdd65 100644 --- a/src/valibot/index.ts +++ b/src/valibot/index.ts @@ -124,9 +124,11 @@ export class ValibotSchemaVisitor extends BaseSchemaVisitor { return { leave: (node: EnumTypeDefinitionNode) => { const visitor = this.createVisitor('both'); - const enumname = visitor.convertName(node.name.value); + const enumname = visitor.convertSchemaName(node.name.value, node.kind); const enumTypeName = visitor.prefixTypeNamespace(enumname); this.importTypes.push(enumname); + if (!this.config.enumsAsTypes) + this.importValueTypes.push(enumname); // hoist enum declarations this.enumDeclarations.push( @@ -205,13 +207,13 @@ export class ValibotSchemaVisitor extends BaseSchemaVisitor { function generateFieldValibotSchema(config: ValidationSchemaPluginConfig, visitor: Visitor, field: InputValueDefinitionNode | FieldDefinitionNode, indentCount: number): string { const gen = generateFieldTypeValibotSchema(config, visitor, field, field.type); - return indent(`${field.name.value}: ${maybeLazy(visitor, field.type, gen)}`, indentCount); + return indent(`${field.name.value}: ${gen}`, indentCount); } function generateFieldTypeValibotSchema(config: ValidationSchemaPluginConfig, visitor: Visitor, field: InputValueDefinitionNode | FieldDefinitionNode, type: TypeNode, parentType?: TypeNode): string { if (isListType(type)) { const gen = generateFieldTypeValibotSchema(config, visitor, field, type.type, type); - const arrayGen = `v.array(${maybeLazy(visitor, type.type, gen)})`; + const arrayGen = `v.array(${gen})`; if (!isNonNullType(parentType)) return `v.nullish(${arrayGen})`; @@ -219,24 +221,25 @@ function generateFieldTypeValibotSchema(config: ValidationSchemaPluginConfig, vi } if (isNonNullType(type)) { const gen = generateFieldTypeValibotSchema(config, visitor, field, type.type, type); - return maybeLazy(visitor, type.type, gen); + return gen; } if (isNamedType(type)) { const gen = generateNameNodeValibotSchema(config, visitor, type.name); if (isListType(parentType)) - return `v.nullable(${gen})`; + return `v.nullable(${maybeLazy(visitor, type, gen)})`; const actions = actionsFromDirectives(config, field); + const schema = maybeLazy(visitor, type, pipeSchemaAndActions(gen, actions)); if (isNonNullType(parentType)) { if (visitor.shouldEmitAsNotAllowEmptyString(type.name.value)) { actions.push('v.minLength(1)'); } - return pipeSchemaAndActions(gen, actions); + return maybeLazy(visitor, type, pipeSchemaAndActions(gen, actions)); } - return `v.nullish(${pipeSchemaAndActions(gen, actions)})`; + return `v.nullish(${schema})`; } console.warn('unhandled type:', type); return ''; diff --git a/src/visitor.ts b/src/visitor.ts index 4d649090..70bcfbfc 100644 --- a/src/visitor.ts +++ b/src/visitor.ts @@ -45,10 +45,18 @@ export class Visitor extends TsVisitor { return { targetKind: astNode.kind, - convertName: () => this.convertName(astNode.name.value), + convertName: () => this.convertSchemaName(astNode.name.value, astNode.kind), }; } + public convertSchemaName(name: string, kind?: string): string { + return this.convertName(name, { + useTypesPrefix: kind === 'EnumTypeDefinition' && this.pluginConfig.enumPrefix === false + ? false + : undefined, + }); + } + public getScalarType(scalarName: string): string | null { if (this.scalarDirection === 'both') return null; diff --git a/src/yup/index.ts b/src/yup/index.ts index 0dd808b1..70302adc 100644 --- a/src/yup/index.ts +++ b/src/yup/index.ts @@ -175,9 +175,11 @@ export class YupSchemaVisitor extends BaseSchemaVisitor { return { leave: (node: EnumTypeDefinitionNode) => { const visitor = this.createVisitor('both'); - const enumname = visitor.convertName(node.name.value); + const enumname = visitor.convertSchemaName(node.name.value, node.kind); const enumTypeName = visitor.prefixTypeNamespace(enumname); this.importTypes.push(enumname); + if (!this.config.enumsAsTypes) + this.importValueTypes.push(enumname); // hoise enum declarations if (this.config.enumsAsTypes) { @@ -307,7 +309,10 @@ function shapeFields(fields: readonly (FieldDefinitionNode | InputValueDefinitio : isNamedType(field.type) ? field.type.name.value : field.name.value; - fieldSchema = `${fieldSchema}.default(${visitor.convertName(enumName)}.${value})`; + const enumTypeName = visitor.prefixTypeNamespace( + visitor.convertSchemaName(enumName, visitor.getType(enumName)?.astNode?.kind), + ); + fieldSchema = `${fieldSchema}.default(${enumTypeName}.${value})`; } else { fieldSchema = `${fieldSchema}.default("${escapeGraphQLCharacters(defaultValue.value)}")`; diff --git a/src/zod/index.ts b/src/zod/index.ts index 9161369b..426b3bc3 100644 --- a/src/zod/index.ts +++ b/src/zod/index.ts @@ -1,8 +1,11 @@ +import type { Types } from '@graphql-codegen/plugin-helpers'; import type { + ConstValueNode, EnumTypeDefinitionNode, FieldDefinitionNode, GraphQLSchema, InputObjectTypeDefinitionNode, + InputObjectTypeExtensionNode, InputValueDefinitionNode, InterfaceTypeDefinitionNode, NameNode, @@ -17,8 +20,10 @@ import { resolveExternalModuleAndFn } from '@graphql-codegen/plugin-helpers'; import { convertNameParts, DeclarationBlock, indent } from '@graphql-codegen/visitor-plugin-common'; import { isEnumType, + isInputObjectType, isScalarType, Kind, + valueFromASTUntyped, } from 'graphql'; import { buildApi, formatDirectiveConfig } from '../directive.js'; import { @@ -30,6 +35,7 @@ import { ObjectTypeDefinitionBuilder, } from '../graphql.js'; import { BaseSchemaVisitor } from '../schema_visitor.js'; +import { buildZodOperationSchemas } from './operation.js'; const anySchema = `definedNonNullAnySchema`; @@ -50,7 +56,7 @@ export class ZodSchemaVisitor extends BaseSchemaVisitor { new DeclarationBlock({}) .asKind('type') .withName('Properties') - .withContent(['Required<{', ' [K in keyof T]: z.ZodType;', '}>'].join('\n')) + .withContent(['Required<{', ' [K in keyof T]: z.ZodType;', '}>'].join('\n')) .string, // Unfortunately, zod doesn’t provide non-null defined any schema. // This is a temporary hack until it is fixed. @@ -73,12 +79,22 @@ export class ZodSchemaVisitor extends BaseSchemaVisitor { ); } + buildOperationDefinitions(documents: Types.DocumentFile[]): string[] { + const visitor = this.createVisitor('output'); + const result = buildZodOperationSchemas(this.schema, this.config, documents, visitor); + this.importTypes.push(...result.typeNames); + return result.blocks; + } + get InputObjectTypeDefinition() { return { leave: (node: InputObjectTypeDefinitionNode) => { const visitor = this.createVisitor('input'); const name = visitor.convertName(node.name.value); this.importTypes.push(name); + if (isOneOfInputObject(node)) + return this.buildOneOfInputFields(node.fields ?? [], visitor, name); + return this.buildInputFields(node.fields ?? [], visitor, name); }, }; @@ -97,7 +113,7 @@ export class ZodSchemaVisitor extends BaseSchemaVisitor { const appendArguments = argumentBlocks ? `\n${argumentBlocks}` : ''; // Building schema for fields. - const shape = node.fields?.map(field => generateFieldZodSchema(this.config, visitor, field, 2)).join(',\n'); + const shape = node.fields?.map(field => generateFieldZodSchema(this.config, visitor, field, 2, schemaDepthVariable(this.config))).join(',\n'); switch (this.config.validationSchemaExportType) { case 'const': @@ -106,7 +122,7 @@ export class ZodSchemaVisitor extends BaseSchemaVisitor { .export() .asKind('const') .withName(`${name}Schema: z.ZodObject>`) - .withContent([`z.object({`, shape, '})'].join('\n')) + .withContent(buildObjectExpression(this.config, shape)) .string + appendArguments ); @@ -116,8 +132,8 @@ export class ZodSchemaVisitor extends BaseSchemaVisitor { new DeclarationBlock({}) .export() .asKind('function') - .withName(`${name}Schema(): z.ZodObject>`) - .withBlock([indent(`return z.object({`), shape, indent('})')].join('\n')) + .withName(`${name}Schema(${schemaDepthParameter(this.config)}): z.ZodObject>`) + .withBlock(buildObjectReturn(this.config, shape)) .string + appendArguments ); } @@ -138,7 +154,7 @@ export class ZodSchemaVisitor extends BaseSchemaVisitor { const appendArguments = argumentBlocks ? `\n${argumentBlocks}` : ''; // Building schema for fields. - const shape = node.fields?.map(field => generateFieldZodSchema(this.config, visitor, field, 2)).join(',\n'); + const shape = node.fields?.map(field => generateFieldZodSchema(this.config, visitor, field, 2, schemaDepthVariable(this.config))).join(',\n'); switch (this.config.validationSchemaExportType) { case 'const': @@ -147,14 +163,7 @@ export class ZodSchemaVisitor extends BaseSchemaVisitor { .export() .asKind('const') .withName(`${name}Schema: z.ZodObject>`) - .withContent( - [ - `z.object({`, - indent(`__typename: z.literal('${node.name.value}').optional(),`, 2), - shape, - '})', - ].join('\n'), - ) + .withContent(buildObjectExpression(this.config, [indent(`__typename: z.literal('${node.name.value}').optional(),`, 2), shape].join('\n'))) .string + appendArguments ); @@ -164,15 +173,8 @@ export class ZodSchemaVisitor extends BaseSchemaVisitor { new DeclarationBlock({}) .export() .asKind('function') - .withName(`${name}Schema(): z.ZodObject>`) - .withBlock( - [ - indent(`return z.object({`), - indent(`__typename: z.literal('${node.name.value}').optional(),`, 2), - shape, - indent('})'), - ].join('\n'), - ) + .withName(`${name}Schema(${schemaDepthParameter(this.config)}): z.ZodObject>`) + .withBlock(buildObjectReturn(this.config, [indent(`__typename: z.literal('${node.name.value}').optional(),`, 2), shape].join('\n'))) .string + appendArguments ); } @@ -184,9 +186,12 @@ export class ZodSchemaVisitor extends BaseSchemaVisitor { return { leave: (node: EnumTypeDefinitionNode) => { const visitor = this.createVisitor('both'); - const enumname = visitor.convertName(node.name.value); + const enumname = visitor.convertSchemaName(node.name.value, node.kind); const enumTypeName = visitor.prefixTypeNamespace(enumname); this.importTypes.push(enumname); + if (!this.config.enumsAsTypes) + this.importValueTypes.push(enumname); + const enumValues = node.values?.map(enumOption => enumOption.name.value) ?? []; // hoist enum declarations this.enumDeclarations.push( @@ -194,13 +199,13 @@ export class ZodSchemaVisitor extends BaseSchemaVisitor { ? new DeclarationBlock({}) .export() .asKind('const') - .withName(`${enumname}Schema`) - .withContent(`z.enum([${node.values?.map(enumOption => `'${enumOption.name.value}'`).join(', ')}])`) + .withName(`${enumname}Schema: z.ZodType<${unionLiterals(enumValues)}>`) + .withContent(`z.enum([${enumValues.map(enumOption => `'${enumOption}'`).join(', ')}])`) .string : new DeclarationBlock({}) .export() .asKind('const') - .withName(`${enumname}Schema`) + .withName(`${enumname}Schema: z.ZodType<${enumTypeName}>`) .withContent(`z.nativeEnum(${enumTypeName})`) .string, ); @@ -215,6 +220,7 @@ export class ZodSchemaVisitor extends BaseSchemaVisitor { return; const visitor = this.createVisitor('output'); const unionName = visitor.convertName(node.name.value); + const depthVariable = schemaDepthVariable(this.config); const unionElements = node.types.map((t) => { const element = visitor.convertName(t.name.value); const typ = visitor.getType(t.name.value); @@ -226,7 +232,7 @@ export class ZodSchemaVisitor extends BaseSchemaVisitor { return `${element}Schema`; case 'function': default: - return `${element}Schema()`; + return depthVariable ? `${element}Schema(depth)` : `${element}Schema()`; } }).join(', '); const unionElementsCount = node.types.length ?? 0; @@ -241,7 +247,7 @@ export class ZodSchemaVisitor extends BaseSchemaVisitor { return new DeclarationBlock({}) .export() .asKind('function') - .withName(`${unionName}Schema()`) + .withName(`${unionName}Schema(${schemaDepthParameter(this.config)})`) .withBlock(indent(`return ${union}`)) .string; } @@ -256,6 +262,7 @@ export class ZodSchemaVisitor extends BaseSchemaVisitor { ) { const typeName = visitor.prefixTypeNamespace(name); const shape = fields.map(field => generateFieldZodSchema(this.config, visitor, field, 2)).join(',\n'); + const objectSchema = buildObjectExpression(this.config, shape); switch (this.config.validationSchemaExportType) { case 'const': @@ -263,7 +270,7 @@ export class ZodSchemaVisitor extends BaseSchemaVisitor { .export() .asKind('const') .withName(`${name}Schema: z.ZodObject>`) - .withContent(['z.object({', shape, '})'].join('\n')) + .withContent(objectSchema) .string; case 'function': @@ -272,58 +279,85 @@ export class ZodSchemaVisitor extends BaseSchemaVisitor { .export() .asKind('function') .withName(`${name}Schema(): z.ZodObject>`) - .withBlock([indent(`return z.object({`), shape, indent('})')].join('\n')) + .withBlock(buildObjectReturn(this.config, shape)) + .string; + } + } + + private buildOneOfInputFields( + fields: readonly InputValueDefinitionNode[], + visitor: Visitor, + name: string, + ) { + const typeName = visitor.prefixTypeNamespace(name); + const variants = fields.map((selectedField) => { + const shape = fields.map((field) => { + if (field === selectedField) { + const gen = generateFieldTypeZodSchema(this.config, visitor, field, field.type, undefined, true, true); + return indent(`${field.name.value}: ${withDescription(this.config, field, maybeLazy(visitor, field.type, gen))}`, 2); + } + + return indent(`${field.name.value}: z.never().optional()`, 2); + }).join(',\n'); + + return buildObjectExpression(this.config, shape); + }); + const schema = variants.length > 1 ? `z.union([\n${variants.map(variant => indent(variant, 2)).join(',\n')}\n])` : variants[0]; + + switch (this.config.validationSchemaExportType) { + case 'const': + return new DeclarationBlock({}) + .export() + .asKind('const') + .withName(`${name}Schema: z.ZodType<${typeName}>`) + .withContent(schema) + .string; + + case 'function': + default: + return new DeclarationBlock({}) + .export() + .asKind('function') + .withName(`${name}Schema(): z.ZodType<${typeName}>`) + .withBlock(indent(`return ${schema}`)) .string; } } } -function generateFieldZodSchema(config: ValidationSchemaPluginConfig, visitor: Visitor, field: InputValueDefinitionNode | FieldDefinitionNode, indentCount: number): string { - const gen = generateFieldTypeZodSchema(config, visitor, field, field.type); - return indent(`${field.name.value}: ${maybeLazy(visitor, field.type, gen)}`, indentCount); +function generateFieldZodSchema(config: ValidationSchemaPluginConfig, visitor: Visitor, field: InputValueDefinitionNode | FieldDefinitionNode, indentCount: number, depthVariable?: string): string { + const gen = generateFieldTypeZodSchema(config, visitor, field, field.type, undefined, true, false, depthVariable); + return indent(`${field.name.value}: ${withDescription(config, field, maybeLazy(visitor, field.type, gen))}`, indentCount); } -function generateFieldTypeZodSchema(config: ValidationSchemaPluginConfig, visitor: Visitor, field: InputValueDefinitionNode | FieldDefinitionNode, type: TypeNode, parentType?: TypeNode): string { +function generateFieldTypeZodSchema(config: ValidationSchemaPluginConfig, visitor: Visitor, field: InputValueDefinitionNode | FieldDefinitionNode, type: TypeNode, parentType?: TypeNode, isRoot = true, forceRequired = false, depthVariable?: string): string { if (isListType(type)) { - const gen = generateFieldTypeZodSchema(config, visitor, field, type.type, type); - if (!isNonNullType(parentType)) { - const arrayGen = `z.array(${maybeLazy(visitor, type.type, gen)})`; - const maybeLazyGen = applyDirectives(config, field, arrayGen); - return `${maybeLazyGen}.nullish()`; + const gen = generateFieldTypeZodSchema(config, visitor, field, type.type, type, false, false, depthVariable); + const arrayGen = `z.array(${maybeLazy(visitor, type.type, gen)})`; + const maybeDirectivesGen = isRoot ? applyDirectives(config, field, arrayGen) : arrayGen; + const maybeDefaultGen = hasNullDefault(field) ? maybeDirectivesGen : applyDefaultValue(config, visitor, field, type, maybeDirectivesGen); + if (!isNonNullType(parentType) && !forceRequired) { + if (hasNullDefault(field)) + return withNullDefault(config, maybeDirectivesGen); + + return `${maybeDefaultGen}.${zodOptionalType(config)}()`; } - return `z.array(${maybeLazy(visitor, type.type, gen)})`; + return maybeDefaultGen; } if (isNonNullType(type)) { - const gen = generateFieldTypeZodSchema(config, visitor, field, type.type, type); + const gen = generateFieldTypeZodSchema(config, visitor, field, type.type, type, isRoot, forceRequired, depthVariable); return maybeLazy(visitor, type.type, gen); } if (isNamedType(type)) { - const gen = generateNameNodeZodSchema(config, visitor, type.name); + const gen = generateNameNodeZodSchema(config, visitor, type.name, depthVariable); if (isListType(parentType)) return `${gen}.nullable()`; - let appliedDirectivesGen = applyDirectives(config, field, gen); - - if (field.kind === Kind.INPUT_VALUE_DEFINITION) { - const { defaultValue } = field; - - if (defaultValue?.kind === Kind.INT || defaultValue?.kind === Kind.FLOAT || defaultValue?.kind === Kind.BOOLEAN) - appliedDirectivesGen = `${appliedDirectivesGen}.default(${defaultValue.value})`; - - if (defaultValue?.kind === Kind.STRING || defaultValue?.kind === Kind.ENUM) { - if (config.useEnumTypeAsDefaultValue && defaultValue?.kind !== Kind.STRING) { - let value = convertNameParts(defaultValue.value, resolveExternalModuleAndFn('change-case-all#pascalCase'), config.namingConvention?.transformUnderscore); - - if (config.namingConvention?.enumValues) - value = convertNameParts(defaultValue.value, resolveExternalModuleAndFn(config.namingConvention?.enumValues), config.namingConvention?.transformUnderscore); - - appliedDirectivesGen = `${appliedDirectivesGen}.default(${type.name.value}.${value})`; - } - else { - appliedDirectivesGen = `${appliedDirectivesGen}.default("${escapeGraphQLCharacters(defaultValue.value)}")`; - } - } - } + const appliedDirectivesGen = isRoot + ? hasNullDefault(field) + ? applyDirectives(config, field, gen) + : applyDefaultValue(config, visitor, field, type, applyDirectives(config, field, gen)) + : gen; if (isNonNullType(parentType)) { if (visitor.shouldEmitAsNotAllowEmptyString(type.name.value)) @@ -334,12 +368,148 @@ function generateFieldTypeZodSchema(config: ValidationSchemaPluginConfig, visito if (isListType(parentType)) return `${appliedDirectivesGen}.nullable()`; - return `${appliedDirectivesGen}.nullish()`; + if (forceRequired) + return appliedDirectivesGen; + + return hasNullDefault(field) + ? withNullDefault(config, appliedDirectivesGen) + : `${appliedDirectivesGen}.${zodOptionalType(config)}()`; } console.warn('unhandled type:', type); return ''; } +function isOneOfInputObject(node: InputObjectTypeDefinitionNode): boolean { + return node.directives?.some(directive => directive.name.value === 'oneOf') === true; +} + +function buildObjectExpression(config: ValidationSchemaPluginConfig, shape: string | undefined): string { + return ['z.object({', shape, `})${strictObjectSuffix(config)}`].join('\n'); +} + +function buildObjectReturn(config: ValidationSchemaPluginConfig, shape: string | undefined): string { + return [indent('return z.object({'), shape, indent(`})${strictObjectSuffix(config)}`)].join('\n'); +} + +function strictObjectSuffix(config: ValidationSchemaPluginConfig): string { + return config.strictObjectSchemas === true ? '.strict()' : ''; +} + +function zodOptionalType(config: ValidationSchemaPluginConfig): string { + return config.nullishBehavior ?? config.zodOptionalType ?? 'nullish'; +} + +function withNullDefault(config: ValidationSchemaPluginConfig, gen: string): string { + if (zodOptionalType(config) === 'optional') + return `${gen}.nullable().optional().default(null)`; + + return `${gen}.${zodOptionalType(config)}().default(null)`; +} + +function schemaDepthVariable(config: ValidationSchemaPluginConfig): string | undefined { + return typeof config.maxDepth === 'number' && config.validationSchemaExportType !== 'const' + ? 'depth' + : undefined; +} + +function schemaDepthParameter(config: ValidationSchemaPluginConfig): string { + return schemaDepthVariable(config) ? 'depth = 0' : ''; +} + +function withDescription(config: ValidationSchemaPluginConfig, field: InputValueDefinitionNode | FieldDefinitionNode, gen: string): string { + if (config.withDescriptions !== true || !field.description?.value) + return gen; + + return `${gen}.describe(${JSON.stringify(field.description.value)})`; +} + +function applyDefaultValue(config: ValidationSchemaPluginConfig, visitor: Visitor, field: InputValueDefinitionNode | FieldDefinitionNode, type: TypeNode, gen: string): string { + if (field.kind !== Kind.INPUT_VALUE_DEFINITION || !field.defaultValue) + return gen; + + return `${gen}.default(${defaultValueExpression(config, visitor, type, field.defaultValue)})`; +} + +function defaultValueExpression(config: ValidationSchemaPluginConfig, visitor: Visitor, type: TypeNode, value: ConstValueNode): string { + if (value.kind === Kind.NULL) + return 'null'; + + if (isNonNullType(type)) + return defaultValueExpression(config, visitor, type.type, value); + + if (isListType(type)) { + if (value.kind === Kind.LIST) + return `[${value.values.map(item => defaultValueExpression(config, visitor, type.type, item)).join(', ')}]`; + + return `[${defaultValueExpression(config, visitor, type.type, value)}]`; + } + + if (isNamedType(type) && visitor.getType(type.name.value)?.astNode?.kind === 'EnumTypeDefinition' && value.kind === Kind.ENUM) { + if (!config.enumsAsTypes) + return `${enumDefaultTypeName(visitor, type)}.${enumDefaultValueName(config, value.value)}`; + + return JSON.stringify(value.value); + } + + if (isNamedType(type) && value.kind === Kind.OBJECT) { + const graphQLType = visitor.getType(type.name.value); + const astNode = graphQLType?.astNode; + if (astNode?.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION && isInputObjectType(graphQLType)) { + const explicitFields = new Map(value.fields.map(field => [field.name.value, field.value])); + const fields = inputObjectFields(astNode, graphQLType.extensionASTNodes).flatMap((field) => { + const fieldValue = explicitFields.get(field.name.value) ?? field.defaultValue; + if (!fieldValue) + return []; + + return `${field.name.value}: ${defaultValueExpression(config, visitor, field.type, fieldValue)}`; + }); + + return `{ ${fields.join(', ')} }`; + } + } + + if (value.kind === Kind.INT || value.kind === Kind.FLOAT || value.kind === Kind.BOOLEAN) + return `${value.value}`; + + if (value.kind === Kind.STRING) + return `"${escapeGraphQLCharacters(value.value)}"`; + + return JSON.stringify(valueFromASTUntyped(value)); +} + +function hasNullDefault(field: InputValueDefinitionNode | FieldDefinitionNode): boolean { + return field.kind === Kind.INPUT_VALUE_DEFINITION && field.defaultValue?.kind === Kind.NULL; +} + +function inputObjectFields( + astNode: InputObjectTypeDefinitionNode, + extensionASTNodes: readonly InputObjectTypeExtensionNode[] | undefined, +): InputValueDefinitionNode[] { + return [ + ...(astNode.fields ?? []), + ...(extensionASTNodes?.flatMap(extension => extension.fields ?? []) ?? []), + ]; +} + +function enumDefaultTypeName(visitor: Visitor, type: TypeNode): string { + if (isNonNullType(type)) + return enumDefaultTypeName(visitor, type.type); + + if (isNamedType(type)) + return visitor.prefixTypeNamespace(visitor.convertSchemaName(type.name.value, visitor.getType(type.name.value)?.astNode?.kind)); + + return ''; +} + +function enumDefaultValueName(config: ValidationSchemaPluginConfig, value: string): string { + let enumValue = convertNameParts(value, resolveExternalModuleAndFn('change-case-all#pascalCase'), config.namingConvention?.transformUnderscore); + + if (config.namingConvention?.enumValues) + enumValue = convertNameParts(value, resolveExternalModuleAndFn(config.namingConvention?.enumValues), config.namingConvention?.transformUnderscore); + + return enumValue; +} + function applyDirectives(config: ValidationSchemaPluginConfig, field: InputValueDefinitionNode | FieldDefinitionNode, gen: string): string { if (config.directives && field.directives) { const formatted = formatDirectiveConfig(config.directives); @@ -348,7 +518,7 @@ function applyDirectives(config: ValidationSchemaPluginConfig, field: InputValue return gen; } -function generateNameNodeZodSchema(config: ValidationSchemaPluginConfig, visitor: Visitor, node: NameNode): string { +function generateNameNodeZodSchema(config: ValidationSchemaPluginConfig, visitor: Visitor, node: NameNode, depthVariable?: string): string { const converter = visitor.getNameNodeConverter(node); switch (converter?.targetKind) { @@ -362,6 +532,16 @@ function generateNameNodeZodSchema(config: ValidationSchemaPluginConfig, visitor return `${converter.convertName()}Schema`; case 'function': default: + if ( + depthVariable + && ( + converter.targetKind === 'InterfaceTypeDefinition' + || converter.targetKind === 'ObjectTypeDefinition' + || converter.targetKind === 'UnionTypeDefinition' + ) + ) { + return `${depthVariable} >= ${config.maxDepth} ? ${anySchema} : ${converter.convertName()}Schema(${depthVariable} + 1)`; + } return `${converter.convertName()}Schema()`; } case 'EnumTypeDefinition': @@ -407,3 +587,10 @@ function zod4Scalar(config: ValidationSchemaPluginConfig, visitor: Visitor, scal console.warn('unhandled scalar name:', scalarName); return anySchema; } + +function unionLiterals(values: string[]): string { + if (values.length === 0) + return 'never'; + + return values.map(value => JSON.stringify(value)).join(' | '); +} diff --git a/src/zod/operation.ts b/src/zod/operation.ts new file mode 100644 index 00000000..c48d77b4 --- /dev/null +++ b/src/zod/operation.ts @@ -0,0 +1,359 @@ +import type { Types } from '@graphql-codegen/plugin-helpers'; +import type { + FieldNode, + FragmentDefinitionNode, + GraphQLCompositeType, + GraphQLObjectType, + GraphQLOutputType, + GraphQLSchema, + OperationDefinitionNode, + SelectionNode, + SelectionSetNode, +} from 'graphql'; +import type { ValidationSchemaPluginConfig } from '../config.js'; +import type { Visitor } from '../visitor.js'; +import { DeclarationBlock, indent } from '@graphql-codegen/visitor-plugin-common'; +import { + getNamedType, + GraphQLBoolean, + GraphQLFloat, + GraphQLID, + GraphQLInt, + GraphQLString, + isEnumType, + isInterfaceType, + isListType, + isNonNullType, + isObjectType, + isScalarType, + isUnionType, + Kind, +} from 'graphql'; + +interface OperationBuildResult { + blocks: string[] + typeNames: string[] +} + +interface OperationContext { + schema: GraphQLSchema + config: ValidationSchemaPluginConfig + visitor: Visitor + fragments: Map +} + +interface CollectedField { + schema: string + optional: boolean +} + +export function buildZodOperationSchemas( + schema: GraphQLSchema, + config: ValidationSchemaPluginConfig, + documents: Types.DocumentFile[], + visitor: Visitor, +): OperationBuildResult { + const fragments = new Map(); + const operations: OperationDefinitionNode[] = []; + + for (const documentFile of documents) { + for (const definition of documentFile.document?.definitions ?? []) { + if (definition.kind === Kind.FRAGMENT_DEFINITION) + fragments.set(definition.name.value, definition); + else if (definition.kind === Kind.OPERATION_DEFINITION && definition.name) + operations.push(definition); + } + } + + const ctx: OperationContext = { schema, config, visitor, fragments }; + const blocks: string[] = []; + const typeNames: string[] = []; + + for (const operation of operations) { + const rootType = operationRootType(schema, operation); + if (!rootType) + continue; + + const typeName = operationResultTypeName(visitor, operation); + typeNames.push(typeName); + const schemaExpression = buildSelectionSetSchema(ctx, rootType, operation.selectionSet); + + blocks.push(operationDeclaration(config, typeName, visitor.prefixTypeNamespace(typeName), schemaExpression)); + } + + return { blocks, typeNames }; +} + +function operationRootType(schema: GraphQLSchema, operation: OperationDefinitionNode): GraphQLCompositeType | undefined { + switch (operation.operation) { + case 'query': + return schema.getQueryType() ?? undefined; + case 'mutation': + return schema.getMutationType() ?? undefined; + case 'subscription': + return schema.getSubscriptionType() ?? undefined; + } +} + +function operationResultTypeName(visitor: Visitor, operation: OperationDefinitionNode): string { + const operationName = operation.name?.value ?? ''; + return visitor.convertName(`${operationName}${capitalize(operation.operation)}`); +} + +function operationDeclaration( + config: ValidationSchemaPluginConfig, + typeName: string, + typeReference: string, + schemaExpression: string, +): string { + switch (config.validationSchemaExportType) { + case 'const': + return new DeclarationBlock({}) + .export() + .asKind('const') + .withName(`${typeName}Schema: z.ZodType<${typeReference}>`) + .withContent(schemaExpression) + .string; + + case 'function': + default: + return new DeclarationBlock({}) + .export() + .asKind('function') + .withName(`${typeName}Schema(): z.ZodType<${typeReference}>`) + .withBlock(indent(`return ${schemaExpression}`)) + .string; + } +} + +function buildSelectionSetSchema( + ctx: OperationContext, + parentType: GraphQLCompositeType, + selectionSet: SelectionSetNode, +): string { + if (isUnionType(parentType) || isInterfaceType(parentType)) { + const variants = ctx.schema + .getPossibleTypes(parentType) + .map(type => buildObjectSelectionSetSchema(ctx, parentType, type, selectionSet, false)); + + return variants.length > 1 + ? `z.union([\n${variants.map(variant => indent(variant, 2)).join(',\n')}\n])` + : variants[0] ?? 'definedNonNullAnySchema'; + } + + return buildObjectSelectionSetSchema(ctx, parentType, parentType, selectionSet, false); +} + +function buildObjectSelectionSetSchema( + ctx: OperationContext, + parentType: GraphQLCompositeType, + runtimeType: GraphQLObjectType, + selectionSet: SelectionSetNode, + optional: boolean, +): string { + const fields = new Map(); + + if (ctx.config.nonOptionalTypename === true) + setField(fields, '__typename', typenameSchema(runtimeType), false); + + for (const selection of selectionSet.selections) + collectSelection(ctx, parentType, runtimeType, selection, fields, optional); + + return buildObjectExpression( + ctx.config, + [...fields.entries()] + .map(([responseName, field]) => indent(`${responseName}: ${field.optional ? `${field.schema}.optional()` : field.schema}`, 2)) + .join(',\n'), + ); +} + +function collectSelection( + ctx: OperationContext, + parentType: GraphQLCompositeType, + runtimeType: GraphQLObjectType, + selection: SelectionNode, + fields: Map, + inheritedOptional: boolean, +): void { + const directiveState = executableDirectiveState(selection); + if (directiveState === 'omit') + return; + + const optional = inheritedOptional || directiveState === 'optional'; + + switch (selection.kind) { + case Kind.FIELD: + collectField(ctx, parentType, runtimeType, selection, fields, optional); + return; + case Kind.FRAGMENT_SPREAD: { + const fragment = ctx.fragments.get(selection.name.value); + const fragmentType = fragment ? fragmentTypeCondition(ctx, fragment) : undefined; + if (fragment && fragmentType && typesOverlap(ctx, fragmentType, runtimeType)) + collectSelectionSetForType(ctx, fragmentType, runtimeType, fragment.selectionSet, fields, optional); + return; + } + case Kind.INLINE_FRAGMENT: { + const fragmentType = selection.typeCondition ? typeCondition(ctx, selection.typeCondition.name.value) : parentType; + if (fragmentType && typesOverlap(ctx, fragmentType, runtimeType)) + collectSelectionSetForType(ctx, fragmentType, runtimeType, selection.selectionSet, fields, optional); + } + } +} + +function collectSelectionSetForType( + ctx: OperationContext, + parentType: GraphQLCompositeType, + runtimeType: GraphQLObjectType, + selectionSet: SelectionSetNode, + fields: Map, + optional: boolean, +): void { + for (const selection of selectionSet.selections) + collectSelection(ctx, parentType, runtimeType, selection, fields, optional); +} + +function collectField( + ctx: OperationContext, + parentType: GraphQLCompositeType, + runtimeType: GraphQLObjectType, + field: FieldNode, + fields: Map, + optional: boolean, +): void { + const responseName = field.alias?.value ?? field.name.value; + if (field.name.value === '__typename') { + setField(fields, responseName, typenameSchema(runtimeType), optional); + return; + } + + if (!isObjectType(parentType) && !isInterfaceType(parentType)) + return; + + const fieldDefinition = parentType.getFields()[field.name.value]; + if (!fieldDefinition) + return; + + setField(fields, responseName, buildOutputTypeSchema(ctx, fieldDefinition.type, field.selectionSet), optional); +} + +function buildOutputTypeSchema( + ctx: OperationContext, + type: GraphQLOutputType, + selectionSet?: SelectionSetNode, +): string { + if (isNonNullType(type)) + return buildNonNullOutputTypeSchema(ctx, type.ofType, selectionSet); + + return `${buildNonNullOutputTypeSchema(ctx, type, selectionSet)}.nullable()`; +} + +function buildNonNullOutputTypeSchema( + ctx: OperationContext, + type: GraphQLOutputType, + selectionSet?: SelectionSetNode, +): string { + if (isListType(type)) + return `z.array(${buildOutputTypeSchema(ctx, type.ofType, selectionSet)})`; + + const namedType = getNamedType(type); + if (isScalarType(namedType)) + return scalarSchema(ctx, namedType.name); + + if (isEnumType(namedType)) { + const converter = ctx.visitor.getNameNodeConverter({ kind: Kind.NAME, value: namedType.name }); + return `${converter?.convertName() ?? ctx.visitor.convertSchemaName(namedType.name, namedType.astNode?.kind)}Schema`; + } + + if (selectionSet && (isObjectType(namedType) || isInterfaceType(namedType) || isUnionType(namedType))) + return buildSelectionSetSchema(ctx, namedType, selectionSet); + + return 'definedNonNullAnySchema'; +} + +function scalarSchema(ctx: OperationContext, scalarName: string): string { + if (ctx.config.scalarSchemas?.[scalarName]) + return ctx.config.scalarSchemas[scalarName]; + + switch (scalarName) { + case GraphQLString.name: + case GraphQLID.name: + return 'z.string()'; + case GraphQLInt.name: + case GraphQLFloat.name: + return 'z.number()'; + case GraphQLBoolean.name: + return 'z.boolean()'; + } + + if (ctx.config.defaultScalarTypeSchema) + return ctx.config.defaultScalarTypeSchema; + + console.warn('unhandled scalar name:', scalarName); + return 'definedNonNullAnySchema'; +} + +function fragmentTypeCondition(ctx: OperationContext, fragment: FragmentDefinitionNode): GraphQLCompositeType | undefined { + return typeCondition(ctx, fragment.typeCondition.name.value); +} + +function typeCondition(ctx: OperationContext, typeName: string): GraphQLCompositeType | undefined { + const type = ctx.schema.getType(typeName); + return type && (isObjectType(type) || isInterfaceType(type) || isUnionType(type)) ? type : undefined; +} + +function typesOverlap(ctx: OperationContext, conditionalType: GraphQLCompositeType, runtimeType: GraphQLObjectType): boolean { + if (isObjectType(conditionalType)) + return conditionalType.name === runtimeType.name; + + return ctx.schema.isSubType(conditionalType, runtimeType); +} + +function setField(fields: Map, responseName: string, schema: string, optional: boolean): void { + const existing = fields.get(responseName); + if (existing && !existing.optional) + return; + + fields.set(responseName, { schema, optional }); +} + +function typenameSchema(parentType: GraphQLObjectType): string { + return `z.literal('${parentType.name}')`; +} + +function executableDirectiveState(selection: SelectionNode): 'omit' | 'optional' | 'required' { + let optional = false; + + for (const directive of selection.directives ?? []) { + if (directive.name.value !== 'skip' && directive.name.value !== 'include') + continue; + + const condition = directive.arguments?.find(argument => argument.name.value === 'if')?.value; + if (!condition) + continue; + + if (condition.kind !== Kind.BOOLEAN) { + optional = true; + continue; + } + + if (directive.name.value === 'skip' && condition.value) + return 'omit'; + + if (directive.name.value === 'include' && !condition.value) + return 'omit'; + } + + return optional ? 'optional' : 'required'; +} + +function buildObjectExpression(config: ValidationSchemaPluginConfig, shape: string): string { + return ['z.object({', shape, `})${strictObjectSuffix(config)}`].join('\n'); +} + +function strictObjectSuffix(config: ValidationSchemaPluginConfig): string { + return config.strictObjectSchemas === true ? '.strict()' : ''; +} + +function capitalize(value: string): string { + return value.charAt(0).toUpperCase() + value.slice(1); +} diff --git a/src/zodv4/index.ts b/src/zodv4/index.ts index 38e1aabe..300be9a6 100644 --- a/src/zodv4/index.ts +++ b/src/zodv4/index.ts @@ -1,8 +1,11 @@ +import type { Types } from '@graphql-codegen/plugin-helpers'; import type { + ConstValueNode, EnumTypeDefinitionNode, FieldDefinitionNode, GraphQLSchema, InputObjectTypeDefinitionNode, + InputObjectTypeExtensionNode, InputValueDefinitionNode, InterfaceTypeDefinitionNode, NameNode, @@ -17,8 +20,10 @@ import { resolveExternalModuleAndFn } from '@graphql-codegen/plugin-helpers'; import { convertNameParts, DeclarationBlock, indent } from '@graphql-codegen/visitor-plugin-common'; import { isEnumType, + isInputObjectType, isScalarType, Kind, + valueFromASTUntyped, } from 'graphql'; import { buildApi, formatDirectiveConfig } from '../directive.js'; import { @@ -30,6 +35,7 @@ import { ObjectTypeDefinitionBuilder, } from '../graphql.js'; import { BaseSchemaVisitor } from '../schema_visitor.js'; +import { buildZodOperationSchemas } from '../zod/operation.js'; const anySchema = `definedNonNullAnySchema`; @@ -49,7 +55,7 @@ export class ZodV4SchemaVisitor extends BaseSchemaVisitor { new DeclarationBlock({}) .asKind('type') .withName('Properties') - .withContent(['Required<{', ' [K in keyof T]: z.ZodType;', '}>'].join('\n')) + .withContent(['{', ' [K in keyof T]: z.ZodType;', '}'].join('\n')) .string, // Unfortunately, zod doesn’t provide non-null defined any schema. // This is a temporary hack until it is fixed. @@ -72,12 +78,22 @@ export class ZodV4SchemaVisitor extends BaseSchemaVisitor { ); } + buildOperationDefinitions(documents: Types.DocumentFile[]): string[] { + const visitor = this.createVisitor('output'); + const result = buildZodOperationSchemas(this.schema, this.config, documents, visitor); + this.importTypes.push(...result.typeNames); + return result.blocks; + } + get InputObjectTypeDefinition() { return { leave: (node: InputObjectTypeDefinitionNode) => { const visitor = this.createVisitor('input'); const name = visitor.convertName(node.name.value); this.importTypes.push(name); + if (isOneOfInputObject(node)) + return this.buildOneOfInputFields(node.fields ?? [], visitor, name); + return this.buildInputFields(node.fields ?? [], visitor, name); }, }; @@ -96,7 +112,7 @@ export class ZodV4SchemaVisitor extends BaseSchemaVisitor { const appendArguments = argumentBlocks ? `\n${argumentBlocks}` : ''; // Building schema for fields. - const shape = node.fields?.map(field => generateFieldZodSchema(this.config, visitor, field, 2)).join(',\n'); + const shape = node.fields?.map(field => generateFieldZodSchema(this.config, visitor, field, 2, schemaDepthVariable(this.config))).join(',\n'); switch (this.config.validationSchemaExportType) { case 'const': @@ -105,7 +121,7 @@ export class ZodV4SchemaVisitor extends BaseSchemaVisitor { .export() .asKind('const') .withName(`${name}Schema: z.ZodObject>`) - .withContent([`z.object({`, shape, '})'].join('\n')) + .withContent(buildObjectExpression(this.config, shape)) .string + appendArguments ); @@ -115,8 +131,8 @@ export class ZodV4SchemaVisitor extends BaseSchemaVisitor { new DeclarationBlock({}) .export() .asKind('function') - .withName(`${name}Schema(): z.ZodObject>`) - .withBlock([indent(`return z.object({`), shape, indent('})')].join('\n')) + .withName(`${name}Schema(${schemaDepthParameter(this.config)}): z.ZodObject>`) + .withBlock(buildObjectReturn(this.config, shape)) .string + appendArguments ); } @@ -137,7 +153,7 @@ export class ZodV4SchemaVisitor extends BaseSchemaVisitor { const appendArguments = argumentBlocks ? `\n${argumentBlocks}` : ''; // Building schema for fields. - const shape = node.fields?.map(field => generateFieldZodSchema(this.config, visitor, field, 2)).join(',\n'); + const shape = node.fields?.map(field => generateFieldZodSchema(this.config, visitor, field, 2, schemaDepthVariable(this.config))).join(',\n'); switch (this.config.validationSchemaExportType) { case 'const': @@ -146,14 +162,7 @@ export class ZodV4SchemaVisitor extends BaseSchemaVisitor { .export() .asKind('const') .withName(`${name}Schema: z.ZodObject>`) - .withContent( - [ - `z.object({`, - indent(`__typename: z.literal('${node.name.value}').optional(),`, 2), - shape, - '})', - ].join('\n'), - ) + .withContent(buildObjectExpression(this.config, [indent(`__typename: z.literal('${node.name.value}').optional(),`, 2), shape].join('\n'))) .string + appendArguments ); @@ -163,15 +172,8 @@ export class ZodV4SchemaVisitor extends BaseSchemaVisitor { new DeclarationBlock({}) .export() .asKind('function') - .withName(`${name}Schema(): z.ZodObject>`) - .withBlock( - [ - indent(`return z.object({`), - indent(`__typename: z.literal('${node.name.value}').optional(),`, 2), - shape, - indent('})'), - ].join('\n'), - ) + .withName(`${name}Schema(${schemaDepthParameter(this.config)}): z.ZodObject>`) + .withBlock(buildObjectReturn(this.config, [indent(`__typename: z.literal('${node.name.value}').optional(),`, 2), shape].join('\n'))) .string + appendArguments ); } @@ -183,19 +185,26 @@ export class ZodV4SchemaVisitor extends BaseSchemaVisitor { return { leave: (node: EnumTypeDefinitionNode) => { const visitor = this.createVisitor('both'); - const enumname = visitor.convertName(node.name.value); + const enumname = visitor.convertSchemaName(node.name.value, node.kind); const enumTypeName = visitor.prefixTypeNamespace(enumname); this.importTypes.push(enumname); + if (!this.config.enumsAsTypes) + this.importValueTypes.push(enumname); + const enumValues = node.values?.map(enumOption => enumOption.name.value) ?? []; // hoist enum declarations this.enumDeclarations.push( new DeclarationBlock({}) .export() .asKind('const') - .withName(`${enumname}Schema`) + .withName( + this.config.enumsAsTypes + ? `${enumname}Schema: z.ZodType<${unionLiterals(enumValues)}, ${unionLiterals(enumValues)}>` + : `${enumname}Schema: z.ZodType<${enumTypeName}, ${enumTypeName}>`, + ) .withContent( this.config.enumsAsTypes - ? `z.enum([${node.values?.map(enumOption => `'${enumOption.name.value}'`).join(', ')}])` + ? `z.enum([${enumValues.map(enumOption => `'${enumOption}'`).join(', ')}])` : `z.enum(${enumTypeName})`, ) .string, @@ -211,6 +220,7 @@ export class ZodV4SchemaVisitor extends BaseSchemaVisitor { return; const visitor = this.createVisitor('output'); const unionName = visitor.convertName(node.name.value); + const depthVariable = schemaDepthVariable(this.config); const unionElements = node.types.map((t) => { const element = visitor.convertName(t.name.value); const typ = visitor.getType(t.name.value); @@ -222,7 +232,7 @@ export class ZodV4SchemaVisitor extends BaseSchemaVisitor { return `${element}Schema`; case 'function': default: - return `${element}Schema()`; + return depthVariable ? `${element}Schema(depth)` : `${element}Schema()`; } }).join(', '); const unionElementsCount = node.types.length ?? 0; @@ -237,7 +247,7 @@ export class ZodV4SchemaVisitor extends BaseSchemaVisitor { return new DeclarationBlock({}) .export() .asKind('function') - .withName(`${unionName}Schema()`) + .withName(`${unionName}Schema(${schemaDepthParameter(this.config)})`) .withBlock(indent(`return ${union}`)) .string; } @@ -252,14 +262,16 @@ export class ZodV4SchemaVisitor extends BaseSchemaVisitor { ) { const typeName = visitor.prefixTypeNamespace(name); const shape = fields.map(field => generateFieldZodSchema(this.config, visitor, field, 2)).join(',\n'); + const objectSchema = buildObjectExpression(this.config, shape); + const schemaType = hasDefaultValue(fields) ? `z.ZodType<${typeName}>` : `z.ZodObject>`; switch (this.config.validationSchemaExportType) { case 'const': return new DeclarationBlock({}) .export() .asKind('const') - .withName(`${name}Schema: z.ZodObject>`) - .withContent(['z.object({', shape, '})'].join('\n')) + .withName(`${name}Schema: ${schemaType}`) + .withContent(objectSchema) .string; case 'function': @@ -267,59 +279,86 @@ export class ZodV4SchemaVisitor extends BaseSchemaVisitor { return new DeclarationBlock({}) .export() .asKind('function') - .withName(`${name}Schema(): z.ZodObject>`) - .withBlock([indent(`return z.object({`), shape, indent('})')].join('\n')) + .withName(`${name}Schema(): ${schemaType}`) + .withBlock(buildObjectReturn(this.config, shape)) + .string; + } + } + + private buildOneOfInputFields( + fields: readonly InputValueDefinitionNode[], + visitor: Visitor, + name: string, + ) { + const typeName = visitor.prefixTypeNamespace(name); + const variants = fields.map((selectedField) => { + const shape = fields.map((field) => { + if (field === selectedField) { + const gen = generateFieldTypeZodSchema(this.config, visitor, field, field.type, undefined, true, true); + return indent(`${field.name.value}: ${withDescription(this.config, field, maybeLazy(visitor, field.type, gen))}`, 2); + } + + return indent(`${field.name.value}: z.never().optional()`, 2); + }).join(',\n'); + + return buildObjectExpression(this.config, shape); + }); + const schema = variants.length > 1 ? `z.union([\n${variants.map(variant => indent(variant, 2)).join(',\n')}\n])` : variants[0]; + + switch (this.config.validationSchemaExportType) { + case 'const': + return new DeclarationBlock({}) + .export() + .asKind('const') + .withName(`${name}Schema: z.ZodType<${typeName}>`) + .withContent(schema) + .string; + + case 'function': + default: + return new DeclarationBlock({}) + .export() + .asKind('function') + .withName(`${name}Schema(): z.ZodType<${typeName}>`) + .withBlock(indent(`return ${schema}`)) .string; } } } -function generateFieldZodSchema(config: ValidationSchemaPluginConfig, visitor: Visitor, field: InputValueDefinitionNode | FieldDefinitionNode, indentCount: number): string { - const gen = generateFieldTypeZodSchema(config, visitor, field, field.type); - return indent(`${field.name.value}: ${maybeLazy(visitor, field.type, gen)}`, indentCount); +function generateFieldZodSchema(config: ValidationSchemaPluginConfig, visitor: Visitor, field: InputValueDefinitionNode | FieldDefinitionNode, indentCount: number, depthVariable?: string): string { + const gen = generateFieldTypeZodSchema(config, visitor, field, field.type, undefined, true, false, depthVariable); + return indent(`${field.name.value}: ${withDescription(config, field, maybeLazy(visitor, field.type, gen))}`, indentCount); } -function generateFieldTypeZodSchema(config: ValidationSchemaPluginConfig, visitor: Visitor, field: InputValueDefinitionNode | FieldDefinitionNode, type: TypeNode, parentType?: TypeNode): string { +function generateFieldTypeZodSchema(config: ValidationSchemaPluginConfig, visitor: Visitor, field: InputValueDefinitionNode | FieldDefinitionNode, type: TypeNode, parentType?: TypeNode, isRoot = true, forceRequired = false, depthVariable?: string): string { if (isListType(type)) { - const gen = generateFieldTypeZodSchema(config, visitor, field, type.type, type); - if (!isNonNullType(parentType)) { - const arrayGen = `z.array(${maybeLazy(visitor, type.type, gen)})`; - const maybeLazyGen = applyDirectives(config, field, arrayGen); - return `${maybeLazyGen}.nullish()`; + const gen = generateFieldTypeZodSchema(config, visitor, field, type.type, type, false, false, depthVariable); + const arrayGen = `z.array(${maybeLazy(visitor, type.type, gen)})`; + const maybeDirectivesGen = isRoot ? applyDirectives(config, field, arrayGen) : arrayGen; + const maybeDefaultGen = hasNullDefault(field) ? maybeDirectivesGen : applyDefaultValue(config, visitor, field, type, maybeDirectivesGen); + if (!isNonNullType(parentType) && !forceRequired) { + if (hasNullDefault(field)) + return withNullDefault(config, maybeDirectivesGen); + + return `${maybeDefaultGen}.${zodOptionalType(config)}()`; } - return `z.array(${maybeLazy(visitor, type.type, gen)})`; + return maybeDefaultGen; } if (isNonNullType(type)) { - const gen = generateFieldTypeZodSchema(config, visitor, field, type.type, type); + const gen = generateFieldTypeZodSchema(config, visitor, field, type.type, type, isRoot, forceRequired, depthVariable); return maybeLazy(visitor, type.type, gen); } if (isNamedType(type)) { - const gen = generateNameNodeZodSchema(config, visitor, type.name); + const gen = generateNameNodeZodSchema(config, visitor, type.name, depthVariable); if (isListType(parentType)) return `${gen}.nullable()`; - let appliedDirectivesGen = applyDirectives(config, field, gen); - - if (field.kind === Kind.INPUT_VALUE_DEFINITION) { - const { defaultValue } = field; - - if (defaultValue?.kind === Kind.INT || defaultValue?.kind === Kind.FLOAT || defaultValue?.kind === Kind.BOOLEAN) - appliedDirectivesGen = `${appliedDirectivesGen}.default(${defaultValue.value})`; - - if (defaultValue?.kind === Kind.STRING || defaultValue?.kind === Kind.ENUM) { - if (config.useEnumTypeAsDefaultValue && defaultValue?.kind !== Kind.STRING) { - let value = convertNameParts(defaultValue.value, resolveExternalModuleAndFn('change-case-all#pascalCase'), config.namingConvention?.transformUnderscore); - - if (config.namingConvention?.enumValues) - value = convertNameParts(defaultValue.value, resolveExternalModuleAndFn(config.namingConvention?.enumValues), config.namingConvention?.transformUnderscore); - - appliedDirectivesGen = `${appliedDirectivesGen}.default(${type.name.value}.${value})`; - } - else { - appliedDirectivesGen = `${appliedDirectivesGen}.default("${escapeGraphQLCharacters(defaultValue.value)}")`; - } - } - } + const appliedDirectivesGen = isRoot + ? hasNullDefault(field) + ? applyDirectives(config, field, gen) + : applyDefaultValue(config, visitor, field, type, applyDirectives(config, field, gen)) + : gen; if (isNonNullType(parentType)) { if (visitor.shouldEmitAsNotAllowEmptyString(type.name.value)) @@ -330,12 +369,152 @@ function generateFieldTypeZodSchema(config: ValidationSchemaPluginConfig, visito if (isListType(parentType)) return `${appliedDirectivesGen}.nullable()`; - return `${appliedDirectivesGen}.nullish()`; + if (forceRequired) + return appliedDirectivesGen; + + return hasNullDefault(field) + ? withNullDefault(config, appliedDirectivesGen) + : `${appliedDirectivesGen}.${zodOptionalType(config)}()`; } console.warn('unhandled type:', type); return ''; } +function isOneOfInputObject(node: InputObjectTypeDefinitionNode): boolean { + return node.directives?.some(directive => directive.name.value === 'oneOf') === true; +} + +function hasDefaultValue(fields: readonly (FieldDefinitionNode | InputValueDefinitionNode)[]): boolean { + return fields.some(field => field.kind === Kind.INPUT_VALUE_DEFINITION && field.defaultValue !== undefined); +} + +function buildObjectExpression(config: ValidationSchemaPluginConfig, shape: string | undefined): string { + return ['z.object({', shape, `})${strictObjectSuffix(config)}`].join('\n'); +} + +function buildObjectReturn(config: ValidationSchemaPluginConfig, shape: string | undefined): string { + return [indent('return z.object({'), shape, indent(`})${strictObjectSuffix(config)}`)].join('\n'); +} + +function strictObjectSuffix(config: ValidationSchemaPluginConfig): string { + return config.strictObjectSchemas === true ? '.strict()' : ''; +} + +function zodOptionalType(config: ValidationSchemaPluginConfig): string { + return config.nullishBehavior ?? config.zodOptionalType ?? 'nullish'; +} + +function withNullDefault(config: ValidationSchemaPluginConfig, gen: string): string { + if (zodOptionalType(config) === 'optional') + return `${gen}.nullable().optional().default(null)`; + + return `${gen}.${zodOptionalType(config)}().default(null)`; +} + +function schemaDepthVariable(config: ValidationSchemaPluginConfig): string | undefined { + return typeof config.maxDepth === 'number' && config.validationSchemaExportType !== 'const' + ? 'depth' + : undefined; +} + +function schemaDepthParameter(config: ValidationSchemaPluginConfig): string { + return schemaDepthVariable(config) ? 'depth = 0' : ''; +} + +function withDescription(config: ValidationSchemaPluginConfig, field: InputValueDefinitionNode | FieldDefinitionNode, gen: string): string { + if (config.withDescriptions !== true || !field.description?.value) + return gen; + + return `${gen}.describe(${JSON.stringify(field.description.value)})`; +} + +function applyDefaultValue(config: ValidationSchemaPluginConfig, visitor: Visitor, field: InputValueDefinitionNode | FieldDefinitionNode, type: TypeNode, gen: string): string { + if (field.kind !== Kind.INPUT_VALUE_DEFINITION || !field.defaultValue) + return gen; + + return `${gen}.default(${defaultValueExpression(config, visitor, type, field.defaultValue)})`; +} + +function defaultValueExpression(config: ValidationSchemaPluginConfig, visitor: Visitor, type: TypeNode, value: ConstValueNode): string { + if (value.kind === Kind.NULL) + return 'null'; + + if (isNonNullType(type)) + return defaultValueExpression(config, visitor, type.type, value); + + if (isListType(type)) { + if (value.kind === Kind.LIST) + return `[${value.values.map(item => defaultValueExpression(config, visitor, type.type, item)).join(', ')}]`; + + return `[${defaultValueExpression(config, visitor, type.type, value)}]`; + } + + if (isNamedType(type) && visitor.getType(type.name.value)?.astNode?.kind === 'EnumTypeDefinition' && value.kind === Kind.ENUM) { + if (!config.enumsAsTypes) + return `${enumDefaultTypeName(visitor, type)}.${enumDefaultValueName(config, value.value)}`; + + return JSON.stringify(value.value); + } + + if (isNamedType(type) && value.kind === Kind.OBJECT) { + const graphQLType = visitor.getType(type.name.value); + const astNode = graphQLType?.astNode; + if (astNode?.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION && isInputObjectType(graphQLType)) { + const explicitFields = new Map(value.fields.map(field => [field.name.value, field.value])); + const fields = inputObjectFields(astNode, graphQLType.extensionASTNodes).flatMap((field) => { + const fieldValue = explicitFields.get(field.name.value) ?? field.defaultValue; + if (!fieldValue) + return []; + + return `${field.name.value}: ${defaultValueExpression(config, visitor, field.type, fieldValue)}`; + }); + + return `{ ${fields.join(', ')} }`; + } + } + + if (value.kind === Kind.INT || value.kind === Kind.FLOAT || value.kind === Kind.BOOLEAN) + return `${value.value}`; + + if (value.kind === Kind.STRING) + return `"${escapeGraphQLCharacters(value.value)}"`; + + return JSON.stringify(valueFromASTUntyped(value)); +} + +function hasNullDefault(field: InputValueDefinitionNode | FieldDefinitionNode): boolean { + return field.kind === Kind.INPUT_VALUE_DEFINITION && field.defaultValue?.kind === Kind.NULL; +} + +function inputObjectFields( + astNode: InputObjectTypeDefinitionNode, + extensionASTNodes: readonly InputObjectTypeExtensionNode[] | undefined, +): InputValueDefinitionNode[] { + return [ + ...(astNode.fields ?? []), + ...(extensionASTNodes?.flatMap(extension => extension.fields ?? []) ?? []), + ]; +} + +function enumDefaultTypeName(visitor: Visitor, type: TypeNode): string { + if (isNonNullType(type)) + return enumDefaultTypeName(visitor, type.type); + + if (isNamedType(type)) + return visitor.prefixTypeNamespace(visitor.convertSchemaName(type.name.value, visitor.getType(type.name.value)?.astNode?.kind)); + + return ''; +} + +function enumDefaultValueName(config: ValidationSchemaPluginConfig, value: string): string { + let enumValue = convertNameParts(value, resolveExternalModuleAndFn('change-case-all#pascalCase'), config.namingConvention?.transformUnderscore); + + if (config.namingConvention?.enumValues) + enumValue = convertNameParts(value, resolveExternalModuleAndFn(config.namingConvention?.enumValues), config.namingConvention?.transformUnderscore); + + return enumValue; +} + function applyDirectives(config: ValidationSchemaPluginConfig, field: InputValueDefinitionNode | FieldDefinitionNode, gen: string): string { if (config.directives && field.directives) { const formatted = formatDirectiveConfig(config.directives); @@ -344,7 +523,7 @@ function applyDirectives(config: ValidationSchemaPluginConfig, field: InputValue return gen; } -function generateNameNodeZodSchema(config: ValidationSchemaPluginConfig, visitor: Visitor, node: NameNode): string { +function generateNameNodeZodSchema(config: ValidationSchemaPluginConfig, visitor: Visitor, node: NameNode, depthVariable?: string): string { const converter = visitor.getNameNodeConverter(node); switch (converter?.targetKind) { @@ -358,6 +537,16 @@ function generateNameNodeZodSchema(config: ValidationSchemaPluginConfig, visitor return `${converter.convertName()}Schema`; case 'function': default: + if ( + depthVariable + && ( + converter.targetKind === 'InterfaceTypeDefinition' + || converter.targetKind === 'ObjectTypeDefinition' + || converter.targetKind === 'UnionTypeDefinition' + ) + ) { + return `${depthVariable} >= ${config.maxDepth} ? ${anySchema} : ${converter.convertName()}Schema(${depthVariable} + 1)`; + } return `${converter.convertName()}Schema()`; } case 'EnumTypeDefinition': @@ -403,3 +592,10 @@ function zod4Scalar(config: ValidationSchemaPluginConfig, visitor: Visitor, scal console.warn('unhandled scalar name:', scalarName); return anySchema; } + +function unionLiterals(values: string[]): string { + if (values.length === 0) + return 'never'; + + return values.map(value => JSON.stringify(value)).join(' | '); +} diff --git a/tests/directive.spec.ts b/tests/directive.spec.ts index b3aa0c02..13b13ea5 100644 --- a/tests/directive.spec.ts +++ b/tests/directive.spec.ts @@ -1,5 +1,5 @@ import type { ConstArgumentNode, ConstDirectiveNode, ConstValueNode, NameNode } from 'graphql'; -import type { DirectiveConfig, DirectiveObjectArguments } from '../src/config'; +import type { DirectiveConfig, DirectiveObjectArguments, DirectiveSchemaTemplate } from '../src/config'; import type { FormattedDirectiveArguments, FormattedDirectiveConfig, @@ -141,6 +141,17 @@ describe('format directive config', () => { }, }, }, + { + name: 'directive without arguments', + arg: { + Positive: 'positive', + }, + want: { + Positive: { + __directive: ['positive'], + }, + }, + }, ]; for (const tc of cases) { it(tc.name, () => { @@ -154,7 +165,7 @@ describe('format directive config', () => { const cases: { name: string args: { - template: string + template: DirectiveSchemaTemplate apiArgs: any[] } want: string @@ -239,6 +250,22 @@ describe('format directive config', () => { }, want: `{"hello":"world"}`, }, + { + name: 'function', + args: { + template: (items: unknown[]) => new Set(items).size === items.length, + apiArgs: [], + }, + want: `(items) => new Set(items).size === items.length`, + }, + { + name: 'object template', + args: { + template: { required_error: '$1' }, + apiArgs: ['The field is required.'], + }, + want: `{"required_error":"The field is required."}`, + }, { name: 'undefined', args: { @@ -528,6 +555,40 @@ describe('format directive config', () => { }, want: `.required("message")`, }, + { + name: 'directive without arguments', + args: { + config: { + __directive: ['positive'], + }, + args: [], + }, + want: `.positive()`, + }, + { + name: 'function argument', + args: { + config: { + unique: ['refine', (items: unknown[]) => new Set(items).size === items.length], + }, + args: buildConstArgumentNodes({ + unique: `true`, + }), + }, + want: `.refine((items) => new Set(items).size === items.length)`, + }, + { + name: 'object argument template', + args: { + config: { + errorMessage: ['string', { required_error: '$1' }], + }, + args: buildConstArgumentNodes({ + errorMessage: `"The field is required."`, + }), + }, + want: `.string({"required_error":"The field is required."})`, + }, ]; for (const tc of cases) { it(tc.name, () => { diff --git a/tests/myzod.spec.ts b/tests/myzod.spec.ts index 8b51443a..b8e8f333 100644 --- a/tests/myzod.spec.ts +++ b/tests/myzod.spec.ts @@ -1718,4 +1718,60 @@ describe('myzod', () => { expect(result.content).toContain('ratio: myzod.number().default(0.5).optional().nullable()'); expect(result.content).toContain('isMember: myzod.boolean().default(true).optional().nullable()'); }); + + it('respects enumPrefix: false when typesPrefix is configured', async () => { + const schema = buildSchema(/* GraphQL */ ` + enum UserRole { + ADMIN + } + + input CreateUserInput { + role: UserRole! + } + `); + const result = await plugin( + schema, + [], + { + schema: 'myzod', + importFrom: './types', + useTypeImports: true, + typesPrefix: 'I', + enumPrefix: false, + }, + {}, + ); + + expect(result.prepend).toContain('import { UserRole } from \'./types\''); + expect(result.prepend).toContain('import type { ICreateUserInput } from \'./types\''); + expect(result.content).toContain('export const UserRoleSchema = myzod.enum(UserRole)'); + expect(result.content).toContain('export function ICreateUserInputSchema(): myzod.Type'); + expect(result.content).toContain('role: UserRoleSchema'); + }); + + it('qualifies enum defaults with namespace imports', async () => { + const schema = buildSchema(/* GraphQL */ ` + enum PageType { + PUBLIC + } + + input PageInput { + pageType: PageType! = PUBLIC + } + `); + + const result = await plugin( + schema, + [], + { + schema: 'myzod', + importFrom: './types', + schemaNamespacedImportName: 't', + useEnumTypeAsDefaultValue: true, + }, + {}, + ); + + expect(result.content).toContain('pageType: PageTypeSchema.default(t.PageType.Public)'); + }); }); diff --git a/tests/typescript-compile.ts b/tests/typescript-compile.ts new file mode 100644 index 00000000..0c75d6f4 --- /dev/null +++ b/tests/typescript-compile.ts @@ -0,0 +1,37 @@ +import { mkdtempSync, rmSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; +import process from 'node:process'; +import * as ts from 'typescript'; + +export function expectTypeScriptToCompile(source: string) { + const dir = mkdtempSync(path.join(process.cwd(), 'tests/.tmp-ts-')); + const fileName = path.join(dir, 'generated.ts'); + + try { + writeFileSync(fileName, source); + const program = ts.createProgram([fileName], { + module: ts.ModuleKind.NodeNext, + moduleResolution: ts.ModuleResolutionKind.NodeNext, + noEmit: true, + skipLibCheck: true, + strict: true, + target: ts.ScriptTarget.ES2022, + types: [], + }); + const diagnostics = ts.getPreEmitDiagnostics(program); + + expect( + diagnostics.map((diagnostic) => { + const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n'); + if (!diagnostic.file || diagnostic.start === undefined) + return message; + + const { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start); + return `${diagnostic.file.fileName}:${line + 1}:${character + 1} ${message}`; + }), + ).toStrictEqual([]); + } + finally { + rmSync(dir, { recursive: true, force: true }); + } +} diff --git a/tests/valibot.spec.ts b/tests/valibot.spec.ts index 70f3af3e..762f6e47 100644 --- a/tests/valibot.spec.ts +++ b/tests/valibot.spec.ts @@ -181,8 +181,8 @@ describe('valibot', () => { export function NestedInputSchema(): v.GenericSchema { return v.object({ - child: v.lazy(() => v.nullish(NestedInputSchema())), - childrens: v.nullish(v.array(v.lazy(() => v.nullable(NestedInputSchema())))) + child: v.nullish(v.lazy(() => NestedInputSchema())), + childrens: v.nullish(v.array(v.nullable(v.lazy(() => NestedInputSchema())))) }) } " @@ -772,7 +772,7 @@ describe('valibot', () => { export function BookSchema(): v.GenericSchema { return v.object({ __typename: v.optional(v.literal('Book')), - author: v.lazy(() => v.nullish(AuthorSchema())), + author: v.nullish(v.lazy(() => AuthorSchema())), title: v.nullish(v.string()) }) } @@ -780,7 +780,7 @@ describe('valibot', () => { export function AuthorSchema(): v.GenericSchema { return v.object({ __typename: v.optional(v.literal('Author')), - books: v.nullish(v.array(v.lazy(() => v.nullable(BookSchema())))), + books: v.nullish(v.array(v.nullable(v.lazy(() => BookSchema())))), name: v.nullish(v.string()) }) } @@ -1019,7 +1019,7 @@ describe('valibot', () => { export function GeometrySchema(): v.GenericSchema { return v.object({ __typename: v.optional(v.literal('Geometry')), - shape: v.lazy(() => v.nullish(ShapeSchema())) + shape: v.nullish(v.lazy(() => ShapeSchema())) }) } " @@ -1209,14 +1209,14 @@ describe('valibot', () => { export function BookSchema(): v.GenericSchema { return v.object({ - author: v.lazy(() => v.nullish(AuthorSchema())), + author: v.nullish(v.lazy(() => AuthorSchema())), title: v.nullish(v.string()) }) } export function AuthorSchema(): v.GenericSchema { return v.object({ - books: v.nullish(v.array(v.lazy(() => v.nullable(BookSchema())))), + books: v.nullish(v.array(v.nullable(v.lazy(() => BookSchema())))), name: v.nullish(v.string()) }) } @@ -1296,6 +1296,49 @@ describe('valibot', () => { }); }) it.todo('properly generates custom directive values') + it('wraps lazy object references with nullish for nullable fields', async () => { + const schema = buildSchema(/* GraphQL */ ` + input UserInput { + kind: UserKind + } + + input UserKind { + name: String! + } + `); + + const result = await plugin(schema, [], { schema: 'valibot' }, {}); + expect(result.content).toContain('kind: v.nullish(v.lazy(() => UserKindSchema()))'); + }) + it('respects enumPrefix: false when typesPrefix is configured', async () => { + const schema = buildSchema(/* GraphQL */ ` + enum UserRole { + ADMIN + } + + input CreateUserInput { + role: UserRole! + } + `); + const result = await plugin( + schema, + [], + { + schema: 'valibot', + importFrom: './types', + useTypeImports: true, + typesPrefix: 'I', + enumPrefix: false, + }, + {}, + ); + + expect(result.prepend).toContain('import { UserRole } from \'./types\''); + expect(result.prepend).toContain('import type { ICreateUserInput } from \'./types\''); + expect(result.content).toContain('export const UserRoleSchema = v.enum_(UserRole)'); + expect(result.content).toContain('export function ICreateUserInputSchema(): v.GenericSchema'); + expect(result.content).toContain('role: UserRoleSchema'); + }) it.todo('exports as const instead of func') it.todo('generate both input & type, export as const') it.todo('issue #394') diff --git a/tests/yup.spec.ts b/tests/yup.spec.ts index 37a6639e..c6483116 100644 --- a/tests/yup.spec.ts +++ b/tests/yup.spec.ts @@ -1,6 +1,7 @@ import { buildClientSchema, buildSchema, introspectionFromSchema } from 'graphql'; import { plugin } from '../src/index'; +import { expectTypeScriptToCompile } from './typescript-compile'; describe('yup', () => { it('defined', async () => { @@ -1717,4 +1718,104 @@ describe('yup', () => { expect(result.content).toContain('ratio: yup.number().defined().nullable().default(0.5).optional()'); expect(result.content).toContain('isMember: yup.boolean().defined().nullable().default(true).optional()'); }); + + it('respects enumPrefix: false when typesPrefix is configured', async () => { + const schema = buildSchema(/* GraphQL */ ` + enum UserRole { + ADMIN + } + + input CreateUserInput { + role: UserRole! + } + `); + const result = await plugin( + schema, + [], + { + schema: 'yup', + importFrom: './types', + useTypeImports: true, + typesPrefix: 'I', + enumPrefix: false, + }, + {}, + ); + + expect(result.prepend).toContain('import { UserRole } from \'./types\''); + expect(result.prepend).toContain('import type { ICreateUserInput } from \'./types\''); + expect(result.content).toContain( + 'export const UserRoleSchema = yup.string().oneOf(Object.values(UserRole)).defined()', + ); + expect(result.content).toContain('export function ICreateUserInputSchema(): yup.ObjectSchema'); + expect(result.content).toContain('role: UserRoleSchema.nonNullable()'); + }); + + it('generates type-checkable yup v1 arrays of non-null input objects', async () => { + const schema = buildSchema(/* GraphQL */ ` + input QuestionAnswerInput { + answer: String + index: Int! + multichoiceAnswers: [String!]! + } + + input UpdateAssessmentInput { + answers: [QuestionAnswerInput!]! + domainIndex: Int! + encodedId: String! + groupIndex: Int! + previous: Boolean! + save: Boolean! + } + `); + + const result = await plugin(schema, [], { schema: 'yup' }, {}); + + expectTypeScriptToCompile(` + ${(result.prepend ?? []).join('\n')} + + export type Maybe = T | null; + export type QuestionAnswerInput = { + answer?: Maybe; + index: number; + multichoiceAnswers: string[]; + }; + export type UpdateAssessmentInput = { + answers: QuestionAnswerInput[]; + domainIndex: number; + encodedId: string; + groupIndex: number; + previous: boolean; + save: boolean; + }; + + ${result.content} + `); + }); + + it('qualifies enum defaults with namespace imports', async () => { + const schema = buildSchema(/* GraphQL */ ` + enum PageType { + PUBLIC + } + + input PageInput { + pageType: PageType! = PUBLIC + } + `); + + const result = await plugin( + schema, + [], + { + schema: 'yup', + importFrom: './types', + schemaNamespacedImportName: 't', + useEnumTypeAsDefaultValue: true, + }, + {}, + ); + + expect(result.content).toContain('pageType: PageTypeSchema.nonNullable().default(t.PageType.Public)'); + }); }); diff --git a/tests/zod.spec.ts b/tests/zod.spec.ts index e13d420c..413dd0a5 100644 --- a/tests/zod.spec.ts +++ b/tests/zod.spec.ts @@ -1,7 +1,8 @@ -import { buildClientSchema, buildSchema, introspectionFromSchema } from 'graphql'; +import { buildClientSchema, buildSchema, introspectionFromSchema, parse } from 'graphql'; import { dedent } from 'ts-dedent'; import { plugin } from '../src/index'; +import { expectTypeScriptToCompile } from './typescript-compile'; const initialEmitValue = dedent(` type Properties = Required<{ @@ -44,6 +45,16 @@ describe('zod', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function PrimitiveInputSchema(): z.ZodObject> { return z.object({ a: z.string(), @@ -75,6 +86,16 @@ describe('zod', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function PrimitiveInputSchema(): z.ZodObject> { return z.object({ a: z.string().nullish(), @@ -104,6 +125,16 @@ describe('zod', () => { const result = await plugin(schema, [], { schema: 'zod', scalars }, {}); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function ArrayInputSchema(): z.ZodObject> { return z.object({ a: z.array(z.string().nullable()).nullish(), @@ -134,6 +165,16 @@ describe('zod', () => { const result = await plugin(schema, [], { schema: 'zod', scalars }, {}); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function AInputSchema(): z.ZodObject> { return z.object({ b: z.lazy(() => BInputSchema()) @@ -171,6 +212,16 @@ describe('zod', () => { const result = await plugin(schema, [], { schema: 'zod', scalars, importFrom: './types', schemaNamespacedImportName: 't' }, {}); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function AInputSchema(): z.ZodObject> { return z.object({ b: z.lazy(() => BInputSchema()) @@ -203,6 +254,16 @@ describe('zod', () => { const result = await plugin(schema, [], { schema: 'zod', scalars }, {}); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function NestedInputSchema(): z.ZodObject> { return z.object({ child: z.lazy(() => NestedInputSchema().nullish()), @@ -227,7 +288,17 @@ describe('zod', () => { const result = await plugin(schema, [], { schema: 'zod', scalars }, {}); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - export const PageTypeSchema = z.nativeEnum(PageType); + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + + export const PageTypeSchema: z.ZodType = z.nativeEnum(PageType); export function PageInputSchema(): z.ZodObject> { return z.object({ @@ -252,7 +323,17 @@ describe('zod', () => { const result = await plugin(schema, [], { schema: 'zod', scalars, importFrom: './', schemaNamespacedImportName: 't' }, {}); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - export const PageTypeSchema = z.nativeEnum(t.PageType); + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + + export const PageTypeSchema: z.ZodType = z.nativeEnum(t.PageType); export function PageInputSchema(): z.ZodObject> { return z.object({ @@ -281,7 +362,17 @@ describe('zod', () => { const result = await plugin(schema, [], { schema: 'zod', scalars }, {}); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - export const HttpMethodSchema = z.nativeEnum(HttpMethod); + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + + export const HttpMethodSchema: z.ZodType = z.nativeEnum(HttpMethod); export function HttpInputSchema(): z.ZodObject> { return z.object({ @@ -317,6 +408,16 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function SaySchema(): z.ZodObject> { return z.object({ phrase: z.string(), @@ -350,6 +451,16 @@ describe('zod', () => { `); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function SaySchema(): z.ZodObject> { return z.object({ phrase: z.string() @@ -383,6 +494,16 @@ describe('zod', () => { `); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function SaySchema(): z.ZodObject> { return z.object({ phrase: z.string() @@ -416,6 +537,16 @@ describe('zod', () => { `); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function SaySchema(): z.ZodObject> { return z.object({ phrase: z.string() @@ -443,7 +574,17 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - export const PageTypeSchema = z.enum(['PUBLIC', 'BASIC_AUTH']); + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + + export const PageTypeSchema: z.ZodType<"PUBLIC" | "BASIC_AUTH"> = z.enum(['PUBLIC', 'BASIC_AUTH']); " `) }); @@ -468,7 +609,17 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - export const PageTypeSchema = z.enum(['PUBLIC', 'BASIC_AUTH']); + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + + export const PageTypeSchema: z.ZodType<"PUBLIC" | "BASIC_AUTH"> = z.enum(['PUBLIC', 'BASIC_AUTH']); " `) }); @@ -497,6 +648,16 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function PrimitiveInputSchema(): z.ZodObject> { return z.object({ a: z.string().min(1), @@ -534,6 +695,16 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function InputOneSchema(): z.ZodObject> { return z.object({ field: z.lazy(() => InputNestedSchema()) @@ -573,6 +744,16 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function ScalarsInputSchema(): z.ZodObject> { return z.object({ date: z.date(), @@ -608,6 +789,16 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function ScalarsInputSchema(): z.ZodObject> { return z.object({ date: z.string(), @@ -643,6 +834,16 @@ describe('zod', () => { `); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function ISaySchema(): z.ZodObject> { return z.object({ phrase: z.string() @@ -676,6 +877,16 @@ describe('zod', () => { `); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function SayISchema(): z.ZodObject> { return z.object({ phrase: z.string() @@ -711,7 +922,7 @@ describe('zod', () => { }, ); - expect(result.content).toContain('export const PageTypeSchema = z.nativeEnum(PageType)'); + expect(result.content).toContain('export const PageTypeSchema: z.ZodType = z.nativeEnum(PageType)'); expect(result.content).toContain('export function PageInputSchema(): z.ZodObject>'); expect(result.content).toContain('pageType: PageTypeSchema.default(PageType.Public)'); @@ -747,7 +958,7 @@ describe('zod', () => { }, ); - expect(result.content).toContain('export const PageTypeSchema = z.nativeEnum(PageType)'); + expect(result.content).toContain('export const PageTypeSchema: z.ZodType = z.nativeEnum(PageType)'); expect(result.content).toContain('export function PageInputSchema(): z.ZodObject>'); expect(result.content).toContain('pageType: PageTypeSchema.default(PageType.Basic_Auth)'); @@ -786,7 +997,7 @@ describe('zod', () => { }, ); - expect(result.content).toContain('export const PageTypeSchema = z.nativeEnum(PageType)'); + expect(result.content).toContain('export const PageTypeSchema: z.ZodType = z.nativeEnum(PageType)'); expect(result.content).toContain('export function PageInputSchema(): z.ZodObject>'); expect(result.content).toContain('pageType: PageTypeSchema.default(PageType.BasicAuth)'); @@ -823,11 +1034,21 @@ describe('zod', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - export const PageTypeSchema = z.nativeEnum(PageType); + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + + export const PageTypeSchema: z.ZodType = z.nativeEnum(PageType); export function PageInputSchema(): z.ZodObject> { return z.object({ - pageType: PageTypeSchema.default("PUBLIC"), + pageType: PageTypeSchema.default(PageType.Public), greeting: z.string().default("Hello").nullish(), newline: z.string().default("Hello\\nWorld").nullish(), score: z.number().default(100).nullish(), @@ -864,6 +1085,16 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function UserCreateInputSchema(): z.ZodObject> { return z.object({ profile: z.string().min(1, "Please input more than 1").max(5000, "Please input less than 5000").nullish() @@ -897,6 +1128,16 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function UserCreateInputSchema(): z.ZodObject> { return z.object({ profile: z.string().min(1, "Please input more than 1").max(5000, "Please input less than 5000") @@ -930,6 +1171,16 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function UserCreateInputSchema(): z.ZodObject> { return z.object({ profile: z.array(z.string().nullable()).min(1, "Please input more than 1").max(5000, "Please input less than 5000").nullish() @@ -966,6 +1217,16 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function UserCreateInputSchema(): z.ZodObject> { return z.object({ profile: z.string().max(5000, "Please input less than 5000").min(1), @@ -1000,6 +1261,16 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function UserCreateInputSchema(): z.ZodObject> { return z.object({ profile: z.string().max(5000, "Please input less than 5000"), @@ -1053,6 +1324,16 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function BookSchema(): z.ZodObject> { return z.object({ __typename: z.literal('Book').optional(), @@ -1130,6 +1411,16 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function UserCreateInputSchema(): z.ZodObject> { return z.object({ name: z.string(), @@ -1186,6 +1477,16 @@ describe('zod', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function SquareSchema(): z.ZodObject> { return z.object({ __typename: z.literal('Square').optional(), @@ -1232,6 +1533,16 @@ describe('zod', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function SquareSchema(): z.ZodObject> { return z.object({ __typename: z.literal('Square').optional(), @@ -1280,6 +1591,16 @@ describe('zod', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function SquareSchema(): z.ZodObject> { return z.object({ __typename: z.literal('Square').optional(), @@ -1328,6 +1649,16 @@ describe('zod', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function CircleSchema(): z.ZodObject> { return z.object({ __typename: z.literal('Circle').optional(), @@ -1369,9 +1700,19 @@ describe('zod', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - export const PageTypeSchema = z.nativeEnum(PageType); + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + + export const PageTypeSchema: z.ZodType = z.nativeEnum(PageType); - export const MethodTypeSchema = z.nativeEnum(MethodType); + export const MethodTypeSchema: z.ZodType = z.nativeEnum(MethodType); export function AnyTypeSchema() { return z.union([PageTypeSchema, MethodTypeSchema]) @@ -1408,6 +1749,16 @@ describe('zod', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export const CircleSchema: z.ZodObject> = z.object({ __typename: z.literal('Circle').optional(), radius: z.number().nullish() @@ -1449,6 +1800,16 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function MyTypeSchema(): z.ZodObject> { return z.object({ __typename: z.literal('MyType').optional(), @@ -1506,6 +1867,16 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function BookSchema(): z.ZodObject> { return z.object({ title: z.string().nullish() @@ -1542,6 +1913,16 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function BookSchema(): z.ZodObject> { return z.object({ author: z.lazy(() => AuthorSchema().nullish()), @@ -1594,6 +1975,16 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function BookSchema(): z.ZodObject> { return z.object({ title: z.string(), @@ -1657,6 +2048,16 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function UserCreateInputSchema(): z.ZodObject> { return z.object({ name: z.string().regex(/^Sir/), @@ -1684,6 +2085,16 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export const SaySchema: z.ZodObject> = z.object({ phrase: z.string() }); @@ -1735,6 +2146,16 @@ describe('zod', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export const UserSchema: z.ZodObject> = z.object({ __typename: z.literal('User').optional(), id: z.string(), @@ -1787,7 +2208,17 @@ describe('zod', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - export const TestSchema = z.nativeEnum(Test); + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + + export const TestSchema: z.ZodType = z.nativeEnum(Test); export function QueryInputSchema(): z.ZodObject> { return z.object({ @@ -1820,6 +2251,16 @@ describe('zod', () => { `); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function SaySchema(): z.ZodObject> { return z.object({ phrase: z.string() @@ -1853,6 +2294,16 @@ describe('zod', () => { `); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " + type Properties = Required<{ + [K in keyof T]: z.ZodType; + }>; + + type definedNonNullAny = {}; + + export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== undefined && v !== null; + + export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); + export function SaySchema(): z.ZodObject> { return z.object({ phrase: z.string() @@ -1861,4 +2312,563 @@ describe('zod', () => { " `); }); + + describe('open issue coverage', () => { + it('supports configurable nullable field behavior', async () => { + const schema = buildSchema(/* GraphQL */ ` + input UserInput { + name: String + age: Int + } + `); + + const nullable = await plugin(schema, [], { schema: 'zod', nullishBehavior: 'nullable' }, {}); + expect(nullable.content).toContain('name: z.string().nullable()'); + expect(nullable.content).toContain('age: z.number().nullable()'); + + const optional = await plugin(schema, [], { schema: 'zod', zodOptionalType: 'optional' }, {}); + expect(optional.content).toContain('name: z.string().optional()'); + expect(optional.content).toContain('age: z.number().optional()'); + }); + + it('applies defaults and directives to non-null arrays', async () => { + const schema = buildSchema(/* GraphQL */ ` + input UserCreateInput { + names: [String!]! = [] + tags: [String!]! @constraint(minLength: 1, maxLength: 10) + } + + directive @constraint(minLength: Int!, maxLength: Int!) on INPUT_FIELD_DEFINITION + `); + + const result = await plugin( + schema, + [], + { + schema: 'zod', + directives: { + constraint: { + minLength: ['min', '$1'], + maxLength: ['max', '$1'], + }, + }, + }, + {}, + ); + + expect(result.content).toContain('names: z.array(z.string()).default([])'); + expect(result.content).toContain('tags: z.array(z.string()).min(1).max(10)'); + }); + + it('supports strict objects and GraphQL descriptions', async () => { + const schema = buildSchema(/* GraphQL */ ` + input UserInput { + "Display name shown to users" + name: String! + } + `); + + const result = await plugin( + schema, + [], + { schema: 'zod', strictObjectSchemas: true, withDescriptions: true }, + {}, + ); + + expect(result.content).toContain('name: z.string().describe("Display name shown to users")'); + expect(result.content).toContain('}).strict()'); + }); + + it('respects enumPrefix: false when typesPrefix is configured', async () => { + const schema = buildSchema(/* GraphQL */ ` + enum UserRole { + ADMIN + USER + } + + input CreateUserInput { + role: UserRole! + } + `); + + const result = await plugin( + schema, + [], + { + schema: 'zod', + importFrom: './types', + typesPrefix: 'I', + enumPrefix: false, + }, + {}, + ); + + expect(result.prepend).toContain(`import { UserRole, ICreateUserInput } from './types'`); + expect(result.content).toContain('export const UserRoleSchema: z.ZodType = z.nativeEnum(UserRole)'); + expect(result.content).toContain('export function ICreateUserInputSchema(): z.ZodObject>'); + }); + + it('qualifies enum defaults when schemaNamespacedImportName is configured', async () => { + const schema = buildSchema(/* GraphQL */ ` + enum PageType { + PUBLIC + } + + input PageInput { + pageType: PageType! = PUBLIC + } + `); + + const result = await plugin( + schema, + [], + { + schema: 'zod', + importFrom: './types', + schemaNamespacedImportName: 't', + useEnumTypeAsDefaultValue: true, + }, + {}, + ); + + expect(result.content).toContain('pageType: PageTypeSchema.default(t.PageType.Public)'); + }); + + it('keeps native enums as value imports when useTypeImports is configured', async () => { + const schema = buildSchema(/* GraphQL */ ` + enum UserRole { + ADMIN + } + + input CreateUserInput { + role: UserRole! + } + `); + + const result = await plugin( + schema, + [], + { + schema: 'zod', + importFrom: './types', + useTypeImports: true, + }, + {}, + ); + + expect(result.prepend).toContain(`import { UserRole } from './types'`); + expect(result.prepend).toContain(`import type { CreateUserInput } from './types'`); + }); + + it('generates type-checkable native enum defaults', async () => { + const schema = buildSchema(/* GraphQL */ ` + enum PageType { + PUBLIC + } + + input PageInput { + pageType: PageType! = PUBLIC + pageTypes: [PageType!]! = [PUBLIC] + inner: InnerInput! = { pageType: PUBLIC } + nullableNames: [String!] = null + nullableName: String = null + names: [String!]! = [] + } + + input InnerInput { + pageType: PageType! + } + `); + + const result = await plugin(schema, [], { schema: 'zod' }, {}); + + expectTypeScriptToCompile(` + ${(result.prepend ?? []).join('\n')} + + export enum PageType { + Public = 'PUBLIC' + } + + export type PageInput = { + pageType: PageType + pageTypes: PageType[] + inner: InnerInput + nullableNames?: string[] | null + nullableName?: string | null + names: string[] + } + + export type InnerInput = { + pageType: PageType + } + + ${result.content} + `); + }); + + it('generates type-checkable null defaults with optional nullable behavior', async () => { + const schema = buildSchema(/* GraphQL */ ` + input PageInput { + nullableNames: [String!] = null + nullableName: String = null + } + `); + + const result = await plugin(schema, [], { schema: 'zod', zodOptionalType: 'optional' }, {}); + + expect(result.content).toContain('nullableNames: z.array(z.string()).nullable().optional().default(null)'); + expect(result.content).toContain('nullableName: z.string().nullable().optional().default(null)'); + expectTypeScriptToCompile(` + ${(result.prepend ?? []).join('\n')} + + export type PageInput = { + nullableNames?: string[] | null + nullableName?: string | null + } + + ${result.content} + `); + }); + + it('coerces nested input object defaults from field defaults', async () => { + const schema = buildSchema(/* GraphQL */ ` + enum PageType { + PUBLIC + } + + input InnerInput { + pageType: PageType! = PUBLIC + } + + extend input InnerInput { + slug: String = "public" + } + + input PageInput { + inner: InnerInput! = {} + } + `); + + const result = await plugin(schema, [], { schema: 'zod' }, {}); + + expect(result.content).toContain('inner: z.lazy(() => InnerInputSchema().default({ pageType: PageType.Public, slug: "public" }))'); + }); + + it('supports onlyEnums', async () => { + const schema = buildSchema(/* GraphQL */ ` + enum UserRole { + ADMIN + USER + } + + input CreateUserInput { + role: UserRole! + } + `); + + const result = await plugin(schema, [], { schema: 'zod', onlyEnums: true }, {}); + + expect(result.content).toContain('export const UserRoleSchema'); + expect(result.content).not.toContain('CreateUserInputSchema'); + }); + + it('does not generate operation schemas when onlyEnums is enabled', async () => { + const schema = buildSchema(/* GraphQL */ ` + enum UserRole { + ADMIN + } + + type Query { + role: UserRole! + } + `); + const document = parse(/* GraphQL */ ` + query Role { + role + } + `); + + const result = await plugin( + schema, + [{ document }], + { + schema: 'zod', + onlyEnums: true, + withOperationType: true, + }, + {}, + ); + + expect(result.content).toContain('export const UserRoleSchema'); + expect(result.content).not.toContain('RoleQuerySchema'); + }); + + it('orders const object schemas before dependents', async () => { + const schema = buildSchema(/* GraphQL */ ` + type User { + profile: Profile! + } + + type Profile { + name: String! + } + `); + + const result = await plugin( + schema, + [], + { + schema: 'zod', + withObjectType: true, + validationSchemaExportType: 'const', + }, + {}, + ); + + expect(result.content.indexOf('export const ProfileSchema')).toBeLessThan( + result.content.indexOf('export const UserSchema'), + ); + expect(result.content).toContain('profile: z.lazy(() => ProfileSchema)'); + }); + + it('generates operation schemas from selected query fields', async () => { + const schema = buildSchema(/* GraphQL */ ` + type Author { + email: String! + name: String! + password: String! + } + + type Query { + author: Author! + } + `); + const document = parse(/* GraphQL */ ` + query Author { + author { + email + } + } + `); + + const result = await plugin( + schema, + [{ document }], + { + schema: 'zod', + withOperationType: true, + importFrom: './types', + useTypeImports: true, + }, + {}, + ); + + expect(result.prepend).toContain('import type { AuthorQuery } from \'./types\''); + expect(result.content).toContain('export function AuthorQuerySchema(): z.ZodType'); + expect(result.content).toContain('author: z.object({'); + expect(result.content).toContain('email: z.string()'); + expect(result.content).not.toContain('name: z.string()'); + expect(result.content).not.toContain('password: z.string()'); + }); + + it('qualifies operation result types with namespace imports', async () => { + const schema = buildSchema(/* GraphQL */ ` + type Author { + email: String! + } + + type Query { + author: Author! + } + `); + const document = parse(/* GraphQL */ ` + query Author { + author { + email + } + } + `); + + const result = await plugin( + schema, + [{ document }], + { + schema: 'zod', + withOperationType: true, + importFrom: './types', + schemaNamespacedImportName: 't', + }, + {}, + ); + + expect(result.prepend).toContain('import * as t from \'./types\''); + expect(result.content).toContain('export function AuthorQuerySchema(): z.ZodType'); + }); + + it('generates branch schemas for union operation fragments', async () => { + const schema = buildSchema(/* GraphQL */ ` + type User { + name: String! + } + + type Post { + title: String! + } + + union SearchResult = User | Post + + type Query { + search: [SearchResult!]! + } + `); + const document = parse(/* GraphQL */ ` + query Search { + search { + __typename + ... on User { + name + } + ... on Post { + title + } + } + } + `); + + const result = await plugin(schema, [{ document }], { schema: 'zod', withOperationType: true }, {}); + + expect(result.content).toContain('search: z.array(z.union(['); + expect(result.content).toContain('__typename: z.literal(\'User\')'); + expect(result.content).toContain('name: z.string()'); + expect(result.content).toContain('__typename: z.literal(\'Post\')'); + expect(result.content).toContain('title: z.string()'); + }); + + it('honors conditional operation directives', async () => { + const schema = buildSchema(/* GraphQL */ ` + type Author { + email: String! + name: String! + password: String! + } + + type Query { + author: Author! + } + `); + const document = parse(/* GraphQL */ ` + query Author($showEmail: Boolean!) { + author { + email @include(if: $showEmail) + name @skip(if: true) + password @include(if: false) + } + } + `); + + const result = await plugin(schema, [{ document }], { schema: 'zod', withOperationType: true }, {}); + + expect(result.content).toContain('email: z.string().optional()'); + expect(result.content).not.toContain('name: z.string()'); + expect(result.content).not.toContain('password: z.string()'); + }); + + it('generates type-checkable operation schemas with nonOptionalTypename', async () => { + const schema = buildSchema(/* GraphQL */ ` + type Author { + email: String! + } + + type Query { + author: Author! + } + `); + const document = parse(/* GraphQL */ ` + query Author { + author { + email + } + } + `); + + const result = await plugin( + schema, + [{ document }], + { + schema: 'zod', + withOperationType: true, + nonOptionalTypename: true, + }, + {}, + ); + + expect(result.content).toContain('__typename: z.literal(\'Query\')'); + expect(result.content).toContain('__typename: z.literal(\'Author\')'); + expectTypeScriptToCompile(` + ${(result.prepend ?? []).join('\n')} + + export type AuthorQuery = { + __typename: 'Query' + author: { + __typename: 'Author' + email: string + } + } + + ${result.content} + `); + }); + + it('limits circular object validation depth', async () => { + const schema = buildSchema(/* GraphQL */ ` + type Movie { + id: ID! + alternativeTitles: [MovieAlternativeTitle!]! + } + + type MovieAlternativeTitle { + title: String! + movie: Movie! + } + `); + + const result = await plugin( + schema, + [], + { + schema: 'zod', + withObjectType: true, + maxDepth: 1, + }, + {}, + ); + + expect(result.content).toContain('export function MovieSchema(depth = 0): z.ZodObject>'); + expect(result.content).toContain( + 'alternativeTitles: z.array(z.lazy(() => depth >= 1 ? definedNonNullAnySchema : MovieAlternativeTitleSchema(depth + 1)))', + ); + expect(result.content).toContain('movie: z.lazy(() => depth >= 1 ? definedNonNullAnySchema : MovieSchema(depth + 1))'); + }); + + it('propagates maxDepth through union schemas', async () => { + const schema = buildSchema(/* GraphQL */ ` + type A { + b: U! + } + + union U = B + + type B { + a: A! + } + `); + + const result = await plugin(schema, [], { schema: 'zod', withObjectType: true, maxDepth: 1 }, {}); + + expect(result.content).toContain('export function USchema(depth = 0)'); + expect(result.content).toContain('return BSchema(depth)'); + expect(result.content).toContain('b: z.lazy(() => depth >= 1 ? definedNonNullAnySchema : USchema(depth + 1))'); + expect(result.content).toContain('a: z.lazy(() => depth >= 1 ? definedNonNullAnySchema : ASchema(depth + 1))'); + }); + }); }); diff --git a/tests/zodv4.spec.ts b/tests/zodv4.spec.ts index 9b784890..6c5e1d25 100644 --- a/tests/zodv4.spec.ts +++ b/tests/zodv4.spec.ts @@ -1,7 +1,8 @@ -import { buildClientSchema, buildSchema, introspectionFromSchema } from 'graphql'; +import { buildClientSchema, buildSchema, introspectionFromSchema, parse } from 'graphql'; import { dedent } from 'ts-dedent'; import { plugin } from '../src/index'; +import { expectTypeScriptToCompile } from './typescript-compile'; const initialEmitValue = dedent(` type Properties = Required<{ @@ -44,9 +45,9 @@ describe('zodv4', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -85,9 +86,9 @@ describe('zodv4', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -124,9 +125,9 @@ describe('zodv4', () => { const result = await plugin(schema, [], { schema: 'zodv4', scalars }, {}); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -164,9 +165,9 @@ describe('zodv4', () => { const result = await plugin(schema, [], { schema: 'zodv4', scalars }, {}); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -211,9 +212,9 @@ describe('zodv4', () => { const result = await plugin(schema, [], { schema: 'zodv4', scalars, importFrom: './types', schemaNamespacedImportName: 't' }, {}); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -253,9 +254,9 @@ describe('zodv4', () => { const result = await plugin(schema, [], { schema: 'zodv4', scalars }, {}); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -287,9 +288,9 @@ describe('zodv4', () => { const result = await plugin(schema, [], { schema: 'zodv4', scalars }, {}); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -297,7 +298,7 @@ describe('zodv4', () => { export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); - export const PageTypeSchema = z.enum(PageType); + export const PageTypeSchema: z.ZodType = z.enum(PageType); export function PageInputSchema(): z.ZodObject> { return z.object({ @@ -322,9 +323,9 @@ describe('zodv4', () => { const result = await plugin(schema, [], { schema: 'zodv4', scalars, importFrom: './', schemaNamespacedImportName: 't' }, {}); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -332,7 +333,7 @@ describe('zodv4', () => { export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); - export const PageTypeSchema = z.enum(t.PageType); + export const PageTypeSchema: z.ZodType = z.enum(t.PageType); export function PageInputSchema(): z.ZodObject> { return z.object({ @@ -361,9 +362,9 @@ describe('zodv4', () => { const result = await plugin(schema, [], { schema: 'zodv4', scalars }, {}); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -371,7 +372,7 @@ describe('zodv4', () => { export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); - export const HttpMethodSchema = z.enum(HttpMethod); + export const HttpMethodSchema: z.ZodType = z.enum(HttpMethod); export function HttpInputSchema(): z.ZodObject> { return z.object({ @@ -407,9 +408,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -450,9 +451,9 @@ describe('zodv4', () => { `); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -493,9 +494,9 @@ describe('zodv4', () => { `); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -536,9 +537,9 @@ describe('zodv4', () => { `); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -573,9 +574,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -583,7 +584,7 @@ describe('zodv4', () => { export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); - export const PageTypeSchema = z.enum(['PUBLIC', 'BASIC_AUTH']); + export const PageTypeSchema: z.ZodType<"PUBLIC" | "BASIC_AUTH", "PUBLIC" | "BASIC_AUTH"> = z.enum(['PUBLIC', 'BASIC_AUTH']); " `) }); @@ -608,9 +609,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -618,7 +619,7 @@ describe('zodv4', () => { export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); - export const PageTypeSchema = z.enum(['PUBLIC', 'BASIC_AUTH']); + export const PageTypeSchema: z.ZodType<"PUBLIC" | "BASIC_AUTH", "PUBLIC" | "BASIC_AUTH"> = z.enum(['PUBLIC', 'BASIC_AUTH']); " `) }); @@ -647,9 +648,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -694,9 +695,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -743,9 +744,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -788,9 +789,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -833,9 +834,9 @@ describe('zodv4', () => { `); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -876,9 +877,9 @@ describe('zodv4', () => { `); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -921,8 +922,8 @@ describe('zodv4', () => { }, ); - expect(result.content).toContain('export const PageTypeSchema = z.enum(PageType)'); - expect(result.content).toContain('export function PageInputSchema(): z.ZodObject>'); + expect(result.content).toContain('export const PageTypeSchema: z.ZodType = z.enum(PageType)'); + expect(result.content).toContain('export function PageInputSchema(): z.ZodType'); expect(result.content).toContain('pageType: PageTypeSchema.default(PageType.Public)'); expect(result.content).toContain('greeting: z.string().default("Hello").nullish()'); @@ -957,8 +958,8 @@ describe('zodv4', () => { }, ); - expect(result.content).toContain('export const PageTypeSchema = z.enum(PageType)'); - expect(result.content).toContain('export function PageInputSchema(): z.ZodObject>'); + expect(result.content).toContain('export const PageTypeSchema: z.ZodType = z.enum(PageType)'); + expect(result.content).toContain('export function PageInputSchema(): z.ZodType'); expect(result.content).toContain('pageType: PageTypeSchema.default(PageType.Basic_Auth)'); expect(result.content).toContain('greeting: z.string().default("Hello").nullish()'); @@ -996,8 +997,8 @@ describe('zodv4', () => { }, ); - expect(result.content).toContain('export const PageTypeSchema = z.enum(PageType)'); - expect(result.content).toContain('export function PageInputSchema(): z.ZodObject>'); + expect(result.content).toContain('export const PageTypeSchema: z.ZodType = z.enum(PageType)'); + expect(result.content).toContain('export function PageInputSchema(): z.ZodType'); expect(result.content).toContain('pageType: PageTypeSchema.default(PageType.BasicAuth)'); expect(result.content).toContain('greeting: z.string().default("Hello").nullish()'); @@ -1033,9 +1034,9 @@ describe('zodv4', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -1043,11 +1044,11 @@ describe('zodv4', () => { export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); - export const PageTypeSchema = z.enum(PageType); + export const PageTypeSchema: z.ZodType = z.enum(PageType); - export function PageInputSchema(): z.ZodObject> { + export function PageInputSchema(): z.ZodType { return z.object({ - pageType: PageTypeSchema.default("PUBLIC"), + pageType: PageTypeSchema.default(PageType.Public), greeting: z.string().default("Hello").nullish(), newline: z.string().default("Hello\\nWorld").nullish(), score: z.number().default(100).nullish(), @@ -1084,9 +1085,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -1127,9 +1128,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -1170,9 +1171,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -1216,9 +1217,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -1260,9 +1261,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -1323,9 +1324,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -1410,9 +1411,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -1476,9 +1477,9 @@ describe('zodv4', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -1532,9 +1533,9 @@ describe('zodv4', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -1590,9 +1591,9 @@ describe('zodv4', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -1648,9 +1649,9 @@ describe('zodv4', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -1699,9 +1700,9 @@ describe('zodv4', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -1709,9 +1710,9 @@ describe('zodv4', () => { export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); - export const PageTypeSchema = z.enum(PageType); + export const PageTypeSchema: z.ZodType = z.enum(PageType); - export const MethodTypeSchema = z.enum(MethodType); + export const MethodTypeSchema: z.ZodType = z.enum(MethodType); export function AnyTypeSchema() { return z.union([PageTypeSchema, MethodTypeSchema]) @@ -1748,9 +1749,9 @@ describe('zodv4', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -1799,9 +1800,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -1866,9 +1867,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -1912,9 +1913,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -1974,9 +1975,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -2047,9 +2048,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -2084,9 +2085,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -2145,9 +2146,9 @@ describe('zodv4', () => { expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -2207,9 +2208,9 @@ describe('zodv4', () => { ); expect(removedInitialEmitValue(result.content)).toMatchInlineSnapshot(` " - type Properties = Required<{ - [K in keyof T]: z.ZodType; - }>; + type Properties = { + [K in keyof T]: z.ZodType; + }; type definedNonNullAny = {}; @@ -2217,7 +2218,7 @@ describe('zodv4', () => { export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v)); - export const TestSchema = z.enum(Test); + export const TestSchema: z.ZodType = z.enum(Test); export function QueryInputSchema(): z.ZodObject> { return z.object({ @@ -2227,4 +2228,330 @@ describe('zodv4', () => { " `) }); + + describe('open issue coverage', () => { + it('supports @oneOf input objects', async () => { + const schema = buildSchema(/* GraphQL */ ` + directive @oneOf on INPUT_OBJECT + + input AssignEventInput { + targetId: String! + } + + input PlaceholderEventInput { + placeholder: String! + } + + input EventInput @oneOf { + assignEvent: AssignEventInput + placeholder: PlaceholderEventInput + } + `); + + const result = await plugin(schema, [], { schema: 'zodv4' }, {}); + + expect(result.content).toContain('export function EventInputSchema(): z.ZodType'); + expect(result.content).toContain('assignEvent: z.lazy(() => AssignEventInputSchema())'); + expect(result.content).toContain('placeholder: z.never().optional()'); + expect(result.content).toContain('placeholder: z.lazy(() => PlaceholderEventInputSchema())'); + expect(result.content).toContain('assignEvent: z.never().optional()'); + }); + + it('supports configurable nullable field behavior', async () => { + const schema = buildSchema(/* GraphQL */ ` + input UserInput { + name: String + } + `); + + const result = await plugin(schema, [], { schema: 'zodv4', nullishBehavior: 'nullable' }, {}); + expect(result.content).toContain('name: z.string().nullable()'); + }); + + it('qualifies enum defaults when schemaNamespacedImportName is configured', async () => { + const schema = buildSchema(/* GraphQL */ ` + enum PageType { + PUBLIC + } + + input PageInput { + pageType: PageType! = PUBLIC + } + `); + + const result = await plugin( + schema, + [], + { + schema: 'zodv4', + importFrom: './types', + schemaNamespacedImportName: 't', + useEnumTypeAsDefaultValue: true, + }, + {}, + ); + + expect(result.content).toContain('pageType: PageTypeSchema.default(t.PageType.Public)'); + }); + + it('keeps native enums as value imports when useTypeImports is configured', async () => { + const schema = buildSchema(/* GraphQL */ ` + enum UserRole { + ADMIN + } + + input CreateUserInput { + role: UserRole! + } + `); + + const result = await plugin( + schema, + [], + { + schema: 'zodv4', + importFrom: './types', + useTypeImports: true, + }, + {}, + ); + + expect(result.prepend).toContain(`import { UserRole } from './types'`); + expect(result.prepend).toContain(`import type { CreateUserInput } from './types'`); + }); + + it('generates type-checkable native enum and array defaults', async () => { + const schema = buildSchema(/* GraphQL */ ` + enum PageType { + PUBLIC + } + + input PageInput { + pageType: PageType! = PUBLIC + pageTypes: [PageType!]! = [PUBLIC] + inner: InnerInput! = { pageType: PUBLIC } + nullableNames: [String!] = null + nullableName: String = null + greeting: String = "Hello" + names: [String!]! = [] + } + + input InnerInput { + pageType: PageType! + } + `); + + const result = await plugin(schema, [], { schema: 'zodv4' }, {}); + + expectTypeScriptToCompile(` + ${(result.prepend ?? []).join('\n')} + + export enum PageType { + Public = 'PUBLIC' + } + + export type PageInput = { + pageType: PageType + pageTypes: PageType[] + inner: InnerInput + nullableNames?: string[] | null + nullableName?: string | null + greeting?: string | null + names: string[] + } + + export type InnerInput = { + pageType: PageType + } + + ${result.content} + `); + }); + + it('generates type-checkable null defaults with optional nullable behavior', async () => { + const schema = buildSchema(/* GraphQL */ ` + input PageInput { + nullableNames: [String!] = null + nullableName: String = null + } + `); + + const result = await plugin(schema, [], { schema: 'zodv4', zodOptionalType: 'optional' }, {}); + + expect(result.content).toContain('nullableNames: z.array(z.string()).nullable().optional().default(null)'); + expect(result.content).toContain('nullableName: z.string().nullable().optional().default(null)'); + expectTypeScriptToCompile(` + ${(result.prepend ?? []).join('\n')} + + export type PageInput = { + nullableNames?: string[] | null + nullableName?: string | null + } + + ${result.content} + `); + }); + + it('coerces nested input object defaults from field defaults', async () => { + const schema = buildSchema(/* GraphQL */ ` + enum PageType { + PUBLIC + } + + input InnerInput { + pageType: PageType! = PUBLIC + } + + extend input InnerInput { + slug: String = "public" + } + + input PageInput { + inner: InnerInput! = {} + } + `); + + const result = await plugin(schema, [], { schema: 'zodv4' }, {}); + + expect(result.content).toContain('inner: z.lazy(() => InnerInputSchema().default({ pageType: PageType.Public, slug: "public" }))'); + }); + + it('generates operation schemas from selected query fields', async () => { + const schema = buildSchema(/* GraphQL */ ` + type Author { + email: String! + name: String! + password: String! + } + + type Query { + author: Author! + } + `); + const document = parse(/* GraphQL */ ` + query Author { + author { + email + } + } + `); + + const result = await plugin( + schema, + [{ document }], + { + schema: 'zodv4', + withOperationType: true, + importFrom: './types', + useTypeImports: true, + }, + {}, + ); + + expect(result.prepend).toContain('import type { AuthorQuery } from \'./types\''); + expect(result.content).toContain('export function AuthorQuerySchema(): z.ZodType'); + expect(result.content).toContain('author: z.object({'); + expect(result.content).toContain('email: z.string()'); + expect(result.content).not.toContain('name: z.string()'); + expect(result.content).not.toContain('password: z.string()'); + }); + + it('generates type-checkable operation schemas with nonOptionalTypename', async () => { + const schema = buildSchema(/* GraphQL */ ` + type Author { + email: String! + } + + type Query { + author: Author! + } + `); + const document = parse(/* GraphQL */ ` + query Author { + author { + email + } + } + `); + + const result = await plugin( + schema, + [{ document }], + { + schema: 'zodv4', + withOperationType: true, + nonOptionalTypename: true, + }, + {}, + ); + + expect(result.content).toContain('__typename: z.literal(\'Query\')'); + expect(result.content).toContain('__typename: z.literal(\'Author\')'); + expectTypeScriptToCompile(` + ${(result.prepend ?? []).join('\n')} + + export type AuthorQuery = { + __typename: 'Query' + author: { + __typename: 'Author' + email: string + } + } + + ${result.content} + `); + }); + + it('limits circular object validation depth', async () => { + const schema = buildSchema(/* GraphQL */ ` + type Movie { + id: ID! + alternativeTitles: [MovieAlternativeTitle!]! + } + + type MovieAlternativeTitle { + title: String! + movie: Movie! + } + `); + + const result = await plugin( + schema, + [], + { + schema: 'zodv4', + withObjectType: true, + maxDepth: 1, + }, + {}, + ); + + expect(result.content).toContain('export function MovieSchema(depth = 0): z.ZodObject>'); + expect(result.content).toContain( + 'alternativeTitles: z.array(z.lazy(() => depth >= 1 ? definedNonNullAnySchema : MovieAlternativeTitleSchema(depth + 1)))', + ); + expect(result.content).toContain('movie: z.lazy(() => depth >= 1 ? definedNonNullAnySchema : MovieSchema(depth + 1))'); + }); + + it('propagates maxDepth through union schemas', async () => { + const schema = buildSchema(/* GraphQL */ ` + type A { + b: U! + } + + union U = B + + type B { + a: A! + } + `); + + const result = await plugin(schema, [], { schema: 'zodv4', withObjectType: true, maxDepth: 1 }, {}); + + expect(result.content).toContain('export function USchema(depth = 0)'); + expect(result.content).toContain('return BSchema(depth)'); + expect(result.content).toContain('b: z.lazy(() => depth >= 1 ? definedNonNullAnySchema : USchema(depth + 1))'); + expect(result.content).toContain('a: z.lazy(() => depth >= 1 ? definedNonNullAnySchema : ASchema(depth + 1))'); + }); + }); }); diff --git a/tsconfig.json b/tsconfig.json index d500d855..dbcf66ac 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,6 +4,7 @@ "target": "ES2022", "incremental": true, "declaration": true, + "ignoreDeprecations": "6.0", "noEmit": false, "outDir": "dist", "baseUrl": ".", @@ -18,4 +19,4 @@ "exclude": [ "dist" ] -} \ No newline at end of file +}