@scalar/helpers 0.4.1 → 0.4.3
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 +13 -0
- package/dist/array/add-to-map-array.js +7 -8
- package/dist/array/is-defined.js +12 -5
- package/dist/array/sort-by-order.js +60 -18
- package/dist/consts/content-types.js +13 -14
- package/dist/dom/freeze-element.js +56 -42
- package/dist/dom/get-selector.d.ts +7 -0
- package/dist/dom/get-selector.d.ts.map +1 -0
- package/dist/dom/get-selector.js +31 -0
- package/dist/dom/scroll-to-id.js +33 -27
- package/dist/file/json2xml.js +79 -61
- package/dist/formatters/format-bytes.d.ts +7 -0
- package/dist/formatters/format-bytes.d.ts.map +1 -0
- package/dist/formatters/format-bytes.js +18 -0
- package/dist/formatters/format-milliseconds.d.ts +6 -0
- package/dist/formatters/format-milliseconds.d.ts.map +1 -0
- package/dist/formatters/format-milliseconds.js +10 -0
- package/dist/general/create-limiter.js +47 -31
- package/dist/general/debounce.js +86 -66
- package/dist/general/extract-config-secrets.js +29 -27
- package/dist/general/has-modifier.js +9 -8
- package/dist/general/is-mac-os.js +23 -21
- package/dist/http/can-method-have-body.js +4 -6
- package/dist/http/http-info.js +63 -61
- package/dist/http/http-methods.js +4 -7
- package/dist/http/http-status-codes.js +316 -320
- package/dist/http/is-http-method.js +3 -6
- package/dist/http/normalize-http-method.js +19 -19
- package/dist/json/escape-json-pointer.js +6 -5
- package/dist/json/parse-json-pointer-segments.js +11 -6
- package/dist/json/pretty-print-json.d.ts +9 -0
- package/dist/json/pretty-print-json.d.ts.map +1 -0
- package/dist/json/pretty-print-json.js +42 -0
- package/dist/json/unescape-json-pointer.js +7 -5
- package/dist/markdown/get-markdown-headings.d.ts +11 -0
- package/dist/markdown/get-markdown-headings.d.ts.map +1 -0
- package/dist/markdown/get-markdown-headings.js +99 -0
- package/dist/node/path.js +168 -138
- package/dist/object/get-value-at-path.js +17 -11
- package/dist/object/is-object.js +24 -10
- package/dist/object/local-storage.js +50 -42
- package/dist/object/object-entries.js +2 -5
- package/dist/object/object-keys.js +5 -5
- package/dist/object/object-replace.js +13 -12
- package/dist/object/omit-undefined-values.js +18 -18
- package/dist/object/prevent-pollution.js +27 -10
- package/dist/object/to-json-compatible.js +71 -62
- package/dist/queue/queue.js +103 -84
- package/dist/regex/find-variables.js +13 -8
- package/dist/regex/regex-helpers.js +17 -17
- package/dist/regex/replace-variables.js +21 -19
- package/dist/string/camel-to-title.js +10 -5
- package/dist/string/capitalize.js +5 -5
- package/dist/string/create-hash.js +19 -16
- package/dist/string/generate-hash.js +153 -127
- package/dist/string/iterate-title.js +13 -11
- package/dist/string/truncate.js +16 -9
- package/dist/testing/console-spies.js +19 -24
- package/dist/testing/measure.js +42 -19
- package/dist/testing/measure.test-d.js +12 -9
- package/dist/testing/sleep.js +5 -5
- package/dist/url/ensure-protocol.js +8 -10
- package/dist/url/extract-server-from-path.js +53 -28
- package/dist/url/is-local-url.js +24 -18
- package/dist/url/is-relative-path.js +15 -13
- package/dist/url/is-valid-url.js +17 -10
- package/dist/url/make-url-absolute.js +39 -28
- package/dist/url/merge-urls.js +74 -52
- package/dist/url/redirect-to-proxy.js +68 -39
- package/package.json +15 -9
- package/dist/array/add-to-map-array.js.map +0 -7
- package/dist/array/is-defined.js.map +0 -7
- package/dist/array/sort-by-order.js.map +0 -7
- package/dist/consts/content-types.js.map +0 -7
- package/dist/dom/freeze-element.js.map +0 -7
- package/dist/dom/scroll-to-id.js.map +0 -7
- package/dist/file/json2xml.js.map +0 -7
- package/dist/general/create-limiter.js.map +0 -7
- package/dist/general/debounce.js.map +0 -7
- package/dist/general/extract-config-secrets.js.map +0 -7
- package/dist/general/has-modifier.js.map +0 -7
- package/dist/general/is-mac-os.js.map +0 -7
- package/dist/http/can-method-have-body.js.map +0 -7
- package/dist/http/http-info.js.map +0 -7
- package/dist/http/http-methods.js.map +0 -7
- package/dist/http/http-status-codes.js.map +0 -7
- package/dist/http/is-http-method.js.map +0 -7
- package/dist/http/normalize-http-method.js.map +0 -7
- package/dist/json/escape-json-pointer.js.map +0 -7
- package/dist/json/parse-json-pointer-segments.js.map +0 -7
- package/dist/json/unescape-json-pointer.js.map +0 -7
- package/dist/node/path.js.map +0 -7
- package/dist/object/get-value-at-path.js.map +0 -7
- package/dist/object/is-object.js.map +0 -7
- package/dist/object/local-storage.js.map +0 -7
- package/dist/object/object-entries.js.map +0 -7
- package/dist/object/object-keys.js.map +0 -7
- package/dist/object/object-replace.js.map +0 -7
- package/dist/object/omit-undefined-values.js.map +0 -7
- package/dist/object/prevent-pollution.js.map +0 -7
- package/dist/object/to-json-compatible.js.map +0 -7
- package/dist/queue/queue.js.map +0 -7
- package/dist/regex/find-variables.js.map +0 -7
- package/dist/regex/regex-helpers.js.map +0 -7
- package/dist/regex/replace-variables.js.map +0 -7
- package/dist/string/camel-to-title.js.map +0 -7
- package/dist/string/capitalize.js.map +0 -7
- package/dist/string/create-hash.js.map +0 -7
- package/dist/string/generate-hash.js.map +0 -7
- package/dist/string/iterate-title.js.map +0 -7
- package/dist/string/truncate.js.map +0 -7
- package/dist/testing/console-spies.js.map +0 -7
- package/dist/testing/measure.js.map +0 -7
- package/dist/testing/measure.test-d.js.map +0 -7
- package/dist/testing/sleep.js.map +0 -7
- package/dist/url/ensure-protocol.js.map +0 -7
- package/dist/url/extract-server-from-path.js.map +0 -7
- package/dist/url/is-local-url.js.map +0 -7
- package/dist/url/is-relative-path.js.map +0 -7
- package/dist/url/is-valid-url.js.map +0 -7
- package/dist/url/make-url-absolute.js.map +0 -7
- package/dist/url/merge-urls.js.map +0 -7
- package/dist/url/redirect-to-proxy.js.map +0 -7
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/url/make-url-absolute.ts"],
|
|
4
|
-
"sourcesContent": ["import { combineUrlAndPath } from '@/url/merge-urls'\n\n/**\n * Converts a relative URL to an absolute URL using the provided base URL or current window location.\n * @param url - The URL to make absolute\n * @param options - Configuration options\n * @param options.baseUrl - Optional base URL to resolve against (defaults to window.location.href)\n * @param options.basePath - If provided, combines with baseUrl or window.location.origin before resolving\n * @returns The absolute URL, or the original URL if it's already absolute or invalid\n */\nexport const makeUrlAbsolute = (\n url: string,\n {\n /** Optional base URL to resolve against (defaults to window.location.href) */\n baseUrl,\n /** If we have a basePath then we resolve against window.location.origin + basePath */\n basePath,\n }: {\n baseUrl?: string\n basePath?: string\n } = {},\n): string => {\n // If no base URL provided and we're not in a browser environment, return as-is\n if (typeof window === 'undefined' && !baseUrl) {\n return url\n }\n\n try {\n // If we can create a URL object without a base, it's already absolute\n new URL(url)\n return url\n } catch {\n // URL is relative, proceed with resolution\n }\n\n // Use URL constructor which handles path normalization automatically\n try {\n let base = baseUrl || window.location.href\n\n // If basePath is provided, combine it with the base URL\n if (basePath) {\n const origin = baseUrl ? new URL(baseUrl).origin : window.location.origin\n base = combineUrlAndPath(origin, basePath + '/')\n }\n\n return new URL(url, base).toString()\n } catch {\n // If URL construction fails, return the original URL\n return url\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,yBAAyB;AAU3B,MAAM,kBAAkB,CAC7B,KACA;AAAA;AAAA,EAEE;AAAA;AAAA,EAEA;AACF,IAGI,CAAC,MACM;AAEX,MAAI,OAAO,WAAW,eAAe,CAAC,SAAS;AAC7C,WAAO;AAAA,EACT;AAEA,MAAI;AAEF,QAAI,IAAI,GAAG;AACX,WAAO;AAAA,EACT,QAAQ;AAAA,EAER;AAGA,MAAI;AACF,QAAI,OAAO,WAAW,OAAO,SAAS;AAGtC,QAAI,UAAU;AACZ,YAAM,SAAS,UAAU,IAAI,IAAI,OAAO,EAAE,SAAS,OAAO,SAAS;AACnE,aAAO,kBAAkB,QAAQ,WAAW,GAAG;AAAA,IACjD;AAEA,WAAO,IAAI,IAAI,KAAK,IAAI,EAAE,SAAS;AAAA,EACrC,QAAQ;AAEN,WAAO;AAAA,EACT;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/url/merge-urls.ts"],
|
|
4
|
-
"sourcesContent": ["import { REGEX } from '@/regex/regex-helpers'\nimport { isRelativePath } from './is-relative-path'\nimport { ensureProtocol } from './ensure-protocol'\n\n/**\n * Merges multiple URLSearchParams objects, preserving multiple values per param\n * within each source, but later sources overwrite earlier ones completely\n * This should de-dupe our query params while allowing multiple keys for \"arrays\"\n */\nexport const mergeSearchParams = (...params: URLSearchParams[]): URLSearchParams => {\n // We keep a merged record to ensure the next group will overwrite the previous\n const merged: Record<string, string | string[]> = {}\n\n // Loops over each group and grabs unique keys\n params.forEach((p) => {\n const keys = Array.from(p.keys())\n const uniqueKeys = new Set(keys)\n\n uniqueKeys.forEach((key) => {\n const values = p.getAll(key)\n const value = values.length > 1 ? values : (values[0] ?? '')\n\n merged[key] = value\n })\n })\n\n const result = new URLSearchParams()\n\n // We maintain multiple values for each key if they existed\n Object.entries(merged).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n value.forEach((v) => result.append(key, v))\n } else {\n result.append(key, value)\n }\n })\n\n return result\n}\n\n/** Combines a base URL and a path ensuring there's only one slash between them */\nexport const combineUrlAndPath = (url: string, path: string) => {\n if (!path || url === path) {\n return url.trim()\n }\n\n if (!url) {\n return path.trim()\n }\n\n return `${url.trim()}/${path.trim()}`.replace(REGEX.MULTIPLE_SLASHES, '/')\n}\n\n/**\n * Creates a URL from the path and server\n * also optionally merges query params if you include urlSearchParams\n * This was re-written without using URL to support variables in the scheme\n */\nexport const mergeUrls = (\n url: string,\n path: string,\n urlParams: URLSearchParams = new URLSearchParams(),\n /** To disable prefixing the url with the origin or a scheme*/\n disableOriginPrefix = false,\n) => {\n // Extract and merge all query params\n if (url && (!isRelativePath(url) || typeof window !== 'undefined')) {\n /** Prefix the url with the origin if it is relative and we wish to */\n const base = disableOriginPrefix\n ? url\n : isRelativePath(url)\n ? combineUrlAndPath(window.location.origin, url)\n : ensureProtocol(url)\n\n // Extract search params from base URL if any\n const [baseUrl = '', baseQuery] = base.split('?')\n const baseParams = new URLSearchParams(baseQuery || '')\n\n // Extract search params from path if any\n const [pathWithoutQuery = '', pathQuery] = path.split('?')\n const pathParams = new URLSearchParams(pathQuery || '')\n\n // Merge the baseUrl and path\n const mergedUrl = url === path ? baseUrl : combineUrlAndPath(baseUrl, pathWithoutQuery)\n\n // Merge all search params\n const mergedSearchParams = mergeSearchParams(baseParams, pathParams, urlParams)\n\n // Build the final URL\n const search = mergedSearchParams.toString()\n return search ? `${mergedUrl}?${search}` : mergedUrl\n }\n if (path) {\n return combineUrlAndPath(url, path)\n }\n return ''\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,aAAa;AACtB,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AAOxB,MAAM,oBAAoB,IAAI,WAA+C;AAElF,QAAM,SAA4C,CAAC;AAGnD,SAAO,QAAQ,CAAC,MAAM;AACpB,UAAM,OAAO,MAAM,KAAK,EAAE,KAAK,CAAC;AAChC,UAAM,aAAa,IAAI,IAAI,IAAI;AAE/B,eAAW,QAAQ,CAAC,QAAQ;AAC1B,YAAM,SAAS,EAAE,OAAO,GAAG;AAC3B,YAAM,QAAQ,OAAO,SAAS,IAAI,SAAU,OAAO,CAAC,KAAK;AAEzD,aAAO,GAAG,IAAI;AAAA,IAChB,CAAC;AAAA,EACH,CAAC;AAED,QAAM,SAAS,IAAI,gBAAgB;AAGnC,SAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC/C,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAM,QAAQ,CAAC,MAAM,OAAO,OAAO,KAAK,CAAC,CAAC;AAAA,IAC5C,OAAO;AACL,aAAO,OAAO,KAAK,KAAK;AAAA,IAC1B;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAGO,MAAM,oBAAoB,CAAC,KAAa,SAAiB;AAC9D,MAAI,CAAC,QAAQ,QAAQ,MAAM;AACzB,WAAO,IAAI,KAAK;AAAA,EAClB;AAEA,MAAI,CAAC,KAAK;AACR,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,SAAO,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,GAAG,QAAQ,MAAM,kBAAkB,GAAG;AAC3E;AAOO,MAAM,YAAY,CACvB,KACA,MACA,YAA6B,IAAI,gBAAgB,GAEjD,sBAAsB,UACnB;AAEH,MAAI,QAAQ,CAAC,eAAe,GAAG,KAAK,OAAO,WAAW,cAAc;AAElE,UAAM,OAAO,sBACT,MACA,eAAe,GAAG,IAChB,kBAAkB,OAAO,SAAS,QAAQ,GAAG,IAC7C,eAAe,GAAG;AAGxB,UAAM,CAAC,UAAU,IAAI,SAAS,IAAI,KAAK,MAAM,GAAG;AAChD,UAAM,aAAa,IAAI,gBAAgB,aAAa,EAAE;AAGtD,UAAM,CAAC,mBAAmB,IAAI,SAAS,IAAI,KAAK,MAAM,GAAG;AACzD,UAAM,aAAa,IAAI,gBAAgB,aAAa,EAAE;AAGtD,UAAM,YAAY,QAAQ,OAAO,UAAU,kBAAkB,SAAS,gBAAgB;AAGtF,UAAM,qBAAqB,kBAAkB,YAAY,YAAY,SAAS;AAG9E,UAAM,SAAS,mBAAmB,SAAS;AAC3C,WAAO,SAAS,GAAG,SAAS,IAAI,MAAM,KAAK;AAAA,EAC7C;AACA,MAAI,MAAM;AACR,WAAO,kBAAkB,KAAK,IAAI;AAAA,EACpC;AACA,SAAO;AACT;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/url/redirect-to-proxy.ts"],
|
|
4
|
-
"sourcesContent": ["import { isLocalUrl } from './is-local-url'\nimport { isRelativePath } from './is-relative-path'\n\n/**\n * Redirects the request to a proxy server with a given URL. But not for:\n *\n * - Relative URLs\n * - URLs that seem to point to a local IP (except the proxy is on the same domain)\n * - URLs that don't look like a domain\n **/\nexport const redirectToProxy = (proxyUrl?: string, url?: string): string => {\n try {\n if (!shouldUseProxy(proxyUrl, url)) {\n return url ?? ''\n }\n\n // Create new URL object from url\n const newUrl = new URL(url)\n\n // Add temporary domain for relative proxy URLs\n //\n // Q: Why isn't proxyUrl type guarded?\n // A: Type guarding works for one parameter only (as of now).\n //\n // Q: Why do we need to add http://localhost to relative proxy URLs?\n // A: Because the `new URL()` would otherwise fail.\n //\n const temporaryProxyUrl = isRelativePath(proxyUrl as string) ? `http://localhost${proxyUrl}` : (proxyUrl as string)\n\n // Rewrite the URL with the proxy\n newUrl.href = temporaryProxyUrl\n\n // Add the original URL as a query parameter\n newUrl.searchParams.append('scalar_url', url)\n\n // Remove the temporary domain if we added it, but only from the start of the URL\n const result = isRelativePath(proxyUrl as string)\n ? newUrl.toString().replace(/^http:\\/\\/localhost/, '')\n : newUrl.toString()\n\n return result\n } catch {\n return url ?? ''\n }\n}\n\n/**\n * Returns false for requests to localhost, relative URLs, if no proxy is defined \u2026\n **/\nexport const shouldUseProxy = (proxyUrl?: string, url?: string): url is string => {\n try {\n // \u274C We don't have a proxy URL or the URL\n if (!proxyUrl || !url) {\n return false\n }\n\n // \u274C Request to relative URLs (won't be blocked by CORS anyway)\n if (isRelativePath(url)) {\n return false\n }\n\n // \u2705 Proxy URL is on the same domain (e.g. /proxy)\n // It's more likely (not guaranteed, though) that the proxy has access to local domains.\n if (isRelativePath(proxyUrl)) {\n return true\n }\n\n // \u2705 Proxy URL is local\n if (isLocalUrl(proxyUrl)) {\n return true\n }\n\n // \u274C Requests to localhost\n // We won't reach them from a (likely remote) proxy.\n if (isLocalUrl(url)) {\n return false\n }\n\n // \u2705 Seems fine (e.g. remote proxy + remote URL)\n return true\n } catch {\n return false\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AASxB,MAAM,kBAAkB,CAAC,UAAmB,QAAyB;AAC1E,MAAI;AACF,QAAI,CAAC,eAAe,UAAU,GAAG,GAAG;AAClC,aAAO,OAAO;AAAA,IAChB;AAGA,UAAM,SAAS,IAAI,IAAI,GAAG;AAU1B,UAAM,oBAAoB,eAAe,QAAkB,IAAI,mBAAmB,QAAQ,KAAM;AAGhG,WAAO,OAAO;AAGd,WAAO,aAAa,OAAO,cAAc,GAAG;AAG5C,UAAM,SAAS,eAAe,QAAkB,IAC5C,OAAO,SAAS,EAAE,QAAQ,uBAAuB,EAAE,IACnD,OAAO,SAAS;AAEpB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,OAAO;AAAA,EAChB;AACF;AAKO,MAAM,iBAAiB,CAAC,UAAmB,QAAgC;AAChF,MAAI;AAEF,QAAI,CAAC,YAAY,CAAC,KAAK;AACrB,aAAO;AAAA,IACT;AAGA,QAAI,eAAe,GAAG,GAAG;AACvB,aAAO;AAAA,IACT;AAIA,QAAI,eAAe,QAAQ,GAAG;AAC5B,aAAO;AAAA,IACT;AAGA,QAAI,WAAW,QAAQ,GAAG;AACxB,aAAO;AAAA,IACT;AAIA,QAAI,WAAW,GAAG,GAAG;AACnB,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|