sonamu 0.4.1 → 0.4.3

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 (35) hide show
  1. package/dist/bin/cli.js +51 -51
  2. package/dist/bin/cli.js.map +1 -1
  3. package/dist/bin/cli.mjs +2 -2
  4. package/dist/bin/cli.mjs.map +1 -1
  5. package/dist/{chunk-FLPD24HS.mjs → chunk-4K2F3SOM.mjs} +2 -2
  6. package/dist/{chunk-I2MMJRJN.mjs → chunk-HIUT56RE.mjs} +32 -15
  7. package/dist/chunk-HIUT56RE.mjs.map +1 -0
  8. package/dist/{chunk-QK5XXJUX.mjs → chunk-HVVCQLAU.mjs} +2 -2
  9. package/dist/{chunk-Z2P7XTXE.js → chunk-JBKIW5LD.js} +130 -113
  10. package/dist/chunk-JBKIW5LD.js.map +1 -0
  11. package/dist/{chunk-U636LQJJ.js → chunk-N6N3LENC.js} +4 -4
  12. package/dist/{chunk-W7KDVJLQ.js → chunk-UAG3SKFM.js} +7 -7
  13. package/dist/{chunk-XT6LHCX5.js → chunk-WJGRXAXE.js} +12 -4
  14. package/dist/chunk-WJGRXAXE.js.map +1 -0
  15. package/dist/{chunk-PP2PSSAG.mjs → chunk-ZFLQLW37.mjs} +12 -4
  16. package/dist/{chunk-PP2PSSAG.mjs.map → chunk-ZFLQLW37.mjs.map} +1 -1
  17. package/dist/database/drivers/knex/base-model.js +8 -8
  18. package/dist/database/drivers/knex/base-model.mjs +3 -3
  19. package/dist/database/drivers/kysely/base-model.js +9 -9
  20. package/dist/database/drivers/kysely/base-model.mjs +3 -3
  21. package/dist/index.d.mts +4 -3
  22. package/dist/index.d.ts +4 -3
  23. package/dist/index.js +7 -7
  24. package/dist/index.mjs +3 -3
  25. package/package.json +2 -2
  26. package/src/api/sonamu.ts +17 -4
  27. package/src/bin/cli.ts +1 -0
  28. package/src/entity/migrator.ts +51 -19
  29. package/dist/chunk-I2MMJRJN.mjs.map +0 -1
  30. package/dist/chunk-XT6LHCX5.js.map +0 -1
  31. package/dist/chunk-Z2P7XTXE.js.map +0 -1
  32. /package/dist/{chunk-FLPD24HS.mjs.map → chunk-4K2F3SOM.mjs.map} +0 -0
  33. /package/dist/{chunk-QK5XXJUX.mjs.map → chunk-HVVCQLAU.mjs.map} +0 -0
  34. /package/dist/{chunk-U636LQJJ.js.map → chunk-N6N3LENC.js.map} +0 -0
  35. /package/dist/{chunk-W7KDVJLQ.js.map → chunk-UAG3SKFM.js.map} +0 -0
package/dist/bin/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict"; function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } var _class; var _class2;
2
2
 
3
3
 
4
- var _chunkZ2P7XTXEjs = require('../chunk-Z2P7XTXE.js');
4
+ var _chunkJBKIW5LDjs = require('../chunk-JBKIW5LD.js');
5
5
 
6
6
 
7
7
 
@@ -15,7 +15,7 @@ var _chunkZ2P7XTXEjs = require('../chunk-Z2P7XTXE.js');
15
15
 
16
16
 
17
17
 
18
- var _chunkXT6LHCX5js = require('../chunk-XT6LHCX5.js');
18
+ var _chunkWJGRXAXEjs = require('../chunk-WJGRXAXE.js');
19
19
 
20
20
  // src/bin/cli.ts
21
21
  var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
