@makeswift/runtime 0.22.2-canary.1 → 0.22.3-canary.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.
Files changed (25) hide show
  1. package/dist/cjs/next/api-handler/handlers/manifest.js +1 -1
  2. package/dist/cjs/runtimes/react/controls/control.js +2 -1
  3. package/dist/cjs/runtimes/react/controls/control.js.map +1 -1
  4. package/dist/cjs/runtimes/react/hooks/use-resolved-props.js +10 -21
  5. package/dist/cjs/runtimes/react/hooks/use-resolved-props.js.map +1 -1
  6. package/dist/cjs/runtimes/react/hooks/use-resolved-value.js +7 -2
  7. package/dist/cjs/runtimes/react/hooks/use-resolved-value.js.map +1 -1
  8. package/dist/cjs/runtimes/react/utils/prop-error-handling-proxy.js +41 -0
  9. package/dist/cjs/runtimes/react/utils/prop-error-handling-proxy.js.map +1 -0
  10. package/dist/esm/next/api-handler/handlers/manifest.js +1 -1
  11. package/dist/esm/runtimes/react/controls/control.js +2 -1
  12. package/dist/esm/runtimes/react/controls/control.js.map +1 -1
  13. package/dist/esm/runtimes/react/hooks/use-resolved-props.js +10 -21
  14. package/dist/esm/runtimes/react/hooks/use-resolved-props.js.map +1 -1
  15. package/dist/esm/runtimes/react/hooks/use-resolved-value.js +7 -2
  16. package/dist/esm/runtimes/react/hooks/use-resolved-value.js.map +1 -1
  17. package/dist/esm/runtimes/react/utils/prop-error-handling-proxy.js +17 -0
  18. package/dist/esm/runtimes/react/utils/prop-error-handling-proxy.js.map +1 -0
  19. package/dist/types/runtimes/react/controls/control.d.ts.map +1 -1
  20. package/dist/types/runtimes/react/hooks/use-resolved-props.d.ts.map +1 -1
  21. package/dist/types/runtimes/react/hooks/use-resolved-value.d.ts +1 -1
  22. package/dist/types/runtimes/react/hooks/use-resolved-value.d.ts.map +1 -1
  23. package/dist/types/runtimes/react/utils/prop-error-handling-proxy.d.ts +3 -0
  24. package/dist/types/runtimes/react/utils/prop-error-handling-proxy.d.ts.map +1 -0
  25. package/package.json +3 -3
