@scalar/oas-utils 0.4.8 → 0.4.11

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.
Files changed (44) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/dist/entities/spec/operation.d.ts +16 -16
  3. package/dist/entities/spec/parameters.d.ts +2 -2
  4. package/dist/entities/spec/request-examples.d.ts +77 -77
  5. package/dist/entities/spec/request-examples.d.ts.map +1 -1
  6. package/dist/entities/spec/request-examples.js +1 -6
  7. package/dist/entities/spec/request-examples.js.map +2 -2
  8. package/dist/entities/spec/requests.d.ts +28 -28
  9. package/dist/entities/spec/server.js.map +1 -1
  10. package/dist/helpers/fetch-document.js.map +1 -1
  11. package/dist/helpers/operation-to-har/operation-to-har.d.ts +13 -10
  12. package/dist/helpers/operation-to-har/operation-to-har.d.ts.map +1 -1
  13. package/dist/helpers/operation-to-har/operation-to-har.js +10 -2
  14. package/dist/helpers/operation-to-har/operation-to-har.js.map +2 -2
  15. package/dist/helpers/operation-to-har/process-body.d.ts +1 -1
  16. package/dist/helpers/operation-to-har/process-body.d.ts.map +1 -1
  17. package/dist/helpers/operation-to-har/process-body.js +82 -3
  18. package/dist/helpers/operation-to-har/process-body.js.map +2 -2
  19. package/dist/helpers/operation-to-har/process-parameters.d.ts +8 -2
  20. package/dist/helpers/operation-to-har/process-parameters.d.ts.map +1 -1
  21. package/dist/helpers/operation-to-har/process-parameters.js +89 -5
  22. package/dist/helpers/operation-to-har/process-parameters.js.map +3 -3
  23. package/dist/helpers/operation-to-har/process-security-schemes.d.ts +4 -2
  24. package/dist/helpers/operation-to-har/process-security-schemes.d.ts.map +1 -1
  25. package/dist/helpers/operation-to-har/process-security-schemes.js +10 -17
  26. package/dist/helpers/operation-to-har/process-security-schemes.js.map +2 -2
  27. package/dist/helpers/operation-to-har/process-server-url.d.ts +2 -2
  28. package/dist/helpers/operation-to-har/process-server-url.d.ts.map +1 -1
  29. package/dist/helpers/operation-to-har/process-server-url.js.map +2 -2
  30. package/dist/helpers/redirect-to-proxy.d.ts +1 -1
  31. package/dist/helpers/redirect-to-proxy.js.map +1 -1
  32. package/dist/spec-getters/get-example-from-schema.js.map +1 -1
  33. package/dist/spec-getters/get-parameters-from-operation.d.ts +9 -4
  34. package/dist/spec-getters/get-parameters-from-operation.d.ts.map +1 -1
  35. package/dist/spec-getters/get-parameters-from-operation.js.map +2 -2
  36. package/dist/spec-getters/get-request-body-from-operation.d.ts +3 -2
  37. package/dist/spec-getters/get-request-body-from-operation.d.ts.map +1 -1
  38. package/dist/spec-getters/get-request-body-from-operation.js +9 -5
  39. package/dist/spec-getters/get-request-body-from-operation.js.map +2 -2
  40. package/dist/transforms/import-spec.d.ts +1 -1
  41. package/dist/transforms/import-spec.d.ts.map +1 -1
  42. package/dist/transforms/import-spec.js +22 -3
  43. package/dist/transforms/import-spec.js.map +2 -2
  44. package/package.json +15 -14
@@ -1,9 +1,88 @@
1
+ import { isReference } from "@scalar/workspace-store/schemas/v3.1/type-guard";
2
+ const extractExamplesFromSchema = (schema, depth = 0) => {
3
+ if (!schema || depth > 10) {
4
+ return void 0;
5
+ }
6
+ if (schema.examples?.[0] !== void 0) {
7
+ return schema.examples[0];
8
+ }
9
+ if (schema.example !== void 0) {
10
+ return schema.example;
11
+ }
12
+ if (schema.type === "object" && schema.properties) {
13
+ const result = {};
14
+ let hasExamples = false;
15
+ for (const [key, propSchema] of Object.entries(schema.properties)) {
16
+ const example = extractExamplesFromSchema(propSchema, depth + 1);
17
+ if (example !== void 0) {
18
+ result[key] = example;
19
+ hasExamples = true;
20
+ }
21
+ }
22
+ return hasExamples ? result : void 0;
23
+ }
24
+ if (schema.type === "array" && schema.items) {
25
+ const itemExample = extractExamplesFromSchema(schema.items, depth + 1);
26
+ return itemExample !== void 0 ? [itemExample] : void 0;
27
+ }
28
+ return void 0;
29
+ };
30
+ const objectToFormParams = (obj) => {
31
+ const params = [];
32
+ for (const [key, value] of Object.entries(obj)) {
33
+ if (value === void 0 || value === null) {
34
+ continue;
35
+ }
36
+ if (Array.isArray(value)) {
37
+ for (const item of value) {
38
+ params.push({ name: key, value: String(item) });
39
+ }
40
+ } else if (typeof value === "object") {
41
+ const nestedParams = objectToFormParams(value);
42
+ for (const param of nestedParams) {
43
+ params.push({ name: `${key}.${param.name}`, value: param.value });
44
+ }
45
+ } else {
46
+ params.push({ name: key, value: String(value) });
47
+ }
48
+ }
49
+ return params;
50
+ };
1
51
  const processBody = ({ operation, contentType, example }) => {
2
- const _contentType = contentType || Object.keys(operation.requestBody?.content || {})[0];
3
- const text = JSON.stringify(example);
52
+ const content = !operation.requestBody || isReference(operation.requestBody) ? {} : operation.requestBody.content;
53
+ const _contentType = contentType || Object.keys(content)[0];
54
+ const isFormData = _contentType === "multipart/form-data" || _contentType === "application/x-www-form-urlencoded";
55
+ if (example) {
56
+ if (isFormData && typeof example === "object" && example !== null) {
57
+ return {
58
+ mimeType: _contentType,
59
+ params: objectToFormParams(example)
60
+ };
61
+ }
62
+ return {
63
+ mimeType: _contentType,
64
+ text: JSON.stringify(example)
65
+ };
66
+ }
67
+ const contentSchema = content[_contentType]?.schema;
68
+ if (contentSchema) {
69
+ const extractedExample = extractExamplesFromSchema(contentSchema);
70
+ if (extractedExample !== void 0) {
71
+ if (isFormData && typeof extractedExample === "object" && extractedExample !== null) {
72
+ return {
73
+ mimeType: _contentType,
74
+ params: objectToFormParams(extractedExample)
75
+ };
76
+ }
77
+ return {
78
+ mimeType: _contentType,
79
+ text: JSON.stringify(extractedExample)
80
+ };
81
+ }
82
+ }
4
83
  return {
5
84
  mimeType: _contentType,
6
- text
85
+ text: "null"
7
86
  };
8
87
  };
