sonamu 0.2.48 → 0.2.50
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/bin/cli-wrapper.d.mts +1 -0
- package/dist/bin/cli-wrapper.js +12 -2
- package/dist/bin/cli-wrapper.js.map +1 -1
- package/dist/bin/cli-wrapper.mjs +44 -0
- package/dist/bin/cli-wrapper.mjs.map +1 -0
- package/dist/bin/cli.d.mts +2 -0
- package/dist/bin/cli.js +54 -62
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/cli.mjs +879 -0
- package/dist/bin/cli.mjs.map +1 -0
- package/dist/{chunk-76VBQWGE.js → chunk-4EET56IE.js} +173 -99
- package/dist/chunk-4EET56IE.js.map +1 -0
- package/dist/chunk-HEPO4HGK.mjs +7834 -0
- package/dist/chunk-HEPO4HGK.mjs.map +1 -0
- package/dist/chunk-JXJTFHF7.mjs +20 -0
- package/dist/chunk-JXJTFHF7.mjs.map +1 -0
- package/dist/index.d.mts +1492 -0
- package/dist/index.d.ts +15 -7
- package/dist/index.js +3 -3
- package/dist/index.mjs +429 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +1 -1
- package/src/api/sonamu.ts +3 -2
- package/src/bin/cli-wrapper.ts +20 -1
- package/src/bin/cli.ts +5 -15
- package/src/database/_batch_update.ts +29 -14
- package/src/database/upsert-builder.ts +56 -42
- package/src/templates/service.template.ts +9 -1
- package/src/testing/fixture-manager.ts +122 -36
- package/src/types/types.ts +3 -2
- package/src/utils/utils.ts +15 -13
- package/tsup.config.js +1 -4
- package/dist/chunk-76VBQWGE.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -761,6 +761,7 @@ type FixtureRecord = {
|
|
|
761
761
|
fetchedRecords: string[];
|
|
762
762
|
belongsRecords: string[];
|
|
763
763
|
target?: FixtureRecord;
|
|
764
|
+
unique?: FixtureRecord;
|
|
764
765
|
override?: boolean;
|
|
765
766
|
};
|
|
766
767
|
type FixtureImportResult = {
|
|
@@ -1100,7 +1101,10 @@ declare class SonamuClass {
|
|
|
1100
1101
|
set secrets(secrets: SonamuSecrets);
|
|
1101
1102
|
get secrets(): SonamuSecrets | null;
|
|
1102
1103
|
init(doSilent?: boolean, enableSync?: boolean, apiRootPath?: string): Promise<void>;
|
|
1103
|
-
withFastify(server: FastifyInstance<Server, IncomingMessage, ServerResponse>, config: SonamuFastifyConfig
|
|
1104
|
+
withFastify(server: FastifyInstance<Server, IncomingMessage, ServerResponse>, config: SonamuFastifyConfig, options?: {
|
|
1105
|
+
enableSync?: boolean;
|
|
1106
|
+
doSilent?: boolean;
|
|
1107
|
+
}): Promise<void>;
|
|
1104
1108
|
destroy(): Promise<void>;
|
|
1105
1109
|
}
|
|
1106
1110
|
declare const Sonamu: SonamuClass;
|
|
@@ -1145,12 +1149,12 @@ declare class UpsertBuilder {
|
|
|
1145
1149
|
register<T extends string>(tableName: string, row: {
|
|
1146
1150
|
[key in T]?: UBRef | string | number | boolean | bigint | null | object | unknown;
|
|
1147
1151
|
}): UBRef;
|
|
1148
|
-
upsert(wdb: Knex, tableName: string): Promise<number[]>;
|
|
1149
|
-
insertOnly(wdb: Knex, tableName: string): Promise<number[]>;
|
|
1150
|
-
upsertOrInsert(wdb: Knex, tableName: string, mode: "upsert" | "insert"): Promise<number[]>;
|
|
1152
|
+
upsert(wdb: Knex, tableName: string, chunkSize?: number): Promise<number[]>;
|
|
1153
|
+
insertOnly(wdb: Knex, tableName: string, chunkSize?: number): Promise<number[]>;
|
|
1154
|
+
upsertOrInsert(wdb: Knex, tableName: string, mode: "upsert" | "insert", chunkSize?: number): Promise<number[]>;
|
|
1151
1155
|
updateBatch(wdb: Knex, tableName: string, options?: {
|
|
1152
1156
|
chunkSize?: number;
|
|
1153
|
-
where?: string;
|
|
1157
|
+
where?: string | string[];
|
|
1154
1158
|
}): Promise<void>;
|
|
1155
1159
|
}
|
|
1156
1160
|
|
|
@@ -1452,14 +1456,18 @@ declare class FixtureManagerClass {
|
|
|
1452
1456
|
getImportQueries(entityId: string, field: string, id: number): Promise<string[]>;
|
|
1453
1457
|
destory(): Promise<void>;
|
|
1454
1458
|
getFixtures(sourceDBName: keyof SonamuDBConfig, targetDBName: keyof SonamuDBConfig, searchOptions: FixtureSearchOptions): Promise<FixtureRecord[]>;
|
|
1455
|
-
createFixtureRecord(entity: Entity, row: any,
|
|
1456
|
-
|
|
1459
|
+
createFixtureRecord(entity: Entity, row: any, options?: {
|
|
1460
|
+
singleRecord?: boolean;
|
|
1461
|
+
_db?: Knex;
|
|
1462
|
+
}, visitedEntities?: Set<string>): Promise<FixtureRecord[]>;
|
|
1463
|
+
insertFixtures(dbName: keyof SonamuDBConfig, _fixtures: FixtureRecord[]): Promise<FixtureImportResult[]>;
|
|
1457
1464
|
private getInsertionOrder;
|
|
1458
1465
|
private prepareInsertData;
|
|
1459
1466
|
private buildDependencyGraph;
|
|
1460
1467
|
private insertFixture;
|
|
1461
1468
|
private handleManyToManyRelations;
|
|
1462
1469
|
addFixtureLoader(code: string): Promise<void>;
|
|
1470
|
+
private checkUniqueViolation;
|
|
1463
1471
|
}
|
|
1464
1472
|
declare const FixtureManager: FixtureManagerClass;
|
|
1465
1473
|
|
package/dist/index.js
CHANGED
|
@@ -80,13 +80,13 @@
|
|
|
80
80
|
|
|
81
81
|
|
|
82
82
|
|
|
83
|
-
var
|
|
83
|
+
var _chunk4EET56IEjs = require('./chunk-4EET56IE.js');
|
|
84
84
|
|
|
85
85
|
// src/exceptions/error-handler.ts
|
|
86
86
|
function setupErrorHandler(server) {
|
|
87
87
|
server.setErrorHandler((error, request, reply) => {
|
|
88
88
|
_nullishCoalesce(error.statusCode, () => ( (error.statusCode = 400)));
|
|
89
|
-
if (
|
|
89
|
+
if (_chunk4EET56IEjs.isSoException.call(void 0, error) && error.payload && Array.isArray(error.payload)) {
|
|
90
90
|
const issues = error.payload;
|
|
91
91
|
const [issue] = issues;
|
|
92
92
|
const message = `${issue.message} (${issue.path.join("/")})`;
|
|
@@ -423,5 +423,5 @@ function unique(columns) {
|
|
|
423
423
|
|
|
424
424
|
|
|
425
425
|
|
|
426
|
-
exports.AlreadyProcessedException =
|
|
426
|
+
exports.AlreadyProcessedException = _chunk4EET56IEjs.AlreadyProcessedException; exports.ApiParamType = _chunk4EET56IEjs.ApiParamType; exports.BadRequestException = _chunk4EET56IEjs.BadRequestException; exports.BaseModel = _chunk4EET56IEjs.BaseModel; exports.BaseModelClass = _chunk4EET56IEjs.BaseModelClass; exports.DB = _chunk4EET56IEjs.DB; exports.DuplicateRowException = _chunk4EET56IEjs.DuplicateRowException; exports.Entity = _chunk4EET56IEjs.Entity; exports.EntityManager = _chunk4EET56IEjs.EntityManager; exports.FixtureManager = _chunk4EET56IEjs.FixtureManager; exports.FixtureManagerClass = _chunk4EET56IEjs.FixtureManagerClass; exports.GenerateOptions = _chunk4EET56IEjs.GenerateOptions; exports.InternalServerErrorException = _chunk4EET56IEjs.InternalServerErrorException; exports.Migrator = _chunk4EET56IEjs.Migrator; exports.NotFoundException = _chunk4EET56IEjs.NotFoundException; exports.PathAndCode = _chunk4EET56IEjs.PathAndCode; exports.RenderingNode = _chunk4EET56IEjs.RenderingNode; exports.SQLDateTimeString = _chunk4EET56IEjs.SQLDateTimeString; exports.ServiceUnavailableException = _chunk4EET56IEjs.ServiceUnavailableException; exports.SoException = _chunk4EET56IEjs.SoException; exports.Sonamu = _chunk4EET56IEjs.Sonamu; exports.SonamuQueryMode = _chunk4EET56IEjs.SonamuQueryMode; exports.Syncer = _chunk4EET56IEjs.Syncer; exports.TargetNotFoundException = _chunk4EET56IEjs.TargetNotFoundException; exports.TemplateKey = _chunk4EET56IEjs.TemplateKey; exports.TemplateOptions = _chunk4EET56IEjs.TemplateOptions; exports.UnauthorizedException = _chunk4EET56IEjs.UnauthorizedException; exports.UpsertBuilder = _chunk4EET56IEjs.UpsertBuilder; exports.api = _chunk4EET56IEjs.api; exports.apiParamToTsCode = _chunk4EET56IEjs.apiParamToTsCode; exports.apiParamTypeToTsType = _chunk4EET56IEjs.apiParamTypeToTsType; exports.asArray = asArray; exports.findApiRootPath = _chunk4EET56IEjs.findApiRootPath; exports.findAppRootPath = _chunk4EET56IEjs.findAppRootPath; exports.getTextTypeLength = _chunk4EET56IEjs.getTextTypeLength; exports.getZodObjectFromApi = _chunk4EET56IEjs.getZodObjectFromApi; exports.getZodObjectFromApiParams = _chunk4EET56IEjs.getZodObjectFromApiParams; exports.getZodTypeFromApiParamType = _chunk4EET56IEjs.getZodTypeFromApiParamType; exports.globAsync = _chunk4EET56IEjs.globAsync; exports.i = i; exports.importMultiple = _chunk4EET56IEjs.importMultiple; exports.isBelongsToOneRelationProp = _chunk4EET56IEjs.isBelongsToOneRelationProp; exports.isBigIntegerProp = _chunk4EET56IEjs.isBigIntegerProp; exports.isBooleanProp = _chunk4EET56IEjs.isBooleanProp; exports.isCustomJoinClause = _chunk4EET56IEjs.isCustomJoinClause; exports.isDaemonServer = _chunk4EET56IEjs.isDaemonServer; exports.isDateProp = _chunk4EET56IEjs.isDateProp; exports.isDateTimeProp = _chunk4EET56IEjs.isDateTimeProp; exports.isDecimalProp = _chunk4EET56IEjs.isDecimalProp; exports.isDevelopment = _chunk4EET56IEjs.isDevelopment; exports.isDoubleProp = _chunk4EET56IEjs.isDoubleProp; exports.isEnumProp = _chunk4EET56IEjs.isEnumProp; exports.isFloatProp = _chunk4EET56IEjs.isFloatProp; exports.isHasManyRelationProp = _chunk4EET56IEjs.isHasManyRelationProp; exports.isInDocker = _chunk4EET56IEjs.isInDocker; exports.isIntegerProp = _chunk4EET56IEjs.isIntegerProp; exports.isJsonProp = _chunk4EET56IEjs.isJsonProp; exports.isKnexError = _chunk4EET56IEjs.isKnexError; exports.isLocal = _chunk4EET56IEjs.isLocal; exports.isManyToManyRelationProp = _chunk4EET56IEjs.isManyToManyRelationProp; exports.isOneToOneRelationProp = _chunk4EET56IEjs.isOneToOneRelationProp; exports.isProduction = _chunk4EET56IEjs.isProduction; exports.isRefField = _chunk4EET56IEjs.isRefField; exports.isRelationProp = _chunk4EET56IEjs.isRelationProp; exports.isRemote = _chunk4EET56IEjs.isRemote; exports.isSoException = _chunk4EET56IEjs.isSoException; exports.isStaging = _chunk4EET56IEjs.isStaging; exports.isStringProp = _chunk4EET56IEjs.isStringProp; exports.isTest = _chunk4EET56IEjs.isTest; exports.isTextProp = _chunk4EET56IEjs.isTextProp; exports.isTimeProp = _chunk4EET56IEjs.isTimeProp; exports.isTimestampProp = _chunk4EET56IEjs.isTimestampProp; exports.isUuidProp = _chunk4EET56IEjs.isUuidProp; exports.isVirtualProp = _chunk4EET56IEjs.isVirtualProp; exports.nonNullable = _chunk4EET56IEjs.nonNullable; exports.objToMap = objToMap; exports.p = p; exports.propNodeToZodTypeDef = _chunk4EET56IEjs.propNodeToZodTypeDef; exports.propToZodTypeDef = _chunk4EET56IEjs.propToZodTypeDef; exports.registeredApis = _chunk4EET56IEjs.registeredApis; exports.serializeZodType = _chunk4EET56IEjs.serializeZodType; exports.setupErrorHandler = setupErrorHandler; exports.unwrapPromiseOnce = _chunk4EET56IEjs.unwrapPromiseOnce; exports.zArrayable = _chunk4EET56IEjs.zArrayable; exports.zodTypeToTsTypeDef = _chunk4EET56IEjs.zodTypeToTsTypeDef; exports.zodTypeToZodCode = _chunk4EET56IEjs.zodTypeToZodCode;
|
|
427
427
|
//# sourceMappingURL=index.js.map
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
const require = (await import('module')).createRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
AlreadyProcessedException,
|
|
4
|
+
ApiParamType,
|
|
5
|
+
BadRequestException,
|
|
6
|
+
BaseModel,
|
|
7
|
+
BaseModelClass,
|
|
8
|
+
DB,
|
|
9
|
+
DuplicateRowException,
|
|
10
|
+
Entity,
|
|
11
|
+
EntityManager,
|
|
12
|
+
FixtureManager,
|
|
13
|
+
FixtureManagerClass,
|
|
14
|
+
GenerateOptions,
|
|
15
|
+
InternalServerErrorException,
|
|
16
|
+
Migrator,
|
|
17
|
+
NotFoundException,
|
|
18
|
+
PathAndCode,
|
|
19
|
+
RenderingNode,
|
|
20
|
+
SQLDateTimeString,
|
|
21
|
+
ServiceUnavailableException,
|
|
22
|
+
SoException,
|
|
23
|
+
Sonamu,
|
|
24
|
+
SonamuQueryMode,
|
|
25
|
+
Syncer,
|
|
26
|
+
TargetNotFoundException,
|
|
27
|
+
TemplateKey,
|
|
28
|
+
TemplateOptions,
|
|
29
|
+
UnauthorizedException,
|
|
30
|
+
UpsertBuilder,
|
|
31
|
+
api,
|
|
32
|
+
apiParamToTsCode,
|
|
33
|
+
apiParamTypeToTsType,
|
|
34
|
+
findApiRootPath,
|
|
35
|
+
findAppRootPath,
|
|
36
|
+
getTextTypeLength,
|
|
37
|
+
getZodObjectFromApi,
|
|
38
|
+
getZodObjectFromApiParams,
|
|
39
|
+
getZodTypeFromApiParamType,
|
|
40
|
+
globAsync,
|
|
41
|
+
importMultiple,
|
|
42
|
+
isBelongsToOneRelationProp,
|
|
43
|
+
isBigIntegerProp,
|
|
44
|
+
isBooleanProp,
|
|
45
|
+
isCustomJoinClause,
|
|
46
|
+
isDaemonServer,
|
|
47
|
+
isDateProp,
|
|
48
|
+
isDateTimeProp,
|
|
49
|
+
isDecimalProp,
|
|
50
|
+
isDevelopment,
|
|
51
|
+
isDoubleProp,
|
|
52
|
+
isEnumProp,
|
|
53
|
+
isFloatProp,
|
|
54
|
+
isHasManyRelationProp,
|
|
55
|
+
isInDocker,
|
|
56
|
+
isIntegerProp,
|
|
57
|
+
isJsonProp,
|
|
58
|
+
isKnexError,
|
|
59
|
+
isLocal,
|
|
60
|
+
isManyToManyRelationProp,
|
|
61
|
+
isOneToOneRelationProp,
|
|
62
|
+
isProduction,
|
|
63
|
+
isRefField,
|
|
64
|
+
isRelationProp,
|
|
65
|
+
isRemote,
|
|
66
|
+
isSoException,
|
|
67
|
+
isStaging,
|
|
68
|
+
isStringProp,
|
|
69
|
+
isTest,
|
|
70
|
+
isTextProp,
|
|
71
|
+
isTimeProp,
|
|
72
|
+
isTimestampProp,
|
|
73
|
+
isUuidProp,
|
|
74
|
+
isVirtualProp,
|
|
75
|
+
nonNullable,
|
|
76
|
+
propNodeToZodTypeDef,
|
|
77
|
+
propToZodTypeDef,
|
|
78
|
+
registeredApis,
|
|
79
|
+
serializeZodType,
|
|
80
|
+
unwrapPromiseOnce,
|
|
81
|
+
zArrayable,
|
|
82
|
+
zodTypeToTsTypeDef,
|
|
83
|
+
zodTypeToZodCode
|
|
84
|
+
} from "./chunk-HEPO4HGK.mjs";
|
|
85
|
+
import "./chunk-JXJTFHF7.mjs";
|
|
86
|
+
|
|
87
|
+
// src/exceptions/error-handler.ts
|
|
88
|
+
function setupErrorHandler(server) {
|
|
89
|
+
server.setErrorHandler((error, request, reply) => {
|
|
90
|
+
error.statusCode ?? (error.statusCode = 400);
|
|
91
|
+
if (isSoException(error) && error.payload && Array.isArray(error.payload)) {
|
|
92
|
+
const issues = error.payload;
|
|
93
|
+
const [issue] = issues;
|
|
94
|
+
const message = `${issue.message} (${issue.path.join("/")})`;
|
|
95
|
+
request.log.error(`${error.statusCode} ${message}`);
|
|
96
|
+
reply.status(error.statusCode <= 501 ? error.statusCode : 501).send({
|
|
97
|
+
name: error.name,
|
|
98
|
+
code: error.code,
|
|
99
|
+
message,
|
|
100
|
+
validationErrors: error.validation,
|
|
101
|
+
issues
|
|
102
|
+
});
|
|
103
|
+
} else {
|
|
104
|
+
request.log.error(`${error.statusCode} ${error.message}`);
|
|
105
|
+
reply.status(error.statusCode <= 501 ? error.statusCode : 501).send({
|
|
106
|
+
name: error.name,
|
|
107
|
+
code: error.code,
|
|
108
|
+
message: error.message,
|
|
109
|
+
validationErrors: error.validation
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// src/entity/entity-utils.ts
|
|
116
|
+
import inflection from "inflection";
|
|
117
|
+
|
|
118
|
+
// src/utils/model.ts
|
|
119
|
+
function asArray(param) {
|
|
120
|
+
if (Array.isArray(param)) {
|
|
121
|
+
return param;
|
|
122
|
+
} else {
|
|
123
|
+
return [param];
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function objToMap(obj) {
|
|
127
|
+
const keys = Object.keys(obj);
|
|
128
|
+
if (keys.every((key) => parseInt(key).toString() === key)) {
|
|
129
|
+
return new Map(keys.map((key) => [parseInt(key), obj[key]]));
|
|
130
|
+
} else {
|
|
131
|
+
return new Map(Object.entries(obj));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// src/entity/entity-utils.ts
|
|
136
|
+
var p = {
|
|
137
|
+
integer,
|
|
138
|
+
bigInteger,
|
|
139
|
+
text,
|
|
140
|
+
string,
|
|
141
|
+
float,
|
|
142
|
+
double,
|
|
143
|
+
decimal,
|
|
144
|
+
boolean,
|
|
145
|
+
date,
|
|
146
|
+
dateTime,
|
|
147
|
+
time,
|
|
148
|
+
timestamp,
|
|
149
|
+
json,
|
|
150
|
+
uuid,
|
|
151
|
+
enums,
|
|
152
|
+
virtual,
|
|
153
|
+
relationOneToOne,
|
|
154
|
+
relationBelongsToOne,
|
|
155
|
+
relationHasMany,
|
|
156
|
+
relationManyToMany
|
|
157
|
+
};
|
|
158
|
+
function integer(name, option) {
|
|
159
|
+
return {
|
|
160
|
+
name,
|
|
161
|
+
type: "integer",
|
|
162
|
+
...option
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
function bigInteger(name, option) {
|
|
166
|
+
return {
|
|
167
|
+
name,
|
|
168
|
+
type: "bigInteger",
|
|
169
|
+
...option
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function text(name, option) {
|
|
173
|
+
return {
|
|
174
|
+
name,
|
|
175
|
+
type: "text",
|
|
176
|
+
...option
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
function string(name, option) {
|
|
180
|
+
return {
|
|
181
|
+
name,
|
|
182
|
+
type: "string",
|
|
183
|
+
...option
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
function float(name, option) {
|
|
187
|
+
return {
|
|
188
|
+
name,
|
|
189
|
+
type: "float",
|
|
190
|
+
precision: 8,
|
|
191
|
+
scale: 2,
|
|
192
|
+
...option
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
function double(name, option) {
|
|
196
|
+
return {
|
|
197
|
+
name,
|
|
198
|
+
type: "double",
|
|
199
|
+
precision: 8,
|
|
200
|
+
scale: 2,
|
|
201
|
+
...option
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
function decimal(name, option) {
|
|
205
|
+
return {
|
|
206
|
+
name,
|
|
207
|
+
type: "decimal",
|
|
208
|
+
precision: 8,
|
|
209
|
+
scale: 2,
|
|
210
|
+
...option
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
function boolean(name, option) {
|
|
214
|
+
return {
|
|
215
|
+
name,
|
|
216
|
+
type: "boolean",
|
|
217
|
+
...option
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
function date(name, option) {
|
|
221
|
+
if (option?.now === true) {
|
|
222
|
+
delete option.now;
|
|
223
|
+
option.dbDefault = "CURRENT_TIMESTAMP";
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
name,
|
|
227
|
+
type: "date",
|
|
228
|
+
...option
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
function dateTime(name, option) {
|
|
232
|
+
if (option?.now === true) {
|
|
233
|
+
delete option.now;
|
|
234
|
+
option.dbDefault = "CURRENT_TIMESTAMP";
|
|
235
|
+
}
|
|
236
|
+
return {
|
|
237
|
+
name,
|
|
238
|
+
type: "dateTime",
|
|
239
|
+
...option
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
function time(name, option) {
|
|
243
|
+
if (option?.now === true) {
|
|
244
|
+
delete option.now;
|
|
245
|
+
option.dbDefault = "CURRENT_TIMESTAMP";
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
name,
|
|
249
|
+
type: "time",
|
|
250
|
+
...option
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
function timestamp(name, option) {
|
|
254
|
+
if (option?.now === true) {
|
|
255
|
+
delete option.now;
|
|
256
|
+
option.dbDefault = "CURRENT_TIMESTAMP";
|
|
257
|
+
}
|
|
258
|
+
return {
|
|
259
|
+
name,
|
|
260
|
+
type: "timestamp",
|
|
261
|
+
...option
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
function json(name, option) {
|
|
265
|
+
return {
|
|
266
|
+
name,
|
|
267
|
+
type: "json",
|
|
268
|
+
...option
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
function uuid(name, option) {
|
|
272
|
+
return {
|
|
273
|
+
name,
|
|
274
|
+
type: "uuid",
|
|
275
|
+
...option
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
function enums(name, option) {
|
|
279
|
+
return {
|
|
280
|
+
name,
|
|
281
|
+
type: "enum",
|
|
282
|
+
id: option.id ?? `$Model${inflection.camelize(name)}`,
|
|
283
|
+
...option
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
function virtual(name, option) {
|
|
287
|
+
return {
|
|
288
|
+
name,
|
|
289
|
+
type: "virtual",
|
|
290
|
+
...option
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
function relationOneToOne(name, option) {
|
|
294
|
+
return {
|
|
295
|
+
name,
|
|
296
|
+
type: "relation",
|
|
297
|
+
relationType: "OneToOne",
|
|
298
|
+
...option
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
function relationBelongsToOne(name, option) {
|
|
302
|
+
return {
|
|
303
|
+
name,
|
|
304
|
+
type: "relation",
|
|
305
|
+
relationType: "BelongsToOne",
|
|
306
|
+
...option
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
function relationHasMany(name, option) {
|
|
310
|
+
return {
|
|
311
|
+
name,
|
|
312
|
+
type: "relation",
|
|
313
|
+
relationType: "HasMany",
|
|
314
|
+
...option
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
function relationManyToMany(name, option) {
|
|
318
|
+
return {
|
|
319
|
+
name,
|
|
320
|
+
type: "relation",
|
|
321
|
+
relationType: "ManyToMany",
|
|
322
|
+
...option
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
var i = {
|
|
326
|
+
index,
|
|
327
|
+
unique
|
|
328
|
+
};
|
|
329
|
+
function index(columns) {
|
|
330
|
+
return {
|
|
331
|
+
type: "index",
|
|
332
|
+
columns: asArray(columns)
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
function unique(columns) {
|
|
336
|
+
return {
|
|
337
|
+
type: "unique",
|
|
338
|
+
columns: asArray(columns)
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
export {
|
|
342
|
+
AlreadyProcessedException,
|
|
343
|
+
ApiParamType,
|
|
344
|
+
BadRequestException,
|
|
345
|
+
BaseModel,
|
|
346
|
+
BaseModelClass,
|
|
347
|
+
DB,
|
|
348
|
+
DuplicateRowException,
|
|
349
|
+
Entity,
|
|
350
|
+
EntityManager,
|
|
351
|
+
FixtureManager,
|
|
352
|
+
FixtureManagerClass,
|
|
353
|
+
GenerateOptions,
|
|
354
|
+
InternalServerErrorException,
|
|
355
|
+
Migrator,
|
|
356
|
+
NotFoundException,
|
|
357
|
+
PathAndCode,
|
|
358
|
+
RenderingNode,
|
|
359
|
+
SQLDateTimeString,
|
|
360
|
+
ServiceUnavailableException,
|
|
361
|
+
SoException,
|
|
362
|
+
Sonamu,
|
|
363
|
+
SonamuQueryMode,
|
|
364
|
+
Syncer,
|
|
365
|
+
TargetNotFoundException,
|
|
366
|
+
TemplateKey,
|
|
367
|
+
TemplateOptions,
|
|
368
|
+
UnauthorizedException,
|
|
369
|
+
UpsertBuilder,
|
|
370
|
+
api,
|
|
371
|
+
apiParamToTsCode,
|
|
372
|
+
apiParamTypeToTsType,
|
|
373
|
+
asArray,
|
|
374
|
+
findApiRootPath,
|
|
375
|
+
findAppRootPath,
|
|
376
|
+
getTextTypeLength,
|
|
377
|
+
getZodObjectFromApi,
|
|
378
|
+
getZodObjectFromApiParams,
|
|
379
|
+
getZodTypeFromApiParamType,
|
|
380
|
+
globAsync,
|
|
381
|
+
i,
|
|
382
|
+
importMultiple,
|
|
383
|
+
isBelongsToOneRelationProp,
|
|
384
|
+
isBigIntegerProp,
|
|
385
|
+
isBooleanProp,
|
|
386
|
+
isCustomJoinClause,
|
|
387
|
+
isDaemonServer,
|
|
388
|
+
isDateProp,
|
|
389
|
+
isDateTimeProp,
|
|
390
|
+
isDecimalProp,
|
|
391
|
+
isDevelopment,
|
|
392
|
+
isDoubleProp,
|
|
393
|
+
isEnumProp,
|
|
394
|
+
isFloatProp,
|
|
395
|
+
isHasManyRelationProp,
|
|
396
|
+
isInDocker,
|
|
397
|
+
isIntegerProp,
|
|
398
|
+
isJsonProp,
|
|
399
|
+
isKnexError,
|
|
400
|
+
isLocal,
|
|
401
|
+
isManyToManyRelationProp,
|
|
402
|
+
isOneToOneRelationProp,
|
|
403
|
+
isProduction,
|
|
404
|
+
isRefField,
|
|
405
|
+
isRelationProp,
|
|
406
|
+
isRemote,
|
|
407
|
+
isSoException,
|
|
408
|
+
isStaging,
|
|
409
|
+
isStringProp,
|
|
410
|
+
isTest,
|
|
411
|
+
isTextProp,
|
|
412
|
+
isTimeProp,
|
|
413
|
+
isTimestampProp,
|
|
414
|
+
isUuidProp,
|
|
415
|
+
isVirtualProp,
|
|
416
|
+
nonNullable,
|
|
417
|
+
objToMap,
|
|
418
|
+
p,
|
|
419
|
+
propNodeToZodTypeDef,
|
|
420
|
+
propToZodTypeDef,
|
|
421
|
+
registeredApis,
|
|
422
|
+
serializeZodType,
|
|
423
|
+
setupErrorHandler,
|
|
424
|
+
unwrapPromiseOnce,
|
|
425
|
+
zArrayable,
|
|
426
|
+
zodTypeToTsTypeDef,
|
|
427
|
+
zodTypeToZodCode
|
|
428
|
+
};
|
|
429
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/exceptions/error-handler.ts","../src/entity/entity-utils.ts","../src/utils/model.ts"],"sourcesContent":["import { FastifyInstance } from \"fastify\";\nimport { ZodIssue } from \"zod\";\nimport { isSoException } from \"./so-exceptions\";\n\nexport function setupErrorHandler(server: FastifyInstance) {\n server.setErrorHandler((error, request, reply) => {\n error.statusCode ??= 400;\n\n if (isSoException(error) && error.payload && Array.isArray(error.payload)) {\n const issues = error.payload as ZodIssue[];\n const [issue] = issues;\n const message = `${issue.message} (${issue.path.join(\"/\")})`;\n\n request.log.error(`${error.statusCode} ${message}`);\n reply.status(error.statusCode <= 501 ? error.statusCode : 501).send({\n name: error.name,\n code: error.code,\n message: message,\n validationErrors: error.validation,\n issues,\n });\n } else {\n request.log.error(`${error.statusCode} ${error.message}`);\n reply.status(error.statusCode <= 501 ? error.statusCode : 501).send({\n name: error.name,\n code: error.code,\n message: error.message,\n validationErrors: error.validation,\n });\n }\n });\n}\n","import inflection from \"inflection\";\nimport {\n BelongsToOneRelationProp,\n BigIntegerProp,\n BooleanProp,\n DateProp,\n DateTimeProp,\n DecimalProp,\n DistributiveOmit,\n DoubleProp,\n EnumProp,\n FloatProp,\n HasManyRelationProp,\n IntegerProp,\n JsonProp,\n ManyToManyRelationProp,\n OneToOneRelationProp,\n EntityIndex,\n StringProp,\n TextProp,\n TimeProp,\n TimestampProp,\n UuidProp,\n VirtualProp,\n} from \"../types/types\";\nimport { asArray } from \"../utils/model\";\n\nexport const p = {\n integer,\n bigInteger,\n text,\n string,\n float,\n double,\n decimal,\n boolean,\n date,\n dateTime,\n time,\n timestamp,\n json,\n uuid,\n enums,\n virtual,\n relationOneToOne,\n relationBelongsToOne,\n relationHasMany,\n relationManyToMany,\n};\n\nfunction integer(\n name: string,\n option?: Omit<IntegerProp, \"name\" | \"type\">\n): IntegerProp {\n return {\n name,\n type: \"integer\",\n ...option,\n };\n}\nfunction bigInteger(\n name: string,\n option?: Omit<BigIntegerProp, \"name\" | \"type\">\n): BigIntegerProp {\n return {\n name,\n type: \"bigInteger\",\n ...option,\n };\n}\nfunction text(name: string, option: Omit<TextProp, \"name\" | \"type\">): TextProp {\n return {\n name,\n type: \"text\",\n ...option,\n };\n}\nfunction string(\n name: string,\n option: Omit<StringProp, \"name\" | \"type\">\n): StringProp {\n return {\n name,\n type: \"string\",\n ...option,\n };\n}\nfunction float(\n name: string,\n option?: Omit<FloatProp, \"name\" | \"type\">\n): FloatProp {\n return {\n name,\n type: \"float\",\n precision: 8,\n scale: 2,\n ...option,\n };\n}\nfunction double(\n name: string,\n option?: Omit<DoubleProp, \"name\" | \"type\">\n): DoubleProp {\n return {\n name,\n type: \"double\",\n precision: 8,\n scale: 2,\n ...option,\n };\n}\nfunction decimal(\n name: string,\n option?: Omit<DecimalProp, \"name\" | \"type\">\n): DecimalProp {\n return {\n name,\n type: \"decimal\",\n precision: 8,\n scale: 2,\n ...option,\n };\n}\nfunction boolean(\n name: string,\n option?: Omit<BooleanProp, \"name\" | \"type\">\n): BooleanProp {\n return {\n name,\n type: \"boolean\",\n ...option,\n };\n}\nfunction date(\n name: string,\n option?: Omit<DateProp, \"name\" | \"type\"> & { now?: true }\n): DateProp {\n if (option?.now === true) {\n delete option.now;\n option.dbDefault = \"CURRENT_TIMESTAMP\";\n }\n return {\n name,\n type: \"date\",\n ...option,\n };\n}\nfunction dateTime(\n name: string,\n option?: Omit<DateTimeProp, \"name\" | \"type\"> & { now?: true }\n): DateTimeProp {\n if (option?.now === true) {\n delete option.now;\n option.dbDefault = \"CURRENT_TIMESTAMP\";\n }\n return {\n name,\n type: \"dateTime\",\n ...option,\n };\n}\nfunction time(\n name: string,\n option?: Omit<TimeProp, \"name\" | \"type\"> & { now?: true }\n): TimeProp {\n if (option?.now === true) {\n delete option.now;\n option.dbDefault = \"CURRENT_TIMESTAMP\";\n }\n return {\n name,\n type: \"time\",\n ...option,\n };\n}\nfunction timestamp(\n name: string,\n option?: Omit<TimestampProp, \"name\" | \"type\"> & { now?: true }\n): TimestampProp {\n if (option?.now === true) {\n delete option.now;\n option.dbDefault = \"CURRENT_TIMESTAMP\";\n }\n return {\n name,\n type: \"timestamp\",\n ...option,\n };\n}\nfunction json(name: string, option: Omit<JsonProp, \"name\" | \"type\">): JsonProp {\n return {\n name,\n type: \"json\",\n ...option,\n };\n}\nfunction uuid(name: string, option: Omit<UuidProp, \"name\" | \"type\">): UuidProp {\n return {\n name,\n type: \"uuid\",\n ...option,\n };\n}\nfunction enums(\n name: string,\n option: Omit<EnumProp, \"name\" | \"type\" | \"id\"> & { id?: string }\n): EnumProp {\n return {\n name,\n type: \"enum\",\n id: option.id ?? `$Model${inflection.camelize(name)}`,\n ...option,\n };\n}\nfunction virtual(\n name: string,\n option: Omit<VirtualProp, \"name\" | \"type\" | \"dbDefault\" | \"toFilter\">\n): VirtualProp {\n return {\n name,\n type: \"virtual\",\n ...option,\n };\n}\nfunction relationOneToOne(\n name: string,\n option: DistributiveOmit<\n OneToOneRelationProp,\n \"name\" | \"type\" | \"relationType\"\n >\n): OneToOneRelationProp {\n return {\n name,\n type: \"relation\",\n relationType: \"OneToOne\",\n ...option,\n };\n}\nfunction relationBelongsToOne(\n name: string,\n option: Omit<BelongsToOneRelationProp, \"name\" | \"type\" | \"relationType\">\n): BelongsToOneRelationProp {\n return {\n name,\n type: \"relation\",\n relationType: \"BelongsToOne\",\n ...option,\n };\n}\nfunction relationHasMany(\n name: string,\n option: Omit<HasManyRelationProp, \"name\" | \"type\" | \"relationType\">\n): HasManyRelationProp {\n return {\n name,\n type: \"relation\",\n relationType: \"HasMany\",\n ...option,\n };\n}\nfunction relationManyToMany(\n name: string,\n option: Omit<ManyToManyRelationProp, \"name\" | \"type\" | \"relationType\">\n): ManyToManyRelationProp {\n return {\n name,\n type: \"relation\",\n relationType: \"ManyToMany\",\n ...option,\n };\n}\n\nexport const i = {\n index,\n unique,\n};\n\nfunction index(columns: string | string[]): EntityIndex {\n return {\n type: \"index\",\n columns: asArray(columns),\n };\n}\n\nfunction unique(columns: string | string[]): EntityIndex {\n return {\n type: \"unique\",\n columns: asArray(columns),\n };\n}\n","import _ from \"lodash\";\n\nexport type ListResult<T> = {\n rows: T[];\n total?: number;\n};\n\nexport type ArrayOr<T> = T | T[];\n\nexport function asArray<T>(param: T | T[]): T[] {\n if (Array.isArray(param)) {\n return param;\n } else {\n return [param as T] as T[];\n }\n}\n\nexport function objToMap<T>(obj: { [k: string]: T }) {\n const keys = Object.keys(obj);\n if (keys.every((key) => parseInt(key).toString() === key)) {\n return new Map<number, T>(keys.map((key) => [parseInt(key), obj[key]]));\n } else {\n return new Map<string, T>(Object.entries(obj));\n }\n}\n\nexport interface BaseListParams {\n id?: number | number[];\n num?: number;\n page?: number;\n keyword?: string;\n queryMode?: \"list\" | \"count\" | \"both\";\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,SAAS,kBAAkB,QAAyB;AACzD,SAAO,gBAAgB,CAAC,OAAO,SAAS,UAAU;AAChD,UAAM,eAAN,MAAM,aAAe;AAErB,QAAI,cAAc,KAAK,KAAK,MAAM,WAAW,MAAM,QAAQ,MAAM,OAAO,GAAG;AACzE,YAAM,SAAS,MAAM;AACrB,YAAM,CAAC,KAAK,IAAI;AAChB,YAAM,UAAU,GAAG,MAAM,OAAO,KAAK,MAAM,KAAK,KAAK,GAAG,CAAC;AAEzD,cAAQ,IAAI,MAAM,GAAG,MAAM,UAAU,IAAI,OAAO,EAAE;AAClD,YAAM,OAAO,MAAM,cAAc,MAAM,MAAM,aAAa,GAAG,EAAE,KAAK;AAAA,QAClE,MAAM,MAAM;AAAA,QACZ,MAAM,MAAM;AAAA,QACZ;AAAA,QACA,kBAAkB,MAAM;AAAA,QACxB;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,IAAI,MAAM,GAAG,MAAM,UAAU,IAAI,MAAM,OAAO,EAAE;AACxD,YAAM,OAAO,MAAM,cAAc,MAAM,MAAM,aAAa,GAAG,EAAE,KAAK;AAAA,QAClE,MAAM,MAAM;AAAA,QACZ,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,QACf,kBAAkB,MAAM;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;;;AC/BA,OAAO,gBAAgB;;;ACShB,SAAS,QAAW,OAAqB;AAC9C,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO;AAAA,EACT,OAAO;AACL,WAAO,CAAC,KAAU;AAAA,EACpB;AACF;AAEO,SAAS,SAAY,KAAyB;AACnD,QAAM,OAAO,OAAO,KAAK,GAAG;AAC5B,MAAI,KAAK,MAAM,CAAC,QAAQ,SAAS,GAAG,EAAE,SAAS,MAAM,GAAG,GAAG;AACzD,WAAO,IAAI,IAAe,KAAK,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;AAAA,EACxE,OAAO;AACL,WAAO,IAAI,IAAe,OAAO,QAAQ,GAAG,CAAC;AAAA,EAC/C;AACF;;;ADGO,IAAM,IAAI;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,QACP,MACA,QACa;AACb,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,GAAG;AAAA,EACL;AACF;AACA,SAAS,WACP,MACA,QACgB;AAChB,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,GAAG;AAAA,EACL;AACF;AACA,SAAS,KAAK,MAAc,QAAmD;AAC7E,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,GAAG;AAAA,EACL;AACF;AACA,SAAS,OACP,MACA,QACY;AACZ,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,GAAG;AAAA,EACL;AACF;AACA,SAAS,MACP,MACA,QACW;AACX,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,WAAW;AAAA,IACX,OAAO;AAAA,IACP,GAAG;AAAA,EACL;AACF;AACA,SAAS,OACP,MACA,QACY;AACZ,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,WAAW;AAAA,IACX,OAAO;AAAA,IACP,GAAG;AAAA,EACL;AACF;AACA,SAAS,QACP,MACA,QACa;AACb,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,WAAW;AAAA,IACX,OAAO;AAAA,IACP,GAAG;AAAA,EACL;AACF;AACA,SAAS,QACP,MACA,QACa;AACb,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,GAAG;AAAA,EACL;AACF;AACA,SAAS,KACP,MACA,QACU;AACV,MAAI,QAAQ,QAAQ,MAAM;AACxB,WAAO,OAAO;AACd,WAAO,YAAY;AAAA,EACrB;AACA,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,GAAG;AAAA,EACL;AACF;AACA,SAAS,SACP,MACA,QACc;AACd,MAAI,QAAQ,QAAQ,MAAM;AACxB,WAAO,OAAO;AACd,WAAO,YAAY;AAAA,EACrB;AACA,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,GAAG;AAAA,EACL;AACF;AACA,SAAS,KACP,MACA,QACU;AACV,MAAI,QAAQ,QAAQ,MAAM;AACxB,WAAO,OAAO;AACd,WAAO,YAAY;AAAA,EACrB;AACA,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,GAAG;AAAA,EACL;AACF;AACA,SAAS,UACP,MACA,QACe;AACf,MAAI,QAAQ,QAAQ,MAAM;AACxB,WAAO,OAAO;AACd,WAAO,YAAY;AAAA,EACrB;AACA,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,GAAG;AAAA,EACL;AACF;AACA,SAAS,KAAK,MAAc,QAAmD;AAC7E,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,GAAG;AAAA,EACL;AACF;AACA,SAAS,KAAK,MAAc,QAAmD;AAC7E,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,GAAG;AAAA,EACL;AACF;AACA,SAAS,MACP,MACA,QACU;AACV,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,IAAI,OAAO,MAAM,SAAS,WAAW,SAAS,IAAI,CAAC;AAAA,IACnD,GAAG;AAAA,EACL;AACF;AACA,SAAS,QACP,MACA,QACa;AACb,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,GAAG;AAAA,EACL;AACF;AACA,SAAS,iBACP,MACA,QAIsB;AACtB,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,GAAG;AAAA,EACL;AACF;AACA,SAAS,qBACP,MACA,QAC0B;AAC1B,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,GAAG;AAAA,EACL;AACF;AACA,SAAS,gBACP,MACA,QACqB;AACrB,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,GAAG;AAAA,EACL;AACF;AACA,SAAS,mBACP,MACA,QACwB;AACxB,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,GAAG;AAAA,EACL;AACF;AAEO,IAAM,IAAI;AAAA,EACf;AAAA,EACA;AACF;AAEA,SAAS,MAAM,SAAyC;AACtD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,QAAQ,OAAO;AAAA,EAC1B;AACF;AAEA,SAAS,OAAO,SAAyC;AACvD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,QAAQ,OAAO;AAAA,EAC1B;AACF;","names":[]}
|
package/package.json
CHANGED
package/src/api/sonamu.ts
CHANGED
|
@@ -185,10 +185,11 @@ class SonamuClass {
|
|
|
185
185
|
|
|
186
186
|
async withFastify(
|
|
187
187
|
server: FastifyInstance<Server, IncomingMessage, ServerResponse>,
|
|
188
|
-
config: SonamuFastifyConfig
|
|
188
|
+
config: SonamuFastifyConfig,
|
|
189
|
+
options?: { enableSync?: boolean; doSilent?: boolean }
|
|
189
190
|
) {
|
|
190
191
|
if (this.isInitialized === false) {
|
|
191
|
-
await this.init();
|
|
192
|
+
await this.init(options?.doSilent, options?.enableSync);
|
|
192
193
|
}
|
|
193
194
|
|
|
194
195
|
// 전체 라우팅 리스트
|
package/src/bin/cli-wrapper.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env ts-node
|
|
2
2
|
|
|
3
3
|
import { spawnSync } from "child_process";
|
|
4
|
-
import { resolve } from "path";
|
|
4
|
+
import { extname, resolve } from "path";
|
|
5
5
|
import { existsSync, readFileSync } from "fs";
|
|
6
6
|
|
|
7
7
|
const cjsPath = resolve(__dirname, "bin/cli.js");
|
|
@@ -9,10 +9,29 @@ const esmPath = resolve(__dirname, "bin/cli.mjs");
|
|
|
9
9
|
|
|
10
10
|
const isESM = () => {
|
|
11
11
|
const packageJsonPath = resolve(process.cwd(), "package.json");
|
|
12
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
13
|
+
|
|
14
|
+
// package.json에 "type": "module" 설정 확인
|
|
15
|
+
if (packageJson.type === "module") {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// 환경 변수에서 ESM 여부 확인
|
|
20
|
+
if (process.env.USE_ESM === "true") {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// package.json에 "type": "module" 설정
|
|
12
25
|
if (existsSync(packageJsonPath)) {
|
|
13
26
|
const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
14
27
|
return packageJson.type === "module";
|
|
15
28
|
}
|
|
29
|
+
|
|
30
|
+
// main 필드가 .mjs로 끝나는지 확인
|
|
31
|
+
if (packageJson.main && extname(packageJson.main) === ".mjs") {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
|
|
16
35
|
return false;
|
|
17
36
|
};
|
|
18
37
|
|
package/src/bin/cli.ts
CHANGED
|
@@ -166,9 +166,13 @@ async function fixture_init() {
|
|
|
166
166
|
console.log("DUMP...");
|
|
167
167
|
const dumpFilename = `/tmp/sonamu-fixture-init-${Date.now()}.sql`;
|
|
168
168
|
const srcConn = srcConfig.connection as Knex.ConnectionConfig;
|
|
169
|
+
const migrationsDump = `/tmp/sonamu-fixture-init-migrations-${Date.now()}.sql`;
|
|
169
170
|
execSync(
|
|
170
171
|
`mysqldump -h${srcConn.host} -u${srcConn.user} -p${srcConn.password} --single-transaction -d --no-create-db --triggers ${srcConn.database} > ${dumpFilename}`
|
|
171
172
|
);
|
|
173
|
+
execSync(
|
|
174
|
+
`mysqldump -h${srcConn.host} -u${srcConn.user} -p${srcConn.password} --single-transaction --no-create-db --triggers ${srcConn.database} knex_migrations knex_migrations_lock > ${migrationsDump}`
|
|
175
|
+
);
|
|
172
176
|
|
|
173
177
|
// 2. 대상DB 각각에 대하여 존재여부 확인 후 붓기
|
|
174
178
|
for await (const { label, config, toSkip } of targets) {
|
|
@@ -200,21 +204,7 @@ async function fixture_init() {
|
|
|
200
204
|
execSync(`${mysqlCmd} -e 'DROP DATABASE IF EXISTS \`${conn.database}\`'`);
|
|
201
205
|
execSync(`${mysqlCmd} -e 'CREATE DATABASE \`${conn.database}\`'`);
|
|
202
206
|
execSync(`${mysqlCmd} ${conn.database} < ${dumpFilename}`);
|
|
203
|
-
|
|
204
|
-
// 3. knex migration 정보 복사
|
|
205
|
-
await Promise.all(
|
|
206
|
-
["knex_migrations", "knex_migrations_lock"].map(async (tableName) => {
|
|
207
|
-
const [table] = await db.raw(
|
|
208
|
-
`SHOW TABLES FROM \`${srcConn.database}\` LIKE '${tableName}'`
|
|
209
|
-
);
|
|
210
|
-
if (table?.length) {
|
|
211
|
-
await db.raw(
|
|
212
|
-
`INSERT INTO \`${conn.database}\`.${tableName}
|
|
213
|
-
SELECT * FROM \`${srcConn.database}\`.${tableName}`
|
|
214
|
-
);
|
|
215
|
-
}
|
|
216
|
-
})
|
|
217
|
-
);
|
|
207
|
+
execSync(`${mysqlCmd} ${conn.database} < ${migrationsDump}`);
|
|
218
208
|
|
|
219
209
|
await db.destroy();
|
|
220
210
|
}
|