@powerhousedao/powerhouse-vetra-packages 6.1.0-dev.13 → 6.1.0-dev.14

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 (113) hide show
  1. package/dist/browser/{dist-B8tyEIWi.js → connect-ckOseWgG.js} +13013 -10302
  2. package/dist/browser/connect-ckOseWgG.js.map +1 -0
  3. package/dist/browser/{dist-ChI1zXde.js → dist-C9Ow--KB.js} +33 -5
  4. package/dist/browser/dist-C9Ow--KB.js.map +1 -0
  5. package/dist/browser/{schemas-Bqem6NRm.js → dist-CXoKspdx.js} +131 -2
  6. package/dist/browser/dist-CXoKspdx.js.map +1 -0
  7. package/dist/browser/dist-D4G02wBe.js +3697 -0
  8. package/dist/browser/dist-D4G02wBe.js.map +1 -0
  9. package/dist/browser/dist-D8H48e8N.js +2692 -0
  10. package/dist/browser/dist-D8H48e8N.js.map +1 -0
  11. package/dist/browser/{document-drive--g-2OCk1.js → document-drive-IhuxqaLT.js} +2 -3
  12. package/dist/browser/{document-drive--g-2OCk1.js.map → document-drive-IhuxqaLT.js.map} +1 -1
  13. package/dist/browser/document-models/index.js +1 -1
  14. package/dist/browser/{documents-Bpu0aSLb.js → documents-D4ek7Ubv.js} +3 -3
  15. package/dist/browser/{documents-Bpu0aSLb.js.map → documents-D4ek7Ubv.js.map} +1 -1
  16. package/dist/browser/{editor-UIbR77MI.js → editor-BSN23bV2.js} +5 -5
  17. package/dist/browser/{editor-UIbR77MI.js.map → editor-BSN23bV2.js.map} +1 -1
  18. package/dist/browser/{editor-BeXw0WYk.js → editor-CpJRVFiB.js} +26 -26
  19. package/dist/browser/editor-CpJRVFiB.js.map +1 -0
  20. package/dist/browser/editors/document-model-editor/module.js +1 -1
  21. package/dist/browser/editors/generic-drive-explorer/index.js +6 -6
  22. package/dist/browser/editors/generic-drive-explorer/index.js.map +1 -1
  23. package/dist/browser/editors/generic-drive-explorer/module.js +1 -1
  24. package/dist/{node/folder-view-BhJWrtU4.mjs → browser/folder-view-CS1_ekOG.js} +13 -12
  25. package/dist/browser/folder-view-CS1_ekOG.js.map +1 -0
  26. package/dist/browser/{graphql-editor-Djox2qqh.js → graphql-editor-BOgehAkq.js} +15 -7
  27. package/dist/browser/{graphql-editor-Djox2qqh.js.map → graphql-editor-BOgehAkq.js.map} +1 -1
  28. package/dist/{node/hooks-Lbsf6g-v.mjs → browser/hooks-CORHBNHb.js} +6 -4
  29. package/dist/browser/{hooks-Beny0xpe.js.map → hooks-CORHBNHb.js.map} +1 -1
  30. package/dist/browser/index.js +2 -2
  31. package/dist/{node/json-editor-CVGgDVh2.mjs → browser/json-editor-DT49sk3v.js} +12 -4
  32. package/dist/browser/json-editor-DT49sk3v.js.map +1 -0
  33. package/dist/browser/{style-D4P9J6ZR.js → linting-Dn6pXRkK.js} +6 -13
  34. package/dist/browser/linting-Dn6pXRkK.js.map +1 -0
  35. package/dist/browser/{parser-B0sh99Kk.js → parser-CkF6Qt8V.js} +1 -1
  36. package/dist/browser/{parser-B0sh99Kk.js.map → parser-CkF6Qt8V.js.map} +1 -1
  37. package/dist/browser/{schema-context-DeMVEHA-.js → schema-context-DY-GEGnY.js} +3 -3
  38. package/dist/browser/{schema-context-DeMVEHA-.js.map → schema-context-DY-GEGnY.js.map} +1 -1
  39. package/dist/browser/state-schemas-BPJeLaiX.js +308 -0
  40. package/dist/browser/state-schemas-BPJeLaiX.js.map +1 -0
  41. package/dist/node/{dist-BSjsG8Nj.mjs → connect-D4CGu14p.mjs} +13953 -11229
  42. package/dist/node/connect-D4CGu14p.mjs.map +1 -0
  43. package/dist/node/dist-BDVKhztG.mjs +3698 -0
  44. package/dist/node/dist-BDVKhztG.mjs.map +1 -0
  45. package/dist/node/dist-BeZaEP6S.mjs +2692 -0
  46. package/dist/node/dist-BeZaEP6S.mjs.map +1 -0
  47. package/dist/node/{tslib.es6-DwVpIYUS.mjs → dist-Besf94gn.mjs} +489 -3
  48. package/dist/node/dist-Besf94gn.mjs.map +1 -0
  49. package/dist/node/{schemas-Cb8uEF9u.mjs → dist-fA4EItr0.mjs} +131 -2
  50. package/dist/node/dist-fA4EItr0.mjs.map +1 -0
  51. package/dist/node/{document-drive-Acj7iLzN.mjs → document-drive-B8_jrsed.mjs} +2 -3
  52. package/dist/node/{document-drive-Acj7iLzN.mjs.map → document-drive-B8_jrsed.mjs.map} +1 -1
  53. package/dist/node/document-models/index.mjs +1 -1
  54. package/dist/node/{documents-BWJpUm9f.mjs → documents-BFBPmyw1.mjs} +3 -3
  55. package/dist/node/{documents-BWJpUm9f.mjs.map → documents-BFBPmyw1.mjs.map} +1 -1
  56. package/dist/node/{editor-BlOyBVcQ.mjs → editor-CLtUrC5M.mjs} +5 -5
  57. package/dist/node/{editor-BlOyBVcQ.mjs.map → editor-CLtUrC5M.mjs.map} +1 -1
  58. package/dist/node/{editor-FO0q8Fzb.mjs → editor-hBrO1EFO.mjs} +26 -26
  59. package/dist/node/editor-hBrO1EFO.mjs.map +1 -0
  60. package/dist/node/editors/document-model-editor/module.mjs +1 -1
  61. package/dist/node/editors/generic-drive-explorer/index.mjs +6 -6
  62. package/dist/node/editors/generic-drive-explorer/index.mjs.map +1 -1
  63. package/dist/node/editors/generic-drive-explorer/module.mjs +1 -1
  64. package/dist/{browser/folder-view-D3dHD0mS.js → node/folder-view-EkiWShHX.mjs} +13 -12
  65. package/dist/node/folder-view-EkiWShHX.mjs.map +1 -0
  66. package/dist/node/{graphql-Du2phcBf.mjs → graphql-DskHmkMe.mjs} +2 -2
  67. package/dist/node/{graphql-Du2phcBf.mjs.map → graphql-DskHmkMe.mjs.map} +1 -1
  68. package/dist/node/{graphql-editor-CvDfPfYy.mjs → graphql-editor-CguODwLN.mjs} +14 -6
  69. package/dist/node/{graphql-editor-CvDfPfYy.mjs.map → graphql-editor-CguODwLN.mjs.map} +1 -1
  70. package/dist/{browser/hooks-Beny0xpe.js → node/hooks-DJrjfVaS.mjs} +6 -4
  71. package/dist/node/{hooks-Lbsf6g-v.mjs.map → hooks-DJrjfVaS.mjs.map} +1 -1
  72. package/dist/node/index.mjs +2 -2
  73. package/dist/{browser/json-editor-h3cffF6X.js → node/json-editor-BsqJRyZr.mjs} +12 -4
  74. package/dist/node/json-editor-BsqJRyZr.mjs.map +1 -0
  75. package/dist/node/{style-C449avuc.mjs → linting-Dx50GuLN.mjs} +6 -13
  76. package/dist/node/linting-Dx50GuLN.mjs.map +1 -0
  77. package/dist/node/{schema-context-BlHpyf8E.mjs → schema-context-CX5ml_9t.mjs} +3 -3
  78. package/dist/node/{schema-context-BlHpyf8E.mjs.map → schema-context-CX5ml_9t.mjs.map} +1 -1
  79. package/dist/node/state-schemas-IFtqLFoH.mjs +309 -0
  80. package/dist/node/state-schemas-IFtqLFoH.mjs.map +1 -0
  81. package/package.json +10 -10
  82. package/style.css +1 -0
  83. package/dist/browser/connect-BwaW_k7P.js +0 -9460
  84. package/dist/browser/connect-BwaW_k7P.js.map +0 -1
  85. package/dist/browser/dist-B8tyEIWi.js.map +0 -1
  86. package/dist/browser/dist-BXygvBtd.js +0 -132
  87. package/dist/browser/dist-BXygvBtd.js.map +0 -1
  88. package/dist/browser/dist-ChI1zXde.js.map +0 -1
  89. package/dist/browser/editor-BeXw0WYk.js.map +0 -1
  90. package/dist/browser/folder-view-D3dHD0mS.js.map +0 -1
  91. package/dist/browser/json-editor-h3cffF6X.js.map +0 -1
  92. package/dist/browser/schemas-Bqem6NRm.js.map +0 -1
  93. package/dist/browser/state-schemas-hDzujS2Q.js +0 -674
  94. package/dist/browser/state-schemas-hDzujS2Q.js.map +0 -1
  95. package/dist/browser/style-D4P9J6ZR.js.map +0 -1
  96. package/dist/browser/tslib.es6-DRuVAsR8.js +0 -32
  97. package/dist/browser/tslib.es6-DRuVAsR8.js.map +0 -1
  98. package/dist/node/connect-BSo6_nlg.mjs +0 -9475
  99. package/dist/node/connect-BSo6_nlg.mjs.map +0 -1
  100. package/dist/node/dist-BQTIepWC.mjs +0 -132
  101. package/dist/node/dist-BQTIepWC.mjs.map +0 -1
  102. package/dist/node/dist-BSjsG8Nj.mjs.map +0 -1
  103. package/dist/node/dist-L7KTJFj9.mjs +0 -491
  104. package/dist/node/dist-L7KTJFj9.mjs.map +0 -1
  105. package/dist/node/editor-FO0q8Fzb.mjs.map +0 -1
  106. package/dist/node/folder-view-BhJWrtU4.mjs.map +0 -1
  107. package/dist/node/json-editor-CVGgDVh2.mjs.map +0 -1
  108. package/dist/node/schemas-Cb8uEF9u.mjs.map +0 -1
  109. package/dist/node/state-schemas-BUmvotrJ.mjs +0 -675
  110. package/dist/node/state-schemas-BUmvotrJ.mjs.map +0 -1
  111. package/dist/node/style-C449avuc.mjs.map +0 -1
  112. package/dist/node/tslib.es6-DwVpIYUS.mjs.map +0 -1
  113. package/dist/style.css +0 -906
@@ -1,5 +1,5 @@
1
- import { r as driveDocumentModelModule, u as documentModelDocumentModelModule } from "./document-drive-Acj7iLzN.mjs";
2
- import { t as reactorDriveDocumentModelModule } from "./dist-L7KTJFj9.mjs";
1
+ import { r as driveDocumentModelModule, u as documentModelDocumentModelModule } from "./document-drive-B8_jrsed.mjs";
2
+ import { t as reactorDriveDocumentModelModule } from "./dist-Besf94gn.mjs";
3
3
  import { DocumentModelEditor } from "./editors/document-model-editor/module.mjs";
4
4
  import { GenericDriveExplorer } from "./editors/generic-drive-explorer/module.mjs";
5
5
  //#region powerhouse.manifest.json
@@ -1,5 +1,7 @@
1
- import { C as EditorView, E as EditorState, S as linter, _ as indentNodeProp, a as makeFocusHandler, b as LRParser, c as baseEditorExtensions, d as LRLanguage, f as LanguageSupport, g as foldNodeProp, h as foldInside, i as useHandlerReconfiguration, l as baseKeymap, n as useEditorCleanup, o as makePasteHandler, p as continuedIndent, r as useEditorRefs, s as makeUpdateHandler, t as useDocumentSync, u as ayuLight, v as styleTags, w as keymap, x as forceLinting, y as tags } from "./hooks-Beny0xpe.js";
2
- import { memo, useEffect } from "react";
1
+ import "./document-drive-B8_jrsed.mjs";
2
+ import { D as useTheme } from "./dist-BDVKhztG.mjs";
3
+ import { C as linter, D as EditorState, E as Compartment, S as forceLinting, T as keymap, _ as foldNodeProp, a as makeFocusHandler, b as tags, c as baseEditorExtensions, d as ayuLight, f as LRLanguage, g as foldInside, i as useHandlerReconfiguration, l as baseKeymap, m as continuedIndent, n as useEditorCleanup, o as makePasteHandler, p as LanguageSupport, r as useEditorRefs, s as makeUpdateHandler, t as useDocumentSync, u as dracula, v as indentNodeProp, w as EditorView, x as LRParser, y as styleTags } from "./hooks-DJrjfVaS.mjs";
4
+ import { memo, useEffect, useRef } from "react";
3
5
  import { jsx } from "react/jsx-runtime";
4
6
  //#region ../../node_modules/.pnpm/@lezer+json@1.0.3/node_modules/@lezer/json/dist/index.js
