@agentic-ui-experience/ui-react 0.0.1-beta.1
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 +123 -0
- package/dist/catalog.d.ts +13 -0
- package/dist/catalog.js +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +1 -0
- package/dist/react.d.ts +30 -0
- package/dist/react.js +1 -0
- package/package.json +44 -0
package/README.md
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# @agentic-ui-experience/ui-react
|
|
2
|
+
|
|
3
|
+
React adapter for `@agentic-ui-experience/ui-runtime`.
|
|
4
|
+
|
|
5
|
+
This package contains the React hooks, the default A2UI surface renderer,
|
|
6
|
+
this package's `basicCatalog` wrapper, and `defineCatalog` for React component
|
|
7
|
+
implementations. Prompt descriptors live in
|
|
8
|
+
`@agentic-ui-experience/ui-core`, not in this React package. Import the
|
|
9
|
+
framework-agnostic runtime directly from
|
|
10
|
+
`@agentic-ui-experience/ui-runtime` when you do not need React.
|
|
11
|
+
|
|
12
|
+
## Quick start
|
|
13
|
+
|
|
14
|
+
```tsx
|
|
15
|
+
import {
|
|
16
|
+
UIAgentSurface,
|
|
17
|
+
useUIRuntime
|
|
18
|
+
} from "@agentic-ui-experience/ui-react";
|
|
19
|
+
|
|
20
|
+
function FieldApp({ field }) {
|
|
21
|
+
const runtime = useUIRuntime({
|
|
22
|
+
onAction: (action) => field.handleAction?.(action)
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
return <UIAgentSurface runtime={runtime} />;
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
`useUIRuntime` defaults to this package's `basicCatalog` wrapper. Pass
|
|
30
|
+
`catalogs` when your app uses custom components.
|
|
31
|
+
|
|
32
|
+
## User actions
|
|
33
|
+
|
|
34
|
+
`Button` is the basic catalog component for host / agent round-trips. A
|
|
35
|
+
button with `action: { event: { name, context } }` is resolved by the A2UI
|
|
36
|
+
binder and reaches the runtime's `onAction` callback when clicked.
|
|
37
|
+
|
|
38
|
+
Form-like components (`TextField`, `ChoicePicker`, `Slider`,
|
|
39
|
+
`DateTimeInput`, etc.) are local input controls. They write to their bound
|
|
40
|
+
data-model `value`; they are not action dispatchers. For a selector that
|
|
41
|
+
should send a new message to an agent, model it as a row of `Button` actions
|
|
42
|
+
or add a custom catalog component with an explicit action prop.
|
|
43
|
+
|
|
44
|
+
## API
|
|
45
|
+
|
|
46
|
+
### Hooks
|
|
47
|
+
|
|
48
|
+
| Export | Purpose |
|
|
49
|
+
|--------|---------|
|
|
50
|
+
| `useUIRuntime(options?)` | Create an app-scoped runtime. Survives React StrictMode's double-mount; `onAction` / `onError` are forwarded through refs, so fresh inline callbacks per render do **not** recreate the runtime. No auto-dispose — call `runtime.dispose()` manually if you spin up multiple runtimes. |
|
|
51
|
+
| `useUIAgent(runtime)` | Subscribe a component to a runtime via `useSyncExternalStore` and return `UIRuntimeState`. `UIAgentSurface` already calls this internally. |
|
|
52
|
+
|
|
53
|
+
`UseUIRuntimeOptions` ⊆ `UIRuntimeOptions` (from `ui-runtime`), but
|
|
54
|
+
`catalogs` becomes optional (defaults to `[basicCatalog]`).
|
|
55
|
+
|
|
56
|
+
### Surface component
|
|
57
|
+
|
|
58
|
+
| Export | Purpose |
|
|
59
|
+
|--------|---------|
|
|
60
|
+
| `UIAgentSurface` | Default A2UI renderer. Subscribes to the runtime and renders all surfaces. |
|
|
61
|
+
| `UIAgentSurfaceProps` | `{ runtime, onAction?, renderEmpty?, renderSurface? }`. `renderEmpty` runs when there are no surfaces; `renderSurface(surface)` lets you wrap or replace the default surface rendering per item. |
|
|
62
|
+
|
|
63
|
+
### Catalog
|
|
64
|
+
|
|
65
|
+
| Export | Purpose |
|
|
66
|
+
|--------|---------|
|
|
67
|
+
| `basicCatalog` | The default A2UI basic catalog as a React renderer catalog. |
|
|
68
|
+
| `defineCatalog(options)` | Build a React renderer catalog: extends a base catalog (defaults to `basicCatalog`) and adds custom React component implementations. |
|
|
69
|
+
| `DefineCatalogOptions` | `{ id, extends?, components? }`. |
|
|
70
|
+
|
|
71
|
+
### Component-implementation helpers (re-exported from `@a2ui/react`)
|
|
72
|
+
|
|
73
|
+
| Export | Purpose |
|
|
74
|
+
|--------|---------|
|
|
75
|
+
| `createComponentImplementation` | Build a React component implementation bound to the A2UI binder (data-binding, actions, theme). |
|
|
76
|
+
| `createBinderlessComponentImplementation` | Build a React implementation that does **not** use the binder — for components that take only static props. |
|
|
77
|
+
| `ReactComponentImplementation` | Type of a component implementation registered in a `Catalog`. |
|
|
78
|
+
| `ReactA2uiComponentProps` | Props shape passed by the renderer into a component implementation. |
|
|
79
|
+
|
|
80
|
+
### Re-exports
|
|
81
|
+
|
|
82
|
+
- `Catalog` from `@a2ui/web_core/v0_9` — for advanced catalog composition.
|
|
83
|
+
- `z` from `zod` — write component schemas with the version pinned by this package.
|
|
84
|
+
- Runtime types: `UIAction`, `UIRuntime`, `UIRuntimeCatalog`,
|
|
85
|
+
`UIRuntimeError`, `UIRuntimeOptions`, `UIRuntimeState`,
|
|
86
|
+
`UIRuntimeSurface` (from `@agentic-ui-experience/ui-runtime`).
|
|
87
|
+
|
|
88
|
+
## Defining a custom catalog
|
|
89
|
+
|
|
90
|
+
```tsx
|
|
91
|
+
import { z } from "zod";
|
|
92
|
+
import {
|
|
93
|
+
defineCatalog,
|
|
94
|
+
createComponentImplementation
|
|
95
|
+
} from "@agentic-ui-experience/ui-react";
|
|
96
|
+
|
|
97
|
+
const WeatherCard = createComponentImplementation({
|
|
98
|
+
name: "WeatherCard",
|
|
99
|
+
schema: z.object({
|
|
100
|
+
location: z.string(),
|
|
101
|
+
tempF: z.number()
|
|
102
|
+
}),
|
|
103
|
+
render: ({ props }) => (
|
|
104
|
+
<div>{props.location}: {props.tempF}°F</div>
|
|
105
|
+
)
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
export const weatherCatalog = defineCatalog({
|
|
109
|
+
id: "weather",
|
|
110
|
+
components: [WeatherCard]
|
|
111
|
+
});
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Build the prompt descriptor separately in `@agentic-ui-experience/ui-core`
|
|
115
|
+
and pass `weatherCatalog` to `useUIRuntime({ catalogs: [weatherCatalog] })`.
|
|
116
|
+
|
|
117
|
+
The component `schema` is the **single source of truth**. The same Zod
|
|
118
|
+
schema is reused three ways: the prompt descriptor turns it into JSON
|
|
119
|
+
Schema (via `zod-to-json-schema`), the renderer binds props with it, and
|
|
120
|
+
the runtime validates the agent's output against it — basic and custom
|
|
121
|
+
components alike (see [ui-runtime → `createUIRuntime`](../ui-runtime/README.md#createuiruntime)).
|
|
122
|
+
Describe **props only**: do not put `id` or `component` in the schema
|
|
123
|
+
(they are envelope fields, stripped before validation).
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type ReactComponentImplementation } from "@a2ui/react/v0_9";
|
|
2
|
+
import { Catalog } from "@a2ui/web_core/v0_9";
|
|
3
|
+
export interface DefineCatalogOptions {
|
|
4
|
+
/** Catalog id - must match the surface's `catalogId`. */
|
|
5
|
+
id: string;
|
|
6
|
+
/** Catalog to extend. Defaults to `basicCatalog`. */
|
|
7
|
+
extends?: Catalog<ReactComponentImplementation>;
|
|
8
|
+
/** Custom components added on top of the base catalog. */
|
|
9
|
+
components?: readonly ReactComponentImplementation[];
|
|
10
|
+
}
|
|
11
|
+
export declare function defineCatalog(options: DefineCatalogOptions): Catalog<ReactComponentImplementation>;
|
|
12
|
+
export declare const defineReactCatalog: typeof defineCatalog;
|
|
13
|
+
export declare const basicCatalog: Catalog<ReactComponentImplementation>;
|
package/dist/catalog.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function _0xe9d1(){const _0x227327=['1515LyBwzP','1055760XYiBZr','396622USXDGr','3486MxuTJe','598402fOTmfk','545968iKWpdq','8OTkohc','values','extends','components','3ROYGmz','3135654KJDhaK','425530FDpyij'];_0xe9d1=function(){return _0x227327;};return _0xe9d1();}(function(_0x18f2a0,_0x3727ef){const _0x50b889=_0x1913,_0x576d41=_0x18f2a0();while(!![]){try{const _0x2f0d7b=-parseInt(_0x50b889(0x14c))/0x1+-parseInt(_0x50b889(0x14f))/0x2*(-parseInt(_0x50b889(0x14a))/0x3)+parseInt(_0x50b889(0x152))/0x4+-parseInt(_0x50b889(0x14d))/0x5*(-parseInt(_0x50b889(0x150))/0x6)+-parseInt(_0x50b889(0x151))/0x7+parseInt(_0x50b889(0x153))/0x8*(parseInt(_0x50b889(0x14b))/0x9)+-parseInt(_0x50b889(0x14e))/0xa;if(_0x2f0d7b===_0x3727ef)break;else _0x576d41['push'](_0x576d41['shift']());}catch(_0x3a4329){_0x576d41['push'](_0x576d41['shift']());}}}(_0xe9d1,0x3b3e4));import{basicCatalog as _0x179eed}from'@a2ui/react/v0_9';import{Catalog}from'@a2ui/web_core/v0_9';import{A2UI_BASIC_CATALOG_ID}from'@agentic-ui-experience/ui-core';function _0x1913(_0x93cf4e,_0x21bd0a){_0x93cf4e=_0x93cf4e-0x148;const _0xe9d1d9=_0xe9d1();let _0x191399=_0xe9d1d9[_0x93cf4e];return _0x191399;}function defineCatalog(_0x102c78){const _0x508353=_0x1913,_0x161d86=_0x102c78[_0x508353(0x148)]??basicCatalog,_0x2325f7=_0x102c78[_0x508353(0x149)]??[],_0x4d82d0=[..._0x161d86['components'][_0x508353(0x154)](),..._0x2325f7],_0x389175=[..._0x161d86['functions']['values']()],_0x1a58b6=new Catalog(_0x102c78['id'],_0x4d82d0,_0x389175,_0x161d86['themeSchema']);return _0x1a58b6;}const defineReactCatalog=defineCatalog;function cloneCatalog(_0x114eff,_0x5b5d11=_0x114eff['id']){const _0x268ab9=_0x1913;return new Catalog(_0x5b5d11,[..._0x114eff['components']['values']()],[..._0x114eff['functions'][_0x268ab9(0x154)]()],_0x114eff['themeSchema']);}const basicCatalog=cloneCatalog(_0x179eed,A2UI_BASIC_CATALOG_ID);export{basicCatalog,defineCatalog,defineReactCatalog};
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { basicCatalog, defineCatalog, defineReactCatalog, type DefineCatalogOptions } from "./catalog.js";
|
|
2
|
+
export { UIAgentSurface, useUIAgent, useUIRuntime, type UIAgentSurfaceProps, type UseUIRuntimeOptions } from "./react.js";
|
|
3
|
+
export { createBinderlessComponentImplementation, createComponentImplementation, type ReactA2uiComponentProps, type ReactComponentImplementation } from "@a2ui/react/v0_9";
|
|
4
|
+
export { Catalog } from "@a2ui/web_core/v0_9";
|
|
5
|
+
export { ActionSchema, CheckableSchema, CommonSchemas, DataBindingSchema, DynamicBooleanSchema, DynamicNumberSchema, DynamicStringListSchema, DynamicStringSchema, DynamicValueSchema, FunctionCallSchema } from "@a2ui/web_core/v0_9";
|
|
6
|
+
export { z } from "zod";
|
|
7
|
+
export type { UIAction, UIRuntime, UIRuntimeCatalog, UIRuntimeError, UIRuntimeOptions, UIRuntimeState, UIRuntimeSurface } from "@agentic-ui-experience/ui-runtime";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(_0x315cee,_0x35e08){var _0x1c0ea1=_0x757c,_0x4236ec=_0x315cee();while(!![]){try{var _0x38e2a8=parseInt(_0x1c0ea1(0x86))/0x1+-parseInt(_0x1c0ea1(0x89))/0x2*(-parseInt(_0x1c0ea1(0x83))/0x3)+parseInt(_0x1c0ea1(0x88))/0x4+-parseInt(_0x1c0ea1(0x82))/0x5+parseInt(_0x1c0ea1(0x8a))/0x6*(parseInt(_0x1c0ea1(0x84))/0x7)+-parseInt(_0x1c0ea1(0x85))/0x8+-parseInt(_0x1c0ea1(0x87))/0x9;if(_0x38e2a8===_0x35e08)break;else _0x4236ec['push'](_0x4236ec['shift']());}catch(_0x3ebd41){_0x4236ec['push'](_0x4236ec['shift']());}}}(_0x47c0,0x1d6c9));import{basicCatalog,defineCatalog,defineReactCatalog}from'./catalog.js';import{UIAgentSurface,useUIAgent,useUIRuntime}from'./react.js';import{createBinderlessComponentImplementation,createComponentImplementation}from'@a2ui/react/v0_9';function _0x757c(_0x25d9b3,_0x3b5411){_0x25d9b3=_0x25d9b3-0x82;var _0x47c05f=_0x47c0();var _0x757c75=_0x47c05f[_0x25d9b3];return _0x757c75;}import{ActionSchema,Catalog,CheckableSchema,CommonSchemas,DataBindingSchema,DynamicBooleanSchema,DynamicNumberSchema,DynamicStringListSchema,DynamicStringSchema,DynamicValueSchema,FunctionCallSchema}from'@a2ui/web_core/v0_9';function _0x47c0(){var _0x476a9b=['194928xgJxUq','205635QRbFfb','2306718uCLFAT','507712vCCxzh','484OncvAj','1362VMDjHx','813915zVLQKf','2607zLDfre','651XeyTKs'];_0x47c0=function(){return _0x476a9b;};return _0x47c0();}import{z}from'zod';export{ActionSchema,Catalog,CheckableSchema,CommonSchemas,DataBindingSchema,DynamicBooleanSchema,DynamicNumberSchema,DynamicStringListSchema,DynamicStringSchema,DynamicValueSchema,FunctionCallSchema,UIAgentSurface,basicCatalog,createBinderlessComponentImplementation,createComponentImplementation,defineCatalog,defineReactCatalog,useUIAgent,useUIRuntime,z};
|
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ReactComponentImplementation } from "@a2ui/react/v0_9";
|
|
2
|
+
import type { UIAction, UIRuntime, UIRuntimeError, UIRuntimeOptions, UIRuntimeState, UIRuntimeSurface } from "@agentic-ui-experience/ui-runtime";
|
|
3
|
+
type ReactUIRuntime = UIRuntime<ReactComponentImplementation>;
|
|
4
|
+
type ReactUIRuntimeOptions = UIRuntimeOptions<ReactComponentImplementation>;
|
|
5
|
+
type ReactUIRuntimeState = UIRuntimeState<ReactComponentImplementation>;
|
|
6
|
+
type ReactUIRuntimeSurface = UIRuntimeSurface<ReactComponentImplementation>;
|
|
7
|
+
export declare function useUIAgent(runtime: ReactUIRuntime): ReactUIRuntimeState;
|
|
8
|
+
export interface UseUIRuntimeOptions extends Omit<ReactUIRuntimeOptions, "catalogs" | "onAction" | "onError"> {
|
|
9
|
+
catalogs?: ReactUIRuntimeOptions["catalogs"];
|
|
10
|
+
onAction?: (action: UIAction) => void;
|
|
11
|
+
onError?: (error: UIRuntimeError) => void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Creates an app-scoped A2UI runtime that survives React StrictMode's
|
|
15
|
+
* double-mount cycle. Callbacks are forwarded through refs, so passing
|
|
16
|
+
* fresh inline functions on every render does NOT recreate the runtime.
|
|
17
|
+
*
|
|
18
|
+
* No auto-dispose: the runtime is meant to live for the lifetime of the
|
|
19
|
+
* mounting component. Call `runtime.dispose()` manually if your app
|
|
20
|
+
* creates multiple runtimes and needs to tear one down early.
|
|
21
|
+
*/
|
|
22
|
+
export declare function useUIRuntime(options?: UseUIRuntimeOptions): ReactUIRuntime;
|
|
23
|
+
export interface UIAgentSurfaceProps {
|
|
24
|
+
runtime: ReactUIRuntime;
|
|
25
|
+
onAction?: (action: UIAction) => void;
|
|
26
|
+
renderEmpty?: () => React.ReactNode;
|
|
27
|
+
renderSurface?: (surface: ReactUIRuntimeSurface) => React.ReactNode;
|
|
28
|
+
}
|
|
29
|
+
export declare function UIAgentSurface(props: UIAgentSurfaceProps): React.ReactElement | null;
|
|
30
|
+
export {};
|
package/dist/react.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function _0x42d4(_0x284933,_0x22054a){_0x284933=_0x284933-0x15f;const _0x426cb9=_0x426c();let _0x42d450=_0x426cb9[_0x284933];return _0x42d450;}(function(_0x5cca18,_0x312b2d){const _0xa3d165=_0x42d4,_0x586646=_0x5cca18();while(!![]){try{const _0x248321=-parseInt(_0xa3d165(0x162))/0x1+parseInt(_0xa3d165(0x15f))/0x2+-parseInt(_0xa3d165(0x161))/0x3+parseInt(_0xa3d165(0x169))/0x4+parseInt(_0xa3d165(0x167))/0x5+-parseInt(_0xa3d165(0x160))/0x6+-parseInt(_0xa3d165(0x16a))/0x7;if(_0x248321===_0x312b2d)break;else _0x586646['push'](_0x586646['shift']());}catch(_0x4b4a45){_0x586646['push'](_0x586646['shift']());}}}(_0x426c,0x230b0));import{jsx}from'react/jsx-runtime';import{useSyncExternalStore,useRef,useState}from'react';import{MarkdownContext,A2uiSurface}from'@a2ui/react/v0_9';import{renderMarkdown}from'@a2ui/markdown-it';function _0x426c(){const _0x22b11e=['current','1140724fnAEJR','774347MDzqjz','surfaces','runtime','218132EEKCiY','1379034gObjgO','64203sjSOeb','83645cmyEKs','onError','length','renderSurface','map','973975iraIou'];_0x426c=function(){return _0x22b11e;};return _0x426c();}import{createUIRuntime}from'@agentic-ui-experience/ui-runtime';import{basicCatalog}from'./catalog.js';function useUIAgent(_0x1a3684){return useSyncExternalStore(_0x1a3684['subscribe'],_0x1a3684['getState'],_0x1a3684['getState']);}function useUIRuntime(_0x39ebae={}){const _0x161f27=_0x42d4,_0x49ca07=useRef(_0x39ebae['onAction']),_0x11beb1=useRef(_0x39ebae['onError']);_0x49ca07['current']=_0x39ebae['onAction'],_0x11beb1['current']=_0x39ebae[_0x161f27(0x163)];const {catalogs:catalogs=[basicCatalog],normalizeMode:_0x24784f}=_0x39ebae,[_0x4474a4]=useState(()=>createUIRuntime({'catalogs':catalogs,..._0x24784f?{'normalizeMode':_0x24784f}:{},'onAction':_0xacdd29=>_0x49ca07['current']?.(_0xacdd29),'onError':_0x47e958=>_0x11beb1[_0x161f27(0x168)]?.(_0x47e958)}));return _0x4474a4;}function UIAgentSurface(_0x2a9ec6){const _0x1988e9=_0x42d4,_0x241823=useUIAgent(_0x2a9ec6[_0x1988e9(0x16c)]);if(_0x241823['surfaces'][_0x1988e9(0x164)]===0x0)return _0x2a9ec6['renderEmpty']?.()??null;return jsx(MarkdownContext['Provider'],{'value':renderMarkdown,'children':_0x241823[_0x1988e9(0x16b)][_0x1988e9(0x166)](_0x3e1619=>{const _0x224a28=_0x1988e9;if(_0x2a9ec6['renderSurface'])return jsx('div',{'data-a2ui-surface':_0x3e1619['id'],'children':_0x2a9ec6[_0x224a28(0x165)](_0x3e1619)},_0x3e1619['id']);return jsx('div',{'data-a2ui-surface':_0x3e1619['id'],'children':jsx(A2uiSurface,{'surface':_0x3e1619})},_0x3e1619['id']);})});}export{UIAgentSurface,useUIAgent,useUIRuntime};
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@agentic-ui-experience/ui-react",
|
|
3
|
+
"version": "0.0.1-beta.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public",
|
|
18
|
+
"tag": "beta"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@a2ui/markdown-it": "0.0.3",
|
|
22
|
+
"@a2ui/react": "0.9.0",
|
|
23
|
+
"@a2ui/web_core": "0.9.2",
|
|
24
|
+
"zod": "^3.25.76",
|
|
25
|
+
"@agentic-ui-experience/ui-core": "0.0.1-beta.1",
|
|
26
|
+
"@agentic-ui-experience/ui-runtime": "0.0.1-beta.1"
|
|
27
|
+
},
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
30
|
+
"react-dom": "^18.0.0 || ^19.0.0"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@types/react": "^19.0.0",
|
|
34
|
+
"@types/react-dom": "^19.0.0",
|
|
35
|
+
"react": "^19.0.0",
|
|
36
|
+
"react-dom": "^19.0.0"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "node ../../scripts/build-obfuscated-package.mjs .",
|
|
40
|
+
"dev": "tsc -b -w --preserveWatchOutput --force",
|
|
41
|
+
"clean": "rm -rf dist tsconfig.tsbuildinfo",
|
|
42
|
+
"test": "pnpm run build && node --test \"tests/**/*.test.mjs\""
|
|
43
|
+
}
|
|
44
|
+
}
|