@scalar/oas-utils 0.4.4 → 0.4.6
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/CHANGELOG.md +20 -0
- package/dist/entities/spec/operation.d.ts +10 -10
- package/dist/entities/spec/parameters.d.ts +2 -2
- package/dist/entities/spec/request-examples.d.ts +8 -8
- package/dist/entities/spec/request-examples.d.ts.map +1 -1
- package/dist/entities/spec/request-examples.js +1 -1
- package/dist/entities/spec/request-examples.js.map +2 -2
- package/dist/entities/spec/requests.d.ts +20 -20
- package/dist/helpers/operation-to-har/index.d.ts +2 -0
- package/dist/helpers/operation-to-har/index.d.ts.map +1 -0
- package/dist/helpers/operation-to-har/index.js +5 -0
- package/dist/helpers/operation-to-har/index.js.map +7 -0
- package/dist/helpers/operation-to-har/operation-to-har.d.ts +49 -0
- package/dist/helpers/operation-to-har/operation-to-har.d.ts.map +1 -0
- package/dist/helpers/operation-to-har/operation-to-har.js +52 -0
- package/dist/helpers/operation-to-har/operation-to-har.js.map +7 -0
- package/dist/helpers/operation-to-har/process-body.d.ts +9 -0
- package/dist/helpers/operation-to-har/process-body.d.ts.map +1 -0
- package/dist/helpers/operation-to-har/process-body.js +12 -0
- package/dist/helpers/operation-to-har/process-body.js.map +7 -0
- package/dist/helpers/operation-to-har/process-parameters.d.ts +16 -0
- package/dist/helpers/operation-to-har/process-parameters.d.ts.map +1 -0
- package/dist/helpers/operation-to-har/process-parameters.js +161 -0
- package/dist/helpers/operation-to-har/process-parameters.js.map +7 -0
- package/dist/helpers/operation-to-har/process-security-schemes.d.ts +13 -0
- package/dist/helpers/operation-to-har/process-security-schemes.d.ts.map +1 -0
- package/dist/helpers/operation-to-har/process-security-schemes.js +68 -0
- package/dist/helpers/operation-to-har/process-security-schemes.js.map +7 -0
- package/dist/helpers/operation-to-har/process-server-url.d.ts +6 -0
- package/dist/helpers/operation-to-har/process-server-url.d.ts.map +1 -0
- package/dist/helpers/operation-to-har/process-server-url.js +27 -0
- package/dist/helpers/operation-to-har/process-server-url.js.map +7 -0
- package/dist/spec-getters/get-example-from-schema.d.ts.map +1 -1
- package/dist/spec-getters/get-example-from-schema.js +3 -1
- package/dist/spec-getters/get-example-from-schema.js.map +2 -2
- package/dist/spec-getters/get-parameters-from-operation.d.ts +3 -2
- package/dist/spec-getters/get-parameters-from-operation.d.ts.map +1 -1
- package/dist/spec-getters/get-parameters-from-operation.js +3 -3
- package/dist/spec-getters/get-parameters-from-operation.js.map +2 -2
- package/dist/spec-getters/get-request-body-from-operation.d.ts +1 -1
- package/dist/spec-getters/get-request-body-from-operation.d.ts.map +1 -1
- package/dist/spec-getters/get-request-body-from-operation.js +12 -2
- package/dist/spec-getters/get-request-body-from-operation.js.map +2 -2
- package/dist/transforms/import-spec.d.ts.map +1 -1
- package/dist/transforms/import-spec.js +0 -14
- package/dist/transforms/import-spec.js.map +2 -2
- package/package.json +14 -8
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/spec-getters/get-example-from-schema.ts"],
|
|
4
|
-
"sourcesContent": ["/** Hard limit for rendering circular references */\nconst MAX_LEVELS_DEEP = 5\n/** Sets the max number of properties after the third level to prevent exponential horizontal growth */\nconst MAX_PROPERTIES = 10\n\nconst genericExampleValues: Record<string, string> = {\n // 'date-time': '1970-01-01T00:00:00Z',\n 'date-time': new Date().toISOString(),\n // 'date': '1970-01-01',\n 'date': new Date().toISOString().split('T')[0]!,\n 'email': 'hello@example.com',\n 'hostname': 'example.com',\n // https://tools.ietf.org/html/rfc6531#section-3.3\n 'idn-email': 'jane.doe@example.com',\n // https://tools.ietf.org/html/rfc5890#section-2.3.2.3\n 'idn-hostname': 'example.com',\n 'ipv4': '127.0.0.1',\n 'ipv6': '51d4:7fab:bfbf:b7d7:b2cb:d4b4:3dad:d998',\n 'iri-reference': '/entitiy/1',\n // https://tools.ietf.org/html/rfc3987\n 'iri': 'https://example.com/entity/123',\n 'json-pointer': '/nested/objects',\n 'password': 'super-secret',\n 'regex': '/[a-z]/',\n // https://tools.ietf.org/html/draft-handrews-relative-json-pointer-01\n 'relative-json-pointer': '1/nested/objects',\n // full-time in https://tools.ietf.org/html/rfc3339#section-5.6\n // 'time': '00:00:00Z',\n 'time': new Date().toISOString().split('T')[1]!.split('.')[0]!,\n // either a URI or relative-reference https://tools.ietf.org/html/rfc3986#section-4.1\n 'uri-reference': '../folder',\n 'uri-template': 'https://example.com/{id}',\n 'uri': 'https://example.com',\n 'uuid': '123e4567-e89b-12d3-a456-426614174000',\n 'object-id': '6592008029c8c3e4dc76256c',\n}\n\n/**\n * We can use the `format` to generate some random values.\n */\nfunction guessFromFormat(schema: Record<string, any>, makeUpRandomData: boolean = false, fallback: string = '') {\n if (schema.format === 'binary') {\n return new File([''], 'filename')\n }\n return makeUpRandomData ? (genericExampleValues[schema.format] ?? fallback) : ''\n}\n\n/** Map of all the results */\nconst resultCache = new WeakMap<Record<string, any>, any>()\n\n/** Store result in the cache, and return the result */\nfunction cache(schema: Record<string, any>, result: unknown) {\n // Avoid unnecessary WeakMap operations for primitive values\n if (typeof result !== 'object' || result === null) {\n return result\n }\n\n resultCache.set(schema, result)\n\n return result\n}\n\n/**\n * This function takes an OpenAPI schema and generates an example from it\n */\nexport const getExampleFromSchema = (\n schema: Record<string, any>,\n options?: {\n /**\n * The fallback string for empty string values.\n * @default ''\n */\n emptyString?: string\n /**\n * Whether to use the XML tag names as keys\n * @default false\n */\n xml?: boolean\n /**\n * Whether to show read-only/write-only properties. Otherwise all properties are shown.\n * @default undefined\n */\n mode?: 'read' | 'write'\n /**\n * Dynamic values to add to the example.\n */\n variables?: Record<string, any>\n /**\n * Whether to omit empty and optional properties.\n * @default false\n */\n omitEmptyAndOptionalProperties?: boolean\n },\n level: number = 0,\n parentSchema?: Record<string, any>,\n name?: string,\n): any => {\n // Check if the result is already cached\n if (resultCache.has(schema)) {\n return resultCache.get(schema)\n }\n\n // Check whether it\u2019s a circular reference\n if (level === MAX_LEVELS_DEEP + 1) {\n try {\n // Fails if it contains a circular reference\n JSON.stringify(schema)\n } catch {\n return '[Circular Reference]'\n }\n }\n\n // Sometimes, we just want the structure and no values.\n // But if `emptyString` is set, we do want to see some values.\n const makeUpRandomData = !!options?.emptyString\n\n // If the property is deprecated anyway, we don\u2019t want to show it.\n if (schema.deprecated) {\n return undefined\n }\n\n // Check if the property is read-only/write-only\n if ((options?.mode === 'write' && schema.readOnly) || (options?.mode === 'read' && schema.writeOnly)) {\n return undefined\n }\n\n // Use given variables as values\n if (schema['x-variable']) {\n const value = options?.variables?.[schema['x-variable']]\n\n // Return the value if it\u2019s defined\n if (value !== undefined) {\n // Type-casting\n if (schema.type === 'number' || schema.type === 'integer') {\n return Number.parseInt(value, 10)\n }\n\n return cache(schema, value)\n }\n }\n\n // Use the first example, if there\u2019s an array\n if (Array.isArray(schema.examples) && schema.examples.length > 0) {\n return cache(schema, schema.examples[0])\n }\n\n // Use an example, if there\u2019s one\n if (schema.example !== undefined) {\n return cache(schema, schema.example)\n }\n\n // Use a default value, if there\u2019s one\n if (schema.default !== undefined) {\n return cache(schema, schema.default)\n }\n\n // enum: [ 'available', 'pending', 'sold' ]\n if (Array.isArray(schema.enum) && schema.enum.length > 0) {\n return cache(schema, schema.enum[0])\n }\n\n // Check if the property is required\n const isObjectOrArray =\n schema.type === 'object' ||\n schema.type === 'array' ||\n !!schema.allOf?.at?.(0) ||\n !!schema.anyOf?.at?.(0) ||\n !!schema.oneOf?.at?.(0)\n if (!isObjectOrArray && options?.omitEmptyAndOptionalProperties === true) {\n const isRequired =\n schema.required === true ||\n parentSchema?.required === true ||\n parentSchema?.required?.includes(name ?? schema.name)\n\n if (!isRequired) {\n return undefined\n }\n }\n\n // Object\n if (schema.type === 'object' || schema.properties !== undefined) {\n const response: Record<string, any> = {}\n let propertyCount = 0\n\n // Regular properties\n if (schema.properties !== undefined) {\n for (const propertyName in schema.properties) {\n if (Object.prototype.hasOwnProperty.call(schema.properties, propertyName)) {\n // Only apply property limit for nested levels (level > 0)\n if (level > 3 && propertyCount >= MAX_PROPERTIES) {\n response['...'] = '[Additional Properties Truncated]'\n break\n }\n\n const property = schema.properties[propertyName]\n const propertyXmlTagName = options?.xml ? property.xml?.name : undefined\n\n const value = getExampleFromSchema(property, options, level + 1, schema, propertyName)\n\n if (typeof value !== 'undefined') {\n response[propertyXmlTagName ?? propertyName] = value\n propertyCount++\n }\n }\n }\n }\n\n // Pattern properties (regex)\n if (schema.patternProperties !== undefined) {\n for (const pattern in schema.patternProperties) {\n if (Object.prototype.hasOwnProperty.call(schema.patternProperties, pattern)) {\n const property = schema.patternProperties[pattern]\n\n // Use the regex pattern as an example key\n const exampleKey = pattern\n\n response[exampleKey] = getExampleFromSchema(property, options, level + 1, schema, exampleKey)\n }\n }\n }\n\n // Additional properties\n if (schema.additionalProperties !== undefined) {\n const anyTypeIsValid =\n // true\n schema.additionalProperties === true ||\n // or an empty object {}\n (typeof schema.additionalProperties === 'object' && !Object.keys(schema.additionalProperties).length)\n\n if (anyTypeIsValid) {\n response['ANY_ADDITIONAL_PROPERTY'] = 'anything'\n } else if (schema.additionalProperties !== false) {\n response['ANY_ADDITIONAL_PROPERTY'] = getExampleFromSchema(schema.additionalProperties, options, level + 1)\n }\n }\n\n if (schema.anyOf !== undefined) {\n Object.assign(response, getExampleFromSchema(schema.anyOf[0], options, level + 1))\n } else if (schema.oneOf !== undefined) {\n Object.assign(response, getExampleFromSchema(schema.oneOf[0], options, level + 1))\n } else if (schema.allOf !== undefined) {\n Object.assign(\n response,\n ...schema.allOf\n .map((item: Record<string, any>) => getExampleFromSchema(item, options, level + 1, schema))\n .filter((item: any) => item !== undefined),\n )\n }\n\n return cache(schema, response)\n }\n\n // Array\n if (schema.type === 'array' || schema.items !== undefined) {\n const itemsXmlTagName = schema?.items?.xml?.name\n const wrapItems = !!(options?.xml && schema.xml?.wrapped && itemsXmlTagName)\n\n if (schema.example !== undefined) {\n return cache(schema, wrapItems ? { [itemsXmlTagName]: schema.example } : schema.example)\n }\n\n // Check whether the array has a anyOf, oneOf, or allOf rule\n if (schema.items) {\n // First handle allOf separately since it needs special handling\n if (schema.items.allOf) {\n // If the first item is an object type, merge all schemas\n if (schema.items.allOf[0].type === 'object') {\n const mergedExample = getExampleFromSchema(\n { type: 'object', allOf: schema.items.allOf },\n options,\n level + 1,\n schema,\n )\n\n return cache(schema, wrapItems ? [{ [itemsXmlTagName]: mergedExample }] : [mergedExample])\n }\n // For non-objects (like strings), collect all examples\n const examples = schema.items.allOf\n .map((item: Record<string, any>) => getExampleFromSchema(item, options, level + 1, schema))\n .filter((item: any) => item !== undefined)\n\n return cache(schema, wrapItems ? examples.map((example: any) => ({ [itemsXmlTagName]: example })) : examples)\n }\n\n // Handle other rules (anyOf, oneOf)\n const rules = ['anyOf', 'oneOf']\n for (const rule of rules) {\n if (!schema.items[rule]) {\n continue\n }\n\n const schemas = schema.items[rule].slice(0, 1)\n const exampleFromRule = schemas\n .map((item: Record<string, any>) => getExampleFromSchema(item, options, level + 1, schema))\n .filter((item: any) => item !== undefined)\n\n return cache(schema, wrapItems ? [{ [itemsXmlTagName]: exampleFromRule }] : exampleFromRule)\n }\n }\n\n if (schema.items?.type) {\n const exampleFromSchema = getExampleFromSchema(schema.items, options, level + 1)\n\n return wrapItems ? [{ [itemsXmlTagName]: exampleFromSchema }] : [exampleFromSchema]\n }\n\n return []\n }\n\n const exampleValues: Record<any, any> = {\n string: guessFromFormat(schema, makeUpRandomData, options?.emptyString),\n boolean: true,\n integer: schema.min ?? 1,\n number: schema.min ?? 1,\n array: [],\n }\n\n if (schema.type !== undefined && exampleValues[schema.type] !== undefined) {\n return cache(schema, exampleValues[schema.type])\n }\n\n const discriminateSchema = schema.oneOf || schema.anyOf\n // Check if property has the `oneOf` | `anyOf` key\n if (Array.isArray(discriminateSchema) && discriminateSchema.length > 0) {\n // Get the first item from the `oneOf` | `anyOf` array\n const firstOneOfItem = discriminateSchema[0]\n\n // Return an example for the first item\n return getExampleFromSchema(firstOneOfItem, options, level + 1)\n }\n\n // Check if schema has the `allOf` key\n if (Array.isArray(schema.allOf)) {\n let example: any = null\n\n // Loop through all `allOf` schemas\n schema.allOf.forEach((allOfItem: Record<string, any>) => {\n // Return an example from the schema\n const newExample = getExampleFromSchema(allOfItem, options, level + 1)\n\n // Merge or overwrite the example\n example =\n typeof newExample === 'object' && typeof example === 'object'\n ? {\n ...(example ?? {}),\n ...newExample,\n }\n : Array.isArray(newExample) && Array.isArray(example)\n ? [...(example ?? {}), ...newExample]\n : newExample\n })\n\n return cache(schema, example)\n }\n\n // Check if schema is a union type\n if (Array.isArray(schema.type)) {\n // Return null if the type is nullable\n if (schema.type.includes('null')) {\n return null\n }\n // Return an example for the first type in the union\n const exampleValue = exampleValues[schema.type[0]]\n if (exampleValue !== undefined) {\n return cache(schema, exampleValue)\n }\n }\n\n // Warn if the type is unknown \u2026\n // console.warn(`[getExampleFromSchema] Unknown property type \"${schema.type}\".`)\n\n // \u2026 and just return null for now.\n return null\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/** Hard limit for rendering circular references */\nconst MAX_LEVELS_DEEP = 5\n/** Sets the max number of properties after the third level to prevent exponential horizontal growth */\nconst MAX_PROPERTIES = 10\n\nconst genericExampleValues: Record<string, string> = {\n // 'date-time': '1970-01-01T00:00:00Z',\n 'date-time': new Date().toISOString(),\n // 'date': '1970-01-01',\n 'date': new Date().toISOString().split('T')[0]!,\n 'email': 'hello@example.com',\n 'hostname': 'example.com',\n // https://tools.ietf.org/html/rfc6531#section-3.3\n 'idn-email': 'jane.doe@example.com',\n // https://tools.ietf.org/html/rfc5890#section-2.3.2.3\n 'idn-hostname': 'example.com',\n 'ipv4': '127.0.0.1',\n 'ipv6': '51d4:7fab:bfbf:b7d7:b2cb:d4b4:3dad:d998',\n 'iri-reference': '/entitiy/1',\n // https://tools.ietf.org/html/rfc3987\n 'iri': 'https://example.com/entity/123',\n 'json-pointer': '/nested/objects',\n 'password': 'super-secret',\n 'regex': '/[a-z]/',\n // https://tools.ietf.org/html/draft-handrews-relative-json-pointer-01\n 'relative-json-pointer': '1/nested/objects',\n // full-time in https://tools.ietf.org/html/rfc3339#section-5.6\n // 'time': '00:00:00Z',\n 'time': new Date().toISOString().split('T')[1]!.split('.')[0]!,\n // either a URI or relative-reference https://tools.ietf.org/html/rfc3986#section-4.1\n 'uri-reference': '../folder',\n 'uri-template': 'https://example.com/{id}',\n 'uri': 'https://example.com',\n 'uuid': '123e4567-e89b-12d3-a456-426614174000',\n 'object-id': '6592008029c8c3e4dc76256c',\n}\n\n/**\n * We can use the `format` to generate some random values.\n */\nfunction guessFromFormat(schema: Record<string, any>, makeUpRandomData: boolean = false, fallback: string = '') {\n if (schema.format === 'binary') {\n return new File([''], 'filename')\n }\n return makeUpRandomData ? (genericExampleValues[schema.format] ?? fallback) : ''\n}\n\n/** Map of all the results */\nconst resultCache = new WeakMap<Record<string, any>, any>()\n\n/** Store result in the cache, and return the result */\nfunction cache(schema: Record<string, any>, result: unknown) {\n // Avoid unnecessary WeakMap operations for primitive values\n if (typeof result !== 'object' || result === null) {\n return result\n }\n\n resultCache.set(schema, result)\n\n return result\n}\n\n/**\n * This function takes an OpenAPI schema and generates an example from it\n */\nexport const getExampleFromSchema = (\n schema: Record<string, any>,\n options?: {\n /**\n * The fallback string for empty string values.\n * @default ''\n */\n emptyString?: string\n /**\n * Whether to use the XML tag names as keys\n * @default false\n */\n xml?: boolean\n /**\n * Whether to show read-only/write-only properties. Otherwise all properties are shown.\n * @default undefined\n */\n mode?: 'read' | 'write'\n /**\n * Dynamic values to add to the example.\n */\n variables?: Record<string, any>\n /**\n * Whether to omit empty and optional properties.\n * @default false\n */\n omitEmptyAndOptionalProperties?: boolean\n },\n level: number = 0,\n parentSchema?: Record<string, any>,\n name?: string,\n): any => {\n // Check if the result is already cached\n if (resultCache.has(schema)) {\n return resultCache.get(schema)\n }\n\n // Check whether it\u2019s a circular reference\n if (level === MAX_LEVELS_DEEP + 1) {\n try {\n // Fails if it contains a circular reference\n JSON.stringify(schema)\n } catch {\n return '[Circular Reference]'\n }\n }\n\n // Sometimes, we just want the structure and no values.\n // But if `emptyString` is set, we do want to see some values.\n const makeUpRandomData = !!options?.emptyString\n\n // If the property is deprecated anyway, we don\u2019t want to show it.\n if (schema.deprecated) {\n return undefined\n }\n\n // Check if the property is read-only/write-only\n if ((options?.mode === 'write' && schema.readOnly) || (options?.mode === 'read' && schema.writeOnly)) {\n return undefined\n }\n\n // Use given variables as values\n if (schema['x-variable']) {\n const value = options?.variables?.[schema['x-variable']]\n\n // Return the value if it\u2019s defined\n if (value !== undefined) {\n // Type-casting\n if (schema.type === 'number' || schema.type === 'integer') {\n return Number.parseInt(value, 10)\n }\n\n return cache(schema, value)\n }\n }\n\n // Use the first example, if there\u2019s an array\n if (Array.isArray(schema.examples) && schema.examples.length > 0) {\n return cache(schema, schema.examples[0])\n }\n\n // Use an example, if there\u2019s one\n if (schema.example !== undefined) {\n return cache(schema, schema.example)\n }\n\n // Use a default value, if there\u2019s one\n if (schema.default !== undefined) {\n return cache(schema, schema.default)\n }\n\n // enum: [ 'available', 'pending', 'sold' ]\n if (Array.isArray(schema.enum) && schema.enum.length > 0) {\n return cache(schema, schema.enum[0])\n }\n\n // Check if the property is required\n const isObjectOrArray =\n schema.type === 'object' ||\n schema.type === 'array' ||\n !!schema.allOf?.at?.(0) ||\n !!schema.anyOf?.at?.(0) ||\n !!schema.oneOf?.at?.(0)\n if (!isObjectOrArray && options?.omitEmptyAndOptionalProperties === true) {\n const isRequired =\n schema.required === true ||\n parentSchema?.required === true ||\n parentSchema?.required?.includes(name ?? schema.name)\n\n if (!isRequired) {\n return undefined\n }\n }\n\n // Object\n if (schema.type === 'object' || schema.properties !== undefined) {\n const response: Record<string, any> = {}\n let propertyCount = 0\n\n // Regular properties\n if (schema.properties !== undefined) {\n for (const propertyName in schema.properties) {\n if (Object.prototype.hasOwnProperty.call(schema.properties, propertyName)) {\n // Only apply property limit for nested levels (level > 0)\n if (level > 3 && propertyCount >= MAX_PROPERTIES) {\n response['...'] = '[Additional Properties Truncated]'\n break\n }\n\n const property = schema.properties[propertyName]\n const propertyXmlTagName = options?.xml ? property.xml?.name : undefined\n\n const value = getExampleFromSchema(property, options, level + 1, schema, propertyName)\n\n if (typeof value !== 'undefined') {\n response[propertyXmlTagName ?? propertyName] = value\n propertyCount++\n }\n }\n }\n }\n\n // Pattern properties (regex)\n if (schema.patternProperties !== undefined) {\n for (const pattern in schema.patternProperties) {\n if (Object.prototype.hasOwnProperty.call(schema.patternProperties, pattern)) {\n const property = schema.patternProperties[pattern]\n\n // Use the regex pattern as an example key\n const exampleKey = pattern\n\n response[exampleKey] = getExampleFromSchema(property, options, level + 1, schema, exampleKey)\n }\n }\n }\n\n // Additional properties\n if (schema.additionalProperties !== undefined) {\n const anyTypeIsValid =\n // true\n schema.additionalProperties === true ||\n // or an empty object {}\n (typeof schema.additionalProperties === 'object' && !Object.keys(schema.additionalProperties).length)\n\n if (anyTypeIsValid) {\n response['ANY_ADDITIONAL_PROPERTY'] = 'anything'\n } else if (schema.additionalProperties !== false) {\n response['ANY_ADDITIONAL_PROPERTY'] = getExampleFromSchema(schema.additionalProperties, options, level + 1)\n }\n }\n\n if (schema.anyOf !== undefined) {\n Object.assign(response, getExampleFromSchema(schema.anyOf[0], options, level + 1))\n } else if (schema.oneOf !== undefined) {\n Object.assign(response, getExampleFromSchema(schema.oneOf[0], options, level + 1))\n } else if (schema.allOf !== undefined) {\n Object.assign(\n response,\n ...schema.allOf\n .map((item: Record<string, any>) => getExampleFromSchema(item, options, level + 1, schema))\n .filter((item: any) => item !== undefined),\n )\n }\n\n return cache(schema, response)\n }\n\n // Array\n if (schema.type === 'array' || schema.items !== undefined) {\n const itemsXmlTagName = schema?.items?.xml?.name\n const wrapItems = !!(options?.xml && schema.xml?.wrapped && itemsXmlTagName)\n\n if (schema.example !== undefined) {\n return cache(schema, wrapItems ? { [itemsXmlTagName]: schema.example } : schema.example)\n }\n\n // Check whether the array has a anyOf, oneOf, or allOf rule\n if (schema.items) {\n // First handle allOf separately since it needs special handling\n if (schema.items.allOf) {\n // If the first item is an object type, merge all schemas\n if (schema.items.allOf[0].type === 'object') {\n const mergedExample = getExampleFromSchema(\n { type: 'object', allOf: schema.items.allOf },\n options,\n level + 1,\n schema,\n )\n\n return cache(schema, wrapItems ? [{ [itemsXmlTagName]: mergedExample }] : [mergedExample])\n }\n // For non-objects (like strings), collect all examples\n const examples = schema.items.allOf\n .map((item: Record<string, any>) => getExampleFromSchema(item, options, level + 1, schema))\n .filter((item: any) => item !== undefined)\n\n return cache(schema, wrapItems ? examples.map((example: any) => ({ [itemsXmlTagName]: example })) : examples)\n }\n\n // Handle other rules (anyOf, oneOf)\n const rules = ['anyOf', 'oneOf']\n for (const rule of rules) {\n if (!schema.items[rule]) {\n continue\n }\n\n const schemas = schema.items[rule].slice(0, 1)\n const exampleFromRule = schemas\n .map((item: Record<string, any>) => getExampleFromSchema(item, options, level + 1, schema))\n .filter((item: any) => item !== undefined)\n\n return cache(schema, wrapItems ? [{ [itemsXmlTagName]: exampleFromRule }] : exampleFromRule)\n }\n }\n\n // if it has type: 'object', or properties, it\u2019s an object\n const isObject = schema.items?.type === 'object' || schema.items?.properties !== undefined\n // if it has type: 'array', or items, it\u2019s an array\n const isArray = schema.items?.type === 'array' || schema.items?.items !== undefined\n\n if (schema.items?.type || isObject || isArray) {\n const exampleFromSchema = getExampleFromSchema(schema.items, options, level + 1)\n\n return wrapItems ? [{ [itemsXmlTagName]: exampleFromSchema }] : [exampleFromSchema]\n }\n\n return []\n }\n\n const exampleValues: Record<any, any> = {\n string: guessFromFormat(schema, makeUpRandomData, options?.emptyString),\n boolean: true,\n integer: schema.min ?? 1,\n number: schema.min ?? 1,\n array: [],\n }\n\n if (schema.type !== undefined && exampleValues[schema.type] !== undefined) {\n return cache(schema, exampleValues[schema.type])\n }\n\n const discriminateSchema = schema.oneOf || schema.anyOf\n // Check if property has the `oneOf` | `anyOf` key\n if (Array.isArray(discriminateSchema) && discriminateSchema.length > 0) {\n // Get the first item from the `oneOf` | `anyOf` array\n const firstOneOfItem = discriminateSchema[0]\n\n // Return an example for the first item\n return getExampleFromSchema(firstOneOfItem, options, level + 1)\n }\n\n // Check if schema has the `allOf` key\n if (Array.isArray(schema.allOf)) {\n let example: any = null\n\n // Loop through all `allOf` schemas\n schema.allOf.forEach((allOfItem: Record<string, any>) => {\n // Return an example from the schema\n const newExample = getExampleFromSchema(allOfItem, options, level + 1)\n\n // Merge or overwrite the example\n example =\n typeof newExample === 'object' && typeof example === 'object'\n ? {\n ...(example ?? {}),\n ...newExample,\n }\n : Array.isArray(newExample) && Array.isArray(example)\n ? [...(example ?? {}), ...newExample]\n : newExample\n })\n\n return cache(schema, example)\n }\n\n // Check if schema is a union type\n if (Array.isArray(schema.type)) {\n // Return null if the type is nullable\n if (schema.type.includes('null')) {\n return null\n }\n // Return an example for the first type in the union\n const exampleValue = exampleValues[schema.type[0]]\n if (exampleValue !== undefined) {\n return cache(schema, exampleValue)\n }\n }\n\n // Warn if the type is unknown \u2026\n // console.warn(`[getExampleFromSchema] Unknown property type \"${schema.type}\".`)\n\n // \u2026 and just return null for now.\n return null\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { BaseParameter
|
|
1
|
+
import type { BaseParameter } from '@scalar/types/legacy';
|
|
2
|
+
import type { OpenAPIV3_1 } from '@scalar/openapi-types';
|
|
2
3
|
/**
|
|
3
4
|
* Get the query parameters from an operation.
|
|
4
5
|
*
|
|
@@ -7,5 +8,5 @@ import type { BaseParameter, TransformedOperation } from '@scalar/types/legacy';
|
|
|
7
8
|
* - OpenAPI 3.x: Possible values are “query”, “header”, “path” or “cookie”.
|
|
8
9
|
* - Swagger 2.0: Possible values are "query", "header", "path", "formData" or "body".
|
|
9
10
|
*/
|
|
10
|
-
export declare function getParametersFromOperation(
|
|
11
|
+
export declare function getParametersFromOperation(operationParameters: OpenAPIV3_1.ParameterObject[] | undefined, pathParameters: OpenAPIV3_1.ParameterObject[] | undefined, where: 'query' | 'header' | 'path' | 'cookie' | 'formData' | 'body', requiredOnly?: boolean): BaseParameter[];
|
|
11
12
|
//# sourceMappingURL=get-parameters-from-operation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-parameters-from-operation.d.ts","sourceRoot":"","sources":["../../src/spec-getters/get-parameters-from-operation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"get-parameters-from-operation.d.ts","sourceRoot":"","sources":["../../src/spec-getters/get-parameters-from-operation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAIxD;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,mBAAmB,EAAE,WAAW,CAAC,eAAe,EAAE,YAAK,EACvD,cAAc,EAAE,WAAW,CAAC,eAAe,EAAE,YAAK,EAClD,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,EACnE,YAAY,GAAE,OAAc,GAC3B,aAAa,EAAE,CAiCjB"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { getExampleFromSchema } from "./get-example-from-schema.js";
|
|
2
|
-
function getParametersFromOperation(
|
|
3
|
-
const parameters = [...
|
|
2
|
+
function getParametersFromOperation(operationParameters = [], pathParameters = [], where, requiredOnly = true) {
|
|
3
|
+
const parameters = [...pathParameters || [], ...operationParameters || []];
|
|
4
4
|
const params = parameters.filter((parameter) => parameter.in === where).filter((parameter) => requiredOnly && parameter.required || !requiredOnly).map((parameter) => ({
|
|
5
|
-
name: parameter.name,
|
|
5
|
+
name: parameter.name ?? "Unknown Parameter",
|
|
6
6
|
description: parameter.description ?? null,
|
|
7
7
|
value: parameter.example ? parameter.example : parameter.schema ? getExampleFromSchema(parameter.schema, { mode: "write" }) : "",
|
|
8
8
|
required: parameter.required ?? false,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/spec-getters/get-parameters-from-operation.ts"],
|
|
4
|
-
"sourcesContent": ["import type { BaseParameter
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import type { BaseParameter } from '@scalar/types/legacy'\n\nimport type { OpenAPIV3_1 } from '@scalar/openapi-types'\n\nimport { getExampleFromSchema } from './get-example-from-schema'\n\n/**\n * Get the query parameters from an operation.\n *\n * Example: [ { name: 'foobar', value: '' } ]\n *\n * - OpenAPI 3.x: Possible values are \u201Cquery\u201D, \u201Cheader\u201D, \u201Cpath\u201D or \u201Ccookie\u201D.\n * - Swagger 2.0: Possible values are \"query\", \"header\", \"path\", \"formData\" or \"body\".\n */\nexport function getParametersFromOperation(\n operationParameters: OpenAPIV3_1.ParameterObject[] = [],\n pathParameters: OpenAPIV3_1.ParameterObject[] = [],\n where: 'query' | 'header' | 'path' | 'cookie' | 'formData' | 'body',\n requiredOnly: boolean = true,\n): BaseParameter[] {\n const parameters = [...(pathParameters || []), ...(operationParameters || [])]\n\n const params = parameters\n // query, path, header, cookie?\n .filter((parameter) => parameter.in === where)\n // don\u2019t add optional parameters\n .filter((parameter) => (requiredOnly && parameter.required) || !requiredOnly)\n // transform them\n .map((parameter) => ({\n name: parameter.name ?? 'Unknown Parameter',\n description: parameter.description ?? null,\n value: parameter.example\n ? parameter.example\n : parameter.schema\n ? getExampleFromSchema(parameter.schema, { mode: 'write' })\n : '',\n required: parameter.required ?? false,\n enabled: parameter.required ?? false,\n }))\n\n return params.sort((a, b) => {\n // Move a up if a is required and b is not\n if (a.required && !b.required) {\n return -1\n }\n // Move b up if b is required and a is not\n if (!a.required && b.required) {\n return 1\n }\n // Keep original order if both have the same required status\n return 0\n })\n}\n"],
|
|
5
|
+
"mappings": "AAIA,SAAS,4BAA4B;AAU9B,SAAS,2BACd,sBAAqD,CAAC,GACtD,iBAAgD,CAAC,GACjD,OACA,eAAwB,MACP;AACjB,QAAM,aAAa,CAAC,GAAI,kBAAkB,CAAC,GAAI,GAAI,uBAAuB,CAAC,CAAE;AAE7E,QAAM,SAAS,WAEZ,OAAO,CAAC,cAAc,UAAU,OAAO,KAAK,EAE5C,OAAO,CAAC,cAAe,gBAAgB,UAAU,YAAa,CAAC,YAAY,EAE3E,IAAI,CAAC,eAAe;AAAA,IACnB,MAAM,UAAU,QAAQ;AAAA,IACxB,aAAa,UAAU,eAAe;AAAA,IACtC,OAAO,UAAU,UACb,UAAU,UACV,UAAU,SACR,qBAAqB,UAAU,QAAQ,EAAE,MAAM,QAAQ,CAAC,IACxD;AAAA,IACN,UAAU,UAAU,YAAY;AAAA,IAChC,SAAS,UAAU,YAAY;AAAA,EACjC,EAAE;AAEJ,SAAO,OAAO,KAAK,CAAC,GAAG,MAAM;AAE3B,QAAI,EAAE,YAAY,CAAC,EAAE,UAAU;AAC7B,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,EAAE,YAAY,EAAE,UAAU;AAC7B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,CAAC;AACH;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -2,7 +2,7 @@ import type { ContentType, TransformedOperation } from '@scalar/types/legacy';
|
|
|
2
2
|
/**
|
|
3
3
|
* Get the request body from the operation.
|
|
4
4
|
*/
|
|
5
|
-
export declare function getRequestBodyFromOperation(operation:
|
|
5
|
+
export declare function getRequestBodyFromOperation(operation: Pick<TransformedOperation, 'pathParameters' | 'information'>, selectedExampleKey?: string | number, omitEmptyAndOptionalProperties?: boolean): {
|
|
6
6
|
mimeType: ContentType;
|
|
7
7
|
text?: string | undefined;
|
|
8
8
|
params?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-request-body-from-operation.d.ts","sourceRoot":"","sources":["../../src/spec-getters/get-request-body-from-operation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AA8C7E;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,IAAI,CAAC,oBAAoB,EAAE,
|
|
1
|
+
{"version":3,"file":"get-request-body-from-operation.d.ts","sourceRoot":"","sources":["../../src/spec-getters/get-request-body-from-operation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AA8C7E;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,IAAI,CAAC,oBAAoB,EAAE,gBAAgB,GAAG,aAAa,CAAC,EACvE,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,EACpC,8BAA8B,CAAC,EAAE,OAAO,GACvC;IACD,QAAQ,EAAE,WAAW,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KACtB,EAAE,CAAA;CACJ,GAAG,IAAI,CAyKP"}
|
|
@@ -36,14 +36,24 @@ function getRequestBodyFromOperation(operation, selectedExampleKey, omitEmptyAnd
|
|
|
36
36
|
text: prettyPrintJson(selectedExample?.value)
|
|
37
37
|
};
|
|
38
38
|
}
|
|
39
|
-
const bodyParameters = getParametersFromOperation(
|
|
39
|
+
const bodyParameters = getParametersFromOperation(
|
|
40
|
+
operation.information?.parameters ?? [],
|
|
41
|
+
operation.pathParameters ?? [],
|
|
42
|
+
"body",
|
|
43
|
+
false
|
|
44
|
+
);
|
|
40
45
|
if (bodyParameters.length > 0) {
|
|
41
46
|
return {
|
|
42
47
|
mimeType: "application/json",
|
|
43
48
|
text: prettyPrintJson(bodyParameters[0]?.value ?? "")
|
|
44
49
|
};
|
|
45
50
|
}
|
|
46
|
-
const formDataParameters = getParametersFromOperation(
|
|
51
|
+
const formDataParameters = getParametersFromOperation(
|
|
52
|
+
operation.information?.parameters ?? [],
|
|
53
|
+
operation.pathParameters ?? [],
|
|
54
|
+
"formData",
|
|
55
|
+
false
|
|
56
|
+
);
|
|
47
57
|
if (formDataParameters.length > 0) {
|
|
48
58
|
return {
|
|
49
59
|
mimeType: "application/x-www-form-urlencoded",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/spec-getters/get-request-body-from-operation.ts"],
|
|
4
|
-
"sourcesContent": ["import { json2xml } from '@scalar/helpers/file/json2xml'\nimport type { ContentType, TransformedOperation } from '@scalar/types/legacy'\n\nimport { normalizeMimeTypeObject } from '@/helpers/normalize-mime-type-object'\nimport { prettyPrintJson } from '@/helpers/pretty-print-json'\nimport { getExampleFromSchema } from './get-example-from-schema'\nimport { getParametersFromOperation } from './get-parameters-from-operation'\n\ntype AnyObject = Record<string, any>\n\n/**\n * Transform the object into a nested array of objects\n * that represent the key-value pairs of the object.\n */\nfunction getParamsFromObject(\n obj: AnyObject,\n nested = false,\n field?: string,\n): {\n name: string\n value: any\n}[] {\n return Object.entries(obj).flatMap(([key, value]) => {\n const name = field ?? key\n\n if (Array.isArray(value) && !nested) {\n return getParamsFromObject(value, true, key)\n }\n\n if (typeof value === 'object' && !(value instanceof File) && value !== null) {\n // Nested object inside formData field: no way to represent it, so just serialize to JSON string\n value = JSON.stringify(value)\n }\n\n return [{ name, value }]\n })\n}\n// Define preferred standard mime types (order indicates preference)\nconst standardMimeTypes: ContentType[] = [\n 'application/json',\n 'application/octet-stream',\n 'application/x-www-form-urlencoded',\n 'application/xml',\n 'multipart/form-data',\n 'text/plain',\n]\n\n/**\n * Get the request body from the operation.\n */\nexport function getRequestBodyFromOperation(\n operation:
|
|
5
|
-
"mappings": "AAAA,SAAS,gBAAgB;AAGzB,SAAS,+BAA+B;AACxC,SAAS,uBAAuB;AAChC,SAAS,4BAA4B;AACrC,SAAS,kCAAkC;AAQ3C,SAAS,oBACP,KACA,SAAS,OACT,OAIE;AACF,SAAO,OAAO,QAAQ,GAAG,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACnD,UAAM,OAAO,SAAS;AAEtB,QAAI,MAAM,QAAQ,KAAK,KAAK,CAAC,QAAQ;AACnC,aAAO,oBAAoB,OAAO,MAAM,GAAG;AAAA,IAC7C;AAEA,QAAI,OAAO,UAAU,YAAY,EAAE,iBAAiB,SAAS,UAAU,MAAM;AAE3E,cAAQ,KAAK,UAAU,KAAK;AAAA,IAC9B;AAEA,WAAO,CAAC,EAAE,MAAM,MAAM,CAAC;AAAA,EACzB,CAAC;AACH;AAEA,MAAM,oBAAmC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,SAAS,4BACd,WACA,oBACA,gCAQO;AACP,QAAM,kBAAkB,UAAU,aAAa,aAAa;AAC5D,QAAM,UAAU,wBAAwB,eAAe;AAGvD,QAAM,WACJ,kBAAkB,KAAK,CAAC,oBAAoB,CAAC,CAAC,UAAU,eAAe,CAAC,MACtE,OAAO,KAAK,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK;AAGrC,QAAM,aAAa,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,OAAO;AAGzE,QAAM,WAAW,UAAU,QAAQ,GAAG,YAAY,UAAU,kBAAkB,GAAG;AAGjF,QAAM,kBAAkB,WAAW,sBAAsB,OAAO,KAAK,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE;AAE7F,MAAI,iBAAiB;AACnB,WAAO;AAAA,MACL;AAAA,MACA,MAAM,gBAAgB,iBAAiB,KAAK;AAAA,IAC9C;AAAA,EACF;AAUA,QAAM,iBAAiB,
|
|
4
|
+
"sourcesContent": ["import { json2xml } from '@scalar/helpers/file/json2xml'\nimport type { ContentType, TransformedOperation } from '@scalar/types/legacy'\n\nimport { normalizeMimeTypeObject } from '@/helpers/normalize-mime-type-object'\nimport { prettyPrintJson } from '@/helpers/pretty-print-json'\nimport { getExampleFromSchema } from './get-example-from-schema'\nimport { getParametersFromOperation } from './get-parameters-from-operation'\n\ntype AnyObject = Record<string, any>\n\n/**\n * Transform the object into a nested array of objects\n * that represent the key-value pairs of the object.\n */\nfunction getParamsFromObject(\n obj: AnyObject,\n nested = false,\n field?: string,\n): {\n name: string\n value: any\n}[] {\n return Object.entries(obj).flatMap(([key, value]) => {\n const name = field ?? key\n\n if (Array.isArray(value) && !nested) {\n return getParamsFromObject(value, true, key)\n }\n\n if (typeof value === 'object' && !(value instanceof File) && value !== null) {\n // Nested object inside formData field: no way to represent it, so just serialize to JSON string\n value = JSON.stringify(value)\n }\n\n return [{ name, value }]\n })\n}\n// Define preferred standard mime types (order indicates preference)\nconst standardMimeTypes: ContentType[] = [\n 'application/json',\n 'application/octet-stream',\n 'application/x-www-form-urlencoded',\n 'application/xml',\n 'multipart/form-data',\n 'text/plain',\n]\n\n/**\n * Get the request body from the operation.\n */\nexport function getRequestBodyFromOperation(\n operation: Pick<TransformedOperation, 'pathParameters' | 'information'>,\n selectedExampleKey?: string | number,\n omitEmptyAndOptionalProperties?: boolean,\n): {\n mimeType: ContentType\n text?: string | undefined\n params?: {\n name: string\n value?: string | File\n }[]\n} | null {\n const originalContent = operation.information?.requestBody?.content\n const content = normalizeMimeTypeObject(originalContent)\n\n // First try to find a standard mime type\n const mimeType =\n standardMimeTypes.find((currentMimeType) => !!content?.[currentMimeType]) ??\n ((Object.keys(content ?? {})[0] || 'application/json') as ContentType)\n\n // Handle JSON-like content types (e.g., application/vnd.github+json)\n const isJsonLike = mimeType.includes('json') || mimeType.endsWith('+json')\n\n /** Examples */\n const examples = content?.[mimeType]?.examples ?? content?.['application/json']?.examples\n\n // Let\u2019s use the first example\n const selectedExample = examples?.[selectedExampleKey ?? Object.keys(examples ?? {})[0] ?? '']\n\n if (selectedExample) {\n return {\n mimeType,\n text: prettyPrintJson(selectedExample?.value),\n }\n }\n\n /**\n * Body Parameters (Swagger 2.0)\n *\n * \u201DThe payload that's appended to the HTTP request. Since there can only be one payload, there can only\n * be one body parameter. The name of the body parameter has no effect on the parameter itself and is used\n * for documentation purposes only. Since Form parameters are also in the payload, body and form\n * parameters cannot exist together for the same operation.\u201D\n */\n const bodyParameters = getParametersFromOperation(\n operation.information?.parameters ?? [],\n operation.pathParameters ?? [],\n 'body',\n false,\n )\n\n if (bodyParameters.length > 0) {\n return {\n mimeType: 'application/json',\n text: prettyPrintJson(bodyParameters[0]?.value ?? ''),\n }\n }\n\n /**\n * FormData Parameters (Swagger 2.0)\n *\n * \u201DForm - Used to describe the payload of an HTTP request when either application/x-www-form-urlencoded,\n * multipart/form-data or both are used as the content type of the request (in Swagger's definition, the\n * consumes property of an operation). This is the only parameter type that can be used to send files,\n * thus supporting the file type. Since form parameters are sent in the payload, they cannot be declared\n * together with a body parameter for the same operation. Form parameters have a different format based on\n * the content-type used (for further details, consult http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4):\n * - application/x-www-form-urlencoded - Similar to the format of Query parameters but as a payload.\n * For example, foo=1&bar=swagger - both foo and bar are form parameters. This is normally used for simple\n * parameters that are being transferred.\n * - multipart/form-data - each parameter takes a section in the payload with an internal header.\n * For example, for the header Content-Disposition: form-data; name=\"submit-name\" the name of the parameter is\n * submit-name. This type of form parameters is more commonly used for file transfers.\u201D\n */\n\n const formDataParameters = getParametersFromOperation(\n operation.information?.parameters ?? [],\n operation.pathParameters ?? [],\n 'formData',\n false,\n )\n\n if (formDataParameters.length > 0) {\n return {\n mimeType: 'application/x-www-form-urlencoded',\n params: formDataParameters.map((parameter) => ({\n name: parameter.name,\n /**\n * TODO: This value MUST be a string\n * Figure out why this is not always a string\n *\n * JSON.stringify is a TEMPORARY fix\n */\n value: typeof parameter.value === 'string' ? parameter.value : JSON.stringify(parameter.value),\n })),\n }\n }\n\n // If no mime type is supported, exit early\n if (!mimeType) {\n return null\n }\n\n // Get the request body object for the mime type\n const requestBodyObject = content?.[mimeType]\n\n // Get example from operation\n const example = requestBodyObject?.example ? requestBodyObject?.example : undefined\n\n // Update the JSON handling section\n if (isJsonLike) {\n const exampleFromSchema = requestBodyObject?.schema\n ? getExampleFromSchema(requestBodyObject?.schema, {\n mode: 'write',\n omitEmptyAndOptionalProperties: omitEmptyAndOptionalProperties ?? false,\n })\n : null\n\n const body = example ?? exampleFromSchema\n\n return {\n mimeType,\n text: body ? (typeof body === 'string' ? body : JSON.stringify(body, null, 2)) : undefined,\n }\n }\n\n // XML\n if (mimeType === 'application/xml') {\n const exampleFromSchema = requestBodyObject?.schema\n ? getExampleFromSchema(requestBodyObject?.schema, {\n xml: true,\n mode: 'write',\n })\n : null\n\n return {\n mimeType,\n text: example ?? json2xml(exampleFromSchema, ' '),\n }\n }\n\n // Binary data\n if (mimeType === 'application/octet-stream') {\n return {\n mimeType,\n text: 'BINARY',\n }\n }\n\n // Plain text\n if (mimeType === 'text/plain') {\n const exampleFromSchema = requestBodyObject?.schema\n ? getExampleFromSchema(requestBodyObject?.schema, {\n xml: true,\n mode: 'write',\n })\n : null\n\n return {\n mimeType,\n text: example ?? exampleFromSchema ?? '',\n }\n }\n\n // URL encoded data\n if (mimeType === 'multipart/form-data' || mimeType === 'application/x-www-form-urlencoded') {\n const exampleFromSchema = requestBodyObject?.schema\n ? getExampleFromSchema(requestBodyObject?.schema, {\n xml: true,\n mode: 'write',\n })\n : null\n\n return {\n mimeType,\n params: getParamsFromObject(example ?? exampleFromSchema ?? {}),\n }\n }\n\n return null\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-spec.d.ts","sourceRoot":"","sources":["../../src/transforms/import-spec.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAA;AAE5E,OAAO,EAEL,KAAK,cAAc,EAGpB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAGxD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AAC3E,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,iBAAiB,EAAoB,MAAM,4BAA4B,CAAA;AAEtG,OAAO,EAAE,KAAK,cAAc,EAA4B,MAAM,kCAAkC,CAAA;AAChG,OAAO,EAAE,KAAK,OAAO,EAAsC,MAAM,0BAA0B,CAAA;AAC3F,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,wBAAwB,CAAA;AAClE,OAAO,EAAE,KAAK,GAAG,EAAa,MAAM,8BAA8B,CAAA;AA4ClE,mFAAmF;AACnF,eAAO,MAAM,WAAW,qBACJ,MAAM,GAAG,aAAa,GAAG,SAAS,0CAKjD;IAAE,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,oBAAoB,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAA;CAAE;IAkBtE;;;OAGG;YAC8C,WAAW,CAAC,QAAQ;;EAGxE,CAAA;AAED,sDAAsD;AACtD,eAAO,MAAM,6BAA6B,yBAClB,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,0BACnB,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,iCAC1B,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,KACvD,0BAaF,CAAA;AAED,iCAAiC;AACjC,eAAO,MAAM,UAAU,SAAU,MAAM,KAA2B,UAAU,CAAC,KAAK,CAAC,CAAA;AAEnF,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAAC,iBAAiB,EAAE,aAAa,GAAG,WAAW,CAAC,GAC1F,IAAI,CAAC,yBAAyB,EAAE,gBAAgB,GAAG,eAAe,GAAG,SAAS,GAAG,MAAM,CAAC,GAAG;IACzF,gCAAgC;IAChC,oBAAoB,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAA;IAC3C,mFAAmF;IACnF,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,yCAAyC;IACzC,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,EAC3C;AACE,mFAAmF;AACnF,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,WAAW,EACX,OAAO,EAAE,iBAAiB,EAC1B,qBAA6B,EAC7B,IAAI,EACJ,UAAU,EACV,SAAiB,GAClB,GAAE,yBAA8B,GAChC,OAAO,CACN;IACE,KAAK,EAAE,KAAK,CAAA;IACZ,UAAU,EAAE,UAAU,CAAA;IACtB,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAA;IAC5B,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,IAAI,EAAE,GAAG,EAAE,CAAA;IACX,eAAe,EAAE,cAAc,EAAE,CAAA;CAClC,GACD;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,SAAS,CAAA;CAAE,CACnE,
|
|
1
|
+
{"version":3,"file":"import-spec.d.ts","sourceRoot":"","sources":["../../src/transforms/import-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -225,20 +225,6 @@ async function importSpecToWorkspace(content, {
|
|
|
225
225
|
console.warn("[@scalar/api-client] operation.examples is not a valid openapi property");
|
|
226
226
|
delete requestPayload.examples;
|
|
227
227
|
}
|
|
228
|
-
if (operationSecurity?.length) {
|
|
229
|
-
requestPayload.security = operationSecurity.map((s) => {
|
|
230
|
-
const keys = Object.keys(s);
|
|
231
|
-
if (keys.length) {
|
|
232
|
-
const [key] = Object.keys(s);
|
|
233
|
-
if (key) {
|
|
234
|
-
return {
|
|
235
|
-
[key]: s[key]
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
return s;
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
228
|
const request = schemaModel(requestPayload, requestSchema, false);
|
|
243
229
|
if (!request) {
|
|
244
230
|
importWarnings.push(`${method} Request at ${path} is invalid.`);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/transforms/import-spec.ts"],
|
|
4
|
-
"sourcesContent": ["import { isDefined } from '@scalar/helpers/array/is-defined'\nimport { isHttpMethod } from '@scalar/helpers/http/is-http-method'\nimport { combineUrlAndPath } from '@scalar/helpers/url/merge-urls'\nimport { keysOf } from '@scalar/object-utils/arrays'\nimport { type LoadResult, dereference, load, upgrade } from '@scalar/openapi-parser'\nimport type { OpenAPIV3_1 } from '@scalar/openapi-types'\nimport type { ApiReferenceConfiguration } from '@scalar/types/api-reference'\nimport type { SecuritySchemeOauth2 } from '@scalar/types/entities'\nimport {\n type Oauth2FlowPayload,\n type SecurityScheme,\n type SecuritySchemePayload,\n securitySchemeSchema,\n} from '@scalar/types/entities'\nimport type { UnknownObject } from '@scalar/types/utils'\nimport type { Entries } from 'type-fest'\n\nimport type { SelectedSecuritySchemeUids } from '@/entities/shared/utility'\nimport { type Collection, type CollectionPayload, collectionSchema } from '@/entities/spec/collection'\nimport type { RequestParameterPayload } from '@/entities/spec/parameters'\nimport { type RequestExample, createExampleFromRequest } from '@/entities/spec/request-examples'\nimport { type Request, type RequestPayload, requestSchema } from '@/entities/spec/requests'\nimport { type Server, serverSchema } from '@/entities/spec/server'\nimport { type Tag, tagSchema } from '@/entities/spec/spec-objects'\nimport { schemaModel } from '@/helpers/schema-model'\n\nconst dereferenceDocument = async (\n document: string | UnknownObject,\n { shouldLoad = true }: { shouldLoad?: boolean } = {},\n) => {\n if (document === null || (typeof document === 'string' && document.trim() === '')) {\n console.warn('[@scalar/oas-utils] Empty OpenAPI document provided.')\n\n return {\n schema: {} as OpenAPIV3_1.Document,\n errors: [],\n }\n }\n\n let filesystem: LoadResult['filesystem'] | string | UnknownObject = document\n let loadErrors: LoadResult['errors'] = []\n\n if (shouldLoad) {\n // TODO: Plugins for URLs and files with the proxy are missing here.\n // @see packages/api-reference/src/helpers/parse.ts\n const response = await load(document).catch((e) => ({\n errors: [\n {\n code: e.code,\n message: e.message,\n },\n ],\n filesystem: [],\n }))\n filesystem = response.filesystem\n loadErrors = response.errors ?? []\n }\n\n const { specification } = upgrade(filesystem)\n const { schema, errors: derefErrors = [] } = await dereference(specification)\n\n return {\n schema,\n errors: [...loadErrors, ...derefErrors],\n }\n}\n\n/** Takes a string or object and parses it into an openapi spec compliant schema */\nexport const parseSchema = async (\n originalDocument: string | UnknownObject | undefined,\n {\n shouldLoad = true,\n /** If a dereferenced document is provided, we will skip the dereferencing step. */\n dereferencedDocument = undefined,\n }: { shouldLoad?: boolean; dereferencedDocument?: OpenAPIV3_1.Document } = {},\n) => {\n // Skip, if a dereferenced document is provided\n const { schema, errors } = dereferencedDocument\n ? {\n schema: dereferencedDocument,\n errors: [],\n }\n : // Otherwise, dereference the original document\n await dereferenceDocument(originalDocument ?? '', {\n shouldLoad,\n })\n\n if (!schema) {\n console.warn('[@scalar/oas-utils] OpenAPI Parser Warning: Schema is undefined')\n }\n\n return {\n /**\n * Temporary fix for the parser returning an empty array\n * TODO: remove this once the parser is fixed\n */\n schema: (Array.isArray(schema) ? {} : schema) as OpenAPIV3_1.Document,\n errors,\n }\n}\n\n/** Converts selected security requirements to uids */\nexport const getSelectedSecuritySchemeUids = (\n securityRequirements: (string | string[])[],\n preferredSecurityNames: (string | string[])[] = [],\n securitySchemeMap: Record<string, SecurityScheme['uid']>,\n): SelectedSecuritySchemeUids => {\n // Set the first security requirement if no preferred security schemes are set\n const names =\n securityRequirements[0] && !preferredSecurityNames.length ? [securityRequirements[0]] : preferredSecurityNames\n\n // Map names to uids\n const uids = names\n .map((name) =>\n Array.isArray(name) ? name.map((k) => securitySchemeMap[k]).filter(isDefined) : securitySchemeMap[name],\n )\n .filter(isDefined)\n\n return uids\n}\n\n/** Create a \"uid\" from a slug */\nexport const getSlugUid = (slug: string) => `slug-uid-${slug}` as Collection['uid']\n\nexport type ImportSpecToWorkspaceArgs = Pick<CollectionPayload, 'documentUrl' | 'watchMode'> &\n Pick<ApiReferenceConfiguration, 'authentication' | 'baseServerURL' | 'servers' | 'slug'> & {\n /** The dereferenced document */\n dereferencedDocument?: OpenAPIV3_1.Document\n /** Sets the preferred security scheme on the collection instead of the requests */\n useCollectionSecurity?: boolean\n /** Call the load step from the parser */\n shouldLoad?: boolean\n }\n\n/**\n * Imports an OpenAPI document and converts it to workspace entities (Collection, Request, Server, etc.)\n *\n * The imported entities maintain a close mapping to the original OpenAPI specification to enable:\n * - Bi-directional translation between spec and workspace entities\n * - Preservation of specification details and structure\n * - Accurate representation of relationships between components\n *\n * Relationships between entities are maintained through unique identifiers (UIDs) which allow:\n * - Flexible organization at different levels (workspace, collection, request)\n * - Proper linking between related components\n * - Easy lookup and reference of dependent entities\n */\nexport async function importSpecToWorkspace(\n content: string | UnknownObject | undefined,\n {\n /** If a dereferenced document is provided, we will skip the dereferencing step. */\n dereferencedDocument,\n authentication,\n baseServerURL,\n documentUrl,\n servers: configuredServers,\n useCollectionSecurity = false,\n slug,\n shouldLoad,\n watchMode = false,\n }: ImportSpecToWorkspaceArgs = {},\n): Promise<\n | {\n error: false\n collection: Collection\n requests: Request[]\n schema: OpenAPIV3_1.Document\n examples: RequestExample[]\n servers: Server[]\n tags: Tag[]\n securitySchemes: SecurityScheme[]\n }\n | { error: true; importWarnings: string[]; collection: undefined }\n> {\n const { schema, errors } = await parseSchema(content, { shouldLoad, dereferencedDocument })\n const importWarnings: string[] = [...errors.map((e) => e.message)]\n\n if (!schema) {\n return { importWarnings, error: true, collection: undefined }\n }\n // ---------------------------------------------------------------------------\n // Some entities will be broken out as individual lists for modification in the workspace\n const start = performance.now()\n const requests: Request[] = []\n\n // Add the base server url to collection servers\n const collectionServers: Server[] = getServersFromOpenApiDocument(configuredServers || schema.servers, {\n baseServerURL,\n })\n\n // Store operation servers\n const operationServers: Server[] = []\n\n // Fallback to the current window.location.origin if no servers are provided\n if (!collectionServers.length) {\n const fallbackUrl = getFallbackUrl()\n\n if (fallbackUrl) {\n collectionServers.push(serverSchema.parse({ url: fallbackUrl }))\n }\n }\n\n /**\n * List of all tag strings. For non compliant specs we may need to\n * add top level tag objects for missing tag objects\n */\n const tagNames: Set<string> = new Set()\n\n // ---------------------------------------------------------------------------\n // SECURITY HANDLING\n\n const security = schema.components?.securitySchemes ?? schema?.securityDefinitions ?? {}\n\n // @ts-expect-error - Toss out a deprecated warning for the old authentication state\n if (authentication?.oAuth2 || authentication?.apiKey || authentication?.http) {\n console.warn(\n `DEPRECATION WARNING: It looks like you're using legacy authentication config. Please migrate to use the updated config. See https://github.com/scalar/scalar/blob/main/documentation/configuration.md#authentication-partial This will be removed in a future version.`,\n )\n }\n\n const securitySchemes = (Object.entries(security) as Entries<Record<string, OpenAPIV3_1.SecuritySchemeObject>>)\n .map?.(([nameKey, _scheme]) => {\n // Apply any transforms we need before parsing\n const payload = {\n ..._scheme,\n // Add the new auth config overrides, we keep the old code below for backwards compatibility\n ...(authentication?.securitySchemes?.[nameKey] ?? {}),\n nameKey,\n } as SecuritySchemePayload\n\n // For oauth2 we need to add the type to the flows + prefill from authentication\n if (payload.type === 'oauth2' && payload.flows) {\n const flowKeys = Object.keys(payload.flows) as Array<keyof typeof payload.flows>\n\n flowKeys.forEach((key) => {\n if (!payload.flows?.[key] || _scheme.type !== 'oauth2') {\n return\n }\n const authFlow = (authentication?.securitySchemes?.[nameKey] as SecuritySchemeOauth2)?.flows?.[key] ?? {}\n\n // This part handles setting of flows via the new auth config, the rest can be removed in a future version\n payload.flows[key] = {\n ...(_scheme.flows?.[key] ?? {}),\n ...authFlow,\n } satisfies Oauth2FlowPayload\n\n const flow = payload.flows[key] as Oauth2FlowPayload\n\n // Set the type\n flow.type = key\n\n // Prefill values from authorization config - old deprecated config\n // @ts-expect-error - deprecated\n if (authentication?.oAuth2) {\n // @ts-expect-error - deprecated\n if (authentication.oAuth2.accessToken) {\n // @ts-expect-error - deprecated\n flow.token = authentication.oAuth2.accessToken\n }\n\n // @ts-expect-error - deprecated\n if (authentication.oAuth2.clientId) {\n // @ts-expect-error - deprecated\n flow['x-scalar-client-id'] = authentication.oAuth2.clientId\n }\n\n // @ts-expect-error - deprecated\n if (authentication.oAuth2.scopes) {\n // @ts-expect-error - deprecated\n flow.selectedScopes = authentication.oAuth2.scopes\n }\n\n if (flow.type === 'password') {\n // @ts-expect-error - deprecated\n flow.username = authentication.oAuth2.username\n // @ts-expect-error - deprecated\n flow.password = authentication.oAuth2.password\n }\n }\n\n // Convert scopes to an object\n if (Array.isArray(flow.scopes)) {\n flow.scopes = flow.scopes.reduce((prev, s) => ({ ...prev, [s]: '' }), {})\n }\n\n // Handle x-defaultClientId\n if (flow['x-defaultClientId']) {\n flow['x-scalar-client-id'] = flow['x-defaultClientId']\n }\n })\n }\n // Otherwise we just prefill - old deprecated config\n else if (authentication) {\n // ApiKey\n // @ts-expect-error - deprecated\n if (payload.type === 'apiKey' && authentication.apiKey?.token) {\n // @ts-expect-error - deprecated\n payload.value = authentication.apiKey.token\n }\n // HTTP\n else if (payload.type === 'http') {\n // @ts-expect-error - deprecated\n if (payload.scheme === 'basic' && authentication.http?.basic) {\n // @ts-expect-error - deprecated\n payload.username = authentication.http.basic.username ?? ''\n // @ts-expect-error - deprecated\n payload.password = authentication.http.basic.password ?? ''\n }\n // Bearer\n // @ts-expect-error - deprecated\n else if (payload.scheme === 'bearer' && authentication.http?.bearer?.token) {\n // @ts-expect-error - deprecated\n payload.token = authentication.http.bearer.token ?? ''\n }\n }\n }\n\n const scheme = schemaModel(payload, securitySchemeSchema, false)\n if (!scheme) {\n importWarnings.push(`Security scheme ${nameKey} is invalid.`)\n }\n\n return scheme\n })\n .filter((v) => !!v)\n\n // Map of security scheme names to UIDs\n const securitySchemeMap: Record<string, SecurityScheme['uid']> = {}\n securitySchemes.forEach((s) => {\n securitySchemeMap[s.nameKey] = s.uid\n })\n\n // ---------------------------------------------------------------------------\n // REQUEST HANDLING\n\n keysOf(schema.paths ?? {}).forEach((pathString) => {\n const path = schema?.paths?.[pathString]\n\n if (!path) {\n return\n }\n // Path level servers must be saved\n const pathServers = serverSchema.array().parse(path.servers ?? [])\n for (const server of pathServers) {\n collectionServers.push(server)\n }\n\n // Creates a sorted array of methods based on the path object.\n const methods = Object.keys(path).filter(isHttpMethod)\n\n methods.forEach((method) => {\n const operation = path[method]\n if (!operation) {\n return\n }\n\n const operationLevelServers = serverSchema.array().parse(operation.servers ?? [])\n\n for (const server of operationLevelServers) {\n operationServers.push(server)\n }\n\n // We will save a list of all tags to ensure they exists at the top level\n // TODO: make sure we add any loose requests with no tags to the collection children\n operation.tags?.forEach((t: string) => tagNames.add(t))\n\n // Remove security here and add it correctly below\n const { security: operationSecurity, ...operationWithoutSecurity } = operation\n\n const securityRequirements: (string | string[])[] = (operationSecurity ?? schema.security ?? [])\n .map((s: OpenAPIV3_1.SecurityRequirementObject) => {\n const keys = Object.keys(s)\n return keys.length > 1 ? keys : keys[0]\n })\n .filter(isDefined)\n\n // Filter the preferred security schemes to only include the ones that are in the security requirements\n const preferredSecurityNames = [authentication?.preferredSecurityScheme ?? []].flat().filter((name) => {\n // Match up complex security requirements, array to array\n if (Array.isArray(name)) {\n // We match every element in the array\n return securityRequirements.some(\n (r) => Array.isArray(r) && r.length === name.length && r.every((v, i) => v === name[i]),\n )\n }\n return securityRequirements.includes(name)\n })\n\n // Set the initially selected security scheme\n const selectedSecuritySchemeUids =\n securityRequirements.length && !useCollectionSecurity\n ? getSelectedSecuritySchemeUids(securityRequirements, preferredSecurityNames, securitySchemeMap)\n : []\n\n const requestPayload: RequestPayload = {\n ...operationWithoutSecurity,\n method,\n path: pathString,\n security: operationSecurity,\n selectedServerUid: operationLevelServers?.[0]?.uid,\n selectedSecuritySchemeUids,\n // Merge path and operation level parameters\n parameters: [...(path?.parameters ?? []), ...(operation.parameters ?? [])] as RequestParameterPayload[],\n servers: [...pathServers, ...operationLevelServers].map((s) => s.uid),\n }\n\n // Remove any examples from the request payload as they conflict with our examples property and are not valid\n if (requestPayload.examples) {\n console.warn('[@scalar/api-client] operation.examples is not a valid openapi property')\n delete requestPayload.examples\n }\n\n // Add list of UIDs to associate security schemes\n // As per the spec if there is operation level security we ignore the top level requirements\n if (operationSecurity?.length) {\n requestPayload.security = operationSecurity.map((s: OpenAPIV3_1.SecurityRequirementObject) => {\n const keys = Object.keys(s)\n\n // Handle the case of {} for optional\n if (keys.length) {\n const [key] = Object.keys(s)\n if (key) {\n return {\n [key]: s[key],\n }\n }\n }\n return s\n })\n }\n\n // Save parse the request\n const request = schemaModel(requestPayload, requestSchema, false)\n\n if (!request) {\n importWarnings.push(`${method} Request at ${path} is invalid.`)\n } else {\n requests.push(request)\n }\n })\n })\n\n // ---------------------------------------------------------------------------\n // TAG HANDLING\n\n // TODO: We may need to handle de-duping tags\n const tags = schemaModel(schema?.tags ?? [], tagSchema.array(), false) ?? []\n\n // Delete any tag names that already have a definition\n tags.forEach((t) => tagNames.delete(t.name))\n\n // Add an entry for any tags that are used but do not have a definition\n tagNames.forEach((name) => name && tags.push(tagSchema.parse({ name })))\n\n // Tag name to UID map\n const tagMap: Record<string, Tag> = {}\n tags.forEach((t) => {\n tagMap[t.name] = t\n })\n\n // Add all tags by default. We will remove nested ones\n const collectionChildren = new Set<Collection['children'][number]>(tags.map((t) => t.uid))\n\n // Nested folders go before any requests\n tags.forEach((t) => {\n t['x-scalar-children']?.forEach((c) => {\n // Add the uid to the appropriate parent.children\n const nestedUid = tagMap[c.tagName]?.uid\n\n if (nestedUid) {\n t.children.push(nestedUid)\n\n // Remove the nested uid from the root folder\n collectionChildren.delete(nestedUid)\n }\n })\n })\n\n // Add the request UIDs to the tag children (or collection root)\n requests.forEach((r) => {\n if (r.tags?.length) {\n r.tags.forEach((t) => {\n tagMap[t]?.children.push(r.uid)\n })\n } else {\n collectionChildren.add(r.uid)\n }\n })\n\n // ---------------------------------------------------------------------------\n\n const examples: RequestExample[] = []\n\n // Ensure each request has at least 1 example\n requests.forEach((request) => {\n // TODO: Need to handle parsing examples\n // if (request['x-scalar-examples']) return\n\n // Create the initial example\n const example = createExampleFromRequest(request, 'Default Example')\n\n examples.push(example)\n request.examples.push(example.uid)\n })\n\n // ---------------------------------------------------------------------------\n // Generate Collection\n\n // Grab the security requirements for this operation\n const securityRequirements: SelectedSecuritySchemeUids = (schema.security ?? [])\n .map((s: OpenAPIV3_1.SecurityRequirementObject) => {\n const keys = Object.keys(s)\n return keys.length > 1 ? keys : keys[0]\n })\n .filter(isDefined)\n\n // Here we do not filter these as we let the preferredSecurityScheme override the requirements\n const preferredSecurityNames = [authentication?.preferredSecurityScheme ?? []].flat()\n\n // Set the initially selected security scheme\n const selectedSecuritySchemeUids =\n (securityRequirements.length || preferredSecurityNames?.length) && useCollectionSecurity\n ? getSelectedSecuritySchemeUids(securityRequirements, preferredSecurityNames, securitySchemeMap)\n : []\n\n // Set the uid as a prefixed slug if we have one\n const slugObj = slug?.length ? { uid: getSlugUid(slug) } : {}\n\n const collection = collectionSchema.parse({\n ...slugObj,\n ...schema,\n watchMode,\n documentUrl,\n useCollectionSecurity,\n requests: requests.map((r) => r.uid),\n servers: collectionServers.map((s) => s.uid),\n tags: tags.map((t) => t.uid),\n children: [...collectionChildren],\n security: schema.security ?? [{}],\n selectedServerUid: collectionServers?.[0]?.uid,\n selectedSecuritySchemeUids,\n components: {\n ...schema.components,\n },\n securitySchemes: securitySchemes.map((s) => s.uid),\n })\n\n const end = performance.now()\n console.log(`workspace: ${Math.round(end - start)} ms`)\n\n /**\n * Servers and requests will be saved in top level maps and indexed via UID to\n * maintain specification relationships\n */\n return {\n error: false,\n servers: [...collectionServers, ...operationServers],\n schema,\n requests,\n examples,\n collection,\n tags,\n securitySchemes,\n }\n}\n\n/**\n * Retrieves a list of servers from an OpenAPI document and converts them to a list of Server entities.\n */\nexport function getServersFromOpenApiDocument(\n servers: OpenAPIV3_1.ServerObject[] | undefined,\n { baseServerURL }: Pick<ApiReferenceConfiguration, 'baseServerURL'> = {},\n): Server[] {\n if (!servers || !Array.isArray(servers)) {\n return []\n }\n\n return servers\n .map((server): Server | undefined => {\n try {\n // Validate the server against the schema\n const parsedSchema = serverSchema.parse(server)\n\n // Prepend with the base server URL (if the given URL is relative)\n if (parsedSchema?.url?.startsWith('/')) {\n // Use the base server URL (if provided)\n if (baseServerURL) {\n parsedSchema.url = combineUrlAndPath(baseServerURL, parsedSchema.url)\n\n return parsedSchema\n }\n\n // Fallback to the current window origin\n const fallbackUrl = getFallbackUrl()\n\n if (fallbackUrl) {\n parsedSchema.url = combineUrlAndPath(fallbackUrl, parsedSchema.url.replace(/^\\//, ''))\n\n return parsedSchema\n }\n }\n\n // Must be good, return it\n return parsedSchema\n } catch (error) {\n console.warn('Oops, that\u2019s an invalid server configuration.')\n console.warn('Server:', server)\n console.warn('Error:', error)\n\n // Return undefined to remove the server\n return undefined\n }\n })\n .filter(isDefined)\n}\n\n/**\n * Fallback to the current window.location.origin, if available\n */\nfunction getFallbackUrl() {\n if (typeof window === 'undefined') {\n return undefined\n }\n\n if (typeof window?.location?.origin !== 'string') {\n return undefined\n }\n\n return window.location.origin\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import { isDefined } from '@scalar/helpers/array/is-defined'\nimport { isHttpMethod } from '@scalar/helpers/http/is-http-method'\nimport { combineUrlAndPath } from '@scalar/helpers/url/merge-urls'\nimport { keysOf } from '@scalar/object-utils/arrays'\nimport { type LoadResult, dereference, load, upgrade } from '@scalar/openapi-parser'\nimport type { OpenAPIV3_1 } from '@scalar/openapi-types'\nimport type { ApiReferenceConfiguration } from '@scalar/types/api-reference'\nimport type { SecuritySchemeOauth2 } from '@scalar/types/entities'\nimport {\n type Oauth2FlowPayload,\n type SecurityScheme,\n type SecuritySchemePayload,\n securitySchemeSchema,\n} from '@scalar/types/entities'\nimport type { UnknownObject } from '@scalar/types/utils'\nimport type { Entries } from 'type-fest'\n\nimport type { SelectedSecuritySchemeUids } from '@/entities/shared/utility'\nimport { type Collection, type CollectionPayload, collectionSchema } from '@/entities/spec/collection'\nimport type { RequestParameterPayload } from '@/entities/spec/parameters'\nimport { type RequestExample, createExampleFromRequest } from '@/entities/spec/request-examples'\nimport { type Request, type RequestPayload, requestSchema } from '@/entities/spec/requests'\nimport { type Server, serverSchema } from '@/entities/spec/server'\nimport { type Tag, tagSchema } from '@/entities/spec/spec-objects'\nimport { schemaModel } from '@/helpers/schema-model'\n\nconst dereferenceDocument = async (\n document: string | UnknownObject,\n { shouldLoad = true }: { shouldLoad?: boolean } = {},\n) => {\n if (document === null || (typeof document === 'string' && document.trim() === '')) {\n console.warn('[@scalar/oas-utils] Empty OpenAPI document provided.')\n\n return {\n schema: {} as OpenAPIV3_1.Document,\n errors: [],\n }\n }\n\n let filesystem: LoadResult['filesystem'] | string | UnknownObject = document\n let loadErrors: LoadResult['errors'] = []\n\n if (shouldLoad) {\n // TODO: Plugins for URLs and files with the proxy are missing here.\n // @see packages/api-reference/src/helpers/parse.ts\n const response = await load(document).catch((e) => ({\n errors: [\n {\n code: e.code,\n message: e.message,\n },\n ],\n filesystem: [],\n }))\n filesystem = response.filesystem\n loadErrors = response.errors ?? []\n }\n\n const { specification } = upgrade(filesystem)\n const { schema, errors: derefErrors = [] } = await dereference(specification)\n\n return {\n schema,\n errors: [...loadErrors, ...derefErrors],\n }\n}\n\n/** Takes a string or object and parses it into an openapi spec compliant schema */\nexport const parseSchema = async (\n originalDocument: string | UnknownObject | undefined,\n {\n shouldLoad = true,\n /** If a dereferenced document is provided, we will skip the dereferencing step. */\n dereferencedDocument = undefined,\n }: { shouldLoad?: boolean; dereferencedDocument?: OpenAPIV3_1.Document } = {},\n) => {\n // Skip, if a dereferenced document is provided\n const { schema, errors } = dereferencedDocument\n ? {\n schema: dereferencedDocument,\n errors: [],\n }\n : // Otherwise, dereference the original document\n await dereferenceDocument(originalDocument ?? '', {\n shouldLoad,\n })\n\n if (!schema) {\n console.warn('[@scalar/oas-utils] OpenAPI Parser Warning: Schema is undefined')\n }\n\n return {\n /**\n * Temporary fix for the parser returning an empty array\n * TODO: remove this once the parser is fixed\n */\n schema: (Array.isArray(schema) ? {} : schema) as OpenAPIV3_1.Document,\n errors,\n }\n}\n\n/** Converts selected security requirements to uids */\nexport const getSelectedSecuritySchemeUids = (\n securityRequirements: (string | string[])[],\n preferredSecurityNames: (string | string[])[] = [],\n securitySchemeMap: Record<string, SecurityScheme['uid']>,\n): SelectedSecuritySchemeUids => {\n // Set the first security requirement if no preferred security schemes are set\n const names =\n securityRequirements[0] && !preferredSecurityNames.length ? [securityRequirements[0]] : preferredSecurityNames\n\n // Map names to uids\n const uids = names\n .map((name) =>\n Array.isArray(name) ? name.map((k) => securitySchemeMap[k]).filter(isDefined) : securitySchemeMap[name],\n )\n .filter(isDefined)\n\n return uids\n}\n\n/** Create a \"uid\" from a slug */\nexport const getSlugUid = (slug: string) => `slug-uid-${slug}` as Collection['uid']\n\nexport type ImportSpecToWorkspaceArgs = Pick<CollectionPayload, 'documentUrl' | 'watchMode'> &\n Pick<ApiReferenceConfiguration, 'authentication' | 'baseServerURL' | 'servers' | 'slug'> & {\n /** The dereferenced document */\n dereferencedDocument?: OpenAPIV3_1.Document\n /** Sets the preferred security scheme on the collection instead of the requests */\n useCollectionSecurity?: boolean\n /** Call the load step from the parser */\n shouldLoad?: boolean\n }\n\n/**\n * Imports an OpenAPI document and converts it to workspace entities (Collection, Request, Server, etc.)\n *\n * The imported entities maintain a close mapping to the original OpenAPI specification to enable:\n * - Bi-directional translation between spec and workspace entities\n * - Preservation of specification details and structure\n * - Accurate representation of relationships between components\n *\n * Relationships between entities are maintained through unique identifiers (UIDs) which allow:\n * - Flexible organization at different levels (workspace, collection, request)\n * - Proper linking between related components\n * - Easy lookup and reference of dependent entities\n */\nexport async function importSpecToWorkspace(\n content: string | UnknownObject | undefined,\n {\n /** If a dereferenced document is provided, we will skip the dereferencing step. */\n dereferencedDocument,\n authentication,\n baseServerURL,\n documentUrl,\n servers: configuredServers,\n useCollectionSecurity = false,\n slug,\n shouldLoad,\n watchMode = false,\n }: ImportSpecToWorkspaceArgs = {},\n): Promise<\n | {\n error: false\n collection: Collection\n requests: Request[]\n schema: OpenAPIV3_1.Document\n examples: RequestExample[]\n servers: Server[]\n tags: Tag[]\n securitySchemes: SecurityScheme[]\n }\n | { error: true; importWarnings: string[]; collection: undefined }\n> {\n const { schema, errors } = await parseSchema(content, { shouldLoad, dereferencedDocument })\n const importWarnings: string[] = [...errors.map((e) => e.message)]\n\n if (!schema) {\n return { importWarnings, error: true, collection: undefined }\n }\n // ---------------------------------------------------------------------------\n // Some entities will be broken out as individual lists for modification in the workspace\n const start = performance.now()\n const requests: Request[] = []\n\n // Add the base server url to collection servers\n const collectionServers: Server[] = getServersFromOpenApiDocument(configuredServers || schema.servers, {\n baseServerURL,\n })\n\n // Store operation servers\n const operationServers: Server[] = []\n\n // Fallback to the current window.location.origin if no servers are provided\n if (!collectionServers.length) {\n const fallbackUrl = getFallbackUrl()\n\n if (fallbackUrl) {\n collectionServers.push(serverSchema.parse({ url: fallbackUrl }))\n }\n }\n\n /**\n * List of all tag strings. For non compliant specs we may need to\n * add top level tag objects for missing tag objects\n */\n const tagNames: Set<string> = new Set()\n\n // ---------------------------------------------------------------------------\n // SECURITY HANDLING\n\n const security = schema.components?.securitySchemes ?? schema?.securityDefinitions ?? {}\n\n // @ts-expect-error - Toss out a deprecated warning for the old authentication state\n if (authentication?.oAuth2 || authentication?.apiKey || authentication?.http) {\n console.warn(\n `DEPRECATION WARNING: It looks like you're using legacy authentication config. Please migrate to use the updated config. See https://github.com/scalar/scalar/blob/main/documentation/configuration.md#authentication-partial This will be removed in a future version.`,\n )\n }\n\n const securitySchemes = (Object.entries(security) as Entries<Record<string, OpenAPIV3_1.SecuritySchemeObject>>)\n .map?.(([nameKey, _scheme]) => {\n // Apply any transforms we need before parsing\n const payload = {\n ..._scheme,\n // Add the new auth config overrides, we keep the old code below for backwards compatibility\n ...(authentication?.securitySchemes?.[nameKey] ?? {}),\n nameKey,\n } as SecuritySchemePayload\n\n // For oauth2 we need to add the type to the flows + prefill from authentication\n if (payload.type === 'oauth2' && payload.flows) {\n const flowKeys = Object.keys(payload.flows) as Array<keyof typeof payload.flows>\n\n flowKeys.forEach((key) => {\n if (!payload.flows?.[key] || _scheme.type !== 'oauth2') {\n return\n }\n const authFlow = (authentication?.securitySchemes?.[nameKey] as SecuritySchemeOauth2)?.flows?.[key] ?? {}\n\n // This part handles setting of flows via the new auth config, the rest can be removed in a future version\n payload.flows[key] = {\n ...(_scheme.flows?.[key] ?? {}),\n ...authFlow,\n } satisfies Oauth2FlowPayload\n\n const flow = payload.flows[key] as Oauth2FlowPayload\n\n // Set the type\n flow.type = key\n\n // Prefill values from authorization config - old deprecated config\n // @ts-expect-error - deprecated\n if (authentication?.oAuth2) {\n // @ts-expect-error - deprecated\n if (authentication.oAuth2.accessToken) {\n // @ts-expect-error - deprecated\n flow.token = authentication.oAuth2.accessToken\n }\n\n // @ts-expect-error - deprecated\n if (authentication.oAuth2.clientId) {\n // @ts-expect-error - deprecated\n flow['x-scalar-client-id'] = authentication.oAuth2.clientId\n }\n\n // @ts-expect-error - deprecated\n if (authentication.oAuth2.scopes) {\n // @ts-expect-error - deprecated\n flow.selectedScopes = authentication.oAuth2.scopes\n }\n\n if (flow.type === 'password') {\n // @ts-expect-error - deprecated\n flow.username = authentication.oAuth2.username\n // @ts-expect-error - deprecated\n flow.password = authentication.oAuth2.password\n }\n }\n\n // Convert scopes to an object\n if (Array.isArray(flow.scopes)) {\n flow.scopes = flow.scopes.reduce((prev, s) => ({ ...prev, [s]: '' }), {})\n }\n\n // Handle x-defaultClientId\n if (flow['x-defaultClientId']) {\n flow['x-scalar-client-id'] = flow['x-defaultClientId']\n }\n })\n }\n // Otherwise we just prefill - old deprecated config\n else if (authentication) {\n // ApiKey\n // @ts-expect-error - deprecated\n if (payload.type === 'apiKey' && authentication.apiKey?.token) {\n // @ts-expect-error - deprecated\n payload.value = authentication.apiKey.token\n }\n // HTTP\n else if (payload.type === 'http') {\n // @ts-expect-error - deprecated\n if (payload.scheme === 'basic' && authentication.http?.basic) {\n // @ts-expect-error - deprecated\n payload.username = authentication.http.basic.username ?? ''\n // @ts-expect-error - deprecated\n payload.password = authentication.http.basic.password ?? ''\n }\n // Bearer\n // @ts-expect-error - deprecated\n else if (payload.scheme === 'bearer' && authentication.http?.bearer?.token) {\n // @ts-expect-error - deprecated\n payload.token = authentication.http.bearer.token ?? ''\n }\n }\n }\n\n const scheme = schemaModel(payload, securitySchemeSchema, false)\n if (!scheme) {\n importWarnings.push(`Security scheme ${nameKey} is invalid.`)\n }\n\n return scheme\n })\n .filter((v) => !!v)\n\n // Map of security scheme names to UIDs\n const securitySchemeMap: Record<string, SecurityScheme['uid']> = {}\n securitySchemes.forEach((s) => {\n securitySchemeMap[s.nameKey] = s.uid\n })\n\n // ---------------------------------------------------------------------------\n // REQUEST HANDLING\n\n keysOf(schema.paths ?? {}).forEach((pathString) => {\n const path = schema?.paths?.[pathString]\n\n if (!path) {\n return\n }\n // Path level servers must be saved\n const pathServers = serverSchema.array().parse(path.servers ?? [])\n for (const server of pathServers) {\n collectionServers.push(server)\n }\n\n // Creates a sorted array of methods based on the path object.\n const methods = Object.keys(path).filter(isHttpMethod)\n\n methods.forEach((method) => {\n const operation = path[method]\n if (!operation) {\n return\n }\n\n const operationLevelServers = serverSchema.array().parse(operation.servers ?? [])\n\n for (const server of operationLevelServers) {\n operationServers.push(server)\n }\n\n // We will save a list of all tags to ensure they exists at the top level\n // TODO: make sure we add any loose requests with no tags to the collection children\n operation.tags?.forEach((t: string) => tagNames.add(t))\n\n // Remove security here and add it correctly below\n const { security: operationSecurity, ...operationWithoutSecurity } = operation\n\n const securityRequirements: (string | string[])[] = (operationSecurity ?? schema.security ?? [])\n .map((s: OpenAPIV3_1.SecurityRequirementObject) => {\n const keys = Object.keys(s)\n return keys.length > 1 ? keys : keys[0]\n })\n .filter(isDefined)\n\n // Filter the preferred security schemes to only include the ones that are in the security requirements\n const preferredSecurityNames = [authentication?.preferredSecurityScheme ?? []].flat().filter((name) => {\n // Match up complex security requirements, array to array\n if (Array.isArray(name)) {\n // We match every element in the array\n return securityRequirements.some(\n (r) => Array.isArray(r) && r.length === name.length && r.every((v, i) => v === name[i]),\n )\n }\n return securityRequirements.includes(name)\n })\n\n // Set the initially selected security scheme\n const selectedSecuritySchemeUids =\n securityRequirements.length && !useCollectionSecurity\n ? getSelectedSecuritySchemeUids(securityRequirements, preferredSecurityNames, securitySchemeMap)\n : []\n\n const requestPayload: RequestPayload = {\n ...operationWithoutSecurity,\n method,\n path: pathString,\n security: operationSecurity,\n selectedServerUid: operationLevelServers?.[0]?.uid,\n selectedSecuritySchemeUids,\n // Merge path and operation level parameters\n parameters: [...(path?.parameters ?? []), ...(operation.parameters ?? [])] as RequestParameterPayload[],\n servers: [...pathServers, ...operationLevelServers].map((s) => s.uid),\n }\n\n // Remove any examples from the request payload as they conflict with our examples property and are not valid\n if (requestPayload.examples) {\n console.warn('[@scalar/api-client] operation.examples is not a valid openapi property')\n delete requestPayload.examples\n }\n\n // Save parse the request\n const request = schemaModel(requestPayload, requestSchema, false)\n\n if (!request) {\n importWarnings.push(`${method} Request at ${path} is invalid.`)\n } else {\n requests.push(request)\n }\n })\n })\n\n // ---------------------------------------------------------------------------\n // TAG HANDLING\n\n // TODO: We may need to handle de-duping tags\n const tags = schemaModel(schema?.tags ?? [], tagSchema.array(), false) ?? []\n\n // Delete any tag names that already have a definition\n tags.forEach((t) => tagNames.delete(t.name))\n\n // Add an entry for any tags that are used but do not have a definition\n tagNames.forEach((name) => name && tags.push(tagSchema.parse({ name })))\n\n // Tag name to UID map\n const tagMap: Record<string, Tag> = {}\n tags.forEach((t) => {\n tagMap[t.name] = t\n })\n\n // Add all tags by default. We will remove nested ones\n const collectionChildren = new Set<Collection['children'][number]>(tags.map((t) => t.uid))\n\n // Nested folders go before any requests\n tags.forEach((t) => {\n t['x-scalar-children']?.forEach((c) => {\n // Add the uid to the appropriate parent.children\n const nestedUid = tagMap[c.tagName]?.uid\n\n if (nestedUid) {\n t.children.push(nestedUid)\n\n // Remove the nested uid from the root folder\n collectionChildren.delete(nestedUid)\n }\n })\n })\n\n // Add the request UIDs to the tag children (or collection root)\n requests.forEach((r) => {\n if (r.tags?.length) {\n r.tags.forEach((t) => {\n tagMap[t]?.children.push(r.uid)\n })\n } else {\n collectionChildren.add(r.uid)\n }\n })\n\n // ---------------------------------------------------------------------------\n\n const examples: RequestExample[] = []\n\n // Ensure each request has at least 1 example\n requests.forEach((request) => {\n // TODO: Need to handle parsing examples\n // if (request['x-scalar-examples']) return\n\n // Create the initial example\n const example = createExampleFromRequest(request, 'Default Example')\n\n examples.push(example)\n request.examples.push(example.uid)\n })\n\n // ---------------------------------------------------------------------------\n // Generate Collection\n\n // Grab the security requirements for this operation\n const securityRequirements: SelectedSecuritySchemeUids = (schema.security ?? [])\n .map((s: OpenAPIV3_1.SecurityRequirementObject) => {\n const keys = Object.keys(s)\n return keys.length > 1 ? keys : keys[0]\n })\n .filter(isDefined)\n\n // Here we do not filter these as we let the preferredSecurityScheme override the requirements\n const preferredSecurityNames = [authentication?.preferredSecurityScheme ?? []].flat()\n\n // Set the initially selected security scheme\n const selectedSecuritySchemeUids =\n (securityRequirements.length || preferredSecurityNames?.length) && useCollectionSecurity\n ? getSelectedSecuritySchemeUids(securityRequirements, preferredSecurityNames, securitySchemeMap)\n : []\n\n // Set the uid as a prefixed slug if we have one\n const slugObj = slug?.length ? { uid: getSlugUid(slug) } : {}\n\n const collection = collectionSchema.parse({\n ...slugObj,\n ...schema,\n watchMode,\n documentUrl,\n useCollectionSecurity,\n requests: requests.map((r) => r.uid),\n servers: collectionServers.map((s) => s.uid),\n tags: tags.map((t) => t.uid),\n children: [...collectionChildren],\n security: schema.security ?? [{}],\n selectedServerUid: collectionServers?.[0]?.uid,\n selectedSecuritySchemeUids,\n components: {\n ...schema.components,\n },\n securitySchemes: securitySchemes.map((s) => s.uid),\n })\n\n const end = performance.now()\n console.log(`workspace: ${Math.round(end - start)} ms`)\n\n /**\n * Servers and requests will be saved in top level maps and indexed via UID to\n * maintain specification relationships\n */\n return {\n error: false,\n servers: [...collectionServers, ...operationServers],\n schema,\n requests,\n examples,\n collection,\n tags,\n securitySchemes,\n }\n}\n\n/**\n * Retrieves a list of servers from an OpenAPI document and converts them to a list of Server entities.\n */\nexport function getServersFromOpenApiDocument(\n servers: OpenAPIV3_1.ServerObject[] | undefined,\n { baseServerURL }: Pick<ApiReferenceConfiguration, 'baseServerURL'> = {},\n): Server[] {\n if (!servers || !Array.isArray(servers)) {\n return []\n }\n\n return servers\n .map((server): Server | undefined => {\n try {\n // Validate the server against the schema\n const parsedSchema = serverSchema.parse(server)\n\n // Prepend with the base server URL (if the given URL is relative)\n if (parsedSchema?.url?.startsWith('/')) {\n // Use the base server URL (if provided)\n if (baseServerURL) {\n parsedSchema.url = combineUrlAndPath(baseServerURL, parsedSchema.url)\n\n return parsedSchema\n }\n\n // Fallback to the current window origin\n const fallbackUrl = getFallbackUrl()\n\n if (fallbackUrl) {\n parsedSchema.url = combineUrlAndPath(fallbackUrl, parsedSchema.url.replace(/^\\//, ''))\n\n return parsedSchema\n }\n }\n\n // Must be good, return it\n return parsedSchema\n } catch (error) {\n console.warn('Oops, that\u2019s an invalid server configuration.')\n console.warn('Server:', server)\n console.warn('Error:', error)\n\n // Return undefined to remove the server\n return undefined\n }\n })\n .filter(isDefined)\n}\n\n/**\n * Fallback to the current window.location.origin, if available\n */\nfunction getFallbackUrl() {\n if (typeof window === 'undefined') {\n return undefined\n }\n\n if (typeof window?.location?.origin !== 'string') {\n return undefined\n }\n\n return window.location.origin\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,iBAAiB;AAC1B,SAAS,oBAAoB;AAC7B,SAAS,yBAAyB;AAClC,SAAS,cAAc;AACvB,SAA0B,aAAa,MAAM,eAAe;AAI5D;AAAA,EAIE;AAAA,OACK;AAKP,SAAkD,wBAAwB;AAE1E,SAA8B,gCAAgC;AAC9D,SAA4C,qBAAqB;AACjE,SAAsB,oBAAoB;AAC1C,SAAmB,iBAAiB;AACpC,SAAS,mBAAmB;AAE5B,MAAM,sBAAsB,OAC1B,UACA,EAAE,aAAa,KAAK,IAA8B,CAAC,MAChD;AACH,MAAI,aAAa,QAAS,OAAO,aAAa,YAAY,SAAS,KAAK,MAAM,IAAK;AACjF,YAAQ,KAAK,sDAAsD;AAEnE,WAAO;AAAA,MACL,QAAQ,CAAC;AAAA,MACT,QAAQ,CAAC;AAAA,IACX;AAAA,EACF;AAEA,MAAI,aAAgE;AACpE,MAAI,aAAmC,CAAC;AAExC,MAAI,YAAY;AAGd,UAAM,WAAW,MAAM,KAAK,QAAQ,EAAE,MAAM,CAAC,OAAO;AAAA,MAClD,QAAQ;AAAA,QACN;AAAA,UACE,MAAM,EAAE;AAAA,UACR,SAAS,EAAE;AAAA,QACb;AAAA,MACF;AAAA,MACA,YAAY,CAAC;AAAA,IACf,EAAE;AACF,iBAAa,SAAS;AACtB,iBAAa,SAAS,UAAU,CAAC;AAAA,EACnC;AAEA,QAAM,EAAE,cAAc,IAAI,QAAQ,UAAU;AAC5C,QAAM,EAAE,QAAQ,QAAQ,cAAc,CAAC,EAAE,IAAI,MAAM,YAAY,aAAa;AAE5E,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,CAAC,GAAG,YAAY,GAAG,WAAW;AAAA,EACxC;AACF;AAGO,MAAM,cAAc,OACzB,kBACA;AAAA,EACE,aAAa;AAAA;AAAA,EAEb,uBAAuB;AACzB,IAA2E,CAAC,MACzE;AAEH,QAAM,EAAE,QAAQ,OAAO,IAAI,uBACvB;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ,CAAC;AAAA,EACX;AAAA;AAAA,IAEA,MAAM,oBAAoB,oBAAoB,IAAI;AAAA,MAChD;AAAA,IACF,CAAC;AAAA;AAEL,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,iEAAiE;AAAA,EAChF;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKL,QAAS,MAAM,QAAQ,MAAM,IAAI,CAAC,IAAI;AAAA,IACtC;AAAA,EACF;AACF;AAGO,MAAM,gCAAgC,CAC3C,sBACA,yBAAgD,CAAC,GACjD,sBAC+B;AAE/B,QAAM,QACJ,qBAAqB,CAAC,KAAK,CAAC,uBAAuB,SAAS,CAAC,qBAAqB,CAAC,CAAC,IAAI;AAG1F,QAAM,OAAO,MACV;AAAA,IAAI,CAAC,SACJ,MAAM,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,kBAAkB,CAAC,CAAC,EAAE,OAAO,SAAS,IAAI,kBAAkB,IAAI;AAAA,EACxG,EACC,OAAO,SAAS;AAEnB,SAAO;AACT;AAGO,MAAM,aAAa,CAAC,SAAiB,YAAY,IAAI;AAyB5D,eAAsB,sBACpB,SACA;AAAA;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,wBAAwB;AAAA,EACxB;AAAA,EACA;AAAA,EACA,YAAY;AACd,IAA+B,CAAC,GAahC;AACA,QAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,YAAY,SAAS,EAAE,YAAY,qBAAqB,CAAC;AAC1F,QAAM,iBAA2B,CAAC,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AAEjE,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,gBAAgB,OAAO,MAAM,YAAY,OAAU;AAAA,EAC9D;AAGA,QAAM,QAAQ,YAAY,IAAI;AAC9B,QAAM,WAAsB,CAAC;AAG7B,QAAM,oBAA8B,8BAA8B,qBAAqB,OAAO,SAAS;AAAA,IACrG;AAAA,EACF,CAAC;AAGD,QAAM,mBAA6B,CAAC;AAGpC,MAAI,CAAC,kBAAkB,QAAQ;AAC7B,UAAM,cAAc,eAAe;AAEnC,QAAI,aAAa;AACf,wBAAkB,KAAK,aAAa,MAAM,EAAE,KAAK,YAAY,CAAC,CAAC;AAAA,IACjE;AAAA,EACF;AAMA,QAAM,WAAwB,oBAAI,IAAI;AAKtC,QAAM,WAAW,OAAO,YAAY,mBAAmB,QAAQ,uBAAuB,CAAC;AAGvF,MAAI,gBAAgB,UAAU,gBAAgB,UAAU,gBAAgB,MAAM;AAC5E,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAEA,QAAM,kBAAmB,OAAO,QAAQ,QAAQ,EAC7C,MAAM,CAAC,CAAC,SAAS,OAAO,MAAM;AAE7B,UAAM,UAAU;AAAA,MACd,GAAG;AAAA;AAAA,MAEH,GAAI,gBAAgB,kBAAkB,OAAO,KAAK,CAAC;AAAA,MACnD;AAAA,IACF;AAGA,QAAI,QAAQ,SAAS,YAAY,QAAQ,OAAO;AAC9C,YAAM,WAAW,OAAO,KAAK,QAAQ,KAAK;AAE1C,eAAS,QAAQ,CAAC,QAAQ;AACxB,YAAI,CAAC,QAAQ,QAAQ,GAAG,KAAK,QAAQ,SAAS,UAAU;AACtD;AAAA,QACF;AACA,cAAM,WAAY,gBAAgB,kBAAkB,OAAO,GAA4B,QAAQ,GAAG,KAAK,CAAC;AAGxG,gBAAQ,MAAM,GAAG,IAAI;AAAA,UACnB,GAAI,QAAQ,QAAQ,GAAG,KAAK,CAAC;AAAA,UAC7B,GAAG;AAAA,QACL;AAEA,cAAM,OAAO,QAAQ,MAAM,GAAG;AAG9B,aAAK,OAAO;AAIZ,YAAI,gBAAgB,QAAQ;AAE1B,cAAI,eAAe,OAAO,aAAa;AAErC,iBAAK,QAAQ,eAAe,OAAO;AAAA,UACrC;AAGA,cAAI,eAAe,OAAO,UAAU;AAElC,iBAAK,oBAAoB,IAAI,eAAe,OAAO;AAAA,UACrD;AAGA,cAAI,eAAe,OAAO,QAAQ;AAEhC,iBAAK,iBAAiB,eAAe,OAAO;AAAA,UAC9C;AAEA,cAAI,KAAK,SAAS,YAAY;AAE5B,iBAAK,WAAW,eAAe,OAAO;AAEtC,iBAAK,WAAW,eAAe,OAAO;AAAA,UACxC;AAAA,QACF;AAGA,YAAI,MAAM,QAAQ,KAAK,MAAM,GAAG;AAC9B,eAAK,SAAS,KAAK,OAAO,OAAO,CAAC,MAAM,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;AAAA,QAC1E;AAGA,YAAI,KAAK,mBAAmB,GAAG;AAC7B,eAAK,oBAAoB,IAAI,KAAK,mBAAmB;AAAA,QACvD;AAAA,MACF,CAAC;AAAA,IACH,WAES,gBAAgB;AAGvB,UAAI,QAAQ,SAAS,YAAY,eAAe,QAAQ,OAAO;AAE7D,gBAAQ,QAAQ,eAAe,OAAO;AAAA,MACxC,WAES,QAAQ,SAAS,QAAQ;AAEhC,YAAI,QAAQ,WAAW,WAAW,eAAe,MAAM,OAAO;AAE5D,kBAAQ,WAAW,eAAe,KAAK,MAAM,YAAY;AAEzD,kBAAQ,WAAW,eAAe,KAAK,MAAM,YAAY;AAAA,QAC3D,WAGS,QAAQ,WAAW,YAAY,eAAe,MAAM,QAAQ,OAAO;AAE1E,kBAAQ,QAAQ,eAAe,KAAK,OAAO,SAAS;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,YAAY,SAAS,sBAAsB,KAAK;AAC/D,QAAI,CAAC,QAAQ;AACX,qBAAe,KAAK,mBAAmB,OAAO,cAAc;AAAA,IAC9D;AAEA,WAAO;AAAA,EACT,CAAC,EACA,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAGpB,QAAM,oBAA2D,CAAC;AAClE,kBAAgB,QAAQ,CAAC,MAAM;AAC7B,sBAAkB,EAAE,OAAO,IAAI,EAAE;AAAA,EACnC,CAAC;AAKD,SAAO,OAAO,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,eAAe;AACjD,UAAM,OAAO,QAAQ,QAAQ,UAAU;AAEvC,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,UAAM,cAAc,aAAa,MAAM,EAAE,MAAM,KAAK,WAAW,CAAC,CAAC;AACjE,eAAW,UAAU,aAAa;AAChC,wBAAkB,KAAK,MAAM;AAAA,IAC/B;AAGA,UAAM,UAAU,OAAO,KAAK,IAAI,EAAE,OAAO,YAAY;AAErD,YAAQ,QAAQ,CAAC,WAAW;AAC1B,YAAM,YAAY,KAAK,MAAM;AAC7B,UAAI,CAAC,WAAW;AACd;AAAA,MACF;AAEA,YAAM,wBAAwB,aAAa,MAAM,EAAE,MAAM,UAAU,WAAW,CAAC,CAAC;AAEhF,iBAAW,UAAU,uBAAuB;AAC1C,yBAAiB,KAAK,MAAM;AAAA,MAC9B;AAIA,gBAAU,MAAM,QAAQ,CAAC,MAAc,SAAS,IAAI,CAAC,CAAC;AAGtD,YAAM,EAAE,UAAU,mBAAmB,GAAG,yBAAyB,IAAI;AAErE,YAAMA,yBAA+C,qBAAqB,OAAO,YAAY,CAAC,GAC3F,IAAI,CAAC,MAA6C;AACjD,cAAM,OAAO,OAAO,KAAK,CAAC;AAC1B,eAAO,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC;AAAA,MACxC,CAAC,EACA,OAAO,SAAS;AAGnB,YAAMC,0BAAyB,CAAC,gBAAgB,2BAA2B,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS;AAErG,YAAI,MAAM,QAAQ,IAAI,GAAG;AAEvB,iBAAOD,sBAAqB;AAAA,YAC1B,CAAC,MAAM,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,KAAK,UAAU,EAAE,MAAM,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC,CAAC;AAAA,UACxF;AAAA,QACF;AACA,eAAOA,sBAAqB,SAAS,IAAI;AAAA,MAC3C,CAAC;AAGD,YAAME,8BACJF,sBAAqB,UAAU,CAAC,wBAC5B,8BAA8BA,uBAAsBC,yBAAwB,iBAAiB,IAC7F,CAAC;AAEP,YAAM,iBAAiC;AAAA,QACrC,GAAG;AAAA,QACH;AAAA,QACA,MAAM;AAAA,QACN,UAAU;AAAA,QACV,mBAAmB,wBAAwB,CAAC,GAAG;AAAA,QAC/C,4BAAAC;AAAA;AAAA,QAEA,YAAY,CAAC,GAAI,MAAM,cAAc,CAAC,GAAI,GAAI,UAAU,cAAc,CAAC,CAAE;AAAA,QACzE,SAAS,CAAC,GAAG,aAAa,GAAG,qBAAqB,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG;AAAA,MACtE;AAGA,UAAI,eAAe,UAAU;AAC3B,gBAAQ,KAAK,yEAAyE;AACtF,eAAO,eAAe;AAAA,MACxB;AAGA,YAAM,UAAU,YAAY,gBAAgB,eAAe,KAAK;AAEhE,UAAI,CAAC,SAAS;AACZ,uBAAe,KAAK,GAAG,MAAM,eAAe,IAAI,cAAc;AAAA,MAChE,OAAO;AACL,iBAAS,KAAK,OAAO;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAMD,QAAM,OAAO,YAAY,QAAQ,QAAQ,CAAC,GAAG,UAAU,MAAM,GAAG,KAAK,KAAK,CAAC;AAG3E,OAAK,QAAQ,CAAC,MAAM,SAAS,OAAO,EAAE,IAAI,CAAC;AAG3C,WAAS,QAAQ,CAAC,SAAS,QAAQ,KAAK,KAAK,UAAU,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAGvE,QAAM,SAA8B,CAAC;AACrC,OAAK,QAAQ,CAAC,MAAM;AAClB,WAAO,EAAE,IAAI,IAAI;AAAA,EACnB,CAAC;AAGD,QAAM,qBAAqB,IAAI,IAAoC,KAAK,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AAGzF,OAAK,QAAQ,CAAC,MAAM;AAClB,MAAE,mBAAmB,GAAG,QAAQ,CAAC,MAAM;AAErC,YAAM,YAAY,OAAO,EAAE,OAAO,GAAG;AAErC,UAAI,WAAW;AACb,UAAE,SAAS,KAAK,SAAS;AAGzB,2BAAmB,OAAO,SAAS;AAAA,MACrC;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAGD,WAAS,QAAQ,CAAC,MAAM;AACtB,QAAI,EAAE,MAAM,QAAQ;AAClB,QAAE,KAAK,QAAQ,CAAC,MAAM;AACpB,eAAO,CAAC,GAAG,SAAS,KAAK,EAAE,GAAG;AAAA,MAChC,CAAC;AAAA,IACH,OAAO;AACL,yBAAmB,IAAI,EAAE,GAAG;AAAA,IAC9B;AAAA,EACF,CAAC;AAID,QAAM,WAA6B,CAAC;AAGpC,WAAS,QAAQ,CAAC,YAAY;AAK5B,UAAM,UAAU,yBAAyB,SAAS,iBAAiB;AAEnE,aAAS,KAAK,OAAO;AACrB,YAAQ,SAAS,KAAK,QAAQ,GAAG;AAAA,EACnC,CAAC;AAMD,QAAM,wBAAoD,OAAO,YAAY,CAAC,GAC3E,IAAI,CAAC,MAA6C;AACjD,UAAM,OAAO,OAAO,KAAK,CAAC;AAC1B,WAAO,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC;AAAA,EACxC,CAAC,EACA,OAAO,SAAS;AAGnB,QAAM,yBAAyB,CAAC,gBAAgB,2BAA2B,CAAC,CAAC,EAAE,KAAK;AAGpF,QAAM,8BACH,qBAAqB,UAAU,wBAAwB,WAAW,wBAC/D,8BAA8B,sBAAsB,wBAAwB,iBAAiB,IAC7F,CAAC;AAGP,QAAM,UAAU,MAAM,SAAS,EAAE,KAAK,WAAW,IAAI,EAAE,IAAI,CAAC;AAE5D,QAAM,aAAa,iBAAiB,MAAM;AAAA,IACxC,GAAG;AAAA,IACH,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,SAAS,IAAI,CAAC,MAAM,EAAE,GAAG;AAAA,IACnC,SAAS,kBAAkB,IAAI,CAAC,MAAM,EAAE,GAAG;AAAA,IAC3C,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,GAAG;AAAA,IAC3B,UAAU,CAAC,GAAG,kBAAkB;AAAA,IAChC,UAAU,OAAO,YAAY,CAAC,CAAC,CAAC;AAAA,IAChC,mBAAmB,oBAAoB,CAAC,GAAG;AAAA,IAC3C;AAAA,IACA,YAAY;AAAA,MACV,GAAG,OAAO;AAAA,IACZ;AAAA,IACA,iBAAiB,gBAAgB,IAAI,CAAC,MAAM,EAAE,GAAG;AAAA,EACnD,CAAC;AAED,QAAM,MAAM,YAAY,IAAI;AAC5B,UAAQ,IAAI,cAAc,KAAK,MAAM,MAAM,KAAK,CAAC,KAAK;AAMtD,SAAO;AAAA,IACL,OAAO;AAAA,IACP,SAAS,CAAC,GAAG,mBAAmB,GAAG,gBAAgB;AAAA,IACnD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,8BACd,SACA,EAAE,cAAc,IAAsD,CAAC,GAC7D;AACV,MAAI,CAAC,WAAW,CAAC,MAAM,QAAQ,OAAO,GAAG;AACvC,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,QACJ,IAAI,CAAC,WAA+B;AACnC,QAAI;AAEF,YAAM,eAAe,aAAa,MAAM,MAAM;AAG9C,UAAI,cAAc,KAAK,WAAW,GAAG,GAAG;AAEtC,YAAI,eAAe;AACjB,uBAAa,MAAM,kBAAkB,eAAe,aAAa,GAAG;AAEpE,iBAAO;AAAA,QACT;AAGA,cAAM,cAAc,eAAe;AAEnC,YAAI,aAAa;AACf,uBAAa,MAAM,kBAAkB,aAAa,aAAa,IAAI,QAAQ,OAAO,EAAE,CAAC;AAErF,iBAAO;AAAA,QACT;AAAA,MACF;AAGA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,KAAK,oDAA+C;AAC5D,cAAQ,KAAK,WAAW,MAAM;AAC9B,cAAQ,KAAK,UAAU,KAAK;AAG5B,aAAO;AAAA,IACT;AAAA,EACF,CAAC,EACA,OAAO,SAAS;AACrB;AAKA,SAAS,iBAAiB;AACxB,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,QAAQ,UAAU,WAAW,UAAU;AAChD,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,SAAS;AACzB;",
|
|
6
6
|
"names": ["securityRequirements", "preferredSecurityNames", "selectedSecuritySchemeUids"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"specification",
|
|
17
17
|
"yaml"
|
|
18
18
|
],
|
|
19
|
-
"version": "0.4.
|
|
19
|
+
"version": "0.4.6",
|
|
20
20
|
"engines": {
|
|
21
21
|
"node": ">=20"
|
|
22
22
|
},
|
|
@@ -58,6 +58,11 @@
|
|
|
58
58
|
"types": "./dist/helpers/index.d.ts",
|
|
59
59
|
"default": "./dist/helpers/index.js"
|
|
60
60
|
},
|
|
61
|
+
"./helpers/operation-to-har": {
|
|
62
|
+
"import": "./dist/helpers/operation-to-har/index.js",
|
|
63
|
+
"types": "./dist/helpers/operation-to-har/index.d.ts",
|
|
64
|
+
"default": "./dist/helpers/operation-to-har/index.js"
|
|
65
|
+
},
|
|
61
66
|
"./helpers/security": {
|
|
62
67
|
"import": "./dist/helpers/security/index.js",
|
|
63
68
|
"types": "./dist/helpers/security/index.d.ts",
|
|
@@ -87,16 +92,17 @@
|
|
|
87
92
|
"dependencies": {
|
|
88
93
|
"@hyperjump/browser": "^1.1.0",
|
|
89
94
|
"@hyperjump/json-schema": "^1.9.6",
|
|
95
|
+
"@types/har-format": "^1.2.15",
|
|
90
96
|
"flatted": "^3.3.1",
|
|
91
97
|
"microdiff": "^1.4.0",
|
|
92
98
|
"nanoid": "^5.1.5",
|
|
93
99
|
"type-fest": "^4.20.0",
|
|
94
100
|
"yaml": "^2.4.5",
|
|
95
101
|
"zod": "3.24.1",
|
|
96
|
-
"@scalar/helpers": "0.0.
|
|
97
|
-
"@scalar/
|
|
98
|
-
"@scalar/
|
|
99
|
-
"@scalar/
|
|
102
|
+
"@scalar/helpers": "0.0.4",
|
|
103
|
+
"@scalar/openapi-types": "0.3.3",
|
|
104
|
+
"@scalar/themes": "0.13.3",
|
|
105
|
+
"@scalar/types": "0.2.3",
|
|
100
106
|
"@scalar/object-utils": "1.2.1"
|
|
101
107
|
},
|
|
102
108
|
"devDependencies": {
|
|
@@ -105,9 +111,9 @@
|
|
|
105
111
|
"vite": "5.4.19",
|
|
106
112
|
"vitest": "^1.6.0",
|
|
107
113
|
"zod-to-ts": "github:amritk/zod-to-ts#build",
|
|
108
|
-
"@scalar/
|
|
109
|
-
"@scalar/
|
|
110
|
-
"@scalar/openapi-types": "0.3.
|
|
114
|
+
"@scalar/openapi-parser": "0.18.0",
|
|
115
|
+
"@scalar/build-tooling": "0.2.3",
|
|
116
|
+
"@scalar/openapi-types": "0.3.3"
|
|
111
117
|
},
|
|
112
118
|
"scripts": {
|
|
113
119
|
"build": "scalar-build-esbuild",
|