@orval/solid-start 8.5.3 → 8.6.1
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/README.md +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +14 -4
package/README.md
CHANGED
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\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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"}
|
|
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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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orval/solid-start",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.6.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.mts",
|
|
7
7
|
"exports": {
|
|
8
|
-
".":
|
|
8
|
+
".": {
|
|
9
|
+
"development": "./src/index.ts",
|
|
10
|
+
"default": "./dist/index.mjs"
|
|
11
|
+
},
|
|
9
12
|
"./package.json": "./package.json"
|
|
10
13
|
},
|
|
11
14
|
"files": [
|
|
@@ -18,6 +21,7 @@
|
|
|
18
21
|
"dev": "tsdown --config-loader unrun --watch src",
|
|
19
22
|
"lint": "eslint .",
|
|
20
23
|
"test": "vitest",
|
|
24
|
+
"typecheck": "tsc --noEmit",
|
|
21
25
|
"clean": "rimraf .turbo dist",
|
|
22
26
|
"nuke": "rimraf .turbo dist node_modules"
|
|
23
27
|
},
|
|
@@ -26,10 +30,16 @@
|
|
|
26
30
|
"@scalar/openapi-types": "0.5.3"
|
|
27
31
|
},
|
|
28
32
|
"devDependencies": {
|
|
29
|
-
"eslint": "
|
|
33
|
+
"eslint": "9.39.2",
|
|
30
34
|
"rimraf": "6.1.2",
|
|
31
35
|
"tsdown": "0.20.3",
|
|
32
36
|
"typescript": "5.9.3",
|
|
33
37
|
"vitest": "4.0.18"
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"exports": {
|
|
41
|
+
".": "./dist/index.mjs",
|
|
42
|
+
"./package.json": "./package.json"
|
|
43
|
+
}
|
|
34
44
|
}
|
|
35
|
-
}
|
|
45
|
+
}
|