@patchworkdev/pdk
Version:
Patchwork Development Kit
113 lines (112 loc) • 4.12 kB
JavaScript
;
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];
},
});
}