diff --git a/.changeset/add-vanilla-web-component-example.md b/.changeset/add-vanilla-web-component-example.md new file mode 100644 index 00000000..2ef62b1e --- /dev/null +++ b/.changeset/add-vanilla-web-component-example.md @@ -0,0 +1,5 @@ +--- +"@openworkflowspec/vanilla-web-component-example": minor +--- + +Add a non-React host example for the Diagram Editor diff --git a/.changeset/validate-color-mode-input.md b/.changeset/validate-color-mode-input.md new file mode 100644 index 00000000..5cd13e24 --- /dev/null +++ b/.changeset/validate-color-mode-input.md @@ -0,0 +1,5 @@ +--- +"@openworkflowspec/diagram-editor": patch +--- + +Validate colorMode input in useResolvedColorMode, falling back to "system" for unknown values. diff --git a/examples/vanilla-web-component/.oxfmtrc.json b/examples/vanilla-web-component/.oxfmtrc.json new file mode 100644 index 00000000..0de643fc --- /dev/null +++ b/examples/vanilla-web-component/.oxfmtrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["../../.oxfmtrc.json"] +} diff --git a/examples/vanilla-web-component/.oxlintrc.json b/examples/vanilla-web-component/.oxlintrc.json new file mode 100644 index 00000000..804b9227 --- /dev/null +++ b/examples/vanilla-web-component/.oxlintrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["../../.oxlintrc.json"] +} diff --git a/examples/vanilla-web-component/README.md b/examples/vanilla-web-component/README.md new file mode 100644 index 00000000..b0108707 --- /dev/null +++ b/examples/vanilla-web-component/README.md @@ -0,0 +1,76 @@ + + +# @openworkflowspec/vanilla-web-component-example + +This example demonstrates how to embed the `@openworkflowspec/diagram-editor` React component in a **non-React** host application using a Web Component. + +## Quick Start + +From the **repository root**: + +```bash +pnpm install +pnpm --filter @openworkflowspec/vanilla-web-component-example start +``` + +Browse http://localhost:6007 + +## How It Works + +The wrapper in `src/diagram-editor-element.ts` defines a custom element `` that: + +1. Creates a React root inside itself +2. Renders the `DiagramEditor` React component +3. Re-renders when attributes or properties change +4. Unmounts the React root on disconnect + +### HTMLElement attributes + +| Attribute / Property | Type | Default | Description | +| -------------------- | ------------------------------- | ---------- | -------------------------------------------------------- | +| `content` (property) | `string` | - | Serverless Workflow specification in YAML or JSON format | +| `locale` | `string` | - | Language locale for the editor UI | +| `color-mode` | `'light' \| 'dark' \| 'system'` | `"system"` | Color theme for the editor | +| `read-only` | boolean | - | Enable read-only mode to prevent editing | + +### Usage + +```html + + + +``` + +### CSS + +The entry point (`src/index.ts`) imports `@openworkflowspec/diagram-editor/styles.css`. All editor styles are scoped under `.dec-root` with prefixed Tailwind classes. diff --git a/examples/vanilla-web-component/index.html b/examples/vanilla-web-component/index.html new file mode 100644 index 00000000..192a0eb0 --- /dev/null +++ b/examples/vanilla-web-component/index.html @@ -0,0 +1,57 @@ + + + + + + + Diagram Editor — Web Component Example + + + +

Diagram Editor — Web Component Example

