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.
Files changed (85) hide show
  1. package/.pnp.cjs +11 -0
  2. package/dist/base-model-BzMJ2E_I.d.mts +43 -0
  3. package/dist/base-model-CWRKUX49.d.ts +43 -0
  4. package/dist/bin/cli.js +118 -89
  5. package/dist/bin/cli.js.map +1 -1
  6. package/dist/bin/cli.mjs +74 -45
  7. package/dist/bin/cli.mjs.map +1 -1
  8. package/dist/chunk-FLPD24HS.mjs +231 -0
  9. package/dist/chunk-FLPD24HS.mjs.map +1 -0
  10. package/dist/chunk-I2MMJRJN.mjs +1550 -0
  11. package/dist/chunk-I2MMJRJN.mjs.map +1 -0
  12. package/dist/{chunk-L4KELCY7.mjs → chunk-PP2PSSAG.mjs} +5241 -5571
  13. package/dist/chunk-PP2PSSAG.mjs.map +1 -0
  14. package/dist/chunk-QK5XXJUX.mjs +280 -0
  15. package/dist/chunk-QK5XXJUX.mjs.map +1 -0
  16. package/dist/chunk-U636LQJJ.js +231 -0
  17. package/dist/chunk-U636LQJJ.js.map +1 -0
  18. package/dist/chunk-W7KDVJLQ.js +280 -0
  19. package/dist/chunk-W7KDVJLQ.js.map +1 -0
  20. package/dist/{chunk-JOHF7PK4.js → chunk-XT6LHCX5.js} +5292 -5622
  21. package/dist/chunk-XT6LHCX5.js.map +1 -0
  22. package/dist/chunk-Z2P7XTXE.js +1550 -0
  23. package/dist/chunk-Z2P7XTXE.js.map +1 -0
  24. package/dist/database/drivers/knex/base-model.d.mts +16 -0
  25. package/dist/database/drivers/knex/base-model.d.ts +16 -0
  26. package/dist/database/drivers/knex/base-model.js +55 -0
  27. package/dist/database/drivers/knex/base-model.js.map +1 -0
  28. package/dist/database/drivers/knex/base-model.mjs +56 -0
  29. package/dist/database/drivers/knex/base-model.mjs.map +1 -0
  30. package/dist/database/drivers/kysely/base-model.d.mts +22 -0
  31. package/dist/database/drivers/kysely/base-model.d.ts +22 -0
  32. package/dist/database/drivers/kysely/base-model.js +64 -0
  33. package/dist/database/drivers/kysely/base-model.js.map +1 -0
  34. package/dist/database/drivers/kysely/base-model.mjs +65 -0
  35. package/dist/database/drivers/kysely/base-model.mjs.map +1 -0
  36. package/dist/index.d.mts +222 -928
  37. package/dist/index.d.ts +222 -928
  38. package/dist/index.js +13 -26
  39. package/dist/index.js.map +1 -1
  40. package/dist/index.mjs +18 -31
  41. package/dist/index.mjs.map +1 -1
  42. package/dist/model-CAH_4oQh.d.mts +1042 -0
  43. package/dist/model-CAH_4oQh.d.ts +1042 -0
  44. package/import-to-require.js +27 -0
  45. package/package.json +23 -2
  46. package/src/api/caster.ts +6 -0
  47. package/src/api/code-converters.ts +3 -1
  48. package/src/api/sonamu.ts +41 -22
  49. package/src/bin/cli.ts +78 -46
  50. package/src/database/_batch_update.ts +16 -11
  51. package/src/database/base-model.abstract.ts +97 -0
  52. package/src/database/base-model.ts +214 -280
  53. package/src/database/code-generator.ts +72 -0
  54. package/src/database/db.abstract.ts +75 -0
  55. package/src/database/db.ts +21 -82
  56. package/src/database/drivers/knex/base-model.ts +55 -0
  57. package/src/database/drivers/knex/client.ts +209 -0
  58. package/src/database/drivers/knex/db.ts +227 -0
  59. package/src/database/drivers/knex/generator.ts +659 -0
  60. package/src/database/drivers/kysely/base-model.ts +89 -0
  61. package/src/database/drivers/kysely/client.ts +309 -0
  62. package/src/database/drivers/kysely/db.ts +238 -0
  63. package/src/database/drivers/kysely/generator.ts +714 -0
  64. package/src/database/types.ts +117 -0
  65. package/src/database/upsert-builder.ts +31 -18
  66. package/src/entity/entity-manager.ts +9 -5
  67. package/src/entity/entity-utils.ts +1 -1
  68. package/src/entity/entity.ts +9 -13
  69. package/src/entity/migrator.ts +98 -693
  70. package/src/index.ts +1 -1
  71. package/src/syncer/syncer.ts +103 -56
  72. package/src/templates/generated_http.template.ts +14 -0
  73. package/src/templates/kysely_types.template.ts +205 -0
  74. package/src/templates/model.template.ts +2 -139
  75. package/src/templates/service.template.ts +3 -1
  76. package/src/testing/_relation-graph.ts +111 -0
  77. package/src/testing/fixture-manager.ts +216 -332
  78. package/src/types/types.ts +56 -6
  79. package/src/utils/utils.ts +56 -4
  80. package/src/utils/zod-error.ts +189 -0
  81. package/tsconfig.json +2 -2
  82. package/tsup.config.js +11 -10
  83. package/dist/chunk-JOHF7PK4.js.map +0 -1
  84. package/dist/chunk-L4KELCY7.mjs.map +0 -1
  85. /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
+ }