sonamu 0.2.55 → 0.2.56

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 (45) hide show
  1. package/dist/bin/cli.js +89 -118
  2. package/dist/bin/cli.js.map +1 -1
  3. package/dist/bin/cli.mjs +45 -74
  4. package/dist/bin/cli.mjs.map +1 -1
  5. package/dist/{chunk-ZFLQLW37.mjs → chunk-RHSTOLSM.mjs} +5568 -5243
  6. package/dist/chunk-RHSTOLSM.mjs.map +1 -0
  7. package/dist/{chunk-WJGRXAXE.js → chunk-V6CWU5VD.js} +5577 -5252
  8. package/dist/chunk-V6CWU5VD.js.map +1 -0
  9. package/dist/index.d.mts +931 -226
  10. package/dist/index.d.ts +931 -226
  11. package/dist/index.js +26 -13
  12. package/dist/index.js.map +1 -1
  13. package/dist/index.mjs +31 -18
  14. package/dist/index.mjs.map +1 -1
  15. package/package.json +1 -1
  16. package/dist/base-model-BzMJ2E_I.d.mts +0 -43
  17. package/dist/base-model-CWRKUX49.d.ts +0 -43
  18. package/dist/chunk-4K2F3SOM.mjs +0 -231
  19. package/dist/chunk-4K2F3SOM.mjs.map +0 -1
  20. package/dist/chunk-6SP5N5ND.mjs +0 -1579
  21. package/dist/chunk-6SP5N5ND.mjs.map +0 -1
  22. package/dist/chunk-EUP6N7EK.js +0 -1579
  23. package/dist/chunk-EUP6N7EK.js.map +0 -1
  24. package/dist/chunk-HVVCQLAU.mjs +0 -280
  25. package/dist/chunk-HVVCQLAU.mjs.map +0 -1
  26. package/dist/chunk-N6N3LENC.js +0 -231
  27. package/dist/chunk-N6N3LENC.js.map +0 -1
  28. package/dist/chunk-UAG3SKFM.js +0 -280
  29. package/dist/chunk-UAG3SKFM.js.map +0 -1
  30. package/dist/chunk-WJGRXAXE.js.map +0 -1
  31. package/dist/chunk-ZFLQLW37.mjs.map +0 -1
  32. package/dist/database/drivers/knex/base-model.d.mts +0 -16
  33. package/dist/database/drivers/knex/base-model.d.ts +0 -16
  34. package/dist/database/drivers/knex/base-model.js +0 -55
  35. package/dist/database/drivers/knex/base-model.js.map +0 -1
  36. package/dist/database/drivers/knex/base-model.mjs +0 -56
  37. package/dist/database/drivers/knex/base-model.mjs.map +0 -1
  38. package/dist/database/drivers/kysely/base-model.d.mts +0 -22
  39. package/dist/database/drivers/kysely/base-model.d.ts +0 -22
  40. package/dist/database/drivers/kysely/base-model.js +0 -64
  41. package/dist/database/drivers/kysely/base-model.js.map +0 -1
  42. package/dist/database/drivers/kysely/base-model.mjs +0 -65
  43. package/dist/database/drivers/kysely/base-model.mjs.map +0 -1
  44. package/dist/model-CAH_4oQh.d.mts +0 -1042
  45. package/dist/model-CAH_4oQh.d.ts +0 -1042
