@powerhousedao/vetra 6.1.0-dev.18 → 6.1.0-dev.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{editor-sUXYA9VX.js → editor-BQxk6LrL.js} +2 -2
- package/dist/{editor-sUXYA9VX.js.map → editor-BQxk6LrL.js.map} +1 -1
- package/dist/{editor-DyS_vXkB.js → editor-ClvvgHg3.js} +2 -2
- package/dist/{editor-DyS_vXkB.js.map → editor-ClvvgHg3.js.map} +1 -1
- package/dist/{editor-FQIqobD5.js → editor-DLluDQKM.js} +2 -2
- package/dist/{editor-FQIqobD5.js.map → editor-DLluDQKM.js.map} +1 -1
- package/dist/{editor-BKBwkOyg.js → editor-Dw-NohMb.js} +2 -2
- package/dist/{editor-BKBwkOyg.js.map → editor-Dw-NohMb.js.map} +1 -1
- package/dist/{editor-BRPbTxCe.js → editor-UWE1ab9Y.js} +2 -2
- package/dist/{editor-BRPbTxCe.js.map → editor-UWE1ab9Y.js.map} +1 -1
- package/dist/editors/hooks/index.js +1 -1
- package/dist/editors/index.js +1 -1
- package/dist/{factory-BxLD9mLU.js → factory-4o53XqHE.js} +2 -2
- package/dist/{factory-BxLD9mLU.js.map → factory-4o53XqHE.js.map} +1 -1
- package/dist/{factory-DYahTvFP.js → factory-Dexxeo5C.js} +2 -2
- package/dist/{factory-DYahTvFP.js.map → factory-Dexxeo5C.js.map} +1 -1
- package/dist/{hooks-BIgFcbaF.js → hooks-Btogj1f0.js} +1 -1
- package/dist/{hooks-BIgFcbaF.js.map → hooks-Btogj1f0.js.map} +1 -1
- package/dist/index.js +1 -1
- package/dist/{logger-Bst62sUy.js → logger-CYkStoEb.js} +1 -1
- package/dist/{logger-Bst62sUy.js.map → logger-CYkStoEb.js.map} +1 -1
- package/dist/{module-CKUcFGYR.js → module-BTlKlxoV.js} +6 -6
- package/dist/{module-CKUcFGYR.js.map → module-BTlKlxoV.js.map} +1 -1
- package/dist/processors/codegen/index.js +1 -1
- package/dist/processors/index.js +1 -1
- package/dist/processors/vetra-read-model/index.js +1 -1
- package/dist/switchboard-C2L9IAfe.js +8 -0
- package/dist/{switchboard-DWB0JsMt.js.map → switchboard-C2L9IAfe.js.map} +1 -1
- package/package.json +8 -8
- package/dist/switchboard-DWB0JsMt.js +0 -8
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { b as setAppStatus, g as addDocumentType, h as setDragAndDropEnabled, v as removeDocumentType, x as setDocumentTypes, y as setAppName } from "./utils-B4KdjDnp.js";
|
|
2
2
|
import { s as useSelectedAppModuleDocument } from "./app-module-dG7ug7Cm.js";
|
|
3
3
|
import { StatusPill } from "./editors/components/index.js";
|
|
4
|
-
import { t as useDebounce } from "./hooks-
|
|
4
|
+
import { t as useDebounce } from "./hooks-Btogj1f0.js";
|
|
5
5
|
import { useDocumentTypesInSelectedDrive, useSetPHDocumentEditorConfig, useSupportedDocumentTypesInReactor } from "@powerhousedao/reactor-browser";
|
|
6
6
|
import { useCallback, useEffect, useState } from "react";
|
|
7
7
|
import { twMerge } from "tailwind-merge";
|
|
@@ -197,4 +197,4 @@ function Editor() {
|
|
|
197
197
|
//#endregion
|
|
198
198
|
export { Editor as default };
|
|
199
199
|
|
|
200
|
-
//# sourceMappingURL=editor-
|
|
200
|
+
//# sourceMappingURL=editor-BQxk6LrL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor-sUXYA9VX.js","names":[],"sources":["../editors/app-editor/components/AppEditorForm.tsx","../editors/app-editor/config.ts","../editors/app-editor/editor.tsx"],"sourcesContent":["import {\n useDocumentTypesInSelectedDrive,\n useSupportedDocumentTypesInReactor,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n addDocumentType,\n removeDocumentType,\n setAppName,\n setAppStatus,\n setDocumentTypes,\n setDragAndDropEnabled,\n} from \"@powerhousedao/vetra/document-models/app-module\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useSelectedAppModuleDocument } from \"../../../document-models/app-module/index.js\";\nimport { StatusPill } from \"../../components/index.js\";\nimport { useDebounce } from \"../../hooks/index.js\";\n\nconst ALL_IN_DRIVE = \"all-in-drive\";\nconst ALL_IN_REACTOR = \"all-in-reactor\";\nconst ALLOW_ANY = \"allow-any\";\n\nexport const AppEditorForm = () => {\n const [document, dispatch] = useSelectedAppModuleDocument();\n const documentName = document.state.global.name;\n const status = document.state.global.status;\n const isDragAndDropEnabled = document.state.global.isDragAndDropEnabled;\n const allowedDocumentTypes = document.state.global.allowedDocumentTypes;\n const [appName, handleSetAppName] = useState(documentName);\n const [isConfirmed, setIsConfirmed] = useState(status === \"CONFIRMED\");\n const documentTypesInSelectedDrive = useDocumentTypesInSelectedDrive();\n const supportedDocumentTypesInReactor = useSupportedDocumentTypesInReactor();\n const [selectedDocumentTypes, setSelectedDocumentTypes] = useState(\n allowedDocumentTypes ?? [],\n );\n\n // Use the debounce hook for name changes\n\n const onNameChange = useCallback(\n (name: string) => {\n if (name === documentName) return;\n console.log(\"onNameChange\", name);\n dispatch(setAppName({ name }));\n },\n [documentName, dispatch],\n );\n\n useDebounce(appName, onNameChange, 300);\n\n const onConfirm = () => {\n dispatch(setAppStatus({ status: \"CONFIRMED\" }));\n };\n\n const onDragAndDropToggle = (enabled: boolean) => {\n if (enabled === isDragAndDropEnabled) return;\n dispatch(setDragAndDropEnabled({ enabled }));\n };\n\n // Reset confirmation state if status changes back to DRAFT\n useEffect(() => {\n if (status === \"DRAFT\") {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setIsConfirmed(false);\n }\n }, [status]);\n\n // Check if form should be read-only\n const isReadOnly = isConfirmed || status === \"CONFIRMED\";\n\n const handleConfirm = () => {\n if (appName.trim()) {\n setIsConfirmed(true); // Immediate UI update\n onConfirm();\n }\n };\n\n const handleAddDocumentType = (documentType: string) => {\n if (!documentType || selectedDocumentTypes.includes(documentType)) return;\n setSelectedDocumentTypes([...selectedDocumentTypes, documentType]);\n dispatch(addDocumentType({ documentType }));\n };\n\n const handleRemoveDocumentType = (documentType: string) => {\n setSelectedDocumentTypes(\n selectedDocumentTypes.filter((dt) => dt !== documentType),\n );\n dispatch(removeDocumentType({ documentType }));\n };\n\n const handleAddAllDocumentTypesInDrive = () => {\n const newDocumentTypes = [\n ...new Set([\n ...selectedDocumentTypes,\n ...(documentTypesInSelectedDrive ?? []),\n ]),\n ];\n setSelectedDocumentTypes(newDocumentTypes);\n dispatch(setDocumentTypes({ documentTypes: newDocumentTypes }));\n };\n\n const handleAddAllDocumentTypesInReactor = () => {\n const newDocumentTypes = [\n ...new Set([\n ...selectedDocumentTypes,\n ...(supportedDocumentTypesInReactor ?? []),\n ]),\n ];\n setSelectedDocumentTypes(newDocumentTypes);\n dispatch(setDocumentTypes({ documentTypes: newDocumentTypes }));\n };\n\n const handleAllowAnyDocumentType = () => {\n setSelectedDocumentTypes([]);\n dispatch(setDocumentTypes({ documentTypes: [] }));\n };\n\n const handleDocumentTypeSelection = (selectedValue: string) => {\n if (selectedValue === ALL_IN_DRIVE) {\n handleAddAllDocumentTypesInDrive();\n } else if (selectedValue === ALL_IN_REACTOR) {\n handleAddAllDocumentTypesInReactor();\n } else if (selectedValue === ALLOW_ANY) {\n handleAllowAnyDocumentType();\n } else {\n handleAddDocumentType(selectedValue);\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-medium text-gray-900 dark:text-slate-50\">\n App Configuration\n </h2>\n <StatusPill\n status={status === \"CONFIRMED\" ? \"confirmed\" : \"draft\"}\n label={status === \"CONFIRMED\" ? \"Confirmed\" : \"Draft\"}\n />\n </div>\n\n {/* App Name Field */}\n <div>\n <label\n htmlFor=\"app-name\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n App Name\n </label>\n <input\n id=\"app-name\"\n type=\"text\"\n value={appName}\n onChange={(e) => handleSetAppName(e.target.value)}\n disabled={isReadOnly}\n className={twMerge(\n \"w-full rounded-md border border-gray-300 px-3 py-2 text-gray-50 placeholder:text-gray-400 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-400\",\n isReadOnly\n ? \"cursor-not-allowed bg-gray-100 dark:bg-slate-700\"\n : \"\",\n )}\n placeholder=\"Enter app name\"\n />\n </div>\n\n {/* Document Types Field */}\n <div>\n <label\n htmlFor=\"document-types\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Document Types\n </label>\n <div className=\"space-y-2\">\n {!isReadOnly && (\n <select\n onChange={(e) => handleDocumentTypeSelection(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 text-gray-900 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100\"\n >\n <option>Select a document type to add</option>\n <option>--- Vetra drive document types ---</option>\n <option value={ALL_IN_DRIVE}>\n Add all document types in Vetra drive\n </option>\n {documentTypesInSelectedDrive\n ?.filter((dt) => !selectedDocumentTypes.includes(dt))\n .map((docType) => (\n <option key={docType} value={docType}>\n {docType}\n </option>\n ))}\n <option>--- Reactor document types ---</option>\n <option value={ALL_IN_REACTOR}>\n Add all document types in Reactor\n </option>\n {supportedDocumentTypesInReactor\n ?.filter((dt) => !selectedDocumentTypes.includes(dt))\n .map((docType) => (\n <option key={docType} value={docType}>\n {docType}\n </option>\n ))}\n <option>--- Allow any document type ---</option>\n <option value={ALLOW_ANY}>Allow any document type</option>\n </select>\n )}\n <div className=\"space-y-1\">\n {selectedDocumentTypes.length > 0 ? (\n selectedDocumentTypes.map((type) => (\n <div key={type} className=\"flex items-center py-1\">\n <span className=\"text-sm text-gray-700 dark:text-slate-200\">\n {type}\n </span>\n {!isReadOnly && (\n <button\n onClick={() => handleRemoveDocumentType(type)}\n className=\"ml-2 text-gray-400 hover:text-gray-600 focus:outline-none dark:text-slate-500 dark:hover:text-slate-300\"\n >\n ×\n </button>\n )}\n </div>\n ))\n ) : (\n <span className=\"text-sm text-gray-700 dark:text-slate-200\">\n All documents (*)\n </span>\n )}\n </div>\n </div>\n </div>\n\n {/* Drag and Drop Settings */}\n <div>\n <h3 className=\"mb-4 text-base font-medium text-gray-900 dark:text-slate-50\">\n Drag and Drop Settings\n </h3>\n\n {/* Enable/Disable Switch */}\n <div className=\"mb-4\">\n <label htmlFor=\"drag-and-drop-enabled\" className=\"flex items-center\">\n <input\n id=\"drag-and-drop-enabled\"\n type=\"checkbox\"\n checked={isDragAndDropEnabled}\n onChange={(e) => onDragAndDropToggle(e.target.checked)}\n disabled={isReadOnly}\n className={twMerge(\n \"mr-2 size-4 rounded-sm border-gray-300 text-blue-600 focus:ring-blue-500 dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100\",\n isReadOnly ? \"cursor-not-allowed\" : \"\",\n )}\n />\n <span className=\"text-sm font-medium text-gray-700 dark:text-slate-200\">\n Enable drag and drop\n </span>\n </label>\n </div>\n </div>\n\n {/* Confirm Button - only show if not in read-only mode */}\n {!isReadOnly && (\n <div>\n <button\n onClick={handleConfirm}\n disabled={!appName.trim()}\n className=\"rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-700 focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:bg-gray-300 dark:bg-blue-300 dark:text-slate-900 dark:hover:bg-blue-200 dark:disabled:bg-slate-600 dark:disabled:text-slate-100\"\n >\n Confirm\n </button>\n </div>\n )}\n </div>\n );\n};\n","import type { PHDocumentEditorConfig } from \"@powerhousedao/reactor-browser\";\n\nexport const editorConfig: PHDocumentEditorConfig = {\n isExternalControlsEnabled: false,\n};\n","import { DocumentToolbar } from \"@powerhousedao/design-system/connect\";\nimport { useSetPHDocumentEditorConfig } from \"@powerhousedao/reactor-browser\";\nimport { AppEditorForm } from \"./components/AppEditorForm.js\";\nimport { editorConfig } from \"./config.js\";\n\nexport default function Editor() {\n useSetPHDocumentEditorConfig(editorConfig);\n\n return (\n <div className=\"bg-gray-50 p-6 dark:bg-slate-800\">\n <DocumentToolbar />\n <AppEditorForm />\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AAkBA,MAAM,eAAe;AACrB,MAAM,iBAAiB;AACvB,MAAM,YAAY;AAElB,MAAa,sBAAsB;CACjC,MAAM,CAAC,UAAU,YAAY,8BAA8B;CAC3D,MAAM,eAAe,SAAS,MAAM,OAAO;CAC3C,MAAM,SAAS,SAAS,MAAM,OAAO;CACrC,MAAM,uBAAuB,SAAS,MAAM,OAAO;CACnD,MAAM,uBAAuB,SAAS,MAAM,OAAO;CACnD,MAAM,CAAC,SAAS,oBAAoB,SAAS,aAAa;CAC1D,MAAM,CAAC,aAAa,kBAAkB,SAAS,WAAW,YAAY;CACtE,MAAM,+BAA+B,iCAAiC;CACtE,MAAM,kCAAkC,oCAAoC;CAC5E,MAAM,CAAC,uBAAuB,4BAA4B,SACxD,wBAAwB,EAAE,CAC3B;AAaD,aAAY,SATS,aAClB,SAAiB;AAChB,MAAI,SAAS,aAAc;AAC3B,UAAQ,IAAI,gBAAgB,KAAK;AACjC,WAAS,WAAW,EAAE,MAAM,CAAC,CAAC;IAEhC,CAAC,cAAc,SAAS,CACzB,EAEkC,IAAI;CAEvC,MAAM,kBAAkB;AACtB,WAAS,aAAa,EAAE,QAAQ,aAAa,CAAC,CAAC;;CAGjD,MAAM,uBAAuB,YAAqB;AAChD,MAAI,YAAY,qBAAsB;AACtC,WAAS,sBAAsB,EAAE,SAAS,CAAC,CAAC;;AAI9C,iBAAgB;AACd,MAAI,WAAW,QAEb,gBAAe,MAAM;IAEtB,CAAC,OAAO,CAAC;CAGZ,MAAM,aAAa,eAAe,WAAW;CAE7C,MAAM,sBAAsB;AAC1B,MAAI,QAAQ,MAAM,EAAE;AAClB,kBAAe,KAAK;AACpB,cAAW;;;CAIf,MAAM,yBAAyB,iBAAyB;AACtD,MAAI,CAAC,gBAAgB,sBAAsB,SAAS,aAAa,CAAE;AACnE,2BAAyB,CAAC,GAAG,uBAAuB,aAAa,CAAC;AAClE,WAAS,gBAAgB,EAAE,cAAc,CAAC,CAAC;;CAG7C,MAAM,4BAA4B,iBAAyB;AACzD,2BACE,sBAAsB,QAAQ,OAAO,OAAO,aAAa,CAC1D;AACD,WAAS,mBAAmB,EAAE,cAAc,CAAC,CAAC;;CAGhD,MAAM,yCAAyC;EAC7C,MAAM,mBAAmB,CACvB,GAAG,IAAI,IAAI,CACT,GAAG,uBACH,GAAI,gCAAgC,EAAE,CACvC,CAAC,CACH;AACD,2BAAyB,iBAAiB;AAC1C,WAAS,iBAAiB,EAAE,eAAe,kBAAkB,CAAC,CAAC;;CAGjE,MAAM,2CAA2C;EAC/C,MAAM,mBAAmB,CACvB,GAAG,IAAI,IAAI,CACT,GAAG,uBACH,GAAI,mCAAmC,EAAE,CAC1C,CAAC,CACH;AACD,2BAAyB,iBAAiB;AAC1C,WAAS,iBAAiB,EAAE,eAAe,kBAAkB,CAAC,CAAC;;CAGjE,MAAM,mCAAmC;AACvC,2BAAyB,EAAE,CAAC;AAC5B,WAAS,iBAAiB,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;;CAGnD,MAAM,+BAA+B,kBAA0B;AAC7D,MAAI,kBAAkB,aACpB,mCAAkC;WACzB,kBAAkB,eAC3B,qCAAoC;WAC3B,kBAAkB,UAC3B,6BAA4B;MAE5B,uBAAsB,cAAc;;AAIxC,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,MAAD;KAAI,WAAU;eAAuD;KAEhE,CAAA,EACL,oBAAC,YAAD;KACE,QAAQ,WAAW,cAAc,cAAc;KAC/C,OAAO,WAAW,cAAc,cAAc;KAC9C,CAAA,CACE;;GAGN,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,SAAD;IACE,SAAQ;IACR,WAAU;cACX;IAEO,CAAA,EACR,oBAAC,SAAD;IACE,IAAG;IACH,MAAK;IACL,OAAO;IACP,WAAW,MAAM,iBAAiB,EAAE,OAAO,MAAM;IACjD,UAAU;IACV,WAAW,QACT,sQACA,aACI,qDACA,GACL;IACD,aAAY;IACZ,CAAA,CACE,EAAA,CAAA;GAGN,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,SAAD;IACE,SAAQ;IACR,WAAU;cACX;IAEO,CAAA,EACR,qBAAC,OAAD;IAAK,WAAU;cAAf,CACG,CAAC,cACA,qBAAC,UAAD;KACE,WAAW,MAAM,4BAA4B,EAAE,OAAO,MAAM;KAC5D,WAAU;eAFZ;MAIE,oBAAC,UAAD,EAAA,UAAQ,iCAAsC,CAAA;MAC9C,oBAAC,UAAD,EAAA,UAAQ,sCAA2C,CAAA;MACnD,oBAAC,UAAD;OAAQ,OAAO;iBAAc;OAEpB,CAAA;MACR,8BACG,QAAQ,OAAO,CAAC,sBAAsB,SAAS,GAAG,CAAC,CACpD,KAAK,YACJ,oBAAC,UAAD;OAAsB,OAAO;iBAC1B;OACM,EAFI,QAEJ,CACT;MACJ,oBAAC,UAAD,EAAA,UAAQ,kCAAuC,CAAA;MAC/C,oBAAC,UAAD;OAAQ,OAAO;iBAAgB;OAEtB,CAAA;MACR,iCACG,QAAQ,OAAO,CAAC,sBAAsB,SAAS,GAAG,CAAC,CACpD,KAAK,YACJ,oBAAC,UAAD;OAAsB,OAAO;iBAC1B;OACM,EAFI,QAEJ,CACT;MACJ,oBAAC,UAAD,EAAA,UAAQ,mCAAwC,CAAA;MAChD,oBAAC,UAAD;OAAQ,OAAO;iBAAW;OAAgC,CAAA;MACnD;QAEX,oBAAC,OAAD;KAAK,WAAU;eACZ,sBAAsB,SAAS,IAC9B,sBAAsB,KAAK,SACzB,qBAAC,OAAD;MAAgB,WAAU;gBAA1B,CACE,oBAAC,QAAD;OAAM,WAAU;iBACb;OACI,CAAA,EACN,CAAC,cACA,oBAAC,UAAD;OACE,eAAe,yBAAyB,KAAK;OAC7C,WAAU;iBACX;OAEQ,CAAA,CAEP;QAZI,KAYJ,CACN,GAEF,oBAAC,QAAD;MAAM,WAAU;gBAA4C;MAErD,CAAA;KAEL,CAAA,CACF;MACF,EAAA,CAAA;GAGN,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,MAAD;IAAI,WAAU;cAA8D;IAEvE,CAAA,EAGL,oBAAC,OAAD;IAAK,WAAU;cACb,qBAAC,SAAD;KAAO,SAAQ;KAAwB,WAAU;eAAjD,CACE,oBAAC,SAAD;MACE,IAAG;MACH,MAAK;MACL,SAAS;MACT,WAAW,MAAM,oBAAoB,EAAE,OAAO,QAAQ;MACtD,UAAU;MACV,WAAW,QACT,wIACA,aAAa,uBAAuB,GACrC;MACD,CAAA,EACF,oBAAC,QAAD;MAAM,WAAU;gBAAwD;MAEjE,CAAA,CACD;;IACJ,CAAA,CACF,EAAA,CAAA;GAGL,CAAC,cACA,oBAAC,OAAD,EAAA,UACE,oBAAC,UAAD;IACE,SAAS;IACT,UAAU,CAAC,QAAQ,MAAM;IACzB,WAAU;cACX;IAEQ,CAAA,EACL,CAAA;GAEJ;;;;;AC5QV,MAAa,eAAuC,EAClD,2BAA2B,OAC5B;;;ACCD,SAAwB,SAAS;AAC/B,8BAA6B,aAAa;AAE1C,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,iBAAD,EAAmB,CAAA,EACnB,oBAAC,eAAD,EAAiB,CAAA,CACb"}
|
|
1
|
+
{"version":3,"file":"editor-BQxk6LrL.js","names":[],"sources":["../editors/app-editor/components/AppEditorForm.tsx","../editors/app-editor/config.ts","../editors/app-editor/editor.tsx"],"sourcesContent":["import {\n useDocumentTypesInSelectedDrive,\n useSupportedDocumentTypesInReactor,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n addDocumentType,\n removeDocumentType,\n setAppName,\n setAppStatus,\n setDocumentTypes,\n setDragAndDropEnabled,\n} from \"@powerhousedao/vetra/document-models/app-module\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useSelectedAppModuleDocument } from \"../../../document-models/app-module/index.js\";\nimport { StatusPill } from \"../../components/index.js\";\nimport { useDebounce } from \"../../hooks/index.js\";\n\nconst ALL_IN_DRIVE = \"all-in-drive\";\nconst ALL_IN_REACTOR = \"all-in-reactor\";\nconst ALLOW_ANY = \"allow-any\";\n\nexport const AppEditorForm = () => {\n const [document, dispatch] = useSelectedAppModuleDocument();\n const documentName = document.state.global.name;\n const status = document.state.global.status;\n const isDragAndDropEnabled = document.state.global.isDragAndDropEnabled;\n const allowedDocumentTypes = document.state.global.allowedDocumentTypes;\n const [appName, handleSetAppName] = useState(documentName);\n const [isConfirmed, setIsConfirmed] = useState(status === \"CONFIRMED\");\n const documentTypesInSelectedDrive = useDocumentTypesInSelectedDrive();\n const supportedDocumentTypesInReactor = useSupportedDocumentTypesInReactor();\n const [selectedDocumentTypes, setSelectedDocumentTypes] = useState(\n allowedDocumentTypes ?? [],\n );\n\n // Use the debounce hook for name changes\n\n const onNameChange = useCallback(\n (name: string) => {\n if (name === documentName) return;\n console.log(\"onNameChange\", name);\n dispatch(setAppName({ name }));\n },\n [documentName, dispatch],\n );\n\n useDebounce(appName, onNameChange, 300);\n\n const onConfirm = () => {\n dispatch(setAppStatus({ status: \"CONFIRMED\" }));\n };\n\n const onDragAndDropToggle = (enabled: boolean) => {\n if (enabled === isDragAndDropEnabled) return;\n dispatch(setDragAndDropEnabled({ enabled }));\n };\n\n // Reset confirmation state if status changes back to DRAFT\n useEffect(() => {\n if (status === \"DRAFT\") {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setIsConfirmed(false);\n }\n }, [status]);\n\n // Check if form should be read-only\n const isReadOnly = isConfirmed || status === \"CONFIRMED\";\n\n const handleConfirm = () => {\n if (appName.trim()) {\n setIsConfirmed(true); // Immediate UI update\n onConfirm();\n }\n };\n\n const handleAddDocumentType = (documentType: string) => {\n if (!documentType || selectedDocumentTypes.includes(documentType)) return;\n setSelectedDocumentTypes([...selectedDocumentTypes, documentType]);\n dispatch(addDocumentType({ documentType }));\n };\n\n const handleRemoveDocumentType = (documentType: string) => {\n setSelectedDocumentTypes(\n selectedDocumentTypes.filter((dt) => dt !== documentType),\n );\n dispatch(removeDocumentType({ documentType }));\n };\n\n const handleAddAllDocumentTypesInDrive = () => {\n const newDocumentTypes = [\n ...new Set([\n ...selectedDocumentTypes,\n ...(documentTypesInSelectedDrive ?? []),\n ]),\n ];\n setSelectedDocumentTypes(newDocumentTypes);\n dispatch(setDocumentTypes({ documentTypes: newDocumentTypes }));\n };\n\n const handleAddAllDocumentTypesInReactor = () => {\n const newDocumentTypes = [\n ...new Set([\n ...selectedDocumentTypes,\n ...(supportedDocumentTypesInReactor ?? []),\n ]),\n ];\n setSelectedDocumentTypes(newDocumentTypes);\n dispatch(setDocumentTypes({ documentTypes: newDocumentTypes }));\n };\n\n const handleAllowAnyDocumentType = () => {\n setSelectedDocumentTypes([]);\n dispatch(setDocumentTypes({ documentTypes: [] }));\n };\n\n const handleDocumentTypeSelection = (selectedValue: string) => {\n if (selectedValue === ALL_IN_DRIVE) {\n handleAddAllDocumentTypesInDrive();\n } else if (selectedValue === ALL_IN_REACTOR) {\n handleAddAllDocumentTypesInReactor();\n } else if (selectedValue === ALLOW_ANY) {\n handleAllowAnyDocumentType();\n } else {\n handleAddDocumentType(selectedValue);\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-medium text-gray-900 dark:text-slate-50\">\n App Configuration\n </h2>\n <StatusPill\n status={status === \"CONFIRMED\" ? \"confirmed\" : \"draft\"}\n label={status === \"CONFIRMED\" ? \"Confirmed\" : \"Draft\"}\n />\n </div>\n\n {/* App Name Field */}\n <div>\n <label\n htmlFor=\"app-name\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n App Name\n </label>\n <input\n id=\"app-name\"\n type=\"text\"\n value={appName}\n onChange={(e) => handleSetAppName(e.target.value)}\n disabled={isReadOnly}\n className={twMerge(\n \"w-full rounded-md border border-gray-300 px-3 py-2 text-gray-50 placeholder:text-gray-400 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-400\",\n isReadOnly\n ? \"cursor-not-allowed bg-gray-100 dark:bg-slate-700\"\n : \"\",\n )}\n placeholder=\"Enter app name\"\n />\n </div>\n\n {/* Document Types Field */}\n <div>\n <label\n htmlFor=\"document-types\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Document Types\n </label>\n <div className=\"space-y-2\">\n {!isReadOnly && (\n <select\n onChange={(e) => handleDocumentTypeSelection(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 text-gray-900 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100\"\n >\n <option>Select a document type to add</option>\n <option>--- Vetra drive document types ---</option>\n <option value={ALL_IN_DRIVE}>\n Add all document types in Vetra drive\n </option>\n {documentTypesInSelectedDrive\n ?.filter((dt) => !selectedDocumentTypes.includes(dt))\n .map((docType) => (\n <option key={docType} value={docType}>\n {docType}\n </option>\n ))}\n <option>--- Reactor document types ---</option>\n <option value={ALL_IN_REACTOR}>\n Add all document types in Reactor\n </option>\n {supportedDocumentTypesInReactor\n ?.filter((dt) => !selectedDocumentTypes.includes(dt))\n .map((docType) => (\n <option key={docType} value={docType}>\n {docType}\n </option>\n ))}\n <option>--- Allow any document type ---</option>\n <option value={ALLOW_ANY}>Allow any document type</option>\n </select>\n )}\n <div className=\"space-y-1\">\n {selectedDocumentTypes.length > 0 ? (\n selectedDocumentTypes.map((type) => (\n <div key={type} className=\"flex items-center py-1\">\n <span className=\"text-sm text-gray-700 dark:text-slate-200\">\n {type}\n </span>\n {!isReadOnly && (\n <button\n onClick={() => handleRemoveDocumentType(type)}\n className=\"ml-2 text-gray-400 hover:text-gray-600 focus:outline-none dark:text-slate-500 dark:hover:text-slate-300\"\n >\n ×\n </button>\n )}\n </div>\n ))\n ) : (\n <span className=\"text-sm text-gray-700 dark:text-slate-200\">\n All documents (*)\n </span>\n )}\n </div>\n </div>\n </div>\n\n {/* Drag and Drop Settings */}\n <div>\n <h3 className=\"mb-4 text-base font-medium text-gray-900 dark:text-slate-50\">\n Drag and Drop Settings\n </h3>\n\n {/* Enable/Disable Switch */}\n <div className=\"mb-4\">\n <label htmlFor=\"drag-and-drop-enabled\" className=\"flex items-center\">\n <input\n id=\"drag-and-drop-enabled\"\n type=\"checkbox\"\n checked={isDragAndDropEnabled}\n onChange={(e) => onDragAndDropToggle(e.target.checked)}\n disabled={isReadOnly}\n className={twMerge(\n \"mr-2 size-4 rounded-sm border-gray-300 text-blue-600 focus:ring-blue-500 dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100\",\n isReadOnly ? \"cursor-not-allowed\" : \"\",\n )}\n />\n <span className=\"text-sm font-medium text-gray-700 dark:text-slate-200\">\n Enable drag and drop\n </span>\n </label>\n </div>\n </div>\n\n {/* Confirm Button - only show if not in read-only mode */}\n {!isReadOnly && (\n <div>\n <button\n onClick={handleConfirm}\n disabled={!appName.trim()}\n className=\"rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-700 focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:bg-gray-300 dark:bg-blue-300 dark:text-slate-900 dark:hover:bg-blue-200 dark:disabled:bg-slate-600 dark:disabled:text-slate-100\"\n >\n Confirm\n </button>\n </div>\n )}\n </div>\n );\n};\n","import type { PHDocumentEditorConfig } from \"@powerhousedao/reactor-browser\";\n\nexport const editorConfig: PHDocumentEditorConfig = {\n isExternalControlsEnabled: false,\n};\n","import { DocumentToolbar } from \"@powerhousedao/design-system/connect\";\nimport { useSetPHDocumentEditorConfig } from \"@powerhousedao/reactor-browser\";\nimport { AppEditorForm } from \"./components/AppEditorForm.js\";\nimport { editorConfig } from \"./config.js\";\n\nexport default function Editor() {\n useSetPHDocumentEditorConfig(editorConfig);\n\n return (\n <div className=\"bg-gray-50 p-6 dark:bg-slate-800\">\n <DocumentToolbar />\n <AppEditorForm />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { g as setSubgraphStatus, h as setSubgraphName } from "./utils-BiV3cs9Y.js";
|
|
2
2
|
import { StatusPill } from "./editors/components/index.js";
|
|
3
|
-
import { t as useDebounce } from "./hooks-
|
|
3
|
+
import { t as useDebounce } from "./hooks-Btogj1f0.js";
|
|
4
4
|
import { r as useSelectedSubgraphModuleDocument } from "./useVetraDocument-BQKyels4.js";
|
|
5
5
|
import { useSetPHDocumentEditorConfig } from "@powerhousedao/reactor-browser";
|
|
6
6
|
import { useCallback, useEffect, useState } from "react";
|
|
@@ -88,4 +88,4 @@ function Editor() {
|
|
|
88
88
|
//#endregion
|
|
89
89
|
export { Editor as default };
|
|
90
90
|
|
|
91
|
-
//# sourceMappingURL=editor-
|
|
91
|
+
//# sourceMappingURL=editor-ClvvgHg3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor-
|
|
1
|
+
{"version":3,"file":"editor-ClvvgHg3.js","names":[],"sources":["../editors/subgraph-editor/components/SubgraphEditorForm.tsx","../editors/subgraph-editor/config.ts","../editors/subgraph-editor/editor.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { StatusPill } from \"../../components/index.js\";\nimport { useDebounce } from \"../../hooks/index.js\";\n\nexport interface SubgraphEditorFormProps {\n subgraphName?: string;\n status?: string;\n onNameChange?: (name: string) => void;\n onConfirm?: () => void;\n}\n\nexport const SubgraphEditorForm: React.FC<SubgraphEditorFormProps> = ({\n subgraphName: initialSubgraphName = \"\",\n status = \"DRAFT\",\n onNameChange,\n onConfirm,\n}) => {\n const [subgraphName, setSubgraphName] = useState(initialSubgraphName);\n const [isConfirmed, setIsConfirmed] = useState(false);\n\n // Use the debounce hook for name changes\n useDebounce(subgraphName, onNameChange, 300);\n\n // Update local state when initialSubgraphName changes\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setSubgraphName(initialSubgraphName);\n }, [initialSubgraphName]);\n\n // Reset confirmation state if status changes back to DRAFT\n useEffect(() => {\n if (status === \"DRAFT\") {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setIsConfirmed(false);\n }\n }, [status]);\n\n // Check if form should be read-only\n const isReadOnly = isConfirmed || status === \"CONFIRMED\";\n\n const handleConfirm = () => {\n if (subgraphName.trim()) {\n setIsConfirmed(true); // Immediate UI update\n onConfirm?.();\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-medium text-gray-900 dark:text-slate-50\">\n Subgraph Configuration\n </h2>\n <StatusPill\n status={status === \"CONFIRMED\" ? \"confirmed\" : \"draft\"}\n label={status === \"CONFIRMED\" ? \"Confirmed\" : \"Draft\"}\n />\n </div>\n\n {/* Subgraph Name Field */}\n <div>\n <label\n htmlFor=\"subgraph-name\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Subgraph Name\n </label>\n <input\n id=\"subgraph-name\"\n type=\"text\"\n value={subgraphName}\n onChange={(e) => setSubgraphName(e.target.value)}\n disabled={isReadOnly}\n className={twMerge(\n \"w-full rounded-md border border-gray-300 px-3 py-2 placeholder:text-gray-700 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\",\n isReadOnly\n ? \"cursor-not-allowed bg-gray-100 dark:bg-slate-700\"\n : \"\",\n )}\n placeholder=\"Enter subgraph name\"\n />\n </div>\n\n {/* Confirm Button - only show if not in read-only mode */}\n {!isReadOnly && (\n <div>\n <button\n onClick={handleConfirm}\n disabled={!subgraphName.trim()}\n className=\"rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-700 focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:bg-gray-300 dark:bg-blue-300 dark:text-slate-900 dark:hover:bg-blue-200 dark:disabled:bg-slate-600 dark:disabled:text-slate-100\"\n >\n Confirm\n </button>\n </div>\n )}\n </div>\n );\n};\n","import type { PHDocumentEditorConfig } from \"@powerhousedao/reactor-browser\";\n\nexport const editorConfig: PHDocumentEditorConfig = {\n isExternalControlsEnabled: false,\n};\n","import { DocumentToolbar } from \"@powerhousedao/design-system/connect\";\nimport { useSetPHDocumentEditorConfig } from \"@powerhousedao/reactor-browser\";\nimport {\n setSubgraphName,\n setSubgraphStatus,\n} from \"@powerhousedao/vetra/document-models/subgraph-module\";\nimport { useCallback } from \"react\";\nimport { useSelectedSubgraphModuleDocument } from \"../hooks/useVetraDocument.js\";\nimport { SubgraphEditorForm } from \"./components/SubgraphEditorForm.js\";\nimport { editorConfig } from \"./config.js\";\n\nexport default function Editor() {\n useSetPHDocumentEditorConfig(editorConfig);\n const [document, dispatch] = useSelectedSubgraphModuleDocument();\n\n const onNameChange = useCallback(\n (name: string) => {\n if (name === document.state.global.name) return;\n dispatch(setSubgraphName({ name }));\n },\n [document.state.global.name, dispatch],\n );\n\n const onConfirm = useCallback(() => {\n dispatch(setSubgraphStatus({ status: \"CONFIRMED\" }));\n }, [dispatch]);\n\n return (\n <div className=\"bg-gray-50 p-6 dark:bg-slate-800\">\n <DocumentToolbar />\n <SubgraphEditorForm\n subgraphName={document.state.global.name ?? \"\"}\n status={document.state.global.status}\n onNameChange={onNameChange}\n onConfirm={onConfirm}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AAYA,MAAa,sBAAyD,EACpE,cAAc,sBAAsB,IACpC,SAAS,SACT,cACA,gBACI;CACJ,MAAM,CAAC,cAAc,mBAAmB,SAAS,oBAAoB;CACrE,MAAM,CAAC,aAAa,kBAAkB,SAAS,MAAM;AAGrD,aAAY,cAAc,cAAc,IAAI;AAG5C,iBAAgB;AAEd,kBAAgB,oBAAoB;IACnC,CAAC,oBAAoB,CAAC;AAGzB,iBAAgB;AACd,MAAI,WAAW,QAEb,gBAAe,MAAM;IAEtB,CAAC,OAAO,CAAC;CAGZ,MAAM,aAAa,eAAe,WAAW;CAE7C,MAAM,sBAAsB;AAC1B,MAAI,aAAa,MAAM,EAAE;AACvB,kBAAe,KAAK;AACpB,gBAAa;;;AAIjB,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,MAAD;KAAI,WAAU;eAAuD;KAEhE,CAAA,EACL,oBAAC,YAAD;KACE,QAAQ,WAAW,cAAc,cAAc;KAC/C,OAAO,WAAW,cAAc,cAAc;KAC9C,CAAA,CACE;;GAGN,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,SAAD;IACE,SAAQ;IACR,WAAU;cACX;IAEO,CAAA,EACR,oBAAC,SAAD;IACE,IAAG;IACH,MAAK;IACL,OAAO;IACP,WAAW,MAAM,gBAAgB,EAAE,OAAO,MAAM;IAChD,UAAU;IACV,WAAW,QACT,yPACA,aACI,qDACA,GACL;IACD,aAAY;IACZ,CAAA,CACE,EAAA,CAAA;GAGL,CAAC,cACA,oBAAC,OAAD,EAAA,UACE,oBAAC,UAAD;IACE,SAAS;IACT,UAAU,CAAC,aAAa,MAAM;IAC9B,WAAU;cACX;IAEQ,CAAA,EACL,CAAA;GAEJ;;;;;AC9FV,MAAa,eAAuC,EAClD,2BAA2B,OAC5B;;;ACOD,SAAwB,SAAS;AAC/B,8BAA6B,aAAa;CAC1C,MAAM,CAAC,UAAU,YAAY,mCAAmC;CAEhE,MAAM,eAAe,aAClB,SAAiB;AAChB,MAAI,SAAS,SAAS,MAAM,OAAO,KAAM;AACzC,WAAS,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAErC,CAAC,SAAS,MAAM,OAAO,MAAM,SAAS,CACvC;CAED,MAAM,YAAY,kBAAkB;AAClC,WAAS,kBAAkB,EAAE,QAAQ,aAAa,CAAC,CAAC;IACnD,CAAC,SAAS,CAAC;AAEd,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,iBAAD,EAAmB,CAAA,EACnB,oBAAC,oBAAD;GACE,cAAc,SAAS,MAAM,OAAO,QAAQ;GAC5C,QAAQ,SAAS,MAAM,OAAO;GAChB;GACH;GACX,CAAA,CACE"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { C as setPackageCategory, D as setPackageNpmUrl, E as setPackageName, S as setPackageAuthorWebsite, T as setPackageGithubUrl, _ as addPackageKeyword, w as setPackageDescription, x as setPackageAuthorName, y as removePackageKeyword } from "./module-1hr_ne9w.js";
|
|
2
|
-
import { t as useDebounce } from "./hooks-
|
|
2
|
+
import { t as useDebounce } from "./hooks-Btogj1f0.js";
|
|
3
3
|
import { t as useSelectedDriveVetraPackage } from "./useVetraDocument-BQKyels4.js";
|
|
4
4
|
import { useSetPHDocumentEditorConfig } from "@powerhousedao/reactor-browser";
|
|
5
5
|
import { useCallback, useState } from "react";
|
|
@@ -304,4 +304,4 @@ function Editor(props) {
|
|
|
304
304
|
//#endregion
|
|
305
305
|
export { Editor as default };
|
|
306
306
|
|
|
307
|
-
//# sourceMappingURL=editor-
|
|
307
|
+
//# sourceMappingURL=editor-DLluDQKM.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor-FQIqobD5.js","names":[],"sources":["../editors/vetra-package/components/MetaForm.tsx","../editors/vetra-package/config.ts","../editors/vetra-package/editor.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport type { Keyword } from \"../../../document-models/vetra-package/index.js\";\nimport { useDebounce } from \"../../hooks/index.js\";\n\nexport interface MetaFormProps {\n name: string;\n description: string;\n category: string;\n publisher: string;\n publisherUrl: string;\n githubRepository: string;\n npmPackage: string;\n keywords: Keyword[];\n onNameChange?: (name: string) => void;\n onDescriptionChange?: (description: string) => void;\n onCategoryChange?: (category: string) => void;\n onPublisherChange?: (publisher: string) => void;\n onPublisherUrlChange?: (publisherUrl: string) => void;\n onGithubRepositoryChange?: (githubRepository: string) => void;\n onNpmPackageChange?: (npmPackage: string) => void;\n onAddKeyword?: (keyword: { id: string; label: string }) => void;\n onRemoveKeyword?: (id: string) => void;\n}\n\nexport const MetaForm: React.FC<MetaFormProps> = (props) => {\n const {\n name: initialName,\n description: initialDescription,\n category: initialCategory,\n publisher: initialPublisher,\n publisherUrl: initialPublisherUrl,\n githubRepository: initialGithubRepository,\n npmPackage: initialNpmPackage,\n keywords: initialKeywords,\n onNameChange,\n onDescriptionChange,\n onCategoryChange,\n onPublisherChange,\n onPublisherUrlChange,\n onGithubRepositoryChange,\n onNpmPackageChange,\n onAddKeyword,\n onRemoveKeyword,\n } = props;\n\n const [name, setName] = useState(initialName);\n const [description, setDescription] = useState(initialDescription);\n const [category, setCategory] = useState(initialCategory);\n const [publisher, setPublisher] = useState(initialPublisher);\n const [publisherUrl, setPublisherUrl] = useState(initialPublisherUrl);\n const [githubRepository, setGithubRepository] = useState(\n initialGithubRepository,\n );\n const [npmPackage, setNpmPackage] = useState(initialNpmPackage);\n\n // Keywords state\n const [keywords, setKeywords] = useState<Keyword[]>(initialKeywords);\n const [keywordInput, setKeywordInput] = useState(\"\");\n\n // Use the debounce hook with callbacks\n useDebounce(name, onNameChange, 300);\n useDebounce(description, onDescriptionChange, 300);\n useDebounce(publisher, onPublisherChange, 300);\n useDebounce(publisherUrl, onPublisherUrlChange, 300);\n useDebounce(githubRepository, onGithubRepositoryChange, 300);\n useDebounce(npmPackage, onNpmPackageChange, 300);\n\n return (\n <div className=\"grid grid-cols-1 gap-6 p-6 lg:grid-cols-3\">\n {/* Left Column */}\n <div className=\"space-y-6\">\n {/* Name Field */}\n <div>\n <label\n htmlFor=\"package-name\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Name\n </label>\n <input\n id=\"package-name\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 placeholder:text-gray-700 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\"\n />\n </div>\n\n {/* Description Field */}\n <div>\n <label\n htmlFor=\"package-description\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Description\n </label>\n <textarea\n id=\"package-description\"\n rows={6}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n className=\"w-full resize-none rounded-md border border-gray-300 px-3 py-2 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100\"\n />\n </div>\n </div>\n\n {/* Middle Column */}\n <div className=\"space-y-6\">\n {/* Category Field */}\n <div>\n <label\n htmlFor=\"package-category\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Category\n </label>\n <select\n id=\"package-category\"\n value={category}\n onChange={(e) => {\n const newValue = e.target.value;\n setCategory(newValue);\n onCategoryChange?.(newValue);\n }}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 text-gray-900 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100\"\n >\n <option value=\"\">Not selected</option>\n <option value=\"Productivity\">Productivity</option>\n <option value=\"Governance\">Governance</option>\n <option value=\"Project Management\">Project Management</option>\n <option value=\"Finance\">Finance</option>\n <option value=\"Legal\">Legal</option>\n <option value=\"People & Culture\">People & Culture</option>\n <option value=\"Engineering\">Engineering</option>\n </select>\n </div>\n\n {/* Publisher Field */}\n <div>\n <label\n htmlFor=\"package-publisher\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Publisher\n </label>\n <input\n id=\"package-publisher\"\n type=\"text\"\n value={publisher}\n onChange={(e) => setPublisher(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 placeholder:text-gray-700 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\"\n />\n </div>\n\n {/* Publisher URL Field */}\n <div>\n <label\n htmlFor=\"package-publisher-url\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Publisher URL\n </label>\n <input\n id=\"package-publisher-url\"\n type=\"text\"\n value={publisherUrl}\n onChange={(e) => setPublisherUrl(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 placeholder:text-gray-700 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\"\n />\n </div>\n\n {/* Keywords Field */}\n <div>\n <label\n htmlFor=\"package-keywords\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Keywords\n </label>\n <div className=\"space-y-2\">\n <input\n id=\"package-keywords\"\n type=\"text\"\n value={keywordInput}\n onChange={(e) => setKeywordInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && keywordInput.trim()) {\n e.preventDefault();\n const newKeyword = {\n id: Date.now().toString(), // Generate a unique ID\n label: keywordInput.trim(),\n };\n setKeywords([...keywords, newKeyword]);\n onAddKeyword?.(newKeyword);\n setKeywordInput(\"\");\n }\n }}\n placeholder=\"Type a keyword and press Enter\"\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 placeholder:text-gray-700 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\"\n />\n <div className=\"flex min-h-[80px] flex-wrap gap-2 rounded-md border border-gray-300 p-3 dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100\">\n {keywords.map((keyword) => (\n <span\n key={keyword.id}\n className=\"inline-flex items-center rounded-sm border border-blue-300 bg-blue-100 px-2 py-0.5 text-xs text-blue-800 dark:border-blue-600 dark:bg-blue-800 dark:text-blue-100\"\n >\n {keyword.label}\n <button\n onClick={() => {\n setKeywords(keywords.filter((k) => k.id !== keyword.id));\n onRemoveKeyword?.(keyword.id);\n }}\n className=\"ml-1 text-blue-600 hover:text-blue-800 focus:outline-none dark:text-blue-100 dark:hover:text-blue-100\"\n >\n ×\n </button>\n </span>\n ))}\n </div>\n </div>\n </div>\n </div>\n\n {/* Right Column */}\n <div className=\"space-y-6\">\n {/* Github Repository Field */}\n <div>\n <label\n htmlFor=\"package-github\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Github Repository\n </label>\n <input\n id=\"package-github\"\n type=\"text\"\n value={githubRepository}\n onChange={(e) => setGithubRepository(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 placeholder:text-gray-700 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\"\n />\n </div>\n\n {/* NPM-package Field */}\n <div>\n <label\n htmlFor=\"package-npm\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n NPM-package\n </label>\n <input\n id=\"package-npm\"\n type=\"text\"\n value={npmPackage}\n onChange={(e) => setNpmPackage(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 placeholder:text-gray-700 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\"\n />\n </div>\n\n {/* Version Field */}\n <div>\n <label\n htmlFor=\"package-version\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Version\n </label>\n <input\n id=\"package-version\"\n type=\"text\"\n placeholder=\"1.0.0-dev\"\n readOnly\n className=\"w-full cursor-not-allowed rounded-md border border-gray-300 bg-gray-50 px-3 py-2 text-gray-500 placeholder:text-gray-700 dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\"\n />\n </div>\n\n {/* License Field */}\n <div>\n <label\n htmlFor=\"package-license\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n License\n </label>\n <input\n id=\"package-license\"\n type=\"text\"\n placeholder=\"AGPL-3.0-only\"\n readOnly\n className=\"w-full cursor-not-allowed rounded-md border border-gray-300 bg-gray-50 px-3 py-2 text-gray-500 placeholder:text-gray-700 dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\"\n />\n </div>\n\n {/* Install with Field */}\n <div>\n <label\n htmlFor=\"package-install\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Install with:\n </label>\n <input\n id=\"package-install\"\n type=\"text\"\n placeholder=\"@powerhousedao/todo-demo-package\"\n readOnly\n className=\"w-full cursor-not-allowed rounded-md border border-gray-300 bg-gray-50 px-3 py-2 text-gray-500 placeholder:text-gray-700 dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\"\n />\n </div>\n </div>\n </div>\n );\n};\n","import type { PHDocumentEditorConfig } from \"@powerhousedao/reactor-browser\";\n\nexport const editorConfig: PHDocumentEditorConfig = {\n isExternalControlsEnabled: false,\n};\n","import { DocumentToolbar } from \"@powerhousedao/design-system/connect\";\nimport { useSetPHDocumentEditorConfig } from \"@powerhousedao/reactor-browser\";\nimport { useCallback } from \"react\";\nimport {\n addPackageKeyword,\n removePackageKeyword,\n setPackageAuthorName,\n setPackageAuthorWebsite,\n setPackageCategory,\n setPackageDescription,\n setPackageGithubUrl,\n setPackageName,\n setPackageNpmUrl,\n} from \"../../document-models/vetra-package/index.js\";\nimport { useSelectedDriveVetraPackage } from \"../hooks/useVetraDocument.js\";\nimport { MetaForm } from \"./components/MetaForm.js\";\nimport { editorConfig } from \"./config.js\";\n\nexport type EditorProps = {\n displayToolbar?: boolean;\n};\n\nexport default function Editor(props: EditorProps) {\n const { displayToolbar = true } = props;\n useSetPHDocumentEditorConfig(editorConfig);\n const [document, dispatch] = useSelectedDriveVetraPackage();\n\n const onNameChange = useCallback(\n (name: string) => {\n if (!document.state.global.name && !name) return;\n if (name === document.state.global.name) return;\n\n dispatch(setPackageName({ name }));\n },\n [document.state.global.name, dispatch],\n );\n\n const onDescriptionChange = useCallback(\n (description: string) => {\n if (!document.state.global.description && !description) return;\n if (description === document.state.global.description) return;\n\n dispatch(setPackageDescription({ description }));\n },\n [document.state.global.description, dispatch],\n );\n\n const onCategoryChange = useCallback(\n (category: string) => {\n if (!document.state.global.category && !category) return;\n if (category === document.state.global.category) return;\n\n dispatch(setPackageCategory({ category }));\n },\n [document.state.global.category, dispatch],\n );\n\n const onPublisherChange = useCallback(\n (name: string) => {\n if (!document.state.global.author.name && !name) return;\n if (name === document.state.global.author.name) return;\n\n dispatch(setPackageAuthorName({ name }));\n },\n [document.state.global.author.name, dispatch],\n );\n\n const onPublisherUrlChange = useCallback(\n (website: string) => {\n if (!document.state.global.author.website && !website) return;\n if (website === document.state.global.author.website) return;\n\n dispatch(setPackageAuthorWebsite({ website }));\n },\n [document.state.global.author.website, dispatch],\n );\n\n const onGithubRepositoryChange = useCallback(\n (url: string) => {\n if (!document.state.global.githubUrl && !url) return;\n if (url === document.state.global.githubUrl) return;\n\n dispatch(setPackageGithubUrl({ url }));\n },\n [document.state.global.githubUrl, dispatch],\n );\n\n const onNpmPackageChange = useCallback(\n (url: string) => {\n if (!document.state.global.npmUrl && !url) return;\n if (url === document.state.global.npmUrl) return;\n\n dispatch(setPackageNpmUrl({ url }));\n },\n [document.state.global.npmUrl, dispatch],\n );\n\n const onAddKeyword = useCallback(\n (keyword: { id: string; label: string }) => {\n dispatch(addPackageKeyword(keyword));\n },\n [dispatch],\n );\n\n const onRemoveKeyword = useCallback(\n (id: string) => {\n dispatch(removePackageKeyword({ id }));\n },\n [dispatch],\n );\n\n return (\n <div className=\"bg-gray-50 p-6 dark:bg-slate-800\">\n {displayToolbar && <DocumentToolbar />}\n <MetaForm\n name={document.state.global.name ?? \"\"}\n description={document.state.global.description ?? \"\"}\n category={document.state.global.category ?? \"\"}\n publisher={document.state.global.author.name ?? \"\"}\n publisherUrl={document.state.global.author.website ?? \"\"}\n githubRepository={document.state.global.githubUrl ?? \"\"}\n npmPackage={document.state.global.npmUrl ?? \"\"}\n keywords={document.state.global.keywords}\n onNameChange={onNameChange}\n onDescriptionChange={onDescriptionChange}\n onCategoryChange={onCategoryChange}\n onPublisherChange={onPublisherChange}\n onPublisherUrlChange={onPublisherUrlChange}\n onGithubRepositoryChange={onGithubRepositoryChange}\n onNpmPackageChange={onNpmPackageChange}\n onAddKeyword={onAddKeyword}\n onRemoveKeyword={onRemoveKeyword}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"editor-DLluDQKM.js","names":[],"sources":["../editors/vetra-package/components/MetaForm.tsx","../editors/vetra-package/config.ts","../editors/vetra-package/editor.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport type { Keyword } from \"../../../document-models/vetra-package/index.js\";\nimport { useDebounce } from \"../../hooks/index.js\";\n\nexport interface MetaFormProps {\n name: string;\n description: string;\n category: string;\n publisher: string;\n publisherUrl: string;\n githubRepository: string;\n npmPackage: string;\n keywords: Keyword[];\n onNameChange?: (name: string) => void;\n onDescriptionChange?: (description: string) => void;\n onCategoryChange?: (category: string) => void;\n onPublisherChange?: (publisher: string) => void;\n onPublisherUrlChange?: (publisherUrl: string) => void;\n onGithubRepositoryChange?: (githubRepository: string) => void;\n onNpmPackageChange?: (npmPackage: string) => void;\n onAddKeyword?: (keyword: { id: string; label: string }) => void;\n onRemoveKeyword?: (id: string) => void;\n}\n\nexport const MetaForm: React.FC<MetaFormProps> = (props) => {\n const {\n name: initialName,\n description: initialDescription,\n category: initialCategory,\n publisher: initialPublisher,\n publisherUrl: initialPublisherUrl,\n githubRepository: initialGithubRepository,\n npmPackage: initialNpmPackage,\n keywords: initialKeywords,\n onNameChange,\n onDescriptionChange,\n onCategoryChange,\n onPublisherChange,\n onPublisherUrlChange,\n onGithubRepositoryChange,\n onNpmPackageChange,\n onAddKeyword,\n onRemoveKeyword,\n } = props;\n\n const [name, setName] = useState(initialName);\n const [description, setDescription] = useState(initialDescription);\n const [category, setCategory] = useState(initialCategory);\n const [publisher, setPublisher] = useState(initialPublisher);\n const [publisherUrl, setPublisherUrl] = useState(initialPublisherUrl);\n const [githubRepository, setGithubRepository] = useState(\n initialGithubRepository,\n );\n const [npmPackage, setNpmPackage] = useState(initialNpmPackage);\n\n // Keywords state\n const [keywords, setKeywords] = useState<Keyword[]>(initialKeywords);\n const [keywordInput, setKeywordInput] = useState(\"\");\n\n // Use the debounce hook with callbacks\n useDebounce(name, onNameChange, 300);\n useDebounce(description, onDescriptionChange, 300);\n useDebounce(publisher, onPublisherChange, 300);\n useDebounce(publisherUrl, onPublisherUrlChange, 300);\n useDebounce(githubRepository, onGithubRepositoryChange, 300);\n useDebounce(npmPackage, onNpmPackageChange, 300);\n\n return (\n <div className=\"grid grid-cols-1 gap-6 p-6 lg:grid-cols-3\">\n {/* Left Column */}\n <div className=\"space-y-6\">\n {/* Name Field */}\n <div>\n <label\n htmlFor=\"package-name\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Name\n </label>\n <input\n id=\"package-name\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 placeholder:text-gray-700 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\"\n />\n </div>\n\n {/* Description Field */}\n <div>\n <label\n htmlFor=\"package-description\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Description\n </label>\n <textarea\n id=\"package-description\"\n rows={6}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n className=\"w-full resize-none rounded-md border border-gray-300 px-3 py-2 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100\"\n />\n </div>\n </div>\n\n {/* Middle Column */}\n <div className=\"space-y-6\">\n {/* Category Field */}\n <div>\n <label\n htmlFor=\"package-category\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Category\n </label>\n <select\n id=\"package-category\"\n value={category}\n onChange={(e) => {\n const newValue = e.target.value;\n setCategory(newValue);\n onCategoryChange?.(newValue);\n }}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 text-gray-900 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100\"\n >\n <option value=\"\">Not selected</option>\n <option value=\"Productivity\">Productivity</option>\n <option value=\"Governance\">Governance</option>\n <option value=\"Project Management\">Project Management</option>\n <option value=\"Finance\">Finance</option>\n <option value=\"Legal\">Legal</option>\n <option value=\"People & Culture\">People & Culture</option>\n <option value=\"Engineering\">Engineering</option>\n </select>\n </div>\n\n {/* Publisher Field */}\n <div>\n <label\n htmlFor=\"package-publisher\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Publisher\n </label>\n <input\n id=\"package-publisher\"\n type=\"text\"\n value={publisher}\n onChange={(e) => setPublisher(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 placeholder:text-gray-700 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\"\n />\n </div>\n\n {/* Publisher URL Field */}\n <div>\n <label\n htmlFor=\"package-publisher-url\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Publisher URL\n </label>\n <input\n id=\"package-publisher-url\"\n type=\"text\"\n value={publisherUrl}\n onChange={(e) => setPublisherUrl(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 placeholder:text-gray-700 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\"\n />\n </div>\n\n {/* Keywords Field */}\n <div>\n <label\n htmlFor=\"package-keywords\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Keywords\n </label>\n <div className=\"space-y-2\">\n <input\n id=\"package-keywords\"\n type=\"text\"\n value={keywordInput}\n onChange={(e) => setKeywordInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && keywordInput.trim()) {\n e.preventDefault();\n const newKeyword = {\n id: Date.now().toString(), // Generate a unique ID\n label: keywordInput.trim(),\n };\n setKeywords([...keywords, newKeyword]);\n onAddKeyword?.(newKeyword);\n setKeywordInput(\"\");\n }\n }}\n placeholder=\"Type a keyword and press Enter\"\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 placeholder:text-gray-700 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\"\n />\n <div className=\"flex min-h-[80px] flex-wrap gap-2 rounded-md border border-gray-300 p-3 dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100\">\n {keywords.map((keyword) => (\n <span\n key={keyword.id}\n className=\"inline-flex items-center rounded-sm border border-blue-300 bg-blue-100 px-2 py-0.5 text-xs text-blue-800 dark:border-blue-600 dark:bg-blue-800 dark:text-blue-100\"\n >\n {keyword.label}\n <button\n onClick={() => {\n setKeywords(keywords.filter((k) => k.id !== keyword.id));\n onRemoveKeyword?.(keyword.id);\n }}\n className=\"ml-1 text-blue-600 hover:text-blue-800 focus:outline-none dark:text-blue-100 dark:hover:text-blue-100\"\n >\n ×\n </button>\n </span>\n ))}\n </div>\n </div>\n </div>\n </div>\n\n {/* Right Column */}\n <div className=\"space-y-6\">\n {/* Github Repository Field */}\n <div>\n <label\n htmlFor=\"package-github\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Github Repository\n </label>\n <input\n id=\"package-github\"\n type=\"text\"\n value={githubRepository}\n onChange={(e) => setGithubRepository(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 placeholder:text-gray-700 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\"\n />\n </div>\n\n {/* NPM-package Field */}\n <div>\n <label\n htmlFor=\"package-npm\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n NPM-package\n </label>\n <input\n id=\"package-npm\"\n type=\"text\"\n value={npmPackage}\n onChange={(e) => setNpmPackage(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 placeholder:text-gray-700 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\"\n />\n </div>\n\n {/* Version Field */}\n <div>\n <label\n htmlFor=\"package-version\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Version\n </label>\n <input\n id=\"package-version\"\n type=\"text\"\n placeholder=\"1.0.0-dev\"\n readOnly\n className=\"w-full cursor-not-allowed rounded-md border border-gray-300 bg-gray-50 px-3 py-2 text-gray-500 placeholder:text-gray-700 dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\"\n />\n </div>\n\n {/* License Field */}\n <div>\n <label\n htmlFor=\"package-license\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n License\n </label>\n <input\n id=\"package-license\"\n type=\"text\"\n placeholder=\"AGPL-3.0-only\"\n readOnly\n className=\"w-full cursor-not-allowed rounded-md border border-gray-300 bg-gray-50 px-3 py-2 text-gray-500 placeholder:text-gray-700 dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\"\n />\n </div>\n\n {/* Install with Field */}\n <div>\n <label\n htmlFor=\"package-install\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Install with:\n </label>\n <input\n id=\"package-install\"\n type=\"text\"\n placeholder=\"@powerhousedao/todo-demo-package\"\n readOnly\n className=\"w-full cursor-not-allowed rounded-md border border-gray-300 bg-gray-50 px-3 py-2 text-gray-500 placeholder:text-gray-700 dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\"\n />\n </div>\n </div>\n </div>\n );\n};\n","import type { PHDocumentEditorConfig } from \"@powerhousedao/reactor-browser\";\n\nexport const editorConfig: PHDocumentEditorConfig = {\n isExternalControlsEnabled: false,\n};\n","import { DocumentToolbar } from \"@powerhousedao/design-system/connect\";\nimport { useSetPHDocumentEditorConfig } from \"@powerhousedao/reactor-browser\";\nimport { useCallback } from \"react\";\nimport {\n addPackageKeyword,\n removePackageKeyword,\n setPackageAuthorName,\n setPackageAuthorWebsite,\n setPackageCategory,\n setPackageDescription,\n setPackageGithubUrl,\n setPackageName,\n setPackageNpmUrl,\n} from \"../../document-models/vetra-package/index.js\";\nimport { useSelectedDriveVetraPackage } from \"../hooks/useVetraDocument.js\";\nimport { MetaForm } from \"./components/MetaForm.js\";\nimport { editorConfig } from \"./config.js\";\n\nexport type EditorProps = {\n displayToolbar?: boolean;\n};\n\nexport default function Editor(props: EditorProps) {\n const { displayToolbar = true } = props;\n useSetPHDocumentEditorConfig(editorConfig);\n const [document, dispatch] = useSelectedDriveVetraPackage();\n\n const onNameChange = useCallback(\n (name: string) => {\n if (!document.state.global.name && !name) return;\n if (name === document.state.global.name) return;\n\n dispatch(setPackageName({ name }));\n },\n [document.state.global.name, dispatch],\n );\n\n const onDescriptionChange = useCallback(\n (description: string) => {\n if (!document.state.global.description && !description) return;\n if (description === document.state.global.description) return;\n\n dispatch(setPackageDescription({ description }));\n },\n [document.state.global.description, dispatch],\n );\n\n const onCategoryChange = useCallback(\n (category: string) => {\n if (!document.state.global.category && !category) return;\n if (category === document.state.global.category) return;\n\n dispatch(setPackageCategory({ category }));\n },\n [document.state.global.category, dispatch],\n );\n\n const onPublisherChange = useCallback(\n (name: string) => {\n if (!document.state.global.author.name && !name) return;\n if (name === document.state.global.author.name) return;\n\n dispatch(setPackageAuthorName({ name }));\n },\n [document.state.global.author.name, dispatch],\n );\n\n const onPublisherUrlChange = useCallback(\n (website: string) => {\n if (!document.state.global.author.website && !website) return;\n if (website === document.state.global.author.website) return;\n\n dispatch(setPackageAuthorWebsite({ website }));\n },\n [document.state.global.author.website, dispatch],\n );\n\n const onGithubRepositoryChange = useCallback(\n (url: string) => {\n if (!document.state.global.githubUrl && !url) return;\n if (url === document.state.global.githubUrl) return;\n\n dispatch(setPackageGithubUrl({ url }));\n },\n [document.state.global.githubUrl, dispatch],\n );\n\n const onNpmPackageChange = useCallback(\n (url: string) => {\n if (!document.state.global.npmUrl && !url) return;\n if (url === document.state.global.npmUrl) return;\n\n dispatch(setPackageNpmUrl({ url }));\n },\n [document.state.global.npmUrl, dispatch],\n );\n\n const onAddKeyword = useCallback(\n (keyword: { id: string; label: string }) => {\n dispatch(addPackageKeyword(keyword));\n },\n [dispatch],\n );\n\n const onRemoveKeyword = useCallback(\n (id: string) => {\n dispatch(removePackageKeyword({ id }));\n },\n [dispatch],\n );\n\n return (\n <div className=\"bg-gray-50 p-6 dark:bg-slate-800\">\n {displayToolbar && <DocumentToolbar />}\n <MetaForm\n name={document.state.global.name ?? \"\"}\n description={document.state.global.description ?? \"\"}\n category={document.state.global.category ?? \"\"}\n publisher={document.state.global.author.name ?? \"\"}\n publisherUrl={document.state.global.author.website ?? \"\"}\n githubRepository={document.state.global.githubUrl ?? \"\"}\n npmPackage={document.state.global.npmUrl ?? \"\"}\n keywords={document.state.global.keywords}\n onNameChange={onNameChange}\n onDescriptionChange={onDescriptionChange}\n onCategoryChange={onCategoryChange}\n onPublisherChange={onPublisherChange}\n onPublisherUrlChange={onPublisherUrlChange}\n onGithubRepositoryChange={onGithubRepositoryChange}\n onNpmPackageChange={onNpmPackageChange}\n onAddKeyword={onAddKeyword}\n onRemoveKeyword={onRemoveKeyword}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { _ as removeDocumentType, b as setProcessorStatus, h as addProcessorApp, m as addDocumentType, v as removeProcessorApp, x as setProcessorType, y as setProcessorName } from "./utils-CkWB3DRk.js";
|
|
2
2
|
import { StatusPill } from "./editors/components/index.js";
|
|
3
|
-
import { n as useAvailableDocumentTypes, t as useDebounce } from "./hooks-
|
|
3
|
+
import { n as useAvailableDocumentTypes, t as useDebounce } from "./hooks-Btogj1f0.js";
|
|
4
4
|
import { n as useSelectedProcessorModuleDocument } from "./useVetraDocument-BQKyels4.js";
|
|
5
5
|
import { useSetPHDocumentEditorConfig } from "@powerhousedao/reactor-browser";
|
|
6
6
|
import { PROCESSOR_APPS } from "@powerhousedao/shared/processors";
|
|
@@ -241,4 +241,4 @@ function Editor() {
|
|
|
241
241
|
//#endregion
|
|
242
242
|
export { Editor as default };
|
|
243
243
|
|
|
244
|
-
//# sourceMappingURL=editor-
|
|
244
|
+
//# sourceMappingURL=editor-Dw-NohMb.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor-BKBwkOyg.js","names":[],"sources":["../editors/processor-editor/components/ProcessorEditorForm.tsx","../editors/processor-editor/config.ts","../editors/processor-editor/editor.tsx"],"sourcesContent":["import {\n PROCESSOR_APPS,\n type ProcessorApp,\n type ProcessorApps,\n} from \"@powerhousedao/shared/processors\";\nimport { useEffect, useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { DocumentTypeItem } from \"../../../document-models/processor-module/index.js\";\nimport { StatusPill } from \"../../components/index.js\";\nimport { useAvailableDocumentTypes, useDebounce } from \"../../hooks/index.js\";\n\nexport interface ProcessorEditorFormProps {\n processorName?: string;\n processorType?: string;\n documentTypes?: DocumentTypeItem[];\n processorApps?: ProcessorApps;\n status?: string;\n onNameChange?: (name: string) => void;\n onTypeChange?: (type: string) => void;\n onAddDocumentType?: (id: string, documentType: string) => void;\n onRemoveDocumentType?: (id: string) => void;\n onAddProcessorApp?: (processorApp: ProcessorApp) => void;\n onRemoveProcessorApp?: (processorApp: ProcessorApp) => void;\n onConfirm?: () => void;\n}\n\nexport const ProcessorEditorForm: React.FC<ProcessorEditorFormProps> = ({\n processorName: initialProcessorName = \"\",\n processorType: initialProcessorType = \"\",\n documentTypes: initialDocumentTypes = [],\n processorApps: initialProcessorApps = [],\n status = \"DRAFT\",\n onNameChange,\n onTypeChange,\n onAddDocumentType,\n onRemoveDocumentType,\n onAddProcessorApp,\n onRemoveProcessorApp,\n onConfirm,\n}) => {\n const [processorName, setProcessorName] = useState(initialProcessorName);\n const [processorType, setProcessorType] = useState(initialProcessorType);\n const [documentTypes, setDocumentTypes] =\n useState<DocumentTypeItem[]>(initialDocumentTypes);\n const [selectedDocumentType, setSelectedDocumentType] = useState(\"\");\n const [processorApps, setProcessorApps] = useState(initialProcessorApps);\n const [isConfirmed, setIsConfirmed] = useState(false);\n\n // Get available document types from the hook (combines reactor and vetra drive)\n const availableDocumentTypes = useAvailableDocumentTypes();\n\n // Use the debounce hook for name and type changes\n useDebounce(processorName, onNameChange, 300);\n useDebounce(processorType, onTypeChange, 300);\n\n // Update local state when initial values change\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setProcessorName(initialProcessorName);\n }, [initialProcessorName]);\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setProcessorType(initialProcessorType);\n }, [initialProcessorType]);\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setDocumentTypes(initialDocumentTypes);\n }, [initialDocumentTypes]);\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setProcessorApps(initialProcessorApps);\n }, [initialProcessorApps]);\n\n // Reset confirmation state if status changes back to DRAFT\n useEffect(() => {\n if (status === \"DRAFT\") {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setIsConfirmed(false);\n }\n }, [status]);\n\n // Check if form should be read-only\n const isReadOnly = isConfirmed || status === \"CONFIRMED\";\n\n const handleConfirm = () => {\n if (\n processorName.trim() &&\n processorType &&\n documentTypes.length > 0 &&\n processorApps.length > 0\n ) {\n setIsConfirmed(true); // Immediate UI update\n onConfirm?.();\n }\n };\n\n const handleRemoveDocumentType = (id: string) => {\n setDocumentTypes(documentTypes.filter((dt) => dt.id !== id));\n onRemoveDocumentType?.(id);\n };\n\n const canConfirm =\n !!processorName.trim() &&\n !!processorType &&\n documentTypes.length > 0 &&\n processorApps.length > 0;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-medium text-gray-900 dark:text-slate-50\">\n Processor Configuration\n </h2>\n <StatusPill\n status={status === \"CONFIRMED\" ? \"confirmed\" : \"draft\"}\n label={status === \"CONFIRMED\" ? \"Confirmed\" : \"Draft\"}\n />\n </div>\n\n {/* Processor Name Field */}\n <div>\n <label\n htmlFor=\"processor-name\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Processor Name\n </label>\n <input\n id=\"processor-name\"\n type=\"text\"\n value={processorName}\n onChange={(e) => setProcessorName(e.target.value)}\n disabled={isReadOnly}\n className={twMerge(\n \"w-full rounded-md border border-gray-300 px-3 py-2 placeholder:text-gray-700 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\",\n isReadOnly\n ? \"cursor-not-allowed bg-gray-100 dark:bg-slate-700\"\n : \"\",\n )}\n placeholder=\"Enter processor name\"\n />\n </div>\n\n {/* Processor Type Dropdown */}\n <div>\n <label\n htmlFor=\"processor-type\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Type\n </label>\n <select\n id=\"processor-type\"\n value={processorType}\n onChange={(e) => setProcessorType(e.target.value)}\n disabled={isReadOnly}\n className={twMerge(\n \"w-full rounded-md border border-gray-300 px-3 py-2 text-gray-900 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100\",\n isReadOnly\n ? \"cursor-not-allowed bg-gray-100 dark:bg-slate-700\"\n : \"\",\n )}\n >\n <option value=\"\">Select type...</option>\n <option value=\"analytics\">Analytics</option>\n <option value=\"relational\">Relational Database</option>\n </select>\n </div>\n\n {/* Document Types Field */}\n <div>\n <label\n htmlFor=\"document-types\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Document Types\n </label>\n <div className=\"space-y-2\">\n {!isReadOnly && availableDocumentTypes.length > 0 && (\n <select\n id=\"document-types\"\n value={selectedDocumentType}\n onChange={(e) => {\n const selectedValue = e.target.value;\n if (\n selectedValue &&\n !documentTypes.some((dt) => dt.documentType === selectedValue)\n ) {\n const id = Date.now().toString();\n const newType: DocumentTypeItem = {\n id,\n documentType: selectedValue,\n };\n setDocumentTypes([...documentTypes, newType]);\n onAddDocumentType?.(id, selectedValue);\n }\n setSelectedDocumentType(\"\");\n }}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 text-gray-900 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100\"\n >\n <option value=\"\">Select a document type to add</option>\n {availableDocumentTypes\n .filter(\n (docType) =>\n !documentTypes.some((dt) => dt.documentType === docType),\n )\n .map((docType) => (\n <option key={docType} value={docType}>\n {docType}\n </option>\n ))}\n </select>\n )}\n <div className=\"space-y-1\">\n {documentTypes.map((type) => (\n <div key={type.id} className=\"flex items-center py-1\">\n <span className=\"text-sm text-gray-700 dark:text-slate-200\">\n {type.documentType}\n </span>\n {!isReadOnly && (\n <button\n onClick={() => handleRemoveDocumentType(type.id)}\n className=\"ml-2 text-gray-400 hover:text-gray-600 focus:outline-none dark:text-slate-500 dark:hover:text-slate-300\"\n >\n ×\n </button>\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n {/* Processor Apps Field */}\n <div>\n <label\n htmlFor=\"processor-apps\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Processor Apps\n </label>\n <div className=\"space-y-2\">\n {!isReadOnly && (\n <>\n {PROCESSOR_APPS.map((processorApp) => (\n <div key={processorApp} className=\"flex gap-1\">\n <input\n type=\"checkbox\"\n name={processorApp}\n id={processorApp}\n checked={processorApps.includes(processorApp)}\n onChange={(event) => {\n const isChecked = event.target.checked;\n if (isChecked) {\n setProcessorApps((processorApps) => [\n ...new Set([...processorApps, processorApp]),\n ]);\n onAddProcessorApp?.(processorApp);\n } else {\n if (processorApps.length > 1) {\n setProcessorApps((processorApps) =>\n processorApps.filter((p) => p !== processorApp),\n );\n onRemoveProcessorApp?.(processorApp);\n }\n }\n }}\n />\n <label\n htmlFor={processorApp}\n className=\"text-gray-700 dark:text-slate-200\"\n >\n {processorApp}\n </label>\n </div>\n ))}\n </>\n )}\n <div className=\"space-y-1\">\n {isReadOnly &&\n processorApps.map((processorApp) => (\n <span\n key={processorApp}\n className=\"text-sm text-gray-700 dark:text-slate-200\"\n >\n {processorApp}\n </span>\n ))}\n </div>\n </div>\n </div>\n {/* Confirm Button - only show if not in read-only mode */}\n {!isReadOnly && (\n <div>\n <button\n onClick={handleConfirm}\n disabled={!canConfirm}\n className=\"rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-700 focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:bg-gray-300 dark:bg-blue-300 dark:text-slate-900 dark:hover:bg-blue-200 dark:disabled:bg-slate-600 dark:disabled:text-slate-100\"\n >\n Confirm\n </button>\n </div>\n )}\n </div>\n );\n};\n","import type { PHDocumentEditorConfig } from \"@powerhousedao/reactor-browser\";\n\nexport const editorConfig: PHDocumentEditorConfig = {\n isExternalControlsEnabled: false,\n};\n","import { DocumentToolbar } from \"@powerhousedao/design-system/connect\";\nimport { useSetPHDocumentEditorConfig } from \"@powerhousedao/reactor-browser\";\nimport type {\n ProcessorApp,\n ProcessorApps,\n} from \"@powerhousedao/shared/processors\";\nimport { useCallback } from \"react\";\nimport {\n addDocumentType,\n addProcessorApp,\n removeDocumentType,\n removeProcessorApp,\n setProcessorName,\n setProcessorStatus,\n setProcessorType,\n} from \"../../document-models/processor-module/index.js\";\nimport { useSelectedProcessorModuleDocument } from \"../hooks/useVetraDocument.js\";\nimport { ProcessorEditorForm } from \"./components/ProcessorEditorForm.js\";\nimport { editorConfig } from \"./config.js\";\n\nexport default function Editor() {\n useSetPHDocumentEditorConfig(editorConfig);\n const [document, dispatch] = useSelectedProcessorModuleDocument();\n\n const onConfirm = useCallback(() => {\n // Dispatch all actions at once\n dispatch([setProcessorStatus({ status: \"CONFIRMED\" })]);\n }, [dispatch]);\n\n const onNameChange = useCallback(\n (name: string) => {\n if (name === document.state.global.name) return;\n dispatch(setProcessorName({ name }));\n },\n [document.state.global.name, dispatch],\n );\n\n const onTypeChange = useCallback(\n (type: string) => {\n if (type === document.state.global.type) return;\n dispatch(setProcessorType({ type }));\n },\n [document.state.global.type, dispatch],\n );\n\n const onAddDocumentType = useCallback(\n (id: string, documentType: string) => {\n dispatch(addDocumentType({ id, documentType }));\n },\n [dispatch],\n );\n\n const onRemoveDocumentType = useCallback(\n (id: string) => {\n dispatch(removeDocumentType({ id }));\n },\n [dispatch],\n );\n\n const onAddProcessorApp = useCallback(\n (processorApp: ProcessorApp) => {\n dispatch(addProcessorApp({ processorApp }));\n },\n [dispatch],\n );\n\n const onRemoveProcessorApp = useCallback(\n (processorApp: ProcessorApp) => {\n dispatch(removeProcessorApp({ processorApp }));\n },\n [dispatch],\n );\n\n return (\n <div className=\"bg-gray-50 p-6 dark:bg-slate-800\">\n <DocumentToolbar />\n <ProcessorEditorForm\n onNameChange={onNameChange}\n onTypeChange={onTypeChange}\n onAddDocumentType={onAddDocumentType}\n onRemoveDocumentType={onRemoveDocumentType}\n onAddProcessorApp={onAddProcessorApp}\n onRemoveProcessorApp={onRemoveProcessorApp}\n status={document.state.global.status}\n processorName={document.state.global.name ?? \"\"}\n processorType={document.state.global.type ?? \"\"}\n documentTypes={document.state.global.documentTypes ?? []}\n processorApps={document.state.global.processorApps as ProcessorApps}\n onConfirm={onConfirm}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"editor-Dw-NohMb.js","names":[],"sources":["../editors/processor-editor/components/ProcessorEditorForm.tsx","../editors/processor-editor/config.ts","../editors/processor-editor/editor.tsx"],"sourcesContent":["import {\n PROCESSOR_APPS,\n type ProcessorApp,\n type ProcessorApps,\n} from \"@powerhousedao/shared/processors\";\nimport { useEffect, useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { DocumentTypeItem } from \"../../../document-models/processor-module/index.js\";\nimport { StatusPill } from \"../../components/index.js\";\nimport { useAvailableDocumentTypes, useDebounce } from \"../../hooks/index.js\";\n\nexport interface ProcessorEditorFormProps {\n processorName?: string;\n processorType?: string;\n documentTypes?: DocumentTypeItem[];\n processorApps?: ProcessorApps;\n status?: string;\n onNameChange?: (name: string) => void;\n onTypeChange?: (type: string) => void;\n onAddDocumentType?: (id: string, documentType: string) => void;\n onRemoveDocumentType?: (id: string) => void;\n onAddProcessorApp?: (processorApp: ProcessorApp) => void;\n onRemoveProcessorApp?: (processorApp: ProcessorApp) => void;\n onConfirm?: () => void;\n}\n\nexport const ProcessorEditorForm: React.FC<ProcessorEditorFormProps> = ({\n processorName: initialProcessorName = \"\",\n processorType: initialProcessorType = \"\",\n documentTypes: initialDocumentTypes = [],\n processorApps: initialProcessorApps = [],\n status = \"DRAFT\",\n onNameChange,\n onTypeChange,\n onAddDocumentType,\n onRemoveDocumentType,\n onAddProcessorApp,\n onRemoveProcessorApp,\n onConfirm,\n}) => {\n const [processorName, setProcessorName] = useState(initialProcessorName);\n const [processorType, setProcessorType] = useState(initialProcessorType);\n const [documentTypes, setDocumentTypes] =\n useState<DocumentTypeItem[]>(initialDocumentTypes);\n const [selectedDocumentType, setSelectedDocumentType] = useState(\"\");\n const [processorApps, setProcessorApps] = useState(initialProcessorApps);\n const [isConfirmed, setIsConfirmed] = useState(false);\n\n // Get available document types from the hook (combines reactor and vetra drive)\n const availableDocumentTypes = useAvailableDocumentTypes();\n\n // Use the debounce hook for name and type changes\n useDebounce(processorName, onNameChange, 300);\n useDebounce(processorType, onTypeChange, 300);\n\n // Update local state when initial values change\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setProcessorName(initialProcessorName);\n }, [initialProcessorName]);\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setProcessorType(initialProcessorType);\n }, [initialProcessorType]);\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setDocumentTypes(initialDocumentTypes);\n }, [initialDocumentTypes]);\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setProcessorApps(initialProcessorApps);\n }, [initialProcessorApps]);\n\n // Reset confirmation state if status changes back to DRAFT\n useEffect(() => {\n if (status === \"DRAFT\") {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setIsConfirmed(false);\n }\n }, [status]);\n\n // Check if form should be read-only\n const isReadOnly = isConfirmed || status === \"CONFIRMED\";\n\n const handleConfirm = () => {\n if (\n processorName.trim() &&\n processorType &&\n documentTypes.length > 0 &&\n processorApps.length > 0\n ) {\n setIsConfirmed(true); // Immediate UI update\n onConfirm?.();\n }\n };\n\n const handleRemoveDocumentType = (id: string) => {\n setDocumentTypes(documentTypes.filter((dt) => dt.id !== id));\n onRemoveDocumentType?.(id);\n };\n\n const canConfirm =\n !!processorName.trim() &&\n !!processorType &&\n documentTypes.length > 0 &&\n processorApps.length > 0;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-medium text-gray-900 dark:text-slate-50\">\n Processor Configuration\n </h2>\n <StatusPill\n status={status === \"CONFIRMED\" ? \"confirmed\" : \"draft\"}\n label={status === \"CONFIRMED\" ? \"Confirmed\" : \"Draft\"}\n />\n </div>\n\n {/* Processor Name Field */}\n <div>\n <label\n htmlFor=\"processor-name\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Processor Name\n </label>\n <input\n id=\"processor-name\"\n type=\"text\"\n value={processorName}\n onChange={(e) => setProcessorName(e.target.value)}\n disabled={isReadOnly}\n className={twMerge(\n \"w-full rounded-md border border-gray-300 px-3 py-2 placeholder:text-gray-700 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\",\n isReadOnly\n ? \"cursor-not-allowed bg-gray-100 dark:bg-slate-700\"\n : \"\",\n )}\n placeholder=\"Enter processor name\"\n />\n </div>\n\n {/* Processor Type Dropdown */}\n <div>\n <label\n htmlFor=\"processor-type\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Type\n </label>\n <select\n id=\"processor-type\"\n value={processorType}\n onChange={(e) => setProcessorType(e.target.value)}\n disabled={isReadOnly}\n className={twMerge(\n \"w-full rounded-md border border-gray-300 px-3 py-2 text-gray-900 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100\",\n isReadOnly\n ? \"cursor-not-allowed bg-gray-100 dark:bg-slate-700\"\n : \"\",\n )}\n >\n <option value=\"\">Select type...</option>\n <option value=\"analytics\">Analytics</option>\n <option value=\"relational\">Relational Database</option>\n </select>\n </div>\n\n {/* Document Types Field */}\n <div>\n <label\n htmlFor=\"document-types\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Document Types\n </label>\n <div className=\"space-y-2\">\n {!isReadOnly && availableDocumentTypes.length > 0 && (\n <select\n id=\"document-types\"\n value={selectedDocumentType}\n onChange={(e) => {\n const selectedValue = e.target.value;\n if (\n selectedValue &&\n !documentTypes.some((dt) => dt.documentType === selectedValue)\n ) {\n const id = Date.now().toString();\n const newType: DocumentTypeItem = {\n id,\n documentType: selectedValue,\n };\n setDocumentTypes([...documentTypes, newType]);\n onAddDocumentType?.(id, selectedValue);\n }\n setSelectedDocumentType(\"\");\n }}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 text-gray-900 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100\"\n >\n <option value=\"\">Select a document type to add</option>\n {availableDocumentTypes\n .filter(\n (docType) =>\n !documentTypes.some((dt) => dt.documentType === docType),\n )\n .map((docType) => (\n <option key={docType} value={docType}>\n {docType}\n </option>\n ))}\n </select>\n )}\n <div className=\"space-y-1\">\n {documentTypes.map((type) => (\n <div key={type.id} className=\"flex items-center py-1\">\n <span className=\"text-sm text-gray-700 dark:text-slate-200\">\n {type.documentType}\n </span>\n {!isReadOnly && (\n <button\n onClick={() => handleRemoveDocumentType(type.id)}\n className=\"ml-2 text-gray-400 hover:text-gray-600 focus:outline-none dark:text-slate-500 dark:hover:text-slate-300\"\n >\n ×\n </button>\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n {/* Processor Apps Field */}\n <div>\n <label\n htmlFor=\"processor-apps\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Processor Apps\n </label>\n <div className=\"space-y-2\">\n {!isReadOnly && (\n <>\n {PROCESSOR_APPS.map((processorApp) => (\n <div key={processorApp} className=\"flex gap-1\">\n <input\n type=\"checkbox\"\n name={processorApp}\n id={processorApp}\n checked={processorApps.includes(processorApp)}\n onChange={(event) => {\n const isChecked = event.target.checked;\n if (isChecked) {\n setProcessorApps((processorApps) => [\n ...new Set([...processorApps, processorApp]),\n ]);\n onAddProcessorApp?.(processorApp);\n } else {\n if (processorApps.length > 1) {\n setProcessorApps((processorApps) =>\n processorApps.filter((p) => p !== processorApp),\n );\n onRemoveProcessorApp?.(processorApp);\n }\n }\n }}\n />\n <label\n htmlFor={processorApp}\n className=\"text-gray-700 dark:text-slate-200\"\n >\n {processorApp}\n </label>\n </div>\n ))}\n </>\n )}\n <div className=\"space-y-1\">\n {isReadOnly &&\n processorApps.map((processorApp) => (\n <span\n key={processorApp}\n className=\"text-sm text-gray-700 dark:text-slate-200\"\n >\n {processorApp}\n </span>\n ))}\n </div>\n </div>\n </div>\n {/* Confirm Button - only show if not in read-only mode */}\n {!isReadOnly && (\n <div>\n <button\n onClick={handleConfirm}\n disabled={!canConfirm}\n className=\"rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-700 focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:bg-gray-300 dark:bg-blue-300 dark:text-slate-900 dark:hover:bg-blue-200 dark:disabled:bg-slate-600 dark:disabled:text-slate-100\"\n >\n Confirm\n </button>\n </div>\n )}\n </div>\n );\n};\n","import type { PHDocumentEditorConfig } from \"@powerhousedao/reactor-browser\";\n\nexport const editorConfig: PHDocumentEditorConfig = {\n isExternalControlsEnabled: false,\n};\n","import { DocumentToolbar } from \"@powerhousedao/design-system/connect\";\nimport { useSetPHDocumentEditorConfig } from \"@powerhousedao/reactor-browser\";\nimport type {\n ProcessorApp,\n ProcessorApps,\n} from \"@powerhousedao/shared/processors\";\nimport { useCallback } from \"react\";\nimport {\n addDocumentType,\n addProcessorApp,\n removeDocumentType,\n removeProcessorApp,\n setProcessorName,\n setProcessorStatus,\n setProcessorType,\n} from \"../../document-models/processor-module/index.js\";\nimport { useSelectedProcessorModuleDocument } from \"../hooks/useVetraDocument.js\";\nimport { ProcessorEditorForm } from \"./components/ProcessorEditorForm.js\";\nimport { editorConfig } from \"./config.js\";\n\nexport default function Editor() {\n useSetPHDocumentEditorConfig(editorConfig);\n const [document, dispatch] = useSelectedProcessorModuleDocument();\n\n const onConfirm = useCallback(() => {\n // Dispatch all actions at once\n dispatch([setProcessorStatus({ status: \"CONFIRMED\" })]);\n }, [dispatch]);\n\n const onNameChange = useCallback(\n (name: string) => {\n if (name === document.state.global.name) return;\n dispatch(setProcessorName({ name }));\n },\n [document.state.global.name, dispatch],\n );\n\n const onTypeChange = useCallback(\n (type: string) => {\n if (type === document.state.global.type) return;\n dispatch(setProcessorType({ type }));\n },\n [document.state.global.type, dispatch],\n );\n\n const onAddDocumentType = useCallback(\n (id: string, documentType: string) => {\n dispatch(addDocumentType({ id, documentType }));\n },\n [dispatch],\n );\n\n const onRemoveDocumentType = useCallback(\n (id: string) => {\n dispatch(removeDocumentType({ id }));\n },\n [dispatch],\n );\n\n const onAddProcessorApp = useCallback(\n (processorApp: ProcessorApp) => {\n dispatch(addProcessorApp({ processorApp }));\n },\n [dispatch],\n );\n\n const onRemoveProcessorApp = useCallback(\n (processorApp: ProcessorApp) => {\n dispatch(removeProcessorApp({ processorApp }));\n },\n [dispatch],\n );\n\n return (\n <div className=\"bg-gray-50 p-6 dark:bg-slate-800\">\n <DocumentToolbar />\n <ProcessorEditorForm\n onNameChange={onNameChange}\n onTypeChange={onTypeChange}\n onAddDocumentType={onAddDocumentType}\n onRemoveDocumentType={onRemoveDocumentType}\n onAddProcessorApp={onAddProcessorApp}\n onRemoveProcessorApp={onRemoveProcessorApp}\n status={document.state.global.status}\n processorName={document.state.global.name ?? \"\"}\n processorType={document.state.global.type ?? \"\"}\n documentTypes={document.state.global.documentTypes ?? []}\n processorApps={document.state.global.processorApps as ProcessorApps}\n onConfirm={onConfirm}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { _ as setEditorName, g as removeDocumentType, m as addDocumentType, v as setEditorStatus } from "./utils-D0ejTHeY.js";
|
|
2
2
|
import { s as useSelectedDocumentEditorDocument } from "./document-editor-5gSBaTUM.js";
|
|
3
3
|
import { StatusPill } from "./editors/components/index.js";
|
|
4
|
-
import { n as useAvailableDocumentTypes, t as useDebounce } from "./hooks-
|
|
4
|
+
import { n as useAvailableDocumentTypes, t as useDebounce } from "./hooks-Btogj1f0.js";
|
|
5
5
|
import { useSetPHDocumentEditorConfig } from "@powerhousedao/reactor-browser";
|
|
6
6
|
import { Suspense, useCallback, useEffect, useState } from "react";
|
|
7
7
|
import { twMerge } from "tailwind-merge";
|
|
@@ -172,4 +172,4 @@ function Editor() {
|
|
|
172
172
|
//#endregion
|
|
173
173
|
export { Editor as default };
|
|
174
174
|
|
|
175
|
-
//# sourceMappingURL=editor-
|
|
175
|
+
//# sourceMappingURL=editor-UWE1ab9Y.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor-BRPbTxCe.js","names":[],"sources":["../editors/document-editor/components/DocumentEditorForm.tsx","../editors/document-editor/config.ts","../editors/document-editor/editor.tsx"],"sourcesContent":["import { Suspense, useEffect, useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport type {\n AddDocumentTypeInput,\n DocumentTypeItem,\n RemoveDocumentTypeInput,\n} from \"../../../document-models/document-editor/index.js\";\nimport { StatusPill } from \"../../components/index.js\";\nimport { useAvailableDocumentTypes, useDebounce } from \"../../hooks/index.js\";\n\nexport interface DocumentEditorFormProps {\n editorName?: string;\n documentTypes?: DocumentTypeItem[];\n status?: string;\n onEditorNameChange?: (name: string) => void;\n onAddDocumentType?: (input: AddDocumentTypeInput) => void;\n onRemoveDocumentType?: (input: RemoveDocumentTypeInput) => void;\n onConfirm?: () => void;\n}\n\nfunction DocumentTypeSelectUI(\n props: React.SelectHTMLAttributes<HTMLSelectElement>,\n) {\n return (\n <select\n id=\"supported-document-types\"\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 text-gray-900 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100\"\n {...props}\n >\n <option value=\"\">Select a document type</option>\n {props.children}\n </select>\n );\n}\n\nfunction DocumentTypeSelect({\n documentTypes,\n setDocumentTypes,\n onAddDocumentType,\n onRemoveDocumentType,\n}: {\n setDocumentTypes: (documentTypes: DocumentTypeItem[]) => void;\n} & Pick<\n DocumentEditorFormProps,\n \"documentTypes\" | \"onAddDocumentType\" | \"onRemoveDocumentType\"\n>) {\n // Get available document types from the hook (vetra drive only for document editor)\n const availableDocumentTypes = useAvailableDocumentTypes(true);\n const [selectedDocumentType, setSelectedDocumentType] = useState(\"\");\n\n return (\n <DocumentTypeSelectUI\n value={selectedDocumentType}\n onChange={(e) => {\n const selectedValue = e.target.value;\n if (selectedValue) {\n // Remove existing document type if any\n\n const existingType = documentTypes?.at(0);\n if (existingType) {\n onRemoveDocumentType?.({ id: existingType.id });\n }\n\n // Add the new document type\n const newTypeInput: AddDocumentTypeInput = {\n id: Date.now().toString(), // Generate a unique ID\n documentType: selectedValue,\n };\n const newType: DocumentTypeItem = {\n id: newTypeInput.id,\n documentType: newTypeInput.documentType,\n };\n setDocumentTypes([newType]); // Replace with single item array\n onAddDocumentType?.(newTypeInput);\n }\n setSelectedDocumentType(\"\");\n }}\n >\n {availableDocumentTypes.map((docType) => (\n <option key={docType} value={docType}>\n {docType}\n </option>\n ))}\n </DocumentTypeSelectUI>\n );\n}\n\nexport const DocumentEditorForm: React.FC<DocumentEditorFormProps> = ({\n editorName: initialEditorName = \"\",\n documentTypes: initialDocumentTypes = [],\n status = \"DRAFT\",\n onEditorNameChange,\n onAddDocumentType,\n onRemoveDocumentType,\n onConfirm,\n}) => {\n const [editorName, setEditorName] = useState(initialEditorName);\n const [documentTypes, setDocumentTypes] =\n useState<DocumentTypeItem[]>(initialDocumentTypes);\n const [isConfirmed, setIsConfirmed] = useState(false);\n\n // Use the debounce hook for name changes\n useDebounce(editorName, onEditorNameChange, 300);\n\n // Update local state when initial values change\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setEditorName(initialEditorName);\n }, [initialEditorName]);\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setDocumentTypes(initialDocumentTypes);\n }, [initialDocumentTypes]);\n\n // Reset confirmation state if status changes back to DRAFT\n useEffect(() => {\n if (status === \"DRAFT\") {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setIsConfirmed(false);\n }\n }, [status]);\n\n // Check if form should be read-only\n const isReadOnly = isConfirmed || status === \"CONFIRMED\";\n\n const handleConfirm = () => {\n if (editorName.trim() && documentTypes.length > 0) {\n setIsConfirmed(true); // Immediate UI update\n onConfirm?.();\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-medium text-gray-900 dark:text-slate-50\">\n Editor Configuration\n </h2>\n <StatusPill\n status={status === \"CONFIRMED\" ? \"confirmed\" : \"draft\"}\n label={status === \"CONFIRMED\" ? \"Confirmed\" : \"Draft\"}\n />\n </div>\n\n {/* Editor Name Field */}\n <div>\n <label\n htmlFor=\"editor-name\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Editor Name\n </label>\n <input\n id=\"editor-name\"\n type=\"text\"\n value={editorName}\n onChange={(e) => setEditorName(e.target.value)}\n disabled={isReadOnly}\n className={twMerge(\n \"w-full rounded-md border border-gray-300 px-3 py-2 placeholder:text-gray-700 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\",\n isReadOnly\n ? \"cursor-not-allowed bg-gray-100 dark:bg-slate-700\"\n : \"\",\n )}\n />\n </div>\n\n {/* Supported Document Types Field */}\n <div>\n <label\n htmlFor=\"supported-document-types\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Supported Document Types\n </label>\n <div className=\"space-y-2\">\n {!isReadOnly && (\n <Suspense fallback={<DocumentTypeSelectUI />}>\n <DocumentTypeSelect\n documentTypes={documentTypes}\n setDocumentTypes={setDocumentTypes}\n onAddDocumentType={onAddDocumentType}\n onRemoveDocumentType={onRemoveDocumentType}\n />\n </Suspense>\n )}\n <div className=\"space-y-1\">\n {documentTypes.map((type) => (\n <div key={type.id} className=\"flex items-center py-1\">\n <span className=\"text-sm text-gray-700 dark:text-slate-200\">\n {type.documentType}\n </span>\n {!isReadOnly && (\n <button\n onClick={() => {\n setDocumentTypes([]);\n onRemoveDocumentType?.({ id: type.id });\n }}\n className=\"ml-2 text-gray-400 hover:text-gray-600 focus:outline-none dark:text-slate-500 dark:hover:text-slate-300\"\n >\n ×\n </button>\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Confirm Button - only show if not in read-only mode */}\n {!isReadOnly && (\n <div>\n <button\n onClick={handleConfirm}\n disabled={!editorName.trim() || documentTypes.length === 0}\n className=\"rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-700 focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:bg-gray-300 dark:bg-blue-300 dark:text-slate-900 dark:hover:bg-blue-200 dark:disabled:bg-slate-600 dark:disabled:text-slate-100\"\n >\n Confirm\n </button>\n </div>\n )}\n </div>\n );\n};\n","import type { PHDocumentEditorConfig } from \"@powerhousedao/reactor-browser\";\n\nexport const editorConfig: PHDocumentEditorConfig = {\n isExternalControlsEnabled: false,\n};\n","import { DocumentToolbar } from \"@powerhousedao/design-system/connect\";\nimport { useSetPHDocumentEditorConfig } from \"@powerhousedao/reactor-browser\";\nimport { useCallback } from \"react\";\nimport { useSelectedDocumentEditorDocument } from \"../../document-models/document-editor/index.js\";\nimport {\n addDocumentType,\n removeDocumentType,\n setEditorName,\n setEditorStatus,\n type AddDocumentTypeInput,\n type RemoveDocumentTypeInput,\n} from \"../../document-models/document-editor/index.js\";\nimport { DocumentEditorForm } from \"./components/DocumentEditorForm.js\";\nimport { editorConfig } from \"./config.js\";\n\nexport default function Editor() {\n useSetPHDocumentEditorConfig(editorConfig);\n const [document, dispatch] = useSelectedDocumentEditorDocument();\n\n const onEditorNameChange = useCallback(\n (name: string) => {\n if (!document.state.global.name && !name) return;\n if (name === document.state.global.name) return;\n\n dispatch(setEditorName({ name }));\n },\n [document.state.global.name, dispatch],\n );\n\n const onAddDocumentType = useCallback(\n (input: AddDocumentTypeInput) => {\n dispatch(addDocumentType(input));\n },\n [dispatch],\n );\n\n const onRemoveDocumentType = useCallback(\n (input: RemoveDocumentTypeInput) => {\n dispatch(removeDocumentType(input));\n },\n [dispatch],\n );\n\n const onConfirm = useCallback(() => {\n dispatch(setEditorStatus({ status: \"CONFIRMED\" }));\n }, [dispatch]);\n\n return (\n <div className=\"bg-gray-50 p-6 dark:bg-slate-800\">\n <DocumentToolbar />\n <DocumentEditorForm\n status={document.state.global.status}\n editorName={document.state.global.name ?? \"\"}\n documentTypes={document.state.global.documentTypes}\n onEditorNameChange={onEditorNameChange}\n onAddDocumentType={onAddDocumentType}\n onRemoveDocumentType={onRemoveDocumentType}\n onConfirm={onConfirm}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"editor-UWE1ab9Y.js","names":[],"sources":["../editors/document-editor/components/DocumentEditorForm.tsx","../editors/document-editor/config.ts","../editors/document-editor/editor.tsx"],"sourcesContent":["import { Suspense, useEffect, useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport type {\n AddDocumentTypeInput,\n DocumentTypeItem,\n RemoveDocumentTypeInput,\n} from \"../../../document-models/document-editor/index.js\";\nimport { StatusPill } from \"../../components/index.js\";\nimport { useAvailableDocumentTypes, useDebounce } from \"../../hooks/index.js\";\n\nexport interface DocumentEditorFormProps {\n editorName?: string;\n documentTypes?: DocumentTypeItem[];\n status?: string;\n onEditorNameChange?: (name: string) => void;\n onAddDocumentType?: (input: AddDocumentTypeInput) => void;\n onRemoveDocumentType?: (input: RemoveDocumentTypeInput) => void;\n onConfirm?: () => void;\n}\n\nfunction DocumentTypeSelectUI(\n props: React.SelectHTMLAttributes<HTMLSelectElement>,\n) {\n return (\n <select\n id=\"supported-document-types\"\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 text-gray-900 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100\"\n {...props}\n >\n <option value=\"\">Select a document type</option>\n {props.children}\n </select>\n );\n}\n\nfunction DocumentTypeSelect({\n documentTypes,\n setDocumentTypes,\n onAddDocumentType,\n onRemoveDocumentType,\n}: {\n setDocumentTypes: (documentTypes: DocumentTypeItem[]) => void;\n} & Pick<\n DocumentEditorFormProps,\n \"documentTypes\" | \"onAddDocumentType\" | \"onRemoveDocumentType\"\n>) {\n // Get available document types from the hook (vetra drive only for document editor)\n const availableDocumentTypes = useAvailableDocumentTypes(true);\n const [selectedDocumentType, setSelectedDocumentType] = useState(\"\");\n\n return (\n <DocumentTypeSelectUI\n value={selectedDocumentType}\n onChange={(e) => {\n const selectedValue = e.target.value;\n if (selectedValue) {\n // Remove existing document type if any\n\n const existingType = documentTypes?.at(0);\n if (existingType) {\n onRemoveDocumentType?.({ id: existingType.id });\n }\n\n // Add the new document type\n const newTypeInput: AddDocumentTypeInput = {\n id: Date.now().toString(), // Generate a unique ID\n documentType: selectedValue,\n };\n const newType: DocumentTypeItem = {\n id: newTypeInput.id,\n documentType: newTypeInput.documentType,\n };\n setDocumentTypes([newType]); // Replace with single item array\n onAddDocumentType?.(newTypeInput);\n }\n setSelectedDocumentType(\"\");\n }}\n >\n {availableDocumentTypes.map((docType) => (\n <option key={docType} value={docType}>\n {docType}\n </option>\n ))}\n </DocumentTypeSelectUI>\n );\n}\n\nexport const DocumentEditorForm: React.FC<DocumentEditorFormProps> = ({\n editorName: initialEditorName = \"\",\n documentTypes: initialDocumentTypes = [],\n status = \"DRAFT\",\n onEditorNameChange,\n onAddDocumentType,\n onRemoveDocumentType,\n onConfirm,\n}) => {\n const [editorName, setEditorName] = useState(initialEditorName);\n const [documentTypes, setDocumentTypes] =\n useState<DocumentTypeItem[]>(initialDocumentTypes);\n const [isConfirmed, setIsConfirmed] = useState(false);\n\n // Use the debounce hook for name changes\n useDebounce(editorName, onEditorNameChange, 300);\n\n // Update local state when initial values change\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setEditorName(initialEditorName);\n }, [initialEditorName]);\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setDocumentTypes(initialDocumentTypes);\n }, [initialDocumentTypes]);\n\n // Reset confirmation state if status changes back to DRAFT\n useEffect(() => {\n if (status === \"DRAFT\") {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setIsConfirmed(false);\n }\n }, [status]);\n\n // Check if form should be read-only\n const isReadOnly = isConfirmed || status === \"CONFIRMED\";\n\n const handleConfirm = () => {\n if (editorName.trim() && documentTypes.length > 0) {\n setIsConfirmed(true); // Immediate UI update\n onConfirm?.();\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-medium text-gray-900 dark:text-slate-50\">\n Editor Configuration\n </h2>\n <StatusPill\n status={status === \"CONFIRMED\" ? \"confirmed\" : \"draft\"}\n label={status === \"CONFIRMED\" ? \"Confirmed\" : \"Draft\"}\n />\n </div>\n\n {/* Editor Name Field */}\n <div>\n <label\n htmlFor=\"editor-name\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Editor Name\n </label>\n <input\n id=\"editor-name\"\n type=\"text\"\n value={editorName}\n onChange={(e) => setEditorName(e.target.value)}\n disabled={isReadOnly}\n className={twMerge(\n \"w-full rounded-md border border-gray-300 px-3 py-2 placeholder:text-gray-700 focus:border-transparent focus:ring-2 focus:ring-blue-500 focus:outline-none dark:border-slate-500 dark:bg-slate-600 dark:text-slate-100 dark:placeholder:text-slate-200\",\n isReadOnly\n ? \"cursor-not-allowed bg-gray-100 dark:bg-slate-700\"\n : \"\",\n )}\n />\n </div>\n\n {/* Supported Document Types Field */}\n <div>\n <label\n htmlFor=\"supported-document-types\"\n className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-slate-200\"\n >\n Supported Document Types\n </label>\n <div className=\"space-y-2\">\n {!isReadOnly && (\n <Suspense fallback={<DocumentTypeSelectUI />}>\n <DocumentTypeSelect\n documentTypes={documentTypes}\n setDocumentTypes={setDocumentTypes}\n onAddDocumentType={onAddDocumentType}\n onRemoveDocumentType={onRemoveDocumentType}\n />\n </Suspense>\n )}\n <div className=\"space-y-1\">\n {documentTypes.map((type) => (\n <div key={type.id} className=\"flex items-center py-1\">\n <span className=\"text-sm text-gray-700 dark:text-slate-200\">\n {type.documentType}\n </span>\n {!isReadOnly && (\n <button\n onClick={() => {\n setDocumentTypes([]);\n onRemoveDocumentType?.({ id: type.id });\n }}\n className=\"ml-2 text-gray-400 hover:text-gray-600 focus:outline-none dark:text-slate-500 dark:hover:text-slate-300\"\n >\n ×\n </button>\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Confirm Button - only show if not in read-only mode */}\n {!isReadOnly && (\n <div>\n <button\n onClick={handleConfirm}\n disabled={!editorName.trim() || documentTypes.length === 0}\n className=\"rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-700 focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:bg-gray-300 dark:bg-blue-300 dark:text-slate-900 dark:hover:bg-blue-200 dark:disabled:bg-slate-600 dark:disabled:text-slate-100\"\n >\n Confirm\n </button>\n </div>\n )}\n </div>\n );\n};\n","import type { PHDocumentEditorConfig } from \"@powerhousedao/reactor-browser\";\n\nexport const editorConfig: PHDocumentEditorConfig = {\n isExternalControlsEnabled: false,\n};\n","import { DocumentToolbar } from \"@powerhousedao/design-system/connect\";\nimport { useSetPHDocumentEditorConfig } from \"@powerhousedao/reactor-browser\";\nimport { useCallback } from \"react\";\nimport { useSelectedDocumentEditorDocument } from \"../../document-models/document-editor/index.js\";\nimport {\n addDocumentType,\n removeDocumentType,\n setEditorName,\n setEditorStatus,\n type AddDocumentTypeInput,\n type RemoveDocumentTypeInput,\n} from \"../../document-models/document-editor/index.js\";\nimport { DocumentEditorForm } from \"./components/DocumentEditorForm.js\";\nimport { editorConfig } from \"./config.js\";\n\nexport default function Editor() {\n useSetPHDocumentEditorConfig(editorConfig);\n const [document, dispatch] = useSelectedDocumentEditorDocument();\n\n const onEditorNameChange = useCallback(\n (name: string) => {\n if (!document.state.global.name && !name) return;\n if (name === document.state.global.name) return;\n\n dispatch(setEditorName({ name }));\n },\n [document.state.global.name, dispatch],\n );\n\n const onAddDocumentType = useCallback(\n (input: AddDocumentTypeInput) => {\n dispatch(addDocumentType(input));\n },\n [dispatch],\n );\n\n const onRemoveDocumentType = useCallback(\n (input: RemoveDocumentTypeInput) => {\n dispatch(removeDocumentType(input));\n },\n [dispatch],\n );\n\n const onConfirm = useCallback(() => {\n dispatch(setEditorStatus({ status: \"CONFIRMED\" }));\n }, [dispatch]);\n\n return (\n <div className=\"bg-gray-50 p-6 dark:bg-slate-800\">\n <DocumentToolbar />\n <DocumentEditorForm\n status={document.state.global.status}\n editorName={document.state.global.name ?? \"\"}\n documentTypes={document.state.global.documentTypes}\n onEditorNameChange={onEditorNameChange}\n onAddDocumentType={onAddDocumentType}\n onRemoveDocumentType={onRemoveDocumentType}\n onConfirm={onConfirm}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as useAvailableDocumentTypes, t as useDebounce } from "../../hooks-
|
|
1
|
+
import { n as useAvailableDocumentTypes, t as useDebounce } from "../../hooks-Btogj1f0.js";
|
|
2
2
|
export { useAvailableDocumentTypes, useDebounce };
|
package/dist/editors/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as DocumentEditorEditor, i as ProcessorModuleEditor, n as VetraDriveApp, o as AppEditor, r as SubgraphModuleEditor, t as VetraPackageEditor } from "../module-
|
|
1
|
+
import { a as DocumentEditorEditor, i as ProcessorModuleEditor, n as VetraDriveApp, o as AppEditor, r as SubgraphModuleEditor, t as VetraPackageEditor } from "../module-BTlKlxoV.js";
|
|
2
2
|
export { AppEditor, DocumentEditorEditor, ProcessorModuleEditor, SubgraphModuleEditor, VetraDriveApp, VetraPackageEditor };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as logger } from "./logger-
|
|
1
|
+
import { t as logger } from "./logger-CYkStoEb.js";
|
|
2
2
|
//#region processors/vetra-read-model/migrations.ts
|
|
3
3
|
async function up(db) {
|
|
4
4
|
await db.schema.createTable("vetra_package").addColumn("document_id", "varchar(255)", (col) => col.primaryKey()).addColumn("name", "varchar(255)").addColumn("description", "text").addColumn("category", "varchar(255)").addColumn("author_name", "varchar(255)").addColumn("author_website", "varchar(512)").addColumn("keywords", "text").addColumn("github_url", "varchar(512)").addColumn("npm_url", "varchar(512)").addColumn("drive_id", "varchar(255)").addColumn("last_operation_index", "integer", (col) => col.notNull()).addColumn("last_operation_hash", "varchar(255)", (col) => col.notNull()).addColumn("last_operation_timestamp", "timestamptz", (col) => col.notNull()).addColumn("created_at", "timestamptz", (col) => col.notNull().defaultTo("now()")).addColumn("updated_at", "timestamptz", (col) => col.notNull().defaultTo("now()")).ifNotExists().execute();
|
|
@@ -76,4 +76,4 @@ const vetraReadModelFactoryBuilder = (module) => {
|
|
|
76
76
|
//#endregion
|
|
77
77
|
export { VetraReadModelProcessor as n, vetraReadModelFactoryBuilder as t };
|
|
78
78
|
|
|
79
|
-
//# sourceMappingURL=factory-
|
|
79
|
+
//# sourceMappingURL=factory-4o53XqHE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory-
|
|
1
|
+
{"version":3,"file":"factory-4o53XqHE.js","names":[],"sources":["../processors/vetra-read-model/migrations.ts","../processors/vetra-read-model/processor.ts","../processors/vetra-read-model/factory.ts"],"sourcesContent":["import type { IRelationalDb } from \"@powerhousedao/shared/processors\";\n\nexport async function up(db: IRelationalDb<any>): Promise<void> {\n // Create vetra_package table to store VetraPackage document state\n await db.schema\n .createTable(\"vetra_package\")\n .addColumn(\"document_id\", \"varchar(255)\", (col) => col.primaryKey()) // VetraPackage state fields\n .addColumn(\"name\", \"varchar(255)\")\n .addColumn(\"description\", \"text\")\n .addColumn(\"category\", \"varchar(255)\")\n .addColumn(\"author_name\", \"varchar(255)\")\n .addColumn(\"author_website\", \"varchar(512)\")\n .addColumn(\"keywords\", \"text\") // JSON array of {id, label}\n .addColumn(\"github_url\", \"varchar(512)\")\n .addColumn(\"npm_url\", \"varchar(512)\")\n .addColumn(\"drive_id\", \"varchar(255)\")\n // Document metadata\n .addColumn(\"last_operation_index\", \"integer\", (col) => col.notNull())\n .addColumn(\"last_operation_hash\", \"varchar(255)\", (col) => col.notNull())\n .addColumn(\"last_operation_timestamp\", \"timestamptz\", (col) =>\n col.notNull(),\n )\n .addColumn(\"created_at\", \"timestamptz\", (col) =>\n col.notNull().defaultTo(\"now()\"),\n )\n .addColumn(\"updated_at\", \"timestamptz\", (col) =>\n col.notNull().defaultTo(\"now()\"),\n )\n .ifNotExists()\n .execute();\n\n // Create indexes for common queries\n await db.schema\n .createIndex(\"idx_vetra_package_document_id\")\n .on(\"vetra_package\")\n .column(\"document_id\")\n .ifNotExists()\n .execute();\n\n await db.schema\n .createIndex(\"idx_vetra_package_name\")\n .on(\"vetra_package\")\n .column(\"name\")\n .ifNotExists()\n .execute();\n\n await db.schema\n .createIndex(\"idx_vetra_package_category\")\n .on(\"vetra_package\")\n .column(\"category\")\n .ifNotExists()\n .execute();\n}\n\nexport async function down(db: IRelationalDb<any>): Promise<void> {\n // Drop indexes first\n await db.schema.dropIndex(\"idx_vetra_package_category\").ifExists().execute();\n await db.schema.dropIndex(\"idx_vetra_package_name\").ifExists().execute();\n await db.schema\n .dropIndex(\"idx_vetra_package_document_id\")\n .ifExists()\n .execute();\n\n // Drop table\n await db.schema.dropTable(\"vetra_package\").ifExists().execute();\n}\n","import type {\n IProcessor,\n OperationWithContext,\n} from \"@powerhousedao/reactor-browser\";\nimport type { Kysely } from \"kysely\";\nimport type { VetraPackageState } from \"../../document-models/vetra-package/v1/gen/schema/types.js\";\nimport { logger } from \"../codegen/logger.js\";\nimport { type DB } from \"./schema.js\";\n\ninterface VetraPackageGlobalState extends VetraPackageState {}\n\nexport class VetraReadModelProcessor implements IProcessor {\n private relationalDb: Kysely<DB>;\n\n constructor(relationalDb: Kysely<DB>) {\n this.relationalDb = relationalDb;\n }\n\n async onOperations(operations: OperationWithContext[]): Promise<void> {\n logger.info(\">>> VetraReadModelProcessor.onOperations()\");\n if (operations.length === 0) return;\n\n for (const { operation, context } of operations) {\n if (context.documentType !== \"powerhouse/package\") continue;\n\n const state = context.resultingState\n ? (JSON.parse(context.resultingState) as VetraPackageGlobalState)\n : undefined;\n\n const getString = (val: unknown): string | null =>\n typeof val === \"string\" ? val : null;\n\n const now = new Date();\n const operationTimestamp = new Date(\n parseInt(operation.timestampUtcMs, 10),\n );\n\n await this.relationalDb\n .insertInto(\"vetra_package\")\n .values({\n document_id: context.documentId,\n name: getString(state?.name),\n description: getString(state?.description),\n category: getString(state?.category),\n author_name: getString(state?.author?.name),\n author_website: getString(state?.author?.website),\n keywords: state?.keywords ? JSON.stringify(state.keywords) : null,\n github_url: getString(state?.githubUrl),\n npm_url: getString(state?.npmUrl),\n last_operation_index: operation.index,\n last_operation_hash: operation.hash,\n last_operation_timestamp: operationTimestamp,\n drive_id: \"\", // Not available in new format\n created_at: now,\n updated_at: now,\n })\n .onConflict((oc) =>\n oc.column(\"document_id\").doUpdateSet({\n name: getString(state?.name),\n description: getString(state?.description),\n category: getString(state?.category),\n author_name: getString(state?.author?.name),\n author_website: getString(state?.author?.website),\n keywords: state?.keywords ? JSON.stringify(state.keywords) : null,\n github_url: getString(state?.githubUrl),\n npm_url: getString(state?.npmUrl),\n last_operation_index: operation.index,\n last_operation_hash: operation.hash,\n last_operation_timestamp: operationTimestamp,\n updated_at: now,\n }),\n )\n .execute();\n }\n }\n\n async onDisconnect() {}\n}\n","import type {\n IProcessorHostModule,\n ProcessorFactoryBuilder,\n ProcessorRecord,\n} from \"@powerhousedao/reactor-browser\";\nimport type { PHDocumentHeader } from \"@powerhousedao/shared/document-model\";\nimport { up } from \"./migrations.js\";\nimport { VetraReadModelProcessor } from \"./processor.js\";\nimport type { DB } from \"./schema.js\";\n\nexport const vetraReadModelFactoryBuilder: ProcessorFactoryBuilder = (\n module: IProcessorHostModule,\n) => {\n return async (_driveHeader: PHDocumentHeader): Promise<ProcessorRecord[]> => {\n // Create namespace (same as legacy - all vetra packages share one namespace)\n const db = await module.relationalDb.createNamespace<DB>(\"vetra-packages\");\n\n // Run migrations (idempotent - uses ifNotExists)\n await up(db);\n\n // Create the processor with the relational database\n const processor = new VetraReadModelProcessor(db);\n return [\n {\n processor,\n filter: {\n branch: [\"main\"],\n documentId: [\"*\"],\n documentType: [\"powerhouse/package\"],\n scope: [\"global\"],\n },\n },\n ];\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as logger } from "./logger-
|
|
1
|
+
import { t as logger } from "./logger-CYkStoEb.js";
|
|
2
2
|
import { PROCESSOR_APPS } from "@powerhousedao/shared/processors";
|
|
3
3
|
import { buildTsMorphProject } from "@powerhousedao/codegen/utils";
|
|
4
4
|
import { generateApp, generateDocumentModel, generateEditor, generateProcessor, generateSubgraph, validateDocumentModelState } from "@powerhousedao/codegen";
|
|
@@ -928,4 +928,4 @@ const codegenFactoryBuilder = (module) => {
|
|
|
928
928
|
//#endregion
|
|
929
929
|
export { CodegenProcessor as n, codegenFactoryBuilder as t };
|
|
930
930
|
|
|
931
|
-
//# sourceMappingURL=factory-
|
|
931
|
+
//# sourceMappingURL=factory-Dexxeo5C.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory-DYahTvFP.js","names":[],"sources":["../processors/codegen/document-handlers/base-document-gen.ts","../processors/codegen/interactive-manager.ts","../processors/codegen/document-handlers/document-codegen-manager.ts","../processors/codegen/document-handlers/generators/utils.ts","../processors/codegen/document-handlers/generators/app-generator.ts","../processors/codegen/document-handlers/generators/document-editor-generator.ts","../processors/codegen/document-handlers/generators/document-model-generator.ts","../processors/codegen/document-handlers/generators/package-generator.ts","../processors/codegen/document-handlers/generators/processor-generator.ts","../processors/codegen/document-handlers/generators/subgraph-generator.ts","../processors/codegen/document-handlers/document-codegen-factory.ts","../processors/codegen/processor.ts","../processors/codegen/factory.ts"],"sourcesContent":["import type { Project } from \"ts-morph\";\nimport type { CodegenInput, Config } from \"./types.js\";\n/**\n * Abstract base class for document generators\n * Defines the interface that all document-type handlers must implement\n */\nexport abstract class BaseDocumentGen {\n /**\n * The document type(s) this generator supports\n * Can be a single string or an array of strings for generators that handle multiple types\n */\n abstract readonly supportedDocumentTypes: string | string[];\n project: Project;\n\n constructor(\n protected config: Config,\n project: Project,\n ) {\n this.project = project;\n }\n\n /**\n * Generate code for the given document\n * Must be implemented by each specific document generator\n */\n abstract generate(strand: CodegenInput): Promise<void>;\n\n /**\n * Check if this generator supports the given document type\n */\n supportsDocumentType(documentType: string): boolean {\n if (typeof this.supportedDocumentTypes === \"string\") {\n return this.supportedDocumentTypes === documentType;\n }\n return this.supportedDocumentTypes.includes(documentType);\n }\n\n /**\n * Get all supported document types as an array\n */\n getSupportedDocumentTypes(): string[] {\n if (typeof this.supportedDocumentTypes === \"string\") {\n return [this.supportedDocumentTypes];\n }\n return [...this.supportedDocumentTypes];\n }\n\n /**\n * Validate if this strand should be processed\n * Override this method in specific generators to add custom validation logic\n */\n shouldProcess(strand: CodegenInput): boolean {\n // Basic validation: ensure strand has required properties\n if (!strand.documentId || !strand.documentType) {\n return false;\n }\n\n // Basic validation: check if document type is supported\n if (!this.supportsDocumentType(strand.documentType)) {\n return false;\n }\n\n // Default to processing if basic validation passes\n return true;\n }\n}\n","import { createInterface } from \"node:readline\";\nimport type { CodegenInput } from \"./document-handlers/types.js\";\nimport { logger } from \"./logger.js\";\n\nexport interface QueuedStrand {\n strand: CodegenInput;\n timestamp: number;\n}\n\n/**\n * InteractiveManager handles user interaction for code generation confirmation\n * Supports both individual strand processing and queue-based batch processing\n */\nexport class InteractiveManager {\n private isInteractiveMode: boolean;\n private processingConfirmation = false;\n private strandQueue = new Map<string, QueuedStrand>();\n\n constructor(interactiveMode = false) {\n this.isInteractiveMode = interactiveMode;\n }\n\n private getDocumentKey(documentType: string, documentId: string): string {\n return `${documentType}:${documentId}`;\n }\n\n /**\n * Add a strand to the queue, replacing any existing strand for the same document\n */\n public queueStrand(strand: CodegenInput): void {\n const documentKey = this.getDocumentKey(\n strand.documentType,\n strand.documentId,\n );\n\n this.strandQueue.set(documentKey, {\n strand,\n timestamp: Date.now(),\n });\n\n logger.debug(\n `>>> Queued strand for ${documentKey}, queue size: ${this.strandQueue.size}`,\n );\n }\n\n /**\n * Get all queued strands\n */\n public getQueuedStrands(): QueuedStrand[] {\n return Array.from(this.strandQueue.values());\n }\n\n /**\n * Clear and return all queued strands\n */\n public clearQueue(): QueuedStrand[] {\n const queuedStrands = Array.from(this.strandQueue.values());\n this.strandQueue.clear();\n return queuedStrands;\n }\n\n /**\n * Get the current queue size\n */\n public getQueueSize(): number {\n return this.strandQueue.size;\n }\n\n private async promptUserConfirmation(): Promise<boolean> {\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n console.log(\"\\n\" + \"=\".repeat(50));\n console.log(\"🔄 Code generation ready to run.\");\n console.log(\"=\".repeat(50));\n\n process.stdout.write(\n \"Do you want to proceed with code generation? (y/n): \\n\\n\",\n );\n\n rl.on(\"line\", (answer: string) => {\n rl.close();\n console.log(\"\"); // Add blank line after user input\n resolve(answer.toLowerCase() === \"y\" || answer.toLowerCase() === \"yes\");\n });\n });\n }\n\n /**\n * Process generation with user confirmation (legacy single-strand method)\n * This method assumes interactive mode is already enabled (checked by caller)\n */\n public async processWithConfirmation<T>(\n documentType: string,\n generator: () => Promise<T>,\n ): Promise<T | null> {\n if (this.processingConfirmation) {\n logger.debug(\"Already processing confirmation, skipping\");\n return null;\n }\n\n this.processingConfirmation = true;\n\n try {\n // Always prompt user since this method only called in interactive mode\n const shouldProceed = await this.promptUserConfirmation();\n\n if (!shouldProceed) {\n logger.info(`❌ Code generation cancelled by user for ${documentType}`);\n return null;\n }\n\n logger.info(`✅ User approved code generation for ${documentType}`);\n\n const result = await generator();\n return result;\n } catch (error) {\n logger.error(\n `❌ Error during interactive code generation for ${documentType}:`,\n error,\n );\n throw error;\n } finally {\n this.processingConfirmation = false;\n }\n }\n\n /**\n * Process all queued strands with a single user confirmation\n * This is the main method for queue-based interactive processing\n */\n public async processQueueWithConfirmation(\n processor: (strands: QueuedStrand[]) => Promise<void>,\n ): Promise<void> {\n if (this.processingConfirmation) {\n logger.debug(\n \"Already processing confirmation, skipping queue processing\",\n );\n return;\n }\n\n // Check if there are any strands to process\n let queuedStrands = this.getQueuedStrands();\n if (queuedStrands.length === 0) {\n logger.debug(\"No strands in queue to process\");\n return;\n }\n\n this.processingConfirmation = true;\n\n try {\n // Prompt user for confirmation\n const shouldProceed = await this.promptUserConfirmation();\n\n if (!shouldProceed) {\n logger.info(\"❌ Code generation cancelled by user\");\n // Clear the queue since user cancelled\n this.clearQueue();\n return;\n }\n\n // Get and clear the final queue state right before processing\n // (in case new strands were added while waiting for user input)\n queuedStrands = this.clearQueue();\n if (queuedStrands.length === 0) {\n logger.info(\"ℹ️ No documents to process\");\n return;\n }\n\n logger.info(\n `✅ User approved code generation for ${queuedStrands.length} document(s)`,\n );\n\n // Process all queued strands\n await processor(queuedStrands);\n logger.info(\"✅ Code generation completed\");\n } catch (error) {\n logger.error(\n \"❌ Error during interactive queue processing: @error\",\n error,\n );\n throw error;\n } finally {\n this.processingConfirmation = false;\n }\n }\n\n public setInteractiveMode(enabled: boolean): void {\n this.isInteractiveMode = enabled;\n logger.debug(`Interactive mode set to: ${enabled}`);\n }\n\n public isInteractive(): boolean {\n return this.isInteractiveMode;\n }\n\n public isProcessing(): boolean {\n return this.processingConfirmation;\n }\n}\n","import type { Project } from \"ts-morph\";\nimport type { QueuedStrand } from \"../interactive-manager.js\";\nimport { InteractiveManager } from \"../interactive-manager.js\";\nimport { logger } from \"../logger.js\";\nimport type { BaseDocumentGen } from \"./base-document-gen.js\";\nimport type { CodegenInput, Config } from \"./types.js\";\n\nconst DEFAULT_DEBOUNCE_TIME = 1000; // wait 1 second between codegen calls\n\n/**\n * Manager class responsible for routing documents to the correct generator\n * and managing generator registration and instantiation\n */\nexport class DocumentCodegenManager {\n project: Project;\n private generators = new Map<string, BaseDocumentGen>();\n private debounceTimers = new Map<string, NodeJS.Timeout>();\n private processingQueue: Promise<void> = Promise.resolve();\n private interactiveManager: InteractiveManager;\n\n constructor(\n private config: Config,\n project: Project,\n interactiveMode = false,\n ) {\n this.project = project;\n this.interactiveManager = new InteractiveManager(interactiveMode);\n }\n\n /**\n * Register a generator class for a specific document type\n */\n registerGenerator(\n documentType: string,\n generatorClass: new (config: Config, project: Project) => BaseDocumentGen,\n ): void {\n if (this.generators.has(documentType)) {\n logger.warn(\n `⚠️ Generator for document type \"${documentType}\" is already registered. Overwriting.`,\n );\n }\n\n this.generators.set(\n documentType,\n new generatorClass(this.config, this.project),\n );\n logger.debug(`✅ Registered generator for document type: ${documentType}`);\n }\n\n /**\n * Register a generator class that supports multiple document types\n */\n registerMultiTypeGenerator(\n generatorClass: new (config: Config, project: Project) => BaseDocumentGen,\n ): void {\n const generator = new generatorClass(this.config, this.project);\n const supportedTypes = generator.getSupportedDocumentTypes();\n\n for (const documentType of supportedTypes) {\n if (this.generators.has(documentType)) {\n logger.warn(\n `⚠️ Generator for document type \"${documentType}\" is already registered. Overwriting.`,\n );\n }\n this.generators.set(documentType, generator);\n }\n\n logger.debug(\n `✅ Registered multi-type generator for document types: ${supportedTypes.join(\", \")}`,\n );\n }\n\n /**\n * Get a generator instance for the given document type\n * Public method to allow external access for validation\n */\n public getGenerator(documentType: string): BaseDocumentGen | undefined {\n return this.generators.get(documentType);\n }\n\n /**\n * Get all registered document types\n */\n getRegisteredDocumentTypes(): string[] {\n return Array.from(this.generators.keys());\n }\n\n /**\n * Check if a document type is supported\n */\n isDocumentTypeSupported(documentType: string): boolean {\n return this.generators.has(documentType);\n }\n\n /**\n * Route a document to the appropriate generator and handle the generation\n * Handles both interactive and non-interactive modes with queue-based processing\n */\n routeAndGenerate(strand: CodegenInput): Promise<void> {\n const documentType = strand.documentType;\n\n if (!documentType) {\n logger.error(\"❌ Document type is missing from strand state\");\n throw new Error(\"Document type is missing from strand state\");\n }\n\n const generator = this.getGenerator(documentType);\n\n if (!generator) {\n logger.warn(`⚠️ No generator found for document type: ${documentType}`);\n logger.warn(\n `ℹ️ Supported document types: ${this.getRegisteredDocumentTypes().join(\", \")}`,\n );\n throw new Error(`Unsupported document type: ${documentType}`);\n }\n\n // Validate if this strand should be processed\n if (!generator.shouldProcess(strand)) {\n logger.debug(\n `>>> Generator validation failed for ${documentType}:${strand.documentId}, skipping processing`,\n );\n return Promise.resolve();\n }\n\n // Different flow for interactive vs non-interactive mode\n if (this.interactiveManager.isInteractive()) {\n // Interactive mode: queue strands and use debounce timer to trigger batch processing\n logger.debug(\n `>>> Queueing strand for interactive processing: ${documentType}:${strand.documentId}`,\n );\n\n // Add strand to queue (will replace any existing strand for same document)\n this.interactiveManager.queueStrand(strand);\n\n // Clear any existing debounce timer for interactive processing\n const existingTimer = this.debounceTimers.get(\"interactive\");\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n // Set up debounce timer for batch interactive processing\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n const debounceTimer = setTimeout(async () => {\n try {\n await this.interactiveManager.processQueueWithConfirmation(\n async (queuedStrands: QueuedStrand[]) => {\n await this.processQueuedStrands(queuedStrands);\n },\n );\n } catch (error) {\n logger.error(\n \"❌ Error during interactive batch processing: @error\",\n error,\n );\n } finally {\n // Clean up the timer reference\n this.debounceTimers.delete(\"interactive\");\n }\n }, DEFAULT_DEBOUNCE_TIME);\n\n // Store the timer reference using 'interactive' key\n this.debounceTimers.set(\"interactive\", debounceTimer);\n } else {\n // Non-interactive mode: use debouncing per document instance\n // Create unique key for this specific document instance\n const timerKey = `${documentType}:${strand.documentId}`;\n\n // Clear any existing debounce timer for this document instance\n const existingTimer = this.debounceTimers.get(timerKey);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n // Set up new debounced generation (no interactive confirmation)\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n const debounceTimer = setTimeout(async () => {\n try {\n logger.debug(\n `🔄 Routing document type \"${documentType}\" to generator (debounced)`,\n );\n\n // Direct generation, no interactive confirmation\n await generator.generate(strand);\n logger.debug(\n `✅ Successfully generated code for document type: ${documentType}`,\n );\n } catch (error) {\n logger.error(\n `❌ Error generating code for document type \"${documentType}\":`,\n error,\n );\n // Don't throw - let codegen continue with other documents\n } finally {\n // Clean up the timer reference\n this.debounceTimers.delete(timerKey);\n }\n }, DEFAULT_DEBOUNCE_TIME);\n\n // Store the timer reference\n this.debounceTimers.set(timerKey, debounceTimer);\n }\n return Promise.resolve();\n }\n\n /**\n * Process multiple strands in priority order (document-model types first)\n */\n private async processQueuedStrands(\n queuedStrands: QueuedStrand[],\n ): Promise<void> {\n logger.debug(`🔄 Processing ${queuedStrands.length} queued strand(s)`);\n\n // Sort by priority (document-model first to ensure dependencies exist)\n const documentModelStrands = queuedStrands.filter(\n (qs: QueuedStrand) =>\n qs.strand.documentType === \"powerhouse/document-model\",\n );\n const otherStrands = queuedStrands.filter(\n (qs: QueuedStrand) =>\n qs.strand.documentType !== \"powerhouse/document-model\",\n );\n\n // Process document models first\n for (const queuedStrand of documentModelStrands) {\n await this.processStrand(queuedStrand.strand);\n }\n\n // Then process other document types\n for (const queuedStrand of otherStrands) {\n await this.processStrand(queuedStrand.strand);\n }\n\n logger.debug(\n `✅ Successfully processed all ${queuedStrands.length} queued strand(s)`,\n );\n }\n\n /**\n * Process a single strand (used internally by processQueuedStrands)\n */\n private async processStrand(strand: CodegenInput): Promise<void> {\n const documentType = strand.documentType;\n const generator = this.getGenerator(documentType);\n\n if (!generator) {\n logger.warn(`⚠️ No generator found for document type: ${documentType}`);\n return;\n }\n\n try {\n logger.debug(`🔄 Generating code for document type: ${documentType}`);\n await generator.generate(strand);\n logger.debug(\n `✅ Successfully generated code for document type: ${documentType}`,\n );\n } catch (error) {\n logger.error(\n `❌ Error generating code for document type \"${documentType}\":`,\n error,\n );\n // Don't throw here to allow other strands to be processed\n }\n }\n\n /**\n * Clear all registered generators\n */\n clearGenerators(): void {\n this.generators.clear();\n logger.debug(\"🧹 Cleared all registered generators\");\n }\n\n /**\n * Get statistics about registered generators\n */\n getStats(): { totalGenerators: number; supportedTypes: string[] } {\n return {\n totalGenerators: this.generators.size,\n supportedTypes: this.getRegisteredDocumentTypes(),\n };\n }\n\n /**\n * Set interactive mode for code generation\n */\n setInteractiveMode(enabled: boolean): void {\n this.interactiveManager.setInteractiveMode(enabled);\n }\n\n /**\n * Check if interactive mode is enabled\n */\n isInteractiveMode(): boolean {\n return this.interactiveManager.isInteractive();\n }\n\n /**\n * Check if the manager is currently processing an interactive confirmation\n */\n isProcessingInteractive(): boolean {\n return this.interactiveManager.isProcessing();\n }\n}\n","import type {\n MinimalBackupData,\n PHDocument,\n} from \"@powerhousedao/shared/document-model\";\nimport { baseMinimalSaveToFile, baseSaveToFile } from \"document-model/node\";\nimport { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { logger } from \"../../logger.js\";\n\nconst BACKUP_FOLDER = \"backup-documents\";\n\n/**\n * Exports a document to the backup directory.\n * Creates the backup directory if it doesn't exist.\n *\n * @param document - The document to backup\n * @param workingDir - Current working directory\n * @param extension - File extension for the document type (without dot)\n * @param name - Name of the document to use for the backup file (optional)\n * @returns Promise resolving to the backup file path, or undefined if backup failed\n */\nexport async function backupDocument(\n document: PHDocument,\n workingDir: string,\n extension: string = \"\",\n name?: string,\n): Promise<string | undefined> {\n const docName = name ?? document.header.name;\n\n try {\n const backupPath = join(workingDir, BACKUP_FOLDER);\n await mkdir(backupPath, { recursive: true });\n\n const filePath = await baseSaveToFile(\n document,\n backupPath,\n extension,\n docName,\n );\n\n logger.debug(`📁 Document backed up to: ${filePath}`);\n return filePath;\n } catch (error) {\n logger.warn(`⚠️ Failed to backup document \"${docName}\":`, error);\n return undefined;\n }\n}\n\n/**\n * Creates a minimal backup of a document from strand data.\n * Used when the full document is not available (e.g., in onOperations handler).\n */\nexport async function minimalBackupDocument(\n data: MinimalBackupData,\n workingDir: string,\n extension?: string,\n): Promise<string | undefined> {\n try {\n const backupPath = join(workingDir, BACKUP_FOLDER);\n await mkdir(backupPath, { recursive: true });\n\n const filePath = await baseMinimalSaveToFile(\n data,\n backupPath,\n extension ?? \"\",\n );\n\n logger.debug(`Document backed up to: ${filePath}`);\n return filePath;\n } catch (error) {\n logger.warn(`Failed to backup document \"${data.name}\":`, error);\n return undefined;\n }\n}\n","import { generateApp } from \"@powerhousedao/codegen\";\nimport type {\n AppModuleGlobalState,\n AppModulePHState,\n} from \"@powerhousedao/vetra/document-models/app-module\";\nimport { kebabCase } from \"change-case\";\nimport { logger } from \"../../logger.js\";\nimport { BaseDocumentGen } from \"../base-document-gen.js\";\nimport type { CodegenInput } from \"../types.js\";\nimport { minimalBackupDocument } from \"./utils.js\";\n\n/**\n * Generator for app documents\n */\nexport class AppGenerator extends BaseDocumentGen {\n readonly supportedDocumentTypes = \"powerhouse/app\";\n\n /**\n * Parse and extract the global state from the serialized state string\n */\n private extractGlobalState(\n input: CodegenInput,\n ): AppModuleGlobalState | undefined {\n if (!input.state) {\n return undefined;\n }\n const fullState = input.state as AppModulePHState;\n return fullState.global;\n }\n\n /**\n * Validate if this app strand should be processed\n */\n shouldProcess(input: CodegenInput): boolean {\n // First run base validation\n if (!super.shouldProcess(input)) {\n return false;\n }\n\n const state = this.extractGlobalState(input);\n if (!state) {\n logger.debug(`No state found for app: ${input.documentId}`);\n return false;\n }\n\n // Check if we have a valid app name and it's confirmed\n if (!state.name) {\n logger.debug(`No name found for app: ${input.documentId}`);\n return false;\n }\n\n if (state.status !== \"CONFIRMED\") {\n logger.debug(\n `App not confirmed: ${state.name} (status: ${state.status})`,\n );\n return false;\n }\n\n return true;\n }\n\n async generate(input: CodegenInput): Promise<void> {\n const state = this.extractGlobalState(input);\n if (!state) {\n logger.error(`No state found for app: ${input.documentId}`);\n return;\n }\n\n // Check if we have a valid app name and it's confirmed\n if (state.name && state.status === \"CONFIRMED\") {\n logger.info(`🔄 Starting app generation for app: ${state.name}`);\n try {\n // Generate app ID using kebabCase\n const appId: string = kebabCase(state.name);\n // Generate the app using the codegen function\n await generateApp(\n {\n ...this.config.PH_CONFIG,\n appName: state.name,\n appId: appId,\n allowedDocumentTypes: state.allowedDocumentTypes ?? [],\n isDragAndDropEnabled: state.isDragAndDropEnabled,\n },\n this.project,\n );\n await this.project.save();\n\n logger.info(\n `✅ App generation completed successfully for app: ${state.name}`,\n );\n\n // Backup the document\n const fullState = input.state as AppModulePHState;\n await minimalBackupDocument(\n {\n documentId: input.documentId,\n documentType: input.documentType,\n branch: input.branch,\n state: fullState,\n name: state.name,\n },\n this.config.CURRENT_WORKING_DIR,\n );\n } catch (error) {\n logger.error(\n `❌ Error during app generation for app ${state.name}:`,\n error,\n );\n if (error instanceof Error) {\n logger.error(`❌ Error message: ${error.message}`);\n }\n }\n } else {\n if (!state.name) {\n logger.error(`❌ Skipping app generation - missing name for app`);\n return;\n } else if (state.status !== \"CONFIRMED\") {\n logger.error(\n `❌ Skipping app generation - app \"${state.name}\" is not confirmed (status: ${state.status})`,\n );\n return;\n }\n }\n }\n}\n","import { generateEditor } from \"@powerhousedao/codegen\";\nimport { kebabCase } from \"change-case\";\nimport type {\n DocumentEditorPHState,\n DocumentEditorState,\n} from \"../../../../document-models/document-editor/index.js\";\nimport { logger } from \"../../logger.js\";\nimport { BaseDocumentGen } from \"../base-document-gen.js\";\nimport type { CodegenInput } from \"../types.js\";\nimport { minimalBackupDocument } from \"./utils.js\";\n\n/**\n * Generator for document editor documents\n */\nexport class DocumentEditorGenerator extends BaseDocumentGen {\n readonly supportedDocumentTypes = \"powerhouse/document-editor\";\n\n /**\n * Parse and extract the global state from the serialized state string\n */\n private extractGlobalState(\n input: CodegenInput,\n ): DocumentEditorState | undefined {\n if (!input.state) {\n return undefined;\n }\n const fullState = input.state as DocumentEditorPHState;\n return fullState.global;\n }\n\n /**\n * Validate if this document editor strand should be processed\n */\n shouldProcess(input: CodegenInput): boolean {\n // First run base validation\n if (!super.shouldProcess(input)) {\n return false;\n }\n\n const state = this.extractGlobalState(input);\n if (!state) {\n logger.debug(`No state found for document editor: ${input.documentId}`);\n return false;\n }\n\n // Check if we have a valid editor name, document types, and it's confirmed\n if (!state.name) {\n logger.debug(`No name found for document editor: ${input.documentId}`);\n return false;\n }\n\n if (!state.documentTypes || state.documentTypes.length === 0) {\n logger.debug(\n `No document types found for document editor: ${state.name}`,\n );\n return false;\n }\n\n if (state.status !== \"CONFIRMED\") {\n logger.debug(\n `Document editor not confirmed: ${state.name} (status: ${state.status})`,\n );\n return false;\n }\n\n return true;\n }\n\n async generate(input: CodegenInput): Promise<void> {\n const state = this.extractGlobalState(input);\n if (!state) {\n logger.error(`No state found for document editor: ${input.documentId}`);\n return;\n }\n\n // Validation is already done in shouldProcess, so we can proceed directly\n logger.info(`🔄 Starting editor generation for: ${state.name}`);\n try {\n // Extract document types from the state\n const documentTypes = state.documentTypes.map((dt) => dt.documentType);\n\n // Generate editor ID using kebabCase\n const editorId: string = kebabCase(state.name);\n\n // Generate the editor using the codegen function\n await generateEditor(\n {\n ...this.config.PH_CONFIG,\n editorName: state.name,\n documentTypes: documentTypes,\n editorId: editorId,\n },\n this.project,\n );\n await this.project.save();\n\n logger.info(\n `✅ Editor generation completed successfully for: ${state.name}`,\n );\n\n // Backup the document\n const fullState = input.state as DocumentEditorPHState;\n await minimalBackupDocument(\n {\n documentId: input.documentId,\n documentType: input.documentType,\n branch: input.branch,\n state: fullState,\n name: state.name,\n },\n this.config.CURRENT_WORKING_DIR,\n );\n } catch (error) {\n logger.error(\n `❌ Error during editor generation for ${state.name}:`,\n error,\n );\n if (error instanceof Error) {\n logger.error(`❌ Error message: ${error.message}`);\n }\n // Don't throw - let codegen continue with other documents\n return;\n }\n }\n}\n","import {\n generateDocumentModel,\n validateDocumentModelState,\n} from \"@powerhousedao/codegen\";\nimport type {\n DocumentModelGlobalState,\n DocumentModelPHState,\n} from \"@powerhousedao/shared/document-model\";\nimport { logger } from \"../../logger.js\";\nimport { BaseDocumentGen } from \"../base-document-gen.js\";\nimport type { CodegenInput } from \"../types.js\";\nimport { minimalBackupDocument } from \"./utils.js\";\n\n/**\n * Generator for document model documents\n */\nexport class DocumentModelGenerator extends BaseDocumentGen {\n readonly supportedDocumentTypes = \"powerhouse/document-model\";\n\n /**\n * Parse and extract the global state from the serialized state string\n */\n private extractGlobalState(\n input: CodegenInput,\n ): DocumentModelGlobalState | undefined {\n if (!input.state) {\n return undefined;\n }\n const fullState = input.state as DocumentModelPHState;\n return fullState.global;\n }\n\n /**\n * Validate if this document model strand should be processed\n */\n shouldProcess(input: CodegenInput): boolean {\n // First run base validation\n if (!super.shouldProcess(input)) {\n return false;\n }\n\n // Extract the global state from the full document state\n const globalState = this.extractGlobalState(input);\n if (!globalState) {\n logger.debug(\n `>>> No global state found for document model: ${input.documentId}`,\n );\n return false;\n }\n\n const validationResult = validateDocumentModelState(globalState);\n if (!validationResult.isValid) {\n const errorList = validationResult.errors\n .map((error) => ` - ${error}`)\n .join(\"\\n\");\n logger.info(\n `⚠️ Skipped code generation for '${globalState.name || input.documentId}' due to validation errors:\\n${errorList}`,\n );\n return false;\n }\n\n logger.info(\n `Document model ${globalState.name} is valid, proceeding with code generation`,\n );\n\n return true;\n }\n\n async generate(input: CodegenInput): Promise<void> {\n const globalState = this.extractGlobalState(input);\n if (!globalState) {\n logger.error(\n `❌ No global state found for document model: ${input.documentId}`,\n );\n return;\n }\n // Validation is already done in shouldProcess, so we can proceed directly\n logger.debug(\n `🔄 Starting code generation for document model: ${globalState.name}`,\n );\n try {\n await generateDocumentModel(globalState, this.project);\n await this.project.save();\n logger.info(\n `✅ Code generation completed successfully for: ${globalState.name}`,\n );\n\n // Backup the document\n const fullState = input.state as DocumentModelPHState;\n const extension = globalState.extension?.replace(/^\\.+|\\.+$/g, \"\") || \"\";\n await minimalBackupDocument(\n {\n documentId: input.documentId,\n documentType: input.documentType,\n branch: input.branch,\n state: fullState,\n name: globalState.name,\n },\n this.config.CURRENT_WORKING_DIR,\n extension,\n );\n } catch (error) {\n logger.error(\n `❌ Error during code generation for ${globalState.name}:`,\n error,\n );\n // Don't throw - let codegen continue with other documents\n return;\n }\n }\n}\n","import { createOrUpdateManifest } from \"@powerhousedao/codegen/file-builders\";\nimport type {\n VetraPackageGlobalState,\n VetraPackagePHState,\n} from \"../../../../document-models/vetra-package/index.js\";\nimport { logger } from \"../../logger.js\";\nimport { BaseDocumentGen } from \"../base-document-gen.js\";\nimport type { CodegenInput } from \"../types.js\";\nimport { minimalBackupDocument } from \"./utils.js\";\n\n/**\n * Generator for package documents\n */\nexport class PackageGenerator extends BaseDocumentGen {\n readonly supportedDocumentTypes = \"powerhouse/package\";\n\n /**\n * Validate if this package strand should be processed\n */\n shouldProcess(input: CodegenInput): boolean {\n // First run base validation\n if (!super.shouldProcess(input)) {\n return false;\n }\n\n if (!input.state) {\n logger.debug(`>>> No state found for package: ${input.documentId}`);\n return false;\n }\n\n return true;\n }\n\n async generate(input: CodegenInput): Promise<void> {\n const fullState = input.state as VetraPackagePHState;\n const state = fullState.global as VetraPackageGlobalState;\n\n await createOrUpdateManifest(\n {\n name: state.name ?? \"\",\n category: state.category ?? \"\",\n description: state.description ?? \"\",\n publisher: {\n name: state.author?.name ?? \"\",\n url: state.author?.website ?? \"\",\n },\n },\n this.config.CURRENT_WORKING_DIR,\n );\n\n // Backup the document\n await minimalBackupDocument(\n {\n documentId: input.documentId,\n documentType: input.documentType,\n branch: input.branch,\n state: fullState,\n name: \"vetra-package\",\n },\n this.config.CURRENT_WORKING_DIR,\n );\n }\n}\n","import { generateProcessor } from \"@powerhousedao/codegen\";\nimport {\n PROCESSOR_APPS,\n type ProcessorApp,\n type ProcessorApps,\n} from \"@powerhousedao/shared/processors\";\nimport type {\n ProcessorModulePHState,\n ProcessorModuleState,\n} from \"../../../../document-models/processor-module/index.js\";\nimport { logger } from \"../../logger.js\";\nimport { BaseDocumentGen } from \"../base-document-gen.js\";\nimport type { CodegenInput } from \"../types.js\";\nimport { minimalBackupDocument } from \"./utils.js\";\n\n/**\n * Generator for processor documents\n */\nexport class ProcessorGenerator extends BaseDocumentGen {\n readonly supportedDocumentTypes = \"powerhouse/processor\";\n\n /**\n * Parse and extract the global state from the serialized state string\n */\n private extractGlobalState(\n input: CodegenInput,\n ): ProcessorModuleState | undefined {\n if (!input.state) {\n return undefined;\n }\n const fullState = input.state as ProcessorModulePHState;\n return fullState.global;\n }\n\n /**\n * Validate if this processor strand should be processed\n */\n shouldProcess(input: CodegenInput): boolean {\n // First run base validation\n if (!super.shouldProcess(input)) {\n return false;\n }\n\n const state = this.extractGlobalState(input);\n if (!state) {\n logger.debug(`No state found for processor: ${input.documentId}`);\n return false;\n }\n\n // Check if we have a valid processor name, type, document types, and it's confirmed\n if (!state.name) {\n logger.debug(`No name found for processor: ${input.documentId}`);\n return false;\n }\n\n if (!state.type) {\n logger.debug(`No type found for processor: ${state.name}`);\n return false;\n }\n\n if (!state.documentTypes || state.documentTypes.length === 0) {\n logger.debug(`No document types found for processor: ${state.name}`);\n return false;\n }\n\n if (!state.processorApps || state.processorApps.length === 0) {\n logger.debug(`No processor apps found for processor: ${state.name}`);\n return false;\n }\n\n if (state.status !== \"CONFIRMED\") {\n logger.debug(\n `Processor not confirmed: ${state.name} (status: ${state.status})`,\n );\n return false;\n }\n\n return true;\n }\n\n async generate(input: CodegenInput): Promise<void> {\n const state = this.extractGlobalState(input);\n if (!state) {\n logger.error(`No state found for processor: ${input.documentId}`);\n return;\n }\n\n // Check if we have a valid processor name, type, document types, and it's confirmed\n if (\n state.name &&\n state.type &&\n state.documentTypes.length > 0 &&\n state.processorApps.length > 0 &&\n state.status === \"CONFIRMED\"\n ) {\n logger.info(`🔄 Starting processor generation for: ${state.name}`);\n try {\n // Map the type value from document state to generateProcessor expected values\n let processorType: \"analytics\" | \"relationalDb\";\n if (state.type === \"analytics\") {\n processorType = \"analytics\";\n } else if (state.type === \"relational\") {\n processorType = \"relationalDb\";\n } else {\n logger.error(`❌ Unsupported processor type: ${state.type}`);\n return;\n }\n\n // Extract document types from the state\n const documentTypes = state.documentTypes.map((dt) => dt.documentType);\n\n const processorApps = state.processorApps;\n\n if (!isProcessorApps(processorApps)) {\n logger.error(\n `❌ Unsupported processor apps: ${processorApps.join(\", \")}`,\n );\n return;\n }\n\n // Generate the processor using the codegen function\n await generateProcessor(\n {\n processorName: state.name,\n processorType,\n documentTypes,\n processorApps,\n },\n this.project,\n );\n await this.project.save();\n\n logger.info(\n `✅ Processor generation completed successfully for: ${state.name}`,\n );\n\n // Backup the document\n const fullState = input.state as ProcessorModulePHState;\n await minimalBackupDocument(\n {\n documentId: input.documentId,\n documentType: input.documentType,\n branch: input.branch,\n state: fullState,\n name: state.name,\n },\n this.config.CURRENT_WORKING_DIR,\n );\n } catch (error) {\n logger.error(\n `❌ Error during processor generation for ${state.name}:`,\n error,\n );\n if (error instanceof Error) {\n logger.error(`❌ Error message: ${error.message}`);\n }\n }\n } else {\n if (!state.name) {\n logger.error(\n `❌ Skipping processor generation - missing name for processor`,\n );\n return;\n } else if (!state.type) {\n logger.error(\n `❌ Skipping processor generation - missing type for processor \"${state.name}\"`,\n );\n return;\n } else if (state.documentTypes.length === 0) {\n logger.error(\n `❌ Skipping processor generation - missing document types for processor \"${state.name}\"`,\n );\n return;\n } else if (state.status !== \"CONFIRMED\") {\n logger.error(\n `❌ Skipping processor generation - processor \"${state.name}\" is not confirmed (status: ${state.status})`,\n );\n return;\n }\n }\n }\n}\n\nfunction isProcessorApps(input: readonly string[]): input is ProcessorApps {\n if (input.length === 0) return false;\n if (new Set(input).size !== input.length) {\n return false;\n }\n if (!input.every((i) => PROCESSOR_APPS.includes(i as ProcessorApp)))\n return false;\n\n return true;\n}\n","import { generateSubgraph } from \"@powerhousedao/codegen\";\nimport type {\n SubgraphModulePHState,\n SubgraphModuleState,\n} from \"../../../../document-models/subgraph-module/index.js\";\nimport { logger } from \"../../logger.js\";\nimport { BaseDocumentGen } from \"../base-document-gen.js\";\nimport type { CodegenInput } from \"../types.js\";\nimport { minimalBackupDocument } from \"./utils.js\";\n\n/**\n * Generator for subgraph documents\n */\nexport class SubgraphGenerator extends BaseDocumentGen {\n readonly supportedDocumentTypes = \"powerhouse/subgraph\";\n\n /**\n * Parse and extract the global state from the serialized state string\n */\n private extractGlobalState(\n input: CodegenInput,\n ): SubgraphModuleState | undefined {\n if (!input.state) {\n return undefined;\n }\n const fullState = input.state as SubgraphModulePHState;\n return fullState.global;\n }\n\n /**\n * Validate if this subgraph strand should be processed\n */\n shouldProcess(input: CodegenInput): boolean {\n // First run base validation\n if (!super.shouldProcess(input)) {\n return false;\n }\n\n const state = this.extractGlobalState(input);\n if (!state) {\n logger.debug(`No state found for subgraph: ${input.documentId}`);\n return false;\n }\n\n // Check if we have a valid subgraph name and it's confirmed\n if (!state.name) {\n logger.debug(`No name found for subgraph: ${input.documentId}`);\n return false;\n }\n\n if (state.status !== \"CONFIRMED\") {\n logger.debug(\n `Subgraph not confirmed: ${state.name} (status: ${state.status})`,\n );\n return false;\n }\n\n return true;\n }\n\n async generate(input: CodegenInput): Promise<void> {\n const state = this.extractGlobalState(input);\n if (!state) {\n logger.error(`No state found for subgraph: ${input.documentId}`);\n return;\n }\n\n // Check if we have a valid subgraph name and it's confirmed\n if (state.name && state.status === \"CONFIRMED\") {\n logger.info(`🔄 Starting subgraph generation for: ${state.name}`);\n try {\n await generateSubgraph(state.name, this.project);\n await this.project.save();\n logger.info(\n `✅ Subgraph generation completed successfully for: ${state.name}`,\n );\n\n // Backup the document\n const fullState = input.state as SubgraphModulePHState;\n await minimalBackupDocument(\n {\n documentId: input.documentId,\n documentType: input.documentType,\n branch: input.branch,\n state: fullState,\n name: state.name,\n },\n this.config.CURRENT_WORKING_DIR,\n );\n } catch (error) {\n logger.error(\n `❌ Error during subgraph generation for ${state.name}:`,\n error,\n );\n }\n } else {\n if (!state.name) {\n logger.error(\n `❌ Skipping subgraph generation - missing name for subgraph`,\n );\n return;\n } else if (state.status !== \"CONFIRMED\") {\n logger.error(\n `❌ Skipping subgraph generation - subgraph \"${state.name}\" is not confirmed (status: ${state.status})`,\n );\n return;\n }\n }\n }\n}\n","import type { Project } from \"ts-morph\";\nimport type { BaseDocumentGen } from \"./base-document-gen.js\";\nimport { DocumentCodegenManager } from \"./document-codegen-manager.js\";\nimport {\n AppGenerator,\n DocumentEditorGenerator,\n DocumentModelGenerator,\n PackageGenerator,\n ProcessorGenerator,\n SubgraphGenerator,\n} from \"./generators/index.js\";\nimport type { Config } from \"./types.js\";\n\n/**\n * Factory class for creating and configuring DocumentCodegenManager instances\n * with all the standard generators pre-registered\n */\nexport class DocumentCodegenFactory {\n /**\n * Create a DocumentCodegenManager with all standard generators registered\n */\n static createManager(\n config: Config,\n project: Project,\n interactiveMode: boolean = false,\n ): DocumentCodegenManager {\n const manager = new DocumentCodegenManager(\n config,\n project,\n interactiveMode,\n );\n\n // Register all the standard generators\n manager.registerGenerator(\n \"powerhouse/document-model\",\n DocumentModelGenerator,\n );\n manager.registerGenerator(\"powerhouse/package\", PackageGenerator);\n manager.registerGenerator(\"powerhouse/app\", AppGenerator);\n manager.registerGenerator(\n \"powerhouse/document-editor\",\n DocumentEditorGenerator,\n );\n manager.registerGenerator(\"powerhouse/subgraph\", SubgraphGenerator);\n manager.registerGenerator(\"powerhouse/processor\", ProcessorGenerator);\n\n return manager;\n }\n\n /**\n * Create a DocumentCodegenManager with only specific generators\n */\n static createManagerWithGenerators(\n config: Config,\n generators: Array<new (config: Config) => any>,\n project: Project,\n interactiveMode: boolean = false,\n ): DocumentCodegenManager {\n const manager = new DocumentCodegenManager(\n config,\n project,\n interactiveMode,\n );\n\n for (const generatorClass of generators) {\n const generator = new generatorClass(config) as BaseDocumentGen;\n const supportedTypes = generator.getSupportedDocumentTypes();\n\n for (const documentType of supportedTypes) {\n manager.registerGenerator(documentType, generatorClass);\n }\n }\n\n return manager;\n }\n\n /**\n * Get all available generator classes\n */\n static getAvailableGenerators() {\n return {\n DocumentModelGenerator,\n PackageGenerator,\n AppGenerator,\n DocumentEditorGenerator,\n SubgraphGenerator,\n ProcessorGenerator,\n };\n }\n}\n","import type {\n IProcessor,\n OperationWithContext,\n} from \"@powerhousedao/reactor-browser\";\nimport type { PowerhouseConfig } from \"@powerhousedao/shared\";\nimport type { Project } from \"ts-morph\";\nimport type { DocumentCodegenManager } from \"./document-handlers/document-codegen-manager.js\";\nimport { DocumentCodegenFactory } from \"./document-handlers/index.js\";\nimport type { CodegenInput } from \"./document-handlers/types.js\";\nimport { logger } from \"./logger.js\";\n\nexport class CodegenProcessor implements IProcessor {\n private manager: DocumentCodegenManager;\n\n constructor(\n project: Project,\n config: PowerhouseConfig,\n cwd: string,\n interactiveMode = false,\n ) {\n this.manager = DocumentCodegenFactory.createManager(\n {\n PH_CONFIG: config,\n CURRENT_WORKING_DIR: cwd,\n },\n project,\n interactiveMode,\n );\n\n if (interactiveMode) {\n logger.info(`CodegenProcessor initialized with interactive mode enabled`);\n } else {\n logger.debug(\n `CodegenProcessor initialized with interactive mode disabled`,\n );\n }\n }\n\n async onOperations(operations: OperationWithContext[]): Promise<void> {\n logger.info(\"CodegenProcessor.onOperations()\");\n\n for (const { context } of operations) {\n const generator = this.manager.getGenerator(context.documentType);\n if (!generator) {\n logger.debug(\n `No generator found for document type: ${context.documentType}`,\n );\n continue;\n }\n\n const input: CodegenInput = {\n documentId: context.documentId,\n documentType: context.documentType,\n scope: context.scope,\n branch: context.branch,\n state: context.resultingState\n ? JSON.parse(context.resultingState)\n : undefined,\n };\n\n const shouldProcess = generator.shouldProcess(input);\n if (shouldProcess) {\n await this.manager.routeAndGenerate(input);\n }\n }\n }\n\n async onDisconnect() {}\n\n // Utility methods for external configuration and monitoring\n public setInteractiveMode(enabled: boolean): void {\n this.manager.setInteractiveMode(enabled);\n }\n\n public isInteractive(): boolean {\n return this.manager.isInteractiveMode();\n }\n\n public isProcessingInteractive(): boolean {\n return this.manager.isProcessingInteractive();\n }\n}\n","import { buildTsMorphProject } from \"@powerhousedao/codegen/utils\";\nimport type { VetraProcessorConfigType } from \"@powerhousedao/config\";\nimport { VETRA_PROCESSOR_CONFIG_KEY } from \"@powerhousedao/config\";\nimport { getConfig } from \"@powerhousedao/config/node\";\nimport type {\n IProcessorHostModule,\n ProcessorFactoryBuilder,\n ProcessorRecord,\n} from \"@powerhousedao/reactor-browser\";\nimport type { PHDocumentHeader } from \"@powerhousedao/shared/document-model\";\nimport { logger } from \"./logger.js\";\nimport { CodegenProcessor } from \"./processor.js\";\n\n/**\n * Determines if a drive header matches the Vetra drive criteria.\n * @param driveHeader - The drive header to check\n * @param explicitDriveId - Optional explicit drive ID from config (if set, uses exact match)\n * @returns true if the drive is a Vetra drive, false otherwise\n */\nfunction isDriveVetra(\n driveHeader: PHDocumentHeader,\n driveIdFromConfig?: string,\n): boolean {\n // If explicit drive ID is configured, use exact match\n if (driveIdFromConfig) {\n return (\n driveHeader.slug === driveIdFromConfig ||\n driveHeader.id === driveIdFromConfig\n );\n }\n\n // Otherwise, check if slug/id matches Vetra pattern\n // Matches \"vetra\" exactly or IDs starting with \"vetra-\" (case-insensitive)\n const matchesPattern = (identifier: string): boolean => {\n const lower = identifier.toLowerCase();\n return lower === \"vetra\" || lower.startsWith(\"vetra-\");\n };\n\n return matchesPattern(driveHeader.slug) || matchesPattern(driveHeader.id);\n}\n\nexport const codegenFactoryBuilder: ProcessorFactoryBuilder = (\n module: IProcessorHostModule,\n) => {\n return (driveHeader: PHDocumentHeader): ProcessorRecord[] => {\n const config = getConfig();\n const cwd = process.cwd();\n /* Use one instance of ts-morph project, which handles race conditions */\n const project = buildTsMorphProject(cwd);\n const processorsConfig = module.config ?? new Map<string, unknown>();\n const vetraConfig = processorsConfig.get(VETRA_PROCESSOR_CONFIG_KEY) as\n | VetraProcessorConfigType\n | undefined;\n\n // Check if this drive should use the Vetra processor\n if (!isDriveVetra(driveHeader, vetraConfig?.driveId)) {\n logger.debug(\n `Drive ${driveHeader.slug} is not a Vetra drive, skipping codegen processor`,\n );\n return [];\n }\n\n logger.info(\n `Drive ${driveHeader.slug} is a Vetra drive, using codegen processor`,\n );\n const processor = new CodegenProcessor(\n project,\n config,\n cwd,\n vetraConfig?.interactive,\n );\n return [\n {\n processor,\n filter: {\n branch: [\"main\"],\n documentId: [\"*\"],\n documentType: [\n \"powerhouse/document-model\",\n \"powerhouse/package\",\n \"powerhouse/document-editor\",\n \"powerhouse/subgraph\",\n \"powerhouse/processor\",\n \"powerhouse/app\",\n ],\n scope: [\"global\"],\n },\n },\n ];\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"factory-Dexxeo5C.js","names":[],"sources":["../processors/codegen/document-handlers/base-document-gen.ts","../processors/codegen/interactive-manager.ts","../processors/codegen/document-handlers/document-codegen-manager.ts","../processors/codegen/document-handlers/generators/utils.ts","../processors/codegen/document-handlers/generators/app-generator.ts","../processors/codegen/document-handlers/generators/document-editor-generator.ts","../processors/codegen/document-handlers/generators/document-model-generator.ts","../processors/codegen/document-handlers/generators/package-generator.ts","../processors/codegen/document-handlers/generators/processor-generator.ts","../processors/codegen/document-handlers/generators/subgraph-generator.ts","../processors/codegen/document-handlers/document-codegen-factory.ts","../processors/codegen/processor.ts","../processors/codegen/factory.ts"],"sourcesContent":["import type { Project } from \"ts-morph\";\nimport type { CodegenInput, Config } from \"./types.js\";\n/**\n * Abstract base class for document generators\n * Defines the interface that all document-type handlers must implement\n */\nexport abstract class BaseDocumentGen {\n /**\n * The document type(s) this generator supports\n * Can be a single string or an array of strings for generators that handle multiple types\n */\n abstract readonly supportedDocumentTypes: string | string[];\n project: Project;\n\n constructor(\n protected config: Config,\n project: Project,\n ) {\n this.project = project;\n }\n\n /**\n * Generate code for the given document\n * Must be implemented by each specific document generator\n */\n abstract generate(strand: CodegenInput): Promise<void>;\n\n /**\n * Check if this generator supports the given document type\n */\n supportsDocumentType(documentType: string): boolean {\n if (typeof this.supportedDocumentTypes === \"string\") {\n return this.supportedDocumentTypes === documentType;\n }\n return this.supportedDocumentTypes.includes(documentType);\n }\n\n /**\n * Get all supported document types as an array\n */\n getSupportedDocumentTypes(): string[] {\n if (typeof this.supportedDocumentTypes === \"string\") {\n return [this.supportedDocumentTypes];\n }\n return [...this.supportedDocumentTypes];\n }\n\n /**\n * Validate if this strand should be processed\n * Override this method in specific generators to add custom validation logic\n */\n shouldProcess(strand: CodegenInput): boolean {\n // Basic validation: ensure strand has required properties\n if (!strand.documentId || !strand.documentType) {\n return false;\n }\n\n // Basic validation: check if document type is supported\n if (!this.supportsDocumentType(strand.documentType)) {\n return false;\n }\n\n // Default to processing if basic validation passes\n return true;\n }\n}\n","import { createInterface } from \"node:readline\";\nimport type { CodegenInput } from \"./document-handlers/types.js\";\nimport { logger } from \"./logger.js\";\n\nexport interface QueuedStrand {\n strand: CodegenInput;\n timestamp: number;\n}\n\n/**\n * InteractiveManager handles user interaction for code generation confirmation\n * Supports both individual strand processing and queue-based batch processing\n */\nexport class InteractiveManager {\n private isInteractiveMode: boolean;\n private processingConfirmation = false;\n private strandQueue = new Map<string, QueuedStrand>();\n\n constructor(interactiveMode = false) {\n this.isInteractiveMode = interactiveMode;\n }\n\n private getDocumentKey(documentType: string, documentId: string): string {\n return `${documentType}:${documentId}`;\n }\n\n /**\n * Add a strand to the queue, replacing any existing strand for the same document\n */\n public queueStrand(strand: CodegenInput): void {\n const documentKey = this.getDocumentKey(\n strand.documentType,\n strand.documentId,\n );\n\n this.strandQueue.set(documentKey, {\n strand,\n timestamp: Date.now(),\n });\n\n logger.debug(\n `>>> Queued strand for ${documentKey}, queue size: ${this.strandQueue.size}`,\n );\n }\n\n /**\n * Get all queued strands\n */\n public getQueuedStrands(): QueuedStrand[] {\n return Array.from(this.strandQueue.values());\n }\n\n /**\n * Clear and return all queued strands\n */\n public clearQueue(): QueuedStrand[] {\n const queuedStrands = Array.from(this.strandQueue.values());\n this.strandQueue.clear();\n return queuedStrands;\n }\n\n /**\n * Get the current queue size\n */\n public getQueueSize(): number {\n return this.strandQueue.size;\n }\n\n private async promptUserConfirmation(): Promise<boolean> {\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n console.log(\"\\n\" + \"=\".repeat(50));\n console.log(\"🔄 Code generation ready to run.\");\n console.log(\"=\".repeat(50));\n\n process.stdout.write(\n \"Do you want to proceed with code generation? (y/n): \\n\\n\",\n );\n\n rl.on(\"line\", (answer: string) => {\n rl.close();\n console.log(\"\"); // Add blank line after user input\n resolve(answer.toLowerCase() === \"y\" || answer.toLowerCase() === \"yes\");\n });\n });\n }\n\n /**\n * Process generation with user confirmation (legacy single-strand method)\n * This method assumes interactive mode is already enabled (checked by caller)\n */\n public async processWithConfirmation<T>(\n documentType: string,\n generator: () => Promise<T>,\n ): Promise<T | null> {\n if (this.processingConfirmation) {\n logger.debug(\"Already processing confirmation, skipping\");\n return null;\n }\n\n this.processingConfirmation = true;\n\n try {\n // Always prompt user since this method only called in interactive mode\n const shouldProceed = await this.promptUserConfirmation();\n\n if (!shouldProceed) {\n logger.info(`❌ Code generation cancelled by user for ${documentType}`);\n return null;\n }\n\n logger.info(`✅ User approved code generation for ${documentType}`);\n\n const result = await generator();\n return result;\n } catch (error) {\n logger.error(\n `❌ Error during interactive code generation for ${documentType}:`,\n error,\n );\n throw error;\n } finally {\n this.processingConfirmation = false;\n }\n }\n\n /**\n * Process all queued strands with a single user confirmation\n * This is the main method for queue-based interactive processing\n */\n public async processQueueWithConfirmation(\n processor: (strands: QueuedStrand[]) => Promise<void>,\n ): Promise<void> {\n if (this.processingConfirmation) {\n logger.debug(\n \"Already processing confirmation, skipping queue processing\",\n );\n return;\n }\n\n // Check if there are any strands to process\n let queuedStrands = this.getQueuedStrands();\n if (queuedStrands.length === 0) {\n logger.debug(\"No strands in queue to process\");\n return;\n }\n\n this.processingConfirmation = true;\n\n try {\n // Prompt user for confirmation\n const shouldProceed = await this.promptUserConfirmation();\n\n if (!shouldProceed) {\n logger.info(\"❌ Code generation cancelled by user\");\n // Clear the queue since user cancelled\n this.clearQueue();\n return;\n }\n\n // Get and clear the final queue state right before processing\n // (in case new strands were added while waiting for user input)\n queuedStrands = this.clearQueue();\n if (queuedStrands.length === 0) {\n logger.info(\"ℹ️ No documents to process\");\n return;\n }\n\n logger.info(\n `✅ User approved code generation for ${queuedStrands.length} document(s)`,\n );\n\n // Process all queued strands\n await processor(queuedStrands);\n logger.info(\"✅ Code generation completed\");\n } catch (error) {\n logger.error(\n \"❌ Error during interactive queue processing: @error\",\n error,\n );\n throw error;\n } finally {\n this.processingConfirmation = false;\n }\n }\n\n public setInteractiveMode(enabled: boolean): void {\n this.isInteractiveMode = enabled;\n logger.debug(`Interactive mode set to: ${enabled}`);\n }\n\n public isInteractive(): boolean {\n return this.isInteractiveMode;\n }\n\n public isProcessing(): boolean {\n return this.processingConfirmation;\n }\n}\n","import type { Project } from \"ts-morph\";\nimport type { QueuedStrand } from \"../interactive-manager.js\";\nimport { InteractiveManager } from \"../interactive-manager.js\";\nimport { logger } from \"../logger.js\";\nimport type { BaseDocumentGen } from \"./base-document-gen.js\";\nimport type { CodegenInput, Config } from \"./types.js\";\n\nconst DEFAULT_DEBOUNCE_TIME = 1000; // wait 1 second between codegen calls\n\n/**\n * Manager class responsible for routing documents to the correct generator\n * and managing generator registration and instantiation\n */\nexport class DocumentCodegenManager {\n project: Project;\n private generators = new Map<string, BaseDocumentGen>();\n private debounceTimers = new Map<string, NodeJS.Timeout>();\n private processingQueue: Promise<void> = Promise.resolve();\n private interactiveManager: InteractiveManager;\n\n constructor(\n private config: Config,\n project: Project,\n interactiveMode = false,\n ) {\n this.project = project;\n this.interactiveManager = new InteractiveManager(interactiveMode);\n }\n\n /**\n * Register a generator class for a specific document type\n */\n registerGenerator(\n documentType: string,\n generatorClass: new (config: Config, project: Project) => BaseDocumentGen,\n ): void {\n if (this.generators.has(documentType)) {\n logger.warn(\n `⚠️ Generator for document type \"${documentType}\" is already registered. Overwriting.`,\n );\n }\n\n this.generators.set(\n documentType,\n new generatorClass(this.config, this.project),\n );\n logger.debug(`✅ Registered generator for document type: ${documentType}`);\n }\n\n /**\n * Register a generator class that supports multiple document types\n */\n registerMultiTypeGenerator(\n generatorClass: new (config: Config, project: Project) => BaseDocumentGen,\n ): void {\n const generator = new generatorClass(this.config, this.project);\n const supportedTypes = generator.getSupportedDocumentTypes();\n\n for (const documentType of supportedTypes) {\n if (this.generators.has(documentType)) {\n logger.warn(\n `⚠️ Generator for document type \"${documentType}\" is already registered. Overwriting.`,\n );\n }\n this.generators.set(documentType, generator);\n }\n\n logger.debug(\n `✅ Registered multi-type generator for document types: ${supportedTypes.join(\", \")}`,\n );\n }\n\n /**\n * Get a generator instance for the given document type\n * Public method to allow external access for validation\n */\n public getGenerator(documentType: string): BaseDocumentGen | undefined {\n return this.generators.get(documentType);\n }\n\n /**\n * Get all registered document types\n */\n getRegisteredDocumentTypes(): string[] {\n return Array.from(this.generators.keys());\n }\n\n /**\n * Check if a document type is supported\n */\n isDocumentTypeSupported(documentType: string): boolean {\n return this.generators.has(documentType);\n }\n\n /**\n * Route a document to the appropriate generator and handle the generation\n * Handles both interactive and non-interactive modes with queue-based processing\n */\n routeAndGenerate(strand: CodegenInput): Promise<void> {\n const documentType = strand.documentType;\n\n if (!documentType) {\n logger.error(\"❌ Document type is missing from strand state\");\n throw new Error(\"Document type is missing from strand state\");\n }\n\n const generator = this.getGenerator(documentType);\n\n if (!generator) {\n logger.warn(`⚠️ No generator found for document type: ${documentType}`);\n logger.warn(\n `ℹ️ Supported document types: ${this.getRegisteredDocumentTypes().join(\", \")}`,\n );\n throw new Error(`Unsupported document type: ${documentType}`);\n }\n\n // Validate if this strand should be processed\n if (!generator.shouldProcess(strand)) {\n logger.debug(\n `>>> Generator validation failed for ${documentType}:${strand.documentId}, skipping processing`,\n );\n return Promise.resolve();\n }\n\n // Different flow for interactive vs non-interactive mode\n if (this.interactiveManager.isInteractive()) {\n // Interactive mode: queue strands and use debounce timer to trigger batch processing\n logger.debug(\n `>>> Queueing strand for interactive processing: ${documentType}:${strand.documentId}`,\n );\n\n // Add strand to queue (will replace any existing strand for same document)\n this.interactiveManager.queueStrand(strand);\n\n // Clear any existing debounce timer for interactive processing\n const existingTimer = this.debounceTimers.get(\"interactive\");\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n // Set up debounce timer for batch interactive processing\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n const debounceTimer = setTimeout(async () => {\n try {\n await this.interactiveManager.processQueueWithConfirmation(\n async (queuedStrands: QueuedStrand[]) => {\n await this.processQueuedStrands(queuedStrands);\n },\n );\n } catch (error) {\n logger.error(\n \"❌ Error during interactive batch processing: @error\",\n error,\n );\n } finally {\n // Clean up the timer reference\n this.debounceTimers.delete(\"interactive\");\n }\n }, DEFAULT_DEBOUNCE_TIME);\n\n // Store the timer reference using 'interactive' key\n this.debounceTimers.set(\"interactive\", debounceTimer);\n } else {\n // Non-interactive mode: use debouncing per document instance\n // Create unique key for this specific document instance\n const timerKey = `${documentType}:${strand.documentId}`;\n\n // Clear any existing debounce timer for this document instance\n const existingTimer = this.debounceTimers.get(timerKey);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n // Set up new debounced generation (no interactive confirmation)\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n const debounceTimer = setTimeout(async () => {\n try {\n logger.debug(\n `🔄 Routing document type \"${documentType}\" to generator (debounced)`,\n );\n\n // Direct generation, no interactive confirmation\n await generator.generate(strand);\n logger.debug(\n `✅ Successfully generated code for document type: ${documentType}`,\n );\n } catch (error) {\n logger.error(\n `❌ Error generating code for document type \"${documentType}\":`,\n error,\n );\n // Don't throw - let codegen continue with other documents\n } finally {\n // Clean up the timer reference\n this.debounceTimers.delete(timerKey);\n }\n }, DEFAULT_DEBOUNCE_TIME);\n\n // Store the timer reference\n this.debounceTimers.set(timerKey, debounceTimer);\n }\n return Promise.resolve();\n }\n\n /**\n * Process multiple strands in priority order (document-model types first)\n */\n private async processQueuedStrands(\n queuedStrands: QueuedStrand[],\n ): Promise<void> {\n logger.debug(`🔄 Processing ${queuedStrands.length} queued strand(s)`);\n\n // Sort by priority (document-model first to ensure dependencies exist)\n const documentModelStrands = queuedStrands.filter(\n (qs: QueuedStrand) =>\n qs.strand.documentType === \"powerhouse/document-model\",\n );\n const otherStrands = queuedStrands.filter(\n (qs: QueuedStrand) =>\n qs.strand.documentType !== \"powerhouse/document-model\",\n );\n\n // Process document models first\n for (const queuedStrand of documentModelStrands) {\n await this.processStrand(queuedStrand.strand);\n }\n\n // Then process other document types\n for (const queuedStrand of otherStrands) {\n await this.processStrand(queuedStrand.strand);\n }\n\n logger.debug(\n `✅ Successfully processed all ${queuedStrands.length} queued strand(s)`,\n );\n }\n\n /**\n * Process a single strand (used internally by processQueuedStrands)\n */\n private async processStrand(strand: CodegenInput): Promise<void> {\n const documentType = strand.documentType;\n const generator = this.getGenerator(documentType);\n\n if (!generator) {\n logger.warn(`⚠️ No generator found for document type: ${documentType}`);\n return;\n }\n\n try {\n logger.debug(`🔄 Generating code for document type: ${documentType}`);\n await generator.generate(strand);\n logger.debug(\n `✅ Successfully generated code for document type: ${documentType}`,\n );\n } catch (error) {\n logger.error(\n `❌ Error generating code for document type \"${documentType}\":`,\n error,\n );\n // Don't throw here to allow other strands to be processed\n }\n }\n\n /**\n * Clear all registered generators\n */\n clearGenerators(): void {\n this.generators.clear();\n logger.debug(\"🧹 Cleared all registered generators\");\n }\n\n /**\n * Get statistics about registered generators\n */\n getStats(): { totalGenerators: number; supportedTypes: string[] } {\n return {\n totalGenerators: this.generators.size,\n supportedTypes: this.getRegisteredDocumentTypes(),\n };\n }\n\n /**\n * Set interactive mode for code generation\n */\n setInteractiveMode(enabled: boolean): void {\n this.interactiveManager.setInteractiveMode(enabled);\n }\n\n /**\n * Check if interactive mode is enabled\n */\n isInteractiveMode(): boolean {\n return this.interactiveManager.isInteractive();\n }\n\n /**\n * Check if the manager is currently processing an interactive confirmation\n */\n isProcessingInteractive(): boolean {\n return this.interactiveManager.isProcessing();\n }\n}\n","import type {\n MinimalBackupData,\n PHDocument,\n} from \"@powerhousedao/shared/document-model\";\nimport { baseMinimalSaveToFile, baseSaveToFile } from \"document-model/node\";\nimport { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { logger } from \"../../logger.js\";\n\nconst BACKUP_FOLDER = \"backup-documents\";\n\n/**\n * Exports a document to the backup directory.\n * Creates the backup directory if it doesn't exist.\n *\n * @param document - The document to backup\n * @param workingDir - Current working directory\n * @param extension - File extension for the document type (without dot)\n * @param name - Name of the document to use for the backup file (optional)\n * @returns Promise resolving to the backup file path, or undefined if backup failed\n */\nexport async function backupDocument(\n document: PHDocument,\n workingDir: string,\n extension: string = \"\",\n name?: string,\n): Promise<string | undefined> {\n const docName = name ?? document.header.name;\n\n try {\n const backupPath = join(workingDir, BACKUP_FOLDER);\n await mkdir(backupPath, { recursive: true });\n\n const filePath = await baseSaveToFile(\n document,\n backupPath,\n extension,\n docName,\n );\n\n logger.debug(`📁 Document backed up to: ${filePath}`);\n return filePath;\n } catch (error) {\n logger.warn(`⚠️ Failed to backup document \"${docName}\":`, error);\n return undefined;\n }\n}\n\n/**\n * Creates a minimal backup of a document from strand data.\n * Used when the full document is not available (e.g., in onOperations handler).\n */\nexport async function minimalBackupDocument(\n data: MinimalBackupData,\n workingDir: string,\n extension?: string,\n): Promise<string | undefined> {\n try {\n const backupPath = join(workingDir, BACKUP_FOLDER);\n await mkdir(backupPath, { recursive: true });\n\n const filePath = await baseMinimalSaveToFile(\n data,\n backupPath,\n extension ?? \"\",\n );\n\n logger.debug(`Document backed up to: ${filePath}`);\n return filePath;\n } catch (error) {\n logger.warn(`Failed to backup document \"${data.name}\":`, error);\n return undefined;\n }\n}\n","import { generateApp } from \"@powerhousedao/codegen\";\nimport type {\n AppModuleGlobalState,\n AppModulePHState,\n} from \"@powerhousedao/vetra/document-models/app-module\";\nimport { kebabCase } from \"change-case\";\nimport { logger } from \"../../logger.js\";\nimport { BaseDocumentGen } from \"../base-document-gen.js\";\nimport type { CodegenInput } from \"../types.js\";\nimport { minimalBackupDocument } from \"./utils.js\";\n\n/**\n * Generator for app documents\n */\nexport class AppGenerator extends BaseDocumentGen {\n readonly supportedDocumentTypes = \"powerhouse/app\";\n\n /**\n * Parse and extract the global state from the serialized state string\n */\n private extractGlobalState(\n input: CodegenInput,\n ): AppModuleGlobalState | undefined {\n if (!input.state) {\n return undefined;\n }\n const fullState = input.state as AppModulePHState;\n return fullState.global;\n }\n\n /**\n * Validate if this app strand should be processed\n */\n shouldProcess(input: CodegenInput): boolean {\n // First run base validation\n if (!super.shouldProcess(input)) {\n return false;\n }\n\n const state = this.extractGlobalState(input);\n if (!state) {\n logger.debug(`No state found for app: ${input.documentId}`);\n return false;\n }\n\n // Check if we have a valid app name and it's confirmed\n if (!state.name) {\n logger.debug(`No name found for app: ${input.documentId}`);\n return false;\n }\n\n if (state.status !== \"CONFIRMED\") {\n logger.debug(\n `App not confirmed: ${state.name} (status: ${state.status})`,\n );\n return false;\n }\n\n return true;\n }\n\n async generate(input: CodegenInput): Promise<void> {\n const state = this.extractGlobalState(input);\n if (!state) {\n logger.error(`No state found for app: ${input.documentId}`);\n return;\n }\n\n // Check if we have a valid app name and it's confirmed\n if (state.name && state.status === \"CONFIRMED\") {\n logger.info(`🔄 Starting app generation for app: ${state.name}`);\n try {\n // Generate app ID using kebabCase\n const appId: string = kebabCase(state.name);\n // Generate the app using the codegen function\n await generateApp(\n {\n ...this.config.PH_CONFIG,\n appName: state.name,\n appId: appId,\n allowedDocumentTypes: state.allowedDocumentTypes ?? [],\n isDragAndDropEnabled: state.isDragAndDropEnabled,\n },\n this.project,\n );\n await this.project.save();\n\n logger.info(\n `✅ App generation completed successfully for app: ${state.name}`,\n );\n\n // Backup the document\n const fullState = input.state as AppModulePHState;\n await minimalBackupDocument(\n {\n documentId: input.documentId,\n documentType: input.documentType,\n branch: input.branch,\n state: fullState,\n name: state.name,\n },\n this.config.CURRENT_WORKING_DIR,\n );\n } catch (error) {\n logger.error(\n `❌ Error during app generation for app ${state.name}:`,\n error,\n );\n if (error instanceof Error) {\n logger.error(`❌ Error message: ${error.message}`);\n }\n }\n } else {\n if (!state.name) {\n logger.error(`❌ Skipping app generation - missing name for app`);\n return;\n } else if (state.status !== \"CONFIRMED\") {\n logger.error(\n `❌ Skipping app generation - app \"${state.name}\" is not confirmed (status: ${state.status})`,\n );\n return;\n }\n }\n }\n}\n","import { generateEditor } from \"@powerhousedao/codegen\";\nimport { kebabCase } from \"change-case\";\nimport type {\n DocumentEditorPHState,\n DocumentEditorState,\n} from \"../../../../document-models/document-editor/index.js\";\nimport { logger } from \"../../logger.js\";\nimport { BaseDocumentGen } from \"../base-document-gen.js\";\nimport type { CodegenInput } from \"../types.js\";\nimport { minimalBackupDocument } from \"./utils.js\";\n\n/**\n * Generator for document editor documents\n */\nexport class DocumentEditorGenerator extends BaseDocumentGen {\n readonly supportedDocumentTypes = \"powerhouse/document-editor\";\n\n /**\n * Parse and extract the global state from the serialized state string\n */\n private extractGlobalState(\n input: CodegenInput,\n ): DocumentEditorState | undefined {\n if (!input.state) {\n return undefined;\n }\n const fullState = input.state as DocumentEditorPHState;\n return fullState.global;\n }\n\n /**\n * Validate if this document editor strand should be processed\n */\n shouldProcess(input: CodegenInput): boolean {\n // First run base validation\n if (!super.shouldProcess(input)) {\n return false;\n }\n\n const state = this.extractGlobalState(input);\n if (!state) {\n logger.debug(`No state found for document editor: ${input.documentId}`);\n return false;\n }\n\n // Check if we have a valid editor name, document types, and it's confirmed\n if (!state.name) {\n logger.debug(`No name found for document editor: ${input.documentId}`);\n return false;\n }\n\n if (!state.documentTypes || state.documentTypes.length === 0) {\n logger.debug(\n `No document types found for document editor: ${state.name}`,\n );\n return false;\n }\n\n if (state.status !== \"CONFIRMED\") {\n logger.debug(\n `Document editor not confirmed: ${state.name} (status: ${state.status})`,\n );\n return false;\n }\n\n return true;\n }\n\n async generate(input: CodegenInput): Promise<void> {\n const state = this.extractGlobalState(input);\n if (!state) {\n logger.error(`No state found for document editor: ${input.documentId}`);\n return;\n }\n\n // Validation is already done in shouldProcess, so we can proceed directly\n logger.info(`🔄 Starting editor generation for: ${state.name}`);\n try {\n // Extract document types from the state\n const documentTypes = state.documentTypes.map((dt) => dt.documentType);\n\n // Generate editor ID using kebabCase\n const editorId: string = kebabCase(state.name);\n\n // Generate the editor using the codegen function\n await generateEditor(\n {\n ...this.config.PH_CONFIG,\n editorName: state.name,\n documentTypes: documentTypes,\n editorId: editorId,\n },\n this.project,\n );\n await this.project.save();\n\n logger.info(\n `✅ Editor generation completed successfully for: ${state.name}`,\n );\n\n // Backup the document\n const fullState = input.state as DocumentEditorPHState;\n await minimalBackupDocument(\n {\n documentId: input.documentId,\n documentType: input.documentType,\n branch: input.branch,\n state: fullState,\n name: state.name,\n },\n this.config.CURRENT_WORKING_DIR,\n );\n } catch (error) {\n logger.error(\n `❌ Error during editor generation for ${state.name}:`,\n error,\n );\n if (error instanceof Error) {\n logger.error(`❌ Error message: ${error.message}`);\n }\n // Don't throw - let codegen continue with other documents\n return;\n }\n }\n}\n","import {\n generateDocumentModel,\n validateDocumentModelState,\n} from \"@powerhousedao/codegen\";\nimport type {\n DocumentModelGlobalState,\n DocumentModelPHState,\n} from \"@powerhousedao/shared/document-model\";\nimport { logger } from \"../../logger.js\";\nimport { BaseDocumentGen } from \"../base-document-gen.js\";\nimport type { CodegenInput } from \"../types.js\";\nimport { minimalBackupDocument } from \"./utils.js\";\n\n/**\n * Generator for document model documents\n */\nexport class DocumentModelGenerator extends BaseDocumentGen {\n readonly supportedDocumentTypes = \"powerhouse/document-model\";\n\n /**\n * Parse and extract the global state from the serialized state string\n */\n private extractGlobalState(\n input: CodegenInput,\n ): DocumentModelGlobalState | undefined {\n if (!input.state) {\n return undefined;\n }\n const fullState = input.state as DocumentModelPHState;\n return fullState.global;\n }\n\n /**\n * Validate if this document model strand should be processed\n */\n shouldProcess(input: CodegenInput): boolean {\n // First run base validation\n if (!super.shouldProcess(input)) {\n return false;\n }\n\n // Extract the global state from the full document state\n const globalState = this.extractGlobalState(input);\n if (!globalState) {\n logger.debug(\n `>>> No global state found for document model: ${input.documentId}`,\n );\n return false;\n }\n\n const validationResult = validateDocumentModelState(globalState);\n if (!validationResult.isValid) {\n const errorList = validationResult.errors\n .map((error) => ` - ${error}`)\n .join(\"\\n\");\n logger.info(\n `⚠️ Skipped code generation for '${globalState.name || input.documentId}' due to validation errors:\\n${errorList}`,\n );\n return false;\n }\n\n logger.info(\n `Document model ${globalState.name} is valid, proceeding with code generation`,\n );\n\n return true;\n }\n\n async generate(input: CodegenInput): Promise<void> {\n const globalState = this.extractGlobalState(input);\n if (!globalState) {\n logger.error(\n `❌ No global state found for document model: ${input.documentId}`,\n );\n return;\n }\n // Validation is already done in shouldProcess, so we can proceed directly\n logger.debug(\n `🔄 Starting code generation for document model: ${globalState.name}`,\n );\n try {\n await generateDocumentModel(globalState, this.project);\n await this.project.save();\n logger.info(\n `✅ Code generation completed successfully for: ${globalState.name}`,\n );\n\n // Backup the document\n const fullState = input.state as DocumentModelPHState;\n const extension = globalState.extension?.replace(/^\\.+|\\.+$/g, \"\") || \"\";\n await minimalBackupDocument(\n {\n documentId: input.documentId,\n documentType: input.documentType,\n branch: input.branch,\n state: fullState,\n name: globalState.name,\n },\n this.config.CURRENT_WORKING_DIR,\n extension,\n );\n } catch (error) {\n logger.error(\n `❌ Error during code generation for ${globalState.name}:`,\n error,\n );\n // Don't throw - let codegen continue with other documents\n return;\n }\n }\n}\n","import { createOrUpdateManifest } from \"@powerhousedao/codegen/file-builders\";\nimport type {\n VetraPackageGlobalState,\n VetraPackagePHState,\n} from \"../../../../document-models/vetra-package/index.js\";\nimport { logger } from \"../../logger.js\";\nimport { BaseDocumentGen } from \"../base-document-gen.js\";\nimport type { CodegenInput } from \"../types.js\";\nimport { minimalBackupDocument } from \"./utils.js\";\n\n/**\n * Generator for package documents\n */\nexport class PackageGenerator extends BaseDocumentGen {\n readonly supportedDocumentTypes = \"powerhouse/package\";\n\n /**\n * Validate if this package strand should be processed\n */\n shouldProcess(input: CodegenInput): boolean {\n // First run base validation\n if (!super.shouldProcess(input)) {\n return false;\n }\n\n if (!input.state) {\n logger.debug(`>>> No state found for package: ${input.documentId}`);\n return false;\n }\n\n return true;\n }\n\n async generate(input: CodegenInput): Promise<void> {\n const fullState = input.state as VetraPackagePHState;\n const state = fullState.global as VetraPackageGlobalState;\n\n await createOrUpdateManifest(\n {\n name: state.name ?? \"\",\n category: state.category ?? \"\",\n description: state.description ?? \"\",\n publisher: {\n name: state.author?.name ?? \"\",\n url: state.author?.website ?? \"\",\n },\n },\n this.config.CURRENT_WORKING_DIR,\n );\n\n // Backup the document\n await minimalBackupDocument(\n {\n documentId: input.documentId,\n documentType: input.documentType,\n branch: input.branch,\n state: fullState,\n name: \"vetra-package\",\n },\n this.config.CURRENT_WORKING_DIR,\n );\n }\n}\n","import { generateProcessor } from \"@powerhousedao/codegen\";\nimport {\n PROCESSOR_APPS,\n type ProcessorApp,\n type ProcessorApps,\n} from \"@powerhousedao/shared/processors\";\nimport type {\n ProcessorModulePHState,\n ProcessorModuleState,\n} from \"../../../../document-models/processor-module/index.js\";\nimport { logger } from \"../../logger.js\";\nimport { BaseDocumentGen } from \"../base-document-gen.js\";\nimport type { CodegenInput } from \"../types.js\";\nimport { minimalBackupDocument } from \"./utils.js\";\n\n/**\n * Generator for processor documents\n */\nexport class ProcessorGenerator extends BaseDocumentGen {\n readonly supportedDocumentTypes = \"powerhouse/processor\";\n\n /**\n * Parse and extract the global state from the serialized state string\n */\n private extractGlobalState(\n input: CodegenInput,\n ): ProcessorModuleState | undefined {\n if (!input.state) {\n return undefined;\n }\n const fullState = input.state as ProcessorModulePHState;\n return fullState.global;\n }\n\n /**\n * Validate if this processor strand should be processed\n */\n shouldProcess(input: CodegenInput): boolean {\n // First run base validation\n if (!super.shouldProcess(input)) {\n return false;\n }\n\n const state = this.extractGlobalState(input);\n if (!state) {\n logger.debug(`No state found for processor: ${input.documentId}`);\n return false;\n }\n\n // Check if we have a valid processor name, type, document types, and it's confirmed\n if (!state.name) {\n logger.debug(`No name found for processor: ${input.documentId}`);\n return false;\n }\n\n if (!state.type) {\n logger.debug(`No type found for processor: ${state.name}`);\n return false;\n }\n\n if (!state.documentTypes || state.documentTypes.length === 0) {\n logger.debug(`No document types found for processor: ${state.name}`);\n return false;\n }\n\n if (!state.processorApps || state.processorApps.length === 0) {\n logger.debug(`No processor apps found for processor: ${state.name}`);\n return false;\n }\n\n if (state.status !== \"CONFIRMED\") {\n logger.debug(\n `Processor not confirmed: ${state.name} (status: ${state.status})`,\n );\n return false;\n }\n\n return true;\n }\n\n async generate(input: CodegenInput): Promise<void> {\n const state = this.extractGlobalState(input);\n if (!state) {\n logger.error(`No state found for processor: ${input.documentId}`);\n return;\n }\n\n // Check if we have a valid processor name, type, document types, and it's confirmed\n if (\n state.name &&\n state.type &&\n state.documentTypes.length > 0 &&\n state.processorApps.length > 0 &&\n state.status === \"CONFIRMED\"\n ) {\n logger.info(`🔄 Starting processor generation for: ${state.name}`);\n try {\n // Map the type value from document state to generateProcessor expected values\n let processorType: \"analytics\" | \"relationalDb\";\n if (state.type === \"analytics\") {\n processorType = \"analytics\";\n } else if (state.type === \"relational\") {\n processorType = \"relationalDb\";\n } else {\n logger.error(`❌ Unsupported processor type: ${state.type}`);\n return;\n }\n\n // Extract document types from the state\n const documentTypes = state.documentTypes.map((dt) => dt.documentType);\n\n const processorApps = state.processorApps;\n\n if (!isProcessorApps(processorApps)) {\n logger.error(\n `❌ Unsupported processor apps: ${processorApps.join(\", \")}`,\n );\n return;\n }\n\n // Generate the processor using the codegen function\n await generateProcessor(\n {\n processorName: state.name,\n processorType,\n documentTypes,\n processorApps,\n },\n this.project,\n );\n await this.project.save();\n\n logger.info(\n `✅ Processor generation completed successfully for: ${state.name}`,\n );\n\n // Backup the document\n const fullState = input.state as ProcessorModulePHState;\n await minimalBackupDocument(\n {\n documentId: input.documentId,\n documentType: input.documentType,\n branch: input.branch,\n state: fullState,\n name: state.name,\n },\n this.config.CURRENT_WORKING_DIR,\n );\n } catch (error) {\n logger.error(\n `❌ Error during processor generation for ${state.name}:`,\n error,\n );\n if (error instanceof Error) {\n logger.error(`❌ Error message: ${error.message}`);\n }\n }\n } else {\n if (!state.name) {\n logger.error(\n `❌ Skipping processor generation - missing name for processor`,\n );\n return;\n } else if (!state.type) {\n logger.error(\n `❌ Skipping processor generation - missing type for processor \"${state.name}\"`,\n );\n return;\n } else if (state.documentTypes.length === 0) {\n logger.error(\n `❌ Skipping processor generation - missing document types for processor \"${state.name}\"`,\n );\n return;\n } else if (state.status !== \"CONFIRMED\") {\n logger.error(\n `❌ Skipping processor generation - processor \"${state.name}\" is not confirmed (status: ${state.status})`,\n );\n return;\n }\n }\n }\n}\n\nfunction isProcessorApps(input: readonly string[]): input is ProcessorApps {\n if (input.length === 0) return false;\n if (new Set(input).size !== input.length) {\n return false;\n }\n if (!input.every((i) => PROCESSOR_APPS.includes(i as ProcessorApp)))\n return false;\n\n return true;\n}\n","import { generateSubgraph } from \"@powerhousedao/codegen\";\nimport type {\n SubgraphModulePHState,\n SubgraphModuleState,\n} from \"../../../../document-models/subgraph-module/index.js\";\nimport { logger } from \"../../logger.js\";\nimport { BaseDocumentGen } from \"../base-document-gen.js\";\nimport type { CodegenInput } from \"../types.js\";\nimport { minimalBackupDocument } from \"./utils.js\";\n\n/**\n * Generator for subgraph documents\n */\nexport class SubgraphGenerator extends BaseDocumentGen {\n readonly supportedDocumentTypes = \"powerhouse/subgraph\";\n\n /**\n * Parse and extract the global state from the serialized state string\n */\n private extractGlobalState(\n input: CodegenInput,\n ): SubgraphModuleState | undefined {\n if (!input.state) {\n return undefined;\n }\n const fullState = input.state as SubgraphModulePHState;\n return fullState.global;\n }\n\n /**\n * Validate if this subgraph strand should be processed\n */\n shouldProcess(input: CodegenInput): boolean {\n // First run base validation\n if (!super.shouldProcess(input)) {\n return false;\n }\n\n const state = this.extractGlobalState(input);\n if (!state) {\n logger.debug(`No state found for subgraph: ${input.documentId}`);\n return false;\n }\n\n // Check if we have a valid subgraph name and it's confirmed\n if (!state.name) {\n logger.debug(`No name found for subgraph: ${input.documentId}`);\n return false;\n }\n\n if (state.status !== \"CONFIRMED\") {\n logger.debug(\n `Subgraph not confirmed: ${state.name} (status: ${state.status})`,\n );\n return false;\n }\n\n return true;\n }\n\n async generate(input: CodegenInput): Promise<void> {\n const state = this.extractGlobalState(input);\n if (!state) {\n logger.error(`No state found for subgraph: ${input.documentId}`);\n return;\n }\n\n // Check if we have a valid subgraph name and it's confirmed\n if (state.name && state.status === \"CONFIRMED\") {\n logger.info(`🔄 Starting subgraph generation for: ${state.name}`);\n try {\n await generateSubgraph(state.name, this.project);\n await this.project.save();\n logger.info(\n `✅ Subgraph generation completed successfully for: ${state.name}`,\n );\n\n // Backup the document\n const fullState = input.state as SubgraphModulePHState;\n await minimalBackupDocument(\n {\n documentId: input.documentId,\n documentType: input.documentType,\n branch: input.branch,\n state: fullState,\n name: state.name,\n },\n this.config.CURRENT_WORKING_DIR,\n );\n } catch (error) {\n logger.error(\n `❌ Error during subgraph generation for ${state.name}:`,\n error,\n );\n }\n } else {\n if (!state.name) {\n logger.error(\n `❌ Skipping subgraph generation - missing name for subgraph`,\n );\n return;\n } else if (state.status !== \"CONFIRMED\") {\n logger.error(\n `❌ Skipping subgraph generation - subgraph \"${state.name}\" is not confirmed (status: ${state.status})`,\n );\n return;\n }\n }\n }\n}\n","import type { Project } from \"ts-morph\";\nimport type { BaseDocumentGen } from \"./base-document-gen.js\";\nimport { DocumentCodegenManager } from \"./document-codegen-manager.js\";\nimport {\n AppGenerator,\n DocumentEditorGenerator,\n DocumentModelGenerator,\n PackageGenerator,\n ProcessorGenerator,\n SubgraphGenerator,\n} from \"./generators/index.js\";\nimport type { Config } from \"./types.js\";\n\n/**\n * Factory class for creating and configuring DocumentCodegenManager instances\n * with all the standard generators pre-registered\n */\nexport class DocumentCodegenFactory {\n /**\n * Create a DocumentCodegenManager with all standard generators registered\n */\n static createManager(\n config: Config,\n project: Project,\n interactiveMode: boolean = false,\n ): DocumentCodegenManager {\n const manager = new DocumentCodegenManager(\n config,\n project,\n interactiveMode,\n );\n\n // Register all the standard generators\n manager.registerGenerator(\n \"powerhouse/document-model\",\n DocumentModelGenerator,\n );\n manager.registerGenerator(\"powerhouse/package\", PackageGenerator);\n manager.registerGenerator(\"powerhouse/app\", AppGenerator);\n manager.registerGenerator(\n \"powerhouse/document-editor\",\n DocumentEditorGenerator,\n );\n manager.registerGenerator(\"powerhouse/subgraph\", SubgraphGenerator);\n manager.registerGenerator(\"powerhouse/processor\", ProcessorGenerator);\n\n return manager;\n }\n\n /**\n * Create a DocumentCodegenManager with only specific generators\n */\n static createManagerWithGenerators(\n config: Config,\n generators: Array<new (config: Config) => any>,\n project: Project,\n interactiveMode: boolean = false,\n ): DocumentCodegenManager {\n const manager = new DocumentCodegenManager(\n config,\n project,\n interactiveMode,\n );\n\n for (const generatorClass of generators) {\n const generator = new generatorClass(config) as BaseDocumentGen;\n const supportedTypes = generator.getSupportedDocumentTypes();\n\n for (const documentType of supportedTypes) {\n manager.registerGenerator(documentType, generatorClass);\n }\n }\n\n return manager;\n }\n\n /**\n * Get all available generator classes\n */\n static getAvailableGenerators() {\n return {\n DocumentModelGenerator,\n PackageGenerator,\n AppGenerator,\n DocumentEditorGenerator,\n SubgraphGenerator,\n ProcessorGenerator,\n };\n }\n}\n","import type {\n IProcessor,\n OperationWithContext,\n} from \"@powerhousedao/reactor-browser\";\nimport type { PowerhouseConfig } from \"@powerhousedao/shared\";\nimport type { Project } from \"ts-morph\";\nimport type { DocumentCodegenManager } from \"./document-handlers/document-codegen-manager.js\";\nimport { DocumentCodegenFactory } from \"./document-handlers/index.js\";\nimport type { CodegenInput } from \"./document-handlers/types.js\";\nimport { logger } from \"./logger.js\";\n\nexport class CodegenProcessor implements IProcessor {\n private manager: DocumentCodegenManager;\n\n constructor(\n project: Project,\n config: PowerhouseConfig,\n cwd: string,\n interactiveMode = false,\n ) {\n this.manager = DocumentCodegenFactory.createManager(\n {\n PH_CONFIG: config,\n CURRENT_WORKING_DIR: cwd,\n },\n project,\n interactiveMode,\n );\n\n if (interactiveMode) {\n logger.info(`CodegenProcessor initialized with interactive mode enabled`);\n } else {\n logger.debug(\n `CodegenProcessor initialized with interactive mode disabled`,\n );\n }\n }\n\n async onOperations(operations: OperationWithContext[]): Promise<void> {\n logger.info(\"CodegenProcessor.onOperations()\");\n\n for (const { context } of operations) {\n const generator = this.manager.getGenerator(context.documentType);\n if (!generator) {\n logger.debug(\n `No generator found for document type: ${context.documentType}`,\n );\n continue;\n }\n\n const input: CodegenInput = {\n documentId: context.documentId,\n documentType: context.documentType,\n scope: context.scope,\n branch: context.branch,\n state: context.resultingState\n ? JSON.parse(context.resultingState)\n : undefined,\n };\n\n const shouldProcess = generator.shouldProcess(input);\n if (shouldProcess) {\n await this.manager.routeAndGenerate(input);\n }\n }\n }\n\n async onDisconnect() {}\n\n // Utility methods for external configuration and monitoring\n public setInteractiveMode(enabled: boolean): void {\n this.manager.setInteractiveMode(enabled);\n }\n\n public isInteractive(): boolean {\n return this.manager.isInteractiveMode();\n }\n\n public isProcessingInteractive(): boolean {\n return this.manager.isProcessingInteractive();\n }\n}\n","import { buildTsMorphProject } from \"@powerhousedao/codegen/utils\";\nimport type { VetraProcessorConfigType } from \"@powerhousedao/config\";\nimport { VETRA_PROCESSOR_CONFIG_KEY } from \"@powerhousedao/config\";\nimport { getConfig } from \"@powerhousedao/config/node\";\nimport type {\n IProcessorHostModule,\n ProcessorFactoryBuilder,\n ProcessorRecord,\n} from \"@powerhousedao/reactor-browser\";\nimport type { PHDocumentHeader } from \"@powerhousedao/shared/document-model\";\nimport { logger } from \"./logger.js\";\nimport { CodegenProcessor } from \"./processor.js\";\n\n/**\n * Determines if a drive header matches the Vetra drive criteria.\n * @param driveHeader - The drive header to check\n * @param explicitDriveId - Optional explicit drive ID from config (if set, uses exact match)\n * @returns true if the drive is a Vetra drive, false otherwise\n */\nfunction isDriveVetra(\n driveHeader: PHDocumentHeader,\n driveIdFromConfig?: string,\n): boolean {\n // If explicit drive ID is configured, use exact match\n if (driveIdFromConfig) {\n return (\n driveHeader.slug === driveIdFromConfig ||\n driveHeader.id === driveIdFromConfig\n );\n }\n\n // Otherwise, check if slug/id matches Vetra pattern\n // Matches \"vetra\" exactly or IDs starting with \"vetra-\" (case-insensitive)\n const matchesPattern = (identifier: string): boolean => {\n const lower = identifier.toLowerCase();\n return lower === \"vetra\" || lower.startsWith(\"vetra-\");\n };\n\n return matchesPattern(driveHeader.slug) || matchesPattern(driveHeader.id);\n}\n\nexport const codegenFactoryBuilder: ProcessorFactoryBuilder = (\n module: IProcessorHostModule,\n) => {\n return (driveHeader: PHDocumentHeader): ProcessorRecord[] => {\n const config = getConfig();\n const cwd = process.cwd();\n /* Use one instance of ts-morph project, which handles race conditions */\n const project = buildTsMorphProject(cwd);\n const processorsConfig = module.config ?? new Map<string, unknown>();\n const vetraConfig = processorsConfig.get(VETRA_PROCESSOR_CONFIG_KEY) as\n | VetraProcessorConfigType\n | undefined;\n\n // Check if this drive should use the Vetra processor\n if (!isDriveVetra(driveHeader, vetraConfig?.driveId)) {\n logger.debug(\n `Drive ${driveHeader.slug} is not a Vetra drive, skipping codegen processor`,\n );\n return [];\n }\n\n logger.info(\n `Drive ${driveHeader.slug} is a Vetra drive, using codegen processor`,\n );\n const processor = new CodegenProcessor(\n project,\n config,\n cwd,\n vetraConfig?.interactive,\n );\n return [\n {\n processor,\n filter: {\n branch: [\"main\"],\n documentId: [\"*\"],\n documentType: [\n \"powerhouse/document-model\",\n \"powerhouse/package\",\n \"powerhouse/document-editor\",\n \"powerhouse/subgraph\",\n \"powerhouse/processor\",\n \"powerhouse/app\",\n ],\n scope: [\"global\"],\n },\n },\n ];\n };\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks-
|
|
1
|
+
{"version":3,"file":"hooks-Btogj1f0.js","names":[],"sources":["../editors/hooks/useAvailableDocumentTypes.ts","../editors/hooks/useDebounce.ts"],"sourcesContent":["import {\n useDocumentsInSelectedDrive,\n useSupportedDocumentTypesInReactor,\n} from \"@powerhousedao/reactor-browser\";\nimport type {\n DocumentModelDocument,\n PHDocument,\n} from \"@powerhousedao/shared/document-model\";\n\nfunction isDocumentModelDocument(\n document: PHDocument,\n): document is DocumentModelDocument {\n return document.header.documentType === \"powerhouse/document-model\";\n}\n\nexport function useAvailableDocumentTypes(\n onlyDocumentTypesFromDriveDocuments = false,\n): string[] {\n const supportedDocumentTypes = useSupportedDocumentTypesInReactor() ?? [];\n const documents = useDocumentsInSelectedDrive() ?? [];\n const documentModelDocumentsInSelectedDrive = documents.filter(\n isDocumentModelDocument,\n );\n const documentTypesFromDocumentModelDocuments =\n documentModelDocumentsInSelectedDrive.map((doc) => doc.state.global.id);\n\n if (onlyDocumentTypesFromDriveDocuments)\n return [...new Set(documentTypesFromDocumentModelDocuments)];\n\n return [\n ...new Set([\n ...supportedDocumentTypes,\n ...documentTypesFromDocumentModelDocuments,\n ]),\n ];\n}\n","import { useEffect } from \"react\";\n\n/**\n * Reusable debounce hook that calls a callback function after a specified delay\n * when the value changes. Useful for API calls, search inputs, etc.\n *\n * @param value - The value to debounce\n * @param callback - Function to call with the debounced value (optional)\n * @param delay - Delay in milliseconds\n */\nexport function useDebounce<T>(\n value: T,\n callback: ((value: T) => void) | undefined,\n delay: number,\n) {\n useEffect(() => {\n if (!callback) return;\n\n const timer = setTimeout(() => {\n callback(value);\n }, delay);\n\n return () => clearTimeout(timer);\n }, [value, callback, delay]);\n}\n"],"mappings":";;;AASA,SAAS,wBACP,UACmC;AACnC,QAAO,SAAS,OAAO,iBAAiB;;AAG1C,SAAgB,0BACd,sCAAsC,OAC5B;CACV,MAAM,yBAAyB,oCAAoC,IAAI,EAAE;CAKzE,MAAM,2CAJY,6BAA6B,IAAI,EAAE,EACG,OACtD,wBACD,CAEuC,KAAK,QAAQ,IAAI,MAAM,OAAO,GAAG;AAEzE,KAAI,oCACF,QAAO,CAAC,GAAG,IAAI,IAAI,wCAAwC,CAAC;AAE9D,QAAO,CACL,GAAG,IAAI,IAAI,CACT,GAAG,wBACH,GAAG,wCACJ,CAAC,CACH;;;;;;;;;;;;ACxBH,SAAgB,YACd,OACA,UACA,OACA;AACA,iBAAgB;AACd,MAAI,CAAC,SAAU;EAEf,MAAM,QAAQ,iBAAiB;AAC7B,YAAS,MAAM;KACd,MAAM;AAET,eAAa,aAAa,MAAM;IAC/B;EAAC;EAAO;EAAU;EAAM,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import { t as DocumentEditor } from "./module-DP3bVbak.js";
|
|
|
4
4
|
import { t as ProcessorModule } from "./module-mtR8W4L4.js";
|
|
5
5
|
import { t as SubgraphModule } from "./module-C0jUPu9F.js";
|
|
6
6
|
import { t as VetraPackage } from "./module-1hr_ne9w.js";
|
|
7
|
-
import { a as DocumentEditorEditor, i as ProcessorModuleEditor, n as VetraDriveApp, o as AppEditor, r as SubgraphModuleEditor, t as VetraPackageEditor } from "./module-
|
|
7
|
+
import { a as DocumentEditorEditor, i as ProcessorModuleEditor, n as VetraDriveApp, o as AppEditor, r as SubgraphModuleEditor, t as VetraPackageEditor } from "./module-BTlKlxoV.js";
|
|
8
8
|
//#region document-models/document-models.ts
|
|
9
9
|
/**
|
|
10
10
|
* WARNING: DO NOT EDIT
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger-
|
|
1
|
+
{"version":3,"file":"logger-CYkStoEb.js","names":[],"sources":["../processors/codegen/logger.ts"],"sourcesContent":["import { childLogger } from \"document-model\";\n\nconst baseLogger = childLogger([\"Vetra\"]);\n\nfunction formatArgs(args: unknown[]): string {\n return args\n .map((arg) => {\n if (typeof arg === \"string\") return arg;\n if (arg instanceof Error) return arg.message;\n if (arg != null && typeof arg === \"object\") return JSON.stringify(arg);\n return `${arg as string | number | boolean}`;\n })\n .join(\" \");\n}\n\nexport const logger = {\n debug: (...args: unknown[]): void => baseLogger.debug(formatArgs(args)),\n info: (...args: unknown[]): void => baseLogger.info(formatArgs(args)),\n warn: (...args: unknown[]): void => baseLogger.warn(formatArgs(args)),\n error: (...args: unknown[]): void => baseLogger.error(formatArgs(args)),\n};\n"],"mappings":";;AAEA,MAAM,aAAa,YAAY,CAAC,QAAQ,CAAC;AAEzC,SAAS,WAAW,MAAyB;AAC3C,QAAO,KACJ,KAAK,QAAQ;AACZ,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,MAAI,eAAe,MAAO,QAAO,IAAI;AACrC,MAAI,OAAO,QAAQ,OAAO,QAAQ,SAAU,QAAO,KAAK,UAAU,IAAI;AACtE,SAAO,GAAG;GACV,CACD,KAAK,IAAI;;AAGd,MAAa,SAAS;CACpB,QAAQ,GAAG,SAA0B,WAAW,MAAM,WAAW,KAAK,CAAC;CACvE,OAAO,GAAG,SAA0B,WAAW,KAAK,WAAW,KAAK,CAAC;CACrE,OAAO,GAAG,SAA0B,WAAW,KAAK,WAAW,KAAK,CAAC;CACrE,QAAQ,GAAG,SAA0B,WAAW,MAAM,WAAW,KAAK,CAAC;CACxE"}
|
|
@@ -2,7 +2,7 @@ import { lazy } from "react";
|
|
|
2
2
|
//#region editors/app-editor/module.ts
|
|
3
3
|
/** Document editor module for the "powerhouse/app" document type */
|
|
4
4
|
const AppEditor = {
|
|
5
|
-
Component: lazy(() => import("./editor-
|
|
5
|
+
Component: lazy(() => import("./editor-BQxk6LrL.js")),
|
|
6
6
|
documentTypes: ["powerhouse/app"],
|
|
7
7
|
config: {
|
|
8
8
|
id: "app-editor",
|
|
@@ -13,7 +13,7 @@ const AppEditor = {
|
|
|
13
13
|
//#region editors/document-editor/module.ts
|
|
14
14
|
/** Document editor module for the "powerhouse/document-editor" document type */
|
|
15
15
|
const DocumentEditorEditor = {
|
|
16
|
-
Component: lazy(() => import("./editor-
|
|
16
|
+
Component: lazy(() => import("./editor-UWE1ab9Y.js")),
|
|
17
17
|
documentTypes: ["powerhouse/document-editor"],
|
|
18
18
|
config: {
|
|
19
19
|
id: "document-editor-editor",
|
|
@@ -24,7 +24,7 @@ const DocumentEditorEditor = {
|
|
|
24
24
|
//#region editors/processor-editor/module.ts
|
|
25
25
|
/** Document editor module for the "powerhouse/processor" document type */
|
|
26
26
|
const ProcessorModuleEditor = {
|
|
27
|
-
Component: lazy(() => import("./editor-
|
|
27
|
+
Component: lazy(() => import("./editor-Dw-NohMb.js")),
|
|
28
28
|
documentTypes: ["powerhouse/processor"],
|
|
29
29
|
config: {
|
|
30
30
|
id: "processor-module-editor",
|
|
@@ -35,7 +35,7 @@ const ProcessorModuleEditor = {
|
|
|
35
35
|
//#region editors/subgraph-editor/module.ts
|
|
36
36
|
/** Document editor module for the "powerhouse/subgraph" document type */
|
|
37
37
|
const SubgraphModuleEditor = {
|
|
38
|
-
Component: lazy(() => import("./editor-
|
|
38
|
+
Component: lazy(() => import("./editor-ClvvgHg3.js")),
|
|
39
39
|
documentTypes: ["powerhouse/subgraph"],
|
|
40
40
|
config: {
|
|
41
41
|
id: "subgraph-module-editor",
|
|
@@ -56,7 +56,7 @@ const VetraDriveApp = {
|
|
|
56
56
|
//#region editors/vetra-package/module.ts
|
|
57
57
|
/** Document editor module for the "powerhouse/package" document type */
|
|
58
58
|
const VetraPackageEditor = {
|
|
59
|
-
Component: lazy(() => import("./editor-
|
|
59
|
+
Component: lazy(() => import("./editor-DLluDQKM.js")),
|
|
60
60
|
documentTypes: ["powerhouse/package"],
|
|
61
61
|
config: {
|
|
62
62
|
id: "vetra-package-editor",
|
|
@@ -66,4 +66,4 @@ const VetraPackageEditor = {
|
|
|
66
66
|
//#endregion
|
|
67
67
|
export { DocumentEditorEditor as a, ProcessorModuleEditor as i, VetraDriveApp as n, AppEditor as o, SubgraphModuleEditor as r, VetraPackageEditor as t };
|
|
68
68
|
|
|
69
|
-
//# sourceMappingURL=module-
|
|
69
|
+
//# sourceMappingURL=module-BTlKlxoV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-
|
|
1
|
+
{"version":3,"file":"module-BTlKlxoV.js","names":[],"sources":["../editors/app-editor/module.ts","../editors/document-editor/module.ts","../editors/processor-editor/module.ts","../editors/subgraph-editor/module.ts","../editors/vetra-drive-app/module.ts","../editors/vetra-package/module.ts"],"sourcesContent":["/**\n * WARNING: DO NOT EDIT\n * This file is auto-generated and updated by codegen\n */\nimport type { EditorModule } from \"document-model\";\nimport { lazy } from \"react\";\n\n/** Document editor module for the \"powerhouse/app\" document type */\nexport const AppEditor: EditorModule = {\n Component: lazy(() => import(\"./editor.js\")),\n documentTypes: [\"powerhouse/app\"],\n config: {\n id: \"app-editor\",\n name: \"AppEditor\",\n },\n};\n","/**\n * WARNING: DO NOT EDIT\n * This file is auto-generated and updated by codegen\n */\nimport type { EditorModule } from \"document-model\";\nimport { lazy } from \"react\";\n\n/** Document editor module for the \"powerhouse/document-editor\" document type */\nexport const DocumentEditorEditor: EditorModule = {\n Component: lazy(() => import(\"./editor.js\")),\n documentTypes: [\"powerhouse/document-editor\"],\n config: {\n id: \"document-editor-editor\",\n name: \"Document Editor Editor\",\n },\n};\n","/**\n * WARNING: DO NOT EDIT\n * This file is auto-generated and updated by codegen\n */\nimport type { EditorModule } from \"document-model\";\nimport { lazy } from \"react\";\n\n/** Document editor module for the \"powerhouse/processor\" document type */\nexport const ProcessorModuleEditor: EditorModule = {\n Component: lazy(() => import(\"./editor.js\")),\n documentTypes: [\"powerhouse/processor\"],\n config: {\n id: \"processor-module-editor\",\n name: \"Processor Module Editor\",\n },\n};\n","/**\n * WARNING: DO NOT EDIT\n * This file is auto-generated and updated by codegen\n */\nimport type { EditorModule } from \"document-model\";\nimport { lazy } from \"react\";\n\n/** Document editor module for the \"powerhouse/subgraph\" document type */\nexport const SubgraphModuleEditor: EditorModule = {\n Component: lazy(() => import(\"./editor.js\")),\n documentTypes: [\"powerhouse/subgraph\"],\n config: {\n id: \"subgraph-module-editor\",\n name: \"Subgraph Module Editor\",\n },\n};\n","import type { EditorModule } from \"@powerhousedao/shared/document-model\";\nimport { lazy } from \"react\";\n\nexport const VetraDriveApp: EditorModule = {\n Component: lazy(() => import(\"./editor.js\")),\n documentTypes: [\"powerhouse/document-drive\"],\n config: {\n id: \"vetra-drive-app\",\n name: \"Vetra Drive App\",\n },\n};\n","/**\n * WARNING: DO NOT EDIT\n * This file is auto-generated and updated by codegen\n */\nimport type { EditorModule } from \"document-model\";\nimport { lazy } from \"react\";\n\n/** Document editor module for the \"powerhouse/package\" document type */\nexport const VetraPackageEditor: EditorModule = {\n Component: lazy(() => import(\"./editor.js\")),\n documentTypes: [\"powerhouse/package\"],\n config: {\n id: \"vetra-package-editor\",\n name: \"Vetra Package Editor\",\n },\n};\n"],"mappings":";;;AAQA,MAAa,YAA0B;CACrC,WAAW,WAAW,OAAO,wBAAe;CAC5C,eAAe,CAAC,iBAAiB;CACjC,QAAQ;EACN,IAAI;EACJ,MAAM;EACP;CACF;;;;ACPD,MAAa,uBAAqC;CAChD,WAAW,WAAW,OAAO,wBAAe;CAC5C,eAAe,CAAC,6BAA6B;CAC7C,QAAQ;EACN,IAAI;EACJ,MAAM;EACP;CACF;;;;ACPD,MAAa,wBAAsC;CACjD,WAAW,WAAW,OAAO,wBAAe;CAC5C,eAAe,CAAC,uBAAuB;CACvC,QAAQ;EACN,IAAI;EACJ,MAAM;EACP;CACF;;;;ACPD,MAAa,uBAAqC;CAChD,WAAW,WAAW,OAAO,wBAAe;CAC5C,eAAe,CAAC,sBAAsB;CACtC,QAAQ;EACN,IAAI;EACJ,MAAM;EACP;CACF;;;ACZD,MAAa,gBAA8B;CACzC,WAAW,WAAW,OAAO,wBAAe;CAC5C,eAAe,CAAC,4BAA4B;CAC5C,QAAQ;EACN,IAAI;EACJ,MAAM;EACP;CACF;;;;ACFD,MAAa,qBAAmC;CAC9C,WAAW,WAAW,OAAO,wBAAe;CAC5C,eAAe,CAAC,qBAAqB;CACrC,QAAQ;EACN,IAAI;EACJ,MAAM;EACP;CACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as CodegenProcessor, t as codegenFactoryBuilder } from "../../factory-
|
|
1
|
+
import { n as CodegenProcessor, t as codegenFactoryBuilder } from "../../factory-Dexxeo5C.js";
|
|
2
2
|
export { CodegenProcessor, codegenFactoryBuilder };
|
package/dist/processors/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region processors/factory.ts
|
|
2
2
|
const processorFactory = async (module) => {
|
|
3
|
-
const { processorFactoryBuilders } = module.processorApp === "connect" ? await import("../connect-BRlVKs1s.js") : await import("../switchboard-
|
|
3
|
+
const { processorFactoryBuilders } = module.processorApp === "connect" ? await import("../connect-BRlVKs1s.js") : await import("../switchboard-C2L9IAfe.js");
|
|
4
4
|
const factories = await Promise.all(processorFactoryBuilders.map(async (buildFactory) => await buildFactory(module)));
|
|
5
5
|
return async (driveHeader) => {
|
|
6
6
|
const processors = [];
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as VetraReadModelProcessor, t as vetraReadModelFactoryBuilder } from "../../factory-
|
|
1
|
+
import { n as VetraReadModelProcessor, t as vetraReadModelFactoryBuilder } from "../../factory-4o53XqHE.js";
|
|
2
2
|
export { VetraReadModelProcessor, vetraReadModelFactoryBuilder };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { t as codegenFactoryBuilder } from "./factory-Dexxeo5C.js";
|
|
2
|
+
import { t as vetraReadModelFactoryBuilder } from "./factory-4o53XqHE.js";
|
|
3
|
+
//#region processors/switchboard.ts
|
|
4
|
+
const processorFactoryBuilders = [vetraReadModelFactoryBuilder, codegenFactoryBuilder];
|
|
5
|
+
//#endregion
|
|
6
|
+
export { processorFactoryBuilders };
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=switchboard-C2L9IAfe.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"switchboard-
|
|
1
|
+
{"version":3,"file":"switchboard-C2L9IAfe.js","names":[],"sources":["../processors/switchboard.ts"],"sourcesContent":["/**\n * WARNING: DO NOT EDIT\n * This file is auto-generated and updated by codegen\n */\nimport type { ProcessorFactoryBuilder } from \"@powerhousedao/reactor-browser\";\nimport { codegenFactoryBuilder } from \"./codegen/factory.js\";\nimport { vetraReadModelFactoryBuilder } from \"./vetra-read-model/factory.js\";\n\nexport const processorFactoryBuilders: ProcessorFactoryBuilder[] = [\n vetraReadModelFactoryBuilder,\n codegenFactoryBuilder,\n];\n"],"mappings":";;;AAQA,MAAa,2BAAsD,CACjE,8BACA,sBACD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powerhousedao/vetra",
|
|
3
|
-
"version": "6.1.0-dev.
|
|
3
|
+
"version": "6.1.0-dev.19",
|
|
4
4
|
"license": "AGPL-3.0-only",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -59,12 +59,12 @@
|
|
|
59
59
|
"react": "19.2.6",
|
|
60
60
|
"zod": "4.3.6",
|
|
61
61
|
"tailwind-merge": "3.4.0",
|
|
62
|
-
"@powerhousedao/codegen": "6.1.0-dev.
|
|
63
|
-
"@powerhousedao/
|
|
64
|
-
"@powerhousedao/
|
|
65
|
-
"@powerhousedao/
|
|
66
|
-
"@powerhousedao/reactor-browser": "6.1.0-dev.
|
|
67
|
-
"document-model": "6.1.0-dev.
|
|
62
|
+
"@powerhousedao/codegen": "6.1.0-dev.19",
|
|
63
|
+
"@powerhousedao/design-system": "6.1.0-dev.19",
|
|
64
|
+
"@powerhousedao/config": "6.1.0-dev.19",
|
|
65
|
+
"@powerhousedao/shared": "6.1.0-dev.19",
|
|
66
|
+
"@powerhousedao/reactor-browser": "6.1.0-dev.19",
|
|
67
|
+
"document-model": "6.1.0-dev.19"
|
|
68
68
|
},
|
|
69
69
|
"devDependencies": {
|
|
70
70
|
"@tailwindcss/cli": "4.2.2",
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
"vite": "8.0.8",
|
|
84
84
|
"vite-tsconfig-paths": "6.1.1",
|
|
85
85
|
"vitest": "4.1.1",
|
|
86
|
-
"@powerhousedao/builder-tools": "6.1.0-dev.
|
|
86
|
+
"@powerhousedao/builder-tools": "6.1.0-dev.19"
|
|
87
87
|
},
|
|
88
88
|
"description": "",
|
|
89
89
|
"scripts": {
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { t as codegenFactoryBuilder } from "./factory-DYahTvFP.js";
|
|
2
|
-
import { t as vetraReadModelFactoryBuilder } from "./factory-BxLD9mLU.js";
|
|
3
|
-
//#region processors/switchboard.ts
|
|
4
|
-
const processorFactoryBuilders = [vetraReadModelFactoryBuilder, codegenFactoryBuilder];
|
|
5
|
-
//#endregion
|
|
6
|
-
export { processorFactoryBuilders };
|
|
7
|
-
|
|
8
|
-
//# sourceMappingURL=switchboard-DWB0JsMt.js.map
|