@@ -69,7 +69,7 @@ var SMD = (_class = class {
69
69
  this.table = _nullishCoalesce(table, () => ( _inflection2.default.underscore(_inflection2.default.pluralize(id))));
70
70
  if (props) {
71
71
  this.props = props.map((prop) => {
72
- if (_chunkXT6LHCX5js.isEnumProp.call(void 0, prop)) {
72
+ if (_chunkWJGRXAXEjs.isEnumProp.call(void 0, prop)) {
73
73
  if (prop.id.includes("$Model")) {
74
74
  prop.id = prop.id.replace("$Model", id);
75
75
  }
@@ -82,7 +82,7 @@ var SMD = (_class = class {
82
82
  [prop.name]: prop
83
83
  };
84
84
  }, {});
85
- this.relations = props.filter((prop) => _chunkXT6LHCX5js.isRelationProp.call(void 0, prop)).reduce((result, prop) => {
85
+ this.relations = props.filter((prop) => _chunkWJGRXAXEjs.isRelationProp.call(void 0, prop)).reduce((result, prop) => {
86
86
  return {
87
87
  ...result,
88
88
  [prop.name]: prop
@@ -127,10 +127,10 @@ var SMD = (_class = class {
127
127
  const fields2 = subsetGroup[groupKey];
128
128
  if (groupKey === "") {
129
129
  const realFields = fields2.filter(
130
- (field) => !_chunkXT6LHCX5js.isVirtualProp.call(void 0, this.propsDict[field])
130
+ (field) => !_chunkWJGRXAXEjs.isVirtualProp.call(void 0, this.propsDict[field])
131
131
  );
132
132
  const virtualFields = fields2.filter(
133
- (field) => _chunkXT6LHCX5js.isVirtualProp.call(void 0, this.propsDict[field])
133
+ (field) => _chunkWJGRXAXEjs.isVirtualProp.call(void 0, this.propsDict[field])
134
134
  );
135
135
  if (prefix === "") {
136
136
  r.select = r.select.concat(
@@ -151,7 +151,7 @@ var SMD = (_class = class {
151
151
  throw new Error(`\uC874\uC7AC\uD558\uC9C0 \uC54A\uB294 relation \uCC38\uC870 ${groupKey}`);
152
152
  }
153
153
  const relSMD = SMDManager.get(relation.with);
154
- if (_chunkXT6LHCX5js.isOneToOneRelationProp.call(void 0, relation) || _chunkXT6LHCX5js.isBelongsToOneRelationProp.call(void 0, relation)) {
154
+ if (_chunkWJGRXAXEjs.isOneToOneRelationProp.call(void 0, relation) || _chunkWJGRXAXEjs.isBelongsToOneRelationProp.call(void 0, relation)) {
155
155
  const relFields = fields2.map(
156
156
  (field) => field.split(".").slice(1).join(".")
157
157
  );
@@ -169,7 +169,7 @@ var SMD = (_class = class {
169
169
  if (isAlreadyOuterJoined) {
170
170
  return "outer";
171
171
  }
172
- if (_chunkXT6LHCX5js.isOneToOneRelationProp.call(void 0, relation)) {
172
+ if (_chunkWJGRXAXEjs.isOneToOneRelationProp.call(void 0, relation)) {
173
173
  if (relation.hasJoinColumn === true && (_nullishCoalesce(relation.nullable, () => ( false))) === false) {
174
174
  return "inner";
175
175
  } else {
@@ -199,7 +199,7 @@ var SMD = (_class = class {
199
199
  };
200
200
  } else {
201
201
  let from, to;
202
- if (_chunkXT6LHCX5js.isOneToOneRelationProp.call(void 0, relation)) {
202
+ if (_chunkWJGRXAXEjs.isOneToOneRelationProp.call(void 0, relation)) {
203
203
  if (relation.hasJoinColumn) {
204
204
  from = `${fromTable}.${relation.name}_id`;
205
205
  to = `${joinAs}.id`;
@@ -238,13 +238,13 @@ var SMD = (_class = class {
238
238
  r.loaders = [...r.loaders, ...convertedLoaders];
239
239
  }
240
240
  r.joins = r.joins.concat(relSubsetQuery.joins);
241
- } else if (_chunkXT6LHCX5js.isHasManyRelationProp.call(void 0, relation) || _chunkXT6LHCX5js.isManyToManyRelationProp.call(void 0, relation)) {
241
+ } else if (_chunkWJGRXAXEjs.isHasManyRelationProp.call(void 0, relation) || _chunkWJGRXAXEjs.isManyToManyRelationProp.call(void 0, relation)) {
242
242
  const relFields = fields2.map(
243
243
  (field) => field.split(".").slice(1).join(".")
244
244
  );
245
245
  const relSubsetQuery = relSMD.resolveSubsetQuery("", relFields);
246
246
  let manyJoin;
247
- if (_chunkXT6LHCX5js.isHasManyRelationProp.call(void 0, relation)) {
247
+ if (_chunkWJGRXAXEjs.isHasManyRelationProp.call(void 0, relation)) {
248
248
  manyJoin = {
249
249
  fromTable: this.table,
250
250
  fromCol: "id",
@@ -252,7 +252,7 @@ var SMD = (_class = class {
252
252
  toTable: relSMD.table,
253
253
  toCol: relation.joinColumn
254
254
  };
255
- } else if (_chunkXT6LHCX5js.isManyToManyRelationProp.call(void 0, relation)) {
255
+ } else if (_chunkWJGRXAXEjs.isManyToManyRelationProp.call(void 0, relation)) {
256
256
  const [table1, table2] = relation.joinTable.split("__");
257
257
  manyJoin = {
258
258
  fromTable: this.table,
@@ -335,11 +335,11 @@ var SMD = (_class = class {
335
335
  });
336
336
  }
337
337
  const prop = smd.propsDict[key];
338
- if (!_chunkXT6LHCX5js.isRelationProp.call(void 0, prop)) {
338
+ if (!_chunkWJGRXAXEjs.isRelationProp.call(void 0, prop)) {
339
339
  throw new Error(`\uC798\uBABB\uB41C FieldExpr ${key}.${group[0]}`);
340
340
  }
341
341
  const relSMD = SMDManager.get(prop.with);
342
- if (_chunkXT6LHCX5js.isBelongsToOneRelationProp.call(void 0, prop) || _chunkXT6LHCX5js.isOneToOneRelationProp.call(void 0, prop)) {
342
+ if (_chunkWJGRXAXEjs.isBelongsToOneRelationProp.call(void 0, prop) || _chunkWJGRXAXEjs.isOneToOneRelationProp.call(void 0, prop)) {
343
343
  if (group.length == 1 && (group[0] === "id" || group[0] == "id?")) {
344
344
  const idProp = relSMD.propsDict.id;
345
345
  return {
@@ -354,7 +354,7 @@ var SMD = (_class = class {
354
354
  }
355
355
  }
356
356
  const children = this.fieldExprsToPropNodes(group, relSMD);
357
- const nodeType = _chunkXT6LHCX5js.isBelongsToOneRelationProp.call(void 0, prop) || _chunkXT6LHCX5js.isOneToOneRelationProp.call(void 0, prop) ? "object" : "array";
357
+ const nodeType = _chunkWJGRXAXEjs.isBelongsToOneRelationProp.call(void 0, prop) || _chunkWJGRXAXEjs.isOneToOneRelationProp.call(void 0, prop) ? "object" : "array";
358
358
  return {
359
359
  prop,
360
360
  children,
@@ -368,7 +368,7 @@ var SMD = (_class = class {
368
368
  if (propName === prefix) {
369
369
  return null;
370
370
  }
371
- if (_chunkXT6LHCX5js.isRelationProp.call(void 0, prop)) {
371
+ if (_chunkWJGRXAXEjs.isRelationProp.call(void 0, prop)) {
372
372
  if (maxDepth < 0) {
373
373
  return null;
374
374
  }
@@ -408,7 +408,7 @@ var SMD = (_class = class {
408
408
  }
409
409
  const typesModulePath = `${basePath}/${this.names.fs}.types`;
410
410
  const typesFileDistPath = _path2.default.join(
411
- _chunkXT6LHCX5js.Sonamu.apiRootPath,
411
+ _chunkWJGRXAXEjs.Sonamu.apiRootPath,
412
412
  `dist/application/${typesModulePath}.js`
413
413
  );
414
414
  if (_fsextra2.default.existsSync(typesFileDistPath)) {
@@ -425,7 +425,7 @@ var SMD = (_class = class {
425
425
  }
426
426
  const enumsModulePath = `${basePath}/${this.names.fs}.enums`;
427
427
  const enumsFileDistPath = _path2.default.join(
428
- _chunkXT6LHCX5js.Sonamu.apiRootPath,
428
+ _chunkWJGRXAXEjs.Sonamu.apiRootPath,
429
429
  `/dist/application/${enumsModulePath}.js`
430
430
  );
431
431
  if (_fsextra2.default.existsSync(enumsFileDistPath)) {
@@ -467,7 +467,7 @@ var SMDManagerClass = (_class2 = class {constructor() { _class2.prototype.__init
467
467
  return;
468
468
  }
469
469
  const pathPattern = _path2.default.join(
470
- _chunkXT6LHCX5js.Sonamu.apiRootPath,
470
+ _chunkWJGRXAXEjs.Sonamu.apiRootPath,
471
471
  "/dist/application/**/*.smd.js"
472
472
  );
473
473
  !doSilent && console.log(_chalk2.default.yellow(`autoload ${pathPattern}`));
@@ -562,14 +562,14 @@ console.log(_chalk2.default.bgBlue(`BEGIN ${/* @__PURE__ */ new Date()}`));
562
562
  _dotenv2.default.config();
563
563
  var migrator;
564
564
  async function bootstrap() {
565
- await _chunkXT6LHCX5js.Sonamu.init(false, false);
565
+ await _chunkWJGRXAXEjs.Sonamu.init(false, false);
566
566
  await _tsicli.tsicli.call(void 0, _process2.default.argv, {
567
567
  types: {
568
568
  "#entityId": {
569
569
  type: "autocomplete",
570
570
  name: "#entityId",
571
571
  message: "Please input #entityId",
572
- choices: _chunkXT6LHCX5js.EntityManager.getAllParentIds().map((entityId) => ({
572
+ choices: _chunkWJGRXAXEjs.EntityManager.getAllParentIds().map((entityId) => ({
573
573
  title: entityId,
574
574
  value: entityId
575
575
  }))
@@ -621,17 +621,17 @@ bootstrap().finally(async () => {
621
621
  if (migrator) {
622
622
  await migrator.destroy();
623
623
  }
624
- await _chunkZ2P7XTXEjs.FixtureManager.destory();
624
+ await _chunkJBKIW5LDjs.FixtureManager.destory();
625
625
  console.log(_chalk2.default.bgBlue(`END ${/* @__PURE__ */ new Date()}
626
626
  `));
627
627
  });
628
628
  async function setupMigrator() {
629
- migrator = new (0, _chunkZ2P7XTXEjs.Migrator)({
629
+ migrator = new (0, _chunkJBKIW5LDjs.Migrator)({
630
630
  mode: "dev"
631
631
  });
632
632
  }
633
633
  async function setupFixtureManager() {
634
- _chunkZ2P7XTXEjs.FixtureManager.init();
634
+ _chunkJBKIW5LDjs.FixtureManager.init();
635
635
  }
636
636
  async function migrate_run() {
637
637
  await setupMigrator();
@@ -661,7 +661,7 @@ async function migrate_reset() {
661
661
  await migrator.resetAll();
662
662
  }
663
663
  async function fixture_init() {
664
- const _db = _chunkXT6LHCX5js.DB.getClient("development_master");
664
+ const _db = _chunkWJGRXAXEjs.DB.getClient("development_master");
665
665
  const srcConn = _db.connectionInfo;
666
666
  const targets = [
667
667
  {
@@ -683,8 +683,8 @@ async function fixture_init() {
683
683
  _child_process.execSync.call(void 0,
684
684
  `mysqldump -h${srcConn.host} -P${srcConn.port} -u${srcConn.user} -p${srcConn.password} --single-transaction -d --no-create-db --triggers ${srcConn.database} > ${dumpFilename}`
685
685
  );
686
- const dbClient = _chunkXT6LHCX5js.DB.baseConfig.client;
687
- const migrationTable = _chunkXT6LHCX5js.DB.migrationTable;
686
+ const dbClient = _chunkWJGRXAXEjs.DB.baseConfig.client;
687
+ const migrationTable = _chunkWJGRXAXEjs.DB.migrationTable;
688
688
  const [migrations] = await _db.raw(
689
689
  "SELECT COUNT(*) as count FROM information_schema.tables WHERE table_schema = ? AND table_name = ?",
690
690
  [srcConn.database, migrationTable]
@@ -695,22 +695,22 @@ async function fixture_init() {
695
695
  );
696
696
  }
697
697
  for await (const { label, connKey } of targets) {
698
- const config = _chunkXT6LHCX5js.DB.connectionInfo[connKey];
698
+ const config = _chunkWJGRXAXEjs.DB.connectionInfo[connKey];
699
699
  if (label === "(LOCAL) Fixture DB" && targets.find(
700
- (t) => t.label === "(REMOTE) Fixture DB" && _chunkXT6LHCX5js.DB.connectionInfo[t.connKey].host === config.host && _chunkXT6LHCX5js.DB.connectionInfo[t.connKey].database === config.database
700
+ (t) => t.label === "(REMOTE) Fixture DB" && _chunkWJGRXAXEjs.DB.connectionInfo[t.connKey].host === config.host && _chunkWJGRXAXEjs.DB.connectionInfo[t.connKey].database === config.database
701
701
  )) {
702
702
  console.log(_chalk2.default.red(`${label}: Skipped!`));
703
703
  continue;
704
704
  }
705
705
  const db = (() => {
706
706
  if (dbClient === "knex") {
707
- const config2 = _lodash2.default.cloneDeep(_chunkXT6LHCX5js.DB.fullConfig[connKey]);
707
+ const config2 = _lodash2.default.cloneDeep(_chunkWJGRXAXEjs.DB.fullConfig[connKey]);
708
708
  config2.connection.database = void 0;
709
- return new (0, _chunkXT6LHCX5js.KnexClient)(config2);
709
+ return new (0, _chunkWJGRXAXEjs.KnexClient)(config2);
710
710
  } else {
711
- const config2 = _lodash2.default.cloneDeep(_chunkXT6LHCX5js.DB.fullConfig[connKey]);
711
+ const config2 = _lodash2.default.cloneDeep(_chunkWJGRXAXEjs.DB.fullConfig[connKey]);
712
712
  config2.database = void 0;
713
- return new (0, _chunkXT6LHCX5js.KyselyClient)(config2);
713
+ return new (0, _chunkWJGRXAXEjs.KyselyClient)(config2);
714
714
  }
715
715
  })();
716
716
  const [row] = await db.raw(`SHOW DATABASES LIKE "${config.database}"`);
@@ -734,15 +734,15 @@ async function fixture_init() {
734
734
  }
735
735
  async function fixture_import(entityId, recordIds) {
736
736
  await setupFixtureManager();
737
- await _chunkZ2P7XTXEjs.FixtureManager.importFixture(entityId, recordIds);
738
- await _chunkZ2P7XTXEjs.FixtureManager.sync();
737
+ await _chunkJBKIW5LDjs.FixtureManager.importFixture(entityId, recordIds);
738
+ await _chunkJBKIW5LDjs.FixtureManager.sync();
739
739
  }
740
740
  async function fixture_sync() {
741
741
  await setupFixtureManager();
742
- await _chunkZ2P7XTXEjs.FixtureManager.sync();
742
+ await _chunkJBKIW5LDjs.FixtureManager.sync();
743
743
  }
744
744
  async function stub_practice(name) {
745
- const practiceDir = _path2.default.join(_chunkXT6LHCX5js.Sonamu.apiRootPath, "src", "practices");
745
+ const practiceDir = _path2.default.join(_chunkWJGRXAXEjs.Sonamu.apiRootPath, "src", "practices");
746
746
  const fileNames = _fsextra2.default.readdirSync(practiceDir);
747
747
  const maxSeqNo = (() => {
748
748
  if (_fsextra2.default.existsSync(practiceDir) === false) {
@@ -785,22 +785,22 @@ async function stub_practice(name) {
785
785
  _child_process.execSync.call(void 0, `echo "${runCode}" | pbcopy`);
786
786
  }
787
787
  async function stub_entity(entityId) {
788
- await _chunkXT6LHCX5js.Sonamu.syncer.createEntity({ entityId });
788
+ await _chunkWJGRXAXEjs.Sonamu.syncer.createEntity({ entityId });
789
789
  }
790
790
  async function scaffold_model(entityId) {
791
- await _chunkXT6LHCX5js.Sonamu.syncer.generateTemplate("model", {
791
+ await _chunkWJGRXAXEjs.Sonamu.syncer.generateTemplate("model", {
792
792
  entityId
793
793
  });
794
794
  }
795
795
  async function scaffold_model_test(entityId) {
796
- await _chunkXT6LHCX5js.Sonamu.syncer.generateTemplate("model_test", {
796
+ await _chunkWJGRXAXEjs.Sonamu.syncer.generateTemplate("model_test", {
797
797
  entityId
798
798
  });
799
799
  }
800
800
  async function ui() {
801
801
  try {
802
802
  const sonamuUI = await Promise.resolve().then(() => _interopRequireWildcard(require("@sonamu-kit/ui")));
803
- sonamuUI.startServers(_chunkXT6LHCX5js.Sonamu.apiRootPath);
803
+ sonamuUI.startServers(_chunkWJGRXAXEjs.Sonamu.apiRootPath);
804
804
  } catch (e) {
805
805
  if (e instanceof Error && e.message.includes("isn't declared")) {
806
806
  console.log(`You need to install ${_chalk2.default.blue(`@sonamu-kit/ui`)} first.`);
@@ -839,7 +839,7 @@ async function smd_migration() {
839
839
  const parentNames = SMDManager.getNamesFromId(_nullishCoalesce(smd.parentId, () => ( smd.id)));
840
840
  const names = SMDManager.getNamesFromId(smd.id);
841
841
  const dstPath = _path2.default.join(
842
- _chunkXT6LHCX5js.Sonamu.apiRootPath,
842
+ _chunkWJGRXAXEjs.Sonamu.apiRootPath,
843
843
  "src",
844
844
  "application",
845
845
  parentNames.fs,
@@ -851,7 +851,7 @@ async function smd_migration() {
851
851
  _fsextra2.default.writeFileSync(dstPath, formatted);
852
852
  console.log(_chalk2.default.blue(`CREATED: ${dstPath}`));
853
853
  const srcSmdPath = _path2.default.join(
854
- _chunkXT6LHCX5js.Sonamu.apiRootPath,
854
+ _chunkWJGRXAXEjs.Sonamu.apiRootPath,
855
855
  "src",
856
856
  "application",
857
857
  parentNames.fs,
@@ -859,7 +859,7 @@ async function smd_migration() {
859
859
  );
860
860
  const dstSmdPath = srcSmdPath.replace("/src/", "/dist/").replace(/\.ts$/, ".js");
861
861
  const srcEnumsPath = _path2.default.join(
862
- _chunkXT6LHCX5js.Sonamu.apiRootPath,
862
+ _chunkWJGRXAXEjs.Sonamu.apiRootPath,
863
863
  "src",
864
864
  "application",
865
865
  parentNames.fs,
@@ -867,7 +867,7 @@ async function smd_migration() {
867
867
  );
868
868
  const dstEnumsPath = srcEnumsPath.replace("/src/", "/dist/").replace(/\.ts$/, ".js");
869
869
  const srcGeneratedPath = _path2.default.join(
870
- _chunkXT6LHCX5js.Sonamu.apiRootPath,
870
+ _chunkWJGRXAXEjs.Sonamu.apiRootPath,
871
871
  "src",
872
872
  "application",
873
873
  parentNames.fs,
@@ -879,8 +879,8 @@ async function smd_migration() {
879
879
  dstSmdPath,
880
880
  srcEnumsPath,
881
881
  dstEnumsPath,
882
- ..._chunkXT6LHCX5js.Sonamu.config.sync.targets.map(
883
- (target) => srcEnumsPath.replace(_chunkXT6LHCX5js.Sonamu.apiRootPath, _path2.default.join(_chunkXT6LHCX5js.Sonamu.appRootPath, target)).replace("/src/application/", "/src/services/")
882
+ ..._chunkWJGRXAXEjs.Sonamu.config.sync.targets.map(
883
+ (target) => srcEnumsPath.replace(_chunkWJGRXAXEjs.Sonamu.apiRootPath, _path2.default.join(_chunkWJGRXAXEjs.Sonamu.appRootPath, target)).replace("/src/application/", "/src/services/")
884
884
  ),
885
885
  srcGeneratedPath,
886
886
  dstGeneratedPath
@@ -894,11 +894,11 @@ async function smd_migration() {
894
894
  });
895
895
  }
896
896
  console.log("Entity\uB85C \uB2E4\uC2DC \uB85C\uB4DC\uD569\uB2C8\uB2E4.");
897
- _chunkXT6LHCX5js.EntityManager.isAutoloaded = false;
898
- await _chunkXT6LHCX5js.EntityManager.autoload();
899
- const entityIds = _chunkXT6LHCX5js.EntityManager.getAllParentIds();
897
+ _chunkWJGRXAXEjs.EntityManager.isAutoloaded = false;
898
+ await _chunkWJGRXAXEjs.EntityManager.autoload();
899
+ const entityIds = _chunkWJGRXAXEjs.EntityManager.getAllParentIds();
900
900
  for await (const entityId of entityIds) {
901
- await _chunkXT6LHCX5js.Sonamu.syncer.generateTemplate("generated", { entityId });
901
+ await _chunkWJGRXAXEjs.Sonamu.syncer.generateTemplate("generated", { entityId });
902
902
  }
903
903
  }
904
904
  //# sourceMappingURL=cli.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/bin/cli.ts","../../src/smd/smd-manager.ts","../../src/smd/smd.ts"],"names":["chalk","path","fs","inflection","_","fields","prop","config","fileName"],"mappings":"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","sourcesContent":["/* Global Begin */\nimport chalk from \"chalk\";\nconsole.log(chalk.bgBlue(`BEGIN ${new Date()}`));\n\nimport dotenv from \"dotenv\";\ndotenv.config();\n\nimport path from \"path\";\nimport { tsicli } from \"tsicli\";\nimport { execSync } from \"child_process\";\nimport fs from \"fs-extra\";\nimport inflection from \"inflection\";\nimport prettier from \"prettier\";\nimport process from \"process\";\nimport _ from \"lodash\";\nimport { Sonamu } from \"../api\";\nimport { EntityManager } from \"../entity/entity-manager\";\nimport { Migrator } from \"../entity/migrator\";\nimport { FixtureManager } from \"../testing/fixture-manager\";\nimport { SMDManager } from \"../smd/smd-manager\";\nimport { DB } from \"../database/db\";\nimport {\n KnexConfig,\n KyselyConfig,\n SonamuKnexDBConfig,\n SonamuKyselyDBConfig,\n} from \"../database/types\";\nimport { KnexClient } from \"../database/drivers/knex/client\";\nimport { KyselyClient } from \"../database/drivers/kysely/client\";\n\nlet migrator: Migrator;\n\nasync function bootstrap() {\n await Sonamu.init(false, false);\n\n await tsicli(process.argv, {\n types: {\n \"#entityId\": {\n type: \"autocomplete\",\n name: \"#entityId\",\n message: \"Please input #entityId\",\n choices: EntityManager.getAllParentIds().map((entityId) => ({\n title: entityId,\n value: entityId,\n })),\n },\n \"#recordIds\": \"number[]\",\n \"#name\": \"string\",\n },\n args: [\n [\"fixture\", \"init\"],\n [\"fixture\", \"import\", \"#entityId\", \"#recordIds\"],\n [\"fixture\", \"sync\"],\n [\"migrate\", \"run\"],\n [\"migrate\", \"check\"],\n [\"migrate\", \"rollback\"],\n [\"migrate\", \"reset\"],\n [\"migrate\", \"clear\"],\n [\"migrate\", \"status\"],\n [\"stub\", \"practice\", \"#name\"],\n [\"stub\", \"entity\", \"#name\"],\n [\"scaffold\", \"model\", \"#entityId\"],\n [\"scaffold\", \"model_test\", \"#entityId\"],\n [\"scaffold\", \"view_list\", \"#entityId\"],\n [\"scaffold\", \"view_form\", \"#entityId\"],\n [\"ui\"],\n [\"smd_migration\"],\n ],\n runners: {\n migrate_run,\n migrate_check,\n migrate_rollback,\n migrate_clear,\n migrate_reset,\n migrate_status,\n fixture_init,\n fixture_import,\n fixture_sync,\n stub_practice,\n stub_entity,\n scaffold_model,\n scaffold_model_test,\n ui,\n // scaffold_view_list,\n // scaffold_view_form,\n smd_migration,\n },\n });\n}\nbootstrap().finally(async () => {\n if (migrator) {\n await migrator.destroy();\n }\n await FixtureManager.destory();\n\n /* Global End */\n console.log(chalk.bgBlue(`END ${new Date()}\\n`));\n});\n\nasync function setupMigrator() {\n // migrator\n migrator = new Migrator({\n mode: \"dev\",\n });\n}\n\nasync function setupFixtureManager() {\n FixtureManager.init();\n}\n\nasync function migrate_run() {\n await setupMigrator();\n\n await migrator.cleanUpDist();\n await migrator.run();\n}\n\nasync function migrate_check() {\n await setupMigrator();\n\n await migrator.cleanUpDist();\n await migrator.check();\n}\n\nasync function migrate_status() {\n await setupMigrator();\n\n const status = await migrator.getStatus();\n console.log(status);\n}\n\nasync function migrate_rollback() {\n await setupMigrator();\n\n await migrator.rollback();\n}\n\nasync function migrate_clear() {\n await setupMigrator();\n\n await migrator.clearPendingList();\n}\n\nasync function migrate_reset() {\n await setupMigrator();\n\n await migrator.resetAll();\n}\n\nasync function fixture_init() {\n const _db = DB.getClient(\"development_master\");\n const srcConn = _db.connectionInfo;\n\n const targets = [\n {\n label: \"(REMOTE) Fixture DB\",\n connKey: \"fixture_remote\",\n },\n {\n label: \"(LOCAL) Fixture DB\",\n connKey: \"fixture_local\",\n },\n {\n label: \"(LOCAL) Testing DB\",\n connKey: \"test\",\n },\n ] as {\n label: string;\n connKey: keyof SonamuKnexDBConfig | keyof SonamuKyselyDBConfig;\n }[];\n\n // 1. 기준DB 스키마를 덤프\n console.log(\"DUMP...\");\n const dumpFilename = `/tmp/sonamu-fixture-init-${Date.now()}.sql`;\n const migrationsDump = `/tmp/sonamu-fixture-init-migrations-${Date.now()}.sql`;\n execSync(\n `mysqldump -h${srcConn.host} -P${srcConn.port} -u${srcConn.user} -p${srcConn.password} --single-transaction -d --no-create-db --triggers ${srcConn.database} > ${dumpFilename}`\n );\n\n // 2. 마이그레이션 테이블이 존재하면 덤프\n const dbClient = DB.baseConfig!.client;\n const migrationTable = DB.migrationTable;\n const [migrations] = await _db.raw<{ count: number }>(\n \"SELECT COUNT(*) as count FROM information_schema.tables WHERE table_schema = ? AND table_name = ?\",\n [srcConn.database, migrationTable]\n );\n if (migrations.count > 0) {\n execSync(\n `mysqldump -h${srcConn.host} -P${srcConn.port} -u${srcConn.user} -p${srcConn.password} --single-transaction --no-create-db --triggers ${srcConn.database} ${migrationTable} ${migrationTable}_lock > ${migrationsDump}`\n );\n }\n\n // 2. 대상DB 각각에 대하여 존재여부 확인 후 붓기\n for await (const { label, connKey } of targets) {\n const config = DB.connectionInfo[connKey];\n\n if (\n label === \"(LOCAL) Fixture DB\" &&\n targets.find(\n (t) =>\n t.label === \"(REMOTE) Fixture DB\" &&\n DB.connectionInfo[t.connKey].host === config.host &&\n DB.connectionInfo[t.connKey].database === config.database\n )\n ) {\n console.log(chalk.red(`${label}: Skipped!`));\n continue;\n }\n\n const db = (() => {\n if (dbClient === \"knex\") {\n const config = _.cloneDeep(DB.fullConfig[connKey]) as KnexConfig;\n config.connection.database = undefined;\n return new KnexClient(config);\n } else {\n const config = _.cloneDeep(DB.fullConfig[connKey]) as KyselyConfig;\n config.database = undefined;\n return new KyselyClient(config);\n }\n })();\n\n const [row] = await db.raw(`SHOW DATABASES LIKE \"${config.database}\"`);\n if (row) {\n console.log(\n chalk.yellow(`${label}: Database \"${config.database}\" Already exists`)\n );\n await db.destroy();\n continue;\n }\n\n console.log(`SYNC to ${label}...`);\n const mysqlCmd = `mysql -h${config.host} -P${srcConn.port} -u${config.user} -p${config.password}`;\n execSync(`${mysqlCmd} -e 'DROP DATABASE IF EXISTS \\`${config.database}\\`'`);\n execSync(`${mysqlCmd} -e 'CREATE DATABASE \\`${config.database}\\`'`);\n execSync(`${mysqlCmd} ${config.database} < ${dumpFilename}`);\n if (fs.existsSync(migrationsDump)) {\n execSync(`${mysqlCmd} ${config.database} < ${migrationsDump}`);\n }\n\n await db.destroy();\n }\n}\n\nasync function fixture_import(entityId: string, recordIds: number[]) {\n await setupFixtureManager();\n\n await FixtureManager.importFixture(entityId, recordIds);\n await FixtureManager.sync();\n}\n\nasync function fixture_sync() {\n await setupFixtureManager();\n\n await FixtureManager.sync();\n}\n\nasync function stub_practice(name: string) {\n const practiceDir = path.join(Sonamu.apiRootPath, \"src\", \"practices\");\n const fileNames = fs.readdirSync(practiceDir);\n\n const maxSeqNo = (() => {\n if (fs.existsSync(practiceDir) === false) {\n fs.mkdirSync(practiceDir, { recursive: true });\n }\n\n const filteredSeqs = fileNames\n .filter(\n (fileName) => fileName.startsWith(\"p\") && fileName.endsWith(\".ts\")\n )\n .map((fileName) => {\n const [, seqNo] = fileName.match(/^p([0-9]+)\\-/) ?? [\"0\", \"0\"];\n return parseInt(seqNo);\n })\n .sort((a, b) => b - a);\n\n if (filteredSeqs.length > 0) {\n return filteredSeqs[0];\n }\n\n return 0;\n })();\n\n const currentSeqNo = maxSeqNo + 1;\n const fileName = `p${currentSeqNo}-${name}.ts`;\n const dstPath = path.join(practiceDir, fileName);\n\n // FIXME\n const code = [\n `import { BaseModel } from \"sonamu\";`,\n \"\",\n `console.clear();`,\n `console.log(\"${fileName}\");`,\n \"\",\n `async function bootstrap() {`,\n ` // TODO`,\n `}`,\n `bootstrap().finally(async () => {`,\n `await BaseModel.destroy();`,\n `});`,\n ].join(\"\\n\");\n fs.writeFileSync(dstPath, code);\n\n execSync(`code ${dstPath}`);\n\n const runCode = `yarn node -r source-map-support/register dist/practices/${fileName.replace(\n \".ts\",\n \".js\"\n )}`;\n console.log(`${chalk.blue(runCode)} copied to clipboard.`);\n execSync(`echo \"${runCode}\" | pbcopy`);\n}\n\nasync function stub_entity(entityId: string) {\n await Sonamu.syncer.createEntity({ entityId });\n}\n\nasync function scaffold_model(entityId: string) {\n await Sonamu.syncer.generateTemplate(\"model\", {\n entityId,\n });\n}\n\nasync function scaffold_model_test(entityId: string) {\n await Sonamu.syncer.generateTemplate(\"model_test\", {\n entityId,\n });\n}\n\nasync function ui() {\n try {\n const sonamuUI: {\n startServers: (appRootPath: string) => void;\n } = await import(\"@sonamu-kit/ui\" as string);\n sonamuUI.startServers(Sonamu.apiRootPath);\n } catch (e: unknown) {\n if (e instanceof Error && e.message.includes(\"isn't declared\")) {\n console.log(`You need to install ${chalk.blue(`@sonamu-kit/ui`)} first.`);\n return;\n }\n throw e;\n }\n}\n\nasync function smd_migration() {\n await SMDManager.autoload();\n const smdIds = SMDManager.getAllIds();\n\n function enumLabelsToEntityEnums(\n entityId: string,\n enumLabels: {\n [enumName: string]: { [name: string]: { ko: string } };\n }\n ): { [enumName: string]: { [name: string]: string } } {\n return Object.fromEntries(\n Object.entries(enumLabels).map(([enumLabelName, enumLabel]) => {\n const enumName =\n entityId + inflection.camelize(enumLabelName.toLowerCase(), false);\n return [\n enumName,\n Object.fromEntries(\n Object.entries(enumLabel).map(([name, { ko }]) => [name, ko])\n ),\n ];\n })\n );\n }\n for await (const smdId of smdIds) {\n const smd = SMDManager.get(smdId);\n const entityJson = {\n id: smd.id,\n ...(smd.parentId && { parentId: smd.parentId }),\n title: smd.title,\n props: smd.props,\n indexes: smd.indexes,\n subsets: smd.subsets,\n enums: enumLabelsToEntityEnums(smd.id, smd.enumLabels),\n };\n\n const parentNames = SMDManager.getNamesFromId(smd.parentId ?? smd.id);\n const names = SMDManager.getNamesFromId(smd.id);\n const dstPath = path.join(\n Sonamu.apiRootPath,\n \"src\",\n \"application\",\n parentNames.fs,\n `${names.fs}.entity.json`\n );\n\n const formatted = await prettier.format(JSON.stringify(entityJson), {\n parser: \"json\",\n });\n fs.writeFileSync(dstPath, formatted);\n console.log(chalk.blue(`CREATED: ${dstPath}`));\n\n // smd.ts, enums.ts, genereated.ts 삭제 (트랜스파일 된 js파일도 삭제)\n const srcSmdPath = path.join(\n Sonamu.apiRootPath,\n \"src\",\n \"application\",\n parentNames.fs,\n `${names.fs}.smd.ts`\n );\n const dstSmdPath = srcSmdPath\n .replace(\"/src/\", \"/dist/\")\n .replace(/\\.ts$/, \".js\");\n const srcEnumsPath = path.join(\n Sonamu.apiRootPath,\n \"src\",\n \"application\",\n parentNames.fs,\n `${names.fs}.enums.ts`\n );\n const dstEnumsPath = srcEnumsPath\n .replace(\"/src/\", \"/dist/\")\n .replace(/\\.ts$/, \".js\");\n const srcGeneratedPath = path.join(\n Sonamu.apiRootPath,\n \"src\",\n \"application\",\n parentNames.fs,\n `${names.fs}.generated.ts`\n );\n const dstGeneratedPath = srcGeneratedPath\n .replace(\"/src/\", \"/dist/\")\n .replace(/\\.ts$/, \".js\");\n\n [\n srcSmdPath,\n dstSmdPath,\n srcEnumsPath,\n dstEnumsPath,\n ...Sonamu.config.sync.targets.map((target) =>\n srcEnumsPath\n .replace(Sonamu.apiRootPath, path.join(Sonamu.appRootPath, target))\n .replace(\"/src/application/\", \"/src/services/\")\n ),\n srcGeneratedPath,\n dstGeneratedPath,\n ].map((p) => {\n if (fs.existsSync(p) === false) {\n console.log(chalk.yellow(`NOT FOUND: ${p}`));\n return;\n }\n fs.unlinkSync(p);\n console.log(chalk.red(`DELETED: ${p}`));\n });\n }\n\n // Entity로 reload\n console.log(\"Entity로 다시 로드합니다.\");\n EntityManager.isAutoloaded = false;\n await EntityManager.autoload();\n\n // Entity를 통해 generated.ts 재생성\n const entityIds = EntityManager.getAllParentIds();\n for await (const entityId of entityIds) {\n await Sonamu.syncer.generateTemplate(\"generated\", { entityId });\n }\n}\n","import chalk from \"chalk\";\nimport glob from \"glob\";\nimport inflection from \"inflection\";\nimport _ from \"lodash\";\nimport path from \"path\";\nimport { SMD } from \"./smd\";\nimport { SMDInput } from \"../types/types\";\nimport { Sonamu } from \"../api/sonamu\";\nimport { EntityNamesRecord } from \"../entity/entity-manager\";\n\ntype TableSpec = {\n name: string;\n uniqueColumns: string[];\n};\nclass SMDManagerClass {\n private SMDs: Map<string, SMD> = new Map();\n public modulePaths: Map<string, string> = new Map();\n private tableSpecs: Map<string, TableSpec> = new Map();\n public isAutoloaded: boolean = false;\n\n // 경로 전달받아 모든 SMD 파일 로드\n async autoload(doSilent: boolean = false) {\n if (this.isAutoloaded) {\n return;\n }\n const pathPattern = path.join(\n Sonamu.apiRootPath,\n \"/dist/application/**/*.smd.js\"\n );\n !doSilent && console.log(chalk.yellow(`autoload ${pathPattern}`));\n\n return new Promise((resolve) => {\n glob.glob(path.resolve(pathPattern!), (_err, files) => {\n const importPaths = files.map((filePath) =>\n path.relative(__dirname, filePath)\n );\n Promise.all(\n importPaths.map(async (importPath) => {\n const imported = await import(importPath);\n Object.values(imported).map((smdInput) =>\n this.register(smdInput as SMDInput<string>)\n );\n return imported;\n })\n ).then(() => {\n resolve(\"ok\");\n this.isAutoloaded = true;\n });\n });\n });\n }\n\n register(smdInput: SMDInput<string>): void {\n const smd = new SMD(smdInput);\n this.SMDs.set(smdInput.id, smd);\n }\n\n get(smdId: string): SMD {\n const smd = this.SMDs.get(smdId);\n if (smd === undefined) {\n throw new Error(`존재하지 않는 SMD 요청 ${smdId}`);\n }\n\n return smd;\n }\n\n exists(smdId: string): boolean {\n const smd = this.SMDs.get(smdId);\n return smd !== undefined;\n }\n\n getAllIds(): string[] {\n return Array.from(SMDManager.SMDs.keys());\n }\n\n getAllParentIds(): string[] {\n return this.getAllIds().filter((smdId) => {\n const smd = this.get(smdId);\n return smd.parentId === undefined;\n });\n }\n\n getChildrenIds(parentId: string): string[] {\n return this.getAllIds().filter((smdId) => {\n const smd = this.get(smdId);\n return smd.parentId === parentId;\n });\n }\n\n setModulePath(key: string, modulePath: string): void {\n // console.debug(chalk.cyan(`setModulePath :: ${key} :: ${modulePath}`));\n this.modulePaths.set(key, modulePath);\n }\n\n getModulePath(key: string): string {\n const modulePath = this.modulePaths.get(key);\n if (modulePath === undefined) {\n throw new Error(`존재하지 않는 모듈 패스 요청 ${key}`);\n }\n\n return modulePath;\n }\n\n setTableSpec(tableSpec: TableSpec) {\n this.tableSpecs.set(tableSpec.name, tableSpec);\n }\n\n getTableSpec(key: string): TableSpec {\n const tableSpec = this.tableSpecs.get(key);\n if (tableSpec === undefined) {\n throw new Error(`존재하지 않는 테이블 스펙 요청 ${key}`);\n }\n\n return tableSpec;\n }\n\n getNamesFromId(smdId: string): EntityNamesRecord {\n // entityId가 단복수 동형 단어인 경우 List 붙여서 생성\n const pluralized =\n inflection.pluralize(smdId) === smdId\n ? `${smdId}List`\n : inflection.pluralize(smdId);\n\n return {\n fs: inflection.dasherize(inflection.underscore(smdId)).toLowerCase(),\n fsPlural: inflection\n .dasherize(inflection.underscore(pluralized))\n .toLowerCase(),\n camel: inflection.camelize(smdId, true),\n camelPlural: inflection.camelize(pluralized, true),\n capital: smdId,\n capitalPlural: pluralized,\n upper: smdId.toUpperCase(),\n constant: inflection.underscore(smdId).toUpperCase(),\n };\n }\n}\n\nexport const SMDManager = new SMDManagerClass();\n","import _ from \"lodash\";\nimport {\n EntityProp,\n RelationProp,\n isRelationProp,\n SubsetQuery,\n isVirtualProp,\n isBelongsToOneRelationProp,\n isOneToOneRelationProp,\n isHasManyRelationProp,\n isManyToManyRelationProp,\n EntityPropNode,\n isEnumProp,\n StringProp,\n EntityIndex,\n EnumsLabelKo,\n SMDInput,\n} from \"../types/types\";\nimport inflection from \"inflection\";\nimport path from \"path\";\nimport fs from \"fs-extra\";\nimport { z } from \"zod\";\nimport { Sonamu } from \"../api/sonamu\";\nimport { SMDManager } from \"./smd-manager\";\n\nexport class SMD {\n id: string;\n parentId?: string;\n table: string;\n title: string;\n names: {\n fs: string;\n module: string;\n };\n props: EntityProp[];\n propsDict: {\n [key: string]: EntityProp;\n };\n relations: {\n [key: string]: RelationProp;\n };\n indexes: EntityIndex[];\n subsets: {\n [key: string]: string[];\n };\n types: {\n [name: string]: z.ZodTypeAny;\n } = {};\n enums: {\n [name: string]: z.ZodEnum<any>;\n } = {};\n enumLabels: {\n [name: string]: EnumsLabelKo<string>;\n } = {};\n\n constructor({\n id,\n parentId,\n table,\n title,\n props,\n indexes,\n subsets,\n }: SMDInput<any>) {\n // id\n this.id = id;\n this.parentId = parentId;\n this.title = title ?? this.id;\n this.table = table ?? inflection.underscore(inflection.pluralize(id));\n\n // props\n if (props) {\n this.props = props.map((prop) => {\n if (isEnumProp(prop)) {\n if (prop.id.includes(\"$Model\")) {\n prop.id = prop.id.replace(\"$Model\", id);\n }\n }\n return prop;\n });\n this.propsDict = props.reduce((result, prop) => {\n return {\n ...result,\n [prop.name]: prop,\n };\n }, {});\n\n // relations\n this.relations = props\n .filter((prop) => isRelationProp(prop))\n .reduce((result, prop) => {\n return {\n ...result,\n [prop.name]: prop,\n };\n }, {});\n } else {\n this.props = [];\n this.propsDict = {};\n this.relations = {};\n }\n\n // indexes\n this.indexes = indexes ?? [];\n\n // subsets\n this.subsets = subsets ?? {};\n\n // names\n this.names = {\n fs:\n parentId === undefined\n ? inflection.dasherize(inflection.underscore(id)).toLowerCase()\n : inflection.dasherize(parentId).toLowerCase(),\n module: id,\n };\n\n this.registerModulePaths();\n this.registerTableSpecs();\n }\n\n /*\n subset SELECT/JOIN/LOADER 결과 리턴\n */\n getSubsetQuery(subsetKey: string): SubsetQuery {\n const subset = this.subsets[subsetKey];\n\n const result: SubsetQuery = this.resolveSubsetQuery(\"\", subset);\n return result;\n }\n\n /*\n */\n resolveSubsetQuery(\n prefix: string,\n fields: string[],\n isAlreadyOuterJoined: boolean = false\n ): SubsetQuery {\n // prefix 치환 (prefix는 ToOneRelation이 복수로 붙은 경우 모두 __로 변경됨)\n prefix = prefix.replace(/\\./g, \"__\");\n\n // 서브셋을 1뎁스만 분리하여 그룹핑\n const subsetGroup = _.groupBy(fields, (field) => {\n if (field.includes(\".\")) {\n const [rel] = field.split(\".\");\n return rel;\n } else {\n return \"\";\n }\n });\n\n const result = Object.keys(subsetGroup).reduce(\n (r, groupKey) => {\n const fields = subsetGroup[groupKey];\n // 현재 테이블 필드셋은 select, virtual에 추가하고 리턴\n if (groupKey === \"\") {\n const realFields = fields.filter(\n (field) => !isVirtualProp(this.propsDict[field])\n );\n const virtualFields = fields.filter((field) =>\n isVirtualProp(this.propsDict[field])\n );\n\n if (prefix === \"\") {\n // 현재 테이블인 경우\n r.select = r.select.concat(\n realFields.map((field) => `${this.table}.${field}`)\n );\n r.virtual = r.virtual.concat(virtualFields);\n } else {\n // 넘어온 테이블인 경우\n r.select = r.select.concat(\n realFields.map(\n (field) => `${prefix}.${field} as ${prefix}__${field}`\n )\n );\n }\n\n return r;\n }\n\n const relation = this.relations[groupKey];\n if (relation === undefined) {\n throw new Error(`존재하지 않는 relation 참조 ${groupKey}`);\n }\n const relSMD = SMDManager.get(relation.with);\n\n if (\n isOneToOneRelationProp(relation) ||\n isBelongsToOneRelationProp(relation)\n ) {\n // -One Relation: JOIN 으로 처리\n const relFields = fields.map((field) =>\n field.split(\".\").slice(1).join(\".\")\n );\n\n // -One Relation에서 id 필드만 참조하는 경우 릴레이션 넘기지 않고 리턴\n if (relFields.length === 1 && relFields[0] === \"id\") {\n if (prefix === \"\") {\n r.select = r.select.concat(`${this.table}.${groupKey}_id`);\n } else {\n r.select = r.select.concat(\n `${prefix}.${groupKey}_id as ${prefix}__${groupKey}_id`\n );\n }\n return r;\n }\n\n // innerOrOuter\n const innerOrOuter = (() => {\n if (isAlreadyOuterJoined) {\n return \"outer\";\n }\n\n if (isOneToOneRelationProp(relation)) {\n if (\n relation.hasJoinColumn === true &&\n (relation.nullable ?? false) === false\n ) {\n return \"inner\";\n } else {\n return \"outer\";\n }\n } else {\n if (relation.nullable) {\n return \"outer\";\n } else {\n return \"inner\";\n }\n }\n })();\n const relSubsetQuery = relSMD.resolveSubsetQuery(\n `${prefix !== \"\" ? prefix + \".\" : \"\"}${groupKey}`,\n relFields,\n innerOrOuter === \"outer\"\n );\n r.select = r.select.concat(relSubsetQuery.select);\n r.virtual = r.virtual.concat(relSubsetQuery.virtual);\n\n const joinAs = prefix === \"\" ? groupKey : prefix + \"__\" + groupKey;\n const fromTable = prefix === \"\" ? this.table : prefix;\n\n let joinClause;\n if (relation.customJoinClause) {\n joinClause = {\n custom: relation.customJoinClause,\n };\n } else {\n let from, to;\n if (isOneToOneRelationProp(relation)) {\n if (relation.hasJoinColumn) {\n from = `${fromTable}.${relation.name}_id`;\n to = `${joinAs}.id`;\n } else {\n from = `${fromTable}.id`;\n to = `${joinAs}.${inflection.underscore(\n this.names.fs.replace(/\\-/g, \"_\")\n )}_id`;\n }\n } else {\n from = `${fromTable}.${relation.name}_id`;\n to = `${joinAs}.id`;\n }\n joinClause = {\n from,\n to,\n };\n }\n\n r.joins.push({\n as: joinAs,\n join: innerOrOuter,\n table: relSMD.table,\n ...joinClause,\n });\n\n // BelongsToOne 밑에 HasMany가 붙은 경우\n if (relSubsetQuery.loaders.length > 0) {\n const convertedLoaders = relSubsetQuery.loaders.map((loader) => {\n const newAs = [groupKey, loader.as].join(\"__\");\n return {\n as: newAs,\n table: loader.table,\n manyJoin: loader.manyJoin,\n oneJoins: loader.oneJoins,\n select: loader.select,\n };\n });\n\n r.loaders = [...r.loaders, ...convertedLoaders];\n }\n\n r.joins = r.joins.concat(relSubsetQuery.joins);\n } else if (\n isHasManyRelationProp(relation) ||\n isManyToManyRelationProp(relation)\n ) {\n // -Many Relation: Loader 로 처리\n const relFields = fields.map((field) =>\n field.split(\".\").slice(1).join(\".\")\n );\n const relSubsetQuery = relSMD.resolveSubsetQuery(\"\", relFields);\n\n let manyJoin: SubsetQuery[\"loaders\"][number][\"manyJoin\"];\n if (isHasManyRelationProp(relation)) {\n manyJoin = {\n fromTable: this.table,\n fromCol: \"id\",\n idField: prefix === \"\" ? `id` : `${prefix}__id`,\n toTable: relSMD.table,\n toCol: relation.joinColumn,\n };\n } else if (isManyToManyRelationProp(relation)) {\n const [table1, table2] = relation.joinTable.split(\"__\");\n\n manyJoin = {\n fromTable: this.table,\n fromCol: \"id\",\n idField: prefix === \"\" ? `id` : `${prefix}__id`,\n through: {\n table: relation.joinTable,\n fromCol: `${inflection.singularize(table1)}_id`,\n toCol: `${inflection.singularize(table2)}_id`,\n },\n toTable: relSMD.table,\n toCol: \"id\",\n };\n } else {\n throw new Error();\n }\n\n r.loaders.push({\n as: groupKey,\n table: relSMD.table,\n manyJoin,\n oneJoins: relSubsetQuery.joins,\n select: relSubsetQuery.select,\n loaders: relSubsetQuery.loaders,\n });\n }\n\n return r;\n },\n {\n select: [],\n virtual: [],\n joins: [],\n loaders: [],\n } as SubsetQuery\n );\n return result;\n }\n\n /*\n FieldExpr[] 을 SMDPropNode[] 로 변환\n */\n fieldExprsToPropNodes(\n fieldExprs: string[],\n smd: SMD = this\n ): EntityPropNode[] {\n const groups = fieldExprs.reduce(\n (result, fieldExpr) => {\n let key, value, elseExpr;\n if (fieldExpr.includes(\".\")) {\n [key, ...elseExpr] = fieldExpr.split(\".\");\n value = elseExpr.join(\".\");\n } else {\n key = \"\";\n value = fieldExpr;\n }\n result[key] = (result[key] ?? []).concat(value);\n\n return result;\n },\n {} as {\n [k: string]: string[];\n }\n );\n\n return Object.keys(groups)\n .map((key) => {\n const group = groups[key];\n\n // 일반 prop 처리\n if (key === \"\") {\n return group.map((propName) => {\n // uuid 개별 처리\n if (propName === \"uuid\") {\n return {\n nodeType: \"plain\" as const,\n prop: {\n type: \"string\",\n name: \"uuid\",\n length: 128,\n } as StringProp,\n children: [],\n };\n }\n\n const prop = smd.propsDict[propName];\n if (prop === undefined) {\n throw new Error(`${this.id} -- 잘못된 FieldExpr ${propName}`);\n }\n return {\n nodeType: \"plain\" as const,\n prop,\n children: [],\n };\n });\n }\n\n // relation prop 처리\n const prop = smd.propsDict[key];\n if (!isRelationProp(prop)) {\n throw new Error(`잘못된 FieldExpr ${key}.${group[0]}`);\n }\n const relSMD = SMDManager.get(prop.with);\n\n // relation -One 에 id 필드 하나인 경우\n if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop)) {\n if (group.length == 1 && (group[0] === \"id\" || group[0] == \"id?\")) {\n // id 하나만 있는지 체크해서, 하나만 있으면 상위 prop으로 id를 리턴\n const idProp = relSMD.propsDict.id;\n return {\n nodeType: \"plain\" as const,\n prop: {\n ...idProp,\n name: key + \"_id\",\n nullable: prop.nullable,\n },\n children: [],\n };\n }\n }\n\n // -One 그외의 경우 object로 리턴\n // -Many의 경우 array로 리턴\n // Recursive 로 뎁스 처리\n const children = this.fieldExprsToPropNodes(group, relSMD);\n const nodeType =\n isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop)\n ? (\"object\" as const)\n : (\"array\" as const);\n\n return {\n prop,\n children,\n nodeType,\n };\n })\n .flat();\n }\n\n getFieldExprs(\n prefix = \"\",\n maxDepth: number = 3,\n froms: string[] = []\n ): string[] {\n return this.props\n .map((prop) => {\n const propName = [prefix, prop.name].filter((v) => v !== \"\").join(\".\");\n if (propName === prefix) {\n return null;\n }\n if (isRelationProp(prop)) {\n if (maxDepth < 0) {\n return null;\n }\n if (froms.includes(prop.with)) {\n // 역방향 relation인 경우 제외\n return null;\n }\n // 정방향 relation인 경우 recursive 콜\n const relMd = SMDManager.get(prop.with);\n return relMd.getFieldExprs(propName, maxDepth - 1, [\n ...froms,\n this.id,\n ]);\n }\n return propName;\n })\n .flat()\n .filter((f) => f !== null) as string[];\n }\n\n registerModulePaths() {\n const basePath = `${this.names.fs}`;\n\n // base-scheme\n SMDManager.setModulePath(\n `${this.id}BaseSchema`,\n `${basePath}/${this.names.fs}.generated`\n );\n\n // subset\n if (Object.keys(this.subsets).length > 0) {\n SMDManager.setModulePath(\n `${this.id}SubsetKey`,\n `${basePath}/${this.names.fs}.generated`\n );\n SMDManager.setModulePath(\n `${this.id}SubsetMapping`,\n `${basePath}/${this.names.fs}.generated`\n );\n Object.keys(this.subsets).map((subsetKey) => {\n SMDManager.setModulePath(\n `${this.id}Subset${subsetKey.toUpperCase()}`,\n `${basePath}/${this.names.fs}.generated`\n );\n });\n }\n\n // types\n const typesModulePath = `${basePath}/${this.names.fs}.types`;\n const typesFileDistPath = path.join(\n Sonamu.apiRootPath,\n `dist/application/${typesModulePath}.js`\n );\n\n if (fs.existsSync(typesFileDistPath)) {\n const importPath = path.relative(__dirname, typesFileDistPath);\n import(importPath).then((t) => {\n this.types = Object.keys(t).reduce((result, key) => {\n SMDManager.setModulePath(key, typesModulePath);\n return {\n ...result,\n [key]: t[key],\n };\n }, {});\n });\n }\n\n // enums\n const enumsModulePath = `${basePath}/${this.names.fs}.enums`;\n const enumsFileDistPath = path.join(\n Sonamu.apiRootPath,\n `/dist/application/${enumsModulePath}.js`\n );\n if (fs.existsSync(enumsFileDistPath)) {\n const importPath = path.relative(__dirname, enumsFileDistPath);\n import(importPath).then((t) => {\n this.enums = Object.keys(t).reduce((result, key) => {\n SMDManager.setModulePath(key, enumsModulePath);\n\n // Enum Labels 별도 처리\n if (key === inflection.underscore(this.id).toUpperCase()) {\n this.enumLabels = t[key];\n }\n return {\n ...result,\n [key]: t[key],\n };\n }, {});\n });\n }\n }\n\n registerTableSpecs(): void {\n const uniqueColumns = _.uniq(\n this.indexes\n .filter((idx) => idx.type === \"unique\")\n .map((idx) => idx.columns)\n .flat()\n );\n\n SMDManager.setTableSpec({\n name: this.table,\n uniqueColumns,\n });\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/bin/cli.ts","../../src/smd/smd-manager.ts","../../src/smd/smd.ts"],"names":["chalk","path","fs","inflection","_","fields","prop","config","fileName"],"mappings":"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","sourcesContent":["/* Global Begin */\nimport chalk from \"chalk\";\nconsole.log(chalk.bgBlue(`BEGIN ${new Date()}`));\n\nimport dotenv from \"dotenv\";\ndotenv.config();\n\nimport path from \"path\";\nimport { tsicli } from \"tsicli\";\nimport { execSync } from \"child_process\";\nimport fs from \"fs-extra\";\nimport inflection from \"inflection\";\nimport prettier from \"prettier\";\nimport process from \"process\";\nimport _ from \"lodash\";\nimport { Sonamu } from \"../api\";\nimport { EntityManager } from \"../entity/entity-manager\";\nimport { Migrator } from \"../entity/migrator\";\nimport { FixtureManager } from \"../testing/fixture-manager\";\nimport { SMDManager } from \"../smd/smd-manager\";\nimport { DB } from \"../database/db\";\nimport {\n KnexConfig,\n KyselyConfig,\n SonamuKnexDBConfig,\n SonamuKyselyDBConfig,\n} from \"../database/types\";\nimport { KnexClient } from \"../database/drivers/knex/client\";\nimport { KyselyClient } from \"../database/drivers/kysely/client\";\n\nlet migrator: Migrator;\n\nasync function bootstrap() {\n await Sonamu.init(false, false);\n\n await tsicli(process.argv, {\n types: {\n \"#entityId\": {\n type: \"autocomplete\",\n name: \"#entityId\",\n message: \"Please input #entityId\",\n choices: EntityManager.getAllParentIds().map((entityId) => ({\n title: entityId,\n value: entityId,\n })),\n },\n \"#recordIds\": \"number[]\",\n \"#name\": \"string\",\n },\n args: [\n [\"fixture\", \"init\"],\n [\"fixture\", \"import\", \"#entityId\", \"#recordIds\"],\n [\"fixture\", \"sync\"],\n [\"migrate\", \"run\"],\n [\"migrate\", \"check\"],\n [\"migrate\", \"rollback\"],\n [\"migrate\", \"reset\"],\n [\"migrate\", \"clear\"],\n [\"migrate\", \"status\"],\n [\"stub\", \"practice\", \"#name\"],\n [\"stub\", \"entity\", \"#name\"],\n [\"scaffold\", \"model\", \"#entityId\"],\n [\"scaffold\", \"model_test\", \"#entityId\"],\n [\"scaffold\", \"view_list\", \"#entityId\"],\n [\"scaffold\", \"view_form\", \"#entityId\"],\n [\"ui\"],\n [\"smd_migration\"],\n ],\n runners: {\n migrate_run,\n migrate_check,\n migrate_rollback,\n migrate_clear,\n migrate_reset,\n migrate_status,\n fixture_init,\n fixture_import,\n fixture_sync,\n stub_practice,\n stub_entity,\n scaffold_model,\n scaffold_model_test,\n ui,\n // scaffold_view_list,\n // scaffold_view_form,\n smd_migration,\n },\n });\n}\nbootstrap().finally(async () => {\n if (migrator) {\n await migrator.destroy();\n }\n await FixtureManager.destory();\n\n /* Global End */\n console.log(chalk.bgBlue(`END ${new Date()}\\n`));\n});\n\nasync function setupMigrator() {\n // migrator\n migrator = new Migrator({\n mode: \"dev\",\n });\n}\n\nasync function setupFixtureManager() {\n FixtureManager.init();\n}\n\nasync function migrate_run() {\n await setupMigrator();\n\n await migrator.cleanUpDist();\n await migrator.run();\n}\n\nasync function migrate_check() {\n await setupMigrator();\n\n await migrator.cleanUpDist();\n await migrator.check();\n}\n\nasync function migrate_status() {\n await setupMigrator();\n\n const status = await migrator.getStatus();\n // status;\n console.log(status);\n}\n\nasync function migrate_rollback() {\n await setupMigrator();\n\n await migrator.rollback();\n}\n\nasync function migrate_clear() {\n await setupMigrator();\n\n await migrator.clearPendingList();\n}\n\nasync function migrate_reset() {\n await setupMigrator();\n\n await migrator.resetAll();\n}\n\nasync function fixture_init() {\n const _db = DB.getClient(\"development_master\");\n const srcConn = _db.connectionInfo;\n\n const targets = [\n {\n label: \"(REMOTE) Fixture DB\",\n connKey: \"fixture_remote\",\n },\n {\n label: \"(LOCAL) Fixture DB\",\n connKey: \"fixture_local\",\n },\n {\n label: \"(LOCAL) Testing DB\",\n connKey: \"test\",\n },\n ] as {\n label: string;\n connKey: keyof SonamuKnexDBConfig | keyof SonamuKyselyDBConfig;\n }[];\n\n // 1. 기준DB 스키마를 덤프\n console.log(\"DUMP...\");\n const dumpFilename = `/tmp/sonamu-fixture-init-${Date.now()}.sql`;\n const migrationsDump = `/tmp/sonamu-fixture-init-migrations-${Date.now()}.sql`;\n execSync(\n `mysqldump -h${srcConn.host} -P${srcConn.port} -u${srcConn.user} -p${srcConn.password} --single-transaction -d --no-create-db --triggers ${srcConn.database} > ${dumpFilename}`\n );\n\n // 2. 마이그레이션 테이블이 존재하면 덤프\n const dbClient = DB.baseConfig!.client;\n const migrationTable = DB.migrationTable;\n const [migrations] = await _db.raw<{ count: number }>(\n \"SELECT COUNT(*) as count FROM information_schema.tables WHERE table_schema = ? AND table_name = ?\",\n [srcConn.database, migrationTable]\n );\n if (migrations.count > 0) {\n execSync(\n `mysqldump -h${srcConn.host} -P${srcConn.port} -u${srcConn.user} -p${srcConn.password} --single-transaction --no-create-db --triggers ${srcConn.database} ${migrationTable} ${migrationTable}_lock > ${migrationsDump}`\n );\n }\n\n // 2. 대상DB 각각에 대하여 존재여부 확인 후 붓기\n for await (const { label, connKey } of targets) {\n const config = DB.connectionInfo[connKey];\n\n if (\n label === \"(LOCAL) Fixture DB\" &&\n targets.find(\n (t) =>\n t.label === \"(REMOTE) Fixture DB\" &&\n DB.connectionInfo[t.connKey].host === config.host &&\n DB.connectionInfo[t.connKey].database === config.database\n )\n ) {\n console.log(chalk.red(`${label}: Skipped!`));\n continue;\n }\n\n const db = (() => {\n if (dbClient === \"knex\") {\n const config = _.cloneDeep(DB.fullConfig[connKey]) as KnexConfig;\n config.connection.database = undefined;\n return new KnexClient(config);\n } else {\n const config = _.cloneDeep(DB.fullConfig[connKey]) as KyselyConfig;\n config.database = undefined;\n return new KyselyClient(config);\n }\n })();\n\n const [row] = await db.raw(`SHOW DATABASES LIKE \"${config.database}\"`);\n if (row) {\n console.log(\n chalk.yellow(`${label}: Database \"${config.database}\" Already exists`)\n );\n await db.destroy();\n continue;\n }\n\n console.log(`SYNC to ${label}...`);\n const mysqlCmd = `mysql -h${config.host} -P${srcConn.port} -u${config.user} -p${config.password}`;\n execSync(`${mysqlCmd} -e 'DROP DATABASE IF EXISTS \\`${config.database}\\`'`);\n execSync(`${mysqlCmd} -e 'CREATE DATABASE \\`${config.database}\\`'`);\n execSync(`${mysqlCmd} ${config.database} < ${dumpFilename}`);\n if (fs.existsSync(migrationsDump)) {\n execSync(`${mysqlCmd} ${config.database} < ${migrationsDump}`);\n }\n\n await db.destroy();\n }\n}\n\nasync function fixture_import(entityId: string, recordIds: number[]) {\n await setupFixtureManager();\n\n await FixtureManager.importFixture(entityId, recordIds);\n await FixtureManager.sync();\n}\n\nasync function fixture_sync() {\n await setupFixtureManager();\n\n await FixtureManager.sync();\n}\n\nasync function stub_practice(name: string) {\n const practiceDir = path.join(Sonamu.apiRootPath, \"src\", \"practices\");\n const fileNames = fs.readdirSync(practiceDir);\n\n const maxSeqNo = (() => {\n if (fs.existsSync(practiceDir) === false) {\n fs.mkdirSync(practiceDir, { recursive: true });\n }\n\n const filteredSeqs = fileNames\n .filter(\n (fileName) => fileName.startsWith(\"p\") && fileName.endsWith(\".ts\")\n )\n .map((fileName) => {\n const [, seqNo] = fileName.match(/^p([0-9]+)\\-/) ?? [\"0\", \"0\"];\n return parseInt(seqNo);\n })\n .sort((a, b) => b - a);\n\n if (filteredSeqs.length > 0) {\n return filteredSeqs[0];\n }\n\n return 0;\n })();\n\n const currentSeqNo = maxSeqNo + 1;\n const fileName = `p${currentSeqNo}-${name}.ts`;\n const dstPath = path.join(practiceDir, fileName);\n\n // FIXME\n const code = [\n `import { BaseModel } from \"sonamu\";`,\n \"\",\n `console.clear();`,\n `console.log(\"${fileName}\");`,\n \"\",\n `async function bootstrap() {`,\n ` // TODO`,\n `}`,\n `bootstrap().finally(async () => {`,\n `await BaseModel.destroy();`,\n `});`,\n ].join(\"\\n\");\n fs.writeFileSync(dstPath, code);\n\n execSync(`code ${dstPath}`);\n\n const runCode = `yarn node -r source-map-support/register dist/practices/${fileName.replace(\n \".ts\",\n \".js\"\n )}`;\n console.log(`${chalk.blue(runCode)} copied to clipboard.`);\n execSync(`echo \"${runCode}\" | pbcopy`);\n}\n\nasync function stub_entity(entityId: string) {\n await Sonamu.syncer.createEntity({ entityId });\n}\n\nasync function scaffold_model(entityId: string) {\n await Sonamu.syncer.generateTemplate(\"model\", {\n entityId,\n });\n}\n\nasync function scaffold_model_test(entityId: string) {\n await Sonamu.syncer.generateTemplate(\"model_test\", {\n entityId,\n });\n}\n\nasync function ui() {\n try {\n const sonamuUI: {\n startServers: (appRootPath: string) => void;\n } = await import(\"@sonamu-kit/ui\" as string);\n sonamuUI.startServers(Sonamu.apiRootPath);\n } catch (e: unknown) {\n if (e instanceof Error && e.message.includes(\"isn't declared\")) {\n console.log(`You need to install ${chalk.blue(`@sonamu-kit/ui`)} first.`);\n return;\n }\n throw e;\n }\n}\n\nasync function smd_migration() {\n await SMDManager.autoload();\n const smdIds = SMDManager.getAllIds();\n\n function enumLabelsToEntityEnums(\n entityId: string,\n enumLabels: {\n [enumName: string]: { [name: string]: { ko: string } };\n }\n ): { [enumName: string]: { [name: string]: string } } {\n return Object.fromEntries(\n Object.entries(enumLabels).map(([enumLabelName, enumLabel]) => {\n const enumName =\n entityId + inflection.camelize(enumLabelName.toLowerCase(), false);\n return [\n enumName,\n Object.fromEntries(\n Object.entries(enumLabel).map(([name, { ko }]) => [name, ko])\n ),\n ];\n })\n );\n }\n for await (const smdId of smdIds) {\n const smd = SMDManager.get(smdId);\n const entityJson = {\n id: smd.id,\n ...(smd.parentId && { parentId: smd.parentId }),\n title: smd.title,\n props: smd.props,\n indexes: smd.indexes,\n subsets: smd.subsets,\n enums: enumLabelsToEntityEnums(smd.id, smd.enumLabels),\n };\n\n const parentNames = SMDManager.getNamesFromId(smd.parentId ?? smd.id);\n const names = SMDManager.getNamesFromId(smd.id);\n const dstPath = path.join(\n Sonamu.apiRootPath,\n \"src\",\n \"application\",\n parentNames.fs,\n `${names.fs}.entity.json`\n );\n\n const formatted = await prettier.format(JSON.stringify(entityJson), {\n parser: \"json\",\n });\n fs.writeFileSync(dstPath, formatted);\n console.log(chalk.blue(`CREATED: ${dstPath}`));\n\n // smd.ts, enums.ts, genereated.ts 삭제 (트랜스파일 된 js파일도 삭제)\n const srcSmdPath = path.join(\n Sonamu.apiRootPath,\n \"src\",\n \"application\",\n parentNames.fs,\n `${names.fs}.smd.ts`\n );\n const dstSmdPath = srcSmdPath\n .replace(\"/src/\", \"/dist/\")\n .replace(/\\.ts$/, \".js\");\n const srcEnumsPath = path.join(\n Sonamu.apiRootPath,\n \"src\",\n \"application\",\n parentNames.fs,\n `${names.fs}.enums.ts`\n );\n const dstEnumsPath = srcEnumsPath\n .replace(\"/src/\", \"/dist/\")\n .replace(/\\.ts$/, \".js\");\n const srcGeneratedPath = path.join(\n Sonamu.apiRootPath,\n \"src\",\n \"application\",\n parentNames.fs,\n `${names.fs}.generated.ts`\n );\n const dstGeneratedPath = srcGeneratedPath\n .replace(\"/src/\", \"/dist/\")\n .replace(/\\.ts$/, \".js\");\n\n [\n srcSmdPath,\n dstSmdPath,\n srcEnumsPath,\n dstEnumsPath,\n ...Sonamu.config.sync.targets.map((target) =>\n srcEnumsPath\n .replace(Sonamu.apiRootPath, path.join(Sonamu.appRootPath, target))\n .replace(\"/src/application/\", \"/src/services/\")\n ),\n srcGeneratedPath,\n dstGeneratedPath,\n ].map((p) => {\n if (fs.existsSync(p) === false) {\n console.log(chalk.yellow(`NOT FOUND: ${p}`));\n return;\n }\n fs.unlinkSync(p);\n console.log(chalk.red(`DELETED: ${p}`));\n });\n }\n\n // Entity로 reload\n console.log(\"Entity로 다시 로드합니다.\");\n EntityManager.isAutoloaded = false;\n await EntityManager.autoload();\n\n // Entity를 통해 generated.ts 재생성\n const entityIds = EntityManager.getAllParentIds();\n for await (const entityId of entityIds) {\n await Sonamu.syncer.generateTemplate(\"generated\", { entityId });\n }\n}\n","import chalk from \"chalk\";\nimport glob from \"glob\";\nimport inflection from \"inflection\";\nimport _ from \"lodash\";\nimport path from \"path\";\nimport { SMD } from \"./smd\";\nimport { SMDInput } from \"../types/types\";\nimport { Sonamu } from \"../api/sonamu\";\nimport { EntityNamesRecord } from \"../entity/entity-manager\";\n\ntype TableSpec = {\n name: string;\n uniqueColumns: string[];\n};\nclass SMDManagerClass {\n private SMDs: Map<string, SMD> = new Map();\n public modulePaths: Map<string, string> = new Map();\n private tableSpecs: Map<string, TableSpec> = new Map();\n public isAutoloaded: boolean = false;\n\n // 경로 전달받아 모든 SMD 파일 로드\n async autoload(doSilent: boolean = false) {\n if (this.isAutoloaded) {\n return;\n }\n const pathPattern = path.join(\n Sonamu.apiRootPath,\n \"/dist/application/**/*.smd.js\"\n );\n !doSilent && console.log(chalk.yellow(`autoload ${pathPattern}`));\n\n return new Promise((resolve) => {\n glob.glob(path.resolve(pathPattern!), (_err, files) => {\n const importPaths = files.map((filePath) =>\n path.relative(__dirname, filePath)\n );\n Promise.all(\n importPaths.map(async (importPath) => {\n const imported = await import(importPath);\n Object.values(imported).map((smdInput) =>\n this.register(smdInput as SMDInput<string>)\n );\n return imported;\n })\n ).then(() => {\n resolve(\"ok\");\n this.isAutoloaded = true;\n });\n });\n });\n }\n\n register(smdInput: SMDInput<string>): void {\n const smd = new SMD(smdInput);\n this.SMDs.set(smdInput.id, smd);\n }\n\n get(smdId: string): SMD {\n const smd = this.SMDs.get(smdId);\n if (smd === undefined) {\n throw new Error(`존재하지 않는 SMD 요청 ${smdId}`);\n }\n\n return smd;\n }\n\n exists(smdId: string): boolean {\n const smd = this.SMDs.get(smdId);\n return smd !== undefined;\n }\n\n getAllIds(): string[] {\n return Array.from(SMDManager.SMDs.keys());\n }\n\n getAllParentIds(): string[] {\n return this.getAllIds().filter((smdId) => {\n const smd = this.get(smdId);\n return smd.parentId === undefined;\n });\n }\n\n getChildrenIds(parentId: string): string[] {\n return this.getAllIds().filter((smdId) => {\n const smd = this.get(smdId);\n return smd.parentId === parentId;\n });\n }\n\n setModulePath(key: string, modulePath: string): void {\n // console.debug(chalk.cyan(`setModulePath :: ${key} :: ${modulePath}`));\n this.modulePaths.set(key, modulePath);\n }\n\n getModulePath(key: string): string {\n const modulePath = this.modulePaths.get(key);\n if (modulePath === undefined) {\n throw new Error(`존재하지 않는 모듈 패스 요청 ${key}`);\n }\n\n return modulePath;\n }\n\n setTableSpec(tableSpec: TableSpec) {\n this.tableSpecs.set(tableSpec.name, tableSpec);\n }\n\n getTableSpec(key: string): TableSpec {\n const tableSpec = this.tableSpecs.get(key);\n if (tableSpec === undefined) {\n throw new Error(`존재하지 않는 테이블 스펙 요청 ${key}`);\n }\n\n return tableSpec;\n }\n\n getNamesFromId(smdId: string): EntityNamesRecord {\n // entityId가 단복수 동형 단어인 경우 List 붙여서 생성\n const pluralized =\n inflection.pluralize(smdId) === smdId\n ? `${smdId}List`\n : inflection.pluralize(smdId);\n\n return {\n fs: inflection.dasherize(inflection.underscore(smdId)).toLowerCase(),\n fsPlural: inflection\n .dasherize(inflection.underscore(pluralized))\n .toLowerCase(),\n camel: inflection.camelize(smdId, true),\n camelPlural: inflection.camelize(pluralized, true),\n capital: smdId,\n capitalPlural: pluralized,\n upper: smdId.toUpperCase(),\n constant: inflection.underscore(smdId).toUpperCase(),\n };\n }\n}\n\nexport const SMDManager = new SMDManagerClass();\n","import _ from \"lodash\";\nimport {\n EntityProp,\n RelationProp,\n isRelationProp,\n SubsetQuery,\n isVirtualProp,\n isBelongsToOneRelationProp,\n isOneToOneRelationProp,\n isHasManyRelationProp,\n isManyToManyRelationProp,\n EntityPropNode,\n isEnumProp,\n StringProp,\n EntityIndex,\n EnumsLabelKo,\n SMDInput,\n} from \"../types/types\";\nimport inflection from \"inflection\";\nimport path from \"path\";\nimport fs from \"fs-extra\";\nimport { z } from \"zod\";\nimport { Sonamu } from \"../api/sonamu\";\nimport { SMDManager } from \"./smd-manager\";\n\nexport class SMD {\n id: string;\n parentId?: string;\n table: string;\n title: string;\n names: {\n fs: string;\n module: string;\n };\n props: EntityProp[];\n propsDict: {\n [key: string]: EntityProp;\n };\n relations: {\n [key: string]: RelationProp;\n };\n indexes: EntityIndex[];\n subsets: {\n [key: string]: string[];\n };\n types: {\n [name: string]: z.ZodTypeAny;\n } = {};\n enums: {\n [name: string]: z.ZodEnum<any>;\n } = {};\n enumLabels: {\n [name: string]: EnumsLabelKo<string>;\n } = {};\n\n constructor({\n id,\n parentId,\n table,\n title,\n props,\n indexes,\n subsets,\n }: SMDInput<any>) {\n // id\n this.id = id;\n this.parentId = parentId;\n this.title = title ?? this.id;\n this.table = table ?? inflection.underscore(inflection.pluralize(id));\n\n // props\n if (props) {\n this.props = props.map((prop) => {\n if (isEnumProp(prop)) {\n if (prop.id.includes(\"$Model\")) {\n prop.id = prop.id.replace(\"$Model\", id);\n }\n }\n return prop;\n });\n this.propsDict = props.reduce((result, prop) => {\n return {\n ...result,\n [prop.name]: prop,\n };\n }, {});\n\n // relations\n this.relations = props\n .filter((prop) => isRelationProp(prop))\n .reduce((result, prop) => {\n return {\n ...result,\n [prop.name]: prop,\n };\n }, {});\n } else {\n this.props = [];\n this.propsDict = {};\n this.relations = {};\n }\n\n // indexes\n this.indexes = indexes ?? [];\n\n // subsets\n this.subsets = subsets ?? {};\n\n // names\n this.names = {\n fs:\n parentId === undefined\n ? inflection.dasherize(inflection.underscore(id)).toLowerCase()\n : inflection.dasherize(parentId).toLowerCase(),\n module: id,\n };\n\n this.registerModulePaths();\n this.registerTableSpecs();\n }\n\n /*\n subset SELECT/JOIN/LOADER 결과 리턴\n */\n getSubsetQuery(subsetKey: string): SubsetQuery {\n const subset = this.subsets[subsetKey];\n\n const result: SubsetQuery = this.resolveSubsetQuery(\"\", subset);\n return result;\n }\n\n /*\n */\n resolveSubsetQuery(\n prefix: string,\n fields: string[],\n isAlreadyOuterJoined: boolean = false\n ): SubsetQuery {\n // prefix 치환 (prefix는 ToOneRelation이 복수로 붙은 경우 모두 __로 변경됨)\n prefix = prefix.replace(/\\./g, \"__\");\n\n // 서브셋을 1뎁스만 분리하여 그룹핑\n const subsetGroup = _.groupBy(fields, (field) => {\n if (field.includes(\".\")) {\n const [rel] = field.split(\".\");\n return rel;\n } else {\n return \"\";\n }\n });\n\n const result = Object.keys(subsetGroup).reduce(\n (r, groupKey) => {\n const fields = subsetGroup[groupKey];\n // 현재 테이블 필드셋은 select, virtual에 추가하고 리턴\n if (groupKey === \"\") {\n const realFields = fields.filter(\n (field) => !isVirtualProp(this.propsDict[field])\n );\n const virtualFields = fields.filter((field) =>\n isVirtualProp(this.propsDict[field])\n );\n\n if (prefix === \"\") {\n // 현재 테이블인 경우\n r.select = r.select.concat(\n realFields.map((field) => `${this.table}.${field}`)\n );\n r.virtual = r.virtual.concat(virtualFields);\n } else {\n // 넘어온 테이블인 경우\n r.select = r.select.concat(\n realFields.map(\n (field) => `${prefix}.${field} as ${prefix}__${field}`\n )\n );\n }\n\n return r;\n }\n\n const relation = this.relations[groupKey];\n if (relation === undefined) {\n throw new Error(`존재하지 않는 relation 참조 ${groupKey}`);\n }\n const relSMD = SMDManager.get(relation.with);\n\n if (\n isOneToOneRelationProp(relation) ||\n isBelongsToOneRelationProp(relation)\n ) {\n // -One Relation: JOIN 으로 처리\n const relFields = fields.map((field) =>\n field.split(\".\").slice(1).join(\".\")\n );\n\n // -One Relation에서 id 필드만 참조하는 경우 릴레이션 넘기지 않고 리턴\n if (relFields.length === 1 && relFields[0] === \"id\") {\n if (prefix === \"\") {\n r.select = r.select.concat(`${this.table}.${groupKey}_id`);\n } else {\n r.select = r.select.concat(\n `${prefix}.${groupKey}_id as ${prefix}__${groupKey}_id`\n );\n }\n return r;\n }\n\n // innerOrOuter\n const innerOrOuter = (() => {\n if (isAlreadyOuterJoined) {\n return \"outer\";\n }\n\n if (isOneToOneRelationProp(relation)) {\n if (\n relation.hasJoinColumn === true &&\n (relation.nullable ?? false) === false\n ) {\n return \"inner\";\n } else {\n return \"outer\";\n }\n } else {\n if (relation.nullable) {\n return \"outer\";\n } else {\n return \"inner\";\n }\n }\n })();\n const relSubsetQuery = relSMD.resolveSubsetQuery(\n `${prefix !== \"\" ? prefix + \".\" : \"\"}${groupKey}`,\n relFields,\n innerOrOuter === \"outer\"\n );\n r.select = r.select.concat(relSubsetQuery.select);\n r.virtual = r.virtual.concat(relSubsetQuery.virtual);\n\n const joinAs = prefix === \"\" ? groupKey : prefix + \"__\" + groupKey;\n const fromTable = prefix === \"\" ? this.table : prefix;\n\n let joinClause;\n if (relation.customJoinClause) {\n joinClause = {\n custom: relation.customJoinClause,\n };\n } else {\n let from, to;\n if (isOneToOneRelationProp(relation)) {\n if (relation.hasJoinColumn) {\n from = `${fromTable}.${relation.name}_id`;\n to = `${joinAs}.id`;\n } else {\n from = `${fromTable}.id`;\n to = `${joinAs}.${inflection.underscore(\n this.names.fs.replace(/\\-/g, \"_\")\n )}_id`;\n }\n } else {\n from = `${fromTable}.${relation.name}_id`;\n to = `${joinAs}.id`;\n }\n joinClause = {\n from,\n to,\n };\n }\n\n r.joins.push({\n as: joinAs,\n join: innerOrOuter,\n table: relSMD.table,\n ...joinClause,\n });\n\n // BelongsToOne 밑에 HasMany가 붙은 경우\n if (relSubsetQuery.loaders.length > 0) {\n const convertedLoaders = relSubsetQuery.loaders.map((loader) => {\n const newAs = [groupKey, loader.as].join(\"__\");\n return {\n as: newAs,\n table: loader.table,\n manyJoin: loader.manyJoin,\n oneJoins: loader.oneJoins,\n select: loader.select,\n };\n });\n\n r.loaders = [...r.loaders, ...convertedLoaders];\n }\n\n r.joins = r.joins.concat(relSubsetQuery.joins);\n } else if (\n isHasManyRelationProp(relation) ||\n isManyToManyRelationProp(relation)\n ) {\n // -Many Relation: Loader 로 처리\n const relFields = fields.map((field) =>\n field.split(\".\").slice(1).join(\".\")\n );\n const relSubsetQuery = relSMD.resolveSubsetQuery(\"\", relFields);\n\n let manyJoin: SubsetQuery[\"loaders\"][number][\"manyJoin\"];\n if (isHasManyRelationProp(relation)) {\n manyJoin = {\n fromTable: this.table,\n fromCol: \"id\",\n idField: prefix === \"\" ? `id` : `${prefix}__id`,\n toTable: relSMD.table,\n toCol: relation.joinColumn,\n };\n } else if (isManyToManyRelationProp(relation)) {\n const [table1, table2] = relation.joinTable.split(\"__\");\n\n manyJoin = {\n fromTable: this.table,\n fromCol: \"id\",\n idField: prefix === \"\" ? `id` : `${prefix}__id`,\n through: {\n table: relation.joinTable,\n fromCol: `${inflection.singularize(table1)}_id`,\n toCol: `${inflection.singularize(table2)}_id`,\n },\n toTable: relSMD.table,\n toCol: \"id\",\n };\n } else {\n throw new Error();\n }\n\n r.loaders.push({\n as: groupKey,\n table: relSMD.table,\n manyJoin,\n oneJoins: relSubsetQuery.joins,\n select: relSubsetQuery.select,\n loaders: relSubsetQuery.loaders,\n });\n }\n\n return r;\n },\n {\n select: [],\n virtual: [],\n joins: [],\n loaders: [],\n } as SubsetQuery\n );\n return result;\n }\n\n /*\n FieldExpr[] 을 SMDPropNode[] 로 변환\n */\n fieldExprsToPropNodes(\n fieldExprs: string[],\n smd: SMD = this\n ): EntityPropNode[] {\n const groups = fieldExprs.reduce(\n (result, fieldExpr) => {\n let key, value, elseExpr;\n if (fieldExpr.includes(\".\")) {\n [key, ...elseExpr] = fieldExpr.split(\".\");\n value = elseExpr.join(\".\");\n } else {\n key = \"\";\n value = fieldExpr;\n }\n result[key] = (result[key] ?? []).concat(value);\n\n return result;\n },\n {} as {\n [k: string]: string[];\n }\n );\n\n return Object.keys(groups)\n .map((key) => {\n const group = groups[key];\n\n // 일반 prop 처리\n if (key === \"\") {\n return group.map((propName) => {\n // uuid 개별 처리\n if (propName === \"uuid\") {\n return {\n nodeType: \"plain\" as const,\n prop: {\n type: \"string\",\n name: \"uuid\",\n length: 128,\n } as StringProp,\n children: [],\n };\n }\n\n const prop = smd.propsDict[propName];\n if (prop === undefined) {\n throw new Error(`${this.id} -- 잘못된 FieldExpr ${propName}`);\n }\n return {\n nodeType: \"plain\" as const,\n prop,\n children: [],\n };\n });\n }\n\n // relation prop 처리\n const prop = smd.propsDict[key];\n if (!isRelationProp(prop)) {\n throw new Error(`잘못된 FieldExpr ${key}.${group[0]}`);\n }\n const relSMD = SMDManager.get(prop.with);\n\n // relation -One 에 id 필드 하나인 경우\n if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop)) {\n if (group.length == 1 && (group[0] === \"id\" || group[0] == \"id?\")) {\n // id 하나만 있는지 체크해서, 하나만 있으면 상위 prop으로 id를 리턴\n const idProp = relSMD.propsDict.id;\n return {\n nodeType: \"plain\" as const,\n prop: {\n ...idProp,\n name: key + \"_id\",\n nullable: prop.nullable,\n },\n children: [],\n };\n }\n }\n\n // -One 그외의 경우 object로 리턴\n // -Many의 경우 array로 리턴\n // Recursive 로 뎁스 처리\n const children = this.fieldExprsToPropNodes(group, relSMD);\n const nodeType =\n isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop)\n ? (\"object\" as const)\n : (\"array\" as const);\n\n return {\n prop,\n children,\n nodeType,\n };\n })\n .flat();\n }\n\n getFieldExprs(\n prefix = \"\",\n maxDepth: number = 3,\n froms: string[] = []\n ): string[] {\n return this.props\n .map((prop) => {\n const propName = [prefix, prop.name].filter((v) => v !== \"\").join(\".\");\n if (propName === prefix) {\n return null;\n }\n if (isRelationProp(prop)) {\n if (maxDepth < 0) {\n return null;\n }\n if (froms.includes(prop.with)) {\n // 역방향 relation인 경우 제외\n return null;\n }\n // 정방향 relation인 경우 recursive 콜\n const relMd = SMDManager.get(prop.with);\n return relMd.getFieldExprs(propName, maxDepth - 1, [\n ...froms,\n this.id,\n ]);\n }\n return propName;\n })\n .flat()\n .filter((f) => f !== null) as string[];\n }\n\n registerModulePaths() {\n const basePath = `${this.names.fs}`;\n\n // base-scheme\n SMDManager.setModulePath(\n `${this.id}BaseSchema`,\n `${basePath}/${this.names.fs}.generated`\n );\n\n // subset\n if (Object.keys(this.subsets).length > 0) {\n SMDManager.setModulePath(\n `${this.id}SubsetKey`,\n `${basePath}/${this.names.fs}.generated`\n );\n SMDManager.setModulePath(\n `${this.id}SubsetMapping`,\n `${basePath}/${this.names.fs}.generated`\n );\n Object.keys(this.subsets).map((subsetKey) => {\n SMDManager.setModulePath(\n `${this.id}Subset${subsetKey.toUpperCase()}`,\n `${basePath}/${this.names.fs}.generated`\n );\n });\n }\n\n // types\n const typesModulePath = `${basePath}/${this.names.fs}.types`;\n const typesFileDistPath = path.join(\n Sonamu.apiRootPath,\n `dist/application/${typesModulePath}.js`\n );\n\n if (fs.existsSync(typesFileDistPath)) {\n const importPath = path.relative(__dirname, typesFileDistPath);\n import(importPath).then((t) => {\n this.types = Object.keys(t).reduce((result, key) => {\n SMDManager.setModulePath(key, typesModulePath);\n return {\n ...result,\n [key]: t[key],\n };\n }, {});\n });\n }\n\n // enums\n const enumsModulePath = `${basePath}/${this.names.fs}.enums`;\n const enumsFileDistPath = path.join(\n Sonamu.apiRootPath,\n `/dist/application/${enumsModulePath}.js`\n );\n if (fs.existsSync(enumsFileDistPath)) {\n const importPath = path.relative(__dirname, enumsFileDistPath);\n import(importPath).then((t) => {\n this.enums = Object.keys(t).reduce((result, key) => {\n SMDManager.setModulePath(key, enumsModulePath);\n\n // Enum Labels 별도 처리\n if (key === inflection.underscore(this.id).toUpperCase()) {\n this.enumLabels = t[key];\n }\n return {\n ...result,\n [key]: t[key],\n };\n }, {});\n });\n }\n }\n\n registerTableSpecs(): void {\n const uniqueColumns = _.uniq(\n this.indexes\n .filter((idx) => idx.type === \"unique\")\n .map((idx) => idx.columns)\n .flat()\n );\n\n SMDManager.setTableSpec({\n name: this.table,\n uniqueColumns,\n });\n }\n}\n"]}
package/dist/bin/cli.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  FixtureManager,
3
3
  Migrator
4
- } from "../chunk-I2MMJRJN.mjs";
4
+ } from "../chunk-HIUT56RE.mjs";
5
5
  import {
6
6
  DB,
7
7
  EntityManager,
@@ -15,7 +15,7 @@ import {
15
15
  isOneToOneRelationProp,
16
16
  isRelationProp,
17
17
  isVirtualProp
18
- } from "../chunk-PP2PSSAG.mjs";
18
+ } from "../chunk-ZFLQLW37.mjs";
19
19
  import {
20
20
  __dirname
21
21
  } from "../chunk-PTFDTOJU.mjs";