@baseplate-dev/project-builder-web 0.3.5 → 0.3.7

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 (106) hide show
  1. package/dist/assets/{-constants-BYERQCO8.js → -constants-CBBXnsgS.js} +2 -2
  2. package/dist/assets/{-constants-BYERQCO8.js.map → -constants-CBBXnsgS.js.map} +1 -1
  3. package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib/web-Db9HEBw5.js.map +1 -1
  4. package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib-fZlnH9Ds.js.map +1 -1
  5. package/dist/assets/__federation_shared_@baseplate-dev/ui-components-CoxJjxbV.js.map +1 -1
  6. package/dist/assets/__federation_shared_@baseplate-dev/utils-Bhl1WBIT.js.map +1 -1
  7. package/dist/assets/__federation_shared_@tanstack/react-router-JHHIpdEJ.js.map +1 -1
  8. package/dist/assets/__federation_shared_react-WURrSs1p.js.map +1 -1
  9. package/dist/assets/__federation_shared_react-dom-CWagDEjd.js.map +1 -1
  10. package/dist/assets/__federation_shared_zod-CBKZOTZP.js.map +1 -1
  11. package/dist/assets/_virtual___federation_fn_import-D3sI42Ph.js.map +1 -1
  12. package/dist/assets/{admin-Dy1xMuLp.js → admin-BmEAbqDf.js} +2 -2
  13. package/dist/assets/{admin-Dy1xMuLp.js.map → admin-BmEAbqDf.js.map} +1 -1
  14. package/dist/assets/{backend-SevlkhOM.js → backend-3ZlC6POv.js} +2 -2
  15. package/dist/assets/{backend-SevlkhOM.js.map → backend-3ZlC6POv.js.map} +1 -1
  16. package/dist/assets/badge-with-type-label-CThmzNSh.js.map +1 -1
  17. package/dist/assets/capitalize-gOJXDbsR.js.map +1 -1
  18. package/dist/assets/{edit._key-BgnflZIL.js → edit._key-D-7xw9rv.js} +2 -2
  19. package/dist/assets/{edit._key-BgnflZIL.js.map → edit._key-D-7xw9rv.js.map} +1 -1
  20. package/dist/assets/{edit._sectionKey-D4mTSUhO.js → edit._sectionKey-CZgof0ob.js} +3 -3
  21. package/dist/assets/edit._sectionKey-CZgof0ob.js.map +1 -0
  22. package/dist/assets/enum-info-form-3ykREN-o.js.map +1 -1
  23. package/dist/assets/{graphql-C37jbnTG.js → graphql-DFecTG83.js} +2 -2
  24. package/dist/assets/{graphql-C37jbnTG.js.map → graphql-DFecTG83.js.map} +1 -1
  25. package/dist/assets/{hierarchy-CNBHjTAJ.js → hierarchy-jFN5DTrv.js} +2 -2
  26. package/dist/assets/{hierarchy-CNBHjTAJ.js.map → hierarchy-jFN5DTrv.js.map} +1 -1
  27. package/dist/assets/immer-B7fdkLVi.js.map +1 -1
  28. package/dist/assets/{index-CFlVUowS.js → index-B4AqRYYd.js} +2 -2
  29. package/dist/assets/{index-CFlVUowS.js.map → index-B4AqRYYd.js.map} +1 -1
  30. package/dist/assets/{index-B3A5IWAQ.js → index-BJlq0bmu.js} +2 -2
  31. package/dist/assets/{index-B3A5IWAQ.js.map → index-BJlq0bmu.js.map} +1 -1
  32. package/dist/assets/{index-CDx3IfgN.js → index-BPRSO52F.js} +2 -2
  33. package/dist/assets/{index-CDx3IfgN.js.map → index-BPRSO52F.js.map} +1 -1
  34. package/dist/assets/{index-CAFf3K5-.js → index-BWWBFiT1.js} +2 -2
  35. package/dist/assets/{index-CAFf3K5-.js.map → index-BWWBFiT1.js.map} +1 -1
  36. package/dist/assets/{index-Ckh17o1U.js → index-BZ4uW6kN.js} +2 -2
  37. package/dist/assets/{index-Ckh17o1U.js.map → index-BZ4uW6kN.js.map} +1 -1
  38. package/dist/assets/{index-D48MR3bL.js → index-BpFwTs3X.js} +2 -2
  39. package/dist/assets/{index-D48MR3bL.js.map → index-BpFwTs3X.js.map} +1 -1
  40. package/dist/assets/{index-mFxKl9yz.js → index-CbnCfDth.js} +2 -2
  41. package/dist/assets/{index-mFxKl9yz.js.map → index-CbnCfDth.js.map} +1 -1
  42. package/dist/assets/{index-DEKFCy0H.js → index-Cd_baD6T.js} +4 -4
  43. package/dist/assets/index-Cd_baD6T.js.map +1 -0
  44. package/dist/assets/index-D5UX5AHP.js.map +1 -1
  45. package/dist/assets/index-DRRJXHq_.js.map +1 -1
  46. package/dist/assets/{index-2EwzbJik.js → index-DhfdQsvQ.js} +2 -2
  47. package/dist/assets/{index-2EwzbJik.js.map → index-DhfdQsvQ.js.map} +1 -1
  48. package/dist/assets/index-DqHVrEeL.js.map +1 -1
  49. package/dist/assets/index-Dqph-b0R.css +1 -0
  50. package/dist/assets/{index-B2l1e3vi.js → index-UtPzkFI2.js} +2 -2
  51. package/dist/assets/{index-B2l1e3vi.js.map → index-UtPzkFI2.js.map} +1 -1
  52. package/dist/assets/index-c0qeY2gs.js.map +1 -1
  53. package/dist/assets/index-tHURiz2C.js.map +1 -1
  54. package/dist/assets/index-tflukq04.js.map +1 -1
  55. package/dist/assets/index.esm-CdP29Ssb.js.map +1 -1
  56. package/dist/assets/inflection-C1nKqrJS.js.map +1 -1
  57. package/dist/assets/isEqual-C420KeG-.js.map +1 -1
  58. package/dist/assets/jsx-runtime-D_zvdyIk.js.map +1 -1
  59. package/dist/assets/model-info-form-koY65NLs.js.map +1 -1
  60. package/dist/assets/model-merger-D1L5cIAo.js.map +1 -1
  61. package/dist/assets/{new-admin-section-dialog-4X2fxo7a.js → new-admin-section-dialog-DFpUuP_Z.js} +2 -2
  62. package/dist/assets/{new-admin-section-dialog-4X2fxo7a.js.map → new-admin-section-dialog-DFpUuP_Z.js.map} +1 -1
  63. package/dist/assets/{new-app-dialog-CCI4q4Mt.js → new-app-dialog-Cnp9A5Cx.js} +2 -2
  64. package/dist/assets/{new-app-dialog-CCI4q4Mt.js.map → new-app-dialog-Cnp9A5Cx.js.map} +1 -1
  65. package/dist/assets/{new-enum-dialog-B5zvBxhT.js → new-enum-dialog-CE3pNVPW.js} +2 -2
  66. package/dist/assets/{new-enum-dialog-B5zvBxhT.js.map → new-enum-dialog-CE3pNVPW.js.map} +1 -1
  67. package/dist/assets/{new-model-dialog-CiwTpKcZ.js → new-model-dialog-BUqUnu3F.js} +2 -2
  68. package/dist/assets/{new-model-dialog-CiwTpKcZ.js.map → new-model-dialog-BUqUnu3F.js.map} +1 -1
  69. package/dist/assets/{route-PmxQsBVj.js → route-BMREAhaC.js} +2 -2
  70. package/dist/assets/{route-PmxQsBVj.js.map → route-BMREAhaC.js.map} +1 -1
  71. package/dist/assets/{route-CZgTuGeJ.js → route-B_y_fjG1.js} +2 -2
  72. package/dist/assets/{route-CZgTuGeJ.js.map → route-B_y_fjG1.js.map} +1 -1
  73. package/dist/assets/{route-DluQ5e3_.js → route-CM78Qts_.js} +2 -2
  74. package/dist/assets/{route-DluQ5e3_.js.map → route-CM78Qts_.js.map} +1 -1
  75. package/dist/assets/{route-6ErXC2Qt.js → route-D-8r4X0U.js} +2 -2
  76. package/dist/assets/{route-6ErXC2Qt.js.map → route-D-8r4X0U.js.map} +1 -1
  77. package/dist/assets/{route-gzD4oiAl.js → route-D7DRL965.js} +2 -2
  78. package/dist/assets/{route-gzD4oiAl.js.map → route-D7DRL965.js.map} +1 -1
  79. package/dist/assets/{route-C6wCPwVj.js → route-DGnyRZBc.js} +2 -2
  80. package/dist/assets/{route-C6wCPwVj.js.map → route-DGnyRZBc.js.map} +1 -1
  81. package/dist/assets/route-Dm8VYkZY.js +2 -0
  82. package/dist/assets/{route-DLz_DL5S.js.map → route-Dm8VYkZY.js.map} +1 -1
  83. package/dist/assets/{route-C3eBLQEr.js → route-Dpt-JNZC.js} +2 -2
  84. package/dist/assets/{route-C3eBLQEr.js.map → route-Dpt-JNZC.js.map} +1 -1
  85. package/dist/assets/{route-DzYT3FNA.js → route-pfSpaHo3.js} +2 -2
  86. package/dist/assets/{route-DzYT3FNA.js.map → route-pfSpaHo3.js.map} +1 -1
  87. package/dist/assets/{route-gYB7kkkm.js → route-x978fCyu.js} +2 -2
  88. package/dist/assets/{route-gYB7kkkm.js.map → route-x978fCyu.js.map} +1 -1
  89. package/dist/assets/{service--2LVz4Ht.js → service-BSH0RhEL.js} +2 -2
  90. package/dist/assets/{service--2LVz4Ht.js.map → service-BSH0RhEL.js.map} +1 -1
  91. package/dist/assets/sortBy-C9bvycg5.js.map +1 -1
  92. package/dist/assets/{template-extractor-D33LuEZ8.js → template-extractor-Dzitw66S.js} +2 -2
  93. package/dist/assets/{template-extractor-D33LuEZ8.js.map → template-extractor-Dzitw66S.js.map} +1 -1
  94. package/dist/assets/{theme-builder-CWetoMuo.js → theme-builder-00-pJhvO.js} +2 -2
  95. package/dist/assets/{theme-builder-CWetoMuo.js.map → theme-builder-00-pJhvO.js.map} +1 -1
  96. package/dist/assets/use-definition-schema-BuO4pbji.js.map +1 -1
  97. package/dist/assets/{use-enum-form-BRBAlWJc.js → use-enum-form-CiJfrBqR.js} +2 -2
  98. package/dist/assets/{use-enum-form-BRBAlWJc.js.map → use-enum-form-CiJfrBqR.js.map} +1 -1
  99. package/dist/assets/{use-model-form-psj-JlE9.js → use-model-form-AKI1Wi68.js} +2 -2
  100. package/dist/assets/{use-model-form-psj-JlE9.js.map → use-model-form-AKI1Wi68.js.map} +1 -1
  101. package/dist/index.html +2 -2
  102. package/package.json +11 -11
  103. package/dist/assets/edit._sectionKey-D4mTSUhO.js.map +0 -1
  104. package/dist/assets/index-DEKFCy0H.js.map +0 -1
  105. package/dist/assets/index-DPK1IfNZ.css +0 -1
  106. package/dist/assets/route-DLz_DL5S.js +0 -2
