@contractspec/lib.contracts-runtime-client-react 3.8.5 → 3.9.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.
@@ -1,480 +1 @@
1
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
- }) : x)(function(x) {
4
- if (typeof require !== "undefined")
5
- return require.apply(this, arguments);
6
- throw Error('Dynamic require of "' + x + '" is not supported');
7
- });
8
-
9
- // src/drivers/rn-reusables.ts
10
- function rnReusablesDriver(slots) {
11
- return slots;
12
- }
13
-
14
- // src/drivers/shadcn.ts
15
- function shadcnDriver(slots) {
16
- return slots;
17
- }
18
-
19
- // src/transform-engine.ts
20
- import {
21
- createDefaultTransformEngine,
22
- htmlToMarkdown,
23
- registerBasicValidation
24
- } from "@contractspec/lib.presentation-runtime-core/transform-engine";
25
- import React from "react";
26
-
27
- export * from "@contractspec/lib.presentation-runtime-core/transform-engine";
28
- function registerDefaultReactRenderer(engine) {
29
- engine.register({
30
- target: "react",
31
- async render(desc) {
32
- if (desc.source.type === "component") {
33
- const props = desc.source.props ? desc.source.props.getZod().safeParse({}).success ? {} : undefined : undefined;
34
- return {
35
- kind: "react_component",
36
- componentKey: desc.source.componentKey,
37
- props
38
- };
39
- }
40
- return {
41
- kind: "blocknotejs",
42
- docJson: desc.source.docJson,
43
- blockConfig: desc.source.blockConfig
44
- };
45
- }
46
- });
47
- return engine;
48
- }
49
- function registerReactToMarkdownRenderer(engine, componentMap) {
50
- engine.prependRegister({
51
- target: "markdown",
52
- async render(desc) {
53
- if (desc.source.type !== "component") {
54
- throw new Error("React-to-markdown renderer only handles component presentations");
55
- }
56
- const Component = componentMap[desc.source.componentKey];
57
- if (!Component) {
58
- throw new Error(`Component ${desc.source.componentKey} not found in componentMap`);
59
- }
60
- const { renderToStaticMarkup } = await import("react-dom/server");
61
- const element = React.createElement(Component, desc.source.props ? {} : undefined);
62
- const markdown = htmlToMarkdown(renderToStaticMarkup(element));
63
- return {
64
- mimeType: "text/markdown",
65
- body: desc.policy?.pii?.length ? markdown.replace(/\[REDACTED\]/g, "[REDACTED]") : markdown
66
- };
67
- }
68
- });
69
- return engine;
70
- }
71
-
72
- // src/feature-render.ts
73
- import React2 from "react";
74
- function createEngineWithDefaults() {
75
- return registerBasicValidation(registerDefaultReactRenderer(createDefaultTransformEngine()));
76
- }
77
- async function renderFeaturePresentation(engine, target, desc, options) {
78
- if (target === "react") {
79
- const rd = await engine.render("react", desc);
80
- if (rd.kind === "react_component") {
81
- const map = options?.componentMap ?? {};
82
- const C = map[rd.componentKey];
83
- if (!C)
84
- return null;
85
- const merged = {
86
- ...rd.props ?? {},
87
- ...options?.reactProps ?? {}
88
- };
89
- return React2.createElement(C, merged);
90
- }
91
- if (rd.kind === "blocknotejs") {
92
- if (options?.renderBlockNote)
93
- return options.renderBlockNote(rd.docJson, rd.blockConfig);
94
- return React2.createElement("div", {}, "[BlockNote renderer not configured]");
95
- }
96
- return null;
97
- }
98
- if (target === "markdown")
99
- return engine.render(target, desc);
100
- if (target === "application/json")
101
- return engine.render(target, desc);
102
- if (target === "application/xml")
103
- return engine.render(target, desc);
104
- return null;
105
- }
106
- function createFeatureModule(meta, refs) {
107
- return { meta, ...refs };
108
- }
109
- function registerFeature(registry, feature) {
110
- registry.register(feature);
111
- return registry;
112
- }
113
-
114
- // src/form-render.impl.tsx
115
- import {
116
- buildZodWithRelations,
117
- evalPredicate
118
- } from "@contractspec/lib.contracts-spec/forms";
119
- import { zodResolver } from "@hookform/resolvers/zod";
120
- import React3, { useEffect, useMemo, useState } from "react";
121
- import {
122
- Controller,
123
- useFieldArray,
124
- useForm
125
- } from "react-hook-form";
126
- import { jsxDEV, Fragment } from "react/jsx-dev-runtime";
127
- "use client";
128
- function toOptionsArray(src) {
129
- if (!src)
130
- return;
131
- if (Array.isArray(src))
132
- return { kind: "static", options: src };
133
- return src;
134
- }
135
- function getAtPath(values, path) {
136
- if (!path)
137
- return;
138
- const segs = path.replace(/\[(\d+)\]/g, ".$1").split(".").filter(Boolean);
139
- let cur = values;
140
- for (const s of segs) {
141
- if (cur == null)
142
- return;
143
- cur = cur[s];
144
- }
145
- return cur;
146
- }
147
- function makeDepsKey(values, deps) {
148
- if (!deps || deps.length === 0)
149
- return "[]";
150
- try {
151
- return JSON.stringify(deps.map((d) => getAtPath(values, d)));
152
- } catch {
153
- return "[]";
154
- }
155
- }
156
- function useResolvedOptions(values, source, resolvers) {
157
- const [opts, setOpts] = useState([]);
158
- const depKey = useMemo(() => {
159
- if (!source)
160
- return "nil";
161
- if (source.kind === "static")
162
- return JSON.stringify(source.options ?? []);
163
- return makeDepsKey(values, source.deps);
164
- }, [source, values]);
165
- useEffect(() => {
166
- let mounted = true;
167
- const run = async () => {
168
- if (!source)
169
- return setOpts([]);
170
- if (source.kind === "static")
171
- return setOpts([...source.options ?? []]);
172
- const fn = resolvers?.[source.resolverKey];
173
- if (!fn)
174
- return setOpts([]);
175
- const res = await fn(values, source.args);
176
- if (mounted)
177
- setOpts([...res ?? []]);
178
- };
179
- run();
180
- return () => {
181
- mounted = false;
182
- };
183
- }, [
184
- depKey,
185
- source && source.kind === "resolver" ? source.resolverKey : undefined
186
- ]);
187
- return opts;
188
- }
189
- function fieldPath(parent, name, arrayIndex) {
190
- if (!name)
191
- return parent ?? "";
192
- const child = typeof arrayIndex === "number" ? `${name.replace(/^\$index$/, String(arrayIndex))}` : name;
193
- return parent ? `${parent}${typeof arrayIndex === "number" ? `.${arrayIndex}` : ""}.${child}`.replace(/\.+/g, ".") : child;
194
- }
195
- function createFormRenderer(base) {
196
- const conf = base;
197
- const { driver } = conf;
198
- function InternalForm(props) {
199
- const { spec, options, merged } = props;
200
- const baseZod = useMemo(() => buildZodWithRelations(spec), [spec]);
201
- const form = useForm({
202
- ...merged.formOptions,
203
- resolver: zodResolver(baseZod),
204
- defaultValues: options?.defaultValues
205
- });
206
- const values = form.watch();
207
- const renderOne = (f, parent, arrayIndex) => {
208
- const DriverField = driver.Field;
209
- const DriverLabel = driver.FieldLabel;
210
- const DriverDesc = driver.FieldDescription;
211
- const DriverError = driver.FieldError;
212
- const name = fieldPath(parent, f.name, arrayIndex);
213
- const visible = evalPredicate(values, f.visibleWhen);
214
- const enabled = evalPredicate(values, f.enabledWhen);
215
- const invalid = Boolean(form.getFieldState(name)?.invalid);
216
- if (!visible)
217
- return null;
218
- const id = name?.replace(/\./g, "-");
219
- const commonWrapProps = {
220
- "data-invalid": invalid,
221
- hidden: !visible,
222
- disabled: !enabled
223
- };
224
- const labelNode = f.labelI18n ? /* @__PURE__ */ jsxDEV(DriverLabel, {
225
- htmlFor: id,
226
- children: f.labelI18n
227
- }, undefined, false, undefined, this) : null;
228
- const descNode = f.descriptionI18n ? /* @__PURE__ */ jsxDEV(DriverDesc, {
229
- children: f.descriptionI18n
230
- }, undefined, false, undefined, this) : null;
231
- if (f.kind === "group") {
232
- const children = f.fields.map((c, i) => /* @__PURE__ */ jsxDEV(React3.Fragment, {
233
- children: renderOne(c, name, arrayIndex)
234
- }, `${name}-${i}`, false, undefined, this));
235
- return /* @__PURE__ */ jsxDEV(DriverField, {
236
- ...commonWrapProps,
237
- children: [
238
- labelNode,
239
- children,
240
- descNode
241
- ]
242
- }, undefined, true, undefined, this);
243
- }
244
- if (f.kind === "array") {
245
- return renderArray(f, parent);
246
- }
247
- return /* @__PURE__ */ jsxDEV(Controller, {
248
- name,
249
- control: form.control,
250
- render: ({ field, fieldState }) => {
251
- const err = fieldState.error ? [fieldState.error] : [];
252
- const ariaInvalid = fieldState.invalid || undefined;
253
- if (f.kind === "text") {
254
- const textField = f;
255
- const Input = driver.Input;
256
- return /* @__PURE__ */ jsxDEV(DriverField, {
257
- ...commonWrapProps,
258
- children: [
259
- labelNode,
260
- /* @__PURE__ */ jsxDEV(Input, {
261
- id,
262
- "aria-invalid": ariaInvalid,
263
- placeholder: f.placeholderI18n,
264
- autoComplete: textField.autoComplete,
265
- inputMode: textField.inputMode,
266
- maxLength: textField.maxLength,
267
- minLength: textField.minLength,
268
- disabled: !enabled,
269
- ...field,
270
- ...f.uiProps
271
- }, undefined, false, undefined, this),
272
- descNode,
273
- fieldState.invalid ? /* @__PURE__ */ jsxDEV(DriverError, {
274
- errors: err
275
- }, undefined, false, undefined, this) : null
276
- ]
277
- }, undefined, true, undefined, this);
278
- }
279
- if (f.kind === "textarea") {
280
- const textareaField = f;
281
- const Textarea = driver.Textarea;
282
- return /* @__PURE__ */ jsxDEV(DriverField, {
283
- ...commonWrapProps,
284
- children: [
285
- labelNode,
286
- /* @__PURE__ */ jsxDEV(Textarea, {
287
- id,
288
- "aria-invalid": ariaInvalid,
289
- placeholder: f.placeholderI18n,
290
- rows: textareaField.rows,
291
- maxLength: textareaField.maxLength,
292
- disabled: !enabled,
293
- ...field,
294
- ...f.uiProps
295
- }, undefined, false, undefined, this),
296
- descNode,
297
- fieldState.invalid ? /* @__PURE__ */ jsxDEV(DriverError, {
298
- errors: err
299
- }, undefined, false, undefined, this) : null
300
- ]
301
- }, undefined, true, undefined, this);
302
- }
303
- if (f.kind === "select") {
304
- const selectField = f;
305
- const Select = driver.Select;
306
- const src = toOptionsArray(selectField.options);
307
- const opts = useResolvedOptions(values, src, merged.resolvers);
308
- return /* @__PURE__ */ jsxDEV(DriverField, {
309
- ...commonWrapProps,
310
- children: [
311
- labelNode,
312
- /* @__PURE__ */ jsxDEV(Select, {
313
- id,
314
- name,
315
- "aria-invalid": ariaInvalid,
316
- disabled: !enabled,
317
- value: field.value,
318
- onChange: (v) => field.onChange(v),
319
- options: opts,
320
- ...f.uiProps
321
- }, undefined, false, undefined, this),
322
- descNode,
323
- fieldState.invalid ? /* @__PURE__ */ jsxDEV(DriverError, {
324
- errors: err
325
- }, undefined, false, undefined, this) : null
326
- ]
327
- }, undefined, true, undefined, this);
328
- }
329
- if (f.kind === "checkbox") {
330
- const Checkbox = driver.Checkbox;
331
- return /* @__PURE__ */ jsxDEV(DriverField, {
332
- ...commonWrapProps,
333
- children: [
334
- labelNode,
335
- /* @__PURE__ */ jsxDEV(Checkbox, {
336
- id,
337
- name,
338
- disabled: !enabled,
339
- checked: !!field.value,
340
- onCheckedChange: (v) => field.onChange(v),
341
- ...f.uiProps
342
- }, undefined, false, undefined, this),
343
- descNode,
344
- fieldState.invalid ? /* @__PURE__ */ jsxDEV(DriverError, {
345
- errors: err
346
- }, undefined, false, undefined, this) : null
347
- ]
348
- }, undefined, true, undefined, this);
349
- }
350
- if (f.kind === "radio") {
351
- const radioField = f;
352
- const RadioGroup = driver.RadioGroup;
353
- const src = toOptionsArray(radioField.options);
354
- const opts = useResolvedOptions(values, src, merged.resolvers);
355
- return /* @__PURE__ */ jsxDEV(DriverField, {
356
- ...commonWrapProps,
357
- children: [
358
- labelNode,
359
- /* @__PURE__ */ jsxDEV(RadioGroup, {
360
- id,
361
- name,
362
- disabled: !enabled,
363
- value: field.value,
364
- onValueChange: (v) => field.onChange(v),
365
- options: opts,
366
- ...f.uiProps
367
- }, undefined, false, undefined, this),
368
- descNode,
369
- fieldState.invalid ? /* @__PURE__ */ jsxDEV(DriverError, {
370
- errors: err
371
- }, undefined, false, undefined, this) : null
372
- ]
373
- }, undefined, true, undefined, this);
374
- }
375
- if (f.kind === "switch") {
376
- const Switch = driver.Switch;
377
- return /* @__PURE__ */ jsxDEV(DriverField, {
378
- ...commonWrapProps,
379
- children: [
380
- labelNode,
381
- /* @__PURE__ */ jsxDEV(Switch, {
382
- id,
383
- name,
384
- disabled: !enabled,
385
- checked: !!field.value,
386
- onCheckedChange: (v) => field.onChange(v),
387
- ...f.uiProps
388
- }, undefined, false, undefined, this),
389
- descNode,
390
- fieldState.invalid ? /* @__PURE__ */ jsxDEV(DriverError, {
391
- errors: err
392
- }, undefined, false, undefined, this) : null
393
- ]
394
- }, undefined, true, undefined, this);
395
- }
396
- return /* @__PURE__ */ jsxDEV(Fragment, {}, undefined, false, undefined, this);
397
- }
398
- }, name, false, undefined, this);
399
- };
400
- const renderArray = (f, parent) => {
401
- const name = fieldPath(parent, f.name);
402
- const { fields, append, remove } = useFieldArray({
403
- control: form.control,
404
- name
405
- });
406
- const canAdd = f.max == null || fields.length < f.max;
407
- const canRemove = (idx) => (f.min == null ? fields.length > 0 : fields.length > f.min) && idx >= 0;
408
- const Button2 = driver.Button;
409
- const Label = driver.FieldLabel;
410
- return /* @__PURE__ */ jsxDEV("div", {
411
- children: [
412
- f.labelI18n ? /* @__PURE__ */ jsxDEV(Label, {
413
- children: f.labelI18n
414
- }, undefined, false, undefined, this) : null,
415
- fields.map((row, idx) => /* @__PURE__ */ jsxDEV("div", {
416
- children: [
417
- renderOne(f.of, name, idx),
418
- canRemove(idx) ? /* @__PURE__ */ jsxDEV(Button2, {
419
- type: "button",
420
- variant: "ghost",
421
- size: "sm",
422
- onClick: () => remove(idx),
423
- children: "Remove"
424
- }, undefined, false, undefined, this) : null
425
- ]
426
- }, row.id ?? idx, true, undefined, this)),
427
- canAdd ? /* @__PURE__ */ jsxDEV(Button2, {
428
- type: "button",
429
- variant: "outline",
430
- size: "sm",
431
- onClick: () => append({}),
432
- children: "Add"
433
- }, undefined, false, undefined, this) : null
434
- ]
435
- }, name, true, undefined, this);
436
- };
437
- const onSubmit = async (data) => {
438
- const actionKey = spec.actions?.[0]?.key ?? "submit";
439
- if (merged.onSubmitOverride) {
440
- return merged.onSubmitOverride(data, actionKey);
441
- }
442
- };
443
- const Button = driver.Button;
444
- return /* @__PURE__ */ jsxDEV("form", {
445
- onSubmit: form.handleSubmit(onSubmit),
446
- children: [
447
- (spec.fields || []).map((f, i) => /* @__PURE__ */ jsxDEV(React3.Fragment, {
448
- children: renderOne(f)
449
- }, i, false, undefined, this)),
450
- spec.actions && spec.actions.length ? /* @__PURE__ */ jsxDEV("div", {
451
- children: spec.actions.map((a) => /* @__PURE__ */ jsxDEV(Button, {
452
- type: "submit",
453
- children: a.labelI18n
454
- }, a.key, false, undefined, this))
455
- }, undefined, false, undefined, this) : null
456
- ]
457
- }, undefined, true, undefined, this);
458
- }
459
- return {
460
- render: (spec, options) => /* @__PURE__ */ jsxDEV(InternalForm, {
461
- spec,
462
- options,
463
- merged: {
464
- ...conf,
465
- ...options?.overrides ?? {}
466
- }
467
- }, undefined, false, undefined, this)
468
- };
469
- }
470
- // src/index.ts
471
- "use client";
472
- export {
473
- shadcnDriver,
474
- rnReusablesDriver,
475
- renderFeaturePresentation,
476
- registerFeature,
477
- createFormRenderer,
478
- createFeatureModule,
479
- createEngineWithDefaults
480
- };
1
+ var s=((G)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(G,{get:(H,X)=>(typeof require<"u"?require:H)[X]}):G)(function(G){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+G+'" is not supported')});function WG(G){return G}function AG(G){return G}import{createDefaultTransformEngine as m,htmlToMarkdown as o,registerBasicValidation as u}from"@contractspec/lib.presentation-runtime-core/transform-engine";import r from"react";export*from"@contractspec/lib.presentation-runtime-core/transform-engine";function c(G){return G.register({target:"react",async render(H){if(H.source.type==="component"){let X=H.source.props?H.source.props.getZod().safeParse({}).success?{}:void 0:void 0;return{kind:"react_component",componentKey:H.source.componentKey,props:X}}return{kind:"blocknotejs",docJson:H.source.docJson,blockConfig:H.source.blockConfig}}}),G}function DG(G,H){return G.prependRegister({target:"markdown",async render(X){if(X.source.type!=="component")throw Error("React-to-markdown renderer only handles component presentations");let J=H[X.source.componentKey];if(!J)throw Error(`Component ${X.source.componentKey} not found in componentMap`);let{renderToStaticMarkup:U}=await import("react-dom/server"),B=r.createElement(J,X.source.props?{}:void 0),$=o(U(B));return{mimeType:"text/markdown",body:X.policy?.pii?.length?$.replace(/\[REDACTED\]/g,"[REDACTED]"):$}}}),G}import f from"react";function FG(){return u(c(m()))}async function jG(G,H,X,J){if(H==="react"){let U=await G.render("react",X);if(U.kind==="react_component"){let $=(J?.componentMap??{})[U.componentKey];if(!$)return null;let I={...U.props??{},...J?.reactProps??{}};return f.createElement($,I)}if(U.kind==="blocknotejs"){if(J?.renderBlockNote)return J.renderBlockNote(U.docJson,U.blockConfig);return f.createElement("div",{},"[BlockNote renderer not configured]")}return null}if(H==="markdown")return G.render(H,X);if(H==="application/json")return G.render(H,X);if(H==="application/xml")return G.render(H,X);return null}function gG(G,H){return{meta:G,...H}}function SG(G,H){return G.register(H),G}import{buildZodWithRelations as p,evalPredicate as n,isFieldReadOnly as e,normalizeFormSpec as GG}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as HG}from"@hookform/resolvers/zod";import V from"react";import{Controller as A,useFieldArray as JG,useForm as UG}from"react-hook-form";import{jsx as Y,jsxs as w,Fragment as zG}from"react/jsx-runtime";function j(G){if(!G)return;if(Array.isArray(G))return{kind:"static",options:[...G]};return G}function F(G,H){if(!H)return;let X=H.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),J=G;for(let U of X){if(J==null)return;J=J[U]}return J}function XG(G){if(!G)return[];return G.split(".").filter((H)=>/^\d+$/.test(H)).map((H)=>Number(H))}function d(G,H){if(!H)return G??"";return G?`${G}.${H}`:H}function l(G,H){if(!H||H.length===0)return"[]";try{return JSON.stringify(H.map((X)=>F(G,X)))}catch{return"[]"}}function YG(G,H){let[X,J]=V.useState(G);return V.useEffect(()=>{let U=globalThis.setTimeout(()=>J(G),H);return()=>globalThis.clearTimeout(U)},[H,G]),X}function g(G,H,X){let[J,U]=V.useState([]),B=V.useMemo(()=>{if(!H)return"nil";if(H.kind==="static")return JSON.stringify(H.options??[]);return`${H.resolverKey}:${l(G,H.deps)}`},[H,G]);return V.useEffect(()=>{let $=!0;return(async()=>{if(!H){U([]);return}if(H.kind==="static"){U([...H.options??[]]);return}let q=X?.[H.resolverKey];if(!q){U([]);return}let b=await q(G,H.args);if($)U([...b??[]])})(),()=>{$=!1}},[B,X,H,G]),J}function i(G){if(G instanceof Date&&!Number.isNaN(G.getTime()))return G;if(typeof G==="string"||typeof G==="number"){let H=new Date(G);if(!Number.isNaN(H.getTime()))return H}return null}function _G(G){if(G instanceof Date&&!Number.isNaN(G.getTime()))return G;if(typeof G!=="string"||G.trim().length===0)return null;let[H,X]=G.split(":").map(($)=>Number($)),J=H??Number.NaN,U=X??Number.NaN;if(Number.isNaN(J)||Number.isNaN(U))return null;let B=new Date;return B.setHours(J,U,0,0),B}function $G(G){if(!G)return"";return`${String(G.getHours()).padStart(2,"0")}:${String(G.getMinutes()).padStart(2,"0")}`}function t(G){return{value:G.value,labelI18n:G.labelI18n,descriptionI18n:G.descriptionI18n,...G.data??{}}}function BG(G,H,X){let J=H.trim().toLowerCase();if(!J)return[...G];let U=J.split(/\s+/).filter(Boolean);return G.filter((B)=>{let $=t(B),I=[B.labelI18n,B.descriptionI18n,String(B.value),...X.map((q)=>String(F($,q)??""))].join(" ").toLowerCase();return U.every((q)=>I.includes(q))})}function x(G,H){let X=t(G);switch(H.mode){case"scalar":return H.valueKey?F(X,H.valueKey)??G.value:G.value;case"pick":return Object.fromEntries(H.pickKeys.map((J)=>[J,F(X,J)]));case"object":default:return G.data??X}}function v(G,H){try{return JSON.stringify(G)===JSON.stringify(H)}catch{return G===H}}function IG(G,H,X,J){let U=J&&Array.isArray(H)?H:[H];return G.filter((B)=>U.some(($)=>v(x(B,X),$)))}function a(G){if(!G)return{countryCode:"",nationalNumber:""};let H=G.countryCode.trim(),X=G.nationalNumber.replace(/\s+/g,""),J=H.replace(/^\+?/,"+"),U={...G,countryCode:H,nationalNumber:G.nationalNumber};if(G.e164!=null||H||X)U.e164=`${J}${X}`.trim();return U}function LG(G){let H=g(G.values,j(G.spec.options),G.resolvers),X=G.driver.Field,J=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:U,fieldState:B})=>{let $=B.error?[B.error]:[];return w(X,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.Select,{id:G.ctx.id,name:G.ctx.name,"aria-invalid":B.invalid||void 0,disabled:!G.ctx.enabled||G.ctx.readOnly,value:U.value,onChange:(I)=>{if(G.ctx.readOnly)return;U.onChange(I)},options:H,...G.spec.uiProps}),G.descNode,B.invalid?Y(J,{errors:$}):null]})}})}function ZG(G){let H=g(G.values,j(G.spec.options),G.resolvers),X=G.driver.Field,J=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:U,fieldState:B})=>{let $=B.error?[B.error]:[];return w(X,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.RadioGroup,{id:G.ctx.id,name:G.ctx.name,disabled:!G.ctx.enabled||G.ctx.readOnly,value:U.value,onValueChange:(I)=>{if(G.ctx.readOnly)return;U.onChange(I)},options:H,...G.spec.uiProps}),G.descNode,B.invalid?Y(J,{errors:$}):null]})}})}function qG(G){let[H,X]=V.useState(""),J=G.spec.source.kind==="resolver"?G.spec.source.debounceMs??200:0,U=YG(H,J),[B,$]=V.useState([]),I=V.useMemo(()=>{return G.spec.source.kind==="resolver"?`${G.spec.source.resolverKey}:${l(G.values,G.spec.source.deps)}:${U}`:"local"},[U,G.spec.source,G.values]);V.useEffect(()=>{if(G.spec.source.kind!=="resolver")return;let Z=G.resolvers?.[G.spec.source.resolverKey],z=G.spec.source.minQueryLength??0;if(!Z||U.trim().length<z){$([]);return}let O=!0,y={...G.spec.source.args??{},query:U};return Promise.resolve(Z(G.values,y)).then((C)=>{if(O)$([...C??[]])}),()=>{O=!1}},[I,G.resolvers,G.spec.source,G.values,U]);let q=G.spec.source.kind==="local"?BG(G.spec.source.options,H,G.spec.source.searchKeys):B,b=G.driver.Field,_=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:Z,fieldState:z})=>{let O=z.error?[z.error]:[],y=IG(q,Z.value,G.spec.valueMapping,G.spec.multiple),C=(D)=>{if(G.ctx.readOnly)return;let k=x(D,G.spec.valueMapping);if(G.spec.multiple){let P=Array.isArray(Z.value)?Z.value:[],R=P.some((S)=>v(S,k));Z.onChange(R?P:[...P,k]);return}Z.onChange(k),X(D.labelI18n)},T=(D)=>{if(G.ctx.readOnly||!G.spec.multiple)return;let k=x(D,G.spec.valueMapping),P=Array.isArray(Z.value)?Z.value:[];Z.onChange(P.filter((R)=>!v(R,k)))};return w(b,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.Autocomplete,{id:G.ctx.id,name:G.ctx.name,disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,"aria-invalid":z.invalid||void 0,placeholder:G.spec.placeholderI18n,multiple:G.spec.multiple,query:H,options:q,selectedOptions:y,onQueryChange:X,onSelectOption:C,onRemoveOption:T}),G.descNode,z.invalid?Y(_,{errors:O}):null]})}})}function TG(G){let H=g(G.values,j(G.spec.countryOptions),G.resolvers),X=G.driver.Field,J=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:U,fieldState:B})=>{let $=B.error?[B.error]:[];return w(X,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.AddressField,{id:G.ctx.id,name:G.ctx.name,value:U.value??null,onChange:(I)=>{if(G.ctx.readOnly)return;U.onChange(I)},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,"aria-invalid":B.invalid||void 0,parts:G.spec.parts,countryOptions:H}),G.descNode,B.invalid?Y(J,{errors:$}):null]})}})}function wG(G){let H=g(G.values,j(G.spec.countryOptions),G.resolvers),X=G.driver.Field,J=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:U,fieldState:B})=>{let $=B.error?[B.error]:[];return w(X,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.PhoneField,{id:G.ctx.id,name:G.ctx.name,value:a(U.value??null),onChange:(I)=>{if(G.ctx.readOnly)return;U.onChange(a(I))},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,"aria-invalid":B.invalid||void 0,parts:G.spec.parts,countryOptions:H}),G.descNode,B.invalid?Y(J,{errors:$}):null]})}})}function KG(G){let H=G.driver.Field,X=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:J,fieldState:U})=>{let B=U.error?[U.error]:[];return w(H,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.DateField,{id:G.ctx.id,name:G.ctx.name,value:i(J.value),onChange:($)=>{if(G.ctx.readOnly)return;J.onChange($)},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,placeholder:G.spec.placeholderI18n,minDate:G.spec.minDate,maxDate:G.spec.maxDate}),G.descNode,U.invalid?Y(X,{errors:B}):null]})}})}function QG(G){let H=G.driver.Field,X=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:J,fieldState:U})=>{let B=U.error?[U.error]:[];return w(H,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.TimeField,{id:G.ctx.id,name:G.ctx.name,value:_G(J.value),onChange:($)=>{if(G.ctx.readOnly)return;J.onChange($G($))},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,placeholder:G.spec.placeholderI18n,is24Hour:G.spec.is24Hour}),G.descNode,U.invalid?Y(X,{errors:B}):null]})}})}function MG(G){let H=G.driver.Field,X=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:J,fieldState:U})=>{let B=U.error?[U.error]:[];return w(H,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.DateTimeField,{id:G.ctx.id,name:G.ctx.name,value:i(J.value),onChange:($)=>{if(G.ctx.readOnly)return;J.onChange($)},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,datePlaceholder:G.spec.placeholderI18n,timePlaceholder:G.spec.placeholderI18n,minDate:G.spec.minDate,maxDate:G.spec.maxDate,is24Hour:G.spec.is24Hour}),G.descNode,U.invalid?Y(X,{errors:B}):null]})}})}function VG(G){let H=d(G.parent,G.spec.name),{fields:X,append:J,remove:U}=JG({control:G.form.control,name:H}),B=G.spec.max==null||X.length<G.spec.max,$=(I)=>(G.spec.min==null?X.length>0:X.length>G.spec.min)&&I>=0;return w("div",{children:[G.spec.labelI18n?Y(G.driver.FieldLabel,{children:G.spec.labelI18n}):null,X.map((I,q)=>w("div",{children:[G.renderField(G.spec.of,`${H}.${q}`),$(q)?Y(G.driver.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>U(q),children:"Remove"}):null]},I.id??q)),B?Y(G.driver.Button,{type:"button",variant:"outline",size:"sm",onClick:()=>J({}),children:"Add"}):null]},H)}function fG(G){let H=G;function X(J){let U=V.useMemo(()=>GG(J.spec),[J.spec]),B=V.useMemo(()=>p(U),[U]),$=UG({...J.merged.formOptions,resolver:HG(B),defaultValues:J.options?.defaultValues}),I=$.watch(),q=(_,Z)=>{let z=J.merged.driver.Field,O=J.merged.driver.FieldLabel,y=J.merged.driver.FieldDescription,C=J.merged.driver.FieldError,T=d(Z,_.name),D=XG(Z),k=n(I,_.visibleWhen,D),P=n(I,_.enabledWhen,D),R=e(_),S=Boolean($.getFieldState(T)?.invalid);if(!k)return null;let L={name:T,id:T.replace(/\./g,"-"),enabled:P,readOnly:R,visible:k},K={"data-invalid":S,hidden:!k,disabled:!P||R},Q=_.labelI18n?Y(O,{htmlFor:L.id,children:_.labelI18n}):null,M=_.descriptionI18n?Y(y,{children:_.descriptionI18n}):null;if(_.kind==="group")return w(z,{...K,children:[Q,_.fields.map((N,W)=>Y(V.Fragment,{children:q(N,T)},`${T}-${W}`)),M]});if(_.kind==="array")return Y(VG,{driver:J.merged.driver,form:$,spec:_,parent:Z,renderField:q},T);if(_.kind==="select")return Y(LG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="radio")return Y(ZG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="autocomplete")return Y(qG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="address")return Y(TG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="phone")return Y(wG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="date")return Y(KG,{driver:J.merged.driver,form:$,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K},T);if(_.kind==="time")return Y(QG,{driver:J.merged.driver,form:$,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K},T);if(_.kind==="datetime")return Y(MG,{driver:J.merged.driver,form:$,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K},T);return Y(A,{name:T,control:$.control,render:({field:N,fieldState:W})=>{let h=W.error?[W.error]:[];if(_.kind==="text"){let E=_;return w(z,{...K,children:[Q,Y(J.merged.driver.Input,{id:L.id,"aria-invalid":W.invalid||void 0,placeholder:_.placeholderI18n,autoComplete:E.autoComplete,inputMode:E.inputMode,maxLength:E.maxLength,minLength:E.minLength,disabled:!L.enabled,readOnly:L.readOnly,...N,..._.uiProps}),M,W.invalid?Y(C,{errors:h}):null]})}if(_.kind==="textarea"){let E=_;return w(z,{...K,children:[Q,Y(J.merged.driver.Textarea,{id:L.id,"aria-invalid":W.invalid||void 0,placeholder:_.placeholderI18n,rows:E.rows,maxLength:E.maxLength,disabled:!L.enabled,readOnly:L.readOnly,...N,..._.uiProps}),M,W.invalid?Y(C,{errors:h}):null]})}if(_.kind==="checkbox")return w(z,{...K,children:[Q,Y(J.merged.driver.Checkbox,{id:L.id,name:L.name,disabled:!L.enabled||L.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(L.readOnly)return;N.onChange(E)},..._.uiProps}),M,W.invalid?Y(C,{errors:h}):null]});if(_.kind==="switch")return w(z,{...K,children:[Q,Y(J.merged.driver.Switch,{id:L.id,name:L.name,disabled:!L.enabled||L.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(L.readOnly)return;N.onChange(E)},..._.uiProps}),M,W.invalid?Y(C,{errors:h}):null]});return Y(zG,{})}},T)},b=async(_)=>{let Z=U.actions?.[0]?.key??"submit";if(J.merged.onSubmitOverride)return J.merged.onSubmitOverride(_,Z)};return w("form",{onSubmit:$.handleSubmit(b),children:[U.fields.map((_,Z)=>Y(V.Fragment,{children:q(_)},Z)),U.actions?.length?Y("div",{children:U.actions.map((_)=>Y(J.merged.driver.Button,{type:"submit",children:_.labelI18n},_.key))}):null]})}return{render:(J,U)=>Y(X,{spec:J,options:U,merged:{...H,...U?.overrides??{}}})}}export{AG as shadcnDriver,WG as rnReusablesDriver,jG as renderFeaturePresentation,SG as registerFeature,x as mapAutocompleteValue,BG as filterAutocompleteOptions,fG as createFormRenderer,gG as createFeatureModule,FG as createEngineWithDefaults};
@@ -1,66 +1 @@
1
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
- }) : x)(function(x) {
4
- if (typeof require !== "undefined")
5
- return require.apply(this, arguments);
6
- throw Error('Dynamic require of "' + x + '" is not supported');
7
- });
8
-
9
- // src/transform-engine.ts
10
- import {
11
- createDefaultTransformEngine,
12
- htmlToMarkdown,
13
- registerBasicValidation
14
- } from "@contractspec/lib.presentation-runtime-core/transform-engine";
15
- import React from "react";
16
-
17
- export * from "@contractspec/lib.presentation-runtime-core/transform-engine";
18
- function registerDefaultReactRenderer(engine) {
19
- engine.register({
20
- target: "react",
21
- async render(desc) {
22
- if (desc.source.type === "component") {
23
- const props = desc.source.props ? desc.source.props.getZod().safeParse({}).success ? {} : undefined : undefined;
24
- return {
25
- kind: "react_component",
26
- componentKey: desc.source.componentKey,
27
- props
28
- };
29
- }
30
- return {
31
- kind: "blocknotejs",
32
- docJson: desc.source.docJson,
33
- blockConfig: desc.source.blockConfig
34
- };
35
- }
36
- });
37
- return engine;
38
- }
39
- function registerReactToMarkdownRenderer(engine, componentMap) {
40
- engine.prependRegister({
41
- target: "markdown",
42
- async render(desc) {
43
- if (desc.source.type !== "component") {
44
- throw new Error("React-to-markdown renderer only handles component presentations");
45
- }
46
- const Component = componentMap[desc.source.componentKey];
47
- if (!Component) {
48
- throw new Error(`Component ${desc.source.componentKey} not found in componentMap`);
49
- }
50
- const { renderToStaticMarkup } = await import("react-dom/server");
51
- const element = React.createElement(Component, desc.source.props ? {} : undefined);
52
- const markdown = htmlToMarkdown(renderToStaticMarkup(element));
53
- return {
54
- mimeType: "text/markdown",
55
- body: desc.policy?.pii?.length ? markdown.replace(/\[REDACTED\]/g, "[REDACTED]") : markdown
56
- };
57
- }
58
- });
59
- return engine;
60
- }
61
- export {
62
- registerReactToMarkdownRenderer,
63
- registerDefaultReactRenderer,
64
- registerBasicValidation,
65
- createDefaultTransformEngine
66
- };
1
+ var G=((j)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(j,{get:(q,x)=>(typeof require<"u"?require:q)[x]}):j)(function(j){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+j+'" is not supported')});import{createDefaultTransformEngine as L,htmlToMarkdown as H,registerBasicValidation as N}from"@contractspec/lib.presentation-runtime-core/transform-engine";import I from"react";export*from"@contractspec/lib.presentation-runtime-core/transform-engine";function P(j){return j.register({target:"react",async render(q){if(q.source.type==="component"){let x=q.source.props?q.source.props.getZod().safeParse({}).success?{}:void 0:void 0;return{kind:"react_component",componentKey:q.source.componentKey,props:x}}return{kind:"blocknotejs",docJson:q.source.docJson,blockConfig:q.source.blockConfig}}}),j}function Q(j,q){return j.prependRegister({target:"markdown",async render(x){if(x.source.type!=="component")throw Error("React-to-markdown renderer only handles component presentations");let y=q[x.source.componentKey];if(!y)throw Error(`Component ${x.source.componentKey} not found in componentMap`);let{renderToStaticMarkup:A}=await import("react-dom/server"),F=I.createElement(y,x.source.props?{}:void 0),z=H(A(F));return{mimeType:"text/markdown",body:x.policy?.pii?.length?z.replace(/\[REDACTED\]/g,"[REDACTED]"):z}}}),j}export{Q as registerReactToMarkdownRenderer,P as registerDefaultReactRenderer,N as registerBasicValidation,L as createDefaultTransformEngine};
@@ -1,10 +1,2 @@
1
1
  // @bun
2
- var __require = import.meta.require;
3
-
4
- // src/drivers/rn-reusables.ts
5
- function rnReusablesDriver(slots) {
6
- return slots;
7
- }
8
- export {
9
- rnReusablesDriver
10
- };
2
+ var e=import.meta.require;function o(r){return r}export{o as rnReusablesDriver};
@@ -1,10 +1,2 @@
1
1
  // @bun
2
- var __require = import.meta.require;
3
-
4
- // src/drivers/shadcn.ts
5
- function shadcnDriver(slots) {
6
- return slots;
7
- }
8
- export {
9
- shadcnDriver
10
- };
2
+ var e=import.meta.require;function o(r){return r}export{o as shadcnDriver};