UNPKG

@patchworkdev/pdk

Version:

Patchwork Development Kit

113 lines (112 loc) 4.12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.onchainTable = onchainTable; exports.relations = relations; const tableRegistry = new Map(); function onchainTable(tableName, tableDefinition) { // If the table is already registered, return it if (tableRegistry.has(tableName)) { return tableRegistry.get(tableName); } const createChainableTableFieldDefinition = (type) => { const fieldDef = { type, isOptional: true }; const chainable = { notNull: () => { fieldDef.isOptional = false; return chainable; }, primaryKey: () => { fieldDef.primaryKey = true; fieldDef.isOptional = false; return chainable; }, _build: () => fieldDef, }; return chainable; }; const mockTableBuilder = { text: () => createChainableTableFieldDefinition('string'), hex: () => createChainableTableFieldDefinition('hex'), bigint: () => createChainableTableFieldDefinition('bigint'), integer: () => createChainableTableFieldDefinition('int'), }; const columns = tableDefinition(mockTableBuilder); const columnDefinitions = {}; for (const [key, value] of Object.entries(columns)) { columnDefinitions[key] = value._build(); } // Create a base proxy handler that returns column names const baseHandler = { get: function (target, prop) { return prop; }, }; // Create a base proxy first and register it const baseProxy = new Proxy({}, baseHandler); tableRegistry.set(tableName, baseProxy); // Create the full table object const tableObject = { type: 'table', _tableName: tableName, _columns: Object.keys(columnDefinitions), _schema: columnDefinitions, }; // Create the final handler const handler = { get: function (target, prop) { if (prop in tableObject) { return tableObject[prop]; } if (Object.keys(columnDefinitions).includes(prop)) { return prop; } return prop; }, }; // Replace the base proxy with the full implementation const table = new Proxy(tableObject, handler); tableRegistry.set(tableName, table); return table; } function relations(table, relationDefinition) { const relationBuilder = { one: (relatedTable, config) => ({ type: 'one', relatedTable: typeof relatedTable === 'string' ? relatedTable : relatedTable._tableName, fields: config.fields?.map((f) => (typeof f === 'string' ? f : f.toString())) || [], references: config.references?.map((r) => (typeof r === 'string' ? r : r.toString())) || [], relationName: config.relationName, }), many: (relatedTable, config = {}) => ({ type: 'many', relatedTable: typeof relatedTable === 'string' ? relatedTable : relatedTable._tableName, fields: config.fields?.map((f) => (typeof f === 'string' ? f : f.toString())) || [], references: config.references?.map((r) => (typeof r === 'string' ? r : r.toString())) || [], relationName: config.relationName, }), }; let cachedRelations = null; const relationObject = { type: 'relations', _tableName: table._tableName, get _relations() { if (!cachedRelations) { cachedRelations = relationDefinition(relationBuilder); } return cachedRelations; }, }; return new Proxy(relationObject, { get: function (target, prop) { if (prop === 'then') return undefined; if (prop in target) { return target[prop]; } if (!cachedRelations) { cachedRelations = relationDefinition(relationBuilder); } return cachedRelations[prop]; }, }); }