@scalar/snippetz 0.5.3 → 0.5.4

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 (81) hide show
  1. package/dist/clients/index.d.ts.map +1 -1
  2. package/dist/clients/index.js +1 -1
  3. package/dist/clients/index.js.map +2 -2
  4. package/dist/httpsnippet-lite/esm/targets/c/libcurl/client.js +1 -1
  5. package/dist/httpsnippet-lite/esm/targets/c/libcurl/client.js.map +1 -1
  6. package/dist/libs/http.d.ts +27 -0
  7. package/dist/libs/http.d.ts.map +1 -0
  8. package/dist/libs/http.js +46 -0
  9. package/dist/libs/http.js.map +7 -0
  10. package/dist/{utils/objectToString.d.ts → libs/javascript.d.ts} +2 -2
  11. package/dist/libs/javascript.d.ts.map +1 -0
  12. package/dist/{utils/objectToString.js → libs/javascript.js} +7 -5
  13. package/dist/libs/javascript.js.map +7 -0
  14. package/dist/libs/php.d.ts +17 -0
  15. package/dist/libs/php.d.ts.map +1 -0
  16. package/dist/libs/php.js +57 -0
  17. package/dist/libs/php.js.map +7 -0
  18. package/dist/libs/rust.d.ts +23 -0
  19. package/dist/libs/rust.d.ts.map +1 -0
  20. package/dist/libs/rust.js +39 -0
  21. package/dist/libs/rust.js.map +7 -0
  22. package/dist/libs/shell.d.ts +15 -0
  23. package/dist/libs/shell.d.ts.map +1 -0
  24. package/dist/libs/shell.js +5 -0
  25. package/dist/libs/shell.js.map +7 -0
  26. package/dist/plugins/c/libcurl/libcurl.d.ts.map +1 -1
  27. package/dist/plugins/c/libcurl/libcurl.js.map +2 -2
  28. package/dist/plugins/csharp/httpclient/httpclient.js +1 -1
  29. package/dist/plugins/csharp/httpclient/httpclient.js.map +1 -1
  30. package/dist/plugins/js/axios/axios.d.ts.map +1 -1
  31. package/dist/plugins/js/axios/axios.js.map +2 -2
  32. package/dist/plugins/js/fetch/fetch.d.ts.map +1 -1
  33. package/dist/plugins/js/fetch/fetch.js +6 -6
  34. package/dist/plugins/js/fetch/fetch.js.map +2 -2
  35. package/dist/plugins/js/ofetch/ofetch.d.ts.map +1 -1
  36. package/dist/plugins/js/ofetch/ofetch.js +1 -1
  37. package/dist/plugins/js/ofetch/ofetch.js.map +2 -2
  38. package/dist/plugins/node/axios/axios.d.ts.map +1 -1
  39. package/dist/plugins/node/axios/axios.js.map +2 -2
  40. package/dist/plugins/node/fetch/fetch.d.ts.map +1 -1
  41. package/dist/plugins/node/fetch/fetch.js +6 -6
  42. package/dist/plugins/node/fetch/fetch.js.map +2 -2
  43. package/dist/plugins/node/ofetch/ofetch.d.ts.map +1 -1
  44. package/dist/plugins/node/ofetch/ofetch.js +1 -1
  45. package/dist/plugins/node/ofetch/ofetch.js.map +2 -2
  46. package/dist/plugins/node/undici/undici.d.ts.map +1 -1
  47. package/dist/plugins/node/undici/undici.js +3 -3
  48. package/dist/plugins/node/undici/undici.js.map +2 -2
  49. package/dist/plugins/php/curl/curl.d.ts.map +1 -1
  50. package/dist/plugins/php/curl/curl.js +3 -36
  51. package/dist/plugins/php/curl/curl.js.map +2 -2
  52. package/dist/plugins/php/guzzle/guzzle.d.ts.map +1 -1
  53. package/dist/plugins/php/guzzle/guzzle.js +5 -39
  54. package/dist/plugins/php/guzzle/guzzle.js.map +2 -2
  55. package/dist/plugins/rust/reqwest/reqwest.d.ts.map +1 -1
  56. package/dist/plugins/rust/reqwest/reqwest.js +19 -72
  57. package/dist/plugins/rust/reqwest/reqwest.js.map +2 -2
  58. package/dist/plugins/shell/curl/curl.d.ts.map +1 -1
  59. package/dist/plugins/shell/curl/curl.js +26 -11
  60. package/dist/plugins/shell/curl/curl.js.map +2 -2
  61. package/dist/utils/convertWithHttpSnippetLite.d.ts.map +1 -1
  62. package/dist/utils/convertWithHttpSnippetLite.js.map +2 -2
  63. package/dist/utils/index.d.ts +0 -2
  64. package/dist/utils/index.d.ts.map +1 -1
  65. package/dist/utils/index.js +0 -2
  66. package/dist/utils/index.js.map +2 -2
  67. package/package.json +3 -3
  68. package/dist/plugins/rust/rustString.d.ts +0 -9
  69. package/dist/plugins/rust/rustString.d.ts.map +0 -1
  70. package/dist/plugins/rust/rustString.js +0 -10
  71. package/dist/plugins/rust/rustString.js.map +0 -7
  72. package/dist/utils/create-search-params.d.ts +0 -4
  73. package/dist/utils/create-search-params.d.ts.map +0 -1
  74. package/dist/utils/create-search-params.js +0 -11
  75. package/dist/utils/create-search-params.js.map +0 -7
  76. package/dist/utils/needsQuotes.d.ts +0 -7
  77. package/dist/utils/needsQuotes.d.ts.map +0 -1
  78. package/dist/utils/needsQuotes.js +0 -7
  79. package/dist/utils/needsQuotes.js.map +0 -7
  80. package/dist/utils/objectToString.d.ts.map +0 -1
  81. package/dist/utils/objectToString.js.map +0 -7
