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/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): Promise<void>;
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, visitedEntities: Set<string>, records: FixtureRecord[], singleRecord?: boolean, _db?: Knex): Promise<void>;
1456
- insertFixtures(dbName: keyof SonamuDBConfig, fixtures: FixtureRecord[]): Promise<FixtureImportResult[]>;
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 _chunk76VBQWGEjs = require('./chunk-76VBQWGE.js');
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 (_chunk76VBQWGEjs.isSoException.call(void 0, error) && error.payload && Array.isArray(error.payload)) {
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 = _chunk76VBQWGEjs.AlreadyProcessedException; exports.ApiParamType = _chunk76VBQWGEjs.ApiParamType; exports.BadRequestException = _chunk76VBQWGEjs.BadRequestException; exports.BaseModel = _chunk76VBQWGEjs.BaseModel; exports.BaseModelClass = _chunk76VBQWGEjs.BaseModelClass; exports.DB = _chunk76VBQWGEjs.DB; exports.DuplicateRowException = _chunk76VBQWGEjs.DuplicateRowException; exports.Entity = _chunk76VBQWGEjs.Entity; exports.EntityManager = _chunk76VBQWGEjs.EntityManager; exports.FixtureManager = _chunk76VBQWGEjs.FixtureManager; exports.FixtureManagerClass = _chunk76VBQWGEjs.FixtureManagerClass; exports.GenerateOptions = _chunk76VBQWGEjs.GenerateOptions; exports.InternalServerErrorException = _chunk76VBQWGEjs.InternalServerErrorException; exports.Migrator = _chunk76VBQWGEjs.Migrator; exports.NotFoundException = _chunk76VBQWGEjs.NotFoundException; exports.PathAndCode = _chunk76VBQWGEjs.PathAndCode; exports.RenderingNode = _chunk76VBQWGEjs.RenderingNode; exports.SQLDateTimeString = _chunk76VBQWGEjs.SQLDateTimeString; exports.ServiceUnavailableException = _chunk76VBQWGEjs.ServiceUnavailableException; exports.SoException = _chunk76VBQWGEjs.SoException; exports.Sonamu = _chunk76VBQWGEjs.Sonamu; exports.SonamuQueryMode = _chunk76VBQWGEjs.SonamuQueryMode; exports.Syncer = _chunk76VBQWGEjs.Syncer; exports.TargetNotFoundException = _chunk76VBQWGEjs.TargetNotFoundException; exports.TemplateKey = _chunk76VBQWGEjs.TemplateKey; exports.TemplateOptions = _chunk76VBQWGEjs.TemplateOptions; exports.UnauthorizedException = _chunk76VBQWGEjs.UnauthorizedException; exports.UpsertBuilder = _chunk76VBQWGEjs.UpsertBuilder; exports.api = _chunk76VBQWGEjs.api; exports.apiParamToTsCode = _chunk76VBQWGEjs.apiParamToTsCode; exports.apiParamTypeToTsType = _chunk76VBQWGEjs.apiParamTypeToTsType; exports.asArray = asArray; exports.findApiRootPath = _chunk76VBQWGEjs.findApiRootPath; exports.findAppRootPath = _chunk76VBQWGEjs.findAppRootPath; exports.getTextTypeLength = _chunk76VBQWGEjs.getTextTypeLength; exports.getZodObjectFromApi = _chunk76VBQWGEjs.getZodObjectFromApi; exports.getZodObjectFromApiParams = _chunk76VBQWGEjs.getZodObjectFromApiParams; exports.getZodTypeFromApiParamType = _chunk76VBQWGEjs.getZodTypeFromApiParamType; exports.globAsync = _chunk76VBQWGEjs.globAsync; exports.i = i; exports.importMultiple = _chunk76VBQWGEjs.importMultiple; exports.isBelongsToOneRelationProp = _chunk76VBQWGEjs.isBelongsToOneRelationProp; exports.isBigIntegerProp = _chunk76VBQWGEjs.isBigIntegerProp; exports.isBooleanProp = _chunk76VBQWGEjs.isBooleanProp; exports.isCustomJoinClause = _chunk76VBQWGEjs.isCustomJoinClause; exports.isDaemonServer = _chunk76VBQWGEjs.isDaemonServer; exports.isDateProp = _chunk76VBQWGEjs.isDateProp; exports.isDateTimeProp = _chunk76VBQWGEjs.isDateTimeProp; exports.isDecimalProp = _chunk76VBQWGEjs.isDecimalProp; exports.isDevelopment = _chunk76VBQWGEjs.isDevelopment; exports.isDoubleProp = _chunk76VBQWGEjs.isDoubleProp; exports.isEnumProp = _chunk76VBQWGEjs.isEnumProp; exports.isFloatProp = _chunk76VBQWGEjs.isFloatProp; exports.isHasManyRelationProp = _chunk76VBQWGEjs.isHasManyRelationProp; exports.isInDocker = _chunk76VBQWGEjs.isInDocker; exports.isIntegerProp = _chunk76VBQWGEjs.isIntegerProp; exports.isJsonProp = _chunk76VBQWGEjs.isJsonProp; exports.isKnexError = _chunk76VBQWGEjs.isKnexError; exports.isLocal = _chunk76VBQWGEjs.isLocal; exports.isManyToManyRelationProp = _chunk76VBQWGEjs.isManyToManyRelationProp; exports.isOneToOneRelationProp = _chunk76VBQWGEjs.isOneToOneRelationProp; exports.isProduction = _chunk76VBQWGEjs.isProduction; exports.isRefField = _chunk76VBQWGEjs.isRefField; exports.isRelationProp = _chunk76VBQWGEjs.isRelationProp; exports.isRemote = _chunk76VBQWGEjs.isRemote; exports.isSoException = _chunk76VBQWGEjs.isSoException; exports.isStaging = _chunk76VBQWGEjs.isStaging; exports.isStringProp = _chunk76VBQWGEjs.isStringProp; exports.isTest = _chunk76VBQWGEjs.isTest; exports.isTextProp = _chunk76VBQWGEjs.isTextProp; exports.isTimeProp = _chunk76VBQWGEjs.isTimeProp; exports.isTimestampProp = _chunk76VBQWGEjs.isTimestampProp; exports.isUuidProp = _chunk76VBQWGEjs.isUuidProp; exports.isVirtualProp = _chunk76VBQWGEjs.isVirtualProp; exports.nonNullable = _chunk76VBQWGEjs.nonNullable; exports.objToMap = objToMap; exports.p = p; exports.propNodeToZodTypeDef = _chunk76VBQWGEjs.propNodeToZodTypeDef; exports.propToZodTypeDef = _chunk76VBQWGEjs.propToZodTypeDef; exports.registeredApis = _chunk76VBQWGEjs.registeredApis; exports.serializeZodType = _chunk76VBQWGEjs.serializeZodType; exports.setupErrorHandler = setupErrorHandler; exports.unwrapPromiseOnce = _chunk76VBQWGEjs.unwrapPromiseOnce; exports.zArrayable = _chunk76VBQWGEjs.zArrayable; exports.zodTypeToTsTypeDef = _chunk76VBQWGEjs.zodTypeToTsTypeDef; exports.zodTypeToZodCode = _chunk76VBQWGEjs.zodTypeToZodCode;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sonamu",
3
- "version": "0.2.48",
3
+ "version": "0.2.50",
4
4
  "description": "Sonamu — TypeScript Fullstack API Framework",
5
5
  "keywords": [
6
6
  "typescript",
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
  // 전체 라우팅 리스트
@@ -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
  }