@scalar/oas-utils 0.4.12 → 0.4.13

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 CHANGED
@@ -1,5 +1,14 @@
1
1
  # @scalar/oas-utils
2
2
 
3
+ ## 0.4.13
4
+
5
+ ### Patch Changes
6
+
7
+ - 71958fd: fix: include port in server URL
8
+ - Updated dependencies [a85480e]
9
+ - Updated dependencies [8b9c48e]
10
+ - @scalar/workspace-store@0.10.0
11
+
3
12
  ## 0.4.12
4
13
 
5
14
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"get-example-from-schema.d.ts","sourceRoot":"","sources":["../../src/spec-getters/get-example-from-schema.ts"],"names":[],"mappings":"AA8DA;;GAEG;AACH,eAAO,MAAM,oBAAoB,WACvB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,YACjB;IACR;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;OAGG;IACH,GAAG,CAAC,EAAE,OAAO,CAAA;IACb;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC/B;;;OAGG;IACH,8BAA8B,CAAC,EAAE,OAAO,CAAA;CACzC,UACM,MAAM,iBACE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,SAC3B,MAAM,KACZ,GA0RF,CAAA"}
1
+ {"version":3,"file":"get-example-from-schema.d.ts","sourceRoot":"","sources":["../../src/spec-getters/get-example-from-schema.ts"],"names":[],"mappings":"AAgEA;;GAEG;AACH,eAAO,MAAM,oBAAoB,WACvB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,YACjB;IACR;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;OAGG;IACH,GAAG,CAAC,EAAE,OAAO,CAAA;IACb;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC/B;;;OAGG;IACH,8BAA8B,CAAC,EAAE,OAAO,CAAA;CACzC,UACM,MAAM,iBACE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,SAC3B,MAAM,KACZ,GAmSF,CAAA"}
@@ -1,5 +1,6 @@
1
1
  const MAX_LEVELS_DEEP = 5;
2
2
  const MAX_PROPERTIES = 10;
3
+ const DEFAULT_ADDITIONAL_PROPERTIES_NAME = "propertyName*";
3
4
  const genericExampleValues = {
4
5
  // 'date-time': '1970-01-01T00:00:00Z',
5
6
  "date-time": (/* @__PURE__ */ new Date()).toISOString(),
@@ -126,10 +127,11 @@ const getExampleFromSchema = (schema, options, level = 0, parentSchema, name) =>
126
127
  schema.additionalProperties === true || // or an empty object {}
127
128
  typeof schema.additionalProperties === "object" && !Object.keys(schema.additionalProperties).length
128
129
  );
130
+ const additionalPropertiesName = typeof schema.additionalProperties === "object" && schema.additionalProperties["x-additionalPropertiesName"] && typeof schema.additionalProperties["x-additionalPropertiesName"] === "string" && schema.additionalProperties["x-additionalPropertiesName"].trim().length > 0 ? `${schema.additionalProperties["x-additionalPropertiesName"].trim()}*` : DEFAULT_ADDITIONAL_PROPERTIES_NAME;
129
131
  if (anyTypeIsValid) {
130
- response["ANY_ADDITIONAL_PROPERTY"] = "anything";
132
+ response[additionalPropertiesName] = "anything";
131
133
  } else if (schema.additionalProperties !== false) {
132
- response["ANY_ADDITIONAL_PROPERTY"] = getExampleFromSchema(schema.additionalProperties, options, level + 1);
134
+ response[additionalPropertiesName] = getExampleFromSchema(schema.additionalProperties, options, level + 1);
133
135
  }
134
136
  }