9
88
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/helpers/operation-to-har/process-body.ts"],
4
- "sourcesContent": ["import type { OperationToHarProps } from '@/helpers/operation-to-har/operation-to-har'\nimport type { PostData } from 'har-format'\n\ntype ProcessBodyProps = Pick<OperationToHarProps, 'contentType' | 'operation'> &\n Required<Pick<OperationToHarProps, 'example'>>\n\n/**\n * Processes the request body and returns the processed data\n */\nexport const processBody = ({ operation, contentType, example }: ProcessBodyProps): PostData => {\n const _contentType = contentType || Object.keys(operation.requestBody?.content || {})[0]\n const text = JSON.stringify(example)\n\n return {\n mimeType: _contentType,\n text,\n }\n}\n"],
5
- "mappings": "AASO,MAAM,cAAc,CAAC,EAAE,WAAW,aAAa,QAAQ,MAAkC;AAC9F,QAAM,eAAe,eAAe,OAAO,KAAK,UAAU,aAAa,WAAW,CAAC,CAAC,EAAE,CAAC;AACvF,QAAM,OAAO,KAAK,UAAU,OAAO;AAEnC,SAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import type { OperationToHarProps } from '@/helpers/operation-to-har/operation-to-har'\nimport type { SchemaObject } from '@scalar/workspace-store/schemas/v3.1/strict/schema'\nimport { isReference } from '@scalar/workspace-store/schemas/v3.1/type-guard'\nimport type { Param, PostData } from 'har-format'\n\ntype ProcessBodyProps = Pick<OperationToHarProps, 'contentType' | 'operation' | 'example'>\n\n/**\n * Extended SchemaObject type that includes the examples property from JSON Schema\n */\ntype ExtendedSchemaObject = SchemaObject & {\n examples?: unknown[]\n}\n\n/**\n * Recursively extracts examples from a schema object and its nested properties\n * @param schema - The schema object to extract examples from\n * @param depth - Current recursion depth to prevent infinite loops\n * @returns The extracted example or undefined if none found\n */\nconst extractExamplesFromSchema = (schema: ExtendedSchemaObject | undefined, depth = 0): unknown => {\n // Prevent infinite recursion and handle invalid inputs\n if (!schema || depth > 10) {\n return undefined\n }\n\n // If the schema has examples array, return the first one\n if (schema.examples?.[0] !== undefined) {\n return schema.examples[0]\n }\n\n // If the schema has a single example property, return it\n if (schema.example !== undefined) {\n return schema.example\n }\n\n // For objects, recursively process properties\n if (schema.type === 'object' && schema.properties) {\n const result: Record<string, unknown> = {}\n let hasExamples = false\n\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n const example = extractExamplesFromSchema(propSchema as ExtendedSchemaObject, depth + 1)\n if (example !== undefined) {\n result[key] = example\n hasExamples = true\n }\n }\n\n return hasExamples ? result : undefined\n }\n\n // For arrays, process the items schema\n if (schema.type === 'array' && schema.items) {\n const itemExample = extractExamplesFromSchema(schema.items as ExtendedSchemaObject, depth + 1)\n return itemExample !== undefined ? [itemExample] : undefined\n }\n\n return undefined\n}\n\n/**\n * Converts an object to an array of form parameters\n * @param obj - The object to convert\n * @returns Array of form parameters with name and value properties\n */\nconst objectToFormParams = (obj: Record<string, unknown>): Param[] => {\n const params: Param[] = []\n\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined || value === null) {\n continue\n }\n\n // Handle arrays by adding each item with the same key\n if (Array.isArray(value)) {\n for (const item of value) {\n params.push({ name: key, value: String(item) })\n }\n }\n // Handle nested objects by flattening them\n else if (typeof value === 'object') {\n const nestedParams = objectToFormParams(value as Record<string, unknown>)\n\n for (const param of nestedParams) {\n params.push({ name: `${key}.${param.name}`, value: param.value })\n }\n } else {\n params.push({ name: key, value: String(value) })\n }\n }\n\n return params\n}\n\n/**\n * Processes the request body and returns the processed data\n */\nexport const processBody = ({ operation, contentType, example }: ProcessBodyProps): PostData => {\n const content = !operation.requestBody || isReference(operation.requestBody) ? {} : operation.requestBody.content\n const _contentType = contentType || Object.keys(content)[0]\n\n // Check if this is a form data content type\n const isFormData = _contentType === 'multipart/form-data' || _contentType === 'application/x-www-form-urlencoded'\n\n // Return the provided top level example\n if (example) {\n if (isFormData && typeof example === 'object' && example !== null) {\n return {\n mimeType: _contentType,\n params: objectToFormParams(example as Record<string, unknown>),\n }\n }\n return {\n mimeType: _contentType,\n text: JSON.stringify(example),\n }\n }\n\n // Try to extract examples from the schema\n const contentSchema = content[_contentType]?.schema\n if (contentSchema) {\n const extractedExample = extractExamplesFromSchema(contentSchema as ExtendedSchemaObject)\n\n if (extractedExample !== undefined) {\n if (isFormData && typeof extractedExample === 'object' && extractedExample !== null) {\n return {\n mimeType: _contentType,\n params: objectToFormParams(extractedExample as Record<string, unknown>),\n }\n }\n return {\n mimeType: _contentType,\n text: JSON.stringify(extractedExample),\n }\n }\n }\n\n return {\n mimeType: _contentType,\n text: 'null',\n }\n}\n"],
5
+ "mappings": "AAEA,SAAS,mBAAmB;AAkB5B,MAAM,4BAA4B,CAAC,QAA0C,QAAQ,MAAe;AAElG,MAAI,CAAC,UAAU,QAAQ,IAAI;AACzB,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,WAAW,CAAC,MAAM,QAAW;AACtC,WAAO,OAAO,SAAS,CAAC;AAAA,EAC1B;AAGA,MAAI,OAAO,YAAY,QAAW;AAChC,WAAO,OAAO;AAAA,EAChB;AAGA,MAAI,OAAO,SAAS,YAAY,OAAO,YAAY;AACjD,UAAM,SAAkC,CAAC;AACzC,QAAI,cAAc;AAElB,eAAW,CAAC,KAAK,UAAU,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AACjE,YAAM,UAAU,0BAA0B,YAAoC,QAAQ,CAAC;AACvF,UAAI,YAAY,QAAW;AACzB,eAAO,GAAG,IAAI;AACd,sBAAc;AAAA,MAChB;AAAA,IACF;AAEA,WAAO,cAAc,SAAS;AAAA,EAChC;AAGA,MAAI,OAAO,SAAS,WAAW,OAAO,OAAO;AAC3C,UAAM,cAAc,0BAA0B,OAAO,OAA+B,QAAQ,CAAC;AAC7F,WAAO,gBAAgB,SAAY,CAAC,WAAW,IAAI;AAAA,EACrD;AAEA,SAAO;AACT;AAOA,MAAM,qBAAqB,CAAC,QAA0C;AACpE,QAAM,SAAkB,CAAC;AAEzB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,UAAU,UAAa,UAAU,MAAM;AACzC;AAAA,IACF;AAGA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,iBAAW,QAAQ,OAAO;AACxB,eAAO,KAAK,EAAE,MAAM,KAAK,OAAO,OAAO,IAAI,EAAE,CAAC;AAAA,MAChD;AAAA,IACF,WAES,OAAO,UAAU,UAAU;AAClC,YAAM,eAAe,mBAAmB,KAAgC;AAExE,iBAAW,SAAS,cAAc;AAChC,eAAO,KAAK,EAAE,MAAM,GAAG,GAAG,IAAI,MAAM,IAAI,IAAI,OAAO,MAAM,MAAM,CAAC;AAAA,MAClE;AAAA,IACF,OAAO;AACL,aAAO,KAAK,EAAE,MAAM,KAAK,OAAO,OAAO,KAAK,EAAE,CAAC;AAAA,IACjD;AAAA,EACF;AAEA,SAAO;AACT;AAKO,MAAM,cAAc,CAAC,EAAE,WAAW,aAAa,QAAQ,MAAkC;AAC9F,QAAM,UAAU,CAAC,UAAU,eAAe,YAAY,UAAU,WAAW,IAAI,CAAC,IAAI,UAAU,YAAY;AAC1G,QAAM,eAAe,eAAe,OAAO,KAAK,OAAO,EAAE,CAAC;AAG1D,QAAM,aAAa,iBAAiB,yBAAyB,iBAAiB;AAG9E,MAAI,SAAS;AACX,QAAI,cAAc,OAAO,YAAY,YAAY,YAAY,MAAM;AACjE,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,mBAAmB,OAAkC;AAAA,MAC/D;AAAA,IACF;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM,KAAK,UAAU,OAAO;AAAA,IAC9B;AAAA,EACF;AAGA,QAAM,gBAAgB,QAAQ,YAAY,GAAG;AAC7C,MAAI,eAAe;AACjB,UAAM,mBAAmB,0BAA0B,aAAqC;AAExF,QAAI,qBAAqB,QAAW;AAClC,UAAI,cAAc,OAAO,qBAAqB,YAAY,qBAAqB,MAAM;AACnF,eAAO;AAAA,UACL,UAAU;AAAA,UACV,QAAQ,mBAAmB,gBAA2C;AAAA,QACxE;AAAA,MACF;AACA,aAAO;AAAA,QACL,UAAU;AAAA,QACV,MAAM,KAAK,UAAU,gBAAgB;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,EACR;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,16 +1,22 @@
1
- import type { OpenAPIV3_1 } from '@scalar/openapi-types';
1
+ import type { ParameterObject } from '@scalar/workspace-store/schemas/v3.1/strict/parameter';
2
+ import type { OperationObject } from '@scalar/workspace-store/schemas/v3.1/strict/path-operations';
3
+ import type { ReferenceObject } from '@scalar/workspace-store/schemas/v3.1/strict/reference';
4
+ import { type Dereference } from '@scalar/workspace-store/schemas/v3.1/type-guard';
2
5
  import type { Request as HarRequest } from 'har-format';
3
6
  type ProcessedParameters = {
4
7
  url: string;
5
8
  headers: HarRequest['headers'];
6
9
  queryString: HarRequest['queryString'];
10
+ cookies: HarRequest['cookies'];
7
11
  };
12
+ /** Ensures we don't have any references in the parameters */
13
+ export declare const deReferenceParams: (params: Dereference<OperationObject>["parameters"]) => ParameterObject[];
8
14
  /**
9
15
  * Process OpenAPI parameters and return the updated properties.
10
16
  * Handles path, query, and header parameters with various styles and explode options.
11
17
  *
12
18
  * @see https://spec.openapis.org/oas/latest.html#style-values
13
19
  */
14
- export declare const processParameters: (harRequest: HarRequest, parameters: OpenAPIV3_1.ParameterObject[], example?: unknown) => ProcessedParameters;
20
+ export declare const processParameters: (harRequest: HarRequest, parameters: (ParameterObject | ReferenceObject)[], example?: unknown) => ProcessedParameters;
15
21
  export {};
