@hedystia/db 2.0.0 → 2.0.2

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.
Files changed (146) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +13 -0
  2. package/dist/_virtual/_rolldown/runtime.mjs +17 -0
  3. package/dist/cache/manager.cjs +137 -0
  4. package/dist/cache/manager.cjs.map +1 -0
  5. package/dist/cache/manager.d.cts +72 -0
  6. package/dist/cache/manager.d.mts +72 -0
  7. package/dist/cache/manager.mjs +140 -0
  8. package/dist/cache/manager.mjs.map +1 -0
  9. package/dist/cache/memory-store.cjs +122 -0
  10. package/dist/cache/memory-store.cjs.map +1 -0
  11. package/dist/cache/memory-store.mjs +122 -0
  12. package/dist/cache/memory-store.mjs.map +1 -0
  13. package/dist/cli/commands/migration.cjs +22 -0
  14. package/dist/cli/commands/migration.cjs.map +1 -0
  15. package/dist/cli/commands/migration.mjs +32 -0
  16. package/dist/cli/commands/migration.mjs.map +1 -0
  17. package/dist/cli/commands/schema.cjs +21 -0
  18. package/dist/cli/commands/schema.cjs.map +1 -0
  19. package/dist/cli/commands/schema.mjs +30 -0
  20. package/dist/cli/commands/schema.mjs.map +1 -0
  21. package/dist/cli.cjs +50 -0
  22. package/dist/cli.cjs.map +1 -0
  23. package/dist/cli.d.cts +1 -0
  24. package/dist/cli.d.mts +1 -0
  25. package/dist/cli.mjs +57 -0
  26. package/dist/cli.mjs.map +1 -0
  27. package/dist/constants.cjs +16 -0
  28. package/dist/constants.cjs.map +1 -0
  29. package/dist/constants.mjs +16 -0
  30. package/dist/constants.mjs.map +1 -0
  31. package/dist/core/database.cjs +158 -0
  32. package/dist/core/database.cjs.map +1 -0
  33. package/dist/core/database.d.cts +74 -0
  34. package/dist/core/database.d.mts +74 -0
  35. package/dist/core/database.mjs +159 -0
  36. package/dist/core/database.mjs.map +1 -0
  37. package/dist/core/repository.cjs +416 -0
  38. package/dist/core/repository.cjs.map +1 -0
  39. package/dist/core/repository.d.cts +110 -0
  40. package/dist/core/repository.d.mts +110 -0
  41. package/dist/core/repository.mjs +416 -0
  42. package/dist/core/repository.mjs.map +1 -0
  43. package/dist/drivers/driver.cjs +11 -0
  44. package/dist/drivers/driver.cjs.map +1 -0
  45. package/dist/drivers/driver.mjs +11 -0
  46. package/dist/drivers/driver.mjs.map +1 -0
  47. package/dist/drivers/file.cjs +336 -0
  48. package/dist/drivers/file.cjs.map +1 -0
  49. package/dist/drivers/file.mjs +337 -0
  50. package/dist/drivers/file.mjs.map +1 -0
  51. package/dist/drivers/index.cjs +28 -0
  52. package/dist/drivers/index.cjs.map +1 -0
  53. package/dist/drivers/index.d.cts +14 -0
  54. package/dist/drivers/index.d.mts +14 -0
  55. package/dist/drivers/index.mjs +28 -0
  56. package/dist/drivers/index.mjs.map +1 -0
  57. package/dist/drivers/mysql.cjs +272 -0
  58. package/dist/drivers/mysql.cjs.map +1 -0
  59. package/dist/drivers/mysql.mjs +272 -0
  60. package/dist/drivers/mysql.mjs.map +1 -0
  61. package/dist/drivers/sql-compiler.cjs +284 -0
  62. package/dist/drivers/sql-compiler.cjs.map +1 -0
  63. package/dist/drivers/sql-compiler.d.cts +66 -0
  64. package/dist/drivers/sql-compiler.d.mts +66 -0
  65. package/dist/drivers/sql-compiler.mjs +276 -0
  66. package/dist/drivers/sql-compiler.mjs.map +1 -0
  67. package/dist/drivers/sqlite.cjs +262 -0
  68. package/dist/drivers/sqlite.cjs.map +1 -0
  69. package/dist/drivers/sqlite.mjs +262 -0
  70. package/dist/drivers/sqlite.mjs.map +1 -0
  71. package/dist/errors.cjs +74 -0
  72. package/dist/errors.cjs.map +1 -0
  73. package/dist/errors.d.cts +46 -0
  74. package/dist/errors.d.mts +46 -0
  75. package/dist/errors.mjs +68 -0
  76. package/dist/errors.mjs.map +1 -0
  77. package/dist/index.cjs +69 -0
  78. package/dist/index.cjs.map +1 -0
  79. package/dist/index.d.cts +15 -0
  80. package/dist/index.d.mts +15 -0
  81. package/dist/index.mjs +21 -0
  82. package/dist/index.mjs.map +1 -0
  83. package/dist/migrations/definition.cjs +20 -0
  84. package/dist/migrations/definition.cjs.map +1 -0
  85. package/dist/migrations/definition.d.cts +18 -0
  86. package/dist/migrations/definition.d.mts +18 -0
  87. package/dist/migrations/definition.mjs +23 -0
  88. package/dist/migrations/definition.mjs.map +1 -0
  89. package/dist/migrations/index.mjs +12 -0
  90. package/dist/migrations/index.mjs.map +1 -0
  91. package/dist/migrations/templates.cjs +39 -0
  92. package/dist/migrations/templates.cjs.map +1 -0
  93. package/dist/migrations/templates.d.cts +16 -0
  94. package/dist/migrations/templates.d.mts +16 -0
  95. package/dist/migrations/templates.mjs +41 -0
  96. package/dist/migrations/templates.mjs.map +1 -0
  97. package/dist/schema/column.cjs +161 -0
  98. package/dist/schema/column.cjs.map +1 -0
  99. package/dist/schema/column.d.cts +120 -0
  100. package/dist/schema/column.d.mts +120 -0
  101. package/dist/schema/column.mjs +161 -0
  102. package/dist/schema/column.mjs.map +1 -0
  103. package/dist/schema/columns/index.cjs +202 -0
  104. package/dist/schema/columns/index.cjs.map +1 -0
  105. package/dist/schema/columns/index.d.cts +141 -0
  106. package/dist/schema/columns/index.d.mts +141 -0
  107. package/dist/schema/columns/index.mjs +182 -0
  108. package/dist/schema/columns/index.mjs.map +1 -0
  109. package/dist/schema/registry.cjs +125 -0
  110. package/dist/schema/registry.cjs.map +1 -0
  111. package/dist/schema/registry.d.cts +66 -0
  112. package/dist/schema/registry.d.mts +66 -0
  113. package/dist/schema/registry.mjs +125 -0
  114. package/dist/schema/registry.mjs.map +1 -0
  115. package/dist/schema/table.cjs +39 -0
  116. package/dist/schema/table.cjs.map +1 -0
  117. package/dist/schema/table.d.cts +17 -0
  118. package/dist/schema/table.d.mts +17 -0
  119. package/dist/schema/table.mjs +39 -0
  120. package/dist/schema/table.mjs.map +1 -0
  121. package/dist/sync/synchronizer.cjs +43 -0
  122. package/dist/sync/synchronizer.cjs.map +1 -0
  123. package/dist/sync/synchronizer.d.cts +22 -0
  124. package/dist/sync/synchronizer.d.mts +22 -0
  125. package/dist/sync/synchronizer.mjs +43 -0
  126. package/dist/sync/synchronizer.mjs.map +1 -0
  127. package/dist/types.d.cts +229 -0
  128. package/dist/types.d.mts +229 -0
  129. package/dist/utils/fs.cjs +24 -0
  130. package/dist/utils/fs.cjs.map +1 -0
  131. package/dist/utils/fs.mjs +26 -0
  132. package/dist/utils/fs.mjs.map +1 -0
  133. package/dist/utils/index.mjs +14 -0
  134. package/dist/utils/index.mjs.map +1 -0
  135. package/dist/utils/naming.cjs +13 -0
  136. package/dist/utils/naming.cjs.map +1 -0
  137. package/dist/utils/naming.mjs +16 -0
  138. package/dist/utils/naming.mjs.map +1 -0
  139. package/dist/utils/stable-stringify.cjs +19 -0
  140. package/dist/utils/stable-stringify.cjs.map +1 -0
  141. package/dist/utils/stable-stringify.mjs +22 -0
  142. package/dist/utils/stable-stringify.mjs.map +1 -0
  143. package/package.json +64 -27
  144. package/readme.md +87 -105
  145. package/index.d.ts +0 -65
  146. package/index.js +0 -1
