@palmares/drizzle-engine
Version:
This is the engine that wraps the hole drizzle interface in a way palmares can understand and have full control of
555 lines (539 loc) • 21.8 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/fields/index.ts
var fields_exports = {};
__export(fields_exports, {
fields: () => fields
});
module.exports = __toCommonJS(fields_exports);
var import_databases12 = require("@palmares/databases");
// src/fields/big-integer.ts
var import_databases = require("@palmares/databases");
// src/fields/utils.ts
function getBuilderArgs(builder, callback) {
const defaultOptions = callback([]);
return (customAttributesArgs, customAttributesOptions) => {
const customAttributesDefined = new Set(Object.keys(customAttributesOptions || {}));
const builderArgs = Object.entries(customAttributesOptions || {}).map(([method, args]) => {
return [
method,
args.map((arg) => typeof arg === "object" ? JSON.stringify(arg) : arg.toString()).join(", ")
];
});
for (const [method, args] of defaultOptions) if (!customAttributesDefined.has(method)) builderArgs.push([
method,
args
]);
const builderArguments = builderArgs.map(([method, args]) => {
return (args || []).length > 0 ? `.${method}(${args})` : `.${method}()`;
}).join("");
return `${builder.withoutD ? "" : "d."}${builder.type}('${builder.databaseName}'${customAttributesArgs !== void 0 || builder.args ? `, ${customAttributesArgs !== void 0 ? JSON.stringify(customAttributesArgs) : builder.args}` : ""})${builderArguments}`;
};
}
__name(getBuilderArgs, "getBuilderArgs");
// src/fields/big-integer.ts
var bigIntegerFieldParser = (0, import_databases.adapterBigIntegerFieldParser)({
translate: /* @__PURE__ */ __name(async (args) => {
const defaultOptions = await args.fieldParser.translate(args);
const field = args.field;
const mainType = args.engine.instance.mainType;
const builderArgsFormatted = getBuilderArgs({
type: mainType === "sqlite" ? "integer" : mainType !== "postgres" ? "bigint" : defaultOptions.autoincrement ? "bigserial" : "bigint",
databaseName: field.databaseName,
args: "{ mode: 'number' }"
}, (defaultBuilderArgs) => {
if (defaultOptions.primaryKey) defaultBuilderArgs.push([
"primaryKey",
mainType === "sqlite" ? "{ autoIncrement: true }" : ""
]);
if (defaultOptions.default) defaultBuilderArgs.push([
"default",
defaultOptions.default
]);
if (defaultOptions.nullable !== true) defaultBuilderArgs.push([
"notNull",
""
]);
if (defaultOptions.unique) defaultBuilderArgs.push([
"unique",
""
]);
if (mainType === "mysql" && defaultOptions.autoincrement) defaultBuilderArgs.push([
"autoIncrement",
""
]);
return defaultBuilderArgs;
})(args.customAttributes.args, args.customAttributes.options);
return builderArgsFormatted;
}, "translate")
});
// src/fields/boolean.ts
var import_databases2 = require("@palmares/databases");
var booleanFieldParser = (0, import_databases2.adapterBooleanFieldParser)({
translate: /* @__PURE__ */ __name(async (args) => {
const defaultOptions = await args.fieldParser.translate(args);
const field = args.field;
const mainType = args.engine.instance.mainType;
const builderArgsFormatted = getBuilderArgs({
type: mainType === "sqlite" ? "integer" : "boolean",
databaseName: field.databaseName,
args: mainType === "sqlite" ? "{ mode: 'number' }" : void 0
}, (defaultBuilderArgs) => {
if (defaultOptions.primaryKey) defaultBuilderArgs.push([
"primaryKey",
""
]);
if (typeof defaultOptions.default === "boolean") if (mainType === "sqlite") defaultBuilderArgs.push([
"default",
defaultOptions.default ? "1" : "0"
]);
else defaultBuilderArgs.push([
"default",
JSON.stringify(defaultOptions.default)
]);
if (defaultOptions.nullable !== true) defaultBuilderArgs.push([
"notNull",
""
]);
if (defaultOptions.unique) defaultBuilderArgs.push([
"unique",
""
]);
return defaultBuilderArgs;
})(args.customAttributes.args, args.customAttributes.options);
return builderArgsFormatted;
}, "translate")
});
// src/fields/char.ts
var import_databases3 = require("@palmares/databases");
var charFieldParser = (0, import_databases3.adapterCharFieldParser)({
translate: /* @__PURE__ */ __name(async (args) => {
const defaultOptions = await args.fieldParser.translate(args);
const field = args.field;
const mainType = args.engine.instance.mainType;
return getBuilderArgs({
type: mainType === "sqlite" ? "text" : "varchar",
databaseName: field.databaseName,
args: `{ length: ${args.field.maxLength} }`
}, (defaultBuilderArgs) => {
if (defaultOptions.primaryKey) defaultBuilderArgs.push([
"primaryKey",
""
]);
if (defaultOptions.default) defaultBuilderArgs.push([
"default",
`"${defaultOptions.default}"`
]);
if (defaultOptions.nullable !== true) defaultBuilderArgs.push([
"notNull",
""
]);
if (defaultOptions.unique) defaultBuilderArgs.push([
"unique",
""
]);
return defaultBuilderArgs;
})(args.customAttributes.args, args.customAttributes.options);
}, "translate")
});
// src/fields/date.ts
var import_databases4 = require("@palmares/databases");
var dateFieldParser = (0, import_databases4.adapterDateFieldParser)({
translate: /* @__PURE__ */ __name(async (args) => {
const defaultOptions = await args.fieldParser.translate(args);
const field = args.field;
const mainType = args.engine.instance.mainType;
return getBuilderArgs({
type: mainType === "sqlite" ? "text" : mainType === "postgres" ? "timestamp" : "datetime",
databaseName: field.databaseName,
args: mainType === "postgres" ? "{ precision: 6, withTimezone: true, mode: 'date' }" : mainType === "sqlite" ? "" : "{ fsp: 6, mode: 'date' }"
}, (defaultBuilderArgs) => {
if (defaultOptions.primaryKey) defaultBuilderArgs.push([
"primaryKey",
""
]);
if (defaultOptions.default) defaultBuilderArgs.push([
"default",
defaultOptions.default
]);
if (defaultOptions.nullable !== true) defaultBuilderArgs.push([
"notNull",
""
]);
if (defaultOptions.unique) defaultBuilderArgs.push([
"unique",
""
]);
if (field.autoNowAdd) if (mainType === "sqlite") defaultBuilderArgs.push([
"default",
"drzl.sql`(current_timestamp)`"
]);
else defaultBuilderArgs.push([
"defaultNow",
""
]);
if (field.autoNow) if (mainType === "sqlite") defaultBuilderArgs.push([
"$onUpdate",
"() => drzl.sql`CURRENT_TIMESTAMP`"
]);
else defaultBuilderArgs.push([
"$onUpdate",
"() => drzl.sql`now()`"
]);
return defaultBuilderArgs;
})(args.customAttributes.args, args.customAttributes.options);
}, "translate")
});
// src/fields/decimal.ts
var import_databases5 = require("@palmares/databases");
var decimalFieldParser = (0, import_databases5.adapterDecimalFieldParser)({
translate: /* @__PURE__ */ __name(async (args) => {
const defaultOptions = await args.fieldParser.translate(args);
const field = args.field;
const mainType = args.engine.instance.mainType;
return getBuilderArgs({
type: mainType === "sqlite" ? "real" : mainType === "postgres" ? "numeric" : "decimal",
databaseName: field.databaseName,
args: mainType === "sqlite" ? "" : `{ precision: ${field.decimalPlaces}, scale: ${field.maxDigits} }`
}, (defaultBuilderArgs) => {
if (defaultOptions.primaryKey) defaultBuilderArgs.push([
"primaryKey",
""
]);
if (defaultOptions.default) defaultBuilderArgs.push([
"default",
defaultOptions.default
]);
if (defaultOptions.nullable !== true) defaultBuilderArgs.push([
"notNull",
""
]);
if (defaultOptions.unique) defaultBuilderArgs.push([
"unique",
""
]);
return defaultBuilderArgs;
})(args.customAttributes.args, args.customAttributes.options);
}, "translate")
});
// src/fields/enum.ts
var import_databases6 = require("@palmares/databases");
var enumFieldParse = (0, import_databases6.adapterEnumFieldParser)({
translate: /* @__PURE__ */ __name(async (args) => {
const defaultOptions = await args.fieldParser.translate(args);
const field = args.field;
const mainType = args.engine.instance.mainType;
const optionsAsString = args.field.choices.map((choice) => `"${choice}"`).join(", ");
const enumVariableName = `${field.fieldName}Enum`;
if (mainType === "postgres") {
args.lazyEvaluate({
type: "enum",
data: `export const ${enumVariableName} = d.pgEnum('${field.databaseName}', [${optionsAsString}]);`
});
}
return getBuilderArgs({
type: mainType === "sqlite" ? "text" : mainType === "postgres" ? enumVariableName : "mysqlEnum",
databaseName: field.databaseName,
args: mainType === "sqlite" ? `{ enum: [${optionsAsString}] }` : mainType === "mysql" ? `[${optionsAsString}]` : "",
withoutD: mainType === "postgres" ? true : false
}, (defaultBuilderArgs) => {
if (defaultOptions.primaryKey) defaultBuilderArgs.push([
"primaryKey",
""
]);
if (defaultOptions.default) defaultBuilderArgs.push([
"default",
`${typeof defaultOptions.default === "string" ? `'${defaultOptions.default}'` : defaultOptions.default}`
]);
if (defaultOptions.nullable !== true) defaultBuilderArgs.push([
"notNull",
""
]);
if (defaultOptions.unique) defaultBuilderArgs.push([
"unique",
""
]);
return defaultBuilderArgs;
})(args.customAttributes.args, args.customAttributes.options);
}, "translate")
});
// src/fields/field.ts
var import_databases7 = require("@palmares/databases");
var fieldParser = (0, import_databases7.adapterFieldParser)({
// eslint-disable-next-line ts/require-await
translate: /* @__PURE__ */ __name(async (args) => {
if (args.customAttributes.type) return getBuilderArgs({
type: args.customAttributes.type,
databaseName: args.field.databaseName,
args: args.customAttributes.args
}, (defaultBuilderArgs) => defaultBuilderArgs)(args.customAttributes.args, args.customAttributes.options);
if (args.field.dbIndex) {
args.lazyEvaluate({
type: "index",
indexAttributes: {
modelName: args.modelName,
fieldName: args.field.fieldName,
databaseName: args.field.databaseName,
unique: args.field.unique
}
});
}
const fieldData = {
fieldName: args.field.fieldName,
primaryKey: args.field.primaryKey,
unique: args.field.unique,
nullable: args.field.allowNull,
dbIndex: args.field.dbIndex,
default: args.field.defaultValue,
autoincrement: args.field.isAuto,
databaseName: args.field.databaseName,
custom: args.customAttributes
};
return fieldData;
}, "translate")
});
// src/fields/foreign-key.ts
var import_databases8 = require("@palmares/databases");
var foreignKeyFieldParser = (0, import_databases8.adapterForeignKeyFieldParser)({
translate: /* @__PURE__ */ __name(async (args) => {
const defaultOptions = await args.fieldParser.translate(args);
args.lazyEvaluate({
type: "foreign-key",
fieldAttributes: {
...defaultOptions,
foreignData: {
...args.field,
toField: args.field.toField,
relatedToModelName: args.field.relatedTo,
relatedName: args.field.relatedName,
relationName: args.field.relationName,
action: args.field.onDelete
}
}
});
}, "translate")
});
// src/fields/integer.ts
var import_databases9 = require("@palmares/databases");
var integerFieldParser = (0, import_databases9.adapterIntegerFieldParser)({
translate: /* @__PURE__ */ __name(async (args) => {
const defaultOptions = await args.fieldParser.translate(args);
const field = args.field;
const mainType = args.engine.instance.mainType;
const builderArgsFormatted = getBuilderArgs({
type: mainType === "sqlite" ? "integer" : mainType !== "postgres" ? "bigint" : defaultOptions.autoincrement ? "serial" : "integer",
databaseName: field.databaseName,
args: mainType === "sqlite" ? "{ mode: 'number' }" : ""
}, (defaultBuilderArgs) => {
if (defaultOptions.primaryKey) defaultBuilderArgs.push([
"primaryKey",
mainType === "sqlite" ? "{ autoIncrement: true }" : ""
]);
if (defaultOptions.default) defaultBuilderArgs.push([
"default",
defaultOptions.default
]);
if (defaultOptions.nullable !== true) defaultBuilderArgs.push([
"notNull",
""
]);
if (defaultOptions.unique) defaultBuilderArgs.push([
"unique",
""
]);
if (mainType === "mysql" && defaultOptions.autoincrement) defaultBuilderArgs.push([
"autoIncrement",
""
]);
return defaultBuilderArgs;
})(args.customAttributes.args, args.customAttributes.options);
return builderArgsFormatted;
}, "translate")
});
// src/fields/text.ts
var import_databases10 = require("@palmares/databases");
var textFieldParser = (0, import_databases10.adapterTextFieldParser)({
translate: /* @__PURE__ */ __name(async (args) => {
const defaultOptions = await args.fieldParser.translate(args);
const field = args.field;
return getBuilderArgs({
type: "text",
databaseName: field.databaseName,
args: void 0
}, (defaultBuilderArgs) => {
if (defaultOptions.primaryKey) defaultBuilderArgs.push([
"primaryKey",
""
]);
if (defaultOptions.default) defaultBuilderArgs.push([
"default",
`"${defaultOptions.default}"`
]);
if (defaultOptions.nullable !== true) defaultBuilderArgs.push([
"notNull",
""
]);
if (defaultOptions.unique) defaultBuilderArgs.push([
"unique",
""
]);
return defaultBuilderArgs;
})(args.customAttributes.args, args.customAttributes.options);
}, "translate")
});
// src/fields/uuid.ts
var import_databases11 = require("@palmares/databases");
var uuidFieldParser = (0, import_databases11.adapterUuidFieldParser)({
translate: /* @__PURE__ */ __name(async (args) => {
const defaultOptions = await args.fieldParser.translate({
...args,
field: {
...args.field,
isAuto: false
}
});
const field = args.field;
const mainType = args.engine.instance.mainType;
if (field.isAuto && mainType !== "postgres") {
args.lazyEvaluate({
type: "uuid",
data: `import * as pdb from '@palmares/databases;'`
});
}
return getBuilderArgs({
type: mainType === "sqlite" ? "text" : mainType === "postgres" ? "uuid" : "varchar",
databaseName: field.databaseName,
args: mainType === "sqlite" || mainType === "postgres" ? "" : `{ length: 36 }`
}, (defaultBuilderArgs) => {
if (defaultOptions.primaryKey) defaultBuilderArgs.push([
"primaryKey",
""
]);
if (defaultOptions.default) defaultBuilderArgs.push([
"default",
`"${defaultOptions.default}"`
]);
if (defaultOptions.nullable !== true) defaultBuilderArgs.push([
"notNull",
""
]);
if (defaultOptions.unique) defaultBuilderArgs.push([
"unique",
""
]);
if (field.isAuto) {
if (mainType === "postgres") defaultBuilderArgs.push([
"defaultRandom",
""
]);
else defaultBuilderArgs.push([
"$defaultFn",
"() => pdb.generateUUID()"
]);
}
return defaultBuilderArgs;
})(args.customAttributes.args, args.customAttributes.options);
}, "translate")
});
// src/fields/index.ts
function createOneToOneRelation(modelName, modelFieldName, relatedModelName, relatedFieldName) {
return `args.one(${relatedModelName}, {
fields: [${modelName}.${modelFieldName}],
references: [${relatedModelName}.${relatedFieldName}]
})`;
}
__name(createOneToOneRelation, "createOneToOneRelation");
async function formatForeignKeyField(engine, modelName, translatedModel, _field, fieldTranslated, parseAgain) {
const foreignData = fieldTranslated.fieldAttributes.foreignData;
const data = await parseAgain({
fieldName: foreignData.toField,
modelName: foreignData.relatedToModelName,
optionsOverrideCallback: {
isAuto: /* @__PURE__ */ __name(() => foreignData.isAuto, "isAuto"),
primaryKey: /* @__PURE__ */ __name(() => foreignData.isPrimaryKey, "primaryKey"),
unique: /* @__PURE__ */ __name(() => foreignData.isUnique, "unique"),
allowNull: /* @__PURE__ */ __name(() => foreignData.allowNull, "allowNull"),
defaultValue: /* @__PURE__ */ __name(() => foreignData.defaultValue, "defaultValue"),
customAttributes: /* @__PURE__ */ __name(() => foreignData.customAttributes, "customAttributes"),
databaseName: /* @__PURE__ */ __name(() => foreignData.databaseName, "databaseName"),
dbIndex: /* @__PURE__ */ __name(() => foreignData.dbIndex, "dbIndex"),
fieldName: /* @__PURE__ */ __name(() => foreignData.fieldName, "fieldName"),
underscored: /* @__PURE__ */ __name(() => foreignData.underscored, "underscored"),
autoNow: /* @__PURE__ */ __name(() => false, "autoNow"),
autoNowAdd: /* @__PURE__ */ __name(() => false, "autoNowAdd"),
allowBlank: /* @__PURE__ */ __name(() => false, "allowBlank"),
maxLength: /* @__PURE__ */ __name(() => false, "maxLength")
}
});
const columnType = engine.instance.mainType === "postgres" ? "d.AnyPgColumn" : engine.instance.mainType === "sqlite" ? "d.AnySQLiteColumn" : "d.AnyMySqlColumn";
translatedModel.fields[fieldTranslated.fieldAttributes.fieldName] = `${data}.references((): ${columnType} => ${foreignData.relatedToModelName}.${foreignData.toField})`;
translatedModel.options.relationships ??= {};
translatedModel.options.relationships[modelName] ??= {};
translatedModel.options.relationships[modelName][foreignData.relationName] = createOneToOneRelation(modelName, fieldTranslated.fieldAttributes.fieldName, foreignData.relatedToModelName, foreignData.toField);
const ifIndirectOneRelation = createOneToOneRelation(foreignData.relatedToModelName, foreignData.toField, modelName, fieldTranslated.fieldAttributes.fieldName);
const ifIndirectManyRelation = `args.many(${modelName})`;
translatedModel.options.relationships[foreignData.relatedToModelName] ??= {};
translatedModel.options.relationships[foreignData.relatedToModelName][foreignData.relatedName] = fieldTranslated.fieldAttributes.unique ? ifIndirectOneRelation : ifIndirectManyRelation;
}
__name(formatForeignKeyField, "formatForeignKeyField");
var fields = (0, import_databases12.adapterFields)({
fieldsParser: new fieldParser(),
bigIntegerFieldParser: new bigIntegerFieldParser(),
charFieldParser: new charFieldParser(),
dateFieldParser: new dateFieldParser(),
decimalFieldParser: new decimalFieldParser(),
foreignKeyFieldParser: new foreignKeyFieldParser(),
integerFieldParser: new integerFieldParser(),
textFieldParser: new textFieldParser(),
uuidFieldParser: new uuidFieldParser(),
enumFieldParser: new enumFieldParse(),
booleanFieldParser: new booleanFieldParser(),
lazyEvaluateField: /* @__PURE__ */ __name(async (engine, modelName, translatedModel, fieldAttributes, fieldTranslated, parseAgain) => {
switch (fieldTranslated.type) {
case "enum": {
translatedModel.options.enums ??= [];
translatedModel.options.enums.push(fieldTranslated.data);
return translatedModel;
}
case "uuid": {
translatedModel.options.imports ??= /* @__PURE__ */ new Set();
translatedModel.options.imports.add(`import * as pdb from '@palmares/databases';`);
return translatedModel;
}
case "foreign-key": {
await formatForeignKeyField(engine, modelName, translatedModel, fieldAttributes, fieldTranslated, parseAgain);
return translatedModel;
}
case "index": {
if (modelName === fieldTranslated.indexAttributes.modelName) {
translatedModel.options.drizzleIndexes ??= [];
translatedModel.options.drizzleIndexes.push(fieldTranslated.indexAttributes);
return translatedModel;
}
break;
}
}
return void 0;
}, "lazyEvaluateField")
});
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
fields
});