@scalar/helpers 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/LICENSE +21 -0
- package/dist/array/is-defined.d.ts +13 -0
- package/dist/array/is-defined.d.ts.map +1 -0
- package/dist/array/is-defined.js +5 -0
- package/dist/array/is-defined.js.map +7 -0
- package/dist/dom/freeze-element.d.ts +11 -0
- package/dist/dom/freeze-element.d.ts.map +1 -0
- package/dist/dom/freeze-element.js +45 -0
- package/dist/dom/freeze-element.js.map +7 -0
- package/dist/dom/scroll-to-id.d.ts +7 -0
- package/dist/dom/scroll-to-id.d.ts.map +1 -0
- package/dist/dom/scroll-to-id.js +29 -0
- package/dist/dom/scroll-to-id.js.map +7 -0
- package/dist/file/json2xml.d.ts +5 -0
- package/dist/file/json2xml.d.ts.map +1 -0
- package/dist/file/json2xml.js +47 -0
- package/dist/file/json2xml.js.map +7 -0
- package/dist/general/is-mac-os.d.ts +6 -0
- package/dist/general/is-mac-os.d.ts.map +1 -0
- package/dist/general/is-mac-os.js +13 -0
- package/dist/general/is-mac-os.js.map +7 -0
- package/dist/http/can-method-have-body.d.ts +8 -0
- package/dist/http/can-method-have-body.d.ts.map +1 -0
- package/dist/http/can-method-have-body.js +6 -0
- package/dist/http/can-method-have-body.js.map +7 -0
- package/dist/http/http-info.d.ts +116 -0
- package/dist/http/http-info.d.ts.map +1 -0
- package/dist/http/http-info.js +69 -0
- package/dist/http/http-info.js.map +7 -0
- package/dist/http/http-methods.d.ts +7 -0
- package/dist/http/http-methods.d.ts.map +1 -0
- package/dist/http/http-methods.js +7 -0
- package/dist/http/http-methods.js.map +7 -0
- package/dist/http/http-status-codes.d.ts +8 -0
- package/dist/http/http-status-codes.d.ts.map +1 -0
- package/dist/http/http-status-codes.js +321 -0
- package/dist/http/http-status-codes.js.map +7 -0
- package/dist/http/is-http-method.d.ts +4 -0
- package/dist/http/is-http-method.d.ts.map +1 -0
- package/dist/http/is-http-method.js +6 -0
- package/dist/http/is-http-method.js.map +7 -0
- package/dist/http/normalize-http-method.d.ts +7 -0
- package/dist/http/normalize-http-method.d.ts.map +1 -0
- package/dist/http/normalize-http-method.js +20 -0
- package/dist/http/normalize-http-method.js.map +7 -0
- package/dist/object/local-storage.d.ts +37 -0
- package/dist/object/local-storage.d.ts.map +1 -0
- package/dist/object/local-storage.js +30 -0
- package/dist/object/local-storage.js.map +7 -0
- package/dist/object/object-keys.d.ts +6 -0
- package/dist/object/object-keys.d.ts.map +1 -0
- package/dist/object/object-keys.js +5 -0
- package/dist/object/object-keys.js.map +7 -0
- package/dist/object/object-replace.d.ts +5 -0
- package/dist/object/object-replace.d.ts.map +1 -0
- package/dist/object/object-replace.js +13 -0
- package/dist/object/object-replace.js.map +7 -0
- package/dist/object/omit-undefined-values.d.ts +7 -0
- package/dist/object/omit-undefined-values.d.ts.map +1 -0
- package/dist/object/omit-undefined-values.js +19 -0
- package/dist/object/omit-undefined-values.js.map +7 -0
- package/dist/regex/find-variables.d.ts +5 -0
- package/dist/regex/find-variables.d.ts.map +1 -0
- package/dist/regex/find-variables.js +6 -0
- package/dist/regex/find-variables.js.map +7 -0
- package/dist/regex/regex-helpers.d.ts +10 -0
- package/dist/regex/regex-helpers.d.ts.map +1 -0
- package/dist/regex/regex-helpers.js +13 -0
- package/dist/regex/regex-helpers.js.map +7 -0
- package/dist/regex/replace-variables.d.ts +5 -0
- package/dist/regex/replace-variables.d.ts.map +1 -0
- package/dist/regex/replace-variables.js +15 -0
- package/dist/regex/replace-variables.js.map +7 -0
- package/dist/string/camel-to-title.d.ts +7 -0
- package/dist/string/camel-to-title.d.ts.map +1 -0
- package/dist/string/camel-to-title.js +5 -0
- package/dist/string/camel-to-title.js.map +7 -0
- package/dist/string/capitalize.d.ts +6 -0
- package/dist/string/capitalize.d.ts.map +1 -0
- package/dist/string/capitalize.js +5 -0
- package/dist/string/capitalize.js.map +7 -0
- package/dist/string/create-hash.d.ts +7 -0
- package/dist/string/create-hash.d.ts.map +1 -0
- package/dist/string/create-hash.js +18 -0
- package/dist/string/create-hash.js.map +7 -0
- package/dist/string/iterate-title.d.ts +5 -0
- package/dist/string/iterate-title.d.ts.map +1 -0
- package/dist/string/iterate-title.js +12 -0
- package/dist/string/iterate-title.js.map +7 -0
- package/dist/testing/console-spies.d.ts +17 -0
- package/dist/testing/console-spies.d.ts.map +1 -0
- package/dist/testing/console-spies.js +25 -0
- package/dist/testing/console-spies.js.map +7 -0
- package/dist/testing/measure.d.ts +26 -0
- package/dist/testing/measure.d.ts.map +1 -0
- package/dist/testing/measure.js +12 -0
- package/dist/testing/measure.js.map +7 -0
- package/dist/testing/sleep.d.ts +6 -0
- package/dist/testing/sleep.d.ts.map +1 -0
- package/dist/testing/sleep.js +5 -0
- package/dist/testing/sleep.js.map +7 -0
- package/dist/url/ensure-protocol.d.ts +3 -0
- package/dist/url/ensure-protocol.d.ts.map +1 -0
- package/dist/url/ensure-protocol.js +11 -0
- package/dist/url/ensure-protocol.js.map +7 -0
- package/dist/url/is-local-url.d.ts +5 -0
- package/dist/url/is-local-url.d.ts.map +1 -0
- package/dist/url/is-local-url.js +13 -0
- package/dist/url/is-local-url.js.map +7 -0
- package/dist/url/is-relative-path.d.ts +5 -0
- package/dist/url/is-relative-path.d.ts.map +1 -0
- package/dist/url/is-relative-path.js +14 -0
- package/dist/url/is-relative-path.js.map +7 -0
- package/dist/url/is-valid-url.d.ts +12 -0
- package/dist/url/is-valid-url.d.ts.map +1 -0
- package/dist/url/is-valid-url.js +11 -0
- package/dist/url/is-valid-url.js.map +7 -0
- package/dist/url/make-url-absolute.d.ts +5 -0
- package/dist/url/make-url-absolute.d.ts.map +1 -0
- package/dist/url/make-url-absolute.js +13 -0
- package/dist/url/make-url-absolute.js.map +7 -0
- package/dist/url/merge-urls.d.ts +15 -0
- package/dist/url/merge-urls.d.ts.map +1 -0
- package/dist/url/merge-urls.js +56 -0
- package/dist/url/merge-urls.js.map +7 -0
- package/package.json +95 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/regex/find-variables.ts"],
|
|
4
|
+
"sourcesContent": ["import { REGEX } from './regex-helpers'\n\n/**\n * Find all strings wrapped in {} or {{}} in value.\n */\nexport const findVariables = (value: string) =>\n [...value.matchAll(REGEX.PATH), ...value.matchAll(REGEX.VARIABLES)].map((match) => match[1]?.trim()) || []\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,aAAa;AAKf,MAAM,gBAAgB,CAAC,UAC5B,CAAC,GAAG,MAAM,SAAS,MAAM,IAAI,GAAG,GAAG,MAAM,SAAS,MAAM,SAAS,CAAC,EAAE,IAAI,CAAC,UAAU,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const REGEX: {
|
|
2
|
+
/** Checks for a valid scheme */
|
|
3
|
+
readonly PROTOCOL: RegExp;
|
|
4
|
+
/** Finds multiple slashes after the scheme to replace with a single slash */
|
|
5
|
+
readonly MULTIPLE_SLASHES: RegExp;
|
|
6
|
+
readonly VARIABLES: RegExp;
|
|
7
|
+
readonly PATH: RegExp;
|
|
8
|
+
readonly TEMPLATE_VARIABLE: RegExp;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=regex-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regex-helpers.d.ts","sourceRoot":"","sources":["../../src/regex/regex-helpers.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK;IAChB,gCAAgC;;IAEhC,6EAA6E;;;;;CAKrE,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const REGEX = {
|
|
2
|
+
/** Checks for a valid scheme */
|
|
3
|
+
PROTOCOL: /^(?:https?|ftp|file|mailto|tel|data|wss?)*:\/\//,
|
|
4
|
+
/** Finds multiple slashes after the scheme to replace with a single slash */
|
|
5
|
+
MULTIPLE_SLASHES: /(?<!:)\/{2,}/g,
|
|
6
|
+
VARIABLES: /{{((?:[^{}]|{[^{}]*})*)}}/g,
|
|
7
|
+
PATH: /(?:{)([^{}]+)}(?!})/g,
|
|
8
|
+
TEMPLATE_VARIABLE: /{{\s*([^}\s]+?)\s*}}|{\s*([^}\s]+?)\s*}|:\b[\w.]+\b/g
|
|
9
|
+
};
|
|
10
|
+
export {
|
|
11
|
+
REGEX
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=regex-helpers.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/regex/regex-helpers.ts"],
|
|
4
|
+
"sourcesContent": ["export const REGEX = {\n /** Checks for a valid scheme */\n PROTOCOL: /^(?:https?|ftp|file|mailto|tel|data|wss?)*:\\/\\//,\n /** Finds multiple slashes after the scheme to replace with a single slash */\n MULTIPLE_SLASHES: /(?<!:)\\/{2,}/g,\n VARIABLES: /{{((?:[^{}]|{[^{}]*})*)}}/g,\n PATH: /(?:{)([^{}]+)}(?!})/g,\n TEMPLATE_VARIABLE: /{{\\s*([^}\\s]+?)\\s*}}|{\\s*([^}\\s]+?)\\s*}|:\\b[\\w.]+\\b/g,\n} as const\n"],
|
|
5
|
+
"mappings": "AAAO,MAAM,QAAQ;AAAA;AAAA,EAEnB,UAAU;AAAA;AAAA,EAEV,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,MAAM;AAAA,EACN,mBAAmB;AACrB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This function takes a string and replace {variables} with given values.
|
|
3
|
+
*/
|
|
4
|
+
export declare function replaceVariables(value: string, variablesOrCallback: Record<string, string | number> | ((match: string) => string)): string;
|
|
5
|
+
//# sourceMappingURL=replace-variables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replace-variables.d.ts","sourceRoot":"","sources":["../../src/regex/replace-variables.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,UAenF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
function replaceVariables(value, variablesOrCallback) {
|
|
2
|
+
const doubleCurlyBrackets = /{{\s*([\w.-]+)\s*}}/g;
|
|
3
|
+
const singleCurlyBrackets = /{\s*([\w.-]+)\s*}/g;
|
|
4
|
+
const callback = (_, match) => {
|
|
5
|
+
if (typeof variablesOrCallback === "function") {
|
|
6
|
+
return variablesOrCallback(match);
|
|
7
|
+
}
|
|
8
|
+
return variablesOrCallback[match]?.toString() || `{${match}}`;
|
|
9
|
+
};
|
|
10
|
+
return value.replace(doubleCurlyBrackets, callback).replace(singleCurlyBrackets, callback);
|
|
11
|
+
}
|
|
12
|
+
export {
|
|
13
|
+
replaceVariables
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=replace-variables.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/regex/replace-variables.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * This function takes a string and replace {variables} with given values.\n */\nexport function replaceVariables(\n value: string,\n variablesOrCallback: Record<string, string | number> | ((match: string) => string),\n) {\n // Replace all variables (example: {{ baseurl }} with an HTML tag)\n const doubleCurlyBrackets = /{{\\s*([\\w.-]+)\\s*}}/g\n const singleCurlyBrackets = /{\\s*([\\w.-]+)\\s*}/g\n\n const callback = (_: string, match: string): string => {\n if (typeof variablesOrCallback === 'function') {\n return variablesOrCallback(match)\n }\n return variablesOrCallback[match]?.toString() || `{${match}}`\n }\n\n // Loop through all matches and replace the match with the variable value\n return value.replace(doubleCurlyBrackets, callback).replace(singleCurlyBrackets, callback)\n}\n"],
|
|
5
|
+
"mappings": "AAGO,SAAS,iBACd,OACA,qBACA;AAEA,QAAM,sBAAsB;AAC5B,QAAM,sBAAsB;AAE5B,QAAM,WAAW,CAAC,GAAW,UAA0B;AACrD,QAAI,OAAO,wBAAwB,YAAY;AAC7C,aAAO,oBAAoB,KAAK;AAAA,IAClC;AACA,WAAO,oBAAoB,KAAK,GAAG,SAAS,KAAK,IAAI,KAAK;AAAA,EAC5D;AAGA,SAAO,MAAM,QAAQ,qBAAqB,QAAQ,EAAE,QAAQ,qBAAqB,QAAQ;AAC3F;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"camel-to-title.d.ts","sourceRoot":"","sources":["../../src/string/camel-to-title.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,+BAKnB,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/string/camel-to-title.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Converts a camelCase string to Title Words with spaces\n *\n * @param camelStr - MUST be in camelCase or this might not work\n */\nexport const camelToTitleWords = (camelStr = '') =>\n camelStr\n .replace(/([A-Z]{2,})/g, ' $1') // Add space before consecutive capitals\n .replace(/([A-Z])(?=[a-z])/g, ' $1') // Add space before single capital followed by lowercase\n .replace(/^./, (str) => str.toUpperCase()) // Capitalize first letter\n .trim()\n"],
|
|
5
|
+
"mappings": "AAKO,MAAM,oBAAoB,CAAC,WAAW,OAC3C,SACG,QAAQ,gBAAgB,KAAK,EAC7B,QAAQ,qBAAqB,KAAK,EAClC,QAAQ,MAAM,CAAC,QAAQ,IAAI,YAAY,CAAC,EACxC,KAAK;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capitalize.d.ts","sourceRoot":"","sources":["../../src/string/capitalize.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,UAAU,0BAA6D,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/string/capitalize.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Capitalize first letter\n * You should normally do this in css, only use this if you have to\n */\nexport const capitalize = (str = '') => (str[0]?.toUpperCase() ?? '') + str.slice(1)\n"],
|
|
5
|
+
"mappings": "AAIO,MAAM,aAAa,CAAC,MAAM,QAAQ,IAAI,CAAC,GAAG,YAAY,KAAK,MAAM,IAAI,MAAM,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-hash.d.ts","sourceRoot":"","sources":["../../src/string/create-hash.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,UAAU,WAAY,MAAM,KAAG,MAe3C,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const createHash = (input) => {
|
|
2
|
+
let chr = 0;
|
|
3
|
+
let hash = 0;
|
|
4
|
+
let i = 0;
|
|
5
|
+
if (!input?.length) {
|
|
6
|
+
return hash;
|
|
7
|
+
}
|
|
8
|
+
for (i = 0; i < input.length; i++) {
|
|
9
|
+
chr = input.charCodeAt(i);
|
|
10
|
+
hash = (hash << 5) - hash + chr;
|
|
11
|
+
hash |= 0;
|
|
12
|
+
}
|
|
13
|
+
return hash;
|
|
14
|
+
};
|
|
15
|
+
export {
|
|
16
|
+
createHash
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=create-hash.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/string/create-hash.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Simple 32 bit non-secure hash from a string input\n *\n * @see https://stackoverflow.com/a/7616484/1624255\n */\nexport const createHash = (input?: string): number => {\n let chr = 0\n let hash = 0\n let i = 0\n\n if (!input?.length) {\n return hash\n }\n\n for (i = 0; i < input.length; i++) {\n chr = input.charCodeAt(i)\n hash = (hash << 5) - hash + chr\n hash |= 0 // Convert to 32bit integer\n }\n return hash\n}\n"],
|
|
5
|
+
"mappings": "AAKO,MAAM,aAAa,CAAC,UAA2B;AACpD,MAAI,MAAM;AACV,MAAI,OAAO;AACX,MAAI,IAAI;AAER,MAAI,CAAC,OAAO,QAAQ;AAClB,WAAO;AAAA,EACT;AAEA,OAAK,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACjC,UAAM,MAAM,WAAW,CAAC;AACxB,YAAQ,QAAQ,KAAK,OAAO;AAC5B,YAAQ;AAAA,EACV;AACA,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iterate-title.d.ts","sourceRoot":"","sources":["../../src/string/iterate-title.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,YAAY,UAAW,MAAM,mBAAmB,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,yBAAqB,MAa3G,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const iterateTitle = (title, checkDuplicates, separator = " #") => {
|
|
2
|
+
if (!checkDuplicates(title)) {
|
|
3
|
+
return title;
|
|
4
|
+
}
|
|
5
|
+
const split = title.split(separator);
|
|
6
|
+
const newTitle = split.length > 1 ? `${split.slice(0, -1).join()}${separator}${Number(split.at(-1)) + 1}` : `${split.join()}${separator}2`;
|
|
7
|
+
return iterateTitle(newTitle, checkDuplicates, separator);
|
|
8
|
+
};
|
|
9
|
+
export {
|
|
10
|
+
iterateTitle
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=iterate-title.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/string/iterate-title.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Check for duplicate titles, and iterate title\n */\nexport const iterateTitle = (title: string, checkDuplicates: (title: string) => boolean, separator = ' #'): string => {\n // If the title is not a duplicate return\n if (!checkDuplicates(title)) {\n return title\n }\n\n const split = title.split(separator)\n const newTitle =\n split.length > 1\n ? `${split.slice(0, -1).join()}${separator}${Number(split.at(-1)) + 1}`\n : `${split.join()}${separator}2`\n\n return iterateTitle(newTitle, checkDuplicates, separator)\n}\n"],
|
|
5
|
+
"mappings": "AAGO,MAAM,eAAe,CAAC,OAAe,iBAA6C,YAAY,SAAiB;AAEpH,MAAI,CAAC,gBAAgB,KAAK,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,MAAM,SAAS;AACnC,QAAM,WACJ,MAAM,SAAS,IACX,GAAG,MAAM,MAAM,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,SAAS,GAAG,OAAO,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,KACnE,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS;AAEjC,SAAO,aAAa,UAAU,iBAAiB,SAAS;AAC1D;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Spy on console.warn */
|
|
2
|
+
export declare const consoleWarnSpy: import("vitest").MockInstance<[message?: any, ...optionalParams: any[]], void>;
|
|
3
|
+
export declare let isConsoleWarnEnabled: boolean;
|
|
4
|
+
/** Spy on console.error */
|
|
5
|
+
export declare const consoleErrorSpy: import("vitest").MockInstance<[message?: any, ...optionalParams: any[]], void>;
|
|
6
|
+
export declare let isConsoleErrorEnabled: boolean;
|
|
7
|
+
/** Reset the spies */
|
|
8
|
+
export declare const resetConsoleSpies: () => void;
|
|
9
|
+
/** Helper to re-enable console warn checks */
|
|
10
|
+
export declare const enableConsoleWarn: () => boolean;
|
|
11
|
+
/** Helper to disable console warn checks */
|
|
12
|
+
export declare const disableConsoleWarn: () => boolean;
|
|
13
|
+
/** Helper to enable console error checks */
|
|
14
|
+
export declare const enableConsoleError: () => boolean;
|
|
15
|
+
/** Helper to disable console error checks */
|
|
16
|
+
export declare const disableConsoleError: () => boolean;
|
|
17
|
+
//# sourceMappingURL=console-spies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-spies.d.ts","sourceRoot":"","sources":["../../src/testing/console-spies.ts"],"names":[],"mappings":"AAEA,0BAA0B;AAC1B,eAAO,MAAM,cAAc,gFAA4B,CAAA;AACvD,eAAO,IAAI,oBAAoB,SAAQ,CAAA;AAEvC,2BAA2B;AAC3B,eAAO,MAAM,eAAe,gFAA6B,CAAA;AACzD,eAAO,IAAI,qBAAqB,SAAQ,CAAA;AAExC,sBAAsB;AACtB,eAAO,MAAM,iBAAiB,YAG7B,CAAA;AAED,8CAA8C;AAC9C,eAAO,MAAM,iBAAiB,eAAsC,CAAA;AAEpE,4CAA4C;AAC5C,eAAO,MAAM,kBAAkB,eAAuC,CAAA;AAEtE,4CAA4C;AAC5C,eAAO,MAAM,kBAAkB,eAAuC,CAAA;AAEtE,6CAA6C;AAC7C,eAAO,MAAM,mBAAmB,eAAwC,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { vi } from "vitest";
|
|
2
|
+
const consoleWarnSpy = vi.spyOn(console, "warn");
|
|
3
|
+
let isConsoleWarnEnabled = false;
|
|
4
|
+
const consoleErrorSpy = vi.spyOn(console, "error");
|
|
5
|
+
let isConsoleErrorEnabled = false;
|
|
6
|
+
const resetConsoleSpies = () => {
|
|
7
|
+
consoleWarnSpy.mockClear();
|
|
8
|
+
consoleErrorSpy.mockClear();
|
|
9
|
+
};
|
|
10
|
+
const enableConsoleWarn = () => isConsoleWarnEnabled = true;
|
|
11
|
+
const disableConsoleWarn = () => isConsoleWarnEnabled = false;
|
|
12
|
+
const enableConsoleError = () => isConsoleErrorEnabled = true;
|
|
13
|
+
const disableConsoleError = () => isConsoleErrorEnabled = false;
|
|
14
|
+
export {
|
|
15
|
+
consoleErrorSpy,
|
|
16
|
+
consoleWarnSpy,
|
|
17
|
+
disableConsoleError,
|
|
18
|
+
disableConsoleWarn,
|
|
19
|
+
enableConsoleError,
|
|
20
|
+
enableConsoleWarn,
|
|
21
|
+
isConsoleErrorEnabled,
|
|
22
|
+
isConsoleWarnEnabled,
|
|
23
|
+
resetConsoleSpies
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=console-spies.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/testing/console-spies.ts"],
|
|
4
|
+
"sourcesContent": ["import { vi } from 'vitest'\n\n/** Spy on console.warn */\nexport const consoleWarnSpy = vi.spyOn(console, 'warn')\nexport let isConsoleWarnEnabled = false\n\n/** Spy on console.error */\nexport const consoleErrorSpy = vi.spyOn(console, 'error')\nexport let isConsoleErrorEnabled = false\n\n/** Reset the spies */\nexport const resetConsoleSpies = () => {\n consoleWarnSpy.mockClear()\n consoleErrorSpy.mockClear()\n}\n\n/** Helper to re-enable console warn checks */\nexport const enableConsoleWarn = () => (isConsoleWarnEnabled = true)\n\n/** Helper to disable console warn checks */\nexport const disableConsoleWarn = () => (isConsoleWarnEnabled = false)\n\n/** Helper to enable console error checks */\nexport const enableConsoleError = () => (isConsoleErrorEnabled = true)\n\n/** Helper to disable console error checks */\nexport const disableConsoleError = () => (isConsoleErrorEnabled = false)\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,UAAU;AAGZ,MAAM,iBAAiB,GAAG,MAAM,SAAS,MAAM;AAC/C,IAAI,uBAAuB;AAG3B,MAAM,kBAAkB,GAAG,MAAM,SAAS,OAAO;AACjD,IAAI,wBAAwB;AAG5B,MAAM,oBAAoB,MAAM;AACrC,iBAAe,UAAU;AACzB,kBAAgB,UAAU;AAC5B;AAGO,MAAM,oBAAoB,MAAO,uBAAuB;AAGxD,MAAM,qBAAqB,MAAO,uBAAuB;AAGzD,MAAM,qBAAqB,MAAO,wBAAwB;AAG1D,MAAM,sBAAsB,MAAO,wBAAwB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Function overload for createApiReference to allow multiple different signatures */
|
|
2
|
+
export type Measure = {
|
|
3
|
+
<T>(name: string, fn: () => T): T;
|
|
4
|
+
<T>(name: string, fn: () => Promise<T>): Promise<T>;
|
|
5
|
+
<T>(name: string, fn: () => T | Promise<T>): T | Promise<T>;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Measures the execution time of a function and logs it.
|
|
9
|
+
* Works with both async and sync functions.
|
|
10
|
+
* Returns the result of the measured function.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* // Async function
|
|
15
|
+
* const result = await measure('api-call', async () => {
|
|
16
|
+
* return await fetchData()
|
|
17
|
+
* })
|
|
18
|
+
*
|
|
19
|
+
* // Sync function
|
|
20
|
+
* const result = measure('computation', () => {
|
|
21
|
+
* return heavyComputation()
|
|
22
|
+
* })
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare const measure: Measure;
|
|
26
|
+
//# sourceMappingURL=measure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measure.d.ts","sourceRoot":"","sources":["../../src/testing/measure.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,MAAM,MAAM,OAAO,GAAG;IACpB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAA;IACjC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IACnD,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAC5D,CAAA;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,OAAO,EAAE,OAWrB,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const measure = (name, fn) => {
|
|
2
|
+
const start = performance.now();
|
|
3
|
+
const result = fn();
|
|
4
|
+
const end = performance.now();
|
|
5
|
+
const duration = Math.round(end - start);
|
|
6
|
+
console.info(`${name}: ${duration} ms`);
|
|
7
|
+
return result;
|
|
8
|
+
};
|
|
9
|
+
export {
|
|
10
|
+
measure
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=measure.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/testing/measure.ts"],
|
|
4
|
+
"sourcesContent": ["/** Function overload for createApiReference to allow multiple different signatures */\nexport type Measure = {\n <T>(name: string, fn: () => T): T\n <T>(name: string, fn: () => Promise<T>): Promise<T>\n <T>(name: string, fn: () => T | Promise<T>): T | Promise<T>\n}\n\n/**\n * Measures the execution time of a function and logs it.\n * Works with both async and sync functions.\n * Returns the result of the measured function.\n *\n * @example\n * ```ts\n * // Async function\n * const result = await measure('api-call', async () => {\n * return await fetchData()\n * })\n *\n * // Sync function\n * const result = measure('computation', () => {\n * return heavyComputation()\n * })\n * ```\n */\nexport const measure: Measure = (name, fn) => {\n const start = performance.now()\n\n const result = fn()\n\n const end = performance.now()\n const duration = Math.round(end - start)\n\n console.info(`${name}: ${duration} ms`)\n\n return result\n}\n"],
|
|
5
|
+
"mappings": "AAyBO,MAAM,UAAmB,CAAC,MAAM,OAAO;AAC5C,QAAM,QAAQ,YAAY,IAAI;AAE9B,QAAM,SAAS,GAAG;AAElB,QAAM,MAAM,YAAY,IAAI;AAC5B,QAAM,WAAW,KAAK,MAAM,MAAM,KAAK;AAEvC,UAAQ,KAAK,GAAG,IAAI,KAAK,QAAQ,KAAK;AAEtC,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../../src/testing/sleep.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,KAAK,OAAQ,MAAM,qBAA0C,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/testing/sleep.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Little helper for sleeping for x milliseconds\n * an async await friendly setTimeout\n */\nexport const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms))\n"],
|
|
5
|
+
"mappings": "AAIO,MAAM,QAAQ,CAAC,OAAe,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-protocol.d.ts","sourceRoot":"","sources":["../../src/url/ensure-protocol.ts"],"names":[],"mappings":"AAEA,uCAAuC;AACvC,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOlD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { REGEX } from "../regex/regex-helpers";
|
|
2
|
+
function ensureProtocol(url) {
|
|
3
|
+
if (REGEX.PROTOCOL.test(url)) {
|
|
4
|
+
return url;
|
|
5
|
+
}
|
|
6
|
+
return `http://${url.replace(/^\//, "")}`;
|
|
7
|
+
}
|
|
8
|
+
export {
|
|
9
|
+
ensureProtocol
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=ensure-protocol.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/url/ensure-protocol.ts"],
|
|
4
|
+
"sourcesContent": ["import { REGEX } from '@/regex/regex-helpers'\n\n/** Ensure URL has a protocol prefix */\nexport function ensureProtocol(url: string): string {\n if (REGEX.PROTOCOL.test(url)) {\n return url\n }\n\n // Default to http if no protocol is specified\n return `http://${url.replace(/^\\//, '')}`\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,aAAa;AAGf,SAAS,eAAe,KAAqB;AAClD,MAAI,MAAM,SAAS,KAAK,GAAG,GAAG;AAC5B,WAAO;AAAA,EACT;AAGA,SAAO,UAAU,IAAI,QAAQ,OAAO,EAAE,CAAC;AACzC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-local-url.d.ts","sourceRoot":"","sources":["../../src/url/is-local-url.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,WAUrC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const LOCAL_HOSTNAMES = ["localhost", "127.0.0.1", "[::1]", "0.0.0.0"];
|
|
2
|
+
function isLocalUrl(url) {
|
|
3
|
+
try {
|
|
4
|
+
const { hostname } = new URL(url);
|
|
5
|
+
return LOCAL_HOSTNAMES.includes(hostname);
|
|
6
|
+
} catch {
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
isLocalUrl
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=is-local-url.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/url/is-local-url.ts"],
|
|
4
|
+
"sourcesContent": ["/** Obviously local hostnames */\nconst LOCAL_HOSTNAMES = ['localhost', '127.0.0.1', '[::1]', '0.0.0.0']\n\n/**\n * Detect requests to localhost\n */\nexport function isLocalUrl(url: string) {\n try {\n const { hostname } = new URL(url)\n\n return LOCAL_HOSTNAMES.includes(hostname)\n } catch {\n // If it\u2019s not a valid URL, we can\u2019t use the proxy anyway,\n // but it also covers cases like relative URLs (e.g. `openapi.json`).\n return true\n }\n}\n"],
|
|
5
|
+
"mappings": "AACA,MAAM,kBAAkB,CAAC,aAAa,aAAa,SAAS,SAAS;AAK9D,SAAS,WAAW,KAAa;AACtC,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,IAAI,IAAI,GAAG;AAEhC,WAAO,gBAAgB,SAAS,QAAQ;AAAA,EAC1C,QAAQ;AAGN,WAAO;AAAA,EACT;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-relative-path.d.ts","sourceRoot":"","sources":["../../src/url/is-relative-path.ts"],"names":[],"mappings":"AAEA;;IAEI;AACJ,eAAO,MAAM,cAAc,QAAS,MAAM,YAazC,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { REGEX } from "../regex/regex-helpers";
|
|
2
|
+
const isRelativePath = (url) => {
|
|
3
|
+
if (REGEX.PROTOCOL.test(url)) {
|
|
4
|
+
return false;
|
|
5
|
+
}
|
|
6
|
+
if (/^[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+(\/|$)/.test(url)) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
return true;
|
|
10
|
+
};
|
|
11
|
+
export {
|
|
12
|
+
isRelativePath
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=is-relative-path.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/url/is-relative-path.ts"],
|
|
4
|
+
"sourcesContent": ["import { REGEX } from '@/regex/regex-helpers'\n\n/**\n * Check if the URL is relative or if it's a domain without protocol\n **/\nexport const isRelativePath = (url: string) => {\n // Allow http:// https:// and other protocols such as file://\n if (REGEX.PROTOCOL.test(url)) {\n return false\n }\n\n // Check if it looks like a domain (contains dots and no spaces)\n // This catches cases like \"galaxy.scalar.com/planets\"\n if (/^[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+(\\/|$)/.test(url)) {\n return false\n }\n\n return true\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,aAAa;AAKf,MAAM,iBAAiB,CAAC,QAAgB;AAE7C,MAAI,MAAM,SAAS,KAAK,GAAG,GAAG;AAC5B,WAAO;AAAA,EACT;AAIA,MAAI,uCAAuC,KAAK,GAAG,GAAG;AACpD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks if a given string is a valid URL.
|
|
3
|
+
*
|
|
4
|
+
* @param {string} url - The string to be validated as a URL.
|
|
5
|
+
* @returns {boolean} Returns true if the string is a valid URL, false otherwise.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* isValidUrl('https://www.example.com'); // returns true
|
|
9
|
+
* isValidUrl('not a url'); // returns false
|
|
10
|
+
*/
|
|
11
|
+
export declare function isValidUrl(url: string): boolean;
|
|
12
|
+
//# sourceMappingURL=is-valid-url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-valid-url.d.ts","sourceRoot":"","sources":["../../src/url/is-valid-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,WAMrC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/url/is-valid-url.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Checks if a given string is a valid URL.\n *\n * @param {string} url - The string to be validated as a URL.\n * @returns {boolean} Returns true if the string is a valid URL, false otherwise.\n *\n * @example\n * isValidUrl('https://www.example.com'); // returns true\n * isValidUrl('not a url'); // returns false\n */\nexport function isValidUrl(url: string) {\n try {\n return Boolean(new URL(url))\n } catch {\n return false\n }\n}\n"],
|
|
5
|
+
"mappings": "AAUO,SAAS,WAAW,KAAa;AACtC,MAAI;AACF,WAAO,QAAQ,IAAI,IAAI,GAAG,CAAC;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"make-url-absolute.d.ts","sourceRoot":"","sources":["../../src/url/make-url-absolute.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,eAAe,SAAU,MAAM,YAAY,MAAM,uBAiB7D,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const makeUrlAbsolute = (url, baseUrl) => {
|
|
2
|
+
if (!url || url.startsWith("http://") || url.startsWith("https://") || typeof window === "undefined" && !baseUrl) {
|
|
3
|
+
return url;
|
|
4
|
+
}
|
|
5
|
+
const base = baseUrl || window.location.href;
|
|
6
|
+
const cleanBaseUrl = base.split("?")[0]?.split("#")[0];
|
|
7
|
+
const normalizedBaseUrl = cleanBaseUrl?.endsWith("/") ? cleanBaseUrl : cleanBaseUrl?.substring(0, cleanBaseUrl?.lastIndexOf("/") + 1);
|
|
8
|
+
return new URL(url, normalizedBaseUrl).toString();
|
|
9
|
+
};
|
|
10
|
+
export {
|
|
11
|
+
makeUrlAbsolute
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=make-url-absolute.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/url/make-url-absolute.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Pass an URL or a relative URL and get an absolute URL\n */\nexport const makeUrlAbsolute = (url?: string, baseUrl?: string) => {\n if (!url || url.startsWith('http://') || url.startsWith('https://') || (typeof window === 'undefined' && !baseUrl)) {\n return url\n }\n\n const base = baseUrl || window.location.href\n\n // Remove any query parameters or hash from the base URL\n const cleanBaseUrl = base.split('?')[0]?.split('#')[0]\n\n // For base URLs with a path component, we want to remove the last path segment\n // if it doesn't end with a slash\n const normalizedBaseUrl = cleanBaseUrl?.endsWith('/')\n ? cleanBaseUrl\n : cleanBaseUrl?.substring(0, cleanBaseUrl?.lastIndexOf('/') + 1)\n\n return new URL(url, normalizedBaseUrl).toString()\n}\n"],
|
|
5
|
+
"mappings": "AAGO,MAAM,kBAAkB,CAAC,KAAc,YAAqB;AACjE,MAAI,CAAC,OAAO,IAAI,WAAW,SAAS,KAAK,IAAI,WAAW,UAAU,KAAM,OAAO,WAAW,eAAe,CAAC,SAAU;AAClH,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,WAAW,OAAO,SAAS;AAGxC,QAAM,eAAe,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC;AAIrD,QAAM,oBAAoB,cAAc,SAAS,GAAG,IAChD,eACA,cAAc,UAAU,GAAG,cAAc,YAAY,GAAG,IAAI,CAAC;AAEjE,SAAO,IAAI,IAAI,KAAK,iBAAiB,EAAE,SAAS;AAClD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merges multiple URLSearchParams objects, preserving multiple values per param
|
|
3
|
+
* within each source, but later sources overwrite earlier ones completely
|
|
4
|
+
* This should de-dupe our query params while allowing multiple keys for "arrays"
|
|
5
|
+
*/
|
|
6
|
+
export declare const mergeSearchParams: (...params: URLSearchParams[]) => URLSearchParams;
|
|
7
|
+
/** Combines a base URL and a path ensuring there's only one slash between them */
|
|
8
|
+
export declare const combineUrlAndPath: (url: string, path: string) => string;
|
|
9
|
+
/**
|
|
10
|
+
* Creates a URL from the path and server
|
|
11
|
+
* also optionally merges query params if you include urlSearchParams
|
|
12
|
+
* This was re-written without using URL to support variables in the scheme
|
|
13
|
+
*/
|
|
14
|
+
export declare const mergeUrls: (url: string, path: string, urlParams?: URLSearchParams, disableOriginPrefix?: boolean) => string;
|
|
15
|
+
//# sourceMappingURL=merge-urls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-urls.d.ts","sourceRoot":"","sources":["../../src/url/merge-urls.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,cAAe,eAAe,EAAE,KAAG,eA6BhE,CAAA;AAED,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,QAAS,MAAM,QAAQ,MAAM,WAU1D,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,QACf,MAAM,QACL,MAAM,cACD,eAAe,0CAmC3B,CAAA"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { REGEX } from "../regex/regex-helpers";
|
|
2
|
+
import { isRelativePath } from "./is-relative-path";
|
|
3
|
+
import { ensureProtocol } from "./ensure-protocol";
|
|
4
|
+
const mergeSearchParams = (...params) => {
|
|
5
|
+
const merged = {};
|
|
6
|
+
params.forEach((p) => {
|
|
7
|
+
const keys = Array.from(p.keys());
|
|
8
|
+
const uniqueKeys = new Set(keys);
|
|
9
|
+
uniqueKeys.forEach((key) => {
|
|
10
|
+
const values = p.getAll(key);
|
|
11
|
+
const value = values.length > 1 ? values : values[0] ?? "";
|
|
12
|
+
merged[key] = value;
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
const result = new URLSearchParams();
|
|
16
|
+
Object.entries(merged).forEach(([key, value]) => {
|
|
17
|
+
if (Array.isArray(value)) {
|
|
18
|
+
value.forEach((v) => result.append(key, v));
|
|
19
|
+
} else {
|
|
20
|
+
result.append(key, value);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
const combineUrlAndPath = (url, path) => {
|
|
26
|
+
if (!path || url === path) {
|
|
27
|
+
return url.trim();
|
|
28
|
+
}
|
|
29
|
+
if (!url) {
|
|
30
|
+
return path.trim();
|
|
31
|
+
}
|
|
32
|
+
return `${url.trim()}/${path.trim()}`.replace(REGEX.MULTIPLE_SLASHES, "/");
|
|
33
|
+
};
|
|
34
|
+
const mergeUrls = (url, path, urlParams = new URLSearchParams(), disableOriginPrefix = false) => {
|
|
35
|
+
if (url && (!isRelativePath(url) || typeof window !== "undefined")) {
|
|
36
|
+
const base = disableOriginPrefix ? url : isRelativePath(url) ? combineUrlAndPath(window.location.origin, url) : ensureProtocol(url);
|
|
37
|
+
const [baseUrl = "", baseQuery] = base.split("?");
|
|
38
|
+
const baseParams = new URLSearchParams(baseQuery || "");
|
|
39
|
+
const [pathWithoutQuery = "", pathQuery] = path.split("?");
|
|
40
|
+
const pathParams = new URLSearchParams(pathQuery || "");
|
|
41
|
+
const mergedUrl = url === path ? baseUrl : combineUrlAndPath(baseUrl, pathWithoutQuery);
|
|
42
|
+
const mergedSearchParams = mergeSearchParams(baseParams, pathParams, urlParams);
|
|
43
|
+
const search = mergedSearchParams.toString();
|
|
44
|
+
return search ? `${mergedUrl}?${search}` : mergedUrl;
|
|
45
|
+
}
|
|
46
|
+
if (path) {
|
|
47
|
+
return combineUrlAndPath(url, path);
|
|
48
|
+
}
|
|
49
|
+
return "";
|
|
50
|
+
};
|
|
51
|
+
export {
|
|
52
|
+
combineUrlAndPath,
|
|
53
|
+
mergeSearchParams,
|
|
54
|
+
mergeUrls
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=merge-urls.js.map
|