From d2ea3eb1332b004340691c345e05f4183106437a Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 22 May 2026 00:18:36 +0000 Subject: [PATCH 1/4] Split React bindings into @sigmacomputing/plugin-react package Move the SigmaClientProvider context and all React hooks (usePlugin, useConfig, useElementColumns, useElementData, useVariable, useUrlParameter, useInteraction, useActionTrigger, useActionEffect, usePluginStyle, useEditorPanelConfig, useLoadingState, usePaginatedElementData) out of @sigmacomputing/plugin into a new packages/plugin-sdk-react workspace. The new package depends on @sigmacomputing/plugin and keeps react as a peer dependency. The framework-agnostic plugin-sdk no longer carries a react peer dep, and its public API now also exports initialize (which the moved test relies on and which is already documented as public). https://claude.ai/code/session_01AZefsCe7wagmamsoVfekuL --- packages/plugin-sdk-react/README.md | 48 +++++++++++++++++ packages/plugin-sdk-react/package.json | 53 +++++++++++++++++++ .../react => plugin-sdk-react/src}/Context.ts | 3 +- .../src}/Provider.tsx | 2 +- .../src}/__tests__/hooks.test.tsx | 6 +-- packages/plugin-sdk-react/src/deepEqual.ts | 23 ++++++++ .../react => plugin-sdk-react/src}/hooks.ts | 4 +- packages/plugin-sdk-react/src/index.ts | 3 ++ packages/plugin-sdk-react/tsconfig.app.json | 7 +++ packages/plugin-sdk-react/tsconfig.json | 12 +++++ packages/plugin-sdk-react/tsconfig.node.json | 7 +++ packages/plugin-sdk-react/tsdown.config.ts | 27 ++++++++++ packages/plugin-sdk-react/vitest.config.ts | 15 ++++++ packages/plugin-sdk/package.json | 8 --- packages/plugin-sdk/src/index.ts | 2 +- packages/plugin-sdk/src/react.ts | 3 -- yarn.lock | 19 ++++--- 17 files changed, 216 insertions(+), 26 deletions(-) create mode 100644 packages/plugin-sdk-react/README.md create mode 100644 packages/plugin-sdk-react/package.json rename packages/{plugin-sdk/src/react => plugin-sdk-react/src}/Context.ts (57%) rename packages/{plugin-sdk/src/react => plugin-sdk-react/src}/Provider.tsx (87%) rename packages/{plugin-sdk/src/react => plugin-sdk-react/src}/__tests__/hooks.test.tsx (99%) create mode 100644 packages/plugin-sdk-react/src/deepEqual.ts rename packages/{plugin-sdk/src/react => plugin-sdk-react/src}/hooks.ts (99%) create mode 100644 packages/plugin-sdk-react/src/index.ts create mode 100644 packages/plugin-sdk-react/tsconfig.app.json create mode 100644 packages/plugin-sdk-react/tsconfig.json create mode 100644 packages/plugin-sdk-react/tsconfig.node.json create mode 100644 packages/plugin-sdk-react/tsdown.config.ts create mode 100644 packages/plugin-sdk-react/vitest.config.ts delete mode 100644 packages/plugin-sdk/src/react.ts diff --git a/packages/plugin-sdk-react/README.md b/packages/plugin-sdk-react/README.md new file mode 100644 index 0000000..17eb086 --- /dev/null +++ b/packages/plugin-sdk-react/README.md @@ -0,0 +1,48 @@ +

+ + + + Sigma Logo + + +

