@scalar/oas-utils 0.4.5 → 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 +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/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 +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -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,
|
|
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"}
|
|
@@ -174,7 +174,9 @@ const getExampleFromSchema = (schema, options, level = 0, parentSchema, name) =>
|
|
|
174
174
|
return cache(schema, wrapItems ? [{ [itemsXmlTagName]: exampleFromRule }] : exampleFromRule);
|
|
175
175
|
}
|
|
176
176
|
}
|
|
177
|
-
|
|
177
|
+
const isObject = schema.items?.type === "object" || schema.items?.properties !== void 0;
|
|
178
|
+
const isArray = schema.items?.type === "array" || schema.items?.items !== void 0;
|
|
179
|
+
if (schema.items?.type || isObject || isArray) {
|
|
178
180
|
const exampleFromSchema = getExampleFromSchema(schema.items, options, level + 1);
|
|
179
181
|
return wrapItems ? [{ [itemsXmlTagName]: exampleFromSchema }] : [exampleFromSchema];
|
|
180
182
|
}
|
|
@@ -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": "AACA,MAAM,kBAAkB;AAExB,MAAM,iBAAiB;AAEvB,MAAM,uBAA+C;AAAA;AAAA,EAEnD,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA;AAAA,EAEpC,SAAQ,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,EAC7C,SAAS;AAAA,EACT,YAAY;AAAA;AAAA,EAEZ,aAAa;AAAA;AAAA,EAEb,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,iBAAiB;AAAA;AAAA,EAEjB,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,SAAS;AAAA;AAAA,EAET,yBAAyB;AAAA;AAAA;AAAA,EAGzB,SAAQ,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,EAAG,MAAM,GAAG,EAAE,CAAC;AAAA;AAAA,EAE5D,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,aAAa;AACf;AAKA,SAAS,gBAAgB,QAA6B,mBAA4B,OAAO,WAAmB,IAAI;AAC9G,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,IAAI,KAAK,CAAC,EAAE,GAAG,UAAU;AAAA,EAClC;AACA,SAAO,mBAAoB,qBAAqB,OAAO,MAAM,KAAK,WAAY;AAChF;AAGA,MAAM,cAAc,oBAAI,QAAkC;AAG1D,SAAS,MAAM,QAA6B,QAAiB;AAE3D,MAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AACjD,WAAO;AAAA,EACT;AAEA,cAAY,IAAI,QAAQ,MAAM;AAE9B,SAAO;AACT;AAKO,MAAM,uBAAuB,CAClC,QACA,SA0BA,QAAgB,GAChB,cACA,SACQ;AAER,MAAI,YAAY,IAAI,MAAM,GAAG;AAC3B,WAAO,YAAY,IAAI,MAAM;AAAA,EAC/B;AAGA,MAAI,UAAU,kBAAkB,GAAG;AACjC,QAAI;AAEF,WAAK,UAAU,MAAM;AAAA,IACvB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAIA,QAAM,mBAAmB,CAAC,CAAC,SAAS;AAGpC,MAAI,OAAO,YAAY;AACrB,WAAO;AAAA,EACT;AAGA,MAAK,SAAS,SAAS,WAAW,OAAO,YAAc,SAAS,SAAS,UAAU,OAAO,WAAY;AACpG,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,YAAY,GAAG;AACxB,UAAM,QAAQ,SAAS,YAAY,OAAO,YAAY,CAAC;AAGvD,QAAI,UAAU,QAAW;AAEvB,UAAI,OAAO,SAAS,YAAY,OAAO,SAAS,WAAW;AACzD,eAAO,OAAO,SAAS,OAAO,EAAE;AAAA,MAClC;AAEA,aAAO,MAAM,QAAQ,KAAK;AAAA,IAC5B;AAAA,EACF;AAGA,MAAI,MAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,SAAS,SAAS,GAAG;AAChE,WAAO,MAAM,QAAQ,OAAO,SAAS,CAAC,CAAC;AAAA,EACzC;AAGA,MAAI,OAAO,YAAY,QAAW;AAChC,WAAO,MAAM,QAAQ,OAAO,OAAO;AAAA,EACrC;AAGA,MAAI,OAAO,YAAY,QAAW;AAChC,WAAO,MAAM,QAAQ,OAAO,OAAO;AAAA,EACrC;AAGA,MAAI,MAAM,QAAQ,OAAO,IAAI,KAAK,OAAO,KAAK,SAAS,GAAG;AACxD,WAAO,MAAM,QAAQ,OAAO,KAAK,CAAC,CAAC;AAAA,EACrC;AAGA,QAAM,kBACJ,OAAO,SAAS,YAChB,OAAO,SAAS,WAChB,CAAC,CAAC,OAAO,OAAO,KAAK,CAAC,KACtB,CAAC,CAAC,OAAO,OAAO,KAAK,CAAC,KACtB,CAAC,CAAC,OAAO,OAAO,KAAK,CAAC;AACxB,MAAI,CAAC,mBAAmB,SAAS,mCAAmC,MAAM;AACxE,UAAM,aACJ,OAAO,aAAa,QACpB,cAAc,aAAa,QAC3B,cAAc,UAAU,SAAS,QAAQ,OAAO,IAAI;AAEtD,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,OAAO,SAAS,YAAY,OAAO,eAAe,QAAW;AAC/D,UAAM,WAAgC,CAAC;AACvC,QAAI,gBAAgB;AAGpB,QAAI,OAAO,eAAe,QAAW;AACnC,iBAAW,gBAAgB,OAAO,YAAY;AAC5C,YAAI,OAAO,UAAU,eAAe,KAAK,OAAO,YAAY,YAAY,GAAG;AAEzE,cAAI,QAAQ,KAAK,iBAAiB,gBAAgB;AAChD,qBAAS,KAAK,IAAI;AAClB;AAAA,UACF;AAEA,gBAAM,WAAW,OAAO,WAAW,YAAY;AAC/C,gBAAM,qBAAqB,SAAS,MAAM,SAAS,KAAK,OAAO;AAE/D,gBAAM,QAAQ,qBAAqB,UAAU,SAAS,QAAQ,GAAG,QAAQ,YAAY;AAErF,cAAI,OAAO,UAAU,aAAa;AAChC,qBAAS,sBAAsB,YAAY,IAAI;AAC/C;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,sBAAsB,QAAW;AAC1C,iBAAW,WAAW,OAAO,mBAAmB;AAC9C,YAAI,OAAO,UAAU,eAAe,KAAK,OAAO,mBAAmB,OAAO,GAAG;AAC3E,gBAAM,WAAW,OAAO,kBAAkB,OAAO;AAGjD,gBAAM,aAAa;AAEnB,mBAAS,UAAU,IAAI,qBAAqB,UAAU,SAAS,QAAQ,GAAG,QAAQ,UAAU;AAAA,QAC9F;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,yBAAyB,QAAW;AAC7C,YAAM;AAAA;AAAA,QAEJ,OAAO,yBAAyB;AAAA,QAE/B,OAAO,OAAO,yBAAyB,YAAY,CAAC,OAAO,KAAK,OAAO,oBAAoB,EAAE;AAAA;AAEhG,UAAI,gBAAgB;AAClB,iBAAS,yBAAyB,IAAI;AAAA,MACxC,WAAW,OAAO,yBAAyB,OAAO;AAChD,iBAAS,yBAAyB,IAAI,qBAAqB,OAAO,sBAAsB,SAAS,QAAQ,CAAC;AAAA,MAC5G;AAAA,IACF;AAEA,QAAI,OAAO,UAAU,QAAW;AAC9B,aAAO,OAAO,UAAU,qBAAqB,OAAO,MAAM,CAAC,GAAG,SAAS,QAAQ,CAAC,CAAC;AAAA,IACnF,WAAW,OAAO,UAAU,QAAW;AACrC,aAAO,OAAO,UAAU,qBAAqB,OAAO,MAAM,CAAC,GAAG,SAAS,QAAQ,CAAC,CAAC;AAAA,IACnF,WAAW,OAAO,UAAU,QAAW;AACrC,aAAO;AAAA,QACL;AAAA,QACA,GAAG,OAAO,MACP,IAAI,CAAC,SAA8B,qBAAqB,MAAM,SAAS,QAAQ,GAAG,MAAM,CAAC,EACzF,OAAO,CAAC,SAAc,SAAS,MAAS;AAAA,MAC7C;AAAA,IACF;AAEA,WAAO,MAAM,QAAQ,QAAQ;AAAA,EAC/B;AAGA,MAAI,OAAO,SAAS,WAAW,OAAO,UAAU,QAAW;AACzD,UAAM,kBAAkB,QAAQ,OAAO,KAAK;AAC5C,UAAM,YAAY,CAAC,EAAE,SAAS,OAAO,OAAO,KAAK,WAAW;AAE5D,QAAI,OAAO,YAAY,QAAW;AAChC,aAAO,MAAM,QAAQ,YAAY,EAAE,CAAC,eAAe,GAAG,OAAO,QAAQ,IAAI,OAAO,OAAO;AAAA,IACzF;AAGA,QAAI,OAAO,OAAO;AAEhB,UAAI,OAAO,MAAM,OAAO;AAEtB,YAAI,OAAO,MAAM,MAAM,CAAC,EAAE,SAAS,UAAU;AAC3C,gBAAM,gBAAgB;AAAA,YACpB,EAAE,MAAM,UAAU,OAAO,OAAO,MAAM,MAAM;AAAA,YAC5C;AAAA,YACA,QAAQ;AAAA,YACR;AAAA,UACF;AAEA,iBAAO,MAAM,QAAQ,YAAY,CAAC,EAAE,CAAC,eAAe,GAAG,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC;AAAA,QAC3F;AAEA,cAAM,WAAW,OAAO,MAAM,MAC3B,IAAI,CAAC,SAA8B,qBAAqB,MAAM,SAAS,QAAQ,GAAG,MAAM,CAAC,EACzF,OAAO,CAAC,SAAc,SAAS,MAAS;AAE3C,eAAO,MAAM,QAAQ,YAAY,SAAS,IAAI,CAAC,aAAkB,EAAE,CAAC,eAAe,GAAG,QAAQ,EAAE,IAAI,QAAQ;AAAA,MAC9G;AAGA,YAAM,QAAQ,CAAC,SAAS,OAAO;AAC/B,iBAAW,QAAQ,OAAO;AACxB,YAAI,CAAC,OAAO,MAAM,IAAI,GAAG;AACvB;AAAA,QACF;AAEA,cAAM,UAAU,OAAO,MAAM,IAAI,EAAE,MAAM,GAAG,CAAC;AAC7C,cAAM,kBAAkB,QACrB,IAAI,CAAC,SAA8B,qBAAqB,MAAM,SAAS,QAAQ,GAAG,MAAM,CAAC,EACzF,OAAO,CAAC,SAAc,SAAS,MAAS;AAE3C,eAAO,MAAM,QAAQ,YAAY,CAAC,EAAE,CAAC,eAAe,GAAG,gBAAgB,CAAC,IAAI,eAAe;AAAA,MAC7F;AAAA,IACF;
|
|
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 +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": "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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.
|
|
19
|
+
"version": "0.4.6",
|
|
20
20
|
"engines": {
|
|
21
21
|
"node": ">=20"
|
|
22
22
|
},
|
|
@@ -100,10 +100,10 @@
|
|
|
100
100
|
"yaml": "^2.4.5",
|
|
101
101
|
"zod": "3.24.1",
|
|
102
102
|
"@scalar/helpers": "0.0.4",
|
|
103
|
-
"@scalar/object-utils": "1.2.1",
|
|
104
103
|
"@scalar/openapi-types": "0.3.3",
|
|
105
104
|
"@scalar/themes": "0.13.3",
|
|
106
|
-
"@scalar/types": "0.2.3"
|
|
105
|
+
"@scalar/types": "0.2.3",
|
|
106
|
+
"@scalar/object-utils": "1.2.1"
|
|
107
107
|
},
|
|
108
108
|
"devDependencies": {
|
|
109
109
|
"@types/node": "^20.17.10",
|
|
@@ -111,8 +111,8 @@
|
|
|
111
111
|
"vite": "5.4.19",
|
|
112
112
|
"vitest": "^1.6.0",
|
|
113
113
|
"zod-to-ts": "github:amritk/zod-to-ts#build",
|
|
114
|
+
"@scalar/openapi-parser": "0.18.0",
|
|
114
115
|
"@scalar/build-tooling": "0.2.3",
|
|
115
|
-
"@scalar/openapi-parser": "0.17.0",
|
|
116
116
|
"@scalar/openapi-types": "0.3.3"
|
|
117
117
|
},
|
|
118
118
|
"scripts": {
|