sonamu 0.2.54 → 0.4.1
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/.pnp.cjs +11 -0
- package/dist/base-model-BzMJ2E_I.d.mts +43 -0
- package/dist/base-model-CWRKUX49.d.ts +43 -0
- package/dist/bin/cli.js +118 -89
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/cli.mjs +74 -45
- package/dist/bin/cli.mjs.map +1 -1
- package/dist/chunk-FLPD24HS.mjs +231 -0
- package/dist/chunk-FLPD24HS.mjs.map +1 -0
- package/dist/chunk-I2MMJRJN.mjs +1550 -0
- package/dist/chunk-I2MMJRJN.mjs.map +1 -0
- package/dist/{chunk-L4KELCY7.mjs → chunk-PP2PSSAG.mjs} +5241 -5571
- package/dist/chunk-PP2PSSAG.mjs.map +1 -0
- package/dist/chunk-QK5XXJUX.mjs +280 -0
- package/dist/chunk-QK5XXJUX.mjs.map +1 -0
- package/dist/chunk-U636LQJJ.js +231 -0
- package/dist/chunk-U636LQJJ.js.map +1 -0
- package/dist/chunk-W7KDVJLQ.js +280 -0
- package/dist/chunk-W7KDVJLQ.js.map +1 -0
- package/dist/{chunk-JOHF7PK4.js → chunk-XT6LHCX5.js} +5292 -5622
- package/dist/chunk-XT6LHCX5.js.map +1 -0
- package/dist/chunk-Z2P7XTXE.js +1550 -0
- package/dist/chunk-Z2P7XTXE.js.map +1 -0
- package/dist/database/drivers/knex/base-model.d.mts +16 -0
- package/dist/database/drivers/knex/base-model.d.ts +16 -0
- package/dist/database/drivers/knex/base-model.js +55 -0
- package/dist/database/drivers/knex/base-model.js.map +1 -0
- package/dist/database/drivers/knex/base-model.mjs +56 -0
- package/dist/database/drivers/knex/base-model.mjs.map +1 -0
- package/dist/database/drivers/kysely/base-model.d.mts +22 -0
- package/dist/database/drivers/kysely/base-model.d.ts +22 -0
- package/dist/database/drivers/kysely/base-model.js +64 -0
- package/dist/database/drivers/kysely/base-model.js.map +1 -0
- package/dist/database/drivers/kysely/base-model.mjs +65 -0
- package/dist/database/drivers/kysely/base-model.mjs.map +1 -0
- package/dist/index.d.mts +222 -928
- package/dist/index.d.ts +222 -928
- package/dist/index.js +13 -26
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +18 -31
- package/dist/index.mjs.map +1 -1
- package/dist/model-CAH_4oQh.d.mts +1042 -0
- package/dist/model-CAH_4oQh.d.ts +1042 -0
- package/import-to-require.js +27 -0
- package/package.json +23 -2
- package/src/api/caster.ts +6 -0
- package/src/api/code-converters.ts +3 -1
- package/src/api/sonamu.ts +41 -22
- package/src/bin/cli.ts +78 -46
- package/src/database/_batch_update.ts +16 -11
- package/src/database/base-model.abstract.ts +97 -0
- package/src/database/base-model.ts +214 -280
- package/src/database/code-generator.ts +72 -0
- package/src/database/db.abstract.ts +75 -0
- package/src/database/db.ts +21 -82
- package/src/database/drivers/knex/base-model.ts +55 -0
- package/src/database/drivers/knex/client.ts +209 -0
- package/src/database/drivers/knex/db.ts +227 -0
- package/src/database/drivers/knex/generator.ts +659 -0
- package/src/database/drivers/kysely/base-model.ts +89 -0
- package/src/database/drivers/kysely/client.ts +309 -0
- package/src/database/drivers/kysely/db.ts +238 -0
- package/src/database/drivers/kysely/generator.ts +714 -0
- package/src/database/types.ts +117 -0
- package/src/database/upsert-builder.ts +31 -18
- package/src/entity/entity-manager.ts +9 -5
- package/src/entity/entity-utils.ts +1 -1
- package/src/entity/entity.ts +9 -13
- package/src/entity/migrator.ts +98 -693
- package/src/index.ts +1 -1
- package/src/syncer/syncer.ts +103 -56
- package/src/templates/generated_http.template.ts +14 -0
- package/src/templates/kysely_types.template.ts +205 -0
- package/src/templates/model.template.ts +2 -139
- package/src/templates/service.template.ts +3 -1
- package/src/testing/_relation-graph.ts +111 -0
- package/src/testing/fixture-manager.ts +216 -332
- package/src/types/types.ts +56 -6
- package/src/utils/utils.ts +56 -4
- package/src/utils/zod-error.ts +189 -0
- package/tsconfig.json +2 -2
- package/tsup.config.js +11 -10
- package/dist/chunk-JOHF7PK4.js.map +0 -1
- package/dist/chunk-L4KELCY7.mjs.map +0 -1
- /package/src/database/{knex-plugins → drivers/knex/plugins}/knex-on-duplicate-update.ts +0 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { RelationNode, EntityProp, FixtureRecord } from "../types/types";
|
|
2
|
+
import { EntityManager } from "../entity/entity-manager";
|
|
3
|
+
import {
|
|
4
|
+
isRelationProp,
|
|
5
|
+
isBelongsToOneRelationProp,
|
|
6
|
+
isOneToOneRelationProp,
|
|
7
|
+
isManyToManyRelationProp,
|
|
8
|
+
} from "../types/types";
|
|
9
|
+
|
|
10
|
+
// 관계 그래프 처리를 별도 클래스로 분리
|
|
11
|
+
export class RelationGraph {
|
|
12
|
+
private graph: Map<string, RelationNode> = new Map();
|
|
13
|
+
|
|
14
|
+
buildGraph(fixtures: FixtureRecord[]): void {
|
|
15
|
+
this.graph.clear();
|
|
16
|
+
|
|
17
|
+
// 1. 노드 추가
|
|
18
|
+
for (const fixture of fixtures) {
|
|
19
|
+
this.graph.set(fixture.fixtureId, {
|
|
20
|
+
fixtureId: fixture.fixtureId,
|
|
21
|
+
entityId: fixture.entityId,
|
|
22
|
+
related: new Set(),
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// 2. 의존성 추가
|
|
27
|
+
for (const fixture of fixtures) {
|
|
28
|
+
const node = this.graph.get(fixture.fixtureId)!;
|
|
29
|
+
|
|
30
|
+
for (const [, column] of Object.entries(fixture.columns)) {
|
|
31
|
+
const prop = column.prop as EntityProp;
|
|
32
|
+
|
|
33
|
+
if (isRelationProp(prop)) {
|
|
34
|
+
if (
|
|
35
|
+
isBelongsToOneRelationProp(prop) ||
|
|
36
|
+
(isOneToOneRelationProp(prop) && prop.hasJoinColumn)
|
|
37
|
+
) {
|
|
38
|
+
const relatedFixtureId = `${prop.with}#${column.value}`;
|
|
39
|
+
if (this.graph.has(relatedFixtureId)) {
|
|
40
|
+
node.related.add(relatedFixtureId);
|
|
41
|
+
}
|
|
42
|
+
} else if (isManyToManyRelationProp(prop)) {
|
|
43
|
+
// ManyToMany 관계의 경우 양방향 의존성 추가
|
|
44
|
+
const relatedIds = column.value as number[];
|
|
45
|
+
for (const relatedId of relatedIds) {
|
|
46
|
+
const relatedFixtureId = `${prop.with}#${relatedId}`;
|
|
47
|
+
if (this.graph.has(relatedFixtureId)) {
|
|
48
|
+
node.related.add(relatedFixtureId);
|
|
49
|
+
this.graph
|
|
50
|
+
.get(relatedFixtureId)!
|
|
51
|
+
.related.add(fixture.fixtureId);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
getInsertionOrder(): string[] {
|
|
61
|
+
const visited = new Set<string>();
|
|
62
|
+
const order: string[] = [];
|
|
63
|
+
const tempVisited = new Set<string>();
|
|
64
|
+
|
|
65
|
+
const visit = (fixtureId: string) => {
|
|
66
|
+
if (visited.has(fixtureId)) return;
|
|
67
|
+
if (tempVisited.has(fixtureId)) {
|
|
68
|
+
console.warn(`Circular dependency detected involving: ${fixtureId}`);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
tempVisited.add(fixtureId);
|
|
73
|
+
|
|
74
|
+
const node = this.graph.get(fixtureId)!;
|
|
75
|
+
const entity = EntityManager.get(node.entityId);
|
|
76
|
+
|
|
77
|
+
for (const depId of node.related) {
|
|
78
|
+
const depNode = this.graph.get(depId)!;
|
|
79
|
+
|
|
80
|
+
// BelongsToOne 관계이면서 nullable이 아닌 경우 먼저 방문
|
|
81
|
+
const relationProp = entity.props.find(
|
|
82
|
+
(prop) =>
|
|
83
|
+
isRelationProp(prop) &&
|
|
84
|
+
(isBelongsToOneRelationProp(prop) ||
|
|
85
|
+
(isOneToOneRelationProp(prop) && prop.hasJoinColumn)) &&
|
|
86
|
+
prop.with === depNode.entityId
|
|
87
|
+
);
|
|
88
|
+
if (relationProp && !relationProp.nullable) {
|
|
89
|
+
visit(depId);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
tempVisited.delete(fixtureId);
|
|
94
|
+
visited.add(fixtureId);
|
|
95
|
+
order.push(fixtureId);
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
for (const fixtureId of this.graph.keys()) {
|
|
99
|
+
visit(fixtureId);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// circular dependency로 인해 방문되지 않은 fixtureId 추가
|
|
103
|
+
for (const fixtureId of this.graph.keys()) {
|
|
104
|
+
if (!visited.has(fixtureId)) {
|
|
105
|
+
order.push(fixtureId);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return order;
|
|
110
|
+
}
|
|
111
|
+
}
|