@seedprotocol/sdk 0.4.5 → 0.4.6
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/{ArweaveClient-CgWK-JgT.js → ArweaveClient-Caio37h1.js} +3 -3
- package/dist/ArweaveClient-Caio37h1.js.map +1 -0
- package/dist/{ArweaveClient-WcG8CZAE.js → ArweaveClient-DLKAaS3K.js} +3 -3
- package/dist/ArweaveClient-DLKAaS3K.js.map +1 -0
- package/dist/{Db-DjFdIdR9.js → Db-C9fppVRl.js} +3 -3
- package/dist/Db-C9fppVRl.js.map +1 -0
- package/dist/{Db-DjofXdeU.js → Db-DJAG-5Di.js} +7 -5
- package/dist/Db-DJAG-5Di.js.map +1 -0
- package/dist/{EasClient-Aojewp6P.js → EasClient-DQGAIj-b.js} +2 -2
- package/dist/EasClient-DQGAIj-b.js.map +1 -0
- package/dist/{EasClient-BVFXp2O6.js → EasClient-T7Nx9185.js} +2 -2
- package/dist/EasClient-T7Nx9185.js.map +1 -0
- package/dist/{FileManager-C9zr4AJe.js → FileManager-BohtoKYo.js} +4 -3
- package/dist/FileManager-BohtoKYo.js.map +1 -0
- package/dist/{FileManager-CxGJLw5C.js → FileManager-d64CkqXy.js} +2 -2
- package/dist/FileManager-d64CkqXy.js.map +1 -0
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/service/actors/fetchDataFromEas.d.ts.map +1 -1
- package/dist/Item/service/actors/loadOrCreateItem.d.ts.map +1 -1
- package/dist/Item/service/actors/runPublish.d.ts.map +1 -1
- package/dist/ItemProperty/ItemProperty.d.ts.map +1 -1
- package/dist/ItemProperty/service/actors/hydrateFromDb.d.ts.map +1 -1
- package/dist/ItemProperty/service/actors/resolveRelatedValue.d.ts.map +1 -1
- package/dist/ItemProperty/service/actors/saveValueToDb/analyzeInput.d.ts.map +1 -1
- package/dist/ItemProperty/service/actors/saveValueToDb/saveRelation.d.ts.map +1 -1
- package/dist/Model/Model.d.ts.map +1 -1
- package/dist/Model/service/actors/createModelProperties.d.ts.map +1 -1
- package/dist/Model/service/actors/loadOrCreateModel.d.ts.map +1 -1
- package/dist/Model/service/actors/validateModel.d.ts.map +1 -1
- package/dist/ModelProperty/service/actors/compareAndMarkDraft.d.ts.map +1 -1
- package/dist/ModelProperty/service/actors/saveToSchema.d.ts.map +1 -1
- package/dist/ModelProperty/service/actors/validateProperty.d.ts.map +1 -1
- package/dist/{ModelProperty-CGdkocQ8.js → ModelProperty-Cpd9xiIM.js} +52 -18
- package/dist/ModelProperty-Cpd9xiIM.js.map +1 -0
- package/dist/{PathResolver-CX6GHoTS.js → PathResolver-CLZUWoX2.js} +2 -2
- package/dist/PathResolver-CLZUWoX2.js.map +1 -0
- package/dist/{PathResolver-z_WX47_o.js → PathResolver-D6M0rzKV.js} +2 -2
- package/dist/PathResolver-D6M0rzKV.js.map +1 -0
- package/dist/{QueryClient-ByKPdRmE.js → QueryClient-BUoz2Vb0.js} +2 -2
- package/dist/QueryClient-BUoz2Vb0.js.map +1 -0
- package/dist/{QueryClient-Cb1iJO-x.js → QueryClient-COQ_Rs4-.js} +2 -2
- package/dist/QueryClient-COQ_Rs4-.js.map +1 -0
- package/dist/Schema/Schema.d.ts.map +1 -1
- package/dist/Schema/service/actors/createModelInstances.d.ts.map +1 -1
- package/dist/Schema/service/actors/loadOrCreateSchema.d.ts.map +1 -1
- package/dist/Schema/service/actors/verifyModelInstancesInCache.d.ts.map +1 -1
- package/dist/Schema/service/actors/writePropertiesToDb.d.ts.map +1 -1
- package/dist/Schema/service/addModelsMachine.d.ts.map +1 -1
- package/dist/{Schema-D1eqDHyt.js → Schema-BZKBy5Tx.js} +63 -24
- package/dist/Schema-BZKBy5Tx.js.map +1 -0
- package/dist/{SchemaValidationService-DyttFaV_.js → SchemaValidationService-F8No7BHp.js} +2 -2
- package/dist/SchemaValidationService-F8No7BHp.js.map +1 -0
- package/dist/browser/helpers/FileManager.d.ts.map +1 -1
- package/dist/browser/react/itemProperty.d.ts.map +1 -1
- package/dist/cjs/{ModelProperty-BeJvgKMw.js → ModelProperty-B4pV91tc.js} +32 -18
- package/dist/cjs/ModelProperty-B4pV91tc.js.map +1 -0
- package/dist/cjs/{Schema-CVs9J6eP.js → Schema-TErl3J36.js} +33 -24
- package/dist/cjs/Schema-TErl3J36.js.map +1 -0
- package/dist/cjs/{SchemaValidationService-CDKcVRFQ.js → SchemaValidationService-p5BbJV9T.js} +2 -2
- package/dist/cjs/{SchemaValidationService-CDKcVRFQ.js.map → SchemaValidationService-p5BbJV9T.js.map} +1 -1
- package/dist/cjs/{getItem-B5RYPvrG.js → getItem-BrnLfC12.js} +2 -2
- package/dist/cjs/{getItem-B5RYPvrG.js.map → getItem-BrnLfC12.js.map} +1 -1
- package/dist/cjs/{getPublishPayload-BD1qRob1.js → getPublishPayload-BcjCN_bD.js} +7 -5
- package/dist/cjs/getPublishPayload-BcjCN_bD.js.map +1 -0
- package/dist/cjs/{getPublishUploads-CnC9aYxs.js → getPublishUploads-5_oXzwol.js} +3 -3
- package/dist/cjs/{getPublishUploads-CnC9aYxs.js.map → getPublishUploads-5_oXzwol.js.map} +1 -1
- package/dist/cjs/{getSegmentedItemProperties-B_njnntx.js → getSegmentedItemProperties-WFdizUDv.js} +2 -2
- package/dist/cjs/{getSegmentedItemProperties-B_njnntx.js.map → getSegmentedItemProperties-WFdizUDv.js.map} +1 -1
- package/dist/cjs/{index-Dnywap_P.js → index-BrmvhXsG.js} +2 -2
- package/dist/cjs/index-BrmvhXsG.js.map +1 -0
- package/dist/cjs/{index-BeKPbbk0.js → index-CXI4VF1H.js} +330 -88
- package/dist/cjs/index-CXI4VF1H.js.map +1 -0
- package/dist/db/read/getModelSchemas.d.ts.map +1 -1
- package/dist/db/read/getPublishPayload.d.ts.map +1 -1
- package/dist/db/write/createNewItem.d.ts.map +1 -1
- package/dist/eas.d.ts.map +1 -1
- package/dist/events/files/download.d.ts.map +1 -1
- package/dist/events/item/syncDbWithEas.d.ts.map +1 -1
- package/dist/{getItem-BB5HBCbK.js → getItem-DaQVdeae.js} +2 -2
- package/dist/getItem-DaQVdeae.js.map +1 -0
- package/dist/{getPublishPayload-uLm0AqN_.js → getPublishPayload-CWiLI1yd.js} +7 -5
- package/dist/getPublishPayload-CWiLI1yd.js.map +1 -0
- package/dist/{getPublishUploads-Dc-HqhO8.js → getPublishUploads-DhvcKD_9.js} +3 -3
- package/dist/getPublishUploads-DhvcKD_9.js.map +1 -0
- package/dist/{getSegmentedItemProperties-BrIqFNfD.js → getSegmentedItemProperties-Cp4kcWIF.js} +2 -2
- package/dist/getSegmentedItemProperties-Cp4kcWIF.js.map +1 -0
- package/dist/helpers/db.d.ts.map +1 -1
- package/dist/helpers/property.d.ts.map +1 -1
- package/dist/helpers/updateSchema.d.ts.map +1 -1
- package/dist/imports/json.d.ts.map +1 -1
- package/dist/{index-2FcQHgKp.js → index-DBy53qbb.js} +2 -2
- package/dist/index-DBy53qbb.js.map +1 -0
- package/dist/{index-DPll6EAp.js → index-Dk73a7JE.js} +343 -97
- package/dist/index-Dk73a7JE.js.map +1 -0
- package/dist/{index-LEY0Og1p.js → index-LfXKx_PE.js} +3 -3
- package/dist/index-LfXKx_PE.js.map +1 -0
- package/dist/main.cjs +1 -1
- package/dist/main.js +11 -8
- package/dist/main.js.map +1 -1
- package/dist/node/db/Db.d.ts.map +1 -1
- package/dist/node.js +10 -10
- package/dist/node.js.map +1 -1
- package/dist/{property-B15X7jLX.js → property-1o2MvYTm.js} +10 -4
- package/dist/property-1o2MvYTm.js.map +1 -0
- package/dist/{queries-BPDSpiEX.js → queries-DA4G0iEN.js} +2 -2
- package/dist/queries-DA4G0iEN.js.map +1 -0
- package/dist/services/publish/actors/preparePublishRequestData.d.ts.map +1 -1
- package/dist/services/publish/actors/upload.d.ts.map +1 -1
- package/dist/services/write/actors/validateEntity.d.ts.map +1 -1
- package/dist/vite.js.map +1 -1
- package/package.json +3 -3
- package/dist/ArweaveClient-CgWK-JgT.js.map +0 -1
- package/dist/ArweaveClient-WcG8CZAE.js.map +0 -1
- package/dist/Db-DjFdIdR9.js.map +0 -1
- package/dist/Db-DjofXdeU.js.map +0 -1
- package/dist/EasClient-Aojewp6P.js.map +0 -1
- package/dist/EasClient-BVFXp2O6.js.map +0 -1
- package/dist/FileManager-C9zr4AJe.js.map +0 -1
- package/dist/FileManager-CxGJLw5C.js.map +0 -1
- package/dist/ModelProperty-CGdkocQ8.js.map +0 -1
- package/dist/PathResolver-CX6GHoTS.js.map +0 -1
- package/dist/PathResolver-z_WX47_o.js.map +0 -1
- package/dist/QueryClient-ByKPdRmE.js.map +0 -1
- package/dist/QueryClient-Cb1iJO-x.js.map +0 -1
- package/dist/Schema-D1eqDHyt.js.map +0 -1
- package/dist/SchemaValidationService-DyttFaV_.js.map +0 -1
- package/dist/cjs/ModelProperty-BeJvgKMw.js.map +0 -1
- package/dist/cjs/Schema-CVs9J6eP.js.map +0 -1
- package/dist/cjs/getPublishPayload-BD1qRob1.js.map +0 -1
- package/dist/cjs/index-BeKPbbk0.js.map +0 -1
- package/dist/cjs/index-Dnywap_P.js.map +0 -1
- package/dist/getItem-BB5HBCbK.js.map +0 -1
- package/dist/getPublishPayload-uLm0AqN_.js.map +0 -1
- package/dist/getPublishUploads-Dc-HqhO8.js.map +0 -1
- package/dist/getSegmentedItemProperties-BrIqFNfD.js.map +0 -1
- package/dist/index-2FcQHgKp.js.map +0 -1
- package/dist/index-DPll6EAp.js.map +0 -1
- package/dist/index-LEY0Og1p.js.map +0 -1
- package/dist/property-B15X7jLX.js.map +0 -1
- package/dist/queries-BPDSpiEX.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FileManager-C9zr4AJe.js","sources":["../src/browser/workers/filesDownload.ts","../src/browser/workers/FileDownloader.ts","../src/browser/workers/imageResize.ts","../src/browser/workers/ImageResizer.ts","../src/browser/helpers/FileManager.ts"],"sourcesContent":["export default `(\n ${\n function () {\n\nconst identifyString = (str: string) => {\n try {\n JSON.parse(str)\n return 'json'\n } catch (e) {\n // Not JSON\n }\n\n if (!str) {\n return\n }\n\n if (str.trim().startsWith('<') && str.trim().endsWith('>')) {\n return 'html'\n }\n\n // Simple markdown checks (very naive)\n if (/^#{1,6}\\s|^-{3,}|\\*{3,}|^-{1,2}\\s|\\*\\s/.test(str)) {\n return 'markdown'\n }\n\n if (/^data:image\\/[a-zA-Z]+;base64,[A-Za-z0-9+/]+={0,2}$/.test(str)) {\n return 'base64'\n }\n\n // Default to plain text if unsure\n return 'text'\n}\n\nconst getMimeType = (base64: string) => {\n if (!base64) {\n return null\n }\n const result = base64.match(/^data:([a-zA-Z0-9]+\\/[a-zA-Z0-9-.+]+).*,/)\n\n if (result && result.length > 1) {\n return result[1]\n } else {\n return null // MIME type could not be determined\n }\n}\n\nconst getDataTypeFromString = (\n data: string,\n): 'imageBase64' | 'base64' | 'url' | null => {\n const nonImageBase64Regex =\n /^(?!data:image\\/(?:jpeg|png|gif|bmp|webp);base64,)[A-Za-z0-9+/=]+$/\n\n if (nonImageBase64Regex.test(data)) {\n return 'base64'\n }\n\n // Regular expression for base64 (simple version, checking for base64 format)\n const imageBase64Regex = /^data:image\\/[a-zA-Z]+;base64,[A-Za-z0-9+/]+={0,2}$/\n\n if (imageBase64Regex.test(data)) {\n return 'imageBase64'\n }\n\n // Regular expression for URL (simple version, checking for common URL format)\n const urlRegex =\n /^(http:\\/\\/www\\.|https:\\/\\/www\\.|http:\\/\\/|https:\\/\\/)?[a-z0-9]+([\\-\\.]{1}[a-z0-9]+)*\\.[a-z]{2,5}(:[0-9]{1,5})?(\\/.*)?$/\n\n if (urlRegex.test(data)) {\n return 'url'\n }\n\n return null\n}\n\nconst isBinary = (arrayBuffer: ArrayBuffer): boolean => {\n const view = new Uint8Array(arrayBuffer);\n\n let nonTextCount = 0;\n const threshold = 0.2; // Adjust as needed (e.g., 20% non-text implies binary)\n\n for (let i = 0; i < view.length; i++) {\n const byte = view[i];\n\n // ASCII printable characters (32-126) and common whitespace (9, 10, 13)\n if (\n (byte >= 32 && byte <= 126) || // Printable ASCII\n byte === 9 || byte === 10 || byte === 13 // Tab, LF, CR\n ) {\n continue;\n }\n\n nonTextCount++;\n if (nonTextCount / view.length > threshold) {\n return true; // More than threshold are non-text bytes\n }\n }\n\n return false; // Fewer than threshold are non-text bytes\n}\n\nconst saveBufferToOPFS = async (filePath: string, buffer: Uint8Array): Promise<void> => {\n // Access the OPFS root directory\n const rootHandle = await navigator.storage.getDirectory();\n\n // Split the filePath into directory segments and file name\n const segments = filePath.split('/').filter(Boolean);\n const fileName = segments.pop(); // Extract the file name\n if (!fileName) {\n throw new Error('Invalid file path: No file name provided.');\n }\n\n // Traverse or create directories as needed\n let currentDirHandle = rootHandle;\n for (const segment of segments) {\n currentDirHandle = await currentDirHandle.getDirectoryHandle(segment, { create: true });\n }\n\n // Create or open the file in OPFS\n const fileHandleAsync = await currentDirHandle.getFileHandle(fileName, { create: true });\n const fileHandle = await fileHandleAsync.createSyncAccessHandle();\n // Write the buffer to the file\n fileHandle.write(buffer);\n fileHandle.flush();\n fileHandle.close();\n}\n\nconst downloadFiles = async ({\n transactionIds,\n arweaveHost,\n}: {\n transactionIds: string[],\n arweaveHost: string,\n}) => {\n\n let arrayBuffer: ArrayBuffer | undefined\n\n for (const transactionId of transactionIds) {\n try {\n const response = await fetch(`https://${arweaveHost}/raw/${transactionId}`);\n\n arrayBuffer = await response.arrayBuffer();\n } catch(error) {\n console.log(`[filesDownload] transaction ${transactionId} data not found`, error)\n globalThis.postMessage({\n message: 'excludeTransaction',\n transactionId,\n })\n continue\n }\n\n let dataString\n const isBinaryData = isBinary(arrayBuffer)\n\n if (!isBinaryData) {\n const decoder = new TextDecoder('utf-8')\n const text = decoder.decode(arrayBuffer)\n dataString = text\n }\n\n if (!dataString && !arrayBuffer) {\n console.log(\n `[filesDownload] transaction ${transactionId} data not found`,\n )\n }\n\n if (dataString && dataString.startsWith('===FILE_SEPARATOR===')) {\n const dataStringParts = dataString\n .split('===FILE_SEPARATOR===')\n .slice(1)\n\n if (dataStringParts.length % 2 !== 0) {\n throw new Error('Input array must have an even number of elements.')\n }\n\n for (let i = 0; i < dataStringParts.length; i += 2) {\n const contentType = dataStringParts[i]\n const content = dataStringParts[i + 1]\n const encoder = new TextEncoder()\n if (contentType === 'html') {\n const fileName = `${transactionId}.html`\n const buffer = encoder.encode(content)\n saveBufferToOPFS(`/files/html/${fileName}`, buffer)\n }\n if (contentType === 'json') {\n const fileName = `${transactionId}.json`\n const buffer = encoder.encode(content)\n saveBufferToOPFS(`/files/json/${fileName}`, buffer)\n }\n }\n\n continue\n }\n\n if (!dataString && arrayBuffer) {\n saveBufferToOPFS(\n `/files/images/${transactionId}`,\n new Uint8Array(arrayBuffer),\n )\n continue\n }\n\n if (!dataString) {\n continue\n }\n\n let contentType = identifyString(dataString)\n\n if (\n contentType !== 'json' &&\n contentType !== 'base64' &&\n contentType !== 'html'\n ) {\n const possibleImageType = getDataTypeFromString(dataString)\n if (!possibleImageType) {\n console.log(\n `[filesDownload] transaction ${transactionId} data not in expected format: ${possibleImageType}`,\n )\n continue\n }\n\n contentType = possibleImageType\n }\n\n if (contentType === 'url') {\n const url = dataString as string\n\n let buffer: ArrayBuffer | undefined\n\n try {\n const response = await fetch(url)\n \n buffer = await response.arrayBuffer()\n\n } catch(error) {\n console.log(`[filesDownload] transaction ${transactionId} value was url: ${dataString} but failed to fetch`, error)\n globalThis.postMessage({\n message: 'excludeTransaction',\n transactionId,\n })\n continue\n }\n\n const bufferUint8Array = new Uint8Array(buffer)\n\n // Extract the file extension from the URL\n const extensionMatch = url.match(/\\.(jpg|jpeg|png|gif|bmp|webp|svg)$/i)\n if (!extensionMatch) {\n throw new Error(\n 'Unable to determine the file extension from the URL.',\n )\n }\n const fileExtension = extensionMatch[0] // e.g., \".jpg\"\n\n // Set the file name (you can customize this)\n // const fileNameFromUrl = `${transactionId}${fileExtension}`\n\n await saveBufferToOPFS(\n `/files/images/${transactionId}`,\n bufferUint8Array,\n )\n\n continue\n }\n\n const mimeType = getMimeType(dataString as string)\n let fileExtension = mimeType\n\n if (fileExtension && fileExtension?.startsWith('image')) {\n fileExtension = fileExtension.replace('image/', '')\n }\n\n let fileName = transactionId\n\n if (contentType === 'base64') {\n if (fileExtension) {\n fileName += `.${fileExtension}`\n }\n\n // Remove the Base64 header if it exists (e.g., \"data:image/png;base64,\")\n const base64Data = dataString.split(',').pop() || ''\n\n // Decode the Base64 string to binary\n const binaryString = atob(base64Data)\n const length = binaryString.length\n const binaryData = new Uint8Array(length)\n\n for (let i = 0; i < length; i++) {\n binaryData[i] = binaryString.charCodeAt(i)\n }\n\n await saveBufferToOPFS(`/files/images/${fileName}`, binaryData)\n\n }\n\n if (contentType === 'html') {\n fileName += '.html'\n const encoder = new TextEncoder()\n const buffer = encoder.encode(dataString)\n await saveBufferToOPFS(`/files/html/${fileName}`, buffer)\n }\n\n if (contentType === 'json') {\n fileName += '.json'\n const encoder = new TextEncoder()\n const buffer = encoder.encode(dataString)\n await saveBufferToOPFS(`/files/json/${fileName}`, buffer)\n }\n }\n}\n\nonmessage = async (e) => {\n const { debug } = e.data\n if (!debug) {\n console.log = () => {}\n }\n console.log({\n message: 'filesDownload onmessage',\n data: e.data,\n })\n await downloadFiles(e.data);\n globalThis.postMessage({\n message: 'filesDownload onmessage done',\n done: true,\n })\n \n}\n}.toString()\n}\n)()`","import { saveAppState } from '@/db/write/saveAppState';\nimport filesDownload from './filesDownload.js'\nimport debug from 'debug'\n\nconst logger = debug('seedSdk:browser:workers:FileDownloader')\n\nexport class FileDownloader {\n private cores: number\n private workersArchive: Worker[] = []\n private workerBlobUrl: string\n\n constructor() {\n this.cores = Math.min(navigator.hardwareConcurrency || 4, 4);\n\n this.workerBlobUrl = globalThis.URL.createObjectURL(\n new Blob([filesDownload], { type: 'application/javascript' })\n )\n }\n\n public downloadAll = async ({transactionIds, arweaveHost, excludedTransactions}: DownloadAllFilesParams): Promise<void> => {\n\n if (this.workersArchive.length > 0) {\n for (let i = 0; i < this.workersArchive.length; i++) {\n this.workersArchive[i].terminate()\n delete this.workersArchive[i]\n }\n this.workersArchive = []\n }\n\n const worker = new Worker(this.workerBlobUrl);\n\n this.workersArchive.push(worker)\n\n const localExcludedTransactions = new Set(excludedTransactions)\n\n return new Promise((resolve, reject) => {\n worker.onmessage = (e) => {\n logger('filesDownload main thread onmessage', e.data);\n\n if (e.data.message === 'excludeTransaction') {\n localExcludedTransactions.add(e.data.transactionId)\n }\n\n if (e.data.done) {\n saveAppState('excludedTransactions', JSON.stringify(Array.from(localExcludedTransactions)))\n .then(() => {\n resolve(e.data)\n })\n .catch((error) => {\n reject(error)\n })\n }\n if (e.data.error) {\n reject(e.data.error)\n }\n }\n \n worker.postMessage({\n transactionIds,\n arweaveHost,\n debug: logger.enabled,\n });\n })\n }\n}\n","type BrowserImageResizerConfigBase = {\n\t/**\n\t * Algorithm used for downscaling\n\t * \n\t * * `null`: Just resize with `drawImage()`. The best quality and fastest.\n\t * * `bilinear`: Better quality, slower. Comes from upstream (ericnogralesbrowser-image-resizer).\n\t * * `hermite`: Worse quality, faster. Comes from [viliusle/Hermite-resize](https://github.com/viliusle/Hermite-resize). Will dispatch workers for better performance.\n\t * * `hermite_single`: Worse quality, faster. Single-threaded.\n\t * \n\t * default: null\n\t */\n\talgorithm: 'bilinear' | 'hermite' | 'hermite_single' | 'null' | null;\n\n\t/**\n\t * Whether to process downscaling by `drawImage(source, 0, 0, source.width / 2, source.height / 2)`\n\t * until the size is smaller than twice the target size.\n\t *\n\t * There seems to be no situation where it is necessary to change to false.\n\t * \n\t * default: true\n\t */\n\tprocessByHalf: boolean;\n\n\tmaxWidth: number;\n\tmaxHeight: number;\n\tmaxSize?: number; // ???\n\n\t/**\n\t * Scale ratio. Strictly limited to maxWidth.\n\t */\n\tscaleRatio?: number;\n\n\t/**\n\t * Output logs to console\n\t */\n\tdebug: boolean;\n}\n\n\ntype BrowserImageResizerConfigWithConvertedOutput = BrowserImageResizerConfigBase & {\n\tquality: number;\n\tmimeType: string;\n};\n\ntype BrowserImageResizerConfigWithOffscreenCanvasOutput = BrowserImageResizerConfigBase & {\n\tmimeType: null;\n}\n\ntype BrowserImageResizerConfig = BrowserImageResizerConfigWithConvertedOutput | BrowserImageResizerConfigWithOffscreenCanvasOutput;\n\ntype WorkerSouceData = {\n source: ImageData;\n startY: number;\n height: number;\n}\n\nexport default `(\n ${\n function () {\n\nasync function listFilesInDirectory(directoryHandle: FileSystemDirectoryHandle) {\n const entries: { name: string; kind: FileSystemHandleKind }[] = [];\n\n for await (const [name, handle] of directoryHandle.entries()) {\n entries.push({\n name,\n kind: handle.kind,\n })\n }\n\n return entries;\n}\n\nconst getFileHandle = async (path: string, rootHandle: FileSystemDirectoryHandle | null = null): Promise<FileSystemFileHandle> => {\n // Split the path into segments\n const segments = path.split('/').filter(Boolean);\n\n // Start from the root directory if not provided\n if (!rootHandle) {\n rootHandle = await navigator.storage.getDirectory();\n }\n\n let currentHandle = rootHandle;\n\n // Traverse the path segments\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const isLastSegment = i === segments.length - 1;\n\n try {\n\n for await (const [name, handle] of currentHandle.entries()) {\n if (name !== segment) {\n continue\n }\n\n if (isLastSegment) {\n if (handle.kind === 'file') {\n return handle as FileSystemFileHandle; // Return the file handle if found\n } else {\n throw new Error(`Path '${path}' refers to a directory, not a file.`);\n }\n } else if (handle.kind === 'directory') {\n currentHandle = handle as FileSystemDirectoryHandle; // Traverse into the directory\n } else {\n throw new Error(`Invalid path segment '${segment}'`);\n }\n }\n } catch (err) {\n if (err instanceof Error && err.name === 'NotFoundError') {\n throw new Error(`Path '${path}' does not exist.`);\n } else {\n throw err;\n }\n }\n }\n\n throw new Error(`Path '${path}' could not be resolved.`);\n}\n\nasync function getFileFromOPFS(path: string): Promise<File> {\n\n const fileHandleAsync = await getFileHandle(path);\n const file = await fileHandleAsync.getFile();\n return file;\n\n}\n\nconst DEFAULT_CONFIG = {\n\targorithm: 'null',\n\tprocessByHalf: true,\n\tquality: 0.5,\n\tmaxWidth: 800,\n\tmaxHeight: 600,\n\tdebug: false,\n\tmimeType: 'image/jpeg',\n} as const;\n\nfunction isIos() {\n\tif (typeof navigator === 'undefined') return false;\n\tif (!navigator.userAgent) return false;\n\treturn /iPad|iPhone|iPod/.test(navigator.userAgent);\n}\n\nconst getTargetHeight = (srcHeight: number, scale: number, config: BrowserImageResizerConfig) => {\n\treturn Math.min(Math.floor(srcHeight * scale), config.maxHeight);\n}\n\nconst findMaxWidth = (config: BrowserImageResizerConfig, canvas: { width: number; height: number }) => {\n\t//Let's find the max available width for scaled image\n\tconst ratio = canvas.width / canvas.height;\n\tlet mWidth = Math.min(\n\t\tcanvas.width,\n\t\tconfig.maxWidth,\n\t\tratio * config.maxHeight\n\t);\n\tif (\n\t\tconfig.maxSize &&\n\t\tconfig.maxSize > 0 &&\n\t\tconfig.maxSize < (canvas.width * canvas.height) / 1000\n\t)\n\t\tmWidth = Math.min(\n\t\t\tmWidth,\n\t\t\tMath.floor((config.maxSize * 1000) / canvas.height)\n\t\t);\n\tif (!!config.scaleRatio)\n\t\tmWidth = Math.min(mWidth, Math.floor(config.scaleRatio * canvas.width));\n\n\tconst rHeight = getTargetHeight(canvas.height, mWidth / canvas.width, config);\n\n // console.log(\n // 'browser-image-resizer: original image size = ' +\n // canvas.width +\n // ' px (width) X ' +\n // canvas.height +\n // ' px (height)'\n // );\n // console.log(\n // 'browser-image-resizer: scaled image size = ' +\n // mWidth +\n // ' px (width) X ' +\n // rHeight +\n // ' px (height)'\n // );\n\tif (mWidth <= 0) {\n\t\tmWidth = 1;\n\t\tconsole.warn(\"browser-image-resizer: image size is too small\");\n\t}\n\n\tif (isIos() && mWidth * rHeight > 167777216) {\n\t\tconsole.error(\"browser-image-resizer: image size is too large for iOS WebKit.\", mWidth, rHeight);\n\t\tthrow new Error(\"browser-image-resizer: image size is too large for iOS WebKit.\");\n\t}\n\n\treturn mWidth;\n}\n\n /**\n * Hermite resize, multicore version - fast image resize/resample using Hermite filter.\n */\n const resample = (srcCanvas: OffscreenCanvas, destCanvas: OffscreenCanvas, config: { debug?: boolean }) => {\n return new Promise<void>((resolve, reject) => {\n\n const ratio_h = srcCanvas.height / destCanvas.height;\n const cores = Math.min(navigator.hardwareConcurrency || 4, 4)\n\n //prepare source and target data for workers\n const ctx = srcCanvas.getContext('2d');\n if (!ctx) return reject('Canvas is empty (resample)');\n\n const data_part: WorkerSouceData[] = [];\n const block_height = Math.ceil(srcCanvas.height / cores / 2) * 2;\n let end_y = -1;\n for (let c = 0; c < cores; c++) {\n //source\n const offset_y = end_y + 1;\n if (offset_y >= srcCanvas.height) {\n //size too small, nothing left for this core\n continue;\n }\n\n end_y = Math.min(offset_y + block_height - 1, srcCanvas.height - 1);\n\n const current_block_height = Math.min(block_height, srcCanvas.height - offset_y);\n\n console.log('browser-image-resizer: source split: ', '#' + c, offset_y, end_y, 'height: ' + current_block_height);\n\n data_part.push({\n source: ctx.getImageData(0, offset_y, srcCanvas.width, block_height),\n startY: Math.ceil(offset_y / ratio_h),\n height: current_block_height\n });\n }\n\n //start\n const destCtx = destCanvas.getContext('2d');\n if (!destCtx) return reject('Canvas is empty (resample dest)');\n let workers_in_use = data_part.length;\n for (let c = 0; c < data_part.length; c++) {\n\n //draw\n const height_part = Math.ceil(data_part[c].height / ratio_h);\n const target = destCtx.createImageData(destCanvas.width, height_part);\n // target.data.set(event.data.target);\n destCtx.putImageData(target, 0, data_part[c].startY);\n\n }\n });\n};\n\n /**\n * Hermite resize - fast image resize/resample using Hermite filter. 1 cpu version!\n */\n const resampleSingle = (srcCanvasData: ImageData, destCanvasData: ImageData,) => {\n const ratio_w = srcCanvasData.width / destCanvasData.width;\n const ratio_h = srcCanvasData.height / destCanvasData.height;\n const ratio_w_half = Math.ceil(ratio_w / 2);\n const ratio_h_half = Math.ceil(ratio_h / 2);\n\n const data = srcCanvasData.data;\n const data2 = destCanvasData.data;\n\n for (let j = 0; j < destCanvasData.height; j++) {\n for (let i = 0; i < destCanvasData.width; i++) {\n const x2 = (i + j * destCanvasData.width) * 4;\n let weight = 0;\n let weights = 0;\n let weights_alpha = 0;\n let gx_r = 0;\n let gx_g = 0;\n let gx_b = 0;\n let gx_a = 0;\n const center_y = j * ratio_h;\n\n const xx_start = Math.floor(i * ratio_w);\n const xx_stop = Math.min(Math.ceil((i + 1) * ratio_w), srcCanvasData.width);\n const yy_start = Math.floor(j * ratio_h);\n const yy_stop = Math.min(Math.ceil((j + 1) * ratio_h), srcCanvasData.height);\n\n for (let yy = yy_start; yy < yy_stop; yy++) {\n let dy = Math.abs(center_y - yy) / ratio_h_half;\n let center_x = i * ratio_w;\n let w0 = dy * dy; //pre-calc part of w\n for (let xx = xx_start; xx < xx_stop; xx++) {\n let dx = Math.abs(center_x - xx) / ratio_w_half;\n let w = Math.sqrt(w0 + dx * dx);\n if (w >= 1) {\n //pixel too far\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n let pos_x = 4 * (xx + yy * srcCanvasData.width);\n //alpha\n gx_a += weight * data[pos_x + 3];\n weights_alpha += weight;\n //colors\n if (data[pos_x + 3] < 255)\n weight = weight * data[pos_x + 3] / 250;\n gx_r += weight * data[pos_x];\n gx_g += weight * data[pos_x + 1];\n gx_b += weight * data[pos_x + 2];\n weights += weight;\n }\n }\n data2[x2] = gx_r / weights;\n data2[x2 + 1] = gx_g / weights;\n data2[x2 + 2] = gx_b / weights;\n data2[x2 + 3] = gx_a / weights_alpha;\n }\n }\n};\n\n /**\n * Hermite resize. Detect cpu count and use best option for user.\n */\n const resampleAuto = (srcCanvas: OffscreenCanvas, destCanvas: OffscreenCanvas, config: { debug?: boolean, argorithm?: string }) => {\n if (!!globalThis.Worker && navigator.hardwareConcurrency > 1 && config?.argorithm !== 'hermite_single') {\n //workers supported and we have at least 2 cpu cores - using multithreading\n return resample(srcCanvas, destCanvas, config);\n } else {\n //1 cpu version\n const { srcImgData, destImgData } = getImageData(srcCanvas, destCanvas);\n resampleSingle(srcImgData, destImgData);\n destCanvas.getContext('2d')!.putImageData(destImgData, 0, 0);\n return;\n }\n};\n\n\nasync function scaleCanvasWithAlgorithm(canvas: OffscreenCanvas, config: BrowserImageResizerConfig & { outputWidth: number }) {\n\tconst scale = config.outputWidth / canvas.width;\n\n\tconst scaled = new OffscreenCanvas(Math.floor(config.outputWidth), getTargetHeight(canvas.height, scale, config));\n\n\tswitch (config.algorithm) {\n\t\tcase 'hermite': {\n\t\t\tawait resampleAuto(canvas, scaled, config as BrowserImageResizerConfig & { algorithm: 'hermite' | 'hermite_single' });\n\t\t\tbreak;\n\t\t} case 'hermite_single': {\n\t\t\tconst { srcImgData, destImgData } = getImageData(canvas, scaled);\n\t\t\tresampleSingle(srcImgData, destImgData,);\n\t\t\tscaled?.getContext('2d')?.putImageData(destImgData, 0, 0);\n\t\t\tbreak;\n\t\t} case 'bilinear': {\n\t\t\t// const { srcImgData, destImgData } = getImageData(canvas, scaled);\n\t\t\t// bilinear(srcImgData, destImgData, scale);\n\t\t\t// scaled?.getContext('2d')?.putImageData(destImgData, 0, 0);\n\t\t\tbreak;\n\t\t} default: {\n\t\t\tscaled.getContext('2d')?.drawImage(canvas, 0, 0, scaled.width, scaled.height);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn scaled;\n}\n\nconst getHalfScaleCanvas = (src: OffscreenCanvas | HTMLCanvasElement) => {\n\tconst half = new OffscreenCanvas(src.width / 2, src.height / 2);\n\n\thalf\n\t\t?.getContext('2d')\n\t\t?.drawImage(src, 0, 0, half.width, half.height);\n\n\treturn half;\n}\n\nconst getImageData = (canvas: OffscreenCanvas, scaled: OffscreenCanvas) => {\n\tconst srcImgData = canvas\n\t\t?.getContext('2d')\n\t\t?.getImageData(0, 0, canvas.width, canvas.height);\n\tconst destImgData = scaled\n\t\t?.getContext('2d')\n\t\t?.createImageData(scaled.width, scaled.height);\n\n\tif (!srcImgData || !destImgData) throw Error('Canvas is empty (scaleCanvasWithAlgorithm). You should run this script after the document is ready.');\n\n\treturn { srcImgData, destImgData };\n}\n\nasync function saveBlobToOPFS(filePath: string, blob: Blob): Promise<void> {\n // Access the OPFS root directory\n const rootHandle = await navigator.storage.getDirectory();\n\n // Split the filePath into directory segments and file name\n const segments = filePath.split('/').filter(Boolean);\n const fileName = segments.pop(); // Extract the file name\n if (!fileName) {\n throw new Error('Invalid file path: No file name provided.');\n }\n\n // Traverse or create directories as needed\n let currentDirHandle = rootHandle;\n for (const segment of segments) {\n currentDirHandle = await currentDirHandle.getDirectoryHandle(segment, { create: true });\n }\n\n // Create or open the file in OPFS\n const fileHandle = await currentDirHandle.getFileHandle(fileName, { create: true });\n\n // Write the Blob to the file\n const writableStream = await fileHandle.createWritable();\n await writableStream.write(blob);\n await writableStream.close();\n}\n\n\nconst imageResize = async (filePath: string, width: number, height: number) => {\n\n console.log({filePath, width, height})\n\n const config: BrowserImageResizerConfig = {\n ...DEFAULT_CONFIG,\n algorithm: 'hermite_single' as const,\n mimeType: 'image/webp',\n maxWidth: width,\n maxHeight: height,\n }\n\n const rootHandle = await navigator.storage.getDirectory();\n\n // List files in the root directory\n const files = await listFilesInDirectory(rootHandle);\n console.log({\n message: 'listFilesInDirectory',\n files\n });\n\n const file = await getFileFromOPFS(filePath);\n\n const imageBitmap = await createImageBitmap(file);\n\n let converting: OffscreenCanvas\n\n if (isIos() && imageBitmap.width * imageBitmap.height > 16777216) {\n const scale = Math.sqrt(16777216 / (imageBitmap.width * imageBitmap.height));\n console.log(`browser-image-resizer: scale: Image is too large in iOS WebKit`);\n converting = new OffscreenCanvas(Math.floor(imageBitmap.width * scale), Math.floor(imageBitmap.height * scale));\n converting.getContext('2d')?.drawImage(imageBitmap, 0, 0, converting.width, converting.height);\n } else {\n converting = new OffscreenCanvas(imageBitmap.width, imageBitmap.height);\n converting.getContext('2d')?.drawImage(imageBitmap, 0, 0);\n }\n\n if (!converting?.getContext('2d')) {\n console.log('browser-image-resizer: Canvas Context is empty.')\n }\n\n const maxWidth = findMaxWidth(config, converting);\n\n\tif (!maxWidth){ \n throw Error(`browser-image-resizer: maxWidth is ${maxWidth}!!`)\n };\n\n\twhile (config.processByHalf && converting.width >= 2 * maxWidth) {\n\t\tif (config.debug) console.log(`browser-image-resizer: scale: Scaling canvas by half from ${converting.width}`);\n\t\tconverting = getHalfScaleCanvas(converting);\n\t}\n\n\tif (converting.width > maxWidth) {\n\t\tif (config.debug) console.log(`browser-image-resizer: scale: Scaling canvas by ${config.algorithm} from ${converting.width} to ${maxWidth}`);\n\t\tconverting = await scaleCanvasWithAlgorithm(\n\t\t\tconverting,\n\t\t\tObject.assign(config, { outputWidth: maxWidth }),\n\t\t);\n\t}\n\n\tif (config.mimeType === null) {\n\t\treturn converting;\n\t}\n\tconst resizedBlob = await converting.convertToBlob({ type: config.mimeType, quality: config.quality });\n\n const pathSegments = filePath.split('/');\n const fileName = pathSegments.pop();\n if (!fileName) {\n throw Error('Invalid file path: No file name provided.');\n }\n const newSegments = [\n ...pathSegments,\n width,\n ]\n const fileNameParts = fileName.split('.')\n const newFileName = `${fileNameParts[0]}.webp`\n const newDirPath = newSegments.join('/');\n const newFilePath = `${newDirPath}/${newFileName}`;\n\n // Save resized image to OPFS with new name\n await saveBlobToOPFS(newFilePath, resizedBlob)\n globalThis.postMessage({\n done: true,\n filePath: newFilePath,\n })\n\n}\n\nonmessage = async (e) => {\n const { filePath, width, height, debug } = e.data\n if (!debug) {\n console.log = () => {}\n }\n console.log('[imageResize] onmessage', e.data)\n await imageResize(filePath, width, height)\n console.log(`[imageResize] Done`, filePath)\n}\n}.toString()\n}\n)()`\n","import imageResize from './imageResize'\nimport { BaseFileManager } from '@/helpers/FileManager/BaseFileManager';\nimport debug from 'debug'\n\nconst logger = debug('seedSdk:browser:workers:ImageResizer')\n\n\nexport class ImageResizer {\n private cores: number\n private workersArchive: Map<string, Worker> = new Map()\n private workerBlobUrl: string\n\n constructor() {\n this.cores = Math.min(navigator.hardwareConcurrency || 4, 4);\n\n this.workerBlobUrl = globalThis.URL.createObjectURL(\n new Blob([imageResize], { type: 'application/javascript' })\n )\n }\n\n public async resize({filePath, width, height}: ResizeImageParams) {\n \n if (this.workersArchive.has(filePath)) {\n const savedWorker = this.workersArchive.get(filePath)\n savedWorker?.terminate()\n logger('[ImageResizer.resize] Terminated worker for filePath due to incoming request', filePath)\n this.workersArchive.delete(filePath)\n }\n\n const worker = new Worker(this.workerBlobUrl);\n\n this.workersArchive.set(filePath, worker)\n\n return new Promise((resolve, reject) => {\n worker.onmessage = (e) => {\n logger('[ImageResizer.resize] main thread onmessage', e.data);\n if (e.data.done) {\n const savedWorker = this.workersArchive.get(filePath)\n savedWorker?.terminate()\n logger('[ImageResizer.resize] Terminated worker for filePath due to done', filePath)\n this.workersArchive.delete(filePath)\n resolve(e.data)\n }\n\n if (e.data.error) {\n reject(e.data.error)\n }\n }\n \n worker.postMessage({\n filePath,\n width,\n height,\n debug: logger.enabled,\n });\n })\n }\n\n public async resizeAll({width, height}: ResizeAllImagesParams) {\n\n const fs = await BaseFileManager.getFs()\n\n const imageDir = '/files/images'\n let imageFilesStats = await fs.promises.readdir(imageDir, {\n withFileTypes: true\n })\n\n imageFilesStats = imageFilesStats.filter((file: any) => file.isFile())\n\n const imageFiles = imageFilesStats.map((file: any) => file.path)\n\n const widthDir = `${imageDir}/${width}`\n\n await BaseFileManager.createDirIfNotExists(widthDir)\n\n for (const imageFile of imageFiles) {\n const resizedImageExists = await BaseFileManager.pathExists(`${widthDir}/${imageFile}`)\n if (!resizedImageExists) {\n await this.resize({filePath: `${imageDir}/${imageFile}`, width, height})\n }\n }\n\n \n }\n}\n","import { BaseFileManager } from '@/helpers/FileManager/BaseFileManager'\nimport { FileDownloader } from '../workers/FileDownloader'\nimport { ImageResizer } from '../workers/ImageResizer'\nimport debug from 'debug'\nimport path from 'path-browserify'\n\nconst logger = debug('seedSdk:browser:helpers:FileManager')\n\nclass FileManager extends BaseFileManager {\n private static zenfsCache: any = null\n\n static async getFs() {\n if (!this.zenfsCache) {\n this.zenfsCache = await import('@zenfs/core')\n }\n return this.zenfsCache\n }\n\n static getFsSync() {\n if (!this.zenfsCache) {\n throw new Error('File system not initialized. Call getFs() or initializeFileSystem() first.')\n }\n return this.zenfsCache\n }\n\n static async getContentUrlFromPath( path: string ): Promise<string | undefined> {\n\n const fileExists = await this.pathExists(path)\n if ( fileExists ) {\n const file = await this.readFile(path)\n return URL.createObjectURL(file)\n }\n }\n\n static async initializeFileSystem(workingDir?: string): Promise<void> {\n\n const zenfs = await this.getFs()\n const {WebAccess} = await import('@zenfs/dom')\n const {configureSingle} = zenfs\n\n const handle = await navigator.storage.getDirectory()\n // await configure({\n // mounts: {\n // '/': {\n // backend: WebAccess,\n // handle,\n // },\n // },\n // disableUpdateOnRead: true,\n // onlySyncOnClose: true,\n // })\n await configureSingle({\n backend: WebAccess,\n handle,\n })\n // Cache is already set in getFs(), so no need to set it again\n }\n\n static async downloadAllFiles( {\n transactionIds,\n arweaveHost,\n excludedTransactions,\n }: DownloadAllFilesParams ): Promise<void> {\n const fileDownloader = new FileDownloader()\n await fileDownloader.downloadAll({ transactionIds, arweaveHost, excludedTransactions })\n }\n\n static async resizeImage( { filePath, width, height }: ResizeImageParams ): Promise<void> {\n const imageResizer = new ImageResizer()\n await imageResizer.resize({ filePath, width, height })\n }\n\n static async resizeAllImages( { width, height }: ResizeAllImagesParams ): Promise<void> {\n const imageResizer = new ImageResizer()\n await imageResizer.resizeAll({ width, height })\n }\n\n static async pathExists(filePath: string): Promise<boolean> {\n try {\n const zenfs = await this.getFs()\n await zenfs.promises.access(filePath, zenfs.constants.F_OK)\n return true\n } catch (error: any) {\n // ENOENT means the file doesn't exist, which is expected\n if (error?.code === 'ENOENT' || error?.errno === -2) {\n return false\n }\n // For other errors, re-throw them\n throw error\n }\n }\n\n static async createDirIfNotExists(filePath: string): Promise<void> {\n if (!(await this.pathExists(filePath))) {\n try {\n const zenfs = await this.getFs()\n await zenfs.promises.mkdir(filePath, { recursive: true })\n } catch (error) {\n // This is a no-op. We tried to create a directory that already exists.\n logger('Attempted to create a directory that already exists')\n }\n }\n }\n\n /**\n * Waits for a file to exist at the specified path.\n * @param {string} filePath - The path of the file to check.\n * @param {number} interval - The interval in milliseconds between checks (default: 500ms).\n * @param {number} timeout - The timeout in milliseconds to wait for the file to exist (default: 10s).\n * @returns {Promise<boolean>} - Resolves to true if the file exists within the timeout period, otherwise false.\n */\n static async waitForFile(filePath: string, interval: number = 1000, timeout: number = 60000): Promise<boolean> {\n\n // const fs = await this.getFs()\n // const fsNode = await import('node:fs')\n const pathExists = await this.pathExists(filePath)\n\n if (pathExists) {\n return true\n }\n\n return new Promise((resolve, reject) => {\n const startTime = Date.now()\n\n let isBusy = false\n\n const cancelableInterval = new CancelableInterval(async (stop) => {\n logger('waitForFile', filePath)\n if (isBusy) {\n return\n }\n isBusy = true\n // // TODO: Needs to read from OPFS\n // const exists = await BaseFileManager.pathExists(filePath)\n // if (exists) {\n // stop()\n // resolve(true)\n // }\n\n const pathExists = await this.pathExists(filePath)\n if (pathExists) {\n stop()\n resolve(true)\n }\n\n if (Date.now() - startTime >= timeout) {\n stop()\n reject(new Error('Timeout exceeded while waiting for file'))\n }\n isBusy = false\n }, interval)\n\n cancelableInterval.start()\n \n // const _interval = setInterval(async () => {\n // logger('waitForFile', filePath)\n // if (isBusy) {\n // return\n // }\n // isBusy = true\n // // TODO: Needs to read from OPFS\n // if (fs.existsSync(filePath) && fsNode.existsSync(filePath)) {\n // clearInterval(_interval)\n // resolve(true)\n // }\n\n // const pathExists = await this.pathExists(filePath)\n // if (pathExists) {\n // clearInterval(_interval)\n // resolve(true)\n // }\n\n // if (Date.now() - startTime >= timeout) {\n // clearInterval(_interval)\n // reject(new Error('Timeout exceeded while waiting for file'))\n // }\n // isBusy = false\n // }, interval)\n \n // retry(\n // {\n // times: Math.ceil(timeout / interval),\n // interval: interval,\n // },\n // (callback: Function) => {\n // if (fs.existsSync(filePath) && fsNode.existsSync(filePath)) {\n // return callback(null, true) // File exists, finish with success\n // }\n // if (Date.now() - startTime >= timeout) {\n // return callback(new Error('Timeout exceeded while waiting for file'))\n // }\n // callback(new Error('File does not exist yet')) // Retry with this error\n // },\n // (err: Error, result: boolean) => {\n // if (err) {\n // return resolve(false) // Resolve as false if timeout or error occurs\n // }\n // resolve(result) // Resolve as true if file exists\n // },\n // )\n })\n }\n\n /**\n * Waits for a file to exist and have content (non-zero size).\n * This is important for browser/OPFS where writes may not be immediately readable.\n * @param {string} filePath - The path of the file to check.\n * @param {number} interval - The interval in milliseconds between checks (default: 100ms).\n * @param {number} timeout - The timeout in milliseconds to wait (default: 5s).\n * @returns {Promise<boolean>} - Resolves to true if the file exists with content within the timeout period.\n */\n static async waitForFileWithContent(filePath: string, interval: number = 100, timeout: number = 5000): Promise<boolean> {\n // First wait for file to exist\n await this.waitForFile(filePath, interval, timeout)\n\n // Now wait for file to have content\n return new Promise((resolve, reject) => {\n const startTime = Date.now()\n let isBusy = false\n\n const cancelableInterval = new CancelableInterval(async (stop) => {\n logger('waitForFileWithContent', filePath)\n if (isBusy) {\n return\n }\n isBusy = true\n\n try {\n // Try to read the file to check if it has content\n const file = await this.readFile(filePath)\n if (file.size > 0) {\n stop()\n resolve(true)\n return\n }\n // File exists but is 0 bytes, continue waiting\n } catch (error: any) {\n // If error is about file being 0 bytes, not readable, or I/O error, continue waiting\n const errorMessage = error?.message || String(error)\n if (\n errorMessage.includes('0 bytes') || \n errorMessage.includes('ENOENT') || \n errorMessage.includes('EIO') ||\n errorMessage.includes('Input/output error')\n ) {\n // Continue waiting - file write may still be in progress\n } else {\n // Other errors should be thrown\n stop()\n reject(error)\n return\n }\n }\n\n if (Date.now() - startTime >= timeout) {\n stop()\n reject(new Error(`Timeout exceeded while waiting for file ${filePath} to have content`))\n return\n }\n isBusy = false\n }, interval)\n\n cancelableInterval.start()\n })\n }\n\n static async saveFile(filePath: string, content: string | Blob | ArrayBuffer): Promise<void> {\n const zenfs = await this.getFs()\n \n // Convert content to a format that zenfs.writeFile accepts\n let writeContent: string | Uint8Array\n if (typeof content === 'string') {\n writeContent = content\n } else if (content instanceof Blob) {\n const arrayBuffer = await content.arrayBuffer()\n writeContent = new Uint8Array(arrayBuffer)\n } else if (content instanceof ArrayBuffer) {\n writeContent = new Uint8Array(content)\n } else {\n throw new Error('Unsupported content type')\n }\n \n await zenfs.writeFile(filePath, writeContent)\n await this.waitForFileWithContent(filePath, 100, 5000)\n // try {\n // // Get a handle to the OPFS root directory\n // const root = await navigator.storage.getDirectory();\n \n // // Split the file path into directory and file name\n // const pathParts = filePath.split('/');\n // const fileName = pathParts.pop();\n // if (!fileName) throw new Error('Invalid file path');\n\n // // Traverse directories and create them if they don't exist\n // let currentDir = root;\n // for (const part of pathParts) {\n // if (part !== '') {\n // currentDir = await currentDir.getDirectoryHandle(part, { create: true });\n // }\n // }\n\n // // Get the file handle and create the file if it doesn't exist\n // const fileHandle = await currentDir.getFileHandle(fileName, { create: true });\n\n // // Create a writable stream and write the content\n // const writable = await fileHandle.createWritable();\n \n // if (typeof content === 'string' || content instanceof Uint8Array) {\n // await writable.write(content);\n // } else if (content instanceof Blob) {\n // await writable.write(content);\n // } else if (content instanceof ArrayBuffer) {\n // await writable.write(new Blob([content]));\n // } else {\n // throw new Error('Unsupported content type');\n // }\n\n // await writable.close();\n // logger(`File written successfully: ${filePath}`);\n // } catch (error) {\n // console.error(`Error writing to OPFS: ${error.message}`);\n // }\n }\n\n static saveFileSync(filePath: string, content: string | Blob | ArrayBuffer): void {\n // Note: This is a synchronous wrapper, but zenfs operations may still be async under the hood\n // For true sync operations in browser, we'd need to use OPFS sync access handles\n // For now, we'll use zenfs.writeFileSync which should be available\n const zenfs = this.getFsSync()\n \n // Convert content to a format that zenfs.writeFileSync accepts\n let writeContent: string | Uint8Array\n if (typeof content === 'string') {\n writeContent = content\n } else if (content instanceof Blob) {\n // Blob cannot be converted synchronously - throw error\n throw new Error('Blob content not supported in saveFileSync. Use saveFile() instead or convert to ArrayBuffer first.')\n } else if (content instanceof ArrayBuffer) {\n writeContent = new Uint8Array(content)\n } else {\n throw new Error('Unsupported content type')\n }\n \n zenfs.writeFileSync(filePath, writeContent)\n }\n\n static async readFile(filePath: string): Promise<File> {\n const zenfs = await this.getFs()\n const file = await zenfs.promises.readFile(filePath)\n return new File([new Uint8Array(file)], filePath)\n // try {\n // // Get a handle to the OPFS root directory\n // const root = await navigator.storage.getDirectory();\n \n // // Split the file path into directory and file name\n // const pathParts = filePath.split('/');\n // const fileName = pathParts.pop();\n // if (!fileName) throw new Error('Invalid file path');\n \n // // Traverse directories to reach the target file\n // let currentDir = root;\n // for (const part of pathParts) {\n // if (part !== '') {\n // currentDir = await currentDir.getDirectoryHandle(part, { create: false });\n // }\n // }\n \n // // Get the file handle\n // const fileHandle = await currentDir.getFileHandle(fileName, { create: false });\n \n // // Get the file and read it as an ArrayBuffer\n // return await fileHandle.getFile();\n // } catch (error) {\n // console.error(`Error reading from OPFS: ${error.message}`);\n // throw error;\n // }\n }\n\n static readFileSync(filePath: string): File {\n // Note: This is a synchronous wrapper, but zenfs operations may still be async under the hood\n // For true sync operations in browser, we'd need to use OPFS sync access handles\n // For now, we'll use zenfs.readFileSync which should be available\n const zenfs = this.getFsSync()\n const file = zenfs.readFileSync(filePath)\n return new File([new Uint8Array(file)], filePath)\n }\n\n static async readFileAsBuffer(filePath: string): Promise<Blob> {\n try {\n\n // Get the file and read it as an ArrayBuffer\n const file = await this.readFile(filePath)\n const arrayBuffer = await file.arrayBuffer();\n\n // Convert ArrayBuffer to Blob\n return new Blob([arrayBuffer]);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`Error reading from OPFS: ${errorMessage}`);\n throw error;\n }\n }\n\n static async readFileAsString(filePath: string): Promise<string> {\n const blob = await this.readFileAsBuffer(filePath)\n return blob.text()\n }\n\n static getParentDirPath(filePath: string): string {\n return path.dirname(filePath)\n }\n\n static getFilenameFromPath(filePath: string): string {\n return path.basename(filePath)\n }\n\n static getPathModule(): any {\n return path\n }\n}\n\ntype AsyncTask = (stop: () => void) => Promise<void>\n\n\nclass CancelableInterval {\n private intervalId: number | null = null;\n private currentTaskAbortController: AbortController | null = null;\n\n constructor(private task: AsyncTask, private interval: number) {}\n\n start() {\n this.intervalId = window.setInterval(async () => {\n if (this.currentTaskAbortController) {\n // Cancel the previous running task\n this.currentTaskAbortController.abort();\n }\n\n // Create a new abort controller for the current task\n this.currentTaskAbortController = new AbortController();\n const signal = this.currentTaskAbortController.signal;\n\n try {\n await this.taskWithCancellation(signal);\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n logger('Previous task was canceled.');\n } else {\n console.error('Task error:', error);\n }\n this.stop()\n }\n }, this.interval);\n }\n\n private async taskWithCancellation(signal: AbortSignal) {\n await this.task(() => this.stop())\n if (signal.aborted) {\n throw new DOMException('Task was aborted', 'AbortError');\n }\n }\n\n stop() {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n if (this.currentTaskAbortController) {\n this.currentTaskAbortController.abort();\n }\n }\n}\n\n\nexport { FileManager }\n"],"names":["logger"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FileManager-CxGJLw5C.js","sources":["../src/node/helpers/FileManager.ts"],"sourcesContent":["import * as fsAsync from 'fs/promises'\nimport * as fs from 'fs'\nimport { BaseFileManager } from '@/helpers/FileManager/BaseFileManager'\nimport path from 'path'\n\nclass FileManager extends BaseFileManager {\n\n static async getFs() {\n return fs\n }\n\n static getFsSync() {\n return fs\n }\n\n static async getContentUrlFromPath( path: string ): Promise<string | undefined> {\n return new Promise(( resolve, reject ) => {\n reject(new Error('Not implemented'))\n })\n }\n\n static async initializeFileSystem(workingDir?: string): Promise<void> {\n return // No need to initialize file system in node\n }\n\n static async downloadAllFiles(): Promise<void> {\n return new Promise(( resolve, reject ) => {\n reject(new Error('Not implemented'))\n })\n }\n\n static async resizeImage(): Promise<void> {\n return new Promise(( resolve, reject ) => {\n reject(new Error('Not implemented'))\n })\n }\n\n static async resizeAllImages(): Promise<void> {\n return new Promise(( resolve, reject ) => {\n reject(new Error('Not implemented'))\n })\n }\n\n static async pathExists(filePath: string): Promise<boolean> {\n return await fsAsync.access(filePath).then(() => true).catch(() => false)\n }\n\n static async createDirIfNotExists(filePath: string): Promise<void> {\n await fsAsync.mkdir(filePath, { recursive: true })\n }\n\n static async waitForFile(filePath: string, interval: number = 1000, timeout: number = 60000): Promise<boolean> {\n // Check if file exists immediately\n const pathExists = await this.pathExists(filePath)\n if (pathExists) {\n return true\n }\n\n return new Promise((resolve, reject) => {\n const startTime = Date.now()\n let isBusy = false\n\n const checkInterval = setInterval(async () => {\n if (isBusy) {\n return\n }\n isBusy = true\n\n try {\n const exists = await this.pathExists(filePath)\n if (exists) {\n clearInterval(checkInterval)\n resolve(true)\n return\n }\n\n if (Date.now() - startTime >= timeout) {\n clearInterval(checkInterval)\n reject(new Error('Timeout exceeded while waiting for file'))\n return\n }\n } catch (error) {\n clearInterval(checkInterval)\n reject(error)\n return\n } finally {\n isBusy = false\n }\n }, interval)\n })\n }\n\n static async waitForFileWithContent(filePath: string, interval: number = 100, timeout: number = 5000): Promise<boolean> {\n // In node, file writes are synchronous, so if the file exists, it has content\n // Just wait for the file to exist\n return this.waitForFile(filePath, interval, timeout)\n }\n\n static async saveFile(filePath: string, content: string | Blob | ArrayBuffer): Promise<void> {\n // Ensure the directory exists\n const dir = path.dirname(filePath)\n await fsAsync.mkdir(dir, { recursive: true })\n\n // Write the content based on type\n if (typeof content === 'string') {\n await fsAsync.writeFile(filePath, content, 'utf-8')\n } else if (content instanceof Blob) {\n const arrayBuffer = await content.arrayBuffer()\n await fsAsync.writeFile(filePath, Buffer.from(arrayBuffer))\n } else if (content instanceof ArrayBuffer) {\n await fsAsync.writeFile(filePath, Buffer.from(content))\n } else {\n throw new Error('Unsupported content type')\n }\n }\n\n static saveFileSync(filePath: string, content: string | Blob | ArrayBuffer): void {\n // Ensure the directory exists\n const dir = path.dirname(filePath)\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true })\n }\n\n // Write the content based on type\n if (typeof content === 'string') {\n fs.writeFileSync(filePath, content, 'utf-8')\n } else if (content instanceof Blob) {\n // For Blob, we need to convert to Buffer synchronously\n // This is a limitation - we can't do this truly synchronously\n // But we can read it as ArrayBuffer if it's already available\n throw new Error('Blob content not supported in saveFileSync. Use saveFile() instead or convert to ArrayBuffer first.')\n } else if (content instanceof ArrayBuffer) {\n fs.writeFileSync(filePath, Buffer.from(content))\n } else {\n throw new Error('Unsupported content type')\n }\n }\n\n static async readFileAsBuffer( filePath: string ): Promise<Buffer> {\n return await fsAsync.readFile(filePath)\n }\n\n static async readFileAsString(filePath: string): Promise<string> {\n return await fsAsync.readFile(filePath, 'utf-8')\n }\n\n static async readFile(filePath: string): Promise<File> {\n return new File([await fsAsync.readFile(filePath)], filePath)\n }\n\n static readFileSync(filePath: string): File {\n return new File([fs.readFileSync(filePath)], filePath)\n }\n\n static getParentDirPath(filePath: string): string {\n return path.dirname(filePath)\n }\n\n static getFilenameFromPath(filePath: string): string {\n return path.basename(filePath)\n }\n\n static getPathModule(): any {\n return path\n }\n}\n\nexport { FileManager }\n\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ModelProperty-CGdkocQ8.js","sources":["../src/ModelProperty/service/actors/saveToSchema.ts","../src/ModelProperty/service/actors/compareAndMarkDraft.ts","../src/ModelProperty/service/actors/validateProperty.ts","../src/ModelProperty/service/modelPropertyMachine.ts","../src/db/read/getModelPropertiesData.ts","../src/ModelProperty/ModelProperty.ts"],"sourcesContent":["import { EventObject, fromCallback } from 'xstate'\nimport { FromCallbackInput } from '@/types'\nimport { ModelPropertyMachineContext } from '../modelPropertyMachine'\nimport { convertPropertyToSchemaUpdate, updateModelProperties, getModelNameFromId } from '@/helpers/updateSchema'\n// Dynamic import to break circular dependency: schema/index -> ... -> saveToSchema -> SchemaValidationService -> schema/index\n// import { SchemaValidationService } from '@/Schema/service/validation/SchemaValidationService'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport debug from 'debug'\n\nconst logger = debug('seedSdk:modelProperty:actors:saveToSchema')\n\n/**\n * Get schema name from model\n * This function finds which schema contains the given model\n * Exported so it can be reused by ModelProperty for setting schema name\n */\nexport async function getSchemaNameFromModel(modelName: string): Promise<string | undefined> {\n // Get the latest schema files and find which one contains this model\n const { listLatestSchemaFiles } = await import('../../../helpers/schema')\n const latestSchemas = await listLatestSchemaFiles()\n\n for (const schema of latestSchemas) {\n try {\n const { BaseFileManager } = await import('../../../helpers/FileManager/BaseFileManager')\n const content = await BaseFileManager.readFileAsString(schema.filePath)\n const schemaFile = JSON.parse(content) as any\n\n if (schemaFile.models && schemaFile.models[modelName]) {\n return schema.name\n }\n } catch (error) {\n logger('Error reading schema file:', error)\n continue\n }\n }\n\n return undefined\n}\n\nexport const saveToSchema = fromCallback<\n EventObject,\n FromCallbackInput<ModelPropertyMachineContext>\n>(({ sendBack, input: { context } }) => {\n const _saveToSchema = async (): Promise<void> => {\n // Use dynamic import to break circular dependency\n const { SchemaValidationService } = await import('../../../Schema/service/validation/SchemaValidationService')\n const validationService = new SchemaValidationService()\n \n // Validate property structure before saving\n const validationResult = validationService.validatePropertyStructure(context)\n if (!validationResult.isValid) {\n throw new Error(`Property validation failed: ${validationResult.errors.map(e => e.message).join(', ')}`)\n }\n\n // Validate required fields\n if (!context.name) {\n throw new Error('Property name is required')\n }\n\n if (!context.dataType) {\n throw new Error('Data type is required')\n }\n\n if (!context.modelName) {\n throw new Error(`Model not found for modelId: ${context.modelId}`)\n }\n\n // Get schema name from model\n const schemaName = await getSchemaNameFromModel(context.modelName)\n if (!schemaName) {\n throw new Error(`Schema not found for model: ${context.modelName}`)\n }\n\n // Convert property context to SchemaPropertyUpdate\n const propertyUpdate = await convertPropertyToSchemaUpdate(\n context,\n context.modelName,\n context.name,\n )\n\n // Update the schema with the property changes\n await updateModelProperties(schemaName, [propertyUpdate])\n\n // Clear isEdited flag in database after saving to schema file\n try {\n const { properties: propertiesTable, models: modelsTable } = await import('../../../seedSchema')\n const { eq, and } = await import('drizzle-orm')\n \n const db = BaseDb.getAppDb()\n if (db && context.modelName && context.name) {\n // Find model by name\n const modelRecords = await db\n .select({ id: modelsTable.id })\n .from(modelsTable)\n .where(eq(modelsTable.name, context.modelName))\n .limit(1)\n \n if (modelRecords.length > 0) {\n // Find property by name and modelId\n const propertyRecords = await db\n .select({ id: propertiesTable.id })\n .from(propertiesTable)\n .where(\n and(\n eq(propertiesTable.name, context.name),\n eq(propertiesTable.modelId, modelRecords[0].id)\n )\n )\n .limit(1)\n \n if (propertyRecords.length > 0) {\n // Clear isEdited flag in database\n await db\n .update(propertiesTable)\n .set({ isEdited: false })\n .where(eq(propertiesTable.id, propertyRecords[0].id!))\n logger(`Cleared isEdited flag in database for property ${context.modelName}:${context.name}`)\n }\n }\n }\n } catch (error) {\n logger(`Error clearing isEdited flag in database: ${error}`)\n }\n\n logger(`Successfully saved property ${context.name} to schema ${schemaName}`)\n }\n\n _saveToSchema().then(() => {\n sendBack({ type: 'saveToSchemaSuccess' })\n }).catch((error) => {\n logger('Error saving to schema:', error)\n sendBack({ type: 'saveToSchemaError', error })\n })\n\n return () => {\n // Cleanup function (optional)\n }\n})\n","import { EventObject, fromCallback } from 'xstate'\nimport { FromCallbackInput } from '@/types'\nimport { ModelPropertyMachineContext } from '../modelPropertyMachine'\n// Dynamic import to break circular dependency: helpers/db -> ModelProperty -> compareAndMarkDraft -> helpers/db\n// import { savePropertyToDb } from '@/helpers/db'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport debug from 'debug'\n\nconst logger = debug('seedSdk:modelProperty:actors:compareAndMarkDraft')\n\nexport const compareAndMarkDraft = fromCallback<\n EventObject,\n FromCallbackInput<ModelPropertyMachineContext>\n>(({ sendBack, input: { context } }) => {\n const _compareAndMarkDraft = async (): Promise<void> => {\n // Fill modelName/dataType from _originalValues when missing, then from DB by schemaFileId\n let fullContext = {\n ...context,\n modelName: context.modelName ?? (context._originalValues as any)?.modelName,\n dataType: context.dataType ?? (context._originalValues as any)?.dataType,\n }\n const schemaFileIdForResolve = fullContext._propertyFileId || (typeof fullContext.id === 'string' ? fullContext.id : undefined)\n if (schemaFileIdForResolve && (fullContext.modelName === undefined || fullContext.dataType === undefined)) {\n try {\n const { getPropertyModelNameAndDataType, getModelNameByModelId } = await import('../../../helpers/db')\n let fromDb: { modelName: string; dataType: string } | undefined\n for (let attempt = 0; attempt < 6; attempt++) {\n fromDb = await getPropertyModelNameAndDataType(schemaFileIdForResolve)\n if (fromDb) break\n if (attempt < 5) await new Promise((r) => setTimeout(r, 40))\n }\n if (fromDb) {\n fullContext = {\n ...fullContext,\n modelName: fullContext.modelName ?? fromDb.modelName,\n dataType: fullContext.dataType ?? fromDb.dataType,\n }\n }\n if (fullContext.modelName === undefined && schemaFileIdForResolve) {\n const mod = await import('../../../ModelProperty/ModelProperty')\n const ModelProperty = mod?.ModelProperty ?? (mod as { default?: unknown })?.default\n const pendingModelId = ModelProperty?.getPendingModelId?.(schemaFileIdForResolve)\n if (pendingModelId != null) {\n const modelName = await getModelNameByModelId(pendingModelId)\n if (modelName) {\n fullContext = { ...fullContext, modelName }\n }\n }\n }\n } catch {\n // ignore\n }\n }\n const schemaFileId = fullContext._propertyFileId || (typeof fullContext.id === 'string' ? fullContext.id : undefined)\n // If _originalValues is not set, we still need to save to database if the property exists\n // This handles the case where the name is changed before _originalValues is initialized\n if (!fullContext._originalValues) {\n logger('No original values to compare against')\n logger(`[compareAndMarkDraft] Context: modelName=${fullContext.modelName}, name=${fullContext.name}, id=${fullContext.id}, _propertyFileId=${fullContext._propertyFileId}`)\n \n // If we have a name and modelName, try to save to database anyway\n // This ensures name changes are persisted even if _originalValues isn't initialized yet\n // We need either schemaFileId (id or _propertyFileId) to find the property in the database\n if (fullContext.modelName && fullContext.name && schemaFileId) {\n logger(`[compareAndMarkDraft] _originalValues not set, but saving to database anyway for property ${context.modelName}:${context.name} (schemaFileId: ${schemaFileId})`)\n try {\n const { savePropertyToDb } = await import('../../../helpers/db')\n // Ensure _propertyFileId is set for savePropertyToDb to find the property\n const contextWithFileId = {\n ...fullContext,\n _propertyFileId: schemaFileId,\n }\n await savePropertyToDb(contextWithFileId)\n logger(`[compareAndMarkDraft] Successfully saved property ${fullContext.modelName}:${fullContext.name} to database (no _originalValues)`)\n } catch (error) {\n logger(`[compareAndMarkDraft] Error saving property to database (no _originalValues): ${error}`)\n // Don't throw - this is a best-effort save, but log the error for debugging\n console.error(`[compareAndMarkDraft] Failed to save property ${fullContext.modelName}:${fullContext.name}:`, error)\n }\n } else {\n logger(`[compareAndMarkDraft] Cannot save property ${fullContext.modelName}:${fullContext.name} - missing required fields (schemaFileId: ${schemaFileId})`)\n }\n return\n }\n\n logger(`[compareAndMarkDraft] Comparing: context.name=${fullContext.name}, _originalValues.name=${fullContext._originalValues?.name}`)\n \n // Compare current values with original\n // Only compare property fields, not internal fields\n const propertyFields = ['name', 'dataType', 'ref', 'refModelName', 'refModelId', 'refValueType', 'storageType', 'localStorageDir', 'filenameSuffix', 'modelName', 'modelId']\n const hasChanges = propertyFields.some(key => {\n const currentValue = (fullContext as any)[key]\n const originalValue = (fullContext._originalValues as any)?.[key]\n \n // Handle name changes specifically\n if (key === 'name') {\n const nameChanged = currentValue !== originalValue\n if (nameChanged) {\n logger(`[compareAndMarkDraft] Name change detected: \"${originalValue}\" -> \"${currentValue}\"`)\n }\n return nameChanged\n }\n \n // Handle ref fields - compare by name\n if (key === 'ref' || key === 'refModelName') {\n const currentRef = fullContext.refModelName || fullContext.ref\n const originalRef = fullContext._originalValues?.refModelName || fullContext._originalValues?.ref\n // Both undefined/null means no ref, so they're the same\n if (!currentRef && !originalRef) return false\n return currentRef !== originalRef\n }\n \n // For other fields, compare values (handling undefined/null)\n if (currentValue === undefined && originalValue === undefined) return false\n if (currentValue === null && originalValue === null) return false\n if (currentValue === undefined && originalValue === null) return false\n if (currentValue === null && originalValue === undefined) return false\n \n return currentValue !== originalValue\n })\n\n if (hasChanges) {\n logger(`Property ${fullContext.modelName}:${fullContext.name} has changes, marking as edited`)\n logger(`[compareAndMarkDraft] Context when saving: id=${fullContext.id}, _propertyFileId=${fullContext._propertyFileId}, name=${fullContext.name}, _originalValues.name=${fullContext._originalValues?.name}`)\n\n // Use dynamic import to break circular dependency\n const { savePropertyToDb } = await import('../../../helpers/db')\n // Save to database (but not JSON file) - always save to DB when there are changes\n try {\n await savePropertyToDb(fullContext)\n logger(`[compareAndMarkDraft] Successfully saved property ${fullContext.modelName}:${fullContext.name} to database`)\n } catch (error) {\n logger(`[compareAndMarkDraft] Error saving property to database: ${error}`)\n throw error\n }\n\n // Mark schema as draft if schema name is available\n if (fullContext._schemaName) {\n // Get the Schema instance and mark it as draft\n const { Schema } = await import('../../../Schema/Schema')\n const schema = Schema.create(fullContext._schemaName, {\n waitForReady: false,\n }) as import('@/Schema/Schema').Schema\n\n // Send event to Schema machine to mark as draft\n schema.getService().send({\n type: 'markAsDraft',\n propertyKey: `${fullContext.modelName}:${fullContext.name}`,\n })\n }\n } else {\n // No changes - clear edited flag in database and context\n logger(`Property ${fullContext.modelName}:${fullContext.name} has no changes`)\n \n // Clear isEdited flag in database\n try {\n const { properties: propertiesTable, models: modelsTable } = await import('../../../seedSchema')\n const { eq, and } = await import('drizzle-orm')\n \n const db = BaseDb.getAppDb()\n if (db && fullContext.modelName && fullContext.name) {\n // Find model by name\n const modelRecords = await db\n .select({ id: modelsTable.id })\n .from(modelsTable)\n .where(eq(modelsTable.name, fullContext.modelName))\n .limit(1)\n \n if (modelRecords.length > 0) {\n // Find property by name and modelId\n const propertyRecords = await db\n .select({ id: propertiesTable.id })\n .from(propertiesTable)\n .where(\n and(\n eq(propertiesTable.name, fullContext.name),\n eq(propertiesTable.modelId, modelRecords[0].id)\n )\n )\n .limit(1)\n \n if (propertyRecords.length > 0) {\n // Clear isEdited flag in database\n await db\n .update(propertiesTable)\n .set({ isEdited: false })\n .where(eq(propertiesTable.id, propertyRecords[0].id!))\n logger(`Cleared isEdited flag in database for property ${fullContext.modelName}:${fullContext.name}`)\n }\n }\n }\n } catch (error) {\n logger(`Error clearing isEdited flag in database: ${error}`)\n }\n \n sendBack({\n type: 'clearEdited',\n })\n }\n }\n\n _compareAndMarkDraft().then(() => {\n sendBack({ type: 'compareAndMarkDraftSuccess' })\n }).catch((error) => {\n logger('Error comparing and marking draft:', error)\n sendBack({ type: 'compareAndMarkDraftError', error })\n })\n\n return () => {\n // Cleanup function (optional)\n }\n})\n","import { EventObject, fromCallback } from 'xstate'\nimport { FromCallbackInput } from '@/types'\nimport { ModelPropertyMachineContext } from '../modelPropertyMachine'\n// Dynamic imports to break circular dependencies:\n// - schema/index -> ... -> validateProperty -> SchemaValidationService -> schema/index\n// - schema/Schema -> ... -> validateProperty -> Schema -> schema/Schema\n// import { SchemaValidationService } from '@/Schema/service/validation/SchemaValidationService'\n// import { Schema } from '@/Schema/Schema'\nimport debug from 'debug'\n\nconst logger = debug('seedSdk:modelProperty:actors:validateProperty')\n\nexport const validateProperty = fromCallback<\n EventObject,\n FromCallbackInput<ModelPropertyMachineContext>\n>(({ sendBack, input: { context } }) => {\n const _validateProperty = async (): Promise<void> => {\n // Use full context for validation: fill modelName/dataType from _originalValues when missing, then\n // from DB by schemaFileId (context.id) so just-created renames don't fail structure validation.\n let fullContext = {\n ...context,\n modelName: context.modelName ?? (context._originalValues as any)?.modelName,\n dataType: context.dataType ?? (context._originalValues as any)?.dataType,\n }\n const schemaFileId = typeof context.id === 'string' ? context.id : undefined\n if (schemaFileId && (fullContext.modelName === undefined || fullContext.dataType === undefined)) {\n // Brief wait so trackPendingWrite from ModelProperty.create() has time to run (it's in setTimeout(0))\n await new Promise((r) => setTimeout(r, 60))\n try {\n const { getPropertyModelNameAndDataType, getModelNameByModelId } = await import('../../../helpers/db')\n // Try pending write first (property row may not exist yet)\n if (fullContext.modelName === undefined && schemaFileId) {\n const mod = await import('../../../ModelProperty/ModelProperty')\n const ModelProperty = mod?.ModelProperty ?? (mod as { default?: unknown })?.default\n const pendingModelId = ModelProperty?.getPendingModelId?.(schemaFileId)\n if (pendingModelId != null) {\n const modelName = await getModelNameByModelId(pendingModelId)\n if (modelName) {\n fullContext = { ...fullContext, modelName }\n }\n }\n }\n // Then DB property lookup with retry (catches row after initial write)\n let fromDb: { modelName: string; dataType: string } | undefined\n for (let attempt = 0; attempt < 6; attempt++) {\n fromDb = await getPropertyModelNameAndDataType(schemaFileId)\n if (fromDb) break\n if (attempt < 5) await new Promise((r) => setTimeout(r, 40))\n }\n if (fromDb) {\n fullContext = {\n ...fullContext,\n modelName: fullContext.modelName ?? fromDb.modelName,\n dataType: fullContext.dataType ?? fromDb.dataType,\n }\n }\n // If still no modelName, try pending write again (may have been set during retries)\n if (fullContext.modelName === undefined && schemaFileId) {\n const mod = await import('../../../ModelProperty/ModelProperty')\n const ModelProperty = mod?.ModelProperty ?? (mod as { default?: unknown })?.default\n const pendingModelId = ModelProperty?.getPendingModelId?.(schemaFileId)\n if (pendingModelId != null) {\n const modelName = await getModelNameByModelId(pendingModelId)\n if (modelName) {\n fullContext = { ...fullContext, modelName }\n }\n }\n }\n } catch {\n // ignore\n }\n }\n // Last resort for structure validation: TProperty requires dataType; allow name+id to pass if we have schemaFileId\n if (fullContext.dataType === undefined && (fullContext.modelName !== undefined || schemaFileId)) {\n fullContext = { ...fullContext, dataType: (fullContext.dataType ?? (context._originalValues as any)?.dataType) || 'Text' }\n }\n console.log('[validateProperty] Starting validation for property:', fullContext.name)\n console.log('[validateProperty] Context:', { \n name: fullContext.name, \n modelName: fullContext.modelName, \n _schemaName: fullContext._schemaName,\n _originalValues: fullContext._originalValues \n })\n // Use dynamic imports to break circular dependencies\n const { SchemaValidationService } = await import('../../../Schema/service/validation/SchemaValidationService')\n const validationService = new SchemaValidationService()\n const { Schema } = await import('../../../Schema/Schema')\n \n // Validate property structure\n console.log('[validateProperty] Validating property structure...')\n const structureResult = validationService.validatePropertyStructure(fullContext)\n console.log('[validateProperty] Structure validation result:', structureResult.isValid)\n \n if (!structureResult.isValid) {\n console.log('[validateProperty] Structure validation failed:', structureResult.errors)\n sendBack({ type: 'validationError', errors: structureResult.errors })\n return\n }\n console.log('[validateProperty] Structure validation passed')\n\n // If we have schema name and model name, validate against schema\n console.log('[validateProperty] Checking schema validation:', { hasSchemaName: !!fullContext._schemaName, hasModelName: !!fullContext.modelName })\n if (fullContext._schemaName && fullContext.modelName) {\n try {\n console.log('[validateProperty] Creating schema instance:', fullContext._schemaName)\n const schema = Schema.create(fullContext._schemaName, {\n waitForReady: false,\n }) as import('@/Schema/Schema').Schema\n const schemaSnapshot = schema.getService().getSnapshot()\n const schemaStatus = schemaSnapshot.value\n console.log('[validateProperty] Schema status:', schemaStatus)\n \n // Only validate against schema if it's loaded (in idle state)\n // If still loading, skip schema validation and only do structure validation\n if (schemaStatus === 'idle') {\n const schemaContext = schemaSnapshot.context\n console.log('[validateProperty] Schema context models:', schemaContext.models ? Object.keys(schemaContext.models).length : 'null')\n \n // Check if models are actually loaded\n if (schemaContext.models && Object.keys(schemaContext.models).length > 0) {\n // If property name has changed, validate against the original name (from schema file)\n // This handles the case where a property is renamed - the schema file still has the old name\n const propertyNameToValidate = fullContext._originalValues?.name && fullContext._originalValues.name !== fullContext.name\n ? fullContext._originalValues.name\n : fullContext.name || ''\n \n console.log('[validateProperty] Validating against schema:', { \n modelName: fullContext.modelName, \n propertyNameToValidate,\n originalName: fullContext._originalValues?.name,\n currentName: fullContext.name \n })\n const schemaResult = validationService.validateProperty(\n schemaContext,\n fullContext.modelName,\n propertyNameToValidate,\n fullContext\n )\n console.log('[validateProperty] Schema validation result:', { isValid: schemaResult.isValid, errors: schemaResult.errors.length, errorCodes: schemaResult.errors.map(e => e.code) })\n \n if (!schemaResult.isValid) {\n // If property was renamed, some validation errors are expected (like property_not_found, missing_type)\n // Only fail if it's a critical error that's not related to the rename\n const isRenamed = fullContext._originalValues?.name && fullContext._originalValues.name !== fullContext.name\n const criticalErrors = schemaResult.errors.filter(err => {\n // Allow property_not_found and missing_type errors when property is renamed\n if (isRenamed && (err.code === 'property_not_found' || err.code === 'missing_type')) {\n return false // Not critical\n }\n // For non-renamed properties, only allow property_not_found if we're validating with the same name\n if (err.code === 'property_not_found' && propertyNameToValidate === fullContext.name) {\n return false // Not critical\n }\n return true // Critical error\n })\n \n console.log('[validateProperty] Filtered critical errors:', { \n totalErrors: schemaResult.errors.length, \n criticalErrors: criticalErrors.length,\n errorCodes: schemaResult.errors.map(e => e.code),\n criticalErrorCodes: criticalErrors.map(e => e.code)\n })\n \n if (criticalErrors.length > 0) {\n console.log('[validateProperty] Sending validationError with critical errors')\n sendBack({ type: 'validationError', errors: criticalErrors })\n return\n }\n console.log('[validateProperty] No critical errors, continuing with validation')\n // Continue with validation - rename-related errors are acceptable\n }\n } else {\n console.log('[validateProperty] Schema models not loaded yet, skipping schema validation')\n logger('Schema models not loaded yet, skipping schema validation')\n // Continue with structure validation only\n }\n } else {\n logger(`Schema is in ${schemaStatus} state, skipping schema validation`)\n // Continue with structure validation only\n }\n } catch (error) {\n console.log('[validateProperty] Error validating property against schema:', error)\n logger('Error validating property against schema:', error)\n // Continue with structure validation only\n }\n } else {\n console.log('[validateProperty] Skipping schema validation (no _schemaName or modelName)')\n }\n\n // All validations passed\n console.log('[validateProperty] All validations passed, sending validationSuccess')\n sendBack({ type: 'validationSuccess', errors: [] })\n }\n\n _validateProperty().catch((error) => {\n logger('Error in validateProperty:', error)\n sendBack({\n type: 'validationError',\n errors: [{\n field: 'property',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'validation_exception',\n severity: 'error' as const,\n }],\n })\n })\n\n return () => {\n // Cleanup function (optional)\n }\n})\n\n","import { assign, setup, ActorRefFrom } from 'xstate'\nimport { Static } from '@sinclair/typebox'\nimport { TProperty } from '@/Schema'\nimport { saveToSchema } from './actors/saveToSchema'\nimport { compareAndMarkDraft } from './actors/compareAndMarkDraft'\nimport { validateProperty } from './actors/validateProperty'\nimport { ValidationError } from '@/Schema/validation'\nimport { writeProcessMachine } from '@/services/write/writeProcessMachine'\n\nexport type ModelPropertyMachineContext = Static<typeof TProperty> & {\n // Store original values from the JSON schema file\n _originalValues?: Partial<Static<typeof TProperty>>\n // Track if this property has been edited\n _isEdited?: boolean\n // Reference to the Schema instance this property belongs to\n _schemaName?: string\n // Validation errors\n _validationErrors?: ValidationError[]\n writeProcess?: ActorRefFrom<typeof writeProcessMachine> | null\n // Property file ID (schemaFileId from JSON schema file) - used for lookups\n _propertyFileId?: string\n // Note: id field (from TProperty) is now the schemaFileId (string)\n // _dbId (from TProperty) stores the database integer ID\n // Destroy lifecycle (for destroy hooks)\n _destroyInProgress?: boolean\n _destroyError?: { message: string; name?: string } | null\n}\n\nexport const modelPropertyMachine = setup({\n types: {\n context: {} as ModelPropertyMachineContext,\n input: {} as ModelPropertyMachineContext,\n events: {} as\n | { type: 'updateContext'; [key: string]: any }\n | { type: 'initializeOriginalValues'; originalValues: Partial<Static<typeof TProperty>>; schemaName?: string; isEdited?: boolean }\n | { type: 'clearEdited' }\n | { type: 'setSchemaName'; schemaName: string }\n | { type: 'saveToSchema' }\n | { type: 'saveToSchemaSuccess' }\n | { type: 'saveToSchemaError'; error: Error }\n | { type: 'compareAndMarkDraftSuccess' }\n | { type: 'compareAndMarkDraftError' }\n | { type: 'validateProperty' }\n | { type: 'validationSuccess'; errors: ValidationError[] }\n | { type: 'validationError'; errors: ValidationError[] }\n | { type: 'requestWrite'; data: any }\n | { type: 'destroyStarted' }\n | { type: 'destroyDone' }\n | { type: 'destroyError'; error: unknown }\n | { type: 'clearDestroyError' },\n },\n actors: {\n saveToSchema,\n compareAndMarkDraft,\n validateProperty,\n writeProcessMachine,\n },\n guards: {\n isPropertyValid: ({ context }) => {\n return !context._validationErrors || context._validationErrors.length === 0\n },\n hasValidationErrors: ({ context }) => {\n return !!context._validationErrors && context._validationErrors.length > 0\n },\n },\n actions: {\n assignValidationErrors: assign(({ context, event }) => {\n if (event.type === 'validationError') {\n return {\n ...context,\n _validationErrors: event.errors,\n }\n }\n return context\n }),\n },\n}).createMachine({\n id: 'modelProperty',\n initial: 'idle',\n context: ({ input }) => {\n const context = input as ModelPropertyMachineContext\n console.log('[modelPropertyMachine] Initializing context with input:', JSON.stringify({\n name: context.name,\n modelName: context.modelName,\n ref: context.ref,\n refModelName: context.refModelName,\n refModelId: context.refModelId,\n dataType: context.dataType,\n }, null, 2))\n return context\n },\n on: {\n updateContext: {\n actions: assign(({ context, event }) => {\n const newContext = Object.assign({}, context) as any\n\n // Check if this is only updating internal fields\n const onlyInternalFields = Object.keys(event).every((key: string) => {\n return key === 'type' || key.startsWith('_')\n })\n \n // Debug logging\n if (event.name !== undefined) {\n console.log(`[modelPropertyMachine] updateContext with name change: \"${context.name}\" -> \"${event.name}\"`)\n console.log(`[modelPropertyMachine] onlyInternalFields: ${onlyInternalFields}, has _originalValues: ${!!context._originalValues}`)\n }\n\n // Update the context with new values\n for (let i = 0; i < Object.keys(event).length; i++) {\n const key = Object.keys(event)[i] as string\n if (key === 'type') {\n continue\n }\n let value = (event as any)[key]\n // Convert null to undefined for optional fields (TypeBox validation expects undefined, not null)\n // This is especially important for refValueType, refModelId, etc.\n if (value === null && (key === 'refValueType' || key === 'refModelId' || key === 'ref' || key === 'refModelName')) {\n value = undefined\n }\n newContext[key] = value\n }\n\n // Preserve modelName and dataType from context or _originalValues so validation and savePropertyToDb\n // never run with missing required/needed fields (e.g. when a just-created property is renamed before\n // the full context is available from the creator).\n if (newContext.modelName === undefined && (context._originalValues as any)?.modelName !== undefined) {\n newContext.modelName = (context._originalValues as any).modelName\n }\n if (newContext.dataType === undefined && (context._originalValues as any)?.dataType !== undefined) {\n newContext.dataType = (context._originalValues as any).dataType\n }\n\n // Compare with original values and set _isEdited flag (only for non-internal updates)\n if (!onlyInternalFields && context._originalValues) {\n const hasChanges = Object.keys(event).some((key: string) => {\n if (key === 'type' || key.startsWith('_')) return false\n return newContext[key] !== (context._originalValues as any)?.[key]\n })\n newContext._isEdited = hasChanges\n }\n\n // Clear validation errors on context update (will be re-validated if needed)\n newContext._validationErrors = undefined\n\n // Convert null to undefined for optional fields (TypeBox validation expects undefined, not null)\n // This is especially important for refValueType, refModelId, etc.\n const optionalFields = ['refValueType', 'refModelId', 'ref', 'refModelName']\n for (const field of optionalFields) {\n if (newContext[field] === null) {\n newContext[field] = undefined\n }\n }\n\n return newContext\n }),\n // Only trigger validation and compareAndMarkDraft if we're updating non-internal fields\n guard: ({ event }: { event: any }) => {\n const shouldTransition = !Object.keys(event).every((key: string) => {\n return key === 'type' || key.startsWith('_')\n })\n if (event.name !== undefined) {\n console.log(`[modelPropertyMachine] updateContext guard result: ${shouldTransition} (will ${shouldTransition ? 'transition' : 'not transition'} to validating)`)\n }\n return shouldTransition\n },\n target: '.validating',\n },\n validateProperty: {\n target: '.validating',\n },\n validationSuccess: {\n actions: assign(({ context, event }) => ({\n ...context,\n _validationErrors: [],\n })),\n },\n validationError: {\n actions: 'assignValidationErrors',\n // Note: State-specific transitions are handled in child states\n // This root handler ensures errors are always assigned to context\n },\n initializeOriginalValues: {\n actions: assign(({ context, event }) => ({\n ...context,\n _originalValues: event.originalValues,\n _schemaName: event.schemaName,\n _isEdited: event.isEdited ?? false,\n _validationErrors: undefined,\n })),\n },\n clearEdited: {\n actions: assign(({ context }) => ({\n ...context,\n _isEdited: false,\n _originalValues: { ...context } as Partial<Static<typeof TProperty>>,\n })),\n },\n setSchemaName: {\n actions: assign(({ context, event }) => ({\n ...context,\n _schemaName: event.schemaName,\n })),\n },\n destroyStarted: {\n actions: assign({ _destroyInProgress: true, _destroyError: null }),\n },\n destroyDone: {\n actions: assign({ _destroyInProgress: false }),\n },\n destroyError: {\n actions: assign(({ event }) => ({\n _destroyInProgress: false,\n _destroyError:\n event.error instanceof Error\n ? { message: event.error.message, name: event.error.name }\n : { message: String(event.error) },\n })),\n },\n clearDestroyError: {\n actions: assign({ _destroyError: null }),\n },\n },\n states: {\n idle: {\n entry: assign({\n writeProcess: ({ spawn, context }) => {\n // Spawn writeProcess if we have id (schemaFileId)\n // New properties will have id generated\n const entityId = context.id\n if (!context.writeProcess && entityId) {\n return spawn(writeProcessMachine, {\n input: {\n entityType: 'modelProperty',\n entityId: String(entityId),\n entityData: context,\n },\n })\n }\n return context.writeProcess\n },\n }),\n on: {\n validateProperty: {\n target: 'validating',\n },\n requestWrite: {\n actions: ({ context, event }) => {\n if (context.writeProcess) {\n context.writeProcess.send({\n type: 'startWrite',\n data: event.data,\n })\n }\n },\n },\n },\n },\n validating: {\n entry: () => {\n console.log('[modelPropertyMachine] Entered validating state')\n },\n on: {\n validationSuccess: {\n target: 'compareAndMarkDraft',\n actions: assign(({ context, event }) => {\n console.log('[modelPropertyMachine] validationSuccess, transitioning to compareAndMarkDraft')\n return {\n ...context,\n _validationErrors: [],\n }\n }),\n },\n // validationError: Uses root handler for assignment, but needs state-specific transition\n validationError: {\n target: 'idle',\n actions: 'assignValidationErrors',\n },\n },\n invoke: {\n src: 'validateProperty',\n input: ({ context }) => ({ context }),\n },\n },\n compareAndMarkDraft: {\n entry: () => {\n console.log('[modelPropertyMachine] Entered compareAndMarkDraft state')\n },\n on: {\n compareAndMarkDraftSuccess: {\n target: 'idle',\n },\n compareAndMarkDraftError: {\n target: 'idle',\n },\n },\n invoke: {\n src: 'compareAndMarkDraft',\n input: ({ context }: { context: ModelPropertyMachineContext }) => {\n console.log('[modelPropertyMachine] Invoking compareAndMarkDraft with context:', {\n name: context.name,\n _originalValues: context._originalValues,\n modelName: context.modelName,\n id: context.id,\n _propertyFileId: context._propertyFileId\n })\n return { context }\n },\n },\n },\n saveToSchema: {\n always: {\n guard: 'isPropertyValid',\n target: '.saving',\n },\n initial: 'saving',\n on: {\n // validationError: Uses root handler for assignment, but needs state-specific transition\n validationError: {\n target: 'idle',\n actions: 'assignValidationErrors',\n },\n },\n invoke: {\n src: 'validateProperty',\n input: ({ context }) => ({ context }),\n },\n states: {\n saving: {\n on: {\n saveToSchemaSuccess: {\n target: '#modelProperty.idle',\n },\n saveToSchemaError: {\n target: '#modelProperty.idle',\n },\n },\n invoke: {\n src: 'saveToSchema',\n input: ({ context }) => ({ context }),\n },\n },\n },\n },\n },\n})\n","import { models as modelsTable, properties as propertiesTable } from '@/seedSchema/ModelSchema'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport { eq } from 'drizzle-orm'\n\nexport type ModelPropertyDataRow = {\n id: number\n name: string\n dataType: string\n modelId: number\n refModelId: number | null\n refValueType: string | null\n schemaFileId: string | null\n isEdited: number | null\n}\n\ntype GetModelPropertiesData = (\n modelFileId: string,\n) => Promise<ModelPropertyDataRow[]>\n\n/**\n * Returns property rows for a model identified by modelFileId (model's schemaFileId).\n * Resolves modelFileId -> modelId via models table, then selects all properties where modelId = ?.\n * Each row includes schemaFileId for use with ModelProperty.createById(schemaFileId).\n */\nexport const getModelPropertiesData: GetModelPropertiesData = async (\n modelFileId: string,\n): Promise<ModelPropertyDataRow[]> => {\n const appDb = BaseDb.getAppDb()\n if (!appDb || !modelFileId) {\n return []\n }\n\n const modelRows = await appDb\n .select({ id: modelsTable.id })\n .from(modelsTable)\n .where(eq(modelsTable.schemaFileId, modelFileId))\n .limit(1)\n\n if (modelRows.length === 0) {\n return []\n }\n\n const modelId = modelRows[0].id\n\n const rows = await appDb\n .select()\n .from(propertiesTable)\n .where(eq(propertiesTable.modelId, modelId))\n\n return rows as ModelPropertyDataRow[]\n}\n","import { ActorRefFrom, createActor, SnapshotFrom } from 'xstate'\nimport { Static } from '@sinclair/typebox'\nimport { ModelPropertyDataTypes, TProperty } from '@/Schema'\nimport { modelPropertyMachine, ModelPropertyMachineContext } from './service/modelPropertyMachine'\nimport { StorageType } from '@/types'\nimport type { CreateWaitOptions } from '@/types'\nimport { BaseFileManager, generateId } from '@/helpers'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport { getModelPropertiesData } from '@/db/read/getModelPropertiesData'\nimport { getModelId, getModelIdByFileId } from '@/helpers/db'\nimport { modelPropertiesToObject } from '@/helpers/model'\nimport { Model } from '@/Model/Model'\nimport { Schema } from '@/Schema/Schema'\nimport { properties as propertiesTable, models as modelsTable } from '@/seedSchema/ModelSchema'\nimport { schemas } from '@/seedSchema/SchemaSchema'\nimport { getSchemaNameFromModel } from './service/actors/saveToSchema'\nimport { modelSchemas } from '@/seedSchema/ModelSchemaSchema'\nimport { and, eq } from 'drizzle-orm'\nimport { createReactiveProxy } from '@/helpers/reactiveProxy'\nimport { waitForEntityIdle } from '@/helpers/waitForEntityIdle'\nimport { findEntity } from '@/helpers/entity/entityFind'\nimport { unloadEntity } from '@/helpers/entity/entityUnload'\nimport { forceRemoveFromCaches, runDestroyLifecycle } from '@/helpers/entity/entityDestroy'\nimport debug from 'debug'\n\nconst logger = debug('seedSdk:modelProperty:ModelProperty')\n\ntype ModelPropertyService = ActorRefFrom<typeof modelPropertyMachine>\ntype ModelPropertySnapshot = SnapshotFrom<typeof modelPropertyMachine>\n\n// Define the property keys from TProperty\nconst TPropertyKeys = [\n 'id',\n 'name',\n 'dataType',\n 'ref',\n 'modelId',\n 'refModelId',\n 'refValueType',\n 'storageType',\n 'localStorageDir',\n 'filenameSuffix',\n 'modelName',\n 'refModelName',\n] as const\n\nexport class ModelProperty {\n protected static instanceCache: Map<\n string,\n { instance: ModelProperty; refCount: number }\n > = new Map()\n \n // Pending writes tracking\n private static pendingWrites = new Map<string, {\n propertyFileId: string\n modelId: number\n status: 'pending' | 'writing' | 'success' | 'error'\n timestamp: number\n }>()\n \n protected readonly _service: ModelPropertyService\n\n name?: string\n dataType?: ModelPropertyDataTypes\n ref?: string\n modelId?: number\n modelName?: string\n refModelId?: number\n refModelName?: string\n refValueType?: ModelPropertyDataTypes\n storageType?: StorageType\n localStorageDir?: string\n filenameSuffix?: string\n\n constructor(property: Static<typeof TProperty>) {\n // id is now the schemaFileId (string), _dbId is the database integer ID\n // Preserve _propertyFileId if it exists in the property object (from getPropertySchema)\n // Convert null to undefined for optional fields (TypeBox validation expects undefined, not null)\n const serviceInput: ModelPropertyMachineContext = {\n ...property,\n _propertyFileId: (property as any)._propertyFileId || property.id,\n refValueType: property.refValueType ?? undefined,\n refModelId: property.refModelId ?? undefined,\n ref: property.ref ?? undefined,\n refModelName: property.refModelName ?? undefined,\n }\n\n this._service = createActor(modelPropertyMachine, {\n input: serviceInput,\n })\n\n this._service.start()\n\n // Initialize original values from the input property\n this._initializeOriginalValues(property)\n\n // Note: Property getters/setters are now handled by the Proxy in create()\n }\n\n /**\n * Initialize original values and schema name for tracking changes\n * This is called asynchronously after construction\n * If the property was loaded from the database and differs from the schema file,\n * it will be marked as edited.\n */\n private _initializeOriginalValues(property: Static<typeof TProperty>): void {\n // Resolve refModelId if ref/refModelName is provided but refModelId is missing\n const refModelName = property.refModelName || property.ref\n if (refModelName && !property.refModelId) {\n // Resolve refModelId asynchronously and update context\n this._resolveRefModelId(refModelName).then((refModelId) => {\n if (refModelId) {\n // Update the context with the resolved refModelId\n this._service.send({\n type: 'updateContext',\n refModelId,\n })\n }\n }).catch(() => {\n // Ignore errors - model might not exist yet\n })\n }\n\n // Get schema file values to use as \"original\" values\n // This allows us to detect if the property was edited (DB value differs from schema file)\n this._getSchemaFileValues(property).then((schemaFileValues) => {\n // Use schema file values as original (not the current property values)\n // This way, if current values differ from schema file, _isEdited will be true\n const originalValues: Partial<Static<typeof TProperty>> = schemaFileValues || {}\n \n // Compare current property values with schema file values to determine if edited\n // Only compare schema-relevant fields, not database-specific fields like id, modelId\n let isEdited = false\n if (schemaFileValues) {\n // Fields that are schema-relevant and should be compared\n const schemaRelevantFields: (keyof Static<typeof TProperty>)[] = [\n 'dataType',\n 'ref',\n 'refModelName',\n 'refValueType',\n 'storageType',\n 'localStorageDir',\n 'filenameSuffix',\n ]\n \n // Check if any schema-relevant field differs between current property and schema file\n isEdited = schemaRelevantFields.some((key) => {\n const currentValue = (property as any)[key]\n const originalValue = (schemaFileValues as any)[key]\n \n // Handle ref fields - compare by name\n if (key === 'ref' || key === 'refModelName') {\n const currentRef = property.refModelName || property.ref\n const originalRef = schemaFileValues.refModelName || schemaFileValues.ref\n // Both undefined/null means no ref, so they're the same\n if (!currentRef && !originalRef) return false\n return currentRef !== originalRef\n }\n \n // For other fields, compare values (handling undefined/null)\n if (currentValue === undefined && originalValue === undefined) return false\n if (currentValue === null && originalValue === null) return false\n if (currentValue === undefined && originalValue === null) return false\n if (currentValue === null && originalValue === undefined) return false\n \n return currentValue !== originalValue\n })\n } else {\n // No schema file values found - this is a runtime-created property\n // Use current property as original, but mark as edited since it hasn't been exported to file\n TPropertyKeys.forEach((key) => {\n if (property[key] !== undefined) {\n (originalValues as any)[key] = property[key]\n }\n })\n // For runtime-created properties, set isEdited = true initially\n isEdited = true\n }\n\n // Initialize with original values, including isEdited flag\n // Load isEdited from database if property exists in DB (async, fire-and-forget)\n this._loadIsEditedFromDb(property, isEdited).then((isEditedFromDb: boolean) => {\n this._service.send({\n type: 'initializeOriginalValues',\n originalValues,\n schemaName: undefined, // Will be set later if needed\n isEdited: isEditedFromDb,\n })\n }).catch(() => {\n // If we can't load from DB, use computed isEdited value\n this._service.send({\n type: 'initializeOriginalValues',\n originalValues,\n schemaName: undefined, // Will be set later if needed\n isEdited,\n })\n })\n }).catch(() => {\n // If we can't get schema file values, use current property as original\n const originalValues: Partial<Static<typeof TProperty>> = {}\n TPropertyKeys.forEach((key) => {\n if (property[key] !== undefined) {\n (originalValues as any)[key] = property[key]\n }\n })\n\n this._service.send({\n type: 'initializeOriginalValues',\n originalValues,\n schemaName: undefined,\n })\n })\n\n // Get schema name from model asynchronously (fire-and-forget)\n if (property.modelName) {\n this._setSchemaName(property.modelName).catch(() => {\n // If we can't get schema name, that's okay - it will be set later if needed\n })\n }\n }\n\n /**\n * Load isEdited flag from database if property exists in DB\n * @param property - The property data\n * @param fallbackIsEdited - Fallback value if property doesn't exist in DB\n * @returns The isEdited flag from database or fallback value\n */\n private async _loadIsEditedFromDb(\n property: Static<typeof TProperty>,\n fallbackIsEdited: boolean,\n ): Promise<boolean> {\n if (!property.modelName || !property.name) {\n return fallbackIsEdited\n }\n\n try {\n const db = BaseDb.getAppDb()\n if (!db) {\n return fallbackIsEdited\n }\n\n // Find model by name\n const modelRecords = await db\n .select({ id: modelsTable.id })\n .from(modelsTable)\n .where(eq(modelsTable.name, property.modelName))\n .limit(1)\n \n if (modelRecords.length === 0) {\n return fallbackIsEdited\n }\n\n // Find property by name and modelId\n const propertyRecords = await db\n .select({ isEdited: propertiesTable.isEdited })\n .from(propertiesTable)\n .where(\n and(\n eq(propertiesTable.name, property.name),\n eq(propertiesTable.modelId, modelRecords[0].id)\n )\n )\n .limit(1)\n \n if (propertyRecords.length > 0) {\n return propertyRecords[0].isEdited ?? false\n }\n } catch (error) {\n // Ignore errors - use fallback value\n }\n\n return fallbackIsEdited\n }\n\n /**\n * Resolve refModelId from refModelName by querying the database\n * @param refModelName - The name of the referenced model\n * @returns The database ID of the referenced model, or undefined if not found\n */\n private async _resolveRefModelId(refModelName: string): Promise<number | undefined> {\n if (!refModelName) {\n return undefined\n }\n\n try {\n const db = BaseDb.getAppDb()\n if (!db) {\n return undefined\n }\n\n const refModelRecords = await db\n .select()\n .from(modelsTable)\n .where(eq(modelsTable.name, refModelName))\n .limit(1)\n \n if (refModelRecords.length > 0 && refModelRecords[0].id) {\n return refModelRecords[0].id\n }\n } catch (error) {\n // Ignore errors - model might not exist yet or database not available\n logger(`Error resolving refModelId for model \"${refModelName}\":`, error)\n }\n\n return undefined\n }\n\n /**\n * Get schema file values for this property to use as \"original\" values\n * This allows comparison with database values to detect edits\n */\n private async _getSchemaFileValues(\n property: Static<typeof TProperty>,\n ): Promise<Partial<Static<typeof TProperty>> | undefined> {\n if (!property.modelName || !property.name) {\n return undefined\n }\n\n try {\n const model = await Model.getByNameAsync(property.modelName)\n \n if (!model || !model.properties || model.properties.length === 0) {\n return undefined\n }\n\n const schema = modelPropertiesToObject(model.properties)\n // Get the schema file value for this property\n const schemaFileValue = schema[property.name]\n if (!schemaFileValue) {\n return undefined\n }\n\n // Return schema file values as original values\n const originalValues: Partial<Static<typeof TProperty>> = {\n name: property.name,\n modelName: property.modelName,\n dataType: schemaFileValue.dataType,\n storageType: schemaFileValue.storageType,\n localStorageDir: schemaFileValue.localStorageDir,\n filenameSuffix: schemaFileValue.filenameSuffix,\n }\n\n // Handle ref fields\n if (schemaFileValue.ref) {\n originalValues.ref = schemaFileValue.ref\n originalValues.refModelName = schemaFileValue.ref\n // Try to get refModelId from database\n const refModelId = await this._resolveRefModelId(schemaFileValue.ref)\n if (refModelId) {\n originalValues.refModelId = refModelId\n }\n }\n\n if (schemaFileValue.refValueType) {\n originalValues.refValueType = schemaFileValue.refValueType\n }\n\n return originalValues\n } catch (error) {\n return undefined\n }\n }\n\n /**\n * Set the schema name for this property by looking it up from the model\n * Tries database first (more reliable), then falls back to schema files\n */\n private async _setSchemaName(modelName: string): Promise<void> {\n try {\n let schemaName: string | undefined\n\n // Try to get schema name from database first (more reliable)\n if (this.modelId) {\n try {\n const db = BaseDb.getAppDb()\n if (db) {\n const modelSchemaRecords = await db\n .select({\n schemaName: schemas.name,\n })\n .from(modelSchemas)\n .innerJoin(schemas, eq(modelSchemas.schemaId, schemas.id))\n .innerJoin(modelsTable, eq(modelSchemas.modelId, modelsTable.id))\n .where(eq(modelsTable.id, this.modelId))\n .limit(1)\n\n if (modelSchemaRecords.length > 0) {\n schemaName = modelSchemaRecords[0].schemaName\n }\n }\n } catch (error) {\n // Database lookup failed, continue to file-based lookup\n }\n }\n\n // Fall back to schema file lookup if database didn't work\n if (!schemaName) {\n schemaName = await getSchemaNameFromModel(modelName)\n }\n\n if (schemaName) {\n // Update the context with the schema name using dedicated event\n this._service.send({\n type: 'setSchemaName',\n schemaName,\n })\n }\n } catch (error) {\n // If we can't get schema name, that's okay - it will be set later if needed\n }\n }\n\n /**\n * Manually set the schema name for this property\n * Useful when you know the schema name from context (e.g., when working with Schema instances)\n */\n setSchemaName(schemaName: string): void {\n this._service.send({\n type: 'setSchemaName',\n schemaName,\n })\n }\n\n static create(\n property: Static<typeof TProperty>,\n options?: { waitForReady?: false },\n ): ModelProperty\n static create(\n property: Static<typeof TProperty>,\n options?: { waitForReady?: true; readyTimeout?: number },\n ): Promise<ModelProperty>\n static create(\n property: Static<typeof TProperty>,\n options?: CreateWaitOptions,\n ): ModelProperty | Promise<ModelProperty> {\n if (!property) {\n throw new Error('Property is required')\n }\n\n const waitForReady = options?.waitForReady !== false\n const readyTimeout = options?.readyTimeout ?? 5000\n\n // Debug: Log what's being passed to create()\n console.log(`[ModelProperty.create] Input property data:`, JSON.stringify({\n name: property.name,\n modelName: property.modelName,\n ref: property.ref,\n refModelName: property.refModelName,\n refModelId: property.refModelId,\n dataType: property.dataType,\n type: (property as any).type, // Check if it's using 'type' instead of 'dataType'\n }, null, 2))\n\n // Handle 'type' field from JSON schema format - convert to 'dataType'\n const propertyWithId = { ...property }\n if ((propertyWithId as any).type && !propertyWithId.dataType) {\n propertyWithId.dataType = (propertyWithId as any).type\n }\n \n // Ensure id (schemaFileId) is set correctly\n // Priority: _propertyFileId > id (if string) > generate new\n // If id is a number (old format), use _propertyFileId instead\n if (typeof propertyWithId.id === 'number') {\n // id is a database integer ID, not schemaFileId - use _propertyFileId if available\n if ((propertyWithId as any)._propertyFileId) {\n propertyWithId.id = (propertyWithId as any)._propertyFileId\n } else {\n // Fallback: generate new schemaFileId (shouldn't happen, but safety)\n propertyWithId.id = generateId()\n logger(`ModelProperty.create: id was a number, generated new schemaFileId \"${propertyWithId.id}\" for property \"${property.name}\"`)\n }\n } else if (!propertyWithId.id && (propertyWithId as any)._propertyFileId) {\n // id is not set but _propertyFileId is available - use it\n propertyWithId.id = (propertyWithId as any)._propertyFileId\n } else if (!propertyWithId.id) {\n // Generate id (schemaFileId) if not provided (for new properties)\n // This ensures new properties can trigger write process\n propertyWithId.id = generateId()\n logger(`ModelProperty.create: Generated new id (schemaFileId) \"${propertyWithId.id}\" for property \"${property.name}\"`)\n }\n\n // Create cache key from modelName and name, or use id\n const cacheKey = propertyWithId.modelName && propertyWithId.name\n ? `${propertyWithId.modelName}:${propertyWithId.name}`\n : propertyWithId.id\n ? `id:${propertyWithId.id}`\n : propertyWithId.name || 'unnamed'\n\n // Check if instance exists in cache\n if (this.instanceCache.has(cacheKey)) {\n const { instance, refCount } = this.instanceCache.get(cacheKey)!\n const cachedContext = instance._getSnapshotContext()\n console.log(`[ModelProperty.create] Returning cached instance for ${cacheKey}, context has ref:`, cachedContext.ref)\n \n // Update cached instance if new property data has fields that the cached instance doesn't have\n // This handles cases where the property was created without ref initially, but now we have ref from schema\n const needsUpdate: any = {}\n if (propertyWithId.ref && !cachedContext.ref) {\n needsUpdate.ref = propertyWithId.ref\n }\n if (propertyWithId.refModelName && !cachedContext.refModelName) {\n needsUpdate.refModelName = propertyWithId.refModelName\n }\n if (propertyWithId.refModelId && !cachedContext.refModelId) {\n needsUpdate.refModelId = propertyWithId.refModelId\n }\n \n if (Object.keys(needsUpdate).length > 0) {\n console.log(`[ModelProperty.create] Updating cached instance with missing fields:`, needsUpdate)\n instance._service.send({\n type: 'updateContext',\n ...needsUpdate,\n })\n }\n \n this.instanceCache.set(cacheKey, {\n instance,\n refCount: refCount + 1,\n })\n if (!waitForReady) return instance\n return waitForEntityIdle(instance, { timeout: readyTimeout }).then(\n () => instance,\n )\n }\n\n // Debug: Log what's being passed to the constructor\n console.log(`[ModelProperty.create] propertyWithId before constructor:`, JSON.stringify({\n name: propertyWithId.name,\n modelName: propertyWithId.modelName,\n ref: propertyWithId.ref,\n refModelName: propertyWithId.refModelName,\n refModelId: propertyWithId.refModelId,\n dataType: propertyWithId.dataType,\n }, null, 2))\n \n const newInstance = new this(propertyWithId)\n \n // Debug: Log what's being passed to the constructor\n console.log(`[ModelProperty.create] Creating instance for ${propertyWithId.modelName}:${propertyWithId.name}`, {\n ref: propertyWithId.ref,\n refModelName: propertyWithId.refModelName,\n refModelId: propertyWithId.refModelId,\n dataType: propertyWithId.dataType\n })\n \n // Wrap instance in Proxy for reactive property access\n const proxiedInstance = createReactiveProxy<ModelProperty>({\n instance: newInstance,\n service: newInstance._service,\n trackedProperties: TPropertyKeys,\n getContext: (instance) => {\n const context = instance._getSnapshotContext()\n return context\n },\n sendUpdate: (instance, prop: string, value: any) => {\n if (prop === 'name') {\n const currentContext = instance._getSnapshotContext()\n console.log(`[ModelProperty.sendUpdate] Name change: \"${currentContext.name}\" -> \"${value}\"`)\n console.log(`[ModelProperty.sendUpdate] Current state: ${instance._service.getSnapshot().value}`)\n console.log(`[ModelProperty.sendUpdate] Has _originalValues: ${!!currentContext._originalValues}`)\n }\n instance._service.send({\n type: 'updateContext',\n [prop]: value,\n })\n if (prop === 'name') {\n // Check state after sending\n setTimeout(() => {\n const newState = instance._service.getSnapshot().value\n console.log(`[ModelProperty.sendUpdate] State after name change: ${newState}`)\n }, 10)\n }\n },\n })\n \n this.instanceCache.set(cacheKey, {\n instance: proxiedInstance,\n refCount: 1,\n })\n \n // Trigger write process if property has modelId (or modelName) and id (schemaFileId)\n // Wait for service to be ready (idle state) and have writeProcess spawned\n const propertyFileId = propertyWithId.id // id is now the schemaFileId (string)\n const hasModelId = propertyWithId.modelId || propertyWithId.modelName\n \n if (hasModelId && propertyFileId) {\n // Wait for writeProcess to be spawned (it's spawned in idle state entry action)\n // Retry a few times if writeProcess isn't available yet\n let retries = 0\n const maxRetries = 10\n const checkAndSend = async () => {\n const service = proxiedInstance.getService()\n const snapshot = service.getSnapshot()\n \n if (snapshot.value === 'idle' && snapshot.context.writeProcess) {\n const writeProcess = snapshot.context.writeProcess\n \n // Resolve dbModelId - convert from string (modelFileId) to number (database ID) if needed\n let resolvedModelId: number | undefined = undefined\n \n if (propertyWithId.modelId) {\n if (typeof propertyWithId.modelId === 'number') {\n resolvedModelId = propertyWithId.modelId\n } else if (typeof propertyWithId.modelId === 'string') {\n // modelId is a string (modelFileId), need to convert to database ID\n try {\n resolvedModelId = await getModelIdByFileId(propertyWithId.modelId)\n logger(`Converted modelFileId \"${propertyWithId.modelId}\" to database modelId: ${resolvedModelId}`)\n } catch (error) {\n logger(`Failed to convert modelFileId \"${propertyWithId.modelId}\" to database ID: ${error}`)\n console.error(`[ModelProperty.create] Failed to convert modelFileId: ${error}`)\n }\n }\n }\n \n // If we still don't have a modelId, try to resolve it from modelName\n if (!resolvedModelId && propertyWithId.modelName) {\n try {\n // Get schemaName from context if available\n const schemaName = snapshot.context._schemaName\n resolvedModelId = await getModelId(propertyWithId.modelName, schemaName)\n logger(`Resolved modelId for model \"${propertyWithId.modelName}\": ${resolvedModelId}`)\n } catch (error) {\n logger(`Failed to resolve modelId for model \"${propertyWithId.modelName}\": ${error}`)\n console.error(`[ModelProperty.create] Failed to resolve modelId: ${error}`)\n }\n }\n \n if (!resolvedModelId) {\n logger(`ERROR: Cannot write property \"${property.name}\" - no modelId available`)\n console.error(`[ModelProperty.create] ERROR: Cannot write property \"${property.name}\" - no modelId available. modelId: ${propertyWithId.modelId}, modelName: ${propertyWithId.modelName}`)\n // Don't clear pending write here - it might resolve later\n return\n }\n \n // Track pending write now that we have the resolved modelId\n this.trackPendingWrite(propertyFileId, resolvedModelId)\n \n logger(`Triggering write process for property \"${property.name}\" (modelId: ${resolvedModelId}, propertyFileId: ${propertyFileId})`)\n \n // Check current write state\n const currentWriteState = writeProcess.getSnapshot()\n \n if (currentWriteState.value === 'success') {\n // Write already succeeded, clear pending write immediately\n this.clearPendingWrite(propertyFileId, 'success')\n } else {\n // Set up subscription to catch future state changes\n const writeSubscription = writeProcess.subscribe((writeSnapshot) => {\n if (writeSnapshot.value === 'success') {\n writeSubscription.unsubscribe()\n logger(`[writeProcess subscription] Write succeeded for property \"${property.name}\" (propertyFileId: ${propertyFileId})`)\n // Clear pending write on success\n this.clearPendingWrite(propertyFileId, 'success')\n } else if (writeSnapshot.value === 'error') {\n writeSubscription.unsubscribe()\n const errorContext = writeSnapshot.context\n logger(`Write process failed for property \"${property.name}\" (propertyFileId: ${propertyFileId}): ${errorContext.error?.message || 'Unknown error'}`)\n logger(`Write process error details:`, errorContext.error)\n // Mark pending write as error\n this.clearPendingWrite(propertyFileId, 'error')\n }\n })\n }\n \n const propertyData = {\n modelId: resolvedModelId,\n name: property.name!,\n dataType: property.dataType!,\n refModelId: property.refModelId,\n refValueType: property.refValueType,\n storageType: property.storageType,\n localStorageDir: property.localStorageDir,\n filenameSuffix: property.filenameSuffix,\n }\n \n service.send({\n type: 'requestWrite',\n data: propertyData,\n })\n } else if (retries < maxRetries) {\n retries++\n setTimeout(checkAndSend, 50) // Retry after 50ms\n } else {\n logger(`ERROR: writeProcess not available after ${maxRetries} retries for property \"${property.name}\" (propertyFileId: ${propertyFileId})`)\n console.error(`[ModelProperty.create] ERROR: writeProcess not available after ${maxRetries} retries for property \"${property.name}\" (propertyFileId: ${propertyFileId})`)\n // Mark as error if we couldn't even start the write process\n this.clearPendingWrite(propertyFileId, 'error')\n }\n }\n \n // Start checking after a short delay to allow state machine to initialize\n setTimeout(checkAndSend, 0)\n }\n \n if (!waitForReady) return proxiedInstance\n return waitForEntityIdle(proxiedInstance, { timeout: readyTimeout }).then(\n () => proxiedInstance,\n )\n }\n\n /**\n * Get ModelProperty instance by propertyFileId from static cache\n */\n static getById(propertyFileId: string): ModelProperty | undefined {\n if (!propertyFileId) return undefined\n \n // Search through cache to find by propertyFileId\n // Cache key might be \"modelName:propertyName\" or \"id:propertyId\"\n for (const [cacheKey, { instance }] of this.instanceCache.entries()) {\n const context = instance._getSnapshotContext()\n // id is now the schemaFileId (string)\n if (context.id === propertyFileId) {\n return instance\n }\n }\n \n return undefined\n }\n\n /**\n * Create or get ModelProperty instance by propertyFileId\n * Queries the database to find the property if not cached\n */\n static async createById(propertyFileId: string): Promise<ModelProperty | undefined> {\n if (!propertyFileId) {\n return undefined\n }\n\n // First, check if we have an instance cached\n const cachedInstance = this.getById(propertyFileId)\n if (cachedInstance) {\n return cachedInstance\n }\n\n // Query database to get property data from ID\n const db = BaseDb.getAppDb()\n console.log('db', !!db)\n if (!db) {\n console.log('db not found')\n return undefined\n }\n\n const testRecords = await db\n .select()\n .from(propertiesTable)\n .limit(100)\n\n console.log('testRecords', testRecords)\n\n const propertyRecords = await db\n .select()\n .from(propertiesTable)\n .where(eq(propertiesTable.schemaFileId, propertyFileId))\n .limit(1)\n\n console.log('propertyRecords', propertyRecords)\n\n if (propertyRecords.length === 0) {\n return undefined\n }\n\n const propertyRecord = propertyRecords[0]\n\n // Get model name\n const modelRecords = await db\n .select({ name: modelsTable.name })\n .from(modelsTable)\n .where(eq(modelsTable.id, propertyRecord.modelId))\n .limit(1)\n\n if (modelRecords.length === 0) {\n return undefined\n }\n\n const modelName = modelRecords[0].name\n\n // Build property data\n // id is now the schemaFileId (string), _dbId is the database integer ID\n const propertyData: Static<typeof TProperty> = {\n id: propertyFileId, // schemaFileId (string) - public ID\n _dbId: propertyRecord.id ?? undefined, // Database integer ID - internal only\n name: propertyRecord.name,\n dataType: propertyRecord.dataType as ModelPropertyDataTypes,\n modelId: propertyRecord.modelId,\n modelName,\n refModelId: propertyRecord.refModelId || undefined,\n refValueType: propertyRecord.refValueType ? (propertyRecord.refValueType as ModelPropertyDataTypes) : undefined,\n }\n \n // Load isEdited from database\n const isEditedFromDb = propertyRecord.isEdited ?? false\n\n // Get ref model name if applicable\n if (propertyRecord.refModelId) {\n const refModelRecords = await db\n .select({ name: modelsTable.name })\n .from(modelsTable)\n .where(eq(modelsTable.id, propertyRecord.refModelId))\n .limit(1)\n\n if (refModelRecords.length > 0) {\n propertyData.refModelName = refModelRecords[0].name\n propertyData.ref = refModelRecords[0].name\n }\n }\n\n // Create ModelProperty instance (sync for createById so we can send updateContext)\n const instance = this.create(propertyData, { waitForReady: false })\n \n // Set isEdited from database after creation\n if (isEditedFromDb) {\n instance._service.send({\n type: 'updateContext',\n _isEdited: true,\n })\n }\n \n return instance\n }\n\n /**\n * Find ModelProperty instance by propertyFileId\n * Waits for the property to be fully loaded (idle state) by default\n * @param options - Find options including propertyFileId and wait configuration\n * @returns ModelProperty instance if found, undefined otherwise\n */\n static async find({\n propertyFileId,\n waitForReady = true,\n readyTimeout = 5000,\n }: {\n propertyFileId: string\n waitForReady?: boolean\n readyTimeout?: number\n }): Promise<ModelProperty | undefined> {\n if (!propertyFileId) {\n return undefined\n }\n\n return await findEntity<ModelProperty>(\n {\n getById: (id) => ModelProperty.getById(id),\n createById: (id) => ModelProperty.createById(id),\n },\n { id: propertyFileId },\n {\n waitForReady,\n readyTimeout,\n }\n )\n }\n\n /**\n * Get all ModelProperty instances for a model.\n * Loads property rows from DB for the given modelFileId, creates instances via createById, optionally waits for idle.\n */\n static async all(\n modelFileId: string,\n options?: { waitForReady?: boolean; readyTimeout?: number },\n ): Promise<ModelProperty[]> {\n const { waitForReady = false, readyTimeout = 5000 } = options ?? {}\n if (!modelFileId) {\n return []\n }\n\n const rows = await getModelPropertiesData(modelFileId)\n const instances: ModelProperty[] = []\n\n for (const row of rows) {\n if (row.schemaFileId) {\n const instance = await this.createById(row.schemaFileId)\n if (instance) {\n instances.push(instance)\n }\n }\n }\n\n if (waitForReady && instances.length > 0) {\n await Promise.all(\n instances.map((p) =>\n waitForEntityIdle(p as Parameters<typeof waitForEntityIdle>[0], {\n timeout: readyTimeout,\n }),\n ),\n )\n }\n\n return instances\n }\n\n /**\n * Track a pending write for a property\n */\n static trackPendingWrite(propertyFileId: string, modelId: number): void {\n this.pendingWrites.set(propertyFileId, {\n propertyFileId,\n modelId,\n status: 'pending',\n timestamp: Date.now(),\n })\n }\n\n /**\n * Clear or update pending write status\n */\n static clearPendingWrite(propertyFileId: string, status: 'success' | 'error' = 'success'): void {\n const write = this.pendingWrites.get(propertyFileId)\n if (write) {\n if (status === 'success') {\n // Remove successful writes from pendingWrites\n this.pendingWrites.delete(propertyFileId)\n logger(`Cleared pending write for property \"${propertyFileId}\" (status: success)`)\n } else {\n // Update status to error but keep in map (for debugging/retry purposes)\n write.status = 'error'\n this.pendingWrites.set(propertyFileId, write)\n logger(`Marked pending write as error for property \"${propertyFileId}\"`)\n }\n }\n }\n\n /**\n * Get all pending property IDs for a model\n */\n static getPendingPropertyIds(modelId: number): string[] {\n return Array.from(this.pendingWrites.entries())\n .filter(([_, write]) => write.modelId === modelId && write.status !== 'error')\n .map(([propertyFileId]) => propertyFileId)\n }\n\n /**\n * Get modelId for a property that has a pending write (row may not be in DB yet).\n * Used to resolve modelName when validating a just-created property rename.\n */\n static getPendingModelId(propertyFileId: string): number | undefined {\n return this.pendingWrites.get(propertyFileId)?.modelId\n }\n\n getService(): ModelPropertyService {\n return this._service\n }\n\n private _getSnapshot(): ModelPropertySnapshot {\n return this._service.getSnapshot() as ModelPropertySnapshot\n }\n\n public _getSnapshotContext(): ModelPropertyMachineContext {\n return this._getSnapshot().context\n }\n\n get path() {\n const workingDir = BaseFileManager.getWorkingDir()\n if (!this.localStorageDir || !this.name || !this.filenameSuffix) {\n return undefined\n }\n return `${workingDir}/${this.localStorageDir}/${this.name}${this.filenameSuffix || ''}`\n }\n\n get status() {\n return this._getSnapshot().value\n }\n\n get isEdited() {\n const context = this._getSnapshotContext()\n // First check in-memory state\n if (context._isEdited !== undefined) {\n return context._isEdited\n }\n // Fall back to reading from database if we have _dbId\n if (context._dbId) {\n // Load from database asynchronously (fire-and-forget for now)\n // For synchronous getter, we'll need to cache it or make it async\n // For now, return false if not in context\n return false\n }\n return false\n }\n\n get validationErrors() {\n return this._getSnapshotContext()._validationErrors || []\n }\n\n get isValid() {\n const errors = this.validationErrors\n return errors.length === 0\n }\n\n /**\n * Validate the property\n * @returns Validation result\n */\n async validate(): Promise<{ isValid: boolean; errors: any[] }> {\n return new Promise((resolve) => {\n let resolved = false\n const subscription = this._service.subscribe((snapshot) => {\n const state = snapshot.value\n // Wait for validation to complete (idle state after validating)\n if (state === 'idle' && !resolved) {\n resolved = true\n subscription.unsubscribe()\n const errors = snapshot.context._validationErrors || []\n resolve({\n isValid: errors.length === 0,\n errors,\n })\n }\n })\n\n this._service.send({ type: 'validateProperty' })\n \n // Timeout fallback\n setTimeout(() => {\n if (!resolved) {\n resolved = true\n subscription.unsubscribe()\n const errors = this._getSnapshotContext()._validationErrors || []\n resolve({\n isValid: errors.length === 0,\n errors,\n })\n }\n }, 5000)\n })\n }\n\n save(): void {\n // Validation will happen automatically in the machine before saving\n this._service.send({\n type: 'saveToSchema',\n })\n }\n\n /**\n * Reload property from database\n * This refreshes the actor context with the latest data from the database\n * Note: ModelProperty doesn't have a dedicated load actor, so this will\n * re-initialize from the current property data\n */\n async reload(): Promise<void> {\n // ModelProperty doesn't have a separate load mechanism\n // It's loaded as part of the Model/Schema\n // This method is provided for API consistency\n // To actually reload, you'd need to reload the parent Model or Schema\n logger('ModelProperty.reload() called - ModelProperty is loaded as part of Model/Schema. Reload the parent Model or Schema instead.')\n // No-op for now, but could be enhanced to reload from DB if needed\n }\n\n unload(): void {\n // ModelProperty doesn't have liveQuery subscriptions or complex cache management\n // Just stop the service\n try {\n this._service.stop()\n } catch (error) {\n // Service might already be stopped\n }\n }\n\n /**\n * Destroy the model property: remove from caches, delete from database, update Schema context, stop service.\n */\n async destroy(): Promise<void> {\n const context = this._getSnapshotContext()\n const cacheKey =\n context.modelName && context.name\n ? `${context.modelName}:${context.name}`\n : (context.id ?? '')\n if (!cacheKey) return\n\n forceRemoveFromCaches(this, {\n getCacheKeys: () => [cacheKey],\n caches: [ModelProperty.instanceCache as Map<string, unknown>],\n })\n\n await runDestroyLifecycle(this, {\n getService: (instance) =>\n instance._service as { send: (ev: unknown) => void; stop: () => void },\n doDestroy: async () => {\n const db = BaseDb.getAppDb()\n const schemaName = context._schemaName\n const modelName = context.modelName\n const propertyName = context.name\n if (!modelName || !propertyName) return\n\n if (db && schemaName) {\n const propertyRecords = await db\n .select({ propertyId: propertiesTable.id })\n .from(propertiesTable)\n .innerJoin(modelsTable, eq(propertiesTable.modelId, modelsTable.id))\n .innerJoin(modelSchemas, eq(modelsTable.id, modelSchemas.modelId))\n .innerJoin(schemas, eq(modelSchemas.schemaId, schemas.id))\n .where(\n and(\n eq(schemas.name, schemaName),\n eq(modelsTable.name, modelName),\n eq(propertiesTable.name, propertyName),\n ),\n )\n .limit(1)\n if (propertyRecords.length > 0 && propertyRecords[0].propertyId != null) {\n await db\n .delete(propertiesTable)\n .where(eq(propertiesTable.id, propertyRecords[0].propertyId))\n }\n }\n\n if (schemaName) {\n const schema = Schema.create(schemaName, { waitForReady: false }) as import('@/Schema/Schema').Schema\n const snapshot = schema.getService().getSnapshot()\n const schemaContext = snapshot.context\n if (schemaContext.models?.[modelName]?.properties?.[propertyName]) {\n const updatedModels = { ...schemaContext.models }\n const updatedProperties = { ...updatedModels[modelName].properties }\n delete updatedProperties[propertyName]\n updatedModels[modelName] = { ...updatedModels[modelName], properties: updatedProperties }\n schema.getService().send({ type: 'updateContext', models: updatedModels })\n schema.getService().send({ type: 'markAsDraft', propertyKey: `property:${modelName}:${propertyName}` })\n }\n }\n },\n })\n }\n}\n"],"names":["logger","modelsTable","propertiesTable"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PathResolver-CX6GHoTS.js","sources":["../src/browser/helpers/PathResolver.ts"],"sourcesContent":["import { BasePathResolver } from '@/helpers/PathResolver/BasePathResolver'\n\nclass PathResolver extends BasePathResolver {\n /**\n * Gets the root directory containing node_modules\n * Note: In browser, this returns a virtual path based on OPFS\n */\n getRootWithNodeModules(): string {\n // In browser, we use OPFS which doesn't have traditional paths\n // Return a virtual root path\n return '/'\n }\n\n /**\n * Gets the SDK root directory\n * Note: In browser, this returns a virtual path\n */\n getSdkRootDir(): string {\n // In browser, SDK is bundled, so we return a virtual path\n return '/sdk'\n }\n\n getNodeModulesDir(): string {\n // In browser, node_modules don't exist in the traditional sense\n return '/node_modules'\n }\n\n /**\n * Gets the .seed directory path\n * Note: In browser, this returns the OPFS path where .seed data is stored\n */\n getDotSeedDir(schemaFileDir?: string): string {\n // In browser, .seed directory is stored in OPFS\n // The actual path is handled by the FileManager\n return '/.seed'\n }\n\n /**\n * Finds the Seed Protocol config file\n * Note: In browser, config files are not accessible via filesystem\n */\n findConfigFile(searchDir?: string): string | null {\n // In browser, config files are typically embedded in the bundle\n // or loaded via fetch/import\n return null\n }\n\n /**\n * Gets paths for app-specific directories\n * Note: In browser, these are virtual paths for OPFS\n */\n getAppPaths(schemaFileDir?: string | undefined) {\n const dotSeedDir = this.getDotSeedDir(schemaFileDir)\n\n return {\n sdkRootDir: this.getSdkRootDir(),\n dotSeedDir,\n nodeModulesDir: this.getNodeModulesDir(),\n appSchemaDir: `${dotSeedDir}/schema`,\n appDbDir: `${dotSeedDir}/db`,\n appMetaDir: `${dotSeedDir}/db/meta`,\n drizzleKitPath: `${this.getNodeModulesDir()}/drizzle-kit/bin.cjs`,\n templatePath: `${this.getSdkRootDir()}/node/codegen/templates`\n }\n }\n}\n\nBasePathResolver.setPlatformClass(PathResolver)\n\nexport { PathResolver }\n\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAEA,MAAM,YAAa,SAAQ,gBAAgB,CAAA;AACzC;;;AAGG;IACH,sBAAsB,GAAA;;;AAGpB,QAAA,OAAO,GAAG;IACZ;AAEA;;;AAGG;IACH,aAAa,GAAA;;AAEX,QAAA,OAAO,MAAM;IACf;IAEA,iBAAiB,GAAA;;AAEf,QAAA,OAAO,eAAe;IACxB;AAEA;;;AAGG;AACH,IAAA,aAAa,CAAC,aAAsB,EAAA;;;AAGlC,QAAA,OAAO,QAAQ;IACjB;AAEA;;;AAGG;AACH,IAAA,cAAc,CAAC,SAAkB,EAAA;;;AAG/B,QAAA,OAAO,IAAI;IACb;AAEA;;;AAGG;AACH,IAAA,WAAW,CAAC,aAAkC,EAAA;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;QAEpD,OAAO;AACL,YAAA,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE;YAChC,UAAU;AACV,YAAA,cAAc,EAAE,IAAI,CAAC,iBAAiB,EAAE;YACxC,YAAY,EAAE,CAAA,EAAG,UAAU,CAAA,OAAA,CAAS;YACpC,QAAQ,EAAE,CAAA,EAAG,UAAU,CAAA,GAAA,CAAK;YAC5B,UAAU,EAAE,CAAA,EAAG,UAAU,CAAA,QAAA,CAAU;AACnC,YAAA,cAAc,EAAE,CAAA,EAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA,oBAAA,CAAsB;AACjE,YAAA,YAAY,EAAE,CAAA,EAAG,IAAI,CAAC,aAAa,EAAE,CAAA,uBAAA;SACtC;IACH;AACD;AAED,gBAAgB,CAAC,gBAAgB,CAAC,YAAY,CAAC;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PathResolver-z_WX47_o.js","sources":["../src/node/helpers/PathResolver.ts"],"sourcesContent":["import path from 'path'\nimport fs from 'fs'\nimport { SEED_CONFIG_FILE, SEED_CONFIG_FALLBACKS } from '@/helpers/constants'\nimport { BasePathResolver } from '@/helpers/PathResolver/BasePathResolver'\nimport debug from 'debug'\n\nconst logger = debug('seedSdk:node:helpers:PathResolver')\n\nclass PathResolver extends BasePathResolver {\n /**\n * Detects the current environment based on filesystem structure and package.json\n */\n private detectEnvironment(): 'sdk-dev' | 'linked-sdk' | 'production' | 'test' {\n // Check if we're in the SDK repo itself\n if (process.env.NODE_ENV !== 'test' && this.isInSdkRepo()) {\n return 'sdk-dev'\n }\n\n // Check if we're running tests\n if (process.env.NODE_ENV === 'test') {\n return 'test'\n }\n\n // Check if we're using a linked version of the SDK\n if (this.isUsingLinkedSdk()) {\n return 'linked-sdk'\n }\n\n // Default to production environment\n return 'production'\n }\n\n private isInSdkRepo(): boolean {\n try {\n // Check if we're in the SDK repo by looking for specific SDK files/directories\n const currentDir = process.cwd()\n return fs.existsSync(path.join(currentDir, 'src', 'node')) &&\n fs.existsSync(path.join(currentDir, 'package.json')) &&\n JSON.parse(fs.readFileSync(path.join(currentDir, 'package.json'), 'utf8')).name === '@seedprotocol/sdk'\n } catch {\n return false\n }\n }\n\n private isUsingLinkedSdk(): boolean {\n try {\n const pkgPath = path.join(process.cwd(), 'package.json')\n if (!fs.existsSync(pkgPath)) return false\n \n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'))\n const sdkDep = pkg.dependencies?.['@seedprotocol/sdk']\n \n return sdkDep && (sdkDep.startsWith('link:') || sdkDep.startsWith('portal:'))\n } catch {\n return false\n }\n }\n\n /**\n * Gets the root directory containing node_modules\n */\n getRootWithNodeModules(): string {\n const processCwd = process.cwd()\n\n const calledFromMocks = processCwd.includes('__mocks__')\n\n if (calledFromMocks) {\n return path.join(processCwd, '..', '..', '..', '..',)\n }\n\n return processCwd\n }\n\n /**\n * Gets the SDK root directory\n */\n getSdkRootDir(): string {\n const env = this.detectEnvironment()\n const rootWithNodeModules = this.getRootWithNodeModules()\n const processCwd = process.cwd()\n\n // For test environment, always return the SDK root directory\n if (env === 'test') {\n return rootWithNodeModules\n }\n\n if (env === 'linked-sdk') {\n // For linked packages, find the package directory\n const pkgJson = JSON.parse(fs.readFileSync(path.join(processCwd, 'package.json'), 'utf8'))\n const sdkPath = pkgJson.dependencies?.['@seedprotocol/sdk'] || pkgJson.devDependencies?.['@seedprotocol/sdk']\n if (sdkPath === 'link:@seedprotocol/sdk') {\n return path.join(processCwd, 'node_modules', '@seedprotocol', 'sdk',)\n }\n return path.resolve(processCwd, sdkPath.replace(/^(link:|portal:)/, ''))\n }\n\n // After early returns, env can only be 'sdk-dev' or 'production'\n if (env === 'sdk-dev') {\n // This should be {localDir}/seed-protocol-sdk (the SDK root directory)\n return rootWithNodeModules\n }\n \n // Default to production environment\n // This should be {projectDir}/node_modules/@seedprotocol/sdk/dist\n return path.join(rootWithNodeModules, 'node_modules', '@seedprotocol', 'sdk', 'dist')\n }\n\n getNodeModulesDir(): string {\n const env = this.detectEnvironment()\n const rootWithNodeModules = this.getRootWithNodeModules()\n\n let nodeModulesDir = path.join(rootWithNodeModules, 'node_modules')\n\n if (env !== 'linked-sdk' && env !== 'sdk-dev' && nodeModulesDir.includes('__tests__')) {\n nodeModulesDir = path.join(process.cwd(), '..', '..', '..', '..', 'node_modules',)\n }\n\n return nodeModulesDir\n }\n\n /**\n * Gets the .seed directory path\n */\n getDotSeedDir(schemaFileDir?: string): string {\n if (!schemaFileDir && process.env.SEED_SDK_TEST_PROJECT_TYPE && !process.cwd().includes('__mocks__')) {\n return path.join(process.cwd(), '__tests__', '__mocks__', process.env.SEED_SDK_TEST_PROJECT_TYPE, 'project', '.seed')\n }\n return path.join(schemaFileDir || process.cwd(), '.seed')\n }\n\n /**\n * Finds the Seed Protocol config file in the given directory\n * @param searchDir - Directory to search for the config file\n * @returns The path to the found config file, or null if not found\n */\n findConfigFile(searchDir: string = process.cwd()): string | null {\n // First try the primary config file name\n const primaryPath = path.join(searchDir, SEED_CONFIG_FILE)\n if (fs.existsSync(primaryPath)) {\n return primaryPath\n }\n\n // Then try fallback names in order\n for (const fallbackName of SEED_CONFIG_FALLBACKS) {\n const fallbackPath = path.join(searchDir, fallbackName)\n if (fs.existsSync(fallbackPath)) {\n return fallbackPath\n }\n }\n\n return null\n }\n\n /**\n * Gets paths for app-specific directories\n */\n getAppPaths(schemaFileDir?: string | undefined) {\n const env = this.detectEnvironment()\n const dotSeedDir = this.getDotSeedDir(schemaFileDir)\n const nodeModulesDir = this.getNodeModulesDir()\n\n let drizzleKitPath = path.join(nodeModulesDir, 'drizzle-kit', 'bin.cjs')\n\n if (env === 'linked-sdk') {\n const sdkRootDir = this.getSdkRootDir()\n const sdkPackageDir = path.dirname(sdkRootDir)\n const sdkNodeModulesDir = path.join(sdkPackageDir, 'node_modules')\n drizzleKitPath = path.join(sdkNodeModulesDir, 'drizzle-kit', 'bin.cjs')\n }\n\n // Determine the correct template path based on environment\n let templatePath: string\n if (env === 'production') {\n // In production, templates are at dist/node/codegen/templates\n templatePath = path.join(this.getSdkRootDir(), 'node', 'codegen', 'templates')\n } else {\n // In development/test, templates are at src/node/codegen/templates\n templatePath = path.join(this.getSdkRootDir(), 'src', 'node', 'codegen', 'templates')\n }\n\n logger('env', env)\n\n logger('getAppPaths', {\n sdkRootDir: this.getSdkRootDir(),\n dotSeedDir,\n nodeModulesDir,\n appSchemaDir: path.join(dotSeedDir, 'schema'),\n appDbDir: path.join(dotSeedDir, 'db'),\n appMetaDir: path.join(dotSeedDir, 'db', 'meta'),\n })\n\n return {\n sdkRootDir: this.getSdkRootDir(),\n dotSeedDir,\n nodeModulesDir,\n appSchemaDir: path.join(dotSeedDir, 'schema'),\n appDbDir: path.join(dotSeedDir, 'db'),\n appMetaDir: path.join(dotSeedDir, 'db', 'meta'),\n drizzleKitPath,\n templatePath\n }\n }\n}\n\nBasePathResolver.setPlatformClass(PathResolver)\n\nexport { PathResolver }\n\n"],"names":["fs"],"mappings":";;;;;;;;;;;;;;;;;;AAMA,MAAM,MAAM,GAAG,KAAK,CAAC,mCAAmC,CAAC;AAEzD,MAAM,YAAa,SAAQ,gBAAgB,CAAA;AACzC;;AAEG;IACK,iBAAiB,GAAA;;AAEvB,QAAA,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;AACzD,YAAA,OAAO,SAAS;QAClB;;QAGA,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE;AACnC,YAAA,OAAO,MAAM;QACf;;AAGA,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;AAC3B,YAAA,OAAO,YAAY;QACrB;;AAGA,QAAA,OAAO,YAAY;IACrB;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI;;AAEF,YAAA,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;AAChC,YAAA,OAAOA,WAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;gBACnDA,WAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;gBACpD,IAAI,CAAC,KAAK,CAACA,WAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,mBAAmB;QAChH;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,KAAK;QACd;IACF;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI;AACF,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC;AACxD,YAAA,IAAI,CAACA,WAAE,CAAC,UAAU,CAAC,OAAO,CAAC;AAAE,gBAAA,OAAO,KAAK;AAEzC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAACA,WAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACxD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,GAAG,mBAAmB,CAAC;AAEtD,YAAA,OAAO,MAAM,KAAK,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC/E;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,KAAK;QACd;IACF;AAEA;;AAEG;IACH,sBAAsB,GAAA;AACpB,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;QAEhC,MAAM,eAAe,GAAG,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;QAExD,IAAI,eAAe,EAAE;AACnB,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAE;QACvD;AAEA,QAAA,OAAO,UAAU;IACnB;AAEA;;AAEG;IACH,aAAa,GAAA;AACX,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACpC,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,EAAE;AACzD,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;;AAGhC,QAAA,IAAI,GAAG,KAAK,MAAM,EAAE;AAClB,YAAA,OAAO,mBAAmB;QAC5B;AAEA,QAAA,IAAI,GAAG,KAAK,YAAY,EAAE;;YAExB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAACA,WAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;AAC1F,YAAA,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,GAAG,mBAAmB,CAAC,IAAI,OAAO,CAAC,eAAe,GAAG,mBAAmB,CAAC;AAC7G,YAAA,IAAI,OAAO,KAAK,wBAAwB,EAAE;AACxC,gBAAA,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,CAAE;YACvE;AACA,YAAA,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAC1E;;AAGA,QAAA,IAAI,GAAG,KAAK,SAAS,EAAE;;AAErB,YAAA,OAAO,mBAAmB;QAC5B;;;AAIA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,CAAC;IACvF;IAEA,iBAAiB,GAAA;AACf,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACpC,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,EAAE;QAEzD,IAAI,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAC;AAEnE,QAAA,IAAI,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,SAAS,IAAI,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;YACrF,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAE;QACpF;AAEA,QAAA,OAAO,cAAc;IACvB;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,aAAsB,EAAA;QAClC,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;YACpG,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,SAAS,EAAE,OAAO,CAAC;QACvH;AACA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC;IAC3D;AAEA;;;;AAIG;AACH,IAAA,cAAc,CAAC,SAAA,GAAoB,OAAO,CAAC,GAAG,EAAE,EAAA;;QAE9C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC;AAC1D,QAAA,IAAIA,WAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;AAC9B,YAAA,OAAO,WAAW;QACpB;;AAGA,QAAA,KAAK,MAAM,YAAY,IAAI,qBAAqB,EAAE;YAChD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;AACvD,YAAA,IAAIA,WAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;AAC/B,gBAAA,OAAO,YAAY;YACrB;QACF;AAEA,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,aAAkC,EAAA;AAC5C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;AACpD,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAE/C,QAAA,IAAI,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,EAAE,SAAS,CAAC;AAExE,QAAA,IAAI,GAAG,KAAK,YAAY,EAAE;AACxB,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE;YACvC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;YAC9C,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC;YAClE,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,EAAE,SAAS,CAAC;QACzE;;AAGA,QAAA,IAAI,YAAoB;AACxB,QAAA,IAAI,GAAG,KAAK,YAAY,EAAE;;AAExB,YAAA,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC;QAChF;aAAO;;AAEL,YAAA,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC;QACvF;AAEA,QAAA,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC;QAElB,MAAM,CAAC,aAAa,EAAE;AACpB,YAAA,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE;YAChC,UAAU;YACV,cAAc;YACd,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC;YAC7C,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;YACrC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC;AAChD,SAAA,CAAC;QAEF,OAAO;AACL,YAAA,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE;YAChC,UAAU;YACV,cAAc;YACd,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC;YAC7C,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;YACrC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC;YAC/C,cAAc;YACd;SACD;IACH;AACD;AAED,gBAAgB,CAAC,gBAAgB,CAAC,YAAY,CAAC;;;;"}
|