@@ -0,0 +1,229 @@
1
+ //#region src/types.d.ts
2
+ type ColumnDataType = "integer" | "varchar" | "text" | "boolean" | "json" | "datetime" | "decimal" | "float" | "char" | "timestamp" | "bigint" | "blob";
3
+ type DatabaseType = "mysql" | "mariadb" | "sqlite" | "file" | {
4
+ name: "mysql";
5
+ provider: "mysql" | "mysql2";
6
+ } | {
7
+ name: "mariadb";
8
+ provider: "mysql" | "mysql2";
9
+ } | {
10
+ name: "sqlite";
11
+ provider: "better-sqlite3" | "sqlite3" | "sql.js" | "bun:sqlite";
12
+ } | {
13
+ name: "file";
14
+ provider: string;
15
+ };
16
+ interface ColumnMetadata {
17
+ name: string;
18
+ type: ColumnDataType;
19
+ primaryKey: boolean;
20
+ autoIncrement: boolean;
21
+ notNull: boolean;
22
+ unique: boolean;
23
+ defaultValue: unknown;
24
+ length?: number;
25
+ precision?: number;
26
+ scale?: number;
27
+ columnAlias?: string;
28
+ references?: {
29
+ table: string;
30
+ column: string;
31
+ onDelete?: ReferenceAction;
32
+ onUpdate?: ReferenceAction;
33
+ relationName?: string;
34
+ };
35
+ }
36
+ type ReferenceAction = "CASCADE" | "SET NULL" | "RESTRICT" | "NO ACTION";
37
+ interface TableMetadata {
38
+ name: string;
39
+ columns: ColumnMetadata[];
40
+ }
41
+ type DeferredRefMeta<ColumnName extends string = string, TargetTable extends string = string, TargetColumn extends string = string, RelationName extends string | undefined = string | undefined> = {
42
+ columnName: ColumnName;
43
+ targetTable: TargetTable;
44
+ targetColumn: TargetColumn;
45
+ relationName?: RelationName;
46
+ onDelete?: ReferenceAction;
47
+ onUpdate?: ReferenceAction;
48
+ };
49
+ type TableDefinition<T extends Record<string, any> = Record<string, any>, C extends Record<string, any> = {}, N extends string = string, Refs extends DeferredRefMeta = any> = {
50
+ __table: true;
51
+ __name: N;
52
+ __row: T;
53
+ __refs: Refs;
54
+ __columns: ColumnMetadata[];
55
+ __columnMap: Record<string, string>;
56
+ __deferredRefs: Array<{
57
+ columnName: string;
58
+ resolve: () => {
59
+ table: string;
60
+ column: string;
61
+ };
62
+ onDelete?: ReferenceAction;
63
+ onUpdate?: ReferenceAction;
64
+ relationName?: string;
65
+ }>;
66
+ } & C;
67
+ type InferRow<T> = T extends {
68
+ __row: infer R;
69
+ } ? R : never;
70
+ type InferInsert<T> = T extends TableDefinition<infer R, any, any> ? { [K in keyof R as K extends AutoIncrementKeys<T> ? never : K]: R[K] } & { [K in AutoIncrementKeys<T>]?: R[K] } : never;
71
+ type AutoIncrementKeys<T> = T extends TableDefinition<infer R, any, any> ? keyof R : never;
72
+ type InferUpdate<T> = T extends TableDefinition<infer R, any, any> ? Partial<R> : never;
73
+ interface WhereCondition {
74
+ eq?: unknown;
75
+ neq?: unknown;
76
+ gt?: unknown;
77
+ gte?: unknown;
78
+ lt?: unknown;
79
+ lte?: unknown;
80
+ like?: string;
81
+ notLike?: string;
82
+ in?: unknown[];
83
+ notIn?: unknown[];
84
+ isNull?: boolean;
85
+ between?: [unknown, unknown];
86
+ }
87
+ type WhereClause<T = Record<string, any>> = { [K in keyof T]?: T[K] | WhereCondition } & {
88
+ OR?: WhereClause<T>[];
89
+ AND?: WhereClause<T>[];
90
+ };
91
+ interface QueryOptions<T = Record<string, any>, Rel extends Record<string, any> = {}> {
92
+ where?: WhereClause<T>;
93
+ select?: Extract<keyof T, string>[];
94
+ orderBy?: Partial<Record<Extract<keyof T, string>, "asc" | "desc">>;
95
+ take?: number;
96
+ skip?: number;
97
+ with?: { [K in keyof Rel]?: boolean | QueryOptions<Rel[K] extends {
98
+ row: infer R;
99
+ } ? R : Rel[K]> };
100
+ }
101
+ interface UpdateOptions<T = Record<string, any>> {
102
+ where: WhereClause<T>;
103
+ data: Partial<T>;
104
+ }
105
+ interface DeleteOptions<T = Record<string, any>> {
106
+ where: WhereClause<T>;
107
+ }
108
+ interface MySQLConnectionConfig {
109
+ host: string;
110
+ port?: number;
111
+ user: string;
112
+ password: string;
113
+ database: string;
114
+ }
115
+ interface SQLiteConnectionConfig {
116
+ filename: string;
117
+ }
118
+ interface FileConnectionConfig {
119
+ directory: string;
120
+ }
121
+ type ConnectionConfig = MySQLConnectionConfig | SQLiteConnectionConfig | FileConnectionConfig;
122
+ interface CacheConfig {
123
+ enabled: boolean;
124
+ ttl?: number;
125
+ maxTtl?: number;
126
+ maxEntries?: number;
127
+ }
128
+ interface DatabaseConfig {
129
+ schemas: readonly TableDefinition<any, any, any>[];
130
+ migrations?: any[];
131
+ database: DatabaseType;
132
+ connection: ConnectionConfig | ConnectionConfig[];
133
+ runMigrations?: boolean;
134
+ syncSchemas?: boolean;
135
+ cache?: boolean | CacheConfig;
136
+ }
137
+ interface MigrationContext {
138
+ schema: {
139
+ createTable: (table: TableDefinition) => Promise<void>;
140
+ dropTable: (name: string) => Promise<void>;
141
+ addColumn: (table: string, name: string, column: ColumnMetadata) => Promise<void>;
142
+ dropColumn: (table: string, name: string) => Promise<void>;
143
+ renameColumn: (table: string, oldName: string, newName: string) => Promise<void>;
144
+ addIndex: (table: string, columns: string[], unique?: boolean) => Promise<void>;
145
+ dropIndex: (table: string, indexName: string) => Promise<void>;
146
+ };
147
+ sql: (query: string, params?: unknown[]) => Promise<unknown>;
148
+ }
149
+ interface MigrationDefinition {
150
+ name: string;
151
+ up: (ctx: MigrationContext) => Promise<void>;
152
+ down: (ctx: MigrationContext) => Promise<void>;
153
+ }
154
+ interface DatabaseDriver {
155
+ connect(): Promise<void>;
156
+ disconnect(): Promise<void>;
157
+ execute(sql: string, params?: unknown[]): Promise<any>;
158
+ query(sql: string, params?: unknown[]): Promise<any[]>;
159
+ tableExists(name: string): Promise<boolean>;
160
+ getTableColumns(name: string): Promise<ColumnMetadata[]>;
161
+ createTable(meta: TableMetadata): Promise<void>;
162
+ dropTable(name: string): Promise<void>;
163
+ addColumn(table: string, column: ColumnMetadata): Promise<void>;
164
+ dropColumn(table: string, name: string): Promise<void>;
165
+ renameColumn(table: string, oldName: string, newName: string): Promise<void>;
166
+ transaction<T>(fn: () => Promise<T>): Promise<T>;
167
+ getAllTableColumns?(): Promise<Record<string, ColumnMetadata[]>>;
168
+ }
169
+ interface Repository<T extends Record<string, any>> {
170
+ find(options?: QueryOptions<T>): Promise<T[]>;
171
+ findMany(options?: QueryOptions<T>): Promise<T[]>;
172
+ findFirst(options?: QueryOptions<T>): Promise<T | null>;
173
+ insert(data: Partial<T> | Partial<T>[]): Promise<T>;
174
+ insertMany(data: Partial<T>[]): Promise<T[]>;
175
+ update(options: UpdateOptions<T>): Promise<T[]>;
176
+ delete(options: DeleteOptions<T>): Promise<number>;
177
+ count(options?: Pick<QueryOptions<T>, "where">): Promise<number>;
178
+ exists(options: Pick<QueryOptions<T>, "where">): Promise<boolean>;
179
+ upsert(options: {
180
+ where: WhereClause<T>;
181
+ create: Partial<T>;
182
+ update: Partial<T>;
183
+ }): Promise<T>;
184
+ truncate(): Promise<void>;
185
+ }
186
+ type AnyTableDef = TableDefinition<any, any, any, any>;
187
+ type TableRefs<T> = T extends {
188
+ __refs: infer R;
189
+ } ? R : never;
190
+ type TableName<T> = T extends {
191
+ __name: infer N extends string;
192
+ } ? N : never;
193
+ type SchemaByName<S extends readonly AnyTableDef[], N extends string> = Extract<S[number], {
194
+ __name: N;
195
+ }>;
196
+ type StripIdSuffix<S extends string> = S extends `${infer Base}Id` ? Base : S extends `${infer Base}_id` ? Base : S;
197
+ type UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends ((x: infer I) => void) ? I : never;
198
+ type Simplify<T> = { [K in keyof T]: T[K] } & {};
199
+ type ForwardRelationEntries<S extends readonly AnyTableDef[], T extends AnyTableDef> = TableRefs<T> extends infer R ? R extends DeferredRefMeta<infer Col, infer ToTable, any, infer Name> ? { [K in Name extends string ? Name : StripIdSuffix<Col>]: {
200
+ table: SchemaByName<S, ToTable>;
201
+ many: false;
202
+ } } : never : never;
203
+ type ReverseRelationEntry<U extends AnyTableDef, TargetName extends string> = TableRefs<U> extends infer R ? R extends DeferredRefMeta<any, TargetName, any, any> ? { [K in TableName<U>]: {
204
+ table: U;
205
+ many: true;
206
+ } } : never : never;
207
+ type ReverseRelationEntries<S extends readonly AnyTableDef[], T extends AnyTableDef> = ReverseRelationEntry<S[number], TableName<T>>;
208
+ type RelationsFor<S extends readonly AnyTableDef[], T extends AnyTableDef> = Simplify<UnionToIntersection<ForwardRelationEntries<S, T> | ReverseRelationEntries<S, T>>>;
209
+ type DepthPrev = [never, 0, 1, 2, 3];
210
+ type ExtractRelationRow<Rel> = Rel extends {
211
+ table: infer R;
212
+ } ? InferRow<R> : never;
213
+ type ExtractRelationMany<Rel> = Rel extends {
214
+ many: true;
215
+ } ? true : false;
216
+ type RelationQueryMap<S extends readonly AnyTableDef[], T extends AnyTableDef, D extends number = 3> = [D] extends [never] ? {} : { [K in keyof RelationsFor<S, T>]: {
217
+ row: ExtractRelationRow<RelationsFor<S, T>[K]>;
218
+ many: ExtractRelationMany<RelationsFor<S, T>[K]>;
219
+ relations: RelationsFor<S, T>[K] extends {
220
+ table: infer R extends AnyTableDef;
221
+ } ? RelationQueryMap<S, R, DepthPrev[D]> : {};
222
+ } };
223
+ type ResolveWith<S extends readonly AnyTableDef[], T extends AnyTableDef, W> = [W] extends [undefined] ? {} : W extends Record<string, any> ? { [K in keyof W & keyof RelationsFor<S, T>]: ExtractRelationMany<RelationsFor<S, T>[K]> extends true ? ExtractRelationRow<RelationsFor<S, T>[K]>[] : ExtractRelationRow<RelationsFor<S, T>[K]> | null } : {};
224
+ type ResolveResult<S extends readonly AnyTableDef[], T extends AnyTableDef, O> = InferRow<T> & ResolveWith<S, T, O extends {
225
+ with: infer W;
226
+ } ? W : undefined>;
227
+ //#endregion
228
+ export { AnyTableDef, 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 };
229
+ //# sourceMappingURL=types.d.mts.map
@@ -0,0 +1,24 @@
1
+ let fs = require("fs");
2
+ let path = require("path");
3
+ //#region src/utils/fs.ts
4
+ /**
5
+ * Ensure a directory exists, creating it recursively if needed
6
+ * @param {string} dirPath - Path to directory
7
+ */
8
+ function ensureDir(dirPath) {
9
+ if (!(0, fs.existsSync)(dirPath)) (0, fs.mkdirSync)(dirPath, { recursive: true });
10
+ }
11
+ /**
12
+ * Write a file, creating parent directories if needed
13
+ * @param {string} filePath - Path to file
14
+ * @param {string} content - File content
15
+ */
16
+ function writeFileSafe(filePath, content) {
17
+ ensureDir((0, path.dirname)(filePath));
18
+ (0, fs.writeFileSync)(filePath, content, "utf-8");
19
+ }
20
+ //#endregion
21
+ exports.ensureDir = ensureDir;
22
+ exports.writeFileSafe = writeFileSafe;
23
+
24
+ //# sourceMappingURL=fs.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.cjs","names":[],"sources":["../../src/utils/fs.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { dirname } from \"path\";\n\n/**\n * Ensure a directory exists, creating it recursively if needed\n * @param {string} dirPath - Path to directory\n */\nexport function ensureDir(dirPath: string): void {\n if (!existsSync(dirPath)) {\n mkdirSync(dirPath, { recursive: true });\n }\n}\n\n/**\n * Write a file, creating parent directories if needed\n * @param {string} filePath - Path to file\n * @param {string} content - File content\n */\nexport function writeFileSafe(filePath: string, content: string): void {\n ensureDir(dirname(filePath));\n writeFileSync(filePath, content, \"utf-8\");\n}\n\n/**\n * Read a file as a UTF-8 string\n * @param {string} filePath - Path to file\n * @returns {string} File content\n */\nexport function readFileSafe(filePath: string): string {\n return readFileSync(filePath, \"utf-8\");\n}\n\n/**\n * Check if a file exists\n * @param {string} filePath - Path to file\n * @returns {boolean} Whether the file exists\n */\nexport function fileExists(filePath: string): boolean {\n return existsSync(filePath);\n}\n"],"mappings":";;;;;;;AAOA,SAAgB,UAAU,SAAuB;AAC/C,KAAI,EAAA,GAAA,GAAA,YAAY,QAAQ,CACtB,EAAA,GAAA,GAAA,WAAU,SAAS,EAAE,WAAW,MAAM,CAAC;;;;;;;AAS3C,SAAgB,cAAc,UAAkB,SAAuB;AACrE,YAAA,GAAA,KAAA,SAAkB,SAAS,CAAC;AAC5B,EAAA,GAAA,GAAA,eAAc,UAAU,SAAS,QAAQ"}
@@ -0,0 +1,26 @@
1
+ import { __esmMin } from "../_virtual/_rolldown/runtime.mjs";
2
+ import { existsSync, mkdirSync, writeFileSync } from "fs";
3
+ import { dirname } from "path";
4
+ //#region src/utils/fs.ts
5
+ /**
6
+ * Ensure a directory exists, creating it recursively if needed
7
+ * @param {string} dirPath - Path to directory
8
+ */
9
+ function ensureDir(dirPath) {
10
+ if (!existsSync(dirPath)) mkdirSync(dirPath, { recursive: true });
11
+ }
12
+ /**
13
+ * Write a file, creating parent directories if needed
14
+ * @param {string} filePath - Path to file
15
+ * @param {string} content - File content
16
+ */
17
+ function writeFileSafe(filePath, content) {
18
+ ensureDir(dirname(filePath));
19
+ writeFileSync(filePath, content, "utf-8");
20
+ }
21
+ var init_fs = __esmMin((() => {}));
22
+ //#endregion
23
+ init_fs();
24
+ export { ensureDir, init_fs, writeFileSafe };
25
+
26
+ //# sourceMappingURL=fs.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.mjs","names":[],"sources":["../../src/utils/fs.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { dirname } from \"path\";\n\n/**\n * Ensure a directory exists, creating it recursively if needed\n * @param {string} dirPath - Path to directory\n */\nexport function ensureDir(dirPath: string): void {\n if (!existsSync(dirPath)) {\n mkdirSync(dirPath, { recursive: true });\n }\n}\n\n/**\n * Write a file, creating parent directories if needed\n * @param {string} filePath - Path to file\n * @param {string} content - File content\n */\nexport function writeFileSafe(filePath: string, content: string): void {\n ensureDir(dirname(filePath));\n writeFileSync(filePath, content, \"utf-8\");\n}\n\n/**\n * Read a file as a UTF-8 string\n * @param {string} filePath - Path to file\n * @returns {string} File content\n */\nexport function readFileSafe(filePath: string): string {\n return readFileSync(filePath, \"utf-8\");\n}\n\n/**\n * Check if a file exists\n * @param {string} filePath - Path to file\n * @returns {boolean} Whether the file exists\n */\nexport function fileExists(filePath: string): boolean {\n return existsSync(filePath);\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,UAAU,SAAuB;AAC/C,KAAI,CAAC,WAAW,QAAQ,CACtB,WAAU,SAAS,EAAE,WAAW,MAAM,CAAC;;;;;;;AAS3C,SAAgB,cAAc,UAAkB,SAAuB;AACrE,WAAU,QAAQ,SAAS,CAAC;AAC5B,eAAc,UAAU,SAAS,QAAQ"}
@@ -0,0 +1,14 @@
1
+ import { __esmMin } from "../_virtual/_rolldown/runtime.mjs";
2
+ import { init_fs } from "./fs.mjs";
3
+ import "./naming.mjs";
4
+ import { init_stable_stringify } from "./stable-stringify.mjs";
5
+ //#region src/utils/index.ts
6
+ var init_utils = __esmMin((() => {
7
+ init_fs();
8
+ init_stable_stringify();
9
+ }));
10
+ //#endregion
11
+ init_utils();
12
+ export { init_utils };
13
+
14
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/utils/index.ts"],"sourcesContent":["export { ensureDir, fileExists, readFileSafe, writeFileSafe } from \"./fs\";\nexport { generateTimestamp, toCamelCase, toSnakeCase } from \"./naming\";\nexport { stableStringify } from \"./stable-stringify\";\n"],"mappings":";;;;;;UAA0E;wBAErB"}
@@ -0,0 +1,13 @@
1
+ //#region src/utils/naming.ts
2
+ /**
3
+ * Generate a timestamp string for migration file naming
4
+ * @returns {string} Formatted timestamp
5
+ */
6
+ function generateTimestamp() {
7
+ const now = /* @__PURE__ */ new Date();
8
+ return `${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, "0")}${String(now.getDate()).padStart(2, "0")}${String(now.getHours()).padStart(2, "0")}${String(now.getMinutes()).padStart(2, "0")}${String(now.getSeconds()).padStart(2, "0")}`;
9
+ }
10
+ //#endregion
11
+ exports.generateTimestamp = generateTimestamp;
12
+
13
+ //# sourceMappingURL=naming.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.cjs","names":[],"sources":["../../src/utils/naming.ts"],"sourcesContent":["/**\n * Generate a timestamp string for migration file naming\n * @returns {string} Formatted timestamp\n */\nexport function generateTimestamp(): string {\n const now = new Date();\n const y = now.getFullYear();\n const m = String(now.getMonth() + 1).padStart(2, \"0\");\n const day = String(now.getDate()).padStart(2, \"0\");\n const h = String(now.getHours()).padStart(2, \"0\");\n const min = String(now.getMinutes()).padStart(2, \"0\");\n const s = String(now.getSeconds()).padStart(2, \"0\");\n return `${y}${m}${day}${h}${min}${s}`;\n}\n\n/**\n * Convert a camelCase or PascalCase string to snake_case\n * @param {string} str - Input string\n * @returns {string} Snake case string\n */\nexport function toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z])/g, \"_$1\")\n .toLowerCase()\n .replace(/^_/, \"\");\n}\n\n/**\n * Convert a snake_case string to camelCase\n * @param {string} str - Input string\n * @returns {string} Camel case string\n */\nexport function toCamelCase(str: string): string {\n return str.replace(/_([a-z])/g, (_, c) => c.toUpperCase());\n}\n"],"mappings":";;;;;AAIA,SAAgB,oBAA4B;CAC1C,MAAM,sBAAM,IAAI,MAAM;AAOtB,QAAO,GANG,IAAI,aAAa,GACjB,OAAO,IAAI,UAAU,GAAG,EAAE,CAAC,SAAS,GAAG,IAAI,GACzC,OAAO,IAAI,SAAS,CAAC,CAAC,SAAS,GAAG,IAAI,GACxC,OAAO,IAAI,UAAU,CAAC,CAAC,SAAS,GAAG,IAAI,GACrC,OAAO,IAAI,YAAY,CAAC,CAAC,SAAS,GAAG,IAAI,GAC3C,OAAO,IAAI,YAAY,CAAC,CAAC,SAAS,GAAG,IAAI"}
@@ -0,0 +1,16 @@
1
+ import { __esmMin } from "../_virtual/_rolldown/runtime.mjs";
2
+ //#region src/utils/naming.ts
3
+ /**
4
+ * Generate a timestamp string for migration file naming
5
+ * @returns {string} Formatted timestamp
6
+ */
7
+ function generateTimestamp() {
8
+ const now = /* @__PURE__ */ new Date();
9
+ return `${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, "0")}${String(now.getDate()).padStart(2, "0")}${String(now.getHours()).padStart(2, "0")}${String(now.getMinutes()).padStart(2, "0")}${String(now.getSeconds()).padStart(2, "0")}`;
10
+ }
11
+ var init_naming = __esmMin((() => {}));
12
+ //#endregion
13
+ init_naming();
14
+ export { generateTimestamp, init_naming };
15
+
16
+ //# sourceMappingURL=naming.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.mjs","names":[],"sources":["../../src/utils/naming.ts"],"sourcesContent":["/**\n * Generate a timestamp string for migration file naming\n * @returns {string} Formatted timestamp\n */\nexport function generateTimestamp(): string {\n const now = new Date();\n const y = now.getFullYear();\n const m = String(now.getMonth() + 1).padStart(2, \"0\");\n const day = String(now.getDate()).padStart(2, \"0\");\n const h = String(now.getHours()).padStart(2, \"0\");\n const min = String(now.getMinutes()).padStart(2, \"0\");\n const s = String(now.getSeconds()).padStart(2, \"0\");\n return `${y}${m}${day}${h}${min}${s}`;\n}\n\n/**\n * Convert a camelCase or PascalCase string to snake_case\n * @param {string} str - Input string\n * @returns {string} Snake case string\n */\nexport function toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z])/g, \"_$1\")\n .toLowerCase()\n .replace(/^_/, \"\");\n}\n\n/**\n * Convert a snake_case string to camelCase\n * @param {string} str - Input string\n * @returns {string} Camel case string\n */\nexport function toCamelCase(str: string): string {\n return str.replace(/_([a-z])/g, (_, c) => c.toUpperCase());\n}\n"],"mappings":";;;;;;AAIA,SAAgB,oBAA4B;CAC1C,MAAM,sBAAM,IAAI,MAAM;AAOtB,QAAO,GANG,IAAI,aAAa,GACjB,OAAO,IAAI,UAAU,GAAG,EAAE,CAAC,SAAS,GAAG,IAAI,GACzC,OAAO,IAAI,SAAS,CAAC,CAAC,SAAS,GAAG,IAAI,GACxC,OAAO,IAAI,UAAU,CAAC,CAAC,SAAS,GAAG,IAAI,GACrC,OAAO,IAAI,YAAY,CAAC,CAAC,SAAS,GAAG,IAAI,GAC3C,OAAO,IAAI,YAAY,CAAC,CAAC,SAAS,GAAG,IAAI"}
@@ -0,0 +1,19 @@
1
+ //#region src/utils/stable-stringify.ts
2
+ /**
3
+ * Produce a stable JSON string for cache keys by sorting object keys
4
+ * @param {unknown} value - Value to stringify
5
+ * @returns {string} Stable JSON string
6
+ */
7
+ function stableStringify(value) {
8
+ if (value === null || value === void 0) return String(value);
9
+ if (typeof value !== "object") return JSON.stringify(value);
10
+ if (Array.isArray(value)) return `[${value.map(stableStringify).join(",")}]`;
11
+ const keys = Object.keys(value).sort();
12
+ const parts = [];
13
+ for (const key of keys) parts.push(`${JSON.stringify(key)}:${stableStringify(value[key])}`);
14
+ return `{${parts.join(",")}}`;
15
+ }
16
+ //#endregion
17
+ exports.stableStringify = stableStringify;
18
+
19
+ //# sourceMappingURL=stable-stringify.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stable-stringify.cjs","names":[],"sources":["../../src/utils/stable-stringify.ts"],"sourcesContent":["/**\n * Produce a stable JSON string for cache keys by sorting object keys\n * @param {unknown} value - Value to stringify\n * @returns {string} Stable JSON string\n */\nexport function stableStringify(value: unknown): string {\n if (value === null || value === undefined) {\n return String(value);\n }\n if (typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(\",\")}]`;\n }\n const keys = Object.keys(value as Record<string, unknown>).sort();\n const parts: string[] = [];\n for (const key of keys) {\n parts.push(`${JSON.stringify(key)}:${stableStringify((value as any)[key])}`);\n }\n return `{${parts.join(\",\")}}`;\n}\n"],"mappings":";;;;;;AAKA,SAAgB,gBAAgB,OAAwB;AACtD,KAAI,UAAU,QAAQ,UAAU,KAAA,EAC9B,QAAO,OAAO,MAAM;AAEtB,KAAI,OAAO,UAAU,SACnB,QAAO,KAAK,UAAU,MAAM;AAE9B,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,IAAI,MAAM,IAAI,gBAAgB,CAAC,KAAK,IAAI,CAAC;CAElD,MAAM,OAAO,OAAO,KAAK,MAAiC,CAAC,MAAM;CACjE,MAAM,QAAkB,EAAE;AAC1B,MAAK,MAAM,OAAO,KAChB,OAAM,KAAK,GAAG,KAAK,UAAU,IAAI,CAAC,GAAG,gBAAiB,MAAc,KAAK,GAAG;AAE9E,QAAO,IAAI,MAAM,KAAK,IAAI,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { __esmMin } from "../_virtual/_rolldown/runtime.mjs";
2
+ //#region src/utils/stable-stringify.ts
3
+ /**
4
+ * Produce a stable JSON string for cache keys by sorting object keys
5
+ * @param {unknown} value - Value to stringify
6
+ * @returns {string} Stable JSON string
7
+ */
8
+ function stableStringify(value) {
9
+ if (value === null || value === void 0) return String(value);
10
+ if (typeof value !== "object") return JSON.stringify(value);
11
+ if (Array.isArray(value)) return `[${value.map(stableStringify).join(",")}]`;
12
+ const keys = Object.keys(value).sort();
13
+ const parts = [];
14
+ for (const key of keys) parts.push(`${JSON.stringify(key)}:${stableStringify(value[key])}`);
15
+ return `{${parts.join(",")}}`;
16
+ }
17
+ var init_stable_stringify = __esmMin((() => {}));
18
+ //#endregion
19
+ init_stable_stringify();
20
+ export { init_stable_stringify, stableStringify };
21
+
22
+ //# sourceMappingURL=stable-stringify.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stable-stringify.mjs","names":[],"sources":["../../src/utils/stable-stringify.ts"],"sourcesContent":["/**\n * Produce a stable JSON string for cache keys by sorting object keys\n * @param {unknown} value - Value to stringify\n * @returns {string} Stable JSON string\n */\nexport function stableStringify(value: unknown): string {\n if (value === null || value === undefined) {\n return String(value);\n }\n if (typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(\",\")}]`;\n }\n const keys = Object.keys(value as Record<string, unknown>).sort();\n const parts: string[] = [];\n for (const key of keys) {\n parts.push(`${JSON.stringify(key)}:${stableStringify((value as any)[key])}`);\n }\n return `{${parts.join(\",\")}}`;\n}\n"],"mappings":";;;;;;;AAKA,SAAgB,gBAAgB,OAAwB;AACtD,KAAI,UAAU,QAAQ,UAAU,KAAA,EAC9B,QAAO,OAAO,MAAM;AAEtB,KAAI,OAAO,UAAU,SACnB,QAAO,KAAK,UAAU,MAAM;AAE9B,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,IAAI,MAAM,IAAI,gBAAgB,CAAC,KAAK,IAAI,CAAC;CAElD,MAAM,OAAO,OAAO,KAAK,MAAiC,CAAC,MAAM;CACjE,MAAM,QAAkB,EAAE;AAC1B,MAAK,MAAM,OAAO,KAChB,OAAM,KAAK,GAAG,KAAK,UAAU,IAAI,CAAC,GAAG,gBAAiB,MAAc,KAAK,GAAG;AAE9E,QAAO,IAAI,MAAM,KAAK,IAAI,CAAC"}
package/package.json CHANGED
@@ -1,40 +1,77 @@
1
1
  {
2
2
  "name": "@hedystia/db",
3
- "version": "2.0.0",
4
- "description": "A database made by the company hedystia, easy to use",
5
- "main": "index.js",
6
- "types": "index.d.ts",
3
+ "version": "2.0.2",
4
+ "description": "Next-gen TypeScript ORM for building type-safe database layers at lightspeed",
5
+ "homepage": "https://docs.hedystia.com",
6
+ "devDependencies": {
7
+ "@types/bun": "^1.3.3"
8
+ },
9
+ "peerDependencies": {
10
+ "typescript": ">= 5.0.0",
11
+ "mysql2": ">= 3.0.0",
12
+ "mysql": ">= 2.0.0",
13
+ "better-sqlite3": ">= 12.0.0",
14
+ "sqlite3": ">= 6.0.0",
15
+ "sql.js": ">= 1.0.0"
16
+ },
17
+ "peerDependenciesMeta": {
18
+ "typescript": {
19
+ "optional": true
20
+ },
21
+ "mysql2": {
22
+ "optional": true
23
+ },
24
+ "mysql": {
25
+ "optional": true
26
+ },
27
+ "better-sqlite3": {
28
+ "optional": true
29
+ },
30
+ "sqlite3": {
31
+ "optional": true
32
+ },
33
+ "sql.js": {
34
+ "optional": true
35
+ }
36
+ },
37
+ "bin": {
38
+ "@hedystia/db": "./dist/cli.mjs"
39
+ },
7
40
  "private": false,
8
41
  "keywords": [
9
- "Database",
10
- "Hedystia",
11
- "Discord",
12
- "node",
13
- "db",
14
- "discord.js",
15
- "typescript"
42
+ "hedystia",
43
+ "database",
44
+ "orm",
45
+ "typescript",
46
+ "type-safe",
47
+ "bun",
48
+ "mysql",
49
+ "sqlite"
16
50
  ],
51
+ "license": "MIT",
17
52
  "scripts": {
18
- "build": "bun build --target=node --format=cjs index.ts --outfile index.js --minify",
19
- "types": "tsc --noEmit false --emitDeclarationOnly"
53
+ "build": "tsdown --config-loader unrun",
54
+ "publish": "bun publish --access public",
55
+ "dev": "tsdown --watch"
20
56
  },
21
- "author": "contact@hedystia.com",
22
- "license": "ISC",
23
57
  "repository": {
24
58
  "type": "git",
25
- "url": "git+https://github.com/Zastinian/hedystia.db.git"
26
- },
27
- "bugs": {
28
- "url": "https://github.com/Zastinian/hedystia.db/issues"
29
- },
30
- "homepage": "https://docs.hedystia.com/db/start",
31
- "devDependencies": {
32
- "@types/node": "^22.13.1"
59
+ "url": "https://github.com/Hedystia/Hedystia"
33
60
  },
34
- "engines": {
35
- "node": ">=18.0.0"
61
+ "author": {
62
+ "name": "Zastinian",
63
+ "email": "contact@zastinian.com",
64
+ "url": "https://github.com/Zastinian"
36
65
  },
37
- "publishConfig": {
38
- "access": "public"
66
+ "type": "commonjs",
67
+ "types": "./dist/index.d.cts",
68
+ "main": "./dist/index.cjs",
69
+ "module": "./dist/index.mjs",
70
+ "exports": {
71
+ ".": {
72
+ "types": "./dist/index.d.cts",
73
+ "import": "./dist/index.mjs",
74
+ "require": "./dist/index.cjs"
75
+ }
39
76
  }
40
77
  }