@@ -1,231 +0,0 @@
1
- import {
2
- DB
3
- } from "./chunk-ZFLQLW37.mjs";
4
-
5
- // src/database/base-model.ts
6
- import { DateTime } from "luxon";
7
- import _2 from "lodash";
8
- import SqlParser from "node-sql-parser";
9
- import chalk from "chalk";
10
- import inflection from "inflection";
11
-
12
- // src/utils/sql-parser.ts
13
- import _ from "lodash";
14
- function getTableName(expr) {
15
- if ("table" in expr && expr.table !== null) {
16
- return typeof expr.table === "string" ? expr.table : expr.table.value;
17
- }
18
- return null;
19
- }
20
- function getTableNamesFromWhere(ast) {
21
- const extractTableNames = (where) => {
22
- if (where === null || !(where.type === "binary_expr" && "left" in where)) {
23
- return [];
24
- }
25
- const extractTableName = (expr) => {
26
- if (expr.type === "column_ref") {
27
- const table = getTableName(expr);
28
- return table ? [table] : [];
29
- } else if (expr.type === "binary_expr" && "left" in expr) {
30
- return extractTableNames(expr);
31
- }
32
- return [];
33
- };
34
- return [...extractTableName(where.left), ...extractTableName(where.right)];
35
- };
36
- return _.uniq(
37
- (Array.isArray(ast) ? ast : [ast]).flatMap(
38
- (a) => a.type === "select" || a.type === "update" || a.type === "delete" ? extractTableNames(a.where) : []
39
- )
40
- );
41
- }
42
-
43
- // src/database/base-model.ts
44
- var BaseModelClassAbstract = class {
45
- modelName = "Unknown";
46
- async runSubsetQuery({
47
- params,
48
- baseTable,
49
- subset,
50
- subsetQuery,
51
- build,
52
- debug,
53
- db: _db,
54
- optimizeCountQuery
55
- }) {
56
- const db = _db ?? DB.getDB(subset.startsWith("A") ? "w" : "r");
57
- const dbClient = DB.toClient(db);
58
- baseTable = baseTable ?? inflection.pluralize(inflection.underscore(this.modelName));
59
- const queryMode = params.queryMode ?? (params.id !== void 0 ? "list" : "both");
60
- const { select, virtual, joins, loaders } = subsetQuery;
61
- const _qb = build({
62
- qb: dbClient.from(baseTable).qb,
63
- db,
64
- select,
65
- joins,
66
- virtual
67
- });
68
- dbClient.qb = _qb;
69
- const qb = dbClient;
70
- const total = await (async () => {
71
- if (queryMode === "list") return void 0;
72
- const clonedQb = qb.clone().clearQueryParts(["order", "offset", "limit"]).clearSelect().select(`${baseTable}.id`);
73
- const parser = new SqlParser.Parser();
74
- if (optimizeCountQuery) {
75
- const parsedQuery2 = parser.astify(clonedQb.sql);
76
- const tables = getTableNamesFromWhere(parsedQuery2);
77
- const needToJoin = _2.uniq(
78
- tables.flatMap(
79
- (table) => table.split("__").map((t) => inflection.pluralize(t))
80
- )
81
- );
82
- this.applyJoins(
83
- clonedQb,
84
- joins.filter((j) => needToJoin.includes(j.table))
85
- );
86
- } else {
87
- this.applyJoins(clonedQb, joins);
88
- }
89
- const parsedQuery = parser.astify(clonedQb.sql);
90
- const q = Array.isArray(parsedQuery) ? parsedQuery[0] : parsedQuery;
91
- if (q.type !== "select") {
92
- throw new Error("Invalid query");
93
- }
94
- const countColumn = `${getTableName(q.columns[0].expr)}.${q.columns[0].expr.column}`;
95
- clonedQb.clearSelect().count(countColumn, "total").first();
96
- if (q.distinct) {
97
- clonedQb.distinct(countColumn);
98
- }
99
- if (debug === true || debug === "count") {
100
- console.debug("DEBUG: count query", chalk.blue(clonedQb.sql));
101
- }
102
- const [{ total: total2 }] = await clonedQb.execute();
103
- return total2;
104
- })();
105
- const rows = await (async () => {
106
- if (queryMode === "count") return [];
107
- let listQb = qb;
108
- if (params.num !== 0) {
109
- listQb = listQb.limit(params.num).offset(params.num * (params.page - 1));
110
- }
111
- listQb.select(select);
112
- listQb = this.applyJoins(listQb, joins);
113
- if (debug === true || debug === "list") {
114
- console.debug("DEBUG: list query", chalk.blue(listQb.sql));
115
- }
116
- let rows2 = await listQb.execute();
117
- rows2 = await this.useLoaders(dbClient, rows2, loaders);
118
- return this.hydrate(rows2);
119
- })();
120
- return {
121
- rows,
122
- total,
123
- subsetQuery,
124
- qb: dbClient.qb
125
- };
126
- }
127
- async useLoaders(db, rows, loaders) {
128
- if (loaders.length === 0) return rows;
129
- for (const loader of loaders) {
130
- const fromIds = rows.map((row) => row[loader.manyJoin.idField]);
131
- if (!fromIds.length) continue;
132
- let subRows;
133
- let toCol;
134
- if (loader.manyJoin.through === void 0) {
135
- const { subQ, col } = await this.buildHasManyQuery(db, loader, fromIds);
136
- subRows = await subQ.execute();
137
- toCol = col;
138
- } else {
139
- const { subQ, col } = await this.buildManyToManyQuery(
140
- db,
141
- loader,
142
- fromIds
143
- );
144
- subRows = await subQ.execute();
145
- toCol = col;
146
- }
147
- if (loader.loaders) {
148
- subRows = await this.useLoaders(db, subRows, loader.loaders);
149
- }
150
- const subRowGroups = _2.groupBy(subRows, toCol);
151
- rows = rows.map((row) => {
152
- row[loader.as] = (subRowGroups[row[loader.manyJoin.idField]] ?? []).map(
153
- (r) => _2.omit(r, toCol)
154
- );
155
- return row;
156
- });
157
- }
158
- return rows;
159
- }
160
- async buildHasManyQuery(db, loader, fromIds) {
161
- const idColumn = `${loader.manyJoin.toTable}.${loader.manyJoin.toCol}`;
162
- let qb = db.from(loader.manyJoin.toTable);
163
- db.where([idColumn, "in", fromIds]).select([...loader.select, idColumn]);
164
- qb = this.applyJoins(qb, loader.oneJoins);
165
- return {
166
- subQ: qb,
167
- col: loader.manyJoin.toCol
168
- };
169
- }
170
- async buildManyToManyQuery(db, loader, fromIds) {
171
- if (!loader.manyJoin.through)
172
- throw new Error("Through table info missing for many-to-many relation");
173
- const idColumn = `${loader.manyJoin.through.table}.${loader.manyJoin.through.fromCol}`;
174
- let qb = db.from(loader.manyJoin.through.table);
175
- const throughTable = loader.manyJoin.through.table;
176
- const targetTable = loader.manyJoin.toTable;
177
- qb = this.applyJoins(qb, [
178
- {
179
- join: "inner",
180
- table: targetTable,
181
- as: targetTable,
182
- from: `${throughTable}.${loader.manyJoin.through.toCol}`,
183
- to: `${targetTable}.${loader.manyJoin.toCol}`
184
- }
185
- ]);
186
- qb.where([idColumn, "in", fromIds]).select([...loader.select, idColumn]);
187
- qb = this.applyJoins(qb, loader.oneJoins);
188
- return {
189
- subQ: qb,
190
- col: loader.manyJoin.through.fromCol
191
- };
192
- }
193
- myNow(timestamp) {
194
- const dt = timestamp === void 0 ? DateTime.local() : DateTime.fromSeconds(timestamp);
195
- return dt.toFormat("yyyy-MM-dd HH:mm:ss");
196
- }
197
- hydrate(rows) {
198
- return rows.map((row) => {
199
- const nestedKeys = Object.keys(row).filter((key) => key.includes("__"));
200
- const groups = _2.groupBy(nestedKeys, (key) => key.split("__")[0]);
201
- const nullKeys = Object.keys(groups).filter(
202
- (key) => groups[key].length > 1 && groups[key].every((field) => row[field] === null)
203
- );
204
- const hydrated = Object.keys(row).reduce((r, field) => {
205
- if (!field.includes("__")) {
206
- if (Array.isArray(row[field]) && _2.isObject(row[field][0])) {
207
- r[field] = this.hydrate(row[field]);
208
- } else {
209
- r[field] = row[field];
210
- }
211
- return r;
212
- }
213
- const parts = field.split("__");
214
- const objPath = parts[0] + parts.slice(1).map((part) => `[${part}]`).join("");
215
- _2.set(
216
- r,
217
- objPath,
218
- row[field] && Array.isArray(row[field]) && _2.isObject(row[field][0]) ? this.hydrate(row[field]) : row[field]
219
- );
220
- return r;
221
- }, {});
222
- nullKeys.forEach((nullKey) => hydrated[nullKey] = null);
223
- return hydrated;
224
- });
225
- }
226
- };
227
-
228
- export {
229
- BaseModelClassAbstract
230
- };
231
- //# sourceMappingURL=chunk-4K2F3SOM.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/database/base-model.ts","../src/utils/sql-parser.ts"],"sourcesContent":["// base-model.ts\nimport { DateTime } from \"luxon\";\nimport _ from \"lodash\";\nimport SqlParser from \"node-sql-parser\";\nimport chalk from \"chalk\";\nimport inflection from \"inflection\";\nimport { BaseListParams } from \"../utils/model\";\nimport { DBPreset, DriverSpec, DatabaseDriver } from \"./types\";\nimport { SubsetQuery } from \"../types/types\";\nimport { getTableName, getTableNamesFromWhere } from \"../utils/sql-parser\";\nimport { DB } from \"./db\";\n\nexport abstract class BaseModelClassAbstract<D extends DatabaseDriver> {\n public modelName: string = \"Unknown\";\n\n protected abstract applyJoins(\n qb: DriverSpec[D][\"adapter\"],\n joins: SubsetQuery[\"joins\"]\n ): DriverSpec[D][\"adapter\"];\n protected abstract executeCountQuery(\n qb: DriverSpec[D][\"queryBuilder\"]\n ): Promise<number>;\n\n abstract getDB(which: DBPreset): DriverSpec[D][\"core\"];\n abstract destroy(): Promise<void>;\n\n async runSubsetQuery<T extends BaseListParams, U extends string>({\n params,\n baseTable,\n subset,\n subsetQuery,\n build,\n debug,\n db: _db,\n optimizeCountQuery,\n }: {\n subset: U;\n params: T;\n subsetQuery: SubsetQuery;\n build: (buildParams: {\n qb: DriverSpec[D][\"queryBuilder\"];\n db: DriverSpec[D][\"core\"];\n select: SubsetQuery[\"select\"];\n joins: SubsetQuery[\"joins\"];\n virtual: string[];\n }) => DriverSpec[D][\"queryBuilder\"];\n baseTable?: DriverSpec[D][\"table\"];\n debug?: boolean | \"list\" | \"count\";\n db?: DriverSpec[D][\"core\"];\n optimizeCountQuery?: boolean;\n }): Promise<{\n rows: any[];\n total?: number;\n subsetQuery: SubsetQuery;\n qb: DriverSpec[D][\"queryBuilder\"];\n }> {\n const db = _db ?? DB.getDB(subset.startsWith(\"A\") ? \"w\" : \"r\");\n const dbClient = DB.toClient(db);\n baseTable =\n baseTable ?? inflection.pluralize(inflection.underscore(this.modelName));\n const queryMode =\n params.queryMode ?? (params.id !== undefined ? \"list\" : \"both\");\n\n const { select, virtual, joins, loaders } = subsetQuery;\n const _qb = build({\n qb: dbClient.from(baseTable).qb,\n db,\n select,\n joins,\n virtual,\n });\n dbClient.qb = _qb;\n const qb = dbClient;\n\n const total = await (async () => {\n if (queryMode === \"list\") return undefined;\n\n const clonedQb = qb\n .clone()\n .clearQueryParts([\"order\", \"offset\", \"limit\"])\n .clearSelect()\n .select(`${baseTable}.id`);\n const parser = new SqlParser.Parser();\n\n if (optimizeCountQuery) {\n const parsedQuery = parser.astify(clonedQb.sql);\n const tables = getTableNamesFromWhere(parsedQuery);\n const needToJoin = _.uniq(\n tables.flatMap((table) =>\n table.split(\"__\").map((t) => inflection.pluralize(t))\n )\n );\n\n this.applyJoins(\n clonedQb,\n joins.filter((j) => needToJoin.includes(j.table))\n );\n } else {\n this.applyJoins(clonedQb, joins);\n }\n\n const parsedQuery = parser.astify(clonedQb.sql);\n const q = Array.isArray(parsedQuery) ? parsedQuery[0] : parsedQuery;\n\n if (q.type !== \"select\") {\n throw new Error(\"Invalid query\");\n }\n\n const countColumn = `${getTableName(q.columns[0].expr)}.${q.columns[0].expr.column}`;\n clonedQb.clearSelect().count(countColumn, \"total\").first();\n if (q.distinct) {\n clonedQb.distinct(countColumn);\n }\n\n if (debug === true || debug === \"count\") {\n console.debug(\"DEBUG: count query\", chalk.blue(clonedQb.sql));\n }\n\n const [{ total }] = await clonedQb.execute();\n return total;\n })();\n\n const rows = await (async () => {\n if (queryMode === \"count\") return [];\n\n let listQb = qb;\n if (params.num !== 0) {\n listQb = listQb\n .limit(params.num!)\n .offset(params.num! * (params.page! - 1));\n }\n\n listQb.select(select);\n listQb = this.applyJoins(listQb, joins);\n\n if (debug === true || debug === \"list\") {\n console.debug(\"DEBUG: list query\", chalk.blue(listQb.sql));\n }\n\n let rows = await listQb.execute();\n rows = await this.useLoaders(dbClient, rows, loaders);\n return this.hydrate(rows);\n })();\n\n return {\n rows,\n total,\n subsetQuery,\n qb: dbClient.qb,\n };\n }\n\n async useLoaders(\n db: DriverSpec[D][\"adapter\"],\n rows: any[],\n loaders: SubsetQuery[\"loaders\"]\n ): Promise<any[]> {\n if (loaders.length === 0) return rows;\n\n for (const loader of loaders) {\n const fromIds = rows.map((row) => row[loader.manyJoin.idField]);\n\n if (!fromIds.length) continue;\n\n let subRows: any[];\n let toCol: string;\n\n if (loader.manyJoin.through === undefined) {\n // HasMany\n const { subQ, col } = await this.buildHasManyQuery(db, loader, fromIds);\n subRows = await subQ.execute();\n toCol = col;\n } else {\n // ManyToMany\n const { subQ, col } = await this.buildManyToManyQuery(\n db,\n loader,\n fromIds\n );\n subRows = await subQ.execute();\n toCol = col;\n }\n\n if (loader.loaders) {\n subRows = await this.useLoaders(db, subRows, loader.loaders);\n }\n\n // Group and assign loaded rows\n const subRowGroups = _.groupBy(subRows, toCol);\n rows = rows.map((row) => {\n row[loader.as] = (subRowGroups[row[loader.manyJoin.idField]] ?? []).map(\n (r) => _.omit(r, toCol)\n );\n return row;\n });\n }\n\n return rows;\n }\n\n protected async buildHasManyQuery(\n db: DriverSpec[D][\"adapter\"],\n loader: SubsetQuery[\"loaders\"][number],\n fromIds: any[]\n ) {\n const idColumn = `${loader.manyJoin.toTable}.${loader.manyJoin.toCol}`;\n let qb = db.from(loader.manyJoin.toTable);\n\n db.where([idColumn, \"in\", fromIds]).select([...loader.select, idColumn]);\n qb = this.applyJoins(qb, loader.oneJoins);\n\n return {\n subQ: qb,\n col: loader.manyJoin.toCol,\n };\n }\n\n protected async buildManyToManyQuery(\n db: DriverSpec[D][\"adapter\"],\n loader: SubsetQuery[\"loaders\"][number],\n fromIds: any[]\n ) {\n if (!loader.manyJoin.through)\n throw new Error(\"Through table info missing for many-to-many relation\");\n\n const idColumn = `${loader.manyJoin.through.table}.${loader.manyJoin.through.fromCol}`;\n let qb = db.from(loader.manyJoin.through.table);\n\n const throughTable = loader.manyJoin.through.table;\n const targetTable = loader.manyJoin.toTable;\n\n qb = this.applyJoins(qb, [\n {\n join: \"inner\",\n table: targetTable,\n as: targetTable,\n from: `${throughTable}.${loader.manyJoin.through.toCol}`,\n to: `${targetTable}.${loader.manyJoin.toCol}`,\n },\n ]);\n\n qb.where([idColumn, \"in\", fromIds]).select([...loader.select, idColumn]);\n qb = this.applyJoins(qb, loader.oneJoins);\n\n return {\n subQ: qb,\n col: loader.manyJoin.through.fromCol,\n };\n }\n\n myNow(timestamp?: number): string {\n const dt: DateTime =\n timestamp === undefined\n ? DateTime.local()\n : DateTime.fromSeconds(timestamp);\n return dt.toFormat(\"yyyy-MM-dd HH:mm:ss\");\n }\n\n hydrate<T>(rows: T[]): T[] {\n return rows.map((row: any) => {\n const nestedKeys = Object.keys(row).filter((key) => key.includes(\"__\"));\n const groups = _.groupBy(nestedKeys, (key) => key.split(\"__\")[0]);\n const nullKeys = Object.keys(groups).filter(\n (key) =>\n groups[key].length > 1 &&\n groups[key].every((field) => row[field] === null)\n );\n\n const hydrated = Object.keys(row).reduce((r, field) => {\n if (!field.includes(\"__\")) {\n if (Array.isArray(row[field]) && _.isObject(row[field][0])) {\n r[field] = this.hydrate(row[field]);\n } else {\n r[field] = row[field];\n }\n return r;\n }\n\n const parts = field.split(\"__\");\n const objPath =\n parts[0] +\n parts\n .slice(1)\n .map((part) => `[${part}]`)\n .join(\"\");\n\n _.set(\n r,\n objPath,\n row[field] && Array.isArray(row[field]) && _.isObject(row[field][0])\n ? this.hydrate(row[field])\n : row[field]\n );\n\n return r;\n }, {} as any);\n\n nullKeys.forEach((nullKey) => (hydrated[nullKey] = null));\n return hydrated;\n });\n }\n}\n","import _ from \"lodash\";\nimport { AST, ColumnRef, Expr, ExpressionValue, Select } from \"node-sql-parser\";\n\nexport function getTableName(expr: ColumnRef) {\n if (\"table\" in expr && expr.table !== null) {\n return typeof expr.table === \"string\"\n ? expr.table\n : (expr.table as { type: string; value: string }).value;\n }\n return null;\n}\n\n// where 조건에 사용된 테이블명을 추출\nexport function getTableNamesFromWhere(ast: AST | AST[]): string[] {\n const extractTableNames = (where: Select[\"where\"]): string[] => {\n if (where === null || !(where.type === \"binary_expr\" && \"left\" in where)) {\n return [];\n }\n\n const extractTableName = (expr: Expr | ExpressionValue): string[] => {\n if (expr.type === \"column_ref\") {\n const table = getTableName(expr as ColumnRef);\n return table ? [table] : [];\n } else if (expr.type === \"binary_expr\" && \"left\" in expr) {\n return extractTableNames(expr);\n }\n return [];\n };\n\n return [...extractTableName(where.left), ...extractTableName(where.right)];\n };\n\n return _.uniq(\n (Array.isArray(ast) ? ast : [ast]).flatMap((a) =>\n a.type === \"select\" || a.type === \"update\" || a.type === \"delete\"\n ? extractTableNames(a.where)\n : []\n )\n );\n}\n"],"mappings":"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","names":["_","parsedQuery","_","total","rows"]}