@orval/solid-start 8.11.0 → 8.12.2

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
@@ -123,7 +123,7 @@ const generateImplementation = ({ headers, queryParams, operationName, response,
123
123
 
124
124
  if (Array.isArray(value) && explodeParameters.includes(key)) {
125
125
  value.forEach((v) => {
126
- normalizedParams.append(key, v === null ? 'null' : ${hasExplodedDateParams ? "v instanceof Date ? v.toISOString() : " : ""}v.toString());
126
+ normalizedParams.append(key, v === null ? 'null' : ${hasExplodedDateParams ? "v instanceof Date ? v.toISOString() : " : ""}String(v));
127
127
  });
128
128
  return;
129
129
  }
@@ -133,7 +133,7 @@ const generateImplementation = ({ headers, queryParams, operationName, response,
133
133
  Object.entries(params || {}).forEach(([key, value]) => {
134
134
  ${explodeArrayImplementation}
135
135
  ${isExplodeParametersOnly ? "" : `if (value !== undefined) {
136
- 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())
136
+ 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() : " : ""}String(value))
137
137
  }`}
138
138
  });
139
139
 
@@ -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 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];\nconst resolveSchemaRef = (\n schema: OpenApiSchemaObject | OpenApiReferenceObject,\n context: GeneratorOptions['context'],\n) =>\n resolveRef(schema, context) as {\n schema: OpenApiSchemaObject;\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 ] as (OpenApiParameterObject | OpenApiReferenceObject)[];\n const byKey = new Map<\n string,\n OpenApiParameterObject | OpenApiReferenceObject\n >();\n for (const parameter of mergedParameters) {\n const { schema } = resolveRef(parameter, context);\n const parameterObject = schema as OpenApiParameterObject;\n byKey.set(`${parameterObject.in}:${parameterObject.name}`, parameter);\n }\n const parameters = [...byKey.values()];\n const parameterObjects = parameters.map((parameter) => {\n const { schema } = resolveRef(parameter, context);\n return schema as OpenApiParameterObject;\n });\n\n const explodeParameters = parameterObjects.filter((parameterObject) => {\n if (!parameterObject.schema) {\n return false;\n }\n\n const { schema: schemaObject } = resolveSchemaRef(\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((s) => resolveSchemaRef(s, context).schema.type === 'array') ||\n (\n (schemaObject.anyOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined) ?? []\n ).some((s) => resolveSchemaRef(s, context).schema.type === 'array') ||\n (\n (schemaObject.allOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined) ?? []\n ).some((s) => resolveSchemaRef(s, context).schema.type === 'array');\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(\n (parameter) => parameter.name,\n );\n\n const hasExplodedDateParams =\n context.output.override.useDates &&\n explodeParameters.some((parameter) => {\n if (!parameter.schema) {\n return false;\n }\n const { schema: schemaObject } = resolveSchemaRef(\n parameter.schema,\n context,\n );\n const itemsFormat = schemaObject.items\n ? (resolveSchemaRef(\n schemaObject.items as OpenApiSchemaObject | OpenApiReferenceObject,\n context,\n ).schema.format as string | undefined)\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 parameterObjects.some((parameter) => {\n if (!parameter.schema) {\n return false;\n }\n const { schema: schemaObject } = resolveSchemaRef(\n parameter.schema,\n context,\n );\n const itemsFormat = schemaObject.items\n ? (resolveSchemaRef(\n schemaObject.items as OpenApiSchemaObject | OpenApiReferenceObject,\n context,\n ).schema.format as string | undefined)\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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"}
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];\nconst resolveSchemaRef = (\n schema: OpenApiSchemaObject | OpenApiReferenceObject,\n context: GeneratorOptions['context'],\n) =>\n resolveRef(schema, context) as {\n schema: OpenApiSchemaObject;\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 ] as (OpenApiParameterObject | OpenApiReferenceObject)[];\n const byKey = new Map<\n string,\n OpenApiParameterObject | OpenApiReferenceObject\n >();\n for (const parameter of mergedParameters) {\n const { schema } = resolveRef(parameter, context);\n const parameterObject = schema as OpenApiParameterObject;\n byKey.set(`${parameterObject.in}:${parameterObject.name}`, parameter);\n }\n const parameters = [...byKey.values()];\n const parameterObjects = parameters.map((parameter) => {\n const { schema } = resolveRef(parameter, context);\n return schema as OpenApiParameterObject;\n });\n\n const explodeParameters = parameterObjects.filter((parameterObject) => {\n if (!parameterObject.schema) {\n return false;\n }\n\n const { schema: schemaObject } = resolveSchemaRef(\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((s) => resolveSchemaRef(s, context).schema.type === 'array') ||\n (\n (schemaObject.anyOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined) ?? []\n ).some((s) => resolveSchemaRef(s, context).schema.type === 'array') ||\n (\n (schemaObject.allOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined) ?? []\n ).some((s) => resolveSchemaRef(s, context).schema.type === 'array');\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(\n (parameter) => parameter.name,\n );\n\n const hasExplodedDateParams =\n context.output.override.useDates &&\n explodeParameters.some((parameter) => {\n if (!parameter.schema) {\n return false;\n }\n const { schema: schemaObject } = resolveSchemaRef(\n parameter.schema,\n context,\n );\n const itemsFormat = schemaObject.items\n ? (resolveSchemaRef(\n schemaObject.items as OpenApiSchemaObject | OpenApiReferenceObject,\n context,\n ).schema.format as string | undefined)\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 parameterObjects.some((parameter) => {\n if (!parameter.schema) {\n return false;\n }\n const { schema: schemaObject } = resolveSchemaRef(\n parameter.schema,\n context,\n );\n const itemsFormat = schemaObject.items\n ? (resolveSchemaRef(\n schemaObject.items as OpenApiSchemaObject | OpenApiReferenceObject,\n context,\n ).schema.format as string | undefined)\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() : ' : ''}String(v));\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() : ' : ''}String(value))\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.11.0",
3
+ "version": "8.12.2",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -35,7 +35,7 @@
35
35
  "nuke": "rimraf .turbo dist node_modules"
36
36
  },
37
37
  "dependencies": {
38
- "@orval/core": "8.11.0",
38
+ "@orval/core": "8.12.2",
39
39
  "@scalar/openapi-types": "0.8.0"
40
40
  },
41
41
  "devDependencies": {