5
7
  const jsonHighlighting = styleTags({
@@ -108,6 +110,8 @@ function json() {
108
110
  const JSONEditor = memo(function JSONEditor(props) {
109
111
  const { doc, readonly = false, updateDocumentInModel } = props;
110
112
  const { editorRef, viewRef, updateListenerCompartment, focusHandlerCompartment, pasteHandlerCompartment, timeoutRef } = useEditorRefs();
113
+ const { theme } = useTheme();
114
+ const themeCompartment = useRef(new Compartment());
111
115
  useEffect(() => {
112
116
  if (!viewRef.current) {
113
117
  viewRef.current = new EditorView({
@@ -116,7 +120,7 @@ const JSONEditor = memo(function JSONEditor(props) {
116
120
  extensions: [
117
121
  ...baseEditorExtensions,
118
122
  keymap.of(baseKeymap),
119
- ayuLight,
123
+ themeCompartment.current.of(theme === "light" ? ayuLight : dracula),
120
124
  jsonLanguage,
121
125
  json(),
122
126
  linter(jsonParseLinter()),
@@ -131,6 +135,10 @@ const JSONEditor = memo(function JSONEditor(props) {
131
135
  forceLinting(viewRef.current);
132
136
  }
133
137
  }, []);
138
+ useEffect(() => {
139
+ if (!viewRef.current) return;
140
+ viewRef.current.dispatch({ effects: themeCompartment.current.reconfigure(theme === "light" ? ayuLight : dracula) });
141
+ }, [theme]);
134
142
  useEditorCleanup(viewRef);
135
143
  useHandlerReconfiguration(viewRef.current, readonly, timeoutRef, updateDocumentInModel, {
136
144
  updateListener: updateListenerCompartment.current,
@@ -143,4 +151,4 @@ const JSONEditor = memo(function JSONEditor(props) {
143
151
  //#endregion
144
152
  export { JSONEditor as default };
145
153
 
146
- //# sourceMappingURL=json-editor-h3cffF6X.js.map
154
+ //# sourceMappingURL=json-editor-BsqJRyZr.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-editor-BsqJRyZr.mjs","names":[],"sources":["../../../../node_modules/.pnpm/@lezer+json@1.0.3/node_modules/@lezer/json/dist/index.js","../../../../node_modules/.pnpm/@codemirror+lang-json@6.0.1/node_modules/@codemirror/lang-json/dist/index.js","../../editors/document-model-editor/components/code-editors/json-editor.tsx"],"sourcesContent":["import { LRParser } from '@lezer/lr';\nimport { styleTags, tags } from '@lezer/highlight';\n\nconst jsonHighlighting = styleTags({\n String: tags.string,\n Number: tags.number,\n \"True False\": tags.bool,\n PropertyName: tags.propertyName,\n Null: tags.null,\n \", :\": tags.separator,\n \"[ ]\": tags.squareBracket,\n \"{ }\": tags.brace\n});\n\n// This file was generated by lezer-generator. You probably shouldn't edit it.\nconst parser = LRParser.deserialize({\n version: 14,\n states: \"$bOVQPOOOOQO'#Cb'#CbOnQPO'#CeOvQPO'#ClOOQO'#Cr'#CrQOQPOOOOQO'#Cg'#CgO}QPO'#CfO!SQPO'#CtOOQO,59P,59PO![QPO,59PO!aQPO'#CuOOQO,59W,59WO!iQPO,59WOVQPO,59QOqQPO'#CmO!nQPO,59`OOQO1G.k1G.kOVQPO'#CnO!vQPO,59aOOQO1G.r1G.rOOQO1G.l1G.lOOQO,59X,59XOOQO-E6k-E6kOOQO,59Y,59YOOQO-E6l-E6l\",\n stateData: \"#O~OeOS~OQSORSOSSOTSOWQO_ROgPO~OVXOgUO~O^[O~PVO[^O~O]_OVhX~OVaO~O]bO^iX~O^dO~O]_OVha~O]bO^ia~O\",\n goto: \"!kjPPPPPPkPPkqwPPPPk{!RPPP!XP!e!hXSOR^bQWQRf_TVQ_Q`WRg`QcZRicQTOQZRQe^RhbRYQR]R\",\n nodeNames: \"⚠ JsonText True False Null Number String } { Object Property PropertyName : , ] [ Array\",\n maxTerm: 25,\n nodeProps: [\n [\"isolate\", -2,6,11,\"\"],\n [\"openedBy\", 7,\"{\",14,\"[\"],\n [\"closedBy\", 8,\"}\",15,\"]\"]\n ],\n propSources: [jsonHighlighting],\n skippedNodes: [0],\n repeatNodeCount: 2,\n tokenData: \"(|~RaXY!WYZ!W]^!Wpq!Wrs!]|}$u}!O$z!Q!R%T!R![&c![!]&t!}#O&y#P#Q'O#Y#Z'T#b#c'r#h#i(Z#o#p(r#q#r(w~!]Oe~~!`Wpq!]qr!]rs!xs#O!]#O#P!}#P;'S!];'S;=`$o<%lO!]~!}Og~~#QXrs!]!P!Q!]#O#P!]#U#V!]#Y#Z!]#b#c!]#f#g!]#h#i!]#i#j#m~#pR!Q![#y!c!i#y#T#Z#y~#|R!Q![$V!c!i$V#T#Z$V~$YR!Q![$c!c!i$c#T#Z$c~$fR!Q![!]!c!i!]#T#Z!]~$rP;=`<%l!]~$zO]~~$}Q!Q!R%T!R![&c~%YRT~!O!P%c!g!h%w#X#Y%w~%fP!Q![%i~%nRT~!Q![%i!g!h%w#X#Y%w~%zR{|&T}!O&T!Q![&Z~&WP!Q![&Z~&`PT~!Q![&Z~&hST~!O!P%c!Q![&c!g!h%w#X#Y%w~&yO[~~'OO_~~'TO^~~'WP#T#U'Z~'^P#`#a'a~'dP#g#h'g~'jP#X#Y'm~'rOR~~'uP#i#j'x~'{P#`#a(O~(RP#`#a(U~(ZOS~~(^P#f#g(a~(dP#i#j(g~(jP#X#Y(m~(rOQ~~(wOW~~(|OV~\",\n tokenizers: [0],\n topRules: {\"JsonText\":[0,1]},\n tokenPrec: 0\n});\n\nexport { parser };\n","import { parser } from '@lezer/json';\nimport { LRLanguage, indentNodeProp, continuedIndent, foldNodeProp, foldInside, LanguageSupport } from '@codemirror/language';\n\n/**\nCalls\n[`JSON.parse`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse)\non the document and, if that throws an error, reports it as a\nsingle diagnostic.\n*/\nconst jsonParseLinter = () => (view) => {\n try {\n JSON.parse(view.state.doc.toString());\n }\n catch (e) {\n if (!(e instanceof SyntaxError))\n throw e;\n const pos = getErrorPosition(e, view.state.doc);\n return [{\n from: pos,\n message: e.message,\n severity: 'error',\n to: pos\n }];\n }\n return [];\n};\nfunction getErrorPosition(error, doc) {\n let m;\n if (m = error.message.match(/at position (\\d+)/))\n return Math.min(+m[1], doc.length);\n if (m = error.message.match(/at line (\\d+) column (\\d+)/))\n return Math.min(doc.line(+m[1]).from + (+m[2]) - 1, doc.length);\n return 0;\n}\n\n/**\nA language provider that provides JSON parsing.\n*/\nconst jsonLanguage = /*@__PURE__*/LRLanguage.define({\n name: \"json\",\n parser: /*@__PURE__*/parser.configure({\n props: [\n /*@__PURE__*/indentNodeProp.add({\n Object: /*@__PURE__*/continuedIndent({ except: /^\\s*\\}/ }),\n Array: /*@__PURE__*/continuedIndent({ except: /^\\s*\\]/ })\n }),\n /*@__PURE__*/foldNodeProp.add({\n \"Object Array\": foldInside\n })\n ]\n }),\n languageData: {\n closeBrackets: { brackets: [\"[\", \"{\", '\"'] },\n indentOnInput: /^\\s*[\\}\\]]$/\n }\n});\n/**\nJSON language support.\n*/\nfunction json() {\n return new LanguageSupport(jsonLanguage);\n}\n\nexport { json, jsonLanguage, jsonParseLinter };\n","import { json, jsonLanguage, jsonParseLinter } from \"@codemirror/lang-json\";\nimport { forceLinting, linter } from \"@codemirror/lint\";\nimport { Compartment, EditorState } from \"@codemirror/state\";\nimport { EditorView, keymap } from \"@codemirror/view\";\nimport { useTheme } from \"@powerhousedao/reactor-browser\";\nimport { memo, useEffect, useRef } from \"react\";\nimport { ayuLight, dracula } from \"thememirror\";\nimport { baseEditorExtensions, baseKeymap } from \"./constants.js\";\nimport {\n makeFocusHandler,\n makePasteHandler,\n makeUpdateHandler,\n} from \"./factories.js\";\nimport {\n useDocumentSync,\n useEditorCleanup,\n useEditorRefs,\n useHandlerReconfiguration,\n} from \"./hooks.js\";\n\ntype Props = {\n doc: string;\n readonly?: boolean;\n /* Updates the document in the model, should be wrapped in `useCallback` in the parent */\n updateDocumentInModel?: (newDoc: string) => void;\n};\n\nconst JSONEditor = memo(function JSONEditor(props: Props) {\n const { doc, readonly = false, updateDocumentInModel } = props;\n const {\n editorRef,\n viewRef,\n updateListenerCompartment,\n focusHandlerCompartment,\n pasteHandlerCompartment,\n timeoutRef,\n } = useEditorRefs();\n const { theme } = useTheme();\n const themeCompartment = useRef(new Compartment());\n\n useEffect(() => {\n if (!viewRef.current) {\n viewRef.current = new EditorView({\n state: EditorState.create({\n doc,\n extensions: [\n ...baseEditorExtensions,\n keymap.of(baseKeymap),\n themeCompartment.current.of(theme === \"light\" ? ayuLight : dracula),\n jsonLanguage,\n json(),\n linter(jsonParseLinter()),\n updateListenerCompartment.current.of(\n makeUpdateHandler(readonly, timeoutRef, updateDocumentInModel),\n ),\n focusHandlerCompartment.current.of(\n makeFocusHandler(readonly, timeoutRef, updateDocumentInModel),\n ),\n pasteHandlerCompartment.current.of(\n makePasteHandler(readonly, timeoutRef, updateDocumentInModel),\n ),\n EditorState.readOnly.of(readonly),\n ],\n }),\n parent: editorRef.current!,\n });\n forceLinting(viewRef.current);\n }\n }, []);\n\n useEffect(() => {\n if (!viewRef.current) return;\n viewRef.current.dispatch({\n effects: themeCompartment.current.reconfigure(\n theme === \"light\" ? ayuLight : dracula,\n ),\n });\n }, [theme]);\n\n useEditorCleanup(viewRef);\n\n useHandlerReconfiguration(\n viewRef.current,\n readonly,\n timeoutRef,\n updateDocumentInModel,\n {\n updateListener: updateListenerCompartment.current,\n focusHandler: focusHandlerCompartment.current,\n pasteHandler: pasteHandlerCompartment.current,\n },\n );\n\n useDocumentSync(viewRef.current, doc);\n\n return <div ref={editorRef} />;\n});\n\nexport default JSONEditor;\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
@@ -1,9 +1,7 @@
1
- import { a as boolean, d as record, f as string, i as array, l as number, n as _null, p as union, s as lazy } from "./schemas-Cb8uEF9u.mjs";
2
- import { i as sentenceCase, r as pascalCase } from "./dist-BQTIepWC.mjs";
3
- import { t as require_graphql } from "./graphql-Du2phcBf.mjs";
4
- import { O as twMerge, y as clsx } from "./dist-BSjsG8Nj.mjs";
5
- import { a as customScalars } from "./documents-BWJpUm9f.mjs";
6
- import { n as safeParseSdl } from "./schema-context-BlHpyf8E.mjs";
1
+ import { _ as string, f as lazy, g as record, i as sentenceCase, l as array, m as number, r as pascalCase, s as _null, u as boolean, v as union } from "./dist-fA4EItr0.mjs";
2
+ import { t as require_graphql } from "./graphql-DskHmkMe.mjs";
3
+ import { a as customScalars } from "./documents-BFBPmyw1.mjs";
4
+ import { n as safeParseSdl } from "./schema-context-CX5ml_9t.mjs";
7
5
  //#region ../../node_modules/.pnpm/@powerhousedao+document-engineering@1.40.5_@types+express@4.17.25_@types+react-dom@19.2_75e28b6ec666f63b132a491ff3a6fdf7/node_modules/@powerhousedao/document-engineering/dist/src/scalars/graphql/utils.js
8
6
  const SerializableSchema = lazy(() => union([
9
7
  string(),
@@ -662,11 +660,6 @@ function ensureValidOperationSchemaInputName(doc, operationName) {
662
660
  return [];
663
661
  }
664
662
  //#endregion
665
- //#region editors/document-model-editor/utils/style.ts
666
- function cn(...inputs) {
667
- return twMerge(clsx(inputs));
668
- }
669
- //#endregion
670
- export { compareStringsWithoutWhitespace as a, isEmptyOperationSchema as c, makeMinimalObjectForStateType as d, makeOperationInitialDoc as f, validateStateObject as h, StateValidationError as i, makeEmptyOperationSchema as l, renameSchemaType as m, ensureValidOperationSchemaInputName as n, handleModelNameChange as o, makeStateSchemaNameForScope as p, ensureValidStateSchemaName as r, initializeModelSchema as s, cn as t, makeInitialSchemaDoc as u };
663
+ export { handleModelNameChange as a, makeEmptyOperationSchema as c, makeOperationInitialDoc as d, makeStateSchemaNameForScope as f, compareStringsWithoutWhitespace as i, makeInitialSchemaDoc as l, validateStateObject as m, ensureValidStateSchemaName as n, initializeModelSchema as o, renameSchemaType as p, StateValidationError as r, isEmptyOperationSchema as s, ensureValidOperationSchemaInputName as t, makeMinimalObjectForStateType as u };
671
664
 
672
- //# sourceMappingURL=style-C449avuc.mjs.map
665
+ //# sourceMappingURL=linting-Dx50GuLN.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linting-Dx50GuLN.mjs","names":["z.lazy","z.union","z.string","z.number","z.boolean","z.null","z.array","z.record","Kind","z.string","z.boolean","z.number","GraphQLError","Kind"],"sources":["../../../../node_modules/.pnpm/@powerhousedao+document-engineering@1.40.5_@types+express@4.17.25_@types+react-dom@19.2_75e28b6ec666f63b132a491ff3a6fdf7/node_modules/@powerhousedao/document-engineering/dist/src/scalars/graphql/utils.js","../../editors/document-model-editor/constants/graphql-kinds.ts","../../editors/document-model-editor/utils/helpers.ts","../../editors/document-model-editor/utils/linting.ts"],"sourcesContent":["import { z } from 'zod';\nimport { customScalars } from './scalars.js';\nexport const SerializableSchema = z.lazy(() => z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.array(SerializableSchema),\n z.record(z.string(), SerializableSchema),\n]));\nexport function isSerializable(value) {\n const result = SerializableSchema.safeParse(value);\n return result.success;\n}\nexport function getPHCustomScalarByTypeName(name) {\n const scalar = Object.values(customScalars).find((scalar) => scalar.config.name === name) ?? null;\n return scalar;\n}\n//# sourceMappingURL=utils.js.map","export const STRING_GQL_PRIMITIVE_NAME = \"String\";\nexport const BOOLEAN_GQL_PRIMITIVE_NAME = \"Boolean\";\nexport const INT_GQL_PRIMITIVE_NAME = \"Int\";\nexport const FLOAT_GQL_PRIMITIVE_NAME = \"Float\";\nexport const ID_GQL_PRIMITIVE_NAME = \"ID\";\n\nexport const gqlPrimitiveNodeNamesList = [\n STRING_GQL_PRIMITIVE_NAME,\n BOOLEAN_GQL_PRIMITIVE_NAME,\n INT_GQL_PRIMITIVE_NAME,\n FLOAT_GQL_PRIMITIVE_NAME,\n ID_GQL_PRIMITIVE_NAME,\n] as const;\n\nexport type GqlPrimitiveNodeNames = typeof gqlPrimitiveNodeNamesList;\nexport type GqlPrimitiveNodeName = GqlPrimitiveNodeNames[number];\n","import type { Serializable } from \"@powerhousedao/document-engineering/graphql\";\nimport { getPHCustomScalarByTypeName } from \"@powerhousedao/document-engineering/graphql\";\nimport { pascalCase } from \"change-case\";\nimport type {\n ASTNode,\n DefinitionNode,\n DocumentNode,\n EnumTypeDefinitionNode,\n FieldDefinitionNode,\n GraphQLInputType,\n GraphQLObjectType,\n GraphQLOutputType,\n GraphQLSchema,\n InputObjectTypeDefinitionNode,\n ListTypeNode,\n NamedTypeNode,\n NonNullTypeNode,\n ObjectTypeDefinitionNode,\n ScalarTypeDefinitionNode,\n TypeNode,\n UnionTypeDefinitionNode,\n} from \"graphql\";\nimport {\n buildASTSchema,\n getOperationAST,\n getVariableValues,\n GraphQLError,\n GraphQLInputObjectType,\n GraphQLList,\n GraphQLNonNull,\n isEnumType,\n isListType,\n isNonNullType,\n isObjectType,\n isScalarType,\n Kind,\n parse,\n print,\n visit,\n} from \"graphql\";\nimport { z } from \"zod\";\nimport type { GqlPrimitiveNodeName } from \"../constants/graphql-kinds.js\";\nimport {\n BOOLEAN_GQL_PRIMITIVE_NAME,\n FLOAT_GQL_PRIMITIVE_NAME,\n gqlPrimitiveNodeNamesList,\n ID_GQL_PRIMITIVE_NAME,\n INT_GQL_PRIMITIVE_NAME,\n STRING_GQL_PRIMITIVE_NAME,\n} from \"../constants/graphql-kinds.js\";\nimport { safeParseSdl } from \"../context/schema-context.js\";\nimport type { Scope } from \"../types/documents.js\";\n\nexport function makeStateSchemaNameForScope(modelName: string, scope: string) {\n const modelNamePascalCase = pascalCase(modelName);\n const scopePascalCase = pascalCase(scope);\n const name =\n scopePascalCase === \"Global\"\n ? `${modelNamePascalCase}State`\n : `${modelNamePascalCase}${scopePascalCase}State`;\n return name;\n}\n\nexport function makeInitialSchemaDoc(modelName: string, scope: string) {\n const name = makeStateSchemaNameForScope(modelName, scope);\n const stateSchemaSdl = `type ${name} {\n \"Add your ${scope} state fields here\"\n _placeholder: String\n}`;\n return stateSchemaSdl;\n}\n\nexport function makeOperationInitialDoc(name: string) {\n const inputSdl = `input ${pascalCase(name)}Input {\n \"Add your inputs here\"\n _placeholder: String\n}`;\n return inputSdl;\n}\n\nexport function makeEmptyOperationSchema(operationName: string): string {\n const pascalName = pascalCase(operationName);\n return `input ${pascalName}Input {\\n _empty: Boolean\\n}`;\n}\n\nexport function isEmptyOperationSchema(\n schema: string | null | undefined,\n): boolean {\n if (!schema) return false;\n // Check if schema only contains _empty: Boolean field\n return (\n /_empty:\\s*Boolean/.test(schema) &&\n !schema.replace(/_empty:\\s*Boolean/, \"\").match(/\\w+:\\s*\\w+/)\n );\n}\n\nexport function safeParseJsonRecord(json: string) {\n try {\n return JSON.parse(json) as Record<string, Serializable>;\n } catch (_error) {\n return null;\n }\n}\n\nexport function makeMinimalObjectForStateType(args: {\n sharedSchemaDocumentNode: DocumentNode;\n stateTypeDefinitionNode: ObjectTypeDefinitionNode;\n existingValue: string;\n}) {\n const { sharedSchemaDocumentNode, stateTypeDefinitionNode, existingValue } =\n args;\n const existingValueObject = safeParseJsonRecord(existingValue);\n if (!existingValueObject) {\n return existingValue;\n }\n const stateTypeDefinitionFields = stateTypeDefinitionNode.fields;\n if (!stateTypeDefinitionFields?.length) {\n return existingValue;\n }\n // Initialize visitedTypes with the root type to detect self-recursive types\n const visitedTypes = new Set<string>([stateTypeDefinitionNode.name.value]);\n const minimalObject = makeMinimalValuesForObjectFields({\n schemaDocumentNode: sharedSchemaDocumentNode,\n fieldDefinitionNodes: stateTypeDefinitionFields,\n existingValueObject,\n visitedTypes,\n });\n return JSON.stringify(minimalObject, null, 2);\n}\n\nexport function makeMinimalValuesForObjectFields(args: {\n schemaDocumentNode: DocumentNode;\n existingValueObject: Record<string, Serializable> | null;\n fieldDefinitionNodes: readonly FieldDefinitionNode[];\n visitedTypes?: Set<string>;\n}) {\n const {\n schemaDocumentNode,\n existingValueObject,\n fieldDefinitionNodes,\n visitedTypes,\n } = args;\n const newJson: Record<string, Serializable> = {};\n\n for (const astNode of fieldDefinitionNodes) {\n const fieldName = getASTNodeName(astNode);\n if (!fieldName) {\n continue;\n }\n const minimalValue = makeMinimalValueForASTNode({\n fieldName,\n astNode,\n schemaDocumentNode,\n existingValueObject,\n visitedTypes,\n });\n newJson[astNode.name.value] = minimalValue;\n }\n\n return newJson;\n}\n\nfunction makeMinimalValueForASTNode(args: {\n fieldName: string;\n astNode: ASTNode;\n schemaDocumentNode: DocumentNode;\n existingValueObject: Record<string, Serializable> | null;\n visitedTypes?: Set<string>;\n}): Serializable {\n const {\n fieldName,\n astNode,\n schemaDocumentNode,\n existingValueObject,\n visitedTypes,\n } = args;\n const existingFieldValue = existingValueObject?.[fieldName];\n let node: ASTNode | null = astNode;\n\n if (isFieldDefinitionNode(astNode)) {\n node = getASTNodeTypeNode(node);\n }\n const isNonNull = isNonNullNode(node);\n if (isNonNull) {\n node = getASTNodeTypeNode(node);\n }\n\n if (isListTypeNode(node)) {\n return makeMinimalValueForGqlListNode(\n node,\n existingFieldValue,\n isNonNull,\n schemaDocumentNode,\n visitedTypes,\n );\n }\n if (isGqlPrimitiveNode(node)) {\n return makeMinimalValueForGQLPrimitiveNode(\n node,\n existingFieldValue,\n isNonNull,\n );\n }\n\n const namedTypeDefinitionNode = getNamedTypeDefinitionNode(\n node,\n schemaDocumentNode,\n );\n\n if (isEnumTypeDefinitionNode(namedTypeDefinitionNode)) {\n return makeMinimalValueForGqlEnum(\n namedTypeDefinitionNode,\n existingFieldValue,\n isNonNull,\n );\n }\n if (isScalarTypeDefinitionNode(namedTypeDefinitionNode)) {\n return makeMinimalValueForGqlScalar(\n namedTypeDefinitionNode,\n existingFieldValue,\n isNonNull,\n );\n }\n if (isUnionTypeDefinitionNode(namedTypeDefinitionNode)) {\n return makeMinimalValueForGqlUnion(\n namedTypeDefinitionNode,\n existingFieldValue,\n schemaDocumentNode,\n existingValueObject,\n isNonNull,\n visitedTypes,\n );\n }\n if (isObjectTypeDefinitionNode(namedTypeDefinitionNode)) {\n return makeMinimalValueForGqlObject(\n namedTypeDefinitionNode,\n schemaDocumentNode,\n existingValueObject,\n existingFieldValue,\n isNonNull,\n visitedTypes,\n );\n }\n\n return existingFieldValue;\n}\n\nfunction isFieldDefinitionNode(\n astNodeTypeNode: ASTNode | null,\n): astNodeTypeNode is FieldDefinitionNode {\n if (!astNodeTypeNode) return false;\n return astNodeTypeNode.kind === Kind.FIELD_DEFINITION;\n}\n\nfunction isNonNullNode(astNode: ASTNode | null): astNode is NonNullTypeNode {\n if (!astNode) return false;\n return astNode.kind === Kind.NON_NULL_TYPE;\n}\n\nexport function isGqlPrimitiveNode(\n astNodeTypeNode: ASTNode | null,\n): astNodeTypeNode is NamedTypeNode {\n if (!astNodeTypeNode) return false;\n const name = getASTNodeName(astNodeTypeNode);\n return gqlPrimitiveNodeNamesList.includes(name as GqlPrimitiveNodeName);\n}\n\nfunction isListTypeNode(\n astNodeTypeNode: ASTNode | null,\n): astNodeTypeNode is ListTypeNode {\n if (!astNodeTypeNode) return false;\n return astNodeTypeNode.kind === Kind.LIST_TYPE;\n}\n\nfunction isEnumTypeDefinitionNode(\n definitionNode: DefinitionNode | null,\n): definitionNode is EnumTypeDefinitionNode {\n if (!definitionNode) return false;\n return definitionNode.kind === Kind.ENUM_TYPE_DEFINITION;\n}\n\nfunction isScalarTypeDefinitionNode(\n definitionNode: DefinitionNode | null,\n): definitionNode is ScalarTypeDefinitionNode {\n if (!definitionNode) return false;\n return definitionNode.kind === Kind.SCALAR_TYPE_DEFINITION;\n}\n\nfunction isUnionTypeDefinitionNode(\n definitionNode: DefinitionNode | null,\n): definitionNode is UnionTypeDefinitionNode {\n if (!definitionNode) return false;\n return definitionNode.kind === Kind.UNION_TYPE_DEFINITION;\n}\n\nfunction isObjectTypeDefinitionNode(\n definitionNode: DefinitionNode | null,\n): definitionNode is ObjectTypeDefinitionNode {\n if (!definitionNode) return false;\n return definitionNode.kind === Kind.OBJECT_TYPE_DEFINITION;\n}\n\nfunction getASTNodeName(astNode: ASTNode | null) {\n if (!astNode) {\n return null;\n }\n if (!(\"name\" in astNode)) {\n return null;\n }\n if (!astNode.name) {\n return null;\n }\n if (!(\"value\" in astNode.name)) {\n return null;\n }\n return astNode.name.value;\n}\n\nfunction getASTNodeTypeNode(astNode: ASTNode | null) {\n if (!astNode) {\n return null;\n }\n if (!(\"type\" in astNode)) {\n return null;\n }\n return astNode.type;\n}\n\nfunction makeMinimalValueForGQLPrimitiveNode(\n primitiveTypeNode: NamedTypeNode,\n existingFieldValue: Serializable,\n isNonNull: boolean,\n) {\n const name = getASTNodeName(primitiveTypeNode);\n if (!name) {\n return null;\n }\n switch (name) {\n case ID_GQL_PRIMITIVE_NAME: {\n if (z.string().safeParse(existingFieldValue).success) {\n return existingFieldValue;\n }\n return isNonNull ? \"placeholder-id\" : null;\n }\n case BOOLEAN_GQL_PRIMITIVE_NAME: {\n if (z.boolean().safeParse(existingFieldValue).success) {\n return existingFieldValue;\n }\n return isNonNull ? false : null;\n }\n case INT_GQL_PRIMITIVE_NAME: {\n if (z.number().safeParse(existingFieldValue).success) {\n return existingFieldValue;\n }\n return isNonNull ? 0 : null;\n }\n case FLOAT_GQL_PRIMITIVE_NAME: {\n if (z.number().safeParse(existingFieldValue).success) {\n return existingFieldValue;\n }\n return isNonNull ? 0.0 : null;\n }\n case STRING_GQL_PRIMITIVE_NAME: {\n if (z.string().safeParse(existingFieldValue).success) {\n return existingFieldValue;\n }\n return isNonNull ? \"\" : null;\n }\n }\n\n return isNonNull ? existingFieldValue : null;\n}\n\nfunction makeMinimalValueForGqlEnum(\n namedTypeDefinitionNode: EnumTypeDefinitionNode,\n existingFieldValue: Serializable,\n isNonNull: boolean,\n) {\n const enumValues =\n namedTypeDefinitionNode.values?.map((value) => value.name.value) ?? [];\n if (\n typeof existingFieldValue === \"string\" &&\n enumValues.includes(existingFieldValue)\n ) {\n return existingFieldValue;\n }\n if (isNonNull) {\n return enumValues[0];\n }\n return null;\n}\n\nfunction makeMinimalValueForGqlScalar(\n scalarTypeDefinitionNode: ScalarTypeDefinitionNode,\n existingFieldValue: Serializable,\n isNonNull: boolean,\n) {\n if (!isNonNull && !existingFieldValue) {\n return null;\n }\n const name = getASTNodeName(scalarTypeDefinitionNode);\n if (!name) {\n console.error(\n \"No name for scalar type definition node\",\n scalarTypeDefinitionNode,\n );\n return null;\n }\n const scalar = getPHCustomScalarByTypeName(name);\n if (!scalar) {\n return null;\n }\n const existingValueIsValid = scalar.schema.safeParse(existingFieldValue);\n if (existingValueIsValid.success) {\n return existingFieldValue;\n }\n if (!isNonNull) {\n return null;\n }\n const minimalValue = scalar.getDefaultValue?.();\n if (minimalValue) {\n return minimalValue;\n }\n return existingFieldValue;\n}\n\nfunction makeMinimalValueForGqlUnion(\n namedTypeDefinitionNode: UnionTypeDefinitionNode,\n existingFieldValue: Serializable,\n schemaDocumentNode: DocumentNode,\n existingValueObject: Record<string, Serializable> | null,\n isNonNull: boolean,\n visitedTypes?: Set<string>,\n) {\n if (!isNonNull && !existingFieldValue) {\n return null;\n }\n\n const types = namedTypeDefinitionNode.types;\n if (!types?.length) {\n return null;\n }\n\n const firstNamedTypeDefinitionNode = namedTypeDefinitionNode.types?.at(0);\n if (!firstNamedTypeDefinitionNode) {\n return null;\n }\n const firstNamedTypeObjectDefinitionNode = getNamedTypeDefinitionNode(\n firstNamedTypeDefinitionNode,\n schemaDocumentNode,\n );\n if (!isObjectTypeDefinitionNode(firstNamedTypeObjectDefinitionNode)) {\n return null;\n }\n return makeMinimalValueForGqlObject(\n firstNamedTypeObjectDefinitionNode,\n schemaDocumentNode,\n existingValueObject,\n existingFieldValue,\n isNonNull,\n visitedTypes,\n );\n}\n\nfunction makeMinimalValueForGqlListNode(\n listTypeNode: ListTypeNode,\n existingFieldValue: Serializable,\n isNonNull: boolean,\n schemaDocumentNode: DocumentNode,\n visitedTypes?: Set<string>,\n) {\n if (!isNonNull && !Array.isArray(existingFieldValue)) {\n return null;\n }\n if (isNonNull && !Array.isArray(existingFieldValue)) {\n return [];\n }\n\n // Process each array item recursively\n const arrayValue = existingFieldValue as Serializable[];\n return arrayValue.map((item, index) =>\n makeMinimalValueForASTNode({\n fieldName: String(index),\n astNode: listTypeNode.type,\n schemaDocumentNode,\n existingValueObject: { [index]: item },\n visitedTypes,\n }),\n );\n}\n\nfunction makeMinimalValueForGqlObject(\n objectTypeDefinitionNode: ObjectTypeDefinitionNode,\n schemaDocumentNode: DocumentNode,\n _existingValueObject: Record<string, Serializable> | null,\n existingFieldValue: Serializable,\n isNonNull: boolean,\n visitedTypes?: Set<string>,\n) {\n const typeName = objectTypeDefinitionNode.name.value;\n\n // Check for recursive types to prevent infinite recursion\n if (visitedTypes?.has(typeName)) {\n return null;\n }\n\n if (!isNonNull && !existingFieldValue) {\n return null;\n }\n const fields = objectTypeDefinitionNode.fields;\n if (!fields?.length) {\n return {};\n }\n\n // Track this type to detect cycles\n const newVisitedTypes = new Set(visitedTypes);\n newVisitedTypes.add(typeName);\n\n // Use existingFieldValue (the actual nested object) instead of existingValueObject (parent)\n const nestedExistingValue =\n existingFieldValue &&\n typeof existingFieldValue === \"object\" &&\n !Array.isArray(existingFieldValue)\n ? (existingFieldValue as Record<string, Serializable>)\n : null;\n return makeMinimalValuesForObjectFields({\n schemaDocumentNode,\n existingValueObject: nestedExistingValue,\n fieldDefinitionNodes: fields,\n visitedTypes: newVisitedTypes,\n });\n}\n\nfunction getNamedTypeDefinitionNode(\n astNodeTypeNode: ASTNode | null,\n schemaDocumentNode: DocumentNode,\n) {\n if (!astNodeTypeNode) {\n return null;\n }\n const name = getASTNodeName(astNodeTypeNode);\n if (!name) {\n return null;\n }\n const definitionNode = schemaDocumentNode.definitions.find(\n (def) => \"kind\" in def && \"name\" in def && def.name?.value === name,\n );\n if (!definitionNode) {\n return null;\n }\n return definitionNode;\n}\n\nfunction removeWhitespace(str: string) {\n return str.replace(/\\s+|\\\\n|\\\\t/g, \"\").toLowerCase();\n}\n\nexport function compareStringsWithoutWhitespace(\n str1: string | null | undefined,\n str2: string | null | undefined,\n) {\n if (\n str1 === null ||\n str2 === null ||\n str1 === undefined ||\n str2 === undefined\n )\n return false;\n return removeWhitespace(str1) === removeWhitespace(str2);\n}\n\nexport function renameSchemaType(\n sdl: string,\n oldName: string,\n newName: string,\n scope: Scope,\n): string {\n const typeSuffix = scope === \"global\" ? \"State\" : \"LocalState\";\n const oldTypeName = `${pascalCase(oldName)}${typeSuffix}`;\n const newTypeName = `${pascalCase(newName)}${typeSuffix}`;\n\n const ast = safeParseSdl(sdl);\n if (!ast) return sdl;\n\n const updatedAst = visit(ast, {\n ObjectTypeDefinition: (node) => {\n if (node.name.value === oldTypeName) {\n return {\n ...node,\n name: {\n ...node.name,\n value: newTypeName,\n },\n };\n }\n },\n });\n\n return print(updatedAst);\n}\n\nexport function initializeModelSchema(modelName: string) {\n const initialSchemaDoc = makeInitialSchemaDoc(modelName, \"global\");\n return initialSchemaDoc;\n}\n\nexport function updateModelSchemaNames(params: {\n oldName: string;\n newName: string;\n globalStateSchema: string;\n localStateSchema: string;\n setStateSchema: (schema: string, scope: Scope) => void;\n}) {\n const {\n oldName,\n newName,\n globalStateSchema,\n localStateSchema,\n setStateSchema,\n } = params;\n\n const newSchema = renameSchemaType(\n globalStateSchema,\n oldName,\n newName,\n \"global\",\n );\n setStateSchema(newSchema, \"global\");\n\n if (localStateSchema) {\n const newLocalStateSchema = renameSchemaType(\n localStateSchema,\n oldName,\n newName,\n \"local\",\n );\n setStateSchema(newLocalStateSchema, \"local\");\n }\n}\n\nexport function handleModelNameChange(params: {\n oldName: string;\n newName: string;\n globalStateSchema: string;\n localStateSchema: string;\n setStateSchema: (schema: string, scope: Scope) => void;\n}) {\n const { newName, globalStateSchema, setStateSchema } = params;\n\n const hasExistingSchema = !!globalStateSchema;\n\n if (!hasExistingSchema) {\n const initialSchemaDoc = initializeModelSchema(newName);\n setStateSchema(initialSchemaDoc, \"global\");\n return;\n }\n\n updateModelSchemaNames(params);\n}\n\n/**\n * Converts an output object type into an equivalent input object type.\n * Intended for structural validation of state objects.\n */\nexport function objectTypeToInputType(\n schema: GraphQLSchema,\n objectType: GraphQLObjectType,\n options?: {\n nameSuffix?: string;\n cache?: Map<string, GraphQLInputObjectType>;\n },\n): GraphQLInputObjectType {\n const suffix = options?.nameSuffix ?? \"Input\";\n const cache = options?.cache ?? new Map<string, GraphQLInputObjectType>();\n\n const inputTypeName = `${objectType.name}${suffix}`;\n\n if (cache.has(inputTypeName)) {\n return cache.get(inputTypeName)!;\n }\n\n const inputType = new GraphQLInputObjectType({\n name: inputTypeName,\n fields: () => {\n const fields = objectType.getFields();\n const inputFields: Record<string, { type: GraphQLInputType }> = {};\n\n for (const fieldName in fields) {\n const field = fields[fieldName];\n\n if (field.args.length > 0) {\n throw new Error(\n `Cannot convert field \"${objectType.name}.${fieldName}\" with arguments into input type`,\n );\n }\n\n inputFields[fieldName] = {\n type: outputTypeToInputType(schema, field.type, suffix, cache),\n };\n }\n\n return inputFields;\n },\n });\n\n cache.set(inputTypeName, inputType);\n return inputType;\n}\n\nfunction outputTypeToInputType(\n schema: GraphQLSchema,\n type: GraphQLOutputType,\n suffix: string,\n cache: Map<string, GraphQLInputObjectType>,\n): GraphQLInputType {\n if (isNonNullType(type)) {\n return new GraphQLNonNull(\n outputTypeToInputType(schema, type.ofType, suffix, cache),\n );\n }\n\n if (isListType(type)) {\n return new GraphQLList(\n outputTypeToInputType(schema, type.ofType, suffix, cache),\n );\n }\n\n if (isScalarType(type) || isEnumType(type)) {\n return type;\n }\n\n if (isObjectType(type)) {\n return objectTypeToInputType(schema, type, {\n nameSuffix: suffix,\n cache,\n });\n }\n\n throw new Error(`Unsupported output type: ${type.toString()}`);\n}\n\nexport function validateStateObject(\n sharedSchemaDocumentNode: DocumentNode,\n stateTypeDefinitionNode: ObjectTypeDefinitionNode,\n stateValue: string,\n): Error[] {\n let stateObjectJson: Record<string, unknown> | undefined;\n try {\n stateObjectJson = JSON.parse(stateValue) as Record<string, unknown>;\n } catch (error) {\n return [new Error(\"Invalid JSON object\", { cause: error })];\n }\n\n // 2) Build a quick index of type definitions from the shared schema\n const typeDefByName = indexTypeDefinitions(sharedSchemaDocumentNode);\n\n // Ensure the passed node exists in the shared schema (optional but helpful)\n const stateTypeName = stateTypeDefinitionNode.name.value;\n if (!typeDefByName.has(stateTypeName)) {\n return [\n new Error(\n `State type \"${stateTypeName}\" was not found in sharedSchemaDocumentNode`,\n ),\n ];\n }\n\n // 3) Generate input types needed to validate this state object\n const inputSuffix = \"Input\";\n const generatedInputDefs = generateInputTypesForObjectTree(\n stateTypeName,\n typeDefByName,\n inputSuffix,\n );\n\n // 4) Build a schema that includes the generated input types\n const augmentedDoc: DocumentNode = {\n ...sharedSchemaDocumentNode,\n definitions: [\n ...sharedSchemaDocumentNode.definitions,\n ...generatedInputDefs,\n ],\n };\n\n let schema;\n try {\n schema = buildASTSchema(augmentedDoc, { assumeValidSDL: false });\n } catch (e) {\n return [new Error(\"Failed to build schema from SDL\", { cause: e })];\n }\n\n // 5) Validate by coercing variables against the generated input type\n const inputTypeName = `${stateTypeName}${inputSuffix}`;\n const opDoc = parse(`query($v: ${inputTypeName}!) { __typename }`);\n const op = getOperationAST(opDoc);\n\n if (!op) {\n return [new Error(\"Failed to create validation operation AST\")];\n }\n\n const { errors } = getVariableValues(schema, op.variableDefinitions ?? [], {\n v: stateObjectJson,\n });\n\n // Detect recursive types first - these take priority over NON_NULL errors\n const recursiveTypeErrors = detectRecursiveTypes(\n stateTypeDefinitionNode,\n typeDefByName,\n );\n\n // Get the field names that have recursive types\n const recursiveFieldNames = new Set(recursiveTypeErrors.map((e) => e.field));\n\n const validationErrors = errors\n ? graphQLErrorsToStateValidationErrors(errors).filter((e) => {\n // Filter out NON_NULL errors caused by recursive types\n if (e instanceof StateValidationError && e.kind === \"NON_NULL\") {\n // Check if this error is in a path that starts with a recursive field\n const rootField = e.path[0];\n if (\n typeof rootField === \"string\" &&\n recursiveFieldNames.has(rootField)\n ) {\n return false;\n }\n }\n return true;\n })\n : [];\n\n // Add recursive type errors first (they have priority)\n validationErrors.unshift(...recursiveTypeErrors);\n\n const missingOptionalErrors = detectMissingOptionalFields(\n sharedSchemaDocumentNode,\n stateTypeDefinitionNode,\n stateObjectJson,\n );\n validationErrors.push(...missingOptionalErrors);\n\n return validationErrors;\n}\n\n/**\n * Indexes object/input/enum/scalar/interface/union type definition nodes by name.\n * Note: only AST definitions that have a \"name\" field are indexed.\n */\nfunction indexTypeDefinitions(doc: DocumentNode): Map<string, DefinitionNode> {\n const map = new Map<string, DefinitionNode>();\n\n for (const def of doc.definitions) {\n if (\n def.kind === Kind.OBJECT_TYPE_DEFINITION ||\n def.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION ||\n def.kind === Kind.ENUM_TYPE_DEFINITION ||\n def.kind === Kind.SCALAR_TYPE_DEFINITION ||\n def.kind === Kind.INTERFACE_TYPE_DEFINITION ||\n def.kind === Kind.UNION_TYPE_DEFINITION ||\n def.kind === Kind.OBJECT_TYPE_EXTENSION ||\n def.kind === Kind.INPUT_OBJECT_TYPE_EXTENSION ||\n def.kind === Kind.ENUM_TYPE_EXTENSION ||\n def.kind === Kind.INTERFACE_TYPE_EXTENSION ||\n def.kind === Kind.UNION_TYPE_EXTENSION\n ) {\n // Extensions also have names; we index them too (but see note below).\n // In production, you may want to merge extensions into base definitions.\n // For state validation, prefer definitions (not extensions) if both exist.\n const name = def.name.value;\n if (!map.has(name)) {\n map.set(name, def);\n }\n }\n }\n\n return map;\n}\n\n/**\n * Generates InputObjectTypeDefinitionNode(s) for a root object type and any nested\n * object types reachable via fields, converting object references to their *Input equivalents*.\n */\nfunction generateInputTypesForObjectTree(\n rootObjectTypeName: string,\n typeDefByName: Map<string, DefinitionNode>,\n inputSuffix: string,\n): InputObjectTypeDefinitionNode[] {\n const generated = new Map<string, InputObjectTypeDefinitionNode>();\n const visiting = new Set<string>();\n\n const ensureInputForObject = (objectTypeName: string) => {\n const inputName = `${objectTypeName}${inputSuffix}`;\n if (generated.has(inputName)) return;\n\n if (visiting.has(objectTypeName)) {\n // Recursive reference; we rely on GraphQLInputObjectType lazy field resolution via AST schema build.\n // Still, we must avoid infinite loops while generating AST nodes.\n return;\n }\n visiting.add(objectTypeName);\n\n const def = typeDefByName.get(objectTypeName);\n if (!def) {\n throw new GraphQLError(`Unknown referenced type \"${objectTypeName}\"`);\n }\n\n if (\n def.kind !== Kind.OBJECT_TYPE_DEFINITION &&\n def.kind !== Kind.OBJECT_TYPE_EXTENSION\n ) {\n throw new GraphQLError(\n `Type \"${objectTypeName}\" is not an object type; cannot generate input from kind \"${def.kind}\"`,\n );\n }\n\n const objDef = def as ObjectTypeDefinitionNode;\n\n // Convert each field type to an input-acceptable TypeNode.\n const inputFields =\n objDef.fields?.map((f) => {\n return {\n kind: Kind.INPUT_VALUE_DEFINITION as const,\n name: f.name,\n description: f.description,\n directives: [], // output-field directives don't automatically translate to input fields\n type: convertOutputTypeNodeToInputTypeNode(\n f.type,\n typeDefByName,\n inputSuffix,\n ensureInputForObject,\n ),\n defaultValue: undefined,\n };\n }) ?? [];\n\n const inputDef: InputObjectTypeDefinitionNode = {\n kind: Kind.INPUT_OBJECT_TYPE_DEFINITION,\n name: { kind: Kind.NAME, value: inputName },\n description: objDef.description,\n directives: [],\n fields: inputFields,\n };\n\n generated.set(inputName, inputDef);\n\n visiting.delete(objectTypeName);\n };\n\n // Kick off generation for root\n ensureInputForObject(rootObjectTypeName);\n\n return Array.from(generated.values());\n}\n\nfunction convertOutputTypeNodeToInputTypeNode(\n typeNode: TypeNode,\n typeDefByName: Map<string, DefinitionNode>,\n inputSuffix: string,\n ensureInputForObject: (objectTypeName: string) => void,\n): TypeNode {\n switch (typeNode.kind) {\n case Kind.NON_NULL_TYPE:\n return {\n kind: Kind.NON_NULL_TYPE,\n type: convertOutputTypeNodeToInputTypeNode(\n typeNode.type,\n typeDefByName,\n inputSuffix,\n ensureInputForObject,\n ) as NamedTypeNode | ListTypeNode,\n };\n\n case Kind.LIST_TYPE:\n return {\n kind: Kind.LIST_TYPE,\n type: convertOutputTypeNodeToInputTypeNode(\n typeNode.type,\n typeDefByName,\n inputSuffix,\n ensureInputForObject,\n ),\n };\n\n case Kind.NAMED_TYPE: {\n const named = typeNode as NamedTypeNode;\n const name = named.name.value;\n\n const def = typeDefByName.get(name);\n\n // If it's an object type, we must reference its generated input twin.\n if (\n def?.kind === Kind.OBJECT_TYPE_DEFINITION ||\n def?.kind === Kind.OBJECT_TYPE_EXTENSION\n ) {\n ensureInputForObject(name);\n return {\n kind: Kind.NAMED_TYPE,\n name: { kind: Kind.NAME, value: `${name}${inputSuffix}` },\n };\n }\n\n // Scalars/enums/input objects are valid as-is in input positions.\n if (\n !def ||\n def.kind === Kind.SCALAR_TYPE_DEFINITION ||\n def.kind === Kind.ENUM_TYPE_DEFINITION ||\n def.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION ||\n def.kind === Kind.INPUT_OBJECT_TYPE_EXTENSION\n ) {\n return named;\n }\n\n // Interfaces/unions are not valid input types.\n if (\n def.kind === Kind.INTERFACE_TYPE_DEFINITION ||\n def.kind === Kind.UNION_TYPE_DEFINITION\n ) {\n throw new GraphQLError(\n `Type \"${name}\" (${def.kind}) cannot be used in an input type`,\n );\n }\n\n // Anything else is unexpected.\n throw new GraphQLError(\n `Unsupported named type \"${name}\" of kind \"${def.kind}\"`,\n );\n }\n\n default:\n // Exhaustiveness guard\n throw new GraphQLError(\n `Unsupported TypeNode kind: ${JSON.stringify(typeNode)}`,\n );\n }\n}\n\nexport type StateValidationErrorKind =\n | \"MISSING\"\n | \"MISSING_OPTIONAL\"\n | \"UNKNOWN_FIELD\"\n | \"NON_NULL\"\n | \"TYPE\"\n | \"RECURSIVE_TYPE\";\n\nexport type StateValidationErrorPayload =\n | {\n kind: \"MISSING\";\n path: (string | number)[];\n field: string;\n expectedType?: string; // e.g. \"String!\"\n }\n | {\n kind: \"MISSING_OPTIONAL\";\n path: (string | number)[];\n field: string;\n expectedType?: string; // e.g. \"String\"\n }\n | {\n kind: \"UNKNOWN_FIELD\";\n path: (string | number)[];\n field: string;\n didYouMean?: string; // e.g. \"test\"\n typeName?: string; // e.g. \"Test5StateInput\"\n }\n | {\n kind: \"NON_NULL\";\n path: (string | number)[];\n field: string;\n expectedType?: string; // e.g. \"Int!\"\n }\n | {\n kind: \"TYPE\";\n path: (string | number)[];\n field: string;\n expectedType?: string; // e.g. \"String\" (or custom scalar)\n details?: string; // optional raw hint (e.g. \"cannot represent ...\")\n }\n | {\n kind: \"RECURSIVE_TYPE\";\n path: (string | number)[];\n field: string;\n typeName: string; // e.g. \"Item\"\n };\n\nexport class StateValidationError extends Error {\n readonly payload: StateValidationErrorPayload;\n readonly originalMessage?: string;\n\n constructor(payload: StateValidationErrorPayload, originalMessage?: string) {\n // Keep Error.message stable but not user-facing; UI should render from payload.\n super(payload.kind);\n this.name = \"StateValidationError\";\n this.payload = payload;\n this.originalMessage = originalMessage;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n get kind(): StateValidationErrorKind {\n return this.payload.kind;\n }\n\n get path(): (string | number)[] {\n return this.payload.path;\n }\n\n get field(): string {\n return this.payload.field;\n }\n}\n\nfunction extractInputPath(message: string): (string | number)[] {\n const match = message.match(/at\\s+\"([^\"]+)\"/);\n if (!match) return [];\n const parts = match[1].split(\".\").filter(Boolean);\n const withoutVar = parts[0] === \"v\" ? parts.slice(1) : parts;\n return withoutVar.map((p) => (/^\\d+$/.test(p) ? Number(p) : p));\n}\n\nconst RE_MISSING_REQUIRED_FIELD =\n /Field \"([^\"]+)\" of required type \"([^\"]+)\" was not provided\\./;\n\nconst RE_UNKNOWN_FIELD =\n /Field \"([^\"]+)\" is not defined by type \"([^\"]+)\"\\.(?: Did you mean \"([^\"]+)\"\\?)?/;\n\nfunction extractMissingRequiredField(\n message: string,\n): { field: string; expectedType: string } | null {\n const m = message.match(RE_MISSING_REQUIRED_FIELD);\n if (!m) return null;\n return { field: m[1], expectedType: m[2] };\n}\n\nfunction extractUnknownField(\n message: string,\n): { field: string; typeName: string; didYouMean?: string } | null {\n const m = message.match(RE_UNKNOWN_FIELD);\n if (!m) return null;\n return { field: m[1], typeName: m[2], didYouMean: m[3] };\n}\n\nfunction lastFieldFromPath(path: (string | number)[]): string | undefined {\n for (let i = path.length - 1; i >= 0; i--) {\n if (typeof path[i] === \"string\") return path[i] as string;\n }\n return undefined;\n}\n\nfunction extractExpectedType(message: string): string | undefined {\n // NON_NULL: Expected non-nullable type \"Int!\" not to be null.\n let m = message.match(/Expected non-nullable type \"([^\"]+)\"/);\n if (m?.[1]) return m[1];\n\n // Sometimes: Expected type \"X\" ...\n m = message.match(/Expected type \"([^\"]+)\"/);\n if (m?.[1]) return m[1];\n\n // Scalar coercion: \"; String cannot represent ...\"\n m = message.match(/;\\s*([_A-Za-z][_0-9A-Za-z]*)\\s+cannot represent/i);\n if (m?.[1]) return m[1];\n\n return undefined;\n}\n\nexport function graphQLErrorsToStateValidationErrors(\n errors: readonly Error[],\n): StateValidationError[] {\n const out: StateValidationError[] = [];\n\n for (const e of errors) {\n const originalMessage = e.message;\n\n // 1) Missing required field (no `at \"v.x\"` path usually)\n const missing = extractMissingRequiredField(originalMessage);\n if (missing) {\n out.push(\n new StateValidationError(\n {\n kind: \"MISSING\",\n path: [missing.field],\n field: missing.field,\n expectedType: missing.expectedType, // if your payload supports it\n },\n originalMessage,\n ),\n );\n continue;\n }\n\n // 2) Unknown field (extra key)\n const unknown = extractUnknownField(originalMessage);\n if (unknown) {\n out.push(\n new StateValidationError(\n {\n kind: \"UNKNOWN_FIELD\",\n path: [unknown.field],\n field: unknown.field,\n didYouMean: unknown.didYouMean, // optional\n },\n originalMessage,\n ),\n );\n continue;\n }\n\n // 3) Usual `at \"v.path\"` extraction (NON_NULL / TYPE)\n const path = extractInputPath(originalMessage);\n const field = lastFieldFromPath(path) ?? \"value\";\n const expectedType = extractExpectedType(originalMessage);\n\n if (\n originalMessage.includes(\"Expected non-nullable type\") &&\n originalMessage.includes(\"not to be null\")\n ) {\n out.push(\n new StateValidationError(\n { kind: \"NON_NULL\", path, field, expectedType },\n originalMessage,\n ),\n );\n continue;\n }\n\n if (\n originalMessage.includes(\"cannot represent\") ||\n originalMessage.includes(\"Expected type\")\n ) {\n out.push(\n new StateValidationError(\n {\n kind: \"TYPE\",\n path,\n field,\n expectedType,\n details: originalMessage,\n },\n originalMessage,\n ),\n );\n continue;\n }\n\n out.push(\n new StateValidationError(\n { kind: \"TYPE\", path, field, details: originalMessage },\n originalMessage,\n ),\n );\n }\n\n return out;\n}\n\n/**\n * Information about a missing field in the state object.\n */\nexport type MissingFieldInfo = {\n fieldName: string;\n path: (string | number)[];\n isRequired: boolean;\n /** The underlying type (unwrapped from NonNull if applicable) */\n type: TypeNode;\n};\n\n/**\n * Finds all fields defined in the schema that are missing from the state object.\n * Returns information about each missing field including whether it's required.\n */\nexport function findMissingFields(\n sharedSchemaDocumentNode: DocumentNode,\n rootTypeNode: ObjectTypeDefinitionNode,\n value: string | Record<string, unknown>,\n basePath: (string | number)[] = [],\n): MissingFieldInfo[] {\n let stateObjectJson: Record<string, unknown> | undefined;\n try {\n stateObjectJson =\n typeof value === \"string\"\n ? (JSON.parse(value) as Record<string, unknown>)\n : value;\n } catch {\n return [];\n }\n\n const typeByName = indexObjectTypes(sharedSchemaDocumentNode);\n const missingFields: MissingFieldInfo[] = [];\n\n for (const field of rootTypeNode.fields ?? []) {\n const fieldName = field.name.value;\n const fieldPath = [...basePath, fieldName];\n const isRequired = field.type.kind === Kind.NON_NULL_TYPE;\n // Unwrap NonNull to get the underlying type\n const underlyingType = isRequired\n ? (field.type as NonNullTypeNode).type\n : field.type;\n\n // Check if field is missing from the state object\n if (!(fieldName in stateObjectJson)) {\n missingFields.push({\n fieldName,\n path: fieldPath,\n isRequired,\n type: underlyingType,\n });\n continue;\n }\n\n // If present and object-typed → recurse to check nested missing fields\n const namedType = unwrapNamedType(field.type);\n const childType = namedType ? typeByName.get(namedType) : undefined;\n\n if (\n childType &&\n typeof stateObjectJson[fieldName] === \"object\" &&\n stateObjectJson[fieldName] !== null &&\n !Array.isArray(stateObjectJson[fieldName])\n ) {\n const nestedMissing = findMissingFields(\n sharedSchemaDocumentNode,\n childType,\n stateObjectJson[fieldName] as Record<string, unknown>,\n fieldPath,\n );\n missingFields.push(...nestedMissing);\n }\n }\n\n return missingFields;\n}\n\n/**\n * Detects optional fields defined in the schema that are missing from the state object.\n * Returns StateValidationError[] for each missing optional field.\n */\nexport function detectMissingOptionalFields(\n sharedSchemaDocumentNode: DocumentNode,\n rootTypeNode: ObjectTypeDefinitionNode,\n value: string | Record<string, unknown>,\n): StateValidationError[] {\n const missingFields = findMissingFields(\n sharedSchemaDocumentNode,\n rootTypeNode,\n value,\n );\n\n // Only report optional (not required) fields as MISSING_OPTIONAL errors\n // Required fields are already caught by GraphQL validation\n return missingFields\n .filter((field) => !field.isRequired)\n .map(\n (field) =>\n new StateValidationError({\n kind: \"MISSING_OPTIONAL\",\n path: field.path,\n field: field.fieldName,\n expectedType: typeNodeToString(field.type),\n }),\n );\n}\n\n/**\n * Detects fields that have recursive types (types that reference themselves directly or indirectly).\n * Returns a RECURSIVE_TYPE error for each field that contains a recursive type.\n */\nfunction detectRecursiveTypes(\n stateTypeDefinitionNode: ObjectTypeDefinitionNode,\n typeDefByName: Map<string, DefinitionNode>,\n): StateValidationError[] {\n const errors: StateValidationError[] = [];\n\n for (const field of stateTypeDefinitionNode.fields ?? []) {\n const fieldName = field.name.value;\n const namedTypeName = getNamedTypeName(field.type);\n\n if (!namedTypeName) continue;\n\n // Check if this field's type is recursive\n if (isRecursiveType(namedTypeName, typeDefByName, new Set())) {\n errors.push(\n new StateValidationError({\n kind: \"RECURSIVE_TYPE\",\n path: [fieldName],\n field: fieldName,\n typeName: namedTypeName,\n }),\n );\n }\n }\n\n return errors;\n}\n\n/**\n * Gets the named type name from a TypeNode, unwrapping NonNull and List types.\n */\nfunction getNamedTypeName(typeNode: TypeNode): string | null {\n if (typeNode.kind === Kind.NAMED_TYPE) {\n return typeNode.name.value;\n }\n if (\n typeNode.kind === Kind.NON_NULL_TYPE ||\n typeNode.kind === Kind.LIST_TYPE\n ) {\n return getNamedTypeName(typeNode.type);\n }\n return null;\n}\n\n/**\n * Checks if a type is recursive (references itself directly or indirectly through required fields).\n */\nfunction isRecursiveType(\n typeName: string,\n typeDefByName: Map<string, DefinitionNode>,\n visitedTypes: Set<string>,\n): boolean {\n if (visitedTypes.has(typeName)) {\n return true;\n }\n\n const typeDef = typeDefByName.get(typeName);\n if (!typeDef || typeDef.kind !== Kind.OBJECT_TYPE_DEFINITION) {\n return false;\n }\n\n visitedTypes.add(typeName);\n\n for (const field of typeDef.fields ?? []) {\n // Only check required fields for recursion (NonNull types)\n if (field.type.kind !== Kind.NON_NULL_TYPE) continue;\n\n const innerType = field.type.type;\n let fieldTypeName: string | null = null;\n\n if (innerType.kind === Kind.NAMED_TYPE) {\n fieldTypeName = innerType.name.value;\n } else if (innerType.kind === Kind.LIST_TYPE) {\n // For list types like [Item!]!, get the inner type\n fieldTypeName = getNamedTypeName(innerType);\n }\n\n if (\n fieldTypeName &&\n isRecursiveType(fieldTypeName, typeDefByName, visitedTypes)\n ) {\n return true;\n }\n }\n\n visitedTypes.delete(typeName);\n return false;\n}\n\n/**\n * Converts a TypeNode to its string representation (e.g., \"String\", \"Int!\", \"[String]!\")\n */\nfunction typeNodeToString(typeNode: TypeNode): string {\n switch (typeNode.kind) {\n case Kind.NAMED_TYPE:\n return typeNode.name.value;\n case Kind.NON_NULL_TYPE:\n return `${typeNodeToString(typeNode.type)}!`;\n case Kind.LIST_TYPE:\n return `[${typeNodeToString(typeNode.type)}]`;\n }\n}\n\nfunction indexObjectTypes(\n doc: DocumentNode,\n): Map<string, ObjectTypeDefinitionNode> {\n const map = new Map<string, ObjectTypeDefinitionNode>();\n for (const def of doc.definitions) {\n if (def.kind === Kind.OBJECT_TYPE_DEFINITION) {\n map.set(def.name.value, def);\n }\n }\n return map;\n}\n\nfunction unwrapNamedType(typeNode: TypeNode): string | undefined {\n if (typeNode.kind === Kind.NAMED_TYPE) return typeNode.name.value;\n if (typeNode.kind === Kind.NON_NULL_TYPE)\n return unwrapNamedType(typeNode.type);\n if (typeNode.kind === Kind.LIST_TYPE) return unwrapNamedType(typeNode.type);\n return undefined;\n}\n","import type { Diagnostic } from \"@codemirror/lint\";\nimport { pascalCase, sentenceCase } from \"change-case\";\nimport { Kind } from \"graphql\";\nimport { safeParseSdl } from \"../context/schema-context.js\";\nimport { makeStateSchemaNameForScope } from \"./helpers.js\";\n\nexport function ensureDocumentContainsNodeWithNameAndType(\n doc: string,\n nodeName: string,\n nodeType: keyof typeof Kind,\n): boolean {\n const parsedDoc = safeParseSdl(doc);\n\n if (!parsedDoc) return true;\n\n return parsedDoc.definitions.some((def) => {\n const hasMatchingType = def.kind === Kind[nodeType];\n\n return hasMatchingType && \"name\" in def && def.name?.value === nodeName;\n });\n}\n\nexport function createNodeTypeAndNameDiagnostic(\n doc: string,\n errorMessage: string,\n): Diagnostic | undefined {\n const parsedDoc = safeParseSdl(doc);\n if (!parsedDoc) return undefined;\n\n const firstNode = parsedDoc.definitions[0];\n\n const nameNode = \"name\" in firstNode ? firstNode.name : null;\n\n return {\n from: nameNode?.loc?.start ?? firstNode.loc?.start ?? 0,\n to: nameNode?.loc?.end ?? firstNode.loc?.end ?? 0,\n severity: \"error\",\n message: errorMessage,\n };\n}\n\nexport function ensureValidStateSchemaName(\n doc: string,\n modelName: string,\n scope: string,\n) {\n if (!safeParseSdl(doc)) return [];\n const requiredTypeName = makeStateSchemaNameForScope(modelName, scope);\n if (\n !ensureDocumentContainsNodeWithNameAndType(\n doc,\n requiredTypeName,\n \"OBJECT_TYPE_DEFINITION\",\n )\n ) {\n return [\n createNodeTypeAndNameDiagnostic(\n doc,\n `${sentenceCase(scope)} state schema must be named ${requiredTypeName}`,\n ),\n ].filter((d) => d !== undefined);\n }\n\n return [];\n}\n\nexport function ensureValidOperationSchemaInputName(\n doc: string | undefined,\n operationName: string,\n) {\n if (!doc || !safeParseSdl(doc)) return [];\n\n const requiredTypeName = `${pascalCase(operationName)}Input`;\n if (\n !ensureDocumentContainsNodeWithNameAndType(\n doc,\n requiredTypeName,\n \"INPUT_OBJECT_TYPE_DEFINITION\",\n )\n ) {\n return [\n createNodeTypeAndNameDiagnostic(\n doc,\n `Operation schema must contain an input type named ${requiredTypeName}`,\n ),\n ].filter((d) => d !== undefined);\n }\n\n return [];\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { t as require_graphql } from "./graphql-Du2phcBf.mjs";
2
- import { n as initialSchemaStr, r as typeDefsDoc, t as hiddenQueryTypeDefDoc } from "./documents-BWJpUm9f.mjs";
1
+ import { t as require_graphql } from "./graphql-DskHmkMe.mjs";
2
+ import { n as initialSchemaStr, r as typeDefsDoc, t as hiddenQueryTypeDefDoc } from "./documents-BFBPmyw1.mjs";
3
3
  import { createContext, useContext, useMemo } from "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  //#region editors/document-model-editor/context/schema-context.tsx
@@ -67,4 +67,4 @@ function useSchemaContext() {
67
67
  //#endregion
68
68
  export { safeParseSdl as n, useSchemaContext as r, SchemaContextProvider as t };
69
69
 
70
- //# sourceMappingURL=schema-context-BlHpyf8E.mjs.map
70
+ //# sourceMappingURL=schema-context-CX5ml_9t.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema-context-BlHpyf8E.mjs","names":["Kind"],"sources":["../../editors/document-model-editor/context/schema-context.tsx"],"sourcesContent":["import type { DefinitionNode, DocumentNode } from \"graphql\";\nimport { buildASTSchema, Kind, parse, printSchema } from \"graphql\";\nimport { createContext, useContext, useMemo } from \"react\";\nimport {\n hiddenQueryTypeDefDoc,\n initialSchemaStr,\n typeDefsDoc,\n} from \"../constants/documents.js\";\n\n/* Required to make the schema \"count\" as an actual schema */\nconst hiddenQueryTypeDefinitions =\n safeParseSdl(hiddenQueryTypeDefDoc)?.definitions ?? [];\n/* Scalar definitions from the Powerhouse standard library */\nconst standardLibCustomScalarDefinitions =\n safeParseSdl(typeDefsDoc)?.definitions ?? [];\n/* These are always included when building the shared schema, because they do not change */\nconst alwaysIncludedDefinitions: DefinitionNode[] = [\n ...hiddenQueryTypeDefinitions,\n ...standardLibCustomScalarDefinitions,\n];\n\n/* The shared schema is just a string to make memoization easier */\ntype TSchemaContext = {\n sharedSchema: string;\n error: Error | undefined;\n};\n\ntype TSchemaContextProps = {\n globalStateSchemaSdl: string;\n localStateSchemaSdl: string;\n operationSchemasSdl: string;\n children: React.ReactNode;\n};\n\n/*\n Combines the always-included definitions and all user SDLs into a single\n DocumentNode and builds a schema in one shot. Building atomically lets\n buildASTSchema resolve forward references between user types within the same\n document, and avoids the accumulation/staleness that a per-definition\n validate-then-merge strategy would introduce. Throws if the combined SDL is\n invalid; callers are expected to catch.\n*/\nfunction makeSharedSchemaSdl(\n globalStateSchemaSdl?: string,\n localStateSchemaSdl?: string,\n operationSchemasSdl?: string,\n): string {\n const definitions: DefinitionNode[] = [...alwaysIncludedDefinitions];\n\n for (const sdl of [\n globalStateSchemaSdl,\n localStateSchemaSdl,\n operationSchemasSdl,\n ]) {\n if (!sdl) continue;\n const ast = safeParseSdl(sdl);\n if (!ast) continue;\n definitions.push(...ast.definitions);\n }\n\n const documentNode: DocumentNode = {\n kind: Kind.DOCUMENT,\n definitions,\n };\n\n return printSchema(buildASTSchema(documentNode));\n}\n\n/*\n Parses an SDL string into an ast.\n Uses try catch and checks if the SDL is a valid document string to prevent errors from breaking the editor.\n*/\nexport function safeParseSdl(sdl: string) {\n try {\n if (!sdl) return null;\n return parse(sdl);\n } catch (_error) {\n return null;\n }\n}\n\nexport const SchemaContext = createContext<TSchemaContext>({\n sharedSchema: initialSchemaStr,\n error: undefined,\n});\n\nexport function parseSharedSchemaSdl(\n globalStateSchemaSdl?: string,\n localStateSchemaSdl?: string,\n operationSchemasSdl?: string,\n): TSchemaContext {\n try {\n return {\n sharedSchema: makeSharedSchemaSdl(\n globalStateSchemaSdl,\n localStateSchemaSdl,\n operationSchemasSdl,\n ),\n error: undefined,\n };\n } catch (error) {\n // Combined SDL is invalid (duplicate type, unknown reference, parse error, etc.).\n // Fall back to the minimal base schema so the JSON initial-value validator\n // gracefully finds no state type and skips, instead of producing a misleading\n // \"Field value has an invalid value.\" The real reason is surfaced via `error`.\n return {\n sharedSchema: initialSchemaStr,\n error:\n error instanceof Error\n ? error\n : new Error(\n typeof error === \"string\" ? error : JSON.stringify(error),\n { cause: error },\n ),\n };\n }\n}\n\n/*\n Provides the shared schema to the editor.\n We use the sdl string form to make memoization easier.\n*/\nexport function SchemaContextProvider(props: TSchemaContextProps) {\n const {\n children,\n globalStateSchemaSdl,\n localStateSchemaSdl,\n operationSchemasSdl,\n } = props;\n\n const sharedSchemaSdl = useMemo(\n () =>\n parseSharedSchemaSdl(\n globalStateSchemaSdl,\n localStateSchemaSdl,\n operationSchemasSdl,\n ),\n [globalStateSchemaSdl, localStateSchemaSdl, operationSchemasSdl],\n );\n\n return (\n <SchemaContext.Provider value={sharedSchemaSdl}>\n {children}\n </SchemaContext.Provider>\n );\n}\n\nexport function useSchemaContext() {\n return useContext(SchemaContext);\n}\n"],"mappings":";;;;;;AAUA,MAAM,6BACJ,aAAa,sBAAsB,EAAE,eAAe,EAAE;AAExD,MAAM,qCACJ,aAAa,YAAY,EAAE,eAAe,EAAE;AAE9C,MAAM,4BAA8C,CAClD,GAAG,4BACH,GAAG,mCACJ;AAuBD,SAAS,oBACP,sBACA,qBACA,qBACQ;CACR,MAAM,cAAgC,CAAC,GAAG,0BAA0B;AAEpE,MAAK,MAAM,OAAO;EAChB;EACA;EACA;EACD,EAAE;AACD,MAAI,CAAC,IAAK;EACV,MAAM,MAAM,aAAa,IAAI;AAC7B,MAAI,CAAC,IAAK;AACV,cAAY,KAAK,GAAG,IAAI,YAAY;;AAQtC,SAAA,GAAA,eAAA,cAAA,GAAA,eAAA,gBALmC;EACjC,MAAMA,eAAAA,KAAK;EACX;EACD,CAE8C,CAAC;;AAOlD,SAAgB,aAAa,KAAa;AACxC,KAAI;AACF,MAAI,CAAC,IAAK,QAAO;AACjB,UAAA,GAAA,eAAA,OAAa,IAAI;UACV,QAAQ;AACf,SAAO;;;AAIX,MAAa,gBAAgB,cAA8B;CACzD,cAAc;CACd,OAAO,KAAA;CACR,CAAC;AAEF,SAAgB,qBACd,sBACA,qBACA,qBACgB;AAChB,KAAI;AACF,SAAO;GACL,cAAc,oBACZ,sBACA,qBACA,oBACD;GACD,OAAO,KAAA;GACR;UACM,OAAO;AAKd,SAAO;GACL,cAAc;GACd,OACE,iBAAiB,QACb,QACA,IAAI,MACF,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,MAAM,EACzD,EAAE,OAAO,OAAO,CACjB;GACR;;;AAQL,SAAgB,sBAAsB,OAA4B;CAChE,MAAM,EACJ,UACA,sBACA,qBACA,wBACE;CAEJ,MAAM,kBAAkB,cAEpB,qBACE,sBACA,qBACA,oBACD,EACH;EAAC;EAAsB;EAAqB;EAAoB,CACjE;AAED,QACE,oBAAC,cAAc,UAAf;EAAwB,OAAO;EAC5B;EACsB,CAAA;;AAI7B,SAAgB,mBAAmB;AACjC,QAAO,WAAW,cAAc"}
1
+ {"version":3,"file":"schema-context-CX5ml_9t.mjs","names":["Kind"],"sources":["../../editors/document-model-editor/context/schema-context.tsx"],"sourcesContent":["import type { DefinitionNode, DocumentNode } from \"graphql\";\nimport { buildASTSchema, Kind, parse, printSchema } from \"graphql\";\nimport { createContext, useContext, useMemo } from \"react\";\nimport {\n hiddenQueryTypeDefDoc,\n initialSchemaStr,\n typeDefsDoc,\n} from \"../constants/documents.js\";\n\n/* Required to make the schema \"count\" as an actual schema */\nconst hiddenQueryTypeDefinitions =\n safeParseSdl(hiddenQueryTypeDefDoc)?.definitions ?? [];\n/* Scalar definitions from the Powerhouse standard library */\nconst standardLibCustomScalarDefinitions =\n safeParseSdl(typeDefsDoc)?.definitions ?? [];\n/* These are always included when building the shared schema, because they do not change */\nconst alwaysIncludedDefinitions: DefinitionNode[] = [\n ...hiddenQueryTypeDefinitions,\n ...standardLibCustomScalarDefinitions,\n];\n\n/* The shared schema is just a string to make memoization easier */\ntype TSchemaContext = {\n sharedSchema: string;\n error: Error | undefined;\n};\n\ntype TSchemaContextProps = {\n globalStateSchemaSdl: string;\n localStateSchemaSdl: string;\n operationSchemasSdl: string;\n children: React.ReactNode;\n};\n\n/*\n Combines the always-included definitions and all user SDLs into a single\n DocumentNode and builds a schema in one shot. Building atomically lets\n buildASTSchema resolve forward references between user types within the same\n document, and avoids the accumulation/staleness that a per-definition\n validate-then-merge strategy would introduce. Throws if the combined SDL is\n invalid; callers are expected to catch.\n*/\nfunction makeSharedSchemaSdl(\n globalStateSchemaSdl?: string,\n localStateSchemaSdl?: string,\n operationSchemasSdl?: string,\n): string {\n const definitions: DefinitionNode[] = [...alwaysIncludedDefinitions];\n\n for (const sdl of [\n globalStateSchemaSdl,\n localStateSchemaSdl,\n operationSchemasSdl,\n ]) {\n if (!sdl) continue;\n const ast = safeParseSdl(sdl);\n if (!ast) continue;\n definitions.push(...ast.definitions);\n }\n\n const documentNode: DocumentNode = {\n kind: Kind.DOCUMENT,\n definitions,\n };\n\n return printSchema(buildASTSchema(documentNode));\n}\n\n/*\n Parses an SDL string into an ast.\n Uses try catch and checks if the SDL is a valid document string to prevent errors from breaking the editor.\n*/\nexport function safeParseSdl(sdl: string) {\n try {\n if (!sdl) return null;\n return parse(sdl);\n } catch (_error) {\n return null;\n }\n}\n\nexport const SchemaContext = createContext<TSchemaContext>({\n sharedSchema: initialSchemaStr,\n error: undefined,\n});\n\nexport function parseSharedSchemaSdl(\n globalStateSchemaSdl?: string,\n localStateSchemaSdl?: string,\n operationSchemasSdl?: string,\n): TSchemaContext {\n try {\n return {\n sharedSchema: makeSharedSchemaSdl(\n globalStateSchemaSdl,\n localStateSchemaSdl,\n operationSchemasSdl,\n ),\n error: undefined,\n };\n } catch (error) {\n // Combined SDL is invalid (duplicate type, unknown reference, parse error, etc.).\n // Fall back to the minimal base schema so the JSON initial-value validator\n // gracefully finds no state type and skips, instead of producing a misleading\n // \"Field value has an invalid value.\" The real reason is surfaced via `error`.\n return {\n sharedSchema: initialSchemaStr,\n error:\n error instanceof Error\n ? error\n : new Error(\n typeof error === \"string\" ? error : JSON.stringify(error),\n { cause: error },\n ),\n };\n }\n}\n\n/*\n Provides the shared schema to the editor.\n We use the sdl string form to make memoization easier.\n*/\nexport function SchemaContextProvider(props: TSchemaContextProps) {\n const {\n children,\n globalStateSchemaSdl,\n localStateSchemaSdl,\n operationSchemasSdl,\n } = props;\n\n const sharedSchemaSdl = useMemo(\n () =>\n parseSharedSchemaSdl(\n globalStateSchemaSdl,\n localStateSchemaSdl,\n operationSchemasSdl,\n ),\n [globalStateSchemaSdl, localStateSchemaSdl, operationSchemasSdl],\n );\n\n return (\n <SchemaContext.Provider value={sharedSchemaSdl}>\n {children}\n </SchemaContext.Provider>\n );\n}\n\nexport function useSchemaContext() {\n return useContext(SchemaContext);\n}\n"],"mappings":";;;;;;AAUA,MAAM,6BACJ,aAAa,sBAAsB,EAAE,eAAe,EAAE;AAExD,MAAM,qCACJ,aAAa,YAAY,EAAE,eAAe,EAAE;AAE9C,MAAM,4BAA8C,CAClD,GAAG,4BACH,GAAG,mCACJ;AAuBD,SAAS,oBACP,sBACA,qBACA,qBACQ;CACR,MAAM,cAAgC,CAAC,GAAG,0BAA0B;AAEpE,MAAK,MAAM,OAAO;EAChB;EACA;EACA;EACD,EAAE;AACD,MAAI,CAAC,IAAK;EACV,MAAM,MAAM,aAAa,IAAI;AAC7B,MAAI,CAAC,IAAK;AACV,cAAY,KAAK,GAAG,IAAI,YAAY;;AAQtC,SAAA,GAAA,eAAA,cAAA,GAAA,eAAA,gBALmC;EACjC,MAAMA,eAAAA,KAAK;EACX;EACD,CAE8C,CAAC;;AAOlD,SAAgB,aAAa,KAAa;AACxC,KAAI;AACF,MAAI,CAAC,IAAK,QAAO;AACjB,UAAA,GAAA,eAAA,OAAa,IAAI;UACV,QAAQ;AACf,SAAO;;;AAIX,MAAa,gBAAgB,cAA8B;CACzD,cAAc;CACd,OAAO,KAAA;CACR,CAAC;AAEF,SAAgB,qBACd,sBACA,qBACA,qBACgB;AAChB,KAAI;AACF,SAAO;GACL,cAAc,oBACZ,sBACA,qBACA,oBACD;GACD,OAAO,KAAA;GACR;UACM,OAAO;AAKd,SAAO;GACL,cAAc;GACd,OACE,iBAAiB,QACb,QACA,IAAI,MACF,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,MAAM,EACzD,EAAE,OAAO,OAAO,CACjB;GACR;;;AAQL,SAAgB,sBAAsB,OAA4B;CAChE,MAAM,EACJ,UACA,sBACA,qBACA,wBACE;CAEJ,MAAM,kBAAkB,cAEpB,qBACE,sBACA,qBACA,oBACD,EACH;EAAC;EAAsB;EAAqB;EAAoB,CACjE;AAED,QACE,oBAAC,cAAc,UAAf;EAAwB,OAAO;EAC5B;EACsB,CAAA;;AAI7B,SAAgB,mBAAmB;AACjC,QAAO,WAAW,cAAc"}
@@ -0,0 +1,309 @@
1
+ import { t as require_graphql } from "./graphql-DskHmkMe.mjs";
2
+ import { C as twMerge, i as Trigger, n as List, r as Root2, t as Content } from "./dist-BeZaEP6S.mjs";
3
+ import { r as typeDefsDoc } from "./documents-BFBPmyw1.mjs";
4
+ import { f as makeStateSchemaNameForScope, l as makeInitialSchemaDoc, m as validateStateObject, n as ensureValidStateSchemaName, r as StateValidationError, u as makeMinimalObjectForStateType } from "./linting-Dx50GuLN.mjs";
5
+ import { n as safeParseSdl, r as useSchemaContext } from "./schema-context-CX5ml_9t.mjs";
6
+ import * as React$1 from "react";
7
+ import { Suspense, forwardRef, lazy, useCallback, useEffect, useMemo, useRef, useState } from "react";
8
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
9
+ //#region editors/document-model-editor/components/button.tsx
10
+ var import_graphql = require_graphql();
11
+ const Button = forwardRef((props, ref) => {
12
+ const { className, ...rest } = props;
13
+ return /* @__PURE__ */ jsx("button", {
14
+ ref,
15
+ ...rest,
16
+ className: twMerge("h-10 rounded-md border border-gray-200 bg-gray-50 px-4 py-2 text-sm font-medium whitespace-nowrap text-gray-900 transition-colors hover:bg-gray-100 hover:text-gray-900 focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50 dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:hover:bg-slate-700 dark:hover:text-slate-50", className)
17
+ });
18
+ });
19
+ //#endregion
20
+ //#region editors/document-model-editor/components/state-error.tsx
21
+ function StateValidationErrorMessage({ error }) {
22
+ const { payload } = error;
23
+ switch (payload.kind) {
24
+ case "MISSING": return /* @__PURE__ */ jsxs("span", { children: [
25
+ "Field ",
26
+ /* @__PURE__ */ jsx("strong", { children: payload.field }),
27
+ " is missing."
28
+ ] });
29
+ case "MISSING_OPTIONAL": return /* @__PURE__ */ jsxs("span", { children: [
30
+ "Optional field ",
31
+ /* @__PURE__ */ jsx("strong", { children: payload.field }),
32
+ " is not defined."
33
+ ] });
34
+ case "UNKNOWN_FIELD": return /* @__PURE__ */ jsxs("span", { children: [
35
+ "Field ",
36
+ /* @__PURE__ */ jsx("strong", { children: payload.field }),
37
+ " is not a known field."
38
+ ] });
39
+ case "NON_NULL": return /* @__PURE__ */ jsxs("span", { children: [
40
+ "Field ",
41
+ /* @__PURE__ */ jsx("strong", { children: payload.field }),
42
+ " cannot be null."
43
+ ] });
44
+ case "TYPE": return /* @__PURE__ */ jsxs("span", { children: [
45
+ "Field ",
46
+ /* @__PURE__ */ jsx("strong", { children: payload.field }),
47
+ payload.expectedType ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
48
+ " ",
49
+ "must be a",
50
+ " ",
51
+ /* @__PURE__ */ jsx("strong", { children: payload.expectedType.replace(/!/g, "") }),
52
+ "."
53
+ ] }) : /* @__PURE__ */ jsx(Fragment$1, { children: " has an invalid value." })
54
+ ] });
55
+ case "RECURSIVE_TYPE": return /* @__PURE__ */ jsxs("span", { children: [
56
+ "Field ",
57
+ /* @__PURE__ */ jsx("strong", { children: payload.typeName }),
58
+ " has a recursive type. It must be optional."
59
+ ] });
60
+ default: return /* @__PURE__ */ jsx("span", { children: "Invalid value." });
61
+ }
62
+ }
63
+ //#endregion
64
+ //#region editors/document-model-editor/components/tabs.tsx
65
+ const Tabs = Root2;
66
+ const TabsList = React$1.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(List, {
67
+ ref,
68
+ className: twMerge("flex items-center justify-center rounded-xl bg-gray-50 p-1 shadow-inner dark:bg-slate-800", className),
69
+ ...props
70
+ }));
71
+ TabsList.displayName = List.displayName;
72
+ const TabsTrigger = React$1.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(Trigger, {
73
+ ref,
74
+ className: twMerge("flex w-full items-center justify-center rounded-lg p-1 text-sm whitespace-nowrap text-gray-500 transition-all disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-gray-50 data-[state=active]:text-gray-800 data-[state=active]:shadow-tab dark:text-slate-400", className),
75
+ ...props
76
+ }));
77
+ TabsTrigger.displayName = Trigger.displayName;
78
+ const TabsContent = React$1.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(Content, {
79
+ ref,
80
+ className,
81
+ ...props
82
+ }));
83
+ TabsContent.displayName = Content.displayName;
84
+ //#endregion
85
+ //#region editors/document-model-editor/components/state-schemas.tsx
86
+ const GraphqlEditor = lazy(() => import("./graphql-editor-CguODwLN.mjs"));
87
+ const JSONEditor = lazy(() => import("./json-editor-BsqJRyZr.mjs"));
88
+ function StateEditor({ modelName, stateSchema, initialValue, setStateSchema, setInitialState, scope }) {
89
+ const { sharedSchema: sharedSchemaSdl, error: sharedSchemaError } = useSchemaContext();
90
+ const [showStandardLib, setShowStandardLib] = useState(false);
91
+ const [syncWithSchema, setSyncWithSchema] = useState(true);
92
+ const customLinter = useCallback((doc) => ensureValidStateSchemaName(doc, modelName, scope), [modelName, scope]);
93
+ const schemaErrors = useMemo(() => {
94
+ const errors = ensureValidStateSchemaName(stateSchema, modelName, scope);
95
+ if (sharedSchemaError) return [...errors, sharedSchemaError];
96
+ return errors;
97
+ }, [
98
+ stateSchema,
99
+ modelName,
100
+ scope,
101
+ sharedSchemaError
102
+ ]);
103
+ const handleToggleStandardLib = useCallback(() => {
104
+ setShowStandardLib((prev) => !prev);
105
+ }, []);
106
+ const handleSchemaUpdate = useCallback((newDoc) => setStateSchema(newDoc, scope), [setStateSchema, scope]);
107
+ const handleInitialStateUpdate = useCallback((newDoc) => setInitialState(newDoc, scope), [setInitialState, scope]);
108
+ const hasSyncedRef = useRef(false);
109
+ const { initialValueErrors, fixedState } = useMemo(() => {
110
+ const existingValue = initialValue || "{}";
111
+ const sharedSchemaDocumentNode = safeParseSdl(sharedSchemaSdl);
112
+ if (!sharedSchemaDocumentNode) return {
113
+ initialValueErrors: [],
114
+ fixedState: null
115
+ };
116
+ const stateTypeName = makeStateSchemaNameForScope(modelName, scope);
117
+ if (!stateTypeName) return {
118
+ initialValueErrors: [],
119
+ fixedState: null
120
+ };
121
+ const stateTypeDefinitionNode = sharedSchemaDocumentNode.definitions.find((def) => def.kind === import_graphql.Kind.OBJECT_TYPE_DEFINITION && def.name.value === stateTypeName);
122
+ if (!stateTypeDefinitionNode || stateTypeDefinitionNode.kind !== import_graphql.Kind.OBJECT_TYPE_DEFINITION) return {
123
+ initialValueErrors: [],
124
+ fixedState: null
125
+ };
126
+ const errors = validateStateObject(sharedSchemaDocumentNode, stateTypeDefinitionNode, existingValue);
127
+ if (errors.length && syncWithSchema) {
128
+ const computedFixedState = makeMinimalObjectForStateType({
129
+ sharedSchemaDocumentNode,
130
+ stateTypeDefinitionNode,
131
+ existingValue
132
+ });
133
+ if (initialValue !== computedFixedState) return {
134
+ initialValueErrors: [],
135
+ fixedState: computedFixedState
136
+ };
137
+ }
138
+ return {
139
+ initialValueErrors: errors,
140
+ fixedState: null
141
+ };
142
+ }, [
143
+ sharedSchemaSdl,
144
+ initialValue,
145
+ syncWithSchema,
146
+ scope,
147
+ modelName
148
+ ]);
149
+ useEffect(() => {
150
+ if (fixedState && !hasSyncedRef.current) {
151
+ hasSyncedRef.current = true;
152
+ setInitialState(fixedState, scope);
153
+ } else if (!fixedState) hasSyncedRef.current = false;
154
+ }, [
155
+ fixedState,
156
+ setInitialState,
157
+ scope
158
+ ]);
159
+ return /* @__PURE__ */ jsxs("div", {
160
+ className: "grid grid-cols-2 gap-4",
161
+ children: [/* @__PURE__ */ jsxs("div", { children: [
162
+ /* @__PURE__ */ jsxs("h3", {
163
+ className: "mb-2 text-lg text-gray-900 capitalize dark:text-slate-100",
164
+ children: [scope, " state schema *"]
165
+ }),
166
+ /* @__PURE__ */ jsxs(Button, {
167
+ onClick: handleToggleStandardLib,
168
+ className: "mb-2 flex w-fit items-center gap-2",
169
+ children: [
170
+ showStandardLib ? "Hide" : "Show",
171
+ " standard library",
172
+ /* @__PURE__ */ jsx("svg", {
173
+ className: twMerge("inline-block transition-transform", showStandardLib ? "rotate-180" : "rotate-0"),
174
+ xmlns: "http://www.w3.org/2000/svg",
175
+ width: "24",
176
+ height: "24",
177
+ viewBox: "0 0 24 24",
178
+ fill: "currentColor",
179
+ children: /* @__PURE__ */ jsx("path", {
180
+ d: "M11.9883 6.01172C11.4363 6.01172 10.9883 6.45972 10.9883 7.01172V13.0117H6.98828L11.9883 18.0117L16.9883 13.0117H12.9883V7.01172C12.9883 6.45972 12.5403 6.01172 11.9883 6.01172Z",
181
+ fill: "currentColor"
182
+ })
183
+ })
184
+ ]
185
+ }),
186
+ /* @__PURE__ */ jsxs(Suspense, { children: [
187
+ showStandardLib && /* @__PURE__ */ jsx(GraphqlEditor, {
188
+ doc: typeDefsDoc,
189
+ readonly: true
190
+ }),
191
+ /* @__PURE__ */ jsx(GraphqlEditor, {
192
+ doc: stateSchema,
193
+ updateDocumentInModel: handleSchemaUpdate,
194
+ customLinter
195
+ }),
196
+ schemaErrors.length > 0 && /* @__PURE__ */ jsx("p", {
197
+ className: "mt-2 text-sm text-red-600 dark:text-red-100",
198
+ children: schemaErrors[0].message
199
+ })
200
+ ] })
201
+ ] }), /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("div", {
202
+ className: "flex flex-col items-end",
203
+ children: [/* @__PURE__ */ jsxs("h3", {
204
+ className: "mb-2 text-right text-lg text-gray-900 capitalize dark:text-slate-100",
205
+ children: [scope, " state initial value *"]
206
+ }), /* @__PURE__ */ jsxs("label", {
207
+ className: "mb-2 flex w-fit items-center gap-2 rounded-md border border-gray-200 bg-gray-50 p-2 text-sm font-medium whitespace-nowrap text-gray-900 transition-colors focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:hover:bg-slate-500 dark:hover:text-slate-50",
208
+ children: [
209
+ /* @__PURE__ */ jsx("input", {
210
+ type: "checkbox",
211
+ className: "",
212
+ value: syncWithSchema.toString(),
213
+ onChange: (e) => {
214
+ setSyncWithSchema(e.currentTarget.value === "true" ? true : false);
215
+ }
216
+ }),
217
+ "Sync with schema",
218
+ " ",
219
+ /* @__PURE__ */ jsx("svg", {
220
+ className: "inline-block",
221
+ xmlns: "http://www.w3.org/2000/svg",
222
+ width: "16",
223
+ height: "16",
224
+ viewBox: "0 0 16 16",
225
+ fill: "none",
226
+ children: /* @__PURE__ */ jsx("path", {
227
+ d: "M8.00521 1.99219C6.63588 1.99219 5.32788 2.45152 4.27588 3.28419C3.98721 3.51219 3.94321 3.93285 4.17188 4.22151C4.40054 4.51018 4.82055 4.55418 5.10921 4.32552C5.92721 3.67819 6.93921 3.32552 8.00521 3.32552C10.5825 3.32552 12.6719 5.41485 12.6719 7.99218H11.3385L13.3385 10.6588L15.3385 7.99218H14.0052C14.0052 4.67818 11.3192 1.99219 8.00521 1.99219ZM2.67188 5.32552L0.671875 7.99218H2.00521C2.00521 11.3062 4.69121 13.9922 8.00521 13.9922C9.37521 13.9922 10.6825 13.5335 11.7345 12.7002C12.0232 12.4722 12.0672 12.0515 11.8385 11.7628C11.6099 11.4742 11.1899 11.4302 10.9012 11.6588C10.0825 12.3068 9.07188 12.6588 8.00521 12.6588C5.42788 12.6588 3.33854 10.5695 3.33854 7.99218H4.67188L2.67188 5.32552Z",
228
+ fill: "currentColor"
229
+ })
230
+ })
231
+ ]
232
+ })]
233
+ }), /* @__PURE__ */ jsxs(Suspense, { children: [/* @__PURE__ */ jsx(JSONEditor, {
234
+ doc: initialValue,
235
+ updateDocumentInModel: handleInitialStateUpdate
236
+ }), initialValueErrors.map((error, index) => /* @__PURE__ */ jsx("p", {
237
+ className: "mt-2 text-sm text-red-600 dark:text-red-100",
238
+ children: error instanceof StateValidationError ? /* @__PURE__ */ jsx(StateValidationErrorMessage, { error }) : error.message
239
+ }, index))] })] })]
240
+ });
241
+ }
242
+ function StateSchemas({ modelName, globalStateSchema, localStateSchema, globalStateInitialValue, localStateInitialValue, setStateSchema, setInitialState, currentScope, onScopeChange }) {
243
+ const handleAddLocalState = useCallback(() => {
244
+ setStateSchema(makeInitialSchemaDoc(modelName, "local"), "local");
245
+ setInitialState("", "local");
246
+ }, [
247
+ modelName,
248
+ setStateSchema,
249
+ setInitialState
250
+ ]);
251
+ return /* @__PURE__ */ jsxs(Tabs, {
252
+ className: "pb-8",
253
+ activationMode: "manual",
254
+ value: currentScope,
255
+ onValueChange: (value) => onScopeChange(value),
256
+ children: [
257
+ /* @__PURE__ */ jsx("div", {
258
+ className: "my-6",
259
+ children: /* @__PURE__ */ jsxs(TabsList, {
260
+ className: "mx-auto flex max-w-sm",
261
+ children: [/* @__PURE__ */ jsx(TabsTrigger, {
262
+ value: "global",
263
+ children: "Global"
264
+ }), /* @__PURE__ */ jsx(TabsTrigger, {
265
+ value: "local",
266
+ children: "Local"
267
+ })]
268
+ })
269
+ }),
270
+ /* @__PURE__ */ jsx(TabsContent, {
271
+ value: "global",
272
+ tabIndex: -1,
273
+ children: /* @__PURE__ */ jsx(StateEditor, {
274
+ modelName,
275
+ stateSchema: globalStateSchema,
276
+ initialValue: globalStateInitialValue,
277
+ setStateSchema,
278
+ setInitialState,
279
+ scope: "global"
280
+ })
281
+ }),
282
+ /* @__PURE__ */ jsx(TabsContent, {
283
+ value: "local",
284
+ tabIndex: -1,
285
+ children: !localStateSchema ? /* @__PURE__ */ jsxs("div", {
286
+ className: "",
287
+ children: [/* @__PURE__ */ jsx("h3", {
288
+ className: "mb-2 text-lg text-gray-900 capitalize dark:text-slate-100",
289
+ children: "local state schema *"
290
+ }), /* @__PURE__ */ jsx(Button, {
291
+ onClick: handleAddLocalState,
292
+ children: "Add local state"
293
+ })]
294
+ }) : /* @__PURE__ */ jsx(StateEditor, {
295
+ modelName,
296
+ stateSchema: localStateSchema,
297
+ initialValue: localStateInitialValue,
298
+ setStateSchema,
299
+ setInitialState,
300
+ scope: "local"
301
+ })
302
+ })
303
+ ]
304
+ });
305
+ }
306
+ //#endregion
307
+ export { StateSchemas as default };
308
+
309
+ //# sourceMappingURL=state-schemas-IFtqLFoH.mjs.map