@@ -1,12 +1,16 @@
1
- import { toRustString } from "../rustString.js";
1
+ import { buildQueryString, buildUrl, normalizeRequest, processHeaders } from "../../../libs/http.js";
2
+ import { createChain, formatJson, indent, wrapInDoubleQuotes } from "../../../libs/rust.js";
2
3
  const rustReqwest = {
3
4
  target: "rust",
4
5
  client: "reqwest",
5
6
  title: "reqwest",
6
7
  generate(request, options) {
8
+ if (!request) {
9
+ return "";
10
+ }
7
11
  const normalizedRequest = normalizeRequest(request);
8
12
  const queryString = buildQueryString(normalizedRequest.queryString);
9
- const url = buildUrl(normalizedRequest.url, queryString);
13
+ const url = buildUrl(normalizedRequest.url || "", queryString);
10
14
  const headers = processHeaders(normalizedRequest);
11
15
  const chainedCalls = [];
12
16
  const authCall = createAuthCall(options?.auth);
@@ -21,82 +25,25 @@ const rustReqwest = {
21
25
  return buildRustCode(url, normalizedRequest.method, chainedCalls);
22
26
  }
23
27
  };
24
- const indent = (level, text) => {
25
- const spaces = " ".repeat(level * 4);
26
- return `${spaces}${text}`;
27
- };
28
- const createChainedCall = (method, ...args) => {
29
- return indent(1, `.${method}(${args.join(", ")})`);
30
- };
31
28
  const createMultipartPart = (param) => {
32
29
  if (param.fileName) {
33
30
  return [
34
- indent(2, `let part = reqwest::multipart::Part::text(${toRustString(param.value || "")})`),
35
- indent(3, `.file_name(${toRustString(param.fileName)});`),
36
- indent(2, `form = form.part(${toRustString(param.name)}, part);`)
31
+ indent(2, `let part = reqwest::multipart::Part::text(${wrapInDoubleQuotes(param.value || "")})`),
32
+ indent(3, `.file_name(${wrapInDoubleQuotes(param.fileName)});`),
33
+ indent(2, `form = form.part(${wrapInDoubleQuotes(param.name)}, part);`)
37
34
  ].join("\n");
38
35
  }
39
- return indent(2, `form = form.text(${toRustString(param.name)}, ${toRustString(param.value || "")});`);
40
- };
41
- const formatJsonForRust = (jsonText) => {
42
- try {
43
- const jsonData = JSON.parse(jsonText);
44
- const prettyJson = JSON.stringify(jsonData, null, 4);
45
- const lines = prettyJson.split("\n");
46
- const rustLines = lines.map((line, index) => {
47
- if (index === 0) {
48
- return line;
49
- }
50
- if (index === lines.length - 1) {
51
- return indent(1, line);
52
- }
53
- return indent(1, line);
54
- });
55
- return rustLines.join("\n");
56
- } catch {
57
- return jsonText;
58
- }
59
- };
60
- const normalizeRequest = (request) => {
61
- return {
62
- ...request,
63
- method: (request.method || "GET").toUpperCase()
64
- };
65
- };
66
- const buildQueryString = (queryParams) => {
67
- if (!queryParams?.length) {
68
- return "";
69
- }
70
- const queryPairs = queryParams.map((param) => `${encodeURIComponent(param.name)}=${encodeURIComponent(param.value)}`);
71
- return `?${queryPairs.join("&")}`;
72
- };
73
- const buildUrl = (baseUrl, queryString) => {
74
- return `${baseUrl}${queryString}`;
75
- };
76
- const processHeaders = (request) => {
77
- const headers = {};
78
- if (request.headers) {
79
- for (const header of request.headers) {
80
- if (header.value && !/[; ]/.test(header.name)) {
81
- headers[header.name] = header.value;
82
- }
83
- }
84
- }
85
- if (request.cookies?.length > 0) {
86
- const cookieString = request.cookies.map((cookie) => `${encodeURIComponent(cookie.name)}=${encodeURIComponent(cookie.value)}`).join("; ");
87
- headers["Cookie"] = cookieString;
88
- }
89
- return headers;
36
+ return indent(2, `form = form.text(${wrapInDoubleQuotes(param.name)}, ${wrapInDoubleQuotes(param.value || "")});`);
90
37
  };
91
38
  const createAuthCall = (auth) => {
92
39
  if (!auth?.username || !auth?.password) {
93
40
  return null;
94
41
  }
95
- return createChainedCall("basic_auth", toRustString(auth.username), toRustString(auth.password));
42
+ return createChain("basic_auth", wrapInDoubleQuotes(auth.username), wrapInDoubleQuotes(auth.password));
96
43
  };
97
44
  const createHeaderCalls = (headers) => {
98
45
  return Object.entries(headers).map(
99
- ([key, value]) => createChainedCall("header", toRustString(key), toRustString(value))
46
+ ([key, value]) => createChain("header", wrapInDoubleQuotes(key), wrapInDoubleQuotes(value))
100
47
  );
101
48
  };
102
49
  const createBodyCall = (postData) => {
@@ -106,12 +53,12 @@ const createBodyCall = (postData) => {
106
53
  const { mimeType, text, params } = postData;
107
54
  switch (mimeType) {
108
55
  case "application/json": {
109
- const formattedJson = formatJsonForRust(text);
110
- return createChainedCall("json", `&serde_json::json!(${formattedJson})`);
56
+ const formattedJson = formatJson(text);
57
+ return createChain("json", `&serde_json::json!(${formattedJson})`);
111
58
  }
112
59
  case "application/x-www-form-urlencoded": {
113
- const formData = params?.map((param) => `(${toRustString(param.name)}, ${toRustString(param.value || "")})`).join(", ") || "";
114
- return createChainedCall("form", `&[${formData}]`);
60
+ const formData = params?.map((param) => `(${wrapInDoubleQuotes(param.name)}, ${wrapInDoubleQuotes(param.value || "")})`).join(", ") || "";
61
+ return createChain("form", `&[${formData}]`);
115
62
  }
116
63
  case "multipart/form-data": {
117
64
  const formParts = params?.map(createMultipartPart).join("\n") || "";
@@ -125,17 +72,17 @@ const createBodyCall = (postData) => {
125
72
  return indent(1, multipartBlock);
126
73
  }
127
74
  default:
128
- return createChainedCall("body", toRustString(text || ""));
75
+ return createChain("body", wrapInDoubleQuotes(text || ""));
129
76
  }
130
77
  };
131
78
  const buildRustCode = (url, method, chainedCalls) => {
132
79
  const code = ["let client = reqwest::Client::new();", ""];
133
80
  if (chainedCalls.length > 0) {
134
81
  code.push("let request = client");
135
- code.push(indent(1, `.${method.toLowerCase()}(${toRustString(url)})`));
82
+ code.push(indent(1, `.${method.toLowerCase()}(${wrapInDoubleQuotes(url)})`));
136
83
  code.push(...chainedCalls);
137
84
  } else {
138
- code.push(`let request = client.${method.toLowerCase()}(${toRustString(url)})`);
85
+ code.push(`let request = client.${method.toLowerCase()}(${wrapInDoubleQuotes(url)})`);
139
86
  }
140
87
  const lastPart = code[code.length - 1];
141
88
  code[code.length - 1] = lastPart + ";";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/plugins/rust/reqwest/reqwest.ts"],
4
- "sourcesContent": ["import type { Plugin } from '@scalar/types/snippetz'\nimport { toRustString } from '../rustString'\n\n/**\n * rust/reqwest plugin for generating Rust reqwest HTTP client code\n */\nexport const rustReqwest: Plugin = {\n target: 'rust',\n client: 'reqwest',\n title: 'reqwest',\n generate(request, options?: { auth?: { username: string; password: string } }) {\n // Normalization\n const normalizedRequest = normalizeRequest(request)\n\n // Query string\n const queryString = buildQueryString(normalizedRequest.queryString)\n const url = buildUrl(normalizedRequest.url, queryString)\n\n // Headers and cookies\n const headers = processHeaders(normalizedRequest)\n\n // Chained calls\n const chainedCalls: string[] = []\n\n // Auth\n const authCall = createAuthCall(options?.auth)\n if (authCall) {\n chainedCalls.push(authCall)\n }\n\n // Headers\n chainedCalls.push(...createHeaderCalls(headers))\n\n // Body\n const bodyCall = createBodyCall(normalizedRequest.postData)\n if (bodyCall) {\n chainedCalls.push(bodyCall)\n }\n\n // Code\n return buildRustCode(url, normalizedRequest.method, chainedCalls)\n },\n}\n\n/**\n * Helper function to create indented strings\n */\nconst indent = (level: number, text: string): string => {\n const spaces = ' '.repeat(level * 4)\n return `${spaces}${text}`\n}\n\n/**\n * Helper function to create chained method calls with consistent indentation\n */\nconst createChainedCall = (method: string, ...args: string[]): string => {\n return indent(1, `.${method}(${args.join(', ')})`)\n}\n\n/**\n * Helper function to create multipart form parts with proper indentation\n */\nconst createMultipartPart = (param: { name: string; value?: string; fileName?: string }): string => {\n if (param.fileName) {\n return [\n indent(2, `let part = reqwest::multipart::Part::text(${toRustString(param.value || '')})`),\n indent(3, `.file_name(${toRustString(param.fileName)});`),\n indent(2, `form = form.part(${toRustString(param.name)}, part);`),\n ].join('\\n')\n }\n\n return indent(2, `form = form.text(${toRustString(param.name)}, ${toRustString(param.value || '')});`)\n}\n\n/**\n * Formats JSON for Rust's serde_json::json! macro with proper indentation\n */\nconst formatJsonForRust = (jsonText: string): string => {\n try {\n const jsonData = JSON.parse(jsonText)\n const prettyJson = JSON.stringify(jsonData, null, 4)\n\n // Split into lines and add proper indentation for Rust\n const lines = prettyJson.split('\\n')\n const rustLines = lines.map((line, index) => {\n if (index === 0) {\n // First line (opening brace)\n return line\n }\n if (index === lines.length - 1) {\n // Last line (closing brace)\n return indent(1, line)\n }\n // Middle lines\n return indent(1, line)\n })\n\n return rustLines.join('\\n')\n } catch {\n // If JSON parsing fails, return the original text\n return jsonText\n }\n}\n\n/**\n * Normalizes the request object with defaults\n */\nconst normalizeRequest = (request: any) => {\n return {\n ...request,\n method: (request.method || 'GET').toUpperCase(),\n }\n}\n\n/**\n * Builds the query string from request parameters\n */\nconst buildQueryString = (queryParams?: Array<{ name: string; value: string }>): string => {\n if (!queryParams?.length) {\n return ''\n }\n\n const queryPairs = queryParams.map((param) => `${encodeURIComponent(param.name)}=${encodeURIComponent(param.value)}`)\n return `?${queryPairs.join('&')}`\n}\n\n/**\n * Builds the complete URL with query string\n */\nconst buildUrl = (baseUrl: string, queryString: string): string => {\n return `${baseUrl}${queryString}`\n}\n\n/**\n * Processes headers and cookies into a headers object\n */\nconst processHeaders = (request: any): Record<string, string> => {\n const headers: Record<string, string> = {}\n\n // Process regular headers\n if (request.headers) {\n for (const header of request.headers) {\n if (header.value && !/[; ]/.test(header.name)) {\n headers[header.name] = header.value\n }\n }\n }\n\n // Process cookies\n if (request.cookies?.length > 0) {\n const cookieString = request.cookies\n .map((cookie: any) => `${encodeURIComponent(cookie.name)}=${encodeURIComponent(cookie.value)}`)\n .join('; ')\n headers['Cookie'] = cookieString\n }\n\n return headers\n}\n\n/**\n * Creates authentication chained call if credentials are provided\n */\nconst createAuthCall = (auth?: { username: string; password: string }): string | null => {\n if (!auth?.username || !auth?.password) {\n return null\n }\n\n return createChainedCall('basic_auth', toRustString(auth.username), toRustString(auth.password))\n}\n\n/**\n * Creates header chained calls from headers object\n */\nconst createHeaderCalls = (headers: Record<string, string>): string[] => {\n return Object.entries(headers).map(([key, value]) =>\n createChainedCall('header', toRustString(key), toRustString(value)),\n )\n}\n\n/**\n * Creates body chained call based on content type\n */\nconst createBodyCall = (postData: any): string | null => {\n if (!postData) {\n return null\n }\n\n const { mimeType, text, params } = postData\n\n switch (mimeType) {\n case 'application/json': {\n const formattedJson = formatJsonForRust(text)\n return createChainedCall('json', `&serde_json::json!(${formattedJson})`)\n }\n\n case 'application/x-www-form-urlencoded': {\n const formData =\n params?.map((param: any) => `(${toRustString(param.name)}, ${toRustString(param.value || '')})`).join(', ') ||\n ''\n return createChainedCall('form', `&[${formData}]`)\n }\n\n case 'multipart/form-data': {\n const formParts = params?.map(createMultipartPart).join('\\n') || ''\n const multipartBlock = [\n '.multipart({',\n indent(2, 'let mut form = reqwest::multipart::Form::new();'),\n formParts,\n indent(3, 'form'),\n indent(2, '})'),\n ].join('\\n')\n return indent(1, multipartBlock)\n }\n\n default:\n return createChainedCall('body', toRustString(text || ''))\n }\n}\n\n/**\n * Builds the complete Rust code by assembling all code\n */\nconst buildRustCode = (url: string, method: string, chainedCalls: string[]): string => {\n const code = ['let client = reqwest::Client::new();', '']\n\n // Add chained calls with proper formatting\n if (chainedCalls.length > 0) {\n code.push('let request = client')\n code.push(indent(1, `.${method.toLowerCase()}(${toRustString(url)})`))\n\n // Add a newline before the first chained call\n code.push(...chainedCalls)\n } else {\n code.push(`let request = client.${method.toLowerCase()}(${toRustString(url)})`)\n }\n\n // Add semicolon to the last chained call\n const lastPart = code[code.length - 1]\n code[code.length - 1] = lastPart + ';'\n\n // Add response handling\n code.push('')\n code.push('let response = request.send().await?;')\n\n return code.join('\\n')\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Plugin } from '@scalar/types/snippetz'\n\nimport { buildQueryString, buildUrl, normalizeRequest, processHeaders } from '@/libs/http'\nimport { createChain, formatJson, indent, wrapInDoubleQuotes } from '@/libs/rust'\n\n/**\n * rust/reqwest plugin for generating Rust reqwest HTTP client code\n */\nexport const rustReqwest: Plugin = {\n target: 'rust',\n client: 'reqwest',\n title: 'reqwest',\n generate(request, options?: { auth?: { username: string; password: string } }) {\n if (!request) {\n return ''\n }\n\n // Normalization\n const normalizedRequest = normalizeRequest(request)\n\n // Query string\n const queryString = buildQueryString(normalizedRequest.queryString)\n const url = buildUrl(normalizedRequest.url || '', queryString)\n\n // Headers and cookies\n const headers = processHeaders(normalizedRequest)\n\n // Chained calls\n const chainedCalls: string[] = []\n\n // Auth\n const authCall = createAuthCall(options?.auth)\n if (authCall) {\n chainedCalls.push(authCall)\n }\n\n // Headers\n chainedCalls.push(...createHeaderCalls(headers))\n\n // Body\n const bodyCall = createBodyCall(normalizedRequest.postData)\n if (bodyCall) {\n chainedCalls.push(bodyCall)\n }\n\n // Code\n return buildRustCode(url, normalizedRequest.method, chainedCalls)\n },\n}\n\n/**\n * Helper function to create multipart form parts with proper indentation\n */\nconst createMultipartPart = (param: { name: string; value?: string; fileName?: string }): string => {\n if (param.fileName) {\n return [\n indent(2, `let part = reqwest::multipart::Part::text(${wrapInDoubleQuotes(param.value || '')})`),\n indent(3, `.file_name(${wrapInDoubleQuotes(param.fileName)});`),\n indent(2, `form = form.part(${wrapInDoubleQuotes(param.name)}, part);`),\n ].join('\\n')\n }\n\n return indent(2, `form = form.text(${wrapInDoubleQuotes(param.name)}, ${wrapInDoubleQuotes(param.value || '')});`)\n}\n\n/**\n * Creates authentication chained call if credentials are provided\n */\nconst createAuthCall = (auth?: { username: string; password: string }): string | null => {\n if (!auth?.username || !auth?.password) {\n return null\n }\n\n return createChain('basic_auth', wrapInDoubleQuotes(auth.username), wrapInDoubleQuotes(auth.password))\n}\n\n/**\n * Creates header chained calls from headers object\n */\nconst createHeaderCalls = (headers: Record<string, string>): string[] => {\n return Object.entries(headers).map(([key, value]) =>\n createChain('header', wrapInDoubleQuotes(key), wrapInDoubleQuotes(value)),\n )\n}\n\n/**\n * Creates body chained call based on content type\n */\nconst createBodyCall = (postData: any): string | null => {\n if (!postData) {\n return null\n }\n\n const { mimeType, text, params } = postData\n\n switch (mimeType) {\n case 'application/json': {\n const formattedJson = formatJson(text)\n return createChain('json', `&serde_json::json!(${formattedJson})`)\n }\n\n case 'application/x-www-form-urlencoded': {\n const formData =\n params\n ?.map((param: any) => `(${wrapInDoubleQuotes(param.name)}, ${wrapInDoubleQuotes(param.value || '')})`)\n .join(', ') || ''\n return createChain('form', `&[${formData}]`)\n }\n\n case 'multipart/form-data': {\n const formParts = params?.map(createMultipartPart).join('\\n') || ''\n const multipartBlock = [\n '.multipart({',\n indent(2, 'let mut form = reqwest::multipart::Form::new();'),\n formParts,\n indent(3, 'form'),\n indent(2, '})'),\n ].join('\\n')\n return indent(1, multipartBlock)\n }\n\n default:\n return createChain('body', wrapInDoubleQuotes(text || ''))\n }\n}\n\n/**\n * Builds the complete Rust code by assembling all code\n */\nconst buildRustCode = (url: string, method: string, chainedCalls: string[]): string => {\n const code = ['let client = reqwest::Client::new();', '']\n\n // Add chained calls with proper formatting\n if (chainedCalls.length > 0) {\n code.push('let request = client')\n code.push(indent(1, `.${method.toLowerCase()}(${wrapInDoubleQuotes(url)})`))\n\n // Add a newline before the first chained call\n code.push(...chainedCalls)\n } else {\n code.push(`let request = client.${method.toLowerCase()}(${wrapInDoubleQuotes(url)})`)\n }\n\n // Add semicolon to the last chained call\n const lastPart = code[code.length - 1]\n code[code.length - 1] = lastPart + ';'\n\n // Add response handling\n code.push('')\n code.push('let response = request.send().await?;')\n\n return code.join('\\n')\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"curl.d.ts","sourceRoot":"","sources":["../../../../src/plugins/shell/curl/curl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAEpD;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,MAqHvB,CAAA"}
1
+ {"version":3,"file":"curl.d.ts","sourceRoot":"","sources":["../../../../src/plugins/shell/curl/curl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAIpD;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,MAmIvB,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { escapeSingleQuotes } from "../../../libs/shell.js";
1
2
  const shellCurl = {
2
3
  target: "shell",
3
4
  client: "curl",
@@ -22,11 +23,13 @@ const shellCurl = {
22
23
  parts.push(`--request ${normalizedRequest.method}`);
23
24
  }
24
25
  if (configuration?.auth?.username && configuration?.auth?.password) {
25
- parts.push(`--user '${configuration.auth.username}:${configuration.auth.password}'`);
26
+ const authValue = escapeSingleQuotes(`${configuration.auth.username}:${configuration.auth.password}`);
27
+ parts.push(`--user '${authValue}'`);
26
28
  }
27
29
  if (normalizedRequest.headers?.length) {
28
30
  normalizedRequest.headers.forEach((header) => {
29
- parts.push(`--header '${header.name}: ${header.value}'`);
31
+ const headerValue = escapeSingleQuotes(`${header.name}: ${header.value}`);
32
+ parts.push(`--header '${headerValue}'`);
30
33
  });
31
34
  const acceptEncoding = normalizedRequest.headers.find((header) => header.name.toLowerCase() === "accept-encoding");
32
35
  if (acceptEncoding && /gzip|deflate/.test(acceptEncoding.value)) {
@@ -39,7 +42,8 @@ const shellCurl = {
39
42
  const encodedValue = encodeURIComponent(cookie.value);
40
43
  return `${encodedName}=${encodedValue}`;
41
44
  }).join("; ");
42
- parts.push(`--cookie '${cookieString}'`);
45
+ const escapedCookieString = escapeSingleQuotes(cookieString);
46
+ parts.push(`--cookie '${escapedCookieString}'`);
43
47
  }
44
48
  if (normalizedRequest.postData) {
45
49
  if (normalizedRequest.postData.mimeType === "application/json") {
@@ -47,32 +51,43 @@ const shellCurl = {
47
51
  try {
48
52
  const jsonData = JSON.parse(normalizedRequest.postData.text);
49
53
  const prettyJson = JSON.stringify(jsonData, null, 2);
50
- parts.push(`--data '${prettyJson}'`);
54
+ const escapedJson = escapeSingleQuotes(prettyJson);
55
+ parts.push(`--data '${escapedJson}'`);
51
56
  } catch {
52
- parts.push(`--data '${normalizedRequest.postData.text}'`);
57
+ const escapedText = escapeSingleQuotes(normalizedRequest.postData.text ?? "");
58
+ parts.push(`--data '${escapedText}'`);
53
59
  }
54
60
  }
55
61
  } else if (normalizedRequest.postData.mimeType === "application/octet-stream") {
56
- parts.push(`--data-binary '${normalizedRequest.postData.text}'`);
62
+ const escapedText = escapeSingleQuotes(normalizedRequest.postData.text ?? "");
63
+ parts.push(`--data-binary '${escapedText}'`);
57
64
  } else if (normalizedRequest.postData.mimeType === "application/x-www-form-urlencoded" && normalizedRequest.postData.params) {
58
65
  normalizedRequest.postData.params.forEach((param) => {
59
- parts.push(`--data-urlencode '${encodeURIComponent(param.name)}=${param.value}'`);
66
+ const escapedValue = escapeSingleQuotes(param.value ?? "");
67
+ const encodedName = encodeURIComponent(param.name);
68
+ const escapedName = escapeSingleQuotes(encodedName);
69
+ parts.push(`--data-urlencode '${escapedName}=${escapedValue}'`);
60
70
  });
61
71
  } else if (normalizedRequest.postData.mimeType === "multipart/form-data" && normalizedRequest.postData.params) {
62
72
  normalizedRequest.postData.params.forEach((param) => {
73
+ const escapedName = escapeSingleQuotes(param.name);
63
74
  if (param.fileName !== void 0) {
64
- parts.push(`--form '${param.name}=@${param.fileName}'`);
75
+ const escapedFileName = escapeSingleQuotes(param.fileName);
76
+ parts.push(`--form '${escapedName}=@${escapedFileName}'`);
65
77
  } else {
66
- parts.push(`--form '${param.name}=${param.value}'`);
78
+ const escapedValue = escapeSingleQuotes(param.value ?? "");
79
+ parts.push(`--form '${escapedName}=${escapedValue}'`);
67
80
  }
68
81
  });
69
82
  } else {
70
83
  try {
71
84
  const jsonData = JSON.parse(normalizedRequest.postData.text ?? "");
72
85
  const prettyJson = JSON.stringify(jsonData, null, 2);
73
- parts.push(`--data '${prettyJson}'`);
86
+ const escapedJson = escapeSingleQuotes(prettyJson);
87
+ parts.push(`--data '${escapedJson}'`);
74
88
  } catch {
75
- parts.push(`--data '${normalizedRequest.postData.text}'`);
89
+ const escapedText = escapeSingleQuotes(normalizedRequest.postData.text ?? "");
90
+ parts.push(`--data '${escapedText}'`);
76
91
  }
77
92
  }
78
93
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/plugins/shell/curl/curl.ts"],
4
- "sourcesContent": ["import type { Plugin } from '@scalar/types/snippetz'\n\n/**\n * shell/curl\n */\nexport const shellCurl: Plugin = {\n target: 'shell',\n client: 'curl',\n title: 'Curl',\n generate(request, configuration) {\n // Defaults\n const normalizedRequest = {\n method: 'GET',\n ...request,\n }\n\n // Normalization\n normalizedRequest.method = normalizedRequest.method.toUpperCase()\n\n // Build curl command parts\n const parts: string[] = ['curl']\n\n // URL (quote if has query parameters or special characters)\n const queryString = normalizedRequest.queryString?.length\n ? '?' +\n normalizedRequest.queryString\n .map((param) => {\n // Ensure both name and value are fully URI encoded\n const encodedName = encodeURIComponent(param.name)\n const encodedValue = encodeURIComponent(param.value)\n return `${encodedName}=${encodedValue}`\n })\n .join('&')\n : ''\n const url = `${normalizedRequest.url}${queryString}`\n const hasSpecialChars = /[\\s<>[\\]{}|\\\\^%$]/.test(url)\n const urlPart = queryString || hasSpecialChars ? `'${url}'` : url\n parts[0] = `curl ${urlPart}`\n\n // Method\n if (normalizedRequest.method !== 'GET') {\n parts.push(`--request ${normalizedRequest.method}`)\n }\n\n // Basic Auth\n if (configuration?.auth?.username && configuration?.auth?.password) {\n parts.push(`--user '${configuration.auth.username}:${configuration.auth.password}'`)\n }\n\n // Headers\n if (normalizedRequest.headers?.length) {\n normalizedRequest.headers.forEach((header) => {\n parts.push(`--header '${header.name}: ${header.value}'`)\n })\n\n // Add compressed flag if Accept-Encoding header includes compression\n const acceptEncoding = normalizedRequest.headers.find((header) => header.name.toLowerCase() === 'accept-encoding')\n if (acceptEncoding && /gzip|deflate/.test(acceptEncoding.value)) {\n parts.push('--compressed')\n }\n }\n\n // Cookies\n if (normalizedRequest.cookies?.length) {\n const cookieString = normalizedRequest.cookies\n .map((cookie) => {\n // Encode both cookie name and value to handle special characters\n const encodedName = encodeURIComponent(cookie.name)\n const encodedValue = encodeURIComponent(cookie.value)\n return `${encodedName}=${encodedValue}`\n })\n .join('; ')\n parts.push(`--cookie '${cookieString}'`)\n }\n\n // Body\n if (normalizedRequest.postData) {\n if (normalizedRequest.postData.mimeType === 'application/json') {\n // Pretty print JSON data\n if (normalizedRequest.postData.text) {\n try {\n const jsonData = JSON.parse(normalizedRequest.postData.text)\n const prettyJson = JSON.stringify(jsonData, null, 2)\n parts.push(`--data '${prettyJson}'`)\n } catch {\n // If JSON parsing fails, use the original text\n parts.push(`--data '${normalizedRequest.postData.text}'`)\n }\n }\n } else if (normalizedRequest.postData.mimeType === 'application/octet-stream') {\n parts.push(`--data-binary '${normalizedRequest.postData.text}'`)\n } else if (\n normalizedRequest.postData.mimeType === 'application/x-www-form-urlencoded' &&\n normalizedRequest.postData.params\n ) {\n // Handle URL-encoded form data\n normalizedRequest.postData.params.forEach((param) => {\n parts.push(`--data-urlencode '${encodeURIComponent(param.name)}=${param.value}'`)\n })\n } else if (normalizedRequest.postData.mimeType === 'multipart/form-data' && normalizedRequest.postData.params) {\n // Handle multipart form data\n normalizedRequest.postData.params.forEach((param) => {\n if (param.fileName !== undefined) {\n parts.push(`--form '${param.name}=@${param.fileName}'`)\n } else {\n parts.push(`--form '${param.name}=${param.value}'`)\n }\n })\n } else {\n // Try to parse and pretty print if it's JSON, otherwise use raw text\n try {\n const jsonData = JSON.parse(normalizedRequest.postData.text ?? '')\n const prettyJson = JSON.stringify(jsonData, null, 2)\n parts.push(`--data '${prettyJson}'`)\n } catch {\n parts.push(`--data '${normalizedRequest.postData.text}'`)\n }\n }\n }\n\n return parts.join(' \\\\\\n ')\n },\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Plugin } from '@scalar/types/snippetz'\n\nimport { escapeSingleQuotes } from '@/libs/shell'\n\n/**\n * shell/curl\n */\nexport const shellCurl: Plugin = {\n target: 'shell',\n client: 'curl',\n title: 'Curl',\n generate(request, configuration) {\n // Defaults\n const normalizedRequest = {\n method: 'GET',\n ...request,\n }\n\n // Normalization\n normalizedRequest.method = normalizedRequest.method.toUpperCase()\n\n // Build curl command parts\n const parts: string[] = ['curl']\n\n // URL (quote if has query parameters or special characters)\n const queryString = normalizedRequest.queryString?.length\n ? '?' +\n normalizedRequest.queryString\n .map((param) => {\n // Ensure both name and value are fully URI encoded\n const encodedName = encodeURIComponent(param.name)\n const encodedValue = encodeURIComponent(param.value)\n return `${encodedName}=${encodedValue}`\n })\n .join('&')\n : ''\n const url = `${normalizedRequest.url}${queryString}`\n const hasSpecialChars = /[\\s<>[\\]{}|\\\\^%$]/.test(url)\n const urlPart = queryString || hasSpecialChars ? `'${url}'` : url\n parts[0] = `curl ${urlPart}`\n\n // Method\n if (normalizedRequest.method !== 'GET') {\n parts.push(`--request ${normalizedRequest.method}`)\n }\n\n // Basic Auth\n if (configuration?.auth?.username && configuration?.auth?.password) {\n const authValue = escapeSingleQuotes(`${configuration.auth.username}:${configuration.auth.password}`)\n parts.push(`--user '${authValue}'`)\n }\n\n // Headers\n if (normalizedRequest.headers?.length) {\n normalizedRequest.headers.forEach((header) => {\n const headerValue = escapeSingleQuotes(`${header.name}: ${header.value}`)\n parts.push(`--header '${headerValue}'`)\n })\n\n // Add compressed flag if Accept-Encoding header includes compression\n const acceptEncoding = normalizedRequest.headers.find((header) => header.name.toLowerCase() === 'accept-encoding')\n if (acceptEncoding && /gzip|deflate/.test(acceptEncoding.value)) {\n parts.push('--compressed')\n }\n }\n\n // Cookies\n if (normalizedRequest.cookies?.length) {\n const cookieString = normalizedRequest.cookies\n .map((cookie) => {\n // Encode both cookie name and value to handle special characters\n const encodedName = encodeURIComponent(cookie.name)\n const encodedValue = encodeURIComponent(cookie.value)\n return `${encodedName}=${encodedValue}`\n })\n .join('; ')\n const escapedCookieString = escapeSingleQuotes(cookieString)\n parts.push(`--cookie '${escapedCookieString}'`)\n }\n\n // Body\n if (normalizedRequest.postData) {\n if (normalizedRequest.postData.mimeType === 'application/json') {\n // Pretty print JSON data\n if (normalizedRequest.postData.text) {\n try {\n const jsonData = JSON.parse(normalizedRequest.postData.text)\n const prettyJson = JSON.stringify(jsonData, null, 2)\n const escapedJson = escapeSingleQuotes(prettyJson)\n parts.push(`--data '${escapedJson}'`)\n } catch {\n // If JSON parsing fails, use the original text\n const escapedText = escapeSingleQuotes(normalizedRequest.postData.text ?? '')\n parts.push(`--data '${escapedText}'`)\n }\n }\n } else if (normalizedRequest.postData.mimeType === 'application/octet-stream') {\n const escapedText = escapeSingleQuotes(normalizedRequest.postData.text ?? '')\n parts.push(`--data-binary '${escapedText}'`)\n } else if (\n normalizedRequest.postData.mimeType === 'application/x-www-form-urlencoded' &&\n normalizedRequest.postData.params\n ) {\n // Handle URL-encoded form data\n normalizedRequest.postData.params.forEach((param) => {\n const escapedValue = escapeSingleQuotes(param.value ?? '')\n const encodedName = encodeURIComponent(param.name)\n const escapedName = escapeSingleQuotes(encodedName)\n parts.push(`--data-urlencode '${escapedName}=${escapedValue}'`)\n })\n } else if (normalizedRequest.postData.mimeType === 'multipart/form-data' && normalizedRequest.postData.params) {\n // Handle multipart form data\n normalizedRequest.postData.params.forEach((param) => {\n const escapedName = escapeSingleQuotes(param.name)\n if (param.fileName !== undefined) {\n const escapedFileName = escapeSingleQuotes(param.fileName)\n parts.push(`--form '${escapedName}=@${escapedFileName}'`)\n } else {\n const escapedValue = escapeSingleQuotes(param.value ?? '')\n parts.push(`--form '${escapedName}=${escapedValue}'`)\n }\n })\n } else {\n // Try to parse and pretty print if it's JSON, otherwise use raw text\n try {\n const jsonData = JSON.parse(normalizedRequest.postData.text ?? '')\n const prettyJson = JSON.stringify(jsonData, null, 2)\n const escapedJson = escapeSingleQuotes(prettyJson)\n parts.push(`--data '${escapedJson}'`)\n } catch {\n const escapedText = escapeSingleQuotes(normalizedRequest.postData.text ?? '')\n parts.push(`--data '${escapedText}'`)\n }\n }\n }\n\n return parts.join(' \\\\\\n ')\n },\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"convertWithHttpSnippetLite.d.ts","sourceRoot":"","sources":["../../src/utils/convertWithHttpSnippetLite.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAExD;;;;GAIG;AACH,wBAAgB,0BAA0B,CAExC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAC5B,MAAM,CAwHR"}
1
+ {"version":3,"file":"convertWithHttpSnippetLite.d.ts","sourceRoot":"","sources":["../../src/utils/convertWithHttpSnippetLite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAIxD;;;;GAIG;AACH,wBAAgB,0BAA0B,CAExC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAC5B,MAAM,CAwHR"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/convertWithHttpSnippetLite.ts"],
4
- "sourcesContent": ["import type { Request } from '@/httpsnippet-lite/types/httpsnippet'\nimport type { HarRequest } from '@scalar/types/snippetz'\n\n/**\n * Takes a httpsnippet-lite client and converts the given request to a code example with it.\n *\n * @deprecated This a temporary wrapper around httpsnippet-lite. Let's write all the generators ourselves instead.\n */\nexport function convertWithHttpSnippetLite(\n // Couldn't find the proper type, there was always a mismatch.\n client: Record<string, unknown>,\n request?: Partial<HarRequest>,\n): string {\n const urlObject = new URL(request?.url ?? '')\n\n // If it's just the domain, omit the trailing slash\n const url = urlObject.pathname === '/' ? urlObject.origin : urlObject.toString()\n\n const harRequest: HarRequest = {\n method: request?.method ?? 'GET',\n url,\n httpVersion: 'HTTP/1.1',\n cookies: [], // Cookies are handled through headers\n headers: request?.headers ?? [],\n headersSize: -1,\n bodySize: -1,\n queryString: Array.from(urlObject.searchParams.entries()).map(([name, value]) => ({\n name,\n value,\n })),\n postData: request?.postData,\n }\n\n const allHeaders = (harRequest?.headers ?? []).reduce(\n (acc, header) => ({\n ...acc,\n [header.name]: header.value,\n }),\n {} as Record<string, string>,\n )\n\n const queryObj = (harRequest.queryString ?? []).reduce(\n (acc, param) => ({\n ...acc,\n [param.name]: param.value,\n }),\n {} as Record<string, string>,\n )\n\n const cookiesObj = (harRequest.cookies ?? []).reduce(\n (acc, cookie) => ({\n ...acc,\n [cookie.name]: cookie.value,\n }),\n {} as Record<string, string>,\n )\n\n const parsedUrl = new URL(harRequest.url)\n const uriObj = {\n protocol: parsedUrl.protocol,\n hostname: parsedUrl.hostname,\n host: parsedUrl.hostname,\n port: parsedUrl.port,\n pathname:\n parsedUrl.pathname\n .split('/')\n .map((segment) => encodeURIComponent(decodeURIComponent(segment)))\n .join('/') + parsedUrl.search,\n path:\n parsedUrl.pathname\n .split('/')\n .map((segment) => encodeURIComponent(decodeURIComponent(segment)))\n .join('/') + parsedUrl.search,\n search: parsedUrl.search,\n hash: parsedUrl.hash,\n href: parsedUrl.href,\n origin: parsedUrl.origin,\n password: parsedUrl.password,\n searchParams: parsedUrl.searchParams,\n username: parsedUrl.username,\n toString: parsedUrl.toString,\n toJSON: () => parsedUrl.toJSON(),\n }\n\n const convertRequest = {\n url: harRequest.url,\n uriObj,\n method: harRequest.method?.toLocaleUpperCase() ?? 'GET',\n httpVersion: harRequest.httpVersion,\n cookies: harRequest.cookies ?? [],\n headers: harRequest.headers ?? [],\n headersSize: harRequest.headersSize ?? 0,\n headersObj: allHeaders ?? {},\n bodySize: harRequest.bodySize ?? 0,\n queryString: harRequest.queryString ?? [],\n postData: harRequest.postData\n ? {\n mimeType: harRequest.postData.mimeType ?? 'application/json',\n text: harRequest.postData.text ?? '',\n params: harRequest.postData.params ?? [],\n paramsObj:\n harRequest.postData.params?.reduce(\n (acc, param) => {\n if (param.name && param.value !== undefined) {\n acc[param.name] = param.value\n }\n return acc\n },\n {} as Record<string, string>,\n ) ?? {},\n }\n : undefined,\n allHeaders: allHeaders ?? {},\n fullUrl: harRequest.url,\n queryObj: queryObj ?? {},\n cookiesObj: cookiesObj ?? {},\n } as Request\n\n // If the request is a JSON request, parse the text as JSON\n if (convertRequest.postData?.mimeType === 'application/json' && convertRequest.postData?.text) {\n try {\n convertRequest.postData.jsonObj = JSON.parse(convertRequest.postData.text)\n } catch (error) {\n console.error('Error parsing JSON:', error)\n }\n }\n\n if (typeof client.convert === 'function') {\n return client.convert(convertRequest)\n }\n\n return ''\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { HarRequest } from '@scalar/types/snippetz'\n\nimport type { Request } from '@/httpsnippet-lite/types/httpsnippet'\n\n/**\n * Takes a httpsnippet-lite client and converts the given request to a code example with it.\n *\n * @deprecated This a temporary wrapper around httpsnippet-lite. Let's write all the generators ourselves instead.\n */\nexport function convertWithHttpSnippetLite(\n // Couldn't find the proper type, there was always a mismatch.\n client: Record<string, unknown>,\n request?: Partial<HarRequest>,\n): string {\n const urlObject = new URL(request?.url ?? '')\n\n // If it's just the domain, omit the trailing slash\n const url = urlObject.pathname === '/' ? urlObject.origin : urlObject.toString()\n\n const harRequest: HarRequest = {\n method: request?.method ?? 'GET',\n url,\n httpVersion: 'HTTP/1.1',\n cookies: [], // Cookies are handled through headers\n headers: request?.headers ?? [],\n headersSize: -1,\n bodySize: -1,\n queryString: Array.from(urlObject.searchParams.entries()).map(([name, value]) => ({\n name,\n value,\n })),\n postData: request?.postData,\n }\n\n const allHeaders = (harRequest?.headers ?? []).reduce(\n (acc, header) => ({\n ...acc,\n [header.name]: header.value,\n }),\n {} as Record<string, string>,\n )\n\n const queryObj = (harRequest.queryString ?? []).reduce(\n (acc, param) => ({\n ...acc,\n [param.name]: param.value,\n }),\n {} as Record<string, string>,\n )\n\n const cookiesObj = (harRequest.cookies ?? []).reduce(\n (acc, cookie) => ({\n ...acc,\n [cookie.name]: cookie.value,\n }),\n {} as Record<string, string>,\n )\n\n const parsedUrl = new URL(harRequest.url)\n const uriObj = {\n protocol: parsedUrl.protocol,\n hostname: parsedUrl.hostname,\n host: parsedUrl.hostname,\n port: parsedUrl.port,\n pathname:\n parsedUrl.pathname\n .split('/')\n .map((segment) => encodeURIComponent(decodeURIComponent(segment)))\n .join('/') + parsedUrl.search,\n path:\n parsedUrl.pathname\n .split('/')\n .map((segment) => encodeURIComponent(decodeURIComponent(segment)))\n .join('/') + parsedUrl.search,\n search: parsedUrl.search,\n hash: parsedUrl.hash,\n href: parsedUrl.href,\n origin: parsedUrl.origin,\n password: parsedUrl.password,\n searchParams: parsedUrl.searchParams,\n username: parsedUrl.username,\n toString: parsedUrl.toString,\n toJSON: () => parsedUrl.toJSON(),\n }\n\n const convertRequest = {\n url: harRequest.url,\n uriObj,\n method: harRequest.method?.toLocaleUpperCase() ?? 'GET',\n httpVersion: harRequest.httpVersion,\n cookies: harRequest.cookies ?? [],\n headers: harRequest.headers ?? [],\n headersSize: harRequest.headersSize ?? 0,\n headersObj: allHeaders ?? {},\n bodySize: harRequest.bodySize ?? 0,\n queryString: harRequest.queryString ?? [],\n postData: harRequest.postData\n ? {\n mimeType: harRequest.postData.mimeType ?? 'application/json',\n text: harRequest.postData.text ?? '',\n params: harRequest.postData.params ?? [],\n paramsObj:\n harRequest.postData.params?.reduce(\n (acc, param) => {\n if (param.name && param.value !== undefined) {\n acc[param.name] = param.value\n }\n return acc\n },\n {} as Record<string, string>,\n ) ?? {},\n }\n : undefined,\n allHeaders: allHeaders ?? {},\n fullUrl: harRequest.url,\n queryObj: queryObj ?? {},\n cookiesObj: cookiesObj ?? {},\n } as Request\n\n // If the request is a JSON request, parse the text as JSON\n if (convertRequest.postData?.mimeType === 'application/json' && convertRequest.postData?.text) {\n try {\n convertRequest.postData.jsonObj = JSON.parse(convertRequest.postData.text)\n } catch (error) {\n console.error('Error parsing JSON:', error)\n }\n }\n\n if (typeof client.convert === 'function') {\n return client.convert(convertRequest)\n }\n\n return ''\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,2 @@
1
1
  export * from './convertWithHttpSnippetLite.js';
2
- export * from './needsQuotes.js';
3
- export * from './objectToString.js';
4
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAA;AAC5C,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAA"}
@@ -1,4 +1,2 @@
1
1
  export * from "./convertWithHttpSnippetLite.js";
2
- export * from "./needsQuotes.js";
3
- export * from "./objectToString.js";
4
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/index.ts"],
4
- "sourcesContent": ["export * from './convertWithHttpSnippetLite'\nexport * from './needsQuotes'\nexport * from './objectToString'\n"],
5
- "mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;",
4
+ "sourcesContent": ["export * from './convertWithHttpSnippetLite'\n"],
5
+ "mappings": "AAAA,cAAc;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "url": "git+https://github.com/scalar/scalar.git",
10
10
  "directory": "packages/snippetz"
11
11
  },
12
- "version": "0.5.3",
12
+ "version": "0.5.4",
13
13
  "engines": {
14
14
  "node": ">=20"
15
15
  },
@@ -230,11 +230,11 @@
230
230
  "dependencies": {
231
231
  "js-base64": "^3.7.8",
232
232
  "stringify-object": "^5.0.0",
233
- "@scalar/types": "0.5.0"
233
+ "@scalar/types": "0.5.1"
234
234
  },
235
235
  "devDependencies": {
236
236
  "vite": "7.1.11",
237
- "@scalar/build-tooling": "0.3.0"
237
+ "@scalar/build-tooling": "0.3.1"
238
238
  },
239
239
  "scripts": {
240
240
  "build": "scalar-build-esbuild",
@@ -1,9 +0,0 @@
1
- /**
2
- * Utilities for escaping strings in Rust code generation
3
- */
4
- /**
5
- * Safely formats a string for use in Rust string literals
6
- * Returns the escaped string wrapped in double quotes
7
- */
8
- export declare function toRustString(str: string): string;
9
- //# sourceMappingURL=rustString.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rustString.d.ts","sourceRoot":"","sources":["../../../src/plugins/rust/rustString.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD"}
@@ -1,10 +0,0 @@
1
- function escapeRustString(str) {
2
- return str.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t").replace(/\0/g, "\\0");
3
- }
4
- function toRustString(str) {
5
- return `"${escapeRustString(str)}"`;
6
- }
7
- export {
8
- toRustString
9
- };
10
- //# sourceMappingURL=rustString.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/plugins/rust/rustString.ts"],
4
- "sourcesContent": ["/**\n * Utilities for escaping strings in Rust code generation\n */\n\n/**\n * Escapes a string for use in Rust string literals\n * Handles quotes, backslashes, newlines, and other special characters\n */\nfunction escapeRustString(str: string): string {\n return str\n .replace(/\\\\/g, '\\\\\\\\') // Escape backslashes first\n .replace(/\"/g, '\\\\\"') // Escape double quotes\n .replace(/\\n/g, '\\\\n') // Escape newlines\n .replace(/\\r/g, '\\\\r') // Escape carriage returns\n .replace(/\\t/g, '\\\\t') // Escape tabs\n .replace(/\\0/g, '\\\\0') // Escape null bytes\n}\n\n/**\n * Safely formats a string for use in Rust string literals\n * Returns the escaped string wrapped in double quotes\n */\nexport function toRustString(str: string): string {\n return `\"${escapeRustString(str)}\"`\n}\n"],
5
- "mappings": "AAQA,SAAS,iBAAiB,KAAqB;AAC7C,SAAO,IACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAM,KAAK,EACnB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK;AACzB;AAMO,SAAS,aAAa,KAAqB;AAChD,SAAO,IAAI,iBAAiB,GAAG,CAAC;AAClC;",
6
- "names": []
7
- }
@@ -1,4 +0,0 @@
1
- import type { HarRequest } from '@scalar/types/snippetz';
2
- /** Creates a new URL search params object and sets query params so we can handle arrays */
3
- export declare const createSearchParams: (query?: HarRequest["queryString"]) => URLSearchParams;
4
- //# sourceMappingURL=create-search-params.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-search-params.d.ts","sourceRoot":"","sources":["../../src/utils/create-search-params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAExD,2FAA2F;AAC3F,eAAO,MAAM,kBAAkB,GAAI,QAAO,UAAU,CAAC,aAAa,CAAM,oBAMvE,CAAA"}
@@ -1,11 +0,0 @@
1
- const createSearchParams = (query = []) => {
2
- const searchParams = new URLSearchParams();
3
- query.forEach((q) => {
4
- searchParams.append(q.name, q.value);
5
- });
6
- return searchParams;
7
- };
8
- export {
9
- createSearchParams
10
- };
11
- //# sourceMappingURL=create-search-params.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/create-search-params.ts"],
4
- "sourcesContent": ["import type { HarRequest } from '@scalar/types/snippetz'\n\n/** Creates a new URL search params object and sets query params so we can handle arrays */\nexport const createSearchParams = (query: HarRequest['queryString'] = []) => {\n const searchParams = new URLSearchParams()\n query.forEach((q) => {\n searchParams.append(q.name, q.value)\n })\n return searchParams\n}\n"],
5
- "mappings": "AAGO,MAAM,qBAAqB,CAAC,QAAmC,CAAC,MAAM;AAC3E,QAAM,eAAe,IAAI,gBAAgB;AACzC,QAAM,QAAQ,CAAC,MAAM;AACnB,iBAAa,OAAO,EAAE,MAAM,EAAE,KAAK;AAAA,EACrC,CAAC;AACD,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- /**
2
- * Checks if a key needs to be wrapped in quotes when used as an object property
3
- *
4
- * Returns true if the key contains spaces or hyphens
5
- */
6
- export declare function needsQuotes(key: string): boolean;
7
- //# sourceMappingURL=needsQuotes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"needsQuotes.d.ts","sourceRoot":"","sources":["../../src/utils/needsQuotes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,WAEtC"}
@@ -1,7 +0,0 @@
1
- function needsQuotes(key) {
2
- return /\s|-/.test(key);
3
- }
4
- export {
5
- needsQuotes
6
- };
7
- //# sourceMappingURL=needsQuotes.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/needsQuotes.ts"],
4
- "sourcesContent": ["/**\n * Checks if a key needs to be wrapped in quotes when used as an object property\n *\n * Returns true if the key contains spaces or hyphens\n */\nexport function needsQuotes(key: string) {\n return /\\s|-/.test(key)\n}\n"],
5
- "mappings": "AAKO,SAAS,YAAY,KAAa;AACvC,SAAO,OAAO,KAAK,GAAG;AACxB;",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"objectToString.d.ts","sourceRoot":"","sources":["../../src/utils/objectToString.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,qBAAa,QAAQ;IACA,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM;CACjC;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,SAAI,GAAG,MAAM,CA2D3E"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/objectToString.ts"],
4
- "sourcesContent": ["import { needsQuotes } from './needsQuotes'\n\n/**\n * Represents a raw code that should not be quoted, e.g. `JSON.stringify(...)`.\n * If consists of multiple lines, they will be indented properly.\n */\nexport class Unquoted {\n constructor(public value: string) {}\n}\n\n/**\n * Converts an object into a string representation with proper formatting and indentation\n *\n * Handles nested objects, arrays, and special string values\n */\nexport function objectToString(obj: Record<string, any>, indent = 0): string {\n const parts = []\n const indentation = ' '.repeat(indent)\n const innerIndentation = ' '.repeat(indent + 2)\n\n if (Object.keys(obj).length === 0) {\n return '{}'\n }\n\n for (const [key, value] of Object.entries(obj)) {\n const formattedKey = needsQuotes(key) ? `'${key}'` : key\n\n if (value instanceof Unquoted) {\n const lines = value.value.split('\\n')\n let formattedValue = `${value.value}`\n\n if (lines.length > 1) {\n formattedValue = lines\n .map((line, index) => {\n if (index === 0) {\n return line\n }\n\n return `${innerIndentation}${line}`\n })\n .join('\\n')\n }\n\n parts.push(`${innerIndentation}${formattedKey}: ${formattedValue}`)\n } else if (Array.isArray(value)) {\n const items = value.map((item) => {\n if (typeof item === 'string') {\n return `'${item}'`\n }\n if (item && typeof item === 'object') {\n return objectToString(item)\n }\n return JSON.stringify(item)\n })\n\n if (items.some((item) => item.includes('\\n'))) {\n // format vertically if any array element contains a newline\n const arrayString = items.map((item) => indentString(item, indent + 4)).join(',\\n')\n parts.push(`${innerIndentation}${formattedKey}: [\\n${arrayString}\\n${innerIndentation}]`)\n } else {\n parts.push(`${innerIndentation}${formattedKey}: [${items.join(', ')}]`)\n }\n } else if (value && typeof value === 'object') {\n parts.push(`${innerIndentation}${formattedKey}: ${objectToString(value, indent + 2)}`)\n } else if (typeof value === 'string') {\n const formattedValue = `'${value}'`\n\n parts.push(`${innerIndentation}${formattedKey}: ${formattedValue}`)\n } else {\n parts.push(`${innerIndentation}${formattedKey}: ${value}`)\n }\n }\n\n return `{\\n${parts.join(',\\n')}\\n${indentation}}`\n}\n\nfunction indentString(str: string, indent: number) {\n const indentation = ' '.repeat(indent)\n return str\n .split('\\n')\n .map((line) => `${indentation}${line}`)\n .join('\\n')\n}\n"],
5
- "mappings": "AAAA,SAAS,mBAAmB;AAMrB,MAAM,SAAS;AAAA,EACpB,YAAmB,OAAe;AAAf;AAAA,EAAgB;AACrC;AAOO,SAAS,eAAe,KAA0B,SAAS,GAAW;AAC3E,QAAM,QAAQ,CAAC;AACf,QAAM,cAAc,IAAI,OAAO,MAAM;AACrC,QAAM,mBAAmB,IAAI,OAAO,SAAS,CAAC;AAE9C,MAAI,OAAO,KAAK,GAAG,EAAE,WAAW,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,UAAM,eAAe,YAAY,GAAG,IAAI,IAAI,GAAG,MAAM;AAErD,QAAI,iBAAiB,UAAU;AAC7B,YAAM,QAAQ,MAAM,MAAM,MAAM,IAAI;AACpC,UAAI,iBAAiB,GAAG,MAAM,KAAK;AAEnC,UAAI,MAAM,SAAS,GAAG;AACpB,yBAAiB,MACd,IAAI,CAAC,MAAM,UAAU;AACpB,cAAI,UAAU,GAAG;AACf,mBAAO;AAAA,UACT;AAEA,iBAAO,GAAG,gBAAgB,GAAG,IAAI;AAAA,QACnC,CAAC,EACA,KAAK,IAAI;AAAA,MACd;AAEA,YAAM,KAAK,GAAG,gBAAgB,GAAG,YAAY,KAAK,cAAc,EAAE;AAAA,IACpE,WAAW,MAAM,QAAQ,KAAK,GAAG;AAC/B,YAAM,QAAQ,MAAM,IAAI,CAAC,SAAS;AAChC,YAAI,OAAO,SAAS,UAAU;AAC5B,iBAAO,IAAI,IAAI;AAAA,QACjB;AACA,YAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,iBAAO,eAAe,IAAI;AAAA,QAC5B;AACA,eAAO,KAAK,UAAU,IAAI;AAAA,MAC5B,CAAC;AAED,UAAI,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,GAAG;AAE7C,cAAM,cAAc,MAAM,IAAI,CAAC,SAAS,aAAa,MAAM,SAAS,CAAC,CAAC,EAAE,KAAK,KAAK;AAClF,cAAM,KAAK,GAAG,gBAAgB,GAAG,YAAY;AAAA,EAAQ,WAAW;AAAA,EAAK,gBAAgB,GAAG;AAAA,MAC1F,OAAO;AACL,cAAM,KAAK,GAAG,gBAAgB,GAAG,YAAY,MAAM,MAAM,KAAK,IAAI,CAAC,GAAG;AAAA,MACxE;AAAA,IACF,WAAW,SAAS,OAAO,UAAU,UAAU;AAC7C,YAAM,KAAK,GAAG,gBAAgB,GAAG,YAAY,KAAK,eAAe,OAAO,SAAS,CAAC,CAAC,EAAE;AAAA,IACvF,WAAW,OAAO,UAAU,UAAU;AACpC,YAAM,iBAAiB,IAAI,KAAK;AAEhC,YAAM,KAAK,GAAG,gBAAgB,GAAG,YAAY,KAAK,cAAc,EAAE;AAAA,IACpE,OAAO;AACL,YAAM,KAAK,GAAG,gBAAgB,GAAG,YAAY,KAAK,KAAK,EAAE;AAAA,IAC3D;AAAA,EACF;AAEA,SAAO;AAAA,EAAM,MAAM,KAAK,KAAK,CAAC;AAAA,EAAK,WAAW;AAChD;AAEA,SAAS,aAAa,KAAa,QAAgB;AACjD,QAAM,cAAc,IAAI,OAAO,MAAM;AACrC,SAAO,IACJ,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,GAAG,WAAW,GAAG,IAAI,EAAE,EACrC,KAAK,IAAI;AACd;",
6
- "names": []
7
- }