@orval/solid-start 8.6.2 → 8.8.0
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 +19 -19
- package/dist/index.mjs.map +1 -1
- package/package.json +13 -4
package/dist/index.mjs
CHANGED
|
@@ -22,6 +22,7 @@ const SOLID_START_DEPENDENCIES = [{
|
|
|
22
22
|
],
|
|
23
23
|
dependency: "@solidjs/router"
|
|
24
24
|
}];
|
|
25
|
+
const resolveSchemaRef = (schema, context) => resolveRef(schema, context);
|
|
25
26
|
const getSolidStartDependencies = () => SOLID_START_DEPENDENCIES;
|
|
26
27
|
const generateSolidStartTitle = (title) => {
|
|
27
28
|
return pascal(sanitize(title));
|
|
@@ -90,34 +91,33 @@ const generateImplementation = ({ headers, queryParams, operationName, response,
|
|
|
90
91
|
const byKey = /* @__PURE__ */ new Map();
|
|
91
92
|
for (const parameter of mergedParameters) {
|
|
92
93
|
const { schema } = resolveRef(parameter, context);
|
|
93
|
-
|
|
94
|
+
const parameterObject = schema;
|
|
95
|
+
byKey.set(`${parameterObject.in}:${parameterObject.name}`, parameter);
|
|
94
96
|
}
|
|
95
97
|
const parameters = [...byKey.values()];
|
|
96
|
-
const
|
|
97
|
-
const { schema
|
|
98
|
+
const parameterObjects = parameters.map((parameter) => {
|
|
99
|
+
const { schema } = resolveRef(parameter, context);
|
|
100
|
+
return schema;
|
|
101
|
+
});
|
|
102
|
+
const explodeParameters = parameterObjects.filter((parameterObject) => {
|
|
98
103
|
if (!parameterObject.schema) return false;
|
|
99
|
-
const { schema: schemaObject } =
|
|
100
|
-
const isArrayLike = schemaObject.type === "array" || (schemaObject.oneOf ?? []).some((s) =>
|
|
104
|
+
const { schema: schemaObject } = resolveSchemaRef(parameterObject.schema, context);
|
|
105
|
+
const isArrayLike = schemaObject.type === "array" || (schemaObject.oneOf ?? []).some((s) => resolveSchemaRef(s, context).schema.type === "array") || (schemaObject.anyOf ?? []).some((s) => resolveSchemaRef(s, context).schema.type === "array") || (schemaObject.allOf ?? []).some((s) => resolveSchemaRef(s, context).schema.type === "array");
|
|
101
106
|
const isExploded = parameterObject.explode === true || parameterObject.explode === void 0 && (parameterObject.style === void 0 || parameterObject.style === "form");
|
|
102
107
|
return parameterObject.in === "query" && isArrayLike && isExploded;
|
|
103
108
|
});
|
|
104
|
-
const explodeParametersNames = explodeParameters.map((parameter) =>
|
|
105
|
-
|
|
106
|
-
return
|
|
107
|
-
|
|
108
|
-
|
|
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;
|
|
109
|
+
const explodeParametersNames = explodeParameters.map((parameter) => parameter.name);
|
|
110
|
+
const hasExplodedDateParams = context.output.override.useDates && explodeParameters.some((parameter) => {
|
|
111
|
+
if (!parameter.schema) return false;
|
|
112
|
+
const { schema: schemaObject } = resolveSchemaRef(parameter.schema, context);
|
|
113
|
+
const itemsFormat = schemaObject.items ? resolveSchemaRef(schemaObject.items, context).schema.format : void 0;
|
|
113
114
|
return schemaObject.format === "date-time" || itemsFormat === "date-time";
|
|
114
115
|
});
|
|
115
116
|
const isExplodeParametersOnly = explodeParameters.length === parameters.length;
|
|
116
|
-
const hasDateParams = context.output.override.useDates &&
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const
|
|
120
|
-
const itemsFormat = schemaObject.items ? resolveRef(schemaObject.items, context).schema.format : void 0;
|
|
117
|
+
const hasDateParams = context.output.override.useDates && parameterObjects.some((parameter) => {
|
|
118
|
+
if (!parameter.schema) return false;
|
|
119
|
+
const { schema: schemaObject } = resolveSchemaRef(parameter.schema, context);
|
|
120
|
+
const itemsFormat = schemaObject.items ? resolveSchemaRef(schemaObject.items, context).schema.format : void 0;
|
|
121
121
|
return schemaObject.format === "date-time" || itemsFormat === "date-time";
|
|
122
122
|
});
|
|
123
123
|
const explodeArrayImplementation = explodeParameters.length > 0 ? `const explodeParameters = ${JSON.stringify(explodeParametersNames)};
|
package/dist/index.mjs.map
CHANGED
|
@@ -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];\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 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 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 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() : ' : ''}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,7 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orval/solid-start",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.8.0",
|
|
4
4
|
"license": "MIT",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/orval-labs/orval.git",
|
|
8
|
+
"directory": "packages/solid-start"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://orval.dev/docs/guides/solid-start",
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/orval-labs/orval/issues"
|
|
13
|
+
},
|
|
5
14
|
"type": "module",
|
|
6
15
|
"types": "./dist/index.d.mts",
|
|
7
16
|
"exports": {
|
|
@@ -26,11 +35,11 @@
|
|
|
26
35
|
"nuke": "rimraf .turbo dist node_modules"
|
|
27
36
|
},
|
|
28
37
|
"dependencies": {
|
|
29
|
-
"@orval/core": "8.
|
|
30
|
-
"@scalar/openapi-types": "0.
|
|
38
|
+
"@orval/core": "8.8.0",
|
|
39
|
+
"@scalar/openapi-types": "0.6.1"
|
|
31
40
|
},
|
|
32
41
|
"devDependencies": {
|
|
33
|
-
"eslint": "
|
|
42
|
+
"eslint": "10.1.0",
|
|
34
43
|
"rimraf": "6.1.2",
|
|
35
44
|
"tsdown": "0.20.3",
|
|
36
45
|
"typescript": "5.9.3",
|