135
137
  if (schema.anyOf !== void 0) {
@@ -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's 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't 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's 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's 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's one\n if (schema.example !== undefined) {\n return cache(schema, schema.example)\n }\n\n // Use a default value, if there's 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's an object\n const isObject = schema.items?.type === 'object' || schema.items?.properties !== undefined\n // if it has type: 'array', or items, it's 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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",
4
+ "sourcesContent": ["const 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\n/** The default name for additional properties. */\nconst DEFAULT_ADDITIONAL_PROPERTIES_NAME = 'propertyName*'\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's 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't 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's 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's 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's one\n if (schema.example !== undefined) {\n return cache(schema, schema.example)\n }\n\n // Use a default value, if there's 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 // Get the custom name for additional properties if available\n const additionalPropertiesName =\n typeof schema.additionalProperties === 'object' &&\n schema.additionalProperties['x-additionalPropertiesName'] &&\n typeof schema.additionalProperties['x-additionalPropertiesName'] === 'string' &&\n schema.additionalProperties['x-additionalPropertiesName'].trim().length > 0\n ? `${schema.additionalProperties['x-additionalPropertiesName'].trim()}*`\n : DEFAULT_ADDITIONAL_PROPERTIES_NAME\n\n if (anyTypeIsValid) {\n response[additionalPropertiesName] = 'anything'\n } else if (schema.additionalProperties !== false) {\n response[additionalPropertiesName] = 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's an object\n const isObject = schema.items?.type === 'object' || schema.items?.properties !== undefined\n // if it has type: 'array', or items, it's 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
  }
@@ -307,7 +307,7 @@ async function importSpecToWorkspace(content, {
307
307
  function getBaseUrlFromDocumentUrl(documentUrl) {
308
308
  try {
309
309
  const url = new URL(documentUrl);
310
- return `${url.protocol}//${url.hostname}`;
310
+ return `${url.protocol}//${url.hostname}${url.port ? `:${url.port}` : ""}`;
311
311
  } catch {
312
312
  return void 0;
313
313
  }
@@ -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 documentUrl,\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 * Extracts the base URL (protocol + hostname) from a document URL.\n * Falls back to the original URL if it's not a valid URL.\n */\nfunction getBaseUrlFromDocumentUrl(documentUrl: string): string | undefined {\n try {\n const url = new URL(documentUrl)\n return `${url.protocol}//${url.hostname}`\n } catch {\n // If the documentUrl is not a valid URL, we can't use it\n return undefined\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 {\n baseServerURL,\n documentUrl,\n }: Pick<ApiReferenceConfiguration, 'baseServerURL'> & Pick<ImportSpecToWorkspaceArgs, 'documentUrl'> = {},\n): Server[] {\n // If the document doesn't have any servers, try to use the documentUrl as the default server.\n if (!servers?.length && documentUrl) {\n const newServerUrl = getBaseUrlFromDocumentUrl(documentUrl)\n\n if (newServerUrl) {\n return [serverSchema.parse({ url: newServerUrl })]\n }\n }\n\n // If the servers are not an array, return an empty array.\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 if (documentUrl) {\n const baseUrl = getBaseUrlFromDocumentUrl(documentUrl)\n\n if (baseUrl) {\n parsedSchema.url = combineUrlAndPath(baseUrl, parsedSchema.url)\n }\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's 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 documentUrl,\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 * Extracts the base URL (protocol + hostname) from a document URL.\n * Falls back to the original URL if it's not a valid URL.\n */\nfunction getBaseUrlFromDocumentUrl(documentUrl: string): string | undefined {\n try {\n const url = new URL(documentUrl)\n return `${url.protocol}//${url.hostname}${url.port ? `:${url.port}` : ''}`\n } catch {\n // If the documentUrl is not a valid URL, we can't use it\n return undefined\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 {\n baseServerURL,\n documentUrl,\n }: Pick<ApiReferenceConfiguration, 'baseServerURL'> & Pick<ImportSpecToWorkspaceArgs, 'documentUrl'> = {},\n): Server[] {\n // If the document doesn't have any servers, try to use the documentUrl as the default server.\n if (!servers?.length && documentUrl) {\n const newServerUrl = getBaseUrlFromDocumentUrl(documentUrl)\n\n if (newServerUrl) {\n return [serverSchema.parse({ url: newServerUrl })]\n }\n }\n\n // If the servers are not an array, return an empty array.\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 if (documentUrl) {\n const baseUrl = getBaseUrlFromDocumentUrl(documentUrl)\n\n if (baseUrl) {\n parsedSchema.url = combineUrlAndPath(baseUrl, parsedSchema.url)\n }\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's 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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",
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.12",
19
+ "version": "0.4.13",
20
20
  "engines": {
21
21
  "node": ">=20"
22
22
  },
@@ -103,8 +103,8 @@
103
103
  "@scalar/object-utils": "1.2.2",
104
104
  "@scalar/openapi-types": "0.3.5",
105
105
  "@scalar/themes": "0.13.9",
106
- "@scalar/types": "0.2.8",
107
- "@scalar/workspace-store": "0.9.0"
106
+ "@scalar/workspace-store": "0.10.0",
107
+ "@scalar/types": "0.2.8"
108
108
  },
109
109
  "devDependencies": {
110
110
  "@types/node": "^22.9.0",