16
22
  //# sourceMappingURL=process-parameters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"process-parameters.d.ts","sourceRoot":"","sources":["../../../src/helpers/operation-to-har/process-parameters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvD,KAAK,mBAAmB,GAAG;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;IAC9B,WAAW,EAAE,UAAU,CAAC,aAAa,CAAC,CAAA;CACvC,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,eAChB,UAAU,cACV,WAAW,CAAC,eAAe,EAAE,YAC/B,OAAO,KAChB,mBAyHF,CAAA"}
1
+ {"version":3,"file":"process-parameters.d.ts","sourceRoot":"","sources":["../../../src/helpers/operation-to-har/process-parameters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uDAAuD,CAAA;AAC5F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6DAA6D,CAAA;AAClG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uDAAuD,CAAA;AAC5F,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,iDAAiD,CAAA;AAC/F,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvD,KAAK,mBAAmB,GAAG;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;IAC9B,WAAW,EAAE,UAAU,CAAC,aAAa,CAAC,CAAA;IACtC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;CAC/B,CAAA;AAED,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,WAAY,WAAW,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,KAAG,eAAe,EAKrG,CAAA;AAmCD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,eAChB,UAAU,cACV,CAAC,eAAe,GAAG,eAAe,CAAC,EAAE,YACvC,OAAO,KAChB,mBAuNF,CAAA"}
@@ -1,8 +1,35 @@
1
+ import { isReference } from "@scalar/workspace-store/schemas/v3.1/type-guard";
2
+ const deReferenceParams = (params) => {
3
+ if (isReference(params)) {
4
+ return [];
5
+ }
6
+ return (params ?? []).filter((param) => !isReference(param));
7
+ };
8
+ const getParameterStyleAndExplode = (param) => {
9
+ if (param.in === "header") {
10
+ const explode2 = "explode" in param && param.explode !== void 0 ? param.explode : false;
11
+ return { style: "simple", explode: explode2 };
12
+ }
13
+ if (param.in === "cookie") {
14
+ const explode2 = "explode" in param && param.explode !== void 0 ? param.explode : true;
15
+ return { style: "form", explode: explode2 };
16
+ }
17
+ const defaultStyle = {
18
+ path: "simple",
19
+ query: "form",
20
+ header: "simple",
21
+ cookie: "form"
22
+ }[param.in];
23
+ const style = "style" in param && param.style ? param.style : defaultStyle;
24
+ const explode = "explode" in param && param.explode !== void 0 ? param.explode : style === "form";
25
+ return { style, explode };
26
+ };
1
27
  const processParameters = (harRequest, parameters, example) => {
2
28
  const newHeaders = [...harRequest.headers];
3
29
  const newQueryString = [...harRequest.queryString];
4
30
  let newUrl = harRequest.url;
5
- for (const param of parameters) {
31
+ const deReferencedParams = deReferenceParams(parameters);
32
+ for (const param of deReferencedParams) {
6
33
  if (!param.in || !param.name) {
7
34
  continue;
8
35
  }
@@ -10,8 +37,7 @@ const processParameters = (harRequest, parameters, example) => {
10
37
  if (paramValue === void 0) {
11
38
  continue;
12
39
  }
13
- const style = param.style || "simple";
14
- const explode = param.explode ?? false;
40
+ const { style, explode } = getParameterStyleAndExplode(param);
15
41
  switch (param.in) {
16
42
  case "path": {
17
43
  newUrl = processPathParameters(newUrl, param, paramValue, style, explode);
@@ -77,14 +103,71 @@ const processParameters = (harRequest, parameters, example) => {
77
103
  break;
78
104
  }
79
105
  case "header":
80
- newHeaders.push({ name: param.name, value: String(paramValue) });
106
+ if (explode) {
107
+ if (Array.isArray(paramValue)) {
108
+ for (const value of paramValue) {
109
+ newHeaders.push({ name: param.name, value: String(value) });
110
+ }
111
+ } else if (typeof paramValue === "object" && paramValue !== null) {
112
+ const values = Object.entries(paramValue).map(([k, v]) => `${k}=${v}`).join(",");
113
+ newHeaders.push({ name: param.name, value: values });
114
+ } else {
115
+ newHeaders.push({ name: param.name, value: String(paramValue) });
116
+ }
117
+ } else {
118
+ if (Array.isArray(paramValue)) {
119
+ newHeaders.push({ name: param.name, value: paramValue.join(",") });
120
+ } else if (typeof paramValue === "object" && paramValue !== null) {
121
+ const values = Object.entries(paramValue).map(([k, v]) => `${k},${v}`).join(",");
122
+ newHeaders.push({ name: param.name, value: values });
123
+ } else {
124
+ newHeaders.push({ name: param.name, value: String(paramValue) });
125
+ }
126
+ }
127
+ break;
128
+ case "cookie":
129
+ if (explode) {
130
+ if (Array.isArray(paramValue)) {
131
+ for (const value of paramValue) {
132
+ harRequest.cookies.push({ name: param.name, value: value === null ? "null" : String(value) });
133
+ }
134
+ } else if (typeof paramValue === "object" && paramValue !== null) {
135
+ for (const [key, value] of Object.entries(paramValue)) {
136
+ harRequest.cookies.push({ name: key, value: value === null ? "null" : String(value) });
137
+ }
138
+ } else {
139
+ harRequest.cookies.push({ name: param.name, value: paramValue === null ? "null" : String(paramValue) });
140
+ }
141
+ } else {
142
+ if (Array.isArray(paramValue)) {
143
+ const serializedValues = paramValue.map((v) => v === null ? "null" : String(v)).join(",");
144
+ harRequest.cookies.push({ name: param.name, value: serializedValues });
145
+ } else if (typeof paramValue === "object" && paramValue !== null) {
146
+ const flattenObject = (obj) => {
147
+ const result = [];
148
+ for (const [key, value] of Object.entries(obj)) {
149
+ if (typeof value === "object" && value !== null && !Array.isArray(value)) {
150
+ result.push(key, ...flattenObject(value));
151
+ } else {
152
+ result.push(key, value === null ? "null" : String(value));
153
+ }
154
+ }
155
+ return result;
156
+ };
157
+ const values = flattenObject(paramValue).join(",");
158
+ harRequest.cookies.push({ name: param.name, value: values });
159
+ } else {
160
+ harRequest.cookies.push({ name: param.name, value: paramValue === null ? "null" : String(paramValue) });
161
+ }
162
+ }
81
163
  break;
82
164
  }
83
165
  }
84
166
  return {
85
167
  url: newUrl,
86
168
  headers: newHeaders,
87
- queryString: newQueryString
169
+ queryString: newQueryString,
170
+ cookies: harRequest.cookies
88
171
  };
89
172
  };
90
173
  const processPathParameters = (url, param, paramValue, style, explode) => {
@@ -156,6 +239,7 @@ const processPathParameters = (url, param, paramValue, style, explode) => {
156
239
  }
157
240
  };
158
241
  export {
242
+ deReferenceParams,
159
243
  processParameters
160
244
  };
161
245
  //# sourceMappingURL=process-parameters.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/helpers/operation-to-har/process-parameters.ts"],
4
- "sourcesContent": ["import type { OpenAPIV3_1 } from '@scalar/openapi-types'\nimport type { Request as HarRequest } from 'har-format'\n\ntype ProcessedParameters = {\n url: string\n headers: HarRequest['headers']\n queryString: HarRequest['queryString']\n}\n\n/**\n * Process OpenAPI parameters and return the updated properties.\n * Handles path, query, and header parameters with various styles and explode options.\n *\n * @see https://spec.openapis.org/oas/latest.html#style-values\n */\nexport const processParameters = (\n harRequest: HarRequest,\n parameters: OpenAPIV3_1.ParameterObject[],\n example?: unknown,\n): ProcessedParameters => {\n // Create copies of the arrays to avoid modifying the input\n const newHeaders = [...harRequest.headers]\n const newQueryString = [...harRequest.queryString]\n let newUrl = harRequest.url\n\n for (const param of parameters) {\n if (!param.in || !param.name) {\n continue\n }\n\n const paramValue =\n example && typeof example === 'object' ? (example as Record<string, unknown>)[param.name] : undefined\n\n if (paramValue === undefined) {\n continue\n }\n\n const style = param.style || 'simple'\n const explode = param.explode ?? false\n\n switch (param.in) {\n case 'path': {\n newUrl = processPathParameters(newUrl, param, paramValue, style, explode)\n break\n }\n case 'query': {\n // Handle query parameters\n switch (style) {\n case 'form': {\n if (explode) {\n // Form explode array: color=blue&color=black&color=brown\n if (Array.isArray(paramValue)) {\n for (const value of paramValue as unknown[]) {\n newQueryString.push({ name: param.name, value: String(value) })\n }\n }\n // Form explode object: R=100&G=200&B=150\n else if (typeof paramValue === 'object' && paramValue !== null) {\n for (const [key, value] of Object.entries(paramValue as Record<string, unknown>)) {\n newQueryString.push({ name: key, value: String(value) })\n }\n }\n // Form explode primitive: color=blue\n else {\n newQueryString.push({ name: param.name, value: String(paramValue) })\n }\n } else {\n // Form no explode array: color=blue,black,brown\n if (Array.isArray(paramValue)) {\n newQueryString.push({ name: param.name, value: (paramValue as unknown[]).join(',') })\n }\n // Form no explode object: color=R,100,G,200,B,150\n else if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n newQueryString.push({ name: param.name, value: values })\n }\n // Form no explode primitive: color=blue\n else {\n newQueryString.push({ name: param.name, value: String(paramValue) })\n }\n }\n break\n }\n case 'spaceDelimited': {\n // SpaceDelimited array: color=blue black brown\n if (Array.isArray(paramValue)) {\n newQueryString.push({ name: param.name, value: (paramValue as unknown[]).join(' ') })\n }\n // SpaceDelimited object: color=R 100 G 200 B 150\n else if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k} ${v}`)\n .join(' ')\n newQueryString.push({ name: param.name, value: values })\n }\n break\n }\n case 'pipeDelimited': {\n // PipeDelimited array: color=blue|black|brown\n if (Array.isArray(paramValue)) {\n newQueryString.push({ name: param.name, value: (paramValue as unknown[]).join('|') })\n }\n // PipeDelimited object: color=R|100|G|200|B|150\n else if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .flat()\n .join('|')\n newQueryString.push({ name: param.name, value: values })\n }\n break\n }\n case 'deepObject': {\n // DeepObject: color[R]=100&color[G]=200&color[B]=150\n if (explode && typeof paramValue === 'object' && paramValue !== null) {\n for (const [key, value] of Object.entries(paramValue as Record<string, unknown>)) {\n newQueryString.push({ name: `${param.name}[${key}]`, value: String(value) })\n }\n }\n break\n }\n\n // Default to form style\n default:\n newQueryString.push({ name: param.name, value: String(paramValue) })\n }\n break\n }\n case 'header':\n newHeaders.push({ name: param.name, value: String(paramValue) })\n break\n }\n }\n\n return {\n url: newUrl,\n headers: newHeaders,\n queryString: newQueryString,\n }\n}\n\n/**\n * Process path parameters according to OpenAPI specification.\n * Handles matrix, label, and simple styles with explode options.\n *\n * @param url - The URL to process\n * @param param - The parameter object\n * @param paramValue - The value of the parameter\n * @param style - The style of the parameter (matrix, label, simple)\n * @param explode - Whether to explode the parameter\n * @returns The updated URL with processed path parameters\n */\nconst processPathParameters = (\n url: string,\n param: OpenAPIV3_1.ParameterObject,\n paramValue: unknown,\n style: string,\n explode: boolean,\n): string => {\n switch (style) {\n case 'matrix': {\n if (explode) {\n // Matrix explode array: ;color=blue;color=black;color=brown\n if (Array.isArray(paramValue)) {\n const values = (paramValue as unknown[]).map((v) => `${param.name}=${v}`).join(';')\n return url.replace(`{;${param.name}}`, `;${values}`)\n }\n\n // Matrix explode object: ;R=100;G=200;B=150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k}=${v}`)\n .join(';')\n return url.replace(`{;${param.name}}`, `;${values}`)\n }\n\n // Matrix explode primitive: ;color=blue\n return url.replace(`{;${param.name}}`, `;${param.name}=${paramValue}`)\n }\n\n // Matrix no explode array: ;color=blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{;${param.name}}`, `;${param.name}=${(paramValue as unknown[]).join(',')}`)\n }\n\n // Matrix no explode object: ;color=R,100,G,200,B,150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n return url.replace(`{;${param.name}}`, `;${param.name}=${values}`)\n }\n\n // Matrix no explode primitive: ;color=blue\n return url.replace(`{;${param.name}}`, `;${param.name}=${paramValue}`)\n }\n case 'label': {\n if (explode) {\n // Label explode array: .blue.black.brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{.${param.name}}`, `.${(paramValue as unknown[]).join('.')}`)\n }\n\n // Label explode object: .R=100.G=200.B=150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k}=${v}`)\n .join('.')\n\n return url.replace(`{.${param.name}}`, `.${values}`)\n }\n\n // Label explode primitive: .blue\n return url.replace(`{.${param.name}}`, `.${paramValue}`)\n }\n\n // Label no explode array: .blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{.${param.name}}`, `.${(paramValue as unknown[]).join(',')}`)\n }\n\n // Label no explode object: .R,100,G,200,B,150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n\n return url.replace(`{.${param.name}}`, `.${values}`)\n }\n\n // Label no explode primitive: .blue\n return url.replace(`{.${param.name}}`, `.${paramValue}`)\n }\n\n case 'simple': {\n if (explode) {\n // Simple explode array: blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{${param.name}}`, (paramValue as unknown[]).join(','))\n }\n\n // Simple explode object: R=100,G=200,B=150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k}=${v}`)\n .join(',')\n\n return url.replace(`{${param.name}}`, values)\n }\n\n // Simple explode primitive: blue\n return url.replace(`{${param.name}}`, String(paramValue))\n }\n // Simple no explode array: blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{${param.name}}`, (paramValue as unknown[]).join(','))\n }\n\n // Simple no explode object: R,100,G,200,B,150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n\n return url.replace(`{${param.name}}`, values)\n }\n\n // Simple no explode primitive: blue\n return url.replace(`{${param.name}}`, String(paramValue))\n }\n\n // Default to simple style\n default:\n return url.replace(`{${param.name}}`, String(paramValue))\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
4
+ "sourcesContent": ["import type { ParameterObject } from '@scalar/workspace-store/schemas/v3.1/strict/parameter'\nimport type { OperationObject } from '@scalar/workspace-store/schemas/v3.1/strict/path-operations'\nimport type { ReferenceObject } from '@scalar/workspace-store/schemas/v3.1/strict/reference'\nimport { isReference, type Dereference } from '@scalar/workspace-store/schemas/v3.1/type-guard'\nimport type { Request as HarRequest } from 'har-format'\n\ntype ProcessedParameters = {\n url: string\n headers: HarRequest['headers']\n queryString: HarRequest['queryString']\n cookies: HarRequest['cookies']\n}\n\n/** Ensures we don't have any references in the parameters */\nexport const deReferenceParams = (params: Dereference<OperationObject>['parameters']): ParameterObject[] => {\n if (isReference(params)) {\n return []\n }\n return (params ?? []).filter((param) => !isReference(param)) as ParameterObject[]\n}\n\n/**\n * Get the style and explode values for a parameter according to OpenAPI 3.1.1 specification.\n * Handles defaults and validation for parameter location restrictions.\n */\nconst getParameterStyleAndExplode = (param: ParameterObject): { style: string; explode: boolean } => {\n // Headers only support 'simple' style\n if (param.in === 'header') {\n const explode = 'explode' in param && param.explode !== undefined ? param.explode : false\n return { style: 'simple', explode }\n }\n\n // Cookies only support 'form' style\n if (param.in === 'cookie') {\n const explode = 'explode' in param && param.explode !== undefined ? param.explode : true\n return { style: 'form', explode }\n }\n\n const defaultStyle = {\n path: 'simple',\n query: 'form',\n header: 'simple',\n cookie: 'form',\n }[param.in]\n\n // Use provided style or default based on location\n const style = 'style' in param && param.style ? param.style : defaultStyle\n\n // Determine explode value: use provided value or default based on style\n const explode = 'explode' in param && param.explode !== undefined ? param.explode : style === 'form'\n\n return { style, explode }\n}\n\n/**\n * Process OpenAPI parameters and return the updated properties.\n * Handles path, query, and header parameters with various styles and explode options.\n *\n * @see https://spec.openapis.org/oas/latest.html#style-values\n */\nexport const processParameters = (\n harRequest: HarRequest,\n parameters: (ParameterObject | ReferenceObject)[],\n example?: unknown,\n): ProcessedParameters => {\n // Create copies of the arrays to avoid modifying the input\n const newHeaders = [...harRequest.headers]\n const newQueryString = [...harRequest.queryString]\n let newUrl = harRequest.url\n\n // Filter out references\n const deReferencedParams = deReferenceParams(parameters)\n\n for (const param of deReferencedParams) {\n if (!param.in || !param.name) {\n continue\n }\n\n const paramValue =\n example && typeof example === 'object' ? (example as Record<string, unknown>)[param.name] : undefined\n\n if (paramValue === undefined) {\n continue\n }\n\n const { style, explode } = getParameterStyleAndExplode(param)\n\n switch (param.in) {\n case 'path': {\n newUrl = processPathParameters(newUrl, param, paramValue, style, explode)\n break\n }\n case 'query': {\n // Handle query parameters\n switch (style) {\n case 'form': {\n if (explode) {\n // Form explode array: color=blue&color=black&color=brown\n if (Array.isArray(paramValue)) {\n for (const value of paramValue as unknown[]) {\n newQueryString.push({ name: param.name, value: String(value) })\n }\n }\n // Form explode object: R=100&G=200&B=150\n else if (typeof paramValue === 'object' && paramValue !== null) {\n for (const [key, value] of Object.entries(paramValue as Record<string, unknown>)) {\n newQueryString.push({ name: key, value: String(value) })\n }\n }\n // Form explode primitive: color=blue\n else {\n newQueryString.push({ name: param.name, value: String(paramValue) })\n }\n } else {\n // Form no explode array: color=blue,black,brown\n if (Array.isArray(paramValue)) {\n newQueryString.push({ name: param.name, value: (paramValue as unknown[]).join(',') })\n }\n // Form no explode object: color=R,100,G,200,B,150\n else if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n newQueryString.push({ name: param.name, value: values })\n }\n // Form no explode primitive: color=blue\n else {\n newQueryString.push({ name: param.name, value: String(paramValue) })\n }\n }\n break\n }\n case 'spaceDelimited': {\n // SpaceDelimited array: color=blue black brown\n if (Array.isArray(paramValue)) {\n newQueryString.push({ name: param.name, value: (paramValue as unknown[]).join(' ') })\n }\n // SpaceDelimited object: color=R 100 G 200 B 150\n else if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k} ${v}`)\n .join(' ')\n newQueryString.push({ name: param.name, value: values })\n }\n break\n }\n case 'pipeDelimited': {\n // PipeDelimited array: color=blue|black|brown\n if (Array.isArray(paramValue)) {\n newQueryString.push({ name: param.name, value: (paramValue as unknown[]).join('|') })\n }\n // PipeDelimited object: color=R|100|G|200|B|150\n else if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .flat()\n .join('|')\n newQueryString.push({ name: param.name, value: values })\n }\n break\n }\n case 'deepObject': {\n // DeepObject: color[R]=100&color[G]=200&color[B]=150\n if (explode && typeof paramValue === 'object' && paramValue !== null) {\n for (const [key, value] of Object.entries(paramValue as Record<string, unknown>)) {\n newQueryString.push({ name: `${param.name}[${key}]`, value: String(value) })\n }\n }\n break\n }\n\n // Default to form style\n default:\n newQueryString.push({ name: param.name, value: String(paramValue) })\n }\n break\n }\n case 'header':\n // Headers only support 'simple' style according to OpenAPI 3.1.1\n if (explode) {\n // Simple explode array: multiple header values\n if (Array.isArray(paramValue)) {\n for (const value of paramValue as unknown[]) {\n newHeaders.push({ name: param.name, value: String(value) })\n }\n }\n // Simple explode object: key=value pairs\n else if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k}=${v}`)\n .join(',')\n newHeaders.push({ name: param.name, value: values })\n }\n // Simple explode primitive: single value\n else {\n newHeaders.push({ name: param.name, value: String(paramValue) })\n }\n }\n // Simple no explode: all values joined with commas\n else {\n // Handle array values without explode\n if (Array.isArray(paramValue)) {\n newHeaders.push({ name: param.name, value: (paramValue as unknown[]).join(',') })\n }\n // Handle object values without explode\n else if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n newHeaders.push({ name: param.name, value: values })\n }\n // Handle primitive values without explode\n else {\n newHeaders.push({ name: param.name, value: String(paramValue) })\n }\n }\n break\n case 'cookie':\n // Cookies only support 'form' style according to OpenAPI 3.1.1\n if (explode) {\n // Handle array values with explode\n if (Array.isArray(paramValue)) {\n for (const value of paramValue as unknown[]) {\n harRequest.cookies.push({ name: param.name, value: value === null ? 'null' : String(value) })\n }\n }\n // Handle object values with explode\n else if (typeof paramValue === 'object' && paramValue !== null) {\n for (const [key, value] of Object.entries(paramValue as Record<string, unknown>)) {\n harRequest.cookies.push({ name: key, value: value === null ? 'null' : String(value) })\n }\n }\n // Handle primitive values with explode\n else {\n harRequest.cookies.push({ name: param.name, value: paramValue === null ? 'null' : String(paramValue) })\n }\n } else {\n // Handle array values without explode\n if (Array.isArray(paramValue)) {\n const serializedValues = (paramValue as unknown[]).map((v) => (v === null ? 'null' : String(v))).join(',')\n harRequest.cookies.push({ name: param.name, value: serializedValues })\n }\n // Handle object values without explode\n else if (typeof paramValue === 'object' && paramValue !== null) {\n // Handle nested objects by recursively flattening them\n const flattenObject = (obj: Record<string, unknown>): string[] => {\n const result: string[] = []\n\n for (const [key, value] of Object.entries(obj)) {\n // Recursively flatten nested objects\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n result.push(key, ...flattenObject(value as Record<string, unknown>))\n }\n // Handle primitive values\n else {\n result.push(key, value === null ? 'null' : String(value))\n }\n }\n\n return result\n }\n\n const values = flattenObject(paramValue as Record<string, unknown>).join(',')\n harRequest.cookies.push({ name: param.name, value: values })\n }\n // Handle primitive values without explode\n else {\n harRequest.cookies.push({ name: param.name, value: paramValue === null ? 'null' : String(paramValue) })\n }\n }\n break\n }\n }\n\n return {\n url: newUrl,\n headers: newHeaders,\n queryString: newQueryString,\n cookies: harRequest.cookies,\n }\n}\n\n/**\n * Process path parameters according to OpenAPI specification.\n * Handles matrix, label, and simple styles with explode options.\n *\n * @param url - The URL to process\n * @param param - The parameter object\n * @param paramValue - The value of the parameter\n * @param style - The style of the parameter (matrix, label, simple)\n * @param explode - Whether to explode the parameter\n * @returns The updated URL with processed path parameters\n */\nconst processPathParameters = (\n url: string,\n param: ParameterObject,\n paramValue: unknown,\n style: string,\n explode: boolean,\n): string => {\n switch (style) {\n case 'matrix': {\n if (explode) {\n // Matrix explode array: ;color=blue;color=black;color=brown\n if (Array.isArray(paramValue)) {\n const values = (paramValue as unknown[]).map((v) => `${param.name}=${v}`).join(';')\n return url.replace(`{;${param.name}}`, `;${values}`)\n }\n\n // Matrix explode object: ;R=100;G=200;B=150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k}=${v}`)\n .join(';')\n return url.replace(`{;${param.name}}`, `;${values}`)\n }\n\n // Matrix explode primitive: ;color=blue\n return url.replace(`{;${param.name}}`, `;${param.name}=${paramValue}`)\n }\n\n // Matrix no explode array: ;color=blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{;${param.name}}`, `;${param.name}=${(paramValue as unknown[]).join(',')}`)\n }\n\n // Matrix no explode object: ;color=R,100,G,200,B,150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n return url.replace(`{;${param.name}}`, `;${param.name}=${values}`)\n }\n\n // Matrix no explode primitive: ;color=blue\n return url.replace(`{;${param.name}}`, `;${param.name}=${paramValue}`)\n }\n case 'label': {\n if (explode) {\n // Label explode array: .blue.black.brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{.${param.name}}`, `.${(paramValue as unknown[]).join('.')}`)\n }\n\n // Label explode object: .R=100.G=200.B=150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k}=${v}`)\n .join('.')\n\n return url.replace(`{.${param.name}}`, `.${values}`)\n }\n\n // Label explode primitive: .blue\n return url.replace(`{.${param.name}}`, `.${paramValue}`)\n }\n\n // Label no explode array: .blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{.${param.name}}`, `.${(paramValue as unknown[]).join(',')}`)\n }\n\n // Label no explode object: .R,100,G,200,B,150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n\n return url.replace(`{.${param.name}}`, `.${values}`)\n }\n\n // Label no explode primitive: .blue\n return url.replace(`{.${param.name}}`, `.${paramValue}`)\n }\n\n case 'simple': {\n if (explode) {\n // Simple explode array: blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{${param.name}}`, (paramValue as unknown[]).join(','))\n }\n\n // Simple explode object: R=100,G=200,B=150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k}=${v}`)\n .join(',')\n\n return url.replace(`{${param.name}}`, values)\n }\n\n // Simple explode primitive: blue\n return url.replace(`{${param.name}}`, String(paramValue))\n }\n // Simple no explode array: blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{${param.name}}`, (paramValue as unknown[]).join(','))\n }\n\n // Simple no explode object: R,100,G,200,B,150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n\n return url.replace(`{${param.name}}`, values)\n }\n\n // Simple no explode primitive: blue\n return url.replace(`{${param.name}}`, String(paramValue))\n }\n\n // Default to simple style\n default:\n return url.replace(`{${param.name}}`, String(paramValue))\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["explode"]
7
7
  }
@@ -1,4 +1,4 @@
1
- import type { OpenAPIV3_1 } from '@scalar/openapi-types';
1
+ import type { SecuritySchemeObject } from '@scalar/workspace-store/schemas/v3.1/strict/security-scheme';
2
2
  import type { Request as HarRequest } from 'har-format';
3
3
  type ProcessedSecuritySchemesReturn = {
4
4
  headers: HarRequest['headers'];
@@ -7,7 +7,9 @@ type ProcessedSecuritySchemesReturn = {
7
7
  };
8
8
  /**
9
9
  * Process security schemes into whichever parameters they are applicable to
10
+ *
11
+ * TODO: we probably want to be able to disable YOUR_SECRET_TOKEN placeholder text + or allow it to be customzied
10
12
  */
11
- export declare const processSecuritySchemes: (securitySchemes: OpenAPIV3_1.SecuritySchemeObject[]) => ProcessedSecuritySchemesReturn;
13
+ export declare const processSecuritySchemes: (securitySchemes: SecuritySchemeObject[]) => ProcessedSecuritySchemesReturn;
12
14
  export {};
13
15
  //# sourceMappingURL=process-security-schemes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"process-security-schemes.d.ts","sourceRoot":"","sources":["../../../src/helpers/operation-to-har/process-security-schemes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvD,KAAK,8BAA8B,GAAG;IACpC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;IAC9B,WAAW,EAAE,UAAU,CAAC,aAAa,CAAC,CAAA;IACtC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;CAC/B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,oBAChB,WAAW,CAAC,oBAAoB,EAAE,KAClD,8BA4EF,CAAA"}
1
+ {"version":3,"file":"process-security-schemes.d.ts","sourceRoot":"","sources":["../../../src/helpers/operation-to-har/process-security-schemes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6DAA6D,CAAA;AACvG,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvD,KAAK,8BAA8B,GAAG;IACpC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;IAC9B,WAAW,EAAE,UAAU,CAAC,aAAa,CAAC,CAAA;IACtC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;CAC/B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,oBAAqB,oBAAoB,EAAE,KAAG,8BAuEhF,CAAA"}
@@ -6,8 +6,8 @@ const processSecuritySchemes = (securitySchemes) => {
6
6
  };
7
7
  for (const scheme of securitySchemes) {
8
8
  if (scheme.type === "apiKey") {
9
- const value = scheme["x-scalar-secret-token"];
10
- if (!value || !scheme.name) {
9
+ const value = scheme["x-scalar-secret-token"] || "YOUR_SECRET_TOKEN";
10
+ if (!scheme.name) {
11
11
  continue;
12
12
  }
13
13
  const param = { name: scheme.name, value };
@@ -26,21 +26,16 @@ const processSecuritySchemes = (securitySchemes) => {
26
26
  }
27
27
  if (scheme.type === "http") {
28
28
  if (scheme.scheme === "basic") {
29
- const username = scheme["x-scalar-secret-username"];
30
- const password = scheme["x-scalar-secret-password"];
31
- if (!username && !password) {
32
- continue;
33
- }
34
- const auth = Buffer.from(`${username}:${password}`).toString("base64");
29
+ const username = scheme["x-scalar-secret-username"] || "";
30
+ const password = scheme["x-scalar-secret-password"] || "";
31
+ const value = `${username}:${password}`;
32
+ const auth = value === ":" ? "username:password" : Buffer.from(value).toString("base64");
35
33
  result.headers.push({
36
34
  name: "Authorization",
37
35
  value: `Basic ${auth}`
38
36
  });
39
37
  } else if (scheme.scheme === "bearer") {
40
- const token = scheme["x-scalar-secret-token"];
41
- if (!token) {
42
- continue;
43
- }
38
+ const token = scheme["x-scalar-secret-token"] || "YOUR_SECRET_TOKEN";
44
39
  result.headers.push({
45
40
  name: "Authorization",
46
41
  value: `Bearer ${token}`
@@ -49,11 +44,9 @@ const processSecuritySchemes = (securitySchemes) => {
49
44
  continue;
50
45
  }
51
46
  if (scheme.type === "oauth2" && scheme.flows) {
52
- const flow = Object.values(scheme.flows).find((f) => f["x-scalar-secret-token"]);
53
- const token = flow?.["x-scalar-secret-token"];
54
- if (!token) {
55
- continue;
56
- }
47
+ const flows = Object.values(scheme.flows);
48
+ const flow = flows.find((f) => f["x-scalar-secret-token"]);
49
+ const token = flow?.["x-scalar-secret-token"] || "YOUR_SECRET_TOKEN";
57
50
  result.headers.push({
58
51
  name: "Authorization",
59
52
  value: `Bearer ${token}`
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/helpers/operation-to-har/process-security-schemes.ts"],
4
- "sourcesContent": ["import type { OpenAPIV3_1 } from '@scalar/openapi-types'\nimport type { Request as HarRequest } from 'har-format'\n\ntype ProcessedSecuritySchemesReturn = {\n headers: HarRequest['headers']\n queryString: HarRequest['queryString']\n cookies: HarRequest['cookies']\n}\n\n/**\n * Process security schemes into whichever parameters they are applicable to\n */\nexport const processSecuritySchemes = (\n securitySchemes: OpenAPIV3_1.SecuritySchemeObject[],\n): ProcessedSecuritySchemesReturn => {\n const result: ProcessedSecuritySchemesReturn = {\n headers: [],\n queryString: [],\n cookies: [],\n }\n\n for (const scheme of securitySchemes) {\n // Handle apiKey type\n if (scheme.type === 'apiKey') {\n const value = scheme['x-scalar-secret-token']\n if (!value || !scheme.name) {\n continue\n }\n\n const param = { name: scheme.name, value }\n\n switch (scheme.in) {\n case 'header':\n result.headers.push(param as HarRequest['headers'][0])\n break\n case 'query':\n result.queryString.push(param as HarRequest['queryString'][0])\n break\n case 'cookie':\n result.cookies.push(param as HarRequest['cookies'][0])\n break\n }\n continue\n }\n\n // Handle http type\n if (scheme.type === 'http') {\n if (scheme.scheme === 'basic') {\n const username = scheme['x-scalar-secret-username']\n const password = scheme['x-scalar-secret-password']\n if (!username && !password) {\n continue\n }\n\n const auth = Buffer.from(`${username}:${password}`).toString('base64')\n result.headers.push({\n name: 'Authorization',\n value: `Basic ${auth}`,\n })\n } else if (scheme.scheme === 'bearer') {\n const token = scheme['x-scalar-secret-token']\n if (!token) {\n continue\n }\n\n result.headers.push({\n name: 'Authorization',\n value: `Bearer ${token}`,\n })\n }\n continue\n }\n\n // Handle oauth2 type\n if (scheme.type === 'oauth2' && scheme.flows) {\n // Find the first flow with a token\n const flow = Object.values(scheme.flows).find((f) => f['x-scalar-secret-token'])\n const token = flow?.['x-scalar-secret-token']\n if (!token) {\n continue\n }\n\n result.headers.push({\n name: 'Authorization',\n value: `Bearer ${token}`,\n })\n }\n }\n\n return result\n}\n"],
5
- "mappings": "AAYO,MAAM,yBAAyB,CACpC,oBACmC;AACnC,QAAM,SAAyC;AAAA,IAC7C,SAAS,CAAC;AAAA,IACV,aAAa,CAAC;AAAA,IACd,SAAS,CAAC;AAAA,EACZ;AAEA,aAAW,UAAU,iBAAiB;AAEpC,QAAI,OAAO,SAAS,UAAU;AAC5B,YAAM,QAAQ,OAAO,uBAAuB;AAC5C,UAAI,CAAC,SAAS,CAAC,OAAO,MAAM;AAC1B;AAAA,MACF;AAEA,YAAM,QAAQ,EAAE,MAAM,OAAO,MAAM,MAAM;AAEzC,cAAQ,OAAO,IAAI;AAAA,QACjB,KAAK;AACH,iBAAO,QAAQ,KAAK,KAAiC;AACrD;AAAA,QACF,KAAK;AACH,iBAAO,YAAY,KAAK,KAAqC;AAC7D;AAAA,QACF,KAAK;AACH,iBAAO,QAAQ,KAAK,KAAiC;AACrD;AAAA,MACJ;AACA;AAAA,IACF;AAGA,QAAI,OAAO,SAAS,QAAQ;AAC1B,UAAI,OAAO,WAAW,SAAS;AAC7B,cAAM,WAAW,OAAO,0BAA0B;AAClD,cAAM,WAAW,OAAO,0BAA0B;AAClD,YAAI,CAAC,YAAY,CAAC,UAAU;AAC1B;AAAA,QACF;AAEA,cAAM,OAAO,OAAO,KAAK,GAAG,QAAQ,IAAI,QAAQ,EAAE,EAAE,SAAS,QAAQ;AACrE,eAAO,QAAQ,KAAK;AAAA,UAClB,MAAM;AAAA,UACN,OAAO,SAAS,IAAI;AAAA,QACtB,CAAC;AAAA,MACH,WAAW,OAAO,WAAW,UAAU;AACrC,cAAM,QAAQ,OAAO,uBAAuB;AAC5C,YAAI,CAAC,OAAO;AACV;AAAA,QACF;AAEA,eAAO,QAAQ,KAAK;AAAA,UAClB,MAAM;AAAA,UACN,OAAO,UAAU,KAAK;AAAA,QACxB,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAGA,QAAI,OAAO,SAAS,YAAY,OAAO,OAAO;AAE5C,YAAM,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,uBAAuB,CAAC;AAC/E,YAAM,QAAQ,OAAO,uBAAuB;AAC5C,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AAEA,aAAO,QAAQ,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,OAAO,UAAU,KAAK;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;",
4
+ "sourcesContent": ["import type { SecuritySchemeObject } from '@scalar/workspace-store/schemas/v3.1/strict/security-scheme'\nimport type { Request as HarRequest } from 'har-format'\n\ntype ProcessedSecuritySchemesReturn = {\n headers: HarRequest['headers']\n queryString: HarRequest['queryString']\n cookies: HarRequest['cookies']\n}\n\n/**\n * Process security schemes into whichever parameters they are applicable to\n *\n * TODO: we probably want to be able to disable YOUR_SECRET_TOKEN placeholder text + or allow it to be customzied\n */\nexport const processSecuritySchemes = (securitySchemes: SecuritySchemeObject[]): ProcessedSecuritySchemesReturn => {\n const result: ProcessedSecuritySchemesReturn = {\n headers: [],\n queryString: [],\n cookies: [],\n }\n\n for (const scheme of securitySchemes) {\n // Handle apiKey type\n if (scheme.type === 'apiKey') {\n const value = (scheme['x-scalar-secret-token'] || 'YOUR_SECRET_TOKEN') as string\n if (!scheme.name) {\n continue\n }\n\n const param = { name: scheme.name, value }\n\n switch (scheme.in) {\n case 'header':\n result.headers.push(param)\n break\n case 'query':\n result.queryString.push(param)\n break\n case 'cookie':\n result.cookies.push(param)\n break\n }\n continue\n }\n\n // Handle http type\n if (scheme.type === 'http') {\n if (scheme.scheme === 'basic') {\n const username = scheme['x-scalar-secret-username'] || ''\n const password = scheme['x-scalar-secret-password'] || ''\n\n const value = `${username}:${password}`\n const auth = value === ':' ? 'username:password' : Buffer.from(value).toString('base64')\n\n result.headers.push({\n name: 'Authorization',\n value: `Basic ${auth}`,\n })\n } else if (scheme.scheme === 'bearer') {\n const token = scheme['x-scalar-secret-token'] || 'YOUR_SECRET_TOKEN'\n\n result.headers.push({\n name: 'Authorization',\n value: `Bearer ${token}`,\n })\n }\n continue\n }\n\n // Handle oauth2 type\n if (scheme.type === 'oauth2' && scheme.flows) {\n const flows = Object.values(scheme.flows)\n\n // Find the first flow with a token\n const flow = flows.find((f) => f['x-scalar-secret-token'])\n const token = flow?.['x-scalar-secret-token'] || 'YOUR_SECRET_TOKEN'\n\n result.headers.push({\n name: 'Authorization',\n value: `Bearer ${token}`,\n })\n }\n }\n\n return result\n}\n"],
5
+ "mappings": "AAcO,MAAM,yBAAyB,CAAC,oBAA4E;AACjH,QAAM,SAAyC;AAAA,IAC7C,SAAS,CAAC;AAAA,IACV,aAAa,CAAC;AAAA,IACd,SAAS,CAAC;AAAA,EACZ;AAEA,aAAW,UAAU,iBAAiB;AAEpC,QAAI,OAAO,SAAS,UAAU;AAC5B,YAAM,QAAS,OAAO,uBAAuB,KAAK;AAClD,UAAI,CAAC,OAAO,MAAM;AAChB;AAAA,MACF;AAEA,YAAM,QAAQ,EAAE,MAAM,OAAO,MAAM,MAAM;AAEzC,cAAQ,OAAO,IAAI;AAAA,QACjB,KAAK;AACH,iBAAO,QAAQ,KAAK,KAAK;AACzB;AAAA,QACF,KAAK;AACH,iBAAO,YAAY,KAAK,KAAK;AAC7B;AAAA,QACF,KAAK;AACH,iBAAO,QAAQ,KAAK,KAAK;AACzB;AAAA,MACJ;AACA;AAAA,IACF;AAGA,QAAI,OAAO,SAAS,QAAQ;AAC1B,UAAI,OAAO,WAAW,SAAS;AAC7B,cAAM,WAAW,OAAO,0BAA0B,KAAK;AACvD,cAAM,WAAW,OAAO,0BAA0B,KAAK;AAEvD,cAAM,QAAQ,GAAG,QAAQ,IAAI,QAAQ;AACrC,cAAM,OAAO,UAAU,MAAM,sBAAsB,OAAO,KAAK,KAAK,EAAE,SAAS,QAAQ;AAEvF,eAAO,QAAQ,KAAK;AAAA,UAClB,MAAM;AAAA,UACN,OAAO,SAAS,IAAI;AAAA,QACtB,CAAC;AAAA,MACH,WAAW,OAAO,WAAW,UAAU;AACrC,cAAM,QAAQ,OAAO,uBAAuB,KAAK;AAEjD,eAAO,QAAQ,KAAK;AAAA,UAClB,MAAM;AAAA,UACN,OAAO,UAAU,KAAK;AAAA,QACxB,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAGA,QAAI,OAAO,SAAS,YAAY,OAAO,OAAO;AAC5C,YAAM,QAAQ,OAAO,OAAO,OAAO,KAAK;AAGxC,YAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,uBAAuB,CAAC;AACzD,YAAM,QAAQ,OAAO,uBAAuB,KAAK;AAEjD,aAAO,QAAQ,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,OAAO,UAAU,KAAK;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,6 @@
1
- import type { OpenAPIV3_1 } from '@scalar/openapi-types';
1
+ import type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/server';
2
2
  /**
3
3
  * Processes a server URL by replacing variables with their default values and merging with the path
4
4
  */
5
- export declare const processServerUrl: (server: OpenAPIV3_1.ServerObject, path: string) => string;
5
+ export declare const processServerUrl: (server: ServerObject, path: string) => string;
6
6
  //# sourceMappingURL=process-server-url.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"process-server-url.d.ts","sourceRoot":"","sources":["../../../src/helpers/operation-to-har/process-server-url.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGxD;;GAEG;AACH,eAAO,MAAM,gBAAgB,WAAY,WAAW,CAAC,YAAY,QAAQ,MAAM,KAAG,MA4BjF,CAAA"}
1
+ {"version":3,"file":"process-server-url.d.ts","sourceRoot":"","sources":["../../../src/helpers/operation-to-har/process-server-url.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oDAAoD,CAAA;AAEtF;;GAEG;AACH,eAAO,MAAM,gBAAgB,WAAY,YAAY,QAAQ,MAAM,KAAG,MA4BrE,CAAA"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/helpers/operation-to-har/process-server-url.ts"],
4
- "sourcesContent": ["import { mergeUrls } from '@scalar/helpers/url/merge-urls'\nimport type { OpenAPIV3_1 } from '@scalar/openapi-types'\nimport { replaceVariables } from '@scalar/helpers/regex/replace-variables'\n\n/**\n * Processes a server URL by replacing variables with their default values and merging with the path\n */\nexport const processServerUrl = (server: OpenAPIV3_1.ServerObject, path: string): string => {\n if (!server.url) {\n return path\n }\n const serverUrl = server.url\n\n // Replace server variables with their default values\n if (server.variables) {\n const variables = Object.entries(server.variables)\n\n // Extract default values from server variables\n const defaultValues = variables.reduce(\n (defaults, [variableName, variableConfig]) => {\n if (variableConfig.default !== undefined) {\n defaults[variableName] = variableConfig.default\n }\n return defaults\n },\n {} as Record<string, string | number>,\n )\n\n // Replace variables in the server URL with their default values\n const serverUrlWithVars = replaceVariables(serverUrl, defaultValues)\n\n return mergeUrls(serverUrlWithVars, path)\n }\n\n return mergeUrls(serverUrl, path)\n}\n"],
5
- "mappings": "AAAA,SAAS,iBAAiB;AAE1B,SAAS,wBAAwB;AAK1B,MAAM,mBAAmB,CAAC,QAAkC,SAAyB;AAC1F,MAAI,CAAC,OAAO,KAAK;AACf,WAAO;AAAA,EACT;AACA,QAAM,YAAY,OAAO;AAGzB,MAAI,OAAO,WAAW;AACpB,UAAM,YAAY,OAAO,QAAQ,OAAO,SAAS;AAGjD,UAAM,gBAAgB,UAAU;AAAA,MAC9B,CAAC,UAAU,CAAC,cAAc,cAAc,MAAM;AAC5C,YAAI,eAAe,YAAY,QAAW;AACxC,mBAAS,YAAY,IAAI,eAAe;AAAA,QAC1C;AACA,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AAGA,UAAM,oBAAoB,iBAAiB,WAAW,aAAa;AAEnE,WAAO,UAAU,mBAAmB,IAAI;AAAA,EAC1C;AAEA,SAAO,UAAU,WAAW,IAAI;AAClC;",
4
+ "sourcesContent": ["import { mergeUrls } from '@scalar/helpers/url/merge-urls'\nimport { replaceVariables } from '@scalar/helpers/regex/replace-variables'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/server'\n\n/**\n * Processes a server URL by replacing variables with their default values and merging with the path\n */\nexport const processServerUrl = (server: ServerObject, path: string): string => {\n if (!server.url) {\n return path\n }\n const serverUrl = server.url\n\n // Replace server variables with their default values\n if (server.variables) {\n const variables = Object.entries(server.variables)\n\n // Extract default values from server variables\n const defaultValues = variables.reduce(\n (defaults, [variableName, variableConfig]) => {\n if (variableConfig.default !== undefined) {\n defaults[variableName] = variableConfig.default\n }\n return defaults\n },\n {} as Record<string, string | number>,\n )\n\n // Replace variables in the server URL with their default values\n const serverUrlWithVars = replaceVariables(serverUrl, defaultValues)\n\n return mergeUrls(serverUrlWithVars, path)\n }\n\n return mergeUrls(serverUrl, path)\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAC1B,SAAS,wBAAwB;AAM1B,MAAM,mBAAmB,CAAC,QAAsB,SAAyB;AAC9E,MAAI,CAAC,OAAO,KAAK;AACf,WAAO;AAAA,EACT;AACA,QAAM,YAAY,OAAO;AAGzB,MAAI,OAAO,WAAW;AACpB,UAAM,YAAY,OAAO,QAAQ,OAAO,SAAS;AAGjD,UAAM,gBAAgB,UAAU;AAAA,MAC9B,CAAC,UAAU,CAAC,cAAc,cAAc,MAAM;AAC5C,YAAI,eAAe,YAAY,QAAW;AACxC,mBAAS,YAAY,IAAI,eAAe;AAAA,QAC1C;AACA,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AAGA,UAAM,oBAAoB,iBAAiB,WAAW,aAAa;AAEnE,WAAO,UAAU,mBAAmB,IAAI;AAAA,EAC1C;AAEA,SAAO,UAAU,WAAW,IAAI;AAClC;",
6
6
  "names": []
7
7
  }
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * - Relative URLs
5
5
  * - URLs that seem to point to a local IP (except the proxy is on the same domain)
6
- * - URLs that dont look like a domain
6
+ * - URLs that don't look like a domain
7
7
  **/
8
8
  export declare function redirectToProxy(proxyUrl?: string, url?: string): string;
9
9
  /**
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/helpers/redirect-to-proxy.ts"],
4
- "sourcesContent": ["import { isLocalUrl } from '@scalar/helpers/url/is-local-url'\nimport { isRelativePath } from '@scalar/helpers/url/is-relative-path'\n\n/**\n * Redirects the request to a proxy server with a given URL. But not for:\n *\n * - Relative URLs\n * - URLs that seem to point to a local IP (except the proxy is on the same domain)\n * - URLs that don\u2019t look like a domain\n **/\nexport function redirectToProxy(proxyUrl?: string, url?: string): string {\n try {\n if (!shouldUseProxy(proxyUrl, url)) {\n return url ?? ''\n }\n\n // Create new URL object from url\n const newUrl = new URL(url)\n\n // Add temporary domain for relative proxy URLs\n //\n // Q: Why isn\u2019t proxyUrl type guarded?\n // A: Type guarding works for one parameter only (as of now).\n //\n // Q: Why do we need to add http://localhost to relative proxy URLs?\n // A: Because the `new URL()` would otherwise fail.\n //\n const temporaryProxyUrl = isRelativePath(proxyUrl as string) ? `http://localhost${proxyUrl}` : (proxyUrl as string)\n\n // Rewrite the URL with the proxy\n newUrl.href = temporaryProxyUrl\n\n // Add the original URL as a query parameter\n newUrl.searchParams.append('scalar_url', url)\n\n // Remove the temporary domain if we added it, but only from the start of the URL\n const result = isRelativePath(proxyUrl as string)\n ? newUrl.toString().replace(/^http:\\/\\/localhost/, '')\n : newUrl.toString()\n\n return result\n } catch {\n return url ?? ''\n }\n}\n\n/**\n * Returns false for requests to localhost, relative URLs, if no proxy is defined \u2026\n **/\nexport function shouldUseProxy(proxyUrl?: string, url?: string): url is string {\n try {\n // \u274C We don\u2019t have a proxy URL or the URL\n if (!proxyUrl || !url) {\n return false\n }\n\n // \u274C Request to relative URLs (won\u2019t be blocked by CORS anyway)\n if (isRelativePath(url)) {\n return false\n }\n\n // \u2705 Proxy URL is on the same domain (e.g. /proxy)\n // It\u2019s more likely (not guaranteed, though) that the proxy has access to local domains.\n if (isRelativePath(proxyUrl)) {\n return true\n }\n\n // \u2705 Proxy URL is local\n if (isLocalUrl(proxyUrl)) {\n return true\n }\n\n // \u274C Requests to localhost\n // We won\u2019t reach them from a (likely remote) proxy.\n if (isLocalUrl(url)) {\n return false\n }\n\n // \u2705 Seems fine (e.g. remote proxy + remote URL)\n return true\n } catch {\n return false\n }\n}\n"],
4
+ "sourcesContent": ["import { isLocalUrl } from '@scalar/helpers/url/is-local-url'\nimport { isRelativePath } from '@scalar/helpers/url/is-relative-path'\n\n/**\n * Redirects the request to a proxy server with a given URL. But not for:\n *\n * - Relative URLs\n * - URLs that seem to point to a local IP (except the proxy is on the same domain)\n * - URLs that don't look like a domain\n **/\nexport function redirectToProxy(proxyUrl?: string, url?: string): string {\n try {\n if (!shouldUseProxy(proxyUrl, url)) {\n return url ?? ''\n }\n\n // Create new URL object from url\n const newUrl = new URL(url)\n\n // Add temporary domain for relative proxy URLs\n //\n // Q: Why isn't proxyUrl type guarded?\n // A: Type guarding works for one parameter only (as of now).\n //\n // Q: Why do we need to add http://localhost to relative proxy URLs?\n // A: Because the `new URL()` would otherwise fail.\n //\n const temporaryProxyUrl = isRelativePath(proxyUrl as string) ? `http://localhost${proxyUrl}` : (proxyUrl as string)\n\n // Rewrite the URL with the proxy\n newUrl.href = temporaryProxyUrl\n\n // Add the original URL as a query parameter\n newUrl.searchParams.append('scalar_url', url)\n\n // Remove the temporary domain if we added it, but only from the start of the URL\n const result = isRelativePath(proxyUrl as string)\n ? newUrl.toString().replace(/^http:\\/\\/localhost/, '')\n : newUrl.toString()\n\n return result\n } catch {\n return url ?? ''\n }\n}\n\n/**\n * Returns false for requests to localhost, relative URLs, if no proxy is defined \u2026\n **/\nexport function shouldUseProxy(proxyUrl?: string, url?: string): url is string {\n try {\n // \u274C We don't have a proxy URL or the URL\n if (!proxyUrl || !url) {\n return false\n }\n\n // \u274C Request to relative URLs (won't be blocked by CORS anyway)\n if (isRelativePath(url)) {\n return false\n }\n\n // \u2705 Proxy URL is on the same domain (e.g. /proxy)\n // It's more likely (not guaranteed, though) that the proxy has access to local domains.\n if (isRelativePath(proxyUrl)) {\n return true\n }\n\n // \u2705 Proxy URL is local\n if (isLocalUrl(proxyUrl)) {\n return true\n }\n\n // \u274C Requests to localhost\n // We won't reach them from a (likely remote) proxy.\n if (isLocalUrl(url)) {\n return false\n }\n\n // \u2705 Seems fine (e.g. remote proxy + remote URL)\n return true\n } catch {\n return false\n }\n}\n"],
5
5
  "mappings": "AAAA,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AASxB,SAAS,gBAAgB,UAAmB,KAAsB;AACvE,MAAI;AACF,QAAI,CAAC,eAAe,UAAU,GAAG,GAAG;AAClC,aAAO,OAAO;AAAA,IAChB;AAGA,UAAM,SAAS,IAAI,IAAI,GAAG;AAU1B,UAAM,oBAAoB,eAAe,QAAkB,IAAI,mBAAmB,QAAQ,KAAM;AAGhG,WAAO,OAAO;AAGd,WAAO,aAAa,OAAO,cAAc,GAAG;AAG5C,UAAM,SAAS,eAAe,QAAkB,IAC5C,OAAO,SAAS,EAAE,QAAQ,uBAAuB,EAAE,IACnD,OAAO,SAAS;AAEpB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,OAAO;AAAA,EAChB;AACF;AAKO,SAAS,eAAe,UAAmB,KAA6B;AAC7E,MAAI;AAEF,QAAI,CAAC,YAAY,CAAC,KAAK;AACrB,aAAO;AAAA,IACT;AAGA,QAAI,eAAe,GAAG,GAAG;AACvB,aAAO;AAAA,IACT;AAIA,QAAI,eAAe,QAAQ,GAAG;AAC5B,aAAO;AAAA,IACT;AAGA,QAAI,WAAW,QAAQ,GAAG;AACxB,aAAO;AAAA,IACT;AAIA,QAAI,WAAW,GAAG,GAAG;AACnB,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;",
6
6
  "names": []
7
7
  }