From 8b4e0e7e562b4269807192b5396cd3263dea65de Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Wed, 30 Jul 2025 18:42:03 +0000 Subject: [PATCH 01/25] Add alloy-js/python dependency --- .npmrc | 1 + packages/emitter-framework/package.json | 2 ++ pnpm-lock.yaml | 12 ++++++++++++ 3 files changed, 15 insertions(+) diff --git a/.npmrc b/.npmrc index 6faa8adb1a7..6088cdfb2c5 100644 --- a/.npmrc +++ b/.npmrc @@ -2,3 +2,4 @@ auto-install-peers=true package-manager-strict=false manage-package-manager-versions=true engine-strict=true +registry=https://registry.npmjs.org/ diff --git a/packages/emitter-framework/package.json b/packages/emitter-framework/package.json index aa04e9c6485..28c52bb1fb3 100644 --- a/packages/emitter-framework/package.json +++ b/packages/emitter-framework/package.json @@ -55,6 +55,7 @@ "peerDependencies": { "@alloy-js/core": "^0.19.0", "@alloy-js/csharp": "^0.19.0", + "@alloy-js/python": "^0.0.1", "@alloy-js/typescript": "^0.19.0", "@typespec/compiler": "workspace:^", "@typespec/http": "workspace:^", @@ -63,6 +64,7 @@ "devDependencies": { "@alloy-js/cli": "^0.19.0", "@alloy-js/core": "^0.19.0", + "@alloy-js/python": "^0.0.1", "@alloy-js/rollup-plugin": "^0.1.0", "@alloy-js/typescript": "^0.19.0", "@typespec/compiler": "workspace:^", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0c41918d2bd..480cde8dd5c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -420,6 +420,9 @@ importers: '@alloy-js/core': specifier: ^0.19.0 version: 0.19.0 + '@alloy-js/python': + specifier: ^0.0.1 + version: 0.0.1 '@alloy-js/rollup-plugin': specifier: ^0.1.0 version: 0.1.0(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@4.45.1) @@ -2711,6 +2714,9 @@ packages: '@alloy-js/markdown@0.19.0': resolution: {integrity: sha512-IKwzO6+ggXtl+bVy33wa5iBJx6KkMD7lzN3RJrKTvBPml7iuP21TwLjhUa1rmRQLekUZlbRuTYWaeWVEyrPYyw==} + '@alloy-js/python@0.0.1': + resolution: {integrity: sha512-7L32hryUa2StoMceIkGT2bnDzChK19c7oPrKlDj+Tmw8uKmM/3FDeRlzDatDWp7bE3iGMUjKsstSPsD4t038Hg==} + '@alloy-js/rollup-plugin@0.1.0': resolution: {integrity: sha512-MXR8mBdSh/pxMP8kIXAcMYKsm5yOWZ+igxcaRX1vBXFiHU4eK7gE/5q6Fk8Vdydh+MItWtgekwIhUWvcszdNFQ==} engines: {node: '>=18.0.0'} @@ -13650,6 +13656,12 @@ snapshots: '@alloy-js/core': 0.19.0 yaml: 2.8.0 + '@alloy-js/python@0.0.1': + dependencies: + '@alloy-js/core': 0.19.0 + change-case: 5.4.4 + pathe: 2.0.3 + '@alloy-js/rollup-plugin@0.1.0(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@4.45.1)': dependencies: '@alloy-js/babel-preset': 0.2.1(@babel/core@7.28.0) From a50600bee6de7ca46e943ed9bee2d704feee62d5 Mon Sep 17 00:00:00 2001 From: swatikumar Date: Thu, 31 Jul 2025 12:22:45 -0400 Subject: [PATCH 02/25] Add python scaffolding --- packages/emitter-framework/package.json | 7 ++++ .../src/python/components/index.ts | 5 +++ .../emitter-framework/src/python/index.ts | 1 + packages/emitter-framework/src/python/lib.ts | 40 +++++++++++++++++++ 4 files changed, 53 insertions(+) create mode 100644 packages/emitter-framework/src/python/components/index.ts create mode 100644 packages/emitter-framework/src/python/index.ts create mode 100644 packages/emitter-framework/src/python/lib.ts diff --git a/packages/emitter-framework/package.json b/packages/emitter-framework/package.json index 28c52bb1fb3..b123ff31edd 100644 --- a/packages/emitter-framework/package.json +++ b/packages/emitter-framework/package.json @@ -29,6 +29,9 @@ "./typescript": { "import": "./dist/src/typescript/index.js" }, + "./python": { + "import": "./dist/src/python/index.js" + }, "./testing": { "import": "./dist/src/testing/index.js" } @@ -46,6 +49,10 @@ "#typescript/*": { "development": "./src/typescript/*", "default": "./dist/src/typescript/*" + }, + "#python/*": { + "development": "./src/python/*", + "default": "./dist/src/python/*" } }, "keywords": [], diff --git a/packages/emitter-framework/src/python/components/index.ts b/packages/emitter-framework/src/python/components/index.ts new file mode 100644 index 00000000000..87ecc90d65b --- /dev/null +++ b/packages/emitter-framework/src/python/components/index.ts @@ -0,0 +1,5 @@ +// Python components will be exported here as they are created +// Example future exports: +// export * from "./class-declaration.js"; +// Empty export to make this a valid module until components are added +export {}; diff --git a/packages/emitter-framework/src/python/index.ts b/packages/emitter-framework/src/python/index.ts new file mode 100644 index 00000000000..abfe9e01158 --- /dev/null +++ b/packages/emitter-framework/src/python/index.ts @@ -0,0 +1 @@ +export * from "./components/index.js"; diff --git a/packages/emitter-framework/src/python/lib.ts b/packages/emitter-framework/src/python/lib.ts new file mode 100644 index 00000000000..df457071e5e --- /dev/null +++ b/packages/emitter-framework/src/python/lib.ts @@ -0,0 +1,40 @@ +import { createTypeSpecLibrary } from "@typespec/compiler"; + +export const $pythonLib = createTypeSpecLibrary({ + name: "emitter-framework", + diagnostics: { + "python-unsupported-scalar": { + severity: "warning", + messages: { + default: "Unsupported scalar type, falling back to Any", + }, + }, + "python-unsupported-type": { + severity: "error", + messages: { + default: "Unsupported type, falling back to Any", + }, + description: "This type is not supported by the Python emitter", + }, + "python-unsupported-model-discriminator": { + severity: "error", + messages: { + default: + "Unsupported model discriminator, falling back to not discriminating on serialization/deserialization", + }, + description: "Discriminators at the model are not supported", + }, + "python-unsupported-type-transform": { + severity: "error", + messages: { + default: "Unsupported type for transformation, falling back to not transforming this type", + }, + description: "This type cannot be transformed", + }, + }, +}); + +export const { + reportDiagnostic: reportPythonDiagnostic, + createDiagnostic: createPythonDiagnostic, +} = $pythonLib; From dea35410e635b05917ee6945421adbf37b20c7e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Gardini?= Date: Thu, 31 Jul 2025 16:06:24 -0300 Subject: [PATCH 03/25] Add starting test structure (#34) * Add Atom * Add initial test structure * Add Atom * Add initial test structure * Add file to index * Add python scaffolding * Add Atom * Add initial test structure * Add file to index * pnpm format --------- Co-authored-by: swatikumar --- .../src/python/components/atom/atom.test.tsx | 31 +++++++ .../src/python/components/atom/atom.tsx | 14 ++++ .../function-declaration.test.tsx | 33 ++++++++ .../function-declaration.tsx | 83 +++++++++++++++++++ .../src/python/components/index.ts | 7 +- .../emitter-framework/src/python/test-host.ts | 49 +++++++++++ 6 files changed, 212 insertions(+), 5 deletions(-) create mode 100644 packages/emitter-framework/src/python/components/atom/atom.test.tsx create mode 100644 packages/emitter-framework/src/python/components/atom/atom.tsx create mode 100644 packages/emitter-framework/src/python/components/function-declaration/function-declaration.test.tsx create mode 100644 packages/emitter-framework/src/python/components/function-declaration/function-declaration.tsx create mode 100644 packages/emitter-framework/src/python/test-host.ts diff --git a/packages/emitter-framework/src/python/components/atom/atom.test.tsx b/packages/emitter-framework/src/python/components/atom/atom.test.tsx new file mode 100644 index 00000000000..9dc04a46434 --- /dev/null +++ b/packages/emitter-framework/src/python/components/atom/atom.test.tsx @@ -0,0 +1,31 @@ +import { Output } from "@alloy-js/core"; +import { SourceFile } from "@alloy-js/python"; +import type { Program, Value } from "@typespec/compiler"; +import { $ } from "@typespec/compiler/typekit"; +import { beforeAll, expect, it } from "vitest"; +import { Atom } from "../../index.js"; +import { getProgram } from "../../test-host.js"; + +let program: Program; +beforeAll(async () => { + program = await getProgram(""); +}); + +it("renders strings", async () => { + const value = $(program).value.createString("test"); + + await testValueExpression(value, `"test"`); +}); + +/** + * Helper that renders a value expression and checks the output against the expected value. + */ +async function testValueExpression(value: Value, expected: string) { + expect( + + + + + , + ).toRenderTo(`${expected}`); +} diff --git a/packages/emitter-framework/src/python/components/atom/atom.tsx b/packages/emitter-framework/src/python/components/atom/atom.tsx new file mode 100644 index 00000000000..c5fcc089992 --- /dev/null +++ b/packages/emitter-framework/src/python/components/atom/atom.tsx @@ -0,0 +1,14 @@ +import { type Children } from "@alloy-js/core"; +import * as py from "@alloy-js/python"; +import { type Value } from "@typespec/compiler"; + +interface AtomProps { + value: Value; +} + +export function Atom(props: Readonly): Children { + switch (props.value.valueKind) { + case "StringValue": + return ; + } +} diff --git a/packages/emitter-framework/src/python/components/function-declaration/function-declaration.test.tsx b/packages/emitter-framework/src/python/components/function-declaration/function-declaration.test.tsx new file mode 100644 index 00000000000..b4bee327bd0 --- /dev/null +++ b/packages/emitter-framework/src/python/components/function-declaration/function-declaration.test.tsx @@ -0,0 +1,33 @@ +import { SourceFile } from "@alloy-js/typescript"; +import type { Namespace } from "@typespec/compiler"; +import { describe, expect, it } from "vitest"; +import { Output } from "../../../../src/core/components/output.jsx"; +import { getProgram } from "../../test-host.js"; +import { FunctionDeclaration } from "./function-declaration.jsx"; +describe("Typescript Function Declaration", () => { + describe("Function bound to Typespec Types", () => { + describe("Bound to Operation", () => { + it("creates a function", async () => { + const program = await getProgram(` + namespace DemoService; + op getName(id: string): string; + `); + + const [namespace] = program.resolveTypeReference("DemoService"); + const operation = Array.from((namespace as Namespace).operations.values())[0]; + + expect( + + + + + , + ).toRenderTo(` + def get_name(id: str) -> str: + pass + + `); + }); + }); + }); +}); diff --git a/packages/emitter-framework/src/python/components/function-declaration/function-declaration.tsx b/packages/emitter-framework/src/python/components/function-declaration/function-declaration.tsx new file mode 100644 index 00000000000..51cd57b9722 --- /dev/null +++ b/packages/emitter-framework/src/python/components/function-declaration/function-declaration.tsx @@ -0,0 +1,83 @@ +import * as py from "@alloy-js/python"; +import type { Model, Operation } from "@typespec/compiler"; + +export interface FunctionDeclarationPropsWithType + extends Omit { + type: Operation; + name?: string; + parametersMode?: "prepend" | "append" | "replace"; +} + +export type FunctionDeclarationProps = + | FunctionDeclarationPropsWithType + | py.FunctionDeclarationProps; + +/** + * A TypeScript function declaration. Pass the `type` prop to create the + * function declaration by converting from a TypeSpec Operation. Any other props + * provided will take precedence. + */ +export function FunctionDeclaration(props: FunctionDeclarationProps) { + return ( + + {props.children} + + ); +} + +export interface TypedFunctionParametersProps extends Omit { + type: Model; + name?: string; +} + +const reservedFunctionKeywords = new Set([ + "break", + "case", + "catch", + "class", + "const", + "continue", + "debugger", + "default", + "delete", + "do", + "else", + "enum", + "export", + "extends", + "finally", + "for", + "function", + "if", + "import", + "in", + "instanceof", + "new", + "return", + "super", + "switch", + "this", + "throw", + "try", + "typeof", + "var", + "void", + "while", + "with", + "yield", + "let", + "static", + "implements", + "interface", + "package", + "private", + "protected", + "public", + "await", +]); diff --git a/packages/emitter-framework/src/python/components/index.ts b/packages/emitter-framework/src/python/components/index.ts index 87ecc90d65b..56499e90f04 100644 --- a/packages/emitter-framework/src/python/components/index.ts +++ b/packages/emitter-framework/src/python/components/index.ts @@ -1,5 +1,2 @@ -// Python components will be exported here as they are created -// Example future exports: -// export * from "./class-declaration.js"; -// Empty export to make this a valid module until components are added -export {}; +export * from "./atom/atom.jsx"; +export * from "./function-declaration/function-declaration.jsx"; diff --git a/packages/emitter-framework/src/python/test-host.ts b/packages/emitter-framework/src/python/test-host.ts new file mode 100644 index 00000000000..f7434e03c7a --- /dev/null +++ b/packages/emitter-framework/src/python/test-host.ts @@ -0,0 +1,49 @@ +import type { Program } from "@typespec/compiler"; +import { + createTestHost, + createTestWrapper, + expectDiagnosticEmpty, +} from "@typespec/compiler/testing"; +import { HttpTestLibrary } from "@typespec/http/testing"; + +export async function createTypespecCliTestHost( + options: { libraries: "Http"[] } = { libraries: [] }, +) { + const libraries = []; + if (options.libraries.includes("Http")) { + libraries.push(HttpTestLibrary); + } + return createTestHost({ + libraries, + }); +} + +export async function createEmitterFrameworkTestRunner(options: { autoUsings?: string[] } = {}) { + const host = await createTypespecCliTestHost(); + return createTestWrapper(host, { + autoUsings: options.autoUsings, + }); +} + +export async function getProgram( + code: string, + options: { libraries: "Http"[] } = { libraries: [] }, +): Promise { + const host = await createTypespecCliTestHost(options); + const wrapper = createTestWrapper(host, { + compilerOptions: { + noEmit: true, + }, + }); + const [_, diagnostics] = await wrapper.compileAndDiagnose(code); + expectDiagnosticEmpty(diagnostics); + return wrapper.program; +} + +/** + * Initializes an empty program in the compiler. + * This is useful when you want to initialize the default TypeKits without any code. + */ +export async function initEmptyProgram(): Promise { + await getProgram(""); +} From 6d73458a391d547aee934f08fea081341688f777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Gardini?= Date: Mon, 11 Aug 2025 14:22:58 -0300 Subject: [PATCH 04/25] Add Atom (#36) * Add Atom * Fix --- packages/emitter-framework/CHANGELOG.md | 13 +- .../src/python/components/atom/atom.test.tsx | 214 +++++++++++++++++- .../src/python/components/atom/atom.tsx | 58 ++++- 3 files changed, 267 insertions(+), 18 deletions(-) diff --git a/packages/emitter-framework/CHANGELOG.md b/packages/emitter-framework/CHANGELOG.md index 09b3a3ee607..a6051375a43 100644 --- a/packages/emitter-framework/CHANGELOG.md +++ b/packages/emitter-framework/CHANGELOG.md @@ -17,7 +17,6 @@ - [#7650](https://github.com/microsoft/typespec/pull/7650) Adds subpath export for csharp emitter-framework components - ## 0.8.0 ### Features @@ -32,7 +31,6 @@ - [#7369](https://github.com/microsoft/typespec/pull/7369) Render discriminated unions correctly - ## 0.7.1 ### Bump dependencies @@ -43,21 +41,19 @@ - [#7321](https://github.com/microsoft/typespec/pull/7321) Use wasm version of tree sitter for snippet extractor - ## 0.7.0 ### Bump dependencies - [#7186](https://github.com/microsoft/typespec/pull/7186) Upgrade to alloy 15 - ## 0.6.0 ### Features - [#7017](https://github.com/microsoft/typespec/pull/7017) [TypeScript] Add various function-related components - FunctionType, FunctionExpression, ArrowFunction, and InterfaceMethod. - [#6972](https://github.com/microsoft/typespec/pull/6972) Add support for rendering a Value Expression -- [#7018](https://github.com/microsoft/typespec/pull/7018) Adds the `TspContextProvider` and `useTsp()` hook for providing and accessing TypeSpec context and the Typekit APIs (e.g. `# Changelog - @typespec/emitter-framework). Adds a new `Output` component that accepts a TypeSpec `Program` and automatically wraps children components with the `TspContextProvider`. +- [#7018](https://github.com/microsoft/typespec/pull/7018) Adds the `TspContextProvider` and `useTsp()` hook for providing and accessing TypeSpec context and the Typekit APIs (e.g. `# Changelog - @typespec/emitter-framework). Adds a new `Output`component that accepts a TypeSpec`Program`and automatically wraps children components with the`TspContextProvider`. ### Bump dependencies @@ -67,21 +63,18 @@ - [#6951](https://github.com/microsoft/typespec/pull/6951) InterfaceMember should use Alloy - ## 0.5.0 ### Features - [#6875](https://github.com/microsoft/typespec/pull/6875) Upgrade to alloy 0.10.0 - ## 0.4.0 ### Bump dependencies - [#6595](https://github.com/microsoft/typespec/pull/6595) Upgrade dependencies - ## 0.3.0 ### Bump dependencies @@ -93,12 +86,8 @@ - [#6178](https://github.com/microsoft/typespec/pull/6178) Improvements on the TestHarness - [#6460](https://github.com/microsoft/typespec/pull/6460) Update dependency structure for EmitterFramework, HttpClient and JS Emitter - - - ## 0.2.0 ### Features - [#5996](https://github.com/microsoft/typespec/pull/5996) Adding Emitter Framework and Http Client packages - diff --git a/packages/emitter-framework/src/python/components/atom/atom.test.tsx b/packages/emitter-framework/src/python/components/atom/atom.test.tsx index 9dc04a46434..8ab714dc7cc 100644 --- a/packages/emitter-framework/src/python/components/atom/atom.test.tsx +++ b/packages/emitter-framework/src/python/components/atom/atom.test.tsx @@ -1,8 +1,8 @@ import { Output } from "@alloy-js/core"; import { SourceFile } from "@alloy-js/python"; -import type { Program, Value } from "@typespec/compiler"; +import { type Model, type Namespace, type Program, type Value } from "@typespec/compiler"; import { $ } from "@typespec/compiler/typekit"; -import { beforeAll, expect, it } from "vitest"; +import { assert, beforeAll, describe, expect, it } from "vitest"; import { Atom } from "../../index.js"; import { getProgram } from "../../test-host.js"; @@ -11,12 +11,207 @@ beforeAll(async () => { program = await getProgram(""); }); -it("renders strings", async () => { - const value = $(program).value.createString("test"); +describe("NullValue", () => { + it("null value", async () => { + const value = { entityKind: "Value", valueKind: "NullValue", value: null } as Value; - await testValueExpression(value, `"test"`); + await testValueExpression(value, `None`); + }); }); +describe("StringValue", () => { + it("normal string", async () => { + const value = $(program).value.createString("test"); + + await testValueExpression(value, `"test"`); + }); + + it("empty string", async () => { + const value = $(program).value.createString(""); + + await testValueExpression(value, `""`); + }); +}); + +describe("BooleanValue", () => { + it("True", async () => { + const value = $(program).value.createBoolean(true); + + await testValueExpression(value, `True`); + }); + + it("False", async () => { + const value = $(program).value.createBoolean(false); + + await testValueExpression(value, `False`); + }); +}); + +describe("NumericValue", () => { + it("integers", async () => { + const value = $(program).value.createNumeric(42); + + await testValueExpression(value, `42`); + }); + + it("decimals", async () => { + const value = $(program).value.createNumeric(42.5); + + await testValueExpression(value, `42.5`); + }); +}); + +describe("ArrayValue", () => { + it("empty", async () => { + // Can be replaced with with TypeKit once #6976 is implemented + const value = { + entityKind: "Value", + valueKind: "ArrayValue", + values: [], + } as unknown as Value; + await testValueExpression(value, `[]`); + }); + + it("with mixed values", async () => { + // Can be replaced with with TypeKit once #6976 is implemented + const value = { + entityKind: "Value", + valueKind: "ArrayValue", + values: [ + $(program).value.createString("some_text"), + $(program).value.createNumeric(42), + $(program).value.createBoolean(true), + { + entityKind: "Value", + valueKind: "ArrayValue", + values: [ + $(program).value.createNumeric(1), + $(program).value.createNumeric(2), + $(program).value.createNumeric(3), + ], + } as Value, + ], + } as Value; + await testValueExpression(value, `["some_text", 42, True, [1, 2, 3]]`); + }); +}); + +describe("ScalarValue", () => { + it("utcDateTime.fromISO correctly supplied", async () => { + const program = await getProgram(` + namespace DemoService; + model DateRange { + @encode("rfc7231") + minDate: utcDateTime = utcDateTime.fromISO("2024-02-15T18:36:03Z"); + } + `); + const [namespace] = program.resolveTypeReference("DemoService"); + const dateRange = (namespace as Namespace).models.get("DateRange"); + const minDate = dateRange?.properties.get("minDate")?.defaultValue; + assert.exists(minDate, "unable to find minDate property"); + await testValueExpression( + minDate, + `"datetime.datetime(2024, 2, 15, 18, 36, 3, tzinfo=datetime.timezone.utc)"`, + ); + }); + + it("Unsupported scalar constructor", async () => { + const program = await getProgram(` + namespace DemoService; + + scalar ipv4 extends string { + init fromInt(value: uint32); + } + + @example (#{ip: ipv4.fromInt(2130706433)}) + model IpAddress { + ip: ipv4; + } + `); + const [namespace] = program.resolveTypeReference("DemoService"); + const model = (namespace as Namespace).models.get("IpAddress"); + assert.exists(model, "unable to find IpAddress model"); + + const value = getExampleValue(model); + await expect(testValueExpression(value, ``)).rejects.toThrow( + /Unsupported scalar constructor fromInt/, + ); + }); +}); + +describe("ObjectValue", () => { + it("empty object", async () => { + // Can be replaced with with TypeKit once #6976 is implemented + const program = await getProgram(` + namespace DemoService; + @example(#{}) + model ObjectValue {}; + `); + const [namespace] = program.resolveTypeReference("DemoService"); + const model = (namespace as Namespace).models.get("ObjectValue"); + assert.exists(model, "unable to find ObjectValue model"); + + const value = getExampleValue(model); + await testValueExpression(value, `{}`); + }); + + it("object with properties", async () => { + // Can be replaced with with TypeKit once #6976 is implemented + const program = await getProgram(` + namespace DemoService; + @example(#{aNumber: 5, aString: "foo", aBoolean: true}) + model ObjectValue { + aNumber: int32; + aString: string; + aBoolean: boolean; + }; + `); + const [namespace] = program.resolveTypeReference("DemoService"); + const model = (namespace as Namespace).models.get("ObjectValue"); + assert.exists(model, "unable to find ObjectValue model"); + + const value = getExampleValue(model); + await testValueExpression(value, `{"aNumber": 5, "aString": "foo", "aBoolean": True}`); + }); +}); + +// describe("EnumValue", () => { +// it("different EnumValue types", async () => { +// // Can be replaced with with TypeKit once #6976 is implemented +// const program = await getProgram(` +// namespace DemoService; +// enum Color { +// Red, +// Green: 3, +// Blue +// } +// `); +// const [namespace] = program.resolveTypeReference("DemoService"); +// const colors = (namespace as Namespace).enums.get("Color"); +// assert.exists(colors, "unable to find Color enum"); + +// const red = colors?.members.get("Red"); +// assert.exists(red, "unable to find Red enum member"); +// await testValueExpression( +// { +// valueKind: "EnumValue", +// value: red, +// } as EnumValue, +// `"Red"`, +// ); + +// const green = colors?.members.get("Green"); +// assert.exists(green, "unable to find Green enum member"); +// await testValueExpression( +// { +// valueKind: "EnumValue", +// value: green, +// } as EnumValue, +// `3`, +// ); +// }); +// }); + /** * Helper that renders a value expression and checks the output against the expected value. */ @@ -29,3 +224,12 @@ async function testValueExpression(value: Value, expected: string) { , ).toRenderTo(`${expected}`); } + +/** + * Extracts the value marked with the @example decorator from a model. + */ +function getExampleValue(model: Model): Value { + const decorator = model?.decorators.find((d) => d.definition?.name === "@example"); + assert.exists(decorator?.args[0]?.value, "unable to find example decorator"); + return decorator.args[0].value as Value; +} diff --git a/packages/emitter-framework/src/python/components/atom/atom.tsx b/packages/emitter-framework/src/python/components/atom/atom.tsx index c5fcc089992..c71493bd0e7 100644 --- a/packages/emitter-framework/src/python/components/atom/atom.tsx +++ b/packages/emitter-framework/src/python/components/atom/atom.tsx @@ -1,14 +1,70 @@ import { type Children } from "@alloy-js/core"; import * as py from "@alloy-js/python"; -import { type Value } from "@typespec/compiler"; +import { compilerAssert, type Value } from "@typespec/compiler"; +/** + * Properties for the {@link Atom} component. + */ interface AtomProps { + /** + * The TypeSpec value to be converted to a Python expression. + */ value: Value; } +/** + * Generates a Python atom from a TypeSpec value. + * @param props properties for the atom + * @returns {@link Children} representing the Python value expression + */ export function Atom(props: Readonly): Children { switch (props.value.valueKind) { case "StringValue": + case "BooleanValue": + case "NullValue": return ; + case "NumericValue": + return ; + case "ArrayValue": + return ( + ( + + ))} + /> + ); + case "ScalarValue": + compilerAssert( + props.value.value.name === "fromISO", + `Unsupported scalar constructor ${props.value.value.name}`, + props.value, + ); + return handleISOStringValue(props.value); + case "ObjectValue": + const jsProperties: Record = {}; + for (const [key, value] of props.value.properties) { + jsProperties[key] = Atom({ value: value.value }); + } + return ; + // case "EnumValue": + // return ; + // TODO: Handle EnumValue in a separate PR } } + +/** + * Handles the conversion of ISO date strings to Python datetime objects. + * @param value the TypeSpec value containing the ISO string + * @returns {@link Children} representing the Python datetime expression + */ +function handleISOStringValue(value: Value & { valueKind: "ScalarValue" }): Children { + const arg0 = value.value.args[0]; + if (arg0.valueKind !== "StringValue") { + throw new Error("Expected arg0 to be a StringValue"); + } + const isoString = arg0.value; + const date = new Date(isoString); + // Convert datetime to a module + const pyDatetime = `datetime.datetime(${date.getUTCFullYear()}, ${date.getUTCMonth() + 1}, ${date.getUTCDate()}, ${date.getUTCHours()}, ${date.getUTCMinutes()}, ${date.getUTCSeconds()}, tzinfo=datetime.timezone.utc)`; + return ; +} From 79581e62102a46315ce3531b4f099e815e974865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Gardini?= Date: Thu, 14 Aug 2025 13:29:10 -0300 Subject: [PATCH 05/25] Add typing (#38) * Add Atom * Add typing * Fix * Fix * Add typing * Fix * Fix comment * Add TODOs --- .../emitter-framework/src/python/builtins.ts | 26 +++ .../array-expression.test.tsx | 41 ++++ .../array-expression/array-expression.tsx | 11 ++ .../record-expression.test.tsx | 41 ++++ .../record-expression/record-expression.tsx | 13 ++ .../type-alias-declaration.test.tsx | 150 +++++++++++++++ .../type-alias-declaration.tsx | 55 ++++++ .../type-expression/type-expression.test.tsx | 145 ++++++++++++++ .../type-expression/type-expression.tsx | 180 ++++++++++++++++++ .../src/python/test-utils.tsx | 64 +++++++ .../src/python/utils/refkey.ts | 36 ++++ 11 files changed, 762 insertions(+) create mode 100644 packages/emitter-framework/src/python/builtins.ts create mode 100644 packages/emitter-framework/src/python/components/array-expression/array-expression.test.tsx create mode 100644 packages/emitter-framework/src/python/components/array-expression/array-expression.tsx create mode 100644 packages/emitter-framework/src/python/components/record-expression/record-expression.test.tsx create mode 100644 packages/emitter-framework/src/python/components/record-expression/record-expression.tsx create mode 100644 packages/emitter-framework/src/python/components/type-alias-declaration/type-alias-declaration.test.tsx create mode 100644 packages/emitter-framework/src/python/components/type-alias-declaration/type-alias-declaration.tsx create mode 100644 packages/emitter-framework/src/python/components/type-expression/type-expression.test.tsx create mode 100644 packages/emitter-framework/src/python/components/type-expression/type-expression.tsx create mode 100644 packages/emitter-framework/src/python/test-utils.tsx create mode 100644 packages/emitter-framework/src/python/utils/refkey.ts diff --git a/packages/emitter-framework/src/python/builtins.ts b/packages/emitter-framework/src/python/builtins.ts new file mode 100644 index 00000000000..1f47ce7122e --- /dev/null +++ b/packages/emitter-framework/src/python/builtins.ts @@ -0,0 +1,26 @@ +import type { SymbolCreator } from "@alloy-js/core"; +import { createModule } from "@alloy-js/python"; + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +type dummy = SymbolCreator; + +export const datetimeModule = createModule({ + name: "datetime", + descriptor: { + ".": ["datetime", "date", "time", "timedelta", "timezone"], + }, +}); + +export const decimalModule = createModule({ + name: "decimal", + descriptor: { + ".": ["Decimal"], + }, +}); + +export const typingModule = createModule({ + name: "typing", + descriptor: { + ".": ["Any", "NoReturn", "Tuple"], + }, +}); diff --git a/packages/emitter-framework/src/python/components/array-expression/array-expression.test.tsx b/packages/emitter-framework/src/python/components/array-expression/array-expression.test.tsx new file mode 100644 index 00000000000..63571aa637c --- /dev/null +++ b/packages/emitter-framework/src/python/components/array-expression/array-expression.test.tsx @@ -0,0 +1,41 @@ +import { render, type Children } from "@alloy-js/core"; +import { d } from "@alloy-js/core/testing"; +import { SourceFile } from "@alloy-js/python"; +import type { BasicTestRunner } from "@typespec/compiler/testing"; +import { beforeEach, describe, it } from "vitest"; +import { Output } from "../../../../src/core/components/output.jsx"; +import { createEmitterFrameworkTestRunner } from "../../test-host.js"; +import { assertFileContents, compileModelPropertyType, getExternals } from "../../test-utils.js"; +import { TypeExpression } from "../type-expression/type-expression.jsx"; + +let runner: BasicTestRunner; + +beforeEach(async () => { + runner = await createEmitterFrameworkTestRunner(); +}); + +function Wrapper(props: { children: Children }) { + return ( + + {props.children} + + ); +} + +describe("map array expression to Python list", () => { + it.each([["string[]", "list[str]"]])("%s => %s", async (tspType, pythonType) => { + const type = await compileModelPropertyType(tspType, runner); + const res = render( + + + , + ); + + assertFileContents( + res, + d` + ${pythonType} + `, + ); + }); +}); diff --git a/packages/emitter-framework/src/python/components/array-expression/array-expression.tsx b/packages/emitter-framework/src/python/components/array-expression/array-expression.tsx new file mode 100644 index 00000000000..68173b0a10f --- /dev/null +++ b/packages/emitter-framework/src/python/components/array-expression/array-expression.tsx @@ -0,0 +1,11 @@ +import { code } from "@alloy-js/core"; +import type { Type } from "@typespec/compiler"; +import { TypeExpression } from "../type-expression/type-expression.js"; + +export interface ArrayExpressionProps { + elementType: Type; +} + +export function ArrayExpression({ elementType }: ArrayExpressionProps) { + return code`list[${()}]`; +} diff --git a/packages/emitter-framework/src/python/components/record-expression/record-expression.test.tsx b/packages/emitter-framework/src/python/components/record-expression/record-expression.test.tsx new file mode 100644 index 00000000000..dcc5b994b43 --- /dev/null +++ b/packages/emitter-framework/src/python/components/record-expression/record-expression.test.tsx @@ -0,0 +1,41 @@ +import { render, type Children } from "@alloy-js/core"; +import { d } from "@alloy-js/core/testing"; +import { SourceFile } from "@alloy-js/python"; +import type { BasicTestRunner } from "@typespec/compiler/testing"; +import { beforeEach, describe, it } from "vitest"; +import { Output } from "../../../../src/core/components/output.jsx"; +import { createEmitterFrameworkTestRunner } from "../../test-host.js"; +import { assertFileContents, compileModelPropertyType, getExternals } from "../../test-utils.js"; +import { TypeExpression } from "../type-expression/type-expression.jsx"; + +let runner: BasicTestRunner; + +beforeEach(async () => { + runner = await createEmitterFrameworkTestRunner(); +}); + +function Wrapper(props: { children: Children }) { + return ( + + {props.children} + + ); +} + +describe("map Record to Python dict", () => { + it.each([["Record", "dict[str, bool]"]])("%s => %s", async (tspType, pythonType) => { + const type = await compileModelPropertyType(tspType, runner); + const res = render( + + + , + ); + + assertFileContents( + res, + d` + ${pythonType} + `, + ); + }); +}); diff --git a/packages/emitter-framework/src/python/components/record-expression/record-expression.tsx b/packages/emitter-framework/src/python/components/record-expression/record-expression.tsx new file mode 100644 index 00000000000..bd6ba683210 --- /dev/null +++ b/packages/emitter-framework/src/python/components/record-expression/record-expression.tsx @@ -0,0 +1,13 @@ +import { code } from "@alloy-js/core"; +import type { Type } from "@typespec/compiler"; +import { TypeExpression } from "../type-expression/type-expression.js"; + +export interface RecordExpressionProps { + elementType: Type; +} + +export function RecordExpression({ elementType }: RecordExpressionProps) { + return code` + dict[str, ${()}] + `; +} diff --git a/packages/emitter-framework/src/python/components/type-alias-declaration/type-alias-declaration.test.tsx b/packages/emitter-framework/src/python/components/type-alias-declaration/type-alias-declaration.test.tsx new file mode 100644 index 00000000000..9e4c4d4f18a --- /dev/null +++ b/packages/emitter-framework/src/python/components/type-alias-declaration/type-alias-declaration.test.tsx @@ -0,0 +1,150 @@ +import { SourceFile } from "@alloy-js/python"; +import type { Namespace } from "@typespec/compiler"; +import { describe, expect, it } from "vitest"; +import { Output } from "../../../../src/core/components/output.jsx"; +import { getProgram } from "../../test-host.js"; +import { getExternals } from "../../test-utils.js"; +import { TypeAliasDeclaration } from "./type-alias-declaration.jsx"; + +describe("Python Declaration equivalency to Type Alias", () => { + describe("Type Alias Declaration bound to Typespec Scalar", () => { + describe("Scalar extends utcDateTime", () => { + it("creates a type alias declaration for a utcDateTime without encoding", async () => { + const program = await getProgram(` + namespace DemoService; + scalar MyDate extends utcDateTime; + `); + + const [namespace] = program.resolveTypeReference("DemoService"); + const scalar = Array.from((namespace as Namespace).scalars.values())[0]; + + expect( + + + + + , + ).toRenderTo(` + from datetime import datetime + + MyDate: datetime`); + }); + + it("creates a type alias declaration with JSDoc", async () => { + const program = await getProgram(` + namespace DemoService; + /** + * Type to represent a date + */ + scalar MyDate extends utcDateTime; + `); + + const [namespace] = program.resolveTypeReference("DemoService"); + const scalar = Array.from((namespace as Namespace).scalars.values())[0]; + + expect( + + + + + , + ).toRenderTo(` + from datetime import datetime + + # Type to represent a date + MyDate: datetime`); + }); + + it("can override JSDoc", async () => { + const program = await getProgram(` + namespace DemoService; + /** + * Type to represent a date + */ + scalar MyDate extends utcDateTime; + `); + + const [namespace] = program.resolveTypeReference("DemoService"); + const scalar = Array.from((namespace as Namespace).scalars.values())[0]; + + expect( + + + + + , + ).toRenderTo(` + from datetime import datetime + + # Overridden Doc + MyDate: datetime`); + }); + + it("creates a type alias declaration for a utcDateTime with unixTimeStamp encoding", async () => { + const program = await getProgram(` + namespace DemoService; + @encode("unixTimestamp", int32) + scalar MyDate extends utcDateTime; + `); + + const [namespace] = program.resolveTypeReference("DemoService"); + const scalar = Array.from((namespace as Namespace).scalars.values())[0]; + + expect( + + + + + , + ).toRenderTo(` + from datetime import datetime + + MyDate: datetime`); + }); + + it("creates a type alias declaration for a utcDateTime with rfc7231 encoding", async () => { + const program = await getProgram(` + namespace DemoService; + @encode("rfc7231") + scalar MyDate extends utcDateTime; + `); + + const [namespace] = program.resolveTypeReference("DemoService"); + const scalar = Array.from((namespace as Namespace).scalars.values())[0]; + + expect( + + + + + , + ).toRenderTo(` + from datetime import datetime + + MyDate: datetime`); + }); + + it("creates a type alias declaration for a utcDateTime with rfc3339 encoding", async () => { + const program = await getProgram(` + namespace DemoService; + @encode("rfc3339") + scalar MyDate extends utcDateTime; + `); + + const [namespace] = program.resolveTypeReference("DemoService"); + const scalar = Array.from((namespace as Namespace).scalars.values())[0]; + + expect( + + + + + , + ).toRenderTo(` + from datetime import datetime + + MyDate: datetime`); + }); + }); + }); +}); diff --git a/packages/emitter-framework/src/python/components/type-alias-declaration/type-alias-declaration.tsx b/packages/emitter-framework/src/python/components/type-alias-declaration/type-alias-declaration.tsx new file mode 100644 index 00000000000..ce77a067a5f --- /dev/null +++ b/packages/emitter-framework/src/python/components/type-alias-declaration/type-alias-declaration.tsx @@ -0,0 +1,55 @@ +import * as py from "@alloy-js/python"; +import type { Type } from "@typespec/compiler"; +import { useTsp } from "../../../core/context/tsp-context.js"; +import { reportDiagnostic } from "../../../lib.js"; +import { declarationRefkeys } from "../../utils/refkey.js"; +import { TypeExpression } from "../type-expression/type-expression.jsx"; + +export interface TypedAliasDeclarationProps extends Omit { + type: Type; + name?: string; +} + +/** + * Create a Python type alias declaration. Pass the `type` prop to emit the + * type alias as the provided TypeSpec type. + */ +export function TypeAliasDeclaration(props: TypedAliasDeclarationProps) { + const { $ } = useTsp(); + + const originalName = + props.name ?? + ("name" in props.type && typeof props.type.name === "string" ? props.type.name : ""); + + if (!originalName || originalName === "") { + reportDiagnostic($.program, { code: "type-declaration-missing-name", target: props.type }); + } + + const doc = props.doc ?? $.type.getDoc(props.type); + const refkeys = declarationRefkeys(props.refkey, props.type); + + const name = py.usePythonNamePolicy().getName(originalName, "variable"); + // TODO: See how we will handle this kind of scenario: + // type Foo { + // bar(id: String): BarResponse + // + // Bar = Callable[[string], BarResponse] + // class Foo: + // bar: Bar + // + // Maybe this won't done by this emitter, but we might want that eventually to be done by some emitter. + // + return ( + // TODO: See if there's a need to make py.VariableDeclaration consider props.children + // (it doesn't at this moment, and there isn't a scenario where we need it) + } + > + {props.children} + + ); +} diff --git a/packages/emitter-framework/src/python/components/type-expression/type-expression.test.tsx b/packages/emitter-framework/src/python/components/type-expression/type-expression.test.tsx new file mode 100644 index 00000000000..863ca769a7a --- /dev/null +++ b/packages/emitter-framework/src/python/components/type-expression/type-expression.test.tsx @@ -0,0 +1,145 @@ +import { render, type Children } from "@alloy-js/core"; +import { d } from "@alloy-js/core/testing"; +import { SourceFile } from "@alloy-js/python"; +import type { BasicTestRunner } from "@typespec/compiler/testing"; +import { beforeEach, describe, it } from "vitest"; +import { Output } from "../../../../src/core/components/output.jsx"; +import { createEmitterFrameworkTestRunner } from "../../test-host.js"; +import { + assertFileContents, + compileCodeModelPropertyType, + compileModelProperty, + compileModelPropertyType, + getExternals, +} from "../../test-utils.js"; +import { TypeExpression } from "./type-expression.jsx"; + +let runner: BasicTestRunner; + +beforeEach(async () => { + runner = await createEmitterFrameworkTestRunner(); +}); + +function Wrapper(props: { children: Children }) { + return ( + + {props.children} + + ); +} + +describe("map Typespec types to Python built-in types", () => { + it.each([ + ["unknown", "Any", "from typing import Any"], + ["string", "str"], + ["boolean", "bool"], + ["null", "None"], + ["void", "None"], + ["never", "NoReturn", "from typing import NoReturn"], + ["bytes", "bytes"], + ["numeric", "number"], + ["integer", "int"], + ["float", "float"], + ["decimal", "Decimal", "from decimal import Decimal"], + ["decimal128", "Decimal", "from decimal import Decimal"], + ["int64", "int"], + ["int32", "int"], + ["int16", "int"], + ["int8", "int"], + ["safeint", "int"], + ["uint64", "int"], + ["uint32", "int"], + ["uint16", "int"], + ["uint8", "int"], + ["float32", "float"], + ["float64", "float"], + ["plainDate", "str"], + ["plainTime", "str"], + ["utcDateTime", "datetime", "from datetime import datetime"], + ["offsetDateTime", "str"], + ["duration", "str"], + ["url", "str"], + ])("%s => %s", async (tspType, pythonType, extraImport = "") => { + const type = await compileModelPropertyType(tspType, runner); + const res = render( + + + , + ); + const extraImportText = extraImport ? `${extraImport}\n\n` : ""; + + assertFileContents( + res, + d` + ${extraImportText}${pythonType} + `, + ); + }); +}); + +// TODO: Add extra test for when we have Scalar types defined and with references +describe("map scalar to Python types", () => { + it("Email => Email", async () => { + const type = await compileCodeModelPropertyType( + d` + scalar Email extends string; + model Test { + @test test: Email; + } + `, + runner, + ); + const res = render( + + + , + ); + + assertFileContents( + res, + d` + ${"str"} + `, + ); + }); +}); + +describe("map tuple to Python types", () => { + it.each([["[int32, int32]", "Tuple[int, int]"]])("%s => %s", async (tspType, pythonType) => { + const type = await compileModelPropertyType(tspType, runner); + const res = render( + + + , + ); + + assertFileContents( + res, + d` + from typing import Tuple + + ${pythonType} + `, + ); + }); +}); + +describe("correctly solves a ModelProperty to Python types", () => { + it.each([["[int32, int32]", "Tuple[int, int]"]])("%s => %s", async (tspType, pythonType) => { + const type = await compileModelProperty(tspType, runner); + const res = render( + + + , + ); + + assertFileContents( + res, + d` + from typing import Tuple + + ${pythonType} + `, + ); + }); +}); diff --git a/packages/emitter-framework/src/python/components/type-expression/type-expression.tsx b/packages/emitter-framework/src/python/components/type-expression/type-expression.tsx new file mode 100644 index 00000000000..a554057372e --- /dev/null +++ b/packages/emitter-framework/src/python/components/type-expression/type-expression.tsx @@ -0,0 +1,180 @@ +import { For } from "@alloy-js/core"; +import * as py from "@alloy-js/python"; +import type { IntrinsicType, Model, Scalar, Type } from "@typespec/compiler"; +import type { Typekit } from "@typespec/compiler/typekit"; +import "@typespec/http/experimental/typekit"; +import { useTsp } from "../../../core/context/tsp-context.js"; +import { reportPythonDiagnostic } from "../../../python/lib.js"; +import { datetimeModule, decimalModule, typingModule } from "../../builtins.js"; +import { efRefkey } from "../../utils/refkey.js"; +import { ArrayExpression } from "../array-expression/array-expression.js"; +import { RecordExpression } from "../record-expression/record-expression.js"; + +export interface TypeExpressionProps { + type: Type; + + /** + * Whether to disallow references. Setting this will force the type to be + * emitted inline, even if it is a declaration that would otherwise be + * referenced. + */ + noReference?: boolean; +} + +export function TypeExpression(props: TypeExpressionProps) { + const { $ } = useTsp(); + const type = $.httpPart.unpack(props.type); + if (!props.noReference && isDeclaration($, type)) { + return ; + } + + // TODO: Make sure this is an exhaustive switch, including EnumMember and such + switch (type.kind) { + case "Scalar": // Custom types based on primitives (Intrinsics) + case "Intrinsic": // Language primitives like `string`, `number`, etc. + return <>{getScalarIntrinsicExpression($, type)}; + case "Boolean": + case "Number": + case "String": + return ; + case "Tuple": + return ( + <> + {typingModule["."]["Tuple"]}[ + + {(element) => } + + ] + + ); + case "ModelProperty": + return ; + case "Model": + if ($.array.is(type)) { + const elementType = type.indexer!.value; + return ; + } + + if ($.record.is(type)) { + const elementType = (type as Model).indexer!.value; + return ; + } + + if ($.httpPart.is(type)) { + const partType = $.httpPart.unpack(type); + return ; + } + + // TODO: Models will be implemented separately + // return ; + // TODO: Functions will be implemented separately + // case "Operation": + // return ; + default: + reportPythonDiagnostic($.program, { code: "python-unsupported-type", target: type }); + return "any"; + } +} + +const intrinsicNameToPythonType = new Map([ + // Core types + ["unknown", "Any"], // Matches Python's `Any` + ["string", "str"], // Matches Python's `str` + ["boolean", "bool"], // Matches Python's `bool` + ["null", "None"], // Matches Python's `None` + ["void", "None"], // Matches Python's `None` + ["never", "NoReturn"], // Matches Python's `NoReturn` + ["bytes", "bytes"], // Matches Python's `bytes` + + // Numeric types + ["numeric", "number"], // Parent type for all numeric types + ["integer", "int"], // Broad integer category, maps to `int` + ["float", "float"], // Broad float category, maps to `float` + ["decimal", "Decimal"], // Broad decimal category, maps to `Decimal` + ["decimal128", "Decimal"], // 128-bit decimal category, maps to `Decimal` + ["int64", "int"], // Use `int` to handle large 64-bit integers + ["int32", "int"], // 32-bit integer fits in Python's `int` + ["int16", "int"], // 16-bit integer + ["int8", "int"], // 8-bit integer + ["safeint", "int"], // Safe integer fits within Python limits + ["uint64", "int"], // Use `int` for unsigned 64-bit integers + ["uint32", "int"], // 32-bit unsigned integer + ["uint16", "int"], // 16-bit unsigned integer + ["uint8", "int"], // 8-bit unsigned integer + ["float32", "float"], // Maps to Python's `float` + ["float64", "float"], // Maps to Python's `float`. + + // Date and time types + ["plainDate", "str"], // Use `str` for plain calendar dates + ["plainTime", "str"], // Use `str` for plain clock times + ["utcDateTime", "datetime"], // Use `datetime` for UTC date-times + ["offsetDateTime", "str"], // Use `str` for timezone-specific date-times + ["duration", "str"], // Duration as an ISO 8601 string or custom format + + // String types + ["url", "str"], // Matches Python's `str` +]); + +const pythonTypeToImport = new Map([ + ["Any", typingModule["."]["Any"]], + ["NoReturn", typingModule["."]["NoReturn"]], + ["Tuple", typingModule["."]["Tuple"]], + ["datetime", datetimeModule["."]["datetime"]], + ["Decimal", decimalModule["."]["Decimal"]], +]); + +function getScalarIntrinsicExpression($: Typekit, type: Scalar | IntrinsicType): string | null { + let intrinsicName: string; + if ($.scalar.is(type)) { + if ($.scalar.isUtcDateTime(type) || $.scalar.extendsUtcDateTime(type)) { + const encoding = $.scalar.getEncoding(type); + intrinsicName = "utcDateTime"; + switch (encoding?.encoding) { + case "unixTimestamp": + case "rfc7231": + case "rfc3339": + default: + intrinsicName = `utcDateTime`; + break; + } + } + intrinsicName = $.scalar.getStdBase(type)?.name ?? ""; + } else { + intrinsicName = type.name; + } + + let pythonType = intrinsicNameToPythonType.get(intrinsicName); + const importModule = pythonTypeToImport.get(pythonType ?? ""); + pythonType = importModule ? importModule : pythonType; + + if (!pythonType) { + reportPythonDiagnostic($.program, { code: "python-unsupported-scalar", target: type }); + return "any"; + } + + return pythonType; +} + +function isDeclaration($: Typekit, type: Type): boolean { + switch (type.kind) { + case "Namespace": + case "Interface": + case "Enum": + case "Operation": + case "EnumMember": + return true; + case "UnionVariant": + return false; + + case "Model": + if ($.array.is(type) || $.record.is(type)) { + return false; + } + + return Boolean(type.name); + case "Union": + return Boolean(type.name); + default: + return false; + } +} diff --git a/packages/emitter-framework/src/python/test-utils.tsx b/packages/emitter-framework/src/python/test-utils.tsx new file mode 100644 index 00000000000..5313cd475af --- /dev/null +++ b/packages/emitter-framework/src/python/test-utils.tsx @@ -0,0 +1,64 @@ +import { type Children, type OutputDirectory, render } from "@alloy-js/core"; +import { Output as StcOutput, SourceFile as StcSourceFile } from "@alloy-js/core/stc"; +import type { Program } from "@typespec/compiler"; +import { type ModelProperty } from "@typespec/compiler"; +import type { BasicTestRunner } from "@typespec/compiler/testing"; +import { assert } from "vitest"; +import { datetimeModule, decimalModule, typingModule } from "./builtins.js"; +import { getProgram } from "./test-host.js"; + +// Reimplementing so we can set the correct extensions +export async function getEmitOutput(tspCode: string, cb: (program: Program) => Children) { + const program = await getProgram(tspCode); + + const res = render( + StcOutput().children(StcSourceFile({ path: "test.py", filetype: "py" }).children(cb(program))), + ); + const testFile = res.contents.find((file) => file.path === "test.py")!; + assert("contents" in testFile, "test.py file does not have contents"); + return testFile.contents; +} + +// Reimplementing so we can set the correct extensions +export function assertFileContents(res: OutputDirectory, contents: string) { + const testFile = res.contents.find((file) => file.path === "test.py")!; + assert(testFile, "test.py file not rendered"); + assert("contents" in testFile, "test.py file does not have contents"); + assert.equal(testFile.contents, contents); +} + +export function getExternals() { + return [datetimeModule, decimalModule, typingModule]; +} + +export async function compileCode(code: string, runner: BasicTestRunner) { + const { test } = await runner.compile(code); + return test; +} + +export async function compileCodeModelProperty(code: string, runner: BasicTestRunner) { + const test = await compileCode(code, runner); + return test as ModelProperty; +} + +export async function compileCodeModelPropertyType(code: string, runner: BasicTestRunner) { + const property = await compileCodeModelProperty(code, runner); + return property.type; +} + +export async function compileModelProperty(ref: string, runner: BasicTestRunner) { + const test = await compileCode( + ` + model Test { + @test test: ${ref}; + } + `, + runner, + ); + + return test as ModelProperty; +} + +export async function compileModelPropertyType(ref: string, runner: BasicTestRunner) { + return (await compileModelProperty(ref, runner)).type; +} diff --git a/packages/emitter-framework/src/python/utils/refkey.ts b/packages/emitter-framework/src/python/utils/refkey.ts new file mode 100644 index 00000000000..8beaf1edcdc --- /dev/null +++ b/packages/emitter-framework/src/python/utils/refkey.ts @@ -0,0 +1,36 @@ +import { refkey as ayRefkey, type Refkey } from "@alloy-js/core"; + +const refKeyPrefix = Symbol.for("emitter-framework:python"); + +/** + * A wrapper around `refkey` that uses a custom symbol to avoid collisions with + * other libraries that use `refkey`. + * + * @remarks + * + * The underlying refkey function is called with the {@link refKeyPrefix} symbol as the first argument. + * + * @param args The parameters of the refkey. + * @returns A refkey object that can be used to identify the value. + */ +export function efRefkey(...args: unknown[]): Refkey { + if (args.length === 0) { + return ayRefkey(); // Generates a unique refkey + } + return ayRefkey(refKeyPrefix, ...args); +} + +/** + * Creates a refkey for a declaration by combining the provided refkey with an internal + * refkey generated from the provided arguments. + * + * @param refkey The refkey provided by the user to be passed as is. + * @param args The parameters of the refkey. + * @returns An array of refkeys that can be passed to an Alloy declaration. + */ +export function declarationRefkeys(refkey?: Refkey | Refkey[], ...args: unknown[]): Refkey[] { + if (refkey) { + return [refkey, efRefkey(...args)].flat(); + } + return [efRefkey(...args)]; +} From 2006978858fb202ce75d447362f3a1ae75c5befd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Gardini?= Date: Thu, 14 Aug 2025 13:58:41 -0300 Subject: [PATCH 06/25] Unify test utils (#42) * Add Atom * Add typing * Fix * Fix * Add typing * Fix * Unify test utils * pnpm format * Remove exports * Fix comment * Add TODOs --- .../array-expression.test.tsx | 29 ++------ .../function-declaration.test.tsx | 12 +--- .../record-expression.test.tsx | 29 ++------ .../type-alias-declaration.test.tsx | 65 ++++-------------- .../type-expression/type-expression.test.tsx | 68 ++++--------------- .../src/python/test-utils.tsx | 17 ++++- 6 files changed, 56 insertions(+), 164 deletions(-) diff --git a/packages/emitter-framework/src/python/components/array-expression/array-expression.test.tsx b/packages/emitter-framework/src/python/components/array-expression/array-expression.test.tsx index 63571aa637c..998afb0bf31 100644 --- a/packages/emitter-framework/src/python/components/array-expression/array-expression.test.tsx +++ b/packages/emitter-framework/src/python/components/array-expression/array-expression.test.tsx @@ -1,11 +1,8 @@ -import { render, type Children } from "@alloy-js/core"; import { d } from "@alloy-js/core/testing"; -import { SourceFile } from "@alloy-js/python"; import type { BasicTestRunner } from "@typespec/compiler/testing"; -import { beforeEach, describe, it } from "vitest"; -import { Output } from "../../../../src/core/components/output.jsx"; +import { beforeEach, describe, expect, it } from "vitest"; import { createEmitterFrameworkTestRunner } from "../../test-host.js"; -import { assertFileContents, compileModelPropertyType, getExternals } from "../../test-utils.js"; +import { compileModelPropertyType, getOutput } from "../../test-utils.js"; import { TypeExpression } from "../type-expression/type-expression.jsx"; let runner: BasicTestRunner; @@ -14,28 +11,12 @@ beforeEach(async () => { runner = await createEmitterFrameworkTestRunner(); }); -function Wrapper(props: { children: Children }) { - return ( - - {props.children} - - ); -} - describe("map array expression to Python list", () => { it.each([["string[]", "list[str]"]])("%s => %s", async (tspType, pythonType) => { const type = await compileModelPropertyType(tspType, runner); - const res = render( - - - , - ); - assertFileContents( - res, - d` - ${pythonType} - `, - ); + expect(getOutput(runner.program, [])).toRenderTo(d` + ${pythonType} + `); }); }); diff --git a/packages/emitter-framework/src/python/components/function-declaration/function-declaration.test.tsx b/packages/emitter-framework/src/python/components/function-declaration/function-declaration.test.tsx index b4bee327bd0..31efa09c7f2 100644 --- a/packages/emitter-framework/src/python/components/function-declaration/function-declaration.test.tsx +++ b/packages/emitter-framework/src/python/components/function-declaration/function-declaration.test.tsx @@ -1,9 +1,9 @@ -import { SourceFile } from "@alloy-js/typescript"; import type { Namespace } from "@typespec/compiler"; import { describe, expect, it } from "vitest"; -import { Output } from "../../../../src/core/components/output.jsx"; import { getProgram } from "../../test-host.js"; +import { getOutput } from "../../test-utils.js"; import { FunctionDeclaration } from "./function-declaration.jsx"; + describe("Typescript Function Declaration", () => { describe("Function bound to Typespec Types", () => { describe("Bound to Operation", () => { @@ -16,13 +16,7 @@ describe("Typescript Function Declaration", () => { const [namespace] = program.resolveTypeReference("DemoService"); const operation = Array.from((namespace as Namespace).operations.values())[0]; - expect( - - - - - , - ).toRenderTo(` + expect(getOutput(program, [])).toRenderTo(` def get_name(id: str) -> str: pass diff --git a/packages/emitter-framework/src/python/components/record-expression/record-expression.test.tsx b/packages/emitter-framework/src/python/components/record-expression/record-expression.test.tsx index dcc5b994b43..ff28b01a971 100644 --- a/packages/emitter-framework/src/python/components/record-expression/record-expression.test.tsx +++ b/packages/emitter-framework/src/python/components/record-expression/record-expression.test.tsx @@ -1,11 +1,8 @@ -import { render, type Children } from "@alloy-js/core"; import { d } from "@alloy-js/core/testing"; -import { SourceFile } from "@alloy-js/python"; import type { BasicTestRunner } from "@typespec/compiler/testing"; -import { beforeEach, describe, it } from "vitest"; -import { Output } from "../../../../src/core/components/output.jsx"; +import { beforeEach, describe, expect, it } from "vitest"; import { createEmitterFrameworkTestRunner } from "../../test-host.js"; -import { assertFileContents, compileModelPropertyType, getExternals } from "../../test-utils.js"; +import { compileModelPropertyType, getOutput } from "../../test-utils.js"; import { TypeExpression } from "../type-expression/type-expression.jsx"; let runner: BasicTestRunner; @@ -14,28 +11,12 @@ beforeEach(async () => { runner = await createEmitterFrameworkTestRunner(); }); -function Wrapper(props: { children: Children }) { - return ( - - {props.children} - - ); -} - describe("map Record to Python dict", () => { it.each([["Record", "dict[str, bool]"]])("%s => %s", async (tspType, pythonType) => { const type = await compileModelPropertyType(tspType, runner); - const res = render( - - - , - ); - assertFileContents( - res, - d` - ${pythonType} - `, - ); + expect(getOutput(runner.program, [])).toRenderTo(d` + ${pythonType} + `); }); }); diff --git a/packages/emitter-framework/src/python/components/type-alias-declaration/type-alias-declaration.test.tsx b/packages/emitter-framework/src/python/components/type-alias-declaration/type-alias-declaration.test.tsx index 9e4c4d4f18a..5a7233c9596 100644 --- a/packages/emitter-framework/src/python/components/type-alias-declaration/type-alias-declaration.test.tsx +++ b/packages/emitter-framework/src/python/components/type-alias-declaration/type-alias-declaration.test.tsx @@ -1,9 +1,7 @@ -import { SourceFile } from "@alloy-js/python"; import type { Namespace } from "@typespec/compiler"; import { describe, expect, it } from "vitest"; -import { Output } from "../../../../src/core/components/output.jsx"; import { getProgram } from "../../test-host.js"; -import { getExternals } from "../../test-utils.js"; +import { getOutput } from "../../test-utils.js"; import { TypeAliasDeclaration } from "./type-alias-declaration.jsx"; describe("Python Declaration equivalency to Type Alias", () => { @@ -18,16 +16,10 @@ describe("Python Declaration equivalency to Type Alias", () => { const [namespace] = program.resolveTypeReference("DemoService"); const scalar = Array.from((namespace as Namespace).scalars.values())[0]; - expect( - - - - - , - ).toRenderTo(` + expect(getOutput(program, [])).toRenderTo(` from datetime import datetime - MyDate: datetime`); + my_date: datetime`); }); it("creates a type alias declaration with JSDoc", async () => { @@ -42,17 +34,11 @@ describe("Python Declaration equivalency to Type Alias", () => { const [namespace] = program.resolveTypeReference("DemoService"); const scalar = Array.from((namespace as Namespace).scalars.values())[0]; - expect( - - - - - , - ).toRenderTo(` + expect(getOutput(program, [])).toRenderTo(` from datetime import datetime # Type to represent a date - MyDate: datetime`); + my_date: datetime`); }); it("can override JSDoc", async () => { @@ -67,17 +53,12 @@ describe("Python Declaration equivalency to Type Alias", () => { const [namespace] = program.resolveTypeReference("DemoService"); const scalar = Array.from((namespace as Namespace).scalars.values())[0]; - expect( - - - - - , - ).toRenderTo(` + expect(getOutput(program, [])) + .toRenderTo(` from datetime import datetime # Overridden Doc - MyDate: datetime`); + my_date: datetime`); }); it("creates a type alias declaration for a utcDateTime with unixTimeStamp encoding", async () => { @@ -90,16 +71,10 @@ describe("Python Declaration equivalency to Type Alias", () => { const [namespace] = program.resolveTypeReference("DemoService"); const scalar = Array.from((namespace as Namespace).scalars.values())[0]; - expect( - - - - - , - ).toRenderTo(` + expect(getOutput(program, [])).toRenderTo(` from datetime import datetime - MyDate: datetime`); + my_date: datetime`); }); it("creates a type alias declaration for a utcDateTime with rfc7231 encoding", async () => { @@ -112,16 +87,10 @@ describe("Python Declaration equivalency to Type Alias", () => { const [namespace] = program.resolveTypeReference("DemoService"); const scalar = Array.from((namespace as Namespace).scalars.values())[0]; - expect( - - - - - , - ).toRenderTo(` + expect(getOutput(program, [])).toRenderTo(` from datetime import datetime - MyDate: datetime`); + my_date: datetime`); }); it("creates a type alias declaration for a utcDateTime with rfc3339 encoding", async () => { @@ -134,16 +103,10 @@ describe("Python Declaration equivalency to Type Alias", () => { const [namespace] = program.resolveTypeReference("DemoService"); const scalar = Array.from((namespace as Namespace).scalars.values())[0]; - expect( - - - - - , - ).toRenderTo(` + expect(getOutput(program, [])).toRenderTo(` from datetime import datetime - MyDate: datetime`); + my_date: datetime`); }); }); }); diff --git a/packages/emitter-framework/src/python/components/type-expression/type-expression.test.tsx b/packages/emitter-framework/src/python/components/type-expression/type-expression.test.tsx index 863ca769a7a..97f05444db6 100644 --- a/packages/emitter-framework/src/python/components/type-expression/type-expression.test.tsx +++ b/packages/emitter-framework/src/python/components/type-expression/type-expression.test.tsx @@ -1,16 +1,14 @@ -import { render, type Children } from "@alloy-js/core"; +import { render } from "@alloy-js/core"; import { d } from "@alloy-js/core/testing"; -import { SourceFile } from "@alloy-js/python"; import type { BasicTestRunner } from "@typespec/compiler/testing"; -import { beforeEach, describe, it } from "vitest"; -import { Output } from "../../../../src/core/components/output.jsx"; +import { beforeEach, describe, expect, it } from "vitest"; import { createEmitterFrameworkTestRunner } from "../../test-host.js"; import { assertFileContents, compileCodeModelPropertyType, compileModelProperty, compileModelPropertyType, - getExternals, + getOutput, } from "../../test-utils.js"; import { TypeExpression } from "./type-expression.jsx"; @@ -20,14 +18,6 @@ beforeEach(async () => { runner = await createEmitterFrameworkTestRunner(); }); -function Wrapper(props: { children: Children }) { - return ( - - {props.children} - - ); -} - describe("map Typespec types to Python built-in types", () => { it.each([ ["unknown", "Any", "from typing import Any"], @@ -61,19 +51,11 @@ describe("map Typespec types to Python built-in types", () => { ["url", "str"], ])("%s => %s", async (tspType, pythonType, extraImport = "") => { const type = await compileModelPropertyType(tspType, runner); - const res = render( - - - , - ); const extraImportText = extraImport ? `${extraImport}\n\n` : ""; - assertFileContents( - res, - d` - ${extraImportText}${pythonType} - `, - ); + expect(getOutput(runner.program, [])).toRenderTo(d` + ${extraImportText}${pythonType} + `); }); }); @@ -89,11 +71,7 @@ describe("map scalar to Python types", () => { `, runner, ); - const res = render( - - - , - ); + const res = render(getOutput(runner.program, [])); assertFileContents( res, @@ -107,39 +85,23 @@ describe("map scalar to Python types", () => { describe("map tuple to Python types", () => { it.each([["[int32, int32]", "Tuple[int, int]"]])("%s => %s", async (tspType, pythonType) => { const type = await compileModelPropertyType(tspType, runner); - const res = render( - - - , - ); - assertFileContents( - res, - d` - from typing import Tuple + expect(getOutput(runner.program, [])).toRenderTo(d` + from typing import Tuple - ${pythonType} - `, - ); + ${pythonType} + `); }); }); describe("correctly solves a ModelProperty to Python types", () => { it.each([["[int32, int32]", "Tuple[int, int]"]])("%s => %s", async (tspType, pythonType) => { const type = await compileModelProperty(tspType, runner); - const res = render( - - - , - ); - assertFileContents( - res, - d` - from typing import Tuple + expect(getOutput(runner.program, [])).toRenderTo(d` + from typing import Tuple - ${pythonType} - `, - ); + ${pythonType} + `); }); }); diff --git a/packages/emitter-framework/src/python/test-utils.tsx b/packages/emitter-framework/src/python/test-utils.tsx index 5313cd475af..90c989c522d 100644 --- a/packages/emitter-framework/src/python/test-utils.tsx +++ b/packages/emitter-framework/src/python/test-utils.tsx @@ -1,9 +1,11 @@ import { type Children, type OutputDirectory, render } from "@alloy-js/core"; import { Output as StcOutput, SourceFile as StcSourceFile } from "@alloy-js/core/stc"; +import { createPythonNamePolicy, SourceFile } from "@alloy-js/python"; import type { Program } from "@typespec/compiler"; import { type ModelProperty } from "@typespec/compiler"; import type { BasicTestRunner } from "@typespec/compiler/testing"; import { assert } from "vitest"; +import { Output } from "../../src/core/components/output.jsx"; import { datetimeModule, decimalModule, typingModule } from "./builtins.js"; import { getProgram } from "./test-host.js"; @@ -27,16 +29,25 @@ export function assertFileContents(res: OutputDirectory, contents: string) { assert.equal(testFile.contents, contents); } -export function getExternals() { +function getExternals() { return [datetimeModule, decimalModule, typingModule]; } -export async function compileCode(code: string, runner: BasicTestRunner) { +export function getOutput(program: Program, children: Children[]): Children { + const policy = createPythonNamePolicy(); + return ( + + {children} + + ); +} + +async function compileCode(code: string, runner: BasicTestRunner) { const { test } = await runner.compile(code); return test; } -export async function compileCodeModelProperty(code: string, runner: BasicTestRunner) { +async function compileCodeModelProperty(code: string, runner: BasicTestRunner) { const test = await compileCode(code, runner); return test as ModelProperty; } From 97a8e9b4036437f0bd88e17971ba739bb3fa40fb Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Thu, 18 Sep 2025 21:16:26 +0000 Subject: [PATCH 07/25] Add models and interfaces --- .../emitter-framework/src/python/builtins.ts | 16 +- .../src/python/components/index.ts | 1 + .../interface-declaration.test.tsx | 380 ++++++++++++++++++ .../interface-declaration.tsx | 275 +++++++++++++ .../model-declaration.test.tsx | 327 +++++++++++++++ .../model-declaration/model-declaration.tsx | 227 +++++++++++ .../src/python/test-utils.tsx | 145 ++++++- .../src/python/utils/operation.ts | 87 ++++ 8 files changed, 1451 insertions(+), 7 deletions(-) create mode 100644 packages/emitter-framework/src/python/components/interface-declaration/interface-declaration.test.tsx create mode 100644 packages/emitter-framework/src/python/components/interface-declaration/interface-declaration.tsx create mode 100644 packages/emitter-framework/src/python/components/model-declaration/model-declaration.test.tsx create mode 100644 packages/emitter-framework/src/python/components/model-declaration/model-declaration.tsx create mode 100644 packages/emitter-framework/src/python/utils/operation.ts diff --git a/packages/emitter-framework/src/python/builtins.ts b/packages/emitter-framework/src/python/builtins.ts index 1f47ce7122e..f25cf2bd010 100644 --- a/packages/emitter-framework/src/python/builtins.ts +++ b/packages/emitter-framework/src/python/builtins.ts @@ -11,6 +11,13 @@ export const datetimeModule = createModule({ }, }); +export const dataclassesModule = createModule({ + name: "dataclasses", + descriptor: { + ".": ["dataclass", "field"], + }, +}); + export const decimalModule = createModule({ name: "decimal", descriptor: { @@ -21,6 +28,13 @@ export const decimalModule = createModule({ export const typingModule = createModule({ name: "typing", descriptor: { - ".": ["Any", "NoReturn", "Tuple"], + ".": ["Any", "Literal", "NoReturn", "Protocol", "Tuple"], + }, +}); + +export const typingExtensionsModule = createModule({ + name: "typing_extensions", + descriptor: { + ".": ["TypedDict"], }, }); diff --git a/packages/emitter-framework/src/python/components/index.ts b/packages/emitter-framework/src/python/components/index.ts index 56499e90f04..dae9ef50776 100644 --- a/packages/emitter-framework/src/python/components/index.ts +++ b/packages/emitter-framework/src/python/components/index.ts @@ -1,2 +1,3 @@ export * from "./atom/atom.jsx"; export * from "./function-declaration/function-declaration.jsx"; +export * from "./model-declaration/model-declaration.jsx"; diff --git a/packages/emitter-framework/src/python/components/interface-declaration/interface-declaration.test.tsx b/packages/emitter-framework/src/python/components/interface-declaration/interface-declaration.test.tsx new file mode 100644 index 00000000000..70cc88f99ed --- /dev/null +++ b/packages/emitter-framework/src/python/components/interface-declaration/interface-declaration.test.tsx @@ -0,0 +1,380 @@ +import { Tester } from "#test/test-host.js"; +import { t, type TesterInstance } from "@typespec/compiler/testing"; +import { beforeEach, describe, expect, it } from "vitest"; +import { InterfaceDeclaration, InterfaceMethod } from "../../components/interface-declaration/interface-declaration.jsx"; +import { getOutput } from "../../test-utils.js"; + +describe("Python Model Declaration - Non-Record", () => { + let runner: TesterInstance; + + beforeEach(async () => { + runner = await Tester.createInstance(); + }); + + it("converts a model with a field that can be null", async () => { + const result = await runner.compile(t.code` + @test model ${t.model("Person")} { + age: int32; + address: string | null; + } + `); + + expect(getOutput(runner.program, [])).toRenderTo(` + from dataclasses import dataclass + + @dataclass + class Person: + age: int + address: str | None + + `); + }); + it("converts a model with an optional field", async () => { + const result = await runner.compile(t.code` + @test model ${t.model("Person")} { + id: int32; + address?: string; + } + `); + + expect(getOutput(runner.program, [])).toRenderTo(` + from dataclasses import dataclass + from dataclasses import field + + @dataclass + class Person: + id: int + address: str = field(default_factory=object) + + `); + }); + it("converts a model with an optional field that has a default", async () => { + const result = await runner.compile(t.code` + @test model ${t.model("Person")} { + age: int32; + address?: string = "N/A"; + } + `); + + expect(getOutput(runner.program, [])).toRenderTo(` + from dataclasses import dataclass + from dataclasses import field + + @dataclass + class Person: + age: int + address: str = field(default="N/A") + + `); + }); + it("converts a model with an optional field that can be null", async () => { + const result = await runner.compile(t.code` + @test model ${t.model("Person")} { + age: int32; + address?: string | null; + } + `); + + expect(getOutput(runner.program, [])).toRenderTo(` + from dataclasses import dataclass + from dataclasses import field + + @dataclass + class Person: + age: int + address: str | None = field(default=None) + + `); + }); + // it("converts a model with a special property type - never", async () => { + // const result = await runner.compile(t.code` + // @test model ${t.model("Address")} { + // state: TState; + // city: string; + // street: string; + // } + // @test model ${t.model("EuropeAddress")} is Address; + // `); + + // expect( + // getOutput(runner.program, [ + // , + // , + // ]), + // ).toRenderTo(` + // from dataclasses import dataclass + + // @dataclass + // class Address: + // state: any + // city: str + // street: str + + + // @dataclass + // class EuropeAddress: + // city: str + // street: str + + // `); + // }); + // it("converts a model that extends a generic with never", async () => { + // const result = await runner.compile(t.code` + // @test model ${t.model("Address")} { + // state: TState; + // city: string; + // } + // @test model ${t.model("EuropeAddress")} extends Address { + // street: string; + // }; + // `); + + // expect( + // getOutput(runner.program, [ + // , + // , + // ]), + // ).toRenderTo(` + // from dataclasses import dataclass + + // @dataclass + // class Address: + // state: any + // city: str + + + // @dataclass + // class EuropeAddress(Address): + // street: str + + // `); + // }); + it("converts a model with model inheritance through extends", async () => { + const result = await runner.compile(t.code` + @test model ${t.model("Identified")} { + id: int32; + } + @test model ${t.model("Admin")} extends Identified { + role: "admin"; + }; + `); + + expect( + getOutput(runner.program, [ + , + , + ]), + ).toRenderTo(` + from dataclasses import dataclass + from typing import Literal + + @dataclass + class Identified: + id: int + + + @dataclass + class Admin(Identified): + role: Literal["admin"] = "admin" + + `); + }); + it("converts a model with model inheritance through spreads", async () => { + const result = await runner.compile(t.code` + @test model ${t.model("Animal")} { + species: string; + } + + @test model ${t.model("Dog")} { + ...Animal; + age: int32; + } + `); + + expect( + getOutput(runner.program, [ + , + , + ]), + ).toRenderTo(` + from dataclasses import dataclass + + @dataclass + class Animal: + species: str + + + @dataclass + class Dog: + species: str + age: int + + `); + }); + it("declares a model with multi line docs, explicit docs passed", async () => { + const result = await runner.compile(t.code` + /** + * This is a test + * with multiple lines + */ + @test model ${t.model("Foo")} { + KnownProp: string; + } + `); + + expect( + getOutput(runner.program, [ + , + ]), + ).toRenderTo(` + from dataclasses import dataclass + + @dataclass + class Foo: + """ + This is a test with multiple lines + """ + known_prop: str + + `); + }); + it("declares a model with multi line docs, docs overridden", async () => { + const result = await runner.compile(t.code` + /** + * This is a test + * with multiple lines + */ + @test model ${t.model("Foo")} { + KnownProp: string; + } + `); + + expect( + getOutput(runner.program, [ + + ]), + ).toRenderTo(` + from dataclasses import dataclass + + @dataclass + class Foo: + """ + This is an overridden doc comment with multiple lines + """ + known_prop: str + + `); + }); + it("declares a model with @doc", async () => { + const result = await runner.compile(t.code` + /** + * This is a test + * with multiple lines + */ + @doc("This is a test") + @test model ${t.model("Foo")} { + knownProp: string; + } + `); + + expect( + getOutput(runner.program, [ + , + ]), + ).toRenderTo(` + from dataclasses import dataclass + + @dataclass + class Foo: + """ + This is a test + """ + known_prop: str + + `); + }); + it("declares a model with a property that has doc", async () => { + const result = await runner.compile(t.code` + /** + * This is a test + */ + @test model ${t.model("Foo")} { + @doc("This is a known property") + knownProp: string; + } + `); + + expect( + getOutput(runner.program, [ + , + ]), + ).toRenderTo(` + from dataclasses import dataclass + + @dataclass + class Foo: + """ + This is a test + """ + # This is a known property + known_prop: str + + `); + }); +}); + +describe("Interfaces", () => { + let runner: TesterInstance; + + beforeEach(async () => { + runner = await Tester.createInstance(); + }); + + it("creates an interface method", async () => { + const result = await runner.compile(t.code` + @test model ${t.model("Item")} { + id: string; + name: string; + } + + @test interface ${t.interface("Person")} { + get(id: string): Item; + put(item: Item): void; + } + `); + + expect( + getOutput(runner.program, [ + , + + + + + ]), + ).toRenderTo(` + from dataclasses import dataclass + from typing import Protocol + + @dataclass + class Item: + id: str + name: str + + + + class Person(Protocol): + @staticmethod + def get(id: str) -> Item: + ... + + @staticmethod + def put(item: Item) -> None: + ... + + + `); + }); +}); diff --git a/packages/emitter-framework/src/python/components/interface-declaration/interface-declaration.tsx b/packages/emitter-framework/src/python/components/interface-declaration/interface-declaration.tsx new file mode 100644 index 00000000000..f0ef9aface9 --- /dev/null +++ b/packages/emitter-framework/src/python/components/interface-declaration/interface-declaration.tsx @@ -0,0 +1,275 @@ +import { code, For, mapJoin, Prose, Show, splitProps, type Children } from "@alloy-js/core"; +import * as py from "@alloy-js/python"; +import { + isNeverType, + type BooleanValue, + type Interface, + type Model, + type ModelProperty, + type NumericValue, + type Operation, + type RekeyableMap, + type StringValue, +} from "@typespec/compiler"; +import type { Typekit } from "@typespec/compiler/typekit"; +import { createRekeyableMap } from "@typespec/compiler/utils"; +import { getHttpPart } from "@typespec/http"; +import { useTsp } from "../../../core/context/tsp-context.js"; +import { reportDiagnostic } from "../../../lib.js"; +import { dataclassesModule, typingModule } from "../../builtins.js"; +import { declarationRefkeys, efRefkey } from "../../utils/refkey.js"; +import { Atom } from "../atom/atom.jsx"; +import { TypeExpression } from "../type-expression/type-expression.jsx"; +import { buildParameterDescriptors, getReturnType } from "#python/utils/operation.js"; + +export interface InterfaceDeclarationProps extends Omit { + type: Model | Interface; + name?: string; +} + +export function InterfaceDeclaration(props: InterfaceDeclarationProps) { + const { $ } = useTsp(); + + const namePolicy = py.usePythonNamePolicy(); + + let name = props.name ?? props.type.name; + + if (!name || name === "") { + reportDiagnostic($.program, { code: "type-declaration-missing-name", target: props.type }); + } + + name = namePolicy.getName(name, "class"); + + let typeMembers: RekeyableMap | undefined; + if ($.model.is(props.type)) { + // Model + typeMembers = $.model.getProperties(props.type); + } else { + // Interface + typeMembers = createRekeyableMap( + (props.type as { operations: Map }).operations, + ); + } + + const validTypeMembers = Array.from(typeMembers.values()).filter((member) => { + if ($.modelProperty.is(member) && isNeverType(member.type)) { + return false; + } + return true; + }); + let modelTypeMembers = null; + if (validTypeMembers.length > 0) { + modelTypeMembers = ( + + {(typeMember) => { + return ; + }} + + ); + } + + const refkeys = declarationRefkeys(props.refkey, props.type); + const basesType = props.bases ?? getExtendsType($, props.type); + const doc = props.doc ?? $.type.getDoc(props.type); + let docElement = null; + if (doc) { + docElement = {doc}]} />; + } + let dataclass: any = null; + let protocolBase: any = null; + if ($.model.is(props.type)) { + dataclass = dataclassesModule["."]["dataclass"]; + } else { + // Interface - use Protocol + protocolBase = typingModule["."]["Protocol"]; + } + + return ( + <> + + @{dataclass} + + + {$.model.is(props.type) ? modelTypeMembers : null} + {props.children && ( + + {(child) => child} + + )} + + + ); +} + +function getExtendsType($: Typekit, type: Model | Interface): Children | undefined { + if (!$.model.is(type)) { + return undefined; + } + + const extending: Children[] = []; + + if (type.baseModel) { + if ($.array.is(type.baseModel)) { + extending.push(); + } else if ($.record.is(type.baseModel)) { + throw new Error("Extension to Record models is not implemented"); + } else { + extending.push(efRefkey(type.baseModel)); + } + } + + const indexType = $.model.getIndexType(type); + if (indexType) { + // Ex.: model Person is Record + if ($.record.is(indexType)) { + throw new Error("Extension to Record models is not implemented"); + } else { + extending.push(); + } + } + + if (extending.length === 0) { + return undefined; + } + + return mapJoin( + () => extending, + (ext) => ext, + { joiner: ", " }, + ); +} + +export interface InterfaceMemberProps { + type: ModelProperty | Operation; + doc?: Children; + optional?: boolean; +} + +export function InterfaceMember(props: InterfaceMemberProps) { + const { $ } = useTsp(); + const doc = props.doc ?? $.type.getDoc(props.type); + const namePolicy = py.usePythonNamePolicy(); + const name = namePolicy.getName(props.type.name, "class-member"); + + if ($.modelProperty.is(props.type)) { + if (isNeverType(props.type.type)) { + return null; + } + + let unpackedType = props.type.type; + let unionType = undefined; + let otherProps = {}; + + const part = getHttpPart($.program, props.type.type); + if (part) { + unpackedType = part.type; + } + let elements = []; + if (unpackedType.kind === "Union") { + elements = (unpackedType as any).options.map((opt: any) => { + return ; + }); + } else if ($.literal.is(unpackedType)) { + const typingElements = ; + elements = [code`${typingModule["."]["Literal"]}[${typingElements}]`]; + } else { + elements = []; + } + unionType = {elements}; + + if ($.literal.is(unpackedType)) { + let value: StringValue | NumericValue | BooleanValue; + if (typeof unpackedType.value === "string") { + value = $.value.createString(unpackedType.value); + } else if (typeof unpackedType.value === "number") { + value = $.value.createNumeric(unpackedType.value); + } else { + value = $.value.createBoolean(unpackedType.value); + } + otherProps = { + initializer: code`${()}`, + }; + } else { + if (props.optional || props.type.optional) { + // Optional field with no default value, use a default_factory to object + // as we can't represent a non-required field in Python's dataclasses + let fieldValue = code`default_factory=object`; + if (props.type.defaultValue) { + // Optional field with default value, default to value + fieldValue = code`default=${()}`; + } + // If one of the union types is null, set default to None + if ( + unpackedType.kind === "Union" && + Array.isArray((unpackedType as any).options) && + (unpackedType as any).options.some( + (opt: any) => opt && opt.kind === "Intrinsic" && opt.name === "null", + ) + ) { + fieldValue = code`default=None`; + } + otherProps = { + initializer: code`${dataclassesModule["."]["field"]}(${fieldValue})`, + }; + } + } + + return ( + + ); + } +} + +export interface InterfaceMethodProps extends Omit { + type: Operation; + name?: string; + doc?: Children; + parametersMode?: "prepend" | "append" | "replace"; +} + +export function InterfaceMethod(props: Readonly) { + const { $ } = useTsp(); + + const [efProps, updateProps, forwardProps] = splitProps( + props, + ["type"], + ["returnType", "parameters"], + ); + + const name = props.name ?? py.usePythonNamePolicy().getName(efProps.type.name, "function"); + const returnType = props.returnType ?? ; + const allParameters = buildParameterDescriptors(efProps.type.parameters, { + params: props.parameters, + mode: props.parametersMode, + }); + + const doc = props.doc ?? $.type.getDoc(props.type); + + return ( + <> + @staticmethod + + + ... + + + ); +} diff --git a/packages/emitter-framework/src/python/components/model-declaration/model-declaration.test.tsx b/packages/emitter-framework/src/python/components/model-declaration/model-declaration.test.tsx new file mode 100644 index 00000000000..90eab27a39c --- /dev/null +++ b/packages/emitter-framework/src/python/components/model-declaration/model-declaration.test.tsx @@ -0,0 +1,327 @@ +import { Tester } from "#test/test-host.js"; +import { t, type TesterInstance } from "@typespec/compiler/testing"; +import { beforeEach, describe, expect, it } from "vitest"; +import { InterfaceDeclaration } from "../../index.jsx"; +import { getOutput } from "../../test-utils.js"; + +describe("Python Model Declaration - Non-Record", () => { + let runner: TesterInstance; + + beforeEach(async () => { + runner = await Tester.createInstance(); + }); + + it("converts a model with a field that can be null", async () => { + const result = await runner.compile(t.code` + @test model ${t.model("Person")} { + age: int32; + address: string | null; + } + `); + + expect(getOutput(runner.program, [])).toRenderTo(` + from dataclasses import dataclass + + @dataclass + class Person: + age: int + address: str | None + + `); + }); + it("converts a model with an optional field", async () => { + const result = await runner.compile(t.code` + @test model ${t.model("Person")} { + id: int32; + address?: string; + } + `); + + expect(getOutput(runner.program, [])).toRenderTo(` + from dataclasses import dataclass + from dataclasses import field + + @dataclass + class Person: + id: int + address: str = field(default_factory=object) + + `); + }); + it("converts a model with an optional field that has a default", async () => { + const result = await runner.compile(t.code` + @test model ${t.model("Person")} { + age: int32; + address?: string = "N/A"; + } + `); + + expect(getOutput(runner.program, [])).toRenderTo(` + from dataclasses import dataclass + from dataclasses import field + + @dataclass + class Person: + age: int + address: str = field(default="N/A") + + `); + }); + it("converts a model with an optional field that can be null", async () => { + const result = await runner.compile(t.code` + @test model ${t.model("Person")} { + age: int32; + address?: string | null; + } + `); + + expect(getOutput(runner.program, [])).toRenderTo(` + from dataclasses import dataclass + from dataclasses import field + + @dataclass + class Person: + age: int + address: str | None = field(default=None) + + `); + }); + // it("converts a model with a special property type - never", async () => { + // const result = await runner.compile(t.code` + // @test model ${t.model("Address")} { + // state: TState; + // city: string; + // street: string; + // } + // @test model ${t.model("EuropeAddress")} is Address; + // `); + + // expect( + // getOutput(runner.program, [ + // , + // , + // ]), + // ).toRenderTo(` + // from dataclasses import dataclass + + // @dataclass + // class Address: + // state: any + // city: str + // street: str + + + // @dataclass + // class EuropeAddress: + // city: str + // street: str + + // `); + // }); + // it("converts a model that extends a generic with never", async () => { + // const result = await runner.compile(t.code` + // @test model ${t.model("Address")} { + // state: TState; + // city: string; + // } + // @test model ${t.model("EuropeAddress")} extends Address { + // street: string; + // }; + // `); + + // expect( + // getOutput(runner.program, [ + // , + // , + // ]), + // ).toRenderTo(` + // from dataclasses import dataclass + + // @dataclass + // class Address: + // state: any + // city: str + + + // @dataclass + // class EuropeAddress(Address): + // street: str + + // `); + // }); + it("converts a model with model inheritance through extends", async () => { + const result = await runner.compile(t.code` + @test model ${t.model("Identified")} { + id: int32; + } + @test model ${t.model("Admin")} extends Identified { + role: "admin"; + }; + `); + + expect( + getOutput(runner.program, [ + , + , + ]), + ).toRenderTo(` + from dataclasses import dataclass + from typing import Literal + + @dataclass + class Identified: + id: int + + + @dataclass + class Admin(Identified): + role: Literal["admin"] = "admin" + + `); + }); + it("converts a model with model inheritance through spreads", async () => { + const result = await runner.compile(t.code` + @test model ${t.model("Animal")} { + species: string; + } + + @test model ${t.model("Dog")} { + ...Animal; + age: int32; + } + `); + + expect( + getOutput(runner.program, [ + , + , + ]), + ).toRenderTo(` + from dataclasses import dataclass + + @dataclass + class Animal: + species: str + + + @dataclass + class Dog: + species: str + age: int + + `); + }); + it("declares a model with multi line docs, explicit docs passed", async () => { + const result = await runner.compile(t.code` + /** + * This is a test + * with multiple lines + */ + @test model ${t.model("Foo")} { + KnownProp: string; + } + `); + + expect( + getOutput(runner.program, [ + , + ]), + ).toRenderTo(` + from dataclasses import dataclass + + @dataclass + class Foo: + """ + This is a test with multiple lines + """ + known_prop: str + + `); + }); + it("declares a model with multi line docs, docs overridden", async () => { + const result = await runner.compile(t.code` + /** + * This is a test + * with multiple lines + */ + @test model ${t.model("Foo")} { + KnownProp: string; + } + `); + + expect( + getOutput(runner.program, [ + + ]), + ).toRenderTo(` + from dataclasses import dataclass + + @dataclass + class Foo: + """ + This is an overridden doc comment with multiple lines + """ + known_prop: str + + `); + }); + it("declares a model with @doc", async () => { + const result = await runner.compile(t.code` + /** + * This is a test + * with multiple lines + */ + @doc("This is a test") + @test model ${t.model("Foo")} { + knownProp: string; + } + `); + + expect( + getOutput(runner.program, [ + , + ]), + ).toRenderTo(` + from dataclasses import dataclass + + @dataclass + class Foo: + """ + This is a test + """ + known_prop: str + + `); + }); + it("declares a model with a property that has doc", async () => { + const result = await runner.compile(t.code` + /** + * This is a test + */ + @test model ${t.model("Foo")} { + @doc("This is a known property") + knownProp: string; + } + `); + + expect( + getOutput(runner.program, [ + , + ]), + ).toRenderTo(` + from dataclasses import dataclass + + @dataclass + class Foo: + """ + This is a test + """ + # This is a known property + known_prop: str + + `); + }); +}); diff --git a/packages/emitter-framework/src/python/components/model-declaration/model-declaration.tsx b/packages/emitter-framework/src/python/components/model-declaration/model-declaration.tsx new file mode 100644 index 00000000000..dcc4653e608 --- /dev/null +++ b/packages/emitter-framework/src/python/components/model-declaration/model-declaration.tsx @@ -0,0 +1,227 @@ +import { code, For, mapJoin, Prose, Show, type Children } from "@alloy-js/core"; +import * as py from "@alloy-js/python"; +import { + isNeverType, + type BooleanValue, + type Interface, + type Model, + type ModelProperty, + type NumericValue, + type Operation, + type RekeyableMap, + type StringValue, +} from "@typespec/compiler"; +import type { Typekit } from "@typespec/compiler/typekit"; +import { createRekeyableMap } from "@typespec/compiler/utils"; +import { getHttpPart } from "@typespec/http"; +import { useTsp } from "../../../core/context/tsp-context.js"; +import { reportDiagnostic } from "../../../lib.js"; +import { dataclassesModule, typingExtensionsModule, typingModule } from "../../builtins.js"; +import { declarationRefkeys, efRefkey } from "../../utils/refkey.js"; +import { Atom } from "../atom/atom.jsx"; +import { TypeExpression } from "../type-expression/type-expression.jsx"; + +export interface InterfaceDeclarationProps extends Omit { + type: Model | Interface; + name?: string; +} + +export function InterfaceDeclaration(props: InterfaceDeclarationProps) { + const { $ } = useTsp(); + + const namePolicy = py.usePythonNamePolicy(); + + let name = props.name ?? props.type.name; + + if (!name || name === "") { + reportDiagnostic($.program, { code: "type-declaration-missing-name", target: props.type }); + } + + name = namePolicy.getName(name, "class"); + const doc = props.doc ?? $.type.getDoc(props.type); + let docElement = null; + if (doc) { + docElement = {doc}]} />; + } + + let typeMembers: RekeyableMap | undefined; + if ($.model.is(props.type)) { + // Model + typeMembers = $.model.getProperties(props.type); + } else { + // Interface + typeMembers = createRekeyableMap( + (props.type as { operations: Map }).operations, + ); + } + + // Ensure that we have members to render, otherwise skip rendering the ender property. + const validTypeMembers = Array.from(typeMembers.values()).filter((member) => { + if ($.modelProperty.is(member) && isNeverType(member.type)) { + return false; + } + return true; + }); + let modelTypeMembers = null; + if (validTypeMembers.length > 0) { + modelTypeMembers = ( + + {(typeMember) => { + return ; + }} + + ); + } + + const refkeys = declarationRefkeys(props.refkey, props.type); + const basesType = props.bases ?? getExtendsType($, props.type); + // Assign dataclass if TypedDict isn't one of the basesType + let dataclass: any = null; + if ($.model.is(props.type)) { + dataclass = dataclassesModule["."]["dataclass"]; + } + + return ( + <> + @{dataclass} + + + {modelTypeMembers} + {props.children} + + + ); +} + +function getExtendsType($: Typekit, type: Model | Interface): Children | undefined { + if (!$.model.is(type)) { + return undefined; + } + + const extending: Children[] = []; + + if (type.baseModel) { + if ($.array.is(type.baseModel)) { + extending.push(); + } else if ($.record.is(type.baseModel)) { + // Ex. model Person extends Record + extending.push(typingExtensionsModule["."]["TypedDict"]); + extending.push(code`extra_items=str`); + } else { + extending.push(efRefkey(type.baseModel)); + } + } + + const indexType = $.model.getIndexType(type); + if (indexType) { + // Ex.: model Person is Record + if ($.record.is(indexType)) { + extending.push(typingExtensionsModule["."]["TypedDict"]); + extending.push(code`extra_items=str`); + } else { + extending.push(); + } + } + + if (extending.length === 0) { + return undefined; + } + + return mapJoin( + () => extending, + (ext) => ext, + { joiner: ", " }, + ); +} + +export interface InterfaceMemberProps { + type: ModelProperty | Operation; + doc?: Children; + optional?: boolean; +} + +export function InterfaceMember(props: InterfaceMemberProps) { + const { $ } = useTsp(); + const doc = props.doc ?? $.type.getDoc(props.type); + const namePolicy = py.usePythonNamePolicy(); + const name = namePolicy.getName(props.type.name, "class-member"); + + if ($.modelProperty.is(props.type)) { + if (isNeverType(props.type.type)) { + return null; + } + + let unpackedType = props.type.type; + let unionType = undefined; + let otherProps = {}; + + const part = getHttpPart($.program, props.type.type); + if (part) { + unpackedType = part.type; + } + let elements = []; + if (unpackedType.kind === "Union") { + elements = (unpackedType as any).options.map((opt: any) => { + return ; + }); + } else if ($.literal.is(unpackedType)) { + const typingElements = ; + elements = [code`${typingModule["."]["Literal"]}[${typingElements}]`]; + } else { + elements = []; + } + unionType = {elements}; + + if ($.literal.is(unpackedType)) { + let value: StringValue | NumericValue | BooleanValue; + if (typeof unpackedType.value === "string") { + value = $.value.createString(unpackedType.value); + } else if (typeof unpackedType.value === "number") { + value = $.value.createNumeric(unpackedType.value); + } else { + value = $.value.createBoolean(unpackedType.value); + } + otherProps = { + initializer: code`${()}`, + }; + } else { + if (props.optional || props.type.optional) { + // Optional field with no default value, use a default_factory to object + // as we can't represent a non-required field in Python's dataclasses + let fieldValue = code`default_factory=object`; + if (props.type.defaultValue) { + // Optional field with default value, default to value + fieldValue = code`default=${()}`; + } + // If one of the union types is null, set default to None + if ( + unpackedType.kind === "Union" && + Array.isArray((unpackedType as any).options) && + (unpackedType as any).options.some( + (opt: any) => opt && opt.kind === "Intrinsic" && opt.name === "null", + ) + ) { + fieldValue = code`default=None`; + } + otherProps = { + initializer: code`${dataclassesModule["."]["field"]}(${fieldValue})`, + }; + } + } + + return ( + + ); + } +} diff --git a/packages/emitter-framework/src/python/test-utils.tsx b/packages/emitter-framework/src/python/test-utils.tsx index 90c989c522d..395aed0297b 100644 --- a/packages/emitter-framework/src/python/test-utils.tsx +++ b/packages/emitter-framework/src/python/test-utils.tsx @@ -1,12 +1,30 @@ -import { type Children, type OutputDirectory, render } from "@alloy-js/core"; +import { render, type Children, type OutputDirectory } from "@alloy-js/core"; import { Output as StcOutput, SourceFile as StcSourceFile } from "@alloy-js/core/stc"; import { createPythonNamePolicy, SourceFile } from "@alloy-js/python"; -import type { Program } from "@typespec/compiler"; -import { type ModelProperty } from "@typespec/compiler"; -import type { BasicTestRunner } from "@typespec/compiler/testing"; +import type { + Enum, + Interface, + Model, + Namespace, + NavigationOptions, + Operation, + Program, + SemanticNodeListener, + Tuple, + Union, + UnionVariant, +} from "@typespec/compiler"; +import { navigateProgram, type ModelProperty } from "@typespec/compiler"; +import type { BasicTestRunner, TestHost } from "@typespec/compiler/testing"; import { assert } from "vitest"; import { Output } from "../../src/core/components/output.jsx"; -import { datetimeModule, decimalModule, typingModule } from "./builtins.js"; +import { + dataclassesModule, + datetimeModule, + decimalModule, + typingExtensionsModule, + typingModule, +} from "./builtins.js"; import { getProgram } from "./test-host.js"; // Reimplementing so we can set the correct extensions @@ -30,7 +48,7 @@ export function assertFileContents(res: OutputDirectory, contents: string) { } function getExternals() { - return [datetimeModule, decimalModule, typingModule]; + return [dataclassesModule, datetimeModule, decimalModule, typingModule, typingExtensionsModule]; } export function getOutput(program: Program, children: Children[]): Children { @@ -73,3 +91,118 @@ export async function compileModelProperty(ref: string, runner: BasicTestRunner) export async function compileModelPropertyType(ref: string, runner: BasicTestRunner) { return (await compileModelProperty(ref, runner)).type; } + +function createCollector(customListener?: SemanticNodeListener) { + const result = { + enums: [] as Enum[], + exitEnums: [] as Enum[], + interfaces: [] as Interface[], + exitInterfaces: [] as Interface[], + models: [] as Model[], + exitModels: [] as Model[], + modelProperties: [] as ModelProperty[], + exitModelProperties: [] as ModelProperty[], + namespaces: [] as Namespace[], + exitNamespaces: [] as Namespace[], + operations: [] as Operation[], + exitOperations: [] as Operation[], + tuples: [] as Tuple[], + exitTuples: [] as Tuple[], + unions: [] as Union[], + exitUnions: [] as Union[], + unionVariants: [] as UnionVariant[], + exitUnionVariants: [] as UnionVariant[], + }; + + const listener: SemanticNodeListener = { + namespace: (x) => { + result.namespaces.push(x); + return customListener?.namespace?.(x); + }, + exitNamespace: (x) => { + result.exitNamespaces.push(x); + return customListener?.exitNamespace?.(x); + }, + operation: (x) => { + result.operations.push(x); + return customListener?.operation?.(x); + }, + exitOperation: (x) => { + result.exitOperations.push(x); + return customListener?.exitOperation?.(x); + }, + model: (x) => { + result.models.push(x); + return customListener?.model?.(x); + }, + exitModel: (x) => { + result.exitModels.push(x); + return customListener?.exitModel?.(x); + }, + modelProperty: (x) => { + result.modelProperties.push(x); + return customListener?.modelProperty?.(x); + }, + exitModelProperty: (x) => { + result.exitModelProperties.push(x); + return customListener?.exitModelProperty?.(x); + }, + enum: (x) => { + result.enums.push(x); + return customListener?.enum?.(x); + }, + exitEnum: (x) => { + result.exitEnums.push(x); + return customListener?.exitEnum?.(x); + }, + union: (x) => { + result.unions.push(x); + return customListener?.union?.(x); + }, + exitUnion: (x) => { + result.exitUnions.push(x); + return customListener?.exitUnion?.(x); + }, + interface: (x) => { + result.interfaces.push(x); + return customListener?.interface?.(x); + }, + exitInterface: (x) => { + result.exitInterfaces.push(x); + return customListener?.exitInterface?.(x); + }, + tuple: (x) => { + result.tuples.push(x); + return customListener?.tuple?.(x); + }, + exitTuple: (x) => { + result.exitTuples.push(x); + return customListener?.exitTuple?.(x); + }, + unionVariant: (x) => { + result.unionVariants.push(x); + return customListener?.unionVariant?.(x); + }, + exitUnionVariant: (x) => { + result.exitUnionVariants.push(x); + return customListener?.exitUnionVariant?.(x); + }, + }; + return [result, listener] as const; +} + +export async function runNavigator( + typespec: string, + host: TestHost, + customListener?: SemanticNodeListener, + options?: NavigationOptions, +) { + host.addTypeSpecFile("main.tsp", typespec); + + await host.compile("main.tsp", { nostdlib: true }); + + const [result, listener] = createCollector(customListener); + navigateProgram(host.program, listener, options); + + return result; +} diff --git a/packages/emitter-framework/src/python/utils/operation.ts b/packages/emitter-framework/src/python/utils/operation.ts new file mode 100644 index 00000000000..db8c5bc84af --- /dev/null +++ b/packages/emitter-framework/src/python/utils/operation.ts @@ -0,0 +1,87 @@ +import { refkey, type Refkey } from "@alloy-js/core"; +import * as ts from "@alloy-js/typescript"; +import type { Model, ModelProperty, Operation, Type } from "@typespec/compiler"; +import { useTsp } from "../../core/index.js"; +import { TypeExpression } from "../components/type-expression/type-expression.jsx"; +import { efRefkey } from "./refkey.js"; + +export function getReturnType( + type: Operation, + options: { skipErrorFiltering: boolean } = { skipErrorFiltering: false }, +): Type { + const { $ } = useTsp(); + let returnType = type.returnType; + + if (!options.skipErrorFiltering && type.returnType.kind === "Union") { + returnType = $.union.filter(type.returnType, (variant) => !$.type.isError(variant.type)); + } + + return returnType; +} + +export interface BuildParameterDescriptorsOptions { + params?: ts.ParameterDescriptor[] | string[] | undefined; + mode?: "prepend" | "append" | "replace"; + suffixRefkey?: Refkey; +} + +export function buildParameterDescriptors( + type: Model, + options: BuildParameterDescriptorsOptions = {}, +): ts.ParameterDescriptor[] | undefined { + const { $ } = useTsp(); + const suffixRefkey = options.suffixRefkey ?? refkey(); + const optionsParams = normalizeParameters(options.params); + + if (options.mode === "replace") { + return optionsParams; + } + + const modelProperties = $.model.getProperties(type); + const operationParams = [...modelProperties.values()].map((m) => + buildParameterDescriptor(m, suffixRefkey), + ); + + // Merge parameters based on location + const allParams = + options.mode === "append" + ? operationParams.concat(optionsParams) + : optionsParams.concat(operationParams); + + return allParams; +} + +export function buildParameterDescriptor( + modelProperty: ModelProperty, + suffixRefkey: Refkey, +): ts.ParameterDescriptor { + const { $ } = useTsp(); + const namePolicy = ts.useTSNamePolicy(); + const paramName = namePolicy.getName(modelProperty.name, "parameter"); + const isOptional = modelProperty.optional || modelProperty.defaultValue !== undefined; + const doc = $.type.getDoc(modelProperty); + return { + doc, + name: paramName, + refkey: efRefkey(modelProperty, suffixRefkey), + optional: isOptional, + type: TypeExpression({ type: modelProperty.type }), + }; +} + +/** + * Convert a parameter descriptor array, string array, or undefined to + * a parameter descriptor array. + */ +function normalizeParameters( + params: ts.ParameterDescriptor[] | string[] | undefined, +): ts.ParameterDescriptor[] { + if (!params) return []; + + return params.map((param) => { + if (typeof param === "string") { + return { name: param }; + } + return param; + }); +} From 6ed75c88fc36267cc5330ea117bbb59045ee2492 Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Wed, 1 Oct 2025 21:11:38 +0000 Subject: [PATCH 08/25] Remove file --- .../emitter-framework/src/python/test-host.ts | 49 ------------------- 1 file changed, 49 deletions(-) delete mode 100644 packages/emitter-framework/src/python/test-host.ts diff --git a/packages/emitter-framework/src/python/test-host.ts b/packages/emitter-framework/src/python/test-host.ts deleted file mode 100644 index f7434e03c7a..00000000000 --- a/packages/emitter-framework/src/python/test-host.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type { Program } from "@typespec/compiler"; -import { - createTestHost, - createTestWrapper, - expectDiagnosticEmpty, -} from "@typespec/compiler/testing"; -import { HttpTestLibrary } from "@typespec/http/testing"; - -export async function createTypespecCliTestHost( - options: { libraries: "Http"[] } = { libraries: [] }, -) { - const libraries = []; - if (options.libraries.includes("Http")) { - libraries.push(HttpTestLibrary); - } - return createTestHost({ - libraries, - }); -} - -export async function createEmitterFrameworkTestRunner(options: { autoUsings?: string[] } = {}) { - const host = await createTypespecCliTestHost(); - return createTestWrapper(host, { - autoUsings: options.autoUsings, - }); -} - -export async function getProgram( - code: string, - options: { libraries: "Http"[] } = { libraries: [] }, -): Promise { - const host = await createTypespecCliTestHost(options); - const wrapper = createTestWrapper(host, { - compilerOptions: { - noEmit: true, - }, - }); - const [_, diagnostics] = await wrapper.compileAndDiagnose(code); - expectDiagnosticEmpty(diagnostics); - return wrapper.program; -} - -/** - * Initializes an empty program in the compiler. - * This is useful when you want to initialize the default TypeKits without any code. - */ -export async function initEmptyProgram(): Promise { - await getProgram(""); -} From 6cee8f131a5f34b68126649f933d5c2613ed6090 Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Fri, 3 Oct 2025 22:57:15 +0000 Subject: [PATCH 09/25] Changes --- .../emitter-framework/src/python/builtins.ts | 7 + .../src/python/components/atom/atom.test.tsx | 9 +- .../class-declaration.test.tsx | 848 ++++++++++++++++++ .../class-declaration/class-declaration.tsx | 295 ++++++ .../class-declaration/class-member.tsx | 158 ++++ .../class-declaration/class-method.test.tsx | 230 +++++ .../class-declaration/class-method.tsx | 126 +++ .../function-declaration.test.tsx | 2 +- .../function-declaration.tsx | 2 +- .../src/python/components/index.ts | 2 +- .../interface-declaration.test.tsx | 380 -------- .../interface-declaration.tsx | 275 ------ .../model-declaration.test.tsx | 327 ------- .../model-declaration/model-declaration.tsx | 227 ----- .../src/python/test-utils.tsx | 18 +- .../src/python/utils/operation.ts | 15 +- 16 files changed, 1697 insertions(+), 1224 deletions(-) create mode 100644 packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx create mode 100644 packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx create mode 100644 packages/emitter-framework/src/python/components/class-declaration/class-member.tsx create mode 100644 packages/emitter-framework/src/python/components/class-declaration/class-method.test.tsx create mode 100644 packages/emitter-framework/src/python/components/class-declaration/class-method.tsx delete mode 100644 packages/emitter-framework/src/python/components/interface-declaration/interface-declaration.test.tsx delete mode 100644 packages/emitter-framework/src/python/components/interface-declaration/interface-declaration.tsx delete mode 100644 packages/emitter-framework/src/python/components/model-declaration/model-declaration.test.tsx delete mode 100644 packages/emitter-framework/src/python/components/model-declaration/model-declaration.tsx diff --git a/packages/emitter-framework/src/python/builtins.ts b/packages/emitter-framework/src/python/builtins.ts index f25cf2bd010..d29acbd89e5 100644 --- a/packages/emitter-framework/src/python/builtins.ts +++ b/packages/emitter-framework/src/python/builtins.ts @@ -4,6 +4,13 @@ import { createModule } from "@alloy-js/python"; // eslint-disable-next-line @typescript-eslint/no-unused-vars type dummy = SymbolCreator; +export const abcModule = createModule({ + name: "abc", + descriptor: { + ".": ["ABC"], + }, +}); + export const datetimeModule = createModule({ name: "datetime", descriptor: { diff --git a/packages/emitter-framework/src/python/components/atom/atom.test.tsx b/packages/emitter-framework/src/python/components/atom/atom.test.tsx index 03b145b3de5..660be44fd76 100644 --- a/packages/emitter-framework/src/python/components/atom/atom.test.tsx +++ b/packages/emitter-framework/src/python/components/atom/atom.test.tsx @@ -57,9 +57,14 @@ describe("NumericValue", () => { }); it("decimals", async () => { - const value = $(program).value.createNumeric(42.5); + const fractional = $(program).value.createNumeric(42.5); + await testValueExpression(fractional, `42.5`); + }); - await testValueExpression(value, `42.5`); + it("decimals with .0", async () => { + // Atom normalizes 42.0 to 42 because it uses asNumber() + const value = $(program).value.createNumeric(42.0); + await testValueExpression(value, `42`); }); }); diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx new file mode 100644 index 00000000000..78d9ebb4548 --- /dev/null +++ b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx @@ -0,0 +1,848 @@ +import { getOutput } from "#python/test-utils.jsx"; +import { Tester } from "#test/test-host.js"; +import { List } from "@alloy-js/core"; +import * as py from "@alloy-js/python"; +import { t } from "@typespec/compiler/testing"; +import { describe, expect, it } from "vitest"; +import { ClassDeclaration } from "../../../../src/python/components/class-declaration/class-declaration.js"; +import { ClassMethod } from "../../../../src/python/components/class-declaration/class-method.js"; +import { EnumDeclaration } from "../../../../src/python/components/enum-declaration/enum-declaration.js"; + +describe("Python Class from model", () => { + it("creates a class", async () => { + const { program, Widget } = await Tester.compile(t.code` + + model ${t.model("Widget")} { + id: string; + weight: int32; + aliases: string[]; + isActive: boolean; + color: "blue" | "red"; + promotionalPrice: float64; + description?: string = "This is a widget"; + createdAt: int64 = 1717334400; + tags: string[] = #["tag1", "tag2"]; + isDeleted: boolean = false; + alternativeColor: "green" | "yellow" = "green"; + price: float64 = 100.0; + } + `); + + expect(getOutput(program, [])).toRenderTo( + ` + from dataclasses import dataclass + + @dataclass + class Widget: + id: str + weight: int + aliases: list[str] + is_active: bool + color: Literal["blue", "red"] + promotional_price: float + description: str = "This is a widget" + created_at: int = 1717334400 + tags: list[str] = ["tag1", "tag2"] + is_deleted: bool = False + alternative_color: Literal["green", "yellow"] = "green" + price: float = 100.0 + + `, + ); + }); + + it("declares a class with multi line docs", async () => { + const { program, Foo } = await Tester.compile(t.code` + /** + * This is a test + * with multiple lines + */ + model ${t.model("Foo")} { + knownProp: string; + } + `); + + expect(getOutput(program, [])).toRenderTo( + ` + from dataclasses import dataclass + + @dataclass + class Foo: + """ + This is a test + with multiple lines + """ + known_prop: str + + `, + ); + }); + + it("declares a class overriding docs", async () => { + const { program, Foo } = await Tester.compile(t.code` + /** + * This is a test + * with multiple lines + */ + model ${t.model("Foo")} { + knownProp: string; + } + `); + + expect( + getOutput(program, [ + , + ]), + ).toRenderTo( + ` + from dataclasses import dataclass + + @dataclass + class Foo: + """ + This is an overridden doc comment + with multiple lines + """ + known_prop: str + + `, + ); + }); + + it("declares a class overriding docs with paragraphs array", async () => { + const { program, Foo } = await Tester.compile(t.code` + /** + * Base doc will be overridden + */ + model ${t.model("Foo")} { + knownProp: string; + } + `); + + expect( + getOutput(program, [ + , + ]), + ).toRenderTo( + ` + from dataclasses import dataclass + + @dataclass + class Foo: + """ + First paragraph + + Second paragraph + """ + known_prop: str + + `, + ); + }); + + it("declares a class overriding docs with prebuilt JSX ClassDoc", async () => { + const { program, Foo } = await Tester.compile(t.code` + /** + * Base doc will be overridden + */ + model ${t.model("Foo")} { + knownProp: string; + } + `); + + expect( + getOutput(program, [ + Alpha, <>Beta]} />} />, + ]), + ).toRenderTo( + ` + from dataclasses import dataclass + + @dataclass + class Foo: + """ + Alpha + + Beta + """ + known_prop: str + + `, + ); + }); + + it("declares a class from amodel with @doc", async () => { + const { program, Foo } = await Tester.compile(t.code` + @doc("This is a test") + model ${t.model("Foo")} { + knownProp: string; + } + `); + + expect(getOutput(program, [])).toRenderTo( + ` + from dataclasses import dataclass + + @dataclass + class Foo: + """ + This is a test + """ + known_prop: str + + `, + ); + }); + + it("declares a model property with @doc", async () => { + const { program, Foo } = await Tester.compile(t.code` + /** + * This is a test + */ + model ${t.model("Foo")} { + @doc("This is a known property") + knownProp: string; + } + `); + + expect(getOutput(program, [])).toRenderTo( + ` + from dataclasses import dataclass + + @dataclass + class Foo: + """ + This is a test + """ + # This is a known property + known_prop: str + + `, + ); + }); + + it("throws error for model is Record", async () => { + const { program, Person } = await Tester.compile(t.code` + model ${t.model("Person")} is Record; + `); + + expect(() => { + expect(getOutput(program, [])).toRenderTo(""); + }).toThrow(/Models with additional properties \(Record\[…\]\) are not supported/); + }); + + it("throws error for model is Record with properties", async () => { + const { program, Person } = await Tester.compile(t.code` + model ${t.model("Person")} is Record { + name: string; + } + `); + + expect(() => { + expect(getOutput(program, [])).toRenderTo(""); + }).toThrow(/Models with additional properties \(Record\[…\]\) are not supported/); + }); + + it("throws error for model extends Record", async () => { + const { program, Person } = await Tester.compile(t.code` + model ${t.model("Person")} extends Record { + name: string; + } + `); + + expect(() => { + expect(getOutput(program, [])).toRenderTo(""); + }).toThrow(/Models with additional properties \(Record\[…\]\) are not supported/); + }); + + it("throws error for model with ...Record", async () => { + const { program, Person } = await Tester.compile(t.code` + model ${t.model("Person")} { + age: int32; + ...Record; + } + `); + + expect(() => { + expect(getOutput(program, [])).toRenderTo(""); + }).toThrow(/Models with additional properties \(Record\[…\]\) are not supported/); + }); + + it("creates a class from a model that 'is' an array ", async () => { + const { program, Foo } = await Tester.compile(t.code` + model ${t.model("Foo")} is Array; + `); + + expect(getOutput(program, [])).toRenderTo( + ` + from dataclasses import dataclass + + @dataclass + class Foo(list[str]): + pass + + `, + ); + }); + + it("handles a type reference to a union variant in a class property", async () => { + const { program, Color, Widget } = await Tester.compile(t.code` + union ${t.union("Color")} { + red: "RED", + blue: "BLUE" + } + + model ${t.model("Widget")} { + id: string = "123"; + weight: int32 = 100; + color: Color.blue + } + `); + + expect( + getOutput(program, [, ]), + ).toRenderTo( + ` + from dataclasses import dataclass + from enum import StrEnum + + class Color(StrEnum): + RED = "RED" + BLUE = "BLUE" + + + @dataclass + class Widget: + id: str = "123" + weight: int = 100 + color: Literal[Color.BLUE] + + `, + ); + }); + + it("renders an empty class based on a model with a never-typed member", async () => { + const { program, Widget } = await Tester.compile(t.code` + model ${t.model("Widget")} { + property: never; + } + `); + + expect(getOutput(program, [])).toRenderTo(` + from dataclasses import dataclass + + @dataclass + class Widget: + pass + + `); + }); + + it("can override class name", async () => { + const { program, Widget } = await Tester.compile(t.code` + model ${t.model("Widget")} { + id: string; + weight: int32; + color: "blue" | "red"; + } + `); + + expect(getOutput(program, [])) + .toRenderTo(` + from dataclasses import dataclass + + @dataclass + class MyOperations: + id: str + weight: int + color: Literal["blue", "red"] + + `); + }); + + it("can add a members to the class", async () => { + const { program, Widget } = await Tester.compile(t.code` + model ${t.model("Widget")} { + id: string; + weight: int32; + color: "blue" | "red"; + } + `); + + expect( + getOutput(program, [ + + + + <>custom_property: str + + , + ]), + ).toRenderTo(` + from dataclasses import dataclass + + @dataclass + class MyOperations: + id: str + weight: int + color: Literal["blue", "red"] + custom_property: str + + `); + }); + it("creates a class from a model with extends", async () => { + const { program, Widget, ErrorWidget } = await Tester.compile(t.code` + model ${t.model("Widget")} { + id: string; + weight: int32; + color: "blue" | "red"; + } + + model ${t.model("ErrorWidget")} extends Widget { + code: int32; + message: string; + } + `); + + expect( + getOutput(program, [ + , + , + ]), + ).toRenderTo(` + from dataclasses import dataclass + + @dataclass + class Widget: + id: str + weight: int + color: Literal["blue", "red"] + + + @dataclass + class ErrorWidget(Widget): + code: int + message: str + + `); + }); +}); + +describe("Python Class from interface", () => { + it("creates a class from an interface declaration", async () => { + const { program, WidgetOperations } = await Tester.compile(t.code` + interface ${t.interface("WidgetOperations")} { + op getName(id: string): string; + } + `); + + expect(getOutput(program, [])).toRenderTo(` + from abc import ABC + from abc import abstractmethod + + + class WidgetOperations(ABC): + @abstractmethod + def get_name(self, id: str) -> str: + pass + + + `); + }); + + it("should handle spread and non spread interface parameters", async () => { + const { program, Foo, WidgetOperations } = await Tester.compile(t.code` + model ${t.model("Foo")} { + name: string + } + + interface ${t.interface("WidgetOperations")} { + op getName(foo: Foo): string; + op getOtherName(...Foo): string + } + `); + + expect( + getOutput(program, [ + , + , + ]), + ).toRenderTo(` + from abc import ABC + from abc import abstractmethod + from dataclasses import dataclass + + @dataclass + class Foo: + name: str + + + + class WidgetOperations(ABC): + @abstractmethod + def get_name(self, foo: Foo) -> str: + pass + + @abstractmethod + def get_other_name(self, name: str) -> str: + pass + + + `); + }); + + it("creates a class from an interface with Model references", async () => { + const { program, WidgetOperations, Widget } = await Tester.compile(t.code` + /** + * Operations for Widget + */ + interface ${t.interface("WidgetOperations")} { + /** + * Get the name of the widget + */ + op getName( + /** + * The id of the widget + */ + id: string + ): Widget; + } + + model ${t.model("Widget")} { + id: string; + weight: int32; + color: "blue" | "red"; + } + `); + + expect( + getOutput(program, [ + , + , + ]), + ).toRenderTo(` + from abc import ABC + from abc import abstractmethod + from dataclasses import dataclass + + + class WidgetOperations(ABC): + """ + Operations for Widget + """ + @abstractmethod + def get_name(self, id: str) -> Widget: + """ + Get the name of the widget + """ + pass + + + + @dataclass + class Widget: + id: str + weight: int + color: Literal["blue", "red"] + + `); + }); + + it("creates a class from an interface that extends another", async () => { + const { program, WidgetOperations, WidgetOperationsExtended, Widget } = + await Tester.compile(t.code` + interface ${t.interface("WidgetOperations")} { + op getName(id: string): Widget; + } + + interface ${t.interface("WidgetOperationsExtended")} extends WidgetOperations{ + op delete(id: string): void; + } + + model ${t.model("Widget")} { + id: string; + weight: int32; + color: "blue" | "red"; + } + `); + + expect( + getOutput(program, [ + , + , + , + ]), + ).toRenderTo(` + from abc import ABC + from abc import abstractmethod + from dataclasses import dataclass + + + class WidgetOperations(ABC): + @abstractmethod + def get_name(self, id: str) -> Widget: + pass + + + + + class WidgetOperationsExtended(ABC): + @abstractmethod + def get_name(self, id: str) -> Widget: + pass + + @abstractmethod + def delete(self, id: str) -> None: + pass + + + + @dataclass + class Widget: + id: str + weight: int + color: Literal["blue", "red"] + + `); + }); +}); + +describe("Python Class overrides", () => { + it("creates a class with a method if a model is provided and a class method is provided", async () => { + const { program, WidgetOperations } = await Tester.compile(t.code` + model ${t.model("WidgetOperations")} { + id: string; + weight: int32; + } + `); + + expect( + getOutput(program, [ + + + + + + + , + ]), + ).toRenderTo(` + from dataclasses import dataclass + + @dataclass + class WidgetOperations: + id: str + weight: int + + def do_work(self) -> None: + """ + This is a test + """ + pass + + + `); + }); + + it("creates a class with a method if a model is provided and a class method is provided and methodType is set to method", async () => { + const { program, WidgetOperations } = await Tester.compile(t.code` + model ${t.model("WidgetOperations")} { + id: string; + weight: int32; + } + `); + + expect( + getOutput(program, [ + + + + + + + , + ]), + ).toRenderTo(` + from dataclasses import dataclass + + @dataclass + class WidgetOperations: + id: str + weight: int + + def do_work(self) -> None: + """ + This is a test + """ + pass + + + `); + }); + + it("creates a class with a classmethod if a model is provided, a class method is provided and methodType is set to class", async () => { + const { program, WidgetOperations } = await Tester.compile(t.code` + model ${t.model("WidgetOperations")} { + id: string; + weight: int32; + } + `); + + expect( + getOutput(program, [ + + + + + + + , + ]), + ).toRenderTo(` + from dataclasses import dataclass + + @dataclass + class WidgetOperations: + id: str + weight: int + + @classmethod + def do_work(cls) -> None: + """ + This is a test + """ + pass + + + `); + }); + + it("creates a class with a staticmethod if a model is provided, a class method is provided and methodType is set to static", async () => { + const { program, WidgetOperations } = await Tester.compile(t.code` + model ${t.model("WidgetOperations")} { + id: string; + weight: int32; + } + `); + + expect( + getOutput(program, [ + + + + + + + , + ]), + ).toRenderTo(` + from dataclasses import dataclass + + @dataclass + class WidgetOperations: + id: str + weight: int + + @staticmethod + def do_work() -> None: + """ + This is a test + """ + pass + + + `); + }); + + it("creates a class with abstract method if an interface is provided", async () => { + const { program, WidgetOperations } = await Tester.compile(t.code` + interface ${t.interface("WidgetOperations")} { + op getName(id: string): string; + } + `); + + expect(getOutput(program, [])).toRenderTo(` + from abc import ABC + from abc import abstractmethod + + + class WidgetOperations(ABC): + @abstractmethod + def get_name(self, id: str) -> str: + pass + + + `); + }); + + it("creates a class with abstract method if an interface is provided and methodType is set to method", async () => { + const { program, WidgetOperations } = await Tester.compile(t.code` + interface ${t.interface("WidgetOperations")} { + op getName(id: string): string; + } + `); + + expect(getOutput(program, [])) + .toRenderTo(` + from abc import ABC + from abc import abstractmethod + + + class WidgetOperations(ABC): + @abstractmethod + def get_name(self, id: str) -> str: + pass + + + `); + }); + + it("creates a class with abstract classmethod if an interface is provided and methodType is set to class", async () => { + const { program, WidgetOperations } = await Tester.compile(t.code` + interface ${t.interface("WidgetOperations")} { + op getName(id: string): string; + } + `); + + expect(getOutput(program, [])) + .toRenderTo(` + from abc import ABC + from abc import abstractmethod + + + class WidgetOperations(ABC): + @classmethod + @abstractmethod + def get_name(cls, id: str) -> str: + pass + + + `); + }); + + it("creates a class with abstract staticmethod if an interface is provided and methodType is set to static", async () => { + const { program, WidgetOperations } = await Tester.compile(t.code` + interface ${t.interface("WidgetOperations")} { + op getName(id: string): string; + } + `); + + expect(getOutput(program, [])) + .toRenderTo(` + from abc import ABC + from abc import abstractmethod + + + class WidgetOperations(ABC): + @staticmethod + @abstractmethod + def get_name(id: str) -> str: + pass + + + `); + }); +}); diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx new file mode 100644 index 00000000000..803f4cee5bd --- /dev/null +++ b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx @@ -0,0 +1,295 @@ +import { abcModule, dataclassesModule } from "#python/builtins.js"; +import { type Children, For, List, mapJoin, Show } from "@alloy-js/core"; +import * as py from "@alloy-js/python"; +import { + type Interface, + isNeverType, + type Model, + type ModelProperty, + type Operation, + type RekeyableMap, +} from "@typespec/compiler"; +import type { Typekit } from "@typespec/compiler/typekit"; +import { createRekeyableMap } from "@typespec/compiler/utils"; +import { useTsp } from "../../../core/context/tsp-context.js"; +import { reportDiagnostic } from "../../../lib.js"; +import { declarationRefkeys, efRefkey } from "../../utils/refkey.js"; +import { TypeExpression } from "../type-expression/type-expression.jsx"; +import { ClassMember } from "./class-member.jsx"; +import { ClassMethodProvider } from "./class-method.jsx"; + +export interface ClassDeclarationPropsWithType extends Omit { + type: Model | Interface; + name?: string; + abstract?: boolean; // Global override for the abstract flag + methodType?: "method" | "class" | "static"; // Global override for the method type +} + +export type ClassDeclarationProps = ClassDeclarationPropsWithType | py.ClassDeclarationProps; + +function isTypedClassDeclarationProps( + props: ClassDeclarationProps, +): props is ClassDeclarationPropsWithType { + return "type" in props; +} + +/** + * Filters out model properties whose type is never. + * @param $ - The Typekit. + * @param type - The type to filter the model properties from. + * @returns The valid model properties. + */ +function getValidTypeMembers($: Typekit, type: Model | Interface): (ModelProperty | Operation)[] { + let typeMembers: RekeyableMap | undefined; + if ($.model.is(type)) { + typeMembers = $.model.getProperties(type); + } else { + typeMembers = createRekeyableMap((type as { operations: Map }).operations); + } + return Array.from(typeMembers.values()).filter((member) => { + if ($.modelProperty.is(member) && isNeverType(member.type)) { + return false; + } + return true; + }); +} + +/** + * Creates the doc element for the class declaration, either from the props or from the type. + * Covers the cases where the doc is provided as an array, a string, or a JSX element. + * @param props - The props for the class declaration. + * @returns The doc element for the class declaration. + */ +function createDocElement($: Typekit, props: ClassDeclarationProps) { + let docElement = undefined; + const docSource = props.doc ?? ("type" in props && $.type.getDoc(props.type)) ?? undefined; + if (docSource) { + // Doc provided as an array (paragraphs/nodes). Forward as description to preserve structure. + if (Array.isArray(docSource)) { + docElement = ; + } + // Doc provided as a string. Preserve line breaks by rendering each line on its own. + else if (typeof docSource === "string") { + const lines = docSource.split(/\r?\n/); + docElement = ( + + {lines.map((line) => ( + <>{line} + ))} + , + ]} + /> + ); + } + // Doc provided as JSX (e.g., a prebuilt ). Pass through unchanged. + else { + docElement = docSource as any; + } + } + return docElement; +} + +/** + * Creates the class body for the class declaration. + * Determines if the class body should render any members/children. + * If it does, returns a ClassBody; otherwise, returns undefined, which will render a "pass"; + * as the class body. + * @param $ - The Typekit. + * @param props - The props for the class declaration. + * @returns The class body for the class declaration, either a ClassBody or undefined. + */ +function createClassBody($: Typekit, props: ClassDeclarationProps, abstract: boolean) { + const validTypeMembers = isTypedClassDeclarationProps(props) + ? getValidTypeMembers($, props.type) + : []; + const hasValidMember = validTypeMembers.length > 0; + const hasChildren = Array.isArray(props.children) + ? (props.children as any[]).length > 0 + : props.children != null; + + if (!(hasValidMember || hasChildren)) return undefined as any; + + if (isTypedClassDeclarationProps(props)) { + return ; + } + + // Fallback for non-typed props (shouldn't be called in practice due to early return in ClassDeclaration) + return (<>{props.children}) as any; +} + +/** + * Creates the extends types for the class declaration. + * @param $ - The Typekit. + * @param type - The type to create the extends type for. + * @returns The extends types for the class declaration. + */ +function getExtendsType($: Typekit, type: Model | Interface): Children | undefined { + if (!$.model.is(type)) { + return undefined; + } + + const extending: Children[] = []; + + if (type.baseModel) { + if ($.array.is(type.baseModel)) { + extending.push(); + } else if ($.record.is(type.baseModel)) { + // Record-based scenarios are not supported + // do nothing here. + } else { + extending.push(efRefkey(type.baseModel)); + } + } + + const indexType = $.model.getIndexType(type); + if (indexType) { + if ($.record.is(indexType)) { + // Record-based scenarios are not supported + // do nothing here. + } else { + extending.push(); + } + } + + if (extending.length === 0) { + return undefined; + } + + return mapJoin( + () => extending, + (ext) => ext, + { joiner: "," }, + ); +} + +/** + * Creates the bases type for the class declaration. + * @param $ - The Typekit. + * @param props - The props for the class declaration. + * @param abstract - Whether the class is abstract. + * @returns The bases type for the class declaration. + */ +function createBasesType($: Typekit, props: ClassDeclarationProps, abstract: boolean) { + const globalBasesType = isTypedClassDeclarationProps(props) + ? getExtendsType($, props.type) + : undefined; + let basesType = props.bases ? props.bases : (globalBasesType ?? undefined); + if (!abstract) return basesType; + + const abcBase = abcModule["."]["ABC"]; + if (Array.isArray(basesType)) return [abcBase, ...basesType]; + if (basesType != null) return [abcBase, basesType]; + return [abcBase]; +} + +/** + * Creates the class declaration for the class. + * @param props - The props for the class declaration. + * @returns The class declaration. + */ +export function ClassDeclaration(props: ClassDeclarationProps) { + const { $ } = useTsp(); + + // If we are explicitly overriding the class as abstract or the type is not a model, we need to create an abstract class + let abstract = ('abstract' in props && props.abstract) || ('type' in props && !$.model.is(props.type)); + let docElement = createDocElement($, props); + let basesType = createBasesType($, props, abstract); + + if (!isTypedClassDeclarationProps(props)) { + return ; + } + + const namePolicy = py.usePythonNamePolicy(); + + let name = props.name ?? props.type.name; + if (!name || name === "") { + reportDiagnostic($.program, { code: "type-declaration-missing-name", target: props.type }); + } + name = namePolicy.getName(name, "class"); + + const refkeys = declarationRefkeys(props.refkey, props.type); + let dataclass: any = null; + if (!abstract) { + dataclass = dataclassesModule["."]["dataclass"]; + } + const classBody = createClassBody($, props, abstract); + + // Throw error for models with additional properties (Record-based scenarios) + if ($.model.is(props.type)) { + const additionalPropsRecord = $.model.getAdditionalPropertiesRecord(props.type); + if (additionalPropsRecord) { + throw new Error("Models with additional properties (Record[…]) are not supported"); + } + } + + return ( + <> + @{dataclass} + + + + {classBody} + + + + ); +} + +interface ClassBodyProps extends ClassDeclarationPropsWithType { + abstract?: boolean; // Global override for the abstract flag + methodType?: "method" | "class" | "static"; // Global override for the method type +} + +/** + * Renders the members of an interface from its properties, including any additional children. + */ +function ClassBody( + props: ClassBodyProps & { validTypeMembers?: (ModelProperty | Operation)[] }, +): Children { + const { $ } = useTsp(); + const validTypeMembers = props.validTypeMembers ?? getValidTypeMembers($, props.type); + + // Throw error for models with additional properties (Record-based scenarios) + if ($.model.is(props.type)) { + const additionalPropsRecord = $.model.getAdditionalPropertiesRecord(props.type); + if (additionalPropsRecord) { + throw new Error("Models with additional properties (Record[…]) are not supported"); + } + } + + const hasChildren = Array.isArray(props.children) + ? (props.children as any[]).length > 0 + : props.children != null; + const hasBody = validTypeMembers.length > 0 || hasChildren; + if (!hasBody) return undefined as any; + + return ( + <> + 0}> + + {(typeMember) => { + return ( + + ); + }} + + + {props.children} + + ); +} diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx new file mode 100644 index 00000000000..8da0a5da1c6 --- /dev/null +++ b/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx @@ -0,0 +1,158 @@ +import { type Children } from "@alloy-js/core"; +import * as py from "@alloy-js/python"; +import { isNeverType, type ModelProperty, type Operation } from "@typespec/compiler"; +import { useTsp } from "../../../core/context/tsp-context.js"; +import { efRefkey } from "../../utils/refkey.js"; +import { Atom } from "../atom/atom.jsx"; +import { TypeExpression } from "../type-expression/type-expression.jsx"; +import { ClassMethod } from "./class-method.jsx"; + +export interface ClassMemberProps { + type: ModelProperty | Operation; + doc?: Children; + optional?: boolean; + methodType?: "method" | "class" | "static"; + abstract?: boolean; +} + +/** + * Builds the primitive initializer from the default value. + * @param defaultValue - The default value. + * @returns The primitive initializer. + */ +function buildPrimitiveInitializerFromDefault( + defaultValue: any, + propertyType: any, + $: ReturnType["$"], +): Children | undefined { + if (!defaultValue) return undefined; + const valueKind = (defaultValue as any).valueKind ?? (defaultValue as any).kind; + switch (valueKind) { + case "StringValue": + case "BooleanValue": + case "NullValue": + return ; + case "NumericValue": { + // The Atom component converts NumericValue via asNumber(), which normalizes 100.0 to 100. + // Atom also has no access to the field type (float vs int), so it can't decide when to keep a trailing .0. + // Here we do have the propertyType so, for float/decimal fields, we render a raw value and append ".0" + // when needed. For non-float fields, default to a plain numeric Atom. + + // Unwrap potential numeric wrapper shape and preserve float formatting + let raw: any = (defaultValue as any).value; + // Example: value is { value: "100", isInteger: true } + if (raw && typeof raw === "object" && "value" in raw) raw = raw.value; + + // Float-ish property types should render as raw text with .0 if integral + if ($.scalar.is(propertyType)) { + const base = $.scalar.getStdBase(propertyType)?.name; + const isFloatish = + base === "float" || + base === "float32" || + base === "float64" || + base === "decimal" || + base === "decimal128"; + if (isFloatish) { + // Example: raw is 42.5 or 42.0 + const s = typeof raw === "string" ? raw : String(raw); + const needsDotZero = !s.includes(".") && !s.toLowerCase().includes("e"); + return <>{needsDotZero ? `${s}.0` : s}; + } + } + + // Otherwise output as a number atom + return ; + } + case "ArrayValue": + return ; + default: + return undefined; + } +} + +/** + * Builds the type node for the property. This is used to handle union of string literals and union variant references. + * If the type is a union of string literals, it returns a Literal["a", "b"] type. + * If the type is a union variant reference, it returns a Literal[Color.MEMBER] type. + * @param unpackedType - The unpacked type. + * @returns The type node, or undefined if the type is not a union of string literals or union variant reference. + */ +function buildTypeNodeForProperty(unpackedType: any): Children | undefined { + // Union variant reference - Literal[Color.MEMBER] + if (unpackedType && unpackedType.kind === "UnionVariant" && unpackedType.union) { + const unionType = unpackedType.union; + const variantValue = unpackedType.type; + const enumMemberName = + variantValue && typeof variantValue.value === "string" + ? variantValue.value + : String(variantValue?.value ?? ""); + return ( + <> + Literal[{efRefkey(unionType)}.{enumMemberName}] + + ); + } + + // Union of string literals - Literal["a", "b"] + if ( + unpackedType && + unpackedType.kind === "Union" && + Array.isArray((unpackedType as any).options) + ) { + const opts: any[] = (unpackedType as any).options; + const allStringLiterals = opts.every((opt) => opt && opt.kind === "String"); + if (allStringLiterals) { + const literalValues = opts.map((opt) => JSON.stringify(opt.value)).join(", "); + return <>Literal[{literalValues}]; + } + } + + return undefined; +} + +/** + * Creates the class member for the property. + * @param props - The props for the class member. + * @returns The class member. + */ +export function ClassMember(props: ClassMemberProps) { + const { $ } = useTsp(); + const namer = py.usePythonNamePolicy(); + const name = namer.getName(props.type.name, "class-member"); + const doc = props.doc ?? $.type.getDoc(props.type); + + if ($.modelProperty.is(props.type)) { + // Never type is not supported + if (isNeverType(props.type.type)) { + return null; + } + + const unpackedType = props.type.type as any; + const isOptional = props.optional ?? props.type.optional ?? false; + const defaultValue: any = (props.type as any).defaultValue; + const literalTypeNode = buildTypeNodeForProperty(unpackedType); + const initializer = buildPrimitiveInitializerFromDefault(defaultValue, unpackedType, $); + const typeNode: Children = literalTypeNode ?? ; + + const interfaceMemberProps = { + doc, + name, + optional: isOptional, + type: typeNode, + ...(initializer ? { initializer } : {}), + omitNone: !isOptional, + }; + return ; + } + + if ($.operation.is(props.type)) { + return ( + + ); + } +} diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-method.test.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-method.test.tsx new file mode 100644 index 00000000000..72b760adc6b --- /dev/null +++ b/packages/emitter-framework/src/python/components/class-declaration/class-method.test.tsx @@ -0,0 +1,230 @@ +import { getOutput } from "#python/test-utils.jsx"; +import { Tester } from "#test/test-host.js"; +import { getProgram } from "#test/utils.js"; +import { t } from "@typespec/compiler/testing"; +import { describe, expect, it } from "vitest"; +import { ClassDeclaration } from "../../../../src/python/components/class-declaration/class-declaration.js"; +import { ClassMethod } from "../../../../src/python/components/class-declaration/class-method.js"; + +describe("interface methods with a `type` prop", () => { + it("creates a class method from an interface method", async () => { + const { program, getName } = await Tester.compile(t.code` + @test op ${t.op("getName")}(id: string): string; + `); + + expect( + getOutput(program, [ + + + , + ]), + ).toRenderTo(` + class BasicInterface: + async def get_name(self, id: str) -> str: + pass + + + `); + }); + + it("creates a class method that is a classmethod", async () => { + const { program, getName } = await Tester.compile(t.code` + @test op ${t.op("getName")}(id: string): string; + `); + + expect( + getOutput(program, [ + + + , + ]), + ).toRenderTo(` + class BasicInterface: + @classmethod + async def get_name(cls, id: str) -> str: + pass + + + `); + }); + + it("creates a class method that is a staticmethod", async () => { + const { program, getName } = await Tester.compile(t.code` + @test op ${t.op("getName")}(id: string): string; + `); + + expect( + getOutput(program, [ + + + , + ]), + ).toRenderTo(` + class BasicInterface: + @staticmethod + async def get_name(id: str) -> str: + pass + + + `); + }); + + it("creates an async class method from an asyncinterface method", async () => { + const { program, getName } = await Tester.compile(t.code` + @test op ${t.op("getName")}(id: string): string; + `); + + expect( + getOutput(program, [ + + + , + ]), + ).toRenderTo(` + class BasicInterface: + async def get_name(self, id: str) -> str: + pass + + + `); + }); + + it("can append extra parameters with raw params provided", async () => { + const { program, getName } = await Tester.compile(t.code` + @test op ${t.op("getName")}(id: string): string; + `); + + expect( + getOutput(program, [ + + + , + ]), + ).toRenderTo(` + class BasicInterface: + def get_name(self, id: str, foo: string) -> str: + pass + + + `); + }); + + it("can prepend extra parameters with raw params provided", async () => { + const { program, getName } = await Tester.compile(t.code` + @test op ${t.op("getName")}(id: string): string; + `); + + expect( + getOutput(program, [ + + + , + ]), + ).toRenderTo(` + class BasicInterface: + def get_name(self, foo: string, id: str) -> str: + pass + + + `); + }); + + it("can replace parameters with raw params provided", async () => { + const { program, getName } = await Tester.compile(t.code` + @test op ${t.op("getName")}(id: string): string; + `); + + expect( + getOutput(program, [ + + + , + ]), + ).toRenderTo(` + class BasicInterface: + def get_name(self, foo: string, bar: number) -> str: + pass + + + `); + }); + + it("can override return type in a class method", async () => { + const { program, getName } = await Tester.compile(t.code` + @test op ${t.op("getName")}(id: string): string; + `); + + expect( + getOutput(program, [ + + + , + ]), + ).toRenderTo(` + class BasicInterface: + def get_name(self, id: str) -> ASpecialString: + pass + + + `); + }); + + it("can override method name in a class method", async () => { + const { program, getName } = await Tester.compile(t.code` + @test op ${t.op("getName")}(id: string): string; + `); + + expect( + getOutput(program, [ + + + , + ]), + ).toRenderTo(` + class BasicInterface: + def get_name_custom(self, id: str) -> str: + pass + + + `); + }); +}); + +describe("interface methods without a `type` prop", () => { + it("renders a plain interface method from a class method without a `type` prop", async () => { + const program = await getProgram(""); + + expect( + getOutput(program, [ + + + , + ]), + ).toRenderTo(` + class BasicInterface: + def plain_method(self, param1: string) -> number: + pass + + + `); + }); +}); diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-method.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-method.tsx new file mode 100644 index 00000000000..08105a754b9 --- /dev/null +++ b/packages/emitter-framework/src/python/components/class-declaration/class-method.tsx @@ -0,0 +1,126 @@ +import { type Children, createContext, List, splitProps, useContext } from "@alloy-js/core"; +import * as py from "@alloy-js/python"; +import type { Operation } from "@typespec/compiler"; +import type { Typekit } from "@typespec/compiler/typekit"; +import { useTsp } from "../../../core/index.js"; +import { buildParameterDescriptors, getReturnType } from "../../utils/operation.js"; +import { TypeExpression } from "../type-expression/type-expression.jsx"; + +export const ClassMethodContext = createContext<"method" | "static" | "class" | undefined>( + undefined, +); +export const ClassMethodProvider = ClassMethodContext.Provider; + +export interface ClassMethodPropsWithType extends Omit { + type: Operation; + name?: string; + doc?: Children; + parametersMode?: "prepend" | "append" | "replace"; + methodType?: "method" | "class" | "static"; + abstract?: boolean; +} + +export type ClassMethodProps = ClassMethodPropsWithType | py.MethodDeclarationBaseProps; + +function createDocElement($: Typekit, props: ClassMethodProps) { + let docElement = undefined; + const docSource = props.doc ?? ("type" in props && $.type.getDoc(props.type)) ?? undefined; + if (docSource) { + // Doc provided as an array (paragraphs/nodes). Forward as description to preserve structure. + if (Array.isArray(docSource)) { + docElement = ; + } + // Doc provided as a string. Preserve line breaks by rendering each line on its own. + else if (typeof docSource === "string") { + const lines = docSource.split(/\r?\n/); + docElement = ( + + {lines.map((line) => ( + <>{line} + ))} + , + ]} + /> + ); + } + // Doc provided as JSX (e.g., a prebuilt ). Pass through unchanged. + else { + docElement = docSource as any; + } + } + return docElement; +} + +/** + * Get the method component based on the resolved method type. + * We prioritize the methodType prop provided in the ClassMethod component, + * and then the one provided in the context, and then we default to "method". + */ +function getResolvedMethodType(props: ClassMethodProps): "method" | "class" | "static" { + const ctxMethodType = useContext(ClassMethodContext); + const propMethodType = "methodType" in props ? (props as any).methodType : undefined; + return (propMethodType ?? ctxMethodType ?? "method") as "method" | "class" | "static"; +} + +/** + * A Python interface method. Pass the `type` prop to create the + * method by converting from a TypeSpec Operation. Any other props + * provided will take precedence. + */ +export function ClassMethod(props: Readonly) { + const { $ } = useTsp(); + const isTypeSpecTyped = "type" in props; + const docElement = createDocElement($, props); + const resolvedMethodType = getResolvedMethodType(props); + const MethodComponent = + resolvedMethodType === "static" + ? py.StaticMethodDeclaration + : resolvedMethodType === "class" + ? py.ClassMethodDeclaration + : py.MethodDeclaration; + + // Default to abstract when deriving from a TypeSpec operation (`type` prop present), + // unless explicitly overridden by props.abstract === false + const abstractFlag = (() => { + const explicit = (props as any).abstract as boolean | undefined; + if (explicit !== undefined) return explicit; + return !isTypeSpecTyped ? false : undefined; + })(); + + /** + * If the method does not come from the Typespec class declaration, return a standard Python method declaration. + * Have in mind that, with that, we lose some of the TypeSpec class declaration overrides. + */ + if (!isTypeSpecTyped) { + return ; + } + + const [efProps, updateProps, forwardProps] = splitProps( + props, + ["type"], + ["returnType", "parameters"], + ); + + const name = props.name ?? py.usePythonNamePolicy().getName(efProps.type.name, "function"); + const returnType = props.returnType ?? ; + const allParameters = buildParameterDescriptors(efProps.type.parameters, { + params: props.parameters, + mode: props.parametersMode, + }); + + return ( + <> + + + ); +} diff --git a/packages/emitter-framework/src/python/components/function-declaration/function-declaration.test.tsx b/packages/emitter-framework/src/python/components/function-declaration/function-declaration.test.tsx index 54e156af5b3..be374f47413 100644 --- a/packages/emitter-framework/src/python/components/function-declaration/function-declaration.test.tsx +++ b/packages/emitter-framework/src/python/components/function-declaration/function-declaration.test.tsx @@ -4,7 +4,7 @@ import { describe, expect, it } from "vitest"; import { getOutput } from "../../test-utils.js"; import { FunctionDeclaration } from "./function-declaration.jsx"; -describe("Typescript Function Declaration", () => { +describe("Python Function Declaration", () => { describe("Function bound to Typespec Types", () => { describe("Bound to Operation", () => { it("creates a function", async () => { diff --git a/packages/emitter-framework/src/python/components/function-declaration/function-declaration.tsx b/packages/emitter-framework/src/python/components/function-declaration/function-declaration.tsx index 4a72b477d78..5b03fd6c14c 100644 --- a/packages/emitter-framework/src/python/components/function-declaration/function-declaration.tsx +++ b/packages/emitter-framework/src/python/components/function-declaration/function-declaration.tsx @@ -13,7 +13,7 @@ export type FunctionDeclarationProps = | py.FunctionDeclarationProps; /** - * A TypeScript function declaration. Pass the `type` prop to create the + * A Python function declaration. Pass the `type` prop to create the * function declaration by converting from a TypeSpec Operation. Any other props * provided will take precedence. */ diff --git a/packages/emitter-framework/src/python/components/index.ts b/packages/emitter-framework/src/python/components/index.ts index dae9ef50776..8a91b6e3d26 100644 --- a/packages/emitter-framework/src/python/components/index.ts +++ b/packages/emitter-framework/src/python/components/index.ts @@ -1,3 +1,3 @@ export * from "./atom/atom.jsx"; +export * from "./class-declaration/class-declaration.jsx"; export * from "./function-declaration/function-declaration.jsx"; -export * from "./model-declaration/model-declaration.jsx"; diff --git a/packages/emitter-framework/src/python/components/interface-declaration/interface-declaration.test.tsx b/packages/emitter-framework/src/python/components/interface-declaration/interface-declaration.test.tsx deleted file mode 100644 index 70cc88f99ed..00000000000 --- a/packages/emitter-framework/src/python/components/interface-declaration/interface-declaration.test.tsx +++ /dev/null @@ -1,380 +0,0 @@ -import { Tester } from "#test/test-host.js"; -import { t, type TesterInstance } from "@typespec/compiler/testing"; -import { beforeEach, describe, expect, it } from "vitest"; -import { InterfaceDeclaration, InterfaceMethod } from "../../components/interface-declaration/interface-declaration.jsx"; -import { getOutput } from "../../test-utils.js"; - -describe("Python Model Declaration - Non-Record", () => { - let runner: TesterInstance; - - beforeEach(async () => { - runner = await Tester.createInstance(); - }); - - it("converts a model with a field that can be null", async () => { - const result = await runner.compile(t.code` - @test model ${t.model("Person")} { - age: int32; - address: string | null; - } - `); - - expect(getOutput(runner.program, [])).toRenderTo(` - from dataclasses import dataclass - - @dataclass - class Person: - age: int - address: str | None - - `); - }); - it("converts a model with an optional field", async () => { - const result = await runner.compile(t.code` - @test model ${t.model("Person")} { - id: int32; - address?: string; - } - `); - - expect(getOutput(runner.program, [])).toRenderTo(` - from dataclasses import dataclass - from dataclasses import field - - @dataclass - class Person: - id: int - address: str = field(default_factory=object) - - `); - }); - it("converts a model with an optional field that has a default", async () => { - const result = await runner.compile(t.code` - @test model ${t.model("Person")} { - age: int32; - address?: string = "N/A"; - } - `); - - expect(getOutput(runner.program, [])).toRenderTo(` - from dataclasses import dataclass - from dataclasses import field - - @dataclass - class Person: - age: int - address: str = field(default="N/A") - - `); - }); - it("converts a model with an optional field that can be null", async () => { - const result = await runner.compile(t.code` - @test model ${t.model("Person")} { - age: int32; - address?: string | null; - } - `); - - expect(getOutput(runner.program, [])).toRenderTo(` - from dataclasses import dataclass - from dataclasses import field - - @dataclass - class Person: - age: int - address: str | None = field(default=None) - - `); - }); - // it("converts a model with a special property type - never", async () => { - // const result = await runner.compile(t.code` - // @test model ${t.model("Address")} { - // state: TState; - // city: string; - // street: string; - // } - // @test model ${t.model("EuropeAddress")} is Address; - // `); - - // expect( - // getOutput(runner.program, [ - // , - // , - // ]), - // ).toRenderTo(` - // from dataclasses import dataclass - - // @dataclass - // class Address: - // state: any - // city: str - // street: str - - - // @dataclass - // class EuropeAddress: - // city: str - // street: str - - // `); - // }); - // it("converts a model that extends a generic with never", async () => { - // const result = await runner.compile(t.code` - // @test model ${t.model("Address")} { - // state: TState; - // city: string; - // } - // @test model ${t.model("EuropeAddress")} extends Address { - // street: string; - // }; - // `); - - // expect( - // getOutput(runner.program, [ - // , - // , - // ]), - // ).toRenderTo(` - // from dataclasses import dataclass - - // @dataclass - // class Address: - // state: any - // city: str - - - // @dataclass - // class EuropeAddress(Address): - // street: str - - // `); - // }); - it("converts a model with model inheritance through extends", async () => { - const result = await runner.compile(t.code` - @test model ${t.model("Identified")} { - id: int32; - } - @test model ${t.model("Admin")} extends Identified { - role: "admin"; - }; - `); - - expect( - getOutput(runner.program, [ - , - , - ]), - ).toRenderTo(` - from dataclasses import dataclass - from typing import Literal - - @dataclass - class Identified: - id: int - - - @dataclass - class Admin(Identified): - role: Literal["admin"] = "admin" - - `); - }); - it("converts a model with model inheritance through spreads", async () => { - const result = await runner.compile(t.code` - @test model ${t.model("Animal")} { - species: string; - } - - @test model ${t.model("Dog")} { - ...Animal; - age: int32; - } - `); - - expect( - getOutput(runner.program, [ - , - , - ]), - ).toRenderTo(` - from dataclasses import dataclass - - @dataclass - class Animal: - species: str - - - @dataclass - class Dog: - species: str - age: int - - `); - }); - it("declares a model with multi line docs, explicit docs passed", async () => { - const result = await runner.compile(t.code` - /** - * This is a test - * with multiple lines - */ - @test model ${t.model("Foo")} { - KnownProp: string; - } - `); - - expect( - getOutput(runner.program, [ - , - ]), - ).toRenderTo(` - from dataclasses import dataclass - - @dataclass - class Foo: - """ - This is a test with multiple lines - """ - known_prop: str - - `); - }); - it("declares a model with multi line docs, docs overridden", async () => { - const result = await runner.compile(t.code` - /** - * This is a test - * with multiple lines - */ - @test model ${t.model("Foo")} { - KnownProp: string; - } - `); - - expect( - getOutput(runner.program, [ - - ]), - ).toRenderTo(` - from dataclasses import dataclass - - @dataclass - class Foo: - """ - This is an overridden doc comment with multiple lines - """ - known_prop: str - - `); - }); - it("declares a model with @doc", async () => { - const result = await runner.compile(t.code` - /** - * This is a test - * with multiple lines - */ - @doc("This is a test") - @test model ${t.model("Foo")} { - knownProp: string; - } - `); - - expect( - getOutput(runner.program, [ - , - ]), - ).toRenderTo(` - from dataclasses import dataclass - - @dataclass - class Foo: - """ - This is a test - """ - known_prop: str - - `); - }); - it("declares a model with a property that has doc", async () => { - const result = await runner.compile(t.code` - /** - * This is a test - */ - @test model ${t.model("Foo")} { - @doc("This is a known property") - knownProp: string; - } - `); - - expect( - getOutput(runner.program, [ - , - ]), - ).toRenderTo(` - from dataclasses import dataclass - - @dataclass - class Foo: - """ - This is a test - """ - # This is a known property - known_prop: str - - `); - }); -}); - -describe("Interfaces", () => { - let runner: TesterInstance; - - beforeEach(async () => { - runner = await Tester.createInstance(); - }); - - it("creates an interface method", async () => { - const result = await runner.compile(t.code` - @test model ${t.model("Item")} { - id: string; - name: string; - } - - @test interface ${t.interface("Person")} { - get(id: string): Item; - put(item: Item): void; - } - `); - - expect( - getOutput(runner.program, [ - , - - - - - ]), - ).toRenderTo(` - from dataclasses import dataclass - from typing import Protocol - - @dataclass - class Item: - id: str - name: str - - - - class Person(Protocol): - @staticmethod - def get(id: str) -> Item: - ... - - @staticmethod - def put(item: Item) -> None: - ... - - - `); - }); -}); diff --git a/packages/emitter-framework/src/python/components/interface-declaration/interface-declaration.tsx b/packages/emitter-framework/src/python/components/interface-declaration/interface-declaration.tsx deleted file mode 100644 index f0ef9aface9..00000000000 --- a/packages/emitter-framework/src/python/components/interface-declaration/interface-declaration.tsx +++ /dev/null @@ -1,275 +0,0 @@ -import { code, For, mapJoin, Prose, Show, splitProps, type Children } from "@alloy-js/core"; -import * as py from "@alloy-js/python"; -import { - isNeverType, - type BooleanValue, - type Interface, - type Model, - type ModelProperty, - type NumericValue, - type Operation, - type RekeyableMap, - type StringValue, -} from "@typespec/compiler"; -import type { Typekit } from "@typespec/compiler/typekit"; -import { createRekeyableMap } from "@typespec/compiler/utils"; -import { getHttpPart } from "@typespec/http"; -import { useTsp } from "../../../core/context/tsp-context.js"; -import { reportDiagnostic } from "../../../lib.js"; -import { dataclassesModule, typingModule } from "../../builtins.js"; -import { declarationRefkeys, efRefkey } from "../../utils/refkey.js"; -import { Atom } from "../atom/atom.jsx"; -import { TypeExpression } from "../type-expression/type-expression.jsx"; -import { buildParameterDescriptors, getReturnType } from "#python/utils/operation.js"; - -export interface InterfaceDeclarationProps extends Omit { - type: Model | Interface; - name?: string; -} - -export function InterfaceDeclaration(props: InterfaceDeclarationProps) { - const { $ } = useTsp(); - - const namePolicy = py.usePythonNamePolicy(); - - let name = props.name ?? props.type.name; - - if (!name || name === "") { - reportDiagnostic($.program, { code: "type-declaration-missing-name", target: props.type }); - } - - name = namePolicy.getName(name, "class"); - - let typeMembers: RekeyableMap | undefined; - if ($.model.is(props.type)) { - // Model - typeMembers = $.model.getProperties(props.type); - } else { - // Interface - typeMembers = createRekeyableMap( - (props.type as { operations: Map }).operations, - ); - } - - const validTypeMembers = Array.from(typeMembers.values()).filter((member) => { - if ($.modelProperty.is(member) && isNeverType(member.type)) { - return false; - } - return true; - }); - let modelTypeMembers = null; - if (validTypeMembers.length > 0) { - modelTypeMembers = ( - - {(typeMember) => { - return ; - }} - - ); - } - - const refkeys = declarationRefkeys(props.refkey, props.type); - const basesType = props.bases ?? getExtendsType($, props.type); - const doc = props.doc ?? $.type.getDoc(props.type); - let docElement = null; - if (doc) { - docElement = {doc}]} />; - } - let dataclass: any = null; - let protocolBase: any = null; - if ($.model.is(props.type)) { - dataclass = dataclassesModule["."]["dataclass"]; - } else { - // Interface - use Protocol - protocolBase = typingModule["."]["Protocol"]; - } - - return ( - <> - - @{dataclass} - - - {$.model.is(props.type) ? modelTypeMembers : null} - {props.children && ( - - {(child) => child} - - )} - - - ); -} - -function getExtendsType($: Typekit, type: Model | Interface): Children | undefined { - if (!$.model.is(type)) { - return undefined; - } - - const extending: Children[] = []; - - if (type.baseModel) { - if ($.array.is(type.baseModel)) { - extending.push(); - } else if ($.record.is(type.baseModel)) { - throw new Error("Extension to Record models is not implemented"); - } else { - extending.push(efRefkey(type.baseModel)); - } - } - - const indexType = $.model.getIndexType(type); - if (indexType) { - // Ex.: model Person is Record - if ($.record.is(indexType)) { - throw new Error("Extension to Record models is not implemented"); - } else { - extending.push(); - } - } - - if (extending.length === 0) { - return undefined; - } - - return mapJoin( - () => extending, - (ext) => ext, - { joiner: ", " }, - ); -} - -export interface InterfaceMemberProps { - type: ModelProperty | Operation; - doc?: Children; - optional?: boolean; -} - -export function InterfaceMember(props: InterfaceMemberProps) { - const { $ } = useTsp(); - const doc = props.doc ?? $.type.getDoc(props.type); - const namePolicy = py.usePythonNamePolicy(); - const name = namePolicy.getName(props.type.name, "class-member"); - - if ($.modelProperty.is(props.type)) { - if (isNeverType(props.type.type)) { - return null; - } - - let unpackedType = props.type.type; - let unionType = undefined; - let otherProps = {}; - - const part = getHttpPart($.program, props.type.type); - if (part) { - unpackedType = part.type; - } - let elements = []; - if (unpackedType.kind === "Union") { - elements = (unpackedType as any).options.map((opt: any) => { - return ; - }); - } else if ($.literal.is(unpackedType)) { - const typingElements = ; - elements = [code`${typingModule["."]["Literal"]}[${typingElements}]`]; - } else { - elements = []; - } - unionType = {elements}; - - if ($.literal.is(unpackedType)) { - let value: StringValue | NumericValue | BooleanValue; - if (typeof unpackedType.value === "string") { - value = $.value.createString(unpackedType.value); - } else if (typeof unpackedType.value === "number") { - value = $.value.createNumeric(unpackedType.value); - } else { - value = $.value.createBoolean(unpackedType.value); - } - otherProps = { - initializer: code`${()}`, - }; - } else { - if (props.optional || props.type.optional) { - // Optional field with no default value, use a default_factory to object - // as we can't represent a non-required field in Python's dataclasses - let fieldValue = code`default_factory=object`; - if (props.type.defaultValue) { - // Optional field with default value, default to value - fieldValue = code`default=${()}`; - } - // If one of the union types is null, set default to None - if ( - unpackedType.kind === "Union" && - Array.isArray((unpackedType as any).options) && - (unpackedType as any).options.some( - (opt: any) => opt && opt.kind === "Intrinsic" && opt.name === "null", - ) - ) { - fieldValue = code`default=None`; - } - otherProps = { - initializer: code`${dataclassesModule["."]["field"]}(${fieldValue})`, - }; - } - } - - return ( - - ); - } -} - -export interface InterfaceMethodProps extends Omit { - type: Operation; - name?: string; - doc?: Children; - parametersMode?: "prepend" | "append" | "replace"; -} - -export function InterfaceMethod(props: Readonly) { - const { $ } = useTsp(); - - const [efProps, updateProps, forwardProps] = splitProps( - props, - ["type"], - ["returnType", "parameters"], - ); - - const name = props.name ?? py.usePythonNamePolicy().getName(efProps.type.name, "function"); - const returnType = props.returnType ?? ; - const allParameters = buildParameterDescriptors(efProps.type.parameters, { - params: props.parameters, - mode: props.parametersMode, - }); - - const doc = props.doc ?? $.type.getDoc(props.type); - - return ( - <> - @staticmethod - - - ... - - - ); -} diff --git a/packages/emitter-framework/src/python/components/model-declaration/model-declaration.test.tsx b/packages/emitter-framework/src/python/components/model-declaration/model-declaration.test.tsx deleted file mode 100644 index 90eab27a39c..00000000000 --- a/packages/emitter-framework/src/python/components/model-declaration/model-declaration.test.tsx +++ /dev/null @@ -1,327 +0,0 @@ -import { Tester } from "#test/test-host.js"; -import { t, type TesterInstance } from "@typespec/compiler/testing"; -import { beforeEach, describe, expect, it } from "vitest"; -import { InterfaceDeclaration } from "../../index.jsx"; -import { getOutput } from "../../test-utils.js"; - -describe("Python Model Declaration - Non-Record", () => { - let runner: TesterInstance; - - beforeEach(async () => { - runner = await Tester.createInstance(); - }); - - it("converts a model with a field that can be null", async () => { - const result = await runner.compile(t.code` - @test model ${t.model("Person")} { - age: int32; - address: string | null; - } - `); - - expect(getOutput(runner.program, [])).toRenderTo(` - from dataclasses import dataclass - - @dataclass - class Person: - age: int - address: str | None - - `); - }); - it("converts a model with an optional field", async () => { - const result = await runner.compile(t.code` - @test model ${t.model("Person")} { - id: int32; - address?: string; - } - `); - - expect(getOutput(runner.program, [])).toRenderTo(` - from dataclasses import dataclass - from dataclasses import field - - @dataclass - class Person: - id: int - address: str = field(default_factory=object) - - `); - }); - it("converts a model with an optional field that has a default", async () => { - const result = await runner.compile(t.code` - @test model ${t.model("Person")} { - age: int32; - address?: string = "N/A"; - } - `); - - expect(getOutput(runner.program, [])).toRenderTo(` - from dataclasses import dataclass - from dataclasses import field - - @dataclass - class Person: - age: int - address: str = field(default="N/A") - - `); - }); - it("converts a model with an optional field that can be null", async () => { - const result = await runner.compile(t.code` - @test model ${t.model("Person")} { - age: int32; - address?: string | null; - } - `); - - expect(getOutput(runner.program, [])).toRenderTo(` - from dataclasses import dataclass - from dataclasses import field - - @dataclass - class Person: - age: int - address: str | None = field(default=None) - - `); - }); - // it("converts a model with a special property type - never", async () => { - // const result = await runner.compile(t.code` - // @test model ${t.model("Address")} { - // state: TState; - // city: string; - // street: string; - // } - // @test model ${t.model("EuropeAddress")} is Address; - // `); - - // expect( - // getOutput(runner.program, [ - // , - // , - // ]), - // ).toRenderTo(` - // from dataclasses import dataclass - - // @dataclass - // class Address: - // state: any - // city: str - // street: str - - - // @dataclass - // class EuropeAddress: - // city: str - // street: str - - // `); - // }); - // it("converts a model that extends a generic with never", async () => { - // const result = await runner.compile(t.code` - // @test model ${t.model("Address")} { - // state: TState; - // city: string; - // } - // @test model ${t.model("EuropeAddress")} extends Address { - // street: string; - // }; - // `); - - // expect( - // getOutput(runner.program, [ - // , - // , - // ]), - // ).toRenderTo(` - // from dataclasses import dataclass - - // @dataclass - // class Address: - // state: any - // city: str - - - // @dataclass - // class EuropeAddress(Address): - // street: str - - // `); - // }); - it("converts a model with model inheritance through extends", async () => { - const result = await runner.compile(t.code` - @test model ${t.model("Identified")} { - id: int32; - } - @test model ${t.model("Admin")} extends Identified { - role: "admin"; - }; - `); - - expect( - getOutput(runner.program, [ - , - , - ]), - ).toRenderTo(` - from dataclasses import dataclass - from typing import Literal - - @dataclass - class Identified: - id: int - - - @dataclass - class Admin(Identified): - role: Literal["admin"] = "admin" - - `); - }); - it("converts a model with model inheritance through spreads", async () => { - const result = await runner.compile(t.code` - @test model ${t.model("Animal")} { - species: string; - } - - @test model ${t.model("Dog")} { - ...Animal; - age: int32; - } - `); - - expect( - getOutput(runner.program, [ - , - , - ]), - ).toRenderTo(` - from dataclasses import dataclass - - @dataclass - class Animal: - species: str - - - @dataclass - class Dog: - species: str - age: int - - `); - }); - it("declares a model with multi line docs, explicit docs passed", async () => { - const result = await runner.compile(t.code` - /** - * This is a test - * with multiple lines - */ - @test model ${t.model("Foo")} { - KnownProp: string; - } - `); - - expect( - getOutput(runner.program, [ - , - ]), - ).toRenderTo(` - from dataclasses import dataclass - - @dataclass - class Foo: - """ - This is a test with multiple lines - """ - known_prop: str - - `); - }); - it("declares a model with multi line docs, docs overridden", async () => { - const result = await runner.compile(t.code` - /** - * This is a test - * with multiple lines - */ - @test model ${t.model("Foo")} { - KnownProp: string; - } - `); - - expect( - getOutput(runner.program, [ - - ]), - ).toRenderTo(` - from dataclasses import dataclass - - @dataclass - class Foo: - """ - This is an overridden doc comment with multiple lines - """ - known_prop: str - - `); - }); - it("declares a model with @doc", async () => { - const result = await runner.compile(t.code` - /** - * This is a test - * with multiple lines - */ - @doc("This is a test") - @test model ${t.model("Foo")} { - knownProp: string; - } - `); - - expect( - getOutput(runner.program, [ - , - ]), - ).toRenderTo(` - from dataclasses import dataclass - - @dataclass - class Foo: - """ - This is a test - """ - known_prop: str - - `); - }); - it("declares a model with a property that has doc", async () => { - const result = await runner.compile(t.code` - /** - * This is a test - */ - @test model ${t.model("Foo")} { - @doc("This is a known property") - knownProp: string; - } - `); - - expect( - getOutput(runner.program, [ - , - ]), - ).toRenderTo(` - from dataclasses import dataclass - - @dataclass - class Foo: - """ - This is a test - """ - # This is a known property - known_prop: str - - `); - }); -}); diff --git a/packages/emitter-framework/src/python/components/model-declaration/model-declaration.tsx b/packages/emitter-framework/src/python/components/model-declaration/model-declaration.tsx deleted file mode 100644 index dcc4653e608..00000000000 --- a/packages/emitter-framework/src/python/components/model-declaration/model-declaration.tsx +++ /dev/null @@ -1,227 +0,0 @@ -import { code, For, mapJoin, Prose, Show, type Children } from "@alloy-js/core"; -import * as py from "@alloy-js/python"; -import { - isNeverType, - type BooleanValue, - type Interface, - type Model, - type ModelProperty, - type NumericValue, - type Operation, - type RekeyableMap, - type StringValue, -} from "@typespec/compiler"; -import type { Typekit } from "@typespec/compiler/typekit"; -import { createRekeyableMap } from "@typespec/compiler/utils"; -import { getHttpPart } from "@typespec/http"; -import { useTsp } from "../../../core/context/tsp-context.js"; -import { reportDiagnostic } from "../../../lib.js"; -import { dataclassesModule, typingExtensionsModule, typingModule } from "../../builtins.js"; -import { declarationRefkeys, efRefkey } from "../../utils/refkey.js"; -import { Atom } from "../atom/atom.jsx"; -import { TypeExpression } from "../type-expression/type-expression.jsx"; - -export interface InterfaceDeclarationProps extends Omit { - type: Model | Interface; - name?: string; -} - -export function InterfaceDeclaration(props: InterfaceDeclarationProps) { - const { $ } = useTsp(); - - const namePolicy = py.usePythonNamePolicy(); - - let name = props.name ?? props.type.name; - - if (!name || name === "") { - reportDiagnostic($.program, { code: "type-declaration-missing-name", target: props.type }); - } - - name = namePolicy.getName(name, "class"); - const doc = props.doc ?? $.type.getDoc(props.type); - let docElement = null; - if (doc) { - docElement = {doc}]} />; - } - - let typeMembers: RekeyableMap | undefined; - if ($.model.is(props.type)) { - // Model - typeMembers = $.model.getProperties(props.type); - } else { - // Interface - typeMembers = createRekeyableMap( - (props.type as { operations: Map }).operations, - ); - } - - // Ensure that we have members to render, otherwise skip rendering the ender property. - const validTypeMembers = Array.from(typeMembers.values()).filter((member) => { - if ($.modelProperty.is(member) && isNeverType(member.type)) { - return false; - } - return true; - }); - let modelTypeMembers = null; - if (validTypeMembers.length > 0) { - modelTypeMembers = ( - - {(typeMember) => { - return ; - }} - - ); - } - - const refkeys = declarationRefkeys(props.refkey, props.type); - const basesType = props.bases ?? getExtendsType($, props.type); - // Assign dataclass if TypedDict isn't one of the basesType - let dataclass: any = null; - if ($.model.is(props.type)) { - dataclass = dataclassesModule["."]["dataclass"]; - } - - return ( - <> - @{dataclass} - - - {modelTypeMembers} - {props.children} - - - ); -} - -function getExtendsType($: Typekit, type: Model | Interface): Children | undefined { - if (!$.model.is(type)) { - return undefined; - } - - const extending: Children[] = []; - - if (type.baseModel) { - if ($.array.is(type.baseModel)) { - extending.push(); - } else if ($.record.is(type.baseModel)) { - // Ex. model Person extends Record - extending.push(typingExtensionsModule["."]["TypedDict"]); - extending.push(code`extra_items=str`); - } else { - extending.push(efRefkey(type.baseModel)); - } - } - - const indexType = $.model.getIndexType(type); - if (indexType) { - // Ex.: model Person is Record - if ($.record.is(indexType)) { - extending.push(typingExtensionsModule["."]["TypedDict"]); - extending.push(code`extra_items=str`); - } else { - extending.push(); - } - } - - if (extending.length === 0) { - return undefined; - } - - return mapJoin( - () => extending, - (ext) => ext, - { joiner: ", " }, - ); -} - -export interface InterfaceMemberProps { - type: ModelProperty | Operation; - doc?: Children; - optional?: boolean; -} - -export function InterfaceMember(props: InterfaceMemberProps) { - const { $ } = useTsp(); - const doc = props.doc ?? $.type.getDoc(props.type); - const namePolicy = py.usePythonNamePolicy(); - const name = namePolicy.getName(props.type.name, "class-member"); - - if ($.modelProperty.is(props.type)) { - if (isNeverType(props.type.type)) { - return null; - } - - let unpackedType = props.type.type; - let unionType = undefined; - let otherProps = {}; - - const part = getHttpPart($.program, props.type.type); - if (part) { - unpackedType = part.type; - } - let elements = []; - if (unpackedType.kind === "Union") { - elements = (unpackedType as any).options.map((opt: any) => { - return ; - }); - } else if ($.literal.is(unpackedType)) { - const typingElements = ; - elements = [code`${typingModule["."]["Literal"]}[${typingElements}]`]; - } else { - elements = []; - } - unionType = {elements}; - - if ($.literal.is(unpackedType)) { - let value: StringValue | NumericValue | BooleanValue; - if (typeof unpackedType.value === "string") { - value = $.value.createString(unpackedType.value); - } else if (typeof unpackedType.value === "number") { - value = $.value.createNumeric(unpackedType.value); - } else { - value = $.value.createBoolean(unpackedType.value); - } - otherProps = { - initializer: code`${()}`, - }; - } else { - if (props.optional || props.type.optional) { - // Optional field with no default value, use a default_factory to object - // as we can't represent a non-required field in Python's dataclasses - let fieldValue = code`default_factory=object`; - if (props.type.defaultValue) { - // Optional field with default value, default to value - fieldValue = code`default=${()}`; - } - // If one of the union types is null, set default to None - if ( - unpackedType.kind === "Union" && - Array.isArray((unpackedType as any).options) && - (unpackedType as any).options.some( - (opt: any) => opt && opt.kind === "Intrinsic" && opt.name === "null", - ) - ) { - fieldValue = code`default=None`; - } - otherProps = { - initializer: code`${dataclassesModule["."]["field"]}(${fieldValue})`, - }; - } - } - - return ( - - ); - } -} diff --git a/packages/emitter-framework/src/python/test-utils.tsx b/packages/emitter-framework/src/python/test-utils.tsx index 6d8d4e16c73..16163171173 100644 --- a/packages/emitter-framework/src/python/test-utils.tsx +++ b/packages/emitter-framework/src/python/test-utils.tsx @@ -2,14 +2,28 @@ import { Output } from "#core/components/index.js"; import { type Children } from "@alloy-js/core"; import * as py from "@alloy-js/python"; import type { Program } from "@typespec/compiler"; -import { datetimeModule, decimalModule, typingModule } from "./builtins.js"; +import { + abcModule, + dataclassesModule, + datetimeModule, + decimalModule, + typingModule, +} from "./builtins.js"; export function getOutput(program: Program, children: Children[]): Children { const policy = py.createPythonNamePolicy(); return ( {children} diff --git a/packages/emitter-framework/src/python/utils/operation.ts b/packages/emitter-framework/src/python/utils/operation.ts index db8c5bc84af..c6b511f62e3 100644 --- a/packages/emitter-framework/src/python/utils/operation.ts +++ b/packages/emitter-framework/src/python/utils/operation.ts @@ -1,5 +1,5 @@ import { refkey, type Refkey } from "@alloy-js/core"; -import * as ts from "@alloy-js/typescript"; +import * as py from "@alloy-js/python"; import type { Model, ModelProperty, Operation, Type } from "@typespec/compiler"; import { useTsp } from "../../core/index.js"; import { TypeExpression } from "../components/type-expression/type-expression.jsx"; @@ -20,7 +20,7 @@ export function getReturnType( } export interface BuildParameterDescriptorsOptions { - params?: ts.ParameterDescriptor[] | string[] | undefined; + params?: (string | py.ParameterDescriptor)[] | undefined; mode?: "prepend" | "append" | "replace"; suffixRefkey?: Refkey; } @@ -28,7 +28,7 @@ export interface BuildParameterDescriptorsOptions { export function buildParameterDescriptors( type: Model, options: BuildParameterDescriptorsOptions = {}, -): ts.ParameterDescriptor[] | undefined { +): py.ParameterDescriptor[] | undefined { const { $ } = useTsp(); const suffixRefkey = options.suffixRefkey ?? refkey(); const optionsParams = normalizeParameters(options.params); @@ -54,9 +54,9 @@ export function buildParameterDescriptors( export function buildParameterDescriptor( modelProperty: ModelProperty, suffixRefkey: Refkey, -): ts.ParameterDescriptor { +): py.ParameterDescriptor { const { $ } = useTsp(); - const namePolicy = ts.useTSNamePolicy(); + const namePolicy = py.usePythonNamePolicy(); const paramName = namePolicy.getName(modelProperty.name, "parameter"); const isOptional = modelProperty.optional || modelProperty.defaultValue !== undefined; const doc = $.type.getDoc(modelProperty); @@ -64,7 +64,6 @@ export function buildParameterDescriptor( doc, name: paramName, refkey: efRefkey(modelProperty, suffixRefkey), - optional: isOptional, type: TypeExpression({ type: modelProperty.type }), }; } @@ -74,8 +73,8 @@ export function buildParameterDescriptor( * a parameter descriptor array. */ function normalizeParameters( - params: ts.ParameterDescriptor[] | string[] | undefined, -): ts.ParameterDescriptor[] { + params: (string | py.ParameterDescriptor)[] | undefined, +): py.ParameterDescriptor[] { if (!params) return []; return params.map((param) => { From 5c176cea3aa8c4712990b5948b731ebe32e5cbce Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Tue, 7 Oct 2025 22:15:19 +0000 Subject: [PATCH 10/25] Missing files --- pnpm-lock.yaml | 4118 ++++++++++++++++++++++--------------------- pnpm-workspace.yaml | 20 +- 2 files changed, 2121 insertions(+), 2017 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 480cde8dd5c..a1030610860 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,6 +6,9 @@ settings: overrides: cross-spawn@>=7.0.0 <7.0.5: ^7.0.5 + '@alloy-js/core': ^0.21.0-dev.10 + '@alloy-js/python': ^0.2.0-dev.4 + rollup: 4.49.0 importers: @@ -25,7 +28,7 @@ importers: version: 9.32.0 '@microsoft/api-extractor': specifier: ^7.52.1 - version: 7.52.9(@types/node@24.1.0) + version: 7.52.9(@types/node@24.3.3) '@octokit/core': specifier: ^7.0.2 version: 7.0.3 @@ -39,14 +42,14 @@ importers: specifier: ^4.0.9 version: 4.0.9 '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@vitest/coverage-v8': specifier: ^3.1.2 version: 3.2.4(vitest@3.2.4) '@vitest/eslint-plugin': specifier: ^1.1.38 - version: 1.3.4(eslint@9.32.0)(typescript@5.8.3)(vitest@3.2.4) + version: 1.3.4(eslint@9.32.0)(typescript@5.9.3)(vitest@3.2.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -58,13 +61,13 @@ importers: version: 9.32.0 eslint-plugin-import: specifier: ^2.31.0 - version: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0)(typescript@5.8.3))(eslint@9.32.0) + version: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0)(typescript@5.9.3))(eslint@9.32.0) eslint-plugin-react-hooks: specifier: 5.2.0 version: 5.2.0(eslint@9.32.0) eslint-plugin-unicorn: - specifier: ^60.0.0 - version: 60.0.0(eslint@9.32.0) + specifier: ^61.0.2 + version: 61.0.2(eslint@9.32.0) micromatch: specifier: ^4.0.8 version: 4.0.8 @@ -82,7 +85,7 @@ importers: version: 0.14.1 prettier-plugin-organize-imports: specifier: ~4.2.0 - version: 4.2.0(prettier@3.6.2)(typescript@5.8.3) + version: 4.2.0(prettier@3.6.2)(typescript@5.9.3) prettier-plugin-sh: specifier: ^0.17.4 version: 0.17.4(prettier@3.6.2) @@ -91,22 +94,22 @@ importers: version: 6.0.1 syncpack: specifier: ^13.0.3 - version: 13.0.4(typescript@5.8.3) + version: 13.0.4(typescript@5.9.3) tsx: specifier: ^4.19.3 version: 4.20.3 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 typescript-eslint: specifier: ^8.27.0 - version: 8.38.0(eslint@9.32.0)(typescript@5.8.3) + version: 8.38.0(eslint@9.32.0)(typescript@5.9.3) vite-plugin-node-polyfills: specifier: ^0.24.0 - version: 0.24.0(rollup@4.45.1)(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 0.24.0(rollup@4.49.0)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) yaml: specifier: ~2.8.0 version: 2.8.0 @@ -116,8 +119,8 @@ importers: packages/asset-emitter: devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@typespec/compiler': specifier: workspace:^ version: link:../compiler @@ -134,20 +137,20 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/astro-utils: dependencies: '@astrojs/check': specifier: ^0.9.4 - version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.8.3) + version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.3) '@astrojs/starlight': specifier: ^0.35.1 - version: 0.35.2(astro@5.12.5(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0)(@types/node@24.1.0)(encoding@0.1.13)(rollup@4.45.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)) + version: 0.35.2(astro@5.12.5(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0)(@types/node@24.3.3)(encoding@0.1.13)(rollup@4.49.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.0)) '@expressive-code/core': specifier: ^0.41.2 version: 0.41.3 @@ -156,7 +159,7 @@ importers: version: link:../playground astro-expressive-code: specifier: ^0.41.2 - version: 0.41.3(astro@5.12.5(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0)(@types/node@24.1.0)(encoding@0.1.13)(rollup@4.45.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)) + version: 0.41.3(astro@5.12.5(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0)(@types/node@24.3.3)(encoding@0.1.13)(rollup@4.49.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.0)) pathe: specifier: ^2.0.3 version: 2.0.3 @@ -164,21 +167,21 @@ importers: specifier: ~18.3.1 version: 18.3.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 devDependencies: '@types/react': specifier: ~18.3.11 version: 18.3.23 astro: specifier: ^5.5.6 - version: 5.12.5(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0)(@types/node@24.1.0)(encoding@0.1.13)(rollup@4.45.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) + version: 5.12.5(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0)(@types/node@24.3.3)(encoding@0.1.13)(rollup@4.49.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.0) packages/best-practices: devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@typespec/compiler': specifier: workspace:^ version: link:../compiler @@ -195,23 +198,23 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/bundle-uploader: dependencies: '@azure/identity': - specifier: ~4.10.1 - version: 4.10.2 + specifier: ~4.12.0 + version: 4.12.0 '@azure/storage-blob': - specifier: ~12.27.0 - version: 12.27.0 + specifier: ~12.28.0 + version: 12.28.0 '@pnpm/workspace.find-packages': specifier: ^1000.0.24 - version: 1000.0.30(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0))(@types/node@24.1.0)(typanion@3.14.0) + version: 1000.0.30(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3))(@types/node@24.3.3)(typanion@3.14.0) '@typespec/bundler': specifier: workspace:^ version: link:../bundler @@ -226,8 +229,8 @@ importers: version: 7.7.2 devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@types/semver': specifier: ^7.5.8 version: 7.7.0 @@ -244,11 +247,11 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/bundler: dependencies: @@ -272,8 +275,8 @@ importers: version: 18.0.0 devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@types/yargs': specifier: ~17.0.33 version: 17.0.33 @@ -290,14 +293,14 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vite: specifier: ^7.0.5 - version: 7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) + version: 7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/compiler: dependencies: @@ -306,7 +309,7 @@ importers: version: 7.27.1 '@inquirer/prompts': specifier: ^7.4.0 - version: 7.8.0(@types/node@24.1.0) + version: 7.8.0(@types/node@24.3.3) ajv: specifier: ~8.17.1 version: 8.17.1 @@ -360,8 +363,8 @@ importers: specifier: ~4.2.5 version: 4.2.6 '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@types/semver': specifier: ^7.5.8 version: 7.7.0 @@ -396,11 +399,11 @@ importers: specifier: workspace:^ version: link:../tmlanguage-generator typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) vscode-oniguruma: specifier: ~2.0.1 version: 2.0.1 @@ -411,33 +414,27 @@ importers: packages/emitter-framework: dependencies: '@alloy-js/csharp': - specifier: ^0.19.0 - version: 0.19.0 + specifier: ^0.20.0 + version: 0.20.0 devDependencies: '@alloy-js/cli': - specifier: ^0.19.0 - version: 0.19.0 + specifier: ^0.20.0 + version: 0.20.0 '@alloy-js/core': - specifier: ^0.19.0 - version: 0.19.0 + specifier: ^0.21.0-dev.10 + version: 0.21.0-dev.10 '@alloy-js/python': - specifier: ^0.0.1 - version: 0.0.1 + specifier: ^0.2.0-dev.4 + version: 0.2.0-dev.4 '@alloy-js/rollup-plugin': specifier: ^0.1.0 - version: 0.1.0(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@4.45.1) + version: 0.1.0(@babel/core@7.28.4)(@types/babel__core@7.20.5)(rollup@4.49.0) '@alloy-js/typescript': - specifier: ^0.19.0 - version: 0.19.0 + specifier: ^0.20.0 + version: 0.20.0 '@typespec/compiler': specifier: workspace:^ version: link:../compiler - '@typespec/http': - specifier: workspace:^ - version: link:../http - '@typespec/rest': - specifier: workspace:^ - version: link:../rest concurrently: specifier: ^9.1.2 version: 9.2.0 @@ -454,20 +451,20 @@ importers: specifier: ^0.23.2 version: 0.23.5 tree-sitter-javascript: - specifier: ^0.23.0 - version: 0.23.1 + specifier: ^0.25.0 + version: 0.25.0 tree-sitter-python: - specifier: ^0.23.2 - version: 0.23.6 + specifier: ^0.25.0 + version: 0.25.0 tree-sitter-typescript: specifier: ^0.23.0 version: 0.23.2 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) web-tree-sitter: specifier: ^0.25.4 version: 0.25.8 @@ -476,17 +473,17 @@ importers: dependencies: '@typescript-eslint/utils': specifier: ^8.27.0 - version: 8.38.0(eslint@9.32.0)(typescript@5.8.3) + version: 8.38.0(eslint@9.32.0)(typescript@5.9.3) devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@typescript-eslint/parser': specifier: ^8.27.0 - version: 8.38.0(eslint@9.32.0)(typescript@5.8.3) + version: 8.38.0(eslint@9.32.0)(typescript@5.9.3) '@typescript-eslint/rule-tester': specifier: ^8.27.0 - version: 8.38.0(eslint@9.32.0)(typescript@5.8.3) + version: 8.38.0(eslint@9.32.0)(typescript@5.9.3) '@typescript-eslint/types': specifier: ^8.27.0 version: 8.38.0 @@ -506,17 +503,17 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/events: devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@typespec/compiler': specifier: workspace:^ version: link:../compiler @@ -539,17 +536,17 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/html-program-viewer: dependencies: '@fluentui/react-components': - specifier: ~9.67.0 - version: 9.67.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + specifier: ~9.70.0 + version: 9.70.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': specifier: ^2.0.292 version: 2.0.307(react@18.3.1) @@ -579,8 +576,8 @@ importers: specifier: ^16.2.0 version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@types/react': specifier: ~18.3.11 version: 18.3.23 @@ -594,8 +591,8 @@ importers: specifier: workspace:^ version: link:../react-components '@vitejs/plugin-react': - specifier: ~4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + specifier: ~5.0.2 + version: 5.0.4(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) '@vitest/coverage-v8': specifier: ^3.1.2 version: 3.2.4(vitest@3.2.4) @@ -609,29 +606,29 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vite: specifier: ^7.0.5 - version: 7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) + version: 7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) vite-plugin-checker: specifier: ^0.10.1 - version: 0.10.2(eslint@9.32.0)(optionator@0.9.4)(typescript@5.8.3)(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 0.10.2(eslint@9.32.0)(optionator@0.9.4)(typescript@5.9.3)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@24.1.0)(rollup@4.45.1)(typescript@5.8.3)(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 4.5.4(@types/node@24.3.3)(rollup@4.49.0)(typescript@5.9.3)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) vite-plugin-node-polyfills: specifier: ^0.24.0 - version: 0.24.0(rollup@4.45.1)(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 0.24.0(rollup@4.49.0)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/http: devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@typespec/compiler': specifier: workspace:^ version: link:../compiler @@ -657,29 +654,29 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/http-client: devDependencies: '@alloy-js/cli': - specifier: ^0.19.0 - version: 0.19.0 + specifier: ^0.20.0 + version: 0.20.0 '@alloy-js/core': - specifier: ^0.19.0 - version: 0.19.0 + specifier: ^0.21.0-dev.10 + version: 0.21.0-dev.10 '@alloy-js/rollup-plugin': specifier: ^0.1.0 - version: 0.1.0(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@4.45.1) + version: 0.1.0(@babel/core@7.28.4)(@types/babel__core@7.20.5)(rollup@4.49.0) '@alloy-js/typescript': - specifier: ^0.19.0 - version: 0.19.0 + specifier: ^0.20.0 + version: 0.20.0 '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@typespec/compiler': specifier: workspace:^ version: link:../compiler @@ -689,6 +686,12 @@ importers: '@typespec/http': specifier: workspace:^ version: link:../http + '@typespec/library-linter': + specifier: workspace:^ + version: link:../library-linter + '@typespec/tspd': + specifier: workspace:^ + version: link:../tspd eslint: specifier: ^9.23.0 version: 9.32.0 @@ -696,20 +699,20 @@ importers: specifier: ~3.6.2 version: 3.6.2 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/http-client-js: dependencies: '@alloy-js/core': - specifier: ^0.19.0 - version: 0.19.0 + specifier: ^0.21.0-dev.10 + version: 0.21.0-dev.10 '@alloy-js/typescript': - specifier: ^0.19.0 - version: 0.19.0 + specifier: ^0.20.0 + version: 0.20.0 '@typespec/compiler': specifier: workspace:^ version: link:../compiler @@ -727,11 +730,11 @@ importers: version: 3.6.2 devDependencies: '@alloy-js/cli': - specifier: ^0.19.0 - version: 0.19.0 + specifier: ^0.20.0 + version: 0.20.0 '@alloy-js/rollup-plugin': specifier: ^0.1.0 - version: 0.1.0(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@4.45.1) + version: 0.1.0(@babel/core@7.28.4)(@types/babel__core@7.20.5)(rollup@4.49.0) '@types/yargs': specifier: ~17.0.33 version: 17.0.33 @@ -763,8 +766,8 @@ importers: specifier: ^9.1.2 version: 9.2.0 cross-env: - specifier: ~7.0.3 - version: 7.0.3 + specifier: ~10.0.0 + version: 10.0.0 execa: specifier: ^9.5.2 version: 9.6.0 @@ -776,25 +779,25 @@ importers: version: 14.1.0 inquirer: specifier: ^12.5.0 - version: 12.9.0(@types/node@24.1.0) + version: 12.9.0(@types/node@24.3.3) ora: specifier: ^8.1.1 version: 8.2.0 p-limit: - specifier: ^6.2.0 - version: 6.2.0 + specifier: ^7.1.1 + version: 7.1.1 picocolors: specifier: ~1.1.1 version: 1.1.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 uri-template: specifier: ^2.0.0 version: 2.0.0 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) yargs: specifier: ~18.0.0 version: 18.0.0 @@ -824,8 +827,8 @@ importers: specifier: ~6.0.6 version: 6.0.6 '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@types/yargs': specifier: ~17.0.33 version: 17.0.33 @@ -876,22 +879,22 @@ importers: version: 14.1.0 inquirer: specifier: ^12.5.0 - version: 12.9.0(@types/node@24.1.0) + version: 12.9.0(@types/node@24.3.3) ora: specifier: ^8.1.1 version: 8.2.0 p-limit: - specifier: ^6.2.0 - version: 6.2.0 + specifier: ^7.1.1 + version: 7.1.1 pathe: specifier: ^2.0.3 version: 2.0.3 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/http-server-js: dependencies: @@ -909,8 +912,8 @@ importers: specifier: ^1.9.9 version: 1.9.10 '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@types/swagger-ui-express': specifier: ^4.1.8 version: 4.1.8 @@ -955,7 +958,7 @@ importers: version: 14.1.0 inquirer: specifier: ^12.5.0 - version: 12.9.0(@types/node@24.1.0) + version: 12.9.0(@types/node@24.3.3) morgan: specifier: ^1.10.0 version: 1.10.1 @@ -963,8 +966,8 @@ importers: specifier: ^8.1.1 version: 8.2.0 p-limit: - specifier: ^6.2.0 - version: 6.2.0 + specifier: ^7.1.1 + version: 7.1.1 pathe: specifier: ^2.0.3 version: 2.0.3 @@ -981,11 +984,11 @@ importers: specifier: ^4.19.3 version: 4.20.3 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) yargs: specifier: ~18.0.0 version: 18.0.0 @@ -1024,8 +1027,8 @@ importers: specifier: ^2.0.0 version: 2.0.0 '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@typespec/json-schema': specifier: workspace:^ version: link:../json-schema @@ -1042,14 +1045,14 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 packages/internal-build-utils: dependencies: '@pnpm/workspace.find-packages': specifier: ^1000.0.24 - version: 1000.0.30(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0))(@types/node@24.1.0)(typanion@3.14.0) + version: 1000.0.30(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3))(@types/node@24.3.3)(typanion@3.14.0) cross-spawn: specifier: ^7.0.6 version: 7.0.6 @@ -1070,8 +1073,8 @@ importers: specifier: ~6.0.6 version: 6.0.6 '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@types/semver': specifier: ^7.5.8 version: 7.7.0 @@ -1094,11 +1097,11 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/json-schema: dependencies: @@ -1110,8 +1113,8 @@ importers: version: 2.8.0 devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@typespec/compiler': specifier: workspace:^ version: link:../compiler @@ -1143,17 +1146,17 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/library-linter: devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@typespec/compiler': specifier: workspace:^ version: link:../compiler @@ -1170,21 +1173,21 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/monarch: dependencies: monaco-editor-core: - specifier: ^0.52.2 - version: 0.52.2 + specifier: ^0.53.0 + version: 0.53.0 devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@vitest/coverage-v8': specifier: ^3.1.2 version: 3.2.4(vitest@3.2.4) @@ -1201,17 +1204,17 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/openapi: devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@typespec/compiler': specifier: workspace:^ version: link:../compiler @@ -1240,11 +1243,11 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/openapi3: dependencies: @@ -1262,8 +1265,8 @@ importers: version: 2.8.0 devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@types/yargs': specifier: ~17.0.33 version: 17.0.33 @@ -1304,23 +1307,60 @@ importers: specifier: ^10.1.3 version: 10.1.3 cross-env: - specifier: ~7.0.3 - version: 7.0.3 + specifier: ~10.0.0 + version: 10.0.0 rimraf: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 + vitest: + specifier: ^3.1.2 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + + packages/pack: + dependencies: + '@typespec/compiler': + specifier: workspace:^ + version: link:../compiler + picocolors: + specifier: ~1.1.1 + version: 1.1.1 + devDependencies: + '@types/node': + specifier: ~24.3.0 + version: 24.3.3 + '@vitest/coverage-v8': + specifier: ^3.1.2 + version: 3.2.4(vitest@3.2.4) + '@vitest/ui': + specifier: ^3.1.2 + version: 3.2.4(vitest@3.2.4) + c8: + specifier: ^10.1.3 + version: 10.1.3 + rimraf: + specifier: ~6.0.1 + version: 6.0.1 + source-map-support: + specifier: ~0.5.21 + version: 0.5.21 + typescript: + specifier: ~5.9.2 + version: 5.9.3 + vite: + specifier: ^7.0.5 + version: 7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/playground: dependencies: '@fluentui/react-components': - specifier: ~9.67.0 - version: 9.67.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + specifier: ~9.70.0 + version: 9.70.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': specifier: ^2.0.292 version: 2.0.307(react@18.3.1) @@ -1361,8 +1401,8 @@ importers: specifier: 0.6.3 version: 0.6.3 monaco-editor: - specifier: ~0.52.2 - version: 0.52.2 + specifier: ~0.53.0 + version: 0.53.0 react: specifier: ~18.3.1 version: 18.3.1 @@ -1393,13 +1433,13 @@ importers: version: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2) '@storybook/react-vite': specifier: ^9.0.12 - version: 9.0.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.45.1)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2))(typescript@5.8.3)(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 9.0.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.49.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2))(typescript@5.9.3)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) '@types/debounce': specifier: ~1.2.4 version: 1.2.4 '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@types/react': specifier: ~18.3.11 version: 18.3.23 @@ -1413,14 +1453,14 @@ importers: specifier: workspace:^ version: link:../react-components '@vitejs/plugin-react': - specifier: ~4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + specifier: ~5.0.2 + version: 5.0.4(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) c8: specifier: ^10.1.3 version: 10.1.3 cross-env: - specifier: ~7.0.3 - version: 7.0.3 + specifier: ~10.0.0 + version: 10.0.0 es-module-shims: specifier: ~2.6.0 version: 2.6.1 @@ -1431,23 +1471,23 @@ importers: specifier: ^9.0.12 version: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2) typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vite: specifier: ^7.0.5 - version: 7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) + version: 7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) vite-plugin-checker: specifier: ^0.10.1 - version: 0.10.2(eslint@9.32.0)(optionator@0.9.4)(typescript@5.8.3)(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 0.10.2(eslint@9.32.0)(optionator@0.9.4)(typescript@5.9.3)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@24.1.0)(rollup@4.45.1)(typescript@5.8.3)(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 4.5.4(@types/node@24.3.3)(rollup@4.49.0)(typescript@5.9.3)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) packages/playground-website: dependencies: '@fluentui/react-components': - specifier: ~9.67.0 - version: 9.67.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + specifier: ~9.70.0 + version: 9.70.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': specifier: ^2.0.292 version: 2.0.307(react@18.3.1) @@ -1472,6 +1512,9 @@ importers: '@typespec/openapi3': specifier: workspace:^ version: link:../openapi3 + '@typespec/pack': + specifier: workspace:~ + version: link:../pack '@typespec/playground': specifier: workspace:^ version: link:../playground @@ -1513,8 +1556,8 @@ importers: specifier: ~1.2.4 version: 1.2.4 '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@types/react': specifier: ~18.3.11 version: 18.3.23 @@ -1525,8 +1568,8 @@ importers: specifier: ~5.21.1 version: 5.21.1 '@vitejs/plugin-react': - specifier: ~4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + specifier: ~5.0.2 + version: 5.0.4(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) '@vitest/coverage-v8': specifier: ^3.1.2 version: 3.2.4(vitest@3.2.4) @@ -1537,29 +1580,29 @@ importers: specifier: ^10.1.3 version: 10.1.3 cross-env: - specifier: ~7.0.3 - version: 7.0.3 + specifier: ~10.0.0 + version: 10.0.0 rimraf: specifier: ~6.0.1 version: 6.0.1 rollup-plugin-visualizer: specifier: ~6.0.3 - version: 6.0.3(rollup@4.45.1) + version: 6.0.3(rollup@4.49.0) typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vite: specifier: ^7.0.5 - version: 7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) + version: 7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@24.1.0)(rollup@4.45.1)(typescript@5.8.3)(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 4.5.4(@types/node@24.3.3)(rollup@4.49.0)(typescript@5.9.3)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) vite-plugin-node-polyfills: specifier: ^0.24.0 - version: 0.24.0(rollup@4.45.1)(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 0.24.0(rollup@4.49.0)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/prettier-plugin-typespec: dependencies: @@ -1578,7 +1621,7 @@ importers: version: 0.25.8 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/protobuf: devDependencies: @@ -1586,8 +1629,8 @@ importers: specifier: ^4.0.9 version: 4.0.9 '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@typespec/compiler': specifier: workspace:^ version: link:../compiler @@ -1610,17 +1653,17 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/react-components: dependencies: '@fluentui/react-components': - specifier: ~9.67.0 - version: 9.67.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + specifier: ~9.70.0 + version: 9.70.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': specifier: ^2.0.292 version: 2.0.307(react@18.3.1) @@ -1644,8 +1687,8 @@ importers: specifier: ^16.2.0 version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@types/react': specifier: ~18.3.11 version: 18.3.23 @@ -1653,8 +1696,8 @@ importers: specifier: ~18.3.0 version: 18.3.7(@types/react@18.3.23) '@vitejs/plugin-react': - specifier: ~4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + specifier: ~5.0.2 + version: 5.0.4(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) '@vitest/coverage-v8': specifier: ^3.1.2 version: 3.2.4(vitest@3.2.4) @@ -1668,26 +1711,26 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vite: specifier: ^7.0.5 - version: 7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) + version: 7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) vite-plugin-checker: specifier: ^0.10.1 - version: 0.10.2(eslint@9.32.0)(optionator@0.9.4)(typescript@5.8.3)(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 0.10.2(eslint@9.32.0)(optionator@0.9.4)(typescript@5.9.3)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@24.1.0)(rollup@4.45.1)(typescript@5.8.3)(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 4.5.4(@types/node@24.3.3)(rollup@4.49.0)(typescript@5.9.3)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/rest: devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@typespec/compiler': specifier: workspace:^ version: link:../compiler @@ -1713,11 +1756,11 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/samples: dependencies: @@ -1768,8 +1811,8 @@ importers: version: link:../versioning devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@typespec/internal-build-utils': specifier: workspace:^ version: link:../internal-build-utils @@ -1780,23 +1823,23 @@ importers: specifier: ^3.1.2 version: 3.2.4(vitest@3.2.4) cross-env: - specifier: ~7.0.3 - version: 7.0.3 + specifier: ~10.0.0 + version: 10.0.0 rimraf: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/spec: devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@typespec/internal-build-utils': specifier: workspace:^ version: link:../internal-build-utils @@ -1826,8 +1869,8 @@ importers: specifier: ^2.0.0 version: 2.0.0 '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@types/xml2js': specifier: ^0.4.11 version: 0.4.14 @@ -1841,30 +1884,30 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/spec-coverage-sdk: dependencies: '@azure/identity': - specifier: ~4.10.1 - version: 4.10.2 + specifier: ~4.12.0 + version: 4.12.0 '@azure/storage-blob': - specifier: ~12.27.0 - version: 12.27.0 + specifier: ~12.28.0 + version: 12.28.0 '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 devDependencies: rimraf: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 packages/spec-dashboard: dependencies: @@ -1872,8 +1915,8 @@ importers: specifier: ^11.14.0 version: 11.14.0(@types/react@18.3.23)(react@18.3.1) '@fluentui/react-components': - specifier: ~9.67.0 - version: 9.67.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + specifier: ~9.70.0 + version: 9.70.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': specifier: ^2.0.292 version: 2.0.307(react@18.3.1) @@ -1897,32 +1940,32 @@ importers: specifier: ~18.3.0 version: 18.3.7(@types/react@18.3.23) '@vitejs/plugin-react': - specifier: ~4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + specifier: ~5.0.2 + version: 5.0.4(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) rimraf: specifier: ~6.0.1 version: 6.0.1 rollup-plugin-visualizer: specifier: ~6.0.3 - version: 6.0.3(rollup@4.45.1) + version: 6.0.3(rollup@4.49.0) typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vite: specifier: ^7.0.5 - version: 7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) + version: 7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) vite-plugin-checker: specifier: ^0.10.1 - version: 0.10.2(eslint@9.32.0)(optionator@0.9.4)(typescript@5.8.3)(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 0.10.2(eslint@9.32.0)(optionator@0.9.4)(typescript@5.9.3)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@24.1.0)(rollup@4.45.1)(typescript@5.8.3)(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 4.5.4(@types/node@24.3.3)(rollup@4.49.0)(typescript@5.9.3)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) packages/spector: dependencies: '@azure/identity': - specifier: ~4.10.1 - version: 4.10.2 + specifier: ~4.12.0 + version: 4.12.0 '@types/js-yaml': specifier: ^4.0.5 version: 4.0.9 @@ -2003,8 +2046,8 @@ importers: specifier: ^2.0.0 version: 2.0.0 '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@types/xml2js': specifier: ^0.4.11 version: 0.4.14 @@ -2018,14 +2061,14 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 packages/sse: devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@typespec/compiler': specifier: workspace:^ version: link:../compiler @@ -2057,11 +2100,11 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/standalone: dependencies: @@ -2082,8 +2125,8 @@ importers: version: 4.1.1(@yarnpkg/cli@4.9.2(@types/react@18.3.23)(@yarnpkg/core@4.4.2(typanion@3.14.0)))(@yarnpkg/core@4.4.2(typanion@3.14.0))(typanion@3.14.0) devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@vitest/coverage-v8': specifier: ^3.1.2 version: 3.2.4(vitest@3.2.4) @@ -2112,17 +2155,17 @@ importers: specifier: ^4.19.3 version: 4.20.3 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/streams: devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@typespec/compiler': specifier: workspace:^ version: link:../compiler @@ -2145,11 +2188,11 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/tmlanguage-generator: dependencies: @@ -2161,8 +2204,8 @@ importers: version: 3.1.0 devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@types/plist': specifier: ~3.0.5 version: 3.0.5 @@ -2170,26 +2213,26 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 packages/tspd: dependencies: '@alloy-js/core': - specifier: ^0.19.0 - version: 0.19.0 + specifier: ^0.21.0-dev.10 + version: 0.21.0-dev.10 '@alloy-js/markdown': - specifier: ^0.19.0 - version: 0.19.0 + specifier: ^0.20.0 + version: 0.20.0 '@alloy-js/typescript': - specifier: ^0.19.0 - version: 0.19.0 + specifier: ^0.20.0 + version: 0.20.0 '@microsoft/api-extractor': specifier: ^7.52.1 - version: 7.52.9(@types/node@24.1.0) + version: 7.52.9(@types/node@24.3.3) '@microsoft/api-extractor-model': specifier: ^7.30.6 - version: 7.30.7(@types/node@24.1.0) + version: 7.30.7(@types/node@24.3.3) '@microsoft/tsdoc': specifier: ^0.15.1 version: 0.15.1 @@ -2207,10 +2250,10 @@ importers: version: 3.6.2 typedoc: specifier: ^0.28.1 - version: 0.28.8(typescript@5.8.3) + version: 0.28.8(typescript@5.9.3) typedoc-plugin-markdown: specifier: ^4.5.2 - version: 4.7.1(typedoc@0.28.8(typescript@5.8.3)) + version: 4.7.1(typedoc@0.28.8(typescript@5.9.3)) yaml: specifier: ~2.8.0 version: 2.8.0 @@ -2219,14 +2262,14 @@ importers: version: 18.0.0 devDependencies: '@alloy-js/cli': - specifier: ^0.19.0 - version: 0.19.0 + specifier: ^0.20.0 + version: 0.20.0 '@alloy-js/rollup-plugin': specifier: ^0.1.0 - version: 0.1.0(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@4.45.1) + version: 0.1.0(@babel/core@7.28.4)(@types/babel__core@7.20.5)(rollup@4.49.0) '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@types/yargs': specifier: ~17.0.33 version: 17.0.33 @@ -2249,11 +2292,11 @@ importers: specifier: ~0.5.21 version: 0.5.21 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/typespec-vs: devDependencies: @@ -2273,14 +2316,14 @@ importers: specifier: ^10.0.9 version: 10.0.10 '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@types/semver': specifier: ^7.5.8 version: 7.7.0 '@types/vscode': - specifier: ~1.100.0 - version: 1.100.0 + specifier: ~1.104.0 + version: 1.104.0 '@types/which': specifier: ^3.0.4 version: 3.0.4 @@ -2303,8 +2346,8 @@ importers: specifier: ^2.3.9 version: 2.5.2 '@vscode/test-web': - specifier: ^0.0.71 - version: 0.0.71 + specifier: ^0.0.73 + version: 0.0.73 '@vscode/vsce': specifier: ~3.6.0 version: 3.6.0 @@ -2336,11 +2379,11 @@ importers: specifier: ^5.20.1 version: 5.27.0 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) vscode-languageclient: specifier: ~9.0.1 version: 9.0.1 @@ -2354,8 +2397,8 @@ importers: packages/versioning: devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@typespec/compiler': specifier: workspace:^ version: link:../compiler @@ -2378,17 +2421,17 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) packages/xml: devDependencies: '@types/node': - specifier: ~24.1.0 - version: 24.1.0 + specifier: ~24.3.0 + version: 24.3.3 '@typespec/compiler': specifier: workspace:^ version: link:../compiler @@ -2411,35 +2454,35 @@ importers: specifier: ~6.0.1 version: 6.0.1 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) website: dependencies: '@astrojs/check': specifier: ^0.9.4 - version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.8.3) + version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.3) '@astrojs/react': specifier: ^4.2.1 - version: 4.3.0(@types/node@24.1.0)(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.20.3)(yaml@2.8.0) + version: 4.3.0(@types/node@24.3.3)(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.20.3)(yaml@2.8.0) '@astrojs/starlight': specifier: ^0.35.1 - version: 0.35.2(astro@5.12.5(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0)(@types/node@24.1.0)(encoding@0.1.13)(rollup@4.45.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)) + version: 0.35.2(astro@5.12.5(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0)(@types/node@24.3.3)(encoding@0.1.13)(rollup@4.49.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.0)) '@docsearch/css': - specifier: ^3.9.0 - version: 3.9.0 + specifier: ^4.1.0 + version: 4.1.0 '@docsearch/js': - specifier: ^3.9.0 - version: 3.9.0(@algolia/client-search@5.34.0)(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) + specifier: ^4.1.0 + version: 4.1.0 '@expressive-code/core': specifier: ^0.41.2 version: 0.41.3 '@fluentui/react-components': - specifier: ~9.67.0 - version: 9.67.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + specifier: ~9.70.0 + version: 9.70.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': specifier: ^2.0.292 version: 2.0.307(react@18.3.1) @@ -2451,10 +2494,10 @@ importers: version: link:../packages/playground astro: specifier: ^5.5.6 - version: 5.12.5(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0)(@types/node@24.1.0)(encoding@0.1.13)(rollup@4.45.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) + version: 5.12.5(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0)(@types/node@24.3.3)(encoding@0.1.13)(rollup@4.49.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.0) astro-rehype-relative-markdown-links: specifier: ^0.18.1 - version: 0.18.1(astro@5.12.5(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0)(@types/node@24.1.0)(encoding@0.1.13)(rollup@4.45.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)) + version: 0.18.1(astro@5.12.5(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0)(@types/node@24.3.3)(encoding@0.1.13)(rollup@4.49.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.0)) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -2480,8 +2523,8 @@ importers: specifier: ^0.34.2 version: 0.34.3 typescript: - specifier: ~5.8.2 - version: 5.8.3 + specifier: ~5.9.2 + version: 5.9.3 devDependencies: '@types/react': specifier: ~18.3.11 @@ -2551,10 +2594,10 @@ importers: version: link:../packages/xml astro-expressive-code: specifier: ^0.41.2 - version: 0.41.3(astro@5.12.5(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0)(@types/node@24.1.0)(encoding@0.1.13)(rollup@4.45.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)) + version: 0.41.3(astro@5.12.5(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0)(@types/node@24.3.3)(encoding@0.1.13)(rollup@4.49.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.0)) rehype-mermaid: specifier: ^3.0.0 - version: 3.0.0(playwright@1.54.1) + version: 3.0.0(playwright@1.55.1) remark-heading-id: specifier: ^1.0.1 version: 1.0.1 @@ -2563,33 +2606,13 @@ importers: version: 6.0.1 vite-plugin-node-polyfills: specifier: ^0.24.0 - version: 0.24.0(rollup@4.45.1)(vite@6.3.5(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 0.24.0(rollup@4.49.0)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) packages: '@adobe/css-tools@4.4.3': resolution: {integrity: sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==} - '@algolia/autocomplete-core@1.17.9': - resolution: {integrity: sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==} - - '@algolia/autocomplete-plugin-algolia-insights@1.17.9': - resolution: {integrity: sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==} - peerDependencies: - search-insights: '>= 1 < 3' - - '@algolia/autocomplete-preset-algolia@1.17.9': - resolution: {integrity: sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/autocomplete-shared@1.17.9': - resolution: {integrity: sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - '@algolia/cache-browser-local-storage@4.25.2': resolution: {integrity: sha512-tA1rqAafI+gUdewjZwyTsZVxesl22MTgLWRKt1+TBiL26NiKx7SjRqTI3pzm8ngx1ftM5LSgXkVIgk2+SRgPTg==} @@ -2599,91 +2622,39 @@ packages: '@algolia/cache-in-memory@4.25.2': resolution: {integrity: sha512-KYcenhfPKgR+WJ6IEwKVEFMKKCWLZdnYuw08+3Pn1cxAXbJcTIKjoYgEXzEW6gJmDaau2l55qNrZo6MBbX7+sw==} - '@algolia/client-abtesting@5.34.0': - resolution: {integrity: sha512-d6ardhDtQsnMpyr/rPrS3YuIE9NYpY4rftkC7Ap9tyuhZ/+V3E/LH+9uEewPguKzVqduApdwJzYq2k+vAXVEbQ==} - engines: {node: '>= 14.0.0'} - '@algolia/client-account@4.25.2': resolution: {integrity: sha512-IfRGhBxvjli9mdexrCxX2N4XT9NBN3tvZK5zCaL8zkDcgsthiM9WPvGIZS/pl/FuXB7hA0lE5kqOzsQDP6OmGQ==} '@algolia/client-analytics@4.25.2': resolution: {integrity: sha512-4Yxxhxh+XjXY8zPyo+h6tQuyoJWDBn8E3YLr8j+YAEy5p+r3/5Tp+ANvQ+hNaQXbwZpyf5d4ViYOBjJ8+bWNEg==} - '@algolia/client-analytics@5.34.0': - resolution: {integrity: sha512-WXIByjHNA106JO1Dj6b4viSX/yMN3oIB4qXr2MmyEmNq0MgfuPfPw8ayLRIZPa9Dp27hvM3G8MWJ4RG978HYFw==} - engines: {node: '>= 14.0.0'} - '@algolia/client-common@4.25.2': resolution: {integrity: sha512-HXX8vbJPYW29P18GxciiwaDpQid6UhpPP9nW9WE181uGUgFhyP5zaEkYWf9oYBrjMubrGwXi5YEzJOz6Oa4faA==} - '@algolia/client-common@5.34.0': - resolution: {integrity: sha512-JeN1XJLZIkkv6yK0KT93CIXXk+cDPUGNg5xeH4fN9ZykYFDWYRyqgaDo+qvg4RXC3WWkdQ+hogQuuCk4Y3Eotw==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-insights@5.34.0': - resolution: {integrity: sha512-gdFlcQa+TWXJUsihHDlreFWniKPFIQ15i5oynCY4m9K3DCex5g5cVj9VG4Hsquxf2t6Y0yv8w6MvVTGDO8oRLw==} - engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@4.25.2': resolution: {integrity: sha512-K81PRaHF77mHv2u8foWTHnIf5c+QNf/SnKNM7rB8JPi7TMYi4E5o2mFbgdU1ovd8eg9YMOEAuLkl1Nz1vbM3zQ==} - '@algolia/client-personalization@5.34.0': - resolution: {integrity: sha512-g91NHhIZDkh1IUeNtsUd8V/ZxuBc2ByOfDqhCkoQY3Z/mZszhpn3Czn6AR5pE81fx793vMaiOZvQVB5QttArkQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-query-suggestions@5.34.0': - resolution: {integrity: sha512-cvRApDfFrlJ3Vcn37U4Nd/7S6T8cx7FW3mVLJPqkkzixv8DQ/yV+x4VLirxOtGDdq3KohcIbIGWbg1QuyOZRvQ==} - engines: {node: '>= 14.0.0'} - '@algolia/client-search@4.25.2': resolution: {integrity: sha512-pO/LpVnQlbJpcHRk+AroWyyFnh01eOlO6/uLZRUmYvr/hpKZKxI6n7ufgTawbo0KrAu2CePfiOkStYOmDuRjzQ==} - '@algolia/client-search@5.34.0': - resolution: {integrity: sha512-m9tK4IqJmn+flEPRtuxuHgiHmrKV0su5fuVwVpq8/es4DMjWMgX1a7Lg1PktvO8AbKaTp9kTtBAPnwXpuCwmEg==} - engines: {node: '>= 14.0.0'} - - '@algolia/ingestion@1.34.0': - resolution: {integrity: sha512-2rxy4XoeRtIpzxEh5u5UgDC5HY4XbNdjzNgFx1eDrfFkSHpEVjirtLhISMy2N5uSFqYu1uUby5/NC1Soq8J7iw==} - engines: {node: '>= 14.0.0'} - '@algolia/logger-common@4.25.2': resolution: {integrity: sha512-aUXpcodoIpLPsnVc2OHgC9E156R7yXWLW2l+Zn24Cyepfq3IvmuVckBvJDpp7nPnXkEzeMuvnVxQfQsk+zP/BA==} '@algolia/logger-console@4.25.2': resolution: {integrity: sha512-H3Y+UB0Ty0htvMJ6zDSufhFTSDlg3Pyj3AXilfDdDRcvfhH4C/cJNVm+CTaGORxL5uKABGsBp+SZjsEMTyAunQ==} - '@algolia/monitoring@1.34.0': - resolution: {integrity: sha512-OJiDhlJX8ZdWAndc50Z6aUEW/YmnhFK2ul3rahMw5/c9Damh7+oY9SufoK2LimJejy+65Qka06YPG29v2G/vww==} - engines: {node: '>= 14.0.0'} - '@algolia/recommend@4.25.2': resolution: {integrity: sha512-puRrGeXwAuVa4mLdvXvmxHRFz9MkcCOLPcjz7MjU4NihlpIa+lZYgikJ7z0SUAaYgd6l5Bh00hXiU/OlX5ffXQ==} - '@algolia/recommend@5.34.0': - resolution: {integrity: sha512-fzNQZAdVxu/Gnbavy8KW5gurApwdYcPW6+pjO7Pw8V5drCR3eSqnOxSvp79rhscDX8ezwqMqqK4F3Hsq+KpRzg==} - engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@4.25.2': resolution: {integrity: sha512-aAjfsI0AjWgXLh/xr9eoR8/9HekBkIER3bxGoBf9d1XWMMoTo/q92Da2fewkxwLE6mla95QJ9suJGOtMOewXXQ==} - '@algolia/requester-browser-xhr@5.34.0': - resolution: {integrity: sha512-gEI0xjzA/xvMpEdYmgQnf6AQKllhgKRtnEWmwDrnct+YPIruEHlx1dd7nRJTy/33MiYcCxkB4khXpNrHuqgp3Q==} - engines: {node: '>= 14.0.0'} - '@algolia/requester-common@4.25.2': resolution: {integrity: sha512-Q4wC3sgY0UFjV3Rb3icRLTpPB5/M44A8IxzJHM9PNeK1T3iX7X/fmz7ATUYQYZTpwHCYATlsQKWiTpql1hHjVg==} - '@algolia/requester-fetch@5.34.0': - resolution: {integrity: sha512-5SwGOttpbACT4jXzfSJ3mnTcF46SVNSnZ1JjxC3qBa3qKi4U0CJGzuVVy3L798u8dG5H0SZ2MAB5v7180Gnqew==} - engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@4.25.2': resolution: {integrity: sha512-Ja/FYB7W9ZM+m8UrMIlawNUAKpncvb9Mo+D8Jq5WepGTUyQ9CBYLsjwxv9O8wbj3TSWqTInf4uUBJ2FKR8G7xw==} - '@algolia/requester-node-http@5.34.0': - resolution: {integrity: sha512-409XlyIyEXrxyGjWxd0q5RASizHSRVUU0AXPCEdqnbcGEzbCgL1n7oYI8YxzE/RqZLha+PNwWCcTVn7EE5tyyQ==} - engines: {node: '>= 14.0.0'} - '@algolia/transporter@4.25.2': resolution: {integrity: sha512-yw3RLHWc6V+pbdsFtq8b6T5bJqLDqnfKWS7nac1Vzcmgvs/V/Lfy7/6iOF9XRilu5aBDOBHoP1SOeIDghguzWw==} @@ -2700,29 +2671,29 @@ packages: '@alloy-js/babel-preset@0.2.1': resolution: {integrity: sha512-vz9kvQwx5qBzHIw4ryqUaQqpgNOMBmkdDcV3e2zZfMq8Pp16ePFtvviHh6RwyLcvXQQClex3ZZy8ON9TifMnxw==} - '@alloy-js/cli@0.19.0': - resolution: {integrity: sha512-P+2cSzPgglbpUfxbOe0mlVZfC8qMwcmvL+e2B6JgqdSbRXauDBHczDf3NWyOCm6KokECRQuCIrTFPKzFfmmh/g==} + '@alloy-js/cli@0.20.0': + resolution: {integrity: sha512-iDiJAs2yjP5G8lMmry+4usM33tL9G1u8IKp+beh0jx5RqfLsZsXOu78S4ZIZLqskAMkCLuRJogsh8fPREg2CzQ==} engines: {node: '>=18.0.0'} hasBin: true - '@alloy-js/core@0.19.0': - resolution: {integrity: sha512-Od92r7UgX7kRLJWfGD3+lLZBhrRQ5M2pV5Fqm1CuCKhFUV5CrfoW46DQy2gdSDLD4AE+N7oPo6DTkLqrxACHFA==} + '@alloy-js/core@0.21.0-dev.10': + resolution: {integrity: sha512-Gf8WTuGyK5HpTjdfuJcUavKPLXnzTKNS13058KUj7ZrVVSY69ZKyMfBxEXp73AYuE0ooAU6TE889mxihJjcYNg==} - '@alloy-js/csharp@0.19.0': - resolution: {integrity: sha512-1y2HZjU/AWhRxTjf1o5skMX/zE466QfFcih591pew3mhWZGU5q/OujP8hW3eLC4RrrKsD7m4BVl20uPlgKp6ig==} + '@alloy-js/csharp@0.20.0': + resolution: {integrity: sha512-Yn8oua43tVWYGN9Gt5DDtGUdLIB9io6/nL8dK4qDvL019w9uK7f3wosr+/JtSm14PuToN4jM1s7HNVzqh41KUA==} - '@alloy-js/markdown@0.19.0': - resolution: {integrity: sha512-IKwzO6+ggXtl+bVy33wa5iBJx6KkMD7lzN3RJrKTvBPml7iuP21TwLjhUa1rmRQLekUZlbRuTYWaeWVEyrPYyw==} + '@alloy-js/markdown@0.20.0': + resolution: {integrity: sha512-c1Q4dzUvWC4Bdoi6dRT9yAYVoCiqz3ZMClV8CHzEsgZYjjdS0S2ZWWmgxzS87rSDHSjmQIXJ4BcUZfKyfnMrFA==} - '@alloy-js/python@0.0.1': - resolution: {integrity: sha512-7L32hryUa2StoMceIkGT2bnDzChK19c7oPrKlDj+Tmw8uKmM/3FDeRlzDatDWp7bE3iGMUjKsstSPsD4t038Hg==} + '@alloy-js/python@0.2.0-dev.4': + resolution: {integrity: sha512-VAa3sfQ2YpIk4aLJmWmn5/ctV90k/P90+7K5Y50RkX89DLIq42lVIIR7tNBaMCR96p7OdrOTTKlhp6uzi3IEhQ==} '@alloy-js/rollup-plugin@0.1.0': resolution: {integrity: sha512-MXR8mBdSh/pxMP8kIXAcMYKsm5yOWZ+igxcaRX1vBXFiHU4eK7gE/5q6Fk8Vdydh+MItWtgekwIhUWvcszdNFQ==} engines: {node: '>=18.0.0'} - '@alloy-js/typescript@0.19.0': - resolution: {integrity: sha512-feYhirsNsKADZYWTwN+TrwD88cgdwQP1shDyBJuUgHPX2/LxSR2p5bace6Nw/qYOg44d1VVjf2pe+JFWNkShXw==} + '@alloy-js/typescript@0.20.0': + resolution: {integrity: sha512-F1y5QjneE8GVxIq6oYsebu+Fccrn72qFHelNX5GSLfs4Ps2fxpk2+70rsGznZyHe9LIt70StaAciTjH6cxH4bQ==} '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} @@ -2863,8 +2834,8 @@ packages: resolution: {integrity: sha512-D/sdlJBMJfx7gqoj66PKVmhDDaU6TKA49ptcolxdas29X7AfvLTmfAGLjAcIMBK7UZ2o4lygHIqVckOlQU3xWw==} engines: {node: '>=20.0.0'} - '@azure/identity@4.10.2': - resolution: {integrity: sha512-Uth4vz0j+fkXCkbvutChUj03PDCokjbC6Wk9JT8hHEUtpy/EurNKAseb3+gO6Zi9VYBvwt61pgbzn1ovk942Qg==} + '@azure/identity@4.12.0': + resolution: {integrity: sha512-6vuh2R3Cte6SD6azNalLCjIDoryGdcvDVEV7IDRPtm5lHX5ffkDlIalaoOp5YJU08e4ipjJENel20kSMDLAcug==} engines: {node: '>=20.0.0'} '@azure/logger@1.3.0': @@ -2883,9 +2854,13 @@ packages: resolution: {integrity: sha512-95wjsKGyUcAd5tFmQBo5Ug/kOj+hFh/8FsXuxluEvdfbgg6xCimhSP9qnyq6+xIg78/jREkBD1/BSqd7NIDDYQ==} engines: {node: '>=16'} - '@azure/storage-blob@12.27.0': - resolution: {integrity: sha512-IQjj9RIzAKatmNca3D6bT0qJ+Pkox1WZGOg2esJF2YLHb45pQKOwGPIAV+w3rfgkj7zV3RMxpn/c6iftzSOZJQ==} - engines: {node: '>=18.0.0'} + '@azure/storage-blob@12.28.0': + resolution: {integrity: sha512-VhQHITXXO03SURhDiGuHhvc/k/sD2WvJUS7hqhiVNbErVCuQoLtWql7r97fleBlIRKHJaa9R7DpBjfE0pfLYcA==} + engines: {node: '>=20.0.0'} + + '@azure/storage-common@12.0.0': + resolution: {integrity: sha512-QyEWXgi4kdRo0wc1rHum9/KnaWZKCdQGZK1BjU4fFL6Jtedp7KLbQihgTTVxldFy1z1ZPtuDPx8mQ5l3huPPbA==} + engines: {node: '>=20.0.0'} '@babel/code-frame@7.12.11': resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} @@ -2902,10 +2877,18 @@ packages: resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} engines: {node: '>=6.9.0'} + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.28.0': resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} engines: {node: '>=6.9.0'} + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.27.3': resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} @@ -2946,6 +2929,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.27.1': resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} @@ -2980,6 +2969,10 @@ packages: resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + '@babel/highlight@7.25.9': resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} engines: {node: '>=6.9.0'} @@ -2989,6 +2982,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-syntax-flow@7.27.1': resolution: {integrity: sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==} engines: {node: '>=6.9.0'} @@ -3091,10 +3089,18 @@ packages: resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + engines: {node: '>=6.9.0'} + '@babel/types@7.28.1': resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} @@ -3394,28 +3400,11 @@ packages: resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==} engines: {node: '>=14'} - '@docsearch/css@3.9.0': - resolution: {integrity: sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==} + '@docsearch/css@4.1.0': + resolution: {integrity: sha512-nuNKGjHj/FQeWgE9t+i83QD/V67QiaAmGY7xS9TVCRUiCqSljOgIKlsLoQZKKVwEG8f+OWKdznzZkJxGZ7d06A==} - '@docsearch/js@3.9.0': - resolution: {integrity: sha512-4bKHcye6EkLgRE8ze0vcdshmEqxeiJM77M0JXjef7lrYZfSlMunrDOCqyLjiZyo1+c0BhUqA2QpFartIjuHIjw==} - - '@docsearch/react@3.9.0': - resolution: {integrity: sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==} - peerDependencies: - '@types/react': '>= 16.8.0 < 20.0.0' - react: '>= 16.8.0 < 20.0.0' - react-dom: '>= 16.8.0 < 20.0.0' - search-insights: '>= 1 < 3' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - react-dom: - optional: true - search-insights: - optional: true + '@docsearch/js@4.1.0': + resolution: {integrity: sha512-49+CzeGfOiwG85k+dDvKfOsXLd9PQACoY/FLrZfFOKmpWv166u7bAHmBLdzvxlk8nJ289UgpGf0k6GQZtC85Fg==} '@emmetio/abbreviation@2.3.3': resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} @@ -3482,6 +3471,9 @@ packages: '@emotion/weak-memoize@0.4.0': resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + '@epic-web/invariant@1.0.0': + resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} + '@esbuild/aix-ppc64@0.25.8': resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} engines: {node: '>=18'} @@ -3703,10 +3695,10 @@ packages: '@floating-ui/core@1.7.2': resolution: {integrity: sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==} - '@floating-ui/devtools@0.2.1': - resolution: {integrity: sha512-8PHJLbD6VhBh+LJ1uty/Bz30qs02NXCE5u8WpOhSewlYXUWl03GNXknr9AS2yaAWJEQaY27x7eByJs44gODBcw==} + '@floating-ui/devtools@0.2.3': + resolution: {integrity: sha512-ZTcxTvgo9CRlP7vJV62yCxdqmahHTGpSTi5QaTDgGoyQq0OyjaVZhUhXv/qdkQFOI3Sxlfmz0XGG4HaZMsDf8Q==} peerDependencies: - '@floating-ui/dom': '>=1.5.4' + '@floating-ui/dom': ^1.0.0 '@floating-ui/dom@1.7.2': resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==} @@ -3717,16 +3709,16 @@ packages: '@fluentui/keyboard-keys@9.0.8': resolution: {integrity: sha512-iUSJUUHAyTosnXK8O2Ilbfxma+ZyZPMua5vB028Ys96z80v+LFwntoehlFsdH3rMuPsA8GaC1RE7LMezwPBPdw==} - '@fluentui/priority-overflow@9.1.15': - resolution: {integrity: sha512-/3jPBBq64hRdA416grVj+ZeMBUIaKZk2S5HiRg7CKCAV1JuyF84Do0rQI6ns8Vb9XOGuc4kurMcL/UEftoEVrg==} + '@fluentui/priority-overflow@9.1.16': + resolution: {integrity: sha512-YKkI64UNU5ZuIeLRi3IC/Cr1Bgz1pgvCP3lBvkHMAG1R6CfFOyKgmpjANiq21lNGv+2NsDbATZ7gFdrPmo6OnA==} - '@fluentui/react-accordion@9.8.0': - resolution: {integrity: sha512-YHvTZCdARlDKF69qt3nQc+Q4N3uFTUDmZGg97/H+HZAbpTlwnQVsw//y860M828d5SMyvutNm6BGqpsb+XBudw==} + '@fluentui/react-accordion@9.8.6': + resolution: {integrity: sha512-qlZJKvemimImAl4LsSrRPYlQUreAqRLufox6z5WzYwotbAGem80/2uTPWLhXcpNkZZbgd5vbBz4wizTZI0Clhw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' '@fluentui/react-alert@9.0.0-beta.124': resolution: {integrity: sha512-yFBo3B5H9hnoaXxlkuz8wRz04DEyQ+ElYA/p5p+Vojf19Zuta8DmFZZ6JtWdtxcdnnQ4LvAfC5OYYlzdReozPA==} @@ -3736,69 +3728,61 @@ packages: react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' - '@fluentui/react-aria@9.15.4': - resolution: {integrity: sha512-5t/BrCQOWz3ZAbCy6RHN3iT3+MiwbHe3ESZXoxSquxVJzBjDixuvzhnls83cqC86OaWi2fp2kI8e3/BvLA54+Q==} + '@fluentui/react-aria@9.17.0': + resolution: {integrity: sha512-TkJJUSZl7967Gsf4s/W6tdZldm362LqBJPx2cpjokyZMarFfzzSz6U5i07KkWVZ7RtoPsscaaWDI8QEHhIvc6Q==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-avatar@9.9.0': - resolution: {integrity: sha512-2KWRkz7khP42ROD/thdID+dHhyCz8irQp37pD3pyLRAZe7Su1ckkjbaSB3aBl3ee0rmVq8vQmyulshsGZkyFJg==} + '@fluentui/react-avatar@9.9.6': + resolution: {integrity: sha512-Zhes+V1BUy86DZOg/7CKoU7YnmeMq1Y5R86bmg8uIR4xmiicZDUsSaWBJNjxNpFq2G+01FZZIHaQL5S6uIkuGw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-badge@9.4.0': - resolution: {integrity: sha512-FS12bACA0i5YFwTjYT1aF0NBSoNgPdZTNXM/MqJpqOq6UyCylRf75ro06a0LduU671gB578Ap+yzk8E3+Ia9NQ==} + '@fluentui/react-badge@9.4.5': + resolution: {integrity: sha512-+uqdUkbNy9wO/RunkU844JhWAvZOFUoCTvjUFNVWj4XbvNUV0DiP4WgauRggCHin3cDXXIB26qxvbv0X+wCN6w==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-breadcrumb@9.3.0': - resolution: {integrity: sha512-t8EAbhyO/wFJAzEr921Oag0yrkKcX6zprqzJ1dybWv8ndyjbJdQcut0fkOeMwmXCgu3MoBirW27s+4gHODwidw==} + '@fluentui/react-breadcrumb@9.3.6': + resolution: {integrity: sha512-5TAli9CbIDO5Girui9DUaKwpuSb1rZPtT4Y4QYVLeEDVScyXwI7766f6kDd1d+bC+RklpkDujw72p6tGPbhWRQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-button@9.6.0': - resolution: {integrity: sha512-rsSGqJrXs4NL8Lo/2BCDEGYZrGj3Kkg2crVYnG3xBC2GMFGmlww+ovsIUcWhMo6KRY87F8dyqUcqX1g+HJNv/A==} + '@fluentui/react-button@9.6.6': + resolution: {integrity: sha512-JqtOkoOl8nIOsVaS88qZWgAnTKLrcC8ext2/o0WW8ODbBumVPSFIptcdUfpkl1IQV1wfNyusKI3Kd1W6DjvdCA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - - '@fluentui/react-card@9.4.0': - resolution: {integrity: sha512-hH862zMzVVS1BRE2UGH8ZrLT0z1yLg4LRn4L8onEfCAKj5E65o+trGH4T6c0TOLexNyJKeF6bqrQDUtbT35pIA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-carousel@9.8.0': - resolution: {integrity: sha512-6BRHOSzaY7gkSvktaHBfa3FE/Tdmjel0o1lrR0Zl1D0kdbUDtY8ICb0FtROJ4YLSE2YyLWmAMlR3MbxKWPmCcw==} + '@fluentui/react-card@9.5.0': + resolution: {integrity: sha512-XPgu0AFkMis5g8Lc8J2108SIZ3wt5k7BP7XfRBfwqsF+IpsNES67VzrDcjM3rVMz4i4P+Vlu+4nxmytUiB5eMw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-checkbox@9.5.0': - resolution: {integrity: sha512-HB4zac4C0Msqbrjl7AOTuEMnmpEyKeNTaKc8eb9MDU8xJVWzWS5Q91TWpmXOXgneaG3/pu5ops749zBmlCU1Pg==} + '@fluentui/react-carousel@9.8.6': + resolution: {integrity: sha512-WDcVTM/70Udo7pzeJ1ba3F8UomRbD3YQUrxLLSRI7CR9iyyIQjQXR/i4D+9WjCJKLg+7vDeKu73S9KipOji0aQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' '@fluentui/react-checkbox@9.5.1': resolution: {integrity: sha512-qbdywMhUd68Ox9uKjO5QlMwdRxLQSJiB7FR3hWZ72j01u9jMuWA1e+8JQMJtu2BMoDdiClnZSBro3XoJI3DLBQ==} @@ -3808,38 +3792,37 @@ packages: react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' - '@fluentui/react-color-picker@9.2.0': - resolution: {integrity: sha512-4E6woOMxj4Tyy0sHAORR8pGUlZbtoGgQ6UsdQ38SWEU+f/zo/2SsyJOqtuMur67+ThAoJR5bq+W3mLGi8WhAPA==} + '@fluentui/react-checkbox@9.5.5': + resolution: {integrity: sha512-yDk223Bqb/KKa/vsYVGp3DGXooN6Pdm0R+BDeCVBfjTpYp4ut1nReUfqk09ivK5lF3tIveVttvEvH+yVvCyHbw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-combobox@9.16.0': - resolution: {integrity: sha512-w84o5ubLL4MCfbzb/xCRoWjc1S2ZGk0Ci8PEXkP+CFAl3SxAORJISAiMCbfk+ZoWAwNLFcHNO6UFj2XH+fWkbA==} + '@fluentui/react-color-picker@9.2.5': + resolution: {integrity: sha512-+M5CBwNEmFVy3GQ+fnF11+9hvEXwSt/8xqKw4fGQCNgSJXQv9e5CMkIqgdbicX2CocWMSHVAtyyljcBr3K9ajA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-components@9.67.0': - resolution: {integrity: sha512-692/t+6te3HO0/tA5585CrA9FA6AIR7a6UVJ/p6Cah0cwRfi/ffeNYZ5fhZHX/46DU0SRfAXemcsoFE1cgKpYA==} + '@fluentui/react-combobox@9.16.6': + resolution: {integrity: sha512-FfRtDCU8ap1eIQtrVAQHv56IzQMH3efwJcMerIrIC1M4UTq5Mv0mdzKiDQiNeWJz4oGYvvtsTpFP7cJ/+pzbdg==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-context-selector@9.2.2': - resolution: {integrity: sha512-R9710dBH2AYNbdQz0UpvSqoA8YZ8vVicyqGvWPKvDGCNbZB6GY1Cu5LbODpeAthylLXhgXxIlGEcoOpjBBpRbA==} + '@fluentui/react-components@9.70.0': + resolution: {integrity: sha512-sMFTTGp5bR15PvDyNTeNbJT1RzVlesuOIg/YaDIeD1XjHB3um0rFsFIDBidpltcpHEBGP6rGmI4eWyjAYOeEIA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - scheduler: '>=0.19.0 <=0.23.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' '@fluentui/react-context-selector@9.2.3': resolution: {integrity: sha512-xq15d8JYGlj32q8J25Iqy4Q99rS7J8Yfw1a6HUZqbAAQBAOkwTwO3LlS8RbX7E6WPf4XSKA0p5s3refv6DYAXg==} @@ -3850,37 +3833,38 @@ packages: react-dom: '>=16.14.0 <19.0.0' scheduler: '>=0.19.0 <=0.23.0' - '@fluentui/react-dialog@9.14.0': - resolution: {integrity: sha512-FgvxWVwET9niVhWoD1gpEx7MICOCDncTyreJV12KmCVC0eYxvun0uQmA6FXVnh+3yh/9AhIH0KfiKa0C8qsP7g==} + '@fluentui/react-context-selector@9.2.7': + resolution: {integrity: sha512-wIxdd113xXz+rtCN6eBAWmc2S2sBVE3aWOdesbeFIVQqqMv/0XW3zh3AF8H9CsV++8w5MsmCccRB11wqwut8GQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' + scheduler: '>=0.19.0 <=0.23.0' - '@fluentui/react-divider@9.4.0': - resolution: {integrity: sha512-WLs/12FP7Yf+SYCISzxGaNbLvJjZyBcUFbG9KhhRmt5CcwIklTinEJWW3qXcAmS+nHuGdkwpgC/avgEjzpYMcg==} + '@fluentui/react-dialog@9.15.1': + resolution: {integrity: sha512-h1ScFeuL4K/0qOx1IBUu0YEtAoZhneNDFbKzHbUA7Vs7bVQx2jtU4Ig6BBUFaE+p5zYkThz7hDuD2uaKDhvNNQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-drawer@9.9.0': - resolution: {integrity: sha512-HjW13Tikmk7s/XUKGoYn6MKsvm9gmO6Og8h3PtcWIccsXBUesQtWAgNJpgvprEDKHFwLF5aB1fHqYDsStbrLCw==} + '@fluentui/react-divider@9.4.5': + resolution: {integrity: sha512-W6WfSFHgnrttANZCY/SEhtv3Yh/Va39XsxT+0ieS+BSouhtdkoMc9gqmqFTESBfbPtRQV64wbEacWfMBbXz6KQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-field@9.4.0': - resolution: {integrity: sha512-X4XWe1gWVxUP6Oa395Ekpdtj9FX2WAWPj5+DGW8OGB7SNJA67cEP/E8FCEA/tflm0eZXaHVFThh0yElf1KX7nw==} + '@fluentui/react-drawer@9.10.1': + resolution: {integrity: sha512-BEOD3MgyZwq+ymCIxbv3oidDs7OP9D3uezg5ZCCr9tUyZj2bqBxKt32SM7C92jsAkUCEksu5j2LvOGCKRTtyLw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' '@fluentui/react-field@9.4.1': resolution: {integrity: sha512-Sr/4XKvv6Mhl+BzOQav4K6hKo/gJz5tmNMXGwICPEgpyLufuWi8rCyq/CWR3e7yERCVaaTxUK0Q5NHBivBf/Ow==} @@ -3890,18 +3874,26 @@ packages: react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' + '@fluentui/react-field@9.4.5': + resolution: {integrity: sha512-yQi5iaRXMJmHrPhRO+vX3vYXG1vsmpkKG0e5JJ1p/MBiOAVROdIhzbipDIktg8fdJMJ1ZAteuhAugfZ8NWWMfA==} + peerDependencies: + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' + '@fluentui/react-icons@2.0.307': resolution: {integrity: sha512-HSXrzQ6o+RWPnNy68EJN2M/Dh9LAJ8l5U9zWfwaFWDgktMF7dJxItyckA5BsH6inFisi6cqKtazsq9oZdAj32A==} peerDependencies: react: '>=16.8.0 <19.0.0' - '@fluentui/react-image@9.3.0': - resolution: {integrity: sha512-qhKZ6Dj267UPvnAwzmvLD3JDb8zSCEtkL2c9CLyUAcuuvT4KubhNsLudY//1EMiC5a+Du0gC2lcxRT84PQ2NZg==} + '@fluentui/react-image@9.3.5': + resolution: {integrity: sha512-CtHY2Z4JpvkniMAwPSeP+X+aQOMrDoE4SSuXde4G6BLPGjAFHEZcKnHtPjq8LnmMFCo9abhiOW+jrBMwPm6H3w==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' '@fluentui/react-infobutton@9.0.0-beta.102': resolution: {integrity: sha512-3kA4F0Vga8Ds6JGlBajLCCDOo/LmPuS786Wg7ui4ZTDYVIMzy1yp2XuVcZniifBFvEp0HQCUoDPWUV0VI3FfzQ==} @@ -3911,27 +3903,21 @@ packages: react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' - '@fluentui/react-infolabel@9.4.0': - resolution: {integrity: sha512-ABSzkV/FN0TfKRXbarb+/dWihgKpqDeS5YWf69pCeXg7s+Ls3UQn/7+mgBjHcMOoRpbqW45bOzCoC+6Iqb2ggg==} + '@fluentui/react-infolabel@9.4.6': + resolution: {integrity: sha512-IRiIKy0lD+l20ZjpckGEHGd7qDkG5paxrfCRaXfSEuId1Rsr/J0OLv2ZAuCr3oBkM9RVFs5WXsQIVfV8idmckQ==} peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' + '@types/react': '>=16.8.0 <20.0.0' + '@types/react-dom': '>=16.8.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.8.0 <20.0.0' - '@fluentui/react-input@9.7.0': - resolution: {integrity: sha512-rJCVaVnAidVtp//DQFaz1vHMbiNVcxZPjvZ9xfIpdRjFk+kSEkcRj1AT/iCMqwTXhJb9hYIMJRE+gPQoTiQYdQ==} + '@fluentui/react-input@9.7.5': + resolution: {integrity: sha512-TFr9hNRNvrUWj6Ama9a556LVFWWOa4kjmU75HrJ2kwLee4cRbDrhOr9mH98v6P7d52meDtQjYDusaq83/WLflA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - - '@fluentui/react-jsx-runtime@9.1.2': - resolution: {integrity: sha512-igGuh0P7Gd09Kk3g6JwjnaRIRk+mluCbpf+KcAUde6bxZ/5qB50HGX+DOGWa3+RPd5240+HLBxpT3Y985INgqw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - react: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' '@fluentui/react-jsx-runtime@9.1.3': resolution: {integrity: sha512-MS5em+pV+xLskAF1BJCXUnfjacWX8lpjvxlaZo4rLNZxyiUPJ2C71bMFhOMsAvTWmbGaTi4CDfK6fSmBQov48Q==} @@ -3939,13 +3925,11 @@ packages: '@types/react': '>=16.14.0 <19.0.0' react: '>=16.14.0 <19.0.0' - '@fluentui/react-label@9.3.0': - resolution: {integrity: sha512-HRSi4TBEjkJoeNZ9FOL8VPnOwrKrJp5drd1f00cICwRz7cimSZt56C97BwM9IB41nEdF3Yk3MLd4Hea1PO+Msg==} + '@fluentui/react-jsx-runtime@9.2.0': + resolution: {integrity: sha512-2LI7vvkQqa0E69nODYC0HD37wgIRUb3szHnfWDJyz0XHiF+A0vYmv1W6ZD1+Uk3th4e6+M0gy3uH+ghtki5RtQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + react: '>=16.14.0 <20.0.0' '@fluentui/react-label@9.3.1': resolution: {integrity: sha512-OqF3xrl66s8mrg56X2MtSUIArwMwFcmO2j2NBwargAreH4F/kyjzwYVe+ZImO1uRxg67sjriMXmlraebBEiOIg==} @@ -3955,21 +3939,21 @@ packages: react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' - '@fluentui/react-link@9.6.0': - resolution: {integrity: sha512-2G+IWuT98pt1HwJWuL9VuTQesUdYjDooK/LPUOsXaVwwGP71lKBXQ6B7ZBw5bqDt3dwborTugyG6RlD7aDpPbw==} + '@fluentui/react-label@9.3.5': + resolution: {integrity: sha512-9k+A/P0ftmYwYH7yej512osMLjTgQGq8Lt5pWyrhHXZEvAPTAhZ9BwtaM/RkikPG9EhbgQyTpPVMzRS4TTAKmw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-list@9.3.0': - resolution: {integrity: sha512-OsYz2ULKXnFEExZW8FaUk1+cjPcFIrtRlwytKDAnRvwyBLIhhQezRWWTEVpc2M75NmZbkZtqyDujdB/ZdSlOmA==} + '@fluentui/react-link@9.6.5': + resolution: {integrity: sha512-TAxRc8RL0en++EX1XxStqQSKgprId68e9l64S2ILgEjCnwtery9jG8yhzRfZrdPwbARfn2s1N3JF2brRmYxBTQ==} peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' '@fluentui/react-list@9.4.0': resolution: {integrity: sha512-NONtY5oBbmAxv/bElXHZ1IzzgtoBkDH3qYMOQx2DvOFBMSCPCHk7GQUwCAt/ACf1uer1bpFQDVcDRPyaUUPnJw==} @@ -3979,133 +3963,141 @@ packages: react: '>=16.14.0 <19.0.0' react-dom: '>=16.8.0 <19.0.0' - '@fluentui/react-menu@9.19.0': - resolution: {integrity: sha512-Wy/8DaHXEtntJk2onVWZI19AHIJkAJB9gXjXrKFk4DbSX0n9Brj06dBu9lZzl5q4i7cUQhg9sMayle3ovspX6w==} + '@fluentui/react-list@9.6.0': + resolution: {integrity: sha512-rx9e/vw2+jUqb1op2727wByj1bKj7ToXNg8LwQHlT5LnGNFAuhu9xdsCYyYOlC/zsTpO/zsEErYozkbDHINXNA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.8.0 <20.0.0' + '@types/react-dom': '>=16.8.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.8.0 <20.0.0' - '@fluentui/react-message-bar@9.6.0': - resolution: {integrity: sha512-sGVd+wK2NsiHBcGl1Pw3P4LJW50hbaN4+4NA5udCwbtIW97lO2zMFJtROU+oBYkmV0HbJ9jSxOYyeMmndjKjAQ==} + '@fluentui/react-menu@9.19.6': + resolution: {integrity: sha512-TikasXs3+nnh7O4u+n5xFSB36FKQnjv9qr80bBOv7QpKsPw/E5N9NJV5m5M4OOrBi1DfwJZ8SA4o7mI/cIYfCQ==} peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-motion-components-preview@0.7.0': - resolution: {integrity: sha512-vGxi2KLqwCzfV2WSZBYGKSzKnfsnGKjkQpE5qYfwk0aPp3iDXtyiLCANgNiPKIBJ4R+/48SAbIDKaiXBtd7GRw==} + '@fluentui/react-message-bar@9.6.6': + resolution: {integrity: sha512-JnpY//bxq0E+/V3Abj0NW3EMzK24eNtQ5JS/lfjVoTEOfGJ4ozbpvPzh7gVUM17LlF8niIr8drLuz3sCPfoElw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.8.0 <20.0.0' + '@types/react-dom': '>=16.8.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.8.0 <20.0.0' - '@fluentui/react-motion@9.9.0': - resolution: {integrity: sha512-xgm/CkU1UvemooplEFKJL9mfGJFvzId2DJ1WYTFAa5TSZMtzOAZuPuwS/PrPNFuwjnhvCMShDj8zazgvR5i37A==} + '@fluentui/react-motion-components-preview@0.10.0': + resolution: {integrity: sha512-2toRl6OZ51d+xardwWikvxqbO9WgHUnuvzUj8kPXdif4QOTBcFxKOh3uuqkBI4H3o3gjAfflVonm51a8N9SFPw==} peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-nav@9.3.0': - resolution: {integrity: sha512-IodGcAPlH45pNskmPmFsXF8IGGrRAEcd4PrytdAPFhBx0Ov69uvoI1B7mCTDGYYb0g8KRW751rGJtU4QMgUAUw==} + '@fluentui/react-motion@9.10.4': + resolution: {integrity: sha512-9YUSWY4aiYAaKJcMma5zAVOLlWgPCcoKaJ+dKEvJhASqAKU2T2dLkvOShZXEuMoSvUC/6VIEz0tw1jGbpu/92A==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.8.0 <20.0.0' + '@types/react-dom': '>=16.8.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.8.0 <20.0.0' - '@fluentui/react-overflow@9.5.0': - resolution: {integrity: sha512-XIJ2WGNiSs4KER5GIV9iMQA/lGVSR2eE+Aeht+hGiwlmn/YvTvS5SM/LSw2CKyi1LkVRzNB3Kj1wiIzD/he5+Q==} + '@fluentui/react-nav@9.3.6': + resolution: {integrity: sha512-f2vyj6s2wIaPBGkqZY+b/BVixpymePYKroEhle3akuPBe0w2xCCamaD+Iai8MqgygwZE720/Eae/VSFRAdXoxA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-persona@9.5.0': - resolution: {integrity: sha512-0MnNTqrJ3BxTXvg+NdLE9mabSmLFVKiuqdIAtK/gYFiEk43wGskMUx9Kw1Dfq6xRYQImaFnoLhd+47YsLyn9jg==} + '@fluentui/react-overflow@9.5.6': + resolution: {integrity: sha512-5P3YVfycGwlfIQSYfrhOEIWwWOXmfhG8ELOAiIU9kgSUrZ3sJyXrl9xD1j9B1VRdTLlrhKif/0pGoct2jf//vw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-popover@9.12.0': - resolution: {integrity: sha512-qnPwYW3E63jLTaVB7ssbTVE9ez04eNmky7SjdD2MlU6F2506nuV5V7wPp3Z5LZpD6SQqgMjtPiTlcFgWHAjAvw==} + '@fluentui/react-persona@9.5.6': + resolution: {integrity: sha512-0dKtUgV5W9XzcyluJY0wFMPOZ8gswEFsbOLgJuRmHJmLw/Ha3dyiUJHDIMV9/VCP4IM8+T06HS4RuATShGWifA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-portal@9.7.0': - resolution: {integrity: sha512-g9Q9wsw4OH4UFYyjb5BfbL7GwaloIiFMVZXie9q0lLeo9JUFhNHh/2X7UUGesagCO86WMGN1haQUA7uaN6gIXA==} + '@fluentui/react-popover@9.12.6': + resolution: {integrity: sha512-2VlHq+bE0Ep7CIKS9iBROyvwwH44swt51pi7pJvFaO5UL5I3Gny0dUglxBU+Y2O/0/Rl1HyqlU0AwYaldWVBew==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-positioning@9.20.0': - resolution: {integrity: sha512-qbxIYG8N+zBVXsgyiqd8kQzDiEn+eabnDBn3hqhaolVqn3QVWfgjoARJXYuKbUY0GDMPMukW1PH2NbEl5BvQXQ==} + '@fluentui/react-portal@9.8.2': + resolution: {integrity: sha512-FOckq3BW9iaVci1KuseFgdKlsXUMZqMxronmDn/smPzgvnr+yhH3CLgwsL4lOJgdNxf4oBOmLDNzO0yoENQEyg==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-progress@9.4.0': - resolution: {integrity: sha512-EplT3K95DPob22MV0mIzLmbzsdS2bhMPEiRjUAsRpUPnw5gRJi4OKneS5y3mRCBUiFjlkzEDwTTbEa+NkZEXlg==} + '@fluentui/react-positioning@9.20.5': + resolution: {integrity: sha512-J0IgLF3QKIAQb/wFn0e7oYhgzLfVnB9XTE51Gw7pXytx9U/IdxuT7dXBodWGh4MFceUI0u7djOOHiqrnWjUV2A==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-provider@9.22.0': - resolution: {integrity: sha512-dyrux/z+OXTM9U0uaq/AHtSI/5jZsehw3LND79StMP11ebi9lGjyRthZ3M8E6Pq7LlSgQ0yVnMFYZc9WoijVHg==} + '@fluentui/react-progress@9.4.5': + resolution: {integrity: sha512-vm60bgQh6cf03RBkIKT2KKcNG3bC63vBN6IvPnuRedOJbIQ04jxonMbdyZ2HSVmlIsRRy/9iJk0wiSird7XUfA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-radio@9.5.0': - resolution: {integrity: sha512-9j4t85KdIYu5TN3tN1S2KlIfzL4FNYRuFBsQ8WxB0F8vmGlyIxUt9S2dRG3+MScqOwIS2Q0HAmZhu0hrTJVWRg==} + '@fluentui/react-provider@9.22.5': + resolution: {integrity: sha512-j4eY6DEigrHRKyE6nl+l59mLRWpr3RgWLeEHFAh0a6EGNrrK5S//9EbR0xTHM6SzpmQO1xYn+G/WyAeg6asTKA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-rating@9.3.0': - resolution: {integrity: sha512-FP19VCBG3aQm7uP/pORfDBKHU/f5YinvETe39y4+9VPiXlgbF+sqjwXGB6N7kvu9ZdTD4ZFrMW4FaSLYrpJEtA==} + '@fluentui/react-radio@9.5.5': + resolution: {integrity: sha512-9pcl2osiEtA6u7JOFUz+ZR4LwHbDlwWUkH/no8KbyOkbrXBGm44rxmj684R7PgE+lZHzruPuKNtGWpbZlgsodg==} peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-search@9.3.0': - resolution: {integrity: sha512-RMzYhNdrLpz5/e6Z3NlDmX7KP+AXz0N0e4SBoKjHauoDfEPD9+oHbSbah/JQWmw290h1jUUrElRwPYoIQ8eSgg==} + '@fluentui/react-rating@9.3.5': + resolution: {integrity: sha512-2gF3ccGt3zs6gVXt9r1nKJb5Nb6Re9fTTWM3FXvge+8DfHQrKvyU8CFMPJL2EC9FeBP10BhcfbSiaJyvDAaSdg==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.8.0 <20.0.0' + '@types/react-dom': '>=16.8.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.8.0 <20.0.0' - '@fluentui/react-select@9.4.0': - resolution: {integrity: sha512-6DoC6Xc6hkHKCzRFjB2UYbJAa3v+KZ/OUML18OvYvdGkEtv+n2x3sc+mUDgFuXHqB/4OIhUDXq4S/Mriwd8KUg==} + '@fluentui/react-search@9.3.5': + resolution: {integrity: sha512-QvTvto+JKb299BsNocNb3mwo+JTwE+Pf82C4Ha+y3j3gf2k40k+rYkshtA1Wt44mnbQv3HJe0xCXptk5ByvpTw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' + + '@fluentui/react-select@9.4.5': + resolution: {integrity: sha512-mHnWpRHqXM5aXW1hD6p4V9n7onoRpyAuMvBViFdncbvP9Bkk6aQspEH0CupV7y/JVG5bnoGSfGs89kPZQDDCcg==} + peerDependencies: + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' '@fluentui/react-shared-contexts@9.24.0': resolution: {integrity: sha512-GA+uLv711E+YGrAP/aVB15ozvNCiuB2ZrPDC9aYF+A6sRDxoZZG8VgHjhQ/YWJfVjDXLky4ihirknzsW1sjGtg==} @@ -4113,77 +4105,75 @@ packages: '@types/react': '>=16.14.0 <19.0.0' react: '>=16.14.0 <19.0.0' - '@fluentui/react-skeleton@9.4.0': - resolution: {integrity: sha512-n6viQkyI+g7ljf33x/6FVwNfyfJq6Qosug5OlxsSTrneyn+kSb6lw8K4z3AUIEBOR65XEonYWegXOm4ldcJYOw==} + '@fluentui/react-shared-contexts@9.25.1': + resolution: {integrity: sha512-C15uX9dnIVe0cm2wa9WMd9KhG5pdbs9jxnzgpFvraCGpLqFHniK2xJghYBRzj66zEK6xJnuRZR89/Y8wsiO11w==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + react: '>=16.14.0 <20.0.0' - '@fluentui/react-slider@9.5.0': - resolution: {integrity: sha512-qxLRYBKKEbRuKdHzE0iSpETvjYKGjIK4Rm18swFd5Jl4SfXUxaq6EuHRE1sfiOhraH2nDSKHVT+iXZxYi/g+Tg==} + '@fluentui/react-skeleton@9.4.5': + resolution: {integrity: sha512-D1WB6CCXkDQ8ahfYOWS4D1rfNvwc8+uiuQ/35/DSBwUrzz0ay5lPBKTBHizG4hKc4mHZmfAw/DG0kJiI0An84w==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-spinbutton@9.5.0': - resolution: {integrity: sha512-rRdgwNb0yNJOeCwbr6Kn1VX+ys+4PEfl6bwHphXy/6iwbF7BETtZjmGGbfXhuu+WsLxQxHnyeo5uC21E/mbWqg==} + '@fluentui/react-slider@9.5.5': + resolution: {integrity: sha512-6I6lp7C2rlxwcqqro0RiAEh8vWSijdq3Dkpp9igFdcL0WMTsMCjzdjODCfsWWHsz3+K/uVBNN146C3aW0Xj9KQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-spinner@9.7.0': - resolution: {integrity: sha512-B9KQ6Muy2KZIBpmzkdZ0ONu4Ao/3iMhBous1Emq7wfiYEhoz1pOLKvVgh+IgXz5SX28x8cZiDt9/Hu7Quf6zJg==} + '@fluentui/react-spinbutton@9.5.5': + resolution: {integrity: sha512-6iwcMQ53ki8XdLEnu4x7hd5kimTfSFm+8/7tebrfjQeE7qB4ZTX6G+QXUw46gyX2EgqHDSMu0GKzHGSJdv0hoA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-swatch-picker@9.4.0': - resolution: {integrity: sha512-KSeIvU/fwBeXP5irqQxSvs34LNu03a3NYF48GOJrDODUwv/tjYn+/IgsPRMjA2pZ502AMWFa5OSKpeUJ9mbi1g==} + '@fluentui/react-spinner@9.7.5': + resolution: {integrity: sha512-TIgpjwbeLS3c4fLrDRwIEmdLJ5+Clr6RKapj9LlqX/RBWXfTncGIy2L/LNuVsxVuB5mNApcAOY3XcptDFrFSqg==} peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-switch@9.4.0': - resolution: {integrity: sha512-8uKP2aM/doLGprYuljbJAbAapeVWbgMW1FLQH53+RHURZNy1Gvt8AiisllJwtmQC8esgK4xlbaSzn/b1/S8B8A==} + '@fluentui/react-swatch-picker@9.4.5': + resolution: {integrity: sha512-EylVOV9ld7jNsN0VwvIKun0SFtAV3xr8RuOFPveWs37t4Z4N8OTZM+y7kpXBNzFbp0sQuoAiORpSofdoCkssCA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.8.0 <20.0.0' + '@types/react-dom': '>=16.8.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.8.0 <20.0.0' - '@fluentui/react-table@9.18.0': - resolution: {integrity: sha512-yBdBvY5X/XnX5WYoFseKlqc0pYomBZ+3jFaMEeWMYxOAIuHWif3IUq4kTxBoweKcFMmclMNMpY22j/6YcFwHXA==} + '@fluentui/react-switch@9.4.5': + resolution: {integrity: sha512-Mt+ohljW8V8rvGzTAt1e9j7XMwqTJIXvq/CirhxEmdOYMi9qlXrSPRJLWA/aI9aoBlwMtihi9KcOWbhg2uWqsw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-tabs@9.9.0': - resolution: {integrity: sha512-V06heimvtH5LcjjePkl8ETWrX4YN1V2STQhFr6lXn6FjS8nsNGhWemHduCi2qY3DLyZgYLBGrOR5AgSbbv5jcA==} + '@fluentui/react-table@9.18.6': + resolution: {integrity: sha512-4fRwdWeCCYMAvJLc78XxiyRlL2IDw8oXOaMuEnjQYShPNZe8tJi4darTH3djBGSnFD4rxBR9lckc/d1xpySXEA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-tabster@9.26.0': - resolution: {integrity: sha512-ENaISUye53JLvAN3VqiKzTdDSubnMucG/mcGuB+QbnzTLGIHxvEYq/GV4WHwWbQwjZPXAG9Hr0F0l0AFzrkeFA==} + '@fluentui/react-tabs@9.10.1': + resolution: {integrity: sha512-4e8ZubpLfB8zv/SiwcBZcF313lsZQldsq5uJD+zT5SBiwemHoqKhijj6c8VcKIcmfEQx3GLhc6qIiXTZRY1k7g==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' '@fluentui/react-tabster@9.26.1': resolution: {integrity: sha512-uQTW73VKzUnABo6nV4Muv5W1c6RPtOjF8xq+EliZVds2kAxAUTKAr8cZUqNd8xoD4X8vtG4kNdOPyN9+OR9yjA==} @@ -4193,86 +4183,91 @@ packages: react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' - '@fluentui/react-tag-picker@9.7.0': - resolution: {integrity: sha512-p0xAxemN/fYlDG6dVbkcGybjMCiNravyzTsnpE2OwEoh3eDfsL5oXipPkcJACzv5ZhmavVyAHs4txenEcW24gw==} + '@fluentui/react-tabster@9.26.5': + resolution: {integrity: sha512-VLt5KMRHzgT+pSF22tQuuZkaXFiQT6MOjVhoqPmBGKiXSIyVB3vnUOMQyITgDMhy4og/kk6gh04l5/6YXjJV9A==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-tags@9.7.0': - resolution: {integrity: sha512-TU7CPouGFuOXxGVjrbWbLgyTNrVoyxOS3xvwdZGJuGlaU9FbFuzKNUeV/CL0o6SiA/0O1wGa4/VV6XRuUGQX3Q==} + '@fluentui/react-tag-picker@9.7.6': + resolution: {integrity: sha512-1ILx9++MJ/+WOIXRhiB9ta/fsVtPOWFGJWD/FxzayvIH8O9E1BVlTLykt6cIGI1ajDq+OoNDmviMLS2sdkyfMQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-teaching-popover@9.6.0': - resolution: {integrity: sha512-/JX1+W/ff8bkO1nCSExL9ASP1zfysUInc83V/6XzRgwhyNMkUoNgGRw32EDpxz6Ympe8mZnQKWNUmvTsxr28aQ==} + '@fluentui/react-tags@9.7.6': + resolution: {integrity: sha512-N/WoiMZOgGEkh1QPsH+f+ugD4WW0ECd0wVmDTXXOpFt6EDVDbkNmKloMSWKlLFXvVakbou8WxsfTZG/I8hX5XA==} peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-text@9.6.0': - resolution: {integrity: sha512-/ZAMjgAn5sgbAjYnwmM5k0kxgNehpccxXI6f5uJ72IfAmj85dMH4TDNsN6xOCIMhj+xDxuBIT4axEYt+wAoF1Q==} + '@fluentui/react-teaching-popover@9.6.6': + resolution: {integrity: sha512-6CuexuCTW45rV4WMyEicch6S9yp1yRdKPYMnMl+l4jqavypgXyPIRsaPRrOOJ4aN2LtP8qh4IiQemaYlw6ZlbA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.8.0 <20.0.0' + '@types/react-dom': '>=16.8.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.8.0 <20.0.0' + + '@fluentui/react-text@9.6.5': + resolution: {integrity: sha512-M4fAOC5OTyRVRpNwrCuIUE5y/lQgfYuCuQ1En+KUG+bpw7junkfkvkOfNKEPBVElmv5KZ/rJ2UffwSFQQB7v2g==} + peerDependencies: + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-textarea@9.6.0': - resolution: {integrity: sha512-o6jAAB4cIzzPLBj8/RDo+my7yXSQtFCC+O2p4mD2X+hUvBCydoQI+45RbEeJXXwEsWjUp7XfbLUyt3mB8dH0xQ==} + '@fluentui/react-textarea@9.6.5': + resolution: {integrity: sha512-Vx1gkjD9Z1WDY8lAYd9DAebnVdLsjoDV/ZvlE3dppAa+ICvRTlSb8rUP+Oucup2GGFBz31gfTse1x7wbfier0Q==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' '@fluentui/react-theme@9.1.24': resolution: {integrity: sha512-OhVKYD7CMYHxzJEn4PtIszledj8hbQJNWBMfIZsp4Sytdp9vCi0txIQUx4BhS1WqtQPhNGCF16eW9Q3NRrnIrQ==} - '@fluentui/react-toast@9.6.0': - resolution: {integrity: sha512-t/eUl3w8RdLFMLHcvWHXCH9jec29MV7K7pqmyXsW2g7edaChTyCbkxlII861IvY+XqwIvNlpczzh4cgkyzAj/w==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@fluentui/react-theme@9.2.0': + resolution: {integrity: sha512-Q0zp/MY1m5RjlkcwMcjn/PQRT2T+q3bgxuxWbhgaD07V+tLzBhGROvuqbsdg4YWF/IK21zPfLhmGyifhEu0DnQ==} - '@fluentui/react-toolbar@9.6.0': - resolution: {integrity: sha512-tbpM8prz8cDTzeF7PudjTA3UQruVrjGNSsTwR+vmIGVo0E986Zz+VSJaLICeC2ttiHOirhqm6goswP+bGG5Evw==} + '@fluentui/react-toast@9.7.1': + resolution: {integrity: sha512-o1+HavVLOI63Qf7p9soIfxCOMhurU/oX+YTuEmC04dxAq6l81Mzzv3om9dfbKFQN4ofzapcOXVcoXHP47wV+yA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-tooltip@9.8.0': - resolution: {integrity: sha512-LW0ouXkPXxx+XPScLB9tWlqn11cVHxmDJ3weZXuWrl5jjx4agjqKHGC8MOdr4Un+2hoO0g2BcrlDaQNhsMPgYA==} + '@fluentui/react-toolbar@9.6.6': + resolution: {integrity: sha512-Ywsyuuome0o6FwfmHRADCc8JZbjcBTZNBSeSpBdoh3Q0enZ2FJ5YhiYzdX3qcas3pmUr3UGOGdVH6LqKZSSUDw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-tree@9.12.0': - resolution: {integrity: sha512-vehLCk918YN53h8sGs4jx5oEF2twdVRdoIQ+csuLUkxRhl7f6eWyQWRk/R2lZlJgsz0vgk07RB/Yfx8/BFEUiA==} + '@fluentui/react-tooltip@9.8.5': + resolution: {integrity: sha512-Lg97zUE+2p2riZbBIGvQbTOMTJpj61njJ7fAxmzgus/zBSbSO/HxuCIPoO+cYfGNc/ufxuDqbgo1soTDvglCPA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-utilities@9.22.0': - resolution: {integrity: sha512-O4D51FUyn5670SjduzzN1usmwWAmFPQA00Gu6jJrbDXvOXTpOAO/ApkLpSW87HChKGrj8Y0gjFHtK8xpC3qOCg==} + '@fluentui/react-tree@9.13.1': + resolution: {integrity: sha512-mQ/9agSIUmgNbenv4rYgwI+7+O+m/c/aBo7wfipc2OKswx0K09YIHrfe1+zRFk813fbu6JuR/NmmVquAYe0c3w==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - react: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' '@fluentui/react-utilities@9.23.0': resolution: {integrity: sha512-OlAzxBUoHY0URL5DKt1ckV7lzFtPzWCWV8nhd+4or7KDFk8P1PL3jUo/zqCZ5yLq2KplO7/G0h3SOyeFlZte7Q==} @@ -4280,9 +4275,14 @@ packages: '@types/react': '>=16.14.0 <19.0.0' react: '>=16.14.0 <19.0.0' - '@fluentui/react-virtualizer@9.0.0-alpha.100': - resolution: {integrity: sha512-e7u3SP2Smv5+9Adey+pOerGmHq2D6Nd0ek/iWbc/o0CKX5QMeHwbUlZAbVVsrX/vwIeeZ3+qJMt+UH3hHI+wdw==} - deprecated: Deprecating react-virtualizer in Fluent core - migrating to fluentui-contrib repo for stable release + '@fluentui/react-utilities@9.24.1': + resolution: {integrity: sha512-Ih0S+BrHiiGiG0faDncmipOQ2rz8jHaKXzSN4p5U5m7d/jcPMAZ45cHtaYGLTD0O32ur7/AusmQSLY6c/9WvnQ==} + peerDependencies: + '@types/react': '>=16.14.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + + '@fluentui/react-virtualizer@9.0.0-alpha.102': + resolution: {integrity: sha512-kt/kuAMTKTTY/00ToUlgUwUCty2HGj4Tnr+fxKRmr7Ziy5VWhi1YoNJ8vcgmxog5J90t4tS29LB0LP0KztQUVg==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' @@ -4292,6 +4292,9 @@ packages: '@fluentui/tokens@1.0.0-alpha.21': resolution: {integrity: sha512-xQ1T56sNgDFGl+kJdIwhz67mHng8vcwO7Dvx5Uja4t+NRULQBgMcJ4reUo4FGF3TjufHj08pP0/OnKQgnOaSVg==} + '@fluentui/tokens@1.0.0-alpha.22': + resolution: {integrity: sha512-i9fgYyyCWFRdUi+vQwnV6hp7wpLGK4p09B+O/f2u71GBXzPuniubPYvrIJYtl444DD6shLjYToJhQ1S6XTFwLg==} + '@fortawesome/fontawesome-free@6.7.2': resolution: {integrity: sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==} engines: {node: '>=6'} @@ -4720,6 +4723,9 @@ packages: '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -4737,9 +4743,9 @@ packages: resolution: {integrity: sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==} engines: {node: '>= 14.0.0'} - '@koa/router@13.1.1': - resolution: {integrity: sha512-JQEuMANYRVHs7lm7KY9PCIjkgJk73h4m4J+g2mkw2Vo1ugPZ17UJVqEH8F+HeAdjKz5do1OaLe7ArDz+z308gw==} - engines: {node: '>= 18'} + '@koa/router@14.0.0': + resolution: {integrity: sha512-LBSu5K0qAaaQcXX/0WIB9PGDevyCxxpnc1uq13vV/CgObaVxuis5hKl3Eboq/8gcb6ebnkAStW9NB/Em2eYyFA==} + engines: {node: '>= 20'} '@mdx-js/mdx@3.1.0': resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} @@ -5041,8 +5047,8 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@playwright/browser-chromium@1.54.1': - resolution: {integrity: sha512-GFiRk7OvwlPrUXM3JGm5QgmzA0w2nyke0sYwigDL+rriQ+Ok7Vub0F3lIsxjHPEp5pfq+KQvzSWCMDXs0efMKQ==} + '@playwright/browser-chromium@1.55.1': + resolution: {integrity: sha512-T4Iyhcv38bdOrtCxpjHA6WaQk4EHeud38J+SnLaOoIuGFPK7zNgSqEuilqTGB6xqfcVHYKHWePkXcYFVOux8ew==} engines: {node: '>=18'} '@playwright/test@1.54.1': @@ -5556,13 +5562,16 @@ packages: '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + '@rolldown/pluginutils@1.0.0-beta.38': + resolution: {integrity: sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw==} + '@rollup/plugin-babel@6.0.4': resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==} engines: {node: '>=14.0.0'} peerDependencies: '@babel/core': ^7.0.0 '@types/babel__core': ^7.1.9 - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + rollup: 4.49.0 peerDependenciesMeta: '@types/babel__core': optional: true @@ -5573,7 +5582,7 @@ packages: resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + rollup: 4.49.0 peerDependenciesMeta: rollup: optional: true @@ -5582,83 +5591,83 @@ packages: resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + rollup: 4.49.0 peerDependenciesMeta: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.45.1': - resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} + '@rollup/rollup-android-arm-eabi@4.49.0': + resolution: {integrity: sha512-rlKIeL854Ed0e09QGYFlmDNbka6I3EQFw7iZuugQjMb11KMpJCLPFL4ZPbMfaEhLADEL1yx0oujGkBQ7+qW3eA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.45.1': - resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} + '@rollup/rollup-android-arm64@4.49.0': + resolution: {integrity: sha512-cqPpZdKUSQYRtLLr6R4X3sD4jCBO1zUmeo3qrWBCqYIeH8Q3KRL4F3V7XJ2Rm8/RJOQBZuqzQGWPjjvFUcYa/w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.45.1': - resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} + '@rollup/rollup-darwin-arm64@4.49.0': + resolution: {integrity: sha512-99kMMSMQT7got6iYX3yyIiJfFndpojBmkHfTc1rIje8VbjhmqBXE+nb7ZZP3A5skLyujvT0eIUCUsxAe6NjWbw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.45.1': - resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} + '@rollup/rollup-darwin-x64@4.49.0': + resolution: {integrity: sha512-y8cXoD3wdWUDpjOLMKLx6l+NFz3NlkWKcBCBfttUn+VGSfgsQ5o/yDUGtzE9HvsodkP0+16N0P4Ty1VuhtRUGg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.45.1': - resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} + '@rollup/rollup-freebsd-arm64@4.49.0': + resolution: {integrity: sha512-3mY5Pr7qv4GS4ZvWoSP8zha8YoiqrU+e0ViPvB549jvliBbdNLrg2ywPGkgLC3cmvN8ya3za+Q2xVyT6z+vZqA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.45.1': - resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} + '@rollup/rollup-freebsd-x64@4.49.0': + resolution: {integrity: sha512-C9KzzOAQU5gU4kG8DTk+tjdKjpWhVWd5uVkinCwwFub2m7cDYLOdtXoMrExfeBmeRy9kBQMkiyJ+HULyF1yj9w==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': - resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} + '@rollup/rollup-linux-arm-gnueabihf@4.49.0': + resolution: {integrity: sha512-OVSQgEZDVLnTbMq5NBs6xkmz3AADByCWI4RdKSFNlDsYXdFtlxS59J+w+LippJe8KcmeSSM3ba+GlsM9+WwC1w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.45.1': - resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} + '@rollup/rollup-linux-arm-musleabihf@4.49.0': + resolution: {integrity: sha512-ZnfSFA7fDUHNa4P3VwAcfaBLakCbYaxCk0jUnS3dTou9P95kwoOLAMlT3WmEJDBCSrOEFFV0Y1HXiwfLYJuLlA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.45.1': - resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} + '@rollup/rollup-linux-arm64-gnu@4.49.0': + resolution: {integrity: sha512-Z81u+gfrobVK2iV7GqZCBfEB1y6+I61AH466lNK+xy1jfqFLiQ9Qv716WUM5fxFrYxwC7ziVdZRU9qvGHkYIJg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.45.1': - resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} + '@rollup/rollup-linux-arm64-musl@4.49.0': + resolution: {integrity: sha512-zoAwS0KCXSnTp9NH/h9aamBAIve0DXeYpll85shf9NJ0URjSTzzS+Z9evmolN+ICfD3v8skKUPyk2PO0uGdFqg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': - resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} + '@rollup/rollup-linux-loongarch64-gnu@4.49.0': + resolution: {integrity: sha512-2QyUyQQ1ZtwZGiq0nvODL+vLJBtciItC3/5cYN8ncDQcv5avrt2MbKt1XU/vFAJlLta5KujqyHdYtdag4YEjYQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': - resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} + '@rollup/rollup-linux-ppc64-gnu@4.49.0': + resolution: {integrity: sha512-k9aEmOWt+mrMuD3skjVJSSxHckJp+SiFzFG+v8JLXbc/xi9hv2icSkR3U7uQzqy+/QbbYY7iNB9eDTwrELo14g==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.45.1': - resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} + '@rollup/rollup-linux-riscv64-gnu@4.49.0': + resolution: {integrity: sha512-rDKRFFIWJ/zJn6uk2IdYLc09Z7zkE5IFIOWqpuU0o6ZpHcdniAyWkwSUWE/Z25N/wNDmFHHMzin84qW7Wzkjsw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.45.1': - resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} + '@rollup/rollup-linux-riscv64-musl@4.49.0': + resolution: {integrity: sha512-FkkhIY/hYFVnOzz1WeV3S9Bd1h0hda/gRqvZCMpHWDHdiIHn6pqsY3b5eSbvGccWHMQ1uUzgZTKS4oGpykf8Tw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.45.1': - resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} + '@rollup/rollup-linux-s390x-gnu@4.49.0': + resolution: {integrity: sha512-gRf5c+A7QiOG3UwLyOOtyJMD31JJhMjBvpfhAitPAoqZFcOeK3Kc1Veg1z/trmt+2P6F/biT02fU19GGTS529A==} cpu: [s390x] os: [linux] @@ -5667,28 +5676,28 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.45.1': - resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} + '@rollup/rollup-linux-x64-gnu@4.49.0': + resolution: {integrity: sha512-BR7+blScdLW1h/2hB/2oXM+dhTmpW3rQt1DeSiCP9mc2NMMkqVgjIN3DDsNpKmezffGC9R8XKVOLmBkRUcK/sA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.45.1': - resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} + '@rollup/rollup-linux-x64-musl@4.49.0': + resolution: {integrity: sha512-hDMOAe+6nX3V5ei1I7Au3wcr9h3ktKzDvF2ne5ovX8RZiAHEtX1A5SNNk4zt1Qt77CmnbqT+upb/umzoPMWiPg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.45.1': - resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} + '@rollup/rollup-win32-arm64-msvc@4.49.0': + resolution: {integrity: sha512-wkNRzfiIGaElC9kXUT+HLx17z7D0jl+9tGYRKwd8r7cUqTL7GYAvgUY++U2hK6Ar7z5Z6IRRoWC8kQxpmM7TDA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.45.1': - resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} + '@rollup/rollup-win32-ia32-msvc@4.49.0': + resolution: {integrity: sha512-gq5aW/SyNpjp71AAzroH37DtINDcX1Qw2iv9Chyz49ZgdOP3NV8QCyKZUrGsYX9Yyggj5soFiRCgsL3HwD8TdA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.45.1': - resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} + '@rollup/rollup-win32-x64-msvc@4.49.0': + resolution: {integrity: sha512-gEtqFbzmZLFk2xKh7g0Rlo8xzho8KrEFEkzvHbfUGkrgXOpZ4XagQ6n+wIZFNh1nTb8UD16J4nFSFKXYgnbdBg==} cpu: [x64] os: [win32] @@ -6178,8 +6187,8 @@ packages: '@types/node@20.19.9': resolution: {integrity: sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==} - '@types/node@24.1.0': - resolution: {integrity: sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==} + '@types/node@24.3.3': + resolution: {integrity: sha512-GKBNHjoNw3Kra1Qg5UXttsY5kiWMEfoHq2TmXb+b1rcm6N7B3wTrFYIf/oSZ1xNQ+hVVijgLkiDZh7jRRsh+Gw==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -6249,6 +6258,9 @@ packages: '@types/treeify@1.0.3': resolution: {integrity: sha512-hx0o7zWEUU4R2Amn+pjCBQQt23Khy/Dk56gQU5xi5jtPL1h83ACJCeFaB2M/+WO1AntvWrSoVnnCAfI1AQH4Cg==} + '@types/trusted-types@1.0.6': + resolution: {integrity: sha512-230RC8sFeHoT6sSUlRO6a8cAnclO06eeiq1QDfiv2FGCLWFvvERWgwIQD4FWqD9A69BN7Lzee4OXwoMVnnsWDw==} + '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -6258,8 +6270,8 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@types/vscode@1.100.0': - resolution: {integrity: sha512-4uNyvzHoraXEeCamR3+fzcBlh7Afs4Ifjs4epINyUX/jvdk0uzLnwiDY35UKDKnkCHP5Nu3dljl2H8lR6s+rQw==} + '@types/vscode@1.104.0': + resolution: {integrity: sha512-0KwoU2rZ2ecsTGFxo4K1+f+AErRsYW0fsp6A0zufzGuhyczc2IoKqYqcwXidKXmy2u8YB2GsYsOtiI9Izx3Tig==} '@types/whatwg-mimetype@3.0.2': resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} @@ -6357,6 +6369,12 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@vitejs/plugin-react@5.0.4': + resolution: {integrity: sha512-La0KD0vGkVkSk6K+piWDKRUyg8Rl5iAIKRMH0vMJI0Eg47bq1eOxmoObAaQG37WMW9MSyk7Cs8EIWwJC1PtzKA==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@vitest/coverage-v8@3.2.4': resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} peerDependencies: @@ -6446,9 +6464,9 @@ packages: resolution: {integrity: sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==} engines: {node: '>=16'} - '@vscode/test-web@0.0.71': - resolution: {integrity: sha512-uj9a3A3QD1qBOw1ZL19SKNSG6c6rvP9N4XrMvBVKSeAOkmOQftAZoBERLMJPEaJ8Z5dF7aLmA79drjOBk+VTRg==} - engines: {node: '>=16'} + '@vscode/test-web@0.0.73': + resolution: {integrity: sha512-xCvUsZi33/asatnFZHOUzrlcfjwqy+I34tjG0pM4LZmDV1jAeczNAyFRZw6VJE+uSAy9N4ncZz/cemdBaU+yZg==} + engines: {node: '>=20'} hasBin: true '@vscode/vsce-sign-alpine-arm64@2.0.5': @@ -6862,10 +6880,6 @@ packages: algoliasearch@4.25.2: resolution: {integrity: sha512-lYx98L6kb1VvXypbPI7Z54C4BJB2VT5QvOYthvPq6/POufZj+YdyeZSKjoLBKHJgGmYWQTHOKtcCTdKf98WOCA==} - algoliasearch@5.34.0: - resolution: {integrity: sha512-wioVnf/8uuG8Bmywhk5qKIQ3wzCCtmdvicPRb0fa3kKYGGoewfgDqLEaET1MV2NbTc3WGpPv+AgauLVBp1nB9A==} - engines: {node: '>= 14.0.0'} - alien-signals@0.4.14: resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} @@ -7277,10 +7291,6 @@ packages: resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==} engines: {node: ^18.17.0 || >=20.5.0} - cache-content-type@1.0.1: - resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} - engines: {node: '>= 6.0.0'} - cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} @@ -7726,9 +7736,9 @@ packages: resolution: {integrity: sha512-qbpvn3TnSIhb/JDqebap5PX+L6r9WacM045neXTxXRLHLCW6XD16sKrawrMnRoHB4gm/m+MB3yKT5cMEJhuRDA==} hasBin: true - cross-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + cross-env@10.0.0: + resolution: {integrity: sha512-aU8qlEK/nHYtVuN4p7UQgAwVljzMg8hB4YK5ThRqD2l/ziSnryncPNn7bMLt5cFYsKVKBh8HqLqyCoTupEUu7Q==} + engines: {node: '>=20'} hasBin: true cross-fetch@3.2.0: @@ -8469,8 +8479,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-unicorn@60.0.0: - resolution: {integrity: sha512-QUzTefvP8stfSXsqKQ+vBQSEsXIlAiCduS/V1Em+FKgL9c21U/IIm20/e3MFy1jyCf14tHAhqC1sX8OTy6VUCg==} + eslint-plugin-unicorn@61.0.2: + resolution: {integrity: sha512-zLihukvneYT7f74GNbVJXfWIiNQmkc/a9vYBTE4qPkQZswolWNdu+Wsp9sIXno1JOzdn6OUwLPd19ekXVkahRA==} engines: {node: ^20.10.0 || >=21.0.0} peerDependencies: eslint: '>=9.29.0' @@ -9787,8 +9797,8 @@ packages: resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} engines: {node: '>= 7.6.0'} - koa@3.0.0: - resolution: {integrity: sha512-Usyqf1o+XN618R3Jzq4S4YWbKsRtPcGpgyHXD4APdGYQQyqQ59X+Oyc7fXHS2429stzLsBiDjj6zqqYe8kknfw==} + koa@3.0.1: + resolution: {integrity: sha512-oDxVkRwPOHhGlxKIDiDB2h+/l05QPtefD7nSqRgDfZt8P+QVYFWjfeK8jANf5O2YXjk8egd7KntvXKYx82wOag==} engines: {node: '>= 18'} kolorist@1.8.0: @@ -9982,11 +9992,6 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - marked@15.0.12: - resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==} - engines: {node: '>= 18'} - hasBin: true - marked@16.1.1: resolution: {integrity: sha512-ij/2lXfCRT71L6u0M29tJPhP0bM5shLL3u5BePhFwPELj2blMJ6GDtD7PfJhRLhJ/c2UwrK17ySVcDzy2YHjHQ==} engines: {node: '>= 20'} @@ -10354,11 +10359,11 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true - monaco-editor-core@0.52.2: - resolution: {integrity: sha512-5TOyTUymNx7jB24TGP4Qs5UEVrntDKSMzDUvW3ADaI1CFRO1t7FPhbT2u4m3iIKZf85zTM+mkCxiUSgj+v/YtA==} + monaco-editor-core@0.53.0: + resolution: {integrity: sha512-Kn868s1eqMNq+8iSL5SleCYEX3ft4RABldbgyklRdQlfNRLZyUa+pGzO7AQ0mEsFEqGgOksbrO+LEeqwnRCb3A==} - monaco-editor@0.52.2: - resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} + monaco-editor@0.53.0: + resolution: {integrity: sha512-0WNThgC6CMWNXXBxTbaYYcunj08iB5rnx4/G56UOPeL9UVIUGGHA1GR0EWIh9Ebabj7NpCRawQ5b0hfN1jQmYQ==} morgan@1.10.1: resolution: {integrity: sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==} @@ -10719,6 +10724,10 @@ packages: resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} engines: {node: '>=18'} + p-limit@7.1.1: + resolution: {integrity: sha512-i8PyM2JnsNChVSYWLr2BAjNoLi0BAYC+wecOnZnVV+YSNJkzP7cWmvI34dk0WArWfH9KwBHNoZI3P3MppImlIA==} + engines: {node: '>=20'} + p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} @@ -10927,9 +10936,6 @@ packages: resolution: {integrity: sha512-cMMJTAZlion/RWRRC48UbrDymEIt+/YSD/l8NqjneyDw2rDOBQcP5yRkMB4CYGn47KMhZvbblBP7Z79OsMw72w==} engines: {node: '>=8.15'} - path-to-regexp@6.3.0: - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-to-regexp@8.2.0: resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} engines: {node: '>=16'} @@ -11004,11 +11010,21 @@ packages: engines: {node: '>=18'} hasBin: true + playwright-core@1.55.1: + resolution: {integrity: sha512-Z6Mh9mkwX+zxSlHqdr5AOcJnfp+xUWLCt9uKV18fhzA8eyxUd8NUWzAjxUh55RZKSYwDGX0cfaySdhZJGMoJ+w==} + engines: {node: '>=18'} + hasBin: true + playwright@1.54.1: resolution: {integrity: sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==} engines: {node: '>=18'} hasBin: true + playwright@1.55.1: + resolution: {integrity: sha512-cJW4Xd/G3v5ovXtJJ52MAOclqeac9S/aGGgRzLabuF8TnIb6xHvMzKIa6JmrRzUkeXJgfL1MhukP0NK6l39h3A==} + engines: {node: '>=18'} + hasBin: true + plist@3.1.0: resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} engines: {node: '>=10.4.0'} @@ -11049,9 +11065,6 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - preact@10.26.9: - resolution: {integrity: sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==} - prebuild-install@7.1.3: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} @@ -11580,15 +11593,15 @@ packages: hasBin: true peerDependencies: rolldown: 1.x || ^1.0.0-beta - rollup: 2.x || 3.x || 4.x + rollup: 4.49.0 peerDependenciesMeta: rolldown: optional: true rollup: optional: true - rollup@4.45.1: - resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} + rollup@4.49.0: + resolution: {integrity: sha512-3IVq0cGJ6H7fKXXEdVt+RcYvRCt8beYY9K1760wGQwSAHZcS9eot1zDG5axUbcp/kWRi5zKIIDX8MoKv/TzvZA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -11684,9 +11697,6 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - search-insights@2.17.3: - resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} - secretlint@10.2.1: resolution: {integrity: sha512-3BghQkIGrDz3xJklX/COxgKbxHz2CAsGkXH4oh8MxeYVLlhA3L/TLhAxZiTyqeril+CnDGg8MUEZdX1dZNsxVA==} engines: {node: '>=20.0.0'} @@ -12351,10 +12361,18 @@ packages: tree-sitter: optional: true - tree-sitter-python@0.23.6: - resolution: {integrity: sha512-yIM9z0oxKIxT7bAtPOhgoVl6gTXlmlIhue7liFT4oBPF/lha7Ha4dQBS82Av6hMMRZoVnFJI8M6mL+SwWoLD3A==} + tree-sitter-javascript@0.25.0: + resolution: {integrity: sha512-1fCbmzAskZkxcZzN41sFZ2br2iqTYP3tKls1b/HKGNPQUVOpsUxpmGxdN/wMqAk3jYZnYBR1dd/y/0avMeU7dw==} + peerDependencies: + tree-sitter: ^0.25.0 + peerDependenciesMeta: + tree-sitter: + optional: true + + tree-sitter-python@0.25.0: + resolution: {integrity: sha512-eCmJx6zQa35GxaCtQD+wXHOhYqBxEL+bp71W/s3fcDMu06MrtzkVXR437dRrCrbrDbyLuUDJpAgycs7ncngLXw==} peerDependencies: - tree-sitter: ^0.22.1 + tree-sitter: ^0.25.0 peerDependenciesMeta: tree-sitter: optional: true @@ -12532,8 +12550,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true @@ -12577,8 +12595,8 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.8.0: - resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + undici-types@7.10.0: + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} undici@7.12.0: resolution: {integrity: sha512-GrKEsc3ughskmGA9jevVlIOPMiiAHJ4OFUtaAH+NhfTUSiZ1wMPIQqQvAJUrJspFXJt3EBWgpAeoHEDVT1IBug==} @@ -12751,14 +12769,6 @@ packages: resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} engines: {node: '>= 0.4'} - use-disposable@1.0.4: - resolution: {integrity: sha512-j83t6AMLWUyb5zwlTDqf6dP9LezM9R0yTbI/b6olmdaGtCKQUe9pgJWV6dRaaQLcozypjIEp4EmZr2DkZGKLSg==} - peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.8.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' - use-sync-external-store@1.5.0: resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} peerDependencies: @@ -13369,10 +13379,6 @@ packages: yazl@2.5.1: resolution: {integrity: sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==} - ylru@1.4.0: - resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} - engines: {node: '>= 4.0.0'} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -13418,34 +13424,6 @@ snapshots: '@adobe/css-tools@4.4.3': {} - '@algolia/autocomplete-core@1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - search-insights - - '@algolia/autocomplete-plugin-algolia-insights@1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0) - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - '@algolia/autocomplete-preset-algolia@1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0)': - dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0) - '@algolia/client-search': 5.34.0 - algoliasearch: 5.34.0 - - '@algolia/autocomplete-shared@1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0)': - dependencies: - '@algolia/client-search': 5.34.0 - algoliasearch: 5.34.0 - '@algolia/cache-browser-local-storage@4.25.2': dependencies: '@algolia/cache-common': 4.25.2 @@ -13456,13 +13434,6 @@ snapshots: dependencies: '@algolia/cache-common': 4.25.2 - '@algolia/client-abtesting@5.34.0': - dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 - '@algolia/client-account@4.25.2': dependencies: '@algolia/client-common': 4.25.2 @@ -13476,80 +13447,29 @@ snapshots: '@algolia/requester-common': 4.25.2 '@algolia/transporter': 4.25.2 - '@algolia/client-analytics@5.34.0': - dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 - '@algolia/client-common@4.25.2': dependencies: '@algolia/requester-common': 4.25.2 '@algolia/transporter': 4.25.2 - '@algolia/client-common@5.34.0': {} - - '@algolia/client-insights@5.34.0': - dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 - '@algolia/client-personalization@4.25.2': dependencies: '@algolia/client-common': 4.25.2 '@algolia/requester-common': 4.25.2 '@algolia/transporter': 4.25.2 - '@algolia/client-personalization@5.34.0': - dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 - - '@algolia/client-query-suggestions@5.34.0': - dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 - '@algolia/client-search@4.25.2': dependencies: '@algolia/client-common': 4.25.2 '@algolia/requester-common': 4.25.2 '@algolia/transporter': 4.25.2 - '@algolia/client-search@5.34.0': - dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 - - '@algolia/ingestion@1.34.0': - dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 - '@algolia/logger-common@4.25.2': {} '@algolia/logger-console@4.25.2': dependencies: '@algolia/logger-common': 4.25.2 - '@algolia/monitoring@1.34.0': - dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 - '@algolia/recommend@4.25.2': dependencies: '@algolia/cache-browser-local-storage': 4.25.2 @@ -13564,35 +13484,16 @@ snapshots: '@algolia/requester-node-http': 4.25.2 '@algolia/transporter': 4.25.2 - '@algolia/recommend@5.34.0': - dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 - '@algolia/requester-browser-xhr@4.25.2': dependencies: '@algolia/requester-common': 4.25.2 - '@algolia/requester-browser-xhr@5.34.0': - dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-common@4.25.2': {} - '@algolia/requester-fetch@5.34.0': - dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-node-http@4.25.2': dependencies: '@algolia/requester-common': 4.25.2 - '@algolia/requester-node-http@5.34.0': - dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/transporter@4.25.2': dependencies: '@algolia/cache-common': 4.25.2 @@ -13610,6 +13511,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@alloy-js/babel-plugin-jsx-dom-expressions@0.39.0(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.25.9 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/types': 7.28.1 + html-entities: 2.6.0 + validate-html-nesting: 1.2.3 + transitivePeerDependencies: + - supports-color + '@alloy-js/babel-plugin@0.2.0(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -13618,6 +13530,14 @@ snapshots: '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) '@babel/types': 7.28.1 + '@alloy-js/babel-plugin@0.2.0(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/generator': 7.28.0 + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/types': 7.28.1 + '@alloy-js/babel-preset@0.2.1(@babel/core@7.28.0)': dependencies: '@alloy-js/babel-plugin': 0.2.0(@babel/core@7.28.0) @@ -13626,7 +13546,15 @@ snapshots: - '@babel/core' - supports-color - '@alloy-js/cli@0.19.0': + '@alloy-js/babel-preset@0.2.1(@babel/core@7.28.4)': + dependencies: + '@alloy-js/babel-plugin': 0.2.0(@babel/core@7.28.4) + '@alloy-js/babel-plugin-jsx-dom-expressions': 0.39.0(@babel/core@7.28.4) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@alloy-js/cli@0.20.0': dependencies: '@alloy-js/babel-preset': 0.2.1(@babel/core@7.28.0) '@babel/core': 7.28.0 @@ -13636,7 +13564,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@alloy-js/core@0.19.0': + '@alloy-js/core@0.21.0-dev.10': dependencies: '@vue/reactivity': 3.5.18 cli-table3: 0.6.5 @@ -13644,38 +13572,38 @@ snapshots: picocolors: 1.1.1 prettier: 3.6.2 - '@alloy-js/csharp@0.19.0': + '@alloy-js/csharp@0.20.0': dependencies: - '@alloy-js/core': 0.19.0 + '@alloy-js/core': 0.21.0-dev.10 change-case: 5.4.4 - marked: 15.0.12 + marked: 16.1.1 pathe: 2.0.3 - '@alloy-js/markdown@0.19.0': + '@alloy-js/markdown@0.20.0': dependencies: - '@alloy-js/core': 0.19.0 + '@alloy-js/core': 0.21.0-dev.10 yaml: 2.8.0 - '@alloy-js/python@0.0.1': + '@alloy-js/python@0.2.0-dev.4': dependencies: - '@alloy-js/core': 0.19.0 + '@alloy-js/core': 0.21.0-dev.10 change-case: 5.4.4 pathe: 2.0.3 - '@alloy-js/rollup-plugin@0.1.0(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@4.45.1)': + '@alloy-js/rollup-plugin@0.1.0(@babel/core@7.28.4)(@types/babel__core@7.20.5)(rollup@4.49.0)': dependencies: - '@alloy-js/babel-preset': 0.2.1(@babel/core@7.28.0) - '@babel/preset-typescript': 7.27.1(@babel/core@7.28.0) - '@rollup/plugin-babel': 6.0.4(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@4.45.1) + '@alloy-js/babel-preset': 0.2.1(@babel/core@7.28.4) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) + '@rollup/plugin-babel': 6.0.4(@babel/core@7.28.4)(@types/babel__core@7.20.5)(rollup@4.49.0) transitivePeerDependencies: - '@babel/core' - '@types/babel__core' - rollup - supports-color - '@alloy-js/typescript@0.19.0': + '@alloy-js/typescript@0.20.0': dependencies: - '@alloy-js/core': 0.19.0 + '@alloy-js/core': 0.21.0-dev.10 change-case: 5.4.4 pathe: 2.0.3 @@ -13722,12 +13650,12 @@ snapshots: '@csstools/css-tokenizer': 3.0.4 lru-cache: 10.4.3 - '@astrojs/check@0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.8.3)': + '@astrojs/check@0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.3)': dependencies: - '@astrojs/language-server': 2.15.4(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.8.3) + '@astrojs/language-server': 2.15.4(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.3) chokidar: 4.0.3 kleur: 4.1.5 - typescript: 5.8.3 + typescript: 5.9.3 yargs: 17.7.2 transitivePeerDependencies: - prettier @@ -13737,12 +13665,12 @@ snapshots: '@astrojs/internal-helpers@0.6.1': {} - '@astrojs/language-server@2.15.4(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.8.3)': + '@astrojs/language-server@2.15.4(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.3)': dependencies: '@astrojs/compiler': 2.12.2 '@astrojs/yaml2ts': 0.2.2 '@jridgewell/sourcemap-codec': 1.5.4 - '@volar/kit': 2.4.20(typescript@5.8.3) + '@volar/kit': 2.4.20(typescript@5.9.3) '@volar/language-core': 2.4.20 '@volar/language-server': 2.4.20 '@volar/language-service': 2.4.20 @@ -13789,12 +13717,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.3.1(astro@5.12.5(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0)(@types/node@24.1.0)(encoding@0.1.13)(rollup@4.45.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))': + '@astrojs/mdx@4.3.1(astro@5.12.5(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0)(@types/node@24.3.3)(encoding@0.1.13)(rollup@4.49.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.0))': dependencies: '@astrojs/markdown-remark': 6.3.3 '@mdx-js/mdx': 3.1.0(acorn@8.15.0) acorn: 8.15.0 - astro: 5.12.5(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0)(@types/node@24.1.0)(encoding@0.1.13)(rollup@4.45.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) + astro: 5.12.5(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0)(@types/node@24.3.3)(encoding@0.1.13)(rollup@4.49.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.0) es-module-lexer: 1.7.0 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.5 @@ -13812,15 +13740,15 @@ snapshots: dependencies: prismjs: 1.30.0 - '@astrojs/react@4.3.0(@types/node@24.1.0)(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.20.3)(yaml@2.8.0)': + '@astrojs/react@4.3.0(@types/node@24.3.3)(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.20.3)(yaml@2.8.0)': dependencies: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) - '@vitejs/plugin-react': 4.7.0(vite@6.3.5(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + '@vitejs/plugin-react': 4.7.0(vite@6.3.5(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) ultrahtml: 1.6.0 - vite: 6.3.5(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.3.5(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -13841,17 +13769,17 @@ snapshots: stream-replace-string: 2.0.0 zod: 3.25.76 - '@astrojs/starlight@0.35.2(astro@5.12.5(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0)(@types/node@24.1.0)(encoding@0.1.13)(rollup@4.45.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))': + '@astrojs/starlight@0.35.2(astro@5.12.5(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0)(@types/node@24.3.3)(encoding@0.1.13)(rollup@4.49.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.0))': dependencies: '@astrojs/markdown-remark': 6.3.3 - '@astrojs/mdx': 4.3.1(astro@5.12.5(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0)(@types/node@24.1.0)(encoding@0.1.13)(rollup@4.45.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)) + '@astrojs/mdx': 4.3.1(astro@5.12.5(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0)(@types/node@24.3.3)(encoding@0.1.13)(rollup@4.49.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.0)) '@astrojs/sitemap': 3.4.1 '@pagefind/default-ui': 1.3.0 '@types/hast': 3.0.4 '@types/js-yaml': 4.0.9 '@types/mdast': 4.0.4 - astro: 5.12.5(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0)(@types/node@24.1.0)(encoding@0.1.13)(rollup@4.45.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) - astro-expressive-code: 0.41.3(astro@5.12.5(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0)(@types/node@24.1.0)(encoding@0.1.13)(rollup@4.45.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)) + astro: 5.12.5(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0)(@types/node@24.3.3)(encoding@0.1.13)(rollup@4.49.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.0) + astro-expressive-code: 0.41.3(astro@5.12.5(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0)(@types/node@24.3.3)(encoding@0.1.13)(rollup@4.49.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.0)) bcp-47: 2.1.0 hast-util-from-html: 2.0.3 hast-util-select: 6.0.4 @@ -13970,7 +13898,7 @@ snapshots: fast-xml-parser: 5.2.5 tslib: 2.8.1 - '@azure/identity@4.10.2': + '@azure/identity@4.12.0': dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.0 @@ -14005,7 +13933,7 @@ snapshots: jsonwebtoken: 9.0.2 uuid: 8.3.2 - '@azure/storage-blob@12.27.0': + '@azure/storage-blob@12.28.0': dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.0 @@ -14018,6 +13946,21 @@ snapshots: '@azure/core-util': 1.13.0 '@azure/core-xml': 1.5.0 '@azure/logger': 1.3.0 + '@azure/storage-common': 12.0.0 + events: 3.3.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/storage-common@12.0.0': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.0 + '@azure/core-http-compat': 2.3.0 + '@azure/core-rest-pipeline': 1.22.0 + '@azure/core-tracing': 1.3.0 + '@azure/core-util': 1.13.0 + '@azure/logger': 1.3.0 events: 3.3.0 tslib: 2.8.1 transitivePeerDependencies: @@ -14055,6 +13998,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.1(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/generator@7.28.0': dependencies: '@babel/parser': 7.28.0 @@ -14063,6 +14026,14 @@ snapshots: '@jridgewell/trace-mapping': 0.3.29 jsesc: 3.1.0 + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.27.3': dependencies: '@babel/types': 7.28.1 @@ -14088,6 +14059,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-globals@7.28.0': {} '@babel/helper-member-expression-to-functions@7.27.1': @@ -14124,6 +14108,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + '@babel/helper-optimise-call-expression@7.27.1': dependencies: '@babel/types': 7.28.1 @@ -14139,6 +14141,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: '@babel/traverse': 7.28.0 @@ -14157,6 +14168,11 @@ snapshots: '@babel/template': 7.27.2 '@babel/types': 7.28.1 + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + '@babel/highlight@7.25.9': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -14168,6 +14184,10 @@ snapshots: dependencies: '@babel/types': 7.28.1 + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -14178,11 +14198,21 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -14205,6 +14235,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -14231,11 +14269,21 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -14247,6 +14295,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + transitivePeerDependencies: + - supports-color + '@babel/preset-flow@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -14265,6 +14324,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/preset-typescript@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) + transitivePeerDependencies: + - supports-color + '@babel/register@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -14294,11 +14364,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.1(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + '@babel/types@7.28.1': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@bcoe/v8-coverage@1.0.2': {} '@braintree/sanitize-url@7.1.1': {} @@ -14604,32 +14691,9 @@ snapshots: '@ctrl/tinycolor@4.1.0': {} - '@docsearch/css@3.9.0': {} - - '@docsearch/js@3.9.0(@algolia/client-search@5.34.0)(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)': - dependencies: - '@docsearch/react': 3.9.0(@algolia/client-search@5.34.0)(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) - preact: 10.26.9 - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/react' - - react - - react-dom - - search-insights + '@docsearch/css@4.1.0': {} - '@docsearch/react@3.9.0(@algolia/client-search@5.34.0)(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-core': 1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0) - '@docsearch/css': 3.9.0 - algoliasearch: 5.34.0 - optionalDependencies: - '@types/react': 18.3.23 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' + '@docsearch/js@4.1.0': {} '@emmetio/abbreviation@2.3.3': dependencies: @@ -14723,6 +14787,8 @@ snapshots: '@emotion/weak-memoize@0.4.0': {} + '@epic-web/invariant@1.0.0': {} + '@esbuild/aix-ppc64@0.25.8': optional: true @@ -14893,7 +14959,7 @@ snapshots: dependencies: '@floating-ui/utils': 0.2.10 - '@floating-ui/devtools@0.2.1(@floating-ui/dom@1.7.2)': + '@floating-ui/devtools@0.2.3(@floating-ui/dom@1.7.2)': dependencies: '@floating-ui/dom': 1.7.2 @@ -14908,22 +14974,22 @@ snapshots: dependencies: '@swc/helpers': 0.5.17 - '@fluentui/priority-overflow@9.1.15': + '@fluentui/priority-overflow@9.1.16': dependencies: '@swc/helpers': 0.5.17 - '@fluentui/react-accordion@9.8.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-accordion@9.8.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-aria': 9.15.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-context-selector': 9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-aria': 9.17.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-motion': 9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-motion-components-preview': 0.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-motion': 9.10.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-motion-components-preview': 0.10.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -14935,13 +15001,13 @@ snapshots: '@fluentui/react-alert@9.0.0-beta.124(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-avatar': 9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-button': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-avatar': 9.9.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-button': 9.6.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.1.3(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -14951,31 +15017,31 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-aria@9.15.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-aria@9.17.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-avatar@9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-avatar@9.9.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-badge': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-context-selector': 9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-badge': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-popover': 9.12.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-tooltip': 9.8.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-popover': 9.12.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-tooltip': 9.8.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -14985,13 +15051,13 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-badge@9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-badge@9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -14999,17 +15065,17 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-breadcrumb@9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-breadcrumb@9.3.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-aria': 9.15.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-button': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-aria': 9.17.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-button': 9.6.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-link': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-link': 9.6.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15017,16 +15083,16 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-button@9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-button@9.6.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.15.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-aria': 9.17.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15034,15 +15100,15 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-card@9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-card@9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-text': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-text': 9.6.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15050,18 +15116,18 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-carousel@9.8.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-carousel@9.8.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-aria': 9.15.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-button': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-context-selector': 9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-aria': 9.17.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-button': 9.6.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-tooltip': 9.8.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-tooltip': 9.8.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15074,16 +15140,16 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-checkbox@9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-checkbox@9.5.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-field': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-field': 9.4.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-label': 9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.1.3(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-label': 9.3.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-tabster': 9.26.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-utilities': 9.23.0(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15093,16 +15159,16 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-checkbox@9.5.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-checkbox@9.5.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-field': 9.4.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-field': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.3(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-label': 9.3.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.23.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-label': 9.3.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15112,15 +15178,15 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-color-picker@9.2.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-color-picker@9.2.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@ctrl/tinycolor': 3.6.1 - '@fluentui/react-context-selector': 9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-context-selector': 9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15130,20 +15196,20 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-combobox@9.16.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-combobox@9.16.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.15.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-context-selector': 9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-field': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-aria': 9.17.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-field': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-portal': 9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-positioning': 9.20.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-portal': 9.8.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-positioning': 9.20.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15153,68 +15219,68 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-components@9.67.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-components@9.70.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-accordion': 9.8.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-accordion': 9.8.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-alert': 9.0.0-beta.124(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-aria': 9.15.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-avatar': 9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-badge': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-breadcrumb': 9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-button': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-card': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-carousel': 9.8.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-checkbox': 9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-color-picker': 9.2.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-combobox': 9.16.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-dialog': 9.14.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-divider': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-drawer': 9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-field': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-image': 9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-aria': 9.17.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-avatar': 9.9.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-badge': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-breadcrumb': 9.3.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-button': 9.6.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-card': 9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-carousel': 9.8.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-checkbox': 9.5.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-color-picker': 9.2.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-combobox': 9.16.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-dialog': 9.15.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-divider': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-drawer': 9.10.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-field': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-image': 9.3.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-infobutton': 9.0.0-beta.102(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-infolabel': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-input': 9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-label': 9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-link': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-list': 9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-menu': 9.19.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-message-bar': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-motion': 9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-nav': 9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-overflow': 9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-persona': 9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-popover': 9.12.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-portal': 9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-positioning': 9.20.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-progress': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-provider': 9.22.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-radio': 9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-rating': 9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-search': 9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-select': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-skeleton': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-slider': 9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-spinbutton': 9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-spinner': 9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-swatch-picker': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-switch': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-table': 9.18.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-tabs': 9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-tag-picker': 9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-tags': 9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-teaching-popover': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-text': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-textarea': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-toast': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-toolbar': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-tooltip': 9.8.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-tree': 9.12.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-virtualizer': 9.0.0-alpha.100(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-infolabel': 9.4.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-input': 9.7.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-label': 9.3.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-link': 9.6.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-list': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-menu': 9.19.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-message-bar': 9.6.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-motion': 9.10.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-nav': 9.3.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-overflow': 9.5.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-persona': 9.5.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-popover': 9.12.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-portal': 9.8.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-positioning': 9.20.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-progress': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-provider': 9.22.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-radio': 9.5.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-rating': 9.3.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-search': 9.3.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-select': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-skeleton': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-slider': 9.5.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-spinbutton': 9.5.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-spinner': 9.7.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-swatch-picker': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-switch': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-table': 9.18.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-tabs': 9.10.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-tag-picker': 9.7.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-tags': 9.7.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-teaching-popover': 9.6.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-text': 9.6.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-textarea': 9.6.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-toast': 9.7.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-toolbar': 9.6.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-tooltip': 9.8.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-tree': 9.13.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-virtualizer': 9.0.0-alpha.102(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15224,9 +15290,9 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-context-selector@9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-context-selector@9.2.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-utilities': 9.23.0(@types/react@18.3.23)(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) @@ -15234,9 +15300,9 @@ snapshots: react-dom: 18.3.1(react@18.3.1) scheduler: 0.23.2 - '@fluentui/react-context-selector@9.2.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-context-selector@9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-utilities': 9.23.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) @@ -15244,20 +15310,20 @@ snapshots: react-dom: 18.3.1(react@18.3.1) scheduler: 0.23.2 - '@fluentui/react-dialog@9.14.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-dialog@9.15.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.15.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-context-selector': 9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-aria': 9.17.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-motion': 9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-motion-components-preview': 0.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-portal': 9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-motion': 9.10.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-motion-components-preview': 0.10.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-portal': 9.8.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15267,12 +15333,12 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-divider@9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-divider@9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15280,16 +15346,16 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-drawer@9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-drawer@9.10.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-dialog': 9.14.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-motion': 9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-portal': 9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-dialog': 9.15.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-motion': 9.10.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-portal': 9.8.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15299,15 +15365,15 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-field@9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-field@9.4.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-context-selector': 9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-context-selector': 9.2.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-label': 9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.1.3(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-label': 9.3.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-utilities': 9.23.0(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15317,15 +15383,15 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-field@9.4.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-field@9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-context-selector': 9.2.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-context-selector': 9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.3(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-label': 9.3.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.23.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-label': 9.3.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15341,12 +15407,12 @@ snapshots: react: 18.3.1 tslib: 2.8.1 - '@fluentui/react-image@9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-image@9.3.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15357,12 +15423,12 @@ snapshots: '@fluentui/react-infobutton@9.0.0-beta.102(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-label': 9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-popover': 9.12.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.1.3(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-label': 9.3.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-popover': 9.12.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15372,16 +15438,16 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-infolabel@9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-infolabel@9.4.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-label': 9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-popover': 9.12.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-label': 9.3.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-popover': 9.12.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15391,13 +15457,13 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-input@9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-input@9.7.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-field': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-field': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15407,28 +15473,28 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-jsx-runtime@9.1.2(@types/react@18.3.23)(react@18.3.1)': + '@fluentui/react-jsx-runtime@9.1.3(@types/react@18.3.23)(react@18.3.1)': dependencies: - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-utilities': 9.23.0(@types/react@18.3.23)(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 react: 18.3.1 react-is: 17.0.2 - '@fluentui/react-jsx-runtime@9.1.3(@types/react@18.3.23)(react@18.3.1)': + '@fluentui/react-jsx-runtime@9.2.0(@types/react@18.3.23)(react@18.3.1)': dependencies: - '@fluentui/react-utilities': 9.23.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 react: 18.3.1 react-is: 17.0.2 - '@fluentui/react-label@9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-label@9.3.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.1.3(@types/react@18.3.23)(react@18.3.1) '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-utilities': 9.23.0(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15436,12 +15502,12 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-label@9.3.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-label@9.3.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-jsx-runtime': 9.1.3(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.23.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15449,14 +15515,14 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-link@9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-link@9.6.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15464,16 +15530,16 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-list@9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-list@9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-checkbox': 9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-context-selector': 9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-checkbox': 9.5.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-context-selector': 9.2.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.1.3(@types/react@18.3.23)(react@18.3.1) '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-tabster': 9.26.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-utilities': 9.23.0(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15483,16 +15549,16 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-list@9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-list@9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-checkbox': 9.5.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-context-selector': 9.2.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-jsx-runtime': 9.1.3(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.23.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-checkbox': 9.5.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-context-selector': 9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15502,19 +15568,19 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-menu@9.19.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-menu@9.19.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.15.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-context-selector': 9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-aria': 9.17.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-portal': 9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-positioning': 9.20.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-portal': 9.8.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-positioning': 9.20.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15524,15 +15590,15 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-message-bar@9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-message-bar@9.6.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-button': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-button': 9.6.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-link': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-link': 9.6.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15541,40 +15607,40 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-motion-components-preview@0.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-motion-components-preview@0.10.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-motion': 9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-motion': 9.10.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-motion@9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-motion@9.10.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-nav@9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-nav@9.3.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-aria': 9.15.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-button': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-context-selector': 9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-divider': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-drawer': 9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-aria': 9.17.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-button': 9.6.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-divider': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-drawer': 9.10.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-motion': 9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-tooltip': 9.8.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-motion': 9.10.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-tooltip': 9.8.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15584,12 +15650,12 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-overflow@9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-overflow@9.5.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/priority-overflow': 9.1.15 - '@fluentui/react-context-selector': 9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/priority-overflow': 9.1.16 + '@fluentui/react-context-selector': 9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15599,14 +15665,14 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-persona@9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-persona@9.5.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-avatar': 9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-badge': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-avatar': 9.9.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-badge': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15616,18 +15682,18 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-popover@9.12.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-popover@9.12.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.15.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-context-selector': 9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-portal': 9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-positioning': 9.20.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-aria': 9.17.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-portal': 9.8.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-positioning': 9.20.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15637,26 +15703,25 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-portal@9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-portal@9.8.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - use-disposable: 1.0.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-positioning@9.20.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-positioning@9.20.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@floating-ui/devtools': 0.2.1(@floating-ui/dom@1.7.2) + '@floating-ui/devtools': 0.2.3(@floating-ui/dom@1.7.2) '@floating-ui/dom': 1.7.2 - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15665,13 +15730,13 @@ snapshots: react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.5.0(react@18.3.1) - '@fluentui/react-progress@9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-progress@9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-field': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-field': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15681,14 +15746,14 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-provider@9.22.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-provider@9.22.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/core': 1.19.2 '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 @@ -15697,15 +15762,15 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-radio@9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-radio@9.5.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-field': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-label': 9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-field': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-label': 9.3.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15715,14 +15780,14 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-rating@9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-rating@9.3.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15730,14 +15795,14 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-search@9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-search@9.3.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-input': 9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-input': 9.7.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15747,14 +15812,14 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-select@9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-select@9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-field': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-field': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15771,13 +15836,20 @@ snapshots: '@types/react': 18.3.23 react: 18.3.1 - '@fluentui/react-skeleton@9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-shared-contexts@9.25.1(@types/react@18.3.23)(react@18.3.1)': dependencies: - '@fluentui/react-field': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@swc/helpers': 0.5.17 + '@types/react': 18.3.23 + react: 18.3.1 + + '@fluentui/react-skeleton@9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + dependencies: + '@fluentui/react-field': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15787,14 +15859,14 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-slider@9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-slider@9.5.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-field': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-field': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15804,15 +15876,15 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-spinbutton@9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-spinbutton@9.5.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-field': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-field': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15822,13 +15894,13 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-spinner@9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-spinner@9.7.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-label': 9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-label': 9.3.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15836,16 +15908,16 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-swatch-picker@9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-swatch-picker@9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-context-selector': 9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-field': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-context-selector': 9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-field': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15855,16 +15927,16 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-switch@9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-switch@9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-field': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-field': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-label': 9.3.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-label': 9.3.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15874,20 +15946,20 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-table@9.18.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-table@9.18.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.15.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-avatar': 9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-checkbox': 9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-context-selector': 9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-aria': 9.17.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-avatar': 9.9.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-checkbox': 9.5.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-context-selector': 9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-radio': 9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-radio': 9.5.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15897,14 +15969,14 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-tabs@9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-tabs@9.10.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-context-selector': 9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-context-selector': 9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15914,11 +15986,11 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-tabster@9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-tabster@9.26.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-utilities': 9.23.0(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15928,11 +16000,11 @@ snapshots: react-dom: 18.3.1(react@18.3.1) tabster: 8.5.6 - '@fluentui/react-tabster@9.26.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-tabster@9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.23.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15942,22 +16014,22 @@ snapshots: react-dom: 18.3.1(react@18.3.1) tabster: 8.5.6 - '@fluentui/react-tag-picker@9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-tag-picker@9.7.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.15.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-combobox': 9.16.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-context-selector': 9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-field': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-aria': 9.17.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-combobox': 9.16.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-context-selector': 9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-field': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-portal': 9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-positioning': 9.20.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-tags': 9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-portal': 9.8.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-positioning': 9.20.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-tags': 9.7.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15967,17 +16039,17 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-tags@9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-tags@9.7.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.15.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-avatar': 9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-aria': 9.17.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-avatar': 9.9.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -15987,18 +16059,18 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-teaching-popover@9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-teaching-popover@9.6.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-aria': 9.15.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-button': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-context-selector': 9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-aria': 9.17.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-button': 9.6.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-popover': 9.12.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-popover': 9.12.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -16009,12 +16081,12 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-text@9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-text@9.6.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -16022,13 +16094,13 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-textarea@9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-textarea@9.6.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-field': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-field': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -16043,19 +16115,24 @@ snapshots: '@fluentui/tokens': 1.0.0-alpha.21 '@swc/helpers': 0.5.17 - '@fluentui/react-toast@9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-theme@9.2.0': + dependencies: + '@fluentui/tokens': 1.0.0-alpha.22 + '@swc/helpers': 0.5.17 + + '@fluentui/react-toast@9.7.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.15.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-aria': 9.17.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-motion': 9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-motion-components-preview': 0.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-portal': 9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-motion': 9.10.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-motion-components-preview': 0.10.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-portal': 9.8.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -16063,17 +16140,17 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-toolbar@9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': - dependencies: - '@fluentui/react-button': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-context-selector': 9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-divider': 9.4.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-radio': 9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-toolbar@9.6.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + dependencies: + '@fluentui/react-button': 9.6.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-divider': 9.4.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-radio': 9.5.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -16083,16 +16160,16 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-tooltip@9.8.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-tooltip@9.8.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-portal': 9.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-positioning': 9.20.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-portal': 9.8.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-positioning': 9.20.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -16100,23 +16177,23 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-tree@9.12.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + '@fluentui/react-tree@9.13.1(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.15.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-avatar': 9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-button': 9.6.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-checkbox': 9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-context-selector': 9.2.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-aria': 9.17.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-avatar': 9.9.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-button': 9.6.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-checkbox': 9.5.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-context-selector': 9.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.307(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-motion': 9.9.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-motion-components-preview': 0.7.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-radio': 9.5.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-tabster': 9.26.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-motion': 9.10.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-motion-components-preview': 0.10.0(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-radio': 9.5.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-tabster': 9.26.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -16126,7 +16203,7 @@ snapshots: transitivePeerDependencies: - scheduler - '@fluentui/react-utilities@9.22.0(@types/react@18.3.23)(react@18.3.1)': + '@fluentui/react-utilities@9.23.0(@types/react@18.3.23)(react@18.3.1)': dependencies: '@fluentui/keyboard-keys': 9.0.8 '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) @@ -16134,19 +16211,19 @@ snapshots: '@types/react': 18.3.23 react: 18.3.1 - '@fluentui/react-utilities@9.23.0(@types/react@18.3.23)(react@18.3.1)': + '@fluentui/react-utilities@9.24.1(@types/react@18.3.23)(react@18.3.1)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 react: 18.3.1 - '@fluentui/react-virtualizer@9.0.0-alpha.100(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-virtualizer@9.0.0-alpha.102(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-jsx-runtime': 9.1.2(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.24.0(@types/react@18.3.23)(react@18.3.1) - '@fluentui/react-utilities': 9.22.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.2.0(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.25.1(@types/react@18.3.23)(react@18.3.1) + '@fluentui/react-utilities': 9.24.1(@types/react@18.3.23)(react@18.3.1) '@griffel/react': 1.5.30(react@18.3.1) '@swc/helpers': 0.5.17 '@types/react': 18.3.23 @@ -16158,6 +16235,10 @@ snapshots: dependencies: '@swc/helpers': 0.5.17 + '@fluentui/tokens@1.0.0-alpha.22': + dependencies: + '@swc/helpers': 0.5.17 + '@fortawesome/fontawesome-free@6.7.2': {} '@gerrit0/mini-shiki@3.8.1': @@ -16378,27 +16459,27 @@ snapshots: '@img/sharp-win32-x64@0.34.3': optional: true - '@inquirer/checkbox@4.2.0(@types/node@24.1.0)': + '@inquirer/checkbox@4.2.0(@types/node@24.3.3)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.1.0) + '@inquirer/core': 10.1.15(@types/node@24.3.3) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.1.0) + '@inquirer/type': 3.0.8(@types/node@24.3.3) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 - '@inquirer/confirm@5.1.14(@types/node@24.1.0)': + '@inquirer/confirm@5.1.14(@types/node@24.3.3)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.1.0) - '@inquirer/type': 3.0.8(@types/node@24.1.0) + '@inquirer/core': 10.1.15(@types/node@24.3.3) + '@inquirer/type': 3.0.8(@types/node@24.3.3) optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 - '@inquirer/core@10.1.15(@types/node@24.1.0)': + '@inquirer/core@10.1.15(@types/node@24.3.3)': dependencies: '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.1.0) + '@inquirer/type': 3.0.8(@types/node@24.3.3) ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -16406,93 +16487,93 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 - '@inquirer/editor@4.2.15(@types/node@24.1.0)': + '@inquirer/editor@4.2.15(@types/node@24.3.3)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.1.0) - '@inquirer/type': 3.0.8(@types/node@24.1.0) + '@inquirer/core': 10.1.15(@types/node@24.3.3) + '@inquirer/type': 3.0.8(@types/node@24.3.3) external-editor: 3.1.0 optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 - '@inquirer/expand@4.0.17(@types/node@24.1.0)': + '@inquirer/expand@4.0.17(@types/node@24.3.3)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.1.0) - '@inquirer/type': 3.0.8(@types/node@24.1.0) + '@inquirer/core': 10.1.15(@types/node@24.3.3) + '@inquirer/type': 3.0.8(@types/node@24.3.3) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 '@inquirer/figures@1.0.13': {} - '@inquirer/input@4.2.1(@types/node@24.1.0)': + '@inquirer/input@4.2.1(@types/node@24.3.3)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.1.0) - '@inquirer/type': 3.0.8(@types/node@24.1.0) + '@inquirer/core': 10.1.15(@types/node@24.3.3) + '@inquirer/type': 3.0.8(@types/node@24.3.3) optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 - '@inquirer/number@3.0.17(@types/node@24.1.0)': + '@inquirer/number@3.0.17(@types/node@24.3.3)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.1.0) - '@inquirer/type': 3.0.8(@types/node@24.1.0) + '@inquirer/core': 10.1.15(@types/node@24.3.3) + '@inquirer/type': 3.0.8(@types/node@24.3.3) optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 - '@inquirer/password@4.0.17(@types/node@24.1.0)': + '@inquirer/password@4.0.17(@types/node@24.3.3)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.1.0) - '@inquirer/type': 3.0.8(@types/node@24.1.0) + '@inquirer/core': 10.1.15(@types/node@24.3.3) + '@inquirer/type': 3.0.8(@types/node@24.3.3) ansi-escapes: 4.3.2 optionalDependencies: - '@types/node': 24.1.0 - - '@inquirer/prompts@7.8.0(@types/node@24.1.0)': - dependencies: - '@inquirer/checkbox': 4.2.0(@types/node@24.1.0) - '@inquirer/confirm': 5.1.14(@types/node@24.1.0) - '@inquirer/editor': 4.2.15(@types/node@24.1.0) - '@inquirer/expand': 4.0.17(@types/node@24.1.0) - '@inquirer/input': 4.2.1(@types/node@24.1.0) - '@inquirer/number': 3.0.17(@types/node@24.1.0) - '@inquirer/password': 4.0.17(@types/node@24.1.0) - '@inquirer/rawlist': 4.1.5(@types/node@24.1.0) - '@inquirer/search': 3.1.0(@types/node@24.1.0) - '@inquirer/select': 4.3.1(@types/node@24.1.0) + '@types/node': 24.3.3 + + '@inquirer/prompts@7.8.0(@types/node@24.3.3)': + dependencies: + '@inquirer/checkbox': 4.2.0(@types/node@24.3.3) + '@inquirer/confirm': 5.1.14(@types/node@24.3.3) + '@inquirer/editor': 4.2.15(@types/node@24.3.3) + '@inquirer/expand': 4.0.17(@types/node@24.3.3) + '@inquirer/input': 4.2.1(@types/node@24.3.3) + '@inquirer/number': 3.0.17(@types/node@24.3.3) + '@inquirer/password': 4.0.17(@types/node@24.3.3) + '@inquirer/rawlist': 4.1.5(@types/node@24.3.3) + '@inquirer/search': 3.1.0(@types/node@24.3.3) + '@inquirer/select': 4.3.1(@types/node@24.3.3) optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 - '@inquirer/rawlist@4.1.5(@types/node@24.1.0)': + '@inquirer/rawlist@4.1.5(@types/node@24.3.3)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.1.0) - '@inquirer/type': 3.0.8(@types/node@24.1.0) + '@inquirer/core': 10.1.15(@types/node@24.3.3) + '@inquirer/type': 3.0.8(@types/node@24.3.3) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 - '@inquirer/search@3.1.0(@types/node@24.1.0)': + '@inquirer/search@3.1.0(@types/node@24.3.3)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.1.0) + '@inquirer/core': 10.1.15(@types/node@24.3.3) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.1.0) + '@inquirer/type': 3.0.8(@types/node@24.3.3) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 - '@inquirer/select@4.3.1(@types/node@24.1.0)': + '@inquirer/select@4.3.1(@types/node@24.3.3)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.1.0) + '@inquirer/core': 10.1.15(@types/node@24.3.3) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.1.0) + '@inquirer/type': 3.0.8(@types/node@24.3.3) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 - '@inquirer/type@3.0.8(@types/node@24.1.0)': + '@inquirer/type@3.0.8(@types/node@24.3.3)': optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 '@isaacs/balanced-match@4.0.1': {} @@ -16515,20 +16596,25 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.9.3)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0))': dependencies: glob: 10.4.5 magic-string: 0.30.17 - react-docgen-typescript: 2.4.0(typescript@5.8.3) - vite: 7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) + react-docgen-typescript: 2.4.0(typescript@5.9.3) + vite: 7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 '@jridgewell/gen-mapping@0.3.12': dependencies: '@jridgewell/sourcemap-codec': 1.5.4 '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.4': {} @@ -16544,12 +16630,12 @@ snapshots: dependencies: vary: 1.1.2 - '@koa/router@13.1.1': + '@koa/router@14.0.0': dependencies: debug: 4.4.1(supports-color@8.1.1) http-errors: 2.0.0 koa-compose: 4.1.0 - path-to-regexp: 6.3.0 + path-to-regexp: 8.2.0 transitivePeerDependencies: - supports-color @@ -16607,23 +16693,23 @@ snapshots: transitivePeerDependencies: - tslib - '@microsoft/api-extractor-model@7.30.7(@types/node@24.1.0)': + '@microsoft/api-extractor-model@7.30.7(@types/node@24.3.3)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.14.0(@types/node@24.1.0) + '@rushstack/node-core-library': 5.14.0(@types/node@24.3.3) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.52.9(@types/node@24.1.0)': + '@microsoft/api-extractor@7.52.9(@types/node@24.3.3)': dependencies: - '@microsoft/api-extractor-model': 7.30.7(@types/node@24.1.0) + '@microsoft/api-extractor-model': 7.30.7(@types/node@24.3.3) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.14.0(@types/node@24.1.0) + '@rushstack/node-core-library': 5.14.0(@types/node@24.3.3) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.15.4(@types/node@24.1.0) - '@rushstack/ts-command-line': 5.0.2(@types/node@24.1.0) + '@rushstack/terminal': 0.15.4(@types/node@24.3.3) + '@rushstack/ts-command-line': 5.0.2(@types/node@24.3.3) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.10 @@ -16995,9 +17081,9 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/browser-chromium@1.54.1': + '@playwright/browser-chromium@1.55.1': dependencies: - playwright-core: 1.54.1 + playwright-core: 1.55.1 '@playwright/test@1.54.1': dependencies: @@ -17018,11 +17104,11 @@ snapshots: '@pnpm/types': 1000.7.0 load-json-file: 6.2.0 - '@pnpm/cli-utils@1001.0.2(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0))(@types/node@24.1.0)(typanion@3.14.0)': + '@pnpm/cli-utils@1001.0.2(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3))(@types/node@24.3.3)(typanion@3.14.0)': dependencies: '@pnpm/cli-meta': 1000.0.9 '@pnpm/config': 1004.2.0(@pnpm/logger@1001.0.0) - '@pnpm/config.deps-installer': 1000.0.9(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0)) + '@pnpm/config.deps-installer': 1000.0.9(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3)) '@pnpm/default-reporter': 1002.0.4(@pnpm/logger@1001.0.0) '@pnpm/error': 1000.0.3 '@pnpm/logger': 1001.0.0 @@ -17030,7 +17116,7 @@ snapshots: '@pnpm/package-is-installable': 1000.0.11(@pnpm/logger@1001.0.0) '@pnpm/pnpmfile': 1002.0.1(@pnpm/logger@1001.0.0) '@pnpm/read-project-manifest': 1001.0.0(@pnpm/logger@1001.0.0) - '@pnpm/store-connection-manager': 1002.0.7(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0))(@types/node@24.1.0)(typanion@3.14.0) + '@pnpm/store-connection-manager': 1002.0.7(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3))(@types/node@24.3.3)(typanion@3.14.0) '@pnpm/types': 1000.7.0 '@pnpm/util.lex-comparator': 3.0.2 chalk: 4.1.2 @@ -17042,17 +17128,17 @@ snapshots: - supports-color - typanion - '@pnpm/client@1000.1.0(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0))(@types/node@24.1.0)(typanion@3.14.0)': + '@pnpm/client@1000.1.0(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3))(@types/node@24.3.3)(typanion@3.14.0)': dependencies: '@pnpm/default-resolver': 1002.1.2(@pnpm/logger@1001.0.0) '@pnpm/directory-fetcher': 1000.1.9(@pnpm/logger@1001.0.0) '@pnpm/fetch': 1000.2.3(@pnpm/logger@1001.0.0) '@pnpm/fetching-types': 1000.2.0 - '@pnpm/git-fetcher': 1001.0.11(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0))(typanion@3.14.0) + '@pnpm/git-fetcher': 1001.0.11(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3))(typanion@3.14.0) '@pnpm/network.auth-header': 1000.0.4 - '@pnpm/node.fetcher': 1000.1.0(@pnpm/logger@1001.0.0)(@types/node@24.1.0)(typanion@3.14.0) + '@pnpm/node.fetcher': 1000.1.0(@pnpm/logger@1001.0.0)(@types/node@24.3.3)(typanion@3.14.0) '@pnpm/resolver-base': 1004.1.0 - '@pnpm/tarball-fetcher': 1001.0.11(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0))(typanion@3.14.0) + '@pnpm/tarball-fetcher': 1001.0.11(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3))(typanion@3.14.0) '@pnpm/types': 1000.7.0 ramda: '@pnpm/ramda@0.28.1' transitivePeerDependencies: @@ -17072,7 +17158,7 @@ snapshots: transitivePeerDependencies: - '@pnpm/logger' - '@pnpm/config.deps-installer@1000.0.9(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0))': + '@pnpm/config.deps-installer@1000.0.9(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3))': dependencies: '@pnpm/config.config-writer': 1000.0.8(@pnpm/logger@1001.0.0) '@pnpm/core-loggers': 1001.0.2(@pnpm/logger@1001.0.0) @@ -17081,7 +17167,7 @@ snapshots: '@pnpm/logger': 1001.0.0 '@pnpm/network.auth-header': 1000.0.4 '@pnpm/npm-resolver': 1004.1.2(@pnpm/logger@1001.0.0) - '@pnpm/package-store': 1002.0.8(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0)) + '@pnpm/package-store': 1002.0.8(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3)) '@pnpm/parse-wanted-dependency': 1001.0.0 '@pnpm/pick-registry-for-package': 1000.0.9 '@pnpm/read-modules-dir': 1000.0.0 @@ -17307,13 +17393,13 @@ snapshots: dependencies: npm-packlist: 5.1.3 - '@pnpm/git-fetcher@1001.0.11(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0))(typanion@3.14.0)': + '@pnpm/git-fetcher@1001.0.11(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3))(typanion@3.14.0)': dependencies: '@pnpm/fetcher-base': 1000.1.0 '@pnpm/fs.packlist': 2.0.0 '@pnpm/logger': 1001.0.0 '@pnpm/prepare-package': 1000.0.19(@pnpm/logger@1001.0.0)(typanion@3.14.0) - '@pnpm/worker': 1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0) + '@pnpm/worker': 1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3) '@zkochan/rimraf': 3.0.2 execa: safe-execa@0.1.2 transitivePeerDependencies: @@ -17461,7 +17547,7 @@ snapshots: transitivePeerDependencies: - domexception - '@pnpm/node.fetcher@1000.1.0(@pnpm/logger@1001.0.0)(@types/node@24.1.0)(typanion@3.14.0)': + '@pnpm/node.fetcher@1000.1.0(@pnpm/logger@1001.0.0)(@types/node@24.3.3)(typanion@3.14.0)': dependencies: '@pnpm/constants': 1001.2.0 '@pnpm/create-cafs-store': 1000.0.16(@pnpm/logger@1001.0.0) @@ -17470,8 +17556,8 @@ snapshots: '@pnpm/fetcher-base': 1000.1.0 '@pnpm/fetching-types': 1000.2.0 '@pnpm/node.resolver': 1000.1.0(@pnpm/logger@1001.0.0) - '@pnpm/tarball-fetcher': 1001.0.11(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0))(typanion@3.14.0) - '@pnpm/worker': 1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0) + '@pnpm/tarball-fetcher': 1001.0.11(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3))(typanion@3.14.0) + '@pnpm/worker': 1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3) adm-zip: 0.5.16 detect-libc: 2.0.4 rename-overwrite: 6.0.3 @@ -17579,7 +17665,7 @@ snapshots: mem: 8.1.1 semver: 7.7.2 - '@pnpm/package-requester@1005.0.0(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0))': + '@pnpm/package-requester@1005.0.0(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3))': dependencies: '@pnpm/core-loggers': 1001.0.2(@pnpm/logger@1001.0.0) '@pnpm/dependency-path': 1001.0.2 @@ -17594,7 +17680,7 @@ snapshots: '@pnpm/store-controller-types': 1004.0.0 '@pnpm/store.cafs': 1000.0.15 '@pnpm/types': 1000.7.0 - '@pnpm/worker': 1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0) + '@pnpm/worker': 1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3) p-defer: 3.0.0 p-limit: 3.1.0 p-queue: 6.6.2 @@ -17603,17 +17689,17 @@ snapshots: semver: 7.7.2 ssri: 10.0.5 - '@pnpm/package-store@1002.0.8(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0))': + '@pnpm/package-store@1002.0.8(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3))': dependencies: '@pnpm/create-cafs-store': 1000.0.16(@pnpm/logger@1001.0.0) '@pnpm/fetcher-base': 1000.1.0 '@pnpm/logger': 1001.0.0 - '@pnpm/package-requester': 1005.0.0(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0)) + '@pnpm/package-requester': 1005.0.0(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3)) '@pnpm/resolver-base': 1004.1.0 '@pnpm/store-controller-types': 1004.0.0 '@pnpm/store.cafs': 1000.0.15 '@pnpm/types': 1000.7.0 - '@pnpm/worker': 1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0) + '@pnpm/worker': 1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3) '@zkochan/rimraf': 3.0.2 load-json-file: 6.2.0 ramda: '@pnpm/ramda@0.28.1' @@ -17721,14 +17807,14 @@ snapshots: - domexception - supports-color - '@pnpm/store-connection-manager@1002.0.7(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0))(@types/node@24.1.0)(typanion@3.14.0)': + '@pnpm/store-connection-manager@1002.0.7(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3))(@types/node@24.3.3)(typanion@3.14.0)': dependencies: '@pnpm/cli-meta': 1000.0.9 - '@pnpm/client': 1000.1.0(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0))(@types/node@24.1.0)(typanion@3.14.0) + '@pnpm/client': 1000.1.0(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3))(@types/node@24.3.3)(typanion@3.14.0) '@pnpm/config': 1004.2.0(@pnpm/logger@1001.0.0) '@pnpm/error': 1000.0.3 '@pnpm/logger': 1001.0.0 - '@pnpm/package-store': 1002.0.8(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0)) + '@pnpm/package-store': 1002.0.8(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3)) '@pnpm/server': 1001.0.7(@pnpm/logger@1001.0.0) '@pnpm/store-path': 1000.0.3 '@zkochan/diable': 1.0.2 @@ -17777,7 +17863,7 @@ snapshots: '@pnpm/types': 1000.7.0 symlink-dir: 6.0.5 - '@pnpm/tarball-fetcher@1001.0.11(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0))(typanion@3.14.0)': + '@pnpm/tarball-fetcher@1001.0.11(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3))(typanion@3.14.0)': dependencies: '@pnpm/core-loggers': 1001.0.2(@pnpm/logger@1001.0.0) '@pnpm/error': 1000.0.3 @@ -17787,7 +17873,7 @@ snapshots: '@pnpm/graceful-fs': 1000.0.0 '@pnpm/logger': 1001.0.0 '@pnpm/prepare-package': 1000.0.19(@pnpm/logger@1001.0.0)(typanion@3.14.0) - '@pnpm/worker': 1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0) + '@pnpm/worker': 1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3) '@zkochan/retry': 0.2.0 lodash.throttle: 4.1.1 p-map-values: 1.0.0 @@ -17818,7 +17904,7 @@ snapshots: dependencies: isexe: 2.0.0 - '@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0)': + '@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3)': dependencies: '@pnpm/cafs-types': 1000.0.0 '@pnpm/create-cafs-store': 1000.0.16(@pnpm/logger@1001.0.0) @@ -17830,7 +17916,7 @@ snapshots: '@pnpm/logger': 1001.0.0 '@pnpm/store.cafs': 1000.0.15 '@pnpm/symlink-dependency': 1000.0.10(@pnpm/logger@1001.0.0) - '@rushstack/worker-pool': 0.4.9(@types/node@24.1.0) + '@rushstack/worker-pool': 0.4.9(@types/node@24.3.3) is-windows: 1.0.2 load-json-file: 6.2.0 p-limit: 3.1.0 @@ -17838,9 +17924,9 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@pnpm/workspace.find-packages@1000.0.30(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0))(@types/node@24.1.0)(typanion@3.14.0)': + '@pnpm/workspace.find-packages@1000.0.30(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3))(@types/node@24.3.3)(typanion@3.14.0)': dependencies: - '@pnpm/cli-utils': 1001.0.2(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.1.0))(@types/node@24.1.0)(typanion@3.14.0) + '@pnpm/cli-utils': 1001.0.2(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.10(@pnpm/logger@1001.0.0)(@types/node@24.3.3))(@types/node@24.3.3)(typanion@3.14.0) '@pnpm/constants': 1001.2.0 '@pnpm/fs.find-packages': 1000.0.12(@pnpm/logger@1001.0.0) '@pnpm/logger': 1001.0.0 @@ -17921,99 +18007,101 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.27': {} - '@rollup/plugin-babel@6.0.4(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@4.45.1)': + '@rolldown/pluginutils@1.0.0-beta.38': {} + + '@rollup/plugin-babel@6.0.4(@babel/core@7.28.4)(@types/babel__core@7.20.5)(rollup@4.49.0)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-module-imports': 7.27.1 - '@rollup/pluginutils': 5.2.0(rollup@4.45.1) + '@rollup/pluginutils': 5.2.0(rollup@4.49.0) optionalDependencies: '@types/babel__core': 7.20.5 - rollup: 4.45.1 + rollup: 4.49.0 transitivePeerDependencies: - supports-color - '@rollup/plugin-inject@5.0.5(rollup@4.45.1)': + '@rollup/plugin-inject@5.0.5(rollup@4.49.0)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.45.1) + '@rollup/pluginutils': 5.2.0(rollup@4.49.0) estree-walker: 2.0.2 magic-string: 0.30.17 optionalDependencies: - rollup: 4.45.1 + rollup: 4.49.0 - '@rollup/pluginutils@5.2.0(rollup@4.45.1)': + '@rollup/pluginutils@5.2.0(rollup@4.49.0)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.45.1 + rollup: 4.49.0 - '@rollup/rollup-android-arm-eabi@4.45.1': + '@rollup/rollup-android-arm-eabi@4.49.0': optional: true - '@rollup/rollup-android-arm64@4.45.1': + '@rollup/rollup-android-arm64@4.49.0': optional: true - '@rollup/rollup-darwin-arm64@4.45.1': + '@rollup/rollup-darwin-arm64@4.49.0': optional: true - '@rollup/rollup-darwin-x64@4.45.1': + '@rollup/rollup-darwin-x64@4.49.0': optional: true - '@rollup/rollup-freebsd-arm64@4.45.1': + '@rollup/rollup-freebsd-arm64@4.49.0': optional: true - '@rollup/rollup-freebsd-x64@4.45.1': + '@rollup/rollup-freebsd-x64@4.49.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + '@rollup/rollup-linux-arm-gnueabihf@4.49.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.45.1': + '@rollup/rollup-linux-arm-musleabihf@4.49.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.45.1': + '@rollup/rollup-linux-arm64-gnu@4.49.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.45.1': + '@rollup/rollup-linux-arm64-musl@4.49.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + '@rollup/rollup-linux-loongarch64-gnu@4.49.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + '@rollup/rollup-linux-ppc64-gnu@4.49.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.45.1': + '@rollup/rollup-linux-riscv64-gnu@4.49.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.45.1': + '@rollup/rollup-linux-riscv64-musl@4.49.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.45.1': + '@rollup/rollup-linux-s390x-gnu@4.49.0': optional: true '@rollup/rollup-linux-x64-gnu@4.40.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.45.1': + '@rollup/rollup-linux-x64-gnu@4.49.0': optional: true - '@rollup/rollup-linux-x64-musl@4.45.1': + '@rollup/rollup-linux-x64-musl@4.49.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.45.1': + '@rollup/rollup-win32-arm64-msvc@4.49.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.45.1': + '@rollup/rollup-win32-ia32-msvc@4.49.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.45.1': + '@rollup/rollup-win32-x64-msvc@4.49.0': optional: true '@rtsao/scc@1.1.0': {} - '@rushstack/node-core-library@5.14.0(@types/node@24.1.0)': + '@rushstack/node-core-library@5.14.0(@types/node@24.3.3)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -18024,32 +18112,32 @@ snapshots: resolve: 1.22.10 semver: 7.5.4 optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.10 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.15.4(@types/node@24.1.0)': + '@rushstack/terminal@0.15.4(@types/node@24.3.3)': dependencies: - '@rushstack/node-core-library': 5.14.0(@types/node@24.1.0) + '@rushstack/node-core-library': 5.14.0(@types/node@24.3.3) supports-color: 8.1.1 optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 - '@rushstack/ts-command-line@5.0.2(@types/node@24.1.0)': + '@rushstack/ts-command-line@5.0.2(@types/node@24.3.3)': dependencies: - '@rushstack/terminal': 0.15.4(@types/node@24.1.0) + '@rushstack/terminal': 0.15.4(@types/node@24.3.3) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 transitivePeerDependencies: - '@types/node' - '@rushstack/worker-pool@0.4.9(@types/node@24.1.0)': + '@rushstack/worker-pool@0.4.9(@types/node@24.3.3)': optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 '@scarf/scarf@1.4.0': {} @@ -18202,12 +18290,12 @@ snapshots: '@standard-schema/spec@1.0.0': {} - '@storybook/builder-vite@9.0.18(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2))(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0))': + '@storybook/builder-vite@9.0.18(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2))(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@storybook/csf-plugin': 9.0.18(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2)) storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2) ts-dedent: 2.2.0 - vite: 7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) '@storybook/cli@9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2)': dependencies: @@ -18257,12 +18345,12 @@ snapshots: react-dom: 18.3.1(react@18.3.1) storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2) - '@storybook/react-vite@9.0.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.45.1)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2))(typescript@5.8.3)(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0))': + '@storybook/react-vite@9.0.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.49.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2))(typescript@5.9.3)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3)(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) - '@rollup/pluginutils': 5.2.0(rollup@4.45.1) - '@storybook/builder-vite': 9.0.18(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2))(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) - '@storybook/react': 9.0.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2))(typescript@5.8.3) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.9.3)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) + '@rollup/pluginutils': 5.2.0(rollup@4.49.0) + '@storybook/builder-vite': 9.0.18(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2))(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) + '@storybook/react': 9.0.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2))(typescript@5.9.3) find-up: 7.0.0 magic-string: 0.30.17 react: 18.3.1 @@ -18271,13 +18359,13 @@ snapshots: resolve: 1.22.10 storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2) tsconfig-paths: 4.2.0 - vite: 7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - rollup - supports-color - typescript - '@storybook/react@9.0.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2))(typescript@5.8.3)': + '@storybook/react@9.0.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2))(typescript@5.9.3)': dependencies: '@storybook/global': 5.0.0 '@storybook/react-dom-shim': 9.0.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2)) @@ -18285,7 +18373,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.6.2) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 '@swc/helpers@0.5.17': dependencies: @@ -18398,7 +18486,7 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.1.0 + '@types/node': 24.3.3 '@types/braces@3.0.5': {} @@ -18406,7 +18494,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 24.1.0 + '@types/node': 24.3.3 '@types/responselike': 1.0.3 '@types/chai@5.2.2': @@ -18415,11 +18503,11 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 '@types/cross-spawn@6.0.6': dependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 '@types/d3-array@3.2.1': {} @@ -18560,7 +18648,7 @@ snapshots: '@types/express-serve-static-core@5.0.7': dependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 @@ -18573,7 +18661,7 @@ snapshots: '@types/fontkit@2.0.8': dependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 '@types/geojson@7946.0.16': {} @@ -18595,7 +18683,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 '@types/mdast@4.0.4': dependencies: @@ -18613,7 +18701,7 @@ snapshots: '@types/morgan@1.9.10': dependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 '@types/ms@2.1.0': {} @@ -18637,9 +18725,9 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@24.1.0': + '@types/node@24.3.3': dependencies: - undici-types: 7.8.0 + undici-types: 7.10.0 '@types/normalize-package-data@2.4.4': {} @@ -18647,7 +18735,7 @@ snapshots: '@types/plist@3.0.5': dependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 xmlbuilder: 15.1.1 '@types/prismjs@1.26.5': {} @@ -18675,30 +18763,30 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 '@types/sarif@2.1.7': {} '@types/sax@1.2.7': dependencies: - '@types/node': 17.0.45 + '@types/node': 24.3.3 '@types/semver@7.7.0': {} '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.1.0 + '@types/node': 24.3.3 '@types/serve-static@1.15.8': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 24.1.0 + '@types/node': 24.3.3 '@types/send': 0.17.5 '@types/ssri@7.1.5': dependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 '@types/swagger-ui-dist@3.30.6': {} @@ -18711,6 +18799,8 @@ snapshots: '@types/treeify@1.0.3': {} + '@types/trusted-types@1.0.6': {} + '@types/trusted-types@2.0.7': optional: true @@ -18718,7 +18808,7 @@ snapshots: '@types/unist@3.0.3': {} - '@types/vscode@1.100.0': {} + '@types/vscode@1.104.0': {} '@types/whatwg-mimetype@3.0.2': {} @@ -18726,7 +18816,7 @@ snapshots: '@types/xml2js@0.4.14': dependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 '@types/yargs-parser@21.0.3': {} @@ -18736,49 +18826,49 @@ snapshots: '@types/yoga-layout@1.9.2': {} - '@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0)(typescript@5.8.3))(eslint@9.32.0)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0)(typescript@5.9.3))(eslint@9.32.0)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.38.0(eslint@9.32.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.38.0(eslint@9.32.0)(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/type-utils': 8.38.0(eslint@9.32.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@9.32.0)(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.38.0(eslint@9.32.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.38.0(eslint@9.32.0)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.38.0 eslint: 9.32.0 graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.38.0(eslint@9.32.0)(typescript@5.8.3)': + '@typescript-eslint/parser@8.38.0(eslint@9.32.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.38.0 '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.38.0 debug: 4.4.1(supports-color@8.1.1) eslint: 9.32.0 - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.38.0(typescript@5.8.3)': + '@typescript-eslint/project-service@8.38.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.9.3) '@typescript-eslint/types': 8.38.0 debug: 4.4.1(supports-color@8.1.1) - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/rule-tester@8.38.0(eslint@9.32.0)(typescript@5.8.3)': + '@typescript-eslint/rule-tester@8.38.0(eslint@9.32.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/parser': 8.38.0(eslint@9.32.0)(typescript@5.8.3) - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@9.32.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.38.0(eslint@9.32.0)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.38.0(eslint@9.32.0)(typescript@5.9.3) ajv: 6.12.6 eslint: 9.32.0 json-stable-stringify-without-jsonify: 1.0.1 @@ -18793,28 +18883,28 @@ snapshots: '@typescript-eslint/types': 8.38.0 '@typescript-eslint/visitor-keys': 8.38.0 - '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.9.3)': dependencies: - typescript: 5.8.3 + typescript: 5.9.3 - '@typescript-eslint/type-utils@8.38.0(eslint@9.32.0)(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.38.0(eslint@9.32.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@9.32.0)(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.38.0(eslint@9.32.0)(typescript@5.9.3) debug: 4.4.1(supports-color@8.1.1) eslint: 9.32.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.38.0': {} - '@typescript-eslint/typescript-estree@8.38.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.38.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.38.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) + '@typescript-eslint/project-service': 8.38.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.9.3) '@typescript-eslint/types': 8.38.0 '@typescript-eslint/visitor-keys': 8.38.0 debug: 4.4.1(supports-color@8.1.1) @@ -18822,19 +18912,19 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.38.0(eslint@9.32.0)(typescript@5.8.3)': + '@typescript-eslint/utils@8.38.0(eslint@9.32.0)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0) '@typescript-eslint/scope-manager': 8.38.0 '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.9.3) eslint: 9.32.0 - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -18853,7 +18943,7 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@4.7.0(vite@6.3.5(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0))': + '@vitejs/plugin-react@4.7.0(vite@6.3.5(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) @@ -18861,19 +18951,19 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.5(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.3.5(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.7.0(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0))': + '@vitejs/plugin-react@5.0.4(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - '@babel/core': 7.28.0 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.0) - '@rolldown/pluginutils': 1.0.0-beta.27 + '@babel/core': 7.28.4 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4) + '@rolldown/pluginutils': 1.0.0-beta.38 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -18892,17 +18982,17 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@vitest/eslint-plugin@1.3.4(eslint@9.32.0)(typescript@5.8.3)(vitest@3.2.4)': + '@vitest/eslint-plugin@1.3.4(eslint@9.32.0)(typescript@5.9.3)(vitest@3.2.4)': dependencies: - '@typescript-eslint/utils': 8.38.0(eslint@9.32.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.38.0(eslint@9.32.0)(typescript@5.9.3) eslint: 9.32.0 optionalDependencies: - typescript: 5.8.3 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + typescript: 5.9.3 + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -18914,13 +19004,13 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@6.3.5(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@6.3.5(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.5(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.3.5(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -18951,7 +19041,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.14 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0) '@vitest/utils@3.2.4': dependencies: @@ -18959,12 +19049,12 @@ snapshots: loupe: 3.1.4 tinyrainbow: 2.0.0 - '@volar/kit@2.4.20(typescript@5.8.3)': + '@volar/kit@2.4.20(typescript@5.9.3)': dependencies: '@volar/language-service': 2.4.20 '@volar/typescript': 2.4.20 typesafe-path: 0.2.2 - typescript: 5.8.3 + typescript: 5.9.3 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 @@ -19027,20 +19117,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@vscode/test-web@0.0.71': + '@vscode/test-web@0.0.73': dependencies: '@koa/cors': 5.0.0 - '@koa/router': 13.1.1 - '@playwright/browser-chromium': 1.54.1 + '@koa/router': 14.0.0 + '@playwright/browser-chromium': 1.55.1 gunzip-maybe: 1.4.2 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 - koa: 3.0.0 + koa: 3.0.1 koa-morgan: 1.0.1 koa-mount: 4.2.0 koa-static: 5.0.0 minimist: 1.2.8 - playwright: 1.54.1 + playwright: 1.55.1 tar-fs: 3.1.0 tinyglobby: 0.2.14 vscode-uri: 3.1.0 @@ -19089,7 +19179,7 @@ snapshots: '@vscode/vsce@3.6.0': dependencies: - '@azure/identity': 4.10.2 + '@azure/identity': 4.12.0 '@secretlint/node': 10.2.1 '@secretlint/secretlint-formatter-sarif': 10.2.1 '@secretlint/secretlint-rule-no-dotenv': 10.2.1 @@ -19141,7 +19231,7 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 - '@vue/language-core@2.2.0(typescript@5.8.3)': + '@vue/language-core@2.2.0(typescript@5.9.3)': dependencies: '@volar/language-core': 2.4.20 '@vue/compiler-dom': 3.5.17 @@ -19152,7 +19242,7 @@ snapshots: muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 '@vue/reactivity@3.5.18': dependencies: @@ -19247,7 +19337,7 @@ snapshots: '@yarnpkg/libui@3.0.2(ink@3.2.0(@types/react@18.3.23)(react@17.0.2))(react@17.0.2)': dependencies: - ink: 3.2.0(@types/react@18.3.23)(react@17.0.2) + ink: 3.2.0(@types/react@18.3.23)(react@18.3.1) react: 17.0.2 tslib: 2.8.1 @@ -19371,7 +19461,7 @@ snapshots: algoliasearch: 4.25.2 clipanion: 4.0.0-rc.4(typanion@3.14.0) diff: 5.2.0 - ink: 3.2.0(@types/react@18.3.23)(react@17.0.2) + ink: 3.2.0(@types/react@18.3.23)(react@18.3.1) ink-text-input: 4.0.3(ink@3.2.0(@types/react@18.3.23)(react@17.0.2))(react@17.0.2) react: 17.0.2 semver: 7.7.2 @@ -19707,22 +19797,6 @@ snapshots: '@algolia/requester-node-http': 4.25.2 '@algolia/transporter': 4.25.2 - algoliasearch@5.34.0: - dependencies: - '@algolia/client-abtesting': 5.34.0 - '@algolia/client-analytics': 5.34.0 - '@algolia/client-common': 5.34.0 - '@algolia/client-insights': 5.34.0 - '@algolia/client-personalization': 5.34.0 - '@algolia/client-query-suggestions': 5.34.0 - '@algolia/client-search': 5.34.0 - '@algolia/ingestion': 1.34.0 - '@algolia/monitoring': 1.34.0 - '@algolia/recommend': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 - alien-signals@0.4.14: {} ansi-align@3.0.1: @@ -19883,14 +19957,14 @@ snapshots: astring@1.9.0: {} - astro-expressive-code@0.41.3(astro@5.12.5(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0)(@types/node@24.1.0)(encoding@0.1.13)(rollup@4.45.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)): + astro-expressive-code@0.41.3(astro@5.12.5(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0)(@types/node@24.3.3)(encoding@0.1.13)(rollup@4.49.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.0)): dependencies: - astro: 5.12.5(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0)(@types/node@24.1.0)(encoding@0.1.13)(rollup@4.45.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) + astro: 5.12.5(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0)(@types/node@24.3.3)(encoding@0.1.13)(rollup@4.49.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.0) rehype-expressive-code: 0.41.3 - astro-rehype-relative-markdown-links@0.18.1(astro@5.12.5(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0)(@types/node@24.1.0)(encoding@0.1.13)(rollup@4.45.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)): + astro-rehype-relative-markdown-links@0.18.1(astro@5.12.5(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0)(@types/node@24.3.3)(encoding@0.1.13)(rollup@4.49.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.0)): dependencies: - astro: 5.12.5(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0)(@types/node@24.1.0)(encoding@0.1.13)(rollup@4.45.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) + astro: 5.12.5(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0)(@types/node@24.3.3)(encoding@0.1.13)(rollup@4.49.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.0) catch-unknown: 2.0.0 debug: 4.4.1(supports-color@8.1.1) github-slugger: 2.0.0 @@ -19902,7 +19976,7 @@ snapshots: transitivePeerDependencies: - supports-color - astro@5.12.5(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0)(@types/node@24.1.0)(encoding@0.1.13)(rollup@4.45.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0): + astro@5.12.5(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0)(@types/node@24.3.3)(encoding@0.1.13)(rollup@4.49.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.0): dependencies: '@astrojs/compiler': 2.12.2 '@astrojs/internal-helpers': 0.6.1 @@ -19910,7 +19984,7 @@ snapshots: '@astrojs/telemetry': 3.3.0 '@capsizecss/unpack': 2.4.0(encoding@0.1.13) '@oslojs/encoding': 1.1.0 - '@rollup/pluginutils': 5.2.0(rollup@4.45.1) + '@rollup/pluginutils': 5.2.0(rollup@4.49.0) acorn: 8.15.0 aria-query: 5.3.2 axobject-query: 4.1.0 @@ -19952,20 +20026,20 @@ snapshots: smol-toml: 1.4.1 tinyexec: 0.3.2 tinyglobby: 0.2.14 - tsconfck: 3.1.6(typescript@5.8.3) + tsconfck: 3.1.6(typescript@5.9.3) ultrahtml: 1.6.0 unifont: 0.5.2 unist-util-visit: 5.0.0 - unstorage: 1.16.1(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0) + unstorage: 1.16.1(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0) vfile: 6.0.3 - vite: 6.3.5(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) - vitefu: 1.1.1(vite@6.3.5(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + vite: 6.3.5(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) + vitefu: 1.1.1(vite@6.3.5(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 yocto-spinner: 0.2.3 zod: 3.25.76 zod-to-json-schema: 3.24.6(zod@3.25.76) - zod-to-ts: 1.2.0(typescript@5.8.3)(zod@3.25.76) + zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76) optionalDependencies: sharp: 0.33.5 transitivePeerDependencies: @@ -20296,11 +20370,6 @@ snapshots: tar: 7.4.3 unique-filename: 4.0.0 - cache-content-type@1.0.1: - dependencies: - mime-types: 2.1.35 - ylru: 1.4.0 - cacheable-lookup@5.0.4: {} cacheable-request@7.0.4: @@ -20707,14 +20776,14 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - cosmiconfig@9.0.0(typescript@5.8.3): + cosmiconfig@9.0.0(typescript@5.9.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 create-ecdh@4.0.4: dependencies: @@ -20751,8 +20820,9 @@ snapshots: dependencies: semver: 7.7.2 - cross-env@7.0.3: + cross-env@10.0.0: dependencies: + '@epic-web/invariant': 1.0.0 cross-spawn: 7.0.6 cross-fetch@3.2.0(encoding@0.1.13): @@ -21643,17 +21713,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.38.0(eslint@9.32.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.38.0(eslint@9.32.0)(typescript@5.9.3) eslint: 9.32.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0)(typescript@5.8.3))(eslint@9.32.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0)(typescript@5.9.3))(eslint@9.32.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -21664,7 +21734,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.32.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -21676,7 +21746,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.38.0(eslint@9.32.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.38.0(eslint@9.32.0)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -21686,7 +21756,7 @@ snapshots: dependencies: eslint: 9.32.0 - eslint-plugin-unicorn@60.0.0(eslint@9.32.0): + eslint-plugin-unicorn@61.0.2(eslint@9.32.0): dependencies: '@babel/helper-validator-identifier': 7.27.1 '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0) @@ -22770,7 +22840,7 @@ snapshots: ink-text-input@4.0.3(ink@3.2.0(@types/react@18.3.23)(react@17.0.2))(react@17.0.2): dependencies: chalk: 4.1.2 - ink: 3.2.0(@types/react@18.3.23)(react@17.0.2) + ink: 3.2.0(@types/react@18.3.23)(react@18.3.1) react: 17.0.2 type-fest: 0.15.1 @@ -22806,19 +22876,51 @@ snapshots: - bufferutil - utf-8-validate + ink@3.2.0(@types/react@18.3.23)(react@18.3.1): + dependencies: + ansi-escapes: 4.3.2 + auto-bind: 4.0.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + cli-cursor: 3.1.0 + cli-truncate: 2.1.0 + code-excerpt: 3.0.0 + indent-string: 4.0.0 + is-ci: 2.0.0 + lodash: 4.17.21 + patch-console: 1.0.0 + react: 18.3.1 + react-devtools-core: 4.28.5 + react-reconciler: 0.26.2(react@18.3.1) + scheduler: 0.20.2 + signal-exit: 3.0.7 + slice-ansi: 3.0.0 + stack-utils: 2.0.6 + string-width: 4.2.3 + type-fest: 0.12.0 + widest-line: 3.1.0 + wrap-ansi: 6.2.0 + ws: 7.5.10 + yoga-layout-prebuilt: 1.10.0 + optionalDependencies: + '@types/react': 18.3.23 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + inline-style-parser@0.2.4: {} - inquirer@12.9.0(@types/node@24.1.0): + inquirer@12.9.0(@types/node@24.3.3): dependencies: - '@inquirer/core': 10.1.15(@types/node@24.1.0) - '@inquirer/prompts': 7.8.0(@types/node@24.1.0) - '@inquirer/type': 3.0.8(@types/node@24.1.0) + '@inquirer/core': 10.1.15(@types/node@24.3.3) + '@inquirer/prompts': 7.8.0(@types/node@24.3.3) + '@inquirer/type': 3.0.8(@types/node@24.3.3) ansi-escapes: 4.3.2 mute-stream: 2.0.0 run-async: 4.0.5 rxjs: 7.8.2 optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 internal-slot@1.1.0: dependencies: @@ -23291,14 +23393,12 @@ snapshots: transitivePeerDependencies: - supports-color - koa@3.0.0: + koa@3.0.1: dependencies: accepts: 1.3.8 - cache-content-type: 1.0.1 content-disposition: 0.5.4 content-type: 1.0.5 cookies: 0.9.1 - debug: 4.4.1(supports-color@8.1.1) delegates: 1.0.0 destroy: 1.2.0 encodeurl: 2.0.0 @@ -23307,13 +23407,12 @@ snapshots: http-assert: 1.5.0 http-errors: 2.0.0 koa-compose: 4.1.0 + mime-types: 3.0.1 on-finished: 2.4.1 parseurl: 1.3.3 statuses: 2.0.2 type-is: 2.0.1 vary: 1.1.2 - transitivePeerDependencies: - - supports-color kolorist@1.8.0: {} @@ -23511,8 +23610,6 @@ snapshots: markdown-table@3.0.4: {} - marked@15.0.12: {} - marked@16.1.1: {} math-intrinsics@1.1.0: {} @@ -23730,12 +23827,12 @@ snapshots: merge2@1.4.1: {} - mermaid-isomorphic@3.0.4(playwright@1.54.1): + mermaid-isomorphic@3.0.4(playwright@1.55.1): dependencies: '@fortawesome/fontawesome-free': 6.7.2 mermaid: 11.9.0 optionalDependencies: - playwright: 1.54.1 + playwright: 1.55.1 transitivePeerDependencies: - supports-color @@ -24184,9 +24281,11 @@ snapshots: yargs-parser: 21.1.1 yargs-unparser: 2.0.0 - monaco-editor-core@0.52.2: {} + monaco-editor-core@0.53.0: {} - monaco-editor@0.52.2: {} + monaco-editor@0.53.0: + dependencies: + '@types/trusted-types': 1.0.6 morgan@1.10.1: dependencies: @@ -24610,6 +24709,10 @@ snapshots: dependencies: yocto-queue: 1.2.1 + p-limit@7.1.1: + dependencies: + yocto-queue: 1.2.1 + p-locate@3.0.0: dependencies: p-limit: 2.3.0 @@ -24832,8 +24935,6 @@ snapshots: dependencies: unique-string: 2.0.0 - path-to-regexp@6.3.0: {} - path-to-regexp@8.2.0: {} path-type@4.0.0: {} @@ -24899,12 +25000,20 @@ snapshots: playwright-core@1.54.1: {} + playwright-core@1.55.1: {} + playwright@1.54.1: dependencies: playwright-core: 1.54.1 optionalDependencies: fsevents: 2.3.2 + playwright@1.55.1: + dependencies: + playwright-core: 1.55.1 + optionalDependencies: + fsevents: 2.3.2 + plist@3.1.0: dependencies: '@xmldom/xmldom': 0.8.10 @@ -24944,8 +25053,6 @@ snapshots: dependencies: commander: 9.5.0 - preact@10.26.9: {} - prebuild-install@7.1.3: dependencies: detect-libc: 2.0.4 @@ -24977,10 +25084,10 @@ snapshots: prettier: 3.6.2 sass-formatter: 0.7.9 - prettier-plugin-organize-imports@4.2.0(prettier@3.6.2)(typescript@5.8.3): + prettier-plugin-organize-imports@4.2.0(prettier@3.6.2)(typescript@5.9.3): dependencies: prettier: 3.6.2 - typescript: 5.8.3 + typescript: 5.9.3 prettier-plugin-sh@0.17.4(prettier@3.6.2): dependencies: @@ -25165,9 +25272,9 @@ snapshots: - bufferutil - utf-8-validate - react-docgen-typescript@2.4.0(typescript@5.8.3): + react-docgen-typescript@2.4.0(typescript@5.9.3): dependencies: - typescript: 5.8.3 + typescript: 5.9.3 react-docgen@8.0.0: dependencies: @@ -25229,6 +25336,13 @@ snapshots: react: 17.0.2 scheduler: 0.20.2 + react-reconciler@0.26.2(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react: 18.3.1 + scheduler: 0.20.2 + react-refresh@0.17.0: {} react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -25393,19 +25507,19 @@ snapshots: '@types/hast': 3.0.4 hast-util-format: 1.1.0 - rehype-mermaid@3.0.0(playwright@1.54.1): + rehype-mermaid@3.0.0(playwright@1.55.1): dependencies: '@types/hast': 3.0.4 hast-util-from-html-isomorphic: 2.0.0 hast-util-to-text: 4.0.2 - mermaid-isomorphic: 3.0.4(playwright@1.54.1) + mermaid-isomorphic: 3.0.4(playwright@1.55.1) mini-svg-data-uri: 1.4.4 space-separated-tokens: 2.0.2 unified: 11.0.5 unist-util-visit-parents: 6.0.1 vfile: 6.0.3 optionalDependencies: - playwright: 1.54.1 + playwright: 1.55.1 transitivePeerDependencies: - supports-color @@ -25612,39 +25726,39 @@ snapshots: robust-predicates@3.0.2: {} - rollup-plugin-visualizer@6.0.3(rollup@4.45.1): + rollup-plugin-visualizer@6.0.3(rollup@4.49.0): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.4 yargs: 17.7.2 optionalDependencies: - rollup: 4.45.1 + rollup: 4.49.0 - rollup@4.45.1: + rollup@4.49.0: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.45.1 - '@rollup/rollup-android-arm64': 4.45.1 - '@rollup/rollup-darwin-arm64': 4.45.1 - '@rollup/rollup-darwin-x64': 4.45.1 - '@rollup/rollup-freebsd-arm64': 4.45.1 - '@rollup/rollup-freebsd-x64': 4.45.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.45.1 - '@rollup/rollup-linux-arm-musleabihf': 4.45.1 - '@rollup/rollup-linux-arm64-gnu': 4.45.1 - '@rollup/rollup-linux-arm64-musl': 4.45.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.45.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-musl': 4.45.1 - '@rollup/rollup-linux-s390x-gnu': 4.45.1 - '@rollup/rollup-linux-x64-gnu': 4.45.1 - '@rollup/rollup-linux-x64-musl': 4.45.1 - '@rollup/rollup-win32-arm64-msvc': 4.45.1 - '@rollup/rollup-win32-ia32-msvc': 4.45.1 - '@rollup/rollup-win32-x64-msvc': 4.45.1 + '@rollup/rollup-android-arm-eabi': 4.49.0 + '@rollup/rollup-android-arm64': 4.49.0 + '@rollup/rollup-darwin-arm64': 4.49.0 + '@rollup/rollup-darwin-x64': 4.49.0 + '@rollup/rollup-freebsd-arm64': 4.49.0 + '@rollup/rollup-freebsd-x64': 4.49.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.49.0 + '@rollup/rollup-linux-arm-musleabihf': 4.49.0 + '@rollup/rollup-linux-arm64-gnu': 4.49.0 + '@rollup/rollup-linux-arm64-musl': 4.49.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.49.0 + '@rollup/rollup-linux-ppc64-gnu': 4.49.0 + '@rollup/rollup-linux-riscv64-gnu': 4.49.0 + '@rollup/rollup-linux-riscv64-musl': 4.49.0 + '@rollup/rollup-linux-s390x-gnu': 4.49.0 + '@rollup/rollup-linux-x64-gnu': 4.49.0 + '@rollup/rollup-linux-x64-musl': 4.49.0 + '@rollup/rollup-win32-arm64-msvc': 4.49.0 + '@rollup/rollup-win32-ia32-msvc': 4.49.0 + '@rollup/rollup-win32-x64-msvc': 4.49.0 fsevents: 2.3.3 root-link-target@3.1.0: @@ -25758,8 +25872,6 @@ snapshots: dependencies: loose-envify: 1.4.0 - search-insights@2.17.3: {} - secretlint@10.2.1: dependencies: '@secretlint/config-creator': 10.2.1 @@ -26328,12 +26440,12 @@ snapshots: better-path-resolve: 1.0.0 rename-overwrite: 6.0.3 - syncpack@13.0.4(typescript@5.8.3): + syncpack@13.0.4(typescript@5.9.3): dependencies: chalk: 5.4.1 chalk-template: 1.1.0 commander: 13.1.0 - cosmiconfig: 9.0.0(typescript@5.8.3) + cosmiconfig: 9.0.0(typescript@5.9.3) effect: 3.17.0 enquirer: 2.4.1 fast-check: 3.23.2 @@ -26570,7 +26682,12 @@ snapshots: node-addon-api: 8.5.0 node-gyp-build: 4.8.4 - tree-sitter-python@0.23.6: + tree-sitter-javascript@0.25.0: + dependencies: + node-addon-api: 8.5.0 + node-gyp-build: 4.8.4 + + tree-sitter-python@0.25.0: dependencies: node-addon-api: 8.5.0 node-gyp-build: 4.8.4 @@ -26591,17 +26708,17 @@ snapshots: dependencies: utf8-byte-length: 1.0.5 - ts-api-utils@2.1.0(typescript@5.8.3): + ts-api-utils@2.1.0(typescript@5.9.3): dependencies: - typescript: 5.8.3 + typescript: 5.9.3 ts-dedent@2.2.0: {} ts-toolbelt@9.6.0: {} - tsconfck@3.1.6(typescript@5.8.3): + tsconfck@3.1.6(typescript@5.9.3): optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 tsconfig-paths@3.15.0: dependencies: @@ -26716,17 +26833,17 @@ snapshots: typedarray@0.0.6: {} - typedoc-plugin-markdown@4.7.1(typedoc@0.28.8(typescript@5.8.3)): + typedoc-plugin-markdown@4.7.1(typedoc@0.28.8(typescript@5.9.3)): dependencies: - typedoc: 0.28.8(typescript@5.8.3) + typedoc: 0.28.8(typescript@5.9.3) - typedoc@0.28.8(typescript@5.8.3): + typedoc@0.28.8(typescript@5.9.3): dependencies: '@gerrit0/mini-shiki': 3.8.1 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - typescript: 5.8.3 + typescript: 5.9.3 yaml: 2.8.0 typesafe-path@0.2.2: {} @@ -26735,20 +26852,20 @@ snapshots: dependencies: semver: 7.7.2 - typescript-eslint@8.38.0(eslint@9.32.0)(typescript@5.8.3): + typescript-eslint@8.38.0(eslint@9.32.0)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0)(typescript@5.8.3))(eslint@9.32.0)(typescript@5.8.3) - '@typescript-eslint/parser': 8.38.0(eslint@9.32.0)(typescript@5.8.3) - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@9.32.0)(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0)(typescript@5.9.3))(eslint@9.32.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.38.0(eslint@9.32.0)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.38.0(eslint@9.32.0)(typescript@5.9.3) eslint: 9.32.0 - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color typescript@5.8.2: {} - typescript@5.8.3: {} + typescript@5.9.3: {} typical@4.0.0: {} @@ -26779,7 +26896,7 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.8.0: {} + undici-types@7.10.0: {} undici@7.12.0: {} @@ -26894,7 +27011,7 @@ snapshots: acorn: 8.15.0 webpack-virtual-modules: 0.6.2 - unstorage@1.16.1(@azure/identity@4.10.2)(@azure/storage-blob@12.27.0): + unstorage@1.16.1(@azure/identity@4.12.0)(@azure/storage-blob@12.28.0): dependencies: anymatch: 3.1.3 chokidar: 4.0.3 @@ -26905,8 +27022,8 @@ snapshots: ofetch: 1.4.1 ufo: 1.6.1 optionalDependencies: - '@azure/identity': 4.10.2 - '@azure/storage-blob': 12.27.0 + '@azure/identity': 4.12.0 + '@azure/storage-blob': 12.28.0 update-browserslist-db@1.1.3(browserslist@4.25.1): dependencies: @@ -26929,13 +27046,6 @@ snapshots: punycode: 1.4.1 qs: 6.14.0 - use-disposable@1.0.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7(@types/react@18.3.23) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - use-sync-external-store@1.5.0(react@18.3.1): dependencies: react: 18.3.1 @@ -27000,13 +27110,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.2.4(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0): + vite-node@3.2.4(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1(supports-color@8.1.1) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -27021,7 +27131,7 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.10.2(eslint@9.32.0)(optionator@0.9.4)(typescript@5.8.3)(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)): + vite-plugin-checker@0.10.2(eslint@9.32.0)(optionator@0.9.4)(typescript@5.9.3)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)): dependencies: '@babel/code-frame': 7.27.1 chokidar: 4.0.3 @@ -27031,85 +27141,77 @@ snapshots: strip-ansi: 7.1.0 tiny-invariant: 1.3.3 tinyglobby: 0.2.14 - vite: 7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) vscode-uri: 3.1.0 optionalDependencies: eslint: 9.32.0 optionator: 0.9.4 - typescript: 5.8.3 + typescript: 5.9.3 - vite-plugin-dts@4.5.4(@types/node@24.1.0)(rollup@4.45.1)(typescript@5.8.3)(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)): + vite-plugin-dts@4.5.4(@types/node@24.3.3)(rollup@4.49.0)(typescript@5.9.3)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)): dependencies: - '@microsoft/api-extractor': 7.52.9(@types/node@24.1.0) - '@rollup/pluginutils': 5.2.0(rollup@4.45.1) + '@microsoft/api-extractor': 7.52.9(@types/node@24.3.3) + '@rollup/pluginutils': 5.2.0(rollup@4.49.0) '@volar/typescript': 2.4.20 - '@vue/language-core': 2.2.0(typescript@5.8.3) + '@vue/language-core': 2.2.0(typescript@5.9.3) compare-versions: 6.1.1 debug: 4.4.1(supports-color@8.1.1) kolorist: 1.8.0 local-pkg: 1.1.1 magic-string: 0.30.17 - typescript: 5.8.3 + typescript: 5.9.3 optionalDependencies: - vite: 7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-node-polyfills@0.24.0(rollup@4.45.1)(vite@6.3.5(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)): - dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.45.1) - node-stdlib-browser: 1.3.1 - vite: 6.3.5(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) - transitivePeerDependencies: - - rollup - - vite-plugin-node-polyfills@0.24.0(rollup@4.45.1)(vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)): + vite-plugin-node-polyfills@0.24.0(rollup@4.49.0)(vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.45.1) + '@rollup/plugin-inject': 5.0.5(rollup@4.49.0) node-stdlib-browser: 1.3.1 - vite: 7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - rollup - vite@6.3.5(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0): + vite@6.3.5(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0): dependencies: esbuild: 0.25.8 fdir: 6.4.6(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.45.1 + rollup: 4.49.0 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 fsevents: 2.3.3 tsx: 4.20.3 yaml: 2.8.0 - vite@7.0.6(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0): + vite@7.0.6(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0): dependencies: esbuild: 0.25.8 fdir: 6.4.6(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.45.1 + rollup: 4.49.0 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.3 fsevents: 2.3.3 tsx: 4.20.3 yaml: 2.8.0 - vitefu@1.1.1(vite@6.3.5(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)): + vitefu@1.1.1(vite@6.3.5(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)): optionalDependencies: - vite: 6.3.5(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.3.5(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jsdom@25.0.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -27127,12 +27229,12 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@24.1.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.3.5(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@24.3.3)(tsx@4.20.3)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 24.1.0 + '@types/node': 24.3.3 '@vitest/ui': 3.2.4(vitest@3.2.4) happy-dom: 18.0.1 jsdom: 25.0.1 @@ -27534,8 +27636,6 @@ snapshots: dependencies: buffer-crc32: 0.2.13 - ylru@1.4.0: {} - yocto-queue@0.1.0: {} yocto-queue@1.2.1: {} @@ -27556,9 +27656,9 @@ snapshots: dependencies: zod: 3.25.76 - zod-to-ts@1.2.0(typescript@5.8.3)(zod@3.25.76): + zod-to-ts@1.2.0(typescript@5.9.3)(zod@3.25.76): dependencies: - typescript: 5.8.3 + typescript: 5.9.3 zod: 3.25.76 zod@3.25.76: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c1fec505b34..29529a2407b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,11 +1,15 @@ packages: - - "packages/*" - - "e2e" - - "website" - - "!packages/http-client-csharp/**" - - "!packages/http-client-java/**" - - "!packages/http-client-python/**" + - packages/* + - e2e + - website + - '!packages/http-client-csharp/**' + - '!packages/http-client-java/**' + - '!packages/http-client-python/**' overrides: - "cross-spawn@>=7.0.0 <7.0.5": "^7.0.5" - rollup: 4.49.0 # Regression in 4.50.0 https://github.com/rollup/rollup/issues/6099 + cross-spawn@>=7.0.0 <7.0.5: ^7.0.5 + "@alloy-js/core": "^0.21.0-dev.10" + "@alloy-js/python": "^0.2.0-dev.4" + rollup: 4.49.0 + +registry: https://registry.npmjs.org/ From 933ea9598d9f680b83802cb522a097fee9deb04b Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Tue, 7 Oct 2025 22:45:27 +0000 Subject: [PATCH 11/25] Add Literal import --- .../class-declaration/class-declaration.test.tsx | 7 +++++++ .../python/components/class-declaration/class-member.tsx | 5 +++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx index 78d9ebb4548..9e32bbc592b 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx @@ -31,6 +31,7 @@ describe("Python Class from model", () => { expect(getOutput(program, [])).toRenderTo( ` from dataclasses import dataclass + from typing import Literal @dataclass class Widget: @@ -308,6 +309,7 @@ describe("Python Class from model", () => { ` from dataclasses import dataclass from enum import StrEnum + from typing import Literal class Color(StrEnum): RED = "RED" @@ -353,6 +355,7 @@ describe("Python Class from model", () => { expect(getOutput(program, [])) .toRenderTo(` from dataclasses import dataclass + from typing import Literal @dataclass class MyOperations: @@ -383,6 +386,7 @@ describe("Python Class from model", () => { ]), ).toRenderTo(` from dataclasses import dataclass + from typing import Literal @dataclass class MyOperations: @@ -414,6 +418,7 @@ describe("Python Class from model", () => { ]), ).toRenderTo(` from dataclasses import dataclass + from typing import Literal @dataclass class Widget: @@ -527,6 +532,7 @@ describe("Python Class from interface", () => { from abc import ABC from abc import abstractmethod from dataclasses import dataclass + from typing import Literal class WidgetOperations(ABC): @@ -579,6 +585,7 @@ describe("Python Class from interface", () => { from abc import ABC from abc import abstractmethod from dataclasses import dataclass + from typing import Literal class WidgetOperations(ABC): diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx index 8da0a5da1c6..cd07fe73e4a 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx @@ -1,3 +1,4 @@ +import { typingModule } from "#python/builtins.js"; import { type Children } from "@alloy-js/core"; import * as py from "@alloy-js/python"; import { isNeverType, type ModelProperty, type Operation } from "@typespec/compiler"; @@ -88,7 +89,7 @@ function buildTypeNodeForProperty(unpackedType: any): Children | undefined { : String(variantValue?.value ?? ""); return ( <> - Literal[{efRefkey(unionType)}.{enumMemberName}] + {typingModule["."]["Literal"]}[{efRefkey(unionType)}.{enumMemberName}] ); } @@ -103,7 +104,7 @@ function buildTypeNodeForProperty(unpackedType: any): Children | undefined { const allStringLiterals = opts.every((opt) => opt && opt.kind === "String"); if (allStringLiterals) { const literalValues = opts.map((opt) => JSON.stringify(opt.value)).join(", "); - return <>Literal[{literalValues}]; + return <>{typingModule["."]["Literal"]}[{literalValues}]; } } From 2d5c1f9ef83e49363fef7ec222fc84cb446b82b8 Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Wed, 8 Oct 2025 14:37:59 +0000 Subject: [PATCH 12/25] Accounting for feedback --- .../class-declaration.test.tsx | 10 ++++----- .../class-declaration/class-declaration.tsx | 6 ++--- .../class-declaration/class-member.tsx | 4 ++-- .../class-declaration/class-method.test.tsx | 22 +++++++++---------- .../class-declaration/class-method.tsx | 18 +++++++-------- 5 files changed, 30 insertions(+), 30 deletions(-) diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx index 9e32bbc592b..a9dbda167a3 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx @@ -5,7 +5,7 @@ import * as py from "@alloy-js/python"; import { t } from "@typespec/compiler/testing"; import { describe, expect, it } from "vitest"; import { ClassDeclaration } from "../../../../src/python/components/class-declaration/class-declaration.js"; -import { ClassMethod } from "../../../../src/python/components/class-declaration/class-method.js"; +import { Method } from "../../../../src/python/components/class-declaration/class-method.js"; import { EnumDeclaration } from "../../../../src/python/components/enum-declaration/enum-declaration.js"; describe("Python Class from model", () => { @@ -632,7 +632,7 @@ describe("Python Class overrides", () => { - + , ]), @@ -668,7 +668,7 @@ describe("Python Class overrides", () => { - + , ]), @@ -704,7 +704,7 @@ describe("Python Class overrides", () => { - + , ]), @@ -741,7 +741,7 @@ describe("Python Class overrides", () => { - + , ]), diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx index 803f4cee5bd..691f4caa801 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx @@ -16,7 +16,7 @@ import { reportDiagnostic } from "../../../lib.js"; import { declarationRefkeys, efRefkey } from "../../utils/refkey.js"; import { TypeExpression } from "../type-expression/type-expression.jsx"; import { ClassMember } from "./class-member.jsx"; -import { ClassMethodProvider } from "./class-method.jsx"; +import { MethodProvider } from "./class-method.jsx"; export interface ClassDeclarationPropsWithType extends Omit { type: Model | Interface; @@ -232,7 +232,7 @@ export function ClassDeclaration(props: ClassDeclarationProps) { <> @{dataclass} - + {classBody} - + ); } diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx index cd07fe73e4a..074c5292271 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx @@ -6,7 +6,7 @@ import { useTsp } from "../../../core/context/tsp-context.js"; import { efRefkey } from "../../utils/refkey.js"; import { Atom } from "../atom/atom.jsx"; import { TypeExpression } from "../type-expression/type-expression.jsx"; -import { ClassMethod } from "./class-method.jsx"; +import { Method } from "./class-method.jsx"; export interface ClassMemberProps { type: ModelProperty | Operation; @@ -148,7 +148,7 @@ export function ClassMember(props: ClassMemberProps) { if ($.operation.is(props.type)) { return ( - { it("creates a class method from an interface method", async () => { @@ -15,7 +15,7 @@ describe("interface methods with a `type` prop", () => { expect( getOutput(program, [ - + , ]), ).toRenderTo(` @@ -35,7 +35,7 @@ describe("interface methods with a `type` prop", () => { expect( getOutput(program, [ - + , ]), ).toRenderTo(` @@ -56,7 +56,7 @@ describe("interface methods with a `type` prop", () => { expect( getOutput(program, [ - + , ]), ).toRenderTo(` @@ -77,7 +77,7 @@ describe("interface methods with a `type` prop", () => { expect( getOutput(program, [ - + , ]), ).toRenderTo(` @@ -97,7 +97,7 @@ describe("interface methods with a `type` prop", () => { expect( getOutput(program, [ - { expect( getOutput(program, [ - { expect( getOutput(program, [ - { expect( getOutput(program, [ - + , ]), ).toRenderTo(` @@ -192,7 +192,7 @@ describe("interface methods with a `type` prop", () => { expect( getOutput(program, [ - + , ]), ).toRenderTo(` @@ -212,7 +212,7 @@ describe("interface methods without a `type` prop", () => { expect( getOutput(program, [ - ( +export const MethodContext = createContext<"method" | "static" | "class" | undefined>( undefined, ); -export const ClassMethodProvider = ClassMethodContext.Provider; +export const MethodProvider = MethodContext.Provider; -export interface ClassMethodPropsWithType extends Omit { +export interface MethodPropsWithType extends Omit { type: Operation; name?: string; doc?: Children; @@ -20,9 +20,9 @@ export interface ClassMethodPropsWithType extends Omit) { +export function Method(props: Readonly) { const { $ } = useTsp(); const isTypeSpecTyped = "type" in props; const docElement = createDocElement($, props); From 8bca1d6a02b7929e21a6978291bf11275464278d Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Wed, 8 Oct 2025 20:42:46 +0000 Subject: [PATCH 13/25] Handle floats in a better way --- .../emitter-framework/src/python/builtins.ts | 7 --- .../src/python/components/atom/atom.test.tsx | 42 +++++++++++++++++- .../src/python/components/atom/atom.tsx | 13 +++++- .../class-declaration/class-declaration.tsx | 15 ++++--- .../class-declaration/class-member.tsx | 20 ++++----- .../class-declaration/class-method.tsx | 4 +- pnpm-lock.yaml | 44 +++++++++---------- pnpm-workspace.yaml | 4 +- 8 files changed, 94 insertions(+), 55 deletions(-) diff --git a/packages/emitter-framework/src/python/builtins.ts b/packages/emitter-framework/src/python/builtins.ts index d29acbd89e5..2f38ac26677 100644 --- a/packages/emitter-framework/src/python/builtins.ts +++ b/packages/emitter-framework/src/python/builtins.ts @@ -38,10 +38,3 @@ export const typingModule = createModule({ ".": ["Any", "Literal", "NoReturn", "Protocol", "Tuple"], }, }); - -export const typingExtensionsModule = createModule({ - name: "typing_extensions", - descriptor: { - ".": ["TypedDict"], - }, -}); diff --git a/packages/emitter-framework/src/python/components/atom/atom.test.tsx b/packages/emitter-framework/src/python/components/atom/atom.test.tsx index 660be44fd76..fef589ed6b3 100644 --- a/packages/emitter-framework/src/python/components/atom/atom.test.tsx +++ b/packages/emitter-framework/src/python/components/atom/atom.test.tsx @@ -62,10 +62,50 @@ describe("NumericValue", () => { }); it("decimals with .0", async () => { - // Atom normalizes 42.0 to 42 because it uses asNumber() + // Generic Atom (no hint) normalizes 42.0 to 42 because it uses asNumber() const value = $(program).value.createNumeric(42.0); await testValueExpression(value, `42`); }); + + it("decimals with .0 when assumeFloat", async () => { + const value = $(program).value.createNumeric(42.0); + expect(getOutput(program, [])).toRenderTo(`42.0`); + }); + + it("negative integers", async () => { + const value = $(program).value.createNumeric(-42); + await testValueExpression(value, `-42`); + }); + + it("negative decimals", async () => { + const value = $(program).value.createNumeric(-42.5); + await testValueExpression(value, `-42.5`); + }); + + it("zero", async () => { + const value = $(program).value.createNumeric(0); + await testValueExpression(value, `0`); + }); + + it("zero with assumeFloat", async () => { + const value = $(program).value.createNumeric(0); + expect(getOutput(program, [])).toRenderTo(`0.0`); + }); + + it("exponent that resolves to integer", async () => { + const value = $(program).value.createNumeric(1e3); + await testValueExpression(value, `1000`); + }); + + it("exponent that resolves to integer with assumeFloat", async () => { + const value = $(program).value.createNumeric(1e3); + expect(getOutput(program, [])).toRenderTo(`1000.0`); + }); + + it("small decimal via exponent", async () => { + const value = $(program).value.createNumeric(1e-3); + await testValueExpression(value, `0.001`); + }); }); describe("ArrayValue", () => { diff --git a/packages/emitter-framework/src/python/components/atom/atom.tsx b/packages/emitter-framework/src/python/components/atom/atom.tsx index 4771c30fcc9..b4606ef3077 100644 --- a/packages/emitter-framework/src/python/components/atom/atom.tsx +++ b/packages/emitter-framework/src/python/components/atom/atom.tsx @@ -10,6 +10,11 @@ interface AtomProps { * The TypeSpec value to be converted to a Python expression. */ value: Value; + /** + * Hint that this numeric value should be emitted as a float (e.g., 42 -> 42.0). + * Only affects NumericValue. + */ + assumeFloat?: boolean; } /** @@ -23,8 +28,12 @@ export function Atom(props: Readonly): Children { case "BooleanValue": case "NullValue": return ; - case "NumericValue": - return ; + case "NumericValue": { + const num = props.value.value.asNumber(); + const isNonInteger = num != null && !Number.isInteger(num); + const asFloat = isNonInteger || props.assumeFloat === true; + return ; + } case "ArrayValue": return ( ; + return ( + + ); } const namePolicy = py.usePythonNamePolicy(); diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx index 074c5292271..d784e93c079 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx @@ -44,7 +44,7 @@ function buildPrimitiveInitializerFromDefault( // Example: value is { value: "100", isInteger: true } if (raw && typeof raw === "object" && "value" in raw) raw = raw.value; - // Float-ish property types should render as raw text with .0 if integral + // Float-ish property types should render with a float hint if integral if ($.scalar.is(propertyType)) { const base = $.scalar.getStdBase(propertyType)?.name; const isFloatish = @@ -54,10 +54,7 @@ function buildPrimitiveInitializerFromDefault( base === "decimal" || base === "decimal128"; if (isFloatish) { - // Example: raw is 42.5 or 42.0 - const s = typeof raw === "string" ? raw : String(raw); - const needsDotZero = !s.includes(".") && !s.toLowerCase().includes("e"); - return <>{needsDotZero ? `${s}.0` : s}; + return ; } } @@ -104,7 +101,11 @@ function buildTypeNodeForProperty(unpackedType: any): Children | undefined { const allStringLiterals = opts.every((opt) => opt && opt.kind === "String"); if (allStringLiterals) { const literalValues = opts.map((opt) => JSON.stringify(opt.value)).join(", "); - return <>{typingModule["."]["Literal"]}[{literalValues}]; + return ( + <> + {typingModule["."]["Literal"]}[{literalValues}] + + ); } } @@ -148,12 +149,7 @@ export function ClassMember(props: ClassMemberProps) { if ($.operation.is(props.type)) { return ( - + ); } } diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-method.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-method.tsx index 8eeb44732b4..e0331f34581 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-method.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-method.tsx @@ -6,9 +6,7 @@ import { useTsp } from "../../../core/index.js"; import { buildParameterDescriptors, getReturnType } from "../../utils/operation.js"; import { TypeExpression } from "../type-expression/type-expression.jsx"; -export const MethodContext = createContext<"method" | "static" | "class" | undefined>( - undefined, -); +export const MethodContext = createContext<"method" | "static" | "class" | undefined>(undefined); export const MethodProvider = MethodContext.Provider; export interface MethodPropsWithType extends Omit { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a1030610860..34da114652f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,8 +6,8 @@ settings: overrides: cross-spawn@>=7.0.0 <7.0.5: ^7.0.5 - '@alloy-js/core': ^0.21.0-dev.10 - '@alloy-js/python': ^0.2.0-dev.4 + '@alloy-js/core': ^0.21.0-dev.13 + '@alloy-js/python': ^0.2.0-dev.5 rollup: 4.49.0 importers: @@ -421,11 +421,11 @@ importers: specifier: ^0.20.0 version: 0.20.0 '@alloy-js/core': - specifier: ^0.21.0-dev.10 - version: 0.21.0-dev.10 + specifier: ^0.21.0-dev.13 + version: 0.21.0-dev.13 '@alloy-js/python': - specifier: ^0.2.0-dev.4 - version: 0.2.0-dev.4 + specifier: ^0.2.0-dev.5 + version: 0.2.0-dev.5 '@alloy-js/rollup-plugin': specifier: ^0.1.0 version: 0.1.0(@babel/core@7.28.4)(@types/babel__core@7.20.5)(rollup@4.49.0) @@ -666,8 +666,8 @@ importers: specifier: ^0.20.0 version: 0.20.0 '@alloy-js/core': - specifier: ^0.21.0-dev.10 - version: 0.21.0-dev.10 + specifier: ^0.21.0-dev.13 + version: 0.21.0-dev.13 '@alloy-js/rollup-plugin': specifier: ^0.1.0 version: 0.1.0(@babel/core@7.28.4)(@types/babel__core@7.20.5)(rollup@4.49.0) @@ -708,8 +708,8 @@ importers: packages/http-client-js: dependencies: '@alloy-js/core': - specifier: ^0.21.0-dev.10 - version: 0.21.0-dev.10 + specifier: ^0.21.0-dev.13 + version: 0.21.0-dev.13 '@alloy-js/typescript': specifier: ^0.20.0 version: 0.20.0 @@ -2219,8 +2219,8 @@ importers: packages/tspd: dependencies: '@alloy-js/core': - specifier: ^0.21.0-dev.10 - version: 0.21.0-dev.10 + specifier: ^0.21.0-dev.13 + version: 0.21.0-dev.13 '@alloy-js/markdown': specifier: ^0.20.0 version: 0.20.0 @@ -2676,8 +2676,8 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - '@alloy-js/core@0.21.0-dev.10': - resolution: {integrity: sha512-Gf8WTuGyK5HpTjdfuJcUavKPLXnzTKNS13058KUj7ZrVVSY69ZKyMfBxEXp73AYuE0ooAU6TE889mxihJjcYNg==} + '@alloy-js/core@0.21.0-dev.13': + resolution: {integrity: sha512-Hp2KpM8L3ni2f95OoAYI7vYB3Tu86WJYdYAv8PcgboyyFMt3zvl4WZlmNwxi7lgr86rYCGSuGhWFYw825pbWnA==} '@alloy-js/csharp@0.20.0': resolution: {integrity: sha512-Yn8oua43tVWYGN9Gt5DDtGUdLIB9io6/nL8dK4qDvL019w9uK7f3wosr+/JtSm14PuToN4jM1s7HNVzqh41KUA==} @@ -2685,8 +2685,8 @@ packages: '@alloy-js/markdown@0.20.0': resolution: {integrity: sha512-c1Q4dzUvWC4Bdoi6dRT9yAYVoCiqz3ZMClV8CHzEsgZYjjdS0S2ZWWmgxzS87rSDHSjmQIXJ4BcUZfKyfnMrFA==} - '@alloy-js/python@0.2.0-dev.4': - resolution: {integrity: sha512-VAa3sfQ2YpIk4aLJmWmn5/ctV90k/P90+7K5Y50RkX89DLIq42lVIIR7tNBaMCR96p7OdrOTTKlhp6uzi3IEhQ==} + '@alloy-js/python@0.2.0-dev.5': + resolution: {integrity: sha512-vVKvbcJegeGqEroxxtUbLeJJM4q+ihd+lQB83jhgOnn4ldCy04nlnymp5GW2ZUR1KQoEhMimzLe6pvVh8wPlHQ==} '@alloy-js/rollup-plugin@0.1.0': resolution: {integrity: sha512-MXR8mBdSh/pxMP8kIXAcMYKsm5yOWZ+igxcaRX1vBXFiHU4eK7gE/5q6Fk8Vdydh+MItWtgekwIhUWvcszdNFQ==} @@ -13564,7 +13564,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@alloy-js/core@0.21.0-dev.10': + '@alloy-js/core@0.21.0-dev.13': dependencies: '@vue/reactivity': 3.5.18 cli-table3: 0.6.5 @@ -13574,19 +13574,19 @@ snapshots: '@alloy-js/csharp@0.20.0': dependencies: - '@alloy-js/core': 0.21.0-dev.10 + '@alloy-js/core': 0.21.0-dev.13 change-case: 5.4.4 marked: 16.1.1 pathe: 2.0.3 '@alloy-js/markdown@0.20.0': dependencies: - '@alloy-js/core': 0.21.0-dev.10 + '@alloy-js/core': 0.21.0-dev.13 yaml: 2.8.0 - '@alloy-js/python@0.2.0-dev.4': + '@alloy-js/python@0.2.0-dev.5': dependencies: - '@alloy-js/core': 0.21.0-dev.10 + '@alloy-js/core': 0.21.0-dev.13 change-case: 5.4.4 pathe: 2.0.3 @@ -13603,7 +13603,7 @@ snapshots: '@alloy-js/typescript@0.20.0': dependencies: - '@alloy-js/core': 0.21.0-dev.10 + '@alloy-js/core': 0.21.0-dev.13 change-case: 5.4.4 pathe: 2.0.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 29529a2407b..a1490023a2a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -8,8 +8,8 @@ packages: overrides: cross-spawn@>=7.0.0 <7.0.5: ^7.0.5 - "@alloy-js/core": "^0.21.0-dev.10" - "@alloy-js/python": "^0.2.0-dev.4" + "@alloy-js/core": "^0.21.0-dev.13" + "@alloy-js/python": "^0.2.0-dev.5" rollup: 4.49.0 registry: https://registry.npmjs.org/ From 481025753afd8594d1b5f9bfecf5524cb6e7a6fd Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Wed, 8 Oct 2025 22:04:24 +0000 Subject: [PATCH 14/25] Accounting for feedback --- .../emitter-framework/src/python/builtins.ts | 2 +- .../class-declaration.test.tsx | 61 ++++++++++++++--- .../class-declaration/class-declaration.tsx | 65 +++++++++---------- .../class-declaration/class-member.tsx | 12 ++-- .../src/python/test-utils.tsx | 6 ++ 5 files changed, 97 insertions(+), 49 deletions(-) diff --git a/packages/emitter-framework/src/python/builtins.ts b/packages/emitter-framework/src/python/builtins.ts index 2f38ac26677..87ea1063a0b 100644 --- a/packages/emitter-framework/src/python/builtins.ts +++ b/packages/emitter-framework/src/python/builtins.ts @@ -35,6 +35,6 @@ export const decimalModule = createModule({ export const typingModule = createModule({ name: "typing", descriptor: { - ".": ["Any", "Literal", "NoReturn", "Protocol", "Tuple"], + ".": ["Any", "Literal", "Never", "NoReturn", "Protocol", "Tuple"], }, }); diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx index a9dbda167a3..4b1c645a939 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx @@ -52,6 +52,51 @@ describe("Python Class from model", () => { ); }); + it("creates a class with non-default values followed by default values", async () => { + const { program, Widget } = await Tester.compile(t.code` + + model ${t.model("Widget")} { + id: string; + description?: string = "This is a widget"; + } + `); + + expect(getOutput(program, [])).toRenderTo( + ` + from dataclasses import dataclass + + @dataclass + class Widget: + id: str + description: str = "This is a widget" + + `, + ); + }); + + // TODO: Change this test, as this isn't valid Python + it("creates a class with non-default values followed by default values", async () => { + const { program, Widget } = await Tester.compile(t.code` + + model ${t.model("Widget")} { + description?: string = "This is a widget"; + id: string; + } + `); + + expect(getOutput(program, [])).toRenderTo( + ` + from dataclasses import dataclass + + @dataclass + class Widget: + description: str = "This is a widget" + id: str + + `, + ); + }); + it("declares a class with multi line docs", async () => { const { program, Foo } = await Tester.compile(t.code` /** @@ -144,7 +189,7 @@ describe("Python Class from model", () => { ); }); - it("declares a class overriding docs with prebuilt JSX ClassDoc", async () => { + it("declares a class overriding docs with prebuilt ClassDoc", async () => { const { program, Foo } = await Tester.compile(t.code` /** * Base doc will be overridden @@ -175,7 +220,7 @@ describe("Python Class from model", () => { ); }); - it("declares a class from amodel with @doc", async () => { + it("declares a class from a model with @doc", async () => { const { program, Foo } = await Tester.compile(t.code` @doc("This is a test") model ${t.model("Foo")} { @@ -279,9 +324,6 @@ describe("Python Class from model", () => { expect(getOutput(program, [])).toRenderTo( ` - from dataclasses import dataclass - - @dataclass class Foo(list[str]): pass @@ -293,13 +335,13 @@ describe("Python Class from model", () => { const { program, Color, Widget } = await Tester.compile(t.code` union ${t.union("Color")} { red: "RED", - blue: "BLUE" + blue: "BLUE", } model ${t.model("Widget")} { id: string = "123"; weight: int32 = 100; - color: Color.blue + color: Color.blue; } `); @@ -326,7 +368,7 @@ describe("Python Class from model", () => { ); }); - it("renders an empty class based on a model with a never-typed member", async () => { + it("renders a never-typed member as typing.Never", async () => { const { program, Widget } = await Tester.compile(t.code` model ${t.model("Widget")} { property: never; @@ -335,10 +377,11 @@ describe("Python Class from model", () => { expect(getOutput(program, [])).toRenderTo(` from dataclasses import dataclass + from typing import Never @dataclass class Widget: - pass + property: Never `); }); diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx index 509b39b2c5e..4833d9541c3 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx @@ -1,14 +1,7 @@ import { abcModule, dataclassesModule } from "#python/builtins.js"; import { type Children, For, List, mapJoin, Show } from "@alloy-js/core"; import * as py from "@alloy-js/python"; -import { - type Interface, - isNeverType, - type Model, - type ModelProperty, - type Operation, - type RekeyableMap, -} from "@typespec/compiler"; +import { type Interface, type Model, type ModelProperty, type Operation } from "@typespec/compiler"; import type { Typekit } from "@typespec/compiler/typekit"; import { createRekeyableMap } from "@typespec/compiler/utils"; import { useTsp } from "../../../core/context/tsp-context.js"; @@ -33,26 +26,7 @@ function isTypedClassDeclarationProps( return "type" in props; } -/** - * Filters out model properties whose type is never. - * @param $ - The Typekit. - * @param type - The type to filter the model properties from. - * @returns The valid model properties. - */ -function getValidTypeMembers($: Typekit, type: Model | Interface): (ModelProperty | Operation)[] { - let typeMembers: RekeyableMap | undefined; - if ($.model.is(type)) { - typeMembers = $.model.getProperties(type); - } else { - typeMembers = createRekeyableMap((type as { operations: Map }).operations); - } - return Array.from(typeMembers.values()).filter((member) => { - if ($.modelProperty.is(member) && isNeverType(member.type)) { - return false; - } - return true; - }); -} +// (removed getValidTypeMembers; inline logic where needed) /** * Creates the doc element for the class declaration, either from the props or from the type. @@ -102,7 +76,14 @@ function createDocElement($: Typekit, props: ClassDeclarationProps) { */ function createClassBody($: Typekit, props: ClassDeclarationProps, abstract: boolean) { const validTypeMembers = isTypedClassDeclarationProps(props) - ? getValidTypeMembers($, props.type) + ? (() => { + if ($.model.is(props.type)) { + return Array.from($.model.getProperties(props.type).values()); + } else { + const ops = (props.type as { operations: Map }).operations; + return Array.from(createRekeyableMap(ops).values()); + } + })() : []; const hasValidMember = validTypeMembers.length > 0; const hasChildren = Array.isArray(props.children) @@ -219,7 +200,11 @@ export function ClassDeclaration(props: ClassDeclarationProps) { const refkeys = declarationRefkeys(props.refkey, props.type); let dataclass: any = null; if (!abstract) { - dataclass = dataclassesModule["."]["dataclass"]; + // Array-based models should be rendered as normal classes, not dataclasses (e.g., model Foo is Array) + const isArrayModel = $.model.is(props.type) && $.array.is(props.type); + if (!isArrayModel) { + dataclass = dataclassesModule["."]["dataclass"]; + } } const classBody = createClassBody($, props, abstract); @@ -233,8 +218,13 @@ export function ClassDeclaration(props: ClassDeclarationProps) { return ( <> - @{dataclass} - + + @{dataclass} + + + + + { + if ($.model.is(props.type)) { + return Array.from($.model.getProperties(props.type).values()); + } else { + const ops = (props.type as { operations: Map }).operations; + return Array.from(createRekeyableMap(ops).values()); + } + })(); // Throw error for models with additional properties (Record-based scenarios) if ($.model.is(props.type)) { diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx index d784e93c079..909a232b435 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx @@ -124,17 +124,17 @@ export function ClassMember(props: ClassMemberProps) { const doc = props.doc ?? $.type.getDoc(props.type); if ($.modelProperty.is(props.type)) { - // Never type is not supported - if (isNeverType(props.type.type)) { - return null; - } + // Map never-typed properties to typing.Never + const isNever = isNeverType(props.type.type); - const unpackedType = props.type.type as any; + const unpackedType = isNever ? (typingModule["."]["Never"] as any) : (props.type.type as any); const isOptional = props.optional ?? props.type.optional ?? false; const defaultValue: any = (props.type as any).defaultValue; const literalTypeNode = buildTypeNodeForProperty(unpackedType); const initializer = buildPrimitiveInitializerFromDefault(defaultValue, unpackedType, $); - const typeNode: Children = literalTypeNode ?? ; + const typeNode: Children = isNever + ? (typingModule["."]["Never"] as any) + : (literalTypeNode ?? ); const interfaceMemberProps = { doc, diff --git a/packages/emitter-framework/src/python/test-utils.tsx b/packages/emitter-framework/src/python/test-utils.tsx index 16163171173..65709974f65 100644 --- a/packages/emitter-framework/src/python/test-utils.tsx +++ b/packages/emitter-framework/src/python/test-utils.tsx @@ -12,6 +12,11 @@ import { export function getOutput(program: Program, children: Children[]): Children { const policy = py.createPythonNamePolicy(); + const printOptions = { + printWidth: 80, + tabWidth: 4, + insertFinalNewLine: false, + }; return ( {children} From 3ae121a559dd3e49ddeecbd622dd823d947bb3a5 Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Wed, 22 Oct 2025 15:44:05 +0000 Subject: [PATCH 15/25] Fix --- .../emitter-framework/src/python/builtins.ts | 13 +- .../class-declaration.test.tsx | 112 ++++++++++++------ .../class-declaration/class-declaration.tsx | 107 +++++++++++++---- .../class-declaration/class-member.tsx | 19 +-- .../class-declaration/class-method.test.tsx | 2 +- .../src/python/components/index.ts | 1 + .../type-alias-declaration.tsx | 10 +- .../type-expression/type-expression.test.tsx | 2 +- .../type-expression/type-expression.tsx | 40 ++++++- .../emitter-framework/src/python/index.ts | 1 + .../src/python/test-utils.tsx | 11 +- 11 files changed, 240 insertions(+), 78 deletions(-) diff --git a/packages/emitter-framework/src/python/builtins.ts b/packages/emitter-framework/src/python/builtins.ts index 2b91ed5f352..f1cf699cb9b 100644 --- a/packages/emitter-framework/src/python/builtins.ts +++ b/packages/emitter-framework/src/python/builtins.ts @@ -35,6 +35,17 @@ export const decimalModule = createModule({ export const typingModule = createModule({ name: "typing", descriptor: { - ".": ["Any", "Literal", "Never", "NoReturn", "Protocol", "TypeAlias", "Tuple"], + ".": [ + "Any", + "Literal", + "Never", + "NoReturn", + "Protocol", + "Tuple", + "Generic", + "TypeAlias", + "TypeVar", + "Optional", + ], }, }); diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx index 4b1c645a939..3392e4fac6a 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx @@ -1,4 +1,3 @@ -import { getOutput } from "#python/test-utils.jsx"; import { Tester } from "#test/test-host.js"; import { List } from "@alloy-js/core"; import * as py from "@alloy-js/python"; @@ -7,6 +6,8 @@ import { describe, expect, it } from "vitest"; import { ClassDeclaration } from "../../../../src/python/components/class-declaration/class-declaration.js"; import { Method } from "../../../../src/python/components/class-declaration/class-method.js"; import { EnumDeclaration } from "../../../../src/python/components/enum-declaration/enum-declaration.js"; +import { getOutput } from "../../test-utils.jsx"; +import { TypeAliasDeclaration } from "../type-alias-declaration/type-alias-declaration.jsx"; describe("Python Class from model", () => { it("creates a class", async () => { @@ -32,8 +33,9 @@ describe("Python Class from model", () => { ` from dataclasses import dataclass from typing import Literal + from typing import Optional - @dataclass + @dataclass(kw_only=True) class Widget: id: str weight: int @@ -41,7 +43,7 @@ describe("Python Class from model", () => { is_active: bool color: Literal["blue", "red"] promotional_price: float - description: str = "This is a widget" + description: Optional[str] = "This is a widget" created_at: int = 1717334400 tags: list[str] = ["tag1", "tag2"] is_deleted: bool = False @@ -64,11 +66,12 @@ describe("Python Class from model", () => { expect(getOutput(program, [])).toRenderTo( ` from dataclasses import dataclass + from typing import Optional - @dataclass + @dataclass(kw_only=True) class Widget: id: str - description: str = "This is a widget" + description: Optional[str] = "This is a widget" `, ); @@ -87,10 +90,11 @@ describe("Python Class from model", () => { expect(getOutput(program, [])).toRenderTo( ` from dataclasses import dataclass + from typing import Optional - @dataclass + @dataclass(kw_only=True) class Widget: - description: str = "This is a widget" + description: Optional[str] = "This is a widget" id: str `, @@ -112,7 +116,7 @@ describe("Python Class from model", () => { ` from dataclasses import dataclass - @dataclass + @dataclass(kw_only=True) class Foo: """ This is a test @@ -146,7 +150,7 @@ describe("Python Class from model", () => { ` from dataclasses import dataclass - @dataclass + @dataclass(kw_only=True) class Foo: """ This is an overridden doc comment @@ -176,7 +180,7 @@ describe("Python Class from model", () => { ` from dataclasses import dataclass - @dataclass + @dataclass(kw_only=True) class Foo: """ First paragraph @@ -207,7 +211,7 @@ describe("Python Class from model", () => { ` from dataclasses import dataclass - @dataclass + @dataclass(kw_only=True) class Foo: """ Alpha @@ -232,7 +236,7 @@ describe("Python Class from model", () => { ` from dataclasses import dataclass - @dataclass + @dataclass(kw_only=True) class Foo: """ This is a test @@ -258,7 +262,7 @@ describe("Python Class from model", () => { ` from dataclasses import dataclass - @dataclass + @dataclass(kw_only=True) class Foo: """ This is a test @@ -358,7 +362,7 @@ describe("Python Class from model", () => { BLUE = "BLUE" - @dataclass + @dataclass(kw_only=True) class Widget: id: str = "123" weight: int = 100 @@ -379,7 +383,7 @@ describe("Python Class from model", () => { from dataclasses import dataclass from typing import Never - @dataclass + @dataclass(kw_only=True) class Widget: property: Never @@ -400,7 +404,7 @@ describe("Python Class from model", () => { from dataclasses import dataclass from typing import Literal - @dataclass + @dataclass(kw_only=True) class MyOperations: id: str weight: int @@ -431,7 +435,7 @@ describe("Python Class from model", () => { from dataclasses import dataclass from typing import Literal - @dataclass + @dataclass(kw_only=True) class MyOperations: id: str weight: int @@ -463,14 +467,14 @@ describe("Python Class from model", () => { from dataclasses import dataclass from typing import Literal - @dataclass + @dataclass(kw_only=True) class Widget: id: str weight: int color: Literal["blue", "red"] - @dataclass + @dataclass(kw_only=True) class ErrorWidget(Widget): code: int message: str @@ -490,8 +494,9 @@ describe("Python Class from interface", () => { expect(getOutput(program, [])).toRenderTo(` from abc import ABC from abc import abstractmethod + from dataclasses import dataclass - + @dataclass(kw_only=True) class WidgetOperations(ABC): @abstractmethod def get_name(self, id: str) -> str: @@ -523,12 +528,12 @@ describe("Python Class from interface", () => { from abc import abstractmethod from dataclasses import dataclass - @dataclass + @dataclass(kw_only=True) class Foo: name: str - + @dataclass(kw_only=True) class WidgetOperations(ABC): @abstractmethod def get_name(self, foo: Foo) -> str: @@ -577,7 +582,7 @@ describe("Python Class from interface", () => { from dataclasses import dataclass from typing import Literal - + @dataclass(kw_only=True) class WidgetOperations(ABC): """ Operations for Widget @@ -591,7 +596,7 @@ describe("Python Class from interface", () => { - @dataclass + @dataclass(kw_only=True) class Widget: id: str weight: int @@ -630,7 +635,7 @@ describe("Python Class from interface", () => { from dataclasses import dataclass from typing import Literal - + @dataclass(kw_only=True) class WidgetOperations(ABC): @abstractmethod def get_name(self, id: str) -> Widget: @@ -638,7 +643,7 @@ describe("Python Class from interface", () => { - + @dataclass(kw_only=True) class WidgetOperationsExtended(ABC): @abstractmethod def get_name(self, id: str) -> Widget: @@ -650,7 +655,7 @@ describe("Python Class from interface", () => { - @dataclass + @dataclass(kw_only=True) class Widget: id: str weight: int @@ -682,7 +687,7 @@ describe("Python Class overrides", () => { ).toRenderTo(` from dataclasses import dataclass - @dataclass + @dataclass(kw_only=True) class WidgetOperations: id: str weight: int @@ -718,7 +723,7 @@ describe("Python Class overrides", () => { ).toRenderTo(` from dataclasses import dataclass - @dataclass + @dataclass(kw_only=True) class WidgetOperations: id: str weight: int @@ -754,7 +759,7 @@ describe("Python Class overrides", () => { ).toRenderTo(` from dataclasses import dataclass - @dataclass + @dataclass(kw_only=True) class WidgetOperations: id: str weight: int @@ -791,7 +796,7 @@ describe("Python Class overrides", () => { ).toRenderTo(` from dataclasses import dataclass - @dataclass + @dataclass(kw_only=True) class WidgetOperations: id: str weight: int @@ -817,8 +822,9 @@ describe("Python Class overrides", () => { expect(getOutput(program, [])).toRenderTo(` from abc import ABC from abc import abstractmethod + from dataclasses import dataclass - + @dataclass(kw_only=True) class WidgetOperations(ABC): @abstractmethod def get_name(self, id: str) -> str: @@ -839,8 +845,9 @@ describe("Python Class overrides", () => { .toRenderTo(` from abc import ABC from abc import abstractmethod + from dataclasses import dataclass - + @dataclass(kw_only=True) class WidgetOperations(ABC): @abstractmethod def get_name(self, id: str) -> str: @@ -861,8 +868,9 @@ describe("Python Class overrides", () => { .toRenderTo(` from abc import ABC from abc import abstractmethod + from dataclasses import dataclass - + @dataclass(kw_only=True) class WidgetOperations(ABC): @classmethod @abstractmethod @@ -884,8 +892,9 @@ describe("Python Class overrides", () => { .toRenderTo(` from abc import ABC from abc import abstractmethod + from dataclasses import dataclass - + @dataclass(kw_only=True) class WidgetOperations(ABC): @staticmethod @abstractmethod @@ -895,4 +904,37 @@ describe("Python Class overrides", () => { `); }); + + it("Adds a Generic import if the model has template parameters", async () => { + const { program, Response, StringResponse } = await Tester.compile(t.code` + model ${t.model("Response")} { + data: T; + status: string; + } + + alias ${t.type("StringResponse")} = Response; + `); + + expect( + getOutput(program, [ + , + , + ]), + ).toRenderTo(` + from dataclasses import dataclass + from typing import Generic + from typing import TypeAlias + from typing import TypeVar + + t = TypeVar("T") + + @dataclass(kw_only=True) + class Response(Generic[T]): + data: T + status: str + + + StringResponse: TypeAlias = Response[str] + `); + }); }); diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx index 4833d9541c3..8f81fb09799 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx @@ -1,7 +1,8 @@ -import { abcModule, dataclassesModule } from "#python/builtins.js"; -import { type Children, For, List, mapJoin, Show } from "@alloy-js/core"; +import { abcModule, dataclassesModule, typingModule } from "#python/builtins.js"; +import { type Children, code, For, List, mapJoin, Show } from "@alloy-js/core"; import * as py from "@alloy-js/python"; import { type Interface, type Model, type ModelProperty, type Operation } from "@typespec/compiler"; +import type { TemplateDeclarationNode } from "@typespec/compiler/ast"; import type { Typekit } from "@typespec/compiler/typekit"; import { createRekeyableMap } from "@typespec/compiler/utils"; import { useTsp } from "../../../core/context/tsp-context.js"; @@ -152,19 +153,72 @@ function getExtendsType($: Typekit, type: Model | Interface): Children | undefin * @param abstract - Whether the class is abstract. * @returns The bases type for the class declaration. */ -function createBasesType($: Typekit, props: ClassDeclarationProps, abstract: boolean) { - const globalBasesType = isTypedClassDeclarationProps(props) - ? getExtendsType($, props.type) - : undefined; - let basesType = props.bases ? props.bases : (globalBasesType ?? undefined); +function createBasesType( + $: Typekit, + props: ClassDeclarationProps, + abstract: boolean, + extraBases: Children[] = [], +) { + if (isTypedClassDeclarationProps(props)) { + const extend = getExtendsType($, props.type); + if (extend) { + extraBases.push(extend); + } + } + const allBases = (props.bases ? props.bases : []).concat(extraBases); + const basesType = allBases.length > 0 ? allBases : undefined; if (!abstract) return basesType; const abcBase = abcModule["."]["ABC"]; - if (Array.isArray(basesType)) return [abcBase, ...basesType]; - if (basesType != null) return [abcBase, basesType]; + if (Array.isArray(basesType)) return [...basesType, abcBase]; + if (basesType != null) return [basesType, abcBase]; return [abcBase]; } +/** + * Builds TypeVar declarations and the Generic[...] base for templated types, + * in case the type is a model with template parameters. + */ +function buildTypeVarsAndGenericBase( + $: Typekit, + type: Model | Interface, +): { typeVars: Children | null; genericBase?: Children } { + if (!("isFinished" in type)) { + return { typeVars: null }; + } + const templateParameters = (type.node as TemplateDeclarationNode)?.templateParameters; + if (type.isFinished || !templateParameters) { + return { typeVars: null }; + } + + const typeVars = ( + <> + + {(node) => { + const typeVar = ( + ]} + /> + ); + return ; + }} + + + ); + + const typeArgs: Children[] = []; + for (const templateParameter of templateParameters) { + typeArgs.push(code`${templateParameter.id.sv}`); + } + const genericBase = + typeArgs.length > 0 ? ( + + ) : undefined; + + return { typeVars, genericBase }; +} + /** * Creates the class declaration for the class. * @param props - The props for the class declaration. @@ -174,10 +228,21 @@ export function ClassDeclaration(props: ClassDeclarationProps) { const { $ } = useTsp(); // If we are explicitly overriding the class as abstract or the type is not a model, we need to create an abstract class - let abstract = + const abstract = ("abstract" in props && props.abstract) || ("type" in props && !$.model.is(props.type)); - let docElement = createDocElement($, props); - let basesType = createBasesType($, props, abstract); + const docElement = createDocElement($, props); + + const extraBases = []; + let typeVars = null; + if (isTypedClassDeclarationProps(props)) { + const generic = buildTypeVarsAndGenericBase($, props.type); + typeVars = generic.typeVars; + if (generic.genericBase) { + extraBases.push(generic.genericBase); + } + } + + const basesType = createBasesType($, props, abstract, extraBases); if (!isTypedClassDeclarationProps(props)) { return ( @@ -199,12 +264,10 @@ export function ClassDeclaration(props: ClassDeclarationProps) { const refkeys = declarationRefkeys(props.refkey, props.type); let dataclass: any = null; - if (!abstract) { - // Array-based models should be rendered as normal classes, not dataclasses (e.g., model Foo is Array) - const isArrayModel = $.model.is(props.type) && $.array.is(props.type); - if (!isArrayModel) { - dataclass = dataclassesModule["."]["dataclass"]; - } + // Array-based models should be rendered as normal classes, not dataclasses (e.g., model Foo is Array) + const isArrayModel = $.model.is(props.type) && $.array.is(props.type); + if (!isArrayModel) { + dataclass = dataclassesModule["."]["dataclass"]; } const classBody = createClassBody($, props, abstract); @@ -218,11 +281,13 @@ export function ClassDeclaration(props: ClassDeclarationProps) { return ( <> - - @{dataclass} + + {typeVars} + - + + @{dataclass}(kw_only=True) diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx index 909a232b435..d1ab297bca8 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx @@ -1,7 +1,7 @@ import { typingModule } from "#python/builtins.js"; import { type Children } from "@alloy-js/core"; import * as py from "@alloy-js/python"; -import { isNeverType, type ModelProperty, type Operation } from "@typespec/compiler"; +import { type ModelProperty, type Operation } from "@typespec/compiler"; import { useTsp } from "../../../core/context/tsp-context.js"; import { efRefkey } from "../../utils/refkey.js"; import { Atom } from "../atom/atom.jsx"; @@ -125,16 +125,21 @@ export function ClassMember(props: ClassMemberProps) { if ($.modelProperty.is(props.type)) { // Map never-typed properties to typing.Never - const isNever = isNeverType(props.type.type); - const unpackedType = isNever ? (typingModule["."]["Never"] as any) : (props.type.type as any); + const unpackedType = props.type.type; const isOptional = props.optional ?? props.type.optional ?? false; - const defaultValue: any = (props.type as any).defaultValue; + const defaultValue = props.type.defaultValue; const literalTypeNode = buildTypeNodeForProperty(unpackedType); const initializer = buildPrimitiveInitializerFromDefault(defaultValue, unpackedType, $); - const typeNode: Children = isNever - ? (typingModule["."]["Never"] as any) - : (literalTypeNode ?? ); + const unpackedTypeNode: Children = literalTypeNode ?? ; + const typeNode = isOptional ? ( + + ) : ( + unpackedTypeNode + ); const interfaceMemberProps = { doc, diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-method.test.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-method.test.tsx index 5eb7f4f9691..199cb034563 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-method.test.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-method.test.tsx @@ -1,10 +1,10 @@ -import { getOutput } from "#python/test-utils.jsx"; import { Tester } from "#test/test-host.js"; import { getProgram } from "#test/utils.js"; import { t } from "@typespec/compiler/testing"; import { describe, expect, it } from "vitest"; import { ClassDeclaration } from "../../../../src/python/components/class-declaration/class-declaration.js"; import { Method } from "../../../../src/python/components/class-declaration/class-method.js"; +import { getOutput } from "../../test-utils.jsx"; describe("interface methods with a `type` prop", () => { it("creates a class method from an interface method", async () => { diff --git a/packages/emitter-framework/src/python/components/index.ts b/packages/emitter-framework/src/python/components/index.ts index 0d60052da44..2fc1ca2d191 100644 --- a/packages/emitter-framework/src/python/components/index.ts +++ b/packages/emitter-framework/src/python/components/index.ts @@ -1,4 +1,5 @@ export * from "./atom/atom.jsx"; export * from "./class-declaration/class-declaration.jsx"; +export * from "./enum-declaration/enum-declaration.jsx"; export * from "./function-declaration/function-declaration.jsx"; export * from "./type-declaration/type-declaration.jsx"; diff --git a/packages/emitter-framework/src/python/components/type-alias-declaration/type-alias-declaration.tsx b/packages/emitter-framework/src/python/components/type-alias-declaration/type-alias-declaration.tsx index 3e39bc66dca..50f13e14b0d 100644 --- a/packages/emitter-framework/src/python/components/type-alias-declaration/type-alias-declaration.tsx +++ b/packages/emitter-framework/src/python/components/type-alias-declaration/type-alias-declaration.tsx @@ -1,4 +1,5 @@ import { useTsp } from "#core/context/index.js"; +import { namekey } from "@alloy-js/core"; import * as py from "@alloy-js/python"; import type { Type } from "@typespec/compiler"; import { reportDiagnostic } from "../../../lib.js"; @@ -29,7 +30,14 @@ export function TypeAliasDeclaration(props: TypedAliasDeclarationProps) { const doc = props.doc ?? $.type.getDoc(props.type); const refkeys = declarationRefkeys(props.refkey, props.type); - const name = py.usePythonNamePolicy().getName(originalName, "variable"); + let name: any; + if ("templateMapper" in (props.type as any) && (props.type as any).templateMapper) { + // Template instance alias: use the alias name (like StringResponse in alias StringResponse = Response) + const plausibleName = $.type.getPlausibleName(props.type as any); + name = namekey(plausibleName, { ignoreNamePolicy: true }); + } else { + name = py.usePythonNamePolicy().getName(originalName, "variable"); + } // TODO: See how we will handle this kind of scenario: // type Foo { // bar(id: String): BarResponse diff --git a/packages/emitter-framework/src/python/components/type-expression/type-expression.test.tsx b/packages/emitter-framework/src/python/components/type-expression/type-expression.test.tsx index e28a31325d6..70283934020 100644 --- a/packages/emitter-framework/src/python/components/type-expression/type-expression.test.tsx +++ b/packages/emitter-framework/src/python/components/type-expression/type-expression.test.tsx @@ -12,7 +12,7 @@ describe("map Typespec types to Python built-in types", () => { ["boolean", "bool"], ["null", "None"], ["void", "None"], - ["never", "NoReturn", "from typing import NoReturn"], + ["never", "Never", "from typing import Never"], ["bytes", "bytes"], ["numeric", "number"], ["integer", "int"], diff --git a/packages/emitter-framework/src/python/components/type-expression/type-expression.tsx b/packages/emitter-framework/src/python/components/type-expression/type-expression.tsx index 6b9d27cef92..838e2c4b118 100644 --- a/packages/emitter-framework/src/python/components/type-expression/type-expression.tsx +++ b/packages/emitter-framework/src/python/components/type-expression/type-expression.tsx @@ -1,9 +1,17 @@ import { Experimental_OverridableComponent } from "#core/components/index.js"; import { useTsp } from "#core/context/index.js"; import { reportPythonDiagnostic } from "#python/lib.js"; -import { For } from "@alloy-js/core"; +import { code, For } from "@alloy-js/core"; import * as py from "@alloy-js/python"; -import type { IntrinsicType, Model, Scalar, Type } from "@typespec/compiler"; +import { + isNeverType, + type IntrinsicType, + type Model, + type Scalar, + type TemplatedTypeBase, + type Type, +} from "@typespec/compiler"; +import type { TemplateParameterDeclarationNode } from "@typespec/compiler/ast"; import type { Typekit } from "@typespec/compiler/typekit"; import { datetimeModule, decimalModule, typingModule } from "../../builtins.js"; import { efRefkey } from "../../utils/refkey.js"; @@ -36,6 +44,9 @@ export function TypeExpression(props: TypeExpressionProps) { switch (type.kind) { case "Scalar": // Custom types based on primitives (Intrinsics) case "Intrinsic": // Language primitives like `string`, `number`, etc. + if (isNeverType(type)) { + return typingModule["."]["Never"]; + } return <>{getScalarIntrinsicExpression($, type)}; case "Boolean": case "Number": @@ -64,17 +75,31 @@ export function TypeExpression(props: TypeExpressionProps) { return ; } + if (isTemplateVar(type)) { + // Handles scenarios like Response, rendering Response[str] + const args = (type.templateMapper?.args ?? []) as Type[]; + const typeArgs = args.map((a) => ); + const baseName = py.usePythonNamePolicy().getName((type as Model).name, "class"); + return ( + <> + {baseName}[ + + {(a) => a} + + ] + + ); + } reportPythonDiagnostic($.program, { code: "python-unsupported-type", target: type }); break; + case "TemplateParameter": + return code`${String((type.node as TemplateParameterDeclarationNode).id.sv)}`; - // TODO: Models will be implemented separately - // return ; // TODO: Functions will be implemented separately // case "Operation": // return ; default: reportPythonDiagnostic($.program, { code: "python-unsupported-type", target: type }); - return "any"; } } @@ -157,7 +182,12 @@ function getScalarIntrinsicExpression($: Typekit, type: Scalar | IntrinsicType): return pythonType; } +function isTemplateVar(type: Type): boolean { + return (type as TemplatedTypeBase).templateMapper !== undefined; +} + function isDeclaration($: Typekit, type: Type): boolean { + if (isTemplateVar(type)) return false; switch (type.kind) { case "Namespace": case "Interface": diff --git a/packages/emitter-framework/src/python/index.ts b/packages/emitter-framework/src/python/index.ts index abfe9e01158..5308987703b 100644 --- a/packages/emitter-framework/src/python/index.ts +++ b/packages/emitter-framework/src/python/index.ts @@ -1 +1,2 @@ +export * from "./builtins.js"; export * from "./components/index.js"; diff --git a/packages/emitter-framework/src/python/test-utils.tsx b/packages/emitter-framework/src/python/test-utils.tsx index 65709974f65..dca020ed5af 100644 --- a/packages/emitter-framework/src/python/test-utils.tsx +++ b/packages/emitter-framework/src/python/test-utils.tsx @@ -10,13 +10,13 @@ import { typingModule, } from "./builtins.js"; +export const renderOptions = { + printWidth: 80, + tabWidth: 4, +}; + export function getOutput(program: Program, children: Children[]): Children { const policy = py.createPythonNamePolicy(); - const printOptions = { - printWidth: 80, - tabWidth: 4, - insertFinalNewLine: false, - }; return ( {children} From 5458b72125efa6bfec6924884077781c657b71c8 Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Fri, 31 Oct 2025 19:07:46 +0000 Subject: [PATCH 16/25] Update --- pnpm-lock.yaml | 44 ++++++++++++++++++++++---------------------- pnpm-workspace.yaml | 4 ++-- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 34da114652f..1995f4de157 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,8 +6,8 @@ settings: overrides: cross-spawn@>=7.0.0 <7.0.5: ^7.0.5 - '@alloy-js/core': ^0.21.0-dev.13 - '@alloy-js/python': ^0.2.0-dev.5 + '@alloy-js/core': ^0.22.0-dev.3 + '@alloy-js/python': 0.3.0-dev.2 rollup: 4.49.0 importers: @@ -421,11 +421,11 @@ importers: specifier: ^0.20.0 version: 0.20.0 '@alloy-js/core': - specifier: ^0.21.0-dev.13 - version: 0.21.0-dev.13 + specifier: ^0.22.0-dev.3 + version: 0.22.0-dev.3 '@alloy-js/python': - specifier: ^0.2.0-dev.5 - version: 0.2.0-dev.5 + specifier: 0.3.0-dev.2 + version: 0.3.0-dev.2 '@alloy-js/rollup-plugin': specifier: ^0.1.0 version: 0.1.0(@babel/core@7.28.4)(@types/babel__core@7.20.5)(rollup@4.49.0) @@ -666,8 +666,8 @@ importers: specifier: ^0.20.0 version: 0.20.0 '@alloy-js/core': - specifier: ^0.21.0-dev.13 - version: 0.21.0-dev.13 + specifier: ^0.22.0-dev.3 + version: 0.22.0-dev.3 '@alloy-js/rollup-plugin': specifier: ^0.1.0 version: 0.1.0(@babel/core@7.28.4)(@types/babel__core@7.20.5)(rollup@4.49.0) @@ -708,8 +708,8 @@ importers: packages/http-client-js: dependencies: '@alloy-js/core': - specifier: ^0.21.0-dev.13 - version: 0.21.0-dev.13 + specifier: ^0.22.0-dev.3 + version: 0.22.0-dev.3 '@alloy-js/typescript': specifier: ^0.20.0 version: 0.20.0 @@ -2219,8 +2219,8 @@ importers: packages/tspd: dependencies: '@alloy-js/core': - specifier: ^0.21.0-dev.13 - version: 0.21.0-dev.13 + specifier: ^0.22.0-dev.3 + version: 0.22.0-dev.3 '@alloy-js/markdown': specifier: ^0.20.0 version: 0.20.0 @@ -2676,8 +2676,8 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - '@alloy-js/core@0.21.0-dev.13': - resolution: {integrity: sha512-Hp2KpM8L3ni2f95OoAYI7vYB3Tu86WJYdYAv8PcgboyyFMt3zvl4WZlmNwxi7lgr86rYCGSuGhWFYw825pbWnA==} + '@alloy-js/core@0.22.0-dev.3': + resolution: {integrity: sha512-VmiLT1vugNMo+SNaO3B4UOoP32K8FbqB9zZW07+TFUcUrUEA3N7g4pOgBxizr6kKYOXOp9rITa10ixMuCmJhBg==} '@alloy-js/csharp@0.20.0': resolution: {integrity: sha512-Yn8oua43tVWYGN9Gt5DDtGUdLIB9io6/nL8dK4qDvL019w9uK7f3wosr+/JtSm14PuToN4jM1s7HNVzqh41KUA==} @@ -2685,8 +2685,8 @@ packages: '@alloy-js/markdown@0.20.0': resolution: {integrity: sha512-c1Q4dzUvWC4Bdoi6dRT9yAYVoCiqz3ZMClV8CHzEsgZYjjdS0S2ZWWmgxzS87rSDHSjmQIXJ4BcUZfKyfnMrFA==} - '@alloy-js/python@0.2.0-dev.5': - resolution: {integrity: sha512-vVKvbcJegeGqEroxxtUbLeJJM4q+ihd+lQB83jhgOnn4ldCy04nlnymp5GW2ZUR1KQoEhMimzLe6pvVh8wPlHQ==} + '@alloy-js/python@0.3.0-dev.2': + resolution: {integrity: sha512-bdWbEjvAVQwWd0Utf4PTuAuhpnS4kmz1wT5nsCUfzLveTz9/xJFDAPg2CUip0c5glT03gbF+dP4Sl8Rg2nYq+Q==} '@alloy-js/rollup-plugin@0.1.0': resolution: {integrity: sha512-MXR8mBdSh/pxMP8kIXAcMYKsm5yOWZ+igxcaRX1vBXFiHU4eK7gE/5q6Fk8Vdydh+MItWtgekwIhUWvcszdNFQ==} @@ -13564,7 +13564,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@alloy-js/core@0.21.0-dev.13': + '@alloy-js/core@0.22.0-dev.3': dependencies: '@vue/reactivity': 3.5.18 cli-table3: 0.6.5 @@ -13574,19 +13574,19 @@ snapshots: '@alloy-js/csharp@0.20.0': dependencies: - '@alloy-js/core': 0.21.0-dev.13 + '@alloy-js/core': 0.22.0-dev.3 change-case: 5.4.4 marked: 16.1.1 pathe: 2.0.3 '@alloy-js/markdown@0.20.0': dependencies: - '@alloy-js/core': 0.21.0-dev.13 + '@alloy-js/core': 0.22.0-dev.3 yaml: 2.8.0 - '@alloy-js/python@0.2.0-dev.5': + '@alloy-js/python@0.3.0-dev.2': dependencies: - '@alloy-js/core': 0.21.0-dev.13 + '@alloy-js/core': 0.22.0-dev.3 change-case: 5.4.4 pathe: 2.0.3 @@ -13603,7 +13603,7 @@ snapshots: '@alloy-js/typescript@0.20.0': dependencies: - '@alloy-js/core': 0.21.0-dev.13 + '@alloy-js/core': 0.22.0-dev.3 change-case: 5.4.4 pathe: 2.0.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a1490023a2a..e3c1128b878 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -8,8 +8,8 @@ packages: overrides: cross-spawn@>=7.0.0 <7.0.5: ^7.0.5 - "@alloy-js/core": "^0.21.0-dev.13" - "@alloy-js/python": "^0.2.0-dev.5" + "@alloy-js/core": "^0.22.0-dev.3" + "@alloy-js/python": "0.3.0-dev.2" rollup: 4.49.0 registry: https://registry.npmjs.org/ From e813cc0d880fcdadde30bc3d0b574c2a10faa018 Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Fri, 31 Oct 2025 19:18:16 +0000 Subject: [PATCH 17/25] Rebase --- .../emitter-framework/src/python/builtins.ts | 14 +++++- pnpm-lock.yaml | 43 +++++++++---------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/packages/emitter-framework/src/python/builtins.ts b/packages/emitter-framework/src/python/builtins.ts index f38ea358f7e..d5ee1fb5e18 100644 --- a/packages/emitter-framework/src/python/builtins.ts +++ b/packages/emitter-framework/src/python/builtins.ts @@ -35,6 +35,18 @@ export const decimalModule = createModule({ export const typingModule = createModule({ name: "typing", descriptor: { - ".": ["Any", "Callable", "Generic", "Literal", "Never", "NoReturn", "Optional", "Protocol", "TypeAlias", "TypeVar", "Tuple"], + ".": [ + "Any", + "Callable", + "Generic", + "Literal", + "Never", + "NoReturn", + "Optional", + "Protocol", + "TypeAlias", + "TypeVar", + "Tuple", + ], }, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1995f4de157..43fadc78347 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,9 +6,10 @@ settings: overrides: cross-spawn@>=7.0.0 <7.0.5: ^7.0.5 + rollup: 4.49.0 '@alloy-js/core': ^0.22.0-dev.3 '@alloy-js/python': 0.3.0-dev.2 - rollup: 4.49.0 + '@alloy-js/babel-plugin': 0.2.1 importers: @@ -2663,8 +2664,8 @@ packages: peerDependencies: '@babel/core': ^7.24.7 - '@alloy-js/babel-plugin@0.2.0': - resolution: {integrity: sha512-cTcRePmUWU5rQtXp89XQsyggWX72SjfWADoz3meieuvgPE/BOMXC7QU9VHscZCXyRbJKRX/S4fnRiO34fe1N4w==} + '@alloy-js/babel-plugin@0.2.1': + resolution: {integrity: sha512-DTaigVOvxQs/S3yhpkn6V+WGxtOADQUZcSeSD4iDDvcAJnMXD7P4eJ6wkYTJ5x76abbcman0GBkNIevkcU1ikw==} peerDependencies: '@babel/core': ^7.24.7 @@ -2911,10 +2912,6 @@ packages: resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.18.6': - resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.9': resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} @@ -13522,25 +13519,29 @@ snapshots: transitivePeerDependencies: - supports-color - '@alloy-js/babel-plugin@0.2.0(@babel/core@7.28.0)': + '@alloy-js/babel-plugin@0.2.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/generator': 7.28.0 - '@babel/helper-module-imports': 7.18.6 + '@babel/generator': 7.28.3 + '@babel/helper-module-imports': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) - '@babel/types': 7.28.1 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color - '@alloy-js/babel-plugin@0.2.0(@babel/core@7.28.4)': + '@alloy-js/babel-plugin@0.2.1(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 - '@babel/generator': 7.28.0 - '@babel/helper-module-imports': 7.18.6 + '@babel/generator': 7.28.3 + '@babel/helper-module-imports': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) - '@babel/types': 7.28.1 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color '@alloy-js/babel-preset@0.2.1(@babel/core@7.28.0)': dependencies: - '@alloy-js/babel-plugin': 0.2.0(@babel/core@7.28.0) + '@alloy-js/babel-plugin': 0.2.1(@babel/core@7.28.0) '@alloy-js/babel-plugin-jsx-dom-expressions': 0.39.0(@babel/core@7.28.0) transitivePeerDependencies: - '@babel/core' @@ -13548,7 +13549,7 @@ snapshots: '@alloy-js/babel-preset@0.2.1(@babel/core@7.28.4)': dependencies: - '@alloy-js/babel-plugin': 0.2.0(@babel/core@7.28.4) + '@alloy-js/babel-plugin': 0.2.1(@babel/core@7.28.4) '@alloy-js/babel-plugin-jsx-dom-expressions': 0.39.0(@babel/core@7.28.4) transitivePeerDependencies: - '@babel/core' @@ -14081,10 +14082,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.18.6': - dependencies: - '@babel/types': 7.28.1 - '@babel/helper-module-imports@7.25.9': dependencies: '@babel/traverse': 7.28.0 @@ -19461,7 +19458,7 @@ snapshots: algoliasearch: 4.25.2 clipanion: 4.0.0-rc.4(typanion@3.14.0) diff: 5.2.0 - ink: 3.2.0(@types/react@18.3.23)(react@18.3.1) + ink: 3.2.0(@types/react@18.3.23)(react@17.0.2) ink-text-input: 4.0.3(ink@3.2.0(@types/react@18.3.23)(react@17.0.2))(react@17.0.2) react: 17.0.2 semver: 7.7.2 @@ -19609,7 +19606,7 @@ snapshots: '@yarnpkg/parsers': 3.0.3 '@yarnpkg/plugin-git': 3.1.2(@yarnpkg/core@4.4.2(typanion@3.14.0))(typanion@3.14.0) clipanion: 4.0.0-rc.4(typanion@3.14.0) - ink: 3.2.0(@types/react@18.3.23)(react@17.0.2) + ink: 3.2.0(@types/react@18.3.23)(react@18.3.1) lodash: 4.17.21 react: 17.0.2 semver: 7.7.2 From 5e61e05b0766488693607d4d0c3614599cf20731 Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Fri, 31 Oct 2025 20:30:10 +0000 Subject: [PATCH 18/25] Fix tests --- .../class-declaration/class-declaration.test.tsx | 7 +++++++ .../class-declaration/class-method.test.tsx | 6 +++--- .../src/python/utils/operation.ts | 16 +++++++++++++++- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx index 3392e4fac6a..ee97cdde326 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx @@ -122,6 +122,7 @@ describe("Python Class from model", () => { This is a test with multiple lines """ + known_prop: str `, @@ -156,6 +157,7 @@ describe("Python Class from model", () => { This is an overridden doc comment with multiple lines """ + known_prop: str `, @@ -187,6 +189,7 @@ describe("Python Class from model", () => { Second paragraph """ + known_prop: str `, @@ -218,6 +221,7 @@ describe("Python Class from model", () => { Beta """ + known_prop: str `, @@ -241,6 +245,7 @@ describe("Python Class from model", () => { """ This is a test """ + known_prop: str `, @@ -267,6 +272,7 @@ describe("Python Class from model", () => { """ This is a test """ + # This is a known property known_prop: str @@ -587,6 +593,7 @@ describe("Python Class from interface", () => { """ Operations for Widget """ + @abstractmethod def get_name(self, id: str) -> Widget: """ diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-method.test.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-method.test.tsx index 199cb034563..6bf4fcfb9f7 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-method.test.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-method.test.tsx @@ -106,7 +106,7 @@ describe("interface methods with a `type` prop", () => { ]), ).toRenderTo(` class BasicInterface: - def get_name(self, id: str, foo: string) -> str: + def get_name(self, id: str, foo: str) -> str: pass @@ -130,7 +130,7 @@ describe("interface methods with a `type` prop", () => { ]), ).toRenderTo(` class BasicInterface: - def get_name(self, foo: string, id: str) -> str: + def get_name(self, foo: str, id: str) -> str: pass @@ -157,7 +157,7 @@ describe("interface methods with a `type` prop", () => { ]), ).toRenderTo(` class BasicInterface: - def get_name(self, foo: string, bar: number) -> str: + def get_name(self, foo: str, bar: float) -> str: pass diff --git a/packages/emitter-framework/src/python/utils/operation.ts b/packages/emitter-framework/src/python/utils/operation.ts index fa1a7cda09a..b584682c3f7 100644 --- a/packages/emitter-framework/src/python/utils/operation.ts +++ b/packages/emitter-framework/src/python/utils/operation.ts @@ -1,12 +1,26 @@ import { typingModule } from "#python/builtins.js"; import { refkey, type Children, type Refkey } from "@alloy-js/core"; import * as py from "@alloy-js/python"; -import type { Model, ModelProperty } from "@typespec/compiler"; +import type { Model, ModelProperty, Operation, Type } from "@typespec/compiler"; import { useTsp } from "../../core/index.js"; import { Atom } from "../components/atom/atom.jsx"; import { TypeExpression } from "../components/type-expression/type-expression.jsx"; import { efRefkey } from "./refkey.js"; +export function getReturnType( + type: Operation, + options: { skipErrorFiltering: boolean } = { skipErrorFiltering: false }, +): Type { + const { $ } = useTsp(); + let returnType = type.returnType; + + if (!options.skipErrorFiltering && type.returnType.kind === "Union") { + returnType = $.union.filter(type.returnType, (variant) => !$.type.isError(variant.type)); + } + + return returnType; +} + export interface BuildParameterDescriptorsOptions { params?: (py.ParameterDescriptor | string)[]; mode?: "prepend" | "append" | "replace"; From b3536b833dcd6ea35f76650b615ea671afbc796a Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Fri, 31 Oct 2025 22:24:08 +0000 Subject: [PATCH 19/25] Fix --- .../emitter-framework/src/python/builtins.ts | 7 ------ .../class-declaration/class-declaration.tsx | 23 ++++++++----------- .../type-expression/type-expression.tsx | 10 ++++++++ .../src/python/test-utils.tsx | 10 ++------ pnpm-lock.yaml | 16 ++++++------- pnpm-workspace.yaml | 2 +- 6 files changed, 30 insertions(+), 38 deletions(-) diff --git a/packages/emitter-framework/src/python/builtins.ts b/packages/emitter-framework/src/python/builtins.ts index d5ee1fb5e18..f1faf066382 100644 --- a/packages/emitter-framework/src/python/builtins.ts +++ b/packages/emitter-framework/src/python/builtins.ts @@ -18,13 +18,6 @@ export const datetimeModule = createModule({ }, }); -export const dataclassesModule = createModule({ - name: "dataclasses", - descriptor: { - ".": ["dataclass", "field"], - }, -}); - export const decimalModule = createModule({ name: "decimal", descriptor: { diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx index 8f81fb09799..d98b1ef9e96 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx @@ -1,4 +1,4 @@ -import { abcModule, dataclassesModule, typingModule } from "#python/builtins.js"; +import { abcModule, typingModule } from "#python/builtins.js"; import { type Children, code, For, List, mapJoin, Show } from "@alloy-js/core"; import * as py from "@alloy-js/python"; import { type Interface, type Model, type ModelProperty, type Operation } from "@typespec/compiler"; @@ -27,8 +27,6 @@ function isTypedClassDeclarationProps( return "type" in props; } -// (removed getValidTypeMembers; inline logic where needed) - /** * Creates the doc element for the class declaration, either from the props or from the type. * Covers the cases where the doc is provided as an array, a string, or a JSX element. @@ -121,7 +119,8 @@ function getExtendsType($: Typekit, type: Model | Interface): Children | undefin // Record-based scenarios are not supported // do nothing here. } else { - extending.push(efRefkey(type.baseModel)); + // Use py.Reference to wrap the refkey for proper resolution + extending.push(); } } @@ -263,12 +262,9 @@ export function ClassDeclaration(props: ClassDeclarationProps) { name = namePolicy.getName(name, "class"); const refkeys = declarationRefkeys(props.refkey, props.type); - let dataclass: any = null; // Array-based models should be rendered as normal classes, not dataclasses (e.g., model Foo is Array) const isArrayModel = $.model.is(props.type) && $.array.is(props.type); - if (!isArrayModel) { - dataclass = dataclassesModule["."]["dataclass"]; - } + const useDataclass = !isArrayModel; const classBody = createClassBody($, props, abstract); // Throw error for models with additional properties (Record-based scenarios) @@ -279,6 +275,8 @@ export function ClassDeclaration(props: ClassDeclarationProps) { } } + const ClassComponent = useDataclass ? py.DataclassDeclaration : py.ClassDeclaration; + return ( <> @@ -286,19 +284,16 @@ export function ClassDeclaration(props: ClassDeclarationProps) { - - @{dataclass}(kw_only=True) - - - {classBody} - + ); diff --git a/packages/emitter-framework/src/python/components/type-expression/type-expression.tsx b/packages/emitter-framework/src/python/components/type-expression/type-expression.tsx index ee1e374c773..058626a3305 100644 --- a/packages/emitter-framework/src/python/components/type-expression/type-expression.tsx +++ b/packages/emitter-framework/src/python/components/type-expression/type-expression.tsx @@ -98,6 +98,16 @@ export function TypeExpression(props: TypeExpressionProps) { ); } + + // Regular named models should be handled as references + if (type.name) { + return ( + + + + ); + } + reportPythonDiagnostic($.program, { code: "python-unsupported-type", target: type }); break; case "TemplateParameter": diff --git a/packages/emitter-framework/src/python/test-utils.tsx b/packages/emitter-framework/src/python/test-utils.tsx index dca020ed5af..c94e9f66dfd 100644 --- a/packages/emitter-framework/src/python/test-utils.tsx +++ b/packages/emitter-framework/src/python/test-utils.tsx @@ -2,13 +2,7 @@ import { Output } from "#core/components/index.js"; import { type Children } from "@alloy-js/core"; import * as py from "@alloy-js/python"; import type { Program } from "@typespec/compiler"; -import { - abcModule, - dataclassesModule, - datetimeModule, - decimalModule, - typingModule, -} from "./builtins.js"; +import { abcModule, datetimeModule, decimalModule, typingModule } from "./builtins.js"; export const renderOptions = { printWidth: 80, @@ -22,11 +16,11 @@ export function getOutput(program: Program, children: Children[]): Children { program={program} externals={[ abcModule, - dataclassesModule, datetimeModule, decimalModule, typingModule, py.abcModule, + py.dataclassesModule, py.enumModule, ]} namePolicy={policy} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 43fadc78347..3b4fd43ff9e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,7 +8,7 @@ overrides: cross-spawn@>=7.0.0 <7.0.5: ^7.0.5 rollup: 4.49.0 '@alloy-js/core': ^0.22.0-dev.3 - '@alloy-js/python': 0.3.0-dev.2 + '@alloy-js/python': 0.3.0-dev.3 '@alloy-js/babel-plugin': 0.2.1 importers: @@ -425,8 +425,8 @@ importers: specifier: ^0.22.0-dev.3 version: 0.22.0-dev.3 '@alloy-js/python': - specifier: 0.3.0-dev.2 - version: 0.3.0-dev.2 + specifier: 0.3.0-dev.3 + version: 0.3.0-dev.3 '@alloy-js/rollup-plugin': specifier: ^0.1.0 version: 0.1.0(@babel/core@7.28.4)(@types/babel__core@7.20.5)(rollup@4.49.0) @@ -2686,8 +2686,8 @@ packages: '@alloy-js/markdown@0.20.0': resolution: {integrity: sha512-c1Q4dzUvWC4Bdoi6dRT9yAYVoCiqz3ZMClV8CHzEsgZYjjdS0S2ZWWmgxzS87rSDHSjmQIXJ4BcUZfKyfnMrFA==} - '@alloy-js/python@0.3.0-dev.2': - resolution: {integrity: sha512-bdWbEjvAVQwWd0Utf4PTuAuhpnS4kmz1wT5nsCUfzLveTz9/xJFDAPg2CUip0c5glT03gbF+dP4Sl8Rg2nYq+Q==} + '@alloy-js/python@0.3.0-dev.3': + resolution: {integrity: sha512-b4PLoc6PzJIsviTLjYt6O3Estlz92sTgL3QcgH1zapr5sj5csOWzJ8vR3/+4Tl8nLKUk7s+H5+L80PRXvDj/Tg==} '@alloy-js/rollup-plugin@0.1.0': resolution: {integrity: sha512-MXR8mBdSh/pxMP8kIXAcMYKsm5yOWZ+igxcaRX1vBXFiHU4eK7gE/5q6Fk8Vdydh+MItWtgekwIhUWvcszdNFQ==} @@ -13585,7 +13585,7 @@ snapshots: '@alloy-js/core': 0.22.0-dev.3 yaml: 2.8.0 - '@alloy-js/python@0.3.0-dev.2': + '@alloy-js/python@0.3.0-dev.3': dependencies: '@alloy-js/core': 0.22.0-dev.3 change-case: 5.4.4 @@ -19458,7 +19458,7 @@ snapshots: algoliasearch: 4.25.2 clipanion: 4.0.0-rc.4(typanion@3.14.0) diff: 5.2.0 - ink: 3.2.0(@types/react@18.3.23)(react@17.0.2) + ink: 3.2.0(@types/react@18.3.23)(react@18.3.1) ink-text-input: 4.0.3(ink@3.2.0(@types/react@18.3.23)(react@17.0.2))(react@17.0.2) react: 17.0.2 semver: 7.7.2 @@ -19606,7 +19606,7 @@ snapshots: '@yarnpkg/parsers': 3.0.3 '@yarnpkg/plugin-git': 3.1.2(@yarnpkg/core@4.4.2(typanion@3.14.0))(typanion@3.14.0) clipanion: 4.0.0-rc.4(typanion@3.14.0) - ink: 3.2.0(@types/react@18.3.23)(react@18.3.1) + ink: 3.2.0(@types/react@18.3.23)(react@17.0.2) lodash: 4.17.21 react: 17.0.2 semver: 7.7.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ceb441be953..984fd0e0f58 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,5 +10,5 @@ overrides: "cross-spawn@>=7.0.0 <7.0.5": "^7.0.5" rollup: 4.49.0 # Regression in 4.50.0 https://github.com/rollup/rollup/issues/6099 "@alloy-js/core": "^0.22.0-dev.3" - "@alloy-js/python": "0.3.0-dev.2" + "@alloy-js/python": "0.3.0-dev.3" "@alloy-js/babel-plugin": "0.2.1" From 666292f8750c1b6add1c399a30e7f5b8826cfb4f Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Mon, 3 Nov 2025 17:05:34 +0000 Subject: [PATCH 20/25] Add comments --- .../class-declaration/class-declaration.tsx | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx index d98b1ef9e96..eb5fa97b184 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx @@ -77,8 +77,10 @@ function createClassBody($: Typekit, props: ClassDeclarationProps, abstract: boo const validTypeMembers = isTypedClassDeclarationProps(props) ? (() => { if ($.model.is(props.type)) { + // For models, extract properties to render as dataclass fields return Array.from($.model.getProperties(props.type).values()); } else { + // For interfaces, extract operations to render as abstract methods const ops = (props.type as { operations: Map }).operations; return Array.from(createRekeyableMap(ops).values()); } @@ -103,9 +105,10 @@ function createClassBody($: Typekit, props: ClassDeclarationProps, abstract: boo * Creates the extends types for the class declaration. * @param $ - The Typekit. * @param type - The type to create the extends type for. - * @returns The extends types for the class declaration. + * @returns The extends types for the class declaration, or undefined for interfaces. */ function getExtendsType($: Typekit, type: Model | Interface): Children | undefined { + // For interfaces, return undefined because inheritance is flattened by TypeSpec if (!$.model.is(type)) { return undefined; } @@ -219,13 +222,22 @@ function buildTypeVarsAndGenericBase( } /** - * Creates the class declaration for the class. + * Converts TypeSpec Models and Interfaces to Python classes. + * + * - **Models** are converted into Dataclasses with `@dataclass(kw_only=True)` + fields + * - **Interfaces** are converted into Abstract classes (ABC) with abstract methods + * - For models that extends another model, we convert that into Python class inheritance + * - For interfaces that extends another interface, there's no inheritance, since + * TypeSpec flattens the inheritance + * * @param props - The props for the class declaration. * @returns The class declaration. */ export function ClassDeclaration(props: ClassDeclarationProps) { const { $ } = useTsp(); + // Interfaces are rendered as abstract classes (ABC) with abstract methods + // Models are rendered as concrete dataclasses with fields // If we are explicitly overriding the class as abstract or the type is not a model, we need to create an abstract class const abstract = ("abstract" in props && props.abstract) || ("type" in props && !$.model.is(props.type)); @@ -326,6 +338,8 @@ function ClassBody( if ($.model.is(props.type)) { const additionalPropsRecord = $.model.getAdditionalPropertiesRecord(props.type); if (additionalPropsRecord) { + // Python dataclasses don't support dynamic properties, so an additionalProperties + // field would just be another fixed field, not a "catch-all" for arbitrary properties. throw new Error("Models with additional properties (Record[…]) are not supported"); } } From edc4b542856aefd658d7529ac30a374bedc8e682 Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Mon, 3 Nov 2025 17:27:57 +0000 Subject: [PATCH 21/25] Remove typing module import --- packages/emitter-framework/src/python/builtins.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/emitter-framework/src/python/builtins.ts b/packages/emitter-framework/src/python/builtins.ts index f1faf066382..d796b1606ea 100644 --- a/packages/emitter-framework/src/python/builtins.ts +++ b/packages/emitter-framework/src/python/builtins.ts @@ -34,7 +34,6 @@ export const typingModule = createModule({ "Generic", "Literal", "Never", - "NoReturn", "Optional", "Protocol", "TypeAlias", From fd0d3788ed207d9e3255d31385fbdea49cbab852 Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Tue, 4 Nov 2025 18:12:28 +0000 Subject: [PATCH 22/25] Fix --- .../class-declaration.test.tsx | 321 ++++++++++++++++++ .../class-declaration/class-declaration.tsx | 304 +++++++++-------- .../class-declaration/class-member.tsx | 85 +++-- .../class-declaration/class-method.tsx | 43 +-- .../function-declaration.tsx | 38 +-- .../src/python/utils/doc.tsx | 47 +++ 6 files changed, 597 insertions(+), 241 deletions(-) create mode 100644 packages/emitter-framework/src/python/utils/doc.tsx diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx index ee97cdde326..f8b7dfe7854 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx @@ -378,6 +378,126 @@ describe("Python Class from model", () => { ); }); + it("handles a union of variant references in a class property", async () => { + const { program, Color, Widget } = await Tester.compile(t.code` + union ${t.union("Color")} { + red: "RED", + blue: "BLUE", + green: "GREEN", + } + + model ${t.model("Widget")} { + id: string; + primaryColor: Color.red | Color.blue; + } + `); + + expect( + getOutput(program, [, ]), + ).toRenderTo( + ` + from dataclasses import dataclass + from enum import StrEnum + from typing import Literal + + class Color(StrEnum): + RED = "RED" + BLUE = "BLUE" + GREEN = "GREEN" + + + @dataclass(kw_only=True) + class Widget: + id: str + primary_color: Literal[Color.RED, Color.BLUE] + + `, + ); + }); + + it("handles a union of integer literals in a class property", async () => { + const { program, Widget } = await Tester.compile(t.code` + model ${t.model("Widget")} { + id: string; + priority: 1 | 2 | 3; + } + `); + + expect( + getOutput(program, []), + ).toRenderTo( + ` + from dataclasses import dataclass + from typing import Literal + + @dataclass(kw_only=True) + class Widget: + id: str + priority: Literal[1, 2, 3] + + `, + ); + }); + + it("handles a union of boolean literals in a class property", async () => { + const { program, Widget } = await Tester.compile(t.code` + model ${t.model("Widget")} { + id: string; + isActiveOrEnabled: true | false; + } + `); + + expect( + getOutput(program, []), + ).toRenderTo( + ` + from dataclasses import dataclass + from typing import Literal + + @dataclass(kw_only=True) + class Widget: + id: str + is_active_or_enabled: Literal[True, False] + + `, + ); + }); + + it("handles a mixed union of literals and variant references", async () => { + const { program, Color, Widget } = await Tester.compile(t.code` + union ${t.union("Color")} { + red: "RED", + blue: "BLUE", + } + + model ${t.model("Widget")} { + id: string; + mixedValue: "custom" | 42 | true | Color.red; + } + `); + + expect( + getOutput(program, [, ]), + ).toRenderTo( + ` + from dataclasses import dataclass + from enum import StrEnum + from typing import Literal + + class Color(StrEnum): + RED = "RED" + BLUE = "BLUE" + + + @dataclass(kw_only=True) + class Widget: + id: str + mixed_value: Literal["custom", 42, True, Color.RED] + + `, + ); + }); + it("renders a never-typed member as typing.Never", async () => { const { program, Widget } = await Tester.compile(t.code` model ${t.model("Widget")} { @@ -944,4 +1064,205 @@ describe("Python Class overrides", () => { StringResponse: TypeAlias = Response[str] `); }); + + it("Handles multiple template parameters", async () => { + const { program, Result } = await Tester.compile(t.code` + model ${t.model("Result")} { + value: T; + error: E; + } + `); + + expect( + getOutput(program, []), + ).toRenderTo(` + from dataclasses import dataclass + from typing import Generic + from typing import TypeVar + + t = TypeVar("T") + e = TypeVar("E") + + @dataclass(kw_only=True) + class Result(Generic[T, E]): + value: T + error: E + + `); + }); + + it("Handles template parameter with constraint (bound)", async () => { + const { program, Container } = await Tester.compile(t.code` + model ${t.model("Container")} { + value: T; + } + `); + + expect( + getOutput(program, []), + ).toRenderTo(` + from dataclasses import dataclass + from typing import Generic + from typing import TypeVar + + t = TypeVar("T", bound=str) + + @dataclass(kw_only=True) + class Container(Generic[T]): + value: T + + `); + }); + + it("Handles multiple template parameters with mixed constraints", async () => { + const { program, Result } = await Tester.compile(t.code` + model ${t.model("Result")} { + value: T; + error: E; + } + `); + + expect( + getOutput(program, []), + ).toRenderTo(` + from dataclasses import dataclass + from typing import Generic + from typing import TypeVar + + t = TypeVar("T", bound=str) + e = TypeVar("E") + + @dataclass(kw_only=True) + class Result(Generic[T, E]): + value: T + error: E + + `); + }); + + it("Does not add Generic for template instances", async () => { + const { program, Response, ConcreteResponse } = await Tester.compile(t.code` + model ${t.model("Response")} { + data: T; + status: string; + } + + model ${t.model("ConcreteResponse")} extends Response { + timestamp: string; + } + `); + + expect( + getOutput(program, [ + , + , + ]), + ).toRenderTo(` + from dataclasses import dataclass + from typing import Generic + from typing import TypeVar + + t = TypeVar("T") + + @dataclass(kw_only=True) + class Response(Generic[T]): + data: T + status: str + + + @dataclass(kw_only=True) + class ConcreteResponse(Response[str]): + timestamp: str + + `); + }); + + it("Generates TypeVars for templated interfaces", async () => { + const { program, Repository } = await Tester.compile(t.code` + interface ${t.interface("Repository")} { + get(id: string): T; + list(): T[]; + } + `); + + expect( + getOutput(program, []), + ).toRenderTo(` + from abc import ABC + from abc import abstractmethod + from dataclasses import dataclass + from typing import Generic + from typing import TypeVar + + t = TypeVar("T") + + @dataclass(kw_only=True) + class Repository(Generic[T], ABC): + @abstractmethod + def get(self, id: str) -> T: + pass + + @abstractmethod + def list(self) -> Array[T]: + pass + + + `); + }); + + it("Does not generate TypeVars for interface instances", async () => { + const { program, Repository, StringRepository } = await Tester.compile(t.code` + interface ${t.interface("Repository")} { + get(id: string): T; + list(): T[]; + } + + interface ${t.interface("StringRepository")} extends Repository { + findByPrefix(prefix: string): string[]; + } + `); + + expect( + getOutput(program, [ + , + , + ]), + ).toRenderTo(` + from abc import ABC + from abc import abstractmethod + from dataclasses import dataclass + from typing import Generic + from typing import TypeVar + + t = TypeVar("T") + + @dataclass(kw_only=True) + class Repository(Generic[T], ABC): + @abstractmethod + def get(self, id: str) -> T: + pass + + @abstractmethod + def list(self) -> Array[T]: + pass + + + + @dataclass(kw_only=True) + class StringRepository(ABC): + @abstractmethod + def get(self, id: str) -> str: + pass + + @abstractmethod + def list(self) -> list[str]: + pass + + @abstractmethod + def find_by_prefix(self, prefix: str) -> list[str]: + pass + + + `); + }); }); diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx index eb5fa97b184..694256864ee 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx @@ -1,12 +1,20 @@ import { abcModule, typingModule } from "#python/builtins.js"; -import { type Children, code, For, List, mapJoin, Show } from "@alloy-js/core"; +import { type Children, code, createContentSlot, For, List, mapJoin, Show } from "@alloy-js/core"; import * as py from "@alloy-js/python"; -import { type Interface, type Model, type ModelProperty, type Operation } from "@typespec/compiler"; +import { + isTemplateDeclaration, + isTemplateDeclarationOrInstance, + type Interface, + type Model, + type ModelProperty, + type Operation, +} from "@typespec/compiler"; import type { TemplateDeclarationNode } from "@typespec/compiler/ast"; import type { Typekit } from "@typespec/compiler/typekit"; import { createRekeyableMap } from "@typespec/compiler/utils"; import { useTsp } from "../../../core/context/tsp-context.js"; import { reportDiagnostic } from "../../../lib.js"; +import { createDocElement } from "../../utils/doc.jsx"; import { declarationRefkeys, efRefkey } from "../../utils/refkey.js"; import { TypeExpression } from "../type-expression/type-expression.jsx"; import { ClassMember } from "./class-member.jsx"; @@ -28,81 +36,59 @@ function isTypedClassDeclarationProps( } /** - * Creates the doc element for the class declaration, either from the props or from the type. - * Covers the cases where the doc is provided as an array, a string, or a JSX element. - * @param props - The props for the class declaration. - * @returns The doc element for the class declaration. + * Gets type members (properties or operations) from a Model or Interface. + * @param $ - The Typekit. + * @param type - The model or interface type. + * @returns Array of model properties or operations. */ -function createDocElement($: Typekit, props: ClassDeclarationProps) { - let docElement = undefined; - const docSource = props.doc ?? ("type" in props && $.type.getDoc(props.type)) ?? undefined; - if (docSource) { - // Doc provided as an array (paragraphs/nodes). Forward as description to preserve structure. - if (Array.isArray(docSource)) { - docElement = ; - } - // Doc provided as a string. Preserve line breaks by rendering each line on its own. - else if (typeof docSource === "string") { - const lines = docSource.split(/\r?\n/); - docElement = ( - - {lines.map((line) => ( - <>{line} - ))} - , - ]} - /> - ); - } - // Doc provided as JSX (e.g., a prebuilt ). Pass through unchanged. - else { - docElement = docSource as any; - } +function getTypeMembers($: Typekit, type: Model | Interface): (ModelProperty | Operation)[] { + if ($.model.is(type)) { + // For models, extract properties to render as dataclass fields + return Array.from($.model.getProperties(type).values()); + } else if (type.kind === "Interface") { + // For interfaces, extract operations to render as abstract methods + return Array.from(createRekeyableMap(type.operations).values()); + } else { + throw new Error("Expected Model or Interface type"); } - return docElement; } + /** * Creates the class body for the class declaration. - * Determines if the class body should render any members/children. - * If it does, returns a ClassBody; otherwise, returns undefined, which will render a "pass"; - * as the class body. + * Returns a ClassBody component if there are members or children to render, + * otherwise returns undefined (which will render "pass" in Python). + * * @param $ - The Typekit. * @param props - The props for the class declaration. - * @returns The class body for the class declaration, either a ClassBody or undefined. + * @param abstract - Whether the class is abstract. + * @returns The class body component, or undefined for an empty class. */ function createClassBody($: Typekit, props: ClassDeclarationProps, abstract: boolean) { - const validTypeMembers = isTypedClassDeclarationProps(props) - ? (() => { - if ($.model.is(props.type)) { - // For models, extract properties to render as dataclass fields - return Array.from($.model.getProperties(props.type).values()); - } else { - // For interfaces, extract operations to render as abstract methods - const ops = (props.type as { operations: Map }).operations; - return Array.from(createRekeyableMap(ops).values()); - } - })() - : []; - const hasValidMember = validTypeMembers.length > 0; - const hasChildren = Array.isArray(props.children) - ? (props.children as any[]).length > 0 - : props.children != null; - - if (!(hasValidMember || hasChildren)) return undefined as any; - - if (isTypedClassDeclarationProps(props)) { - return ; + if (!isTypedClassDeclarationProps(props)) { + const ContentSlot = createContentSlot(); + return ( + <> + {props.children} + {undefined} + + ); } - - // Fallback for non-typed props (shouldn't be called in practice due to early return in ClassDeclaration) - return (<>{props.children}) as any; + + const validTypeMembers = getTypeMembers($, props.type); + + return ; } /** * Creates the extends types for the class declaration. + * + * - Template instances (e.g., `Response` → `Response[str]`) - Use TypeExpression to render with type args + * - Partial templates (e.g., `Response -> Response[T]`) - Use TypeExpression to render with type args + * - Regular models (e.g., `BaseWidget`) - Use py.Reference for simple name resolution + * - Arrays - Use TypeExpression for `typing.Sequence[T]` rendering + * - Records - Not supported, ignored + * * @param $ - The Typekit. * @param type - The type to create the extends type for. * @returns The extends types for the class declaration, or undefined for interfaces. @@ -119,41 +105,37 @@ function getExtendsType($: Typekit, type: Model | Interface): Children | undefin if ($.array.is(type.baseModel)) { extending.push(); } else if ($.record.is(type.baseModel)) { - // Record-based scenarios are not supported - // do nothing here. + // Record-based scenarios are not supported, do nothing here + } else if (isTemplateDeclarationOrInstance(type.baseModel)) { + // Template type (declaration or instance) - needs TypeExpression for type parameter handling + // This covers: Response, Response, and other templated scenarios + extending.push(); } else { - // Use py.Reference to wrap the refkey for proper resolution + // Regular model - use py.Reference for proper symbol resolution extending.push(); } } + // Handle index types: Arrays (int indexes) are supported, while Records (string indexes) are not + // Note: TypeSpec prevents array models from having properties, so indexType is only for empty arrays const indexType = $.model.getIndexType(type); - if (indexType) { - if ($.record.is(indexType)) { - // Record-based scenarios are not supported - // do nothing here. - } else { - extending.push(); - } - } - - if (extending.length === 0) { - return undefined; + if (indexType && !$.record.is(indexType)) { + extending.push(); } - return mapJoin( - () => extending, - (ext) => ext, - { joiner: "," }, - ); + return extending.length > 0 ? mapJoin(() => extending, (ext) => ext, { joiner: "," }) : undefined; } /** - * Creates the bases type for the class declaration. + * Creates the bases (inheritance) list for the class declaration. + * Combines explicit bases from props, inherited bases from the type, and ABC if abstract. + * ABC is always added last to maintain proper Python MRO. + * * @param $ - The Typekit. * @param props - The props for the class declaration. * @param abstract - Whether the class is abstract. - * @returns The bases type for the class declaration. + * @param extraBases - Additional bases to include (e.g., Generic[T]). Will be mutated. + * @returns The bases type for the class declaration, or undefined if no bases. */ function createBasesType( $: Typekit, @@ -161,46 +143,82 @@ function createBasesType( abstract: boolean, extraBases: Children[] = [], ) { + // Add extends/inheritance from the TypeSpec type if present if (isTypedClassDeclarationProps(props)) { const extend = getExtendsType($, props.type); if (extend) { extraBases.push(extend); } } - const allBases = (props.bases ? props.bases : []).concat(extraBases); - const basesType = allBases.length > 0 ? allBases : undefined; - if (!abstract) return basesType; + + // Combine explicit bases from props with extraBases (Generic, extends, etc.) + const allBases = (props.bases ?? []).concat(extraBases); + + // For non-abstract classes, return bases or undefined + if (!abstract) { + return allBases.length > 0 ? allBases : undefined; + } + // For abstract classes, add ABC (always last for proper MRO) const abcBase = abcModule["."]["ABC"]; - if (Array.isArray(basesType)) return [...basesType, abcBase]; - if (basesType != null) return [basesType, abcBase]; - return [abcBase]; + return allBases.length > 0 ? [...allBases, abcBase] : [abcBase]; } /** - * Builds TypeVar declarations and the Generic[...] base for templated types, - * in case the type is a model with template parameters. + * Builds TypeVar declarations and the Generic[...] base for templated types. + * + * **Template Detection Logic**: + * Uses TypeSpec's `isTemplateDeclaration` utility to correctly identify: + * - **Template Declaration** (e.g., `model Response`) - Generate TypeVars + * - **Template Instance** (e.g., `Response`) - Skip TypeVars + * - **Partial Template** (e.g., nested `Op` inside `interface Foo`) - Skip TypeVars + * - **Nested Template** (e.g., `interface Foo { op: Op }`) - Skip TypeVars + * - **Regular Type** (e.g., `model Widget`) - Skip TypeVars + * + * @param $ - The Typekit + * @param type - The model or interface type to analyze + * @returns TypeVar declarations and Generic base, or null if not a template declaration */ function buildTypeVarsAndGenericBase( $: Typekit, type: Model | Interface, ): { typeVars: Children | null; genericBase?: Children } { - if (!("isFinished" in type)) { - return { typeVars: null }; - } - const templateParameters = (type.node as TemplateDeclarationNode)?.templateParameters; - if (type.isFinished || !templateParameters) { + // Ensuring that we only generate TypeVars for true template declarations + // Correctly handles all edge cases: + // - Partial template mappers + // - Nested template mappers + // - Template instances + // - Regular types + if (!isTemplateDeclaration(type)) { return { typeVars: null }; } + // Get template parameters from the validated template declaration + const templateParameters = (type.node as TemplateDeclarationNode).templateParameters; + + // Generate TypeVars for the template declaration const typeVars = ( <> {(node) => { + // Build TypeVar arguments: name + optional bound + const typeVarArgs: Children[] = []; + + // Check if template parameter has a constraint (bound) + if (node.constraint) { + // Converts the AST node to a TypeSpec type + const constraintType = $.program.checker.getTypeForNode(node.constraint); + typeVarArgs.push( + <> + bound= + + ); + } + const typeVar = ( ]} + args={typeVarArgs} /> ); return ; @@ -213,10 +231,10 @@ function buildTypeVarsAndGenericBase( for (const templateParameter of templateParameters) { typeArgs.push(code`${templateParameter.id.sv}`); } - const genericBase = - typeArgs.length > 0 ? ( - - ) : undefined; + + const genericBase = ( + + ); return { typeVars, genericBase }; } @@ -241,10 +259,13 @@ export function ClassDeclaration(props: ClassDeclarationProps) { // If we are explicitly overriding the class as abstract or the type is not a model, we need to create an abstract class const abstract = ("abstract" in props && props.abstract) || ("type" in props && !$.model.is(props.type)); - const docElement = createDocElement($, props); + + const docSource = props.doc ?? ("type" in props ? $.type.getDoc(props.type) : undefined); + const docElement = createDocElement(docSource, py.ClassDoc); - const extraBases = []; - let typeVars = null; + // Build template-related bases (Generic[T, ...]) if this is a template declaration + const extraBases: Children[] = []; + let typeVars: Children | null = null; if (isTypedClassDeclarationProps(props)) { const generic = buildTypeVarsAndGenericBase($, props.type); typeVars = generic.typeVars; @@ -260,7 +281,7 @@ export function ClassDeclaration(props: ClassDeclarationProps) { ); } @@ -268,30 +289,35 @@ export function ClassDeclaration(props: ClassDeclarationProps) { const namePolicy = py.usePythonNamePolicy(); let name = props.name ?? props.type.name; - if (!name || name === "") { + if (!name) { reportDiagnostic($.program, { code: "type-declaration-missing-name", target: props.type }); } name = namePolicy.getName(name, "class"); const refkeys = declarationRefkeys(props.refkey, props.type); - // Array-based models should be rendered as normal classes, not dataclasses (e.g., model Foo is Array) - const isArrayModel = $.model.is(props.type) && $.array.is(props.type); - const useDataclass = !isArrayModel; - const classBody = createClassBody($, props, abstract); - - // Throw error for models with additional properties (Record-based scenarios) + + // Check for models with additional properties (Record-based scenarios) + // This check must happen here (in addition to ClassBody) because models with no properties + // (e.g., `model Foo is Record`) won't render a ClassBody, so the error would never be thrown if ($.model.is(props.type)) { const additionalPropsRecord = $.model.getAdditionalPropertiesRecord(props.type); if (additionalPropsRecord) { throw new Error("Models with additional properties (Record[…]) are not supported"); } } + + // Array-based models (e.g., model Foo is Array) use regular classes, not dataclasses, + // since Array models in TypeSpec can't have properties, so they behave more like a class + // that inherits from a list. + const isArrayModel = $.model.is(props.type) && $.array.is(props.type); + const useDataclass = !isArrayModel; + const classBody = createClassBody($, props, abstract); const ClassComponent = useDataclass ? py.DataclassDeclaration : py.ClassDeclaration; return ( <> - + {typeVars} @@ -300,9 +326,9 @@ export function ClassDeclaration(props: ClassDeclarationProps) { {classBody} @@ -317,24 +343,21 @@ interface ClassBodyProps extends ClassDeclarationPropsWithType { } /** - * Renders the members of an interface from its properties, including any additional children. + * Renders the body of a class declaration. + * For models, renders properties as dataclass fields. + * For interfaces, renders operations as abstract methods. + * Includes any additional children provided. */ function ClassBody( props: ClassBodyProps & { validTypeMembers?: (ModelProperty | Operation)[] }, ): Children { const { $ } = useTsp(); - const validTypeMembers = - props.validTypeMembers ?? - (() => { - if ($.model.is(props.type)) { - return Array.from($.model.getProperties(props.type).values()); - } else { - const ops = (props.type as { operations: Map }).operations; - return Array.from(createRekeyableMap(ops).values()); - } - })(); + const validTypeMembers = props.validTypeMembers ?? getTypeMembers($, props.type); + const ContentSlot = createContentSlot(); // Throw error for models with additional properties (Record-based scenarios) + // This is checked in ClassDeclaration before calling createClassBody, but kept here + // as a safety measure in case ClassBody is called directly if ($.model.is(props.type)) { const additionalPropsRecord = $.model.getAdditionalPropertiesRecord(props.type); if (additionalPropsRecord) { @@ -344,28 +367,21 @@ function ClassBody( } } - const hasChildren = Array.isArray(props.children) - ? (props.children as any[]).length > 0 - : props.children != null; - const hasBody = validTypeMembers.length > 0 || hasChildren; - if (!hasBody) return undefined as any; - return ( <> - 0}> + - {(typeMember) => { - return ( - - ); - }} + {(typeMember) => ( + + )} - - {props.children} + {props.children} + + {undefined} ); } diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx index d1ab297bca8..b18dc5cc2b2 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx @@ -1,5 +1,5 @@ import { typingModule } from "#python/builtins.js"; -import { type Children } from "@alloy-js/core"; +import { type Children, code, mapJoin } from "@alloy-js/core"; import * as py from "@alloy-js/python"; import { type ModelProperty, type Operation } from "@typespec/compiler"; import { useTsp } from "../../../core/context/tsp-context.js"; @@ -44,18 +44,15 @@ function buildPrimitiveInitializerFromDefault( // Example: value is { value: "100", isInteger: true } if (raw && typeof raw === "object" && "value" in raw) raw = raw.value; - // Float-ish property types should render with a float hint if integral - if ($.scalar.is(propertyType)) { - const base = $.scalar.getStdBase(propertyType)?.name; - const isFloatish = - base === "float" || - base === "float32" || - base === "float64" || - base === "decimal" || - base === "decimal128"; - if (isFloatish) { - return ; - } + // Float-like property types (including custom subtypes) should render with float hint + if ( + $.scalar.extendsFloat(propertyType) || + $.scalar.extendsFloat32(propertyType) || + $.scalar.extendsFloat64(propertyType) || + $.scalar.extendsDecimal(propertyType) || + $.scalar.extendsDecimal128(propertyType) + ) { + return ; } // Otherwise output as a number atom @@ -69,14 +66,21 @@ function buildPrimitiveInitializerFromDefault( } /** - * Builds the type node for the property. This is used to handle union of string literals and union variant references. - * If the type is a union of string literals, it returns a Literal["a", "b"] type. - * If the type is a union variant reference, it returns a Literal[Color.MEMBER] type. + * Builds the type node for the property. This handles various literal and union variant scenarios: + * - Single union variant reference: Color.blue produces Literal[Color.BLUE] + * - Union of string literals: "a" | "b" produces Literal["a", "b"] + * - Union of integer literals: 1 | 2 | 3 produces Literal[1, 2, 3] + * - Union of boolean literals: true | false produces Literal[True, False] + * - Union of variant references: Color.red | Color.blue produces Literal[Color.RED, Color.BLUE] + * - Mixed literal unions: "a" | 1 | true | Color.RED produces Literal["a", 1, True, Color.RED] + * * @param unpackedType - The unpacked type. - * @returns The type node, or undefined if the type is not a union of string literals or union variant reference. + * @returns The type node, or undefined if the type doesn't match any supported literal pattern. */ function buildTypeNodeForProperty(unpackedType: any): Children | undefined { - // Union variant reference - Literal[Color.MEMBER] + const { $ } = useTsp(); + + // Single union variant reference - Literal[Color.MEMBER] if (unpackedType && unpackedType.kind === "UnionVariant" && unpackedType.union) { const unionType = unpackedType.union; const variantValue = unpackedType.type; @@ -91,19 +95,50 @@ function buildTypeNodeForProperty(unpackedType: any): Children | undefined { ); } - // Union of string literals - Literal["a", "b"] + // Union of literals or variant references (including mixed) if ( unpackedType && unpackedType.kind === "Union" && Array.isArray((unpackedType as any).options) ) { const opts: any[] = (unpackedType as any).options; - const allStringLiterals = opts.every((opt) => opt && opt.kind === "String"); - if (allStringLiterals) { - const literalValues = opts.map((opt) => JSON.stringify(opt.value)).join(", "); + + // Check if all options are valid literal types using typekit + const allLiterals = opts.every((opt) => + opt && ( + $.literal.isString(opt) || + $.literal.isNumeric(opt) || + $.literal.isBoolean(opt) || + opt.kind === "UnionVariant" + ) + ); + + if (allLiterals) { + const literalValues = opts.map((opt) => { + if ($.literal.isString(opt)) { + // String literals need quotes + return JSON.stringify(opt.value); + } else if ($.literal.isNumeric(opt)) { + // Number literals render directly + return String(opt.value); + } else if ($.literal.isBoolean(opt)) { + // Boolean literals render as True/False (Python capitalization) + return opt.value ? "True" : "False"; + } else if (opt.kind === "UnionVariant") { + // Variant references need enum reference + const variantValue = opt.type; + const enumMemberName = + variantValue && typeof variantValue.value === "string" + ? variantValue.value + : String(variantValue?.value ?? ""); + return code`${efRefkey(opt.union)}.${enumMemberName}`; + } + return undefined; + }).filter(Boolean); + return ( <> - {typingModule["."]["Literal"]}[{literalValues}] + {typingModule["."]["Literal"]}[{mapJoin(() => literalValues, (val) => val, { joiner: ", " })}] ); } @@ -141,7 +176,7 @@ export function ClassMember(props: ClassMemberProps) { unpackedTypeNode ); - const interfaceMemberProps = { + const classMemberProps = { doc, name, optional: isOptional, @@ -149,7 +184,7 @@ export function ClassMember(props: ClassMemberProps) { ...(initializer ? { initializer } : {}), omitNone: !isOptional, }; - return ; + return ; } if ($.operation.is(props.type)) { diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-method.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-method.tsx index e0331f34581..18429070c65 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-method.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-method.tsx @@ -1,8 +1,8 @@ -import { type Children, createContext, List, splitProps, useContext } from "@alloy-js/core"; +import { type Children, createContext, splitProps, useContext } from "@alloy-js/core"; import * as py from "@alloy-js/python"; import type { Operation } from "@typespec/compiler"; -import type { Typekit } from "@typespec/compiler/typekit"; import { useTsp } from "../../../core/index.js"; +import { createDocElement } from "../../utils/doc.jsx"; import { buildParameterDescriptors, getReturnType } from "../../utils/operation.js"; import { TypeExpression } from "../type-expression/type-expression.jsx"; @@ -20,37 +20,6 @@ export interface MethodPropsWithType extends Omit; - } - // Doc provided as a string. Preserve line breaks by rendering each line on its own. - else if (typeof docSource === "string") { - const lines = docSource.split(/\r?\n/); - docElement = ( - - {lines.map((line) => ( - <>{line} - ))} - , - ]} - /> - ); - } - // Doc provided as JSX (e.g., a prebuilt ). Pass through unchanged. - else { - docElement = docSource as any; - } - } - return docElement; -} - /** * Get the method component based on the resolved method type. * We prioritize the methodType prop provided in the Method component, @@ -63,14 +32,15 @@ function getResolvedMethodType(props: MethodProps): "method" | "class" | "static } /** - * A Python interface method. Pass the `type` prop to create the + * A Python class method. Pass the `type` prop to create the * method by converting from a TypeSpec Operation. Any other props * provided will take precedence. */ export function Method(props: Readonly) { const { $ } = useTsp(); const isTypeSpecTyped = "type" in props; - const docElement = createDocElement($, props); + const docSource = props.doc ?? (isTypeSpecTyped && $.type.getDoc(props.type)) ?? undefined; + const docElement = createDocElement(docSource, py.MethodDoc); const resolvedMethodType = getResolvedMethodType(props); const MethodComponent = resolvedMethodType === "static" @@ -83,8 +53,7 @@ export function Method(props: Readonly) { // unless explicitly overridden by props.abstract === false const abstractFlag = (() => { const explicit = (props as any).abstract as boolean | undefined; - if (explicit !== undefined) return explicit; - return !isTypeSpecTyped ? false : undefined; + return explicit ?? (!isTypeSpecTyped ? false : undefined) })(); /** diff --git a/packages/emitter-framework/src/python/components/function-declaration/function-declaration.tsx b/packages/emitter-framework/src/python/components/function-declaration/function-declaration.tsx index 833366ed7e4..2073ee970ab 100644 --- a/packages/emitter-framework/src/python/components/function-declaration/function-declaration.tsx +++ b/packages/emitter-framework/src/python/components/function-declaration/function-declaration.tsx @@ -1,9 +1,10 @@ import { useTsp } from "#core/index.js"; import { buildParameterDescriptors } from "#python/utils/operation.js"; import { declarationRefkeys } from "#python/utils/refkey.js"; -import { type Children, List } from "@alloy-js/core"; +import { type Children } from "@alloy-js/core"; import * as py from "@alloy-js/python"; import type { Model, Operation } from "@typespec/compiler"; +import { createDocElement } from "../../utils/doc.jsx"; import { TypeExpression } from "../type-expression/type-expression.jsx"; export interface FunctionDeclarationPropsWithType @@ -18,39 +19,6 @@ export type FunctionDeclarationProps = | FunctionDeclarationPropsWithType | py.FunctionDeclarationProps; -/** - * Normalize various doc sources into a Python FunctionDoc element. - * - * Accepts: - * - string → split into lines and render as a multi-line docstring - * - string[] | Children[] → rendered as separate paragraphs - * - Children (e.g., an explicit ) → returned as-is - */ -function createDocElement( - $: ReturnType["$"], - source?: string | string[] | Children | Children[], -): Children | undefined { - if (!source) return undefined; - if (Array.isArray(source)) { - return ; - } else if (typeof source === "string") { - const lines = source.split(/\r?\n/); - return ( - - {lines.map((line) => ( - <>{line} - ))} - , - ]} - /> - ); - } else { - return source as Children | undefined; - } -} - /** * A Python function declaration. Pass the `type` prop to create the * function declaration by converting from a TypeSpec Operation. Any other props @@ -88,7 +56,7 @@ export function FunctionDeclaration(props: FunctionDeclarationProps) { }); } const rawDoc = props.doc ?? $.type.getDoc(props.type); - const docElement = createDocElement($, rawDoc); + const docElement = createDocElement(rawDoc, py.FunctionDoc); const doc = docElement ? ( <> {docElement} diff --git a/packages/emitter-framework/src/python/utils/doc.tsx b/packages/emitter-framework/src/python/utils/doc.tsx new file mode 100644 index 00000000000..b7b874eeec1 --- /dev/null +++ b/packages/emitter-framework/src/python/utils/doc.tsx @@ -0,0 +1,47 @@ +import { type Children, type Component, List } from "@alloy-js/core"; + +/** + * Normalize various doc sources into a Python doc element. + * + * Accepts: + * - string → split into lines and render as a multi-line docstring + * - string[] | Children[] → rendered as separate paragraphs + * - Children (e.g., an explicit Doc component) → returned as-is + * + * @param source - The documentation source (string, array, or JSX) + * @param DocComponent - The Python doc component to use (ClassDoc, FunctionDoc, MethodDoc, etc.) + * @returns The rendered doc element, or undefined if no documentation + */ +export function createDocElement( + source: string | string[] | Children | Children[] | undefined, + DocComponent: Component<{ description: Children[] }>, +): Children | undefined { + if (!source) { + return undefined; + } + + // Doc provided as an array (paragraphs/nodes) - preserve structure + if (Array.isArray(source)) { + return ; + } + + // Doc provided as a string - preserve line breaks + if (typeof source === "string") { + const lines = source.split(/\r?\n/); + return ( + + {lines.map((line) => ( + <>{line} + ))} + , + ]} + /> + ); + } + + // Doc provided as JSX - pass through unchanged + return source as Children; +} + From 1485d60dbeac3a168c40e4e15f2a53bb9a8dab28 Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Tue, 4 Nov 2025 22:44:56 +0000 Subject: [PATCH 23/25] Fix --- packages/emitter-framework/src/python/utils/doc.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/emitter-framework/src/python/utils/doc.tsx b/packages/emitter-framework/src/python/utils/doc.tsx index b7b874eeec1..eb75a9c8abe 100644 --- a/packages/emitter-framework/src/python/utils/doc.tsx +++ b/packages/emitter-framework/src/python/utils/doc.tsx @@ -2,11 +2,12 @@ import { type Children, type Component, List } from "@alloy-js/core"; /** * Normalize various doc sources into a Python doc element. + * The exact shape of the doc that will be created is determined by the DocComponent parameter. * * Accepts: - * - string → split into lines and render as a multi-line docstring - * - string[] | Children[] → rendered as separate paragraphs - * - Children (e.g., an explicit Doc component) → returned as-is + * - string - split into lines and render as a multi-line docstring + * - string[] | Children[] - rendered as separate paragraphs + * - Children (e.g., an explicit Doc component) - returned as-is * * @param source - The documentation source (string, array, or JSX) * @param DocComponent - The Python doc component to use (ClassDoc, FunctionDoc, MethodDoc, etc.) From 92c3704f216bbedb890708b17d6618581cddb18a Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Wed, 5 Nov 2025 19:35:10 +0000 Subject: [PATCH 24/25] Fix --- .../class-declaration.test.tsx | 24 +-- .../class-declaration/class-declaration.tsx | 57 +++--- .../class-declaration/class-member.test.tsx | 188 ++++++++++++++++++ .../class-declaration/class-member.tsx | 82 ++++---- .../class-declaration/class-method.tsx | 2 +- .../function-declaration.tsx | 1 - .../src/python/utils/doc.tsx | 3 +- .../src/python/utils/type.ts | 31 +++ 8 files changed, 294 insertions(+), 94 deletions(-) create mode 100644 packages/emitter-framework/src/python/components/class-declaration/class-member.test.tsx create mode 100644 packages/emitter-framework/src/python/utils/type.ts diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx index f8b7dfe7854..9fcf3c9edb2 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.test.tsx @@ -423,9 +423,7 @@ describe("Python Class from model", () => { } `); - expect( - getOutput(program, []), - ).toRenderTo( + expect(getOutput(program, [])).toRenderTo( ` from dataclasses import dataclass from typing import Literal @@ -447,9 +445,7 @@ describe("Python Class from model", () => { } `); - expect( - getOutput(program, []), - ).toRenderTo( + expect(getOutput(program, [])).toRenderTo( ` from dataclasses import dataclass from typing import Literal @@ -1073,9 +1069,7 @@ describe("Python Class overrides", () => { } `); - expect( - getOutput(program, []), - ).toRenderTo(` + expect(getOutput(program, [])).toRenderTo(` from dataclasses import dataclass from typing import Generic from typing import TypeVar @@ -1098,9 +1092,7 @@ describe("Python Class overrides", () => { } `); - expect( - getOutput(program, []), - ).toRenderTo(` + expect(getOutput(program, [])).toRenderTo(` from dataclasses import dataclass from typing import Generic from typing import TypeVar @@ -1122,9 +1114,7 @@ describe("Python Class overrides", () => { } `); - expect( - getOutput(program, []), - ).toRenderTo(` + expect(getOutput(program, [])).toRenderTo(` from dataclasses import dataclass from typing import Generic from typing import TypeVar @@ -1185,9 +1175,7 @@ describe("Python Class overrides", () => { } `); - expect( - getOutput(program, []), - ).toRenderTo(` + expect(getOutput(program, [])).toRenderTo(` from abc import ABC from abc import abstractmethod from dataclasses import dataclass diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx index 694256864ee..47808a245a5 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx @@ -1,5 +1,5 @@ import { abcModule, typingModule } from "#python/builtins.js"; -import { type Children, code, createContentSlot, For, List, mapJoin, Show } from "@alloy-js/core"; +import { code, createContentSlot, For, mapJoin, Show, type Children } from "@alloy-js/core"; import * as py from "@alloy-js/python"; import { isTemplateDeclaration, @@ -53,12 +53,11 @@ function getTypeMembers($: Typekit, type: Model | Interface): (ModelProperty | O } } - /** * Creates the class body for the class declaration. * Returns a ClassBody component if there are members or children to render, * otherwise returns undefined (which will render "pass" in Python). - * + * * @param $ - The Typekit. * @param props - The props for the class declaration. * @param abstract - Whether the class is abstract. @@ -74,21 +73,21 @@ function createClassBody($: Typekit, props: ClassDeclarationProps, abstract: boo ); } - + const validTypeMembers = getTypeMembers($, props.type); - + return ; } /** * Creates the extends types for the class declaration. - * + * * - Template instances (e.g., `Response` → `Response[str]`) - Use TypeExpression to render with type args * - Partial templates (e.g., `Response -> Response[T]`) - Use TypeExpression to render with type args * - Regular models (e.g., `BaseWidget`) - Use py.Reference for simple name resolution * - Arrays - Use TypeExpression for `typing.Sequence[T]` rendering * - Records - Not supported, ignored - * + * * @param $ - The Typekit. * @param type - The type to create the extends type for. * @returns The extends types for the class declaration, or undefined for interfaces. @@ -123,14 +122,20 @@ function getExtendsType($: Typekit, type: Model | Interface): Children | undefin extending.push(); } - return extending.length > 0 ? mapJoin(() => extending, (ext) => ext, { joiner: "," }) : undefined; + return extending.length > 0 + ? mapJoin( + () => extending, + (ext) => ext, + { joiner: "," }, + ) + : undefined; } /** * Creates the bases (inheritance) list for the class declaration. * Combines explicit bases from props, inherited bases from the type, and ABC if abstract. * ABC is always added last to maintain proper Python MRO. - * + * * @param $ - The Typekit. * @param props - The props for the class declaration. * @param abstract - Whether the class is abstract. @@ -150,10 +155,10 @@ function createBasesType( extraBases.push(extend); } } - + // Combine explicit bases from props with extraBases (Generic, extends, etc.) const allBases = (props.bases ?? []).concat(extraBases); - + // For non-abstract classes, return bases or undefined if (!abstract) { return allBases.length > 0 ? allBases : undefined; @@ -166,7 +171,7 @@ function createBasesType( /** * Builds TypeVar declarations and the Generic[...] base for templated types. - * + * * **Template Detection Logic**: * Uses TypeSpec's `isTemplateDeclaration` utility to correctly identify: * - **Template Declaration** (e.g., `model Response`) - Generate TypeVars @@ -174,7 +179,7 @@ function createBasesType( * - **Partial Template** (e.g., nested `Op` inside `interface Foo`) - Skip TypeVars * - **Nested Template** (e.g., `interface Foo { op: Op }`) - Skip TypeVars * - **Regular Type** (e.g., `model Widget`) - Skip TypeVars - * + * * @param $ - The Typekit * @param type - The model or interface type to analyze * @returns TypeVar declarations and Generic base, or null if not a template declaration @@ -203,23 +208,21 @@ function buildTypeVarsAndGenericBase( {(node) => { // Build TypeVar arguments: name + optional bound const typeVarArgs: Children[] = []; - + // Check if template parameter has a constraint (bound) if (node.constraint) { // Converts the AST node to a TypeSpec type const constraintType = $.program.checker.getTypeForNode(node.constraint); typeVarArgs.push( <> - bound= - + bound= + + , ); } - + const typeVar = ( - + ); return ; }} @@ -231,10 +234,8 @@ function buildTypeVarsAndGenericBase( for (const templateParameter of templateParameters) { typeArgs.push(code`${templateParameter.id.sv}`); } - - const genericBase = ( - - ); + + const genericBase = ; return { typeVars, genericBase }; } @@ -259,7 +260,7 @@ export function ClassDeclaration(props: ClassDeclarationProps) { // If we are explicitly overriding the class as abstract or the type is not a model, we need to create an abstract class const abstract = ("abstract" in props && props.abstract) || ("type" in props && !$.model.is(props.type)); - + const docSource = props.doc ?? ("type" in props ? $.type.getDoc(props.type) : undefined); const docElement = createDocElement(docSource, py.ClassDoc); @@ -295,7 +296,7 @@ export function ClassDeclaration(props: ClassDeclarationProps) { name = namePolicy.getName(name, "class"); const refkeys = declarationRefkeys(props.refkey, props.type); - + // Check for models with additional properties (Record-based scenarios) // This check must happen here (in addition to ClassBody) because models with no properties // (e.g., `model Foo is Record`) won't render a ClassBody, so the error would never be thrown @@ -305,7 +306,7 @@ export function ClassDeclaration(props: ClassDeclarationProps) { throw new Error("Models with additional properties (Record[…]) are not supported"); } } - + // Array-based models (e.g., model Foo is Array) use regular classes, not dataclasses, // since Array models in TypeSpec can't have properties, so they behave more like a class // that inherits from a list. diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-member.test.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-member.test.tsx new file mode 100644 index 00000000000..ad86d37a2e2 --- /dev/null +++ b/packages/emitter-framework/src/python/components/class-declaration/class-member.test.tsx @@ -0,0 +1,188 @@ +import { Tester } from "#test/test-host.js"; +import { t } from "@typespec/compiler/testing"; +import { describe, expect, it } from "vitest"; +import { ClassDeclaration } from "../../../../src/python/components/class-declaration/class-declaration.js"; +import { getOutput } from "../../test-utils.jsx"; + +describe("Python Class Members", () => { + describe("default values", () => { + it("renders string default values", async () => { + const { program, MyModel } = await Tester.compile(t.code` + model ${t.model("MyModel")} { + name: string = "default"; + description?: string = "optional with default"; + emptyString: string = ""; + } + `); + + expect(getOutput(program, [])).toRenderTo( + ` + from dataclasses import dataclass + from typing import Optional + + @dataclass(kw_only=True) + class MyModel: + name: str = "default" + description: Optional[str] = "optional with default" + empty_string: str = "" + + `, + ); + }); + + it("renders boolean default values", async () => { + const { program, BooleanModel } = await Tester.compile(t.code` + model ${t.model("BooleanModel")} { + isActive: boolean = true; + isDeleted: boolean = false; + optional?: boolean = true; + } + `); + + expect(getOutput(program, [])).toRenderTo( + ` + from dataclasses import dataclass + from typing import Optional + + @dataclass(kw_only=True) + class BooleanModel: + is_active: bool = True + is_deleted: bool = False + optional: Optional[bool] = True + + `, + ); + }); + + it("renders array default values", async () => { + const { program, ArrayModel } = await Tester.compile(t.code` + model ${t.model("ArrayModel")} { + tags: string[] = #["tag1", "tag2"]; + emptyArray: int32[] = #[]; + numbers: int32[] = #[1, 2, 3]; + } + `); + + expect(getOutput(program, [])).toRenderTo( + ` + from dataclasses import dataclass + + @dataclass(kw_only=True) + class ArrayModel: + tags: list[str] = ["tag1", "tag2"] + empty_array: list[int] = [] + numbers: list[int] = [1, 2, 3] + + `, + ); + }); + + it("renders integer default values without .0 suffix", async () => { + const { program, IntegerModel } = await Tester.compile(t.code` + model ${t.model("IntegerModel")} { + count: int32 = 42; + bigNumber: int64 = 1000000; + smallNumber: int8 = 127; + unsignedValue: uint32 = 100; + safeIntValue: safeint = 999; + } + `); + + expect(getOutput(program, [])).toRenderTo( + ` + from dataclasses import dataclass + + @dataclass(kw_only=True) + class IntegerModel: + count: int = 42 + big_number: int = 1000000 + small_number: int = 127 + unsigned_value: int = 100 + safe_int_value: int = 999 + + `, + ); + }); + + it("renders float and decimal default values correctly", async () => { + const { program, NumericDefaults } = await Tester.compile(t.code` + + scalar customFloat extends float; + scalar customDecimal extends decimal; + + model ${t.model("NumericDefaults")} { + // Float variants with decimal values + floatBase: float = 1.5; + float32Value: float32 = 2.5; + float64Value: float64 = 3.5; + customFloatValue: customFloat = 4.5; + + // Float variants with integer values (should render with .0) + floatInt: float = 10; + float32Int: float32 = 20; + float64Int: float64 = 30; + + // Decimal variants + decimalBase: decimal = 100.25; + decimal128Value: decimal128 = 200.75; + customDecimalValue: customDecimal = 300.125; + + // Decimal with integer values (should render with .0) + decimalInt: decimal = 400; + decimal128Int: decimal128 = 500; + } + `); + + expect(getOutput(program, [])).toRenderTo( + ` + from dataclasses import dataclass + from decimal import Decimal + + @dataclass(kw_only=True) + class NumericDefaults: + float_base: float = 1.5 + float32_value: float = 2.5 + float64_value: float = 3.5 + custom_float_value: float = 4.5 + float_int: float = 10.0 + float32_int: float = 20.0 + float64_int: float = 30.0 + decimal_base: Decimal = 100.25 + decimal128_value: Decimal = 200.75 + custom_decimal_value: Decimal = 300.125 + decimal_int: Decimal = 400.0 + decimal128_int: Decimal = 500.0 + + `, + ); + }); + + it("distinguishes between integer and float types with same numeric value", async () => { + const { program, MixedNumeric } = await Tester.compile(t.code` + model ${t.model("MixedNumeric")} { + intValue: int32 = 100; + int64Value: int64 = 100; + floatValue: float = 100; + float64Value: float64 = 100; + decimalValue: decimal = 100; + } + `); + + expect(getOutput(program, [])).toRenderTo( + ` + from dataclasses import dataclass + from decimal import Decimal + + @dataclass(kw_only=True) + class MixedNumeric: + int_value: int = 100 + int64_value: int = 100 + float_value: float = 100.0 + float64_value: float = 100.0 + decimal_value: Decimal = 100.0 + + `, + ); + }); + }); +}); diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx index b18dc5cc2b2..27dab446ceb 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-member.tsx @@ -4,6 +4,7 @@ import * as py from "@alloy-js/python"; import { type ModelProperty, type Operation } from "@typespec/compiler"; import { useTsp } from "../../../core/context/tsp-context.js"; import { efRefkey } from "../../utils/refkey.js"; +import { areAllLiterals } from "../../utils/type.js"; import { Atom } from "../atom/atom.jsx"; import { TypeExpression } from "../type-expression/type-expression.jsx"; import { Method } from "./class-method.jsx"; @@ -45,13 +46,7 @@ function buildPrimitiveInitializerFromDefault( if (raw && typeof raw === "object" && "value" in raw) raw = raw.value; // Float-like property types (including custom subtypes) should render with float hint - if ( - $.scalar.extendsFloat(propertyType) || - $.scalar.extendsFloat32(propertyType) || - $.scalar.extendsFloat64(propertyType) || - $.scalar.extendsDecimal(propertyType) || - $.scalar.extendsDecimal128(propertyType) - ) { + if ($.scalar.extendsFloat(propertyType) || $.scalar.extendsDecimal(propertyType)) { return ; } @@ -73,13 +68,13 @@ function buildPrimitiveInitializerFromDefault( * - Union of boolean literals: true | false produces Literal[True, False] * - Union of variant references: Color.red | Color.blue produces Literal[Color.RED, Color.BLUE] * - Mixed literal unions: "a" | 1 | true | Color.RED produces Literal["a", 1, True, Color.RED] - * + * * @param unpackedType - The unpacked type. * @returns The type node, or undefined if the type doesn't match any supported literal pattern. */ function buildTypeNodeForProperty(unpackedType: any): Children | undefined { const { $ } = useTsp(); - + // Single union variant reference - Literal[Color.MEMBER] if (unpackedType && unpackedType.kind === "UnionVariant" && unpackedType.union) { const unionType = unpackedType.union; @@ -102,43 +97,42 @@ function buildTypeNodeForProperty(unpackedType: any): Children | undefined { Array.isArray((unpackedType as any).options) ) { const opts: any[] = (unpackedType as any).options; - - // Check if all options are valid literal types using typekit - const allLiterals = opts.every((opt) => - opt && ( - $.literal.isString(opt) || - $.literal.isNumeric(opt) || - $.literal.isBoolean(opt) || - opt.kind === "UnionVariant" - ) - ); - - if (allLiterals) { - const literalValues = opts.map((opt) => { - if ($.literal.isString(opt)) { - // String literals need quotes - return JSON.stringify(opt.value); - } else if ($.literal.isNumeric(opt)) { - // Number literals render directly - return String(opt.value); - } else if ($.literal.isBoolean(opt)) { - // Boolean literals render as True/False (Python capitalization) - return opt.value ? "True" : "False"; - } else if (opt.kind === "UnionVariant") { - // Variant references need enum reference - const variantValue = opt.type; - const enumMemberName = - variantValue && typeof variantValue.value === "string" - ? variantValue.value - : String(variantValue?.value ?? ""); - return code`${efRefkey(opt.union)}.${enumMemberName}`; - } - return undefined; - }).filter(Boolean); - + + // Check if all options are valid literal types + if (areAllLiterals($, opts)) { + const literalValues = opts + .map((opt) => { + if ($.literal.isString(opt)) { + // String literals need quotes + return JSON.stringify(opt.value); + } else if ($.literal.isNumeric(opt)) { + // Number literals render directly + return String(opt.value); + } else if ($.literal.isBoolean(opt)) { + // Boolean literals render as True/False (Python capitalization) + return opt.value ? "True" : "False"; + } else if (opt.kind === "UnionVariant") { + // Variant references need enum reference + const variantValue = opt.type; + const enumMemberName = + variantValue && typeof variantValue.value === "string" + ? variantValue.value + : String(variantValue?.value ?? ""); + return code`${efRefkey(opt.union)}.${enumMemberName}`; + } + return undefined; + }) + .filter(Boolean); + return ( <> - {typingModule["."]["Literal"]}[{mapJoin(() => literalValues, (val) => val, { joiner: ", " })}] + {typingModule["."]["Literal"]}[ + {mapJoin( + () => literalValues, + (val) => val, + { joiner: ", " }, + )} + ] ); } diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-method.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-method.tsx index 18429070c65..0298e6338ca 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-method.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-method.tsx @@ -53,7 +53,7 @@ export function Method(props: Readonly) { // unless explicitly overridden by props.abstract === false const abstractFlag = (() => { const explicit = (props as any).abstract as boolean | undefined; - return explicit ?? (!isTypeSpecTyped ? false : undefined) + return explicit ?? (!isTypeSpecTyped ? false : undefined); })(); /** diff --git a/packages/emitter-framework/src/python/components/function-declaration/function-declaration.tsx b/packages/emitter-framework/src/python/components/function-declaration/function-declaration.tsx index 2073ee970ab..79d64aa7b49 100644 --- a/packages/emitter-framework/src/python/components/function-declaration/function-declaration.tsx +++ b/packages/emitter-framework/src/python/components/function-declaration/function-declaration.tsx @@ -1,7 +1,6 @@ import { useTsp } from "#core/index.js"; import { buildParameterDescriptors } from "#python/utils/operation.js"; import { declarationRefkeys } from "#python/utils/refkey.js"; -import { type Children } from "@alloy-js/core"; import * as py from "@alloy-js/python"; import type { Model, Operation } from "@typespec/compiler"; import { createDocElement } from "../../utils/doc.jsx"; diff --git a/packages/emitter-framework/src/python/utils/doc.tsx b/packages/emitter-framework/src/python/utils/doc.tsx index eb75a9c8abe..9b197a8f315 100644 --- a/packages/emitter-framework/src/python/utils/doc.tsx +++ b/packages/emitter-framework/src/python/utils/doc.tsx @@ -8,7 +8,7 @@ import { type Children, type Component, List } from "@alloy-js/core"; * - string - split into lines and render as a multi-line docstring * - string[] | Children[] - rendered as separate paragraphs * - Children (e.g., an explicit Doc component) - returned as-is - * + * * @param source - The documentation source (string, array, or JSX) * @param DocComponent - The Python doc component to use (ClassDoc, FunctionDoc, MethodDoc, etc.) * @returns The rendered doc element, or undefined if no documentation @@ -45,4 +45,3 @@ export function createDocElement( // Doc provided as JSX - pass through unchanged return source as Children; } - diff --git a/packages/emitter-framework/src/python/utils/type.ts b/packages/emitter-framework/src/python/utils/type.ts new file mode 100644 index 00000000000..8058f3a37af --- /dev/null +++ b/packages/emitter-framework/src/python/utils/type.ts @@ -0,0 +1,31 @@ +import type { Typekit } from "@typespec/compiler/typekit"; + +/** + * Check if a type is a literal type (string, numeric, boolean, or union variant). + * This is useful for determining if a type can be used in a Python Literal[] type. + * + * @param $ - The Typekit instance + * @param type - The type to check + * @returns true if the type is a literal type + */ +export function isLiteral($: Typekit, type: any): boolean { + if (!type) return false; + + return ( + $.literal.isString(type) || + $.literal.isNumeric(type) || + $.literal.isBoolean(type) || + type.kind === "UnionVariant" + ); +} + +/** + * Check if all types in an array are literal types. + * + * @param $ - The Typekit instance + * @param types - Array of types to check + * @returns true if all types are literals + */ +export function areAllLiterals($: Typekit, types: any[]): boolean { + return types.every((type) => isLiteral($, type)); +} From ab879d7eb4061d77c1796cce67837d12b8954804 Mon Sep 17 00:00:00 2001 From: Mauricio Gardini Date: Mon, 10 Nov 2025 19:46:10 +0000 Subject: [PATCH 25/25] Changing docstrings --- .../class-declaration/class-declaration.tsx | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx index 47808a245a5..5c73a54251c 100644 --- a/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx +++ b/packages/emitter-framework/src/python/components/class-declaration/class-declaration.tsx @@ -173,12 +173,12 @@ function createBasesType( * Builds TypeVar declarations and the Generic[...] base for templated types. * * **Template Detection Logic**: - * Uses TypeSpec's `isTemplateDeclaration` utility to correctly identify: - * - **Template Declaration** (e.g., `model Response`) - Generate TypeVars - * - **Template Instance** (e.g., `Response`) - Skip TypeVars - * - **Partial Template** (e.g., nested `Op` inside `interface Foo`) - Skip TypeVars - * - **Nested Template** (e.g., `interface Foo { op: Op }`) - Skip TypeVars - * - **Regular Type** (e.g., `model Widget`) - Skip TypeVars + * Only generates TypeVars for true template declarations (e.g., `model Response` or `interface Foo`). + * + * Skips TypeVars for: + * - **Template Instances** - e.g., `Response` (concrete type instantiation) + * - **Operations in Template Interfaces** - e.g., `interface Foo { op(item: T): T }` (operations inherit parent's template params) + * - **Regular Types** - e.g., `model Widget` (no template parameters) * * @param $ - The Typekit * @param type - The model or interface type to analyze @@ -188,12 +188,8 @@ function buildTypeVarsAndGenericBase( $: Typekit, type: Model | Interface, ): { typeVars: Children | null; genericBase?: Children } { - // Ensuring that we only generate TypeVars for true template declarations - // Correctly handles all edge cases: - // - Partial template mappers - // - Nested template mappers - // - Template instances - // - Regular types + // Only generate TypeVars for true template declarations + // (skips template instances, operations in template interfaces, and regular types) if (!isTemplateDeclaration(type)) { return { typeVars: null }; }