diff --git a/.changeset/dev-console-browser-aliases.md b/.changeset/dev-console-browser-aliases.md new file mode 100644 index 00000000000..45fb61ac1f3 --- /dev/null +++ b/.changeset/dev-console-browser-aliases.md @@ -0,0 +1,10 @@ +--- +"@osdk/aliases": minor +"@osdk/functions": minor +--- + +Add `@osdk/aliases`, extracting the alias runtime so consumers that are not Functions can read aliases without depending on `@osdk/functions`. The `Aliases` namespace exported by `@osdk/functions` is unchanged. + +`@osdk/aliases/experimental` is a new browser-safe entry point for applications served to a browser, such as Developer Console apps: call `const aliases = await Aliases.load()`, then read values synchronously with `aliases.custom("myAlias")`. Repeated and concurrent loads share the cached request and reader. It reads the installer's resolved values on a Marketplace-installed site and falls back to the author's declared defaults in `public/resources.json` otherwise. It sits behind the `experimental` subpath because both custom aliases and the shape of this API are provisional. + +`@osdk/aliases/node` is the existing filesystem-backed runtime for code running in Node. diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ca41bbc1e22..fbaaf70b49e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,6 +9,9 @@ on: - main - release/* - next + # TEMPORARY: publish snapshots from this branch for stack testing. Revert + # this line (and the `always()` on the snapshot job below) before merging. + - jzhang/dev-console-aliases concurrency: ${{ github.workflow }}-${{ github.ref }} @@ -50,8 +53,14 @@ jobs: snapshot: name: Snapshot needs: release - if: ${{ !failure() && !cancelled() }} + # `always()` is required: on a non-release branch the `release` job is + # skipped by its own `if`, and a skipped dependency skips this job too + # unless the condition forces evaluation. TEMPORARY, revert with the branch + # trigger above. + if: ${{ always() && !failure() && !cancelled() }} runs-on: ubuntu-latest + # TEMPORARY: fail fast instead of hanging for an hour. Revert with the rest. + timeout-minutes: 25 permissions: contents: read id-token: write @@ -76,7 +85,9 @@ jobs: run: pnpm exec turbo run build - name: Update versions for snapshots - run: pnpm exec changeset version --snapshot ${GITHUB_REF_NAME//\//__} + # TEMPORARY: fixed tag, matching the previously-working branch-snapshot + # hack. The ref-derived name contains a slash on this branch. Revert. + run: pnpm exec changeset version --snapshot pr-jzhang - name: Make sure code is up to date run: pnpm exec turbo run postVersioning @@ -85,4 +96,5 @@ jobs: run: pnpm exec turbo run build - name: Publish results - run: pnpm exec changeset publish --no-git-tag --tag next-${GITHUB_REF_NAME//\//__} + # TEMPORARY: fixed tag, see above. Revert. + run: pnpm exec changeset publish --no-git-tag --tag pr-jzhang diff --git a/.lintstagedrc.mjs b/.lintstagedrc.mjs index 97757befb66..e2638b3c262 100644 --- a/.lintstagedrc.mjs +++ b/.lintstagedrc.mjs @@ -52,6 +52,7 @@ const OXC_PACKAGE_GLOB = `packages/{${ * at that nested config instead of the root one. Map of package dir -> config. */ const OXC_NESTED_CONFIG_PACKAGES = { + "aliases": "packages/aliases/oxlint.config.ts", "react-components-storybook": "packages/react-components-storybook/oxlint.config.ts", "react-components": "packages/react-components/oxlint.config.ts", diff --git a/.monorepolint.config.mjs b/.monorepolint.config.mjs index 5c95c64547e..5d377bb7f61 100644 --- a/.monorepolint.config.mjs +++ b/.monorepolint.config.mjs @@ -271,6 +271,7 @@ const archetypeRules = archetypes(standardPackageRules, { .addArchetype( "oxc migrated libraries with carve-outs", [ + "@osdk/aliases", "@osdk/maker", "@osdk/maker-experimental", "@osdk/maker-import", diff --git a/etc/functions.report.api.md b/etc/functions.report.api.md index c66ee607962..102ed50a151 100644 --- a/etc/functions.report.api.md +++ b/etc/functions.report.api.md @@ -8,6 +8,10 @@ import type { ActionDefinition } from '@osdk/client'; import { Attachment } from '@osdk/client'; import type { Client } from '@osdk/client'; import type { CompileTimeMetadata } from '@osdk/client'; +import { Custom } from '@osdk/aliases/node'; +import { custom } from '@osdk/aliases/node'; +import { Dataset } from '@osdk/aliases/node'; +import { dataset } from '@osdk/aliases/node'; import { Geometry } from 'geojson'; import { GeometryCollection } from 'geojson'; import type { GroupId as GroupId_2 } from '@osdk/foundry.core'; @@ -15,7 +19,11 @@ import type { InterfaceDefinition } from '@osdk/client'; import { LineString } from 'geojson'; import type { Media } from '@osdk/client'; import { MediaReference } from '@osdk/client'; +import { Mediaset } from '@osdk/aliases/node'; +import { mediaset } from '@osdk/aliases/node'; import { MediaUpload } from '@osdk/client'; +import { Model } from '@osdk/aliases/node'; +import { model } from '@osdk/aliases/node'; import { MultiLineString } from 'geojson'; import { MultiPoint } from 'geojson'; import { MultiPolygon } from 'geojson'; @@ -28,6 +36,10 @@ import { Polygon } from 'geojson'; import type { PropertyKeys } from '@osdk/client'; import type { QueryDefinition } from '@osdk/client'; import { Range as Range_2 } from '@osdk/client'; +import { Source } from '@osdk/aliases/node'; +import { source } from '@osdk/aliases/node'; +import { Stream } from '@osdk/aliases/node'; +import { stream } from '@osdk/aliases/node'; import { ThreeDimensionalAggregation } from '@osdk/client'; import { TwoDimensionalAggregation } from '@osdk/client'; import type { UserId as UserId_2 } from '@osdk/foundry.core'; @@ -72,23 +84,6 @@ export type ClassificationMarking = T & { // @public (undocumented) export function createEditBatch(_client: Client): EditBatch; -// @public (undocumented) -type Custom = string & { - readonly __brand: "Custom" -}; - -// @public (undocumented) -function custom(alias: string): Custom; - -// @public (undocumented) -interface Dataset { - // (undocumented) - rid: string; -} - -// @public (undocumented) -function dataset(alias: string): Dataset; - // @public (undocumented) export type DateISOString = T & { __dateBrand?: void @@ -216,26 +211,8 @@ export type MandatoryMarking = T & { export { MediaReference } -// @public (undocumented) -interface Mediaset { - // (undocumented) - rid: string; -} - -// @public (undocumented) -function mediaset(alias: string): Mediaset; - export { MediaUpload } -// @public (undocumented) -interface Model { - // (undocumented) - rid: string; -} - -// @public (undocumented) -function model(alias: string): Model; - export { MultiLineString } export { MultiPoint } @@ -308,24 +285,6 @@ export type Short = T & { _shortBrand?: void }; -// @public (undocumented) -interface Source { - // (undocumented) - rid: string; -} - -// @public (undocumented) -function source(alias: string): Source; - -// @public (undocumented) -interface Stream { - // (undocumented) - rid: string; -} - -// @public (undocumented) -function stream(alias: string): Stream; - export { ThreeDimensionalAggregation } // @public (undocumented) diff --git a/packages/aliases/experimental.d.ts b/packages/aliases/experimental.d.ts new file mode 100644 index 00000000000..fe26fffdfaf --- /dev/null +++ b/packages/aliases/experimental.d.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2026 Palantir Technologies, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from "./build/cjs/public/experimental.cjs"; diff --git a/packages/aliases/index.d.ts b/packages/aliases/index.d.ts new file mode 100644 index 00000000000..b8f72b88336 --- /dev/null +++ b/packages/aliases/index.d.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2026 Palantir Technologies, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from "./build/cjs/index.cjs"; diff --git a/packages/aliases/node.d.ts b/packages/aliases/node.d.ts new file mode 100644 index 00000000000..17997f3ec20 --- /dev/null +++ b/packages/aliases/node.d.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2026 Palantir Technologies, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from "./build/cjs/public/node.cjs"; diff --git a/packages/aliases/oxlint.config.ts b/packages/aliases/oxlint.config.ts new file mode 100644 index 00000000000..fe07d1f53e9 --- /dev/null +++ b/packages/aliases/oxlint.config.ts @@ -0,0 +1,49 @@ +/* + * Copyright 2026 Palantir Technologies, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { defineConfig } from "oxlint"; + +import root from "../../oxlint.config.ts"; + +// Nested oxlint config for @osdk/aliases. This package's source was moved here +// verbatim from @osdk/functions, which carries the same carve-outs, so the same +// rules are disabled to keep the extraction a move rather than a rewrite. Every +// rule below is surfaced only by the moved test setup, not by the runtime source. +// This list is a strict subset of the one in packages/functions/oxlint.config.ts. +// +// `extends` only carries `rules`/`plugins`/`overrides`, so the root's +// `ignorePatterns` are re-applied explicitly. +export default defineConfig({ + extends: [root], + ignorePatterns: root.ignorePatterns, + + rules: { + // --- typescript --- + // `delete process.env[computed]` in test setup; the pattern is intentional. + "typescript/no-dynamic-delete": "off", + + // --- unicorn --- + // `__dirname` in test setup, reading fixture files relative to the test. + "unicorn/prefer-module": "off", + // `require("fs")` / `"fs"` -> `"node:fs"`; the autofix rewrites specifiers, + // and the test deliberately uses `node:fs` separately from the mocked `fs`. + "unicorn/prefer-node-protocol": "off", + + // --- node --- + // `require(...)` inside `vi.hoisted(...)`, which must not be a static import. + "node/global-require": "off", + }, +}); diff --git a/packages/aliases/package.json b/packages/aliases/package.json new file mode 100644 index 00000000000..b647d37c7a5 --- /dev/null +++ b/packages/aliases/package.json @@ -0,0 +1,82 @@ +{ + "name": "@osdk/aliases", + "version": "0.1.0", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/palantir/osdk-ts.git" + }, + "exports": { + ".": { + "browser": "./build/browser/index.js", + "import": { + "types": "./build/types/index.d.ts", + "default": "./build/esm/index.js" + }, + "require": "./build/cjs/index.cjs", + "default": "./build/browser/index.js" + }, + "./experimental": { + "browser": "./build/browser/public/experimental.js", + "import": { + "types": "./build/types/public/experimental.d.ts", + "default": "./build/esm/public/experimental.js" + }, + "require": "./build/cjs/public/experimental.cjs", + "default": "./build/browser/public/experimental.js" + }, + "./node": { + "browser": "./build/browser/public/node.js", + "import": { + "types": "./build/types/public/node.d.ts", + "default": "./build/esm/public/node.js" + }, + "require": "./build/cjs/public/node.cjs", + "default": "./build/browser/public/node.js" + }, + "./*": { + "browser": "./build/browser/public/*.js", + "import": { + "types": "./build/types/public/*.d.ts", + "default": "./build/esm/public/*.js" + }, + "require": "./build/cjs/public/*.cjs", + "default": "./build/browser/public/*.js" + } + }, + "scripts": { + "check-attw": "attw --pack .", + "check-spelling": "cspell --quiet .", + "clean": "rm -rf lib dist types build tsconfig.tsbuildinfo", + "fix-lint": "oxlint -c ./oxlint.config.ts --fix . && oxfmt -c ../../oxfmt.config.ts .", + "lint": "oxlint -c ./oxlint.config.ts . && oxfmt -c ../../oxfmt.config.ts --check .", + "test": "vitest run --pool=forks", + "transpileBrowser": "monorepo.tool.transpile -f esm -m normal -t browser", + "transpileCjs": "monorepo.tool.transpile -f cjs -m bundle -t node", + "transpileEsm": "monorepo.tool.transpile -f esm -m normal -t node", + "transpileTypes": "monorepo.tool.transpile -f esm -m types -t node", + "typecheck": "tsc --noEmit --emitDeclarationOnly false" + }, + "devDependencies": { + "@osdk/monorepo.api-extractor": "workspace:~", + "@osdk/monorepo.tsconfig": "workspace:~", + "typescript": "~5.5.4" + }, + "publishConfig": { + "access": "public" + }, + "files": [ + "build/cjs", + "build/esm", + "build/browser", + "build/types", + "CHANGELOG.md", + "package.json", + "templates", + "*.d.ts" + ], + "main": "./build/cjs/index.cjs", + "module": "./build/esm/index.js", + "types": "./build/cjs/index.d.cts", + "type": "module" +} diff --git a/packages/functions/src/aliases/aliases.test.ts b/packages/aliases/src/aliases.test.ts similarity index 100% rename from packages/functions/src/aliases/aliases.test.ts rename to packages/aliases/src/aliases.test.ts diff --git a/packages/aliases/src/browser.test.ts b/packages/aliases/src/browser.test.ts new file mode 100644 index 00000000000..8038bb4db7f --- /dev/null +++ b/packages/aliases/src/browser.test.ts @@ -0,0 +1,500 @@ +/* + * Copyright 2026 Palantir Technologies, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +import { + custom, + DEFAULT_DECLARATIONS_PATH, + DEFAULT_DEPLOYMENT_CONFIG_PATH, + initAliases, + resetAliasesCache, +} from "./browser.js"; + +interface FakeResponseInit { + ok?: boolean; + status?: number; + statusText?: string; + /** Served as the response body, JSON-encoded. */ + body?: unknown; + /** Raw response body. Takes precedence over `body`. */ + text?: string; + contentType?: string; +} + +function fakeResponse(init: FakeResponseInit): Response { + const contentType = init.contentType ?? "application/json"; + return { + ok: init.ok ?? true, + status: init.status ?? 200, + statusText: init.statusText ?? "OK", + headers: { + get: (h: string) => + h.toLowerCase() === "content-type" ? contentType : null, + }, + text: () => + Promise.resolve( + init.text ?? (init.body === undefined ? "" : JSON.stringify(init.body)), + ), + } as unknown as Response; +} + +const INDEX_HTML = "\n"; + +/** A single-page-app host answering 200 with index.html for an unknown path. */ +const SPA_FALLBACK: FakeResponseInit = { + contentType: "text/html", + text: INDEX_HTML, +}; + +function mockFetch(init: FakeResponseInit): typeof globalThis.fetch { + return vi.fn(() => + Promise.resolve(fakeResponse(init)), + ) as unknown as typeof fetch; +} + +/** + * Serves a different response per path, so the 404 fallback can be exercised. + * Any path not listed responds 404. + */ +function mockFetchByPath( + responses: Record, +): typeof globalThis.fetch { + return vi.fn((input: unknown) => { + const url = String(input); + const match = Object.entries(responses).find(([path]) => + url.endsWith(path), + ); + return Promise.resolve( + fakeResponse( + match?.[1] ?? { ok: false, status: 404, statusText: "Not Found" }, + ), + ); + }) as unknown as typeof fetch; +} + +const CONFIG_WITH_ALIASES = { + clientId: "client-123", + foundryUrl: "https://foundry.example.com", + aliases: JSON.stringify({ + apiBaseUrl: "https://api.prod.internal", + featureXEnabled: "false", + }), +}; + +// The author-maintained declaration file, as served from public/ in dev. +const DECLARATIONS_FILE = { + aliases: { + custom: { + apiBaseUrl: { + value: "https://api.dev.example.com", + description: "Base URL for the partner API", + required: true, + }, + featureXEnabled: { value: "false" }, + }, + }, +}; + +describe("browser aliases", () => { + afterEach(() => { + resetAliasesCache(); + }); + + describe("custom", () => { + it("returns a resolved alias after init", async () => { + const fetchImpl = mockFetch({ body: CONFIG_WITH_ALIASES }); + await initAliases({ fetch: fetchImpl }); + + expect(custom("apiBaseUrl")).toBe("https://api.prod.internal"); + expect(custom("featureXEnabled")).toBe("false"); + }); + + it("throws before init", () => { + expect(() => custom("apiBaseUrl")).toThrow( + "Aliases have not been initialized", + ); + }); + + it("throws on unknown alias with available list", async () => { + await initAliases({ fetch: mockFetch({ body: CONFIG_WITH_ALIASES }) }); + + expect(() => custom("nonexistent")).toThrow( + "Custom alias 'nonexistent' not found. Available aliases: " + + "[apiBaseUrl, featureXEnabled]", + ); + }); + + it("treats a config with no aliases key as empty", async () => { + await initAliases({ + fetch: mockFetch({ body: { clientId: "client-123" } }), + }); + + expect(() => custom("anything")).toThrow( + "Custom alias 'anything' not found. Available aliases: []", + ); + }); + + const INHERITED_NAMES = [ + "toString", + "constructor", + "__proto__", + "hasOwnProperty", + "valueOf", + ]; + + it.each(INHERITED_NAMES)( + "does not resolve inherited property %s", + async (inherited) => { + await initAliases({ fetch: mockFetch({ body: CONFIG_WITH_ALIASES }) }); + + expect(() => custom(inherited)).toThrow( + `Custom alias '${inherited}' not found`, + ); + }, + ); + + it.each(INHERITED_NAMES)( + "resolves a real alias named %s from the deployment config", + async (name) => { + await initAliases({ + fetch: mockFetch({ + body: { aliases: JSON.stringify({ [name]: "real-value" }) }, + }), + }); + + expect(custom(name)).toBe("real-value"); + }, + ); + + it.each(INHERITED_NAMES)( + "resolves a real alias named %s from the declaration file", + async (name) => { + await initAliases({ + path: DEFAULT_DECLARATIONS_PATH, + fetch: mockFetch({ + body: { aliases: { custom: { [name]: { value: "real-value" } } } }, + }), + }); + + expect(custom(name)).toBe("real-value"); + }, + ); + }); + + describe("initAliases", () => { + it("fetches only once across repeated calls", async () => { + const fetchImpl = mockFetch({ body: CONFIG_WITH_ALIASES }); + await initAliases({ fetch: fetchImpl }); + await initAliases({ fetch: fetchImpl }); + custom("apiBaseUrl"); + + expect(fetchImpl).toHaveBeenCalledTimes(1); + }); + + it("deduplicates concurrent calls into a single fetch", async () => { + const fetchImpl = mockFetch({ body: CONFIG_WITH_ALIASES }); + await Promise.all([ + initAliases({ fetch: fetchImpl }), + initAliases({ fetch: fetchImpl }), + initAliases({ fetch: fetchImpl }), + ]); + + expect(fetchImpl).toHaveBeenCalledTimes(1); + }); + + it("re-fetches after resetAliasesCache", async () => { + const fetchImpl = mockFetch({ body: CONFIG_WITH_ALIASES }); + await initAliases({ fetch: fetchImpl }); + resetAliasesCache(); + await initAliases({ fetch: fetchImpl }); + + expect(fetchImpl).toHaveBeenCalledTimes(2); + }); + + it("throws and allows retry on a non-ok response", async () => { + // A 500 rather than a 404: a 404 means "absent" and triggers the fallback, + // while a server error is a genuine failure that should surface. + const failing = mockFetch({ + ok: false, + status: 500, + statusText: "Internal Server Error", + }); + await expect(initAliases({ fetch: failing })).rejects.toThrow( + "Failed to load aliases", + ); + + // A subsequent successful init should work (in-flight was cleared). + await initAliases({ fetch: mockFetch({ body: CONFIG_WITH_ALIASES }) }); + expect(custom("apiBaseUrl")).toBe("https://api.prod.internal"); + }); + + it("throws when the aliases blob is not valid JSON", async () => { + await expect( + initAliases({ fetch: mockFetch({ body: { aliases: "{not json" } }) }), + ).rejects.toThrow("Failed to parse resolved aliases"); + }); + + it("defaults to the deployment config path", async () => { + const fetchImpl = mockFetch({ body: CONFIG_WITH_ALIASES }); + await initAliases({ fetch: fetchImpl }); + + expect(fetchImpl).toHaveBeenCalledTimes(1); + expect(String(vi.mocked(fetchImpl).mock.calls[0][0])).toContain( + DEFAULT_DEPLOYMENT_CONFIG_PATH, + ); + }); + + it("fetches the path it is given", async () => { + const fetchImpl = mockFetch({ body: DECLARATIONS_FILE }); + await initAliases({ fetch: fetchImpl, path: DEFAULT_DECLARATIONS_PATH }); + + expect(String(vi.mocked(fetchImpl).mock.calls[0][0])).toContain( + DEFAULT_DECLARATIONS_PATH, + ); + }); + + it("throws rather than falling back when given an explicit path", async () => { + // An explicit path is a deliberate choice, so a missing file is an error. + await expect( + initAliases({ fetch: mockFetchByPath({}), path: "custom/place.json" }), + ).rejects.toThrow("404"); + }); + }); + + // No environment detection: the deployment config only exists on an installed + // site, so a 404 (and only a 404) means "use the author's declared defaults". + describe("fallback when the deployment config is absent", () => { + let warn: ReturnType; + + beforeEach(() => { + warn = vi.spyOn(console, "warn").mockImplementation(() => {}); + }); + + afterEach(() => { + warn.mockRestore(); + }); + + it("uses declared defaults when the deployment config 404s", async () => { + await initAliases({ + fetch: mockFetchByPath({ + [DEFAULT_DECLARATIONS_PATH]: { body: DECLARATIONS_FILE }, + }), + }); + + expect(custom("apiBaseUrl")).toBe("https://api.dev.example.com"); + expect(warn).toHaveBeenCalledOnce(); + }); + + it("prefers the deployment config when both files exist", async () => { + // Both are served in production, so the installer's values must win. + await initAliases({ + fetch: mockFetchByPath({ + [DEFAULT_DEPLOYMENT_CONFIG_PATH]: { body: CONFIG_WITH_ALIASES }, + [DEFAULT_DECLARATIONS_PATH]: { body: DECLARATIONS_FILE }, + }), + }); + + expect(custom("apiBaseUrl")).toBe("https://api.prod.internal"); + expect(warn).not.toHaveBeenCalled(); + }); + + it("throws on a server error instead of degrading to defaults", async () => { + // The dangerous case: a transient failure must not silently swap the + // installer's values for the developer's defaults. + await expect( + initAliases({ + fetch: mockFetchByPath({ + [DEFAULT_DEPLOYMENT_CONFIG_PATH]: { + ok: false, + status: 500, + statusText: "Internal Server Error", + }, + [DEFAULT_DECLARATIONS_PATH]: { body: DECLARATIONS_FILE }, + }), + }), + ).rejects.toThrow("Failed to load aliases"); + }); + + it("treats both files missing as no aliases rather than an error", async () => { + await initAliases({ fetch: mockFetchByPath({}) }); + + expect(() => custom("anything")).toThrow("Available aliases: []"); + }); + + // A dev server or static host rewrites unknown paths to index.html and + // answers 200, so absence does not always look like a 404. + it("falls back when the host serves index.html instead of 404ing", async () => { + await initAliases({ + fetch: mockFetchByPath({ + [DEFAULT_DEPLOYMENT_CONFIG_PATH]: SPA_FALLBACK, + [DEFAULT_DECLARATIONS_PATH]: { body: DECLARATIONS_FILE }, + }), + }); + + expect(custom("apiBaseUrl")).toBe("https://api.dev.example.com"); + expect(warn).toHaveBeenCalledOnce(); + }); + + // Foundry website hosting types responses from the file extension and does + // not recognize .json, so the rewritten index.html can arrive without an + // html content type. Absence must still be detected from the body alone. + it("falls back on markup served without an html content type", async () => { + await initAliases({ + fetch: mockFetchByPath({ + [DEFAULT_DEPLOYMENT_CONFIG_PATH]: { + contentType: "application/octet-stream", + text: INDEX_HTML, + }, + [DEFAULT_DECLARATIONS_PATH]: { body: DECLARATIONS_FILE }, + }), + }); + + expect(custom("apiBaseUrl")).toBe("https://api.dev.example.com"); + }); + + it("does not mistake malformed JSON for an absent file", async () => { + // Neither markup nor valid JSON: a real error, not a missing file, so it + // must surface rather than silently falling back to defaults. + await expect( + initAliases({ + fetch: mockFetchByPath({ + [DEFAULT_DEPLOYMENT_CONFIG_PATH]: { text: "{ not json" }, + [DEFAULT_DECLARATIONS_PATH]: { body: DECLARATIONS_FILE }, + }), + }), + ).rejects.toThrow("not valid JSON"); + }); + }); + + // Dev mode: the declaration file nests values under aliases.custom, so the + // loader has to flatten it. Prod and dev are told apart by the runtime type of + // `aliases` (string vs object), never by falling back between paths. + describe("value validation", () => { + it("rejects a non-string resolved value", async () => { + await expect( + initAliases({ + fetch: mockFetch({ body: { aliases: '{"apiBaseUrl":5}' } }), + }), + ).rejects.toThrow("Alias 'apiBaseUrl' must be a string, got number"); + }); + + it("rejects a nested object resolved value", async () => { + await expect( + initAliases({ + fetch: mockFetch({ body: { aliases: '{"apiBaseUrl":{"a":1}}' } }), + }), + ).rejects.toThrow("must be a string, got object"); + }); + + it("rejects a non-string declared default", async () => { + await expect( + initAliases({ + path: DEFAULT_DECLARATIONS_PATH, + fetch: mockFetch({ + body: { aliases: { custom: { apiBaseUrl: { value: 5 } } } }, + }), + }), + ).rejects.toThrow("must be a string, got number"); + }); + }); + + describe("absence detection", () => { + it("does not treat a non-html markup body as absent", async () => { + await expect( + initAliases({ + fetch: mockFetchByPath({ + [DEFAULT_DEPLOYMENT_CONFIG_PATH]: { + text: "AccessDenied", + }, + [DEFAULT_DECLARATIONS_PATH]: { body: DECLARATIONS_FILE }, + }), + }), + ).rejects.toThrow("not valid JSON"); + }); + + it("treats an html document as absent", async () => { + await initAliases({ + fetch: mockFetchByPath({ + [DEFAULT_DEPLOYMENT_CONFIG_PATH]: { text: INDEX_HTML }, + [DEFAULT_DECLARATIONS_PATH]: { body: DECLARATIONS_FILE }, + }), + }); + + expect(custom("apiBaseUrl")).toBe("https://api.dev.example.com"); + }); + }); + + describe("declaration file (dev) shape", () => { + it("flattens declared defaults", async () => { + await initAliases({ + fetch: mockFetch({ body: DECLARATIONS_FILE }), + path: DEFAULT_DECLARATIONS_PATH, + }); + + expect(custom("apiBaseUrl")).toBe("https://api.dev.example.com"); + expect(custom("featureXEnabled")).toBe("false"); + }); + + it("ignores description and required metadata", async () => { + await initAliases({ + fetch: mockFetch({ body: DECLARATIONS_FILE }), + path: DEFAULT_DECLARATIONS_PATH, + }); + + // Metadata is for packaging, not the browser: only values come through. + expect(custom("apiBaseUrl")).not.toContain("Base URL"); + }); + + it("treats an alias with no value as empty rather than throwing", async () => { + await initAliases({ + fetch: mockFetch({ + body: { aliases: { custom: { needsValue: {} } } }, + }), + path: DEFAULT_DECLARATIONS_PATH, + }); + + expect(custom("needsValue")).toBe(""); + }); + + it("treats an empty custom block as no aliases", async () => { + await initAliases({ + fetch: mockFetch({ body: { aliases: { custom: {} } } }), + path: DEFAULT_DECLARATIONS_PATH, + }); + + expect(() => custom("anything")).toThrow("Available aliases: []"); + }); + + it("treats a file with no custom block as no aliases", async () => { + await initAliases({ + fetch: mockFetch({ body: { aliases: {} } }), + path: DEFAULT_DECLARATIONS_PATH, + }); + + expect(() => custom("anything")).toThrow("Available aliases: []"); + }); + + it("throws when aliases.custom is not an object", async () => { + await expect( + initAliases({ + fetch: mockFetch({ body: { aliases: { custom: ["nope"] } } }), + path: DEFAULT_DECLARATIONS_PATH, + }), + ).rejects.toThrow("'aliases.custom' must be an object"); + }); + }); +}); diff --git a/packages/aliases/src/browser.ts b/packages/aliases/src/browser.ts new file mode 100644 index 00000000000..36378dc875d --- /dev/null +++ b/packages/aliases/src/browser.ts @@ -0,0 +1,313 @@ +/* + * Copyright 2026 Palantir Technologies, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Browser-safe alias runtime. Must stay free of `fs`/`process` so it can be +// bundled into a browser app. +// +// Two files can supply aliases: +// +// .palantir/deployment.config.json the installer's values, written at install +// public/resources.json the author's declared defaults +// +// The deployment config is tried first; the declaration file is used only when it +// appears absent. Any other failure throws rather than falling back, because on +// an installed site both files are served, so treating an error as absence would +// serve the author's defaults in place of the installer's values. + +import type { + AliasDeclarationsFile, + Custom, + DeploymentConfig, +} from "./types.js"; + +export type { Custom } from "./types.js"; + +/** Written at install time, so it carries the installer's resolved values. */ +export const DEFAULT_DEPLOYMENT_CONFIG_PATH = + ".palantir/deployment.config.json"; + +/** The author's declaration file, so it carries the declared defaults. */ +export const DEFAULT_DECLARATIONS_PATH = "resources.json"; + +export interface LoadAliasesOptions { + /** + * Escape hatch to force one specific file, relative to `document.baseURI`. + * Setting it disables the fallback, so a missing file throws. Normal + * applications should omit it. + */ + path?: string; + /** + * Custom fetch implementation. Defaults to the global `fetch`. Useful for + * testing or non-standard hosting. + */ + fetch?: typeof globalThis.fetch; +} + +/** Aliases loaded for this application. */ +export interface LoadedAliases { + /** Returns a resolved custom alias. */ + custom(alias: string): Custom; +} + +let cachedCustomAliases: Record | undefined; +let inFlight: Promise | undefined; + +const loadedAliases: LoadedAliases = Object.freeze({ custom }); + +/** + * Loads and caches the aliases for this installation, then returns a + * synchronous reader. Repeated and concurrent calls share the same load. + * + * @experimental Exposed only via "@osdk/aliases/experimental". Both custom + * aliases and the shape of this API are provisional and may change. + */ +export async function load( + options?: LoadAliasesOptions, +): Promise { + await initAliases(options); + return loadedAliases; +} + +/** + * Populates the alias cache. Concurrent calls share a request, and failed + * requests may be retried. + */ +export async function initAliases(options?: LoadAliasesOptions): Promise { + if (cachedCustomAliases !== undefined) { + return; + } + if (inFlight === undefined) { + inFlight = loadAliases(options).catch((error: unknown) => { + // Clear the in-flight promise so a failed load can be retried. + inFlight = undefined; + throw error; + }); + } + await inFlight; +} + +async function loadAliases(options?: LoadAliasesOptions): Promise { + const fetchImpl = options?.fetch ?? globalThis.fetch; + if (typeof fetchImpl !== "function") { + throw new TypeError( + "No fetch implementation available to load aliases. Pass one via " + + "Aliases.load({ fetch }).", + ); + } + + // An explicit path is honored as given, so a missing file is an error. + if (options?.path != null) { + const explicit = await fetchAliases(fetchImpl, options.path); + if (explicit === undefined) { + throw new Error( + `Failed to load aliases from ${resolveUrl(options.path)}: 404`, + ); + } + cachedCustomAliases = explicit; + return; + } + + const resolved = await fetchAliases( + fetchImpl, + DEFAULT_DEPLOYMENT_CONFIG_PATH, + ); + if (resolved !== undefined) { + cachedCustomAliases = resolved; + return; + } + + // Warn so that a fallback on a real installed site, where the deployment + // config should exist, is visible rather than silent. + console.warn( + `No alias config at ${resolveUrl(DEFAULT_DEPLOYMENT_CONFIG_PATH)}, ` + + `falling back to declared defaults in ${resolveUrl( + DEFAULT_DECLARATIONS_PATH, + )}. ` + + "This is expected during local development.", + ); + cachedCustomAliases = + (await fetchAliases(fetchImpl, DEFAULT_DECLARATIONS_PATH)) ?? {}; +} + +/** Returns `undefined` when the file appears absent. Any other failure throws. */ +async function fetchAliases( + fetchImpl: typeof globalThis.fetch, + path: string, +): Promise | undefined> { + const url = resolveUrl(path); + const response = await fetchImpl(url); + if (response.status === 404) { + return undefined; + } + if (!response.ok) { + throw new Error( + `Failed to load aliases from ${url}: ${response.status} ${response.statusText}`, + ); + } + + const body = await response.text(); + + // Single-page-app hosts rewrite unknown paths to index.html and answer 200, + // so an HTML document is how "not found" usually presents. + if (isHtmlDocument(body)) { + return undefined; + } + + return extractAliases(parseJson(body, url), url); +} + +/** + * A document preamble only, not any body starting with `<`. This result means + * "absent", which triggers the fallback, and a proxy or auth page can also be a + * 200 with markup; requiring a preamble keeps XML and partial-HTML error bodies + * from qualifying. Sniffed rather than read from the content type because + * Foundry website hosting derives that from the file extension and does not + * recognize `.json`. + */ +function isHtmlDocument(body: string): boolean { + const start = body.trimStart().slice(0, 32).toLowerCase(); + return start.startsWith(" { + const aliases = config.aliases; + + if (aliases == null || aliases === "") { + return {}; + } + + // Production packs resolved values into a stringified JSON object. + if (typeof aliases === "string") { + return parseResolvedAliases(aliases); + } + + // Development nests { custom: { key: { value } } }. + const declarations = aliases.custom; + if (declarations == null) { + return {}; + } + if (typeof declarations !== "object" || Array.isArray(declarations)) { + throw new TypeError( + `Failed to read aliases from ${url}: 'aliases.custom' must be an object.`, + ); + } + return toStringRecord( + Object.fromEntries( + Object.entries(declarations).map(([key, declaration]) => [ + key, + declaration?.value ?? "", + ]), + ), + ); +} + +function resolveUrl(path: string): string { + if (typeof document !== "undefined" && document.baseURI) { + return new URL(path, document.baseURI).toString(); + } + return path; +} + +function parseResolvedAliases(raw: string): Record { + let parsed: unknown; + try { + parsed = JSON.parse(raw); + } catch (error) { + throw new Error( + `Failed to parse resolved aliases: ${(error as Error).message}`, + { cause: error }, + ); + } + if (typeof parsed !== "object" || parsed == null || Array.isArray(parsed)) { + throw new Error("Resolved aliases must be a JSON object of string values."); + } + return toStringRecord(parsed as Record); +} + +/** + * Narrows to string values. The file is served rather than written by + * application code, so without this a number would reach `custom()` and violate + * its declared return type. + */ +function toStringRecord( + parsed: Record, +): Record { + // Null prototype, so assigning a key named `__proto__` creates an own + // property. On a normal object that assignment hits the inherited `__proto__` + // setter, which ignores a string value, silently dropping the alias. + const result = Object.create(null) as Record; + for (const [key, value] of Object.entries(parsed)) { + if (typeof value !== "string") { + throw new TypeError( + `Alias '${key}' must be a string, got ${ + Array.isArray(value) ? "array" : typeof value + }.`, + ); + } + result[key] = value; + } + return result; +} + +/** + * Returns the resolved value for a custom alias. Aliases must have been loaded + * via {@link initAliases} first; otherwise this throws. + * + * @experimental Exposed only via "@osdk/aliases/experimental". Both custom + * aliases and the shape of this API are provisional and may change. + */ +export function custom(alias: string): Custom { + if (cachedCustomAliases === undefined) { + throw new Error( + "Aliases have not been initialized. Call `await initAliases()` before " + + "reading aliases.", + ); + } + // `hasOwn`, not `in`: `in` matches inherited properties, so `toString` would + // resolve to a function and `__proto__` to the prototype. + if (!Object.hasOwn(cachedCustomAliases, alias)) { + const available = Object.keys(cachedCustomAliases); + throw new Error( + `Custom alias '${alias}' not found. Available aliases: [${available.join( + ", ", + )}]`, + ); + } + return cachedCustomAliases[alias] as Custom; +} + +/** For tests. Deliberately not part of the public entry point. */ +export function resetAliasesCache(): void { + cachedCustomAliases = undefined; + inFlight = undefined; +} diff --git a/packages/functions/src/aliases/custom.ts b/packages/aliases/src/custom.ts similarity index 99% rename from packages/functions/src/aliases/custom.ts rename to packages/aliases/src/custom.ts index c54ad26de6c..ee3f174e863 100644 --- a/packages/functions/src/aliases/custom.ts +++ b/packages/aliases/src/custom.ts @@ -16,6 +16,7 @@ import { loadResolvedAliases } from "./loaders.js"; import type { Custom } from "./types.js"; + export type { Custom } from "./types.js"; export function custom(alias: string): Custom { diff --git a/packages/functions/src/aliases/dataset.ts b/packages/aliases/src/dataset.ts similarity index 99% rename from packages/functions/src/aliases/dataset.ts rename to packages/aliases/src/dataset.ts index 0355c4c0467..f9ac41cea7b 100644 --- a/packages/functions/src/aliases/dataset.ts +++ b/packages/aliases/src/dataset.ts @@ -16,6 +16,7 @@ import { loadResolvedAliases } from "./loaders.js"; import type { Dataset } from "./types.js"; + export type { Dataset } from "./types.js"; export function dataset(alias: string): Dataset { diff --git a/packages/functions/src/aliases/environment.ts b/packages/aliases/src/environment.ts similarity index 100% rename from packages/functions/src/aliases/environment.ts rename to packages/aliases/src/environment.ts diff --git a/packages/aliases/src/experimental.test.ts b/packages/aliases/src/experimental.test.ts new file mode 100644 index 00000000000..3e2e5afc5f9 --- /dev/null +++ b/packages/aliases/src/experimental.test.ts @@ -0,0 +1,102 @@ +/* + * Copyright 2026 Palantir Technologies, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// The public surface of the browser entry point. Both import styles are +// supported, so both are asserted here: dropping either one later would be a +// breaking change for consumers, and that should fail a test rather than pass +// review unnoticed. + +import { afterEach, describe, expect, it, vi } from "vitest"; + +import * as browser from "./browser.js"; +import { resetAliasesCache } from "./browser.js"; +import { + Aliases, + DEFAULT_DECLARATIONS_PATH, + DEFAULT_DEPLOYMENT_CONFIG_PATH, + load, +} from "./public/experimental.js"; + +const DECLARATIONS = { + aliases: { custom: { apiBaseUrl: { value: "https://api.example.com" } } }, +}; + +function mockFetch(): typeof globalThis.fetch { + return vi.fn(() => + Promise.resolve({ + ok: true, + status: 200, + statusText: "OK", + headers: { get: () => "application/json" }, + text: () => Promise.resolve(JSON.stringify(DECLARATIONS)), + }), + ) as unknown as typeof globalThis.fetch; +} + +describe("experimental browser entry point", () => { + afterEach(() => { + resetAliasesCache(); + }); + + it("exposes the Aliases namespace", async () => { + const aliases = await Aliases.load({ + path: "resources.json", + fetch: mockFetch(), + }); + + expect(aliases.custom("apiBaseUrl")).toBe("https://api.example.com"); + }); + + it("caches concurrent and repeated loads", async () => { + const fetchImpl = mockFetch(); + const options = { path: "resources.json", fetch: fetchImpl }; + + const [first, second] = await Promise.all([ + Aliases.load(options), + Aliases.load(options), + ]); + const third = await Aliases.load(options); + + expect(first).toBe(second); + expect(first).toBe(third); + expect(fetchImpl).toHaveBeenCalledOnce(); + }); + + it("exposes the same members as named exports", () => { + // Same function identities, not merely same names, so the two styles can + // never drift apart. + expect(Aliases.load).toBe(load); + expect(Aliases.DEFAULT_DECLARATIONS_PATH).toBe(DEFAULT_DECLARATIONS_PATH); + expect(Aliases.DEFAULT_DEPLOYMENT_CONFIG_PATH).toBe( + DEFAULT_DEPLOYMENT_CONFIG_PATH, + ); + }); + + it("does not re-export the filesystem loaders", () => { + // Those live behind "@osdk/aliases/node". Leaking them here would pull `fs` + // into a browser bundle. + expect(Aliases).not.toHaveProperty("dataset"); + expect(Aliases).not.toHaveProperty("source"); + expect(Aliases).not.toHaveProperty("custom"); + }); + + it("keeps the test-only cache reset out of the public surface", () => { + // Tests import it from ../browser.js. Exporting it would make cache + // invalidation supported and would race with an in-flight initAliases(). + expect(Aliases).not.toHaveProperty("resetAliasesCache"); + expect(browser.resetAliasesCache).toBeTypeOf("function"); + }); +}); diff --git a/packages/aliases/src/index.ts b/packages/aliases/src/index.ts new file mode 100644 index 00000000000..5f2f6117418 --- /dev/null +++ b/packages/aliases/src/index.ts @@ -0,0 +1,20 @@ +/* + * Copyright 2026 Palantir Technologies, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Intentionally empty: this package has no stable API yet. The root is reserved +// for the browser runtime once its design settles, so that today's callers see +// the stability of what they import at the import site. Until then, see +// "@osdk/aliases/experimental" and "@osdk/aliases/node". diff --git a/packages/functions/src/aliases/loaders.ts b/packages/aliases/src/loaders.ts similarity index 100% rename from packages/functions/src/aliases/loaders.ts rename to packages/aliases/src/loaders.ts diff --git a/packages/functions/src/aliases/mediaset.ts b/packages/aliases/src/mediaset.ts similarity index 99% rename from packages/functions/src/aliases/mediaset.ts rename to packages/aliases/src/mediaset.ts index b25db5b902b..faa9299a33d 100644 --- a/packages/functions/src/aliases/mediaset.ts +++ b/packages/aliases/src/mediaset.ts @@ -16,6 +16,7 @@ import { loadResolvedAliases } from "./loaders.js"; import type { Mediaset } from "./types.js"; + export type { Mediaset } from "./types.js"; export function mediaset(alias: string): Mediaset { diff --git a/packages/functions/src/aliases/model.ts b/packages/aliases/src/model.ts similarity index 99% rename from packages/functions/src/aliases/model.ts rename to packages/aliases/src/model.ts index 55cbf066620..d780c123c8c 100644 --- a/packages/functions/src/aliases/model.ts +++ b/packages/aliases/src/model.ts @@ -16,6 +16,7 @@ import { loadResolvedAliases } from "./loaders.js"; import type { Model } from "./types.js"; + export type { Model } from "./types.js"; export function model(alias: string): Model { diff --git a/packages/aliases/src/public/experimental.ts b/packages/aliases/src/public/experimental.ts new file mode 100644 index 00000000000..e759147285b --- /dev/null +++ b/packages/aliases/src/public/experimental.ts @@ -0,0 +1,44 @@ +/* + * Copyright 2026 Palantir Technologies, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Experimental browser-safe aliases for Developer Console apps. +// +// import { Aliases } from "@osdk/aliases/experimental"; +// const aliases = await Aliases.load(); +// const apiBaseUrl = aliases.custom("apiBaseUrl"); +// +// Functions and other Node runtimes use "@osdk/aliases/node". + +import { + DEFAULT_DECLARATIONS_PATH, + DEFAULT_DEPLOYMENT_CONFIG_PATH, + load, +} from "../browser.js"; + +// Explicitly assembled to exclude test helpers. The type annotation is required +// by `--isolatedDeclarations`. +export const Aliases: { + readonly load: typeof load; + readonly DEFAULT_DECLARATIONS_PATH: typeof DEFAULT_DECLARATIONS_PATH; + readonly DEFAULT_DEPLOYMENT_CONFIG_PATH: typeof DEFAULT_DEPLOYMENT_CONFIG_PATH; +} = { + load, + DEFAULT_DECLARATIONS_PATH, + DEFAULT_DEPLOYMENT_CONFIG_PATH, +}; + +export { DEFAULT_DECLARATIONS_PATH, DEFAULT_DEPLOYMENT_CONFIG_PATH, load }; +export type { Custom, LoadAliasesOptions, LoadedAliases } from "../browser.js"; diff --git a/packages/aliases/src/public/node.ts b/packages/aliases/src/public/node.ts new file mode 100644 index 00000000000..f0e6a51ee26 --- /dev/null +++ b/packages/aliases/src/public/node.ts @@ -0,0 +1,31 @@ +/* + * Copyright 2026 Palantir Technologies, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Filesystem-backed alias runtime, for code running in Node with a container +// filesystem (Functions). Reads the aliases file whose path the runtime supplies +// through an environment variable. This entry point uses `fs` and so cannot be +// bundled into a browser; browser applications should import +// "@osdk/aliases/experimental". +// +// `@osdk/functions` re-exports this as its `Aliases` namespace, so its public +// API is unchanged. + +export * from "../custom.js"; +export * from "../dataset.js"; +export * from "../mediaset.js"; +export * from "../model.js"; +export * from "../source.js"; +export * from "../stream.js"; diff --git a/packages/functions/src/aliases/source.ts b/packages/aliases/src/source.ts similarity index 99% rename from packages/functions/src/aliases/source.ts rename to packages/aliases/src/source.ts index bc84e594b9e..62301aedde5 100644 --- a/packages/functions/src/aliases/source.ts +++ b/packages/aliases/src/source.ts @@ -16,6 +16,7 @@ import { loadResolvedAliases } from "./loaders.js"; import type { Source } from "./types.js"; + export type { Source } from "./types.js"; export function source(alias: string): Source { diff --git a/packages/functions/src/aliases/stream.ts b/packages/aliases/src/stream.ts similarity index 99% rename from packages/functions/src/aliases/stream.ts rename to packages/aliases/src/stream.ts index b2940604dc7..c06c150be03 100644 --- a/packages/functions/src/aliases/stream.ts +++ b/packages/aliases/src/stream.ts @@ -16,6 +16,7 @@ import { loadResolvedAliases } from "./loaders.js"; import type { Stream } from "./types.js"; + export type { Stream } from "./types.js"; export function stream(alias: string): Stream { diff --git a/packages/functions/src/aliases/test-data/aliases.json b/packages/aliases/src/test-data/aliases.json similarity index 100% rename from packages/functions/src/aliases/test-data/aliases.json rename to packages/aliases/src/test-data/aliases.json diff --git a/packages/functions/src/aliases/test-data/resources.json b/packages/aliases/src/test-data/resources.json similarity index 100% rename from packages/functions/src/aliases/test-data/resources.json rename to packages/aliases/src/test-data/resources.json diff --git a/packages/functions/src/aliases/types.ts b/packages/aliases/src/types.ts similarity index 71% rename from packages/functions/src/aliases/types.ts rename to packages/aliases/src/types.ts index 9aaf66866a3..f3e7f148d88 100644 --- a/packages/functions/src/aliases/types.ts +++ b/packages/aliases/src/types.ts @@ -54,6 +54,43 @@ export enum AliasEnvironment { LIVE_PREVIEW = "LIVE_PREVIEW", } +// Browser mode types (deployment.config.json) + +/** + * Shape of the deployment config file that Foundry website hosting serves at + * the browser entry point's default path. It is a flat map of + * strings; resolved custom aliases are packed under `aliases` as a stringified + * JSON object (a `Record`) so they cannot collide with the + * reserved system keys. + * + * This is the PRODUCTION shape, written at Marketplace install time and + * therefore carrying the installer's resolved values. + */ +export interface DeploymentConfig { + clientId?: string; + redirectUrl?: string; + foundryUrl?: string; + ontologyRid?: string; + ontologyApiName?: string; + /** Stringified JSON `Record` of resolved custom alias values. */ + aliases?: string; +} + +/** + * Shape of the author-maintained declaration file (`public/resources.json`). + * This is the DEVELOPMENT shape: there is no installer locally, so the values + * here are the developer's declared defaults. `description` and `required` are + * consumed at packaging time and are irrelevant to the browser runtime. + */ +export interface AliasDeclarationsFile { + aliases?: { + custom?: Record< + string, + { value?: string; description?: string; required?: boolean } + >; + }; +} + // Live preview mode types (resources.json) export interface ModelResource { diff --git a/packages/aliases/tsconfig.json b/packages/aliases/tsconfig.json new file mode 100644 index 00000000000..6c1ec6f1753 --- /dev/null +++ b/packages/aliases/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@osdk/monorepo.tsconfig/base.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "build/esm" + }, + "include": [ + "./src/**/*" + ], + "references": [] +} diff --git a/packages/aliases/vitest.config.mts b/packages/aliases/vitest.config.mts new file mode 100644 index 00000000000..8d0b9a1d9b8 --- /dev/null +++ b/packages/aliases/vitest.config.mts @@ -0,0 +1,39 @@ +/* + * Copyright 2023 Palantir Technologies, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { configDefaults, defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + pool: "forks", + exclude: [...configDefaults.exclude, "**/build/**/*"], + coverage: { + include: ["src/**"], + // Exclude tests, generated code, and index.ts barrels (no logic). + exclude: [ + "**/*.test.*", + "**/__tests__/**", + "**/__mocks__/**", + "**/generatedNoCheck/**", + "**/*.d.ts", + "**/index.ts", + ], + }, + fakeTimers: { + toFake: ["setTimeout", "clearTimeout", "Date"], + }, + }, +}); diff --git a/packages/functions/package.json b/packages/functions/package.json index 7ecaca77a3a..2654bcd174b 100644 --- a/packages/functions/package.json +++ b/packages/functions/package.json @@ -70,6 +70,7 @@ "typecheck": "tsc --noEmit --emitDeclarationOnly false" }, "dependencies": { + "@osdk/aliases": "workspace:~", "@osdk/foundry.core": "^2.44.0", "@osdk/foundry.mediasets": "^2.44.0", "@osdk/foundry.ontologies": "^2.44.0", diff --git a/packages/functions/src/aliases/index.ts b/packages/functions/src/aliases/index.ts index 96088f536d3..2395f32b19a 100644 --- a/packages/functions/src/aliases/index.ts +++ b/packages/functions/src/aliases/index.ts @@ -14,9 +14,22 @@ * limitations under the License. */ -export * from "./custom.js"; -export * from "./dataset.js"; -export * from "./mediaset.js"; -export * from "./model.js"; -export * from "./source.js"; -export * from "./stream.js"; +// Compatibility boundary keeping the public `Aliases` namespace of +// @osdk/functions unchanged now that the runtime lives in @osdk/aliases. +// +// Explicit named re-exports rather than `export *`, because API Extractor +// supports neither a namespace re-export of an external package nor a namespace +// whose target uses `export *`. + +export { custom } from "@osdk/aliases/node"; +export type { Custom } from "@osdk/aliases/node"; +export { dataset } from "@osdk/aliases/node"; +export type { Dataset } from "@osdk/aliases/node"; +export { mediaset } from "@osdk/aliases/node"; +export type { Mediaset } from "@osdk/aliases/node"; +export { model } from "@osdk/aliases/node"; +export type { Model } from "@osdk/aliases/node"; +export { source } from "@osdk/aliases/node"; +export type { Source } from "@osdk/aliases/node"; +export { stream } from "@osdk/aliases/node"; +export type { Stream } from "@osdk/aliases/node"; diff --git a/packages/functions/src/index.ts b/packages/functions/src/index.ts index 8ff838d7b4a..b8ec8dd0cc9 100644 --- a/packages/functions/src/index.ts +++ b/packages/functions/src/index.ts @@ -34,6 +34,7 @@ export type { TwoDimensionalAggregation, } from "@osdk/client"; +// Compatibility facade; see ./aliases/index.ts. export * as Aliases from "./aliases/index.js"; export { createEditBatch } from "./edits/createEditBatch.js"; export type { EditBatch } from "./edits/EditBatch.js"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8fd2d24da07..69e1fe785bf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -310,13 +310,13 @@ importers: dependencies: '@docusaurus/core': specifier: 3.4.0 - version: 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + version: 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/plugin-content-docs': specifier: 3.4.0 - version: 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + version: 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/preset-classic': specifier: 3.4.0 - version: 3.4.0(@algolia/client-search@5.46.0)(@rspack/core@1.6.7)(@swc/core@1.7.39)(@types/react@18.3.24)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.8.3) + version: 3.4.0(@algolia/client-search@5.46.0)(@rspack/core@1.6.7)(@swc/core@1.7.39)(@types/react@18.3.24)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.5.4) '@mdx-js/react': specifier: ^3.0.0 version: 3.1.1(@types/react@18.3.24)(react@18.3.1) @@ -1715,6 +1715,18 @@ importers: specifier: ~5.5.4 version: 5.5.4 + packages/aliases: + devDependencies: + '@osdk/monorepo.api-extractor': + specifier: workspace:~ + version: link:../monorepo.api-extractor + '@osdk/monorepo.tsconfig': + specifier: workspace:~ + version: link:../monorepo.tsconfig + typescript: + specifier: ~5.5.4 + version: 5.5.4 + packages/api: dependencies: '@types/geojson': @@ -4027,6 +4039,9 @@ importers: packages/functions: dependencies: + '@osdk/aliases': + specifier: workspace:~ + version: link:../aliases '@osdk/client': specifier: workspace:^ version: link:../client @@ -8337,7 +8352,7 @@ packages: '@expo/bunyan@4.0.1': resolution: {integrity: sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==} - engines: {'0': node >=0.10.0} + engines: {node: '>=0.10.0'} '@expo/cli@0.22.26': resolution: {integrity: sha512-I689wc8Fn/AX7aUGiwrh3HnssiORMJtR2fpksX+JIe8Cj/EDleblYMSwRPd0025wrwOV9UN1KM/RuEt/QjCS3Q==} @@ -24087,7 +24102,7 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' - '@docusaurus/core@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)': + '@docusaurus/core@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)': dependencies: '@babel/core': 7.28.4 '@babel/generator': 7.28.3 @@ -24101,10 +24116,10 @@ snapshots: '@babel/traverse': 7.28.4 '@docusaurus/cssnano-preset': 3.4.0 '@docusaurus/logger': 3.4.0 - '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) + '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) autoprefixer: 10.4.22(postcss@8.5.6) babel-loader: 9.2.1(@babel/core@7.28.4)(webpack@5.106.1(@swc/core@1.7.39)(esbuild@0.27.3)) babel-plugin-dynamic-import-node: 2.3.3 @@ -24135,10 +24150,10 @@ snapshots: mini-css-extract-plugin: 2.9.4(webpack@5.106.1(@swc/core@1.7.39)(esbuild@0.27.3)) p-map: 4.0.0 postcss: 8.5.6 - postcss-loader: 7.3.4(postcss@8.5.6)(typescript@5.8.3)(webpack@5.106.1(@swc/core@1.7.39)(esbuild@0.27.3)) + postcss-loader: 7.3.4(postcss@8.5.6)(typescript@5.5.4)(webpack@5.106.1(@swc/core@1.7.39)(esbuild@0.27.3)) prompts: 2.4.2 react: 18.3.1 - react-dev-utils: 12.0.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.106.1(@swc/core@1.7.39)(esbuild@0.27.3)) + react-dev-utils: 12.0.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.5.4)(webpack@5.106.1(@swc/core@1.7.39)(esbuild@0.27.3)) react-dom: 18.3.1(react@18.3.1) react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' @@ -24190,11 +24205,11 @@ snapshots: chalk: 4.1.2 tslib: 2.8.1 - '@docusaurus/mdx-loader@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)': + '@docusaurus/mdx-loader@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)': dependencies: '@docusaurus/logger': 3.4.0 - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) '@mdx-js/mdx': 3.1.1 '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 @@ -24245,15 +24260,15 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/plugin-content-blog@3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)': + '@docusaurus/plugin-content-blog@3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)': dependencies: - '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/logger': 3.4.0 - '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/types': 3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) cheerio: 1.0.0-rc.12 feed: 4.2.2 fs-extra: 11.3.1 @@ -24284,16 +24299,16 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-docs@3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)': + '@docusaurus/plugin-content-docs@3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)': dependencies: - '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/logger': 3.4.0 - '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/module-type-aliases': 3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/types': 3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) '@types/react-router-config': 5.0.11 combine-promises: 1.2.0 fs-extra: 11.3.1 @@ -24322,13 +24337,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-pages@3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)': + '@docusaurus/plugin-content-pages@3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)': dependencies: - '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/types': 3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) fs-extra: 11.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -24352,11 +24367,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-debug@3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)': + '@docusaurus/plugin-debug@3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)': dependencies: - '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/types': 3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) fs-extra: 11.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -24380,11 +24395,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-analytics@3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)': + '@docusaurus/plugin-google-analytics@3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)': dependencies: - '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/types': 3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.8.1 @@ -24406,11 +24421,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-gtag@3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)': + '@docusaurus/plugin-google-gtag@3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)': dependencies: - '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/types': 3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) '@types/gtag.js': 0.0.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -24433,11 +24448,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-tag-manager@3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)': + '@docusaurus/plugin-google-tag-manager@3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)': dependencies: - '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/types': 3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.8.1 @@ -24459,14 +24474,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-sitemap@3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)': + '@docusaurus/plugin-sitemap@3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)': dependencies: - '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/logger': 3.4.0 '@docusaurus/types': 3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) fs-extra: 11.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -24490,20 +24505,20 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/preset-classic@3.4.0(@algolia/client-search@5.46.0)(@rspack/core@1.6.7)(@swc/core@1.7.39)(@types/react@18.3.24)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.8.3)': - dependencies: - '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/plugin-content-blog': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/plugin-content-docs': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/plugin-content-pages': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/plugin-debug': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/plugin-google-analytics': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/plugin-google-gtag': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/plugin-google-tag-manager': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/plugin-sitemap': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/theme-classic': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(@types/react@18.3.24)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/theme-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/theme-search-algolia': 3.4.0(@algolia/client-search@5.46.0)(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(@types/react@18.3.24)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.8.3) + '@docusaurus/preset-classic@3.4.0(@algolia/client-search@5.46.0)(@rspack/core@1.6.7)(@swc/core@1.7.39)(@types/react@18.3.24)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.5.4)': + dependencies: + '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/plugin-content-blog': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/plugin-content-docs': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/plugin-content-pages': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/plugin-debug': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/plugin-google-analytics': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/plugin-google-gtag': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/plugin-google-tag-manager': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/plugin-sitemap': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/theme-classic': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(@types/react@18.3.24)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/theme-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/theme-search-algolia': 3.4.0(@algolia/client-search@5.46.0)(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(@types/react@18.3.24)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.5.4) '@docusaurus/types': 3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -24533,20 +24548,20 @@ snapshots: '@types/react': 18.3.24 react: 18.3.1 - '@docusaurus/theme-classic@3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(@types/react@18.3.24)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)': + '@docusaurus/theme-classic@3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(@types/react@18.3.24)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)': dependencies: - '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/module-type-aliases': 3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-blog': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/plugin-content-docs': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/plugin-content-pages': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/theme-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + '@docusaurus/plugin-content-blog': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/plugin-content-docs': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/plugin-content-pages': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/theme-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/theme-translations': 3.4.0 '@docusaurus/types': 3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) '@mdx-js/react': 3.1.1(@types/react@18.3.24)(react@18.3.1) clsx: 2.1.1 copy-text-to-clipboard: 3.2.2 @@ -24581,14 +24596,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-common@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)': + '@docusaurus/theme-common@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)': dependencies: - '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/module-type-aliases': 3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-blog': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/plugin-content-docs': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/plugin-content-pages': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) + '@docusaurus/plugin-content-blog': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/plugin-content-docs': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/plugin-content-pages': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@types/history': 4.7.11 '@types/react': 18.3.24 @@ -24619,16 +24634,16 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-search-algolia@3.4.0(@algolia/client-search@5.46.0)(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(@types/react@18.3.24)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.8.3)': + '@docusaurus/theme-search-algolia@3.4.0(@algolia/client-search@5.46.0)(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(@types/react@18.3.24)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.5.4)': dependencies: '@docsearch/react': 3.9.0(@algolia/client-search@5.46.0)(@types/react@18.3.24)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) - '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/logger': 3.4.0 - '@docusaurus/plugin-content-docs': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) - '@docusaurus/theme-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + '@docusaurus/plugin-content-docs': 3.4.0(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + '@docusaurus/theme-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rspack/core@1.6.7)(@swc/core@1.7.39)(esbuild@0.27.3)(eslint@9.35.0(jiti@2.5.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/theme-translations': 3.4.0 - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) algoliasearch: 4.25.3 algoliasearch-helper: 3.26.1(algoliasearch@4.25.3) clsx: 2.1.1 @@ -24692,10 +24707,10 @@ snapshots: optionalDependencies: '@docusaurus/types': 3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3)': + '@docusaurus/utils-validation@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4)': dependencies: '@docusaurus/logger': 3.4.0 - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4) '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) fs-extra: 11.3.1 joi: 17.13.3 @@ -24711,11 +24726,11 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.8.3)': + '@docusaurus/utils@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.39)(esbuild@0.27.3)(typescript@5.5.4)': dependencies: '@docusaurus/logger': 3.4.0 '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.39)(esbuild@0.27.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@svgr/webpack': 8.1.0(typescript@5.8.3) + '@svgr/webpack': 8.1.0(typescript@5.5.4) escape-string-regexp: 4.0.0 file-loader: 6.2.0(webpack@5.106.1(@swc/core@1.7.39)(esbuild@0.27.3)) fs-extra: 11.3.1 @@ -28988,17 +29003,6 @@ snapshots: - supports-color - typescript - '@svgr/core@8.1.0(typescript@5.8.3)': - dependencies: - '@babel/core': 7.28.4 - '@svgr/babel-preset': 8.1.0(@babel/core@7.28.4) - camelcase: 6.3.0 - cosmiconfig: 8.3.6(typescript@5.8.3) - snake-case: 3.0.4 - transitivePeerDependencies: - - supports-color - - typescript - '@svgr/hast-util-to-babel-ast@8.0.0': dependencies: '@babel/types': 7.28.4 @@ -29014,16 +29018,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.8.3))': - dependencies: - '@babel/core': 7.28.4 - '@svgr/babel-preset': 8.1.0(@babel/core@7.28.4) - '@svgr/core': 8.1.0(typescript@5.8.3) - '@svgr/hast-util-to-babel-ast': 8.0.0 - svg-parser: 2.0.4 - transitivePeerDependencies: - - supports-color - '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.5.4))(typescript@5.5.4)': dependencies: '@svgr/core': 8.1.0(typescript@5.5.4) @@ -29033,25 +29027,16 @@ snapshots: transitivePeerDependencies: - typescript - '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.8.3))(typescript@5.8.3)': - dependencies: - '@svgr/core': 8.1.0(typescript@5.8.3) - cosmiconfig: 8.3.6(typescript@5.8.3) - deepmerge: 4.3.1 - svgo: 3.3.3 - transitivePeerDependencies: - - typescript - - '@svgr/webpack@8.1.0(typescript@5.8.3)': + '@svgr/webpack@8.1.0(typescript@5.5.4)': dependencies: '@babel/core': 7.28.4 '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.28.4) '@babel/preset-env': 7.26.0(@babel/core@7.28.4) '@babel/preset-react': 7.25.9(@babel/core@7.28.4) '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) - '@svgr/core': 8.1.0(typescript@5.8.3) - '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3)) - '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3))(typescript@5.8.3) + '@svgr/core': 8.1.0(typescript@5.5.4) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.5.4)) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.5.4))(typescript@5.5.4) transitivePeerDependencies: - supports-color - typescript @@ -32188,15 +32173,6 @@ snapshots: optionalDependencies: typescript: 5.5.4 - cosmiconfig@8.3.6(typescript@5.8.3): - dependencies: - import-fresh: 3.3.1 - js-yaml: 4.1.1 - parse-json: 5.2.0 - path-type: 4.0.0 - optionalDependencies: - typescript: 5.8.3 - crc-32@1.2.2: {} crc32-stream@6.0.0: @@ -34124,7 +34100,7 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.35.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.106.1(@swc/core@1.7.39)(esbuild@0.27.3)): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.35.0(jiti@2.5.1))(typescript@5.5.4)(webpack@5.106.1(@swc/core@1.7.39)(esbuild@0.27.3)): dependencies: '@babel/code-frame': 7.27.1 '@types/json-schema': 7.0.15 @@ -34139,7 +34115,7 @@ snapshots: schema-utils: 2.7.0 semver: 7.7.4 tapable: 1.1.3 - typescript: 5.8.3 + typescript: 5.5.4 webpack: 5.106.1(@swc/core@1.7.39)(esbuild@0.27.3) optionalDependencies: eslint: 9.35.0(jiti@2.5.1) @@ -38271,9 +38247,9 @@ snapshots: tsx: 4.20.5 yaml: 2.9.0 - postcss-loader@7.3.4(postcss@8.5.6)(typescript@5.8.3)(webpack@5.106.1(@swc/core@1.7.39)(esbuild@0.27.3)): + postcss-loader@7.3.4(postcss@8.5.6)(typescript@5.5.4)(webpack@5.106.1(@swc/core@1.7.39)(esbuild@0.27.3)): dependencies: - cosmiconfig: 8.3.6(typescript@5.8.3) + cosmiconfig: 8.3.6(typescript@5.5.4) jiti: 1.21.7 postcss: 8.5.6 semver: 7.7.4 @@ -38987,7 +38963,7 @@ snapshots: date-fns: 2.30.0 react: 18.3.1 - react-dev-utils@12.0.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.106.1(@swc/core@1.7.39)(esbuild@0.27.3)): + react-dev-utils@12.0.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.5.4)(webpack@5.106.1(@swc/core@1.7.39)(esbuild@0.27.3)): dependencies: '@babel/code-frame': 7.27.1 address: 1.2.2 @@ -38998,7 +38974,7 @@ snapshots: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.35.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.106.1(@swc/core@1.7.39)(esbuild@0.27.3)) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.35.0(jiti@2.5.1))(typescript@5.5.4)(webpack@5.106.1(@swc/core@1.7.39)(esbuild@0.27.3)) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -39015,7 +38991,7 @@ snapshots: text-table: 0.2.0 webpack: 5.106.1(@swc/core@1.7.39)(esbuild@0.27.3) optionalDependencies: - typescript: 5.8.3 + typescript: 5.5.4 transitivePeerDependencies: - eslint - supports-color @@ -41552,7 +41528,8 @@ snapshots: typescript@5.8.2: {} - typescript@5.8.3: {} + typescript@5.8.3: + optional: true typewise-core@1.2.0: {}