@scalar/workspace-store 0.20.0 → 0.22.0
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 +58 -0
- package/README.md +2 -2
- package/dist/client.d.ts +54 -6
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +66 -29
- package/dist/client.js.map +2 -2
- package/dist/events/bus.d.ts +14 -2
- package/dist/events/bus.d.ts.map +1 -1
- package/dist/events/bus.js +46 -10
- package/dist/events/bus.js.map +3 -3
- package/dist/events/definitions/auth.d.ts +2 -1
- package/dist/events/definitions/auth.d.ts.map +1 -1
- package/dist/events/definitions/cookie.d.ts +20 -0
- package/dist/events/definitions/cookie.d.ts.map +1 -0
- package/dist/events/definitions/cookie.js +1 -0
- package/dist/events/definitions/cookie.js.map +7 -0
- package/dist/events/definitions/document.d.ts +19 -2
- package/dist/events/definitions/document.d.ts.map +1 -1
- package/dist/events/definitions/index.d.ts +6 -1
- package/dist/events/definitions/index.d.ts.map +1 -1
- package/dist/events/definitions/operation.d.ts +20 -14
- package/dist/events/definitions/operation.d.ts.map +1 -1
- package/dist/events/definitions/server.d.ts +2 -2
- package/dist/events/definitions/server.d.ts.map +1 -1
- package/dist/events/definitions/tabs.d.ts +55 -0
- package/dist/events/definitions/tabs.d.ts.map +1 -0
- package/dist/events/definitions/tabs.js +1 -0
- package/dist/events/definitions/tabs.js.map +7 -0
- package/dist/events/definitions/tag.d.ts +15 -0
- package/dist/events/definitions/tag.d.ts.map +1 -0
- package/dist/events/definitions/tag.js +1 -0
- package/dist/events/definitions/tag.js.map +7 -0
- package/dist/events/definitions/ui.d.ts +131 -39
- package/dist/events/definitions/ui.d.ts.map +1 -1
- package/dist/events/definitions/workspace.d.ts +18 -0
- package/dist/events/definitions/workspace.d.ts.map +1 -0
- package/dist/events/definitions/workspace.js +1 -0
- package/dist/events/definitions/workspace.js.map +7 -0
- package/dist/events/index.d.ts +1 -1
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js.map +2 -2
- package/dist/helpers/generate-unique-value.d.ts +19 -6
- package/dist/helpers/generate-unique-value.d.ts.map +1 -1
- package/dist/helpers/generate-unique-value.js +12 -7
- package/dist/helpers/generate-unique-value.js.map +2 -2
- package/dist/helpers/unpack-proxy.d.ts +14 -1
- package/dist/helpers/unpack-proxy.d.ts.map +1 -1
- package/dist/helpers/unpack-proxy.js +51 -1
- package/dist/helpers/unpack-proxy.js.map +3 -3
- package/dist/mutators/auth.d.ts +7 -2
- package/dist/mutators/auth.d.ts.map +1 -1
- package/dist/mutators/auth.js +24 -21
- package/dist/mutators/auth.js.map +2 -2
- package/dist/mutators/cookie.d.ts +21 -13
- package/dist/mutators/cookie.d.ts.map +1 -1
- package/dist/mutators/cookie.js +34 -26
- package/dist/mutators/cookie.js.map +3 -3
- package/dist/mutators/document.d.ts +12 -2
- package/dist/mutators/document.d.ts.map +1 -1
- package/dist/mutators/document.js +42 -3
- package/dist/mutators/document.js.map +2 -2
- package/dist/mutators/index.d.ts +30 -20
- package/dist/mutators/index.d.ts.map +1 -1
- package/dist/mutators/index.js +38 -9
- package/dist/mutators/index.js.map +2 -2
- package/dist/mutators/operation.d.ts +49 -108
- package/dist/mutators/operation.d.ts.map +1 -1
- package/dist/mutators/operation.js +198 -94
- package/dist/mutators/operation.js.map +2 -2
- package/dist/mutators/request.d.ts +2 -1
- package/dist/mutators/request.d.ts.map +1 -1
- package/dist/mutators/request.js.map +1 -1
- package/dist/mutators/server.d.ts +1 -1
- package/dist/mutators/server.d.ts.map +1 -1
- package/dist/mutators/server.js +6 -5
- package/dist/mutators/server.js.map +2 -2
- package/dist/mutators/tabs.d.ts +44 -0
- package/dist/mutators/tabs.d.ts.map +1 -0
- package/dist/mutators/tabs.js +133 -0
- package/dist/mutators/tabs.js.map +7 -0
- package/dist/mutators/tag.d.ts +12 -0
- package/dist/mutators/tag.d.ts.map +1 -0
- package/dist/mutators/tag.js +19 -0
- package/dist/mutators/tag.js.map +7 -0
- package/dist/mutators/workspace.d.ts +6 -0
- package/dist/mutators/workspace.d.ts.map +1 -0
- package/dist/mutators/workspace.js +24 -0
- package/dist/mutators/workspace.js.map +7 -0
- package/dist/navigation/get-navigation-options.d.ts.map +1 -1
- package/dist/navigation/get-navigation-options.js +4 -4
- package/dist/navigation/get-navigation-options.js.map +2 -2
- package/dist/navigation/helpers/get-openapi-object.d.ts +35 -0
- package/dist/navigation/helpers/get-openapi-object.d.ts.map +1 -0
- package/dist/navigation/helpers/get-openapi-object.js +31 -0
- package/dist/navigation/helpers/get-openapi-object.js.map +7 -0
- package/dist/navigation/helpers/get-operation-entries.d.ts +24 -0
- package/dist/navigation/helpers/get-operation-entries.d.ts.map +1 -0
- package/dist/navigation/helpers/get-operation-entries.js +33 -0
- package/dist/navigation/helpers/get-operation-entries.js.map +7 -0
- package/dist/navigation/helpers/get-parent-entry.d.ts +15 -0
- package/dist/navigation/helpers/get-parent-entry.d.ts.map +1 -0
- package/dist/navigation/helpers/get-parent-entry.js +13 -0
- package/dist/navigation/helpers/get-parent-entry.js.map +7 -0
- package/dist/navigation/helpers/traverse-description.d.ts +0 -1
- package/dist/navigation/helpers/traverse-description.d.ts.map +1 -1
- package/dist/navigation/helpers/traverse-description.js +0 -1
- package/dist/navigation/helpers/traverse-description.js.map +2 -2
- package/dist/navigation/helpers/traverse-document.d.ts +1 -0
- package/dist/navigation/helpers/traverse-document.d.ts.map +1 -1
- package/dist/navigation/helpers/traverse-document.js +16 -2
- package/dist/navigation/helpers/traverse-document.js.map +2 -2
- package/dist/navigation/helpers/traverse-examples.js +2 -2
- package/dist/navigation/helpers/traverse-examples.js.map +2 -2
- package/dist/navigation/helpers/traverse-paths.d.ts +6 -3
- package/dist/navigation/helpers/traverse-paths.d.ts.map +1 -1
- package/dist/navigation/helpers/traverse-paths.js +5 -10
- package/dist/navigation/helpers/traverse-paths.js.map +2 -2
- package/dist/navigation/helpers/traverse-tags.d.ts +0 -1
- package/dist/navigation/helpers/traverse-tags.d.ts.map +1 -1
- package/dist/navigation/helpers/traverse-tags.js +57 -49
- package/dist/navigation/helpers/traverse-tags.js.map +3 -3
- package/dist/navigation/helpers/utils.d.ts +2 -1
- package/dist/navigation/helpers/utils.d.ts.map +1 -1
- package/dist/navigation/helpers/utils.js.map +1 -1
- package/dist/navigation/index.d.ts +2 -1
- package/dist/navigation/index.d.ts.map +1 -1
- package/dist/navigation/index.js +5 -3
- package/dist/navigation/index.js.map +2 -2
- package/dist/persistence/index.d.ts +6 -0
- package/dist/persistence/index.d.ts.map +1 -1
- package/dist/persistence/index.js +18 -0
- package/dist/persistence/index.js.map +2 -2
- package/dist/persistence/indexdb.d.ts +1 -0
- package/dist/persistence/indexdb.d.ts.map +1 -1
- package/dist/persistence/indexdb.js +6 -1
- package/dist/persistence/indexdb.js.map +2 -2
- package/dist/plugins/client/persistence.d.ts.map +1 -1
- package/dist/plugins/client/persistence.js +6 -0
- package/dist/plugins/client/persistence.js.map +2 -2
- package/dist/schemas/extensions/document/x-scalar-environments.d.ts +1 -0
- package/dist/schemas/extensions/document/x-scalar-environments.d.ts.map +1 -1
- package/dist/schemas/extensions/document/x-scalar-environments.js.map +2 -2
- package/dist/schemas/extensions/document/x-scalar-set-operation-security.d.ts +13 -0
- package/dist/schemas/extensions/document/x-scalar-set-operation-security.d.ts.map +1 -0
- package/dist/schemas/extensions/document/x-scalar-set-operation-security.js +8 -0
- package/dist/schemas/extensions/document/x-scalar-set-operation-security.js.map +7 -0
- package/dist/schemas/extensions/general/x-scalar-cookies.d.ts +36 -0
- package/dist/schemas/extensions/general/x-scalar-cookies.d.ts.map +1 -0
- package/dist/schemas/extensions/general/x-scalar-cookies.js +15 -0
- package/dist/schemas/extensions/general/x-scalar-cookies.js.map +7 -0
- package/dist/schemas/extensions/general/x-scalar-order.d.ts +12 -0
- package/dist/schemas/extensions/general/x-scalar-order.d.ts.map +1 -0
- package/dist/schemas/extensions/general/x-scalar-order.js +8 -0
- package/dist/schemas/extensions/general/x-scalar-order.js.map +7 -0
- package/dist/schemas/extensions/operation/index.d.ts +4 -1
- package/dist/schemas/extensions/operation/index.d.ts.map +1 -1
- package/dist/schemas/extensions/operation/index.js +22 -0
- package/dist/schemas/extensions/operation/index.js.map +3 -3
- package/dist/schemas/extensions/operation/x-code-samples.d.ts +0 -5
- package/dist/schemas/extensions/operation/x-code-samples.d.ts.map +1 -1
- package/dist/schemas/extensions/operation/x-code-samples.js +0 -1
- package/dist/schemas/extensions/operation/x-code-samples.js.map +2 -2
- package/dist/schemas/extensions/operation/x-post-response.d.ts +0 -18
- package/dist/schemas/extensions/operation/x-post-response.d.ts.map +1 -1
- package/dist/schemas/extensions/operation/x-post-response.js.map +1 -1
- package/dist/schemas/extensions/tag/x-tag-groups.d.ts +8 -14
- package/dist/schemas/extensions/tag/x-tag-groups.d.ts.map +1 -1
- package/dist/schemas/extensions/tag/x-tag-groups.js +15 -11
- package/dist/schemas/extensions/tag/x-tag-groups.js.map +2 -2
- package/dist/schemas/extensions/workspace/index.d.ts +4 -0
- package/dist/schemas/extensions/workspace/index.d.ts.map +1 -0
- package/dist/schemas/extensions/workspace/index.js +15 -0
- package/dist/schemas/extensions/workspace/index.js.map +7 -0
- package/dist/schemas/extensions/workspace/x-scalar-active-proxy.d.ts +18 -0
- package/dist/schemas/extensions/workspace/x-scalar-active-proxy.d.ts.map +1 -0
- package/dist/schemas/extensions/workspace/x-scalar-active-proxy.js +8 -0
- package/dist/schemas/extensions/workspace/x-scalar-active-proxy.js.map +7 -0
- package/dist/schemas/extensions/workspace/x-scalar-tabs.d.ts +36 -0
- package/dist/schemas/extensions/workspace/x-scalar-tabs.d.ts.map +1 -0
- package/dist/schemas/extensions/workspace/x-scalar-tabs.js +16 -0
- package/dist/schemas/extensions/workspace/x-scalar-tabs.js.map +7 -0
- package/dist/schemas/extensions.d.ts +1 -1
- package/dist/schemas/extensions.js +1 -1
- package/dist/schemas/extensions.js.map +2 -2
- package/dist/schemas/inmemory-workspace.d.ts +46 -33
- package/dist/schemas/inmemory-workspace.d.ts.map +1 -1
- package/dist/schemas/navigation.d.ts +12 -1
- package/dist/schemas/navigation.d.ts.map +1 -1
- package/dist/schemas/navigation.js +2 -1
- package/dist/schemas/navigation.js.map +2 -2
- package/dist/schemas/reference-config/index.d.ts +22 -16
- package/dist/schemas/reference-config/index.d.ts.map +1 -1
- package/dist/schemas/reference-config/settings.d.ts +22 -16
- package/dist/schemas/reference-config/settings.d.ts.map +1 -1
- package/dist/schemas/reference-config/settings.js +2 -0
- package/dist/schemas/reference-config/settings.js.map +2 -2
- package/dist/schemas/v3.1/strict/header.d.ts +0 -45
- package/dist/schemas/v3.1/strict/header.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/header.js +1 -3
- package/dist/schemas/v3.1/strict/header.js.map +2 -2
- package/dist/schemas/v3.1/strict/oauth-flow.d.ts +0 -99
- package/dist/schemas/v3.1/strict/oauth-flow.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/oauth-flow.js +0 -7
- package/dist/schemas/v3.1/strict/oauth-flow.js.map +2 -2
- package/dist/schemas/v3.1/strict/openapi-document.d.ts +756 -552
- package/dist/schemas/v3.1/strict/openapi-document.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/openapi-document.js +10 -11
- package/dist/schemas/v3.1/strict/openapi-document.js.map +2 -2
- package/dist/schemas/v3.1/strict/operation.d.ts +1 -5
- package/dist/schemas/v3.1/strict/operation.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/operation.js +1 -5
- package/dist/schemas/v3.1/strict/operation.js.map +2 -2
- package/dist/schemas/v3.1/strict/parameter.d.ts +1 -101
- package/dist/schemas/v3.1/strict/parameter.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/parameter.js +1 -4
- package/dist/schemas/v3.1/strict/parameter.js.map +2 -2
- package/dist/schemas/v3.1/strict/ref-definitions.d.ts +0 -1
- package/dist/schemas/v3.1/strict/ref-definitions.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/ref-definitions.js +0 -2
- package/dist/schemas/v3.1/strict/ref-definitions.js.map +2 -2
- package/dist/schemas/v3.1/strict/schema.d.ts +28 -11
- package/dist/schemas/v3.1/strict/schema.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/schema.js +2 -2
- package/dist/schemas/v3.1/strict/schema.js.map +2 -2
- package/dist/schemas/v3.1/strict/security-scheme.d.ts +1 -54
- package/dist/schemas/v3.1/strict/security-scheme.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/security-scheme.js +0 -5
- package/dist/schemas/v3.1/strict/security-scheme.js.map +2 -2
- package/dist/schemas/v3.1/strict/tag.d.ts +4 -1
- package/dist/schemas/v3.1/strict/tag.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/tag.js +3 -1
- package/dist/schemas/v3.1/strict/tag.js.map +2 -2
- package/dist/schemas/v3.1/strict/type-guards.d.ts +6 -0
- package/dist/schemas/v3.1/strict/type-guards.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/type-guards.js +4 -0
- package/dist/schemas/v3.1/strict/type-guards.js.map +2 -2
- package/dist/schemas/workspace-specification/config.d.ts +22 -16
- package/dist/schemas/workspace-specification/config.d.ts.map +1 -1
- package/dist/schemas/workspace-specification/index.d.ts +23 -17
- package/dist/schemas/workspace-specification/index.d.ts.map +1 -1
- package/dist/schemas/workspace.d.ts +204 -130
- package/dist/schemas/workspace.d.ts.map +1 -1
- package/dist/schemas/workspace.js +18 -11
- package/dist/schemas/workspace.js.map +2 -2
- package/dist/server.d.ts +1 -1
- package/dist/workspace-plugin.d.ts +3 -0
- package/dist/workspace-plugin.d.ts.map +1 -1
- package/package.json +50 -35
- package/dist/schemas/extensions/document/x-scalar-document-security.d.ts +0 -13
- package/dist/schemas/extensions/document/x-scalar-document-security.d.ts.map +0 -1
- package/dist/schemas/extensions/document/x-scalar-document-security.js +0 -8
- package/dist/schemas/extensions/document/x-scalar-document-security.js.map +0 -7
- package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.d.ts +0 -13
- package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.d.ts.map +0 -1
- package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.js +0 -9
- package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.js.map +0 -7
- package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.d.ts +0 -32
- package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.d.ts.map +0 -1
- package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.js +0 -13
- package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.js.map +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/navigation/helpers/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import { getHeadings } from '@scalar/code-highlight/markdown'\nimport GithubSlugger from 'github-slugger'\n\nimport type { Heading } from '@/navigation/types'\n\n/**\n * Adds URL-friendly slugs to each heading in the array.\n * Uses GithubSlugger to generate consistent slugs that match GitHub's heading anchor format.\n *\n * @param headings - Array of heading objects containing value and depth\n * @param slugger - GithubSlugger instance for generating consistent slugs\n * @returns Array of headings with added slug property\n *\n * @example\n * const headings = [\n * { value: 'Getting Started', depth: 1 },\n * { value: 'Installation', depth: 2 }\n * ]\n * const slugger = new GithubSlugger()\n * withSlugs(headings, slugger)\n * // Returns:\n * // [\n * // { value: 'Getting Started', depth: 1, slug: 'getting-started' },\n * // { value: 'Installation', depth: 2, slug: 'installation' }\n * // ]\n */\nconst withSlugs = (headings: Heading[], slugger: GithubSlugger): Heading[] =>\n headings.map((heading) => {\n return {\n ...heading,\n slug: slugger.slug(heading.value),\n }\n })\n\n/**\n * Extracts all headings from a Markdown string and adds URL-friendly slugs to each heading.\n * Uses GithubSlugger to generate consistent slugs that match GitHub's heading anchor format.\n *\n * @param input - The Markdown string to extract headings from\n * @returns Array of heading objects containing value, depth, and slug\n *\n * @example\n * const markdown = `\n * # Getting Started\n * ## Installation\n * ### Requirements\n * `\n * const headings = getHeadingsFromMarkdown(markdown)\n * // Returns:\n * // [\n * // { value: 'Getting Started', depth: 1, slug: 'getting-started' },\n * // { value: 'Installation', depth: 2, slug: 'installation' },\n * // { value: 'Requirements', depth: 3, slug: 'requirements' }\n * // ]\n */\nexport function getHeadingsFromMarkdown(input: string): Heading[] {\n const slugger = new GithubSlugger()\n\n const headings = getHeadings(input)\n\n return withSlugs(headings as Heading[], slugger)\n}\n\
|
|
4
|
+
"sourcesContent": ["import { getHeadings } from '@scalar/code-highlight/markdown'\nimport GithubSlugger from 'github-slugger'\n\nimport type { Heading } from '@/navigation/types'\n\n/**\n * Adds URL-friendly slugs to each heading in the array.\n * Uses GithubSlugger to generate consistent slugs that match GitHub's heading anchor format.\n *\n * @param headings - Array of heading objects containing value and depth\n * @param slugger - GithubSlugger instance for generating consistent slugs\n * @returns Array of headings with added slug property\n *\n * @example\n * const headings = [\n * { value: 'Getting Started', depth: 1 },\n * { value: 'Installation', depth: 2 }\n * ]\n * const slugger = new GithubSlugger()\n * withSlugs(headings, slugger)\n * // Returns:\n * // [\n * // { value: 'Getting Started', depth: 1, slug: 'getting-started' },\n * // { value: 'Installation', depth: 2, slug: 'installation' }\n * // ]\n */\nconst withSlugs = (headings: Heading[], slugger: GithubSlugger): Heading[] =>\n headings.map((heading) => {\n return {\n ...heading,\n slug: slugger.slug(heading.value),\n }\n })\n\n/**\n * Extracts all headings from a Markdown string and adds URL-friendly slugs to each heading.\n * Uses GithubSlugger to generate consistent slugs that match GitHub's heading anchor format.\n *\n * @param input - The Markdown string to extract headings from\n * @returns Array of heading objects containing value, depth, and slug\n *\n * @example\n * const markdown = `\n * # Getting Started\n * ## Installation\n * ### Requirements\n * `\n * const headings = getHeadingsFromMarkdown(markdown)\n * // Returns:\n * // [\n * // { value: 'Getting Started', depth: 1, slug: 'getting-started' },\n * // { value: 'Installation', depth: 2, slug: 'installation' },\n * // { value: 'Requirements', depth: 3, slug: 'requirements' }\n * // ]\n */\nexport function getHeadingsFromMarkdown(input: string): Heading[] {\n const slugger = new GithubSlugger()\n\n const headings = getHeadings(input)\n\n return withSlugs(headings as Heading[], slugger)\n}\n\ntype HeadingLevels = 1 | 2 | 3 | 4 | 5 | 6\n\n/**\n * Returns the lowest heading level from a list of headings.\n *\n * @param headings - Array of heading objects containing depth property\n * @returns The lowest heading level (1-6) or 1 if no valid headings found\n *\n * @example\n * const headings = [\n * { value: 'Getting Started', depth: 1 },\n * { value: 'Installation', depth: 2 }\n * ]\n * getLowestHeadingLevel(headings) // Returns: 1\n */\nexport const getLowestHeadingLevel = (headings: Heading[]): HeadingLevels => {\n const lowestLevel = Math.min(...headings.map((heading) => heading.depth))\n\n if (lowestLevel >= 1 && lowestLevel <= 6) {\n return lowestLevel as HeadingLevels\n }\n\n return 1\n}\n"],
|
|
5
5
|
"mappings": "AAAA,SAAS,mBAAmB;AAC5B,OAAO,mBAAmB;AAyB1B,MAAM,YAAY,CAAC,UAAqB,YACtC,SAAS,IAAI,CAAC,YAAY;AACxB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,QAAQ,KAAK,QAAQ,KAAK;AAAA,EAClC;AACF,CAAC;AAuBI,SAAS,wBAAwB,OAA0B;AAChE,QAAM,UAAU,IAAI,cAAc;AAElC,QAAM,WAAW,YAAY,KAAK;AAElC,SAAO,UAAU,UAAuB,OAAO;AACjD;AAiBO,MAAM,wBAAwB,CAAC,aAAuC;AAC3E,QAAM,cAAc,KAAK,IAAI,GAAG,SAAS,IAAI,CAAC,YAAY,QAAQ,KAAK,CAAC;AAExE,MAAI,eAAe,KAAK,eAAe,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { getOpenapiObject } from './helpers/get-openapi-object.js';
|
|
2
|
+
export { getParentEntry } from './helpers/get-parent-entry.js';
|
|
2
3
|
export { traverseDocument as createNavigation } from './helpers/traverse-document.js';
|
|
3
4
|
export type { TraverseSpecOptions as createNavigationOptions } from './types.js';
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/navigation/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/navigation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,gBAAgB,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAClF,YAAY,EAAE,mBAAmB,IAAI,uBAAuB,EAAE,MAAM,SAAS,CAAA"}
|
package/dist/navigation/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getOpenapiObject } from "./helpers/get-openapi-object.js";
|
|
2
|
+
import { getParentEntry } from "./helpers/get-parent-entry.js";
|
|
2
3
|
import { traverseDocument } from "./helpers/traverse-document.js";
|
|
3
4
|
export {
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
traverseDocument as createNavigation,
|
|
6
|
+
getOpenapiObject,
|
|
7
|
+
getParentEntry
|
|
6
8
|
};
|
|
7
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/navigation/index.ts"],
|
|
4
|
-
"sourcesContent": ["
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["export { getOpenapiObject } from './helpers/get-openapi-object'\nexport { getParentEntry } from './helpers/get-parent-entry'\nexport { traverseDocument as createNavigation } from './helpers/traverse-document'\nexport type { TraverseSpecOptions as createNavigationOptions } from './types'\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,wBAAwB;AACjC,SAAS,sBAAsB;AAC/B,SAA6B,wBAAwB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -80,7 +80,13 @@ export declare const createWorkspaceStorePersistence: () => Promise<{
|
|
|
80
80
|
* Deletes an entire workspace and all associated chunk records from all tables by ID.
|
|
81
81
|
*/
|
|
82
82
|
deleteItem: (id: string) => Promise<void>;
|
|
83
|
+
deleteDocument: (workspaceId: string, documentName: string) => Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Checks if a workspace with the given ID exists in the store.
|
|
86
|
+
*/
|
|
87
|
+
has: (id: string) => Promise<boolean>;
|
|
83
88
|
};
|
|
89
|
+
clear: () => Promise<void>;
|
|
84
90
|
}>;
|
|
85
91
|
export {};
|
|
86
92
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/persistence/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAExD,KAAK,mBAAmB,GAAG;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,iBAAiB,CAAA;CAC7B,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,+BAA+B;;;QAoDtC;;WAEG;+BAC0B,MAAM,QAAQ,aAAa;;;QAKxD;;WAEG;+BAC0B,MAAM,gBAAgB,MAAM,QAAQ,iBAAiB,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;;;QAKvG;;WAEG;+BAEY,MAAM,gBACL,MAAM,QACd,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC;;;QAMtD;;WAEG;+BAEY,MAAM,gBACL,MAAM,QACd,iBAAiB,CAAC,uBAAuB,CAAC,CAAC,MAAM,CAAC;;;QAM1D;;WAEG;+BAC0B,MAAM,gBAAgB,MAAM,QAAQ,iBAAiB,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;;;QAKvG;;WAEG;+BAEY,MAAM,gBACL,MAAM,QACd,iBAAiB,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC;;;QAMpD;;;;WAIG;sBACiB,MAAM,KAAG,OAAO,CAAC,CAAC,mBAAmB,GAAG;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC,GAAG,SAAS,CAAC;QAkCxF;;;;;WAKG;;;;;QAKH;;;;WAIG;sBACiB,MAAM,SAAS,mBAAmB,KAAG,OAAO,CAAC,IAAI,CAAC;QA0CtE;;WAEG;yBACoB,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/persistence/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAExD,KAAK,mBAAmB,GAAG;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,iBAAiB,CAAA;CAC7B,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,+BAA+B;;;QAoDtC;;WAEG;+BAC0B,MAAM,QAAQ,aAAa;;;QAKxD;;WAEG;+BAC0B,MAAM,gBAAgB,MAAM,QAAQ,iBAAiB,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;;;QAKvG;;WAEG;+BAEY,MAAM,gBACL,MAAM,QACd,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC;;;QAMtD;;WAEG;+BAEY,MAAM,gBACL,MAAM,QACd,iBAAiB,CAAC,uBAAuB,CAAC,CAAC,MAAM,CAAC;;;QAM1D;;WAEG;+BAC0B,MAAM,gBAAgB,MAAM,QAAQ,iBAAiB,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;;;QAKvG;;WAEG;+BAEY,MAAM,gBACL,MAAM,QACd,iBAAiB,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC;;;QAMpD;;;;WAIG;sBACiB,MAAM,KAAG,OAAO,CAAC,CAAC,mBAAmB,GAAG;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC,GAAG,SAAS,CAAC;QAkCxF;;;;;WAKG;;;;;QAKH;;;;WAIG;sBACiB,MAAM,SAAS,mBAAmB,KAAG,OAAO,CAAC,IAAI,CAAC;QA0CtE;;WAEG;yBACoB,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;sCAiBT,MAAM,gBAAgB,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;QAUhF;;WAEG;kBACa,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;;;EAQ9C,CAAA"}
|
|
@@ -186,7 +186,25 @@ const createWorkspaceStorePersistence = async () => {
|
|
|
186
186
|
overridesTable.deleteRange([id]),
|
|
187
187
|
documentConfigsTable.deleteRange([id])
|
|
188
188
|
]);
|
|
189
|
+
},
|
|
190
|
+
deleteDocument: async (workspaceId, documentName) => {
|
|
191
|
+
await Promise.all([
|
|
192
|
+
documentsTable.deleteItem({ workspaceId, documentName }),
|
|
193
|
+
intermediateDocumentTable.deleteItem({ workspaceId, documentName }),
|
|
194
|
+
originalDocumentTable.deleteItem({ workspaceId, documentName }),
|
|
195
|
+
overridesTable.deleteItem({ workspaceId, documentName }),
|
|
196
|
+
documentConfigsTable.deleteItem({ workspaceId, documentName })
|
|
197
|
+
]);
|
|
198
|
+
},
|
|
199
|
+
/**
|
|
200
|
+
* Checks if a workspace with the given ID exists in the store.
|
|
201
|
+
*/
|
|
202
|
+
has: async (id) => {
|
|
203
|
+
return await workspaceTable.getItem({ id }) !== void 0;
|
|
189
204
|
}
|
|
205
|
+
},
|
|
206
|
+
clear: async () => {
|
|
207
|
+
await workspaceTable.deleteAll();
|
|
190
208
|
}
|
|
191
209
|
};
|
|
192
210
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/persistence/index.ts"],
|
|
4
|
-
"sourcesContent": ["import { Type } from '@scalar/typebox'\n\nimport { createIndexDbConnection } from '@/persistence/indexdb'\nimport type { InMemoryWorkspace } from '@/schemas/inmemory-workspace'\nimport type { WorkspaceMeta } from '@/schemas/workspace'\n\ntype WorkspaceStoreShape = {\n name: string\n workspace: InMemoryWorkspace\n}\n\n/**\n * Creates the persistence layer for the workspace store using IndexedDB.\n * This sets up all the required tables for storing workspace chunk information,\n * such as workspace meta, documents, original documents, intermediate documents, overrides, etc.\n * Each logical group (meta, documents, etc) gets its own table keyed appropriately for efficient sub-document access.\n * Returns an object containing `meta`, `documents`, `originalDocuments`, `intermediateDocuments`, `overrides`,\n * `documentMeta`, `documentConfigs`, and `workspace` sections, each exposing a `setItem` method\n * for upsetting records, and in the case of `workspace`, also `getItem` and `deleteItem`.\n */\nexport const createWorkspaceStorePersistence = async () => {\n // Create the database connection and setup all required tables for workspace storage.\n const connection = await createIndexDbConnection({\n name: 'scalar-workspace-store',\n version: 1,\n tables: {\n workspace: {\n schema: Type.Object({ id: Type.String(), name: Type.String() }),\n index: ['id'],\n },\n meta: {\n schema: Type.Object({ workspaceId: Type.String(), data: Type.Any() }),\n index: ['workspaceId'],\n },\n documents: {\n schema: Type.Object({ workspaceId: Type.String(), documentName: Type.String(), data: Type.Any() }),\n index: ['workspaceId', 'documentName'],\n },\n originalDocuments: {\n schema: Type.Object({ workspaceId: Type.String(), documentName: Type.String(), data: Type.Any() }),\n index: ['workspaceId', 'documentName'],\n },\n intermediateDocuments: {\n schema: Type.Object({ workspaceId: Type.String(), documentName: Type.String(), data: Type.Any() }),\n index: ['workspaceId', 'documentName'],\n },\n overrides: {\n schema: Type.Object({ workspaceId: Type.String(), documentName: Type.String(), data: Type.Any() }),\n index: ['workspaceId', 'documentName'],\n },\n documentConfigs: {\n schema: Type.Object({ workspaceId: Type.String(), documentName: Type.String(), data: Type.Any() }),\n index: ['workspaceId', 'documentName'],\n },\n },\n })\n\n // Tables wrappers for each logical section.\n const workspaceTable = connection.get('workspace')\n const metaTable = connection.get('meta')\n const documentsTable = connection.get('documents')\n const originalDocumentTable = connection.get('originalDocuments')\n const intermediateDocumentTable = connection.get('intermediateDocuments')\n const overridesTable = connection.get('overrides')\n const documentConfigsTable = connection.get('documentConfigs')\n\n // The returned persistence API with logical sections for each table and mapping.\n return {\n close: () => {\n connection.closeDatabase()\n },\n meta: {\n /**\n * Set meta data for a workspace.\n */\n setItem: async (workspaceId: string, data: WorkspaceMeta) => {\n await metaTable.addItem({ workspaceId }, { data })\n },\n },\n documents: {\n /**\n * Set (persist) a workspace document using workspaceId and documentName as composite key.\n */\n setItem: async (workspaceId: string, documentName: string, data: InMemoryWorkspace['documents'][string]) => {\n await documentsTable.addItem({ workspaceId, documentName }, { data })\n },\n },\n originalDocuments: {\n /**\n * Set an original (raw) document for a workspace/document pair.\n */\n setItem: async (\n workspaceId: string,\n documentName: string,\n data: InMemoryWorkspace['originalDocuments'][string],\n ) => {\n await originalDocumentTable.addItem({ workspaceId, documentName }, { data })\n },\n },\n intermediateDocuments: {\n /**\n * Set an intermediate (transformed) document for a workspace/document pair.\n */\n setItem: async (\n workspaceId: string,\n documentName: string,\n data: InMemoryWorkspace['intermediateDocuments'][string],\n ) => {\n await intermediateDocumentTable.addItem({ workspaceId, documentName }, { data })\n },\n },\n overrides: {\n /**\n * Set document overrides for a workspace/document pair.\n */\n setItem: async (workspaceId: string, documentName: string, data: InMemoryWorkspace['overrides'][string]) => {\n await overridesTable.addItem({ workspaceId, documentName }, { data })\n },\n },\n documentConfigs: {\n /**\n * Set configuration for a document in a workspace.\n */\n setItem: async (\n workspaceId: string,\n documentName: string,\n data: InMemoryWorkspace['documentConfigs'][string],\n ) => {\n await documentConfigsTable.addItem({ workspaceId, documentName }, { data })\n },\n },\n workspace: {\n /**\n * Retrieves a workspace by its ID.\n * Returns undefined if the workspace does not exist.\n * Gathers all workspace 'chunk' tables and assembles a full workspace shape.\n */\n getItem: async (id: string): Promise<(WorkspaceStoreShape & { id: string }) | undefined> => {\n const workspace = await workspaceTable.getItem({ id })\n\n if (!workspace) {\n return undefined\n }\n\n // Retrieve all chunk records for this workspace.\n const workspaceDocuments = await documentsTable.getRange([id])\n const workspaceOriginalDocuments = await originalDocumentTable.getRange([id])\n const workspaceIntermediateDocuments = await intermediateDocumentTable.getRange([id])\n const workspaceOverrides = await overridesTable.getRange([id])\n const workspaceMeta = await metaTable.getItem({ workspaceId: id })\n const workspaceDocumentConfigs = await documentConfigsTable.getRange([id])\n\n // Compose the workspace structure from table records.\n return {\n id,\n name: workspace.name,\n workspace: {\n documents: Object.fromEntries(workspaceDocuments.map((item) => [item.documentName, item.data])),\n originalDocuments: Object.fromEntries(\n workspaceOriginalDocuments.map((item) => [item.documentName, item.data]),\n ),\n intermediateDocuments: Object.fromEntries(\n workspaceIntermediateDocuments.map((item) => [item.documentName, item.data]),\n ),\n overrides: Object.fromEntries(workspaceOverrides.map((item) => [item.documentName, item.data])),\n meta: workspaceMeta?.data,\n documentConfigs: Object.fromEntries(workspaceDocumentConfigs.map((item) => [item.documentName, item.data])),\n },\n }\n },\n\n /**\n * Retrieves all workspaces from the database.\n * Returns only the workspace ID and name for each workspace.\n * To get the full workspace data including documents and metadata, use getItem() with a specific ID.\n * Returns an empty array if no workspaces exist.\n */\n getAll: async () => {\n return await workspaceTable.getAll()\n },\n\n /**\n * Saves a workspace to the database.\n * All chunks (meta, documents, configs, etc.) are upsert in their respective tables.\n * If a workspace with the same ID already exists, it will be replaced.\n */\n setItem: async (id: string, value: WorkspaceStoreShape): Promise<void> => {\n await workspaceTable.addItem({ id }, { name: value.name })\n\n // Save all meta info for workspace.\n await metaTable.addItem({ workspaceId: id }, { data: value.workspace.meta })\n\n // Persist all workspace documents (chunks).\n await Promise.all(\n Object.entries(value.workspace.documents ?? {}).map(([name, data]) => {\n return documentsTable.addItem({ workspaceId: id, documentName: name }, { data })\n }),\n )\n\n // Persist all original documents.\n await Promise.all(\n Object.entries(value.workspace.originalDocuments ?? {}).map(([name, data]) => {\n return originalDocumentTable.addItem({ workspaceId: id, documentName: name }, { data })\n }),\n )\n\n // Persist all intermediate documents.\n await Promise.all(\n Object.entries(value.workspace.intermediateDocuments ?? {}).map(([name, data]) => {\n return intermediateDocumentTable.addItem({ workspaceId: id, documentName: name }, { data })\n }),\n )\n\n // Persist all document overrides.\n await Promise.all(\n Object.entries(value.workspace.overrides ?? {}).map(([name, data]) => {\n return overridesTable.addItem({ workspaceId: id, documentName: name }, { data })\n }),\n )\n\n // Persist all document configs.\n await Promise.all(\n Object.entries(value.workspace.documentConfigs ?? {}).map(([name, data]) => {\n return documentConfigsTable.addItem({ workspaceId: id, documentName: name }, { data })\n }),\n )\n },\n\n /**\n * Deletes an entire workspace and all associated chunk records from all tables by ID.\n */\n deleteItem: async (id: string): Promise<void> => {\n await workspaceTable.deleteItem({ id })\n\n // Remove all workspace-related records from all chunk tables.\n await Promise.all([\n // By id\n metaTable.deleteItem({ workspaceId: id }),\n\n // By range (composite-key tables)\n documentsTable.deleteRange([id]),\n originalDocumentTable.deleteRange([id]),\n intermediateDocumentTable.deleteRange([id]),\n overridesTable.deleteRange([id]),\n documentConfigsTable.deleteRange([id]),\n ])\n },\n },\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { Type } from '@scalar/typebox'\n\nimport { createIndexDbConnection } from '@/persistence/indexdb'\nimport type { InMemoryWorkspace } from '@/schemas/inmemory-workspace'\nimport type { WorkspaceMeta } from '@/schemas/workspace'\n\ntype WorkspaceStoreShape = {\n name: string\n workspace: InMemoryWorkspace\n}\n\n/**\n * Creates the persistence layer for the workspace store using IndexedDB.\n * This sets up all the required tables for storing workspace chunk information,\n * such as workspace meta, documents, original documents, intermediate documents, overrides, etc.\n * Each logical group (meta, documents, etc) gets its own table keyed appropriately for efficient sub-document access.\n * Returns an object containing `meta`, `documents`, `originalDocuments`, `intermediateDocuments`, `overrides`,\n * `documentMeta`, `documentConfigs`, and `workspace` sections, each exposing a `setItem` method\n * for upsetting records, and in the case of `workspace`, also `getItem` and `deleteItem`.\n */\nexport const createWorkspaceStorePersistence = async () => {\n // Create the database connection and setup all required tables for workspace storage.\n const connection = await createIndexDbConnection({\n name: 'scalar-workspace-store',\n version: 1,\n tables: {\n workspace: {\n schema: Type.Object({ id: Type.String(), name: Type.String() }),\n index: ['id'],\n },\n meta: {\n schema: Type.Object({ workspaceId: Type.String(), data: Type.Any() }),\n index: ['workspaceId'],\n },\n documents: {\n schema: Type.Object({ workspaceId: Type.String(), documentName: Type.String(), data: Type.Any() }),\n index: ['workspaceId', 'documentName'],\n },\n originalDocuments: {\n schema: Type.Object({ workspaceId: Type.String(), documentName: Type.String(), data: Type.Any() }),\n index: ['workspaceId', 'documentName'],\n },\n intermediateDocuments: {\n schema: Type.Object({ workspaceId: Type.String(), documentName: Type.String(), data: Type.Any() }),\n index: ['workspaceId', 'documentName'],\n },\n overrides: {\n schema: Type.Object({ workspaceId: Type.String(), documentName: Type.String(), data: Type.Any() }),\n index: ['workspaceId', 'documentName'],\n },\n documentConfigs: {\n schema: Type.Object({ workspaceId: Type.String(), documentName: Type.String(), data: Type.Any() }),\n index: ['workspaceId', 'documentName'],\n },\n },\n })\n\n // Tables wrappers for each logical section.\n const workspaceTable = connection.get('workspace')\n const metaTable = connection.get('meta')\n const documentsTable = connection.get('documents')\n const originalDocumentTable = connection.get('originalDocuments')\n const intermediateDocumentTable = connection.get('intermediateDocuments')\n const overridesTable = connection.get('overrides')\n const documentConfigsTable = connection.get('documentConfigs')\n\n // The returned persistence API with logical sections for each table and mapping.\n return {\n close: () => {\n connection.closeDatabase()\n },\n meta: {\n /**\n * Set meta data for a workspace.\n */\n setItem: async (workspaceId: string, data: WorkspaceMeta) => {\n await metaTable.addItem({ workspaceId }, { data })\n },\n },\n documents: {\n /**\n * Set (persist) a workspace document using workspaceId and documentName as composite key.\n */\n setItem: async (workspaceId: string, documentName: string, data: InMemoryWorkspace['documents'][string]) => {\n await documentsTable.addItem({ workspaceId, documentName }, { data })\n },\n },\n originalDocuments: {\n /**\n * Set an original (raw) document for a workspace/document pair.\n */\n setItem: async (\n workspaceId: string,\n documentName: string,\n data: InMemoryWorkspace['originalDocuments'][string],\n ) => {\n await originalDocumentTable.addItem({ workspaceId, documentName }, { data })\n },\n },\n intermediateDocuments: {\n /**\n * Set an intermediate (transformed) document for a workspace/document pair.\n */\n setItem: async (\n workspaceId: string,\n documentName: string,\n data: InMemoryWorkspace['intermediateDocuments'][string],\n ) => {\n await intermediateDocumentTable.addItem({ workspaceId, documentName }, { data })\n },\n },\n overrides: {\n /**\n * Set document overrides for a workspace/document pair.\n */\n setItem: async (workspaceId: string, documentName: string, data: InMemoryWorkspace['overrides'][string]) => {\n await overridesTable.addItem({ workspaceId, documentName }, { data })\n },\n },\n documentConfigs: {\n /**\n * Set configuration for a document in a workspace.\n */\n setItem: async (\n workspaceId: string,\n documentName: string,\n data: InMemoryWorkspace['documentConfigs'][string],\n ) => {\n await documentConfigsTable.addItem({ workspaceId, documentName }, { data })\n },\n },\n workspace: {\n /**\n * Retrieves a workspace by its ID.\n * Returns undefined if the workspace does not exist.\n * Gathers all workspace 'chunk' tables and assembles a full workspace shape.\n */\n getItem: async (id: string): Promise<(WorkspaceStoreShape & { id: string }) | undefined> => {\n const workspace = await workspaceTable.getItem({ id })\n\n if (!workspace) {\n return undefined\n }\n\n // Retrieve all chunk records for this workspace.\n const workspaceDocuments = await documentsTable.getRange([id])\n const workspaceOriginalDocuments = await originalDocumentTable.getRange([id])\n const workspaceIntermediateDocuments = await intermediateDocumentTable.getRange([id])\n const workspaceOverrides = await overridesTable.getRange([id])\n const workspaceMeta = await metaTable.getItem({ workspaceId: id })\n const workspaceDocumentConfigs = await documentConfigsTable.getRange([id])\n\n // Compose the workspace structure from table records.\n return {\n id,\n name: workspace.name,\n workspace: {\n documents: Object.fromEntries(workspaceDocuments.map((item) => [item.documentName, item.data])),\n originalDocuments: Object.fromEntries(\n workspaceOriginalDocuments.map((item) => [item.documentName, item.data]),\n ),\n intermediateDocuments: Object.fromEntries(\n workspaceIntermediateDocuments.map((item) => [item.documentName, item.data]),\n ),\n overrides: Object.fromEntries(workspaceOverrides.map((item) => [item.documentName, item.data])),\n meta: workspaceMeta?.data,\n documentConfigs: Object.fromEntries(workspaceDocumentConfigs.map((item) => [item.documentName, item.data])),\n },\n }\n },\n\n /**\n * Retrieves all workspaces from the database.\n * Returns only the workspace ID and name for each workspace.\n * To get the full workspace data including documents and metadata, use getItem() with a specific ID.\n * Returns an empty array if no workspaces exist.\n */\n getAll: async () => {\n return await workspaceTable.getAll()\n },\n\n /**\n * Saves a workspace to the database.\n * All chunks (meta, documents, configs, etc.) are upsert in their respective tables.\n * If a workspace with the same ID already exists, it will be replaced.\n */\n setItem: async (id: string, value: WorkspaceStoreShape): Promise<void> => {\n await workspaceTable.addItem({ id }, { name: value.name })\n\n // Save all meta info for workspace.\n await metaTable.addItem({ workspaceId: id }, { data: value.workspace.meta })\n\n // Persist all workspace documents (chunks).\n await Promise.all(\n Object.entries(value.workspace.documents ?? {}).map(([name, data]) => {\n return documentsTable.addItem({ workspaceId: id, documentName: name }, { data })\n }),\n )\n\n // Persist all original documents.\n await Promise.all(\n Object.entries(value.workspace.originalDocuments ?? {}).map(([name, data]) => {\n return originalDocumentTable.addItem({ workspaceId: id, documentName: name }, { data })\n }),\n )\n\n // Persist all intermediate documents.\n await Promise.all(\n Object.entries(value.workspace.intermediateDocuments ?? {}).map(([name, data]) => {\n return intermediateDocumentTable.addItem({ workspaceId: id, documentName: name }, { data })\n }),\n )\n\n // Persist all document overrides.\n await Promise.all(\n Object.entries(value.workspace.overrides ?? {}).map(([name, data]) => {\n return overridesTable.addItem({ workspaceId: id, documentName: name }, { data })\n }),\n )\n\n // Persist all document configs.\n await Promise.all(\n Object.entries(value.workspace.documentConfigs ?? {}).map(([name, data]) => {\n return documentConfigsTable.addItem({ workspaceId: id, documentName: name }, { data })\n }),\n )\n },\n\n /**\n * Deletes an entire workspace and all associated chunk records from all tables by ID.\n */\n deleteItem: async (id: string): Promise<void> => {\n await workspaceTable.deleteItem({ id })\n\n // Remove all workspace-related records from all chunk tables.\n await Promise.all([\n // By id\n metaTable.deleteItem({ workspaceId: id }),\n\n // By range (composite-key tables)\n documentsTable.deleteRange([id]),\n originalDocumentTable.deleteRange([id]),\n intermediateDocumentTable.deleteRange([id]),\n overridesTable.deleteRange([id]),\n documentConfigsTable.deleteRange([id]),\n ])\n },\n\n deleteDocument: async (workspaceId: string, documentName: string): Promise<void> => {\n await Promise.all([\n documentsTable.deleteItem({ workspaceId, documentName }),\n intermediateDocumentTable.deleteItem({ workspaceId, documentName }),\n originalDocumentTable.deleteItem({ workspaceId, documentName }),\n overridesTable.deleteItem({ workspaceId, documentName }),\n documentConfigsTable.deleteItem({ workspaceId, documentName }),\n ])\n },\n\n /**\n * Checks if a workspace with the given ID exists in the store.\n */\n has: async (id: string): Promise<boolean> => {\n return (await workspaceTable.getItem({ id })) !== undefined\n },\n },\n clear: async () => {\n await workspaceTable.deleteAll()\n },\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexdb.d.ts","sourceRoot":"","sources":["../../src/persistence/indexdb.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAW,MAAM,iBAAiB,CAAA;AAE/D,KAAK,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,SAAS,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI;IAC3E,MAAM,EAAE,CAAC,CAAA;IACT,KAAK,EAAE,CAAC,CAAA;CACT,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,eAAO,MAAM,uBAAuB,GAAU,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,wCAK9G;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,CAAC,CAAA;IACT,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,qBAAqB,KAAK,EAAE,CAAA;KAAE,EAAE,CAAA;CAChG;UAgCS,IAAI,SAAS,MAAM,CAAC,QAAQ,IAAI;;;;;;;;;+BA+FV,WAAW,EAAE;;;4EA6Ba,OAAO,CAAC,IAAI,CAAC;kCAmBpC,WAAW,EAAE,KAAG,OAAO,CAAC,MAAM,CAAC
|
|
1
|
+
{"version":3,"file":"indexdb.d.ts","sourceRoot":"","sources":["../../src/persistence/indexdb.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAW,MAAM,iBAAiB,CAAA;AAE/D,KAAK,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,SAAS,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI;IAC3E,MAAM,EAAE,CAAC,CAAA;IACT,KAAK,EAAE,CAAC,CAAA;CACT,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,eAAO,MAAM,uBAAuB,GAAU,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,wCAK9G;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,CAAC,CAAA;IACT,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,qBAAqB,KAAK,EAAE,CAAA;KAAE,EAAE,CAAA;CAChG;UAgCS,IAAI,SAAS,MAAM,CAAC,QAAQ,IAAI;;;;;;;;;+BA+FV,WAAW,EAAE;;;4EA6Ba,OAAO,CAAC,IAAI,CAAC;kCAmBpC,WAAW,EAAE,KAAG,OAAO,CAAC,MAAM,CAAC;;;;yBA6BpC,OAAO,CAAC,IAAI,CAAC;;;EArK1C,CAAA"}
|
|
@@ -100,6 +100,10 @@ function createTableWrapper(name, db) {
|
|
|
100
100
|
};
|
|
101
101
|
});
|
|
102
102
|
}
|
|
103
|
+
async function deleteAll() {
|
|
104
|
+
const store = getStore("readwrite");
|
|
105
|
+
await requestAsPromise(store.clear());
|
|
106
|
+
}
|
|
103
107
|
function getAll() {
|
|
104
108
|
const store = getStore("readonly");
|
|
105
109
|
return requestAsPromise(store.getAll());
|
|
@@ -110,7 +114,8 @@ function createTableWrapper(name, db) {
|
|
|
110
114
|
getRange,
|
|
111
115
|
deleteItem,
|
|
112
116
|
deleteRange,
|
|
113
|
-
getAll
|
|
117
|
+
getAll,
|
|
118
|
+
deleteAll
|
|
114
119
|
};
|
|
115
120
|
}
|
|
116
121
|
function requestAsPromise(req) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/persistence/indexdb.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Static, TObject, TRecord } from '@scalar/typebox'\n\ntype TableEntry<S extends TObject, K extends readonly (keyof Static<S>)[]> = {\n schema: S\n index: K\n}\n\n/**\n * Initializes and manages an IndexedDB database connection for table-based persistence.\n *\n * @param name - The database name. Defaults to 'scalar-workspace-store'.\n * @param tables - Table definitions: the tables to create and their key schemas.\n * @param version - The database version. Bump this to trigger upgrades (default: 1).\n * @param migrations - Optional migration steps to run for version upgrades.\n * @returns An object with the following methods:\n * - `get(tableName)` \u2014 Get a wrapper to interact with the object store for the given table name.\n * - `closeDatabase()` \u2014 Closes the database connection.\n *\n * Example usage:\n * ```ts\n * import { Type } from '@scalar/typebox'\n * import { createIndexDbConnection } from './indexdb'\n *\n * // Define a schema for a user\n * const UserSchema = Type.Object({\n * id: Type.String(),\n * name: Type.String(),\n * age: Type.Number(),\n * })\n *\n * // Define tables in the database\n * const dbConfig = {\n * users: {\n * schema: UserSchema,\n * index: ['id'] as const,\n * },\n * }\n *\n * // Open the database connection and get table API\n * const { get, closeDatabase } = await createIndexDbConnection({\n * name: 'my-app-db',\n * tables: dbConfig,\n * version: 1,\n * })\n *\n * // Get a strongly-typed users table API\n * const usersTable = get('users')\n *\n * // Add a user\n * await usersTable.addItem({ id: 'user-1' }, { name: 'Alice', age: 25 })\n *\n * // Retrieve a user by id\n * const user = await usersTable.getItem({ id: 'user-1' })\n *\n * // Don't forget to close the database when done!\n * closeDatabase()\n * ```\n */\nexport const createIndexDbConnection = async <T extends Record<string, TableEntry<any, readonly (keyof any)[]>>>({\n name = 'scalar-workspace-store',\n tables,\n version = 1,\n migrations = [],\n}: {\n name: string\n tables: T\n version: number\n migrations?: { version: number; exec: (db: IDBDatabase, event: IDBVersionChangeEvent) => {} }[]\n}) => {\n const db = indexedDB.open(name, version)\n\n db.onupgradeneeded = (e) => {\n // Initial setup of object stores\n if (e.oldVersion < 1) {\n const database = db.result\n\n // Initialize all the tables\n Object.entries(tables).forEach(([name, options]) => {\n if (!database.objectStoreNames.contains(name)) {\n database.createObjectStore(name, {\n keyPath: options.index.length === 1 ? (options.index[0] as string) : (options.index as string[]),\n })\n }\n })\n }\n\n // Run any future migrations here\n migrations.forEach((migration) => {\n if (e.oldVersion < migration.version) {\n migration.exec(db.result, e)\n }\n })\n }\n\n await new Promise((resolve, reject) => {\n db.onsuccess = () => resolve(true)\n db.onerror = () => reject(db.error)\n })\n\n return {\n get: <Name extends keyof T>(name: Name) => {\n return createTableWrapper<T[Name]['schema'], T[Name]['index'][number]>(name as string, db.result)\n },\n closeDatabase: () => {\n db.result.close()\n },\n }\n}\n\n/**\n * Utility wrapper for interacting with an IndexedDB object store, typed by the schema.\n *\n * Usage example:\n * ```\n * // Define a TypeBox schema for users\n * const UserSchema = Type.Object({\n * id: Type.String(),\n * name: Type.String(),\n * age: Type.Number(),\n * })\n * \n * // Open or create the users table\n * const usersTable = createTableWrapper<typeof UserSchema, 'id'>('users', openDatabase)\n * \n * // Add a user\n await usersTable.addItem({ id: 'user-1' }, { name: 'Alice', age: 24 })\n * \n * // Get a user by id\n * const alic = await usersTable.getItem({ id: 'user-1' })\n * \n * // Get users with a partial key (use [] if no composite key)\n * const users = await usersTable.getRange(['user-1'])\n * \n * // Get all users\n * const allUsers = await usersTable.getAll()\n * ```\n *\n * @template T TypeBox schema type for objects in the store\n * @template K Key property names that compose the primary key\n *\n * @param name - Object store name\n * @param getDb - Function returning a Promise for the IDBDatabase\n * @returns Methods to interact with the object store\n */\nfunction createTableWrapper<T extends TRecord | TObject, const K extends keyof Static<T>>(\n name: string,\n db: IDBDatabase,\n) {\n /**\n * Gets the object store from the latest DB connection, for the given transaction mode.\n */\n const getStore = (mode: IDBTransactionMode): IDBObjectStore => {\n const tx = db.transaction(name, mode)\n return tx.objectStore(name)\n }\n\n /**\n * Adds or updates an item in the store.\n * @param key - The primary key values, as { key1, key2 }\n * @param value - The value for the other properties, omitting keys\n * @returns The full inserted/updated object\n */\n async function addItem(key: Record<K, IDBValidKey>, value: Omit<Static<T>, K>): Promise<Static<T>> {\n const store = getStore('readwrite')\n const keyObj: any = { ...key }\n const finalValue = { ...keyObj, ...value }\n await requestAsPromise(store.put(finalValue))\n\n return finalValue\n }\n\n /**\n * Retrieves a single item by composite key.\n * @param key - Key values. For a single key: { id: '...' }\n * @returns The found object or undefined\n */\n function getItem(key: Record<K, IDBValidKey>): Promise<Static<T> | undefined> {\n const store = getStore('readonly')\n const keyValues = Object.values(key)\n // For single keys, pass value directly; for compound keys, pass array\n const keyToUse = keyValues.length === 1 ? keyValues[0] : keyValues\n return requestAsPromise(store.get(keyToUse as IDBValidKey))\n }\n\n /**\n * Returns all records matching a partial (prefix) key. Use for composite keys.\n * For non-compound keys, pass single-element array: getRange(['some-id'])\n * For prefix search, pass subset of key parts.\n * @param partialKey - Array of partial key values\n * @returns Matching objects\n *\n * Example (composite [a,b]):\n * getRange(['foo']) // All with a === 'foo'\n * getRange(['foo', 'bar']) // All with a === 'foo' and b === 'bar'\n */\n function getRange(partialKey: IDBValidKey[]): Promise<Static<T>[]> {\n const store = getStore('readonly')\n const results: Static<T>[] = []\n\n // Construct upper bound to match all keys starting with partialKey\n const upperBound = [...partialKey]\n upperBound.push([]) // ensures upper bound includes all keys with this prefix\n const range = IDBKeyRange.bound(partialKey, upperBound, false, true)\n\n return new Promise((resolve, reject) => {\n const request = store.openCursor(range)\n request.onerror = () => reject(request.error)\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result\n if (cursor) {\n results.push(cursor.value)\n cursor.continue()\n } else {\n resolve(results)\n }\n }\n })\n }\n\n /**\n * Deletes an item from the store by its composite key.\n * @param key - Key values. For a single key: { id: '...' }\n * @returns void\n */\n async function deleteItem(key: Record<K, IDBValidKey>): Promise<void> {\n const store = getStore('readwrite')\n const keyValues = Object.values(key)\n // For single keys, pass value directly; for compound keys, pass array\n const keyToUse = keyValues.length === 1 ? keyValues[0] : keyValues\n await requestAsPromise(store.delete(keyToUse as IDBValidKey))\n }\n\n /**\n * Deletes all records matching a partial (prefix) key. Use for composite keys.\n * For non-compound keys, pass single-element array: deleteRange(['some-id'])\n * For prefix deletion, pass subset of key parts.\n * @param partialKey - Array of partial key values\n * @returns Number of deleted items\n *\n * Example (composite [a,b]):\n * deleteRange(['foo']) // Delete all with a === 'foo'\n * deleteRange(['foo', 'bar']) // Delete all with a === 'foo' and b === 'bar'\n */\n function deleteRange(partialKey: IDBValidKey[]): Promise<number> {\n const store = getStore('readwrite')\n let deletedCount = 0\n\n // Construct upper bound to match all keys starting with partialKey\n const upperBound = [...partialKey]\n upperBound.push([]) // ensures upper bound includes all keys with this prefix\n const range = IDBKeyRange.bound(partialKey, upperBound, false, true)\n\n return new Promise((resolve, reject) => {\n const request = store.openCursor(range)\n request.onerror = () => reject(request.error)\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result\n if (cursor) {\n cursor.delete()\n deletedCount++\n cursor.continue()\n } else {\n resolve(deletedCount)\n }\n }\n })\n }\n\n /**\n * Retrieves all items from the table.\n * @returns Array of all objects in the store\n */\n function getAll(): Promise<Static<T>[]> {\n const store = getStore('readonly')\n return requestAsPromise(store.getAll())\n }\n\n return {\n addItem,\n getItem,\n getRange,\n deleteItem,\n deleteRange,\n getAll,\n }\n}\n\n// ---- Utility ----\nfunction requestAsPromise<T>(req: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n req.onsuccess = () => resolve(req.result)\n req.onerror = () => reject(req.error)\n })\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type { Static, TObject, TRecord } from '@scalar/typebox'\n\ntype TableEntry<S extends TObject, K extends readonly (keyof Static<S>)[]> = {\n schema: S\n index: K\n}\n\n/**\n * Initializes and manages an IndexedDB database connection for table-based persistence.\n *\n * @param name - The database name. Defaults to 'scalar-workspace-store'.\n * @param tables - Table definitions: the tables to create and their key schemas.\n * @param version - The database version. Bump this to trigger upgrades (default: 1).\n * @param migrations - Optional migration steps to run for version upgrades.\n * @returns An object with the following methods:\n * - `get(tableName)` \u2014 Get a wrapper to interact with the object store for the given table name.\n * - `closeDatabase()` \u2014 Closes the database connection.\n *\n * Example usage:\n * ```ts\n * import { Type } from '@scalar/typebox'\n * import { createIndexDbConnection } from './indexdb'\n *\n * // Define a schema for a user\n * const UserSchema = Type.Object({\n * id: Type.String(),\n * name: Type.String(),\n * age: Type.Number(),\n * })\n *\n * // Define tables in the database\n * const dbConfig = {\n * users: {\n * schema: UserSchema,\n * index: ['id'] as const,\n * },\n * }\n *\n * // Open the database connection and get table API\n * const { get, closeDatabase } = await createIndexDbConnection({\n * name: 'my-app-db',\n * tables: dbConfig,\n * version: 1,\n * })\n *\n * // Get a strongly-typed users table API\n * const usersTable = get('users')\n *\n * // Add a user\n * await usersTable.addItem({ id: 'user-1' }, { name: 'Alice', age: 25 })\n *\n * // Retrieve a user by id\n * const user = await usersTable.getItem({ id: 'user-1' })\n *\n * // Don't forget to close the database when done!\n * closeDatabase()\n * ```\n */\nexport const createIndexDbConnection = async <T extends Record<string, TableEntry<any, readonly (keyof any)[]>>>({\n name = 'scalar-workspace-store',\n tables,\n version = 1,\n migrations = [],\n}: {\n name: string\n tables: T\n version: number\n migrations?: { version: number; exec: (db: IDBDatabase, event: IDBVersionChangeEvent) => {} }[]\n}) => {\n const db = indexedDB.open(name, version)\n\n db.onupgradeneeded = (e) => {\n // Initial setup of object stores\n if (e.oldVersion < 1) {\n const database = db.result\n\n // Initialize all the tables\n Object.entries(tables).forEach(([name, options]) => {\n if (!database.objectStoreNames.contains(name)) {\n database.createObjectStore(name, {\n keyPath: options.index.length === 1 ? (options.index[0] as string) : (options.index as string[]),\n })\n }\n })\n }\n\n // Run any future migrations here\n migrations.forEach((migration) => {\n if (e.oldVersion < migration.version) {\n migration.exec(db.result, e)\n }\n })\n }\n\n await new Promise((resolve, reject) => {\n db.onsuccess = () => resolve(true)\n db.onerror = () => reject(db.error)\n })\n\n return {\n get: <Name extends keyof T>(name: Name) => {\n return createTableWrapper<T[Name]['schema'], T[Name]['index'][number]>(name as string, db.result)\n },\n closeDatabase: () => {\n db.result.close()\n },\n }\n}\n\n/**\n * Utility wrapper for interacting with an IndexedDB object store, typed by the schema.\n *\n * Usage example:\n * ```\n * // Define a TypeBox schema for users\n * const UserSchema = Type.Object({\n * id: Type.String(),\n * name: Type.String(),\n * age: Type.Number(),\n * })\n * \n * // Open or create the users table\n * const usersTable = createTableWrapper<typeof UserSchema, 'id'>('users', openDatabase)\n * \n * // Add a user\n await usersTable.addItem({ id: 'user-1' }, { name: 'Alice', age: 24 })\n * \n * // Get a user by id\n * const alic = await usersTable.getItem({ id: 'user-1' })\n * \n * // Get users with a partial key (use [] if no composite key)\n * const users = await usersTable.getRange(['user-1'])\n * \n * // Get all users\n * const allUsers = await usersTable.getAll()\n * ```\n *\n * @template T TypeBox schema type for objects in the store\n * @template K Key property names that compose the primary key\n *\n * @param name - Object store name\n * @param getDb - Function returning a Promise for the IDBDatabase\n * @returns Methods to interact with the object store\n */\nfunction createTableWrapper<T extends TRecord | TObject, const K extends keyof Static<T>>(\n name: string,\n db: IDBDatabase,\n) {\n /**\n * Gets the object store from the latest DB connection, for the given transaction mode.\n */\n const getStore = (mode: IDBTransactionMode): IDBObjectStore => {\n const tx = db.transaction(name, mode)\n return tx.objectStore(name)\n }\n\n /**\n * Adds or updates an item in the store.\n * @param key - The primary key values, as { key1, key2 }\n * @param value - The value for the other properties, omitting keys\n * @returns The full inserted/updated object\n */\n async function addItem(key: Record<K, IDBValidKey>, value: Omit<Static<T>, K>): Promise<Static<T>> {\n const store = getStore('readwrite')\n const keyObj: any = { ...key }\n const finalValue = { ...keyObj, ...value }\n await requestAsPromise(store.put(finalValue))\n\n return finalValue\n }\n\n /**\n * Retrieves a single item by composite key.\n * @param key - Key values. For a single key: { id: '...' }\n * @returns The found object or undefined\n */\n function getItem(key: Record<K, IDBValidKey>): Promise<Static<T> | undefined> {\n const store = getStore('readonly')\n const keyValues = Object.values(key)\n // For single keys, pass value directly; for compound keys, pass array\n const keyToUse = keyValues.length === 1 ? keyValues[0] : keyValues\n return requestAsPromise(store.get(keyToUse as IDBValidKey))\n }\n\n /**\n * Returns all records matching a partial (prefix) key. Use for composite keys.\n * For non-compound keys, pass single-element array: getRange(['some-id'])\n * For prefix search, pass subset of key parts.\n * @param partialKey - Array of partial key values\n * @returns Matching objects\n *\n * Example (composite [a,b]):\n * getRange(['foo']) // All with a === 'foo'\n * getRange(['foo', 'bar']) // All with a === 'foo' and b === 'bar'\n */\n function getRange(partialKey: IDBValidKey[]): Promise<Static<T>[]> {\n const store = getStore('readonly')\n const results: Static<T>[] = []\n\n // Construct upper bound to match all keys starting with partialKey\n const upperBound = [...partialKey]\n upperBound.push([]) // ensures upper bound includes all keys with this prefix\n const range = IDBKeyRange.bound(partialKey, upperBound, false, true)\n\n return new Promise((resolve, reject) => {\n const request = store.openCursor(range)\n request.onerror = () => reject(request.error)\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result\n if (cursor) {\n results.push(cursor.value)\n cursor.continue()\n } else {\n resolve(results)\n }\n }\n })\n }\n\n /**\n * Deletes an item from the store by its composite key.\n * @param key - Key values. For a single key: { id: '...' }\n * @returns void\n */\n async function deleteItem(key: Record<K, IDBValidKey>): Promise<void> {\n const store = getStore('readwrite')\n const keyValues = Object.values(key)\n // For single keys, pass value directly; for compound keys, pass array\n const keyToUse = keyValues.length === 1 ? keyValues[0] : keyValues\n await requestAsPromise(store.delete(keyToUse as IDBValidKey))\n }\n\n /**\n * Deletes all records matching a partial (prefix) key. Use for composite keys.\n * For non-compound keys, pass single-element array: deleteRange(['some-id'])\n * For prefix deletion, pass subset of key parts.\n * @param partialKey - Array of partial key values\n * @returns Number of deleted items\n *\n * Example (composite [a,b]):\n * deleteRange(['foo']) // Delete all with a === 'foo'\n * deleteRange(['foo', 'bar']) // Delete all with a === 'foo' and b === 'bar'\n */\n function deleteRange(partialKey: IDBValidKey[]): Promise<number> {\n const store = getStore('readwrite')\n let deletedCount = 0\n\n // Construct upper bound to match all keys starting with partialKey\n const upperBound = [...partialKey]\n upperBound.push([]) // ensures upper bound includes all keys with this prefix\n const range = IDBKeyRange.bound(partialKey, upperBound, false, true)\n\n return new Promise((resolve, reject) => {\n const request = store.openCursor(range)\n request.onerror = () => reject(request.error)\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result\n if (cursor) {\n cursor.delete()\n deletedCount++\n cursor.continue()\n } else {\n resolve(deletedCount)\n }\n }\n })\n }\n\n /**\n * Deletes all items from the table.\n * @returns void\n */\n async function deleteAll(): Promise<void> {\n const store = getStore('readwrite')\n await requestAsPromise(store.clear())\n }\n\n /**\n * Retrieves all items from the table.\n * @returns Array of all objects in the store\n */\n function getAll(): Promise<Static<T>[]> {\n const store = getStore('readonly')\n return requestAsPromise(store.getAll())\n }\n\n return {\n addItem,\n getItem,\n getRange,\n deleteItem,\n deleteRange,\n getAll,\n deleteAll,\n }\n}\n\n// ---- Utility ----\nfunction requestAsPromise<T>(req: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n req.onsuccess = () => resolve(req.result)\n req.onerror = () => reject(req.error)\n })\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["name"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../src/plugins/client/persistence.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEzD;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAU,0CAKrC;IACD,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,KAAG,OAAO,CAAC,eAAe,
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../src/plugins/client/persistence.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEzD;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAU,0CAKrC;IACD,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,KAAG,OAAO,CAAC,eAAe,CAiE1B,CAAA"}
|
|
@@ -48,6 +48,12 @@ const persistencePlugin = async ({
|
|
|
48
48
|
() => persistence.overrides.setItem(workspaceId, event.documentName, event.value)
|
|
49
49
|
);
|
|
50
50
|
}
|
|
51
|
+
if (event.type === "deleteDocument") {
|
|
52
|
+
return execute(
|
|
53
|
+
`deleteDocument-${workspaceId}-${event.documentName}`,
|
|
54
|
+
() => persistence.workspace.deleteDocument(workspaceId, event.documentName)
|
|
55
|
+
);
|
|
56
|
+
}
|
|
51
57
|
return;
|
|
52
58
|
}
|
|
53
59
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/plugins/client/persistence.ts"],
|
|
4
|
-
"sourcesContent": ["import { debounce } from '@scalar/helpers/general/debounce'\n\nimport { createWorkspaceStorePersistence } from '@/persistence'\nimport type { WorkspacePlugin } from '@/workspace-plugin'\n\n/**\n * Plugin to persist workspace state changes with debounced writes.\n * Each type of change (meta, documentConfigs, documents, etc.) is debounced by key (type + workspaceId + optional documentName).\n * The debounce delay can be customized, defaults to 500ms.\n *\n * This avoids excessive writes to IndexedDB or other persistence layer when changes occur rapidly.\n */\nexport const persistencePlugin = async ({\n workspaceId,\n debounceDelay = 500,\n /** Maximum time in milliseconds to wait before forcing execution, even with continuous calls. */\n maxWait = 10000,\n}: {\n workspaceId: string\n debounceDelay?: number\n maxWait?: number\n}): Promise<WorkspacePlugin> => {\n // Create the persistence instance (e.g., IndexedDB, localForage, etc.)\n const persistence = await createWorkspaceStorePersistence()\n // Debounced execute function for batching similar state changes\n const { execute } = debounce({ delay: debounceDelay, maxWait })\n\n return {\n hooks: {\n /**\n * Handles all workspace state change events.\n * Each write is debounced by a composite key to prevent frequent writes for the same entity.\n */\n onWorkspaceStateChanges(event) {\n // If the event is for workspace meta data, debounce by workspaceId\n if (event.type === 'meta') {\n return execute(`meta-${workspaceId}`, () => persistence.meta.setItem(workspaceId, event.value))\n }\n\n // Debounce per document config and workspace\n if (event.type === 'documentConfigs') {\n return execute(`documentConfigs-${workspaceId}-${event.documentName}`, () =>\n persistence.documentConfigs.setItem(workspaceId, event.documentName, event.value),\n )\n }\n\n // Debounce per document content and workspace\n if (event.type === 'documents') {\n return execute(`documents-${workspaceId}-${event.documentName}`, () =>\n persistence.documents.setItem(workspaceId, event.documentName, event.value),\n )\n }\n\n // Debounce per intermediate document and workspace\n if (event.type === 'intermediateDocuments') {\n return execute(`intermediateDocuments-${workspaceId}-${event.documentName}`, () =>\n persistence.intermediateDocuments.setItem(workspaceId, event.documentName, event.value),\n )\n }\n\n // Debounce per original document and workspace\n if (event.type === 'originalDocuments') {\n return execute(`originalDocuments-${workspaceId}-${event.documentName}`, () =>\n persistence.originalDocuments.setItem(workspaceId, event.documentName, event.value),\n )\n }\n\n // Debounce per document override and workspace\n if (event.type === 'overrides') {\n return execute(`overrides-${workspaceId}-${event.documentName}`, () =>\n persistence.overrides.setItem(workspaceId, event.documentName, event.value),\n )\n }\n\n // No action for other event types\n return\n },\n },\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,gBAAgB;AAEzB,SAAS,uCAAuC;AAUzC,MAAM,oBAAoB,OAAO;AAAA,EACtC;AAAA,EACA,gBAAgB;AAAA;AAAA,EAEhB,UAAU;AACZ,MAIgC;AAE9B,QAAM,cAAc,MAAM,gCAAgC;AAE1D,QAAM,EAAE,QAAQ,IAAI,SAAS,EAAE,OAAO,eAAe,QAAQ,CAAC;AAE9D,SAAO;AAAA,IACL,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKL,wBAAwB,OAAO;AAE7B,YAAI,MAAM,SAAS,QAAQ;AACzB,iBAAO,QAAQ,QAAQ,WAAW,IAAI,MAAM,YAAY,KAAK,QAAQ,aAAa,MAAM,KAAK,CAAC;AAAA,QAChG;AAGA,YAAI,MAAM,SAAS,mBAAmB;AACpC,iBAAO;AAAA,YAAQ,mBAAmB,WAAW,IAAI,MAAM,YAAY;AAAA,YAAI,MACrE,YAAY,gBAAgB,QAAQ,aAAa,MAAM,cAAc,MAAM,KAAK;AAAA,UAClF;AAAA,QACF;AAGA,YAAI,MAAM,SAAS,aAAa;AAC9B,iBAAO;AAAA,YAAQ,aAAa,WAAW,IAAI,MAAM,YAAY;AAAA,YAAI,MAC/D,YAAY,UAAU,QAAQ,aAAa,MAAM,cAAc,MAAM,KAAK;AAAA,UAC5E;AAAA,QACF;AAGA,YAAI,MAAM,SAAS,yBAAyB;AAC1C,iBAAO;AAAA,YAAQ,yBAAyB,WAAW,IAAI,MAAM,YAAY;AAAA,YAAI,MAC3E,YAAY,sBAAsB,QAAQ,aAAa,MAAM,cAAc,MAAM,KAAK;AAAA,UACxF;AAAA,QACF;AAGA,YAAI,MAAM,SAAS,qBAAqB;AACtC,iBAAO;AAAA,YAAQ,qBAAqB,WAAW,IAAI,MAAM,YAAY;AAAA,YAAI,MACvE,YAAY,kBAAkB,QAAQ,aAAa,MAAM,cAAc,MAAM,KAAK;AAAA,UACpF;AAAA,QACF;AAGA,YAAI,MAAM,SAAS,aAAa;AAC9B,iBAAO;AAAA,YAAQ,aAAa,WAAW,IAAI,MAAM,YAAY;AAAA,YAAI,MAC/D,YAAY,UAAU,QAAQ,aAAa,MAAM,cAAc,MAAM,KAAK;AAAA,UAC5E;AAAA,QACF;AAGA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;",
|
|
4
|
+
"sourcesContent": ["import { debounce } from '@scalar/helpers/general/debounce'\n\nimport { createWorkspaceStorePersistence } from '@/persistence'\nimport type { WorkspacePlugin } from '@/workspace-plugin'\n\n/**\n * Plugin to persist workspace state changes with debounced writes.\n * Each type of change (meta, documentConfigs, documents, etc.) is debounced by key (type + workspaceId + optional documentName).\n * The debounce delay can be customized, defaults to 500ms.\n *\n * This avoids excessive writes to IndexedDB or other persistence layer when changes occur rapidly.\n */\nexport const persistencePlugin = async ({\n workspaceId,\n debounceDelay = 500,\n /** Maximum time in milliseconds to wait before forcing execution, even with continuous calls. */\n maxWait = 10000,\n}: {\n workspaceId: string\n debounceDelay?: number\n maxWait?: number\n}): Promise<WorkspacePlugin> => {\n // Create the persistence instance (e.g., IndexedDB, localForage, etc.)\n const persistence = await createWorkspaceStorePersistence()\n // Debounced execute function for batching similar state changes\n const { execute } = debounce({ delay: debounceDelay, maxWait })\n\n return {\n hooks: {\n /**\n * Handles all workspace state change events.\n * Each write is debounced by a composite key to prevent frequent writes for the same entity.\n */\n onWorkspaceStateChanges(event) {\n // If the event is for workspace meta data, debounce by workspaceId\n if (event.type === 'meta') {\n return execute(`meta-${workspaceId}`, () => persistence.meta.setItem(workspaceId, event.value))\n }\n\n // Debounce per document config and workspace\n if (event.type === 'documentConfigs') {\n return execute(`documentConfigs-${workspaceId}-${event.documentName}`, () =>\n persistence.documentConfigs.setItem(workspaceId, event.documentName, event.value),\n )\n }\n\n // Debounce per document content and workspace\n if (event.type === 'documents') {\n return execute(`documents-${workspaceId}-${event.documentName}`, () =>\n persistence.documents.setItem(workspaceId, event.documentName, event.value),\n )\n }\n\n // Debounce per intermediate document and workspace\n if (event.type === 'intermediateDocuments') {\n return execute(`intermediateDocuments-${workspaceId}-${event.documentName}`, () =>\n persistence.intermediateDocuments.setItem(workspaceId, event.documentName, event.value),\n )\n }\n\n // Debounce per original document and workspace\n if (event.type === 'originalDocuments') {\n return execute(`originalDocuments-${workspaceId}-${event.documentName}`, () =>\n persistence.originalDocuments.setItem(workspaceId, event.documentName, event.value),\n )\n }\n\n // Debounce per document override and workspace\n if (event.type === 'overrides') {\n return execute(`overrides-${workspaceId}-${event.documentName}`, () =>\n persistence.overrides.setItem(workspaceId, event.documentName, event.value),\n )\n }\n\n // Delete document\n if (event.type === 'deleteDocument') {\n return execute(`deleteDocument-${workspaceId}-${event.documentName}`, () =>\n persistence.workspace.deleteDocument(workspaceId, event.documentName),\n )\n }\n\n // No action for other event types\n return\n },\n },\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,gBAAgB;AAEzB,SAAS,uCAAuC;AAUzC,MAAM,oBAAoB,OAAO;AAAA,EACtC;AAAA,EACA,gBAAgB;AAAA;AAAA,EAEhB,UAAU;AACZ,MAIgC;AAE9B,QAAM,cAAc,MAAM,gCAAgC;AAE1D,QAAM,EAAE,QAAQ,IAAI,SAAS,EAAE,OAAO,eAAe,QAAQ,CAAC;AAE9D,SAAO;AAAA,IACL,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKL,wBAAwB,OAAO;AAE7B,YAAI,MAAM,SAAS,QAAQ;AACzB,iBAAO,QAAQ,QAAQ,WAAW,IAAI,MAAM,YAAY,KAAK,QAAQ,aAAa,MAAM,KAAK,CAAC;AAAA,QAChG;AAGA,YAAI,MAAM,SAAS,mBAAmB;AACpC,iBAAO;AAAA,YAAQ,mBAAmB,WAAW,IAAI,MAAM,YAAY;AAAA,YAAI,MACrE,YAAY,gBAAgB,QAAQ,aAAa,MAAM,cAAc,MAAM,KAAK;AAAA,UAClF;AAAA,QACF;AAGA,YAAI,MAAM,SAAS,aAAa;AAC9B,iBAAO;AAAA,YAAQ,aAAa,WAAW,IAAI,MAAM,YAAY;AAAA,YAAI,MAC/D,YAAY,UAAU,QAAQ,aAAa,MAAM,cAAc,MAAM,KAAK;AAAA,UAC5E;AAAA,QACF;AAGA,YAAI,MAAM,SAAS,yBAAyB;AAC1C,iBAAO;AAAA,YAAQ,yBAAyB,WAAW,IAAI,MAAM,YAAY;AAAA,YAAI,MAC3E,YAAY,sBAAsB,QAAQ,aAAa,MAAM,cAAc,MAAM,KAAK;AAAA,UACxF;AAAA,QACF;AAGA,YAAI,MAAM,SAAS,qBAAqB;AACtC,iBAAO;AAAA,YAAQ,qBAAqB,WAAW,IAAI,MAAM,YAAY;AAAA,YAAI,MACvE,YAAY,kBAAkB,QAAQ,aAAa,MAAM,cAAc,MAAM,KAAK;AAAA,UACpF;AAAA,QACF;AAGA,YAAI,MAAM,SAAS,aAAa;AAC9B,iBAAO;AAAA,YAAQ,aAAa,WAAW,IAAI,MAAM,YAAY;AAAA,YAAI,MAC/D,YAAY,UAAU,QAAQ,aAAa,MAAM,cAAc,MAAM,KAAK;AAAA,UAC5E;AAAA,QACF;AAGA,YAAI,MAAM,SAAS,kBAAkB;AACnC,iBAAO;AAAA,YAAQ,kBAAkB,WAAW,IAAI,MAAM,YAAY;AAAA,YAAI,MACpE,YAAY,UAAU,eAAe,aAAa,MAAM,YAAY;AAAA,UACtE;AAAA,QACF;AAGA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -24,6 +24,7 @@ export declare const xScalarEnvironmentSchema: import("@scalar/typebox").TObject
|
|
|
24
24
|
}>, import("@scalar/typebox").TString]>;
|
|
25
25
|
}>>;
|
|
26
26
|
}>;
|
|
27
|
+
/** An environment definition */
|
|
27
28
|
export type XScalarEnvironment = {
|
|
28
29
|
/** Optional description for the environment */
|
|
29
30
|
description?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"x-scalar-environments.d.ts","sourceRoot":"","sources":["../../../../src/schemas/extensions/document/x-scalar-environments.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB;;;;;;EAS9B,CAAA;AAEF,oCAAoC;AACpC,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EACD;QACE,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,OAAO,EAAE,MAAM,CAAA;KAChB,GACD,MAAM,CAAA;CACX,CAAA;AAED,eAAO,MAAM,wBAAwB;;;;;;;;;;EAInC,CAAA;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,4BAA4B;IAC5B,SAAS,EAAE,aAAa,EAAE,CAAA;CAC3B,CAAA;AAED,eAAO,MAAM,yBAAyB;;;;;;;;;;;;EAEpC,CAAA;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,uCAAuC;IACvC,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;CAC7D,CAAA"}
|
|
1
|
+
{"version":3,"file":"x-scalar-environments.d.ts","sourceRoot":"","sources":["../../../../src/schemas/extensions/document/x-scalar-environments.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB;;;;;;EAS9B,CAAA;AAEF,oCAAoC;AACpC,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EACD;QACE,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,OAAO,EAAE,MAAM,CAAA;KAChB,GACD,MAAM,CAAA;CACX,CAAA;AAED,eAAO,MAAM,wBAAwB;;;;;;;;;;EAInC,CAAA;AAEF,gCAAgC;AAChC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,4BAA4B;IAC5B,SAAS,EAAE,aAAa,EAAE,CAAA;CAC3B,CAAA;AAED,eAAO,MAAM,yBAAyB;;;;;;;;;;;;EAEpC,CAAA;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,uCAAuC;IACvC,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;CAC7D,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/schemas/extensions/document/x-scalar-environments.ts"],
|
|
4
|
-
"sourcesContent": ["import { Type } from '@scalar/typebox'\n\nexport const xScalarEnvVarSchema = Type.Object({\n name: Type.String(),\n value: Type.Union([\n Type.Object({\n description: Type.Optional(Type.String()),\n default: Type.String({ default: '' }),\n }),\n Type.String(),\n ]),\n})\n\n/** A scalar environment variable */\nexport type XScalarEnvVar = {\n name: string\n value:\n | {\n description?: string\n default: string\n }\n | string\n}\n\nexport const xScalarEnvironmentSchema = Type.Object({\n description: Type.Optional(Type.String()),\n color: Type.String({ default: '#FFFFFF' }),\n variables: Type.Array(xScalarEnvVarSchema),\n})\n\nexport type XScalarEnvironment = {\n /** Optional description for the environment */\n description?: string\n /** Color for the environment */\n color: string\n /** An array of variables */\n variables: XScalarEnvVar[]\n}\n\nexport const xScalarEnvironmentsSchema = Type.Object({\n 'x-scalar-environments': Type.Optional(Type.Record(Type.String(), xScalarEnvironmentSchema)),\n})\n\nexport type XScalarEnvironments = {\n /** A record of environments by name */\n 'x-scalar-environments'?: Record<string, XScalarEnvironment>\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,YAAY;AAEd,MAAM,sBAAsB,KAAK,OAAO;AAAA,EAC7C,MAAM,KAAK,OAAO;AAAA,EAClB,OAAO,KAAK,MAAM;AAAA,IAChB,KAAK,OAAO;AAAA,MACV,aAAa,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,MACxC,SAAS,KAAK,OAAO,EAAE,SAAS,GAAG,CAAC;AAAA,IACtC,CAAC;AAAA,IACD,KAAK,OAAO;AAAA,EACd,CAAC;AACH,CAAC;AAaM,MAAM,2BAA2B,KAAK,OAAO;AAAA,EAClD,aAAa,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,EACxC,OAAO,KAAK,OAAO,EAAE,SAAS,UAAU,CAAC;AAAA,EACzC,WAAW,KAAK,MAAM,mBAAmB;AAC3C,CAAC;
|
|
4
|
+
"sourcesContent": ["import { Type } from '@scalar/typebox'\n\nexport const xScalarEnvVarSchema = Type.Object({\n name: Type.String(),\n value: Type.Union([\n Type.Object({\n description: Type.Optional(Type.String()),\n default: Type.String({ default: '' }),\n }),\n Type.String(),\n ]),\n})\n\n/** A scalar environment variable */\nexport type XScalarEnvVar = {\n name: string\n value:\n | {\n description?: string\n default: string\n }\n | string\n}\n\nexport const xScalarEnvironmentSchema = Type.Object({\n description: Type.Optional(Type.String()),\n color: Type.String({ default: '#FFFFFF' }),\n variables: Type.Array(xScalarEnvVarSchema),\n})\n\n/** An environment definition */\nexport type XScalarEnvironment = {\n /** Optional description for the environment */\n description?: string\n /** Color for the environment */\n color: string\n /** An array of variables */\n variables: XScalarEnvVar[]\n}\n\nexport const xScalarEnvironmentsSchema = Type.Object({\n 'x-scalar-environments': Type.Optional(Type.Record(Type.String(), xScalarEnvironmentSchema)),\n})\n\nexport type XScalarEnvironments = {\n /** A record of environments by name */\n 'x-scalar-environments'?: Record<string, XScalarEnvironment>\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,YAAY;AAEd,MAAM,sBAAsB,KAAK,OAAO;AAAA,EAC7C,MAAM,KAAK,OAAO;AAAA,EAClB,OAAO,KAAK,MAAM;AAAA,IAChB,KAAK,OAAO;AAAA,MACV,aAAa,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,MACxC,SAAS,KAAK,OAAO,EAAE,SAAS,GAAG,CAAC;AAAA,IACtC,CAAC;AAAA,IACD,KAAK,OAAO;AAAA,EACd,CAAC;AACH,CAAC;AAaM,MAAM,2BAA2B,KAAK,OAAO;AAAA,EAClD,aAAa,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,EACxC,OAAO,KAAK,OAAO,EAAE,SAAS,UAAU,CAAC;AAAA,EACzC,WAAW,KAAK,MAAM,mBAAmB;AAC3C,CAAC;AAYM,MAAM,4BAA4B,KAAK,OAAO;AAAA,EACnD,yBAAyB,KAAK,SAAS,KAAK,OAAO,KAAK,OAAO,GAAG,wBAAwB,CAAC;AAC7F,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const XScalarSetOperationSecuritySchema: import("@scalar/typebox").TObject<{
|
|
2
|
+
'x-scalar-set-operation-security': import("@scalar/typebox").TOptional<import("@scalar/typebox").TBoolean>;
|
|
3
|
+
}>;
|
|
4
|
+
export type XScalarSetOperationSecurity = {
|
|
5
|
+
/**
|
|
6
|
+
* XScalarSetOperationSecurity Extension
|
|
7
|
+
*
|
|
8
|
+
* If enabled we set the selected security schemes at the operation level
|
|
9
|
+
* If disabled/undefined we set the selected security schemes at the document level
|
|
10
|
+
*/
|
|
11
|
+
'x-scalar-set-operation-security'?: boolean;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=x-scalar-set-operation-security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x-scalar-set-operation-security.d.ts","sourceRoot":"","sources":["../../../../src/schemas/extensions/document/x-scalar-set-operation-security.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iCAAiC;;EAE5C,CAAA;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC;;;;;OAKG;IACH,iCAAiC,CAAC,EAAE,OAAO,CAAA;CAC5C,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Type } from "@scalar/typebox";
|
|
2
|
+
const XScalarSetOperationSecuritySchema = Type.Object({
|
|
3
|
+
"x-scalar-set-operation-security": Type.Optional(Type.Boolean({ default: false }))
|
|
4
|
+
});
|
|
5
|
+
export {
|
|
6
|
+
XScalarSetOperationSecuritySchema
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=x-scalar-set-operation-security.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/schemas/extensions/document/x-scalar-set-operation-security.ts"],
|
|
4
|
+
"sourcesContent": ["import { Type } from '@scalar/typebox'\n\nexport const XScalarSetOperationSecuritySchema = Type.Object({\n 'x-scalar-set-operation-security': Type.Optional(Type.Boolean({ default: false })),\n})\n\nexport type XScalarSetOperationSecurity = {\n /**\n * XScalarSetOperationSecurity Extension\n *\n * If enabled we set the selected security schemes at the operation level\n * If disabled/undefined we set the selected security schemes at the document level\n */\n 'x-scalar-set-operation-security'?: boolean\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,YAAY;AAEd,MAAM,oCAAoC,KAAK,OAAO;AAAA,EAC3D,mCAAmC,KAAK,SAAS,KAAK,QAAQ,EAAE,SAAS,MAAM,CAAC,CAAC;AACnF,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export declare const xScalarCookieSchema: import("@scalar/typebox").TObject<{
|
|
2
|
+
name: import("@scalar/typebox").TString;
|
|
3
|
+
value: import("@scalar/typebox").TString;
|
|
4
|
+
domain: import("@scalar/typebox").TOptional<import("@scalar/typebox").TString>;
|
|
5
|
+
isDisabled: import("@scalar/typebox").TOptional<import("@scalar/typebox").TBoolean>;
|
|
6
|
+
}>;
|
|
7
|
+
export type XScalarCookie = {
|
|
8
|
+
/**
|
|
9
|
+
* Defines the cookie name and its value. A cookie definition begins with a name-value pair.
|
|
10
|
+
*/
|
|
11
|
+
name: string;
|
|
12
|
+
/**
|
|
13
|
+
* Defines the cookie value.
|
|
14
|
+
*/
|
|
15
|
+
value: string;
|
|
16
|
+
/**
|
|
17
|
+
* Defines the host to which the cookie will be sent.
|
|
18
|
+
*/
|
|
19
|
+
domain?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Indicates if the cookie is disabled.
|
|
22
|
+
*/
|
|
23
|
+
isDisabled?: boolean;
|
|
24
|
+
};
|
|
25
|
+
export declare const xScalarCookiesSchema: import("@scalar/typebox").TObject<{
|
|
26
|
+
'x-scalar-cookies': import("@scalar/typebox").TOptional<import("@scalar/typebox").TArray<import("@scalar/typebox").TObject<{
|
|
27
|
+
name: import("@scalar/typebox").TString;
|
|
28
|
+
value: import("@scalar/typebox").TString;
|
|
29
|
+
domain: import("@scalar/typebox").TOptional<import("@scalar/typebox").TString>;
|
|
30
|
+
isDisabled: import("@scalar/typebox").TOptional<import("@scalar/typebox").TBoolean>;
|
|
31
|
+
}>>>;
|
|
32
|
+
}>;
|
|
33
|
+
export type XScalarCookies = {
|
|
34
|
+
'x-scalar-cookies'?: XScalarCookie[];
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=x-scalar-cookies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x-scalar-cookies.d.ts","sourceRoot":"","sources":["../../../../src/schemas/extensions/general/x-scalar-cookies.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB;;;;;EAK9B,CAAA;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAED,eAAO,MAAM,oBAAoB;;;;;;;EAE/B,CAAA;AACF,MAAM,MAAM,cAAc,GAAG;IAC3B,kBAAkB,CAAC,EAAE,aAAa,EAAE,CAAA;CACrC,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Type } from "@scalar/typebox";
|
|
2
|
+
const xScalarCookieSchema = Type.Object({
|
|
3
|
+
name: Type.String(),
|
|
4
|
+
value: Type.String(),
|
|
5
|
+
domain: Type.Optional(Type.String()),
|
|
6
|
+
isDisabled: Type.Optional(Type.Boolean())
|
|
7
|
+
});
|
|
8
|
+
const xScalarCookiesSchema = Type.Object({
|
|
9
|
+
"x-scalar-cookies": Type.Optional(Type.Array(xScalarCookieSchema))
|
|
10
|
+
});
|
|
11
|
+
export {
|
|
12
|
+
xScalarCookieSchema,
|
|
13
|
+
xScalarCookiesSchema
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=x-scalar-cookies.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/schemas/extensions/general/x-scalar-cookies.ts"],
|
|
4
|
+
"sourcesContent": ["import { Type } from '@scalar/typebox'\n\nexport const xScalarCookieSchema = Type.Object({\n name: Type.String(),\n value: Type.String(),\n domain: Type.Optional(Type.String()),\n isDisabled: Type.Optional(Type.Boolean()),\n})\n\nexport type XScalarCookie = {\n /**\n * Defines the cookie name and its value. A cookie definition begins with a name-value pair.\n */\n name: string\n /**\n * Defines the cookie value.\n */\n value: string\n /**\n * Defines the host to which the cookie will be sent.\n */\n domain?: string\n /**\n * Indicates if the cookie is disabled.\n */\n isDisabled?: boolean\n}\n\nexport const xScalarCookiesSchema = Type.Object({\n 'x-scalar-cookies': Type.Optional(Type.Array(xScalarCookieSchema)),\n})\nexport type XScalarCookies = {\n 'x-scalar-cookies'?: XScalarCookie[]\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,YAAY;AAEd,MAAM,sBAAsB,KAAK,OAAO;AAAA,EAC7C,MAAM,KAAK,OAAO;AAAA,EAClB,OAAO,KAAK,OAAO;AAAA,EACnB,QAAQ,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,EACnC,YAAY,KAAK,SAAS,KAAK,QAAQ,CAAC;AAC1C,CAAC;AAqBM,MAAM,uBAAuB,KAAK,OAAO;AAAA,EAC9C,oBAAoB,KAAK,SAAS,KAAK,MAAM,mBAAmB,CAAC;AACnE,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema for the "x-scalar-order" OpenAPI extension.
|
|
3
|
+
* This extension allows specifying an optional array of strings,
|
|
4
|
+
* which can be used to represent a custom order for elements (e.g., tags, operations) in the Scalar UI.
|
|
5
|
+
*/
|
|
6
|
+
export declare const XScalarOrderSchema: import("@scalar/typebox").TObject<{
|
|
7
|
+
'x-scalar-order': import("@scalar/typebox").TOptional<import("@scalar/typebox").TArray<import("@scalar/typebox").TString>>;
|
|
8
|
+
}>;
|
|
9
|
+
export type XScalarOrder = {
|
|
10
|
+
'x-scalar-order'?: string[];
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=x-scalar-order.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x-scalar-order.d.ts","sourceRoot":"","sources":["../../../../src/schemas/extensions/general/x-scalar-order.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;;EAE7B,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC5B,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/schemas/extensions/general/x-scalar-order.ts"],
|
|
4
|
+
"sourcesContent": ["import { Type } from '@scalar/typebox'\n\n/**\n * Schema for the \"x-scalar-order\" OpenAPI extension.\n * This extension allows specifying an optional array of strings,\n * which can be used to represent a custom order for elements (e.g., tags, operations) in the Scalar UI.\n */\nexport const XScalarOrderSchema = Type.Object({\n 'x-scalar-order': Type.Optional(Type.Array(Type.String())),\n})\n\nexport type XScalarOrder = {\n 'x-scalar-order'?: string[]\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,YAAY;AAOd,MAAM,qBAAqB,KAAK,OAAO;AAAA,EAC5C,kBAAkB,KAAK,SAAS,KAAK,MAAM,KAAK,OAAO,CAAC,CAAC;AAC3D,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,2 +1,5 @@
|
|
|
1
|
-
export type
|
|
1
|
+
export { type XBadge, XBadgeSchema, type XBadges, XBadgesSchema, } from './x-badge.js';
|
|
2
|
+
export { type XCodeSample, XCodeSamplesSchema, } from './x-code-samples.js';
|
|
3
|
+
export { type XScalarSelectedContentType, XScalarSelectedContentTypeSchema, } from './x-scalar-selected-content-type.js';
|
|
4
|
+
export { XScalarStabilitySchema, XScalarStabilityValues, } from './x-scalar-stability.js';
|
|
2
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/schemas/extensions/operation/index.ts"],"names":[],"mappings":"AAAA,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/schemas/extensions/operation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,MAAM,EACX,YAAY,EACZ,KAAK,OAAO,EACZ,aAAa,GACd,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,KAAK,WAAW,EAChB,kBAAkB,GACnB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,KAAK,0BAA0B,EAC/B,gCAAgC,GACjC,MAAM,kCAAkC,CAAA;AACzC,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,sBAAsB,CAAA"}
|
|
@@ -1 +1,23 @@
|
|
|
1
|
+
import {
|
|
2
|
+
XBadgeSchema,
|
|
3
|
+
XBadgesSchema
|
|
4
|
+
} from "./x-badge.js";
|
|
5
|
+
import {
|
|
6
|
+
XCodeSamplesSchema
|
|
7
|
+
} from "./x-code-samples.js";
|
|
8
|
+
import {
|
|
9
|
+
XScalarSelectedContentTypeSchema
|
|
10
|
+
} from "./x-scalar-selected-content-type.js";
|
|
11
|
+
import {
|
|
12
|
+
XScalarStabilitySchema,
|
|
13
|
+
XScalarStabilityValues
|
|
14
|
+
} from "./x-scalar-stability.js";
|
|
15
|
+
export {
|
|
16
|
+
XBadgeSchema,
|
|
17
|
+
XBadgesSchema,
|
|
18
|
+
XCodeSamplesSchema,
|
|
19
|
+
XScalarSelectedContentTypeSchema,
|
|
20
|
+
XScalarStabilitySchema,
|
|
21
|
+
XScalarStabilityValues
|
|
22
|
+
};
|
|
1
23
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": [],
|
|
4
|
-
"sourcesContent": [],
|
|
5
|
-
"mappings": "",
|
|
3
|
+
"sources": ["../../../../src/schemas/extensions/operation/index.ts"],
|
|
4
|
+
"sourcesContent": ["export {\n type XBadge,\n XBadgeSchema,\n type XBadges,\n XBadgesSchema,\n} from './x-badge'\nexport {\n type XCodeSample,\n XCodeSamplesSchema,\n} from './x-code-samples'\nexport {\n type XScalarSelectedContentType,\n XScalarSelectedContentTypeSchema,\n} from './x-scalar-selected-content-type'\nexport {\n XScalarStabilitySchema,\n XScalarStabilityValues,\n} from './x-scalar-stability'\n"],
|
|
5
|
+
"mappings": "AAAA;AAAA,EAEE;AAAA,EAEA;AAAA,OACK;AACP;AAAA,EAEE;AAAA,OACK;AACP;AAAA,EAEE;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
export declare const XCodeSampleSchema: import("@scalar/typebox").TObject<{
|
|
2
|
-
lang: import("@scalar/typebox").TOptional<import("@scalar/typebox").TString>;
|
|
3
|
-
label: import("@scalar/typebox").TOptional<import("@scalar/typebox").TString>;
|
|
4
|
-
source: import("@scalar/typebox").TString;
|
|
5
|
-
}>;
|
|
6
1
|
export declare const XCodeSamplesSchema: import("@scalar/typebox").TObject<{
|
|
7
2
|
'x-codeSamples': import("@scalar/typebox").TOptional<import("@scalar/typebox").TArray<import("@scalar/typebox").TObject<{
|
|
8
3
|
lang: import("@scalar/typebox").TOptional<import("@scalar/typebox").TString>;
|