@@ -36,7 +36,7 @@ async function handler(...args) {
36
36
  const supportsPreviewMode = (0, import_ts_pattern.match)(args).with(routeHandlerPattern, () => false).with(apiRoutePattern, () => true).exhaustive();
37
37
  const supportsDraftMode = (0, import_ts_pattern.match)(args).with(routeHandlerPattern, () => true).with(apiRoutePattern, () => false).exhaustive();
38
38
  const body = {
39
- version: "0.22.2-canary.1",
39
+ version: "0.22.3-canary.0",
40
40
  previewMode: supportsPreviewMode,
41
41
  draftMode: supportsDraftMode,
42
42
  interactionMode: true,
@@ -35,7 +35,8 @@ function ControlValue({
35
35
  const id = `cv-${(0, import_use_css_id.useCssId)()}`;
36
36
  const value = (0, import_use_resolved_value.useResolvedValue)(
37
37
  data,
38
- (data2, resourceResolver) => definition.resolveValue(data2, resourceResolver, stylesheetFactory.get(id), control)
38
+ (data2, resourceResolver) => definition.resolveValue(data2, resourceResolver, stylesheetFactory.get(id), control),
39
+ definition.config?.defaultValue
39
40
  );
40
41
  stylesheetFactory.useDefinedStyles();
41
42
  return children(value);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/runtimes/react/controls/control.tsx"],"sourcesContent":["'use client'\n\nimport {\n ControlDefinition,\n type InstanceType,\n type DataType,\n type ResolvedValueType,\n} from '@makeswift/controls'\n\nimport { useResolvedValue } from '../hooks/use-resolved-value'\nimport { useStylesheetFactory } from '../hooks/use-stylesheet-factory'\nimport { useCssId } from '../hooks/use-css-id'\n\ntype ControlValueProps = {\n definition: ControlDefinition\n data: DataType<ControlDefinition> | undefined\n children(value: ResolvedValueType<ControlDefinition>): JSX.Element\n control?: InstanceType<ControlDefinition>\n}\n\nexport function ControlValue({\n data,\n definition,\n children,\n control,\n}: ControlValueProps): JSX.Element {\n const stylesheetFactory = useStylesheetFactory()\n const id = `cv-${useCssId()}`\n\n const value = useResolvedValue(data, (data, resourceResolver) =>\n definition.resolveValue(data, resourceResolver, stylesheetFactory.get(id), control),\n )\n\n stylesheetFactory.useDefinedStyles()\n\n return children(value)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,gCAAiC;AACjC,oCAAqC;AACrC,wBAAyB;AASlB,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmC;AACjC,QAAM,wBAAoB,oDAAqB;AAC/C,QAAM,KAAK,UAAM,4BAAS,CAAC;AAE3B,QAAM,YAAQ;AAAA,IAAiB;AAAA,IAAM,CAACA,OAAM,qBAC1C,WAAW,aAAaA,OAAM,kBAAkB,kBAAkB,IAAI,EAAE,GAAG,OAAO;AAAA,EACpF;AAEA,oBAAkB,iBAAiB;AAEnC,SAAO,SAAS,KAAK;AACvB;","names":["data"]}
1
+ {"version":3,"sources":["../../../../../src/runtimes/react/controls/control.tsx"],"sourcesContent":["'use client'\n\nimport {\n ControlDefinition,\n type InstanceType,\n type DataType,\n type ResolvedValueType,\n} from '@makeswift/controls'\n\nimport { useResolvedValue } from '../hooks/use-resolved-value'\nimport { useStylesheetFactory } from '../hooks/use-stylesheet-factory'\nimport { useCssId } from '../hooks/use-css-id'\n\ntype ControlValueProps = {\n definition: ControlDefinition\n data: DataType<ControlDefinition> | undefined\n children(value: ResolvedValueType<ControlDefinition>): JSX.Element\n control?: InstanceType<ControlDefinition>\n}\n\nexport function ControlValue({\n data,\n definition,\n children,\n control,\n}: ControlValueProps): JSX.Element {\n const stylesheetFactory = useStylesheetFactory()\n const id = `cv-${useCssId()}`\n\n const value = useResolvedValue(\n data,\n (data, resourceResolver) =>\n definition.resolveValue(data, resourceResolver, stylesheetFactory.get(id), control),\n (definition.config as any)?.defaultValue,\n )\n\n stylesheetFactory.useDefinedStyles()\n\n return children(value)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,gCAAiC;AACjC,oCAAqC;AACrC,wBAAyB;AASlB,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmC;AACjC,QAAM,wBAAoB,oDAAqB;AAC/C,QAAM,KAAK,UAAM,4BAAS,CAAC;AAE3B,QAAM,YAAQ;AAAA,IACZ;AAAA,IACA,CAACA,OAAM,qBACL,WAAW,aAAaA,OAAM,kBAAkB,kBAAkB,IAAI,EAAE,GAAG,OAAO;AAAA,IACnF,WAAW,QAAgB;AAAA,EAC9B;AAEA,oBAAkB,iBAAiB;AAEnC,SAAO,SAAS,KAAK;AACvB;","names":["data"]}
@@ -39,23 +39,7 @@ var import_use_document_key = require("./use-document-key");
39
39
  var import_use_selector = require("./use-selector");
40
40
  var import_use_stylesheet_factory = require("./use-stylesheet-factory");
41
41
  var import_resolvable_record = require("../resolvable-record");
42
- function propErrorHandlingProxy(resolvable, def, propName) {
43
- return {
44
- ...resolvable,
45
- readStable: () => {
46
- try {
47
- return resolvable.readStable();
48
- } catch (err) {
49
- const defaultValue = def.config?.defaultValue;
50
- console.error(
51
- `Error reading value for prop "${propName}", falling back to \`${defaultValue}\`.`,
52
- { control: def, error: err }
53
- );
54
- return defaultValue;
55
- }
56
- }
57
- };
58
- }
42
+ var import_prop_error_handling_proxy = require("../utils/prop-error-handling-proxy");
59
43
  function useControlInstances(elementKey) {
60
44
  const documentKey = (0, import_use_document_key.useDocumentKey)();
61
45
  return (0, import_use_selector.useSelector)((state) => {
@@ -88,10 +72,15 @@ function useResolvedProps(propDefs, elementData, elementKey) {
88
72
  [controls, elementData, resourceResolver, stylesheetFactory]
89
73
  );
90
74
  const resolvables = (0, import_react.useMemo)(
91
- () => (0, import_controls.mapValues)(
92
- propDefs,
93
- (def, propName) => propErrorHandlingProxy(resolveProp(def, propName), def, propName)
94
- ),
75
+ () => (0, import_controls.mapValues)(propDefs, (def, propName) => {
76
+ const defaultValue = def.config?.defaultValue;
77
+ return (0, import_prop_error_handling_proxy.propErrorHandlingProxy)(resolveProp(def, propName), defaultValue, (error) => {
78
+ console.warn(
79
+ `Error reading value for prop "${propName}", falling back to \`${defaultValue}\`.`,
80
+ { control: def, error }
81
+ );
82
+ });
83
+ }),
95
84
  [propDefs, resolveProp]
96
85
  );
97
86
  const props = (0, import_react.useMemo)(() => (0, import_resolvable_record.resolvableRecord)(resolvables), [resolvables]);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/runtimes/react/hooks/use-resolved-props.ts"],"sourcesContent":["import { useMemo, useEffect, useRef, useSyncExternalStore, useCallback } from 'react'\nimport {\n ControlDefinition,\n ControlInstance,\n mapValues,\n type Data,\n type Resolvable,\n} from '@makeswift/controls'\n\nimport * as ReactPage from '../../../state/react-page'\nimport { useResourceResolver } from './use-resource-resolver'\nimport { useDocumentKey } from './use-document-key'\nimport { useSelector } from './use-selector'\n\nimport { useStylesheetFactory } from './use-stylesheet-factory'\n\nimport { resolvableRecord } from '../resolvable-record'\n\nfunction propErrorHandlingProxy(\n resolvable: Resolvable<unknown>,\n def: ControlDefinition,\n propName: string,\n): Resolvable<unknown> {\n return {\n ...resolvable,\n readStable: () => {\n try {\n return resolvable.readStable()\n } catch (err) {\n const defaultValue = (def.config as any)?.defaultValue\n console.error(\n `Error reading value for prop \"${propName}\", falling back to \\`${defaultValue}\\`.`,\n { control: def, error: err },\n )\n return defaultValue\n }\n },\n }\n}\n\nfunction useControlInstances(elementKey: string): Record<string, ControlInstance> | null {\n const documentKey = useDocumentKey()\n\n return useSelector(state => {\n if (documentKey == null) return null\n\n return ReactPage.getPropControllers(state, documentKey, elementKey)\n })\n}\n\ntype CacheItem = {\n data: Data\n control: ControlInstance | undefined\n resolvedValue: Resolvable<unknown>\n}\n\nexport function useResolvedProps(\n propDefs: Record<string, ControlDefinition>,\n elementData: Record<string, Data>,\n elementKey: string,\n): Record<string, unknown> {\n const stylesheetFactory = useStylesheetFactory()\n const resourceResolver = useResourceResolver()\n const controls = useControlInstances(elementKey)\n\n const cache = useRef<Record<string, CacheItem>>({}).current\n const resolveProp = useCallback(\n (def: ControlDefinition, propName: string) => {\n const data = elementData[propName]\n const control = controls?.[propName]\n\n if (\n cache[propName] != null &&\n data === cache[propName].data &&\n control === cache[propName].control\n ) {\n return cache[propName].resolvedValue\n }\n\n const resolvedValue = def.resolveValue(\n data,\n resourceResolver,\n stylesheetFactory.get(propName),\n control,\n )\n\n cache[propName] = { data, control, resolvedValue }\n return resolvedValue\n },\n [controls, elementData, resourceResolver, stylesheetFactory],\n )\n\n const resolvables = useMemo(\n () =>\n mapValues(propDefs, (def, propName) =>\n propErrorHandlingProxy(resolveProp(def, propName), def, propName),\n ),\n [propDefs, resolveProp],\n )\n\n const props = useMemo(() => resolvableRecord(resolvables), [resolvables])\n\n stylesheetFactory.useDefinedStyles()\n\n useEffect(() => {\n props.triggerResolve()\n }, [])\n\n return useSyncExternalStore(props.subscribe, props.readStable, props.readStable)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA8E;AAC9E,sBAMO;AAEP,gBAA2B;AAC3B,mCAAoC;AACpC,8BAA+B;AAC/B,0BAA4B;AAE5B,oCAAqC;AAErC,+BAAiC;AAEjC,SAAS,uBACP,YACA,KACA,UACqB;AACrB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY,MAAM;AAChB,UAAI;AACF,eAAO,WAAW,WAAW;AAAA,MAC/B,SAAS,KAAK;AACZ,cAAM,eAAgB,IAAI,QAAgB;AAC1C,gBAAQ;AAAA,UACN,iCAAiC,QAAQ,wBAAwB,YAAY;AAAA,UAC7E,EAAE,SAAS,KAAK,OAAO,IAAI;AAAA,QAC7B;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,YAA4D;AACvF,QAAM,kBAAc,wCAAe;AAEnC,aAAO,iCAAY,WAAS;AAC1B,QAAI,eAAe;AAAM,aAAO;AAEhC,WAAO,UAAU,mBAAmB,OAAO,aAAa,UAAU;AAAA,EACpE,CAAC;AACH;AAQO,SAAS,iBACd,UACA,aACA,YACyB;AACzB,QAAM,wBAAoB,oDAAqB;AAC/C,QAAM,uBAAmB,kDAAoB;AAC7C,QAAM,WAAW,oBAAoB,UAAU;AAE/C,QAAM,YAAQ,qBAAkC,CAAC,CAAC,EAAE;AACpD,QAAM,kBAAc;AAAA,IAClB,CAAC,KAAwB,aAAqB;AAC5C,YAAM,OAAO,YAAY,QAAQ;AACjC,YAAM,UAAU,WAAW,QAAQ;AAEnC,UACE,MAAM,QAAQ,KAAK,QACnB,SAAS,MAAM,QAAQ,EAAE,QACzB,YAAY,MAAM,QAAQ,EAAE,SAC5B;AACA,eAAO,MAAM,QAAQ,EAAE;AAAA,MACzB;AAEA,YAAM,gBAAgB,IAAI;AAAA,QACxB;AAAA,QACA;AAAA,QACA,kBAAkB,IAAI,QAAQ;AAAA,QAC9B;AAAA,MACF;AAEA,YAAM,QAAQ,IAAI,EAAE,MAAM,SAAS,cAAc;AACjD,aAAO;AAAA,IACT;AAAA,IACA,CAAC,UAAU,aAAa,kBAAkB,iBAAiB;AAAA,EAC7D;AAEA,QAAM,kBAAc;AAAA,IAClB,UACE;AAAA,MAAU;AAAA,MAAU,CAAC,KAAK,aACxB,uBAAuB,YAAY,KAAK,QAAQ,GAAG,KAAK,QAAQ;AAAA,IAClE;AAAA,IACF,CAAC,UAAU,WAAW;AAAA,EACxB;AAEA,QAAM,YAAQ,sBAAQ,UAAM,2CAAiB,WAAW,GAAG,CAAC,WAAW,CAAC;AAExE,oBAAkB,iBAAiB;AAEnC,8BAAU,MAAM;AACd,UAAM,eAAe;AAAA,EACvB,GAAG,CAAC,CAAC;AAEL,aAAO,mCAAqB,MAAM,WAAW,MAAM,YAAY,MAAM,UAAU;AACjF;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/runtimes/react/hooks/use-resolved-props.ts"],"sourcesContent":["import { useMemo, useEffect, useRef, useSyncExternalStore, useCallback } from 'react'\nimport {\n ControlDefinition,\n ControlInstance,\n mapValues,\n type Data,\n type Resolvable,\n} from '@makeswift/controls'\n\nimport * as ReactPage from '../../../state/react-page'\nimport { useResourceResolver } from './use-resource-resolver'\nimport { useDocumentKey } from './use-document-key'\nimport { useSelector } from './use-selector'\n\nimport { useStylesheetFactory } from './use-stylesheet-factory'\n\nimport { resolvableRecord } from '../resolvable-record'\nimport { propErrorHandlingProxy } from '../utils/prop-error-handling-proxy'\n\nfunction useControlInstances(elementKey: string): Record<string, ControlInstance> | null {\n const documentKey = useDocumentKey()\n\n return useSelector(state => {\n if (documentKey == null) return null\n\n return ReactPage.getPropControllers(state, documentKey, elementKey)\n })\n}\n\ntype CacheItem = {\n data: Data\n control: ControlInstance | undefined\n resolvedValue: Resolvable<unknown>\n}\n\nexport function useResolvedProps(\n propDefs: Record<string, ControlDefinition>,\n elementData: Record<string, Data>,\n elementKey: string,\n): Record<string, unknown> {\n const stylesheetFactory = useStylesheetFactory()\n const resourceResolver = useResourceResolver()\n const controls = useControlInstances(elementKey)\n\n const cache = useRef<Record<string, CacheItem>>({}).current\n const resolveProp = useCallback(\n (def: ControlDefinition, propName: string) => {\n const data = elementData[propName]\n const control = controls?.[propName]\n\n if (\n cache[propName] != null &&\n data === cache[propName].data &&\n control === cache[propName].control\n ) {\n return cache[propName].resolvedValue\n }\n\n const resolvedValue = def.resolveValue(\n data,\n resourceResolver,\n stylesheetFactory.get(propName),\n control,\n )\n\n cache[propName] = { data, control, resolvedValue }\n return resolvedValue\n },\n [controls, elementData, resourceResolver, stylesheetFactory],\n )\n\n const resolvables = useMemo(\n () =>\n mapValues(propDefs, (def, propName) => {\n const defaultValue = (def.config as any)?.defaultValue\n return propErrorHandlingProxy(resolveProp(def, propName), defaultValue, error => {\n console.warn(\n `Error reading value for prop \"${propName}\", falling back to \\`${defaultValue}\\`.`,\n { control: def, error },\n )\n })\n }),\n [propDefs, resolveProp],\n )\n\n const props = useMemo(() => resolvableRecord(resolvables), [resolvables])\n\n stylesheetFactory.useDefinedStyles()\n\n useEffect(() => {\n props.triggerResolve()\n }, [])\n\n return useSyncExternalStore(props.subscribe, props.readStable, props.readStable)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA8E;AAC9E,sBAMO;AAEP,gBAA2B;AAC3B,mCAAoC;AACpC,8BAA+B;AAC/B,0BAA4B;AAE5B,oCAAqC;AAErC,+BAAiC;AACjC,uCAAuC;AAEvC,SAAS,oBAAoB,YAA4D;AACvF,QAAM,kBAAc,wCAAe;AAEnC,aAAO,iCAAY,WAAS;AAC1B,QAAI,eAAe;AAAM,aAAO;AAEhC,WAAO,UAAU,mBAAmB,OAAO,aAAa,UAAU;AAAA,EACpE,CAAC;AACH;AAQO,SAAS,iBACd,UACA,aACA,YACyB;AACzB,QAAM,wBAAoB,oDAAqB;AAC/C,QAAM,uBAAmB,kDAAoB;AAC7C,QAAM,WAAW,oBAAoB,UAAU;AAE/C,QAAM,YAAQ,qBAAkC,CAAC,CAAC,EAAE;AACpD,QAAM,kBAAc;AAAA,IAClB,CAAC,KAAwB,aAAqB;AAC5C,YAAM,OAAO,YAAY,QAAQ;AACjC,YAAM,UAAU,WAAW,QAAQ;AAEnC,UACE,MAAM,QAAQ,KAAK,QACnB,SAAS,MAAM,QAAQ,EAAE,QACzB,YAAY,MAAM,QAAQ,EAAE,SAC5B;AACA,eAAO,MAAM,QAAQ,EAAE;AAAA,MACzB;AAEA,YAAM,gBAAgB,IAAI;AAAA,QACxB;AAAA,QACA;AAAA,QACA,kBAAkB,IAAI,QAAQ;AAAA,QAC9B;AAAA,MACF;AAEA,YAAM,QAAQ,IAAI,EAAE,MAAM,SAAS,cAAc;AACjD,aAAO;AAAA,IACT;AAAA,IACA,CAAC,UAAU,aAAa,kBAAkB,iBAAiB;AAAA,EAC7D;AAEA,QAAM,kBAAc;AAAA,IAClB,UACE,2BAAU,UAAU,CAAC,KAAK,aAAa;AACrC,YAAM,eAAgB,IAAI,QAAgB;AAC1C,iBAAO,yDAAuB,YAAY,KAAK,QAAQ,GAAG,cAAc,WAAS;AAC/E,gBAAQ;AAAA,UACN,iCAAiC,QAAQ,wBAAwB,YAAY;AAAA,UAC7E,EAAE,SAAS,KAAK,MAAM;AAAA,QACxB;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,IACH,CAAC,UAAU,WAAW;AAAA,EACxB;AAEA,QAAM,YAAQ,sBAAQ,UAAM,2CAAiB,WAAW,GAAG,CAAC,WAAW,CAAC;AAExE,oBAAkB,iBAAiB;AAEnC,8BAAU,MAAM;AACd,UAAM,eAAe;AAAA,EACvB,GAAG,CAAC,CAAC;AAEL,aAAO,mCAAqB,MAAM,WAAW,MAAM,YAAY,MAAM,UAAU;AACjF;","names":[]}
@@ -23,9 +23,14 @@ __export(use_resolved_value_exports, {
23
23
  module.exports = __toCommonJS(use_resolved_value_exports);
24
24
  var import_react = require("react");
25
25
  var import_use_resource_resolver = require("./use-resource-resolver");
26
- function useResolvedValue(data, resolver) {
26
+ var import_prop_error_handling_proxy = require("../utils/prop-error-handling-proxy");
27
+ function useResolvedValue(data, resolver, defaultValue) {
27
28
  const resourceResolver = (0, import_use_resource_resolver.useResourceResolver)();
28
- const resolvable = (0, import_react.useMemo)(() => resolver(data, resourceResolver), [data, resourceResolver]);
29
+ const resolvable = (0, import_react.useMemo)(() => {
30
+ return (0, import_prop_error_handling_proxy.propErrorHandlingProxy)(resolver(data, resourceResolver), defaultValue, (error) => {
31
+ console.warn(`Error resolving data, falling back to \`${defaultValue}\`.`, { error, data });
32
+ });
33
+ }, [data, resourceResolver, defaultValue]);
29
34
  (0, import_react.useEffect)(() => {
30
35
  resolvable.triggerResolve();
31
36
  }, []);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/runtimes/react/hooks/use-resolved-value.ts"],"sourcesContent":["import { useMemo, useEffect, useSyncExternalStore } from 'react'\nimport { Resolvable, ResourceResolver } from '@makeswift/controls'\n\nimport { useResourceResolver } from './use-resource-resolver'\n\nexport function useResolvedValue<D, T>(\n data: D,\n resolver: (data: D, resourceResolver: ResourceResolver) => Resolvable<T>,\n): T {\n const resourceResolver = useResourceResolver()\n const resolvable = useMemo(() => resolver(data, resourceResolver), [data, resourceResolver])\n\n useEffect(() => {\n resolvable.triggerResolve()\n }, [])\n\n return useSyncExternalStore(resolvable.subscribe, resolvable.readStable, resolvable.readStable)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAyD;AAGzD,mCAAoC;AAE7B,SAAS,iBACd,MACA,UACG;AACH,QAAM,uBAAmB,kDAAoB;AAC7C,QAAM,iBAAa,sBAAQ,MAAM,SAAS,MAAM,gBAAgB,GAAG,CAAC,MAAM,gBAAgB,CAAC;AAE3F,8BAAU,MAAM;AACd,eAAW,eAAe;AAAA,EAC5B,GAAG,CAAC,CAAC;AAEL,aAAO,mCAAqB,WAAW,WAAW,WAAW,YAAY,WAAW,UAAU;AAChG;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/runtimes/react/hooks/use-resolved-value.ts"],"sourcesContent":["import { useMemo, useEffect, useSyncExternalStore } from 'react'\nimport { Resolvable, ResourceResolver } from '@makeswift/controls'\n\nimport { useResourceResolver } from './use-resource-resolver'\nimport { propErrorHandlingProxy } from '../utils/prop-error-handling-proxy'\n\nexport function useResolvedValue<D, T>(\n data: D,\n resolver: (data: D, resourceResolver: ResourceResolver) => Resolvable<T>,\n defaultValue?: T,\n): T | undefined {\n const resourceResolver = useResourceResolver()\n const resolvable = useMemo(() => {\n return propErrorHandlingProxy(resolver(data, resourceResolver), defaultValue, error => {\n console.warn(`Error resolving data, falling back to \\`${defaultValue}\\`.`, { error, data })\n })\n }, [data, resourceResolver, defaultValue])\n\n useEffect(() => {\n resolvable.triggerResolve()\n }, [])\n\n return useSyncExternalStore(resolvable.subscribe, resolvable.readStable, resolvable.readStable)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAyD;AAGzD,mCAAoC;AACpC,uCAAuC;AAEhC,SAAS,iBACd,MACA,UACA,cACe;AACf,QAAM,uBAAmB,kDAAoB;AAC7C,QAAM,iBAAa,sBAAQ,MAAM;AAC/B,eAAO,yDAAuB,SAAS,MAAM,gBAAgB,GAAG,cAAc,WAAS;AACrF,cAAQ,KAAK,2CAA2C,YAAY,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,IAC5F,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,kBAAkB,YAAY,CAAC;AAEzC,8BAAU,MAAM;AACd,eAAW,eAAe;AAAA,EAC5B,GAAG,CAAC,CAAC;AAEL,aAAO,mCAAqB,WAAW,WAAW,WAAW,YAAY,WAAW,UAAU;AAChG;","names":[]}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var prop_error_handling_proxy_exports = {};
20
+ __export(prop_error_handling_proxy_exports, {
21
+ propErrorHandlingProxy: () => propErrorHandlingProxy
22
+ });
23
+ module.exports = __toCommonJS(prop_error_handling_proxy_exports);
24
+ function propErrorHandlingProxy(resolvable, fallback, onError) {
25
+ return {
26
+ ...resolvable,
27
+ readStable: () => {
28
+ try {
29
+ return resolvable.readStable();
30
+ } catch (err) {
31
+ onError?.(err);
32
+ return fallback;
33
+ }
34
+ }
35
+ };
36
+ }
37
+ // Annotate the CommonJS export names for ESM import in node:
38
+ 0 && (module.exports = {
39
+ propErrorHandlingProxy
40
+ });
41
+ //# sourceMappingURL=prop-error-handling-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/runtimes/react/utils/prop-error-handling-proxy.ts"],"sourcesContent":["import { type Resolvable } from '@makeswift/controls'\n\nexport function propErrorHandlingProxy<T>(\n resolvable: Resolvable<T>,\n fallback: T,\n onError?: (error: unknown) => void,\n): Resolvable<T> {\n return {\n ...resolvable,\n readStable: () => {\n try {\n return resolvable.readStable()\n } catch (err: unknown) {\n onError?.(err)\n return fallback\n }\n },\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,SAAS,uBACd,YACA,UACA,SACe;AACf,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY,MAAM;AAChB,UAAI;AACF,eAAO,WAAW,WAAW;AAAA,MAC/B,SAAS,KAAc;AACrB,kBAAU,GAAG;AACb,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -13,7 +13,7 @@ async function handler(...args) {
13
13
  const supportsPreviewMode = match(args).with(routeHandlerPattern, () => false).with(apiRoutePattern, () => true).exhaustive();
14
14
  const supportsDraftMode = match(args).with(routeHandlerPattern, () => true).with(apiRoutePattern, () => false).exhaustive();
15
15
  const body = {
16
- version: "0.22.2-canary.1",
16
+ version: "0.22.3-canary.0",
17
17
  previewMode: supportsPreviewMode,
18
18
  draftMode: supportsDraftMode,
19
19
  interactionMode: true,
@@ -12,7 +12,8 @@ function ControlValue({
12
12
  const id = `cv-${useCssId()}`;
13
13
  const value = useResolvedValue(
14
14
  data,
15
- (data2, resourceResolver) => definition.resolveValue(data2, resourceResolver, stylesheetFactory.get(id), control)
15
+ (data2, resourceResolver) => definition.resolveValue(data2, resourceResolver, stylesheetFactory.get(id), control),
16
+ definition.config?.defaultValue
16
17
  );
17
18
  stylesheetFactory.useDefinedStyles();
18
19
  return children(value);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/runtimes/react/controls/control.tsx"],"sourcesContent":["'use client'\n\nimport {\n ControlDefinition,\n type InstanceType,\n type DataType,\n type ResolvedValueType,\n} from '@makeswift/controls'\n\nimport { useResolvedValue } from '../hooks/use-resolved-value'\nimport { useStylesheetFactory } from '../hooks/use-stylesheet-factory'\nimport { useCssId } from '../hooks/use-css-id'\n\ntype ControlValueProps = {\n definition: ControlDefinition\n data: DataType<ControlDefinition> | undefined\n children(value: ResolvedValueType<ControlDefinition>): JSX.Element\n control?: InstanceType<ControlDefinition>\n}\n\nexport function ControlValue({\n data,\n definition,\n children,\n control,\n}: ControlValueProps): JSX.Element {\n const stylesheetFactory = useStylesheetFactory()\n const id = `cv-${useCssId()}`\n\n const value = useResolvedValue(data, (data, resourceResolver) =>\n definition.resolveValue(data, resourceResolver, stylesheetFactory.get(id), control),\n )\n\n stylesheetFactory.useDefinedStyles()\n\n return children(value)\n}\n"],"mappings":";AASA,SAAS,wBAAwB;AACjC,SAAS,4BAA4B;AACrC,SAAS,gBAAgB;AASlB,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmC;AACjC,QAAM,oBAAoB,qBAAqB;AAC/C,QAAM,KAAK,MAAM,SAAS,CAAC;AAE3B,QAAM,QAAQ;AAAA,IAAiB;AAAA,IAAM,CAACA,OAAM,qBAC1C,WAAW,aAAaA,OAAM,kBAAkB,kBAAkB,IAAI,EAAE,GAAG,OAAO;AAAA,EACpF;AAEA,oBAAkB,iBAAiB;AAEnC,SAAO,SAAS,KAAK;AACvB;","names":["data"]}
1
+ {"version":3,"sources":["../../../../../src/runtimes/react/controls/control.tsx"],"sourcesContent":["'use client'\n\nimport {\n ControlDefinition,\n type InstanceType,\n type DataType,\n type ResolvedValueType,\n} from '@makeswift/controls'\n\nimport { useResolvedValue } from '../hooks/use-resolved-value'\nimport { useStylesheetFactory } from '../hooks/use-stylesheet-factory'\nimport { useCssId } from '../hooks/use-css-id'\n\ntype ControlValueProps = {\n definition: ControlDefinition\n data: DataType<ControlDefinition> | undefined\n children(value: ResolvedValueType<ControlDefinition>): JSX.Element\n control?: InstanceType<ControlDefinition>\n}\n\nexport function ControlValue({\n data,\n definition,\n children,\n control,\n}: ControlValueProps): JSX.Element {\n const stylesheetFactory = useStylesheetFactory()\n const id = `cv-${useCssId()}`\n\n const value = useResolvedValue(\n data,\n (data, resourceResolver) =>\n definition.resolveValue(data, resourceResolver, stylesheetFactory.get(id), control),\n (definition.config as any)?.defaultValue,\n )\n\n stylesheetFactory.useDefinedStyles()\n\n return children(value)\n}\n"],"mappings":";AASA,SAAS,wBAAwB;AACjC,SAAS,4BAA4B;AACrC,SAAS,gBAAgB;AASlB,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmC;AACjC,QAAM,oBAAoB,qBAAqB;AAC/C,QAAM,KAAK,MAAM,SAAS,CAAC;AAE3B,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,CAACA,OAAM,qBACL,WAAW,aAAaA,OAAM,kBAAkB,kBAAkB,IAAI,EAAE,GAAG,OAAO;AAAA,IACnF,WAAW,QAAgB;AAAA,EAC9B;AAEA,oBAAkB,iBAAiB;AAEnC,SAAO,SAAS,KAAK;AACvB;","names":["data"]}
@@ -8,23 +8,7 @@ import { useDocumentKey } from "./use-document-key";
8
8
  import { useSelector } from "./use-selector";
9
9
  import { useStylesheetFactory } from "./use-stylesheet-factory";
10
10
  import { resolvableRecord } from "../resolvable-record";
11
- function propErrorHandlingProxy(resolvable, def, propName) {
12
- return {
13
- ...resolvable,
14
- readStable: () => {
15
- try {
16
- return resolvable.readStable();
17
- } catch (err) {
18
- const defaultValue = def.config?.defaultValue;
19
- console.error(
20
- `Error reading value for prop "${propName}", falling back to \`${defaultValue}\`.`,
21
- { control: def, error: err }
22
- );
23
- return defaultValue;
24
- }
25
- }
26
- };
27
- }
11
+ import { propErrorHandlingProxy } from "../utils/prop-error-handling-proxy";
28
12
  function useControlInstances(elementKey) {
29
13
  const documentKey = useDocumentKey();
30
14
  return useSelector((state) => {
@@ -57,10 +41,15 @@ function useResolvedProps(propDefs, elementData, elementKey) {
57
41
  [controls, elementData, resourceResolver, stylesheetFactory]
58
42
  );
59
43
  const resolvables = useMemo(
60
- () => mapValues(
61
- propDefs,
62
- (def, propName) => propErrorHandlingProxy(resolveProp(def, propName), def, propName)
63
- ),
44
+ () => mapValues(propDefs, (def, propName) => {
45
+ const defaultValue = def.config?.defaultValue;
46
+ return propErrorHandlingProxy(resolveProp(def, propName), defaultValue, (error) => {
47
+ console.warn(
48
+ `Error reading value for prop "${propName}", falling back to \`${defaultValue}\`.`,
49
+ { control: def, error }
50
+ );
51
+ });
52
+ }),
64
53
  [propDefs, resolveProp]
65
54
  );
66
55
  const props = useMemo(() => resolvableRecord(resolvables), [resolvables]);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/runtimes/react/hooks/use-resolved-props.ts"],"sourcesContent":["import { useMemo, useEffect, useRef, useSyncExternalStore, useCallback } from 'react'\nimport {\n ControlDefinition,\n ControlInstance,\n mapValues,\n type Data,\n type Resolvable,\n} from '@makeswift/controls'\n\nimport * as ReactPage from '../../../state/react-page'\nimport { useResourceResolver } from './use-resource-resolver'\nimport { useDocumentKey } from './use-document-key'\nimport { useSelector } from './use-selector'\n\nimport { useStylesheetFactory } from './use-stylesheet-factory'\n\nimport { resolvableRecord } from '../resolvable-record'\n\nfunction propErrorHandlingProxy(\n resolvable: Resolvable<unknown>,\n def: ControlDefinition,\n propName: string,\n): Resolvable<unknown> {\n return {\n ...resolvable,\n readStable: () => {\n try {\n return resolvable.readStable()\n } catch (err) {\n const defaultValue = (def.config as any)?.defaultValue\n console.error(\n `Error reading value for prop \"${propName}\", falling back to \\`${defaultValue}\\`.`,\n { control: def, error: err },\n )\n return defaultValue\n }\n },\n }\n}\n\nfunction useControlInstances(elementKey: string): Record<string, ControlInstance> | null {\n const documentKey = useDocumentKey()\n\n return useSelector(state => {\n if (documentKey == null) return null\n\n return ReactPage.getPropControllers(state, documentKey, elementKey)\n })\n}\n\ntype CacheItem = {\n data: Data\n control: ControlInstance | undefined\n resolvedValue: Resolvable<unknown>\n}\n\nexport function useResolvedProps(\n propDefs: Record<string, ControlDefinition>,\n elementData: Record<string, Data>,\n elementKey: string,\n): Record<string, unknown> {\n const stylesheetFactory = useStylesheetFactory()\n const resourceResolver = useResourceResolver()\n const controls = useControlInstances(elementKey)\n\n const cache = useRef<Record<string, CacheItem>>({}).current\n const resolveProp = useCallback(\n (def: ControlDefinition, propName: string) => {\n const data = elementData[propName]\n const control = controls?.[propName]\n\n if (\n cache[propName] != null &&\n data === cache[propName].data &&\n control === cache[propName].control\n ) {\n return cache[propName].resolvedValue\n }\n\n const resolvedValue = def.resolveValue(\n data,\n resourceResolver,\n stylesheetFactory.get(propName),\n control,\n )\n\n cache[propName] = { data, control, resolvedValue }\n return resolvedValue\n },\n [controls, elementData, resourceResolver, stylesheetFactory],\n )\n\n const resolvables = useMemo(\n () =>\n mapValues(propDefs, (def, propName) =>\n propErrorHandlingProxy(resolveProp(def, propName), def, propName),\n ),\n [propDefs, resolveProp],\n )\n\n const props = useMemo(() => resolvableRecord(resolvables), [resolvables])\n\n stylesheetFactory.useDefinedStyles()\n\n useEffect(() => {\n props.triggerResolve()\n }, [])\n\n return useSyncExternalStore(props.subscribe, props.readStable, props.readStable)\n}\n"],"mappings":"AAAA,SAAS,SAAS,WAAW,QAAQ,sBAAsB,mBAAmB;AAC9E;AAAA,EAGE;AAAA,OAGK;AAEP,YAAY,eAAe;AAC3B,SAAS,2BAA2B;AACpC,SAAS,sBAAsB;AAC/B,SAAS,mBAAmB;AAE5B,SAAS,4BAA4B;AAErC,SAAS,wBAAwB;AAEjC,SAAS,uBACP,YACA,KACA,UACqB;AACrB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY,MAAM;AAChB,UAAI;AACF,eAAO,WAAW,WAAW;AAAA,MAC/B,SAAS,KAAK;AACZ,cAAM,eAAgB,IAAI,QAAgB;AAC1C,gBAAQ;AAAA,UACN,iCAAiC,QAAQ,wBAAwB,YAAY;AAAA,UAC7E,EAAE,SAAS,KAAK,OAAO,IAAI;AAAA,QAC7B;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,YAA4D;AACvF,QAAM,cAAc,eAAe;AAEnC,SAAO,YAAY,WAAS;AAC1B,QAAI,eAAe;AAAM,aAAO;AAEhC,WAAO,UAAU,mBAAmB,OAAO,aAAa,UAAU;AAAA,EACpE,CAAC;AACH;AAQO,SAAS,iBACd,UACA,aACA,YACyB;AACzB,QAAM,oBAAoB,qBAAqB;AAC/C,QAAM,mBAAmB,oBAAoB;AAC7C,QAAM,WAAW,oBAAoB,UAAU;AAE/C,QAAM,QAAQ,OAAkC,CAAC,CAAC,EAAE;AACpD,QAAM,cAAc;AAAA,IAClB,CAAC,KAAwB,aAAqB;AAC5C,YAAM,OAAO,YAAY,QAAQ;AACjC,YAAM,UAAU,WAAW,QAAQ;AAEnC,UACE,MAAM,QAAQ,KAAK,QACnB,SAAS,MAAM,QAAQ,EAAE,QACzB,YAAY,MAAM,QAAQ,EAAE,SAC5B;AACA,eAAO,MAAM,QAAQ,EAAE;AAAA,MACzB;AAEA,YAAM,gBAAgB,IAAI;AAAA,QACxB;AAAA,QACA;AAAA,QACA,kBAAkB,IAAI,QAAQ;AAAA,QAC9B;AAAA,MACF;AAEA,YAAM,QAAQ,IAAI,EAAE,MAAM,SAAS,cAAc;AACjD,aAAO;AAAA,IACT;AAAA,IACA,CAAC,UAAU,aAAa,kBAAkB,iBAAiB;AAAA,EAC7D;AAEA,QAAM,cAAc;AAAA,IAClB,MACE;AAAA,MAAU;AAAA,MAAU,CAAC,KAAK,aACxB,uBAAuB,YAAY,KAAK,QAAQ,GAAG,KAAK,QAAQ;AAAA,IAClE;AAAA,IACF,CAAC,UAAU,WAAW;AAAA,EACxB;AAEA,QAAM,QAAQ,QAAQ,MAAM,iBAAiB,WAAW,GAAG,CAAC,WAAW,CAAC;AAExE,oBAAkB,iBAAiB;AAEnC,YAAU,MAAM;AACd,UAAM,eAAe;AAAA,EACvB,GAAG,CAAC,CAAC;AAEL,SAAO,qBAAqB,MAAM,WAAW,MAAM,YAAY,MAAM,UAAU;AACjF;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/runtimes/react/hooks/use-resolved-props.ts"],"sourcesContent":["import { useMemo, useEffect, useRef, useSyncExternalStore, useCallback } from 'react'\nimport {\n ControlDefinition,\n ControlInstance,\n mapValues,\n type Data,\n type Resolvable,\n} from '@makeswift/controls'\n\nimport * as ReactPage from '../../../state/react-page'\nimport { useResourceResolver } from './use-resource-resolver'\nimport { useDocumentKey } from './use-document-key'\nimport { useSelector } from './use-selector'\n\nimport { useStylesheetFactory } from './use-stylesheet-factory'\n\nimport { resolvableRecord } from '../resolvable-record'\nimport { propErrorHandlingProxy } from '../utils/prop-error-handling-proxy'\n\nfunction useControlInstances(elementKey: string): Record<string, ControlInstance> | null {\n const documentKey = useDocumentKey()\n\n return useSelector(state => {\n if (documentKey == null) return null\n\n return ReactPage.getPropControllers(state, documentKey, elementKey)\n })\n}\n\ntype CacheItem = {\n data: Data\n control: ControlInstance | undefined\n resolvedValue: Resolvable<unknown>\n}\n\nexport function useResolvedProps(\n propDefs: Record<string, ControlDefinition>,\n elementData: Record<string, Data>,\n elementKey: string,\n): Record<string, unknown> {\n const stylesheetFactory = useStylesheetFactory()\n const resourceResolver = useResourceResolver()\n const controls = useControlInstances(elementKey)\n\n const cache = useRef<Record<string, CacheItem>>({}).current\n const resolveProp = useCallback(\n (def: ControlDefinition, propName: string) => {\n const data = elementData[propName]\n const control = controls?.[propName]\n\n if (\n cache[propName] != null &&\n data === cache[propName].data &&\n control === cache[propName].control\n ) {\n return cache[propName].resolvedValue\n }\n\n const resolvedValue = def.resolveValue(\n data,\n resourceResolver,\n stylesheetFactory.get(propName),\n control,\n )\n\n cache[propName] = { data, control, resolvedValue }\n return resolvedValue\n },\n [controls, elementData, resourceResolver, stylesheetFactory],\n )\n\n const resolvables = useMemo(\n () =>\n mapValues(propDefs, (def, propName) => {\n const defaultValue = (def.config as any)?.defaultValue\n return propErrorHandlingProxy(resolveProp(def, propName), defaultValue, error => {\n console.warn(\n `Error reading value for prop \"${propName}\", falling back to \\`${defaultValue}\\`.`,\n { control: def, error },\n )\n })\n }),\n [propDefs, resolveProp],\n )\n\n const props = useMemo(() => resolvableRecord(resolvables), [resolvables])\n\n stylesheetFactory.useDefinedStyles()\n\n useEffect(() => {\n props.triggerResolve()\n }, [])\n\n return useSyncExternalStore(props.subscribe, props.readStable, props.readStable)\n}\n"],"mappings":"AAAA,SAAS,SAAS,WAAW,QAAQ,sBAAsB,mBAAmB;AAC9E;AAAA,EAGE;AAAA,OAGK;AAEP,YAAY,eAAe;AAC3B,SAAS,2BAA2B;AACpC,SAAS,sBAAsB;AAC/B,SAAS,mBAAmB;AAE5B,SAAS,4BAA4B;AAErC,SAAS,wBAAwB;AACjC,SAAS,8BAA8B;AAEvC,SAAS,oBAAoB,YAA4D;AACvF,QAAM,cAAc,eAAe;AAEnC,SAAO,YAAY,WAAS;AAC1B,QAAI,eAAe;AAAM,aAAO;AAEhC,WAAO,UAAU,mBAAmB,OAAO,aAAa,UAAU;AAAA,EACpE,CAAC;AACH;AAQO,SAAS,iBACd,UACA,aACA,YACyB;AACzB,QAAM,oBAAoB,qBAAqB;AAC/C,QAAM,mBAAmB,oBAAoB;AAC7C,QAAM,WAAW,oBAAoB,UAAU;AAE/C,QAAM,QAAQ,OAAkC,CAAC,CAAC,EAAE;AACpD,QAAM,cAAc;AAAA,IAClB,CAAC,KAAwB,aAAqB;AAC5C,YAAM,OAAO,YAAY,QAAQ;AACjC,YAAM,UAAU,WAAW,QAAQ;AAEnC,UACE,MAAM,QAAQ,KAAK,QACnB,SAAS,MAAM,QAAQ,EAAE,QACzB,YAAY,MAAM,QAAQ,EAAE,SAC5B;AACA,eAAO,MAAM,QAAQ,EAAE;AAAA,MACzB;AAEA,YAAM,gBAAgB,IAAI;AAAA,QACxB;AAAA,QACA;AAAA,QACA,kBAAkB,IAAI,QAAQ;AAAA,QAC9B;AAAA,MACF;AAEA,YAAM,QAAQ,IAAI,EAAE,MAAM,SAAS,cAAc;AACjD,aAAO;AAAA,IACT;AAAA,IACA,CAAC,UAAU,aAAa,kBAAkB,iBAAiB;AAAA,EAC7D;AAEA,QAAM,cAAc;AAAA,IAClB,MACE,UAAU,UAAU,CAAC,KAAK,aAAa;AACrC,YAAM,eAAgB,IAAI,QAAgB;AAC1C,aAAO,uBAAuB,YAAY,KAAK,QAAQ,GAAG,cAAc,WAAS;AAC/E,gBAAQ;AAAA,UACN,iCAAiC,QAAQ,wBAAwB,YAAY;AAAA,UAC7E,EAAE,SAAS,KAAK,MAAM;AAAA,QACxB;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,IACH,CAAC,UAAU,WAAW;AAAA,EACxB;AAEA,QAAM,QAAQ,QAAQ,MAAM,iBAAiB,WAAW,GAAG,CAAC,WAAW,CAAC;AAExE,oBAAkB,iBAAiB;AAEnC,YAAU,MAAM;AACd,UAAM,eAAe;AAAA,EACvB,GAAG,CAAC,CAAC;AAEL,SAAO,qBAAqB,MAAM,WAAW,MAAM,YAAY,MAAM,UAAU;AACjF;","names":[]}
@@ -1,8 +1,13 @@
1
1
  import { useMemo, useEffect, useSyncExternalStore } from "react";
2
2
  import { useResourceResolver } from "./use-resource-resolver";
3
- function useResolvedValue(data, resolver) {
3
+ import { propErrorHandlingProxy } from "../utils/prop-error-handling-proxy";
4
+ function useResolvedValue(data, resolver, defaultValue) {
4
5
  const resourceResolver = useResourceResolver();
5
- const resolvable = useMemo(() => resolver(data, resourceResolver), [data, resourceResolver]);
6
+ const resolvable = useMemo(() => {
7
+ return propErrorHandlingProxy(resolver(data, resourceResolver), defaultValue, (error) => {
8
+ console.warn(`Error resolving data, falling back to \`${defaultValue}\`.`, { error, data });
9
+ });
10
+ }, [data, resourceResolver, defaultValue]);
6
11
  useEffect(() => {
7
12
  resolvable.triggerResolve();
8
13
  }, []);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/runtimes/react/hooks/use-resolved-value.ts"],"sourcesContent":["import { useMemo, useEffect, useSyncExternalStore } from 'react'\nimport { Resolvable, ResourceResolver } from '@makeswift/controls'\n\nimport { useResourceResolver } from './use-resource-resolver'\n\nexport function useResolvedValue<D, T>(\n data: D,\n resolver: (data: D, resourceResolver: ResourceResolver) => Resolvable<T>,\n): T {\n const resourceResolver = useResourceResolver()\n const resolvable = useMemo(() => resolver(data, resourceResolver), [data, resourceResolver])\n\n useEffect(() => {\n resolvable.triggerResolve()\n }, [])\n\n return useSyncExternalStore(resolvable.subscribe, resolvable.readStable, resolvable.readStable)\n}\n"],"mappings":"AAAA,SAAS,SAAS,WAAW,4BAA4B;AAGzD,SAAS,2BAA2B;AAE7B,SAAS,iBACd,MACA,UACG;AACH,QAAM,mBAAmB,oBAAoB;AAC7C,QAAM,aAAa,QAAQ,MAAM,SAAS,MAAM,gBAAgB,GAAG,CAAC,MAAM,gBAAgB,CAAC;AAE3F,YAAU,MAAM;AACd,eAAW,eAAe;AAAA,EAC5B,GAAG,CAAC,CAAC;AAEL,SAAO,qBAAqB,WAAW,WAAW,WAAW,YAAY,WAAW,UAAU;AAChG;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/runtimes/react/hooks/use-resolved-value.ts"],"sourcesContent":["import { useMemo, useEffect, useSyncExternalStore } from 'react'\nimport { Resolvable, ResourceResolver } from '@makeswift/controls'\n\nimport { useResourceResolver } from './use-resource-resolver'\nimport { propErrorHandlingProxy } from '../utils/prop-error-handling-proxy'\n\nexport function useResolvedValue<D, T>(\n data: D,\n resolver: (data: D, resourceResolver: ResourceResolver) => Resolvable<T>,\n defaultValue?: T,\n): T | undefined {\n const resourceResolver = useResourceResolver()\n const resolvable = useMemo(() => {\n return propErrorHandlingProxy(resolver(data, resourceResolver), defaultValue, error => {\n console.warn(`Error resolving data, falling back to \\`${defaultValue}\\`.`, { error, data })\n })\n }, [data, resourceResolver, defaultValue])\n\n useEffect(() => {\n resolvable.triggerResolve()\n }, [])\n\n return useSyncExternalStore(resolvable.subscribe, resolvable.readStable, resolvable.readStable)\n}\n"],"mappings":"AAAA,SAAS,SAAS,WAAW,4BAA4B;AAGzD,SAAS,2BAA2B;AACpC,SAAS,8BAA8B;AAEhC,SAAS,iBACd,MACA,UACA,cACe;AACf,QAAM,mBAAmB,oBAAoB;AAC7C,QAAM,aAAa,QAAQ,MAAM;AAC/B,WAAO,uBAAuB,SAAS,MAAM,gBAAgB,GAAG,cAAc,WAAS;AACrF,cAAQ,KAAK,2CAA2C,YAAY,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,IAC5F,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,kBAAkB,YAAY,CAAC;AAEzC,YAAU,MAAM;AACd,eAAW,eAAe;AAAA,EAC5B,GAAG,CAAC,CAAC;AAEL,SAAO,qBAAqB,WAAW,WAAW,WAAW,YAAY,WAAW,UAAU;AAChG;","names":[]}
@@ -0,0 +1,17 @@
1
+ function propErrorHandlingProxy(resolvable, fallback, onError) {
2
+ return {
3
+ ...resolvable,
4
+ readStable: () => {
5
+ try {
6
+ return resolvable.readStable();
7
+ } catch (err) {
8
+ onError?.(err);
9
+ return fallback;
10
+ }
11
+ }
12
+ };
13
+ }
14
+ export {
15
+ propErrorHandlingProxy
16
+ };
17
+ //# sourceMappingURL=prop-error-handling-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/runtimes/react/utils/prop-error-handling-proxy.ts"],"sourcesContent":["import { type Resolvable } from '@makeswift/controls'\n\nexport function propErrorHandlingProxy<T>(\n resolvable: Resolvable<T>,\n fallback: T,\n onError?: (error: unknown) => void,\n): Resolvable<T> {\n return {\n ...resolvable,\n readStable: () => {\n try {\n return resolvable.readStable()\n } catch (err: unknown) {\n onError?.(err)\n return fallback\n }\n },\n }\n}\n"],"mappings":"AAEO,SAAS,uBACd,YACA,UACA,SACe;AACf,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY,MAAM;AAChB,UAAI;AACF,eAAO,WAAW,WAAW;AAAA,MAC/B,SAAS,KAAc;AACrB,kBAAU,GAAG;AACb,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../../../../src/runtimes/react/controls/control.tsx"],"names":[],"mappings":";AAEA,OAAO,EACL,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACvB,MAAM,qBAAqB,CAAA;AAM5B,KAAK,iBAAiB,GAAG;IACvB,UAAU,EAAE,iBAAiB,CAAA;IAC7B,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,SAAS,CAAA;IAC7C,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,GAAG,GAAG,CAAC,OAAO,CAAA;IAClE,OAAO,CAAC,EAAE,YAAY,CAAC,iBAAiB,CAAC,CAAA;CAC1C,CAAA;AAED,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,UAAU,EACV,QAAQ,EACR,OAAO,GACR,EAAE,iBAAiB,GAAG,GAAG,CAAC,OAAO,CAWjC"}
1
+ {"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../../../../src/runtimes/react/controls/control.tsx"],"names":[],"mappings":";AAEA,OAAO,EACL,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACvB,MAAM,qBAAqB,CAAA;AAM5B,KAAK,iBAAiB,GAAG;IACvB,UAAU,EAAE,iBAAiB,CAAA;IAC7B,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,SAAS,CAAA;IAC7C,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,GAAG,GAAG,CAAC,OAAO,CAAA;IAClE,OAAO,CAAC,EAAE,YAAY,CAAC,iBAAiB,CAAC,CAAA;CAC1C,CAAA;AAED,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,UAAU,EACV,QAAQ,EACR,OAAO,GACR,EAAE,iBAAiB,GAAG,GAAG,CAAC,OAAO,CAcjC"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-resolved-props.d.ts","sourceRoot":"","sources":["../../../../../src/runtimes/react/hooks/use-resolved-props.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EAGjB,KAAK,IAAI,EAEV,MAAM,qBAAqB,CAAA;AAiD5B,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAC3C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EACjC,UAAU,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiDzB"}
1
+ {"version":3,"file":"use-resolved-props.d.ts","sourceRoot":"","sources":["../../../../../src/runtimes/react/hooks/use-resolved-props.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EAGjB,KAAK,IAAI,EAEV,MAAM,qBAAqB,CAAA;AA4B5B,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAC3C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EACjC,UAAU,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuDzB"}
@@ -1,3 +1,3 @@
1
1
  import { Resolvable, ResourceResolver } from '@makeswift/controls';
2
- export declare function useResolvedValue<D, T>(data: D, resolver: (data: D, resourceResolver: ResourceResolver) => Resolvable<T>): T;
2
+ export declare function useResolvedValue<D, T>(data: D, resolver: (data: D, resourceResolver: ResourceResolver) => Resolvable<T>, defaultValue?: T): T | undefined;
3
3
  //# sourceMappingURL=use-resolved-value.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-resolved-value.d.ts","sourceRoot":"","sources":["../../../../../src/runtimes/react/hooks/use-resolved-value.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAIlE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,CAAC,EACnC,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,gBAAgB,EAAE,gBAAgB,KAAK,UAAU,CAAC,CAAC,CAAC,GACvE,CAAC,CASH"}
1
+ {"version":3,"file":"use-resolved-value.d.ts","sourceRoot":"","sources":["../../../../../src/runtimes/react/hooks/use-resolved-value.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAKlE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,CAAC,EACnC,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,gBAAgB,EAAE,gBAAgB,KAAK,UAAU,CAAC,CAAC,CAAC,EACxE,YAAY,CAAC,EAAE,CAAC,GACf,CAAC,GAAG,SAAS,CAaf"}
@@ -0,0 +1,3 @@
1
+ import { type Resolvable } from '@makeswift/controls';
2
+ export declare function propErrorHandlingProxy<T>(resolvable: Resolvable<T>, fallback: T, onError?: (error: unknown) => void): Resolvable<T>;
3
+ //# sourceMappingURL=prop-error-handling-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prop-error-handling-proxy.d.ts","sourceRoot":"","sources":["../../../../../src/runtimes/react/utils/prop-error-handling-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAErD,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EACzB,QAAQ,EAAE,CAAC,EACX,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GACjC,UAAU,CAAC,CAAC,CAAC,CAYf"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@makeswift/runtime",
3
- "version": "0.22.2-canary.1",
3
+ "version": "0.22.3-canary.0",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "dist",
@@ -156,8 +156,8 @@
156
156
  "uuid": "^9.0.0",
157
157
  "zod": "^3.21.4",
158
158
  "@makeswift/controls": "0.1.6",
159
- "@makeswift/next-plugin": "0.3.0",
160
- "@makeswift/prop-controllers": "0.3.7"
159
+ "@makeswift/prop-controllers": "0.3.7",
160
+ "@makeswift/next-plugin": "0.3.0"
161
161
  },
162
162
  "devDependencies": {
163
163
  "@emotion/jest": "^11.11.0",