@digital-gravy/etch-public-api 0.3.4 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -128,6 +128,33 @@ To discard in-memory changes and restore the original block:
128
128
  etch.blocks.exitComponentEditMode({ revert: true });
129
129
  ```
130
130
 
131
+ ### Component props
132
+
133
+ A component **instance** exposes its bound props as block attributes — set them
134
+ with `setAttribute` / `update`, read them with `getAttribute`. Unlike an HTML
135
+ block's free-form attributes, a component's props are a **closed schema**: the
136
+ key must be a property declared by the component definition, or the call throws
137
+ `INVALID_ARGUMENT`.
138
+
139
+ ```ts
140
+ const [cardId] = etch.blocks.find({ type: "etch/component" });
141
+
142
+ // Set a prop the component declares
143
+ etch.blocks.setAttribute(cardId, "title", "Hello world");
144
+
145
+ // Read it back
146
+ etch.blocks.getAttribute(cardId, "title"); // "Hello world"
147
+
148
+ // Or patch several props at once
149
+ etch.blocks.update(cardId, { attributes: { title: "Hi", variant: "primary" } });
150
+
151
+ // An undeclared key is rejected
152
+ etch.blocks.setAttribute(cardId, "notAProp", "x"); // ✗ throws INVALID_ARGUMENT
153
+ ```
154
+
155
+ > Values are stored as-is. For typed props such as classes or repeater/group
156
+ > data, pass the value in the component's internal format.
157
+
131
158
  ### Error handling
132
159
 
133
160
  Methods throw a typed `EtchApiError` with a `code`, rather than returning
package/dist/index.d.cts CHANGED
@@ -256,8 +256,10 @@ interface BlockPatch {
256
256
  /** Hide or show the block on the canvas. */
257
257
  hidden?: boolean;
258
258
  /**
259
- * Merge HTML attributes — a key set to `undefined` removes that attribute.
260
- * Only valid on HTML blocks.
259
+ * Merge attributes — a key set to `undefined` removes that attribute. Valid
260
+ * on HTML blocks (free-form HTML attributes) and on component instances,
261
+ * whose attributes are their bound props — a closed schema, so each key must
262
+ * be a property declared by the component (an unknown key is rejected).
261
263
  */
262
264
  attributes?: Record<string, string | undefined>;
263
265
  /** Replace the text content. Only valid on text blocks. */
@@ -299,11 +301,26 @@ interface EtchBlocksApi {
299
301
  setText(blockId: string, text: string): void;
300
302
  /** Rename a block (sets its label / display name). */
301
303
  rename(blockId: string, name: string): void;
302
- /** Read an HTML attribute, or `undefined` when it is not set. */
304
+ /**
305
+ * Read an attribute, or `undefined` when it is not set. Works on HTML blocks
306
+ * (HTML attributes) and component instances (bound prop values). Throws
307
+ * `WRONG_BLOCK_TYPE` for a block that has no attributes (e.g. a text block).
308
+ */
303
309
  getAttribute(blockId: string, key: string): string | undefined;
304
- /** Set an HTML attribute; omit `value` for a valueless (boolean) attribute. */
310
+ /**
311
+ * Set an attribute; omit `value` for a valueless (boolean) attribute. Works
312
+ * on HTML blocks and component instances. On a component, `key` must be a
313
+ * declared property — props are a closed schema — otherwise
314
+ * `INVALID_ARGUMENT` is thrown (or `OPERATION_FAILED` if the component
315
+ * definition has not loaded yet). Throws `WRONG_BLOCK_TYPE` for a block with
316
+ * no attributes.
317
+ */
305
318
  setAttribute(blockId: string, key: string, value?: string): void;
306
- /** Remove an HTML attribute. */
319
+ /**
320
+ * Remove an attribute. Works on HTML blocks and component instances. On a
321
+ * component, `key` must be a declared property (see {@link setAttribute}).
322
+ * Throws `WRONG_BLOCK_TYPE` for a block with no attributes.
323
+ */
307
324
  removeAttribute(blockId: string, key: string): void;
308
325
  /** Add a CSS class to the block. */
309
326
  addClass(blockId: string, className: string): void;
@@ -1141,6 +1158,59 @@ interface EtchHistoryApi {
1141
1158
  canRedo(): boolean;
1142
1159
  }
1143
1160
 
1161
+ /**
1162
+ * Live bridge connection — lets an external tool (an IDE, a script runner, an AI
1163
+ * agent) drive this Etch instance from outside the page over a WebSocket.
1164
+ *
1165
+ * Calling `window.etch.connectAs(name)` from the builder console opens a
1166
+ * connection to a local bridge server and registers this instance under `name`.
1167
+ * Because the name travels to the server, one server can hold connections to
1168
+ * several Etch tabs at once and address each by name. The server then pushes JS
1169
+ * to evaluate in the page; the page streams console output and the return value
1170
+ * back.
1171
+ *
1172
+ * This is the inverse of Chrome remote debugging: the browser dials out to the
1173
+ * tool, instead of the tool attaching to the browser's debug port. Console-run
1174
+ * code is exempt from the page's CSP, so the connection works even on
1175
+ * locked-down pages.
1176
+ */
1177
+ /** Options for {@link Etch.connectAs} / `etch.connectAs`. */
1178
+ interface BridgeConnectOptions {
1179
+ /**
1180
+ * Full WebSocket endpoint of the bridge server. Defaults to
1181
+ * `ws://127.0.0.1:7331`. Set this to target a different host/port or a
1182
+ * `wss://` endpoint.
1183
+ */
1184
+ url?: string;
1185
+ /**
1186
+ * Shorthand for a localhost endpoint on a custom port
1187
+ * (`ws://127.0.0.1:<port>`). Ignored when {@link url} is provided.
1188
+ */
1189
+ port?: number;
1190
+ /**
1191
+ * Extra identifying metadata sent to the server alongside the name (e.g. a
1192
+ * project id or environment label), so the tool can group or disambiguate
1193
+ * tabs beyond the name alone.
1194
+ */
1195
+ meta?: Record<string, unknown>;
1196
+ /**
1197
+ * Reconnect automatically (with backoff) when the socket drops. Default
1198
+ * `true`.
1199
+ */
1200
+ reconnect?: boolean;
1201
+ }
1202
+ /** Handle to a live bridge connection returned by `etch.connectAs`. */
1203
+ interface EtchBridgeConnection {
1204
+ /** The name this instance registered under — how the tool addresses it. */
1205
+ readonly name: string;
1206
+ /** The resolved WebSocket endpoint the connection targets. */
1207
+ readonly url: string;
1208
+ /** Whether the socket is currently open. */
1209
+ readonly connected: boolean;
1210
+ /** Close the connection and stop reconnecting. */
1211
+ close(): void;
1212
+ }
1213
+
1144
1214
  /**
1145
1215
  * The root {@link Etch} interface exposed on `window.etch`, tying every API
1146
1216
  * namespace together, plus connection/versioning options.
@@ -1189,6 +1259,21 @@ interface Etch {
1189
1259
  history: EtchHistoryApi;
1190
1260
  /** Persist everything (blocks, loops, styles, UI). */