@@ -1,4 +1,4 @@
1
- import{i as l}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as m}from"./jsx-runtime-D_zvdyIk.js";import{h as S,i as I,e as M}from"./index.esm-CdP29Ssb.js";import{q as j}from"./index-DEKFCy0H.js";import{i as F}from"./isEqual-C420KeG-.js";const{useRef:D}=await l("react");function P(r){const o=D(void 0);return e=>{const n=r(e);return F(o.current,n)?o.current:(o.current=n,n)}}const{jsonDeepClone:O}=await l("@baseplate-dev/utils"),{createContext:U,useContext:$,useEffect:_,useMemo:W}=await l("react"),w=U(void 0);function ee({originalModel:r,children:o,watch:e,getValues:n}){const a=W(()=>S(i=>({model:{...r,...n()},setModel:s=>{i({model:{...r,...s}})},getValues:n})),[r,n]);return _(()=>{const{unsubscribe:i}=e(s=>{a.getState().setModel(O(s))});return i},[e,a]),m.jsx(w.Provider,{value:a,children:o})}function A(r){const o=$(w);if(!o)throw new Error("useEditedModelConfig must be used within a EditedModelContextProvider");return I(o,P(e=>r(e.model)))}const{modelTransformerEntityType:B,ModelTransformerUtils:L,ModelUtils:E}=await l("@baseplate-dev/project-builder-lib"),{useProjectDefinition:q}=await l("@baseplate-dev/project-builder-lib/web"),{MultiComboboxFieldController:T,SelectFieldController:H}=await l("@baseplate-dev/ui-components"),{useEffect:J}=await l("react");function K({formProps:r,name:o}){const e=o,n=r,{control:a,setValue:i}=n,{definition:s,definitionContainer:N,pluginContainer:y}=q(),u=M({control:a,name:e}),p=A(t=>{const R=E.getRelationsToModel(s,t.id),x=t.service?.transformers?.filter(f=>f.type==="embeddedRelation"&&f.id!==u.id);return R.filter(({relation:f})=>!x?.some(C=>C.foreignRelationRef===f.foreignId))}),h=p.map(t=>({label:`${t.relation.foreignRelationName} (${t.model.name})`,value:t.relation.foreignId})),c=u.type==="embeddedRelation"?u:null,d=p.find(t=>t.relation.foreignId===c?.foreignRelationRef),b=j(c?.foreignRelationRef);J(()=>{b!==void 0&&b!==c?.foreignRelationRef&&(i(`${e}.embeddedFieldNames`,[]),d?.model.id&&i(`${e}.modelRef`,d.model.id))},[e,i,d,c?.foreignRelationRef,b,p]);const v=d?.model.model.fields.filter(t=>!d.relation.references.some(R=>R.localRef===t.id)).map(t=>({label:t.name,value:t.id}))??[],g=d?.model.service.transformers.map(t=>({label:L.getTransformName(N,t,y),value:t.id}))??[];return m.jsxs("div",{className:"space-y-4",children:[m.jsx(H,{control:a,name:`${e}.foreignRelationRef`,options:h,label:"Relation",placeholder:"Select relation"}),m.jsx(T,{control:a,disabled:v.length===0,options:v,name:`${e}.embeddedFieldNames`,label:"Embedded Field Names"}),g.length>0&&m.jsx(T,{control:a,options:g,name:`${e}.embeddedTransformerNames`,label:"Embedded Transformers"})]})}const G={name:"embeddedRelation",label:"Embedded Relation",description:"Upsert records to a related model table",instructions:`This transformer allows you to upsert related records to a related model's table
1
+ import{i as l}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as m}from"./jsx-runtime-D_zvdyIk.js";import{h as S,i as I,e as M}from"./index.esm-CdP29Ssb.js";import{q as j}from"./index-Cd_baD6T.js";import{i as F}from"./isEqual-C420KeG-.js";const{useRef:D}=await l("react");function P(r){const o=D(void 0);return e=>{const n=r(e);return F(o.current,n)?o.current:(o.current=n,n)}}const{jsonDeepClone:O}=await l("@baseplate-dev/utils"),{createContext:U,useContext:$,useEffect:_,useMemo:W}=await l("react"),w=U(void 0);function ee({originalModel:r,children:o,watch:e,getValues:n}){const a=W(()=>S(i=>({model:{...r,...n()},setModel:s=>{i({model:{...r,...s}})},getValues:n})),[r,n]);return _(()=>{const{unsubscribe:i}=e(s=>{a.getState().setModel(O(s))});return i},[e,a]),m.jsx(w.Provider,{value:a,children:o})}function A(r){const o=$(w);if(!o)throw new Error("useEditedModelConfig must be used within a EditedModelContextProvider");return I(o,P(e=>r(e.model)))}const{modelTransformerEntityType:B,ModelTransformerUtils:L,ModelUtils:E}=await l("@baseplate-dev/project-builder-lib"),{useProjectDefinition:q}=await l("@baseplate-dev/project-builder-lib/web"),{MultiComboboxFieldController:T,SelectFieldController:H}=await l("@baseplate-dev/ui-components"),{useEffect:J}=await l("react");function K({formProps:r,name:o}){const e=o,n=r,{control:a,setValue:i}=n,{definition:s,definitionContainer:N,pluginContainer:y}=q(),u=M({control:a,name:e}),p=A(t=>{const R=E.getRelationsToModel(s,t.id),x=t.service?.transformers?.filter(f=>f.type==="embeddedRelation"&&f.id!==u.id);return R.filter(({relation:f})=>!x?.some(C=>C.foreignRelationRef===f.foreignId))}),h=p.map(t=>({label:`${t.relation.foreignRelationName} (${t.model.name})`,value:t.relation.foreignId})),c=u.type==="embeddedRelation"?u:null,d=p.find(t=>t.relation.foreignId===c?.foreignRelationRef),b=j(c?.foreignRelationRef);J(()=>{b!==void 0&&b!==c?.foreignRelationRef&&(i(`${e}.embeddedFieldNames`,[]),d?.model.id&&i(`${e}.modelRef`,d.model.id))},[e,i,d,c?.foreignRelationRef,b,p]);const v=d?.model.model.fields.filter(t=>!d.relation.references.some(R=>R.localRef===t.id)).map(t=>({label:t.name,value:t.id}))??[],g=d?.model.service.transformers.map(t=>({label:L.getTransformName(N,t,y),value:t.id}))??[];return m.jsxs("div",{className:"space-y-4",children:[m.jsx(H,{control:a,name:`${e}.foreignRelationRef`,options:h,label:"Relation",placeholder:"Select relation"}),m.jsx(T,{control:a,disabled:v.length===0,options:v,name:`${e}.embeddedFieldNames`,label:"Embedded Field Names"}),g.length>0&&m.jsx(T,{control:a,options:g,name:`${e}.embeddedTransformerNames`,label:"Embedded Transformers"})]})}const G={name:"embeddedRelation",label:"Embedded Relation",description:"Upsert records to a related model table",instructions:`This transformer allows you to upsert related records to a related model's table
2
2
  e.g. UserRole records for a User. It will create, update, delete related records to fit the provided
3
3
  input.`,getSummary(r,o){return[{label:"Embedded Relation",description:o.nameFromId(r.foreignRelationRef)}]},allowNewTransformer(r,o){const{definition:e}=r,n=E.getRelationsToModel(e,o.id),a=o.service?.transformers?.filter(i=>i.type==="embeddedRelation");return n.some(({relation:i})=>!a?.some(s=>s.foreignRelationRef===i.foreignId))},getNewTransformer:()=>({id:B.generateNewId(),foreignRelationRef:"",type:"embeddedRelation",embeddedFieldNames:[],modelRef:""}),Form:K,pluginKey:void 0},{modelTransformerEntityType:Y}=await l("@baseplate-dev/project-builder-lib"),{createNewModelTransformerWebConfig:k}=await l("@baseplate-dev/project-builder-lib/web"),oe=[G,k({name:"password",label:"Password",description:"Hashes the input value of value 'password' using Argon2id",getNewTransformer:()=>({id:Y.generateNewId(),type:"password"}),allowNewTransformer(r,o){return!o.service?.transformers?.some(e=>e.type==="password")&&o.model.fields.some(e=>e.name==="passwordHash")},getSummary:()=>[],pluginKey:void 0})],te={string:{label:"String",value:"string",description:"Variable length text"},int:{label:"Integer",value:"int",description:"Whole number"},float:{label:"Float",value:"float",description:"Decimal number"},decimal:{label:"Decimal",value:"decimal",description:"Precise decimal number"},boolean:{label:"Boolean",value:"boolean",description:"True or false value"},json:{label:"JSON",value:"json",description:"JSON data"},uuid:{label:"UUID",value:"uuid",description:"Unique identifier"},dateTime:{label:"DateTime",value:"dateTime",description:"Date and time"},date:{label:"Date",value:"date",description:"Calendar date"},enum:{label:"Enum",value:"enum",description:"List of values"}};export{oe as B,ee as E,te as S,A as u};
4
- //# sourceMappingURL=-constants-BYERQCO8.js.map
4
+ //# sourceMappingURL=-constants-CBBXnsgS.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"-constants-BYERQCO8.js","sources":["../../src/hooks/use-deep.ts","../../src/routes/data/models/-hooks/use-edited-model-config.tsx","../../src/routes/data/models/edit.$key/-components/service/service-embedded-relation-form.tsx","../../src/routes/data/models/-constants.tsx"],"sourcesContent":["import { isEqual } from 'es-toolkit';\nimport { useRef } from 'react';\n\n/**\n * A hook that returns a deeply memoized value of a selector function.\n *\n * @param selector - The selector function to deeply memoize.\n */\nexport function useDeep<S, U>(selector: (state: S) => U): (state: S) => U {\n const prev = useRef<U>(undefined);\n\n return (state) => {\n const next = selector(state);\n if (isEqual(prev.current, next)) {\n return prev.current as U;\n }\n prev.current = next;\n return next;\n };\n}\n","import type {\n ModelConfig,\n ModelConfigInput,\n} from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { UseFormGetValues, UseFormWatch } from 'react-hook-form';\nimport type { StoreApi } from 'zustand';\n\nimport { jsonDeepClone } from '@baseplate-dev/utils';\nimport { createContext, useContext, useEffect, useMemo } from 'react';\nimport { createStore, useStore } from 'zustand';\n\nimport { useDeep } from '#src/hooks/use-deep.js';\n\ninterface ModelConfigStore {\n model: ModelConfigInput;\n setModel: (model: ModelConfigInput) => void;\n getValues: UseFormGetValues<ModelConfigInput>;\n}\n\nconst EditedModelContext = createContext<\n StoreApi<ModelConfigStore> | undefined\n>(undefined);\n\nexport function EditedModelContextProvider({\n originalModel,\n children,\n watch,\n getValues,\n}: {\n originalModel: ModelConfig;\n children: React.ReactNode;\n watch: UseFormWatch<ModelConfigInput>;\n getValues: UseFormGetValues<ModelConfigInput>;\n}): React.JSX.Element {\n const store = useMemo(\n () =>\n createStore<ModelConfigStore>((set) => ({\n model: {\n ...originalModel,\n ...getValues(),\n },\n setModel: (model) => {\n set({\n model: {\n ...originalModel,\n ...model,\n },\n });\n },\n getValues,\n })),\n [originalModel, getValues],\n );\n\n useEffect(() => {\n const { unsubscribe } = watch((data) => {\n // We need to clone the data since React hook form data store is not immutable\n store.getState().setModel(jsonDeepClone(data as ModelConfigInput));\n });\n return unsubscribe;\n }, [watch, store]);\n\n return (\n <EditedModelContext.Provider value={store}>\n {children}\n </EditedModelContext.Provider>\n );\n}\n\nexport function useEditedModelConfig<T>(\n selector: (model: ModelConfigInput) => T,\n): T {\n const store = useContext(EditedModelContext);\n if (!store) {\n throw new Error(\n 'useEditedModelConfig must be used within a EditedModelContextProvider',\n );\n }\n return useStore(\n store,\n useDeep((state) => selector(state.model)),\n );\n}\n","import type { EmbeddedRelationTransformerConfig } from '@baseplate-dev/project-builder-lib';\nimport type {\n ModelTransformerWebConfig,\n ModelTransformerWebFormProps,\n} from '@baseplate-dev/project-builder-lib/web';\nimport type React from 'react';\nimport type { UseFormReturn } from 'react-hook-form';\n\nimport {\n modelTransformerEntityType,\n ModelTransformerUtils,\n ModelUtils,\n} from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n MultiComboboxFieldController,\n SelectFieldController,\n} from '@baseplate-dev/ui-components';\nimport { useEffect } from 'react';\nimport { useWatch } from 'react-hook-form';\n\nimport { usePrevious } from '#src/hooks/use-previous.js';\n\nimport { useEditedModelConfig } from '../../../-hooks/use-edited-model-config.js';\n\nfunction ServiceEmbeddedRelationForm({\n formProps,\n name,\n}: ModelTransformerWebFormProps): React.JSX.Element {\n // force type cast to avoid TS error\n const prefix = name as 'prefix';\n const formPropsTyped = formProps as unknown as UseFormReturn<{\n prefix: EmbeddedRelationTransformerConfig;\n }>;\n const { control, setValue } = formPropsTyped;\n\n const { definition, definitionContainer, pluginContainer } =\n useProjectDefinition();\n\n const transformer = useWatch({\n control,\n name: prefix,\n });\n\n const availableRelations = useEditedModelConfig((model) => {\n const relationsToModel = ModelUtils.getRelationsToModel(\n definition,\n model.id,\n );\n const otherEmbeddedRelations = model.service?.transformers?.filter(\n (t): t is EmbeddedRelationTransformerConfig =>\n t.type === 'embeddedRelation' && t.id !== transformer.id,\n );\n return relationsToModel.filter(\n ({ relation }) =>\n !otherEmbeddedRelations?.some(\n (o) => o.foreignRelationRef === relation.foreignId,\n ),\n );\n });\n\n const relationOptions = availableRelations.map((relation) => ({\n label: `${relation.relation.foreignRelationName} (${relation.model.name})`,\n value: relation.relation.foreignId,\n }));\n\n const embeddedTransformer =\n (transformer.type as string) === 'embeddedRelation' ? transformer : null;\n const relation = availableRelations.find(\n (r) => r.relation.foreignId === embeddedTransformer?.foreignRelationRef,\n );\n\n const previousForeignModelId = usePrevious(\n embeddedTransformer?.foreignRelationRef,\n );\n useEffect(() => {\n if (\n previousForeignModelId !== undefined &&\n previousForeignModelId !== embeddedTransformer?.foreignRelationRef\n ) {\n setValue(`${prefix}.embeddedFieldNames`, []);\n if (relation?.model.id) {\n setValue(`${prefix}.modelRef`, relation.model.id);\n }\n }\n }, [\n prefix,\n setValue,\n relation,\n embeddedTransformer?.foreignRelationRef,\n previousForeignModelId,\n availableRelations,\n ]);\n\n const foreignFieldOptions =\n relation?.model.model.fields\n .filter(\n (field) =>\n !relation.relation.references.some(\n (reference) => reference.localRef === field.id,\n ),\n )\n .map((field) => ({\n label: field.name,\n value: field.id,\n })) ?? [];\n\n const foreignTransformerOptions =\n relation?.model.service.transformers.map((transformer) => ({\n label: ModelTransformerUtils.getTransformName(\n definitionContainer,\n transformer,\n pluginContainer,\n ),\n value: transformer.id,\n })) ?? [];\n\n return (\n <div className={'space-y-4'}>\n <SelectFieldController\n control={control}\n name={`${prefix}.foreignRelationRef`}\n options={relationOptions}\n label=\"Relation\"\n placeholder=\"Select relation\"\n />\n <MultiComboboxFieldController\n control={control}\n disabled={foreignFieldOptions.length === 0}\n options={foreignFieldOptions}\n name={`${prefix}.embeddedFieldNames`}\n label=\"Embedded Field Names\"\n />\n {foreignTransformerOptions.length > 0 && (\n <MultiComboboxFieldController\n control={control}\n options={foreignTransformerOptions}\n name={`${prefix}.embeddedTransformerNames`}\n label=\"Embedded Transformers\"\n />\n )}\n </div>\n );\n}\n\nexport const embeddedRelationTransformerWebConfig: ModelTransformerWebConfig<EmbeddedRelationTransformerConfig> =\n {\n name: 'embeddedRelation',\n label: 'Embedded Relation',\n description: 'Upsert records to a related model table',\n instructions: `This transformer allows you to upsert related records to a related model's table\n e.g. UserRole records for a User. It will create, update, delete related records to fit the provided\n input.`,\n getSummary(definition, container) {\n return [\n {\n label: 'Embedded Relation',\n description: container.nameFromId(definition.foreignRelationRef),\n },\n ];\n },\n allowNewTransformer(projectContainer, model) {\n const { definition } = projectContainer;\n const relationsToModel = ModelUtils.getRelationsToModel(\n definition,\n model.id,\n );\n const otherEmbeddedRelations = model.service?.transformers?.filter(\n (t): t is EmbeddedRelationTransformerConfig =>\n t.type === 'embeddedRelation',\n );\n return relationsToModel.some(\n ({ relation }) =>\n !otherEmbeddedRelations?.some(\n (o) => o.foreignRelationRef === relation.foreignId,\n ),\n );\n },\n getNewTransformer: () => ({\n id: modelTransformerEntityType.generateNewId(),\n foreignRelationRef: '',\n type: 'embeddedRelation',\n embeddedFieldNames: [],\n modelRef: '',\n }),\n Form: ServiceEmbeddedRelationForm,\n pluginKey: undefined,\n };\n","import type { ScalarFieldType } from '@baseplate-dev/project-builder-lib';\n\nimport { modelTransformerEntityType } from '@baseplate-dev/project-builder-lib';\nimport { createNewModelTransformerWebConfig } from '@baseplate-dev/project-builder-lib/web';\n\nimport { embeddedRelationTransformerWebConfig } from './edit.$key/-components/service/service-embedded-relation-form.js';\n\nexport const BUILT_IN_TRANSFORMER_WEB_CONFIGS = [\n embeddedRelationTransformerWebConfig,\n createNewModelTransformerWebConfig({\n name: 'password',\n label: 'Password',\n description: \"Hashes the input value of value 'password' using Argon2id\",\n getNewTransformer: () => ({\n id: modelTransformerEntityType.generateNewId(),\n type: 'password',\n }),\n allowNewTransformer(_, modelConfig) {\n return (\n !modelConfig.service?.transformers?.some(\n (t) => t.type === 'password',\n ) && modelConfig.model.fields.some((f) => f.name === 'passwordHash')\n );\n },\n getSummary: () => [],\n pluginKey: undefined,\n }),\n];\n\nexport interface ScalarFieldTypeOption {\n label: string;\n value: string;\n description: string;\n}\n\nexport const SCALAR_FIELD_TYPE_OPTIONS: Record<\n ScalarFieldType,\n ScalarFieldTypeOption\n> = {\n string: {\n label: 'String',\n value: 'string',\n description: 'Variable length text',\n },\n int: {\n label: 'Integer',\n value: 'int',\n description: 'Whole number',\n },\n float: {\n label: 'Float',\n value: 'float',\n description: 'Decimal number',\n },\n decimal: {\n label: 'Decimal',\n value: 'decimal',\n description: 'Precise decimal number',\n },\n boolean: {\n label: 'Boolean',\n value: 'boolean',\n description: 'True or false value',\n },\n json: {\n label: 'JSON',\n value: 'json',\n description: 'JSON data',\n },\n uuid: {\n label: 'UUID',\n value: 'uuid',\n description: 'Unique identifier',\n },\n dateTime: {\n label: 'DateTime',\n value: 'dateTime',\n description: 'Date and time',\n },\n date: {\n label: 'Date',\n value: 'date',\n description: 'Calendar date',\n },\n enum: {\n label: 'Enum',\n value: 'enum',\n description: 'List of values',\n },\n};\n"],"names":["useRef","importShared","useDeep","selector","prev","state","next","isEqual","jsonDeepClone","createContext","useContext","useEffect","useMemo","EditedModelContext","EditedModelContextProvider","originalModel","children","watch","getValues","store","createStore","set","model","unsubscribe","data","useEditedModelConfig","useStore","modelTransformerEntityType","ModelTransformerUtils","ModelUtils","useProjectDefinition","MultiComboboxFieldController","SelectFieldController","ServiceEmbeddedRelationForm","formProps","name","prefix","formPropsTyped","control","setValue","definition","definitionContainer","pluginContainer","transformer","useWatch","availableRelations","relationsToModel","otherEmbeddedRelations","t","relation","o","relationOptions","embeddedTransformer","r","previousForeignModelId","usePrevious","foreignFieldOptions","field","reference","foreignTransformerOptions","jsxs","jsx","embeddedRelationTransformerWebConfig","container","projectContainer","createNewModelTransformerWebConfig","BUILT_IN_TRANSFORMER_WEB_CONFIGS","_","modelConfig","f","SCALAR_FIELD_TYPE_OPTIONS"],"mappings":"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"}
1
+ {"version":3,"file":"-constants-CBBXnsgS.js","sources":["../../src/hooks/use-deep.ts","../../src/routes/data/models/-hooks/use-edited-model-config.tsx","../../src/routes/data/models/edit.$key/-components/service/service-embedded-relation-form.tsx","../../src/routes/data/models/-constants.tsx"],"sourcesContent":["import { isEqual } from 'es-toolkit';\nimport { useRef } from 'react';\n\n/**\n * A hook that returns a deeply memoized value of a selector function.\n *\n * @param selector - The selector function to deeply memoize.\n */\nexport function useDeep<S, U>(selector: (state: S) => U): (state: S) => U {\n const prev = useRef<U>(undefined);\n\n return (state) => {\n const next = selector(state);\n if (isEqual(prev.current, next)) {\n return prev.current as U;\n }\n prev.current = next;\n return next;\n };\n}\n","import type {\n ModelConfig,\n ModelConfigInput,\n} from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { UseFormGetValues, UseFormWatch } from 'react-hook-form';\nimport type { StoreApi } from 'zustand';\n\nimport { jsonDeepClone } from '@baseplate-dev/utils';\nimport { createContext, useContext, useEffect, useMemo } from 'react';\nimport { createStore, useStore } from 'zustand';\n\nimport { useDeep } from '#src/hooks/use-deep.js';\n\ninterface ModelConfigStore {\n model: ModelConfigInput;\n setModel: (model: ModelConfigInput) => void;\n getValues: UseFormGetValues<ModelConfigInput>;\n}\n\nconst EditedModelContext = createContext<\n StoreApi<ModelConfigStore> | undefined\n>(undefined);\n\nexport function EditedModelContextProvider({\n originalModel,\n children,\n watch,\n getValues,\n}: {\n originalModel: ModelConfig;\n children: React.ReactNode;\n watch: UseFormWatch<ModelConfigInput>;\n getValues: UseFormGetValues<ModelConfigInput>;\n}): React.JSX.Element {\n const store = useMemo(\n () =>\n createStore<ModelConfigStore>((set) => ({\n model: {\n ...originalModel,\n ...getValues(),\n },\n setModel: (model) => {\n set({\n model: {\n ...originalModel,\n ...model,\n },\n });\n },\n getValues,\n })),\n [originalModel, getValues],\n );\n\n useEffect(() => {\n const { unsubscribe } = watch((data) => {\n // We need to clone the data since React hook form data store is not immutable\n store.getState().setModel(jsonDeepClone(data as ModelConfigInput));\n });\n return unsubscribe;\n }, [watch, store]);\n\n return (\n <EditedModelContext.Provider value={store}>\n {children}\n </EditedModelContext.Provider>\n );\n}\n\nexport function useEditedModelConfig<T>(\n selector: (model: ModelConfigInput) => T,\n): T {\n const store = useContext(EditedModelContext);\n if (!store) {\n throw new Error(\n 'useEditedModelConfig must be used within a EditedModelContextProvider',\n );\n }\n return useStore(\n store,\n useDeep((state) => selector(state.model)),\n );\n}\n","import type { EmbeddedRelationTransformerConfig } from '@baseplate-dev/project-builder-lib';\nimport type {\n ModelTransformerWebConfig,\n ModelTransformerWebFormProps,\n} from '@baseplate-dev/project-builder-lib/web';\nimport type React from 'react';\nimport type { UseFormReturn } from 'react-hook-form';\n\nimport {\n modelTransformerEntityType,\n ModelTransformerUtils,\n ModelUtils,\n} from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n MultiComboboxFieldController,\n SelectFieldController,\n} from '@baseplate-dev/ui-components';\nimport { useEffect } from 'react';\nimport { useWatch } from 'react-hook-form';\n\nimport { usePrevious } from '#src/hooks/use-previous.js';\n\nimport { useEditedModelConfig } from '../../../-hooks/use-edited-model-config.js';\n\nfunction ServiceEmbeddedRelationForm({\n formProps,\n name,\n}: ModelTransformerWebFormProps): React.JSX.Element {\n // force type cast to avoid TS error\n const prefix = name as 'prefix';\n const formPropsTyped = formProps as unknown as UseFormReturn<{\n prefix: EmbeddedRelationTransformerConfig;\n }>;\n const { control, setValue } = formPropsTyped;\n\n const { definition, definitionContainer, pluginContainer } =\n useProjectDefinition();\n\n const transformer = useWatch({\n control,\n name: prefix,\n });\n\n const availableRelations = useEditedModelConfig((model) => {\n const relationsToModel = ModelUtils.getRelationsToModel(\n definition,\n model.id,\n );\n const otherEmbeddedRelations = model.service?.transformers?.filter(\n (t): t is EmbeddedRelationTransformerConfig =>\n t.type === 'embeddedRelation' && t.id !== transformer.id,\n );\n return relationsToModel.filter(\n ({ relation }) =>\n !otherEmbeddedRelations?.some(\n (o) => o.foreignRelationRef === relation.foreignId,\n ),\n );\n });\n\n const relationOptions = availableRelations.map((relation) => ({\n label: `${relation.relation.foreignRelationName} (${relation.model.name})`,\n value: relation.relation.foreignId,\n }));\n\n const embeddedTransformer =\n (transformer.type as string) === 'embeddedRelation' ? transformer : null;\n const relation = availableRelations.find(\n (r) => r.relation.foreignId === embeddedTransformer?.foreignRelationRef,\n );\n\n const previousForeignModelId = usePrevious(\n embeddedTransformer?.foreignRelationRef,\n );\n useEffect(() => {\n if (\n previousForeignModelId !== undefined &&\n previousForeignModelId !== embeddedTransformer?.foreignRelationRef\n ) {\n setValue(`${prefix}.embeddedFieldNames`, []);\n if (relation?.model.id) {\n setValue(`${prefix}.modelRef`, relation.model.id);\n }\n }\n }, [\n prefix,\n setValue,\n relation,\n embeddedTransformer?.foreignRelationRef,\n previousForeignModelId,\n availableRelations,\n ]);\n\n const foreignFieldOptions =\n relation?.model.model.fields\n .filter(\n (field) =>\n !relation.relation.references.some(\n (reference) => reference.localRef === field.id,\n ),\n )\n .map((field) => ({\n label: field.name,\n value: field.id,\n })) ?? [];\n\n const foreignTransformerOptions =\n relation?.model.service.transformers.map((transformer) => ({\n label: ModelTransformerUtils.getTransformName(\n definitionContainer,\n transformer,\n pluginContainer,\n ),\n value: transformer.id,\n })) ?? [];\n\n return (\n <div className={'space-y-4'}>\n <SelectFieldController\n control={control}\n name={`${prefix}.foreignRelationRef`}\n options={relationOptions}\n label=\"Relation\"\n placeholder=\"Select relation\"\n />\n <MultiComboboxFieldController\n control={control}\n disabled={foreignFieldOptions.length === 0}\n options={foreignFieldOptions}\n name={`${prefix}.embeddedFieldNames`}\n label=\"Embedded Field Names\"\n />\n {foreignTransformerOptions.length > 0 && (\n <MultiComboboxFieldController\n control={control}\n options={foreignTransformerOptions}\n name={`${prefix}.embeddedTransformerNames`}\n label=\"Embedded Transformers\"\n />\n )}\n </div>\n );\n}\n\nexport const embeddedRelationTransformerWebConfig: ModelTransformerWebConfig<EmbeddedRelationTransformerConfig> =\n {\n name: 'embeddedRelation',\n label: 'Embedded Relation',\n description: 'Upsert records to a related model table',\n instructions: `This transformer allows you to upsert related records to a related model's table\n e.g. UserRole records for a User. It will create, update, delete related records to fit the provided\n input.`,\n getSummary(definition, container) {\n return [\n {\n label: 'Embedded Relation',\n description: container.nameFromId(definition.foreignRelationRef),\n },\n ];\n },\n allowNewTransformer(projectContainer, model) {\n const { definition } = projectContainer;\n const relationsToModel = ModelUtils.getRelationsToModel(\n definition,\n model.id,\n );\n const otherEmbeddedRelations = model.service?.transformers?.filter(\n (t): t is EmbeddedRelationTransformerConfig =>\n t.type === 'embeddedRelation',\n );\n return relationsToModel.some(\n ({ relation }) =>\n !otherEmbeddedRelations?.some(\n (o) => o.foreignRelationRef === relation.foreignId,\n ),\n );\n },\n getNewTransformer: () => ({\n id: modelTransformerEntityType.generateNewId(),\n foreignRelationRef: '',\n type: 'embeddedRelation',\n embeddedFieldNames: [],\n modelRef: '',\n }),\n Form: ServiceEmbeddedRelationForm,\n pluginKey: undefined,\n };\n","import type { ScalarFieldType } from '@baseplate-dev/project-builder-lib';\n\nimport { modelTransformerEntityType } from '@baseplate-dev/project-builder-lib';\nimport { createNewModelTransformerWebConfig } from '@baseplate-dev/project-builder-lib/web';\n\nimport { embeddedRelationTransformerWebConfig } from './edit.$key/-components/service/service-embedded-relation-form.js';\n\nexport const BUILT_IN_TRANSFORMER_WEB_CONFIGS = [\n embeddedRelationTransformerWebConfig,\n createNewModelTransformerWebConfig({\n name: 'password',\n label: 'Password',\n description: \"Hashes the input value of value 'password' using Argon2id\",\n getNewTransformer: () => ({\n id: modelTransformerEntityType.generateNewId(),\n type: 'password',\n }),\n allowNewTransformer(_, modelConfig) {\n return (\n !modelConfig.service?.transformers?.some(\n (t) => t.type === 'password',\n ) && modelConfig.model.fields.some((f) => f.name === 'passwordHash')\n );\n },\n getSummary: () => [],\n pluginKey: undefined,\n }),\n];\n\nexport interface ScalarFieldTypeOption {\n label: string;\n value: string;\n description: string;\n}\n\nexport const SCALAR_FIELD_TYPE_OPTIONS: Record<\n ScalarFieldType,\n ScalarFieldTypeOption\n> = {\n string: {\n label: 'String',\n value: 'string',\n description: 'Variable length text',\n },\n int: {\n label: 'Integer',\n value: 'int',\n description: 'Whole number',\n },\n float: {\n label: 'Float',\n value: 'float',\n description: 'Decimal number',\n },\n decimal: {\n label: 'Decimal',\n value: 'decimal',\n description: 'Precise decimal number',\n },\n boolean: {\n label: 'Boolean',\n value: 'boolean',\n description: 'True or false value',\n },\n json: {\n label: 'JSON',\n value: 'json',\n description: 'JSON data',\n },\n uuid: {\n label: 'UUID',\n value: 'uuid',\n description: 'Unique identifier',\n },\n dateTime: {\n label: 'DateTime',\n value: 'dateTime',\n description: 'Date and time',\n },\n date: {\n label: 'Date',\n value: 'date',\n description: 'Calendar date',\n },\n enum: {\n label: 'Enum',\n value: 'enum',\n description: 'List of values',\n },\n};\n"],"names":["useRef","importShared","useDeep","selector","prev","state","next","isEqual","jsonDeepClone","createContext","useContext","useEffect","useMemo","EditedModelContext","EditedModelContextProvider","originalModel","children","watch","getValues","store","createStore","set","model","unsubscribe","data","useEditedModelConfig","useStore","modelTransformerEntityType","ModelTransformerUtils","ModelUtils","useProjectDefinition","MultiComboboxFieldController","SelectFieldController","ServiceEmbeddedRelationForm","formProps","name","prefix","formPropsTyped","control","setValue","definition","definitionContainer","pluginContainer","transformer","useWatch","availableRelations","relationsToModel","otherEmbeddedRelations","t","relation","o","relationOptions","embeddedTransformer","r","previousForeignModelId","usePrevious","foreignFieldOptions","field","reference","foreignTransformerOptions","jsxs","jsx","embeddedRelationTransformerWebConfig","container","projectContainer","createNewModelTransformerWebConfig","BUILT_IN_TRANSFORMER_WEB_CONFIGS","_","modelConfig","f","SCALAR_FIELD_TYPE_OPTIONS"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"web-Db9HEBw5.js","sources":["../../../../../project-builder-lib/dist/web/hooks/use-project-definition.js","../../../../../project-builder-lib/dist/web/components/feature-combobox-field.js","../../../../../project-builder-lib/dist/web/components/model-combobox-field.js","../../../../../project-builder-lib/dist/web/components/model-merger-result-alert.js","../../../../../project-builder-lib/dist/web/contexts/error-handler.js","../../../../../project-builder-lib/dist/web/hooks/use-blocker-dialog.js","../../../../../project-builder-lib/dist/web/hooks/use-block-dirty-form-navigate.js","../../../../../project-builder-lib/dist/web/hooks/use-block-unsaved-changes-navigate.js","../../../../../project-builder-lib/dist/web/hooks/use-definition-schema.js","../../../../../project-builder-lib/dist/web/hooks/use-error-handler.js","../../../../../project-builder-lib/dist/web/hooks/use-resettable-form.js","../../../../../project-builder-lib/dist/web/specs/admin-crud-action-web-spec.js","../../../../../project-builder-lib/dist/web/specs/admin-crud-column-web-spec.js","../../../../../project-builder-lib/dist/web/specs/admin-crud-input-web-spec.js","../../../../../project-builder-lib/dist/web/specs/model-transformer-web-spec.js","../../../../../project-builder-lib/dist/web/utils/form.js"],"sourcesContent":["import React from 'react';\nexport const ProjectDefinitionContext = React.createContext(null);\nexport function useProjectDefinition() {\n const result = React.useContext(ProjectDefinitionContext);\n if (!result) {\n throw new Error(`useProjectDefinition must be used within a <ProjectDefinitionProvider>`);\n }\n return result;\n}\n//# sourceMappingURL=use-project-definition.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { ComboboxField, useControllerMerged, } from '@baseplate-dev/ui-components';\nimport { useMemo, useState } from 'react';\nimport { FeatureUtils } from '#src/definition/index.js';\nimport { useProjectDefinition } from '../hooks/use-project-definition.js';\nfunction createCreateOption(value) {\n return {\n label: `Create \"${value}\"`,\n value,\n };\n}\nfunction FeatureComboboxField({ canCreate, value, ...rest }) {\n const { definition } = useProjectDefinition();\n const [searchQuery, setSearchQuery] = useState('');\n const featureOptions = useMemo(() => {\n const baseFeatures = definition.features.map((feature) => ({\n label: feature.name,\n value: feature.id,\n }));\n if (!canCreate)\n return baseFeatures;\n const newFeatureName = searchQuery ? searchQuery : value;\n const doesNewFeatureExist = !!baseFeatures.some((option) => option.label === newFeatureName || option.value === newFeatureName);\n return !doesNewFeatureExist &&\n newFeatureName &&\n FeatureUtils.validateFeatureName(newFeatureName)\n ? [...baseFeatures, createCreateOption(newFeatureName)]\n : baseFeatures;\n }, [definition.features, searchQuery, value, canCreate]);\n return (_jsx(ComboboxField, { placeholder: \"Select a feature\", ...rest, searchQuery: canCreate ? searchQuery : undefined, onSearchQueryChange: setSearchQuery, options: featureOptions, value: value }));\n}\nfunction FeatureComboboxFieldController({ name, control, ...rest }) {\n const { field, fieldState: { error }, } = useControllerMerged({ name, control }, rest);\n const restProps = rest;\n return (_jsx(FeatureComboboxField, { error: error?.message, ...restProps, ...field, value: field.value ?? null }));\n}\nexport { FeatureComboboxField, FeatureComboboxFieldController };\n//# sourceMappingURL=feature-combobox-field.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { ComboboxField, useControllerMerged, } from '@baseplate-dev/ui-components';\nimport { useMemo, useState } from 'react';\nimport { ModelUtils } from '#src/definition/index.js';\nimport { useProjectDefinition } from '../hooks/use-project-definition.js';\nfunction createCreateOption(value) {\n return {\n label: `Create \"${value}\"`,\n value,\n };\n}\nfunction ModelComboboxField({ canCreate, value, ...rest }) {\n const { definition } = useProjectDefinition();\n const [searchQuery, setSearchQuery] = useState('');\n const modelOptions = useMemo(() => {\n const baseModels = definition.models.map((model) => ({\n label: model.name,\n value: model.id,\n }));\n if (!canCreate)\n return baseModels;\n const newModelName = searchQuery ? searchQuery : value;\n const doesNewModelExist = !!baseModels.some((option) => option.label === newModelName || option.value === newModelName);\n return !doesNewModelExist &&\n newModelName &&\n ModelUtils.validateModelName(newModelName)\n ? [...baseModels, createCreateOption(newModelName)]\n : baseModels;\n }, [definition.models, searchQuery, value, canCreate]);\n return (_jsx(ComboboxField, { placeholder: \"Select a model\", ...rest, searchQuery: canCreate ? searchQuery : undefined, onSearchQueryChange: setSearchQuery, options: modelOptions, value: value }));\n}\nfunction ModelComboboxFieldController({ name, control, ...rest }) {\n const { field, fieldState: { error }, } = useControllerMerged({ name, control }, rest);\n const restProps = rest;\n return (_jsx(ModelComboboxField, { error: error?.message, ...restProps, ...field, value: field.value ?? null }));\n}\nexport { ModelComboboxField, ModelComboboxFieldController };\n//# sourceMappingURL=model-combobox-field.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Alert, AlertDescription, AlertTitle, } from '@baseplate-dev/ui-components';\nimport { capitalize } from 'es-toolkit';\nimport { modelMergerDefinitionDiffConfig } from '#src/tools/index.js';\nexport function ModelMergerResultAlert({ pendingModelChanges, }) {\n const changes = Object.values(pendingModelChanges).filter((change) => change !== undefined);\n if (changes.length === 0) {\n return (_jsxs(Alert, { variant: \"default\", children: [_jsx(AlertTitle, { children: \"Models Up to Date\" }), _jsx(AlertDescription, { children: \"All required models are already configured correctly. No changes needed.\" })] }));\n }\n return (_jsx(\"div\", { className: \"space-y-4\", children: changes.map((change) => (_jsxs(Alert, { variant: change.isNewModel ? 'default' : 'warning', children: [_jsxs(AlertTitle, { children: [change.isNewModel ? 'New Model' : 'Model Changes', \": \", change.name] }), _jsx(AlertDescription, { children: _jsxs(\"div\", { className: \"mt-2 space-y-2\", children: [change.isNewModel ? (_jsx(\"p\", { children: \"This is a new model that will be created with the following configuration:\" })) : (_jsx(\"p\", { children: \"The following changes will be applied to the model:\" })), _jsx(\"ul\", { className: \"list-disc pl-4 space-y-1\", children: Object.entries(change.changes).map(([key, value]) => {\n const field = modelMergerDefinitionDiffConfig[key];\n if (!field) {\n return null;\n }\n if (value?.length) {\n return (_jsxs(\"li\", { children: [value.length === 1 ? (capitalize(field.name)) : (_jsxs(_Fragment, { children: [_jsx(\"span\", { className: \"font-medium\", children: value.length }), ' ', field.name, \"(s)\"] })), ' ', \"will be \", field.getActionVerb(change.isNewModel)] }, key));\n }\n }) })] }) })] }, change.name))) }));\n}\n//# sourceMappingURL=model-merger-result-alert.js.map","import { createContext } from 'react';\nexport const ErrorHandlerContext = createContext(null);\n//# sourceMappingURL=error-handler.js.map","import { useEffect, useId } from 'react';\nimport { create } from 'zustand';\nexport const useBlockerDialogState = create((set) => ({\n activeBlockers: [],\n addBlocker: (options) => {\n set((state) => ({\n activeBlockers: [...state.activeBlockers, options],\n }));\n },\n removeBlocker: (id) => {\n set((state) => ({\n activeBlockers: state.activeBlockers.filter((blocker) => blocker.id !== id),\n }));\n },\n requestedBlockers: [],\n requestBlocker(options) {\n set((state) => ({\n requestedBlockers: [...state.requestedBlockers, options],\n }));\n },\n clearRequestedBlockers: () => {\n set(() => ({\n requestedBlockers: [],\n }));\n },\n}));\nexport function useBlockBeforeContinue() {\n const hasActiveBlockers = useBlockerDialogState((state) => state.activeBlockers.length > 0);\n const clearRequestedBlockers = useBlockerDialogState((state) => state.clearRequestedBlockers);\n // make sure we clear any blocker requests if we navigate away\n useEffect(() => () => {\n clearRequestedBlockers();\n }, [clearRequestedBlockers]);\n const requestBlocker = useBlockerDialogState((state) => state.requestBlocker);\n // if no blockers, continue immediately\n if (!hasActiveBlockers) {\n return ({ onContinue }) => {\n onContinue();\n };\n }\n return requestBlocker;\n}\nexport function useBlockerDialog(options) {\n const id = useId();\n const addBlocker = useBlockerDialogState((state) => state.addBlocker);\n const removeBlocker = useBlockerDialogState((state) => state.removeBlocker);\n useEffect(() => {\n if (options.disableBlock) {\n return;\n }\n addBlocker({\n disableBlock: options.disableBlock,\n title: options.title,\n content: options.content,\n buttonContinueWithoutSaveText: options.buttonContinueWithoutSaveText,\n onContinueWithoutSave: options.onContinueWithoutSave,\n buttonContinueText: options.buttonContinueText,\n onContinue: options.onContinue,\n id,\n });\n return () => {\n removeBlocker(id);\n };\n }, [\n addBlocker,\n removeBlocker,\n options.disableBlock,\n options.buttonContinueWithoutSaveText,\n options.onContinueWithoutSave,\n options.buttonContinueText,\n options.content,\n options.title,\n options.onContinue,\n id,\n ]);\n}\n//# sourceMappingURL=use-blocker-dialog.js.map","import { useBlockerDialog } from './use-blocker-dialog.js';\nexport function useBlockDirtyFormNavigate(formState, reset) {\n useBlockerDialog({\n disableBlock: !formState.isDirty,\n title: 'Unsaved Changes',\n content: 'You have unsaved changes. Are you sure you want to continue?',\n buttonContinueText: 'Discard Changes',\n onContinue: () => {\n reset();\n return true;\n },\n });\n}\n//# sourceMappingURL=use-block-dirty-form-navigate.js.map","import { toast } from '@baseplate-dev/ui-components';\nimport { flattenObject } from 'es-toolkit';\nimport { useEffect, useRef } from 'react';\nimport { useFormState } from 'react-hook-form';\nimport { useBlockerDialog } from './use-blocker-dialog.js';\nexport function useBlockUnsavedChangesNavigate({ control, reset, onSubmit, }) {\n const isDirtyRef = useRef(false);\n const formState = useFormState({ control });\n isDirtyRef.current = formState.isDirty;\n if (import.meta.env.DEV) {\n // eslint-disable-next-line react-hooks/rules-of-hooks -- only want to run this check in dev mode for performance/usability reasons\n useEffect(() => {\n if (Object.keys(formState.dirtyFields).length === 0 &&\n formState.isDirty) {\n // a bit of a hack to figure out what the issue is but OK since we only do this in dev mode\n const { _formValues, _defaultValues } = control;\n const formValueKeys = Object.keys(flattenObject(_formValues));\n const defaultValueKeys = Object.keys(flattenObject(_defaultValues));\n const missingKeys = formValueKeys.filter((key) => !defaultValueKeys.includes(key));\n toast.error(`Form is dirty but no fields are marked as dirty. This implies that there is likely a field ` +\n `is controlled but not set in defaultValues. This can be fixed by setting the default value to the field. ` +\n `Note: You will only see this error if you are running the app in dev mode. ` +\n `Missing fields: ${missingKeys.join(', ')}`);\n }\n }, [formState.dirtyFields, formState.isDirty, control]);\n }\n useBlockerDialog({\n disableBlock: !formState.isDirty,\n title: 'Unsaved Changes',\n content: 'You have unsaved changes. Do you want to save your changes?',\n buttonContinueWithoutSaveText: 'Discard Changes',\n onContinueWithoutSave: () => {\n reset();\n return true;\n },\n buttonContinueText: 'Save',\n onContinue: async () => {\n await onSubmit();\n // a bit of a hack to make sure we get the latest form state before continuing\n // there's not an easy way of figuring out if the submission was successful or not\n // so we wait for a React re-render and then check if the form is still dirty\n await new Promise((resolve) => setTimeout(resolve, 1));\n return !isDirtyRef.current;\n },\n });\n}\n//# sourceMappingURL=use-block-unsaved-changes-navigate.js.map","import { useMemo } from 'react';\nimport { useProjectDefinition } from './use-project-definition.js';\nexport function useDefinitionSchema(schemaCreator) {\n const { definitionSchemaParserContext } = useProjectDefinition();\n return useMemo(() => schemaCreator(definitionSchemaParserContext), [definitionSchemaParserContext, schemaCreator]);\n}\n//# sourceMappingURL=use-definition-schema.js.map","import { useContext } from 'react';\nimport { ErrorHandlerContext } from '../contexts/error-handler.js';\nexport function useErrorHandler() {\n const context = useContext(ErrorHandlerContext);\n if (!context) {\n throw new Error('useErrorHandler must be used within an ErrorHandlerContext');\n }\n return context;\n}\n//# sourceMappingURL=use-error-handler.js.map","import { toast } from '@baseplate-dev/ui-components';\nimport { isEqual } from 'es-toolkit';\nimport { useEffect, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useProjectDefinition } from './use-project-definition.js';\nexport function useResettableForm(props) {\n const formProps = useForm(props);\n const { reset, formState } = formProps;\n const { isDirty } = formState;\n const { updatedExternally } = useProjectDefinition();\n const oldValues = useRef(undefined);\n useEffect(() => {\n if (oldValues.current &&\n !isEqual(oldValues.current.oldDefaultValues, props?.defaultValues)) {\n reset(props?.defaultValues);\n if (isDirty && updatedExternally) {\n toast.warning('Contents were updated externally so form was reset!');\n }\n }\n if (!oldValues.current ||\n !isEqual(oldValues.current.oldDefaultValues, props?.defaultValues)) {\n oldValues.current = {\n oldDefaultValues: props?.defaultValues,\n };\n }\n }, [props?.defaultValues, reset, updatedExternally, isDirty]);\n return formProps;\n}\n//# sourceMappingURL=use-resettable-form.js.map","import { createPluginSpec } from '#src/plugins/spec/types.js';\nexport function createAdminCrudActionWebConfig(config) {\n return config;\n}\nexport function createAdminCrudActionWebImplementation() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const actions = new Map();\n return {\n registerActionWebConfig(action) {\n if (actions.has(action.name)) {\n throw new Error(`Admin CRUD action with name ${action.name} is already registered`);\n }\n actions.set(action.name, action);\n },\n getActionWebConfig(name, builtInActions = []) {\n const builtInAction = builtInActions.find((b) => b.name === name);\n if (builtInAction) {\n return builtInAction;\n }\n const action = actions.get(name);\n if (!action) {\n throw new Error(`Unable to find action with name ${name}`);\n }\n return action;\n },\n getActionWebConfigs(builtInActions = []) {\n return [...builtInActions, ...actions.values()];\n },\n };\n}\n/**\n * Spec for adding config component for plugin\n */\nexport const adminCrudActionWebSpec = createPluginSpec('core/admin-crud-action-web', { defaultInitializer: createAdminCrudActionWebImplementation });\n//# sourceMappingURL=admin-crud-action-web-spec.js.map","import { createPluginSpec } from '#src/plugins/spec/types.js';\nexport function createAdminCrudColumnWebConfig(config) {\n return config;\n}\nexport function createAdminCrudColumnWebImplementation() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const columns = new Map();\n return {\n registerColumnWebConfig(column) {\n if (columns.has(column.name)) {\n throw new Error(`Admin CRUD column with name ${column.name} is already registered`);\n }\n columns.set(column.name, column);\n },\n getColumnWebConfig(name, builtInColumns = []) {\n const builtInColumn = builtInColumns.find((b) => b.name === name);\n if (builtInColumn) {\n return builtInColumn;\n }\n const column = columns.get(name);\n if (!column) {\n throw new Error(`Unable to find column with name ${name}`);\n }\n return column;\n },\n getColumnWebConfigs(builtInColumns = []) {\n return [...builtInColumns, ...columns.values()];\n },\n };\n}\n/**\n * Spec for adding config component for plugin\n */\nexport const adminCrudColumnWebSpec = createPluginSpec('core/admin-crud-column-web', { defaultInitializer: createAdminCrudColumnWebImplementation });\n//# sourceMappingURL=admin-crud-column-web-spec.js.map","import { createPluginSpec } from '#src/plugins/spec/types.js';\nexport function createAdminCrudInputWebConfig(config) {\n return config;\n}\nexport function createAdminCrudInputWebImplementation() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const inputs = new Map();\n return {\n registerInputWebConfig(input) {\n if (inputs.has(input.name)) {\n throw new Error(`Admin CRUD input with name ${input.name} is already registered`);\n }\n inputs.set(input.name, input);\n },\n getInputWebConfig(name, builtInInputs = []) {\n const builtInInput = builtInInputs.find((b) => b.name === name);\n if (builtInInput) {\n return builtInInput;\n }\n const input = inputs.get(name);\n if (!input) {\n throw new Error(`Unable to find input with name ${name}`);\n }\n return input;\n },\n getInputWebConfigs(builtInInputs = []) {\n return [...builtInInputs, ...inputs.values()];\n },\n };\n}\n/**\n * Spec for adding config component for plugin\n */\nexport const adminCrudInputWebSpec = createPluginSpec('core/admin-crud-input-web', { defaultInitializer: createAdminCrudInputWebImplementation });\n//# sourceMappingURL=admin-crud-input-web-spec.js.map","import { createPluginSpec } from '#src/plugins/spec/types.js';\nexport function createNewModelTransformerWebConfig(config) {\n return config;\n}\nexport function createModelTransformerWebImplementation() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transformers = new Map();\n return {\n registerTransformerWebConfig(transformer) {\n if (transformers.has(transformer.name)) {\n throw new Error(`Model transformer with name ${transformer.name} is already registered`);\n }\n transformers.set(transformer.name, transformer);\n },\n getTransformerWebConfig(name, builtInTransformers = []) {\n const builtInTransformer = builtInTransformers.find((b) => b.name === name);\n if (builtInTransformer) {\n return builtInTransformer;\n }\n const transformer = transformers.get(name);\n if (!transformer) {\n throw new Error(`Unable to find transformer with name ${name}`);\n }\n return transformer;\n },\n getTransformerWebConfigs(builtInTransformers = []) {\n return [...builtInTransformers, ...transformers.values()];\n },\n };\n}\n/**\n * Spec for adding config component for plugin\n */\nexport const modelTransformerWebSpec = createPluginSpec('core/model-transformer-web', { defaultInitializer: createModelTransformerWebImplementation });\n//# sourceMappingURL=model-transformer-web-spec.js.map","export function setUndefinedIfEmpty(value) {\n if (value === '')\n return undefined;\n return value;\n}\n//# sourceMappingURL=form.js.map"],"names":["React","importShared","ProjectDefinitionContext","useProjectDefinition","result","ComboboxField","useControllerMerged","useMemo","useState","createCreateOption","value","FeatureComboboxField","canCreate","rest","definition","searchQuery","setSearchQuery","featureOptions","baseFeatures","feature","newFeatureName","option","FeatureUtils","_jsx","FeatureComboboxFieldController","name","control","field","error","restProps","ModelComboboxField","modelOptions","baseModels","model","newModelName","ModelUtils","ModelComboboxFieldController","Alert","AlertDescription","AlertTitle","ModelMergerResultAlert","pendingModelChanges","changes","change","_jsxs","key","modelMergerDefinitionDiffConfig","capitalize","_Fragment","createContext","ErrorHandlerContext","useEffect","useId","useBlockerDialogState","create","set","options","state","id","blocker","useBlockBeforeContinue","hasActiveBlockers","clearRequestedBlockers","requestBlocker","onContinue","useBlockerDialog","addBlocker","removeBlocker","useBlockDirtyFormNavigate","formState","reset","toast","useRef","useBlockUnsavedChangesNavigate","onSubmit","isDirtyRef","useFormState","resolve","useDefinitionSchema","schemaCreator","definitionSchemaParserContext","useContext","useErrorHandler","context","useResettableForm","props","formProps","useForm","isDirty","updatedExternally","oldValues","isEqual","createAdminCrudActionWebConfig","config","createAdminCrudActionWebImplementation","actions","action","builtInActions","builtInAction","b","adminCrudActionWebSpec","createPluginSpec","createAdminCrudColumnWebConfig","createAdminCrudColumnWebImplementation","columns","column","builtInColumns","builtInColumn","adminCrudColumnWebSpec","createAdminCrudInputWebConfig","createAdminCrudInputWebImplementation","inputs","input","builtInInputs","builtInInput","adminCrudInputWebSpec","createNewModelTransformerWebConfig","createModelTransformerWebImplementation","transformers","transformer","builtInTransformers","builtInTransformer","modelTransformerWebSpec","setUndefinedIfEmpty"],"mappings":"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"}
1
+ {"version":3,"file":"web-Db9HEBw5.js","sources":["../../../../../project-builder-lib/dist/web/hooks/use-project-definition.js","../../../../../project-builder-lib/dist/web/components/feature-combobox-field.js","../../../../../project-builder-lib/dist/web/components/model-combobox-field.js","../../../../../project-builder-lib/dist/web/components/model-merger-result-alert.js","../../../../../project-builder-lib/dist/web/contexts/error-handler.js","../../../../../project-builder-lib/dist/web/hooks/use-blocker-dialog.js","../../../../../project-builder-lib/dist/web/hooks/use-block-dirty-form-navigate.js","../../../../../project-builder-lib/dist/web/hooks/use-block-unsaved-changes-navigate.js","../../../../../project-builder-lib/dist/web/hooks/use-definition-schema.js","../../../../../project-builder-lib/dist/web/hooks/use-error-handler.js","../../../../../project-builder-lib/dist/web/hooks/use-resettable-form.js","../../../../../project-builder-lib/dist/web/specs/admin-crud-action-web-spec.js","../../../../../project-builder-lib/dist/web/specs/admin-crud-column-web-spec.js","../../../../../project-builder-lib/dist/web/specs/admin-crud-input-web-spec.js","../../../../../project-builder-lib/dist/web/specs/model-transformer-web-spec.js","../../../../../project-builder-lib/dist/web/utils/form.js"],"sourcesContent":["import React from 'react';\nexport const ProjectDefinitionContext = React.createContext(null);\nexport function useProjectDefinition() {\n const result = React.useContext(ProjectDefinitionContext);\n if (!result) {\n throw new Error(`useProjectDefinition must be used within a <ProjectDefinitionProvider>`);\n }\n return result;\n}\n//# sourceMappingURL=use-project-definition.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { ComboboxField, useControllerMerged, } from '@baseplate-dev/ui-components';\nimport { useMemo, useState } from 'react';\nimport { FeatureUtils } from '#src/definition/index.js';\nimport { useProjectDefinition } from '../hooks/use-project-definition.js';\nfunction createCreateOption(value) {\n return {\n label: `Create \"${value}\"`,\n value,\n };\n}\nfunction FeatureComboboxField({ canCreate, value, ...rest }) {\n const { definition } = useProjectDefinition();\n const [searchQuery, setSearchQuery] = useState('');\n const featureOptions = useMemo(() => {\n const baseFeatures = definition.features.map((feature) => ({\n label: feature.name,\n value: feature.id,\n }));\n if (!canCreate)\n return baseFeatures;\n const newFeatureName = searchQuery ? searchQuery : value;\n const doesNewFeatureExist = !!baseFeatures.some((option) => option.label === newFeatureName || option.value === newFeatureName);\n return !doesNewFeatureExist &&\n newFeatureName &&\n FeatureUtils.validateFeatureName(newFeatureName)\n ? [...baseFeatures, createCreateOption(newFeatureName)]\n : baseFeatures;\n }, [definition.features, searchQuery, value, canCreate]);\n return (_jsx(ComboboxField, { placeholder: \"Select a feature\", ...rest, searchQuery: canCreate ? searchQuery : undefined, onSearchQueryChange: setSearchQuery, options: featureOptions, value: value }));\n}\nfunction FeatureComboboxFieldController({ name, control, ...rest }) {\n const { field, fieldState: { error }, } = useControllerMerged({ name, control }, rest);\n const restProps = rest;\n return (_jsx(FeatureComboboxField, { error: error?.message, ...restProps, ...field, value: field.value ?? null }));\n}\nexport { FeatureComboboxField, FeatureComboboxFieldController };\n//# sourceMappingURL=feature-combobox-field.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { ComboboxField, useControllerMerged, } from '@baseplate-dev/ui-components';\nimport { useMemo, useState } from 'react';\nimport { ModelUtils } from '#src/definition/index.js';\nimport { useProjectDefinition } from '../hooks/use-project-definition.js';\nfunction createCreateOption(value) {\n return {\n label: `Create \"${value}\"`,\n value,\n };\n}\nfunction ModelComboboxField({ canCreate, value, ...rest }) {\n const { definition } = useProjectDefinition();\n const [searchQuery, setSearchQuery] = useState('');\n const modelOptions = useMemo(() => {\n const baseModels = definition.models.map((model) => ({\n label: model.name,\n value: model.id,\n }));\n if (!canCreate)\n return baseModels;\n const newModelName = searchQuery ? searchQuery : value;\n const doesNewModelExist = !!baseModels.some((option) => option.label === newModelName || option.value === newModelName);\n return !doesNewModelExist &&\n newModelName &&\n ModelUtils.validateModelName(newModelName)\n ? [...baseModels, createCreateOption(newModelName)]\n : baseModels;\n }, [definition.models, searchQuery, value, canCreate]);\n return (_jsx(ComboboxField, { placeholder: \"Select a model\", ...rest, searchQuery: canCreate ? searchQuery : undefined, onSearchQueryChange: setSearchQuery, options: modelOptions, value: value }));\n}\nfunction ModelComboboxFieldController({ name, control, ...rest }) {\n const { field, fieldState: { error }, } = useControllerMerged({ name, control }, rest);\n const restProps = rest;\n return (_jsx(ModelComboboxField, { error: error?.message, ...restProps, ...field, value: field.value ?? null }));\n}\nexport { ModelComboboxField, ModelComboboxFieldController };\n//# sourceMappingURL=model-combobox-field.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Alert, AlertDescription, AlertTitle, } from '@baseplate-dev/ui-components';\nimport { capitalize } from 'es-toolkit';\nimport { modelMergerDefinitionDiffConfig } from '#src/tools/index.js';\nexport function ModelMergerResultAlert({ pendingModelChanges, }) {\n const changes = Object.values(pendingModelChanges).filter((change) => change !== undefined);\n if (changes.length === 0) {\n return (_jsxs(Alert, { variant: \"default\", children: [_jsx(AlertTitle, { children: \"Models Up to Date\" }), _jsx(AlertDescription, { children: \"All required models are already configured correctly. No changes needed.\" })] }));\n }\n return (_jsx(\"div\", { className: \"space-y-4\", children: changes.map((change) => (_jsxs(Alert, { variant: change.isNewModel ? 'default' : 'warning', children: [_jsxs(AlertTitle, { children: [change.isNewModel ? 'New Model' : 'Model Changes', \": \", change.name] }), _jsx(AlertDescription, { children: _jsxs(\"div\", { className: \"mt-2 space-y-2\", children: [change.isNewModel ? (_jsx(\"p\", { children: \"This is a new model that will be created with the following configuration:\" })) : (_jsx(\"p\", { children: \"The following changes will be applied to the model:\" })), _jsx(\"ul\", { className: \"list-disc pl-4 space-y-1\", children: Object.entries(change.changes).map(([key, value]) => {\n const field = modelMergerDefinitionDiffConfig[key];\n if (!field) {\n return null;\n }\n if (value?.length) {\n return (_jsxs(\"li\", { children: [value.length === 1 ? (capitalize(field.name)) : (_jsxs(_Fragment, { children: [_jsx(\"span\", { className: \"font-medium\", children: value.length }), ' ', field.name, \"(s)\"] })), ' ', \"will be \", field.getActionVerb(change.isNewModel)] }, key));\n }\n }) })] }) })] }, change.name))) }));\n}\n//# sourceMappingURL=model-merger-result-alert.js.map","import { createContext } from 'react';\nexport const ErrorHandlerContext = createContext(null);\n//# sourceMappingURL=error-handler.js.map","import { useEffect, useId } from 'react';\nimport { create } from 'zustand';\nexport const useBlockerDialogState = create((set) => ({\n activeBlockers: [],\n addBlocker: (options) => {\n set((state) => ({\n activeBlockers: [...state.activeBlockers, options],\n }));\n },\n removeBlocker: (id) => {\n set((state) => ({\n activeBlockers: state.activeBlockers.filter((blocker) => blocker.id !== id),\n }));\n },\n requestedBlockers: [],\n requestBlocker(options) {\n set((state) => ({\n requestedBlockers: [...state.requestedBlockers, options],\n }));\n },\n clearRequestedBlockers: () => {\n set(() => ({\n requestedBlockers: [],\n }));\n },\n}));\nexport function useBlockBeforeContinue() {\n const hasActiveBlockers = useBlockerDialogState((state) => state.activeBlockers.length > 0);\n const clearRequestedBlockers = useBlockerDialogState((state) => state.clearRequestedBlockers);\n // make sure we clear any blocker requests if we navigate away\n useEffect(() => () => {\n clearRequestedBlockers();\n }, [clearRequestedBlockers]);\n const requestBlocker = useBlockerDialogState((state) => state.requestBlocker);\n // if no blockers, continue immediately\n if (!hasActiveBlockers) {\n return ({ onContinue }) => {\n onContinue();\n };\n }\n return requestBlocker;\n}\nexport function useBlockerDialog(options) {\n const id = useId();\n const addBlocker = useBlockerDialogState((state) => state.addBlocker);\n const removeBlocker = useBlockerDialogState((state) => state.removeBlocker);\n useEffect(() => {\n if (options.disableBlock) {\n return;\n }\n addBlocker({\n disableBlock: options.disableBlock,\n title: options.title,\n content: options.content,\n buttonContinueWithoutSaveText: options.buttonContinueWithoutSaveText,\n onContinueWithoutSave: options.onContinueWithoutSave,\n buttonContinueText: options.buttonContinueText,\n onContinue: options.onContinue,\n id,\n });\n return () => {\n removeBlocker(id);\n };\n }, [\n addBlocker,\n removeBlocker,\n options.disableBlock,\n options.buttonContinueWithoutSaveText,\n options.onContinueWithoutSave,\n options.buttonContinueText,\n options.content,\n options.title,\n options.onContinue,\n id,\n ]);\n}\n//# sourceMappingURL=use-blocker-dialog.js.map","import { useBlockerDialog } from './use-blocker-dialog.js';\nexport function useBlockDirtyFormNavigate(formState, reset) {\n useBlockerDialog({\n disableBlock: !formState.isDirty,\n title: 'Unsaved Changes',\n content: 'You have unsaved changes. Are you sure you want to continue?',\n buttonContinueText: 'Discard Changes',\n onContinue: () => {\n reset();\n return true;\n },\n });\n}\n//# sourceMappingURL=use-block-dirty-form-navigate.js.map","import { toast } from '@baseplate-dev/ui-components';\nimport { flattenObject } from 'es-toolkit';\nimport { useEffect, useRef } from 'react';\nimport { useFormState } from 'react-hook-form';\nimport { useBlockerDialog } from './use-blocker-dialog.js';\nexport function useBlockUnsavedChangesNavigate({ control, reset, onSubmit, }) {\n const isDirtyRef = useRef(false);\n const formState = useFormState({ control });\n isDirtyRef.current = formState.isDirty;\n if (import.meta.env.DEV) {\n // eslint-disable-next-line react-hooks/rules-of-hooks -- only want to run this check in dev mode for performance/usability reasons\n useEffect(() => {\n if (Object.keys(formState.dirtyFields).length === 0 &&\n formState.isDirty) {\n // a bit of a hack to figure out what the issue is but OK since we only do this in dev mode\n const { _formValues, _defaultValues } = control;\n const formValueKeys = Object.keys(flattenObject(_formValues));\n const defaultValueKeys = Object.keys(flattenObject(_defaultValues));\n const missingKeys = formValueKeys.filter((key) => !defaultValueKeys.includes(key));\n toast.error(`Form is dirty but no fields are marked as dirty. This implies that there is likely a field ` +\n `is controlled but not set in defaultValues. This can be fixed by setting the default value to the field. ` +\n `Note: You will only see this error if you are running the app in dev mode. ` +\n `Missing fields: ${missingKeys.join(', ')}`);\n }\n }, [formState.dirtyFields, formState.isDirty, control]);\n }\n useBlockerDialog({\n disableBlock: !formState.isDirty,\n title: 'Unsaved Changes',\n content: 'You have unsaved changes. Do you want to save your changes?',\n buttonContinueWithoutSaveText: 'Discard Changes',\n onContinueWithoutSave: () => {\n reset();\n return true;\n },\n buttonContinueText: 'Save',\n onContinue: async () => {\n await onSubmit();\n // a bit of a hack to make sure we get the latest form state before continuing\n // there's not an easy way of figuring out if the submission was successful or not\n // so we wait for a React re-render and then check if the form is still dirty\n await new Promise((resolve) => setTimeout(resolve, 1));\n return !isDirtyRef.current;\n },\n });\n}\n//# sourceMappingURL=use-block-unsaved-changes-navigate.js.map","import { useMemo } from 'react';\nimport { useProjectDefinition } from './use-project-definition.js';\nexport function useDefinitionSchema(schemaCreator) {\n const { definitionSchemaParserContext } = useProjectDefinition();\n return useMemo(() => schemaCreator(definitionSchemaParserContext), [definitionSchemaParserContext, schemaCreator]);\n}\n//# sourceMappingURL=use-definition-schema.js.map","import { useContext } from 'react';\nimport { ErrorHandlerContext } from '../contexts/error-handler.js';\nexport function useErrorHandler() {\n const context = useContext(ErrorHandlerContext);\n if (!context) {\n throw new Error('useErrorHandler must be used within an ErrorHandlerContext');\n }\n return context;\n}\n//# sourceMappingURL=use-error-handler.js.map","import { toast } from '@baseplate-dev/ui-components';\nimport { isEqual } from 'es-toolkit';\nimport { useEffect, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useProjectDefinition } from './use-project-definition.js';\nexport function useResettableForm(props) {\n const formProps = useForm(props);\n const { reset, formState } = formProps;\n const { isDirty } = formState;\n const { updatedExternally } = useProjectDefinition();\n const oldValues = useRef(undefined);\n useEffect(() => {\n if (oldValues.current &&\n !isEqual(oldValues.current.oldDefaultValues, props?.defaultValues)) {\n reset(props?.defaultValues);\n if (isDirty && updatedExternally) {\n toast.warning('Contents were updated externally so form was reset!');\n }\n }\n if (!oldValues.current ||\n !isEqual(oldValues.current.oldDefaultValues, props?.defaultValues)) {\n oldValues.current = {\n oldDefaultValues: props?.defaultValues,\n };\n }\n }, [props?.defaultValues, reset, updatedExternally, isDirty]);\n return formProps;\n}\n//# sourceMappingURL=use-resettable-form.js.map","import { createPluginSpec } from '#src/plugins/spec/types.js';\nexport function createAdminCrudActionWebConfig(config) {\n return config;\n}\nexport function createAdminCrudActionWebImplementation() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const actions = new Map();\n return {\n registerActionWebConfig(action) {\n if (actions.has(action.name)) {\n throw new Error(`Admin CRUD action with name ${action.name} is already registered`);\n }\n actions.set(action.name, action);\n },\n getActionWebConfig(name, builtInActions = []) {\n const builtInAction = builtInActions.find((b) => b.name === name);\n if (builtInAction) {\n return builtInAction;\n }\n const action = actions.get(name);\n if (!action) {\n throw new Error(`Unable to find action with name ${name}`);\n }\n return action;\n },\n getActionWebConfigs(builtInActions = []) {\n return [...builtInActions, ...actions.values()];\n },\n };\n}\n/**\n * Spec for adding config component for plugin\n */\nexport const adminCrudActionWebSpec = createPluginSpec('core/admin-crud-action-web', { defaultInitializer: createAdminCrudActionWebImplementation });\n//# sourceMappingURL=admin-crud-action-web-spec.js.map","import { createPluginSpec } from '#src/plugins/spec/types.js';\nexport function createAdminCrudColumnWebConfig(config) {\n return config;\n}\nexport function createAdminCrudColumnWebImplementation() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const columns = new Map();\n return {\n registerColumnWebConfig(column) {\n if (columns.has(column.name)) {\n throw new Error(`Admin CRUD column with name ${column.name} is already registered`);\n }\n columns.set(column.name, column);\n },\n getColumnWebConfig(name, builtInColumns = []) {\n const builtInColumn = builtInColumns.find((b) => b.name === name);\n if (builtInColumn) {\n return builtInColumn;\n }\n const column = columns.get(name);\n if (!column) {\n throw new Error(`Unable to find column with name ${name}`);\n }\n return column;\n },\n getColumnWebConfigs(builtInColumns = []) {\n return [...builtInColumns, ...columns.values()];\n },\n };\n}\n/**\n * Spec for adding config component for plugin\n */\nexport const adminCrudColumnWebSpec = createPluginSpec('core/admin-crud-column-web', { defaultInitializer: createAdminCrudColumnWebImplementation });\n//# sourceMappingURL=admin-crud-column-web-spec.js.map","import { createPluginSpec } from '#src/plugins/spec/types.js';\nexport function createAdminCrudInputWebConfig(config) {\n return config;\n}\nexport function createAdminCrudInputWebImplementation() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const inputs = new Map();\n return {\n registerInputWebConfig(input) {\n if (inputs.has(input.name)) {\n throw new Error(`Admin CRUD input with name ${input.name} is already registered`);\n }\n inputs.set(input.name, input);\n },\n getInputWebConfig(name, builtInInputs = []) {\n const builtInInput = builtInInputs.find((b) => b.name === name);\n if (builtInInput) {\n return builtInInput;\n }\n const input = inputs.get(name);\n if (!input) {\n throw new Error(`Unable to find input with name ${name}`);\n }\n return input;\n },\n getInputWebConfigs(builtInInputs = []) {\n return [...builtInInputs, ...inputs.values()];\n },\n };\n}\n/**\n * Spec for adding config component for plugin\n */\nexport const adminCrudInputWebSpec = createPluginSpec('core/admin-crud-input-web', { defaultInitializer: createAdminCrudInputWebImplementation });\n//# sourceMappingURL=admin-crud-input-web-spec.js.map","import { createPluginSpec } from '#src/plugins/spec/types.js';\nexport function createNewModelTransformerWebConfig(config) {\n return config;\n}\nexport function createModelTransformerWebImplementation() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transformers = new Map();\n return {\n registerTransformerWebConfig(transformer) {\n if (transformers.has(transformer.name)) {\n throw new Error(`Model transformer with name ${transformer.name} is already registered`);\n }\n transformers.set(transformer.name, transformer);\n },\n getTransformerWebConfig(name, builtInTransformers = []) {\n const builtInTransformer = builtInTransformers.find((b) => b.name === name);\n if (builtInTransformer) {\n return builtInTransformer;\n }\n const transformer = transformers.get(name);\n if (!transformer) {\n throw new Error(`Unable to find transformer with name ${name}`);\n }\n return transformer;\n },\n getTransformerWebConfigs(builtInTransformers = []) {\n return [...builtInTransformers, ...transformers.values()];\n },\n };\n}\n/**\n * Spec for adding config component for plugin\n */\nexport const modelTransformerWebSpec = createPluginSpec('core/model-transformer-web', { defaultInitializer: createModelTransformerWebImplementation });\n//# sourceMappingURL=model-transformer-web-spec.js.map","export function setUndefinedIfEmpty(value) {\n if (value === '')\n return undefined;\n return value;\n}\n//# sourceMappingURL=form.js.map"],"names":["React","importShared","ProjectDefinitionContext","useProjectDefinition","result","ComboboxField","useControllerMerged","useMemo","useState","createCreateOption","value","FeatureComboboxField","canCreate","rest","definition","searchQuery","setSearchQuery","featureOptions","baseFeatures","feature","newFeatureName","option","FeatureUtils","_jsx","FeatureComboboxFieldController","name","control","field","error","restProps","ModelComboboxField","modelOptions","baseModels","model","newModelName","ModelUtils","ModelComboboxFieldController","Alert","AlertDescription","AlertTitle","ModelMergerResultAlert","pendingModelChanges","changes","change","_jsxs","key","modelMergerDefinitionDiffConfig","capitalize","_Fragment","createContext","ErrorHandlerContext","useEffect","useId","useBlockerDialogState","create","set","options","state","id","blocker","useBlockBeforeContinue","hasActiveBlockers","clearRequestedBlockers","requestBlocker","onContinue","useBlockerDialog","addBlocker","removeBlocker","useBlockDirtyFormNavigate","formState","reset","toast","useRef","useBlockUnsavedChangesNavigate","onSubmit","isDirtyRef","useFormState","resolve","useDefinitionSchema","schemaCreator","definitionSchemaParserContext","useContext","useErrorHandler","context","useResettableForm","props","formProps","useForm","isDirty","updatedExternally","oldValues","isEqual","createAdminCrudActionWebConfig","config","createAdminCrudActionWebImplementation","actions","action","builtInActions","builtInAction","b","adminCrudActionWebSpec","createPluginSpec","createAdminCrudColumnWebConfig","createAdminCrudColumnWebImplementation","columns","column","builtInColumns","builtInColumn","adminCrudColumnWebSpec","createAdminCrudInputWebConfig","createAdminCrudInputWebImplementation","inputs","input","builtInInputs","builtInInput","adminCrudInputWebSpec","createNewModelTransformerWebConfig","createModelTransformerWebImplementation","transformers","transformer","builtInTransformers","builtInTransformer","modelTransformerWebSpec","setUndefinedIfEmpty"],"mappings":"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"}