@orval/solid-start 8.5.1 → 8.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { Verbs, generateBodyOptions, generateFormDataAndUrlEncodedFunction, generateVerbImports, getIsBodyVerb, isObject, pascal, sanitize, toObjectString } from "@orval/core";
1
+ import { Verbs, generateBodyOptions, generateFormDataAndUrlEncodedFunction, generateVerbImports, getIsBodyVerb, isObject, pascal, resolveRef, sanitize, toObjectString } from "@orval/core";
2
2
 
3
3
  //#region src/index.ts
4
4
  const SOLID_START_DEPENDENCIES = [{
@@ -47,7 +47,7 @@ export const ${title} = {
47
47
  const generateSolidStartFooter = () => {
48
48
  return "};\n";
49
49
  };
50
- const generateImplementation = ({ headers, queryParams, operationName, response, mutator, body, props, verb, override, formData, formUrlEncoded }, { route }) => {
50
+ const generateImplementation = ({ headers, queryParams, operationName, response, mutator, body, props, verb, override, formData, formUrlEncoded }, { route, context, pathRoute }) => {
51
51
  const isFormData = !override.formData.disabled;
52
52
  const isFormUrlEncoded = override.formUrlEncoded !== false;
53
53
  const bodyForm = generateFormDataAndUrlEncodedFunction({
@@ -84,7 +84,61 @@ const generateImplementation = ({ headers, queryParams, operationName, response,
84
84
  `;
85
85
  }
86
86
  const propsImplementation = toObjectString(props, "implementation");
87
- const queryParamsCode = queryParams ? `const queryString = new URLSearchParams(params as any).toString();
87
+ const pathItem = context.spec.paths?.[pathRoute];
88
+ const operation = pathItem?.[verb];
89
+ const mergedParameters = [...pathItem?.parameters ?? [], ...operation?.parameters ?? []];
90
+ const byKey = /* @__PURE__ */ new Map();
91
+ for (const parameter of mergedParameters) {
92
+ const { schema } = resolveRef(parameter, context);
93
+ byKey.set(`${schema.in}:${schema.name}`, parameter);
94
+ }
95
+ const parameters = [...byKey.values()];
96
+ const explodeParameters = parameters.filter((parameter) => {
97
+ const { schema: parameterObject } = resolveRef(parameter, context);
98
+ if (!parameterObject.schema) return false;
99
+ const { schema: schemaObject } = resolveRef(parameterObject.schema, context);
100
+ const isArrayLike = schemaObject.type === "array" || (schemaObject.oneOf ?? []).some((s) => resolveRef(s, context).schema.type === "array") || (schemaObject.anyOf ?? []).some((s) => resolveRef(s, context).schema.type === "array") || (schemaObject.allOf ?? []).some((s) => resolveRef(s, context).schema.type === "array");
101
+ const isExploded = parameterObject.explode === true || parameterObject.explode === void 0 && (parameterObject.style === void 0 || parameterObject.style === "form");
102
+ return parameterObject.in === "query" && isArrayLike && isExploded;
103
+ });
104
+ const explodeParametersNames = explodeParameters.map((parameter) => {
105
+ const { schema } = resolveRef(parameter, context);
106
+ return schema.name;
107
+ });
108
+ const hasExplodedDateParams = context.output.override.useDates && explodeParameters.some((p) => {
109
+ const { schema: parameterObject } = resolveRef(p, context);
110
+ if (!parameterObject.schema) return false;
111
+ const { schema: schemaObject } = resolveRef(parameterObject.schema, context);
112
+ const itemsFormat = schemaObject.items ? resolveRef(schemaObject.items, context).schema.format : void 0;
113
+ return schemaObject.format === "date-time" || itemsFormat === "date-time";
114
+ });
115
+ const isExplodeParametersOnly = explodeParameters.length === parameters.length;
116
+ const hasDateParams = context.output.override.useDates && parameters.some((p) => {
117
+ const { schema: parameterObject } = resolveRef(p, context);
118
+ if (!parameterObject.schema) return false;
119
+ const { schema: schemaObject } = resolveRef(parameterObject.schema, context);
120
+ const itemsFormat = schemaObject.items ? resolveRef(schemaObject.items, context).schema.format : void 0;
121
+ return schemaObject.format === "date-time" || itemsFormat === "date-time";
122
+ });
123
+ const explodeArrayImplementation = explodeParameters.length > 0 ? `const explodeParameters = ${JSON.stringify(explodeParametersNames)};
124
+
125
+ if (Array.isArray(value) && explodeParameters.includes(key)) {
126
+ value.forEach((v) => {
127
+ normalizedParams.append(key, v === null ? 'null' : ${hasExplodedDateParams ? "v instanceof Date ? v.toISOString() : " : ""}v.toString());
128
+ });
129
+ return;
130
+ }
131
+ ` : "";
132
+ const queryParamsCode = queryParams ? `const normalizedParams = new URLSearchParams();
133
+
134
+ Object.entries(params || {}).forEach(([key, value]) => {
135
+ ${explodeArrayImplementation}
136
+ ${isExplodeParametersOnly ? "" : `if (value !== undefined) {
137
+ normalizedParams.append(key, Array.isArray(value) ? value.map(v => v === null ? 'null' : ${hasDateParams ? "v instanceof Date ? v.toISOString() : " : ""}String(v)).join(',') : value === null ? 'null' : ${hasDateParams ? "value instanceof Date ? value.toISOString() : " : ""}value.toString())
138
+ }`}
139
+ });
140
+
141
+ const queryString = normalizedParams.toString();
88
142
  const url = queryString ? \`${route}?\${queryString}\` : \`${route}\`;` : `const url = \`${route}\`;`;
89
143
  const headersCode = headers ? `headers: { ...headers, 'Content-Type': 'application/json' }` : `headers: { 'Content-Type': 'application/json' }`;
90
144
  const bodyCode = isBodyVerb && body.implementation ? `,
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["import {\n type ClientBuilder,\n type ClientDependenciesBuilder,\n type ClientFooterBuilder,\n type ClientGeneratorsBuilder,\n type ClientHeaderBuilder,\n type ClientTitleBuilder,\n generateBodyOptions,\n generateFormDataAndUrlEncodedFunction,\n generateVerbImports,\n type GeneratorDependency,\n type GeneratorOptions,\n type GeneratorVerbOptions,\n getIsBodyVerb,\n isObject,\n pascal,\n sanitize,\n toObjectString,\n Verbs,\n} from '@orval/core';\n\nconst SOLID_START_DEPENDENCIES: GeneratorDependency[] = [\n {\n exports: [\n { name: 'query', values: true },\n { name: 'action', values: true },\n { name: 'cache', values: true },\n { name: 'revalidate', values: true },\n ],\n dependency: '@solidjs/router',\n },\n];\n\nexport const getSolidStartDependencies: ClientDependenciesBuilder = () =>\n SOLID_START_DEPENDENCIES;\n\nexport const generateSolidStartTitle: ClientTitleBuilder = (title) => {\n const sanTitle = sanitize(title);\n return pascal(sanTitle);\n};\n\nexport const generateSolidStartHeader: ClientHeaderBuilder = ({ title }) => `\n/**\n * Cache Invalidation:\n *\n * Each query provides .key and .keyFor() for cache invalidation.\n *\n * Examples:\n * // Invalidate all calls to a query\n * revalidate(${title}.listPets.key);\n *\n * // Invalidate a specific call with arguments\n * revalidate(${title}.showPetById.keyFor(\"pet-123\", 1));\n *\n * // Invalidate multiple queries\n * revalidate([${title}.listPets.key, ${title}.showPetById.keyFor(\"pet-123\", 1)]);\n */\nexport const ${title} = {\n`;\n\nexport const generateSolidStartFooter: ClientFooterBuilder = () => {\n return '};\\n';\n};\n\nconst generateImplementation = (\n {\n headers,\n queryParams,\n operationName,\n response,\n mutator,\n body,\n props,\n verb,\n override,\n formData,\n formUrlEncoded,\n }: GeneratorVerbOptions,\n { route }: GeneratorOptions,\n) => {\n const isFormData = !override.formData.disabled;\n const isFormUrlEncoded = override.formUrlEncoded !== false;\n const bodyForm = generateFormDataAndUrlEncodedFunction({\n formData,\n formUrlEncoded,\n body,\n isFormData,\n isFormUrlEncoded,\n });\n\n const dataType = response.definition.success || 'unknown';\n const isGetVerb = verb === Verbs.GET;\n const isBodyVerb = getIsBodyVerb(verb);\n\n if (mutator) {\n const propsImplementation =\n mutator.bodyTypeName && body.definition\n ? toObjectString(props, 'implementation').replace(\n new RegExp(String.raw`(\\w*):\\s?${body.definition}`),\n `$1: ${mutator.bodyTypeName}<${body.definition}>`,\n )\n : toObjectString(props, 'implementation');\n\n // Build config object for mutator\n const configParts: string[] = [\n `url: \\`${route}\\``,\n `method: '${verb.toUpperCase()}'`,\n ];\n\n // Add params for query parameters\n if (queryParams) {\n configParts.push('params');\n }\n\n // Add headers\n const ignoreContentTypes = ['multipart/form-data'];\n const overrideHeaders =\n isObject(override.requestOptions) && override.requestOptions.headers\n ? Object.entries(override.requestOptions.headers).map(\n ([key, value]) => `'${key}': \\`${value}\\``,\n )\n : [];\n\n const headersToAdd: string[] = [\n ...(body.contentType && !ignoreContentTypes.includes(body.contentType)\n ? [`'Content-Type': '${body.contentType}'`]\n : []),\n ...overrideHeaders,\n ...(headers ? ['...headers'] : []),\n ];\n\n if (headersToAdd.length > 0) {\n configParts.push(`headers: { ${headersToAdd.join(',')} }`);\n }\n\n // Add body/data for mutations\n const requestBodyParams = generateBodyOptions(\n body,\n isFormData,\n isFormUrlEncoded,\n );\n if (requestBodyParams) {\n if (\n (isFormData && body.formData) ||\n (isFormUrlEncoded && body.formUrlEncoded)\n ) {\n configParts.push(`data: ${requestBodyParams}`);\n } else {\n configParts.push(`data: ${requestBodyParams}`);\n }\n }\n\n const axiosConfig = `{\n ${configParts.join(',\\n ')}\n }`;\n\n const functionName = isGetVerb ? 'query' : 'action';\n\n return ` ${operationName}: ${functionName}(async (${propsImplementation}) => {${bodyForm}\n return ${mutator.name}<${dataType}>(${axiosConfig});\n }, \"${operationName}\"),\n`;\n }\n\n const propsImplementation = toObjectString(props, 'implementation');\n\n // Build query params string\n const queryParamsCode = queryParams\n ? `const queryString = new URLSearchParams(params as any).toString();\n const url = queryString ? \\`${route}?\\${queryString}\\` : \\`${route}\\`;`\n : `const url = \\`${route}\\`;`;\n\n // Build headers object\n const headersCode = headers\n ? `headers: { ...headers, 'Content-Type': 'application/json' }`\n : `headers: { 'Content-Type': 'application/json' }`;\n\n // Build body code\n const bodyCode =\n isBodyVerb && body.implementation\n ? `,\n body: JSON.stringify(${body.implementation})`\n : '';\n\n const functionName = isGetVerb ? 'query' : 'action';\n const fetchBodyPart = isGetVerb ? '' : bodyCode;\n\n return ` ${operationName}: ${functionName}(async (${propsImplementation}) => {${bodyForm}\n ${queryParamsCode}\n const response = await fetch(url, {\n method: '${verb.toUpperCase()}',\n ${headersCode}${fetchBodyPart}\n });\n if (!response.ok) {\n throw new Error(\\`HTTP error! status: \\${response.status}\\`);\n }\n return response.json() as Promise<${dataType}>;\n }, \"${operationName}\"),\n`;\n};\n\nexport const generateSolidStart: ClientBuilder = (verbOptions, options) => {\n const imports = generateVerbImports(verbOptions);\n const implementation = generateImplementation(verbOptions, options);\n\n return { implementation, imports };\n};\n\nconst solidStartClientBuilder: ClientGeneratorsBuilder = {\n client: generateSolidStart,\n header: generateSolidStartHeader,\n dependencies: getSolidStartDependencies,\n footer: generateSolidStartFooter,\n title: generateSolidStartTitle,\n};\n\nexport const builder = () => () => solidStartClientBuilder;\n\nexport default builder;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["import {\n type ClientBuilder,\n type ClientDependenciesBuilder,\n type ClientFooterBuilder,\n type ClientGeneratorsBuilder,\n type ClientHeaderBuilder,\n type ClientTitleBuilder,\n generateBodyOptions,\n generateFormDataAndUrlEncodedFunction,\n generateVerbImports,\n type GeneratorDependency,\n type GeneratorOptions,\n type GeneratorVerbOptions,\n getIsBodyVerb,\n isObject,\n type OpenApiParameterObject,\n type OpenApiReferenceObject,\n type OpenApiSchemaObject,\n pascal,\n resolveRef,\n sanitize,\n toObjectString,\n Verbs,\n} from '@orval/core';\n\nconst SOLID_START_DEPENDENCIES: GeneratorDependency[] = [\n {\n exports: [\n { name: 'query', values: true },\n { name: 'action', values: true },\n { name: 'cache', values: true },\n { name: 'revalidate', values: true },\n ],\n dependency: '@solidjs/router',\n },\n];\n\nexport const getSolidStartDependencies: ClientDependenciesBuilder = () =>\n SOLID_START_DEPENDENCIES;\n\nexport const generateSolidStartTitle: ClientTitleBuilder = (title) => {\n const sanTitle = sanitize(title);\n return pascal(sanTitle);\n};\n\nexport const generateSolidStartHeader: ClientHeaderBuilder = ({ title }) => `\n/**\n * Cache Invalidation:\n *\n * Each query provides .key and .keyFor() for cache invalidation.\n *\n * Examples:\n * // Invalidate all calls to a query\n * revalidate(${title}.listPets.key);\n *\n * // Invalidate a specific call with arguments\n * revalidate(${title}.showPetById.keyFor(\"pet-123\", 1));\n *\n * // Invalidate multiple queries\n * revalidate([${title}.listPets.key, ${title}.showPetById.keyFor(\"pet-123\", 1)]);\n */\nexport const ${title} = {\n`;\n\nexport const generateSolidStartFooter: ClientFooterBuilder = () => {\n return '};\\n';\n};\n\nconst generateImplementation = (\n {\n headers,\n queryParams,\n operationName,\n response,\n mutator,\n body,\n props,\n verb,\n override,\n formData,\n formUrlEncoded,\n }: GeneratorVerbOptions,\n { route, context, pathRoute }: GeneratorOptions,\n) => {\n const isFormData = !override.formData.disabled;\n const isFormUrlEncoded = override.formUrlEncoded !== false;\n const bodyForm = generateFormDataAndUrlEncodedFunction({\n formData,\n formUrlEncoded,\n body,\n isFormData,\n isFormUrlEncoded,\n });\n\n const dataType = response.definition.success || 'unknown';\n const isGetVerb = verb === Verbs.GET;\n const isBodyVerb = getIsBodyVerb(verb);\n\n if (mutator) {\n const propsImplementation =\n mutator.bodyTypeName && body.definition\n ? toObjectString(props, 'implementation').replace(\n new RegExp(String.raw`(\\w*):\\s?${body.definition}`),\n `$1: ${mutator.bodyTypeName}<${body.definition}>`,\n )\n : toObjectString(props, 'implementation');\n\n // Build config object for mutator\n const configParts: string[] = [\n `url: \\`${route}\\``,\n `method: '${verb.toUpperCase()}'`,\n ];\n\n // Add params for query parameters\n if (queryParams) {\n configParts.push('params');\n }\n\n // Add headers\n const ignoreContentTypes = ['multipart/form-data'];\n const overrideHeaders =\n isObject(override.requestOptions) && override.requestOptions.headers\n ? Object.entries(override.requestOptions.headers).map(\n ([key, value]) => `'${key}': \\`${value}\\``,\n )\n : [];\n\n const headersToAdd: string[] = [\n ...(body.contentType && !ignoreContentTypes.includes(body.contentType)\n ? [`'Content-Type': '${body.contentType}'`]\n : []),\n ...overrideHeaders,\n ...(headers ? ['...headers'] : []),\n ];\n\n if (headersToAdd.length > 0) {\n configParts.push(`headers: { ${headersToAdd.join(',')} }`);\n }\n\n // Add body/data for mutations\n const requestBodyParams = generateBodyOptions(\n body,\n isFormData,\n isFormUrlEncoded,\n );\n if (requestBodyParams) {\n if (\n (isFormData && body.formData) ||\n (isFormUrlEncoded && body.formUrlEncoded)\n ) {\n configParts.push(`data: ${requestBodyParams}`);\n } else {\n configParts.push(`data: ${requestBodyParams}`);\n }\n }\n\n const axiosConfig = `{\n ${configParts.join(',\\n ')}\n }`;\n\n const functionName = isGetVerb ? 'query' : 'action';\n\n return ` ${operationName}: ${functionName}(async (${propsImplementation}) => {${bodyForm}\n return ${mutator.name}<${dataType}>(${axiosConfig});\n }, \"${operationName}\"),\n`;\n }\n\n const propsImplementation = toObjectString(props, 'implementation');\n\n // Detect explode parameters from the OpenAPI spec\n // Merge path-item and operation-level parameters per the OpenAPI spec:\n // operation-level parameters override path-level ones with the same (in, name).\n const pathItem = context.spec.paths?.[pathRoute];\n const operation = pathItem?.[verb];\n const mergedParameters = [\n ...(pathItem?.parameters ?? []),\n ...(operation?.parameters ?? []),\n ];\n const byKey = new Map<string, (typeof mergedParameters)[number]>();\n for (const parameter of mergedParameters) {\n const { schema } = resolveRef<OpenApiParameterObject>(parameter, context);\n byKey.set(`${schema.in}:${schema.name}`, parameter);\n }\n const parameters = [...byKey.values()];\n\n const explodeParameters = parameters.filter((parameter) => {\n const { schema: parameterObject } = resolveRef<OpenApiParameterObject>(\n parameter,\n context,\n );\n\n if (!parameterObject.schema) {\n return false;\n }\n\n const { schema: schemaObject } = resolveRef<OpenApiSchemaObject>(\n parameterObject.schema,\n context,\n );\n\n const isArrayLike =\n schemaObject.type === 'array' ||\n (\n (schemaObject.oneOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined) ?? []\n ).some(\n (s) =>\n resolveRef<OpenApiSchemaObject>(s, context).schema.type === 'array',\n ) ||\n (\n (schemaObject.anyOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined) ?? []\n ).some(\n (s) =>\n resolveRef<OpenApiSchemaObject>(s, context).schema.type === 'array',\n ) ||\n (\n (schemaObject.allOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined) ?? []\n ).some(\n (s) =>\n resolveRef<OpenApiSchemaObject>(s, context).schema.type === 'array',\n );\n\n // Per OpenAPI spec: query params use 'form' style by default, and 'form'\n // style defaults explode to true when omitted.\n const isExploded =\n parameterObject.explode === true ||\n (parameterObject.explode === undefined &&\n (parameterObject.style === undefined ||\n parameterObject.style === 'form'));\n\n return parameterObject.in === 'query' && isArrayLike && isExploded;\n });\n\n const explodeParametersNames = explodeParameters.map((parameter) => {\n const { schema } = resolveRef<OpenApiParameterObject>(parameter, context);\n return schema.name;\n });\n\n const hasExplodedDateParams =\n context.output.override.useDates &&\n explodeParameters.some((p) => {\n const { schema: parameterObject } = resolveRef<OpenApiParameterObject>(\n p,\n context,\n );\n if (!parameterObject.schema) {\n return false;\n }\n const { schema: schemaObject } = resolveRef<OpenApiSchemaObject>(\n parameterObject.schema,\n context,\n );\n const itemsFormat = schemaObject.items\n ? resolveRef<OpenApiSchemaObject>(\n schemaObject.items as OpenApiSchemaObject | OpenApiReferenceObject,\n context,\n ).schema.format\n : undefined;\n return schemaObject.format === 'date-time' || itemsFormat === 'date-time';\n });\n\n const isExplodeParametersOnly =\n explodeParameters.length === parameters.length;\n\n const hasDateParams =\n context.output.override.useDates &&\n parameters.some((p) => {\n const { schema: parameterObject } = resolveRef<OpenApiParameterObject>(\n p,\n context,\n );\n if (!parameterObject.schema) {\n return false;\n }\n const { schema: schemaObject } = resolveRef<OpenApiSchemaObject>(\n parameterObject.schema,\n context,\n );\n const itemsFormat = schemaObject.items\n ? resolveRef<OpenApiSchemaObject>(\n schemaObject.items as OpenApiSchemaObject | OpenApiReferenceObject,\n context,\n ).schema.format\n : undefined;\n return schemaObject.format === 'date-time' || itemsFormat === 'date-time';\n });\n\n const explodeArrayImplementation =\n explodeParameters.length > 0\n ? `const explodeParameters = ${JSON.stringify(explodeParametersNames)};\n\n if (Array.isArray(value) && explodeParameters.includes(key)) {\n value.forEach((v) => {\n normalizedParams.append(key, v === null ? 'null' : ${hasExplodedDateParams ? 'v instanceof Date ? v.toISOString() : ' : ''}v.toString());\n });\n return;\n }\n `\n : '';\n\n const normalParamsImplementation = `if (value !== undefined) {\n normalizedParams.append(key, Array.isArray(value) ? value.map(v => v === null ? 'null' : ${hasDateParams ? 'v instanceof Date ? v.toISOString() : ' : ''}String(v)).join(',') : value === null ? 'null' : ${hasDateParams ? 'value instanceof Date ? value.toISOString() : ' : ''}value.toString())\n }`;\n\n // Build query params string\n const queryParamsCode = queryParams\n ? `const normalizedParams = new URLSearchParams();\n\n Object.entries(params || {}).forEach(([key, value]) => {\n ${explodeArrayImplementation}\n ${\n // When every parameter is declared as an exploded array, scalar values\n // are a type error at the call site (orval generates array-only types),\n // so the scalar fallback is intentionally omitted for this case.\n isExplodeParametersOnly ? '' : normalParamsImplementation\n }\n });\n\n const queryString = normalizedParams.toString();\n const url = queryString ? \\`${route}?\\${queryString}\\` : \\`${route}\\`;`\n : `const url = \\`${route}\\`;`;\n\n // Build headers object\n const headersCode = headers\n ? `headers: { ...headers, 'Content-Type': 'application/json' }`\n : `headers: { 'Content-Type': 'application/json' }`;\n\n // Build body code\n const bodyCode =\n isBodyVerb && body.implementation\n ? `,\n body: JSON.stringify(${body.implementation})`\n : '';\n\n const functionName = isGetVerb ? 'query' : 'action';\n const fetchBodyPart = isGetVerb ? '' : bodyCode;\n\n return ` ${operationName}: ${functionName}(async (${propsImplementation}) => {${bodyForm}\n ${queryParamsCode}\n const response = await fetch(url, {\n method: '${verb.toUpperCase()}',\n ${headersCode}${fetchBodyPart}\n });\n if (!response.ok) {\n throw new Error(\\`HTTP error! status: \\${response.status}\\`);\n }\n return response.json() as Promise<${dataType}>;\n }, \"${operationName}\"),\n`;\n};\n\nexport const generateSolidStart: ClientBuilder = (verbOptions, options) => {\n const imports = generateVerbImports(verbOptions);\n const implementation = generateImplementation(verbOptions, options);\n\n return { implementation, imports };\n};\n\nconst solidStartClientBuilder: ClientGeneratorsBuilder = {\n client: generateSolidStart,\n header: generateSolidStartHeader,\n dependencies: getSolidStartDependencies,\n footer: generateSolidStartFooter,\n title: generateSolidStartTitle,\n};\n\nexport const builder = () => () => solidStartClientBuilder;\n\nexport default builder;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orval/solid-start",
3
- "version": "8.5.1",
3
+ "version": "8.5.3",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.mts",
@@ -22,10 +22,11 @@
22
22
  "nuke": "rimraf .turbo dist node_modules"
23
23
  },
24
24
  "dependencies": {
25
- "@orval/core": "8.5.1"
25
+ "@orval/core": "8.5.3",
26
+ "@scalar/openapi-types": "0.5.3"
26
27
  },
27
28
  "devDependencies": {
28
- "eslint": "9.39.2",
29
+ "eslint": "10.0.2",
29
30
  "rimraf": "6.1.2",
30
31
  "tsdown": "0.20.3",
31
32
  "typescript": "5.9.3",