@hedystia/db 2.0.1 → 2.0.3
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/cli/commands/migration.cjs +3 -2
- package/dist/cli/commands/migration.cjs.map +1 -1
- package/dist/cli/commands/migration.mjs +3 -2
- package/dist/cli/commands/migration.mjs.map +1 -1
- package/dist/core/repository.cjs +75 -21
- package/dist/core/repository.cjs.map +1 -1
- package/dist/core/repository.d.cts +10 -0
- package/dist/core/repository.d.mts +10 -0
- package/dist/core/repository.mjs +75 -21
- package/dist/core/repository.mjs.map +1 -1
- package/dist/index.cjs +14 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/migrations/templates.cjs +4 -4
- package/dist/migrations/templates.cjs.map +1 -1
- package/dist/migrations/templates.mjs +4 -4
- package/dist/migrations/templates.mjs.map +1 -1
- package/dist/schema/column.cjs +34 -2
- package/dist/schema/column.cjs.map +1 -1
- package/dist/schema/column.d.cts +24 -0
- package/dist/schema/column.d.mts +24 -0
- package/dist/schema/column.mjs +34 -2
- package/dist/schema/column.mjs.map +1 -1
- package/dist/schema/columns/index.cjs +93 -1
- package/dist/schema/columns/index.cjs.map +1 -1
- package/dist/schema/columns/index.d.cts +52 -2
- package/dist/schema/columns/index.d.mts +52 -2
- package/dist/schema/columns/index.mjs +80 -2
- package/dist/schema/columns/index.mjs.map +1 -1
- package/dist/schema/registry.cjs +28 -4
- package/dist/schema/registry.cjs.map +1 -1
- package/dist/schema/registry.d.cts +15 -1
- package/dist/schema/registry.d.mts +15 -1
- package/dist/schema/registry.mjs +28 -4
- package/dist/schema/registry.mjs.map +1 -1
- package/dist/schema/table.cjs +3 -0
- package/dist/schema/table.cjs.map +1 -1
- package/dist/schema/table.mjs +3 -0
- package/dist/schema/table.mjs.map +1 -1
- package/dist/sync/synchronizer.cjs +2 -2
- package/dist/sync/synchronizer.cjs.map +1 -1
- package/dist/sync/synchronizer.mjs +2 -2
- package/dist/sync/synchronizer.mjs.map +1 -1
- package/dist/types.d.cts +4 -2
- package/dist/types.d.mts +4 -2
- package/package.json +1 -1
- package/readme.md +11 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.mjs","names":[],"sources":["../../src/core/repository.ts"],"sourcesContent":["import type { CacheManager } from \"../cache\";\nimport { FileDriver } from \"../drivers/file\";\nimport {\n compileBulkInsert,\n compileDelete,\n compileInsert,\n compileSelect,\n compileUpdate,\n compileWhere,\n} from \"../drivers/sql-compiler\";\nimport { QueryError } from \"../errors\";\nimport type { SchemaRegistry } from \"../schema\";\nimport type {\n DatabaseDriver,\n DeleteOptions,\n QueryOptions,\n Repository,\n TableMetadata,\n UpdateOptions,\n WhereClause,\n} from \"../types\";\n\n/**\n * Repository implementation that provides CRUD operations for a table\n * @template T - The row type for this table\n */\nexport class TableRepository<T extends Record<string, any>> implements Repository<T> {\n private tableName: string;\n private driver: DatabaseDriver;\n private cache: CacheManager;\n private registry: SchemaRegistry;\n private meta: TableMetadata;\n\n constructor(\n tableName: string,\n driver: DatabaseDriver,\n cache: CacheManager,\n registry: SchemaRegistry,\n ) {\n this.tableName = tableName;\n this.driver = driver;\n this.cache = cache;\n this.registry = registry;\n const meta = registry.getTable(tableName);\n if (!meta) {\n throw new QueryError(`Table \"${tableName}\" is not registered`);\n }\n this.meta = meta;\n }\n\n /**\n * Find all rows matching the query options\n * @param {QueryOptions<T>} [options] - Query options\n * @returns {Promise<T[]>} Array of matching rows\n */\n async find(options?: QueryOptions<T>): Promise<T[]> {\n return this.cache.getOrSet(this.tableName, \"find\", options, async () => {\n let rows: T[];\n if (this.driver instanceof FileDriver) {\n rows = this.findFile(options);\n } else {\n rows = await this.findSQL(options);\n }\n if (options?.with) {\n rows = await this.loadRelations(rows, options.with);\n }\n this.cacheEntities(rows);\n return rows;\n });\n }\n\n /**\n * Find all rows matching the query options (alias for find)\n * @param {QueryOptions<T>} [options] - Query options\n * @returns {Promise<T[]>} Array of matching rows\n */\n async findMany(options?: QueryOptions<T>): Promise<T[]> {\n return this.find(options);\n }\n\n /**\n * Find the first row matching the query options\n * @param {QueryOptions<T>} [options] - Query options\n * @returns {Promise<T | null>} The first matching row or null\n */\n async findFirst(options?: QueryOptions<T>): Promise<T | null> {\n return this.cache.getOrSet(this.tableName, \"findFirst\", options, async () => {\n const opts = { ...options, take: 1 };\n let rows: T[];\n if (this.driver instanceof FileDriver) {\n rows = this.findFile(opts);\n } else {\n rows = await this.findSQL(opts);\n }\n if (rows.length === 0) {\n return null;\n }\n if (options?.with) {\n rows = await this.loadRelations(rows, options.with);\n }\n const row = rows[0] ?? null;\n if (row) {\n this.cacheEntity(row);\n }\n return row;\n });\n }\n\n /**\n * Insert one or more rows\n * @param {Partial<T> | Partial<T>[]} data - Data to insert\n * @returns {Promise<T>} The inserted row\n */\n async insert(data: Partial<T> | Partial<T>[]): Promise<T> {\n const single = Array.isArray(data) ? data[0] : data;\n if (!single) {\n throw new QueryError(\"Insert data cannot be empty\");\n }\n\n this.cache.invalidateTable(this.tableName);\n const cleaned = this.cleanData(single);\n\n if (this.driver instanceof FileDriver) {\n const id = (this.driver as FileDriver).insertRow(this.tableName, cleaned);\n const pk = this.registry.getPrimaryKey(this.tableName);\n if (pk) {\n cleaned[pk] = id;\n }\n this.cacheEntity(cleaned as T);\n return cleaned as T;\n }\n\n const params: unknown[] = [];\n const sql = compileInsert(this.tableName, cleaned, params);\n const result = await this.driver.execute(sql, params);\n\n const pk = this.registry.getPrimaryKey(this.tableName);\n if (pk && result.insertId) {\n cleaned[pk] = result.insertId;\n }\n\n this.cacheEntity(cleaned as T);\n return cleaned as T;\n }\n\n /**\n * Insert multiple rows\n * @param {Partial<T>[]} data - Array of data to insert\n * @returns {Promise<T[]>} The inserted rows\n */\n async insertMany(data: Partial<T>[]): Promise<T[]> {\n if (data.length === 0) {\n return [];\n }\n\n this.cache.invalidateTable(this.tableName);\n\n if (this.driver instanceof FileDriver) {\n const results: T[] = [];\n for (const item of data) {\n results.push(await this.insert(item));\n }\n return results;\n }\n\n const cleanedData = data.map((item) => this.cleanData(item));\n const params: unknown[] = [];\n const sql = compileBulkInsert(this.tableName, cleanedData, params);\n const result = await this.driver.execute(sql, params);\n\n const pk = this.registry.getPrimaryKey(this.tableName);\n if (pk && result.insertId) {\n for (let i = 0; i < cleanedData.length; i++) {\n const row = cleanedData[i];\n if (row) {\n row[pk] = result.insertId + i;\n }\n }\n }\n\n const finalRows = cleanedData as T[];\n this.cacheEntities(finalRows);\n return finalRows;\n }\n\n /**\n * Update rows matching the where clause\n * @param {UpdateOptions<T>} options - Update options with where and data\n * @returns {Promise<T[]>} The updated rows\n */\n async update(options: UpdateOptions<T>): Promise<T[]> {\n if (!options.where || Object.keys(options.where).length === 0) {\n throw new QueryError(\"Update requires a where clause\");\n }\n\n this.cache.invalidateTable(this.tableName);\n const cleaned = this.cleanData(options.data);\n\n if (this.driver instanceof FileDriver) {\n const filter = this.buildFileFilter(options.where as WhereClause);\n (this.driver as FileDriver).updateRows(this.tableName, filter, cleaned);\n return this.find({ where: options.where } as QueryOptions<T>);\n }\n\n const params: unknown[] = [];\n const sql = compileUpdate(this.tableName, cleaned, options.where as WhereClause, params);\n await this.driver.execute(sql, params);\n\n return this.find({ where: options.where } as QueryOptions<T>);\n }\n\n /**\n * Delete rows matching the where clause\n * @param {DeleteOptions<T>} options - Delete options with where clause\n * @returns {Promise<number>} Number of deleted rows\n */\n async delete(options: DeleteOptions<T>): Promise<number> {\n if (!options.where || Object.keys(options.where).length === 0) {\n throw new QueryError(\"Delete requires a where clause\");\n }\n\n this.cache.invalidateTable(this.tableName);\n\n if (this.driver instanceof FileDriver) {\n const filter = this.buildFileFilter(options.where as WhereClause);\n return (this.driver as FileDriver).deleteRows(this.tableName, filter);\n }\n\n const params: unknown[] = [];\n const sql = compileDelete(this.tableName, options.where as WhereClause, params);\n const result = await this.driver.execute(sql, params);\n return result.affectedRows;\n }\n\n /**\n * Count rows matching the where clause\n * @param {Pick<QueryOptions<T>, \"where\">} [options] - Count options\n * @returns {Promise<number>} Row count\n */\n async count(options?: Pick<QueryOptions<T>, \"where\">): Promise<number> {\n return this.cache.getOrSet(this.tableName, \"count\", options, async () => {\n if (this.driver instanceof FileDriver) {\n const filter = options?.where\n ? this.buildFileFilter(options.where as WhereClause)\n : undefined;\n return (this.driver as FileDriver).countRows(this.tableName, filter);\n }\n\n const params: unknown[] = [];\n let sql = `SELECT COUNT(*) as count FROM \\`${this.tableName}\\``;\n if (options?.where && Object.keys(options.where).length > 0) {\n sql += ` WHERE ${compileWhere(options.where as WhereClause, params)}`;\n }\n const rows = await this.driver.query(sql, params);\n return rows[0]?.count ?? 0;\n });\n }\n\n /**\n * Check if any row exists matching the where clause\n * @param {Pick<QueryOptions<T>, \"where\">} options - Exists options\n * @returns {Promise<boolean>} Whether a matching row exists\n */\n async exists(options: Pick<QueryOptions<T>, \"where\">): Promise<boolean> {\n const c = await this.count(options);\n return c > 0;\n }\n\n /**\n * Insert or update a row based on the where clause\n * @param {object} options - Upsert options\n * @param {WhereClause<T>} options.where - Condition to check\n * @param {Partial<T>} options.create - Data to insert if not found\n * @param {Partial<T>} options.update - Data to update if found\n * @returns {Promise<T>} The upserted row\n */\n async upsert(options: {\n where: WhereClause<T>;\n create: Partial<T>;\n update: Partial<T>;\n }): Promise<T> {\n const existing = await this.findFirst({ where: options.where } as QueryOptions<T>);\n if (existing) {\n const updated = await this.update({ where: options.where, data: options.update });\n return updated[0] ?? existing;\n }\n return this.insert(options.create);\n }\n\n /**\n * Remove all rows from the table\n */\n async truncate(): Promise<void> {\n this.cache.invalidateTable(this.tableName);\n if (this.driver instanceof FileDriver) {\n (this.driver as FileDriver).truncateTable(this.tableName);\n return;\n }\n await this.driver.execute(`DELETE FROM \\`${this.tableName}\\``);\n }\n\n private async findSQL(options?: QueryOptions<T>): Promise<T[]> {\n const params: unknown[] = [];\n const sql = compileSelect(\n this.tableName,\n {\n select: options?.select as string[] | undefined,\n where: options?.where as WhereClause | undefined,\n orderBy: options?.orderBy as Record<string, \"asc\" | \"desc\"> | undefined,\n take: options?.take,\n skip: options?.skip,\n },\n params,\n );\n return this.driver.query(sql, params);\n }\n\n private findFile(options?: QueryOptions<T>): T[] {\n const fd = this.driver as FileDriver;\n const filter = options?.where ? this.buildFileFilter(options.where as WhereClause) : undefined;\n let rows = fd.findRows(this.tableName, filter) as T[];\n\n if (options?.select) {\n const selectSet = new Set(options.select as string[]);\n rows = rows.map((row) => {\n const filtered: Record<string, any> = {};\n for (const key of selectSet) {\n filtered[key as string] = row[key as string];\n }\n return filtered as T;\n });\n }\n\n if (options?.orderBy) {\n const entries = Object.entries(options.orderBy);\n rows.sort((a, b) => {\n for (const [col, dir] of entries) {\n const av = a[col];\n const bv = b[col];\n if (av < bv) {\n return dir === \"asc\" ? -1 : 1;\n }\n if (av > bv) {\n return dir === \"asc\" ? 1 : -1;\n }\n }\n return 0;\n });\n }\n\n if (options?.skip) {\n rows = rows.slice(options.skip);\n }\n if (options?.take) {\n rows = rows.slice(0, options.take);\n }\n\n return rows;\n }\n\n private buildFileFilter(where: WhereClause): (row: Record<string, unknown>) => boolean {\n return (row) => this.matchWhere(row, where);\n }\n\n private matchWhere(row: Record<string, unknown>, where: WhereClause): boolean {\n for (const [key, value] of Object.entries(where)) {\n if (key === \"OR\" && Array.isArray(value)) {\n const any = (value as WhereClause[]).some((sub) => this.matchWhere(row, sub));\n if (!any) {\n return false;\n }\n continue;\n }\n if (key === \"AND\" && Array.isArray(value)) {\n const all = (value as WhereClause[]).every((sub) => this.matchWhere(row, sub));\n if (!all) {\n return false;\n }\n continue;\n }\n\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n const cond = value as any;\n const rowVal = row[key];\n if (cond.eq !== undefined && rowVal !== cond.eq) {\n return false;\n }\n if (cond.neq !== undefined && rowVal === cond.neq) {\n return false;\n }\n if (cond.gt !== undefined && !((rowVal as any) > cond.gt)) {\n return false;\n }\n if (cond.gte !== undefined && !((rowVal as any) >= cond.gte)) {\n return false;\n }\n if (cond.lt !== undefined && !((rowVal as any) < cond.lt)) {\n return false;\n }\n if (cond.lte !== undefined && !((rowVal as any) <= cond.lte)) {\n return false;\n }\n if (\n cond.like !== undefined &&\n !String(rowVal).match(new RegExp(cond.like.replace(/%/g, \".*\"), \"i\"))\n ) {\n return false;\n }\n if (\n cond.notLike !== undefined &&\n String(rowVal).match(new RegExp(cond.notLike.replace(/%/g, \".*\"), \"i\"))\n ) {\n return false;\n }\n if (cond.in !== undefined && !cond.in.includes(rowVal)) {\n return false;\n }\n if (cond.notIn?.includes(rowVal)) {\n return false;\n }\n if (cond.isNull === true && rowVal !== null && rowVal !== undefined) {\n return false;\n }\n if (cond.isNull === false && (rowVal === null || rowVal === undefined)) {\n return false;\n }\n if (cond.between !== undefined) {\n if ((rowVal as any) < cond.between[0] || (rowVal as any) > cond.between[1]) {\n return false;\n }\n }\n } else {\n if (row[key] !== value) {\n return false;\n }\n }\n }\n return true;\n }\n\n private async loadRelations(\n rows: T[],\n withOpts: Record<string, boolean | QueryOptions>,\n ): Promise<T[]> {\n if (rows.length === 0) {\n return rows;\n }\n const relations = this.registry.getRelations(this.tableName);\n\n for (const [relationName, opts] of Object.entries(withOpts)) {\n if (!opts) {\n continue;\n }\n const relation = relations.find((r) => r.relationName === relationName);\n if (!relation) {\n continue;\n }\n\n const isParent = relation.from.table === this.tableName;\n if (isParent) {\n const ids = rows.map((r) => r[relation.from.column]).filter((v) => v != null);\n if (ids.length === 0) {\n continue;\n }\n const uniqueIds = [...new Set(ids)];\n const relatedOpts: QueryOptions = typeof opts === \"object\" ? opts : {};\n const related = await this.findRelated(\n relation.to.table,\n relation.to.column,\n uniqueIds,\n relatedOpts,\n );\n const relatedMap = new Map<unknown, unknown[]>();\n for (const r of related) {\n const key = (r as any)[relation.to.column];\n if (!relatedMap.has(key)) {\n relatedMap.set(key, []);\n }\n relatedMap.get(key)!.push(r);\n }\n for (const row of rows) {\n const key = row[relation.from.column];\n const relRows = relatedMap.get(key);\n (row as any)[relationName] = relRows ?? [];\n }\n } else {\n const pk = this.registry.getPrimaryKey(this.tableName);\n if (!pk) {\n continue;\n }\n const ids = rows.map((r) => r[pk]).filter((v) => v != null);\n if (ids.length === 0) {\n continue;\n }\n const uniqueIds = [...new Set(ids)];\n const relatedOpts: QueryOptions = typeof opts === \"object\" ? opts : {};\n const related = await this.findRelated(\n relation.to.table,\n relation.to.column,\n uniqueIds,\n relatedOpts,\n );\n const relatedMap = new Map<unknown, unknown[]>();\n for (const r of related) {\n const key = (r as any)[relation.to.column];\n if (!relatedMap.has(key)) {\n relatedMap.set(key, []);\n }\n relatedMap.get(key)!.push(r);\n }\n for (const row of rows) {\n const key = row[pk];\n (row as any)[relationName] = relatedMap.get(key) ?? [];\n }\n }\n }\n\n return rows;\n }\n\n private async findRelated(\n tableName: string,\n column: string,\n ids: unknown[],\n options: QueryOptions,\n ): Promise<any[]> {\n if (this.driver instanceof FileDriver) {\n const fd = this.driver as FileDriver;\n const filter = (row: Record<string, unknown>) => ids.includes(row[column]);\n return fd.findRows(tableName, filter);\n }\n\n const params: unknown[] = [];\n const placeholders = ids.map(() => \"?\").join(\", \");\n params.push(...ids);\n\n let sql = `SELECT * FROM \\`${tableName}\\` WHERE \\`${column}\\` IN (${placeholders})`;\n if (options.orderBy) {\n const orderParts = Object.entries(options.orderBy).map(\n ([col, dir]) => `\\`${col}\\` ${(dir as string).toUpperCase()}`,\n );\n if (orderParts.length > 0) {\n sql += ` ORDER BY ${orderParts.join(\", \")}`;\n }\n }\n if (options.take) {\n sql += ` LIMIT ${options.take}`;\n }\n\n return this.driver.query(sql, params);\n }\n\n private cleanData(data: Partial<T>): Record<string, unknown> {\n const cleaned: Record<string, unknown> = {};\n const columnNames = new Set(this.meta.columns.map((c) => c.name));\n for (const [key, value] of Object.entries(data as Record<string, unknown>)) {\n if (columnNames.has(key)) {\n cleaned[key] = value;\n }\n }\n return cleaned;\n }\n\n private cacheEntities(rows: T[]): void {\n const pk = this.registry.getPrimaryKey(this.tableName);\n if (!pk) {\n return;\n }\n for (const row of rows) {\n if (row[pk] != null) {\n this.cache.setEntity(this.tableName, row[pk], row);\n }\n }\n }\n\n private cacheEntity(row: T): void {\n const pk = this.registry.getPrimaryKey(this.tableName);\n if (!pk || row[pk] == null) {\n return;\n }\n this.cache.setEntity(this.tableName, row[pk], row);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"repository.mjs","names":[],"sources":["../../src/core/repository.ts"],"sourcesContent":["import type { CacheManager } from \"../cache\";\nimport { FileDriver } from \"../drivers/file\";\nimport {\n compileBulkInsert,\n compileDelete,\n compileInsert,\n compileSelect,\n compileUpdate,\n compileWhere,\n} from \"../drivers/sql-compiler\";\nimport { QueryError } from \"../errors\";\nimport type { SchemaRegistry } from \"../schema\";\nimport type {\n DatabaseDriver,\n DeleteOptions,\n QueryOptions,\n Repository,\n TableMetadata,\n UpdateOptions,\n WhereClause,\n} from \"../types\";\n\n/**\n * Repository implementation that provides CRUD operations for a table\n * @template T - The row type for this table\n */\nexport class TableRepository<T extends Record<string, any>> implements Repository<T> {\n private tableName: string;\n private driver: DatabaseDriver;\n private cache: CacheManager;\n private registry: SchemaRegistry;\n private meta: TableMetadata;\n private columnMap: Record<string, string>;\n private reverseColumnMap: Record<string, string>;\n private hasAliases: boolean;\n\n constructor(\n tableName: string,\n driver: DatabaseDriver,\n cache: CacheManager,\n registry: SchemaRegistry,\n ) {\n this.tableName = tableName;\n this.driver = driver;\n this.cache = cache;\n this.registry = registry;\n const meta = registry.getTable(tableName);\n if (!meta) {\n throw new QueryError(`Table \"${tableName}\" is not registered`);\n }\n this.meta = meta;\n this.columnMap = registry.getColumnMap(tableName);\n this.reverseColumnMap = registry.getReverseColumnMap(tableName);\n this.hasAliases = Object.entries(this.columnMap).some(\n ([codeKey, dbName]) => codeKey !== dbName,\n );\n }\n\n /**\n * Find all rows matching the query options\n * @param {QueryOptions<T>} [options] - Query options\n * @returns {Promise<T[]>} Array of matching rows\n */\n async find(options?: QueryOptions<T>): Promise<T[]> {\n return this.cache.getOrSet(this.tableName, \"find\", options, async () => {\n const dbOptions = this.mapOptionsToDb(options);\n let rows: T[];\n if (this.driver instanceof FileDriver) {\n rows = this.mapRows(this.findFile(dbOptions as QueryOptions<T>));\n } else {\n rows = this.mapRows(await this.findSQL(dbOptions as QueryOptions<T>));\n }\n if (options?.with) {\n rows = await this.loadRelations(rows, options.with);\n }\n this.cacheEntities(rows);\n return rows;\n });\n }\n\n /**\n * Find all rows matching the query options (alias for find)\n * @param {QueryOptions<T>} [options] - Query options\n * @returns {Promise<T[]>} Array of matching rows\n */\n async findMany(options?: QueryOptions<T>): Promise<T[]> {\n return this.find(options);\n }\n\n /**\n * Find the first row matching the query options\n * @param {QueryOptions<T>} [options] - Query options\n * @returns {Promise<T | null>} The first matching row or null\n */\n async findFirst(options?: QueryOptions<T>): Promise<T | null> {\n return this.cache.getOrSet(this.tableName, \"findFirst\", options, async () => {\n const dbOptions = this.mapOptionsToDb(options);\n const opts = { ...dbOptions, take: 1 };\n let rows: T[];\n if (this.driver instanceof FileDriver) {\n rows = this.mapRows(this.findFile(opts as QueryOptions<T>));\n } else {\n rows = this.mapRows(await this.findSQL(opts as QueryOptions<T>));\n }\n if (rows.length === 0) {\n return null;\n }\n if (options?.with) {\n rows = await this.loadRelations(rows, options.with);\n }\n const row = rows[0] ?? null;\n if (row) {\n this.cacheEntity(row);\n }\n return row;\n });\n }\n\n /**\n * Insert one or more rows\n * @param {Partial<T> | Partial<T>[]} data - Data to insert\n * @returns {Promise<T>} The inserted row\n */\n async insert(data: Partial<T> | Partial<T>[]): Promise<T> {\n const single = Array.isArray(data) ? data[0] : data;\n if (!single) {\n throw new QueryError(\"Insert data cannot be empty\");\n }\n\n this.cache.invalidateTable(this.tableName);\n const cleaned = this.toDbKeys(this.cleanData(single));\n\n if (this.driver instanceof FileDriver) {\n const id = (this.driver as FileDriver).insertRow(this.tableName, cleaned);\n const pk = this.registry.getPrimaryKey(this.tableName);\n if (pk) {\n cleaned[pk] = id;\n }\n const result = this.toCodeKeys(cleaned) as T;\n this.cacheEntity(result);\n return result;\n }\n\n const params: unknown[] = [];\n const sql = compileInsert(this.tableName, cleaned, params);\n const result = await this.driver.execute(sql, params);\n\n const pk = this.registry.getPrimaryKey(this.tableName);\n if (pk && result.insertId) {\n cleaned[pk] = result.insertId;\n }\n\n const mapped = this.toCodeKeys(cleaned) as T;\n this.cacheEntity(mapped);\n return mapped;\n }\n\n /**\n * Insert multiple rows\n * @param {Partial<T>[]} data - Array of data to insert\n * @returns {Promise<T[]>} The inserted rows\n */\n async insertMany(data: Partial<T>[]): Promise<T[]> {\n if (data.length === 0) {\n return [];\n }\n\n this.cache.invalidateTable(this.tableName);\n\n if (this.driver instanceof FileDriver) {\n const results: T[] = [];\n for (const item of data) {\n results.push(await this.insert(item));\n }\n return results;\n }\n\n const cleanedData = data.map((item) => this.toDbKeys(this.cleanData(item)));\n const params: unknown[] = [];\n const sql = compileBulkInsert(this.tableName, cleanedData, params);\n const result = await this.driver.execute(sql, params);\n\n const pk = this.registry.getPrimaryKey(this.tableName);\n if (pk && result.insertId) {\n for (let i = 0; i < cleanedData.length; i++) {\n const row = cleanedData[i];\n if (row) {\n row[pk] = result.insertId + i;\n }\n }\n }\n\n const finalRows = this.mapRows(cleanedData);\n this.cacheEntities(finalRows);\n return finalRows;\n }\n\n /**\n * Update rows matching the where clause\n * @param {UpdateOptions<T>} options - Update options with where and data\n * @returns {Promise<T[]>} The updated rows\n */\n async update(options: UpdateOptions<T>): Promise<T[]> {\n if (!options.where || Object.keys(options.where).length === 0) {\n throw new QueryError(\"Update requires a where clause\");\n }\n\n this.cache.invalidateTable(this.tableName);\n const cleaned = this.toDbKeys(this.cleanData(options.data));\n const dbWhere = this.mapWhereToDb(options.where as WhereClause);\n\n if (this.driver instanceof FileDriver) {\n const filter = this.buildFileFilter(dbWhere);\n (this.driver as FileDriver).updateRows(this.tableName, filter, cleaned);\n return this.find({ where: options.where } as QueryOptions<T>);\n }\n\n const params: unknown[] = [];\n const sql = compileUpdate(this.tableName, cleaned, dbWhere, params);\n await this.driver.execute(sql, params);\n\n return this.find({ where: options.where } as QueryOptions<T>);\n }\n\n /**\n * Delete rows matching the where clause\n * @param {DeleteOptions<T>} options - Delete options with where clause\n * @returns {Promise<number>} Number of deleted rows\n */\n async delete(options: DeleteOptions<T>): Promise<number> {\n if (!options.where || Object.keys(options.where).length === 0) {\n throw new QueryError(\"Delete requires a where clause\");\n }\n\n this.cache.invalidateTable(this.tableName);\n const dbWhere = this.mapWhereToDb(options.where as WhereClause);\n\n if (this.driver instanceof FileDriver) {\n const filter = this.buildFileFilter(dbWhere);\n return (this.driver as FileDriver).deleteRows(this.tableName, filter);\n }\n\n const params: unknown[] = [];\n const sql = compileDelete(this.tableName, dbWhere, params);\n const result = await this.driver.execute(sql, params);\n return result.affectedRows;\n }\n\n /**\n * Count rows matching the where clause\n * @param {Pick<QueryOptions<T>, \"where\">} [options] - Count options\n * @returns {Promise<number>} Row count\n */\n async count(options?: Pick<QueryOptions<T>, \"where\">): Promise<number> {\n return this.cache.getOrSet(this.tableName, \"count\", options, async () => {\n const dbWhere = options?.where ? this.mapWhereToDb(options.where as WhereClause) : undefined;\n\n if (this.driver instanceof FileDriver) {\n const filter = dbWhere ? this.buildFileFilter(dbWhere) : undefined;\n return (this.driver as FileDriver).countRows(this.tableName, filter);\n }\n\n const params: unknown[] = [];\n let sql = `SELECT COUNT(*) as count FROM \\`${this.tableName}\\``;\n if (dbWhere && Object.keys(dbWhere).length > 0) {\n sql += ` WHERE ${compileWhere(dbWhere, params)}`;\n }\n const rows = await this.driver.query(sql, params);\n return rows[0]?.count ?? 0;\n });\n }\n\n /**\n * Check if any row exists matching the where clause\n * @param {Pick<QueryOptions<T>, \"where\">} options - Exists options\n * @returns {Promise<boolean>} Whether a matching row exists\n */\n async exists(options: Pick<QueryOptions<T>, \"where\">): Promise<boolean> {\n const c = await this.count(options);\n return c > 0;\n }\n\n /**\n * Insert or update a row based on the where clause\n * @param {object} options - Upsert options\n * @param {WhereClause<T>} options.where - Condition to check\n * @param {Partial<T>} options.create - Data to insert if not found\n * @param {Partial<T>} options.update - Data to update if found\n * @returns {Promise<T>} The upserted row\n */\n async upsert(options: {\n where: WhereClause<T>;\n create: Partial<T>;\n update: Partial<T>;\n }): Promise<T> {\n const existing = await this.findFirst({ where: options.where } as QueryOptions<T>);\n if (existing) {\n const updated = await this.update({ where: options.where, data: options.update });\n return updated[0] ?? existing;\n }\n return this.insert(options.create);\n }\n\n /**\n * Remove all rows from the table\n */\n async truncate(): Promise<void> {\n this.cache.invalidateTable(this.tableName);\n if (this.driver instanceof FileDriver) {\n (this.driver as FileDriver).truncateTable(this.tableName);\n return;\n }\n await this.driver.execute(`DELETE FROM \\`${this.tableName}\\``);\n }\n\n private async findSQL(options?: QueryOptions<T>): Promise<T[]> {\n const params: unknown[] = [];\n const sql = compileSelect(\n this.tableName,\n {\n select: options?.select as string[] | undefined,\n where: options?.where as WhereClause | undefined,\n orderBy: options?.orderBy as Record<string, \"asc\" | \"desc\"> | undefined,\n take: options?.take,\n skip: options?.skip,\n },\n params,\n );\n return this.driver.query(sql, params);\n }\n\n private findFile(options?: QueryOptions<T>): T[] {\n const fd = this.driver as FileDriver;\n const filter = options?.where ? this.buildFileFilter(options.where as WhereClause) : undefined;\n let rows = fd.findRows(this.tableName, filter) as T[];\n\n if (options?.select) {\n const selectSet = new Set(options.select as string[]);\n rows = rows.map((row) => {\n const filtered: Record<string, any> = {};\n for (const key of selectSet) {\n filtered[key as string] = row[key as string];\n }\n return filtered as T;\n });\n }\n\n if (options?.orderBy) {\n const entries = Object.entries(options.orderBy);\n rows.sort((a, b) => {\n for (const [col, dir] of entries) {\n const av = a[col];\n const bv = b[col];\n if (av < bv) {\n return dir === \"asc\" ? -1 : 1;\n }\n if (av > bv) {\n return dir === \"asc\" ? 1 : -1;\n }\n }\n return 0;\n });\n }\n\n if (options?.skip) {\n rows = rows.slice(options.skip);\n }\n if (options?.take) {\n rows = rows.slice(0, options.take);\n }\n\n return rows;\n }\n\n private buildFileFilter(where: WhereClause): (row: Record<string, unknown>) => boolean {\n return (row) => this.matchWhere(row, where);\n }\n\n private matchWhere(row: Record<string, unknown>, where: WhereClause): boolean {\n for (const [key, value] of Object.entries(where)) {\n if (key === \"OR\" && Array.isArray(value)) {\n const any = (value as WhereClause[]).some((sub) => this.matchWhere(row, sub));\n if (!any) {\n return false;\n }\n continue;\n }\n if (key === \"AND\" && Array.isArray(value)) {\n const all = (value as WhereClause[]).every((sub) => this.matchWhere(row, sub));\n if (!all) {\n return false;\n }\n continue;\n }\n\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n const cond = value as any;\n const rowVal = row[key];\n if (cond.eq !== undefined && rowVal !== cond.eq) {\n return false;\n }\n if (cond.neq !== undefined && rowVal === cond.neq) {\n return false;\n }\n if (cond.gt !== undefined && !((rowVal as any) > cond.gt)) {\n return false;\n }\n if (cond.gte !== undefined && !((rowVal as any) >= cond.gte)) {\n return false;\n }\n if (cond.lt !== undefined && !((rowVal as any) < cond.lt)) {\n return false;\n }\n if (cond.lte !== undefined && !((rowVal as any) <= cond.lte)) {\n return false;\n }\n if (\n cond.like !== undefined &&\n !String(rowVal).match(new RegExp(cond.like.replace(/%/g, \".*\"), \"i\"))\n ) {\n return false;\n }\n if (\n cond.notLike !== undefined &&\n String(rowVal).match(new RegExp(cond.notLike.replace(/%/g, \".*\"), \"i\"))\n ) {\n return false;\n }\n if (cond.in !== undefined && !cond.in.includes(rowVal)) {\n return false;\n }\n if (cond.notIn?.includes(rowVal)) {\n return false;\n }\n if (cond.isNull === true && rowVal !== null && rowVal !== undefined) {\n return false;\n }\n if (cond.isNull === false && (rowVal === null || rowVal === undefined)) {\n return false;\n }\n if (cond.between !== undefined) {\n if ((rowVal as any) < cond.between[0] || (rowVal as any) > cond.between[1]) {\n return false;\n }\n }\n } else {\n if (row[key] !== value) {\n return false;\n }\n }\n }\n return true;\n }\n\n private async loadRelations(\n rows: T[],\n withOpts: Record<string, boolean | QueryOptions>,\n ): Promise<T[]> {\n if (rows.length === 0) {\n return rows;\n }\n const relations = this.registry.getRelations(this.tableName);\n\n for (const [relationName, opts] of Object.entries(withOpts)) {\n if (!opts) {\n continue;\n }\n const relation = relations.find((r) => r.relationName === relationName);\n if (!relation) {\n continue;\n }\n\n const isParent = relation.from.table === this.tableName;\n if (isParent) {\n const ids = rows.map((r) => r[relation.from.column]).filter((v) => v != null);\n if (ids.length === 0) {\n continue;\n }\n const uniqueIds = [...new Set(ids)];\n const relatedOpts: QueryOptions = typeof opts === \"object\" ? opts : {};\n const related = await this.findRelated(\n relation.to.table,\n relation.to.column,\n uniqueIds,\n relatedOpts,\n );\n const relatedMap = new Map<unknown, unknown[]>();\n for (const r of related) {\n const key = (r as any)[relation.to.column];\n if (!relatedMap.has(key)) {\n relatedMap.set(key, []);\n }\n relatedMap.get(key)!.push(r);\n }\n for (const row of rows) {\n const key = row[relation.from.column];\n const relRows = relatedMap.get(key);\n (row as any)[relationName] = relRows ?? [];\n }\n } else {\n const pk = this.registry.getPrimaryKey(this.tableName);\n if (!pk) {\n continue;\n }\n const ids = rows.map((r) => r[pk]).filter((v) => v != null);\n if (ids.length === 0) {\n continue;\n }\n const uniqueIds = [...new Set(ids)];\n const relatedOpts: QueryOptions = typeof opts === \"object\" ? opts : {};\n const related = await this.findRelated(\n relation.to.table,\n relation.to.column,\n uniqueIds,\n relatedOpts,\n );\n const relatedMap = new Map<unknown, unknown[]>();\n for (const r of related) {\n const key = (r as any)[relation.to.column];\n if (!relatedMap.has(key)) {\n relatedMap.set(key, []);\n }\n relatedMap.get(key)!.push(r);\n }\n for (const row of rows) {\n const key = row[pk];\n (row as any)[relationName] = relatedMap.get(key) ?? [];\n }\n }\n }\n\n return rows;\n }\n\n private async findRelated(\n tableName: string,\n column: string,\n ids: unknown[],\n options: QueryOptions,\n ): Promise<any[]> {\n if (this.driver instanceof FileDriver) {\n const fd = this.driver as FileDriver;\n const filter = (row: Record<string, unknown>) => ids.includes(row[column]);\n return fd.findRows(tableName, filter);\n }\n\n const params: unknown[] = [];\n const placeholders = ids.map(() => \"?\").join(\", \");\n params.push(...ids);\n\n let sql = `SELECT * FROM \\`${tableName}\\` WHERE \\`${column}\\` IN (${placeholders})`;\n if (options.orderBy) {\n const orderParts = Object.entries(options.orderBy).map(\n ([col, dir]) => `\\`${col}\\` ${(dir as string).toUpperCase()}`,\n );\n if (orderParts.length > 0) {\n sql += ` ORDER BY ${orderParts.join(\", \")}`;\n }\n }\n if (options.take) {\n sql += ` LIMIT ${options.take}`;\n }\n\n return this.driver.query(sql, params);\n }\n\n private cleanData(data: Partial<T>): Record<string, unknown> {\n const cleaned: Record<string, unknown> = {};\n const dbColumnNames = new Set(this.meta.columns.map((c) => c.name));\n const codeKeys = new Set(Object.keys(this.columnMap));\n for (const [key, value] of Object.entries(data as Record<string, unknown>)) {\n if (codeKeys.has(key) || dbColumnNames.has(key)) {\n cleaned[key] = value;\n }\n }\n return cleaned;\n }\n\n private cacheEntities(rows: T[]): void {\n const pk = this.registry.getPrimaryKey(this.tableName);\n if (!pk) {\n return;\n }\n for (const row of rows) {\n if (row[pk] != null) {\n this.cache.setEntity(this.tableName, row[pk], row);\n }\n }\n }\n\n private cacheEntity(row: T): void {\n const pk = this.registry.getPrimaryKey(this.tableName);\n if (!pk || row[pk] == null) {\n return;\n }\n this.cache.setEntity(this.tableName, row[pk], row);\n }\n\n private toDbKeys(data: Record<string, unknown>): Record<string, unknown> {\n if (!this.hasAliases) {\n return data;\n }\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n result[this.columnMap[key] ?? key] = value;\n }\n return result;\n }\n\n private toCodeKeys(row: Record<string, unknown>): Record<string, unknown> {\n if (!this.hasAliases) {\n return row;\n }\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(row)) {\n result[this.reverseColumnMap[key] ?? key] = value;\n }\n return result;\n }\n\n private mapWhereToDb(where: WhereClause): WhereClause {\n if (!this.hasAliases) {\n return where;\n }\n const result: WhereClause = {};\n for (const [key, value] of Object.entries(where)) {\n if (key === \"OR\" || key === \"AND\") {\n (result as any)[key] = (value as WhereClause[]).map((sub) => this.mapWhereToDb(sub));\n } else {\n result[this.columnMap[key] ?? key] = value;\n }\n }\n return result;\n }\n\n private mapSelectToDb(select: string[]): string[] {\n if (!this.hasAliases) {\n return select;\n }\n return select.map((key) => this.columnMap[key] ?? key);\n }\n\n private mapOrderByToDb(orderBy: Record<string, \"asc\" | \"desc\">): Record<string, \"asc\" | \"desc\"> {\n if (!this.hasAliases) {\n return orderBy;\n }\n const result: Record<string, \"asc\" | \"desc\"> = {};\n for (const [key, value] of Object.entries(orderBy)) {\n result[this.columnMap[key] ?? key] = value;\n }\n return result;\n }\n\n private mapOptionsToDb(options?: QueryOptions<T>): QueryOptions | undefined {\n if (!options || !this.hasAliases) {\n return options as QueryOptions | undefined;\n }\n const mapped: QueryOptions = { ...options } as any;\n if (options.where) {\n mapped.where = this.mapWhereToDb(options.where as WhereClause);\n }\n if (options.select) {\n mapped.select = this.mapSelectToDb(options.select);\n }\n if (options.orderBy) {\n mapped.orderBy = this.mapOrderByToDb(options.orderBy as Record<string, \"asc\" | \"desc\">);\n }\n return mapped;\n }\n\n private mapRows(rows: Record<string, unknown>[]): T[] {\n if (!this.hasAliases) {\n return rows as T[];\n }\n return rows.map((row) => this.toCodeKeys(row) as T);\n }\n}\n"],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -24,12 +24,17 @@ exports.ColumnBuilder = require_column.ColumnBuilder;
|
|
|
24
24
|
exports.DatabaseError = require_errors.DatabaseError;
|
|
25
25
|
exports.DriverError = require_errors.DriverError;
|
|
26
26
|
exports.MigrationError = require_errors.MigrationError;
|
|
27
|
+
exports.NamedColumnStarter = require_index$1.NamedColumnStarter;
|
|
27
28
|
exports.QueryError = require_errors.QueryError;
|
|
28
29
|
exports.SchemaError = require_errors.SchemaError;
|
|
29
30
|
exports.SchemaRegistry = require_registry.SchemaRegistry;
|
|
30
31
|
exports.SyncError = require_errors.SyncError;
|
|
31
32
|
exports.Synchronizer = require_synchronizer.Synchronizer;
|
|
32
33
|
exports.TableRepository = require_repository.TableRepository;
|
|
34
|
+
exports.bigint = require_index$1.bigint;
|
|
35
|
+
exports.blob = require_index$1.blob;
|
|
36
|
+
exports.boolean = require_index$1.boolean;
|
|
37
|
+
exports.char = require_index$1.char;
|
|
33
38
|
Object.defineProperty(exports, "columns", {
|
|
34
39
|
enumerable: true,
|
|
35
40
|
get: function() {
|
|
@@ -46,10 +51,19 @@ exports.compileWhere = require_sql_compiler.compileWhere;
|
|
|
46
51
|
exports.createDriver = require_index.createDriver;
|
|
47
52
|
exports.d = require_index$1.d;
|
|
48
53
|
exports.database = require_database.database;
|
|
54
|
+
exports.datetime = require_index$1.datetime;
|
|
55
|
+
exports.decimal = require_index$1.decimal;
|
|
49
56
|
exports.default = src_default;
|
|
57
|
+
exports.float = require_index$1.float;
|
|
50
58
|
exports.generateMigrationTemplate = require_templates.generateMigrationTemplate;
|
|
51
59
|
exports.generateSchemaTemplate = require_templates.generateSchemaTemplate;
|
|
60
|
+
exports.integer = require_index$1.integer;
|
|
61
|
+
exports.json = require_index$1.json;
|
|
52
62
|
exports.migration = require_definition.migration;
|
|
63
|
+
exports.name = require_index$1.name;
|
|
53
64
|
exports.table = require_table.table;
|
|
65
|
+
exports.text = require_index$1.text;
|
|
66
|
+
exports.timestamp = require_index$1.timestamp;
|
|
67
|
+
exports.varchar = require_index$1.varchar;
|
|
54
68
|
|
|
55
69
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["database"],"sources":["../src/index.ts"],"sourcesContent":["import { CacheManager } from \"./cache\";\nimport { database } from \"./core/database\";\nimport { TableRepository } from \"./core/repository\";\nimport { createDriver } from \"./drivers\";\nimport {\n compileColumnDef,\n compileCreateTable,\n compileDelete,\n compileInsert,\n compileSelect,\n compileUpdate,\n compileWhere,\n} from \"./drivers/sql-compiler\";\nimport { migration } from \"./migrations/definition\";\nimport { generateMigrationTemplate, generateSchemaTemplate } from \"./migrations/templates\";\nimport { ColumnBuilder } from \"./schema/column\";\nimport * as columns from \"./schema/columns\";\nimport {
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["database"],"sources":["../src/index.ts"],"sourcesContent":["import { CacheManager } from \"./cache\";\nimport { database } from \"./core/database\";\nimport { TableRepository } from \"./core/repository\";\nimport { createDriver } from \"./drivers\";\nimport {\n compileColumnDef,\n compileCreateTable,\n compileDelete,\n compileInsert,\n compileSelect,\n compileUpdate,\n compileWhere,\n} from \"./drivers/sql-compiler\";\nimport { migration } from \"./migrations/definition\";\nimport { generateMigrationTemplate, generateSchemaTemplate } from \"./migrations/templates\";\nimport { ColumnBuilder } from \"./schema/column\";\nimport * as columns from \"./schema/columns\";\nimport { SchemaRegistry } from \"./schema/registry\";\nimport { table } from \"./schema/table\";\nimport { Synchronizer } from \"./sync/synchronizer\";\n\nexport {\n CacheError,\n DatabaseError,\n DriverError,\n MigrationError,\n QueryError,\n SchemaError,\n SyncError,\n} from \"./errors\";\nexport * from \"./schema/columns\";\nexport type {\n CacheConfig,\n ColumnDataType,\n ColumnMetadata,\n ConnectionConfig,\n DatabaseConfig,\n DatabaseDriver,\n DatabaseType,\n DeferredRefMeta,\n DeleteOptions,\n FileConnectionConfig,\n InferInsert,\n InferRow,\n InferUpdate,\n MigrationContext,\n MigrationDefinition,\n MySQLConnectionConfig,\n QueryOptions,\n ReferenceAction,\n RelationQueryMap,\n RelationsFor,\n Repository,\n ResolveResult,\n SQLiteConnectionConfig,\n TableDefinition,\n TableMetadata,\n UpdateOptions,\n WhereClause,\n WhereCondition,\n} from \"./types\";\nexport {\n CacheManager,\n ColumnBuilder,\n columns,\n compileColumnDef,\n compileCreateTable,\n compileDelete,\n compileInsert,\n compileSelect,\n compileUpdate,\n compileWhere,\n createDriver,\n database,\n generateMigrationTemplate,\n generateSchemaTemplate,\n migration,\n SchemaRegistry,\n Synchronizer,\n TableRepository,\n table,\n};\n\nexport default database;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAmFA,IAAA,cAAeA,iBAAAA"}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CacheConfig, ColumnDataType, ColumnMetadata, ConnectionConfig, DatabaseConfig, DatabaseDriver, DatabaseType, DeferredRefMeta, DeleteOptions, FileConnectionConfig, InferInsert, InferRow, InferUpdate, MigrationContext, MigrationDefinition, MySQLConnectionConfig, QueryOptions, ReferenceAction, RelationQueryMap, RelationsFor, Repository, ResolveResult, SQLiteConnectionConfig, TableDefinition, TableMetadata, UpdateOptions, WhereClause, WhereCondition } from "./types.cjs";
|
|
2
2
|
import { CacheManager } from "./cache/manager.cjs";
|
|
3
3
|
import { ColumnBuilder } from "./schema/column.cjs";
|
|
4
|
-
import { d, index_d_exports } from "./schema/columns/index.cjs";
|
|
4
|
+
import { NamedColumnStarter, bigint, blob, boolean, char, d, datetime, decimal, float, index_d_exports, integer, json, name, text, timestamp, varchar } from "./schema/columns/index.cjs";
|
|
5
5
|
import { SchemaRegistry } from "./schema/registry.cjs";
|
|
6
6
|
import { table } from "./schema/table.cjs";
|
|
7
7
|
import { database } from "./core/database.cjs";
|
|
@@ -12,4 +12,4 @@ import { migration } from "./migrations/definition.cjs";
|
|
|
12
12
|
import { generateMigrationTemplate, generateSchemaTemplate } from "./migrations/templates.cjs";
|
|
13
13
|
import { Synchronizer } from "./sync/synchronizer.cjs";
|
|
14
14
|
import { CacheError, DatabaseError, DriverError, MigrationError, QueryError, SchemaError, SyncError } from "./errors.cjs";
|
|
15
|
-
export { type CacheConfig, CacheError, CacheManager, ColumnBuilder, type ColumnDataType, type ColumnMetadata, type ConnectionConfig, type DatabaseConfig, type DatabaseDriver, DatabaseError, type DatabaseType, type DeferredRefMeta, type DeleteOptions, DriverError, type FileConnectionConfig, type InferInsert, type InferRow, type InferUpdate, type MigrationContext, type MigrationDefinition, MigrationError, type MySQLConnectionConfig, QueryError, type QueryOptions, type ReferenceAction, type RelationQueryMap, type RelationsFor, type Repository, type ResolveResult, type SQLiteConnectionConfig, SchemaError, SchemaRegistry, SyncError, Synchronizer, type TableDefinition, type TableMetadata, TableRepository, type UpdateOptions, type WhereClause, type WhereCondition, index_d_exports as columns, compileColumnDef, compileCreateTable, compileDelete, compileInsert, compileSelect, compileUpdate, compileWhere, createDriver, d, database, database as default, generateMigrationTemplate, generateSchemaTemplate, migration, table };
|
|
15
|
+
export { type CacheConfig, CacheError, CacheManager, ColumnBuilder, type ColumnDataType, type ColumnMetadata, type ConnectionConfig, type DatabaseConfig, type DatabaseDriver, DatabaseError, type DatabaseType, type DeferredRefMeta, type DeleteOptions, DriverError, type FileConnectionConfig, type InferInsert, type InferRow, type InferUpdate, type MigrationContext, type MigrationDefinition, MigrationError, type MySQLConnectionConfig, NamedColumnStarter, QueryError, type QueryOptions, type ReferenceAction, type RelationQueryMap, type RelationsFor, type Repository, type ResolveResult, type SQLiteConnectionConfig, SchemaError, SchemaRegistry, SyncError, Synchronizer, type TableDefinition, type TableMetadata, TableRepository, type UpdateOptions, type WhereClause, type WhereCondition, bigint, blob, boolean, char, index_d_exports as columns, compileColumnDef, compileCreateTable, compileDelete, compileInsert, compileSelect, compileUpdate, compileWhere, createDriver, d, database, database as default, datetime, decimal, float, generateMigrationTemplate, generateSchemaTemplate, integer, json, migration, name, table, text, timestamp, varchar };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CacheConfig, ColumnDataType, ColumnMetadata, ConnectionConfig, DatabaseConfig, DatabaseDriver, DatabaseType, DeferredRefMeta, DeleteOptions, FileConnectionConfig, InferInsert, InferRow, InferUpdate, MigrationContext, MigrationDefinition, MySQLConnectionConfig, QueryOptions, ReferenceAction, RelationQueryMap, RelationsFor, Repository, ResolveResult, SQLiteConnectionConfig, TableDefinition, TableMetadata, UpdateOptions, WhereClause, WhereCondition } from "./types.mjs";
|
|
2
2
|
import { CacheManager } from "./cache/manager.mjs";
|
|
3
3
|
import { ColumnBuilder } from "./schema/column.mjs";
|
|
4
|
-
import { d, index_d_exports } from "./schema/columns/index.mjs";
|
|
4
|
+
import { NamedColumnStarter, bigint, blob, boolean, char, d, datetime, decimal, float, index_d_exports, integer, json, name, text, timestamp, varchar } from "./schema/columns/index.mjs";
|
|
5
5
|
import { SchemaRegistry } from "./schema/registry.mjs";
|
|
6
6
|
import { table } from "./schema/table.mjs";
|
|
7
7
|
import { database } from "./core/database.mjs";
|
|
@@ -12,4 +12,4 @@ import { migration } from "./migrations/definition.mjs";
|
|
|
12
12
|
import { generateMigrationTemplate, generateSchemaTemplate } from "./migrations/templates.mjs";
|
|
13
13
|
import { Synchronizer } from "./sync/synchronizer.mjs";
|
|
14
14
|
import { CacheError, DatabaseError, DriverError, MigrationError, QueryError, SchemaError, SyncError } from "./errors.mjs";
|
|
15
|
-
export { type CacheConfig, CacheError, CacheManager, ColumnBuilder, type ColumnDataType, type ColumnMetadata, type ConnectionConfig, type DatabaseConfig, type DatabaseDriver, DatabaseError, type DatabaseType, type DeferredRefMeta, type DeleteOptions, DriverError, type FileConnectionConfig, type InferInsert, type InferRow, type InferUpdate, type MigrationContext, type MigrationDefinition, MigrationError, type MySQLConnectionConfig, QueryError, type QueryOptions, type ReferenceAction, type RelationQueryMap, type RelationsFor, type Repository, type ResolveResult, type SQLiteConnectionConfig, SchemaError, SchemaRegistry, SyncError, Synchronizer, type TableDefinition, type TableMetadata, TableRepository, type UpdateOptions, type WhereClause, type WhereCondition, index_d_exports as columns, compileColumnDef, compileCreateTable, compileDelete, compileInsert, compileSelect, compileUpdate, compileWhere, createDriver, d, database, database as default, generateMigrationTemplate, generateSchemaTemplate, migration, table };
|
|
15
|
+
export { type CacheConfig, CacheError, CacheManager, ColumnBuilder, type ColumnDataType, type ColumnMetadata, type ConnectionConfig, type DatabaseConfig, type DatabaseDriver, DatabaseError, type DatabaseType, type DeferredRefMeta, type DeleteOptions, DriverError, type FileConnectionConfig, type InferInsert, type InferRow, type InferUpdate, type MigrationContext, type MigrationDefinition, MigrationError, type MySQLConnectionConfig, NamedColumnStarter, QueryError, type QueryOptions, type ReferenceAction, type RelationQueryMap, type RelationsFor, type Repository, type ResolveResult, type SQLiteConnectionConfig, SchemaError, SchemaRegistry, SyncError, Synchronizer, type TableDefinition, type TableMetadata, TableRepository, type UpdateOptions, type WhereClause, type WhereCondition, bigint, blob, boolean, char, index_d_exports as columns, compileColumnDef, compileCreateTable, compileDelete, compileInsert, compileSelect, compileUpdate, compileWhere, createDriver, d, database, database as default, datetime, decimal, float, generateMigrationTemplate, generateSchemaTemplate, integer, json, migration, name, table, text, timestamp, varchar };
|
package/dist/index.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import { CacheError, DatabaseError, DriverError, MigrationError, QueryError, Sch
|
|
|
3
3
|
import { compileColumnDef, compileCreateTable, compileDelete, compileInsert, compileSelect, compileUpdate, compileWhere } from "./drivers/sql-compiler.mjs";
|
|
4
4
|
import { createDriver } from "./drivers/index.mjs";
|
|
5
5
|
import { ColumnBuilder } from "./schema/column.mjs";
|
|
6
|
-
import { columns_exports, d } from "./schema/columns/index.mjs";
|
|
6
|
+
import { NamedColumnStarter, bigint, blob, boolean, char, columns_exports, d, datetime, decimal, float, integer, json, name, text, timestamp, varchar } from "./schema/columns/index.mjs";
|
|
7
7
|
import { SchemaRegistry } from "./schema/registry.mjs";
|
|
8
8
|
import { table } from "./schema/table.mjs";
|
|
9
9
|
import { TableRepository } from "./core/repository.mjs";
|
|
@@ -16,6 +16,6 @@ init_definition();
|
|
|
16
16
|
init_templates();
|
|
17
17
|
var src_default = database;
|
|
18
18
|
//#endregion
|
|
19
|
-
export { CacheError, CacheManager, ColumnBuilder, DatabaseError, DriverError, MigrationError, QueryError, SchemaError, SchemaRegistry, SyncError, Synchronizer, TableRepository, columns_exports as columns, compileColumnDef, compileCreateTable, compileDelete, compileInsert, compileSelect, compileUpdate, compileWhere, createDriver, d, database, src_default as default, generateMigrationTemplate, generateSchemaTemplate, migration, table };
|
|
19
|
+
export { CacheError, CacheManager, ColumnBuilder, DatabaseError, DriverError, MigrationError, NamedColumnStarter, QueryError, SchemaError, SchemaRegistry, SyncError, Synchronizer, TableRepository, bigint, blob, boolean, char, columns_exports as columns, compileColumnDef, compileCreateTable, compileDelete, compileInsert, compileSelect, compileUpdate, compileWhere, createDriver, d, database, datetime, decimal, src_default as default, float, generateMigrationTemplate, generateSchemaTemplate, integer, json, migration, name, table, text, timestamp, varchar };
|
|
20
20
|
|
|
21
21
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { CacheManager } from \"./cache\";\nimport { database } from \"./core/database\";\nimport { TableRepository } from \"./core/repository\";\nimport { createDriver } from \"./drivers\";\nimport {\n compileColumnDef,\n compileCreateTable,\n compileDelete,\n compileInsert,\n compileSelect,\n compileUpdate,\n compileWhere,\n} from \"./drivers/sql-compiler\";\nimport { migration } from \"./migrations/definition\";\nimport { generateMigrationTemplate, generateSchemaTemplate } from \"./migrations/templates\";\nimport { ColumnBuilder } from \"./schema/column\";\nimport * as columns from \"./schema/columns\";\nimport {
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { CacheManager } from \"./cache\";\nimport { database } from \"./core/database\";\nimport { TableRepository } from \"./core/repository\";\nimport { createDriver } from \"./drivers\";\nimport {\n compileColumnDef,\n compileCreateTable,\n compileDelete,\n compileInsert,\n compileSelect,\n compileUpdate,\n compileWhere,\n} from \"./drivers/sql-compiler\";\nimport { migration } from \"./migrations/definition\";\nimport { generateMigrationTemplate, generateSchemaTemplate } from \"./migrations/templates\";\nimport { ColumnBuilder } from \"./schema/column\";\nimport * as columns from \"./schema/columns\";\nimport { SchemaRegistry } from \"./schema/registry\";\nimport { table } from \"./schema/table\";\nimport { Synchronizer } from \"./sync/synchronizer\";\n\nexport {\n CacheError,\n DatabaseError,\n DriverError,\n MigrationError,\n QueryError,\n SchemaError,\n SyncError,\n} from \"./errors\";\nexport * from \"./schema/columns\";\nexport type {\n CacheConfig,\n ColumnDataType,\n ColumnMetadata,\n ConnectionConfig,\n DatabaseConfig,\n DatabaseDriver,\n DatabaseType,\n DeferredRefMeta,\n DeleteOptions,\n FileConnectionConfig,\n InferInsert,\n InferRow,\n InferUpdate,\n MigrationContext,\n MigrationDefinition,\n MySQLConnectionConfig,\n QueryOptions,\n ReferenceAction,\n RelationQueryMap,\n RelationsFor,\n Repository,\n ResolveResult,\n SQLiteConnectionConfig,\n TableDefinition,\n TableMetadata,\n UpdateOptions,\n WhereClause,\n WhereCondition,\n} from \"./types\";\nexport {\n CacheManager,\n ColumnBuilder,\n columns,\n compileColumnDef,\n compileCreateTable,\n compileDelete,\n compileInsert,\n compileSelect,\n compileUpdate,\n compileWhere,\n createDriver,\n database,\n generateMigrationTemplate,\n generateSchemaTemplate,\n migration,\n SchemaRegistry,\n Synchronizer,\n TableRepository,\n table,\n};\n\nexport default database;\n"],"mappings":";;;;;;;;;;;;;;iBAaoD;gBACuC;AAqE3F,IAAA,cAAe"}
|
|
@@ -23,12 +23,12 @@ export default migration("${name}", {
|
|
|
23
23
|
* @returns {string} Schema file content
|
|
24
24
|
*/
|
|
25
25
|
function generateSchemaTemplate(name) {
|
|
26
|
-
return `import { table,
|
|
26
|
+
return `import { table, integer, datetime } from "@hedystia/db";
|
|
27
27
|
|
|
28
28
|
export const ${name} = table("${name}", {
|
|
29
|
-
id:
|
|
30
|
-
createdAt:
|
|
31
|
-
updatedAt:
|
|
29
|
+
id: integer().primaryKey().autoIncrement(),
|
|
30
|
+
createdAt: datetime().default(new Date()),
|
|
31
|
+
updatedAt: datetime().default(new Date()),
|
|
32
32
|
});
|
|
33
33
|
`;
|
|
34
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.cjs","names":[],"sources":["../../src/migrations/templates.ts"],"sourcesContent":["/**\n * Generate a migration file template\n * @param {string} name - Migration name\n * @returns {string} Migration file content\n */\nexport function generateMigrationTemplate(name: string): string {\n return `import { migration } from \"@hedystia/db\";\n\nexport default migration(\"${name}\", {\n async up({ schema, sql }) {\n // Add your migration logic here\n },\n async down({ schema, sql }) {\n // Add your rollback logic here\n },\n});\n`;\n}\n\n/**\n * Generate a schema file template\n * @param {string} name - Table name\n * @returns {string} Schema file content\n */\nexport function generateSchemaTemplate(name: string): string {\n return `import { table,
|
|
1
|
+
{"version":3,"file":"templates.cjs","names":[],"sources":["../../src/migrations/templates.ts"],"sourcesContent":["/**\n * Generate a migration file template\n * @param {string} name - Migration name\n * @returns {string} Migration file content\n */\nexport function generateMigrationTemplate(name: string): string {\n return `import { migration } from \"@hedystia/db\";\n\nexport default migration(\"${name}\", {\n async up({ schema, sql }) {\n // Add your migration logic here\n },\n async down({ schema, sql }) {\n // Add your rollback logic here\n },\n});\n`;\n}\n\n/**\n * Generate a schema file template\n * @param {string} name - Table name\n * @returns {string} Schema file content\n */\nexport function generateSchemaTemplate(name: string): string {\n return `import { table, integer, datetime } from \"@hedystia/db\";\n\nexport const ${name} = table(\"${name}\", {\n id: integer().primaryKey().autoIncrement(),\n createdAt: datetime().default(new Date()),\n updatedAt: datetime().default(new Date()),\n});\n`;\n}\n"],"mappings":";;;;;;AAKA,SAAgB,0BAA0B,MAAsB;AAC9D,QAAO;;4BAEmB,KAAK;;;;;;;;;;;;;;;AAgBjC,SAAgB,uBAAuB,MAAsB;AAC3D,QAAO;;eAEM,KAAK,YAAY,KAAK"}
|
|
@@ -24,12 +24,12 @@ export default migration("${name}", {
|
|
|
24
24
|
* @returns {string} Schema file content
|
|
25
25
|
*/
|
|
26
26
|
function generateSchemaTemplate(name) {
|
|
27
|
-
return `import { table,
|
|
27
|
+
return `import { table, integer, datetime } from "@hedystia/db";
|
|
28
28
|
|
|
29
29
|
export const ${name} = table("${name}", {
|
|
30
|
-
id:
|
|
31
|
-
createdAt:
|
|
32
|
-
updatedAt:
|
|
30
|
+
id: integer().primaryKey().autoIncrement(),
|
|
31
|
+
createdAt: datetime().default(new Date()),
|
|
32
|
+
updatedAt: datetime().default(new Date()),
|
|
33
33
|
});
|
|
34
34
|
`;
|
|
35
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.mjs","names":[],"sources":["../../src/migrations/templates.ts"],"sourcesContent":["/**\n * Generate a migration file template\n * @param {string} name - Migration name\n * @returns {string} Migration file content\n */\nexport function generateMigrationTemplate(name: string): string {\n return `import { migration } from \"@hedystia/db\";\n\nexport default migration(\"${name}\", {\n async up({ schema, sql }) {\n // Add your migration logic here\n },\n async down({ schema, sql }) {\n // Add your rollback logic here\n },\n});\n`;\n}\n\n/**\n * Generate a schema file template\n * @param {string} name - Table name\n * @returns {string} Schema file content\n */\nexport function generateSchemaTemplate(name: string): string {\n return `import { table,
|
|
1
|
+
{"version":3,"file":"templates.mjs","names":[],"sources":["../../src/migrations/templates.ts"],"sourcesContent":["/**\n * Generate a migration file template\n * @param {string} name - Migration name\n * @returns {string} Migration file content\n */\nexport function generateMigrationTemplate(name: string): string {\n return `import { migration } from \"@hedystia/db\";\n\nexport default migration(\"${name}\", {\n async up({ schema, sql }) {\n // Add your migration logic here\n },\n async down({ schema, sql }) {\n // Add your rollback logic here\n },\n});\n`;\n}\n\n/**\n * Generate a schema file template\n * @param {string} name - Table name\n * @returns {string} Schema file content\n */\nexport function generateSchemaTemplate(name: string): string {\n return `import { table, integer, datetime } from \"@hedystia/db\";\n\nexport const ${name} = table(\"${name}\", {\n id: integer().primaryKey().autoIncrement(),\n createdAt: datetime().default(new Date()),\n updatedAt: datetime().default(new Date()),\n});\n`;\n}\n"],"mappings":";;;;;;;AAKA,SAAgB,0BAA0B,MAAsB;AAC9D,QAAO;;4BAEmB,KAAK;;;;;;;;;;;;;;;AAgBjC,SAAgB,uBAAuB,MAAsB;AAC3D,QAAO;;eAEM,KAAK,YAAY,KAAK"}
|
package/dist/schema/column.cjs
CHANGED
|
@@ -16,6 +16,7 @@ var ColumnBuilder = class {
|
|
|
16
16
|
_length;
|
|
17
17
|
_precision;
|
|
18
18
|
_scale;
|
|
19
|
+
_columnAlias;
|
|
19
20
|
_references;
|
|
20
21
|
constructor(type, length, precision, scale) {
|
|
21
22
|
this._type = type;
|
|
@@ -24,6 +25,29 @@ var ColumnBuilder = class {
|
|
|
24
25
|
this._scale = scale;
|
|
25
26
|
}
|
|
26
27
|
/**
|
|
28
|
+
* Set a custom database column name different from the property key
|
|
29
|
+
* @param {string} alias - The column name to use in the database
|
|
30
|
+
* @returns {ColumnBuilder<T, TN, CN, Ref>} The column builder for chaining
|
|
31
|
+
* @example
|
|
32
|
+
* // In code: guildId, In database: guild_id
|
|
33
|
+
* guildId: varchar(255).name("guild_id")
|
|
34
|
+
*/
|
|
35
|
+
name(alias) {
|
|
36
|
+
this._columnAlias = alias;
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Override the TypeScript type for this column with a custom type literal
|
|
41
|
+
* @template U - The custom type to use
|
|
42
|
+
* @returns {ColumnBuilder<U, TN, CN, Ref>} The column builder with the new type
|
|
43
|
+
* @example
|
|
44
|
+
* // Limits autocomplete to specific values
|
|
45
|
+
* locale: varchar(25).type<"en_US" | "es_ES">()
|
|
46
|
+
*/
|
|
47
|
+
type() {
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
27
51
|
* Mark this column as a primary key
|
|
28
52
|
* @returns {ColumnBuilder<T, TN, CN, Ref>} The column builder for chaining
|
|
29
53
|
*/
|
|
@@ -56,6 +80,13 @@ var ColumnBuilder = class {
|
|
|
56
80
|
return this;
|
|
57
81
|
}
|
|
58
82
|
/**
|
|
83
|
+
* Mark this column as nullable (alias for {@link nullable})
|
|
84
|
+
* @returns {ColumnBuilder<T | null, TN, CN, Ref>} The column builder for chaining
|
|
85
|
+
*/
|
|
86
|
+
null() {
|
|
87
|
+
return this.nullable();
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
59
90
|
* Set a default value for this column
|
|
60
91
|
* @param {T} value - The default value
|
|
61
92
|
* @returns {ColumnBuilder<T, TN, CN, Ref>} The column builder for chaining
|
|
@@ -103,7 +134,7 @@ var ColumnBuilder = class {
|
|
|
103
134
|
*/
|
|
104
135
|
__build(name) {
|
|
105
136
|
return {
|
|
106
|
-
name,
|
|
137
|
+
name: this._columnAlias ?? name,
|
|
107
138
|
type: this._type,
|
|
108
139
|
primaryKey: this._primaryKey,
|
|
109
140
|
autoIncrement: this._autoIncrement,
|
|
@@ -112,7 +143,8 @@ var ColumnBuilder = class {
|
|
|
112
143
|
defaultValue: this._defaultValue,
|
|
113
144
|
length: this._length,
|
|
114
145
|
precision: this._precision,
|
|
115
|
-
scale: this._scale
|
|
146
|
+
scale: this._scale,
|
|
147
|
+
columnAlias: this._columnAlias
|
|
116
148
|
};
|
|
117
149
|
}
|
|
118
150
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"column.cjs","names":[],"sources":["../../src/schema/column.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"column.cjs","names":[],"sources":["../../src/schema/column.ts"],"sourcesContent":["import type { ColumnDataType, ColumnMetadata, DeferredRefMeta, ReferenceAction } from \"../types\";\n\n/**\n * Base column builder with chainable methods for defining column properties\n * @template T - The TypeScript type this column resolves to\n * @template TN - The table name this column belongs to (set by table())\n * @template CN - The column name (set by table())\n * @template Ref - The deferred reference metadata (set by references())\n */\nexport class ColumnBuilder<\n T = unknown,\n TN extends string = string,\n CN extends string = string,\n Ref extends DeferredRefMeta = never,\n> {\n declare readonly __type: T;\n declare readonly __tableName: TN;\n declare readonly __columnName: CN;\n declare readonly __ref: Ref;\n private _type: ColumnDataType;\n private _primaryKey = false;\n private _autoIncrement = false;\n private _notNull = false;\n private _unique = false;\n private _defaultValue: unknown = undefined;\n private _length?: number;\n private _precision?: number;\n private _scale?: number;\n private _columnAlias?: string;\n private _references?: {\n resolve: () => { table: string; column: string };\n onDelete?: ReferenceAction;\n onUpdate?: ReferenceAction;\n relationName?: string;\n };\n\n constructor(type: ColumnDataType, length?: number, precision?: number, scale?: number) {\n this._type = type;\n this._length = length;\n this._precision = precision;\n this._scale = scale;\n }\n\n /**\n * Set a custom database column name different from the property key\n * @param {string} alias - The column name to use in the database\n * @returns {ColumnBuilder<T, TN, CN, Ref>} The column builder for chaining\n * @example\n * // In code: guildId, In database: guild_id\n * guildId: varchar(255).name(\"guild_id\")\n */\n name(alias: string): ColumnBuilder<T, TN, CN, Ref> {\n this._columnAlias = alias;\n return this;\n }\n\n /**\n * Override the TypeScript type for this column with a custom type literal\n * @template U - The custom type to use\n * @returns {ColumnBuilder<U, TN, CN, Ref>} The column builder with the new type\n * @example\n * // Limits autocomplete to specific values\n * locale: varchar(25).type<\"en_US\" | \"es_ES\">()\n */\n type<U>(): ColumnBuilder<U, TN, CN, Ref> {\n return this as unknown as ColumnBuilder<U, TN, CN, Ref>;\n }\n\n /**\n * Mark this column as a primary key\n * @returns {ColumnBuilder<T, TN, CN, Ref>} The column builder for chaining\n */\n primaryKey(): ColumnBuilder<T, TN, CN, Ref> {\n this._primaryKey = true;\n return this;\n }\n\n /**\n * Mark this column as auto-incrementing\n * @returns {ColumnBuilder<T, TN, CN, Ref>} The column builder for chaining\n */\n autoIncrement(): ColumnBuilder<T, TN, CN, Ref> {\n this._autoIncrement = true;\n return this;\n }\n\n /**\n * Mark this column as NOT NULL\n * @returns {ColumnBuilder<NonNullable<T>, TN, CN, Ref>} The column builder for chaining\n */\n notNull(): ColumnBuilder<NonNullable<T>, TN, CN, Ref> {\n this._notNull = true;\n return this as unknown as ColumnBuilder<NonNullable<T>, TN, CN, Ref>;\n }\n\n /**\n * Mark this column as nullable\n * @returns {ColumnBuilder<T | null, TN, CN, Ref>} The column builder for chaining\n */\n nullable(): ColumnBuilder<T | null, TN, CN, Ref> {\n this._notNull = false;\n return this as unknown as ColumnBuilder<T | null, TN, CN, Ref>;\n }\n\n /**\n * Mark this column as nullable (alias for {@link nullable})\n * @returns {ColumnBuilder<T | null, TN, CN, Ref>} The column builder for chaining\n */\n null(): ColumnBuilder<T | null, TN, CN, Ref> {\n return this.nullable();\n }\n\n /**\n * Set a default value for this column\n * @param {T} value - The default value\n * @returns {ColumnBuilder<T, TN, CN, Ref>} The column builder for chaining\n */\n default(value: T): ColumnBuilder<T, TN, CN, Ref> {\n this._defaultValue = value;\n return this;\n }\n\n /**\n * Mark this column as having a unique constraint\n * @returns {ColumnBuilder<T, TN, CN, Ref>} The column builder for chaining\n */\n unique(): ColumnBuilder<T, TN, CN, Ref> {\n this._unique = true;\n return this;\n }\n\n /**\n * Add a foreign key reference to another table's column\n * @param {() => ColumnBuilder<any>} ref - A function returning the referenced column\n * @param {object} [options] - Reference options\n * @param {ReferenceAction} [options.onDelete] - Action on delete\n * @param {ReferenceAction} [options.onUpdate] - Action on update\n * @param {string} [options.relationName] - Name for the relation\n * @returns {ColumnBuilder<T>} The column builder for chaining\n */\n references<\n R extends ColumnBuilder<any, string, string, any>,\n O extends {\n onDelete?: ReferenceAction;\n onUpdate?: ReferenceAction;\n relationName?: string;\n } = never,\n >(\n ref: () => R,\n options?: O,\n ): ColumnBuilder<\n T,\n TN,\n CN,\n DeferredRefMeta<\n CN,\n R[\"__tableName\"],\n R[\"__columnName\"],\n O extends { relationName: infer N extends string } ? N : undefined\n >\n > {\n this._references = {\n resolve: () => {\n const col = ref();\n return {\n table: (col as any).__tableName ?? \"\",\n column: (col as any).__columnName ?? \"\",\n };\n },\n onDelete: options?.onDelete,\n onUpdate: options?.onUpdate,\n relationName: options?.relationName,\n };\n return this as any;\n }\n\n /**\n * Build the column metadata from the builder configuration\n * @param {string} name - The column name\n * @returns {ColumnMetadata} The built column metadata\n */\n __build(name: string): ColumnMetadata {\n return {\n name: this._columnAlias ?? name,\n type: this._type,\n primaryKey: this._primaryKey,\n autoIncrement: this._autoIncrement,\n notNull: this._notNull || this._primaryKey,\n unique: this._unique || this._primaryKey,\n defaultValue: this._defaultValue,\n length: this._length,\n precision: this._precision,\n scale: this._scale,\n columnAlias: this._columnAlias,\n };\n }\n\n /**\n * Get deferred reference data if this column has a foreign key reference\n * @returns {object | null} The deferred reference data or null\n */\n __getDeferredRef(): {\n resolve: () => { table: string; column: string };\n onDelete?: ReferenceAction;\n onUpdate?: ReferenceAction;\n relationName?: string;\n } | null {\n return this._references ?? null;\n }\n}\n"],"mappings":";;;;;;;;AASA,IAAa,gBAAb,MAKE;CAKA;CACA,cAAsB;CACtB,iBAAyB;CACzB,WAAmB;CACnB,UAAkB;CAClB,gBAAiC,KAAA;CACjC;CACA;CACA;CACA;CACA;CAOA,YAAY,MAAsB,QAAiB,WAAoB,OAAgB;AACrF,OAAK,QAAQ;AACb,OAAK,UAAU;AACf,OAAK,aAAa;AAClB,OAAK,SAAS;;;;;;;;;;CAWhB,KAAK,OAA8C;AACjD,OAAK,eAAe;AACpB,SAAO;;;;;;;;;;CAWT,OAAyC;AACvC,SAAO;;;;;;CAOT,aAA4C;AAC1C,OAAK,cAAc;AACnB,SAAO;;;;;;CAOT,gBAA+C;AAC7C,OAAK,iBAAiB;AACtB,SAAO;;;;;;CAOT,UAAsD;AACpD,OAAK,WAAW;AAChB,SAAO;;;;;;CAOT,WAAiD;AAC/C,OAAK,WAAW;AAChB,SAAO;;;;;;CAOT,OAA6C;AAC3C,SAAO,KAAK,UAAU;;;;;;;CAQxB,QAAQ,OAAyC;AAC/C,OAAK,gBAAgB;AACrB,SAAO;;;;;;CAOT,SAAwC;AACtC,OAAK,UAAU;AACf,SAAO;;;;;;;;;;;CAYT,WAQE,KACA,SAWA;AACA,OAAK,cAAc;GACjB,eAAe;IACb,MAAM,MAAM,KAAK;AACjB,WAAO;KACL,OAAQ,IAAY,eAAe;KACnC,QAAS,IAAY,gBAAgB;KACtC;;GAEH,UAAU,SAAS;GACnB,UAAU,SAAS;GACnB,cAAc,SAAS;GACxB;AACD,SAAO;;;;;;;CAQT,QAAQ,MAA8B;AACpC,SAAO;GACL,MAAM,KAAK,gBAAgB;GAC3B,MAAM,KAAK;GACX,YAAY,KAAK;GACjB,eAAe,KAAK;GACpB,SAAS,KAAK,YAAY,KAAK;GAC/B,QAAQ,KAAK,WAAW,KAAK;GAC7B,cAAc,KAAK;GACnB,QAAQ,KAAK;GACb,WAAW,KAAK;GAChB,OAAO,KAAK;GACZ,aAAa,KAAK;GACnB;;;;;;CAOH,mBAKS;AACP,SAAO,KAAK,eAAe"}
|
package/dist/schema/column.d.cts
CHANGED
|
@@ -22,8 +22,27 @@ declare class ColumnBuilder<T = unknown, TN extends string = string, CN extends
|
|
|
22
22
|
private _length?;
|
|
23
23
|
private _precision?;
|
|
24
24
|
private _scale?;
|
|
25
|
+
private _columnAlias?;
|
|
25
26
|
private _references?;
|
|
26
27
|
constructor(type: ColumnDataType, length?: number, precision?: number, scale?: number);
|
|
28
|
+
/**
|
|
29
|
+
* Set a custom database column name different from the property key
|
|
30
|
+
* @param {string} alias - The column name to use in the database
|
|
31
|
+
* @returns {ColumnBuilder<T, TN, CN, Ref>} The column builder for chaining
|
|
32
|
+
* @example
|
|
33
|
+
* // In code: guildId, In database: guild_id
|
|
34
|
+
* guildId: varchar(255).name("guild_id")
|
|
35
|
+
*/
|
|
36
|
+
name(alias: string): ColumnBuilder<T, TN, CN, Ref>;
|
|
37
|
+
/**
|
|
38
|
+
* Override the TypeScript type for this column with a custom type literal
|
|
39
|
+
* @template U - The custom type to use
|
|
40
|
+
* @returns {ColumnBuilder<U, TN, CN, Ref>} The column builder with the new type
|
|
41
|
+
* @example
|
|
42
|
+
* // Limits autocomplete to specific values
|
|
43
|
+
* locale: varchar(25).type<"en_US" | "es_ES">()
|
|
44
|
+
*/
|
|
45
|
+
type<U>(): ColumnBuilder<U, TN, CN, Ref>;
|
|
27
46
|
/**
|
|
28
47
|
* Mark this column as a primary key
|
|
29
48
|
* @returns {ColumnBuilder<T, TN, CN, Ref>} The column builder for chaining
|
|
@@ -44,6 +63,11 @@ declare class ColumnBuilder<T = unknown, TN extends string = string, CN extends
|
|
|
44
63
|
* @returns {ColumnBuilder<T | null, TN, CN, Ref>} The column builder for chaining
|
|
45
64
|
*/
|
|
46
65
|
nullable(): ColumnBuilder<T | null, TN, CN, Ref>;
|
|
66
|
+
/**
|
|
67
|
+
* Mark this column as nullable (alias for {@link nullable})
|
|
68
|
+
* @returns {ColumnBuilder<T | null, TN, CN, Ref>} The column builder for chaining
|
|
69
|
+
*/
|
|
70
|
+
null(): ColumnBuilder<T | null, TN, CN, Ref>;
|
|
47
71
|
/**
|
|
48
72
|
* Set a default value for this column
|
|
49
73
|
* @param {T} value - The default value
|
package/dist/schema/column.d.mts
CHANGED
|
@@ -22,8 +22,27 @@ declare class ColumnBuilder<T = unknown, TN extends string = string, CN extends
|
|
|
22
22
|
private _length?;
|
|
23
23
|
private _precision?;
|
|
24
24
|
private _scale?;
|
|
25
|
+
private _columnAlias?;
|
|
25
26
|
private _references?;
|
|
26
27
|
constructor(type: ColumnDataType, length?: number, precision?: number, scale?: number);
|
|
28
|
+
/**
|
|
29
|
+
* Set a custom database column name different from the property key
|
|
30
|
+
* @param {string} alias - The column name to use in the database
|
|
31
|
+
* @returns {ColumnBuilder<T, TN, CN, Ref>} The column builder for chaining
|
|
32
|
+
* @example
|
|
33
|
+
* // In code: guildId, In database: guild_id
|
|
34
|
+
* guildId: varchar(255).name("guild_id")
|
|
35
|
+
*/
|
|
36
|
+
name(alias: string): ColumnBuilder<T, TN, CN, Ref>;
|
|
37
|
+
/**
|
|
38
|
+
* Override the TypeScript type for this column with a custom type literal
|
|
39
|
+
* @template U - The custom type to use
|
|
40
|
+
* @returns {ColumnBuilder<U, TN, CN, Ref>} The column builder with the new type
|
|
41
|
+
* @example
|
|
42
|
+
* // Limits autocomplete to specific values
|
|
43
|
+
* locale: varchar(25).type<"en_US" | "es_ES">()
|
|
44
|
+
*/
|
|
45
|
+
type<U>(): ColumnBuilder<U, TN, CN, Ref>;
|
|
27
46
|
/**
|
|
28
47
|
* Mark this column as a primary key
|
|
29
48
|
* @returns {ColumnBuilder<T, TN, CN, Ref>} The column builder for chaining
|
|
@@ -44,6 +63,11 @@ declare class ColumnBuilder<T = unknown, TN extends string = string, CN extends
|
|
|
44
63
|
* @returns {ColumnBuilder<T | null, TN, CN, Ref>} The column builder for chaining
|
|
45
64
|
*/
|
|
46
65
|
nullable(): ColumnBuilder<T | null, TN, CN, Ref>;
|
|
66
|
+
/**
|
|
67
|
+
* Mark this column as nullable (alias for {@link nullable})
|
|
68
|
+
* @returns {ColumnBuilder<T | null, TN, CN, Ref>} The column builder for chaining
|
|
69
|
+
*/
|
|
70
|
+
null(): ColumnBuilder<T | null, TN, CN, Ref>;
|
|
47
71
|
/**
|
|
48
72
|
* Set a default value for this column
|
|
49
73
|
* @param {T} value - The default value
|
package/dist/schema/column.mjs
CHANGED
|
@@ -16,6 +16,7 @@ var ColumnBuilder = class {
|
|
|
16
16
|
_length;
|
|
17
17
|
_precision;
|
|
18
18
|
_scale;
|
|
19
|
+
_columnAlias;
|
|
19
20
|
_references;
|
|
20
21
|
constructor(type, length, precision, scale) {
|
|
21
22
|
this._type = type;
|
|
@@ -24,6 +25,29 @@ var ColumnBuilder = class {
|
|
|
24
25
|
this._scale = scale;
|
|
25
26
|
}
|
|
26
27
|
/**
|
|
28
|
+
* Set a custom database column name different from the property key
|
|
29
|
+
* @param {string} alias - The column name to use in the database
|
|
30
|
+
* @returns {ColumnBuilder<T, TN, CN, Ref>} The column builder for chaining
|
|
31
|
+
* @example
|
|
32
|
+
* // In code: guildId, In database: guild_id
|
|
33
|
+
* guildId: varchar(255).name("guild_id")
|
|
34
|
+
*/
|
|
35
|
+
name(alias) {
|
|
36
|
+
this._columnAlias = alias;
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Override the TypeScript type for this column with a custom type literal
|
|
41
|
+
* @template U - The custom type to use
|
|
42
|
+
* @returns {ColumnBuilder<U, TN, CN, Ref>} The column builder with the new type
|
|
43
|
+
* @example
|
|
44
|
+
* // Limits autocomplete to specific values
|
|
45
|
+
* locale: varchar(25).type<"en_US" | "es_ES">()
|
|
46
|
+
*/
|
|
47
|
+
type() {
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
27
51
|
* Mark this column as a primary key
|
|
28
52
|
* @returns {ColumnBuilder<T, TN, CN, Ref>} The column builder for chaining
|
|
29
53
|
*/
|
|
@@ -56,6 +80,13 @@ var ColumnBuilder = class {
|
|
|
56
80
|
return this;
|
|
57
81
|
}
|
|
58
82
|
/**
|
|
83
|
+
* Mark this column as nullable (alias for {@link nullable})
|
|
84
|
+
* @returns {ColumnBuilder<T | null, TN, CN, Ref>} The column builder for chaining
|
|
85
|
+
*/
|
|
86
|
+
null() {
|
|
87
|
+
return this.nullable();
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
59
90
|
* Set a default value for this column
|
|
60
91
|
* @param {T} value - The default value
|
|
61
92
|
* @returns {ColumnBuilder<T, TN, CN, Ref>} The column builder for chaining
|
|
@@ -103,7 +134,7 @@ var ColumnBuilder = class {
|
|
|
103
134
|
*/
|
|
104
135
|
__build(name) {
|
|
105
136
|
return {
|
|
106
|
-
name,
|
|
137
|
+
name: this._columnAlias ?? name,
|
|
107
138
|
type: this._type,
|
|
108
139
|
primaryKey: this._primaryKey,
|
|
109
140
|
autoIncrement: this._autoIncrement,
|
|
@@ -112,7 +143,8 @@ var ColumnBuilder = class {
|
|
|
112
143
|
defaultValue: this._defaultValue,
|
|
113
144
|
length: this._length,
|
|
114
145
|
precision: this._precision,
|
|
115
|
-
scale: this._scale
|
|
146
|
+
scale: this._scale,
|
|
147
|
+
columnAlias: this._columnAlias
|
|
116
148
|
};
|
|
117
149
|
}
|
|
118
150
|
/**
|