+ +React bindings for the [`@sigmacomputing/plugin`](https://www.npmjs.com/package/@sigmacomputing/plugin) Client SDK. + +This package provides the `SigmaClientProvider` context provider and a set of +React hooks (`usePlugin`, `useConfig`, `useElementColumns`, `useElementData`, +etc.) that wrap the framework-agnostic client exported from +`@sigmacomputing/plugin`. + +## Installation + +```sh +yarn add @sigmacomputing/plugin @sigmacomputing/plugin-react +# or +npm install @sigmacomputing/plugin @sigmacomputing/plugin-react +``` + +`react` (`>= 16.8`) is required as a peer dependency. + +## Usage + +```tsx +import { client } from '@sigmacomputing/plugin'; +import { SigmaClientProvider, useConfig } from '@sigmacomputing/plugin-react'; + +function MyPlugin() { + const config = useConfig(); + return
{JSON.stringify(config, null, 2)}
; +} + +export function App() { + return ( + + + + ); +} +``` + +See the [`@sigmacomputing/plugin` README](https://github.com/sigmacomputing/plugin/blob/main/packages/plugin-sdk/README.md) +for the full hook reference. diff --git a/packages/plugin-sdk-react/package.json b/packages/plugin-sdk-react/package.json new file mode 100644 index 0000000..2d345f8 --- /dev/null +++ b/packages/plugin-sdk-react/package.json @@ -0,0 +1,53 @@ +{ + "name": "@sigmacomputing/plugin-react", + "version": "1.2.0", + "description": "React bindings for the Sigma Computing Plugin Client SDK", + "license": "MIT", + "type": "module", + "scripts": { + "build": "tsdown", + "build:watch": "tsdown --watch", + "format": "yarn g:format", + "lint": "yarn g:lint", + "publish": "yarn g:publlish", + "test": "vitest run", + "test:watch": "vitest", + "types": "yarn g:types" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "dependencies": { + "@sigmacomputing/plugin": "workspace:^" + }, + "devDependencies": { + "tsdown": "^0.21.10", + "vitest": "^4.1.5" + }, + "main": "./dist/cjs/index.cjs", + "module": "./dist/esm/index.js", + "types": "./dist/cjs/index.d.cts", + "unpkg": "./dist/umd/sigmacomputing-plugin-react.umd.js", + "jsdelivr": "./dist/umd/sigmacomputing-plugin-react.umd.js", + "exports": { + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/cjs/index.d.cts", + "default": "./dist/cjs/index.cjs" + } + }, + "./package.json": "./package.json" + }, + "files": [ + "dist/**/*", + "src/**/*", + "!src/**/__tests__/**/*" + ], + "publishConfig": { + "access": "public" + } +} diff --git a/packages/plugin-sdk/src/react/Context.ts b/packages/plugin-sdk-react/src/Context.ts similarity index 57% rename from packages/plugin-sdk/src/react/Context.ts rename to packages/plugin-sdk-react/src/Context.ts index 2f1f941..7675119 100644 --- a/packages/plugin-sdk/src/react/Context.ts +++ b/packages/plugin-sdk-react/src/Context.ts @@ -1,6 +1,5 @@ import * as React from 'react'; -import { client } from '../client'; -import { PluginInstance } from '../types'; +import { client, PluginInstance } from '@sigmacomputing/plugin'; export const PluginContext = React.createContext(client); diff --git a/packages/plugin-sdk/src/react/Provider.tsx b/packages/plugin-sdk-react/src/Provider.tsx similarity index 87% rename from packages/plugin-sdk/src/react/Provider.tsx rename to packages/plugin-sdk-react/src/Provider.tsx index d5a4070..dbf9139 100644 --- a/packages/plugin-sdk/src/react/Provider.tsx +++ b/packages/plugin-sdk-react/src/Provider.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; -import { PluginInstance } from '../types'; +import { PluginInstance } from '@sigmacomputing/plugin'; import { PluginContext } from './Context'; diff --git a/packages/plugin-sdk/src/react/__tests__/hooks.test.tsx b/packages/plugin-sdk-react/src/__tests__/hooks.test.tsx similarity index 99% rename from packages/plugin-sdk/src/react/__tests__/hooks.test.tsx rename to packages/plugin-sdk-react/src/__tests__/hooks.test.tsx index 99f4cf7..ad65992 100644 --- a/packages/plugin-sdk/src/react/__tests__/hooks.test.tsx +++ b/packages/plugin-sdk-react/src/__tests__/hooks.test.tsx @@ -1,9 +1,8 @@ import { act, renderHook } from '@testing-library/react'; import * as React from 'react'; -import { initialize } from '../../client/initialize'; -import { PluginInstance } from '../../types'; -import { SigmaClientProvider } from '../Provider'; +import { initialize, PluginInstance } from '@sigmacomputing/plugin'; + import { useActionEffect, useActionTrigger, @@ -19,6 +18,7 @@ import { useUrlParameter, useVariable, } from '../hooks'; +import { SigmaClientProvider } from '../Provider'; type Subscriber = (value: T) => void; diff --git a/packages/plugin-sdk-react/src/deepEqual.ts b/packages/plugin-sdk-react/src/deepEqual.ts new file mode 100644 index 0000000..06210f4 --- /dev/null +++ b/packages/plugin-sdk-react/src/deepEqual.ts @@ -0,0 +1,23 @@ +function isObject(obj: any) { + if (typeof obj === 'object' && obj != null) { + return true; + } else { + return false; + } +} + +export function deepEqual(obj1: any, obj2: any) { + if (obj1 === obj2) { + return true; + } else if (isObject(obj1) && isObject(obj2)) { + if (Object.keys(obj1).length !== Object.keys(obj2).length) { + return false; + } + for (const prop in obj1) { + if (!deepEqual(obj1[prop], obj2[prop])) { + return false; + } + } + return true; + } +} diff --git a/packages/plugin-sdk/src/react/hooks.ts b/packages/plugin-sdk-react/src/hooks.ts similarity index 99% rename from packages/plugin-sdk/src/react/hooks.ts rename to packages/plugin-sdk-react/src/hooks.ts index adfd0b1..be2f8e2 100644 --- a/packages/plugin-sdk/src/react/hooks.ts +++ b/packages/plugin-sdk-react/src/hooks.ts @@ -9,10 +9,10 @@ import { WorkbookVariable, PluginStyle, UrlParameter, -} from '../types'; -import { deepEqual } from '../utils/deepEqual'; +} from '@sigmacomputing/plugin'; import { PluginContext } from './Context'; +import { deepEqual } from './deepEqual'; /** * Gets the entire plugin instance diff --git a/packages/plugin-sdk-react/src/index.ts b/packages/plugin-sdk-react/src/index.ts new file mode 100644 index 0000000..6960485 --- /dev/null +++ b/packages/plugin-sdk-react/src/index.ts @@ -0,0 +1,3 @@ +export * from './hooks'; +export type { SigmaClientProviderProps } from './Provider'; +export { SigmaClientProvider } from './Provider'; diff --git a/packages/plugin-sdk-react/tsconfig.app.json b/packages/plugin-sdk-react/tsconfig.app.json new file mode 100644 index 0000000..2ed40b8 --- /dev/null +++ b/packages/plugin-sdk-react/tsconfig.app.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.app.json", + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo" + }, + "include": ["src"] +} diff --git a/packages/plugin-sdk-react/tsconfig.json b/packages/plugin-sdk-react/tsconfig.json new file mode 100644 index 0000000..473104a --- /dev/null +++ b/packages/plugin-sdk-react/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.tsbuildinfo", + + "noEmit": true + }, + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/packages/plugin-sdk-react/tsconfig.node.json b/packages/plugin-sdk-react/tsconfig.node.json new file mode 100644 index 0000000..42f7286 --- /dev/null +++ b/packages/plugin-sdk-react/tsconfig.node.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.node.json", + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo" + }, + "include": ["tsdown.config.ts", "vitest.config.ts"] +} diff --git a/packages/plugin-sdk-react/tsdown.config.ts b/packages/plugin-sdk-react/tsdown.config.ts new file mode 100644 index 0000000..336ba70 --- /dev/null +++ b/packages/plugin-sdk-react/tsdown.config.ts @@ -0,0 +1,27 @@ +import { defineConfig, mergeConfig } from 'tsdown'; + +// @ts-ignore - base config is defined outside of this package +import baseConfig from '../../tsdown.base.ts'; + +import packageJson from './package.json' with { type: 'json' }; + +export default mergeConfig( + baseConfig, + defineConfig({ + define: { + __VERSION__: JSON.stringify(packageJson.version), + }, + format: { + umd: { + outputOptions: { + entryFileNames: 'sigmacomputing-plugin-react.umd.js', + globals: { + react: 'React', + '@sigmacomputing/plugin': 'SigmaPlugin', + }, + name: 'SigmaPluginReact', + }, + }, + }, + }), +); diff --git a/packages/plugin-sdk-react/vitest.config.ts b/packages/plugin-sdk-react/vitest.config.ts new file mode 100644 index 0000000..c3e1107 --- /dev/null +++ b/packages/plugin-sdk-react/vitest.config.ts @@ -0,0 +1,15 @@ +import { defineConfig, mergeConfig } from 'vitest/config'; + +// @ts-ignore - base config is defined outside of this package +import baseConfig from '../../vitest.base.ts'; + +import packageJson from './package.json' with { type: 'json' }; + +export default mergeConfig( + baseConfig, + defineConfig({ + define: { + __VERSION__: JSON.stringify(packageJson.version), + }, + }), +); diff --git a/packages/plugin-sdk/package.json b/packages/plugin-sdk/package.json index 5098326..53d8ab7 100644 --- a/packages/plugin-sdk/package.json +++ b/packages/plugin-sdk/package.json @@ -14,14 +14,6 @@ "test:watch": "vitest", "types": "yarn g:types" }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - }, "devDependencies": { "tsdown": "^0.21.10", "vitest": "^4.1.5" diff --git a/packages/plugin-sdk/src/index.ts b/packages/plugin-sdk/src/index.ts index ff3725e..8f011eb 100644 --- a/packages/plugin-sdk/src/index.ts +++ b/packages/plugin-sdk/src/index.ts @@ -1,5 +1,5 @@ export * from './types'; -export * from './react'; export * from './client'; +export { initialize } from './client/initialize'; export { polyfillRequestAnimationFrame } from './utils/polyfillRequestAnimationFrame'; diff --git a/packages/plugin-sdk/src/react.ts b/packages/plugin-sdk/src/react.ts deleted file mode 100644 index ae662c6..0000000 --- a/packages/plugin-sdk/src/react.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './react/hooks'; -export type { SigmaClientProviderProps } from './react/Provider'; -export { SigmaClientProvider } from './react/Provider'; diff --git a/yarn.lock b/yarn.lock index 6620614..eb79f23 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1193,6 +1193,18 @@ __metadata: languageName: node linkType: hard +"@sigmacomputing/plugin-react@workspace:packages/plugin-sdk-react": + version: 0.0.0-use.local + resolution: "@sigmacomputing/plugin-react@workspace:packages/plugin-sdk-react" + dependencies: + "@sigmacomputing/plugin": "workspace:^" + tsdown: "npm:^0.21.10" + vitest: "npm:^4.1.5" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + languageName: unknown + linkType: soft + "@sigmacomputing/plugin-sdk-root@workspace:.": version: 0.0.0-use.local resolution: "@sigmacomputing/plugin-sdk-root@workspace:." @@ -1226,17 +1238,12 @@ __metadata: languageName: unknown linkType: soft -"@sigmacomputing/plugin@workspace:packages/plugin-sdk": +"@sigmacomputing/plugin@workspace:^, @sigmacomputing/plugin@workspace:packages/plugin-sdk": version: 0.0.0-use.local resolution: "@sigmacomputing/plugin@workspace:packages/plugin-sdk" dependencies: tsdown: "npm:^0.21.10" vitest: "npm:^4.1.5" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - react: - optional: true languageName: unknown linkType: soft From 3d90b5eb014d188b01d5c0d22bfc797690568bd8 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 22 May 2026 00:26:34 +0000 Subject: [PATCH 2/4] Rename npm package to @sigmacomputing/plugin-sdk-react Align the npm name with the directory name (packages/plugin-sdk-react) rather than dropping the -sdk suffix. Also updates the UMD bundle filename and global to match. https://claude.ai/code/session_01AZefsCe7wagmamsoVfekuL --- packages/plugin-sdk-react/README.md | 6 +++--- packages/plugin-sdk-react/package.json | 6 +++--- packages/plugin-sdk-react/tsdown.config.ts | 4 ++-- yarn.lock | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/plugin-sdk-react/README.md b/packages/plugin-sdk-react/README.md index 17eb086..d80dff2 100644 --- a/packages/plugin-sdk-react/README.md +++ b/packages/plugin-sdk-react/README.md @@ -17,9 +17,9 @@ etc.) that wrap the framework-agnostic client exported from ## Installation ```sh -yarn add @sigmacomputing/plugin @sigmacomputing/plugin-react +yarn add @sigmacomputing/plugin @sigmacomputing/plugin-sdk-react # or -npm install @sigmacomputing/plugin @sigmacomputing/plugin-react +npm install @sigmacomputing/plugin @sigmacomputing/plugin-sdk-react ``` `react` (`>= 16.8`) is required as a peer dependency. @@ -28,7 +28,7 @@ npm install @sigmacomputing/plugin @sigmacomputing/plugin-react ```tsx import { client } from '@sigmacomputing/plugin'; -import { SigmaClientProvider, useConfig } from '@sigmacomputing/plugin-react'; +import { SigmaClientProvider, useConfig } from '@sigmacomputing/plugin-sdk-react'; function MyPlugin() { const config = useConfig(); diff --git a/packages/plugin-sdk-react/package.json b/packages/plugin-sdk-react/package.json index 2d345f8..2002d59 100644 --- a/packages/plugin-sdk-react/package.json +++ b/packages/plugin-sdk-react/package.json @@ -1,5 +1,5 @@ { - "name": "@sigmacomputing/plugin-react", + "name": "@sigmacomputing/plugin-sdk-react", "version": "1.2.0", "description": "React bindings for the Sigma Computing Plugin Client SDK", "license": "MIT", @@ -27,8 +27,8 @@ "main": "./dist/cjs/index.cjs", "module": "./dist/esm/index.js", "types": "./dist/cjs/index.d.cts", - "unpkg": "./dist/umd/sigmacomputing-plugin-react.umd.js", - "jsdelivr": "./dist/umd/sigmacomputing-plugin-react.umd.js", + "unpkg": "./dist/umd/sigmacomputing-plugin-sdk-react.umd.js", + "jsdelivr": "./dist/umd/sigmacomputing-plugin-sdk-react.umd.js", "exports": { ".": { "import": { diff --git a/packages/plugin-sdk-react/tsdown.config.ts b/packages/plugin-sdk-react/tsdown.config.ts index 336ba70..8d91558 100644 --- a/packages/plugin-sdk-react/tsdown.config.ts +++ b/packages/plugin-sdk-react/tsdown.config.ts @@ -14,12 +14,12 @@ export default mergeConfig( format: { umd: { outputOptions: { - entryFileNames: 'sigmacomputing-plugin-react.umd.js', + entryFileNames: 'sigmacomputing-plugin-sdk-react.umd.js', globals: { react: 'React', '@sigmacomputing/plugin': 'SigmaPlugin', }, - name: 'SigmaPluginReact', + name: 'SigmaPluginSdkReact', }, }, }, diff --git a/yarn.lock b/yarn.lock index eb79f23..231bbc2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1193,9 +1193,9 @@ __metadata: languageName: node linkType: hard -"@sigmacomputing/plugin-react@workspace:packages/plugin-sdk-react": +"@sigmacomputing/plugin-sdk-react@workspace:packages/plugin-sdk-react": version: 0.0.0-use.local - resolution: "@sigmacomputing/plugin-react@workspace:packages/plugin-sdk-react" + resolution: "@sigmacomputing/plugin-sdk-react@workspace:packages/plugin-sdk-react" dependencies: "@sigmacomputing/plugin": "workspace:^" tsdown: "npm:^0.21.10" From ed51d5a1f77ca705de15e008abcd1a65a3583d07 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 22 May 2026 00:39:54 +0000 Subject: [PATCH 3/4] Use dequal, centralize config, pin internal dep versions * Replace the custom deepEqual helper with the dequal package (dequal/lite is bundled into all output formats via deps.alwaysBundle so consumers and UMD users do not need to provide it) * Set the UMD global name to SigmaPluginReact * Move __VERSION__ injection into tsdown.base.ts / vitest.base.ts since every workspace package shares the root version; per-package configs now just re-export the base * Replace workspace:^ with the actual semver range so npm publish produces a usable tarball, and teach scripts/bump-version.ts to keep internal @sigmacomputing/* dep ranges in sync on every bump https://claude.ai/code/session_01AZefsCe7wagmamsoVfekuL --- packages/plugin-sdk-react/package.json | 3 +- packages/plugin-sdk-react/src/deepEqual.ts | 23 -------------- packages/plugin-sdk-react/src/hooks.ts | 4 +-- packages/plugin-sdk-react/tsdown.config.ts | 8 ++--- packages/plugin-sdk-react/vitest.config.ts | 15 +-------- packages/plugin-sdk/tsdown.config.ts | 15 +-------- packages/plugin-sdk/vitest.config.ts | 15 +-------- scripts/bump-version.ts | 36 +++++++++++++++++++--- vitest.base.ts | 3 ++ yarn.lock | 5 +-- 10 files changed, 47 insertions(+), 80 deletions(-) delete mode 100644 packages/plugin-sdk-react/src/deepEqual.ts diff --git a/packages/plugin-sdk-react/package.json b/packages/plugin-sdk-react/package.json index 2002d59..6bd9815 100644 --- a/packages/plugin-sdk-react/package.json +++ b/packages/plugin-sdk-react/package.json @@ -18,7 +18,8 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "dependencies": { - "@sigmacomputing/plugin": "workspace:^" + "@sigmacomputing/plugin": "^1.2.0", + "dequal": "^2.0.3" }, "devDependencies": { "tsdown": "^0.21.10", diff --git a/packages/plugin-sdk-react/src/deepEqual.ts b/packages/plugin-sdk-react/src/deepEqual.ts deleted file mode 100644 index 06210f4..0000000 --- a/packages/plugin-sdk-react/src/deepEqual.ts +++ /dev/null @@ -1,23 +0,0 @@ -function isObject(obj: any) { - if (typeof obj === 'object' && obj != null) { - return true; - } else { - return false; - } -} - -export function deepEqual(obj1: any, obj2: any) { - if (obj1 === obj2) { - return true; - } else if (isObject(obj1) && isObject(obj2)) { - if (Object.keys(obj1).length !== Object.keys(obj2).length) { - return false; - } - for (const prop in obj1) { - if (!deepEqual(obj1[prop], obj2[prop])) { - return false; - } - } - return true; - } -} diff --git a/packages/plugin-sdk-react/src/hooks.ts b/packages/plugin-sdk-react/src/hooks.ts index be2f8e2..2ff08db 100644 --- a/packages/plugin-sdk-react/src/hooks.ts +++ b/packages/plugin-sdk-react/src/hooks.ts @@ -1,3 +1,4 @@ +import { dequal } from 'dequal/lite'; import * as React from 'react'; import { @@ -12,7 +13,6 @@ import { } from '@sigmacomputing/plugin'; import { PluginContext } from './Context'; -import { deepEqual } from './deepEqual'; /** * Gets the entire plugin instance @@ -34,7 +34,7 @@ export function useEditorPanelConfig( React.useEffect(() => { if (nextOptions == null) return; - if (!deepEqual(nextOptions, optionsRef.current)) { + if (!dequal(nextOptions, optionsRef.current)) { client.config.configureEditorPanel(nextOptions); optionsRef.current = nextOptions; } diff --git a/packages/plugin-sdk-react/tsdown.config.ts b/packages/plugin-sdk-react/tsdown.config.ts index 8d91558..71fb597 100644 --- a/packages/plugin-sdk-react/tsdown.config.ts +++ b/packages/plugin-sdk-react/tsdown.config.ts @@ -3,13 +3,11 @@ import { defineConfig, mergeConfig } from 'tsdown'; // @ts-ignore - base config is defined outside of this package import baseConfig from '../../tsdown.base.ts'; -import packageJson from './package.json' with { type: 'json' }; - export default mergeConfig( baseConfig, defineConfig({ - define: { - __VERSION__: JSON.stringify(packageJson.version), + deps: { + alwaysBundle: [/^dequal(\/|$)/], }, format: { umd: { @@ -19,7 +17,7 @@ export default mergeConfig( react: 'React', '@sigmacomputing/plugin': 'SigmaPlugin', }, - name: 'SigmaPluginSdkReact', + name: 'SigmaPluginReact', }, }, }, diff --git a/packages/plugin-sdk-react/vitest.config.ts b/packages/plugin-sdk-react/vitest.config.ts index c3e1107..150a68b 100644 --- a/packages/plugin-sdk-react/vitest.config.ts +++ b/packages/plugin-sdk-react/vitest.config.ts @@ -1,15 +1,2 @@ -import { defineConfig, mergeConfig } from 'vitest/config'; - // @ts-ignore - base config is defined outside of this package -import baseConfig from '../../vitest.base.ts'; - -import packageJson from './package.json' with { type: 'json' }; - -export default mergeConfig( - baseConfig, - defineConfig({ - define: { - __VERSION__: JSON.stringify(packageJson.version), - }, - }), -); +export { default } from '../../vitest.base.ts'; diff --git a/packages/plugin-sdk/tsdown.config.ts b/packages/plugin-sdk/tsdown.config.ts index fdb5930..b14ad3f 100644 --- a/packages/plugin-sdk/tsdown.config.ts +++ b/packages/plugin-sdk/tsdown.config.ts @@ -1,15 +1,2 @@ -import { defineConfig, mergeConfig } from 'tsdown'; - // @ts-ignore - base config is defined outside of this package -import baseConfig from '../../tsdown.base.ts'; - -import packageJson from './package.json' with { type: 'json' }; - -export default mergeConfig( - baseConfig, - defineConfig({ - define: { - __VERSION__: JSON.stringify(packageJson.version), - }, - }), -); +export { default } from '../../tsdown.base.ts'; diff --git a/packages/plugin-sdk/vitest.config.ts b/packages/plugin-sdk/vitest.config.ts index c3e1107..150a68b 100644 --- a/packages/plugin-sdk/vitest.config.ts +++ b/packages/plugin-sdk/vitest.config.ts @@ -1,15 +1,2 @@ -import { defineConfig, mergeConfig } from 'vitest/config'; - // @ts-ignore - base config is defined outside of this package -import baseConfig from '../../vitest.base.ts'; - -import packageJson from './package.json' with { type: 'json' }; - -export default mergeConfig( - baseConfig, - defineConfig({ - define: { - __VERSION__: JSON.stringify(packageJson.version), - }, - }), -); +export { default } from '../../vitest.base.ts'; diff --git a/scripts/bump-version.ts b/scripts/bump-version.ts index 9a115df..ab94027 100644 --- a/scripts/bump-version.ts +++ b/scripts/bump-version.ts @@ -109,13 +109,34 @@ const writeNewVersion = (pkgPath: string, version: string): void => { writeFileSync(pkgPath, raw.replace(pattern, `$1${version}$2`)); }; +const escapeRegex = (value: string): string => + value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + +const bumpInternalDeps = ( + pkgPath: string, + internalPackageNames: readonly string[], + version: string, +): void => { + let raw = readFileSync(pkgPath, 'utf8'); + for (const depName of internalPackageNames) { + const pattern = new RegExp( + `("${escapeRegex(depName)}"\\s*:\\s*")(?!workspace:)[^"]+(")`, + 'g', + ); + raw = raw.replace(pattern, `$1^${version}$2`); + } + writeFileSync(pkgPath, raw); +}; + type TurboQueryLsResponse = { packages: { items: { name: string; path: string }[]; }; }; -const findWorkspacePackageJsons = (): string[] => { +type WorkspacePackage = { name: string; pkgPath: string }; + +const findWorkspacePackages = (): WorkspacePackage[] => { const result = spawnSync( 'yarn', ['turbo', 'query', 'ls', '--output', 'json'], @@ -137,9 +158,10 @@ const findWorkspacePackageJsons = (): string[] => { result.stdout.slice(jsonStart), ) as TurboQueryLsResponse; - return parsed.packages.items.map(item => - path.join(item.path, 'package.json'), - ); + return parsed.packages.items.map(item => ({ + name: item.name, + pkgPath: path.join(item.path, 'package.json'), + })); }; const main = async (): Promise => { @@ -147,9 +169,13 @@ const main = async (): Promise => { const choices = buildChoices(current); const choice = await promptChoice(current.version, choices); - const targets = [PACKAGE_JSON_PATH, ...findWorkspacePackageJsons()]; + const workspaces = findWorkspacePackages(); + const internalPackageNames = workspaces.map(w => w.name); + const targets = [PACKAGE_JSON_PATH, ...workspaces.map(w => w.pkgPath)]; + for (const pkgPath of targets) { writeNewVersion(pkgPath, choice.next); + bumpInternalDeps(pkgPath, internalPackageNames, choice.next); console.log(`Bumped ${pkgPath}: ${current.version} -> ${choice.next}`); } }; diff --git a/vitest.base.ts b/vitest.base.ts index d84730c..a3de5fd 100644 --- a/vitest.base.ts +++ b/vitest.base.ts @@ -1,8 +1,11 @@ import { playwright } from '@vitest/browser-playwright'; import { defineConfig } from 'vitest/config'; +import packageJson from './package.json' with { type: 'json' }; + export default defineConfig({ define: { + __VERSION__: JSON.stringify(packageJson.version), __VITEST_BROWSER__: true.toString(), }, oxc: { diff --git a/yarn.lock b/yarn.lock index 231bbc2..602ae3b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1197,7 +1197,8 @@ __metadata: version: 0.0.0-use.local resolution: "@sigmacomputing/plugin-sdk-react@workspace:packages/plugin-sdk-react" dependencies: - "@sigmacomputing/plugin": "workspace:^" + "@sigmacomputing/plugin": "npm:^1.2.0" + dequal: "npm:^2.0.3" tsdown: "npm:^0.21.10" vitest: "npm:^4.1.5" peerDependencies: @@ -1238,7 +1239,7 @@ __metadata: languageName: unknown linkType: soft -"@sigmacomputing/plugin@workspace:^, @sigmacomputing/plugin@workspace:packages/plugin-sdk": +"@sigmacomputing/plugin@npm:^1.2.0, @sigmacomputing/plugin@workspace:packages/plugin-sdk": version: 0.0.0-use.local resolution: "@sigmacomputing/plugin@workspace:packages/plugin-sdk" dependencies: From 9111759257c77c3e6b59596fcc4a2547d4002c40 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 22 May 2026 00:43:36 +0000 Subject: [PATCH 4/4] Externalize dequal in ESM/CJS, bundle it only in UMD Split the plugin-sdk-react tsdown config into two builds: ESM + CJS keep dequal external (consumers install it via npm and deduping happens normally), while UMD bundles it so the standalone bundle only needs react and @sigmacomputing/plugin as globals. https://claude.ai/code/session_01AZefsCe7wagmamsoVfekuL --- packages/plugin-sdk-react/tsdown.config.ts | 26 ++++++++++++++++------ 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/plugin-sdk-react/tsdown.config.ts b/packages/plugin-sdk-react/tsdown.config.ts index 71fb597..8d85220 100644 --- a/packages/plugin-sdk-react/tsdown.config.ts +++ b/packages/plugin-sdk-react/tsdown.config.ts @@ -1,20 +1,32 @@ -import { defineConfig, mergeConfig } from 'tsdown'; +import { defineConfig } from 'tsdown'; // @ts-ignore - base config is defined outside of this package import baseConfig from '../../tsdown.base.ts'; -export default mergeConfig( - baseConfig, +// Split into two configs so dequal stays external for ESM/CJS (consumers +// install it via npm) but is bundled into the UMD build, where shipping +// a self-contained file matters more than dedup. + +const baseFormat = baseConfig.format as Record; + +export default [ defineConfig({ - deps: { - alwaysBundle: [/^dequal(\/|$)/], + ...baseConfig, + format: { + esm: baseFormat.esm, + cjs: baseFormat.cjs, }, + }), + defineConfig({ + ...baseConfig, + deps: { alwaysBundle: [/^dequal(\/|$)/] }, format: { umd: { outputOptions: { + ...baseFormat.umd.outputOptions, entryFileNames: 'sigmacomputing-plugin-sdk-react.umd.js', globals: { - react: 'React', + ...baseFormat.umd.outputOptions.globals, '@sigmacomputing/plugin': 'SigmaPlugin', }, name: 'SigmaPluginReact', @@ -22,4 +34,4 @@ export default mergeConfig( }, }, }), -); +];