sonamu 0.0.39 → 0.0.40
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/api/code-converters.d.ts +1 -0
- package/dist/api/code-converters.d.ts.map +1 -1
- package/dist/api/code-converters.js +68 -1
- package/dist/api/code-converters.js.map +1 -1
- package/dist/api/decorators.d.ts +1 -0
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/smd/migrator.d.ts +34 -1
- package/dist/smd/migrator.d.ts.map +1 -1
- package/dist/smd/migrator.js +2 -1
- package/dist/smd/migrator.js.map +1 -1
- package/dist/smd/smd-manager.d.ts +1 -1
- package/dist/smd/smd-manager.d.ts.map +1 -1
- package/dist/smd/smd-manager.js.map +1 -1
- package/dist/smd/smd.d.ts +1 -1
- package/dist/smd/smd.d.ts.map +1 -1
- package/dist/smd/smd.js +5 -20
- package/dist/smd/smd.js.map +1 -1
- package/dist/syncer/syncer.d.ts +1 -1
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +40 -38
- package/dist/syncer/syncer.js.map +1 -1
- package/dist/templates/view_form.template.d.ts +1 -1
- package/dist/templates/view_list.template.d.ts +1 -1
- package/dist/types/types.d.ts +1 -0
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js.map +1 -1
- package/package.json +1 -1
- package/src/api/code-converters.ts +70 -0
- package/src/api/decorators.ts +1 -0
- package/src/index.ts +1 -0
- package/src/smd/migrator.ts +42 -5
- package/src/smd/smd-manager.ts +1 -1
- package/src/smd/smd.ts +11 -26
- package/src/syncer/syncer.ts +4 -4
- package/src/types/types.ts +1 -0
package/src/smd/migrator.ts
CHANGED
|
@@ -48,6 +48,7 @@ import {
|
|
|
48
48
|
isEnumProp,
|
|
49
49
|
isIntegerProp,
|
|
50
50
|
isKnexError,
|
|
51
|
+
RelationOn,
|
|
51
52
|
} from "../types/types";
|
|
52
53
|
import { propIf } from "../utils/lodash-able";
|
|
53
54
|
import { SMDManager } from "./smd-manager";
|
|
@@ -534,7 +535,7 @@ export class Migrator {
|
|
|
534
535
|
기존 테이블 정보 읽어서 MigrationSet 형식으로 리턴
|
|
535
536
|
*/
|
|
536
537
|
async getMigrationSetFromDB(table: string): Promise<MigrationSet | null> {
|
|
537
|
-
let dbColumns:
|
|
538
|
+
let dbColumns: DBColumn[], dbIndexes: DBIndex[], dbForeigns: DBForeign[];
|
|
538
539
|
try {
|
|
539
540
|
[dbColumns, dbIndexes, dbForeigns] = await this.readTable(table);
|
|
540
541
|
} catch (e: unknown) {
|
|
@@ -554,7 +555,7 @@ export class Migrator {
|
|
|
554
555
|
...propIf(dbColumn.Default !== null, {
|
|
555
556
|
defaultTo:
|
|
556
557
|
dbColType.type === "float"
|
|
557
|
-
? parseFloat(dbColumn.Default).toString()
|
|
558
|
+
? parseFloat(dbColumn.Default ?? "0").toString()
|
|
558
559
|
: dbColumn.Default,
|
|
559
560
|
}),
|
|
560
561
|
};
|
|
@@ -592,8 +593,8 @@ export class Migrator {
|
|
|
592
593
|
return {
|
|
593
594
|
columns: [dbForeign.from],
|
|
594
595
|
to: `${dbForeign.referencesTable}.${dbForeign.referencesField}`,
|
|
595
|
-
onUpdate: dbForeign.onUpdate,
|
|
596
|
-
onDelete: dbForeign.onDelete,
|
|
596
|
+
onUpdate: dbForeign.onUpdate as RelationOn,
|
|
597
|
+
onDelete: dbForeign.onDelete as RelationOn,
|
|
597
598
|
};
|
|
598
599
|
});
|
|
599
600
|
|
|
@@ -691,7 +692,9 @@ export class Migrator {
|
|
|
691
692
|
/*
|
|
692
693
|
기존 테이블 읽어서 cols, indexes 반환
|
|
693
694
|
*/
|
|
694
|
-
async readTable(
|
|
695
|
+
async readTable(
|
|
696
|
+
tableName: string
|
|
697
|
+
): Promise<[DBColumn[], DBIndex[], DBForeign[]]> {
|
|
695
698
|
// 테이블 정보
|
|
696
699
|
try {
|
|
697
700
|
const [cols] = await this.targets.compare!.raw(
|
|
@@ -1563,3 +1566,37 @@ export class Migrator {
|
|
|
1563
1566
|
);
|
|
1564
1567
|
}
|
|
1565
1568
|
}
|
|
1569
|
+
|
|
1570
|
+
type DBColumn = {
|
|
1571
|
+
Field: string;
|
|
1572
|
+
Type: string;
|
|
1573
|
+
Null: string;
|
|
1574
|
+
Key: string;
|
|
1575
|
+
Default: string | null;
|
|
1576
|
+
Extra: string;
|
|
1577
|
+
};
|
|
1578
|
+
type DBIndex = {
|
|
1579
|
+
Table: string;
|
|
1580
|
+
Non_unique: number;
|
|
1581
|
+
Key_name: string;
|
|
1582
|
+
Seq_in_index: number;
|
|
1583
|
+
Column_name: string;
|
|
1584
|
+
Collation: string | null;
|
|
1585
|
+
Cardinality: number | null;
|
|
1586
|
+
Sub_part: number | null;
|
|
1587
|
+
Packed: string | null;
|
|
1588
|
+
Null: string;
|
|
1589
|
+
Index_type: string;
|
|
1590
|
+
Comment: string;
|
|
1591
|
+
Index_comment: string;
|
|
1592
|
+
Visible: string;
|
|
1593
|
+
Expression: string | null;
|
|
1594
|
+
};
|
|
1595
|
+
type DBForeign = {
|
|
1596
|
+
keyName: string;
|
|
1597
|
+
from: string;
|
|
1598
|
+
referencesTable: string;
|
|
1599
|
+
referencesField: string;
|
|
1600
|
+
onDelete: string;
|
|
1601
|
+
onUpdate: string;
|
|
1602
|
+
};
|
package/src/smd/smd-manager.ts
CHANGED
|
@@ -24,7 +24,7 @@ type TableSpec = {
|
|
|
24
24
|
};
|
|
25
25
|
class SMDManagerClass {
|
|
26
26
|
private SMDs: Map<string, SMD> = new Map();
|
|
27
|
-
|
|
27
|
+
public modulePaths: Map<string, string> = new Map();
|
|
28
28
|
private tableSpecs: Map<string, TableSpec> = new Map();
|
|
29
29
|
public isAutoloaded: boolean = false;
|
|
30
30
|
|
package/src/smd/smd.ts
CHANGED
|
@@ -132,7 +132,11 @@ export class SMD {
|
|
|
132
132
|
|
|
133
133
|
/*
|
|
134
134
|
*/
|
|
135
|
-
resolveSubsetQuery(
|
|
135
|
+
resolveSubsetQuery(
|
|
136
|
+
prefix: string,
|
|
137
|
+
fields: string[],
|
|
138
|
+
isAlreadyOuterJoined: boolean = false
|
|
139
|
+
): SubsetQuery {
|
|
136
140
|
// prefix 치환 (prefix는 ToOneRelation이 복수로 붙은 경우 모두 __로 변경됨)
|
|
137
141
|
prefix = prefix.replace(/\./g, "__");
|
|
138
142
|
|
|
@@ -203,9 +207,13 @@ export class SMD {
|
|
|
203
207
|
return r;
|
|
204
208
|
}
|
|
205
209
|
|
|
210
|
+
// innerOrOuter
|
|
211
|
+
const innerOrOuter =
|
|
212
|
+
isAlreadyOuterJoined || relation.nullable ? "outer" : "inner";
|
|
206
213
|
const relSubsetQuery = relSMD.resolveSubsetQuery(
|
|
207
214
|
`${prefix !== "" ? prefix + "." : ""}${groupKey}`,
|
|
208
|
-
relFields
|
|
215
|
+
relFields,
|
|
216
|
+
innerOrOuter === "outer"
|
|
209
217
|
);
|
|
210
218
|
r.select = r.select.concat(relSubsetQuery.select);
|
|
211
219
|
r.virtual = r.virtual.concat(relSubsetQuery.virtual);
|
|
@@ -240,32 +248,9 @@ export class SMD {
|
|
|
240
248
|
};
|
|
241
249
|
}
|
|
242
250
|
|
|
243
|
-
const outerOrInner = (() => {
|
|
244
|
-
// 대상 컬럼이 nullable인 경우 outer, 아닌 경우 inner
|
|
245
|
-
// OneToOneRelation의 경우 joinColumn이 없는 경우 해당 relation을 찾아가 확인해야 함 (customJoin의 경우 고려하지 않음)
|
|
246
|
-
if (
|
|
247
|
-
isOneToOneRelationProp(relation) &&
|
|
248
|
-
relation.hasJoinColumn === false
|
|
249
|
-
) {
|
|
250
|
-
const oppositeRelationProp = relSMD.props.find(
|
|
251
|
-
(prop) =>
|
|
252
|
-
isOneToOneRelationProp(prop) &&
|
|
253
|
-
prop.with === this.id &&
|
|
254
|
-
prop.hasJoinColumn === true
|
|
255
|
-
);
|
|
256
|
-
if (oppositeRelationProp?.nullable === true) {
|
|
257
|
-
return "outer";
|
|
258
|
-
} else {
|
|
259
|
-
return "inner";
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
return relation.nullable === true ? "outer" : "inner";
|
|
264
|
-
})();
|
|
265
|
-
|
|
266
251
|
r.joins.push({
|
|
267
252
|
as: joinAs,
|
|
268
|
-
join:
|
|
253
|
+
join: innerOrOuter,
|
|
269
254
|
table: relSMD.table,
|
|
270
255
|
...joinClause,
|
|
271
256
|
});
|
package/src/syncer/syncer.ts
CHANGED
|
@@ -801,7 +801,7 @@ export class Syncer {
|
|
|
801
801
|
}
|
|
802
802
|
|
|
803
803
|
const rendered = template.render(options, ...extra);
|
|
804
|
-
const resolved = this.resolveRenderedTemplate(key, rendered);
|
|
804
|
+
const resolved = await this.resolveRenderedTemplate(key, rendered);
|
|
805
805
|
|
|
806
806
|
let preTemplateResolved: PathAndCode[] = [];
|
|
807
807
|
if (rendered.preTemplates) {
|
|
@@ -817,10 +817,10 @@ export class Syncer {
|
|
|
817
817
|
return [resolved, ...preTemplateResolved];
|
|
818
818
|
}
|
|
819
819
|
|
|
820
|
-
resolveRenderedTemplate(
|
|
820
|
+
async resolveRenderedTemplate(
|
|
821
821
|
key: TemplateKey,
|
|
822
822
|
result: RenderedTemplate
|
|
823
|
-
): PathAndCode {
|
|
823
|
+
): Promise<PathAndCode> {
|
|
824
824
|
const { target, path: filePath, body, importKeys, customHeaders } = result;
|
|
825
825
|
|
|
826
826
|
// import 할 대상의 대상 path 추출
|
|
@@ -873,7 +873,7 @@ export class Syncer {
|
|
|
873
873
|
const formatted =
|
|
874
874
|
key === "generated_http"
|
|
875
875
|
? [header, body].join("\n\n")
|
|
876
|
-
: prettier.format([header, body].join("\n\n"), {
|
|
876
|
+
: await prettier.format([header, body].join("\n\n"), {
|
|
877
877
|
parser: "typescript",
|
|
878
878
|
});
|
|
879
879
|
|