1191
1261
  saveAsync(): Promise<void>;
1262
+ /**
1263
+ * Open a live bridge connection to a local tooling server (an IDE, a script
1264
+ * runner, an AI agent) and register this instance under `name`, so one server
1265
+ * can drive several Etch tabs at once and tell them apart by name. Returns a
1266
+ * handle; call again with a different name/endpoint to open more connections.
1267
+ *
1268
+ * @example
1269
+ * ```js
1270
+ * // In the builder console:
1271
+ * const conn = etch.connectAs('homepage');
1272
+ * // …the tool can now evaluate code in this tab; later:
1273
+ * conn.close();
1274
+ * ```
1275
+ */
1276
+ connectAs(name: string, options?: BridgeConnectOptions): EtchBridgeConnection;
1192
1277
  /**
1193
1278
  * Negotiate a version-pinned API instance. **Reserved** — not implemented by
1194
1279
  * `0.x` runtimes. When present on a future stable runtime, it returns an
@@ -1267,4 +1352,4 @@ declare function isEtchApiError(value: unknown): value is EtchApiError;
1267
1352
  */
1268
1353
  declare const ETCH_API_VERSION = "0.x";
1269
1354
 
1270
- export { type ArrayComponentProperty, type BlockLoopBinding, type BlockPatch, type BooleanComponentProperty, type BooleanParam, type ClassComponentProperty, type ColorScheme, type ComponentPatch, type ComponentProperty, type ComponentPropertyBase, type ConditionComponentProperty, type ConnectOptions, type CustomField, type CustomFieldAssignment, type CustomFieldGroup, type CustomFieldType, ETCH_API_VERSION, type Etch, EtchApiError, type EtchApiErrorCode, type EtchBlockCommon, type EtchBlockContext, type EtchBlockJson, type EtchBlockOptions, type EtchBlockScript, type EtchBlockType, type EtchBlockTypeName, type EtchBlocksApi, type EtchComponentBlockJson, type EtchComponentsApi, type EtchConditionBlockJson, type EtchDynamicElementBlockJson, type EtchDynamicImageBlockJson, type EtchElementBlockJson, type EtchFieldsApi, type EtchHistoryApi, type EtchHtmlAttributes, type EtchLoop, type EtchLoopBlockJson, type EtchLoopConfig, type EtchLoopObj, type EtchLoopsApi, type EtchNavigationApi, type EtchPassthroughBlockJson, type EtchPostContentBlockJson, type EtchRawHtmlBlockJson, type EtchSlotContentBlockJson, type EtchSlotPlaceholderBlockJson, type EtchStylesApi, type EtchStylesheetsApi, type EtchSvgBlockJson, type EtchTextBlockJson, type EtchUiApi, type FindBlocksPredicate, type GroupComponentProperty, type GutenbergBlock, type LoopParamRef, type MetaQueryItem, type NavigationPlace, type NumberComponentProperty, type NumericParam, type ObjectComponentProperty, type PostCustomFieldGroupEntry, type PostCustomFieldValueEntry, type PostCustomFieldValueResponse, type PostCustomFieldValuesResponse, type PostSummary, type PublicBlockJson, type PublicComponentJson, type PublicComponentSummary, type RepeaterComponentProperty, type ResolvedCustomField, type SelectOptionsString, type StringComponentProperty, type StyleListFilter, type StylePatch, type StyleSelectorType, type StyleSummary, type StylesheetInput, type StylesheetPatch, type StylesheetSummary, type StylesheetType, type TaxQueryItem, type TemplateSummary, type WpQueryArgs, type WpTermsArgs, type WpUsersArgs, getEtch, isEtchApiError, isEtchAvailable };
1355
+ export { type ArrayComponentProperty, type BlockLoopBinding, type BlockPatch, type BooleanComponentProperty, type BooleanParam, type BridgeConnectOptions, type ClassComponentProperty, type ColorScheme, type ComponentPatch, type ComponentProperty, type ComponentPropertyBase, type ConditionComponentProperty, type ConnectOptions, type CustomField, type CustomFieldAssignment, type CustomFieldGroup, type CustomFieldType, ETCH_API_VERSION, type Etch, EtchApiError, type EtchApiErrorCode, type EtchBlockCommon, type EtchBlockContext, type EtchBlockJson, type EtchBlockOptions, type EtchBlockScript, type EtchBlockType, type EtchBlockTypeName, type EtchBlocksApi, type EtchBridgeConnection, type EtchComponentBlockJson, type EtchComponentsApi, type EtchConditionBlockJson, type EtchDynamicElementBlockJson, type EtchDynamicImageBlockJson, type EtchElementBlockJson, type EtchFieldsApi, type EtchHistoryApi, type EtchHtmlAttributes, type EtchLoop, type EtchLoopBlockJson, type EtchLoopConfig, type EtchLoopObj, type EtchLoopsApi, type EtchNavigationApi, type EtchPassthroughBlockJson, type EtchPostContentBlockJson, type EtchRawHtmlBlockJson, type EtchSlotContentBlockJson, type EtchSlotPlaceholderBlockJson, type EtchStylesApi, type EtchStylesheetsApi, type EtchSvgBlockJson, type EtchTextBlockJson, type EtchUiApi, type FindBlocksPredicate, type GroupComponentProperty, type GutenbergBlock, type LoopParamRef, type MetaQueryItem, type NavigationPlace, type NumberComponentProperty, type NumericParam, type ObjectComponentProperty, type PostCustomFieldGroupEntry, type PostCustomFieldValueEntry, type PostCustomFieldValueResponse, type PostCustomFieldValuesResponse, type PostSummary, type PublicBlockJson, type PublicComponentJson, type PublicComponentSummary, type RepeaterComponentProperty, type ResolvedCustomField, type SelectOptionsString, type StringComponentProperty, type StyleListFilter, type StylePatch, type StyleSelectorType, type StyleSummary, type StylesheetInput, type StylesheetPatch, type StylesheetSummary, type StylesheetType, type TaxQueryItem, type TemplateSummary, type WpQueryArgs, type WpTermsArgs, type WpUsersArgs, getEtch, isEtchApiError, isEtchAvailable };
package/dist/index.d.ts CHANGED
@@ -256,8 +256,10 @@ interface BlockPatch {
256
256
  /** Hide or show the block on the canvas. */
257
257
  hidden?: boolean;
258
258
  /**
259
- * Merge HTML attributes — a key set to `undefined` removes that attribute.
260
- * Only valid on HTML blocks.
259
+ * Merge attributes — a key set to `undefined` removes that attribute. Valid
260
+ * on HTML blocks (free-form HTML attributes) and on component instances,
261
+ * whose attributes are their bound props — a closed schema, so each key must
262
+ * be a property declared by the component (an unknown key is rejected).
261
263
  */
262
264
  attributes?: Record<string, string | undefined>;
263
265
  /** Replace the text content. Only valid on text blocks. */
@@ -299,11 +301,26 @@ interface EtchBlocksApi {
299
301
  setText(blockId: string, text: string): void;
300
302
  /** Rename a block (sets its label / display name). */
301
303
  rename(blockId: string, name: string): void;
302
- /** Read an HTML attribute, or `undefined` when it is not set. */
304
+ /**
305
+ * Read an attribute, or `undefined` when it is not set. Works on HTML blocks
306
+ * (HTML attributes) and component instances (bound prop values). Throws
307
+ * `WRONG_BLOCK_TYPE` for a block that has no attributes (e.g. a text block).
308
+ */
303
309
  getAttribute(blockId: string, key: string): string | undefined;
304
- /** Set an HTML attribute; omit `value` for a valueless (boolean) attribute. */
310
+ /**
311
+ * Set an attribute; omit `value` for a valueless (boolean) attribute. Works
312
+ * on HTML blocks and component instances. On a component, `key` must be a
313
+ * declared property — props are a closed schema — otherwise
314
+ * `INVALID_ARGUMENT` is thrown (or `OPERATION_FAILED` if the component
315
+ * definition has not loaded yet). Throws `WRONG_BLOCK_TYPE` for a block with
316
+ * no attributes.
317
+ */
305
318
  setAttribute(blockId: string, key: string, value?: string): void;
306
- /** Remove an HTML attribute. */
319
+ /**
320
+ * Remove an attribute. Works on HTML blocks and component instances. On a
321
+ * component, `key` must be a declared property (see {@link setAttribute}).
322
+ * Throws `WRONG_BLOCK_TYPE` for a block with no attributes.
323
+ */
307
324
  removeAttribute(blockId: string, key: string): void;
308
325
  /** Add a CSS class to the block. */
309
326
  addClass(blockId: string, className: string): void;
@@ -1141,6 +1158,59 @@ interface EtchHistoryApi {
1141
1158
  canRedo(): boolean;
1142
1159
  }
1143
1160
 
1161
+ /**
1162
+ * Live bridge connection — lets an external tool (an IDE, a script runner, an AI
1163
+ * agent) drive this Etch instance from outside the page over a WebSocket.
1164
+ *
1165
+ * Calling `window.etch.connectAs(name)` from the builder console opens a
1166
+ * connection to a local bridge server and registers this instance under `name`.
1167
+ * Because the name travels to the server, one server can hold connections to
1168
+ * several Etch tabs at once and address each by name. The server then pushes JS
1169
+ * to evaluate in the page; the page streams console output and the return value
1170
+ * back.
1171
+ *
1172
+ * This is the inverse of Chrome remote debugging: the browser dials out to the
1173
+ * tool, instead of the tool attaching to the browser's debug port. Console-run
1174
+ * code is exempt from the page's CSP, so the connection works even on
1175
+ * locked-down pages.
1176
+ */
1177
+ /** Options for {@link Etch.connectAs} / `etch.connectAs`. */
1178
+ interface BridgeConnectOptions {
1179
+ /**
1180
+ * Full WebSocket endpoint of the bridge server. Defaults to
1181
+ * `ws://127.0.0.1:7331`. Set this to target a different host/port or a
1182
+ * `wss://` endpoint.
1183
+ */
1184
+ url?: string;
1185
+ /**
1186
+ * Shorthand for a localhost endpoint on a custom port
1187
+ * (`ws://127.0.0.1:<port>`). Ignored when {@link url} is provided.
1188
+ */
1189
+ port?: number;
1190
+ /**
1191
+ * Extra identifying metadata sent to the server alongside the name (e.g. a
1192
+ * project id or environment label), so the tool can group or disambiguate
1193
+ * tabs beyond the name alone.
1194
+ */
1195
+ meta?: Record<string, unknown>;
1196
+ /**
1197
+ * Reconnect automatically (with backoff) when the socket drops. Default
1198
+ * `true`.
1199
+ */
1200
+ reconnect?: boolean;
1201
+ }
1202
+ /** Handle to a live bridge connection returned by `etch.connectAs`. */
1203
+ interface EtchBridgeConnection {
1204
+ /** The name this instance registered under — how the tool addresses it. */
1205
+ readonly name: string;
1206
+ /** The resolved WebSocket endpoint the connection targets. */
1207
+ readonly url: string;
1208
+ /** Whether the socket is currently open. */
1209
+ readonly connected: boolean;
1210
+ /** Close the connection and stop reconnecting. */
1211
+ close(): void;
1212
+ }
1213
+
1144
1214
  /**
1145
1215
  * The root {@link Etch} interface exposed on `window.etch`, tying every API
1146
1216
  * namespace together, plus connection/versioning options.
@@ -1189,6 +1259,21 @@ interface Etch {
1189
1259
  history: EtchHistoryApi;
1190
1260
  /** Persist everything (blocks, loops, styles, UI). */
1191
1261
  saveAsync(): Promise<void>;
1262
+ /**
1263
+ * Open a live bridge connection to a local tooling server (an IDE, a script
1264
+ * runner, an AI agent) and register this instance under `name`, so one server
1265
+ * can drive several Etch tabs at once and tell them apart by name. Returns a
1266
+ * handle; call again with a different name/endpoint to open more connections.
1267
+ *
1268
+ * @example
1269
+ * ```js
1270
+ * // In the builder console:
1271
+ * const conn = etch.connectAs('homepage');
1272
+ * // …the tool can now evaluate code in this tab; later:
1273
+ * conn.close();
1274
+ * ```
1275
+ */
1276
+ connectAs(name: string, options?: BridgeConnectOptions): EtchBridgeConnection;
1192
1277
  /**
1193
1278
  * Negotiate a version-pinned API instance. **Reserved** — not implemented by
1194
1279
  * `0.x` runtimes. When present on a future stable runtime, it returns an
@@ -1267,4 +1352,4 @@ declare function isEtchApiError(value: unknown): value is EtchApiError;
1267
1352
  */
1268
1353
  declare const ETCH_API_VERSION = "0.x";
1269
1354
 
1270
- export { type ArrayComponentProperty, type BlockLoopBinding, type BlockPatch, type BooleanComponentProperty, type BooleanParam, type ClassComponentProperty, type ColorScheme, type ComponentPatch, type ComponentProperty, type ComponentPropertyBase, type ConditionComponentProperty, type ConnectOptions, type CustomField, type CustomFieldAssignment, type CustomFieldGroup, type CustomFieldType, ETCH_API_VERSION, type Etch, EtchApiError, type EtchApiErrorCode, type EtchBlockCommon, type EtchBlockContext, type EtchBlockJson, type EtchBlockOptions, type EtchBlockScript, type EtchBlockType, type EtchBlockTypeName, type EtchBlocksApi, type EtchComponentBlockJson, type EtchComponentsApi, type EtchConditionBlockJson, type EtchDynamicElementBlockJson, type EtchDynamicImageBlockJson, type EtchElementBlockJson, type EtchFieldsApi, type EtchHistoryApi, type EtchHtmlAttributes, type EtchLoop, type EtchLoopBlockJson, type EtchLoopConfig, type EtchLoopObj, type EtchLoopsApi, type EtchNavigationApi, type EtchPassthroughBlockJson, type EtchPostContentBlockJson, type EtchRawHtmlBlockJson, type EtchSlotContentBlockJson, type EtchSlotPlaceholderBlockJson, type EtchStylesApi, type EtchStylesheetsApi, type EtchSvgBlockJson, type EtchTextBlockJson, type EtchUiApi, type FindBlocksPredicate, type GroupComponentProperty, type GutenbergBlock, type LoopParamRef, type MetaQueryItem, type NavigationPlace, type NumberComponentProperty, type NumericParam, type ObjectComponentProperty, type PostCustomFieldGroupEntry, type PostCustomFieldValueEntry, type PostCustomFieldValueResponse, type PostCustomFieldValuesResponse, type PostSummary, type PublicBlockJson, type PublicComponentJson, type PublicComponentSummary, type RepeaterComponentProperty, type ResolvedCustomField, type SelectOptionsString, type StringComponentProperty, type StyleListFilter, type StylePatch, type StyleSelectorType, type StyleSummary, type StylesheetInput, type StylesheetPatch, type StylesheetSummary, type StylesheetType, type TaxQueryItem, type TemplateSummary, type WpQueryArgs, type WpTermsArgs, type WpUsersArgs, getEtch, isEtchApiError, isEtchAvailable };
1355
+ export { type ArrayComponentProperty, type BlockLoopBinding, type BlockPatch, type BooleanComponentProperty, type BooleanParam, type BridgeConnectOptions, type ClassComponentProperty, type ColorScheme, type ComponentPatch, type ComponentProperty, type ComponentPropertyBase, type ConditionComponentProperty, type ConnectOptions, type CustomField, type CustomFieldAssignment, type CustomFieldGroup, type CustomFieldType, ETCH_API_VERSION, type Etch, EtchApiError, type EtchApiErrorCode, type EtchBlockCommon, type EtchBlockContext, type EtchBlockJson, type EtchBlockOptions, type EtchBlockScript, type EtchBlockType, type EtchBlockTypeName, type EtchBlocksApi, type EtchBridgeConnection, type EtchComponentBlockJson, type EtchComponentsApi, type EtchConditionBlockJson, type EtchDynamicElementBlockJson, type EtchDynamicImageBlockJson, type EtchElementBlockJson, type EtchFieldsApi, type EtchHistoryApi, type EtchHtmlAttributes, type EtchLoop, type EtchLoopBlockJson, type EtchLoopConfig, type EtchLoopObj, type EtchLoopsApi, type EtchNavigationApi, type EtchPassthroughBlockJson, type EtchPostContentBlockJson, type EtchRawHtmlBlockJson, type EtchSlotContentBlockJson, type EtchSlotPlaceholderBlockJson, type EtchStylesApi, type EtchStylesheetsApi, type EtchSvgBlockJson, type EtchTextBlockJson, type EtchUiApi, type FindBlocksPredicate, type GroupComponentProperty, type GutenbergBlock, type LoopParamRef, type MetaQueryItem, type NavigationPlace, type NumberComponentProperty, type NumericParam, type ObjectComponentProperty, type PostCustomFieldGroupEntry, type PostCustomFieldValueEntry, type PostCustomFieldValueResponse, type PostCustomFieldValuesResponse, type PostSummary, type PublicBlockJson, type PublicComponentJson, type PublicComponentSummary, type RepeaterComponentProperty, type ResolvedCustomField, type SelectOptionsString, type StringComponentProperty, type StyleListFilter, type StylePatch, type StyleSelectorType, type StyleSummary, type StylesheetInput, type StylesheetPatch, type StylesheetSummary, type StylesheetType, type TaxQueryItem, type TemplateSummary, type WpQueryArgs, type WpTermsArgs, type WpUsersArgs, getEtch, isEtchApiError, isEtchAvailable };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digital-gravy/etch-public-api",
3
- "version": "0.3.4",
3
+ "version": "0.7.0",
4
4
  "description": "MIT-licensed typed client and contract for the Etch builder scripting API (window.etch). Etch itself is a separate proprietary product governed by its own commercial terms.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -43,4 +43,4 @@
43
43
  "typescript": "^5.7.2",
44
44
  "vitest": "^3.0.5"
45
45
  }
46
- }
46
+ }