+ + + + + diff --git a/examples/vanilla-web-component/package.json b/examples/vanilla-web-component/package.json new file mode 100644 index 00000000..be3f07f3 --- /dev/null +++ b/examples/vanilla-web-component/package.json @@ -0,0 +1,48 @@ +{ + "name": "@openworkflowspec/vanilla-web-component-example", + "version": "1.0.0", + "private": true, + "description": "non-React example embedding the open workflow diagram component", + "keywords": [], + "homepage": "https://github.com/open-workflow-specification/editor", + "bugs": { + "url": "https://github.com/open-workflow-specification/editor/issues" + }, + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/open-workflow-specification/editor.git" + }, + "type": "module", + "scripts": { + "typecheck": "tsc --noEmit", + "lint": "oxlint --config .oxlintrc.json src/ tests/", + "format": "oxfmt --config .oxfmtrc.json", + "format:check": "oxfmt --config .oxfmtrc.json --check", + "clean": "rimraf ./dist", + "build:dev": "pnpm clean && tsc -p tsconfig.json && vite build", + "build:prod": "pnpm lint && pnpm clean && tsc -p tsconfig.json && vite build && pnpm test && pnpm test-e2e", + "test": "vitest run", + "start": "vite", + "test-e2e": "playwright test", + "test-e2e:ui": "playwright test --ui" + }, + "dependencies": { + "@openworkflowspec/diagram-editor": "workspace:*", + "react": "catalog:", + "react-dom": "catalog:" + }, + "devDependencies": { + "@playwright/test": "catalog:", + "@testing-library/dom": "catalog:", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "jsdom": "catalog:", + "oxfmt": "catalog:", + "oxlint": "catalog:", + "rimraf": "catalog:", + "typescript": "catalog:", + "vite": "catalog:", + "vitest": "catalog:" + } +} diff --git a/examples/vanilla-web-component/playwright.config.ts b/examples/vanilla-web-component/playwright.config.ts new file mode 100644 index 00000000..768e00bc --- /dev/null +++ b/examples/vanilla-web-component/playwright.config.ts @@ -0,0 +1,36 @@ +/* + * Copyright 2021-Present The Open Workflow Specification Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { defineConfig } from "@playwright/test"; + +export default defineConfig({ + testDir: "tests-e2e", + + expect: { + timeout: 30000, + }, + + use: { + baseURL: "http://localhost:6007", + }, + + webServer: { + command: "pnpm start", + url: "http://localhost:6007", + reuseExistingServer: !process.env.CI, + timeout: 120 * 1000, + }, +}); diff --git a/examples/vanilla-web-component/src/diagram-editor-element.ts b/examples/vanilla-web-component/src/diagram-editor-element.ts new file mode 100644 index 00000000..7879e6bc --- /dev/null +++ b/examples/vanilla-web-component/src/diagram-editor-element.ts @@ -0,0 +1,73 @@ +/* + * Copyright 2021-Present The Open Workflow Specification Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// React is required internally by @openworkflowspec/diagram-editor. +// This wrapper encapsulates it behind a standard Custom Element API, +// so host applications don't need to interact with React directly. +import { createElement } from "react"; +import { createRoot, type Root } from "react-dom/client"; +import { DiagramEditor } from "@openworkflowspec/diagram-editor"; +import type { DiagramEditorProps, ColorMode } from "@openworkflowspec/diagram-editor"; + +export class DiagramEditorElement extends HTMLElement { + static observedAttributes = ["locale", "color-mode", "read-only"]; + + private _root: Root | null = null; + private _mountPoint: HTMLDivElement | null = null; + private _content = ""; + + get content(): string { + return this._content; + } + + set content(value: string) { + this._content = value; + this.render(); + } + + connectedCallback(): void { + this._mountPoint = document.createElement("div"); + this._mountPoint.style.height = "100%"; + this._mountPoint.dataset.testid = "diagram-editor-mount-point"; + this.appendChild(this._mountPoint); + this._root = createRoot(this._mountPoint); + this.render(); + } + + disconnectedCallback(): void { + this._root?.unmount(); + this._root = null; + this._mountPoint?.remove(); + this._mountPoint = null; + } + + attributeChangedCallback(): void { + this.render(); + } + + private render(): void { + if (!this._root) return; + + const props: DiagramEditorProps = { + content: this._content, + locale: this.getAttribute("locale") ?? "en", + isReadOnly: this.hasAttribute("read-only"), + colorMode: (this.getAttribute("color-mode") as ColorMode) ?? "system", + }; + + this._root.render(createElement(DiagramEditor, props)); + } +} diff --git a/examples/vanilla-web-component/src/index.ts b/examples/vanilla-web-component/src/index.ts new file mode 100644 index 00000000..f5930fa6 --- /dev/null +++ b/examples/vanilla-web-component/src/index.ts @@ -0,0 +1,22 @@ +/* + * Copyright 2021-Present The Open Workflow Specification Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "@openworkflowspec/diagram-editor/styles.css"; +import { DiagramEditorElement } from "./diagram-editor-element"; + +if (!customElements.get("openworkflowspec-diagram-editor")) { + customElements.define("openworkflowspec-diagram-editor", DiagramEditorElement); +} diff --git a/examples/vanilla-web-component/src/sample-workflow.ts b/examples/vanilla-web-component/src/sample-workflow.ts new file mode 100644 index 00000000..898fa0ed --- /dev/null +++ b/examples/vanilla-web-component/src/sample-workflow.ts @@ -0,0 +1,79 @@ +/* + * Copyright 2021-Present The Open Workflow Specification Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const sampleWorkflow = `document: + dsl: '1.0.3' + namespace: examples + name: accumulate-room-readings + version: '0.1.0' + title: "Test Workflow Title" + summary: "A test workflow with metadata" + tags: + iot: Internet of Things + sensors: Sensor data + readings: Room readings +do: + - consumeReading: + listen: + to: + all: + - with: + source: https://my.home.com/sensor + type: my.home.sensors.temperature + correlate: + roomId: + from: .roomid + - with: + source: https://my.home.com/sensor + type: my.home.sensors.humidity + correlate: + roomId: + from: .roomid + output: + as: .data.reading + - logReading: + for: + each: reading + in: .readings + do: + - callOrderService: + call: openapi + with: + document: + endpoint: http://myorg.io/ordersservices.json + operationId: logreading + - generateReport: + call: openapi + with: + document: + endpoint: http://myorg.io/ordersservices.json + operationId: produceReport + - emitEvent: + emit: + event: + with: + source: https://petstore.com + type: com.petstore.order.placed.v1 + data: + client: + firstName: Cruella + lastName: de Vil + items: + - breed: dalmatian + quantity: 101 +timeout: + after: + hours: 1`; diff --git a/examples/vanilla-web-component/tests-e2e/diagram-editor.spec.ts b/examples/vanilla-web-component/tests-e2e/diagram-editor.spec.ts new file mode 100644 index 00000000..2983479c --- /dev/null +++ b/examples/vanilla-web-component/tests-e2e/diagram-editor.spec.ts @@ -0,0 +1,50 @@ +/* + * Copyright 2021-Present The Open Workflow Specification Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { test, expect } from "@playwright/test"; + +test("web component renders the diagram editor", async ({ page }) => { + await page.goto("/"); + + await expect(page.getByTestId("diagram-container")).toBeVisible(); + + await expect(page.getByTestId("rf__node-/do/consumeReading")).toContainText("consumeReading"); +}); + +test("web component re-renders when content is replaced", async ({ page }) => { + await page.goto("/"); + + await expect(page.getByTestId("rf__node-/do/consumeReading")).toContainText("consumeReading"); + + const newWorkflow = `document: + dsl: '1.0.3' + namespace: examples + name: greet +do: + - sayHello: + call: http + with: + method: get + endpoint: https://example.com/hello`; + + await page.evaluate((yaml) => { + const editor = document.querySelector("openworkflowspec-diagram-editor") as any; + editor.content = yaml; + }, newWorkflow); + + await expect(page.getByTestId("rf__node-/do/sayHello")).toContainText("sayHello"); + await expect(page.getByTestId("rf__node-/do/consumeReading")).not.toBeVisible(); +}); diff --git a/examples/vanilla-web-component/tests/diagram-editor-element.test.ts b/examples/vanilla-web-component/tests/diagram-editor-element.test.ts new file mode 100644 index 00000000..e1fe2b5c --- /dev/null +++ b/examples/vanilla-web-component/tests/diagram-editor-element.test.ts @@ -0,0 +1,88 @@ +/* + * Copyright 2021-Present The Open Workflow Specification Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, expect, vi, beforeAll, afterEach } from "vitest"; +import { screen } from "@testing-library/dom"; +import { DiagramEditorElement } from "../src/diagram-editor-element"; + +let lastProps: Record | null = null; + +vi.mock("@openworkflowspec/diagram-editor", () => ({ + DiagramEditor: (props: Record) => { + lastProps = props; + return null; + }, +})); + +vi.mock("@openworkflowspec/diagram-editor/styles.css", () => ({})); + +beforeAll(() => { + if (!customElements.get("openworkflowspec-diagram-editor")) { + customElements.define("openworkflowspec-diagram-editor", DiagramEditorElement); + } +}); + +afterEach(() => { + lastProps = null; + document.body.innerHTML = ""; +}); + +describe("DiagramEditorElement", () => { + function createElement(): DiagramEditorElement { + const el = document.createElement("openworkflowspec-diagram-editor") as DiagramEditorElement; + document.body.appendChild(el); + return el; + } + + it("is registered as a custom element", () => { + const el = createElement(); + expect(el).toBeInstanceOf(DiagramEditorElement); + expect(el).toBeInstanceOf(HTMLElement); + }); + + it("creates a mount point div on connect", () => { + createElement(); + expect(screen.getByTestId("diagram-editor-mount-point")).toBeDefined(); + }); + + it("renders DiagramEditor with default props", async () => { + createElement(); + await vi.waitFor(() => expect(lastProps).not.toBeNull()); + expect(lastProps).toEqual( + expect.objectContaining({ + content: "", + locale: "en", + isReadOnly: false, + colorMode: "system", + }), + ); + }); + + it("passes content via property setter", async () => { + const el = createElement(); + el.content = "document:\n dsl: '1.0.3'"; + await vi.waitFor(() => expect(lastProps?.content).toBe("document:\n dsl: '1.0.3'")); + }); + + it("re-renders when content is replaced with a different workflow", async () => { + const el = createElement(); + el.content = "document:\n dsl: '1.0.3'\n name: workflow-a"; + await vi.waitFor(() => expect(lastProps?.content).toContain("workflow-a")); + + el.content = "document:\n dsl: '1.0.3'\n name: workflow-b"; + await vi.waitFor(() => expect(lastProps?.content).toContain("workflow-b")); + }); +}); diff --git a/examples/vanilla-web-component/tsconfig.json b/examples/vanilla-web-component/tsconfig.json new file mode 100644 index 00000000..b48df2db --- /dev/null +++ b/examples/vanilla-web-component/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src", + "types": ["vite/client"] + }, + "include": ["src"] +} diff --git a/examples/vanilla-web-component/vite.config.ts b/examples/vanilla-web-component/vite.config.ts new file mode 100644 index 00000000..a78c2aaa --- /dev/null +++ b/examples/vanilla-web-component/vite.config.ts @@ -0,0 +1,30 @@ +/* + * Copyright 2021-Present The Open Workflow Specification Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { defineConfig } from "vite"; + +export default defineConfig({ + server: { + port: 6007, + }, + resolve: { + tsconfigPaths: true, + }, + build: { + emptyOutDir: false, + sourcemap: true, + }, +}); diff --git a/examples/vanilla-web-component/vitest.config.ts b/examples/vanilla-web-component/vitest.config.ts new file mode 100644 index 00000000..8c0c09bc --- /dev/null +++ b/examples/vanilla-web-component/vitest.config.ts @@ -0,0 +1,29 @@ +/* + * Copyright 2021-Present The Open Workflow Specification Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + resolve: { + tsconfigPaths: true, + }, + test: { + globals: true, + environment: "jsdom", + css: true, + include: ["tests/**/*.test.ts", "tests/**/*.test.tsx"], + }, +}); diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 6352834a..9123ef55 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -29,7 +29,7 @@ "clean": "rimraf ./dist", "build:dev": "pnpm clean && tsc -p tsconfig.json && vite build", "build:prod": "pnpm run build:dev && pnpm test", - "test": "vitest run --passWithNoTests" + "test": "vitest run" }, "devDependencies": { "@testing-library/jest-dom": "catalog:", diff --git a/packages/open-workflow-diagram-editor/README.md b/packages/open-workflow-diagram-editor/README.md index e5bf78d7..4d0c8d79 100644 --- a/packages/open-workflow-diagram-editor/README.md +++ b/packages/open-workflow-diagram-editor/README.md @@ -28,6 +28,11 @@ This package requires React 19 in the consuming application: npm install react@^19 react-dom@^19 ``` +## Non-React Usage + +If your application doesn't use React, you can embed the editor as a Web Component. +See the [Vanilla Web Component example](https://github.com/open-workflow-specification/editor/tree/main/examples/vanilla-web-component) for a working setup. + ## Installation ```bash diff --git a/packages/open-workflow-diagram-editor/package.json b/packages/open-workflow-diagram-editor/package.json index 97770239..3540322e 100644 --- a/packages/open-workflow-diagram-editor/package.json +++ b/packages/open-workflow-diagram-editor/package.json @@ -34,7 +34,7 @@ "clean:storybook": "rimraf ./dist-storybook", "build:dev": "pnpm clean && tsc -p tsconfig.json && vite build", "build:prod": "pnpm lint && pnpm clean && tsc -p tsconfig.json && vite build && pnpm test && pnpm test-e2e", - "test": "vitest run --passWithNoTests", + "test": "vitest run", "start": "storybook dev -p 6006 --no-open", "build:storybook": "pnpm clean:storybook && storybook build --output-dir ./dist-storybook", "test-e2e": "playwright test", diff --git a/packages/open-workflow-diagram-editor/src/hooks/useResolvedColorMode.ts b/packages/open-workflow-diagram-editor/src/hooks/useResolvedColorMode.ts index ac99b59a..1e633744 100644 --- a/packages/open-workflow-diagram-editor/src/hooks/useResolvedColorMode.ts +++ b/packages/open-workflow-diagram-editor/src/hooks/useResolvedColorMode.ts @@ -19,6 +19,10 @@ import { ColorMode, ResolvedColorMode } from "../types/colorMode"; const DARK_MEDIA_QUERY = "(prefers-color-scheme: dark)"; +function normalizeColorMode(colorMode: string): ColorMode { + return colorMode === "light" || colorMode === "dark" || colorMode === "system" ? colorMode : "system"; +} + function getSystemColorMode(): ResolvedColorMode { if (typeof window !== "undefined" && typeof window.matchMedia === "function") { return window.matchMedia(DARK_MEDIA_QUERY).matches ? "dark" : "light"; @@ -27,13 +31,15 @@ function getSystemColorMode(): ResolvedColorMode { } export function useResolvedColorMode(colorMode: ColorMode): ResolvedColorMode { + const normalized = normalizeColorMode(colorMode); + const [resolvedColorMode, setResolvedColorMode] = useState( - colorMode === "system" ? getSystemColorMode() : colorMode, + normalized === "system" ? getSystemColorMode() : normalized, ); useEffect(() => { - if (colorMode !== "system") { - setResolvedColorMode(colorMode); + if (normalized !== "system") { + setResolvedColorMode(normalized); return; } @@ -48,7 +54,7 @@ export function useResolvedColorMode(colorMode: ColorMode): ResolvedColorMode { return () => { mediaQuery.removeEventListener("change", handler); }; - }, [colorMode]); + }, [normalized]); return resolvedColorMode; } diff --git a/packages/open-workflow-diagram-editor/tests/hooks/useResolvedColorMode.test.ts b/packages/open-workflow-diagram-editor/tests/hooks/useResolvedColorMode.test.ts index e6dccff6..fa1a0361 100644 --- a/packages/open-workflow-diagram-editor/tests/hooks/useResolvedColorMode.test.ts +++ b/packages/open-workflow-diagram-editor/tests/hooks/useResolvedColorMode.test.ts @@ -80,6 +80,13 @@ describe("useResolvedColorMode", () => { expect(result.current).toBe("dark"); }); + it('resolves an unknown colorMode value to the system preference', () => { + matchesDark = false; + // @ts-expect-error testing runtime behavior with an invalid colorMode value + const { result } = renderHook(() => useResolvedColorMode("invalid")); + expect(result.current).toBe("light"); + }); + it("cleans up media query listener on unmount", () => { matchesDark = false; const { unmount } = renderHook(() => useResolvedColorMode("system")); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 76b2cfc7..fd6589e7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -171,6 +171,52 @@ importers: specifier: 'catalog:' version: 7.0.2 + examples/vanilla-web-component: + dependencies: + '@openworkflowspec/diagram-editor': + specifier: workspace:* + version: link:../../packages/open-workflow-diagram-editor + react: + specifier: 'catalog:' + version: 19.2.8 + react-dom: + specifier: 'catalog:' + version: 19.2.8(react@19.2.8) + devDependencies: + '@playwright/test': + specifier: 'catalog:' + version: 1.62.0 + '@testing-library/dom': + specifier: 'catalog:' + version: 10.4.1 + '@types/react': + specifier: 'catalog:' + version: 19.2.17 + '@types/react-dom': + specifier: 'catalog:' + version: 19.2.3(@types/react@19.2.17) + jsdom: + specifier: 'catalog:' + version: 30.0.1 + oxfmt: + specifier: 'catalog:' + version: 0.61.0 + oxlint: + specifier: 'catalog:' + version: 1.76.0 + rimraf: + specifier: 'catalog:' + version: 6.1.3 + typescript: + specifier: 'catalog:' + version: 7.0.2 + vite: + specifier: 'catalog:' + version: 8.1.5(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) + vitest: + specifier: 'catalog:' + version: 4.1.10(@types/node@26.1.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@vitest/ui@4.1.10)(jsdom@30.0.1)(vite@8.1.5(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) + packages/i18n: devDependencies: '@testing-library/jest-dom': diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index b3588595..5f010320 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,6 @@ packages: - packages/* + - examples/* catalog: "@changesets/changelog-github": ^0.7.0 "@changesets/cli": ^2.31.1