sonamu 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/dist/api/context.d.ts +4 -1
  2. package/dist/api/context.d.ts.map +1 -1
  3. package/dist/api/decorators.d.ts.map +1 -1
  4. package/dist/api/decorators.js +1 -1
  5. package/dist/api/decorators.js.map +1 -1
  6. package/dist/api/sonamu.d.ts +7 -6
  7. package/dist/api/sonamu.d.ts.map +1 -1
  8. package/dist/api/sonamu.js +1 -1
  9. package/dist/api/sonamu.js.map +1 -1
  10. package/dist/bin/build-config.d.ts +4 -0
  11. package/dist/bin/build-config.d.ts.map +1 -1
  12. package/dist/bin/build-config.js +1 -1
  13. package/dist/bin/build-config.js.map +1 -1
  14. package/dist/bin/cli-wrapper.js +1 -1
  15. package/dist/bin/cli-wrapper.js.map +1 -1
  16. package/dist/bin/cli.js +1 -1
  17. package/dist/bin/cli.js.map +1 -1
  18. package/dist/database/base-model.d.ts +8 -1
  19. package/dist/database/base-model.d.ts.map +1 -1
  20. package/dist/database/base-model.js +1 -1
  21. package/dist/database/base-model.js.map +1 -1
  22. package/dist/database/db.js +1 -1
  23. package/dist/database/db.js.map +1 -1
  24. package/dist/file-storage/driver.d.ts +3 -0
  25. package/dist/file-storage/driver.d.ts.map +1 -1
  26. package/dist/file-storage/driver.js +1 -1
  27. package/dist/file-storage/driver.js.map +1 -1
  28. package/dist/index.d.ts +1 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +1 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/stream/index.d.ts +2 -0
  33. package/dist/stream/index.d.ts.map +1 -0
  34. package/dist/stream/index.js +2 -0
  35. package/dist/stream/index.js.map +1 -0
  36. package/dist/stream/sse.d.ts +13 -0
  37. package/dist/stream/sse.d.ts.map +1 -0
  38. package/dist/stream/sse.js +2 -0
  39. package/dist/stream/sse.js.map +1 -0
  40. package/dist/types/types.d.ts +5 -3
  41. package/dist/types/types.d.ts.map +1 -1
  42. package/dist/types/types.js.map +1 -1
  43. package/package.json +6 -4
  44. package/src/api/context.ts +10 -5
  45. package/src/api/decorators.ts +1 -3
  46. package/src/api/sonamu.ts +60 -26
  47. package/src/bin/build-config.ts +5 -0
  48. package/src/bin/cli-wrapper.ts +20 -6
  49. package/src/bin/cli.ts +16 -21
  50. package/src/database/base-model.ts +29 -3
  51. package/src/database/db.ts +1 -1
  52. package/src/file-storage/driver.ts +10 -0
  53. package/src/index.ts +1 -0
  54. package/src/stream/index.ts +1 -0
  55. package/src/stream/sse.ts +49 -0
  56. package/src/types/types.ts +10 -4
  57. package/tsconfig.json +4 -0
  58. package/dist/api/sonamu.types.d.ts +0 -30
  59. package/dist/api/sonamu.types.d.ts.map +0 -1
  60. package/dist/api/sonamu.types.js +0 -2
  61. package/dist/api/sonamu.types.js.map +0 -1
  62. package/dist/base-model-CEB0H0aO.d.mts +0 -43
  63. package/dist/base-model-CrqDMYhI.d.ts +0 -43
  64. package/dist/bin/cli-wrapper.d.mts +0 -1
  65. package/dist/bin/cli-wrapper.mjs +0 -43
  66. package/dist/bin/cli-wrapper.mjs.map +0 -1
  67. package/dist/bin/cli.d.mts +0 -2
  68. package/dist/bin/cli.mjs +0 -907
  69. package/dist/bin/cli.mjs.map +0 -1
  70. package/dist/chunk-2WAC2GER.js +0 -7625
  71. package/dist/chunk-2WAC2GER.js.map +0 -1
  72. package/dist/chunk-C3IPIF6O.mjs +0 -1581
  73. package/dist/chunk-C3IPIF6O.mjs.map +0 -1
  74. package/dist/chunk-EXHKSVTE.js +0 -280
  75. package/dist/chunk-EXHKSVTE.js.map +0 -1
  76. package/dist/chunk-FCERKIIF.mjs +0 -7623
  77. package/dist/chunk-FCERKIIF.mjs.map +0 -1
  78. package/dist/chunk-HGIBJYOU.mjs +0 -231
  79. package/dist/chunk-HGIBJYOU.mjs.map +0 -1
  80. package/dist/chunk-JKSOJRQA.mjs +0 -280
  81. package/dist/chunk-JKSOJRQA.mjs.map +0 -1
  82. package/dist/chunk-OTKKFP3Y.js +0 -1581
  83. package/dist/chunk-OTKKFP3Y.js.map +0 -1
  84. package/dist/chunk-PTFDTOJU.mjs +0 -19
  85. package/dist/chunk-PTFDTOJU.mjs.map +0 -1
  86. package/dist/chunk-UZ2IY5VE.js +0 -231
  87. package/dist/chunk-UZ2IY5VE.js.map +0 -1
  88. package/dist/database/drivers/knex/base-model.d.mts +0 -16
  89. package/dist/database/drivers/knex/base-model.d.ts +0 -16
  90. package/dist/database/drivers/knex/base-model.js +0 -55
  91. package/dist/database/drivers/knex/base-model.js.map +0 -1
  92. package/dist/database/drivers/knex/base-model.mjs +0 -56
  93. package/dist/database/drivers/knex/base-model.mjs.map +0 -1
  94. package/dist/database/drivers/kysely/base-model.d.mts +0 -22
  95. package/dist/database/drivers/kysely/base-model.d.ts +0 -22
  96. package/dist/database/drivers/kysely/base-model.js +0 -64
  97. package/dist/database/drivers/kysely/base-model.js.map +0 -1
  98. package/dist/database/drivers/kysely/base-model.mjs +0 -65
  99. package/dist/database/drivers/kysely/base-model.mjs.map +0 -1
  100. package/dist/database/types.d.ts +0 -39
  101. package/dist/database/types.d.ts.map +0 -1
  102. package/dist/database/types.js +0 -2
  103. package/dist/database/types.js.map +0 -1
  104. package/dist/index.d.mts +0 -813
  105. package/dist/index.mjs +0 -435
  106. package/dist/index.mjs.map +0 -1
  107. package/dist/model-aFgomcdc.d.mts +0 -1112
  108. package/dist/model-aFgomcdc.d.ts +0 -1112
  109. package/dist/smd/smd-manager.d.ts +0 -28
  110. package/dist/smd/smd-manager.d.ts.map +0 -1
  111. package/dist/smd/smd-manager.js +0 -2
  112. package/dist/smd/smd-manager.js.map +0 -1
  113. package/dist/smd/smd.d.ts +0 -40
  114. package/dist/smd/smd.d.ts.map +0 -1
  115. package/dist/smd/smd.js +0 -2
  116. package/dist/smd/smd.js.map +0 -1
package/dist/bin/cli.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});var _chalk=/*#__PURE__*/_interop_require_default(require("chalk"));var _dotenv=/*#__PURE__*/_interop_require_default(require("dotenv"));var _path=/*#__PURE__*/_interop_require_default(require("path"));var _tsicli=require("tsicli");var _child_process=require("child_process");var _promises=require("fs/promises");var _fsutils=require("../utils/fs-utils");var _process=/*#__PURE__*/_interop_require_default(require("process"));var _api=require("../api");var _knex=/*#__PURE__*/_interop_require_default(require("knex"));var _entitymanager=require("../entity/entity-manager");var _migrator=require("../migration/migrator");var _fixturemanager=require("../testing/fixture-manager");var _buildconfig=require("./build-config");function _array_like_to_array(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _array_with_holes(arr){if(Array.isArray(arr))return arr}function _async_iterator(iterable){var method,async,sync,retry=2;for("undefined"!=typeof Symbol&&(async=Symbol.asyncIterator,sync=Symbol.iterator);retry--;){if(async&&null!=(method=iterable[async]))return method.call(iterable);if(sync&&null!=(method=iterable[sync]))return new AsyncFromSyncIterator(method.call(iterable));async="@@asyncIterator",sync="@@iterator"}throw new TypeError("Object is not async iterable")}function AsyncFromSyncIterator(s){function AsyncFromSyncIteratorContinuation(r){if(Object(r)!==r)return Promise.reject(new TypeError(r+" is not an object."));var done=r.done;return Promise.resolve(r.value).then(function(value){return{value:value,done:done}})}return AsyncFromSyncIterator=function(s){this.s=s,this.n=s.next},AsyncFromSyncIterator.prototype={s:null,n:null,next:function(){return AsyncFromSyncIteratorContinuation(this.n.apply(this.s,arguments))},return:function(value){var ret=this.s.return;return void 0===ret?Promise.resolve({value:value,done:!0}):AsyncFromSyncIteratorContinuation(ret.apply(this.s,arguments))},throw:function(value){var thr=this.s.return;return void 0===thr?Promise.reject(value):AsyncFromSyncIteratorContinuation(thr.apply(this.s,arguments))}},new AsyncFromSyncIterator(s)}function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{Promise.resolve(value).then(_next,_throw)}}function _async_to_generator(fn){return function(){var self=this,args=arguments;return new Promise(function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value)}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err)}_next(undefined)})}}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _instanceof(left,right){if(right!=null&&typeof Symbol!=="undefined"&&right[Symbol.hasInstance]){return!!right[Symbol.hasInstance](left)}else{return left instanceof right}}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap;var cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interop_require_wildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj}}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj)}var newObj={__proto__:null};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc)}else{newObj[key]=obj[key]}}}newObj.default=obj;if(cache){cache.set(obj,newObj)}return newObj}function _iterable_to_array_limit(arr,i){var _i=arr==null?null:typeof Symbol!=="undefined"&&arr[Symbol.iterator]||arr["@@iterator"];if(_i==null)return;var _arr=[];var _n=true;var _d=false;var _s,_e;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i["return"]!=null)_i["return"]()}finally{if(_d)throw _e}}return _arr}function _non_iterable_rest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _object_spread(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};var ownKeys=Object.keys(source);if(typeof Object.getOwnPropertySymbols==="function"){ownKeys=ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym){return Object.getOwnPropertyDescriptor(source,sym).enumerable}))}ownKeys.forEach(function(key){_define_property(target,key,source[key])})}return target}function ownKeys(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);if(enumerableOnly){symbols=symbols.filter(function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable})}keys.push.apply(keys,symbols)}return keys}function _object_spread_props(target,source){source=source!=null?source:{};if(Object.getOwnPropertyDescriptors){Object.defineProperties(target,Object.getOwnPropertyDescriptors(source))}else{ownKeys(Object(source)).forEach(function(key){Object.defineProperty(target,key,Object.getOwnPropertyDescriptor(source,key))})}return target}function _sliced_to_array(arr,i){return _array_with_holes(arr)||_iterable_to_array_limit(arr,i)||_unsupported_iterable_to_array(arr,i)||_non_iterable_rest()}function _unsupported_iterable_to_array(o,minLen){if(!o)return;if(typeof o==="string")return _array_like_to_array(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _array_like_to_array(o,minLen)}function _ts_generator(thisArg,body){var f,y,t,_={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},g=Object.create((typeof Iterator==="function"?Iterator:Object).prototype);return g.next=verb(0),g["throw"]=verb(1),g["return"]=verb(2),typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(g&&(g=0,op[0]&&(_=0)),_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(op[0]===6&&_.label<t[1]){_.label=t[1];t=op;break}if(t&&_.label<t[2]){_.label=t[2];_.ops.push(op);break}if(t[2])_.ops.pop();_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e];y=0}finally{f=t=0}if(op[0]&5)throw op[1];return{value:op[0]?op[1]:void 0,done:true}}}console.log(_chalk.default.bgBlue("BEGIN ".concat(new Date)));_dotenv.default.config();var migrator;function bootstrap(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,_api.Sonamu.init(false,false)];case 1:_state.sent();return[4,(0,_tsicli.tsicli)(_process.default.argv,{types:{"#entityId":{type:"autocomplete",name:"#entityId",message:"Please input #entityId",choices:_entitymanager.EntityManager.getAllParentIds().map(function(entityId){return{title:entityId,value:entityId}})},"#recordIds":"number[]","#name":"string"},args:[["fixture","init"],["fixture","import","#entityId","#recordIds"],["fixture","sync"],["migrate","run"],["migrate","check"],["migrate","rollback"],["migrate","reset"],["migrate","clear"],["migrate","status"],["stub","practice","#name"],["stub","entity","#name"],["scaffold","model","#entityId"],["scaffold","model_test","#entityId"],["scaffold","view_list","#entityId"],["scaffold","view_form","#entityId"],["ui"],["dev:serve"],["serve"]],runners:{migrate_run:migrate_run,migrate_check:migrate_check,migrate_rollback:migrate_rollback,migrate_clear:migrate_clear,migrate_reset:migrate_reset,migrate_status:migrate_status,fixture_init:fixture_init,fixture_import:fixture_import,fixture_sync:fixture_sync,stub_practice:stub_practice,stub_entity:stub_entity,scaffold_model:scaffold_model,scaffold_model_test:scaffold_model_test,ui:ui,"dev:serve":dev_serve,serve:serve}})];case 2:_state.sent();return[2]}})})()}bootstrap().finally(function(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:if(!migrator)return[3,2];return[4,migrator.destroy()];case 1:_state.sent();_state.label=2;case 2:return[4,_fixturemanager.FixtureManager.destroy()];case 3:_state.sent();console.log(_chalk.default.bgBlue("END ".concat(new Date,"\n")));return[2]}})})()});function dev_serve(){return _async_to_generator(function(){var nodemon,nodemonConfig,cleanup;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,Promise.resolve().then(function(){return /*#__PURE__*/_interop_require_wildcard(require("nodemon"))})];case 1:nodemon=_state.sent();return[4,function(){return _async_to_generator(function(){var projectNodemonPath,hasProjectNodemon,_;return _ts_generator(this,function(_state){switch(_state.label){case 0:projectNodemonPath=_path.default.join(_api.Sonamu.apiRootPath,"nodemon.json");return[4,(0,_fsutils.exists)(projectNodemonPath)];case 1:hasProjectNodemon=_state.sent();if(!hasProjectNodemon)return[3,3];_=JSON.parse;return[4,(0,_promises.readFile)(projectNodemonPath,"utf8")];case 2:return[2,_.apply(JSON,[_state.sent()])];case 3:return[2,{watch:["src/index.ts"],ignore:["dist/**","**/*.js","**/*.d.ts"],exec:[_buildconfig.SWC_BUILD_COMMAND,"node -r source-map-support/register -r dotenv/config dist/index.js"].join(" && ")}]}})})()}()];case 2:nodemonConfig=_state.sent();nodemon.default(nodemonConfig);cleanup=function(){return _async_to_generator(function(){var _Sonamu_server;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,(_Sonamu_server=_api.Sonamu.server)===null||_Sonamu_server===void 0?void 0:_Sonamu_server.close()];case 1:_state.sent();_process.default.exit(0);return[2]}})})()};_process.default.on("SIGINT",cleanup);_process.default.on("SIGTERM",cleanup);_process.default.on("SIGUSR2",cleanup);return[2]}})})()}function serve(){return _async_to_generator(function(){var distIndexPath,spawn,serverProcess;return _ts_generator(this,function(_state){switch(_state.label){case 0:distIndexPath=_path.default.join(_api.Sonamu.apiRootPath,"dist","index.js");return[4,(0,_fsutils.exists)(distIndexPath)];case 1:if(!_state.sent()){console.log(_chalk.default.red("dist/index.js not found. Please build your project first."));console.log(_chalk.default.blue("Run: yarn sonamu build"));return[2]}return[4,Promise.resolve().then(function(){return /*#__PURE__*/_interop_require_wildcard(require("child_process"))})];case 2:spawn=_state.sent().spawn;serverProcess=spawn("node",["-r","source-map-support/register","-r","dotenv/config",distIndexPath],{cwd:_api.Sonamu.apiRootPath,stdio:"inherit"});_process.default.on("SIGINT",function(){serverProcess.kill("SIGTERM");_process.default.exit(0)});return[2]}})})()}function setupMigrator(){return _async_to_generator(function(){return _ts_generator(this,function(_state){migrator=new _migrator.Migrator({mode:"dev"});return[2]})})()}function setupFixtureManager(){return _async_to_generator(function(){return _ts_generator(this,function(_state){_fixturemanager.FixtureManager.init();return[2]})})()}function migrate_run(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,setupMigrator()];case 1:_state.sent();return[4,migrator.cleanUpDist()];case 2:_state.sent();return[4,migrator.run()];case 3:_state.sent();return[2]}})})()}function migrate_check(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,setupMigrator()];case 1:_state.sent();return[4,migrator.cleanUpDist()];case 2:_state.sent();return[4,migrator.check()];case 3:_state.sent();return[2]}})})()}function migrate_status(){return _async_to_generator(function(){var status;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,setupMigrator()];case 1:_state.sent();return[4,migrator.getStatus()];case 2:status=_state.sent();console.log(status);return[2]}})})()}function migrate_rollback(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,setupMigrator()];case 1:_state.sent();return[4,migrator.rollback()];case 2:_state.sent();return[2]}})})()}function migrate_clear(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,setupMigrator()];case 1:_state.sent();return[4,migrator.clearPendingList()];case 2:_state.sent();return[2]}})})()}function migrate_reset(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,setupMigrator()];case 1:_state.sent();return[4,migrator.resetAll()];case 2:_state.sent();return[2]}})})()}function fixture_init(){return _async_to_generator(function(){var srcConfig,targets,dumpFilename,srcConn,migrationsDump,_db,_ref,_ref_,migrations,_iteratorAbruptCompletion,_didIteratorError,_iteratorError,_iterator,_step,_value,label,config,toSkip,conn,_config_connection,db,_ref1,_ref_1,row,mysqlCmd,err;return _ts_generator(this,function(_state){switch(_state.label){case 0:srcConfig=_api.Sonamu.dbConfig.development_master;targets=[{label:"(REMOTE) Fixture DB",config:_api.Sonamu.dbConfig.fixture_remote},{label:"(LOCAL) Fixture DB",config:_api.Sonamu.dbConfig.fixture_local,toSkip:function(){var remoteConn=_api.Sonamu.dbConfig.fixture_remote.connection;var localConn=_api.Sonamu.dbConfig.fixture_local.connection;return remoteConn.host===localConn.host&&remoteConn.database===localConn.database}()},{label:"(LOCAL) Testing DB",config:_api.Sonamu.dbConfig.test}];console.log("DUMP...");dumpFilename="/tmp/sonamu-fixture-init-".concat(Date.now(),".sql");srcConn=srcConfig.connection;migrationsDump="/tmp/sonamu-fixture-init-migrations-".concat(Date.now(),".sql");(0,_child_process.execSync)("mysqldump -h".concat(srcConn.host," -u").concat(srcConn.user," -p").concat(srcConn.password," --single-transaction -d --no-create-db --triggers ").concat(srcConn.database," > ").concat(dumpFilename));_db=(0,_knex.default)(srcConfig);return[4,_db.raw("SELECT COUNT(*) as count FROM information_schema.tables WHERE table_schema = ? AND table_name = 'knex_migrations'",[srcConn.database])];case 1:_ref=_sliced_to_array.apply(void 0,[_state.sent(),1]),_ref_=_sliced_to_array(_ref[0],1),migrations=_ref_[0];if(migrations.count>0){(0,_child_process.execSync)("mysqldump -h".concat(srcConn.host," -u").concat(srcConn.user," -p").concat(srcConn.password," --single-transaction --no-create-db --triggers ").concat(srcConn.database," knex_migrations knex_migrations_lock > ").concat(migrationsDump))}_iteratorAbruptCompletion=false,_didIteratorError=false;_state.label=2;case 2:_state.trys.push([2,12,13,18]);_iterator=_async_iterator(targets);_state.label=3;case 3:return[4,_iterator.next()];case 4:if(!(_iteratorAbruptCompletion=!(_step=_state.sent()).done))return[3,11];_value=_step.value;label=_value.label,config=_value.config,toSkip=_value.toSkip;conn=config.connection;if(toSkip===true){console.log(_chalk.default.red("".concat(label,": Skipped!")));return[3,10]}db=(0,_knex.default)(_object_spread_props(_object_spread({},config),{connection:_object_spread_props(_object_spread({},(_config_connection=config.connection)!==null&&_config_connection!==void 0?_config_connection:{}),{database:undefined})}));return[4,db.raw('SHOW DATABASES LIKE "'.concat(conn.database,'"'))];case 5:_ref1=_sliced_to_array.apply(void 0,[_state.sent(),1]),_ref_1=_sliced_to_array(_ref1[0],1),row=_ref_1[0];if(!row)return[3,7];console.log(_chalk.default.yellow("".concat(label,': Database "').concat(conn.database,'" Already exists')));return[4,db.destroy()];case 6:_state.sent();return[3,10];case 7:console.log("SYNC to ".concat(label,"..."));mysqlCmd="mysql -h".concat(conn.host," -u").concat(conn.user," -p").concat(conn.password);(0,_child_process.execSync)("".concat(mysqlCmd," -e 'DROP DATABASE IF EXISTS `").concat(conn.database,"`'"));(0,_child_process.execSync)("".concat(mysqlCmd," -e 'CREATE DATABASE `").concat(conn.database,"`'"));(0,_child_process.execSync)("".concat(mysqlCmd," ").concat(conn.database," < ").concat(dumpFilename));return[4,(0,_fsutils.exists)(migrationsDump)];case 8:if(_state.sent()){(0,_child_process.execSync)("".concat(mysqlCmd," ").concat(conn.database," < ").concat(migrationsDump))}return[4,db.destroy()];case 9:_state.sent();_state.label=10;case 10:_iteratorAbruptCompletion=false;return[3,3];case 11:return[3,18];case 12:err=_state.sent();_didIteratorError=true;_iteratorError=err;return[3,18];case 13:_state.trys.push([13,,16,17]);if(!(_iteratorAbruptCompletion&&_iterator.return!=null))return[3,15];return[4,_iterator.return()];case 14:_state.sent();_state.label=15;case 15:return[3,17];case 16:if(_didIteratorError){throw _iteratorError}return[7];case 17:return[7];case 18:return[4,_db.destroy()];case 19:_state.sent();return[2]}})})()}function fixture_import(entityId,recordIds){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,setupFixtureManager()];case 1:_state.sent();return[4,_fixturemanager.FixtureManager.importFixture(entityId,recordIds)];case 2:_state.sent();return[4,_fixturemanager.FixtureManager.sync()];case 3:_state.sent();return[2]}})})()}function fixture_sync(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,setupFixtureManager()];case 1:_state.sent();return[4,_fixturemanager.FixtureManager.sync()];case 2:_state.sent();return[2]}})})()}function stub_practice(name){return _async_to_generator(function(){var practiceDir,fileNames,maxSeqNo,currentSeqNo,fileName,dstPath,code,runCode;return _ts_generator(this,function(_state){switch(_state.label){case 0:practiceDir=_path.default.join(_api.Sonamu.apiRootPath,"src","practices");return[4,(0,_promises.readdir)(practiceDir)];case 1:fileNames=_state.sent();return[4,function(){return _async_to_generator(function(){var filteredSeqs;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,(0,_fsutils.exists)(practiceDir)];case 1:if(!!_state.sent())return[3,3];return[4,(0,_promises.mkdir)(practiceDir,{recursive:true})];case 2:_state.sent();_state.label=3;case 3:filteredSeqs=fileNames.filter(function(fileName){return fileName.startsWith("p")&&fileName.endsWith(".ts")}).map(function(fileName){var _fileName_match;var _ref=_sliced_to_array((_fileName_match=fileName.match(/^p([0-9]+)\-/))!==null&&_fileName_match!==void 0?_fileName_match:["0","0"],2),seqNo=_ref[1];return parseInt(seqNo)}).sort(function(a,b){return b-a});if(filteredSeqs.length>0){return[2,filteredSeqs[0]]}return[2,0]}})})()}()];case 2:maxSeqNo=_state.sent();currentSeqNo=maxSeqNo+1;fileName="p".concat(currentSeqNo,"-").concat(name,".ts");dstPath=_path.default.join(practiceDir,fileName);code=['import { BaseModel } from "sonamu";',"","console.clear();",'console.log("'.concat(fileName,'");'),"","async function bootstrap() {"," // TODO","}","bootstrap().finally(async () => {","await BaseModel.destroy();","});"].join("\n");return[4,(0,_promises.writeFile)(dstPath,code)];case 3:_state.sent();(0,_child_process.execSync)("code ".concat(dstPath));runCode="yarn node -r source-map-support/register dist/practices/".concat(fileName.replace(".ts",".js"));console.log("".concat(_chalk.default.blue(runCode)," copied to clipboard."));(0,_child_process.execSync)('echo "'.concat(runCode,'" | pbcopy'));return[2]}})})()}function stub_entity(entityId){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,_api.Sonamu.syncer.createEntity({entityId:entityId})];case 1:_state.sent();return[2]}})})()}function scaffold_model(entityId){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,_api.Sonamu.syncer.generateTemplate("model",{entityId:entityId})];case 1:_state.sent();return[2]}})})()}function scaffold_model_test(entityId){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,_api.Sonamu.syncer.generateTemplate("model_test",{entityId:entityId})];case 1:_state.sent();return[2]}})})()}function ui(){return _async_to_generator(function(){var _Sonamu_config_ui,sonamuUI,_Sonamu_config_projectName,_Sonamu_config_ui_port,e;return _ts_generator(this,function(_state){switch(_state.label){case 0:_state.trys.push([0,2,,3]);return[4,Promise.resolve().then(function(){return /*#__PURE__*/_interop_require_wildcard(require("@sonamu-kit/ui"))})];case 1:sonamuUI=_state.sent();sonamuUI.startServers({projectName:(_Sonamu_config_projectName=_api.Sonamu.config.projectName)!==null&&_Sonamu_config_projectName!==void 0?_Sonamu_config_projectName:_path.default.basename(_api.Sonamu.apiRootPath),apiRootPath:_api.Sonamu.apiRootPath,port:(_Sonamu_config_ui_port=(_Sonamu_config_ui=_api.Sonamu.config.ui)===null||_Sonamu_config_ui===void 0?void 0:_Sonamu_config_ui.port)!==null&&_Sonamu_config_ui_port!==void 0?_Sonamu_config_ui_port:57e3});return[3,3];case 2:e=_state.sent();if(_instanceof(e,Error)&&e.message.includes("isn't declared")){console.log("You need to install ".concat(_chalk.default.blue("@sonamu-kit/ui")," first."));return[2]}throw e;case 3:return[2]}})})()}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});var _chalk=/*#__PURE__*/_interop_require_default(require("chalk"));var _dotenv=/*#__PURE__*/_interop_require_default(require("dotenv"));var _path=/*#__PURE__*/_interop_require_default(require("path"));var _tsicli=require("tsicli");var _child_process=require("child_process");var _promises=require("fs/promises");var _fsutils=require("../utils/fs-utils");var _process=/*#__PURE__*/_interop_require_default(require("process"));var _api=require("../api");var _knex=/*#__PURE__*/_interop_require_default(require("knex"));var _utils=require("../utils/utils");var _entitymanager=require("../entity/entity-manager");var _migrator=require("../migration/migrator");var _fixturemanager=require("../testing/fixture-manager");function _array_like_to_array(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _array_with_holes(arr){if(Array.isArray(arr))return arr}function _async_iterator(iterable){var method,async,sync,retry=2;for("undefined"!=typeof Symbol&&(async=Symbol.asyncIterator,sync=Symbol.iterator);retry--;){if(async&&null!=(method=iterable[async]))return method.call(iterable);if(sync&&null!=(method=iterable[sync]))return new AsyncFromSyncIterator(method.call(iterable));async="@@asyncIterator",sync="@@iterator"}throw new TypeError("Object is not async iterable")}function AsyncFromSyncIterator(s){function AsyncFromSyncIteratorContinuation(r){if(Object(r)!==r)return Promise.reject(new TypeError(r+" is not an object."));var done=r.done;return Promise.resolve(r.value).then(function(value){return{value:value,done:done}})}return AsyncFromSyncIterator=function(s){this.s=s,this.n=s.next},AsyncFromSyncIterator.prototype={s:null,n:null,next:function(){return AsyncFromSyncIteratorContinuation(this.n.apply(this.s,arguments))},return:function(value){var ret=this.s.return;return void 0===ret?Promise.resolve({value:value,done:!0}):AsyncFromSyncIteratorContinuation(ret.apply(this.s,arguments))},throw:function(value){var thr=this.s.return;return void 0===thr?Promise.reject(value):AsyncFromSyncIteratorContinuation(thr.apply(this.s,arguments))}},new AsyncFromSyncIterator(s)}function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{Promise.resolve(value).then(_next,_throw)}}function _async_to_generator(fn){return function(){var self=this,args=arguments;return new Promise(function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value)}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err)}_next(undefined)})}}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _instanceof(left,right){if(right!=null&&typeof Symbol!=="undefined"&&right[Symbol.hasInstance]){return!!right[Symbol.hasInstance](left)}else{return left instanceof right}}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap;var cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interop_require_wildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj}}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj)}var newObj={__proto__:null};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc)}else{newObj[key]=obj[key]}}}newObj.default=obj;if(cache){cache.set(obj,newObj)}return newObj}function _iterable_to_array_limit(arr,i){var _i=arr==null?null:typeof Symbol!=="undefined"&&arr[Symbol.iterator]||arr["@@iterator"];if(_i==null)return;var _arr=[];var _n=true;var _d=false;var _s,_e;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i["return"]!=null)_i["return"]()}finally{if(_d)throw _e}}return _arr}function _non_iterable_rest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _object_spread(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};var ownKeys=Object.keys(source);if(typeof Object.getOwnPropertySymbols==="function"){ownKeys=ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym){return Object.getOwnPropertyDescriptor(source,sym).enumerable}))}ownKeys.forEach(function(key){_define_property(target,key,source[key])})}return target}function ownKeys(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);if(enumerableOnly){symbols=symbols.filter(function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable})}keys.push.apply(keys,symbols)}return keys}function _object_spread_props(target,source){source=source!=null?source:{};if(Object.getOwnPropertyDescriptors){Object.defineProperties(target,Object.getOwnPropertyDescriptors(source))}else{ownKeys(Object(source)).forEach(function(key){Object.defineProperty(target,key,Object.getOwnPropertyDescriptor(source,key))})}return target}function _sliced_to_array(arr,i){return _array_with_holes(arr)||_iterable_to_array_limit(arr,i)||_unsupported_iterable_to_array(arr,i)||_non_iterable_rest()}function _unsupported_iterable_to_array(o,minLen){if(!o)return;if(typeof o==="string")return _array_like_to_array(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _array_like_to_array(o,minLen)}function _ts_generator(thisArg,body){var f,y,t,_={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},g=Object.create((typeof Iterator==="function"?Iterator:Object).prototype);return g.next=verb(0),g["throw"]=verb(1),g["return"]=verb(2),typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(g&&(g=0,op[0]&&(_=0)),_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(op[0]===6&&_.label<t[1]){_.label=t[1];t=op;break}if(t&&_.label<t[2]){_.label=t[2];_.ops.push(op);break}if(t[2])_.ops.pop();_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e];y=0}finally{f=t=0}if(op[0]&5)throw op[1];return{value:op[0]?op[1]:void 0,done:true}}}_dotenv.default.config();var migrator;function bootstrap(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:if(!(_process.default.argv[2]!=="dev:serve"))return[3,2];return[4,_api.Sonamu.init(false,false)];case 1:_state.sent();_state.label=2;case 2:return[4,(0,_tsicli.tsicli)(_process.default.argv,{types:{"#entityId":{type:"autocomplete",name:"#entityId",message:"Please input #entityId",choices:_entitymanager.EntityManager.getAllParentIds().map(function(entityId){return{title:entityId,value:entityId}})},"#recordIds":"number[]","#name":"string"},args:[["fixture","init"],["fixture","import","#entityId","#recordIds"],["fixture","sync"],["migrate","run"],["migrate","check"],["migrate","rollback"],["migrate","reset"],["migrate","clear"],["migrate","status"],["stub","practice","#name"],["stub","entity","#name"],["scaffold","model","#entityId"],["scaffold","model_test","#entityId"],["scaffold","view_list","#entityId"],["scaffold","view_form","#entityId"],["ui"],["dev:serve"],["serve"]],runners:{migrate_run:migrate_run,migrate_check:migrate_check,migrate_rollback:migrate_rollback,migrate_clear:migrate_clear,migrate_reset:migrate_reset,migrate_status:migrate_status,fixture_init:fixture_init,fixture_import:fixture_import,fixture_sync:fixture_sync,stub_practice:stub_practice,stub_entity:stub_entity,scaffold_model:scaffold_model,scaffold_model_test:scaffold_model_test,ui:ui,"dev:serve":dev_serve,serve:serve}})];case 3:_state.sent();return[2]}})})()}bootstrap().finally(function(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:if(!migrator)return[3,2];return[4,migrator.destroy()];case 1:_state.sent();_state.label=2;case 2:return[4,_fixturemanager.FixtureManager.destroy()];case 3:_state.sent();return[2]}})})()});function dev_serve(){return _async_to_generator(function(){var nodemon,nodemonConfig,cleanup;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,Promise.resolve().then(function(){return /*#__PURE__*/_interop_require_wildcard(require("nodemon"))})];case 1:nodemon=_state.sent();return[4,function(){return _async_to_generator(function(){var projectNodemonPath,hasProjectNodemon,_;return _ts_generator(this,function(_state){switch(_state.label){case 0:projectNodemonPath=_path.default.join((0,_utils.findApiRootPath)(),"nodemon.json");return[4,(0,_fsutils.exists)(projectNodemonPath)];case 1:hasProjectNodemon=_state.sent();if(!hasProjectNodemon)return[3,3];_=JSON.parse;return[4,(0,_promises.readFile)(projectNodemonPath,"utf8")];case 2:return[2,_.apply(JSON,[_state.sent()])];case 3:return[2,{watch:["src/index.ts"],ignore:["dist/**","**/*.js","**/*.d.ts"],exec:["node --no-warnings -r source-map-support/register -r dotenv/config dist/index.js"].join(" && ")}]}})})()}()];case 2:nodemonConfig=_state.sent();nodemon.default(nodemonConfig);cleanup=function(){return _async_to_generator(function(){var _Sonamu_server;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,(_Sonamu_server=_api.Sonamu.server)===null||_Sonamu_server===void 0?void 0:_Sonamu_server.close()];case 1:_state.sent();_process.default.exit(0);return[2]}})})()};_process.default.on("SIGINT",cleanup);_process.default.on("SIGTERM",cleanup);_process.default.on("SIGUSR2",cleanup);return[2]}})})()}function serve(){return _async_to_generator(function(){var distIndexPath,spawn,serverProcess;return _ts_generator(this,function(_state){switch(_state.label){case 0:distIndexPath=_path.default.join(_api.Sonamu.apiRootPath,"dist","index.js");return[4,(0,_fsutils.exists)(distIndexPath)];case 1:if(!_state.sent()){console.log(_chalk.default.red("dist/index.js not found. Please build your project first."));console.log(_chalk.default.blue("Run: yarn sonamu build"));return[2]}return[4,Promise.resolve().then(function(){return /*#__PURE__*/_interop_require_wildcard(require("child_process"))})];case 2:spawn=_state.sent().spawn;serverProcess=spawn("node",["-r","source-map-support/register","-r","dotenv/config",distIndexPath],{cwd:_api.Sonamu.apiRootPath,stdio:"inherit"});_process.default.on("SIGINT",function(){serverProcess.kill("SIGTERM");_process.default.exit(0)});return[2]}})})()}function setupMigrator(){return _async_to_generator(function(){return _ts_generator(this,function(_state){migrator=new _migrator.Migrator({mode:"dev"});return[2]})})()}function setupFixtureManager(){return _async_to_generator(function(){return _ts_generator(this,function(_state){_fixturemanager.FixtureManager.init();return[2]})})()}function migrate_run(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,setupMigrator()];case 1:_state.sent();return[4,migrator.cleanUpDist()];case 2:_state.sent();return[4,migrator.run()];case 3:_state.sent();return[2]}})})()}function migrate_check(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,setupMigrator()];case 1:_state.sent();return[4,migrator.cleanUpDist()];case 2:_state.sent();return[4,migrator.check()];case 3:_state.sent();return[2]}})})()}function migrate_status(){return _async_to_generator(function(){var status;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,setupMigrator()];case 1:_state.sent();return[4,migrator.getStatus()];case 2:status=_state.sent();console.log(status);return[2]}})})()}function migrate_rollback(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,setupMigrator()];case 1:_state.sent();return[4,migrator.rollback()];case 2:_state.sent();return[2]}})})()}function migrate_clear(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,setupMigrator()];case 1:_state.sent();return[4,migrator.clearPendingList()];case 2:_state.sent();return[2]}})})()}function migrate_reset(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,setupMigrator()];case 1:_state.sent();return[4,migrator.resetAll()];case 2:_state.sent();return[2]}})})()}function fixture_init(){return _async_to_generator(function(){var srcConfig,targets,dumpFilename,srcConn,migrationsDump,_db,_ref,_ref_,migrations,_iteratorAbruptCompletion,_didIteratorError,_iteratorError,_iterator,_step,_value,label,config,toSkip,conn,_config_connection,db,_ref1,_ref_1,row,mysqlCmd,err;return _ts_generator(this,function(_state){switch(_state.label){case 0:srcConfig=_api.Sonamu.dbConfig.development_master;targets=[{label:"(REMOTE) Fixture DB",config:_api.Sonamu.dbConfig.fixture_remote},{label:"(LOCAL) Fixture DB",config:_api.Sonamu.dbConfig.fixture_local,toSkip:function(){var remoteConn=_api.Sonamu.dbConfig.fixture_remote.connection;var localConn=_api.Sonamu.dbConfig.fixture_local.connection;return remoteConn.host===localConn.host&&remoteConn.database===localConn.database}()},{label:"(LOCAL) Testing DB",config:_api.Sonamu.dbConfig.test}];console.log("DUMP...");dumpFilename="/tmp/sonamu-fixture-init-".concat(Date.now(),".sql");srcConn=srcConfig.connection;migrationsDump="/tmp/sonamu-fixture-init-migrations-".concat(Date.now(),".sql");(0,_child_process.execSync)("mysqldump -h".concat(srcConn.host," -u").concat(srcConn.user," -p").concat(srcConn.password," --single-transaction -d --no-create-db --triggers ").concat(srcConn.database," > ").concat(dumpFilename));_db=(0,_knex.default)(srcConfig);return[4,_db.raw("SELECT COUNT(*) as count FROM information_schema.tables WHERE table_schema = ? AND table_name = 'knex_migrations'",[srcConn.database])];case 1:_ref=_sliced_to_array.apply(void 0,[_state.sent(),1]),_ref_=_sliced_to_array(_ref[0],1),migrations=_ref_[0];if(migrations.count>0){(0,_child_process.execSync)("mysqldump -h".concat(srcConn.host," -u").concat(srcConn.user," -p").concat(srcConn.password," --single-transaction --no-create-db --triggers ").concat(srcConn.database," knex_migrations knex_migrations_lock > ").concat(migrationsDump))}_iteratorAbruptCompletion=false,_didIteratorError=false;_state.label=2;case 2:_state.trys.push([2,12,13,18]);_iterator=_async_iterator(targets);_state.label=3;case 3:return[4,_iterator.next()];case 4:if(!(_iteratorAbruptCompletion=!(_step=_state.sent()).done))return[3,11];_value=_step.value;label=_value.label,config=_value.config,toSkip=_value.toSkip;conn=config.connection;if(toSkip===true){console.log(_chalk.default.red("".concat(label,": Skipped!")));return[3,10]}db=(0,_knex.default)(_object_spread_props(_object_spread({},config),{connection:_object_spread_props(_object_spread({},(_config_connection=config.connection)!==null&&_config_connection!==void 0?_config_connection:{}),{database:undefined})}));return[4,db.raw('SHOW DATABASES LIKE "'.concat(conn.database,'"'))];case 5:_ref1=_sliced_to_array.apply(void 0,[_state.sent(),1]),_ref_1=_sliced_to_array(_ref1[0],1),row=_ref_1[0];if(!row)return[3,7];console.log(_chalk.default.yellow("".concat(label,': Database "').concat(conn.database,'" Already exists')));return[4,db.destroy()];case 6:_state.sent();return[3,10];case 7:console.log("SYNC to ".concat(label,"..."));mysqlCmd="mysql -h".concat(conn.host," -u").concat(conn.user," -p").concat(conn.password);(0,_child_process.execSync)("".concat(mysqlCmd," -e 'DROP DATABASE IF EXISTS `").concat(conn.database,"`'"));(0,_child_process.execSync)("".concat(mysqlCmd," -e 'CREATE DATABASE `").concat(conn.database,"`'"));(0,_child_process.execSync)("".concat(mysqlCmd," ").concat(conn.database," < ").concat(dumpFilename));return[4,(0,_fsutils.exists)(migrationsDump)];case 8:if(_state.sent()){(0,_child_process.execSync)("".concat(mysqlCmd," ").concat(conn.database," < ").concat(migrationsDump))}return[4,db.destroy()];case 9:_state.sent();_state.label=10;case 10:_iteratorAbruptCompletion=false;return[3,3];case 11:return[3,18];case 12:err=_state.sent();_didIteratorError=true;_iteratorError=err;return[3,18];case 13:_state.trys.push([13,,16,17]);if(!(_iteratorAbruptCompletion&&_iterator.return!=null))return[3,15];return[4,_iterator.return()];case 14:_state.sent();_state.label=15;case 15:return[3,17];case 16:if(_didIteratorError){throw _iteratorError}return[7];case 17:return[7];case 18:return[4,_db.destroy()];case 19:_state.sent();return[2]}})})()}function fixture_import(entityId,recordIds){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,setupFixtureManager()];case 1:_state.sent();return[4,_fixturemanager.FixtureManager.importFixture(entityId,recordIds)];case 2:_state.sent();return[4,_fixturemanager.FixtureManager.sync()];case 3:_state.sent();return[2]}})})()}function fixture_sync(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,setupFixtureManager()];case 1:_state.sent();return[4,_fixturemanager.FixtureManager.sync()];case 2:_state.sent();return[2]}})})()}function stub_practice(name){return _async_to_generator(function(){var practiceDir,fileNames,maxSeqNo,currentSeqNo,fileName,dstPath,code,runCode;return _ts_generator(this,function(_state){switch(_state.label){case 0:practiceDir=_path.default.join(_api.Sonamu.apiRootPath,"src","practices");return[4,(0,_promises.readdir)(practiceDir)];case 1:fileNames=_state.sent();return[4,function(){return _async_to_generator(function(){var filteredSeqs;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,(0,_fsutils.exists)(practiceDir)];case 1:if(!!_state.sent())return[3,3];return[4,(0,_promises.mkdir)(practiceDir,{recursive:true})];case 2:_state.sent();_state.label=3;case 3:filteredSeqs=fileNames.filter(function(fileName){return fileName.startsWith("p")&&fileName.endsWith(".ts")}).map(function(fileName){var _fileName_match;var _ref=_sliced_to_array((_fileName_match=fileName.match(/^p([0-9]+)\-/))!==null&&_fileName_match!==void 0?_fileName_match:["0","0"],2),seqNo=_ref[1];return parseInt(seqNo)}).sort(function(a,b){return b-a});if(filteredSeqs.length>0){return[2,filteredSeqs[0]]}return[2,0]}})})()}()];case 2:maxSeqNo=_state.sent();currentSeqNo=maxSeqNo+1;fileName="p".concat(currentSeqNo,"-").concat(name,".ts");dstPath=_path.default.join(practiceDir,fileName);code=['import { Sonamu } from "sonamu";',"","console.clear();",'console.log("'.concat(fileName,'");'),"","Sonamu.runScript(async () => {"," // TODO","});",""].join("\n");return[4,(0,_promises.writeFile)(dstPath,code)];case 3:_state.sent();(0,_child_process.execSync)("code ".concat(dstPath));runCode="yarn node -r dotenv/config -r source-map-support/register dist/practices/".concat(fileName.replace(".ts",".js"));console.log("".concat(_chalk.default.blue(runCode)," copied to clipboard."));(0,_child_process.execSync)('echo "'.concat(runCode,'" | pbcopy'));return[2]}})})()}function stub_entity(entityId){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,_api.Sonamu.syncer.createEntity({entityId:entityId})];case 1:_state.sent();return[2]}})})()}function scaffold_model(entityId){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,_api.Sonamu.syncer.generateTemplate("model",{entityId:entityId})];case 1:_state.sent();return[2]}})})()}function scaffold_model_test(entityId){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,_api.Sonamu.syncer.generateTemplate("model_test",{entityId:entityId})];case 1:_state.sent();return[2]}})})()}function ui(){return _async_to_generator(function(){var _Sonamu_config_ui,sonamuUI,_Sonamu_config_projectName,_Sonamu_config_ui_port,e;return _ts_generator(this,function(_state){switch(_state.label){case 0:_state.trys.push([0,2,,3]);return[4,Promise.resolve().then(function(){return /*#__PURE__*/_interop_require_wildcard(require("@sonamu-kit/ui"))})];case 1:sonamuUI=_state.sent();sonamuUI.startServers({projectName:(_Sonamu_config_projectName=_api.Sonamu.config.projectName)!==null&&_Sonamu_config_projectName!==void 0?_Sonamu_config_projectName:_path.default.basename(_api.Sonamu.apiRootPath),apiRootPath:_api.Sonamu.apiRootPath,port:(_Sonamu_config_ui_port=(_Sonamu_config_ui=_api.Sonamu.config.ui)===null||_Sonamu_config_ui===void 0?void 0:_Sonamu_config_ui.port)!==null&&_Sonamu_config_ui_port!==void 0?_Sonamu_config_ui_port:57e3});return[3,3];case 2:e=_state.sent();if(_instanceof(e,Error)&&e.message.includes("isn't declared")){console.log("You need to install ".concat(_chalk.default.blue("@sonamu-kit/ui")," first."));return[2]}throw e;case 3:return[2]}})})()}
2
2
  //# sourceMappingURL=cli.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/bin/cli.ts"],"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 { mkdir, readFile, readdir, writeFile } from \"fs/promises\";\nimport { exists } from \"../utils/fs-utils\";\nimport process from \"process\";\nimport { Sonamu } from \"../api\";\nimport knex, { Knex } from \"knex\";\nimport { EntityManager } from \"../entity/entity-manager\";\nimport { Migrator } from \"../migration/migrator\";\nimport { FixtureManager } from \"../testing/fixture-manager\";\nimport { SWC_BUILD_COMMAND } from \"./build-config\";\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 [\"dev:serve\"],\n [\"serve\"],\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 \"dev:serve\": dev_serve,\n serve,\n },\n });\n}\nbootstrap().finally(async () => {\n if (migrator) {\n await migrator.destroy();\n }\n await FixtureManager.destroy();\n\n /* Global End */\n console.log(chalk.bgBlue(`END ${new Date()}\\n`));\n});\n\nasync function dev_serve() {\n const nodemon = await import(\"nodemon\");\n\n const nodemonConfig = await (async () => {\n const projectNodemonPath = path.join(Sonamu.apiRootPath, \"nodemon.json\");\n const hasProjectNodemon = await exists(projectNodemonPath);\n\n if (hasProjectNodemon) {\n return JSON.parse(await readFile(projectNodemonPath, \"utf8\"));\n }\n\n return {\n watch: [\"src/index.ts\"],\n ignore: [\"dist/**\", \"**/*.js\", \"**/*.d.ts\"],\n exec: [\n SWC_BUILD_COMMAND,\n \"node -r source-map-support/register -r dotenv/config dist/index.js\",\n ].join(\" && \"),\n };\n })();\n\n nodemon.default(nodemonConfig);\n\n // 프로세스 종료 처리\n const cleanup = async () => {\n await Sonamu.server?.close();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n process.on(\"SIGUSR2\", cleanup);\n}\n\nasync function serve() {\n const distIndexPath = path.join(Sonamu.apiRootPath, \"dist\", \"index.js\");\n\n if (!(await exists(distIndexPath))) {\n console.log(\n chalk.red(\"dist/index.js not found. Please build your project first.\")\n );\n console.log(chalk.blue(\"Run: yarn sonamu build\"));\n return;\n }\n\n const { spawn } = await import(\"child_process\");\n const serverProcess = spawn(\n \"node\",\n [\"-r\", \"source-map-support/register\", \"-r\", \"dotenv/config\", distIndexPath],\n {\n cwd: Sonamu.apiRootPath,\n stdio: \"inherit\",\n }\n );\n\n process.on(\"SIGINT\", () => {\n serverProcess.kill(\"SIGTERM\");\n process.exit(0);\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 srcConfig = Sonamu.dbConfig.development_master;\n const targets = [\n {\n label: \"(REMOTE) Fixture DB\",\n config: Sonamu.dbConfig.fixture_remote,\n },\n {\n label: \"(LOCAL) Fixture DB\",\n config: Sonamu.dbConfig.fixture_local,\n toSkip: (() => {\n const remoteConn = Sonamu.dbConfig.fixture_remote\n .connection as Knex.ConnectionConfig;\n const localConn = Sonamu.dbConfig.fixture_local\n .connection as Knex.ConnectionConfig;\n return (\n remoteConn.host === localConn.host &&\n remoteConn.database === localConn.database\n );\n })(),\n },\n {\n label: \"(LOCAL) Testing DB\",\n config: Sonamu.dbConfig.test,\n },\n ] as {\n label: string;\n config: Knex.Config;\n toSkip?: boolean;\n }[];\n\n // 1. 기준DB 스키마를 덤프\n console.log(\"DUMP...\");\n const dumpFilename = `/tmp/sonamu-fixture-init-${Date.now()}.sql`;\n const srcConn = srcConfig.connection as Knex.ConnectionConfig;\n const migrationsDump = `/tmp/sonamu-fixture-init-migrations-${Date.now()}.sql`;\n execSync(\n `mysqldump -h${srcConn.host} -u${srcConn.user} -p${srcConn.password} --single-transaction -d --no-create-db --triggers ${srcConn.database} > ${dumpFilename}`\n );\n const _db = knex(srcConfig);\n const [[migrations]] = await _db.raw(\n \"SELECT COUNT(*) as count FROM information_schema.tables WHERE table_schema = ? AND table_name = 'knex_migrations'\",\n [srcConn.database]\n );\n if (migrations.count > 0) {\n execSync(\n `mysqldump -h${srcConn.host} -u${srcConn.user} -p${srcConn.password} --single-transaction --no-create-db --triggers ${srcConn.database} knex_migrations knex_migrations_lock > ${migrationsDump}`\n );\n }\n\n // 2. 대상DB 각각에 대하여 존재여부 확인 후 붓기\n for await (const { label, config, toSkip } of targets) {\n const conn = config.connection as Knex.ConnectionConfig;\n\n if (toSkip === true) {\n console.log(chalk.red(`${label}: Skipped!`));\n continue;\n }\n\n const db = knex({\n ...config,\n connection: {\n ...((config.connection ?? {}) as Knex.ConnectionConfig),\n database: undefined,\n },\n });\n const [[row]] = await db.raw(`SHOW DATABASES LIKE \"${conn.database}\"`);\n if (row) {\n console.log(\n chalk.yellow(`${label}: Database \"${conn.database}\" Already exists`)\n );\n await db.destroy();\n continue;\n }\n\n console.log(`SYNC to ${label}...`);\n const mysqlCmd = `mysql -h${conn.host} -u${conn.user} -p${conn.password}`;\n execSync(`${mysqlCmd} -e 'DROP DATABASE IF EXISTS \\`${conn.database}\\`'`);\n execSync(`${mysqlCmd} -e 'CREATE DATABASE \\`${conn.database}\\`'`);\n execSync(`${mysqlCmd} ${conn.database} < ${dumpFilename}`);\n if (await exists(migrationsDump)) {\n execSync(`${mysqlCmd} ${conn.database} < ${migrationsDump}`);\n }\n\n await db.destroy();\n }\n\n await _db.destroy();\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 = await readdir(practiceDir);\n\n const maxSeqNo = await (async () => {\n if (!(await exists(practiceDir))) {\n await mkdir(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 await writeFile(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 type StartServersOptions = {\n projectName: string;\n apiRootPath: string;\n port: number;\n };\n const sonamuUI: {\n startServers: (options: StartServersOptions) => void;\n } = await import(\"@sonamu-kit/ui\" as string);\n sonamuUI.startServers({\n projectName:\n Sonamu.config.projectName ?? path.basename(Sonamu.apiRootPath),\n apiRootPath: Sonamu.apiRootPath,\n port: Sonamu.config.ui?.port ?? 57000,\n });\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"],"names":["console","log","chalk","bgBlue","Date","dotenv","config","migrator","bootstrap","Sonamu","init","tsicli","process","argv","types","type","name","message","choices","EntityManager","getAllParentIds","map","entityId","title","value","args","runners","migrate_run","migrate_check","migrate_rollback","migrate_clear","migrate_reset","migrate_status","fixture_init","fixture_import","fixture_sync","stub_practice","stub_entity","scaffold_model","scaffold_model_test","ui","dev_serve","serve","finally","destroy","FixtureManager","nodemon","nodemonConfig","cleanup","projectNodemonPath","hasProjectNodemon","path","join","apiRootPath","exists","JSON","parse","readFile","watch","ignore","exec","SWC_BUILD_COMMAND","default","server","close","exit","on","distIndexPath","spawn","serverProcess","red","blue","cwd","stdio","kill","setupMigrator","Migrator","mode","setupFixtureManager","cleanUpDist","run","check","status","getStatus","rollback","clearPendingList","resetAll","srcConfig","targets","dumpFilename","srcConn","migrationsDump","_db","migrations","label","toSkip","conn","db","row","mysqlCmd","dbConfig","development_master","fixture_remote","fixture_local","remoteConn","connection","localConn","host","database","test","now","execSync","user","password","knex","raw","count","undefined","yellow","recordIds","importFixture","sync","practiceDir","fileNames","maxSeqNo","currentSeqNo","fileName","dstPath","code","runCode","readdir","filteredSeqs","mkdir","recursive","filter","startsWith","endsWith","match","seqNo","parseInt","sort","a","b","length","writeFile","replace","syncer","createEntity","generateTemplate","sonamuUI","e","startServers","projectName","basename","port","Error","includes"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/bin/cli.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport dotenv from \"dotenv\";\ndotenv.config();\n\nimport path from \"path\";\nimport { tsicli } from \"tsicli\";\nimport { execSync } from \"child_process\";\nimport { mkdir, readdir, readFile, writeFile } from \"fs/promises\";\nimport { exists } from \"../utils/fs-utils\";\nimport process from \"process\";\nimport { Sonamu } from \"../api\";\nimport knex, { Knex } from \"knex\";\nimport { findApiRootPath } from \"../utils/utils\";\nimport { EntityManager } from \"../entity/entity-manager\";\nimport { Migrator } from \"../migration/migrator\";\nimport { FixtureManager } from \"../testing/fixture-manager\";\n// import { SWC_BUILD_COMMAND } from \"./build-config\";\nimport { NodemonSettings } from \"nodemon\";\n\nlet migrator: Migrator;\n\nasync function bootstrap() {\n // dev:serve 명령어가 아닌 경우에만 Sonamu 초기화\n if (process.argv[2] !== \"dev:serve\") {\n await Sonamu.init(false, false);\n }\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 [\"dev:serve\"],\n [\"serve\"],\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 \"dev:serve\": dev_serve,\n serve,\n },\n });\n}\nbootstrap().finally(async () => {\n if (migrator) {\n await migrator.destroy();\n }\n await FixtureManager.destroy();\n});\n\nasync function dev_serve() {\n const nodemon = await import(\"nodemon\");\n\n const nodemonConfig = await (async () => {\n const projectNodemonPath = path.join(findApiRootPath(), \"nodemon.json\");\n const hasProjectNodemon = await exists(projectNodemonPath);\n\n if (hasProjectNodemon) {\n return JSON.parse(await readFile(projectNodemonPath, \"utf8\"));\n }\n\n return {\n watch: [\"src/index.ts\"],\n ignore: [\"dist/**\", \"**/*.js\", \"**/*.d.ts\"],\n exec: [\n // SWC_BUILD_COMMAND,\n \"node --no-warnings -r source-map-support/register -r dotenv/config dist/index.js\",\n ].join(\" && \"),\n } as NodemonSettings;\n })();\n nodemon.default(nodemonConfig);\n\n // 프로세스 종료 처리\n const cleanup = async () => {\n await Sonamu.server?.close();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n process.on(\"SIGUSR2\", cleanup);\n}\n\nasync function serve() {\n const distIndexPath = path.join(Sonamu.apiRootPath, \"dist\", \"index.js\");\n\n if (!(await exists(distIndexPath))) {\n console.log(\n chalk.red(\"dist/index.js not found. Please build your project first.\")\n );\n console.log(chalk.blue(\"Run: yarn sonamu build\"));\n return;\n }\n\n const { spawn } = await import(\"child_process\");\n const serverProcess = spawn(\n \"node\",\n [\"-r\", \"source-map-support/register\", \"-r\", \"dotenv/config\", distIndexPath],\n {\n cwd: Sonamu.apiRootPath,\n stdio: \"inherit\",\n }\n );\n\n process.on(\"SIGINT\", () => {\n serverProcess.kill(\"SIGTERM\");\n process.exit(0);\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 srcConfig = Sonamu.dbConfig.development_master;\n const targets = [\n {\n label: \"(REMOTE) Fixture DB\",\n config: Sonamu.dbConfig.fixture_remote,\n },\n {\n label: \"(LOCAL) Fixture DB\",\n config: Sonamu.dbConfig.fixture_local,\n toSkip: (() => {\n const remoteConn = Sonamu.dbConfig.fixture_remote\n .connection as Knex.ConnectionConfig;\n const localConn = Sonamu.dbConfig.fixture_local\n .connection as Knex.ConnectionConfig;\n return (\n remoteConn.host === localConn.host &&\n remoteConn.database === localConn.database\n );\n })(),\n },\n {\n label: \"(LOCAL) Testing DB\",\n config: Sonamu.dbConfig.test,\n },\n ] as {\n label: string;\n config: Knex.Config;\n toSkip?: boolean;\n }[];\n\n // 1. 기준DB 스키마를 덤프\n console.log(\"DUMP...\");\n const dumpFilename = `/tmp/sonamu-fixture-init-${Date.now()}.sql`;\n const srcConn = srcConfig.connection as Knex.ConnectionConfig;\n const migrationsDump = `/tmp/sonamu-fixture-init-migrations-${Date.now()}.sql`;\n execSync(\n `mysqldump -h${srcConn.host} -u${srcConn.user} -p${srcConn.password} --single-transaction -d --no-create-db --triggers ${srcConn.database} > ${dumpFilename}`\n );\n const _db = knex(srcConfig);\n const [[migrations]] = await _db.raw(\n \"SELECT COUNT(*) as count FROM information_schema.tables WHERE table_schema = ? AND table_name = 'knex_migrations'\",\n [srcConn.database]\n );\n if (migrations.count > 0) {\n execSync(\n `mysqldump -h${srcConn.host} -u${srcConn.user} -p${srcConn.password} --single-transaction --no-create-db --triggers ${srcConn.database} knex_migrations knex_migrations_lock > ${migrationsDump}`\n );\n }\n\n // 2. 대상DB 각각에 대하여 존재여부 확인 후 붓기\n for await (const { label, config, toSkip } of targets) {\n const conn = config.connection as Knex.ConnectionConfig;\n\n if (toSkip === true) {\n console.log(chalk.red(`${label}: Skipped!`));\n continue;\n }\n\n const db = knex({\n ...config,\n connection: {\n ...((config.connection ?? {}) as Knex.ConnectionConfig),\n database: undefined,\n },\n });\n const [[row]] = await db.raw(`SHOW DATABASES LIKE \"${conn.database}\"`);\n if (row) {\n console.log(\n chalk.yellow(`${label}: Database \"${conn.database}\" Already exists`)\n );\n await db.destroy();\n continue;\n }\n\n console.log(`SYNC to ${label}...`);\n const mysqlCmd = `mysql -h${conn.host} -u${conn.user} -p${conn.password}`;\n execSync(`${mysqlCmd} -e 'DROP DATABASE IF EXISTS \\`${conn.database}\\`'`);\n execSync(`${mysqlCmd} -e 'CREATE DATABASE \\`${conn.database}\\`'`);\n execSync(`${mysqlCmd} ${conn.database} < ${dumpFilename}`);\n if (await exists(migrationsDump)) {\n execSync(`${mysqlCmd} ${conn.database} < ${migrationsDump}`);\n }\n\n await db.destroy();\n }\n\n await _db.destroy();\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 = await readdir(practiceDir);\n\n const maxSeqNo = await (async () => {\n if (!(await exists(practiceDir))) {\n await mkdir(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 const code = [\n `import { Sonamu } from \"sonamu\";`,\n \"\",\n `console.clear();`,\n `console.log(\"${fileName}\");`,\n \"\",\n `Sonamu.runScript(async () => {`,\n ` // TODO`,\n `});`,\n \"\",\n ].join(\"\\n\");\n await writeFile(dstPath, code);\n\n execSync(`code ${dstPath}`);\n\n const runCode = `yarn node -r dotenv/config -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 type StartServersOptions = {\n projectName: string;\n apiRootPath: string;\n port: number;\n };\n const sonamuUI: {\n startServers: (options: StartServersOptions) => void;\n } = await import(\"@sonamu-kit/ui\" as string);\n sonamuUI.startServers({\n projectName:\n Sonamu.config.projectName ?? path.basename(Sonamu.apiRootPath),\n apiRootPath: Sonamu.apiRootPath,\n port: Sonamu.config.ui?.port ?? 57000,\n });\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"],"names":["dotenv","config","migrator","bootstrap","process","argv","Sonamu","init","tsicli","types","type","name","message","choices","EntityManager","getAllParentIds","map","entityId","title","value","args","runners","migrate_run","migrate_check","migrate_rollback","migrate_clear","migrate_reset","migrate_status","fixture_init","fixture_import","fixture_sync","stub_practice","stub_entity","scaffold_model","scaffold_model_test","ui","dev_serve","serve","finally","destroy","FixtureManager","nodemon","nodemonConfig","cleanup","projectNodemonPath","hasProjectNodemon","path","join","findApiRootPath","exists","JSON","parse","readFile","watch","ignore","exec","default","server","close","exit","on","distIndexPath","spawn","serverProcess","apiRootPath","console","log","chalk","red","blue","cwd","stdio","kill","setupMigrator","Migrator","mode","setupFixtureManager","cleanUpDist","run","check","status","getStatus","rollback","clearPendingList","resetAll","srcConfig","targets","dumpFilename","srcConn","migrationsDump","_db","migrations","label","toSkip","conn","db","row","mysqlCmd","dbConfig","development_master","fixture_remote","fixture_local","remoteConn","connection","localConn","host","database","test","Date","now","execSync","user","password","knex","raw","count","undefined","yellow","recordIds","importFixture","sync","practiceDir","fileNames","maxSeqNo","currentSeqNo","fileName","dstPath","code","runCode","readdir","filteredSeqs","mkdir","recursive","filter","startsWith","endsWith","match","seqNo","parseInt","sort","a","b","length","writeFile","replace","syncer","createEntity","generateTemplate","sonamuUI","e","startServers","projectName","basename","port","Error","includes"],"mappings":"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"}
@@ -13,7 +13,7 @@ export declare class BaseModelClass {
13
13
  getInsertedIds(wdb: Knex, rows: any[], tableName: string, unqKeyFields: string[], chunkSize?: number): Promise<number[]>;
14
14
  useLoaders(db: Knex, rows: any[], loaders: SubsetQuery["loaders"]): Promise<any[]>;
15
15
  hydrate<T>(rows: T[]): T[];
16
- runSubsetQuery<T extends BaseListParams, U extends string>({ params, baseTable, subset, subsetQuery, build, debug, db: _db, optimizeCountQuery, }: {
16
+ runSubsetQuery<T extends BaseListParams, U extends string>({ params, baseTable, subset, subsetQuery, build, afterBuild, debug, db: _db, optimizeCountQuery, }: {
17
17
  subset: U;
18
18
  params: T;
19
19
  subsetQuery: SubsetQuery;
@@ -24,6 +24,13 @@ export declare class BaseModelClass {
24
24
  joins: SubsetQuery["joins"];
25
25
  virtual: string[];
26
26
  }) => Knex.QueryBuilder;
27
+ afterBuild?: (buildParams: {
28
+ qb: Knex.QueryBuilder;
29
+ db: Knex;
30
+ select: (string | Knex.Raw)[];
31
+ joins: SubsetQuery["joins"];
32
+ virtual: string[];
33
+ }) => Knex.QueryBuilder;
27
34
  baseTable?: string;
28
35
  debug?: boolean | "list" | "count";
29
36
  db?: Knex;
@@ -1 +1 @@
1
- {"version":3,"file":"base-model.d.ts","sourceRoot":"","sources":["../../src/database/base-model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,QAAQ,EAAM,MAAM,MAAM,CAAC;AACpC,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,qBAAa,cAAc;IAClB,SAAS,EAAE,MAAM,CAAa;IAGrC,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI5B,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,WAAW;IAY/B,OAAO;IAIb,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAQ3B,cAAc,CAClB,GAAG,EAAE,IAAI,EACT,IAAI,EAAE,GAAG,EAAE,EACX,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,GAAE,MAAY;IAkCnB,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC;IAiFvE,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAiDpB,cAAc,CAAC,CAAC,SAAS,cAAc,EAAE,CAAC,SAAS,MAAM,EAAE,EAC/D,MAAM,EACN,SAAS,EACT,MAAM,EACN,WAAW,EACX,KAAK,EACL,KAAK,EACL,EAAE,EAAE,GAAG,EACP,kBAAkB,GACnB,EAAE;QACD,MAAM,EAAE,CAAC,CAAC;QACV,MAAM,EAAE,CAAC,CAAC;QACV,WAAW,EAAE,WAAW,CAAC;QACzB,KAAK,EAAE,CAAC,WAAW,EAAE;YACnB,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC;YACtB,EAAE,EAAE,IAAI,CAAC;YACT,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;SACnB,KAAK,IAAI,CAAC,YAAY,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;QACnC,EAAE,CAAC,EAAE,IAAI,CAAC;QACV,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,GAAG,OAAO,CAAC;QACV,IAAI,EAAE,GAAG,EAAE,CAAC;QACZ,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC3B,WAAW,EAAE,WAAW,CAAC;QACzB,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC;KACvB,CAAC;IA+HF,aAAa,CACX,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EACtB,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GACjC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAQhB,gBAAgB,IAAI,aAAa;CAGlC;AACD,eAAO,MAAM,SAAS,gBAAuB,CAAC"}
1
+ {"version":3,"file":"base-model.d.ts","sourceRoot":"","sources":["../../src/database/base-model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,QAAQ,EAAM,MAAM,MAAM,CAAC;AACpC,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,qBAAa,cAAc;IAClB,SAAS,EAAE,MAAM,CAAa;IAGrC,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI5B,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,WAAW;IAY/B,OAAO;IAIb,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAQ3B,cAAc,CAClB,GAAG,EAAE,IAAI,EACT,IAAI,EAAE,GAAG,EAAE,EACX,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,GAAE,MAAY;IAkCnB,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC;IAiFvE,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAiDpB,cAAc,CAAC,CAAC,SAAS,cAAc,EAAE,CAAC,SAAS,MAAM,EAAE,EAC/D,MAAM,EACN,SAAS,EACT,MAAM,EACN,WAAW,EACX,KAAK,EACL,UAAU,EACV,KAAK,EACL,EAAE,EAAE,GAAG,EACP,kBAAkB,GACnB,EAAE;QACD,MAAM,EAAE,CAAC,CAAC;QACV,MAAM,EAAE,CAAC,CAAC;QACV,WAAW,EAAE,WAAW,CAAC;QACzB,KAAK,EAAE,CAAC,WAAW,EAAE;YACnB,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC;YACtB,EAAE,EAAE,IAAI,CAAC;YACT,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;SACnB,KAAK,IAAI,CAAC,YAAY,CAAC;QACxB,UAAU,CAAC,EAAE,CAAC,WAAW,EAAE;YACzB,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC;YACtB,EAAE,EAAE,IAAI,CAAC;YACT,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;SACnB,KAAK,IAAI,CAAC,YAAY,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;QACnC,EAAE,CAAC,EAAE,IAAI,CAAC;QACV,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,GAAG,OAAO,CAAC;QACV,IAAI,EAAE,GAAG,EAAE,CAAC;QACZ,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC3B,WAAW,EAAE,WAAW,CAAC;QACzB,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC;KACvB,CAAC;IAiJF,aAAa,CACX,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EACtB,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GACjC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAQhB,gBAAgB,IAAI,aAAa;CAGlC;AACD,eAAO,MAAM,SAAS,gBAAuB,CAAC"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get BaseModel(){return BaseModel},get BaseModelClass(){return BaseModelClass}});var _luxon=require("luxon");var _lodash=require("lodash");var _db=require("./db");var _types=require("../types/types");var _inflection=/*#__PURE__*/_interop_require_default(require("inflection"));var _chalk=/*#__PURE__*/_interop_require_default(require("chalk"));var _upsertbuilder=require("./upsert-builder");var _nodesqlparser=/*#__PURE__*/_interop_require_default(require("node-sql-parser"));var _sqlparser=require("../utils/sql-parser");var _puriwrapper=require("./puri-wrapper");function _array_like_to_array(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _array_without_holes(arr){if(Array.isArray(arr))return _array_like_to_array(arr)}function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{Promise.resolve(value).then(_next,_throw)}}function _async_to_generator(fn){return function(){var self=this,args=arguments;return new Promise(function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value)}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err)}_next(undefined)})}}function _class_call_check(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}function _create_class(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _iterable_to_array(iter){if(typeof Symbol!=="undefined"&&iter[Symbol.iterator]!=null||iter["@@iterator"]!=null)return Array.from(iter)}function _non_iterable_spread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _to_consumable_array(arr){return _array_without_holes(arr)||_iterable_to_array(arr)||_unsupported_iterable_to_array(arr)||_non_iterable_spread()}function _unsupported_iterable_to_array(o,minLen){if(!o)return;if(typeof o==="string")return _array_like_to_array(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _array_like_to_array(o,minLen)}function _ts_generator(thisArg,body){var f,y,t,_={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},g=Object.create((typeof Iterator==="function"?Iterator:Object).prototype);return g.next=verb(0),g["throw"]=verb(1),g["return"]=verb(2),typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(g&&(g=0,op[0]&&(_=0)),_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(op[0]===6&&_.label<t[1]){_.label=t[1];t=op;break}if(t&&_.label<t[2]){_.label=t[2];_.ops.push(op);break}if(t[2])_.ops.pop();_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e];y=0}finally{f=t=0}if(op[0]&5)throw op[1];return{value:op[0]?op[1]:void 0,done:true}}}function _ts_values(o){var s=typeof Symbol==="function"&&Symbol.iterator,m=s&&o[s],i=0;if(m)return m.call(o);if(o&&typeof o.length==="number")return{next:function(){if(o&&i>=o.length)o=void 0;return{value:o&&o[i++],done:!o}}};throw new TypeError(s?"Object is not iterable.":"Symbol.iterator is not defined.")}var BaseModelClass=/*#__PURE__*/function(){"use strict";function BaseModelClass(){_class_call_check(this,BaseModelClass);_define_property(this,"modelName","Unknown")}_create_class(BaseModelClass,[{key:"getDB",value:function getDB(which){return _db.DB.getDB(which)}},{key:"getPuri",value:function getPuri(which){var trx=_db.DB.getTransactionContext().getTransaction(which);if(trx){return trx}var db=this.getDB(which);return new _puriwrapper.PuriWrapper(db,this.getUpsertBuilder())}},{key:"destroy",value:function destroy(){return _async_to_generator(function(){return _ts_generator(this,function(_state){return[2,_db.DB.destroy()]})})()}},{key:"myNow",value:function myNow(timestamp){var dt=timestamp===undefined?_luxon.DateTime.local():_luxon.DateTime.fromSeconds(timestamp);return dt.toFormat("yyyy-MM-dd HH:mm:ss")}},{key:"getInsertedIds",value:function getInsertedIds(wdb,rows,tableName,unqKeyFields){var chunkSize=arguments.length>4&&arguments[4]!==void 0?arguments[4]:500;return _async_to_generator(function(){var unqKeys,whereInField,selectField,chunks,resultIds,_iteratorNormalCompletion,_didIteratorError,_iteratorError,_iterator,_step,_$chunk,dbRows,err;return _ts_generator(this,function(_state){switch(_state.label){case 0:if(!wdb){wdb=this.getDB("w")}if(unqKeyFields.length>1){whereInField=wdb.raw("CONCAT_WS('_', '".concat(unqKeyFields.join(","),"')"));selectField="".concat(whereInField," as tmpUid");unqKeys=rows.map(function(row){return unqKeyFields.map(function(field){return row[field]}).join("_")})}else{whereInField=unqKeyFields[0];selectField=unqKeyFields[0];unqKeys=rows.map(function(row){return row[unqKeyFields[0]]})}chunks=(0,_lodash.chunk)(unqKeys,chunkSize);resultIds=[];_iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;_state.label=1;case 1:_state.trys.push([1,6,7,8]);_iterator=chunks[Symbol.iterator]();_state.label=2;case 2:if(!!(_iteratorNormalCompletion=(_step=_iterator.next()).done))return[3,5];_$chunk=_step.value;return[4,wdb(tableName).select("id",wdb.raw(selectField)).whereIn(whereInField,_$chunk)];case 3:dbRows=_state.sent();resultIds=resultIds.concat(dbRows.map(function(dbRow){return parseInt(dbRow.id)}));_state.label=4;case 4:_iteratorNormalCompletion=true;return[3,2];case 5:return[3,8];case 6:err=_state.sent();_didIteratorError=true;_iteratorError=err;return[3,8];case 7:try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}return[7];case 8:return[2,resultIds]}})}).call(this)}},{key:"useLoaders",value:function useLoaders(db,rows,loaders){return _async_to_generator(function(){var _this,_iteratorNormalCompletion,_didIteratorError,_iteratorError,_this1,_loop,_iterator,_step,err;return _ts_generator(this,function(_state){switch(_state.label){case 0:_this=this;if(loaders.length===0){return[2,rows]}_iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;_state.label=1;case 1:_state.trys.push([1,6,7,8]);_loop=function(){var loader,subQ,subRows,toCol,fromIds,idColumn,idColumn1,subRowGroups;return _ts_generator(this,function(_state){switch(_state.label){case 0:loader=_step.value;subQ=void 0;subRows=void 0;toCol=void 0;fromIds=rows.map(function(row){return row[loader.manyJoin.idField]});if(loader.manyJoin.through===undefined){idColumn="".concat(loader.manyJoin.toTable,".").concat(loader.manyJoin.toCol);subQ=db(loader.manyJoin.toTable).whereIn(idColumn,fromIds).select(_to_consumable_array(loader.select).concat([idColumn]));loader.oneJoins.map(function(join){if(join.join=="inner"){subQ.innerJoin("".concat(join.table," as ").concat(join.as),_this.getJoinClause(db,join))}else if(join.join=="outer"){subQ.leftOuterJoin("".concat(join.table," as ").concat(join.as),_this.getJoinClause(db,join))}});toCol=loader.manyJoin.toCol}else{idColumn1="".concat(loader.manyJoin.through.table,".").concat(loader.manyJoin.through.fromCol);subQ=db(loader.manyJoin.through.table).join(loader.manyJoin.toTable,"".concat(loader.manyJoin.through.table,".").concat(loader.manyJoin.through.toCol),"".concat(loader.manyJoin.toTable,".").concat(loader.manyJoin.toCol)).whereIn(idColumn1,fromIds).select((0,_lodash.uniq)(_to_consumable_array(loader.select).concat([idColumn1])));loader.oneJoins.map(function(join){if(join.join=="inner"){subQ.innerJoin("".concat(join.table," as ").concat(join.as),_this.getJoinClause(db,join))}else if(join.join=="outer"){subQ.leftOuterJoin("".concat(join.table," as ").concat(join.as),_this.getJoinClause(db,join))}});toCol=loader.manyJoin.through.fromCol}return[4,subQ];case 1:subRows=_state.sent();if(!loader.loaders)return[3,3];return[4,_this1.useLoaders(db,subRows,loader.loaders)];case 2:subRows=_state.sent();_state.label=3;case 3:subRowGroups=(0,_lodash.groupBy)(subRows,toCol);rows=rows.map(function(row){var _subRowGroups_row_loader_manyJoin_idField;row[loader.as]=((_subRowGroups_row_loader_manyJoin_idField=subRowGroups[row[loader.manyJoin.idField]])!==null&&_subRowGroups_row_loader_manyJoin_idField!==void 0?_subRowGroups_row_loader_manyJoin_idField:[]).map(function(r){return(0,_lodash.omit)(r,toCol)});return row});return[2]}})};_iterator=loaders[Symbol.iterator]();_state.label=2;case 2:if(!!(_iteratorNormalCompletion=(_step=_iterator.next()).done))return[3,5];_this1=this;return[5,_ts_values(_loop())];case 3:_state.sent();_state.label=4;case 4:_iteratorNormalCompletion=true;return[3,2];case 5:return[3,8];case 6:err=_state.sent();_didIteratorError=true;_iteratorError=err;return[3,8];case 7:try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}return[7];case 8:return[2,rows]}})}).call(this)}},{key:"hydrate",value:function hydrate(rows){var _this=this;return rows.map(function(row){var nestedKeys=Object.keys(row).filter(function(key){return key.includes("__")});var groups=(0,_lodash.groupBy)(nestedKeys,function(key){return key.split("__")[0]});var nullKeys=Object.keys(groups).filter(function(key){return groups[key].length>1&&groups[key].every(function(field){return row[field]===null||Array.isArray(row[field])&&row[field].length===0})});var hydrated=Object.keys(row).reduce(function(r,field){if(!field.includes("__")){if(Array.isArray(row[field])&&(0,_lodash.isObject)(row[field][0])){r[field]=_this.hydrate(row[field]);return r}else{r[field]=row[field];return r}}var parts=field.split("__");var objPath=parts[0]+parts.slice(1).map(function(part){return"[".concat(part,"]")}).join("");(0,_lodash.set)(r,objPath,row[field]&&Array.isArray(row[field])&&(0,_lodash.isObject)(row[field][0])?_this.hydrate(row[field]):row[field]);return r},{});nullKeys.map(function(nullKey){return hydrated[nullKey]=null});return hydrated})}},{key:"runSubsetQuery",value:function runSubsetQuery(_0){return _async_to_generator(function(param){var _this,params,baseTable,subset,subsetQuery,build,debug,_db,optimizeCountQuery,db,_params_queryMode,queryMode,select,virtual,joins,loaders,qb,applyJoinClause,total,rows;return _ts_generator(this,function(_state){switch(_state.label){case 0:_this=this;params=param.params,baseTable=param.baseTable,subset=param.subset,subsetQuery=param.subsetQuery,build=param.build,debug=param.debug,_db=param.db,optimizeCountQuery=param.optimizeCountQuery;db=_db!==null&&_db!==void 0?_db:this.getDB(subset.startsWith("A")?"w":"r");baseTable=baseTable!==null&&baseTable!==void 0?baseTable:_inflection.default.pluralize(_inflection.default.underscore(this.modelName));queryMode=(_params_queryMode=params.queryMode)!==null&&_params_queryMode!==void 0?_params_queryMode:params.id!==undefined?"list":"both";select=subsetQuery.select,virtual=subsetQuery.virtual,joins=subsetQuery.joins,loaders=subsetQuery.loaders;qb=build({qb:db.from(baseTable),db:db,select:select,joins:joins,virtual:virtual});applyJoinClause=function(qb,joins){joins.map(function(join){if(join.join=="inner"){qb.innerJoin("".concat(join.table," as ").concat(join.as),_this.getJoinClause(db,join))}else if(join.join=="outer"){qb.leftOuterJoin("".concat(join.table," as ").concat(join.as),_this.getJoinClause(db,join))}})};return[4,function(){return _async_to_generator(function(){var clonedQb,parser,parsedQuery,tables,needToJoin,parsedQuery1,q,countQuery,countRow,_countRow_total;return _ts_generator(this,function(_state){switch(_state.label){case 0:if(queryMode==="list"){return[2,undefined]}clonedQb=qb.clone().clear("order").clear("offset").clear("limit");parser=new _nodesqlparser.default.Parser;if(optimizeCountQuery){parsedQuery=parser.astify(clonedQb.toQuery());tables=(0,_sqlparser.getTableNamesFromWhere)(parsedQuery);needToJoin=(0,_lodash.uniq)(tables.flatMap(function(table){return table.split("__").map(function(t){return _inflection.default.pluralize(t)})}));applyJoinClause(clonedQb,joins.filter(function(j){return needToJoin.includes(j.table)}))}else{applyJoinClause(clonedQb,joins)}parsedQuery1=parser.astify(clonedQb.toQuery());q=Array.isArray(parsedQuery1)?parsedQuery1[0]:parsedQuery1;if(q.type!=="select"){throw new Error("Invalid query")}countQuery=q.distinct!==null?clonedQb.clear("select").select(db.raw("COUNT(DISTINCT `".concat((0,_sqlparser.getTableName)(q.columns[0].expr),"`.`").concat(q.columns[0].expr.column,"`) as total"))).first():clonedQb.clear("select").count("*",{as:"total"}).first();return[4,countQuery];case 1:countRow=_state.sent();if(debug===true||debug==="count"){console.debug("DEBUG: count query",_chalk.default.blue(countQuery.toQuery().toString()))}return[2,(_countRow_total=countRow===null||countRow===void 0?void 0:countRow.total)!==null&&_countRow_total!==void 0?_countRow_total:0]}})})()}()];case 1:total=_state.sent();return[4,function(){return _async_to_generator(function(){var listQuery,rows;return _ts_generator(this,function(_state){switch(_state.label){case 0:if(queryMode==="count"){return[2,[]]}if(params.num!==0){qb.limit(params.num);qb.offset(params.num*(params.page-1))}listQuery=qb.clone().select(select);applyJoinClause(listQuery,joins);return[4,listQuery];case 1:rows=_state.sent();if(debug===true||debug==="list"){console.debug("DEBUG: list query",_chalk.default.blue(listQuery.toQuery().toString()))}return[4,this.useLoaders(db,rows,loaders)];case 2:rows=_state.sent();rows=this.hydrate(rows);return[2,rows]}})}).call(_this)}()];case 2:rows=_state.sent();return[2,{rows:rows,total:total,subsetQuery:subsetQuery,qb:qb}]}})}).apply(this,arguments)}},{key:"getJoinClause",value:function getJoinClause(db,join){if(!(0,_types.isCustomJoinClause)(join)){return db.raw("".concat(join.from," = ").concat(join.to))}else{return db.raw(join.custom)}}},{key:"getUpsertBuilder",value:function getUpsertBuilder(){return new _upsertbuilder.UpsertBuilder}}]);return BaseModelClass}();var BaseModel=new BaseModelClass;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get BaseModel(){return BaseModel},get BaseModelClass(){return BaseModelClass}});var _luxon=require("luxon");var _lodash=require("lodash");var _db=require("./db");var _types=require("../types/types");var _inflection=/*#__PURE__*/_interop_require_default(require("inflection"));var _chalk=/*#__PURE__*/_interop_require_default(require("chalk"));var _upsertbuilder=require("./upsert-builder");var _nodesqlparser=/*#__PURE__*/_interop_require_default(require("node-sql-parser"));var _sqlparser=require("../utils/sql-parser");var _puriwrapper=require("./puri-wrapper");function _array_like_to_array(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _array_without_holes(arr){if(Array.isArray(arr))return _array_like_to_array(arr)}function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{Promise.resolve(value).then(_next,_throw)}}function _async_to_generator(fn){return function(){var self=this,args=arguments;return new Promise(function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value)}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err)}_next(undefined)})}}function _class_call_check(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}function _create_class(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _iterable_to_array(iter){if(typeof Symbol!=="undefined"&&iter[Symbol.iterator]!=null||iter["@@iterator"]!=null)return Array.from(iter)}function _non_iterable_spread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _to_consumable_array(arr){return _array_without_holes(arr)||_iterable_to_array(arr)||_unsupported_iterable_to_array(arr)||_non_iterable_spread()}function _unsupported_iterable_to_array(o,minLen){if(!o)return;if(typeof o==="string")return _array_like_to_array(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _array_like_to_array(o,minLen)}function _ts_generator(thisArg,body){var f,y,t,_={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},g=Object.create((typeof Iterator==="function"?Iterator:Object).prototype);return g.next=verb(0),g["throw"]=verb(1),g["return"]=verb(2),typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(g&&(g=0,op[0]&&(_=0)),_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(op[0]===6&&_.label<t[1]){_.label=t[1];t=op;break}if(t&&_.label<t[2]){_.label=t[2];_.ops.push(op);break}if(t[2])_.ops.pop();_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e];y=0}finally{f=t=0}if(op[0]&5)throw op[1];return{value:op[0]?op[1]:void 0,done:true}}}function _ts_values(o){var s=typeof Symbol==="function"&&Symbol.iterator,m=s&&o[s],i=0;if(m)return m.call(o);if(o&&typeof o.length==="number")return{next:function(){if(o&&i>=o.length)o=void 0;return{value:o&&o[i++],done:!o}}};throw new TypeError(s?"Object is not iterable.":"Symbol.iterator is not defined.")}var BaseModelClass=/*#__PURE__*/function(){"use strict";function BaseModelClass(){_class_call_check(this,BaseModelClass);_define_property(this,"modelName","Unknown")}_create_class(BaseModelClass,[{key:"getDB",value:function getDB(which){return _db.DB.getDB(which)}},{key:"getPuri",value:function getPuri(which){var trx=_db.DB.getTransactionContext().getTransaction(which);if(trx){return trx}var db=this.getDB(which);return new _puriwrapper.PuriWrapper(db,this.getUpsertBuilder())}},{key:"destroy",value:function destroy(){return _async_to_generator(function(){return _ts_generator(this,function(_state){return[2,_db.DB.destroy()]})})()}},{key:"myNow",value:function myNow(timestamp){var dt=timestamp===undefined?_luxon.DateTime.local():_luxon.DateTime.fromSeconds(timestamp);return dt.toFormat("yyyy-MM-dd HH:mm:ss")}},{key:"getInsertedIds",value:function getInsertedIds(wdb,rows,tableName,unqKeyFields){var chunkSize=arguments.length>4&&arguments[4]!==void 0?arguments[4]:500;return _async_to_generator(function(){var unqKeys,whereInField,selectField,chunks,resultIds,_iteratorNormalCompletion,_didIteratorError,_iteratorError,_iterator,_step,_$chunk,dbRows,err;return _ts_generator(this,function(_state){switch(_state.label){case 0:if(!wdb){wdb=this.getDB("w")}if(unqKeyFields.length>1){whereInField=wdb.raw("CONCAT_WS('_', '".concat(unqKeyFields.join(","),"')"));selectField="".concat(whereInField," as tmpUid");unqKeys=rows.map(function(row){return unqKeyFields.map(function(field){return row[field]}).join("_")})}else{whereInField=unqKeyFields[0];selectField=unqKeyFields[0];unqKeys=rows.map(function(row){return row[unqKeyFields[0]]})}chunks=(0,_lodash.chunk)(unqKeys,chunkSize);resultIds=[];_iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;_state.label=1;case 1:_state.trys.push([1,6,7,8]);_iterator=chunks[Symbol.iterator]();_state.label=2;case 2:if(!!(_iteratorNormalCompletion=(_step=_iterator.next()).done))return[3,5];_$chunk=_step.value;return[4,wdb(tableName).select("id",wdb.raw(selectField)).whereIn(whereInField,_$chunk)];case 3:dbRows=_state.sent();resultIds=resultIds.concat(dbRows.map(function(dbRow){return parseInt(dbRow.id)}));_state.label=4;case 4:_iteratorNormalCompletion=true;return[3,2];case 5:return[3,8];case 6:err=_state.sent();_didIteratorError=true;_iteratorError=err;return[3,8];case 7:try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}return[7];case 8:return[2,resultIds]}})}).call(this)}},{key:"useLoaders",value:function useLoaders(db,rows,loaders){return _async_to_generator(function(){var _this,_iteratorNormalCompletion,_didIteratorError,_iteratorError,_this1,_loop,_iterator,_step,err;return _ts_generator(this,function(_state){switch(_state.label){case 0:_this=this;if(loaders.length===0){return[2,rows]}_iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;_state.label=1;case 1:_state.trys.push([1,6,7,8]);_loop=function(){var loader,subQ,subRows,toCol,fromIds,idColumn,idColumn1,subRowGroups;return _ts_generator(this,function(_state){switch(_state.label){case 0:loader=_step.value;subQ=void 0;subRows=void 0;toCol=void 0;fromIds=rows.map(function(row){return row[loader.manyJoin.idField]});if(loader.manyJoin.through===undefined){idColumn="".concat(loader.manyJoin.toTable,".").concat(loader.manyJoin.toCol);subQ=db(loader.manyJoin.toTable).whereIn(idColumn,fromIds).select(_to_consumable_array(loader.select).concat([idColumn]));loader.oneJoins.map(function(join){if(join.join=="inner"){subQ.innerJoin("".concat(join.table," as ").concat(join.as),_this.getJoinClause(db,join))}else if(join.join=="outer"){subQ.leftOuterJoin("".concat(join.table," as ").concat(join.as),_this.getJoinClause(db,join))}});toCol=loader.manyJoin.toCol}else{idColumn1="".concat(loader.manyJoin.through.table,".").concat(loader.manyJoin.through.fromCol);subQ=db(loader.manyJoin.through.table).join(loader.manyJoin.toTable,"".concat(loader.manyJoin.through.table,".").concat(loader.manyJoin.through.toCol),"".concat(loader.manyJoin.toTable,".").concat(loader.manyJoin.toCol)).whereIn(idColumn1,fromIds).select((0,_lodash.uniq)(_to_consumable_array(loader.select).concat([idColumn1])));loader.oneJoins.map(function(join){if(join.join=="inner"){subQ.innerJoin("".concat(join.table," as ").concat(join.as),_this.getJoinClause(db,join))}else if(join.join=="outer"){subQ.leftOuterJoin("".concat(join.table," as ").concat(join.as),_this.getJoinClause(db,join))}});toCol=loader.manyJoin.through.fromCol}return[4,subQ];case 1:subRows=_state.sent();if(!loader.loaders)return[3,3];return[4,_this1.useLoaders(db,subRows,loader.loaders)];case 2:subRows=_state.sent();_state.label=3;case 3:subRowGroups=(0,_lodash.groupBy)(subRows,toCol);rows=rows.map(function(row){var _subRowGroups_row_loader_manyJoin_idField;row[loader.as]=((_subRowGroups_row_loader_manyJoin_idField=subRowGroups[row[loader.manyJoin.idField]])!==null&&_subRowGroups_row_loader_manyJoin_idField!==void 0?_subRowGroups_row_loader_manyJoin_idField:[]).map(function(r){return(0,_lodash.omit)(r,toCol)});return row});return[2]}})};_iterator=loaders[Symbol.iterator]();_state.label=2;case 2:if(!!(_iteratorNormalCompletion=(_step=_iterator.next()).done))return[3,5];_this1=this;return[5,_ts_values(_loop())];case 3:_state.sent();_state.label=4;case 4:_iteratorNormalCompletion=true;return[3,2];case 5:return[3,8];case 6:err=_state.sent();_didIteratorError=true;_iteratorError=err;return[3,8];case 7:try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}return[7];case 8:return[2,rows]}})}).call(this)}},{key:"hydrate",value:function hydrate(rows){var _this=this;return rows.map(function(row){var nestedKeys=Object.keys(row).filter(function(key){return key.includes("__")});var groups=(0,_lodash.groupBy)(nestedKeys,function(key){return key.split("__")[0]});var nullKeys=Object.keys(groups).filter(function(key){return groups[key].length>1&&groups[key].every(function(field){return row[field]===null||Array.isArray(row[field])&&row[field].length===0})});var hydrated=Object.keys(row).reduce(function(r,field){if(!field.includes("__")){if(Array.isArray(row[field])&&(0,_lodash.isObject)(row[field][0])){r[field]=_this.hydrate(row[field]);return r}else{r[field]=row[field];return r}}var parts=field.split("__");var objPath=parts[0]+parts.slice(1).map(function(part){return"[".concat(part,"]")}).join("");(0,_lodash.set)(r,objPath,row[field]&&Array.isArray(row[field])&&(0,_lodash.isObject)(row[field][0])?_this.hydrate(row[field]):row[field]);return r},{});nullKeys.map(function(nullKey){return hydrated[nullKey]=null});return hydrated})}},{key:"runSubsetQuery",value:function runSubsetQuery(_0){return _async_to_generator(function(param){var _this,params,baseTable,subset,subsetQuery,build,afterBuild,debug,_db,optimizeCountQuery,db,_params_queryMode,queryMode,select,virtual,joins,loaders,qb,applyJoinClause,total,rows;return _ts_generator(this,function(_state){switch(_state.label){case 0:_this=this;params=param.params,baseTable=param.baseTable,subset=param.subset,subsetQuery=param.subsetQuery,build=param.build,afterBuild=param.afterBuild,debug=param.debug,_db=param.db,optimizeCountQuery=param.optimizeCountQuery;db=_db!==null&&_db!==void 0?_db:this.getDB(subset.startsWith("A")?"w":"r");baseTable=baseTable!==null&&baseTable!==void 0?baseTable:_inflection.default.pluralize(_inflection.default.underscore(this.modelName));queryMode=(_params_queryMode=params.queryMode)!==null&&_params_queryMode!==void 0?_params_queryMode:params.id!==undefined?"list":"both";select=subsetQuery.select,virtual=subsetQuery.virtual,joins=subsetQuery.joins,loaders=subsetQuery.loaders;qb=build({qb:db.from(baseTable),db:db,select:select,joins:joins,virtual:virtual});applyJoinClause=function(qb,joins){joins.map(function(join){if(join.join=="inner"){qb.innerJoin("".concat(join.table," as ").concat(join.as),_this.getJoinClause(db,join))}else if(join.join=="outer"){qb.leftOuterJoin("".concat(join.table," as ").concat(join.as),_this.getJoinClause(db,join))}})};return[4,function(){return _async_to_generator(function(){var clonedQb,parser,parsedQuery,tables,needToJoin,_afterBuild,processedQb,parsedQuery1,q,countQuery,countRow,_countRow_total;return _ts_generator(this,function(_state){switch(_state.label){case 0:if(queryMode==="list"){return[2,undefined]}clonedQb=qb.clone().clear("order").clear("offset").clear("limit");parser=new _nodesqlparser.default.Parser;if(optimizeCountQuery){parsedQuery=parser.astify(clonedQb.toQuery());tables=(0,_sqlparser.getTableNamesFromWhere)(parsedQuery);needToJoin=(0,_lodash.uniq)(tables.flatMap(function(table){return table.split("__").map(function(t){return _inflection.default.pluralize(t)})}));applyJoinClause(clonedQb,joins.filter(function(j){return needToJoin.includes(j.table)}))}else{applyJoinClause(clonedQb,joins)}processedQb=(_afterBuild=afterBuild===null||afterBuild===void 0?void 0:afterBuild({qb:clonedQb,db:db,select:select,joins:joins,virtual:virtual}))!==null&&_afterBuild!==void 0?_afterBuild:clonedQb;parsedQuery1=parser.astify(processedQb.toQuery());q=Array.isArray(parsedQuery1)?parsedQuery1[0]:parsedQuery1;if(q.type!=="select"){throw new Error("Invalid query")}countQuery=q.distinct!==null?clonedQb.clear("select").select(db.raw("COUNT(DISTINCT `".concat((0,_sqlparser.getTableName)(q.columns[0].expr),"`.`").concat(q.columns[0].expr.column,"`) as total"))).first():clonedQb.clear("select").count("*",{as:"total"}).first();return[4,countQuery];case 1:countRow=_state.sent();if(debug===true||debug==="count"){console.debug("DEBUG: count query",_chalk.default.blue(countQuery.toQuery().toString()))}return[2,(_countRow_total=countRow===null||countRow===void 0?void 0:countRow.total)!==null&&_countRow_total!==void 0?_countRow_total:0]}})})()}()];case 1:total=_state.sent();return[4,function(){return _async_to_generator(function(){var clonedQb,_afterBuild,listQuery,rows;return _ts_generator(this,function(_state){switch(_state.label){case 0:if(queryMode==="count"){return[2,[]]}if(params.num!==0){qb.limit(params.num);qb.offset(params.num*(params.page-1))}clonedQb=qb.clone().select(select);applyJoinClause(clonedQb,joins);listQuery=(_afterBuild=afterBuild===null||afterBuild===void 0?void 0:afterBuild({qb:clonedQb,db:db,select:select,joins:joins,virtual:virtual}))!==null&&_afterBuild!==void 0?_afterBuild:clonedQb;return[4,listQuery];case 1:rows=_state.sent();if(debug===true||debug==="list"){console.debug("DEBUG: list query",_chalk.default.blue(listQuery.toQuery().toString()))}return[4,this.useLoaders(db,rows,loaders)];case 2:rows=_state.sent();rows=this.hydrate(rows);return[2,rows]}})}).call(_this)}()];case 2:rows=_state.sent();return[2,{rows:rows,total:total,subsetQuery:subsetQuery,qb:qb}]}})}).apply(this,arguments)}},{key:"getJoinClause",value:function getJoinClause(db,join){if(!(0,_types.isCustomJoinClause)(join)){return db.raw("".concat(join.from," = ").concat(join.to))}else{return db.raw(join.custom)}}},{key:"getUpsertBuilder",value:function getUpsertBuilder(){return new _upsertbuilder.UpsertBuilder}}]);return BaseModelClass}();var BaseModel=new BaseModelClass;
2
2
  //# sourceMappingURL=base-model.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/database/base-model.ts"],"sourcesContent":["import { DateTime } from \"luxon\";\nimport { Knex } from \"knex\";\nimport { chunk, groupBy, isObject, omit, set, uniq } from \"lodash\";\nimport { DBPreset, DB } from \"./db\";\nimport { isCustomJoinClause, type SubsetQuery } from \"../types/types\";\nimport type { BaseListParams } from \"../utils/model\";\nimport inflection from \"inflection\";\nimport chalk from \"chalk\";\nimport { UpsertBuilder } from \"./upsert-builder\";\nimport SqlParser from \"node-sql-parser\";\nimport { getTableName, getTableNamesFromWhere } from \"../utils/sql-parser\";\nimport { PuriWrapper } from \"./puri-wrapper\";\n\nexport class BaseModelClass {\n public modelName: string = \"Unknown\";\n\n /* DB 인스턴스 get, destroy */\n getDB(which: DBPreset): Knex {\n return DB.getDB(which);\n }\n\n getPuri(which: DBPreset): PuriWrapper {\n // 트랜잭션 컨텍스트에서 트랜잭션 획득\n const trx = DB.getTransactionContext().getTransaction(which);\n if (trx) {\n return trx;\n }\n\n // 트랜잭션이 없으면 새로운 PuriWrapper 반환\n const db = this.getDB(which);\n return new PuriWrapper(db, this.getUpsertBuilder());\n }\n\n async destroy() {\n return DB.destroy();\n }\n\n myNow(timestamp?: number): string {\n const dt: DateTime =\n timestamp === undefined\n ? DateTime.local()\n : DateTime.fromSeconds(timestamp);\n return dt.toFormat(\"yyyy-MM-dd HH:mm:ss\");\n }\n\n async getInsertedIds(\n wdb: Knex,\n rows: any[],\n tableName: string,\n unqKeyFields: string[],\n chunkSize: number = 500\n ) {\n if (!wdb) {\n wdb = this.getDB(\"w\");\n }\n\n let unqKeys: string[];\n let whereInField: any, selectField: string;\n if (unqKeyFields.length > 1) {\n whereInField = wdb.raw(`CONCAT_WS('_', '${unqKeyFields.join(\",\")}')`);\n selectField = `${whereInField} as tmpUid`;\n unqKeys = rows.map((row) =>\n unqKeyFields.map((field) => row[field]).join(\"_\")\n );\n } else {\n whereInField = unqKeyFields[0];\n selectField = unqKeyFields[0];\n unqKeys = rows.map((row) => row[unqKeyFields[0]]);\n }\n const chunks = chunk(unqKeys, chunkSize);\n\n let resultIds: number[] = [];\n for (let chunk of chunks) {\n const dbRows = await wdb(tableName)\n .select(\"id\", wdb.raw(selectField))\n .whereIn(whereInField, chunk);\n resultIds = resultIds.concat(\n dbRows.map((dbRow: any) => parseInt(dbRow.id))\n );\n }\n\n return resultIds;\n }\n\n async useLoaders(db: Knex, rows: any[], loaders: SubsetQuery[\"loaders\"]) {\n if (loaders.length === 0) {\n return rows;\n }\n\n for (let loader of loaders) {\n let subQ: any;\n let subRows: any[];\n let toCol: string;\n\n const fromIds = rows.map((row) => row[loader.manyJoin.idField]);\n\n if (loader.manyJoin.through === undefined) {\n // HasMany\n const idColumn = `${loader.manyJoin.toTable}.${loader.manyJoin.toCol}`;\n subQ = db(loader.manyJoin.toTable)\n .whereIn(idColumn, fromIds)\n .select([...loader.select, idColumn]);\n\n // HasMany에서 OneJoin이 있는 경우\n loader.oneJoins.map((join) => {\n if (join.join == \"inner\") {\n subQ.innerJoin(\n `${join.table} as ${join.as}`,\n this.getJoinClause(db, join)\n );\n } else if (join.join == \"outer\") {\n subQ.leftOuterJoin(\n `${join.table} as ${join.as}`,\n this.getJoinClause(db, join)\n );\n }\n });\n toCol = loader.manyJoin.toCol;\n } else {\n // ManyToMany\n const idColumn = `${loader.manyJoin.through.table}.${loader.manyJoin.through.fromCol}`;\n subQ = db(loader.manyJoin.through.table)\n .join(\n loader.manyJoin.toTable,\n `${loader.manyJoin.through.table}.${loader.manyJoin.through.toCol}`,\n `${loader.manyJoin.toTable}.${loader.manyJoin.toCol}`\n )\n .whereIn(idColumn, fromIds)\n .select(uniq([...loader.select, idColumn]));\n\n // ManyToMany에서 OneJoin이 있는 경우\n loader.oneJoins.map((join) => {\n if (join.join == \"inner\") {\n subQ.innerJoin(\n `${join.table} as ${join.as}`,\n this.getJoinClause(db, join)\n );\n } else if (join.join == \"outer\") {\n subQ.leftOuterJoin(\n `${join.table} as ${join.as}`,\n this.getJoinClause(db, join)\n );\n }\n });\n toCol = loader.manyJoin.through.fromCol;\n }\n subRows = await subQ;\n\n if (loader.loaders) {\n // 추가 -Many 케이스가 있는 경우 recursion 처리\n subRows = await this.useLoaders(db, subRows, loader.loaders);\n }\n\n // 불러온 row들을 참조ID 기준으로 분류 배치\n const subRowGroups = groupBy(subRows, toCol);\n rows = rows.map((row) => {\n row[loader.as] = (subRowGroups[row[loader.manyJoin.idField]] ?? []).map(\n (r) => omit(r, toCol)\n );\n return row;\n });\n }\n return rows;\n }\n\n hydrate<T>(rows: T[]): T[] {\n return rows.map((row: any) => {\n // nullable relation인 경우 관련된 필드가 전부 null로 생성되는 것 방지하는 코드\n const nestedKeys = Object.keys(row).filter((key) => key.includes(\"__\"));\n const groups = groupBy(nestedKeys, (key) => key.split(\"__\")[0]);\n const nullKeys = Object.keys(groups).filter(\n (key) =>\n groups[key].length > 1 &&\n groups[key].every(\n (field) =>\n row[field] === null ||\n (Array.isArray(row[field]) && row[field].length === 0)\n )\n );\n\n const hydrated = Object.keys(row).reduce((r, field) => {\n if (!field.includes(\"__\")) {\n if (Array.isArray(row[field]) && isObject(row[field][0])) {\n r[field] = this.hydrate(row[field]);\n return r;\n } else {\n r[field] = row[field];\n return r;\n }\n }\n\n const parts = field.split(\"__\");\n const objPath =\n parts[0] +\n parts\n .slice(1)\n .map((part) => `[${part}]`)\n .join(\"\");\n set(\n r,\n objPath,\n row[field] && Array.isArray(row[field]) && isObject(row[field][0])\n ? this.hydrate(row[field])\n : row[field]\n );\n\n return r;\n }, {} as any);\n nullKeys.map((nullKey) => (hydrated[nullKey] = null));\n\n return hydrated;\n });\n }\n\n async runSubsetQuery<T extends BaseListParams, U extends string>({\n params,\n baseTable,\n subset,\n subsetQuery,\n build,\n debug,\n db: _db,\n optimizeCountQuery,\n }: {\n subset: U;\n params: T;\n subsetQuery: SubsetQuery;\n build: (buildParams: {\n qb: Knex.QueryBuilder;\n db: Knex;\n select: (string | Knex.Raw)[];\n joins: SubsetQuery[\"joins\"];\n virtual: string[];\n }) => Knex.QueryBuilder;\n baseTable?: string;\n debug?: boolean | \"list\" | \"count\";\n db?: Knex;\n optimizeCountQuery?: boolean;\n }): Promise<{\n rows: any[];\n total?: number | undefined;\n subsetQuery: SubsetQuery;\n qb: Knex.QueryBuilder;\n }> {\n const db = _db ?? this.getDB(subset.startsWith(\"A\") ? \"w\" : \"r\");\n baseTable =\n baseTable ?? inflection.pluralize(inflection.underscore(this.modelName));\n const queryMode =\n params.queryMode ?? (params.id !== undefined ? \"list\" : \"both\");\n\n const { select, virtual, joins, loaders } = subsetQuery;\n const qb = build({\n qb: db.from(baseTable),\n db,\n select,\n joins,\n virtual,\n });\n\n const applyJoinClause = (\n qb: Knex.QueryBuilder,\n joins: SubsetQuery[\"joins\"]\n ) => {\n joins.map((join) => {\n if (join.join == \"inner\") {\n qb.innerJoin(\n `${join.table} as ${join.as}`,\n this.getJoinClause(db, join)\n );\n } else if (join.join == \"outer\") {\n qb.leftOuterJoin(\n `${join.table} as ${join.as}`,\n this.getJoinClause(db, join)\n );\n }\n });\n };\n\n // countQuery\n const total = await (async () => {\n if (queryMode === \"list\") {\n return undefined;\n }\n\n const clonedQb = qb.clone().clear(\"order\").clear(\"offset\").clear(\"limit\");\n const parser = new SqlParser.Parser();\n\n // optmizeCountQuery가 true인 경우 다른 clause에 영향을 주지 않는 모든 join을 제외함\n if (optimizeCountQuery) {\n const parsedQuery = parser.astify(clonedQb.toQuery());\n const tables = getTableNamesFromWhere(parsedQuery);\n // where절에 사용되는 테이블의 조인을 위해 사용되는 테이블\n const needToJoin = uniq(\n tables.flatMap((table) =>\n table.split(\"__\").map((t) => inflection.pluralize(t))\n )\n );\n applyJoinClause(\n clonedQb,\n joins.filter((j) => needToJoin.includes(j.table))\n );\n } else {\n applyJoinClause(clonedQb, joins);\n }\n\n const parsedQuery = parser.astify(clonedQb.toQuery());\n const q = Array.isArray(parsedQuery) ? parsedQuery[0] : parsedQuery;\n if (q.type !== \"select\") {\n throw new Error(\"Invalid query\");\n }\n\n const countQuery =\n q.distinct !== null\n ? clonedQb\n .clear(\"select\")\n .select(\n db.raw(\n `COUNT(DISTINCT \\`${getTableName(q.columns[0].expr)}\\`.\\`${q.columns[0].expr.column}\\`) as total`\n )\n )\n .first()\n : clonedQb.clear(\"select\").count(\"*\", { as: \"total\" }).first();\n const countRow: { total?: number } = await countQuery;\n\n // debug: countQuery\n if (debug === true || debug === \"count\") {\n console.debug(\n \"DEBUG: count query\",\n chalk.blue(countQuery.toQuery().toString())\n );\n }\n\n return countRow?.total ?? 0;\n })();\n\n // listQuery\n const rows = await (async () => {\n if (queryMode === \"count\") {\n return [];\n }\n\n // limit, offset\n if (params.num !== 0) {\n qb.limit(params.num!);\n qb.offset(params.num! * (params.page! - 1));\n }\n\n // select, rows\n const listQuery = qb.clone().select(select);\n\n // join\n applyJoinClause(listQuery, joins);\n\n let rows = await listQuery;\n // debug: listQuery\n if (debug === true || debug === \"list\") {\n console.debug(\n \"DEBUG: list query\",\n chalk.blue(listQuery.toQuery().toString())\n );\n }\n\n rows = await this.useLoaders(db, rows, loaders);\n rows = this.hydrate(rows);\n return rows;\n })();\n\n return { rows, total, subsetQuery, qb };\n }\n\n getJoinClause(\n db: Knex<any, unknown>,\n join: SubsetQuery[\"joins\"][number]\n ): Knex.Raw<any> {\n if (!isCustomJoinClause(join)) {\n return db.raw(`${join.from} = ${join.to}`);\n } else {\n return db.raw(join.custom);\n }\n }\n\n getUpsertBuilder(): UpsertBuilder {\n return new UpsertBuilder();\n }\n}\nexport const BaseModel = new BaseModelClass();\n"],"names":["BaseModel","BaseModelClass","modelName","getDB","which","DB","getPuri","trx","getTransactionContext","getTransaction","db","PuriWrapper","getUpsertBuilder","destroy","myNow","timestamp","dt","undefined","DateTime","local","fromSeconds","toFormat","getInsertedIds","wdb","rows","tableName","unqKeyFields","chunkSize","unqKeys","whereInField","selectField","chunks","resultIds","chunk","dbRows","length","raw","join","map","row","field","select","whereIn","concat","dbRow","parseInt","id","useLoaders","loaders","loader","subQ","subRows","toCol","fromIds","idColumn","subRowGroups","manyJoin","idField","through","toTable","oneJoins","innerJoin","table","as","getJoinClause","leftOuterJoin","fromCol","uniq","groupBy","r","omit","hydrate","nestedKeys","Object","keys","filter","key","includes","groups","split","nullKeys","every","Array","isArray","hydrated","reduce","isObject","parts","objPath","slice","part","set","nullKey","runSubsetQuery","params","baseTable","subset","subsetQuery","build","debug","_db","optimizeCountQuery","queryMode","virtual","joins","qb","applyJoinClause","total","startsWith","inflection","pluralize","underscore","from","clonedQb","parser","parsedQuery","tables","needToJoin","q","countQuery","countRow","clone","clear","SqlParser","Parser","astify","toQuery","getTableNamesFromWhere","flatMap","t","j","type","Error","distinct","getTableName","columns","expr","column","first","count","console","chalk","blue","toString","listQuery","num","limit","offset","page","isCustomJoinClause","to","custom","UpsertBuilder"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/database/base-model.ts"],"sourcesContent":["import { DateTime } from \"luxon\";\nimport { Knex } from \"knex\";\nimport { chunk, groupBy, isObject, omit, set, uniq } from \"lodash\";\nimport { DBPreset, DB } from \"./db\";\nimport { isCustomJoinClause, type SubsetQuery } from \"../types/types\";\nimport type { BaseListParams } from \"../utils/model\";\nimport inflection from \"inflection\";\nimport chalk from \"chalk\";\nimport { UpsertBuilder } from \"./upsert-builder\";\nimport SqlParser from \"node-sql-parser\";\nimport { getTableName, getTableNamesFromWhere } from \"../utils/sql-parser\";\nimport { PuriWrapper } from \"./puri-wrapper\";\n\nexport class BaseModelClass {\n public modelName: string = \"Unknown\";\n\n /* DB 인스턴스 get, destroy */\n getDB(which: DBPreset): Knex {\n return DB.getDB(which);\n }\n\n getPuri(which: DBPreset): PuriWrapper {\n // 트랜잭션 컨텍스트에서 트랜잭션 획득\n const trx = DB.getTransactionContext().getTransaction(which);\n if (trx) {\n return trx;\n }\n\n // 트랜잭션이 없으면 새로운 PuriWrapper 반환\n const db = this.getDB(which);\n return new PuriWrapper(db, this.getUpsertBuilder());\n }\n\n async destroy() {\n return DB.destroy();\n }\n\n myNow(timestamp?: number): string {\n const dt: DateTime =\n timestamp === undefined\n ? DateTime.local()\n : DateTime.fromSeconds(timestamp);\n return dt.toFormat(\"yyyy-MM-dd HH:mm:ss\");\n }\n\n async getInsertedIds(\n wdb: Knex,\n rows: any[],\n tableName: string,\n unqKeyFields: string[],\n chunkSize: number = 500\n ) {\n if (!wdb) {\n wdb = this.getDB(\"w\");\n }\n\n let unqKeys: string[];\n let whereInField: any, selectField: string;\n if (unqKeyFields.length > 1) {\n whereInField = wdb.raw(`CONCAT_WS('_', '${unqKeyFields.join(\",\")}')`);\n selectField = `${whereInField} as tmpUid`;\n unqKeys = rows.map((row) =>\n unqKeyFields.map((field) => row[field]).join(\"_\")\n );\n } else {\n whereInField = unqKeyFields[0];\n selectField = unqKeyFields[0];\n unqKeys = rows.map((row) => row[unqKeyFields[0]]);\n }\n const chunks = chunk(unqKeys, chunkSize);\n\n let resultIds: number[] = [];\n for (let chunk of chunks) {\n const dbRows = await wdb(tableName)\n .select(\"id\", wdb.raw(selectField))\n .whereIn(whereInField, chunk);\n resultIds = resultIds.concat(\n dbRows.map((dbRow: any) => parseInt(dbRow.id))\n );\n }\n\n return resultIds;\n }\n\n async useLoaders(db: Knex, rows: any[], loaders: SubsetQuery[\"loaders\"]) {\n if (loaders.length === 0) {\n return rows;\n }\n\n for (let loader of loaders) {\n let subQ: any;\n let subRows: any[];\n let toCol: string;\n\n const fromIds = rows.map((row) => row[loader.manyJoin.idField]);\n\n if (loader.manyJoin.through === undefined) {\n // HasMany\n const idColumn = `${loader.manyJoin.toTable}.${loader.manyJoin.toCol}`;\n subQ = db(loader.manyJoin.toTable)\n .whereIn(idColumn, fromIds)\n .select([...loader.select, idColumn]);\n\n // HasMany에서 OneJoin이 있는 경우\n loader.oneJoins.map((join) => {\n if (join.join == \"inner\") {\n subQ.innerJoin(\n `${join.table} as ${join.as}`,\n this.getJoinClause(db, join)\n );\n } else if (join.join == \"outer\") {\n subQ.leftOuterJoin(\n `${join.table} as ${join.as}`,\n this.getJoinClause(db, join)\n );\n }\n });\n toCol = loader.manyJoin.toCol;\n } else {\n // ManyToMany\n const idColumn = `${loader.manyJoin.through.table}.${loader.manyJoin.through.fromCol}`;\n subQ = db(loader.manyJoin.through.table)\n .join(\n loader.manyJoin.toTable,\n `${loader.manyJoin.through.table}.${loader.manyJoin.through.toCol}`,\n `${loader.manyJoin.toTable}.${loader.manyJoin.toCol}`\n )\n .whereIn(idColumn, fromIds)\n .select(uniq([...loader.select, idColumn]));\n\n // ManyToMany에서 OneJoin이 있는 경우\n loader.oneJoins.map((join) => {\n if (join.join == \"inner\") {\n subQ.innerJoin(\n `${join.table} as ${join.as}`,\n this.getJoinClause(db, join)\n );\n } else if (join.join == \"outer\") {\n subQ.leftOuterJoin(\n `${join.table} as ${join.as}`,\n this.getJoinClause(db, join)\n );\n }\n });\n toCol = loader.manyJoin.through.fromCol;\n }\n subRows = await subQ;\n\n if (loader.loaders) {\n // 추가 -Many 케이스가 있는 경우 recursion 처리\n subRows = await this.useLoaders(db, subRows, loader.loaders);\n }\n\n // 불러온 row들을 참조ID 기준으로 분류 배치\n const subRowGroups = groupBy(subRows, toCol);\n rows = rows.map((row) => {\n row[loader.as] = (subRowGroups[row[loader.manyJoin.idField]] ?? []).map(\n (r) => omit(r, toCol)\n );\n return row;\n });\n }\n return rows;\n }\n\n hydrate<T>(rows: T[]): T[] {\n return rows.map((row: any) => {\n // nullable relation인 경우 관련된 필드가 전부 null로 생성되는 것 방지하는 코드\n const nestedKeys = Object.keys(row).filter((key) => key.includes(\"__\"));\n const groups = groupBy(nestedKeys, (key) => key.split(\"__\")[0]);\n const nullKeys = Object.keys(groups).filter(\n (key) =>\n groups[key].length > 1 &&\n groups[key].every(\n (field) =>\n row[field] === null ||\n (Array.isArray(row[field]) && row[field].length === 0)\n )\n );\n\n const hydrated = Object.keys(row).reduce((r, field) => {\n if (!field.includes(\"__\")) {\n if (Array.isArray(row[field]) && isObject(row[field][0])) {\n r[field] = this.hydrate(row[field]);\n return r;\n } else {\n r[field] = row[field];\n return r;\n }\n }\n\n const parts = field.split(\"__\");\n const objPath =\n parts[0] +\n parts\n .slice(1)\n .map((part) => `[${part}]`)\n .join(\"\");\n set(\n r,\n objPath,\n row[field] && Array.isArray(row[field]) && isObject(row[field][0])\n ? this.hydrate(row[field])\n : row[field]\n );\n\n return r;\n }, {} as any);\n nullKeys.map((nullKey) => (hydrated[nullKey] = null));\n\n return hydrated;\n });\n }\n\n async runSubsetQuery<T extends BaseListParams, U extends string>({\n params,\n baseTable,\n subset,\n subsetQuery,\n build,\n afterBuild,\n debug,\n db: _db,\n optimizeCountQuery,\n }: {\n subset: U;\n params: T;\n subsetQuery: SubsetQuery;\n build: (buildParams: {\n qb: Knex.QueryBuilder;\n db: Knex;\n select: (string | Knex.Raw)[];\n joins: SubsetQuery[\"joins\"];\n virtual: string[];\n }) => Knex.QueryBuilder;\n afterBuild?: (buildParams: {\n qb: Knex.QueryBuilder;\n db: Knex;\n select: (string | Knex.Raw)[];\n joins: SubsetQuery[\"joins\"];\n virtual: string[];\n }) => Knex.QueryBuilder;\n baseTable?: string;\n debug?: boolean | \"list\" | \"count\";\n db?: Knex;\n optimizeCountQuery?: boolean;\n }): Promise<{\n rows: any[];\n total?: number | undefined;\n subsetQuery: SubsetQuery;\n qb: Knex.QueryBuilder;\n }> {\n const db = _db ?? this.getDB(subset.startsWith(\"A\") ? \"w\" : \"r\");\n baseTable =\n baseTable ?? inflection.pluralize(inflection.underscore(this.modelName));\n const queryMode =\n params.queryMode ?? (params.id !== undefined ? \"list\" : \"both\");\n\n const { select, virtual, joins, loaders } = subsetQuery;\n const qb = build({\n qb: db.from(baseTable),\n db,\n select,\n joins,\n virtual,\n });\n\n const applyJoinClause = (\n qb: Knex.QueryBuilder,\n joins: SubsetQuery[\"joins\"]\n ) => {\n joins.map((join) => {\n if (join.join == \"inner\") {\n qb.innerJoin(\n `${join.table} as ${join.as}`,\n this.getJoinClause(db, join)\n );\n } else if (join.join == \"outer\") {\n qb.leftOuterJoin(\n `${join.table} as ${join.as}`,\n this.getJoinClause(db, join)\n );\n }\n });\n };\n\n // countQuery\n const total = await (async () => {\n if (queryMode === \"list\") {\n return undefined;\n }\n\n const clonedQb = qb.clone().clear(\"order\").clear(\"offset\").clear(\"limit\");\n const parser = new SqlParser.Parser();\n\n // optmizeCountQuery가 true인 경우 다른 clause에 영향을 주지 않는 모든 join을 제외함\n if (optimizeCountQuery) {\n const parsedQuery = parser.astify(clonedQb.toQuery());\n const tables = getTableNamesFromWhere(parsedQuery);\n // where절에 사용되는 테이블의 조인을 위해 사용되는 테이블\n const needToJoin = uniq(\n tables.flatMap((table) =>\n table.split(\"__\").map((t) => inflection.pluralize(t))\n )\n );\n applyJoinClause(\n clonedQb,\n joins.filter((j) => needToJoin.includes(j.table))\n );\n } else {\n applyJoinClause(clonedQb, joins);\n }\n\n const processedQb =\n afterBuild?.({\n qb: clonedQb,\n db,\n select,\n joins,\n virtual,\n }) ?? clonedQb;\n\n const parsedQuery = parser.astify(processedQb.toQuery());\n const q = Array.isArray(parsedQuery) ? parsedQuery[0] : parsedQuery;\n if (q.type !== \"select\") {\n throw new Error(\"Invalid query\");\n }\n\n const countQuery =\n q.distinct !== null\n ? clonedQb\n .clear(\"select\")\n .select(\n db.raw(\n `COUNT(DISTINCT \\`${getTableName(q.columns[0].expr)}\\`.\\`${q.columns[0].expr.column}\\`) as total`\n )\n )\n .first()\n : clonedQb.clear(\"select\").count(\"*\", { as: \"total\" }).first();\n const countRow: { total?: number } = await countQuery;\n\n // debug: countQuery\n if (debug === true || debug === \"count\") {\n console.debug(\n \"DEBUG: count query\",\n chalk.blue(countQuery.toQuery().toString())\n );\n }\n\n return countRow?.total ?? 0;\n })();\n\n // listQuery\n const rows = await (async () => {\n if (queryMode === \"count\") {\n return [];\n }\n\n // limit, offset\n if (params.num !== 0) {\n qb.limit(params.num!);\n qb.offset(params.num! * (params.page! - 1));\n }\n\n // select, rows\n const clonedQb = qb.clone().select(select);\n\n // join\n applyJoinClause(clonedQb, joins);\n\n const listQuery =\n afterBuild?.({\n qb: clonedQb,\n db,\n select,\n joins,\n virtual,\n }) ?? clonedQb;\n\n let rows = await listQuery;\n // debug: listQuery\n if (debug === true || debug === \"list\") {\n console.debug(\n \"DEBUG: list query\",\n chalk.blue(listQuery.toQuery().toString())\n );\n }\n\n rows = await this.useLoaders(db, rows, loaders);\n rows = this.hydrate(rows);\n return rows;\n })();\n\n return { rows, total, subsetQuery, qb };\n }\n\n getJoinClause(\n db: Knex<any, unknown>,\n join: SubsetQuery[\"joins\"][number]\n ): Knex.Raw<any> {\n if (!isCustomJoinClause(join)) {\n return db.raw(`${join.from} = ${join.to}`);\n } else {\n return db.raw(join.custom);\n }\n }\n\n getUpsertBuilder(): UpsertBuilder {\n return new UpsertBuilder();\n }\n}\nexport const BaseModel = new BaseModelClass();\n"],"names":["BaseModel","BaseModelClass","modelName","getDB","which","DB","getPuri","trx","getTransactionContext","getTransaction","db","PuriWrapper","getUpsertBuilder","destroy","myNow","timestamp","dt","undefined","DateTime","local","fromSeconds","toFormat","getInsertedIds","wdb","rows","tableName","unqKeyFields","chunkSize","unqKeys","whereInField","selectField","chunks","resultIds","chunk","dbRows","length","raw","join","map","row","field","select","whereIn","concat","dbRow","parseInt","id","useLoaders","loaders","loader","subQ","subRows","toCol","fromIds","idColumn","subRowGroups","manyJoin","idField","through","toTable","oneJoins","innerJoin","table","as","getJoinClause","leftOuterJoin","fromCol","uniq","groupBy","r","omit","hydrate","nestedKeys","Object","keys","filter","key","includes","groups","split","nullKeys","every","Array","isArray","hydrated","reduce","isObject","parts","objPath","slice","part","set","nullKey","runSubsetQuery","params","baseTable","subset","subsetQuery","build","afterBuild","debug","_db","optimizeCountQuery","queryMode","virtual","joins","qb","applyJoinClause","total","startsWith","inflection","pluralize","underscore","from","clonedQb","parser","parsedQuery","tables","needToJoin","processedQb","q","countQuery","countRow","clone","clear","SqlParser","Parser","astify","toQuery","getTableNamesFromWhere","flatMap","t","j","type","Error","distinct","getTableName","columns","expr","column","first","count","console","chalk","blue","toString","listQuery","num","limit","offset","page","isCustomJoinClause","to","custom","UpsertBuilder"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"DB",{enumerable:true,get:function(){return DB}});var _knex=/*#__PURE__*/_interop_require_default(require("knex"));var _path=/*#__PURE__*/_interop_require_default(require("path"));var _lodash=/*#__PURE__*/_interop_require_default(require("lodash"));var _api=require("../api");var _soexceptions=require("../exceptions/so-exceptions");var _async_hooks=require("async_hooks");var _transactioncontext=require("./transaction-context");function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{Promise.resolve(value).then(_next,_throw)}}function _async_to_generator(fn){return function(){var self=this,args=arguments;return new Promise(function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value)}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err)}_next(undefined)})}}function _class_call_check(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}function _create_class(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap;var cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interop_require_wildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj}}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj)}var newObj={__proto__:null};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc)}else{newObj[key]=obj[key]}}}newObj.default=obj;if(cache){cache.set(obj,newObj)}return newObj}function _object_spread(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};var ownKeys=Object.keys(source);if(typeof Object.getOwnPropertySymbols==="function"){ownKeys=ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym){return Object.getOwnPropertyDescriptor(source,sym).enumerable}))}ownKeys.forEach(function(key){_define_property(target,key,source[key])})}return target}function _ts_generator(thisArg,body){var f,y,t,_={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},g=Object.create((typeof Iterator==="function"?Iterator:Object).prototype);return g.next=verb(0),g["throw"]=verb(1),g["return"]=verb(2),typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(g&&(g=0,op[0]&&(_=0)),_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(op[0]===6&&_.label<t[1]){_.label=t[1];t=op;break}if(t&&_.label<t[2]){_.label=t[2];_.ops.push(op);break}if(t[2])_.ops.pop();_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e];y=0}finally{f=t=0}if(op[0]&5)throw op[1];return{value:op[0]?op[1]:void 0,done:true}}}var DBClass=/*#__PURE__*/function(){"use strict";function DBClass(){_class_call_check(this,DBClass);_define_property(this,"wdb",void 0);_define_property(this,"rdb",void 0);_define_property(this,"transactionStorage",new _async_hooks.AsyncLocalStorage)}_create_class(DBClass,[{key:"runWithTransaction",value:function runWithTransaction(callback){return this.transactionStorage.run(new _transactioncontext.TransactionContext,callback)}},{key:"getTransactionContext",value:function getTransactionContext(){var _this_transactionStorage_getStore;return(_this_transactionStorage_getStore=this.transactionStorage.getStore())!==null&&_this_transactionStorage_getStore!==void 0?_this_transactionStorage_getStore:new _transactioncontext.TransactionContext}},{key:"readKnexfile",value:function readKnexfile(){return _async_to_generator(function(){var dbConfigPath,_knexfileModule_default,knexfileModule,_knexfileModule_default_default,_ref,config,e;return _ts_generator(this,function(_state){switch(_state.label){case 0:dbConfigPath=_path.default.join(_api.Sonamu.apiRootPath,"/dist/configs/db.js");_state.label=1;case 1:_state.trys.push([1,3,,4]);return[4,Promise.resolve(dbConfigPath).then(function(p){return /*#__PURE__*/_interop_require_wildcard(require(p))})];case 2:knexfileModule=_state.sent();config=(_ref=(_knexfileModule_default_default=(_knexfileModule_default=knexfileModule.default)===null||_knexfileModule_default===void 0?void 0:_knexfileModule_default.default)!==null&&_knexfileModule_default_default!==void 0?_knexfileModule_default_default:knexfileModule.default)!==null&&_ref!==void 0?_ref:knexfileModule;return[2,this.generateDBConfig(config)];case 3:e=_state.sent();return[3,4];case 4:throw new _soexceptions.ServiceUnavailableException("다음 경로에서 DB설정 파일을 찾을 수 없습니다: ".concat(dbConfigPath,". 먼저 빌드(yarn build)를 수행해주세요."))}})}).call(this)}},{key:"getDB",value:function getDB(which){var dbConfig=_api.Sonamu.dbConfig;var instanceName=which==="w"?"wdb":"rdb";if(!this[instanceName]){var config;var _process_env_NODE_ENV;switch((_process_env_NODE_ENV=process.env.NODE_ENV)!==null&&_process_env_NODE_ENV!==void 0?_process_env_NODE_ENV:"development"){case"development":case"staging":var _dbConfig_development_slave;config=which==="w"?dbConfig["development_master"]:(_dbConfig_development_slave=dbConfig["development_slave"])!==null&&_dbConfig_development_slave!==void 0?_dbConfig_development_slave:dbConfig["development_master"];break;case"production":var _dbConfig_production_slave;config=which==="w"?dbConfig["production_master"]:(_dbConfig_production_slave=dbConfig["production_slave"])!==null&&_dbConfig_production_slave!==void 0?_dbConfig_production_slave:dbConfig["production_master"];break;case"test":config=dbConfig["test"];break;default:throw new Error("현재 ENV ".concat(process.env.NODE_ENV,"에는 설정 가능한 DB설정이 없습니다."))}this[instanceName]=(0,_knex.default)(config)}return this[instanceName]}},{key:"destroy",value:function destroy(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:if(!(this.wdb!==undefined))return[3,2];return[4,this.wdb.destroy()];case 1:_state.sent();this.wdb=undefined;_state.label=2;case 2:if(!(this.rdb!==undefined))return[3,4];return[4,this.rdb.destroy()];case 3:_state.sent();this.rdb=undefined;_state.label=4;case 4:return[2]}})}).call(this)}},{key:"generateDBConfig",value:function generateDBConfig(config){var _config_defaultOptions,_config_defaultOptions1,_config_defaultOptions2,_config_environments,_config_environments1,_config_defaultOptions3,_config_environments2,_config_environments3;var defaultKnexConfig=_lodash.default.merge({client:"mysql2",pool:{min:1,max:5},migrations:{extension:"js",directory:"./dist/migrations"},connection:_object_spread({database:config.database},(_config_defaultOptions=config.defaultOptions)===null||_config_defaultOptions===void 0?void 0:_config_defaultOptions.connection)},config.defaultOptions);var test=_lodash.default.merge({},defaultKnexConfig,{connection:_object_spread({database:"".concat(config.database,"_test")},(_config_defaultOptions1=config.defaultOptions)===null||_config_defaultOptions1===void 0?void 0:_config_defaultOptions1.connection)});var fixture_local=_lodash.default.merge({},defaultKnexConfig,{connection:_object_spread({database:"".concat(config.database,"_fixture_local")},(_config_defaultOptions2=config.defaultOptions)===null||_config_defaultOptions2===void 0?void 0:_config_defaultOptions2.connection)});var devMasterOptions=(_config_environments=config.environments)===null||_config_environments===void 0?void 0:_config_environments.development;var devSlaveOptions=(_config_environments1=config.environments)===null||_config_environments1===void 0?void 0:_config_environments1.development_slave;var development_master=_lodash.default.merge({},defaultKnexConfig,devMasterOptions);var development_slave=_lodash.default.merge({},defaultKnexConfig,devMasterOptions,devSlaveOptions);var fixture_remote=_lodash.default.merge({},defaultKnexConfig,devMasterOptions,{connection:_object_spread({database:"".concat(config.database,"_fixture_remote")},(_config_defaultOptions3=config.defaultOptions)===null||_config_defaultOptions3===void 0?void 0:_config_defaultOptions3.connection)});var _config_environments_production;var prodMasterOptions=(_config_environments_production=(_config_environments2=config.environments)===null||_config_environments2===void 0?void 0:_config_environments2.production)!==null&&_config_environments_production!==void 0?_config_environments_production:{};var _config_environments_production_slave;var prodSlaveOptions=(_config_environments_production_slave=(_config_environments3=config.environments)===null||_config_environments3===void 0?void 0:_config_environments3.production_slave)!==null&&_config_environments_production_slave!==void 0?_config_environments_production_slave:{};var production_master=_lodash.default.merge({},defaultKnexConfig,prodMasterOptions);var production_slave=_lodash.default.merge({},defaultKnexConfig,prodMasterOptions,prodSlaveOptions);return{test:test,fixture_local:fixture_local,fixture_remote:fixture_remote,development_master:development_master,development_slave:development_slave,production_master:production_master,production_slave:production_slave}}}]);return DBClass}();var DB=new DBClass;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"DB",{enumerable:true,get:function(){return DB}});var _knex=/*#__PURE__*/_interop_require_default(require("knex"));var _path=/*#__PURE__*/_interop_require_default(require("path"));var _lodash=/*#__PURE__*/_interop_require_default(require("lodash"));var _api=require("../api");var _soexceptions=require("../exceptions/so-exceptions");var _async_hooks=require("async_hooks");var _transactioncontext=require("./transaction-context");function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{Promise.resolve(value).then(_next,_throw)}}function _async_to_generator(fn){return function(){var self=this,args=arguments;return new Promise(function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value)}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err)}_next(undefined)})}}function _class_call_check(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}function _create_class(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap;var cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interop_require_wildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj}}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj)}var newObj={__proto__:null};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc)}else{newObj[key]=obj[key]}}}newObj.default=obj;if(cache){cache.set(obj,newObj)}return newObj}function _object_spread(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};var ownKeys=Object.keys(source);if(typeof Object.getOwnPropertySymbols==="function"){ownKeys=ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym){return Object.getOwnPropertyDescriptor(source,sym).enumerable}))}ownKeys.forEach(function(key){_define_property(target,key,source[key])})}return target}function _ts_generator(thisArg,body){var f,y,t,_={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},g=Object.create((typeof Iterator==="function"?Iterator:Object).prototype);return g.next=verb(0),g["throw"]=verb(1),g["return"]=verb(2),typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(g&&(g=0,op[0]&&(_=0)),_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(op[0]===6&&_.label<t[1]){_.label=t[1];t=op;break}if(t&&_.label<t[2]){_.label=t[2];_.ops.push(op);break}if(t[2])_.ops.pop();_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e];y=0}finally{f=t=0}if(op[0]&5)throw op[1];return{value:op[0]?op[1]:void 0,done:true}}}var DBClass=/*#__PURE__*/function(){"use strict";function DBClass(){_class_call_check(this,DBClass);_define_property(this,"wdb",void 0);_define_property(this,"rdb",void 0);_define_property(this,"transactionStorage",new _async_hooks.AsyncLocalStorage)}_create_class(DBClass,[{key:"runWithTransaction",value:function runWithTransaction(callback){return this.transactionStorage.run(new _transactioncontext.TransactionContext,callback)}},{key:"getTransactionContext",value:function getTransactionContext(){var _this_transactionStorage_getStore;return(_this_transactionStorage_getStore=this.transactionStorage.getStore())!==null&&_this_transactionStorage_getStore!==void 0?_this_transactionStorage_getStore:new _transactioncontext.TransactionContext}},{key:"readKnexfile",value:function readKnexfile(){return _async_to_generator(function(){var dbConfigPath,_knexfileModule_default,knexfileModule,_knexfileModule_default_default,_ref,config,e;return _ts_generator(this,function(_state){switch(_state.label){case 0:dbConfigPath=_path.default.join(_api.Sonamu.apiRootPath,"/dist/configs/db.js");_state.label=1;case 1:_state.trys.push([1,3,,4]);return[4,Promise.resolve(dbConfigPath).then(function(p){return /*#__PURE__*/_interop_require_wildcard(require(p))})];case 2:knexfileModule=_state.sent();config=(_ref=(_knexfileModule_default_default=(_knexfileModule_default=knexfileModule.default)===null||_knexfileModule_default===void 0?void 0:_knexfileModule_default.default)!==null&&_knexfileModule_default_default!==void 0?_knexfileModule_default_default:knexfileModule.default)!==null&&_ref!==void 0?_ref:knexfileModule;return[2,this.generateDBConfig(config)];case 3:e=_state.sent();return[3,4];case 4:throw new _soexceptions.ServiceUnavailableException("다음 경로에서 DB설정 파일을 찾을 수 없습니다: ".concat(dbConfigPath,". 먼저 빌드(yarn build)를 수행해주세요."))}})}).call(this)}},{key:"getDB",value:function getDB(which){var dbConfig=_api.Sonamu.dbConfig;var instanceName=which==="w"?"wdb":"rdb";if(!this[instanceName]){var config;var _process_env_NODE_ENV;switch((_process_env_NODE_ENV=process.env.NODE_ENV)!==null&&_process_env_NODE_ENV!==void 0?_process_env_NODE_ENV:"development"){case"development":case"staging":var _dbConfig_development_slave;config=which==="w"?dbConfig["development_master"]:(_dbConfig_development_slave=dbConfig["development_slave"])!==null&&_dbConfig_development_slave!==void 0?_dbConfig_development_slave:dbConfig["development_master"];break;case"production":var _dbConfig_production_slave;config=which==="w"?dbConfig["production_master"]:(_dbConfig_production_slave=dbConfig["production_slave"])!==null&&_dbConfig_production_slave!==void 0?_dbConfig_production_slave:dbConfig["production_master"];break;case"test":config=dbConfig["test"];break;default:throw new Error("현재 ENV ".concat(process.env.NODE_ENV,"에는 설정 가능한 DB설정이 없습니다."))}this[instanceName]=(0,_knex.default)(config)}return this[instanceName]}},{key:"destroy",value:function destroy(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:if(!(this.wdb!==undefined))return[3,2];return[4,this.wdb.destroy()];case 1:_state.sent();this.wdb=undefined;_state.label=2;case 2:if(!(this.rdb!==undefined))return[3,4];return[4,this.rdb.destroy()];case 3:_state.sent();this.rdb=undefined;_state.label=4;case 4:return[2]}})}).call(this)}},{key:"generateDBConfig",value:function generateDBConfig(config){var _config_defaultOptions,_config_defaultOptions1,_config_defaultOptions2,_config_environments,_config_environments1,_config_environments2,_config_environments3;var defaultKnexConfig=_lodash.default.merge({client:"mysql2",pool:{min:1,max:5},migrations:{extension:"js",directory:"./dist/migrations"},connection:_object_spread({database:config.database},(_config_defaultOptions=config.defaultOptions)===null||_config_defaultOptions===void 0?void 0:_config_defaultOptions.connection)},config.defaultOptions);var test=_lodash.default.merge({},defaultKnexConfig,{connection:_object_spread({database:"".concat(config.database,"_test")},(_config_defaultOptions1=config.defaultOptions)===null||_config_defaultOptions1===void 0?void 0:_config_defaultOptions1.connection)});var fixture_local=_lodash.default.merge({},defaultKnexConfig,{connection:_object_spread({database:"".concat(config.database,"_fixture_local")},(_config_defaultOptions2=config.defaultOptions)===null||_config_defaultOptions2===void 0?void 0:_config_defaultOptions2.connection)});var devMasterOptions=(_config_environments=config.environments)===null||_config_environments===void 0?void 0:_config_environments.development;var devSlaveOptions=(_config_environments1=config.environments)===null||_config_environments1===void 0?void 0:_config_environments1.development_slave;var development_master=_lodash.default.merge({},defaultKnexConfig,devMasterOptions);var development_slave=_lodash.default.merge({},defaultKnexConfig,devMasterOptions,devSlaveOptions);var fixture_remote=_lodash.default.merge({},defaultKnexConfig,devMasterOptions,{connection:{database:"".concat(config.database,"_fixture_remote")}});var _config_environments_production;var prodMasterOptions=(_config_environments_production=(_config_environments2=config.environments)===null||_config_environments2===void 0?void 0:_config_environments2.production)!==null&&_config_environments_production!==void 0?_config_environments_production:{};var _config_environments_production_slave;var prodSlaveOptions=(_config_environments_production_slave=(_config_environments3=config.environments)===null||_config_environments3===void 0?void 0:_config_environments3.production_slave)!==null&&_config_environments_production_slave!==void 0?_config_environments_production_slave:{};var production_master=_lodash.default.merge({},defaultKnexConfig,prodMasterOptions);var production_slave=_lodash.default.merge({},defaultKnexConfig,prodMasterOptions,prodSlaveOptions);return{test:test,fixture_local:fixture_local,fixture_remote:fixture_remote,development_master:development_master,development_slave:development_slave,production_master:production_master,production_slave:production_slave}}}]);return DBClass}();var DB=new DBClass;
2
2
  //# sourceMappingURL=db.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/database/db.ts"],"sourcesContent":["export type DBPreset = \"w\" | \"r\";\nimport knex, { Knex } from \"knex\";\nimport path from \"path\";\nimport _ from \"lodash\";\nimport { Sonamu } from \"../api\";\nimport { ServiceUnavailableException } from \"../exceptions/so-exceptions\";\nimport { AsyncLocalStorage } from \"async_hooks\";\nimport { TransactionContext } from \"./transaction-context\";\n\ntype MySQLConfig = Omit<Knex.Config, \"connection\"> & {\n connection?: Knex.MySql2ConnectionConfig;\n};\n\nexport type SonamuDBBaseConfig = {\n // 기본 데이터베이스 이름\n database: string;\n\n // 모든 환경에 적용될 기본 Knex 옵션\n defaultOptions?: MySQLConfig;\n\n // 환경별 설정\n environments?: {\n development?: MySQLConfig;\n development_slave?: MySQLConfig;\n production?: MySQLConfig;\n production_slave?: MySQLConfig;\n };\n};\n\nexport type SonamuDBConfig = {\n development_master: Knex.Config;\n development_slave: Knex.Config;\n test: Knex.Config;\n fixture_local: Knex.Config;\n fixture_remote: Knex.Config;\n production_master: Knex.Config;\n production_slave: Knex.Config;\n};\n\nclass DBClass {\n private wdb?: Knex;\n private rdb?: Knex;\n\n public transactionStorage = new AsyncLocalStorage<TransactionContext>();\n\n public runWithTransaction<T>(callback: () => Promise<T>): Promise<T> {\n return this.transactionStorage.run(new TransactionContext(), callback);\n }\n\n public getTransactionContext(): TransactionContext {\n return this.transactionStorage.getStore() ?? new TransactionContext();\n }\n\n async readKnexfile(): Promise<SonamuDBConfig> {\n const dbConfigPath: string = path.join(\n Sonamu.apiRootPath,\n \"/dist/configs/db.js\"\n );\n try {\n const knexfileModule = await import(dbConfigPath);\n const config =\n knexfileModule.default?.default ??\n knexfileModule.default ??\n knexfileModule;\n return this.generateDBConfig(config);\n } catch {}\n\n throw new ServiceUnavailableException(\n `다음 경로에서 DB설정 파일을 찾을 수 없습니다: ${dbConfigPath}. 먼저 빌드(yarn build)를 수행해주세요.`\n );\n }\n\n getDB(which: DBPreset): Knex {\n const dbConfig = Sonamu.dbConfig;\n\n const instanceName = which === \"w\" ? \"wdb\" : \"rdb\";\n\n if (!this[instanceName]) {\n let config: Knex.Config;\n switch (process.env.NODE_ENV ?? \"development\") {\n case \"development\":\n case \"staging\":\n config =\n which === \"w\"\n ? dbConfig[\"development_master\"]\n : dbConfig[\"development_slave\"] ?? dbConfig[\"development_master\"];\n break;\n case \"production\":\n config =\n which === \"w\"\n ? dbConfig[\"production_master\"]\n : dbConfig[\"production_slave\"] ?? dbConfig[\"production_master\"];\n break;\n case \"test\":\n config = dbConfig[\"test\"];\n break;\n default:\n throw new Error(\n `현재 ENV ${process.env.NODE_ENV}에는 설정 가능한 DB설정이 없습니다.`\n );\n }\n this[instanceName] = knex(config);\n }\n\n return this[instanceName]!;\n }\n\n async destroy(): Promise<void> {\n if (this.wdb !== undefined) {\n await this.wdb.destroy();\n this.wdb = undefined;\n }\n if (this.rdb !== undefined) {\n await this.rdb.destroy();\n this.rdb = undefined;\n }\n }\n\n private generateDBConfig(config: SonamuDBBaseConfig): SonamuDBConfig {\n const defaultKnexConfig: Partial<MySQLConfig> = _.merge(\n {\n client: \"mysql2\",\n pool: {\n min: 1,\n max: 5,\n },\n migrations: {\n extension: \"js\",\n directory: \"./dist/migrations\",\n },\n connection: {\n database: config.database,\n ...config.defaultOptions?.connection,\n },\n },\n config.defaultOptions\n );\n\n // 로컬 환경 설정\n const test: MySQLConfig = _.merge({}, defaultKnexConfig, {\n connection: {\n database: `${config.database}_test`,\n ...config.defaultOptions?.connection,\n },\n });\n\n const fixture_local = _.merge({}, defaultKnexConfig, {\n connection: {\n database: `${config.database}_fixture_local`,\n ...config.defaultOptions?.connection,\n },\n });\n\n // 개발 환경 설정\n const devMasterOptions = config.environments?.development;\n const devSlaveOptions = config.environments?.development_slave;\n const development_master = _.merge({}, defaultKnexConfig, devMasterOptions);\n const development_slave = _.merge(\n {},\n defaultKnexConfig,\n devMasterOptions,\n devSlaveOptions\n );\n const fixture_remote = _.merge({}, defaultKnexConfig, devMasterOptions, {\n connection: {\n database: `${config.database}_fixture_remote`,\n ...config.defaultOptions?.connection,\n },\n });\n\n // 프로덕션 환경 설정\n const prodMasterOptions = config.environments?.production ?? {};\n const prodSlaveOptions = config.environments?.production_slave ?? {};\n const production_master = _.merge({}, defaultKnexConfig, prodMasterOptions);\n const production_slave = _.merge(\n {},\n defaultKnexConfig,\n prodMasterOptions,\n prodSlaveOptions\n );\n\n return {\n test,\n fixture_local,\n fixture_remote,\n development_master,\n development_slave,\n production_master,\n production_slave,\n };\n }\n}\nexport const DB = new DBClass();\n"],"names":["DB","DBClass","wdb","rdb","transactionStorage","AsyncLocalStorage","runWithTransaction","callback","run","TransactionContext","getTransactionContext","getStore","readKnexfile","dbConfigPath","knexfileModule","config","path","join","Sonamu","apiRootPath","default","generateDBConfig","ServiceUnavailableException","getDB","which","dbConfig","instanceName","process","env","NODE_ENV","Error","knex","destroy","undefined","defaultKnexConfig","_","merge","client","pool","min","max","migrations","extension","directory","connection","database","defaultOptions","test","fixture_local","devMasterOptions","environments","development","devSlaveOptions","development_slave","development_master","fixture_remote","prodMasterOptions","production","prodSlaveOptions","production_slave","production_master"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/database/db.ts"],"sourcesContent":["export type DBPreset = \"w\" | \"r\";\nimport knex, { Knex } from \"knex\";\nimport path from \"path\";\nimport _ from \"lodash\";\nimport { Sonamu } from \"../api\";\nimport { ServiceUnavailableException } from \"../exceptions/so-exceptions\";\nimport { AsyncLocalStorage } from \"async_hooks\";\nimport { TransactionContext } from \"./transaction-context\";\n\ntype MySQLConfig = Omit<Knex.Config, \"connection\"> & {\n connection?: Knex.MySql2ConnectionConfig;\n};\n\nexport type SonamuDBBaseConfig = {\n // 기본 데이터베이스 이름\n database: string;\n\n // 모든 환경에 적용될 기본 Knex 옵션\n defaultOptions?: MySQLConfig;\n\n // 환경별 설정\n environments?: {\n development?: MySQLConfig;\n development_slave?: MySQLConfig;\n production?: MySQLConfig;\n production_slave?: MySQLConfig;\n };\n};\n\nexport type SonamuDBConfig = {\n development_master: Knex.Config;\n development_slave: Knex.Config;\n test: Knex.Config;\n fixture_local: Knex.Config;\n fixture_remote: Knex.Config;\n production_master: Knex.Config;\n production_slave: Knex.Config;\n};\n\nclass DBClass {\n private wdb?: Knex;\n private rdb?: Knex;\n\n public transactionStorage = new AsyncLocalStorage<TransactionContext>();\n\n public runWithTransaction<T>(callback: () => Promise<T>): Promise<T> {\n return this.transactionStorage.run(new TransactionContext(), callback);\n }\n\n public getTransactionContext(): TransactionContext {\n return this.transactionStorage.getStore() ?? new TransactionContext();\n }\n\n async readKnexfile(): Promise<SonamuDBConfig> {\n const dbConfigPath: string = path.join(\n Sonamu.apiRootPath,\n \"/dist/configs/db.js\"\n );\n try {\n const knexfileModule = await import(dbConfigPath);\n const config =\n knexfileModule.default?.default ??\n knexfileModule.default ??\n knexfileModule;\n return this.generateDBConfig(config);\n } catch {}\n\n throw new ServiceUnavailableException(\n `다음 경로에서 DB설정 파일을 찾을 수 없습니다: ${dbConfigPath}. 먼저 빌드(yarn build)를 수행해주세요.`\n );\n }\n\n getDB(which: DBPreset): Knex {\n const dbConfig = Sonamu.dbConfig;\n\n const instanceName = which === \"w\" ? \"wdb\" : \"rdb\";\n\n if (!this[instanceName]) {\n let config: Knex.Config;\n switch (process.env.NODE_ENV ?? \"development\") {\n case \"development\":\n case \"staging\":\n config =\n which === \"w\"\n ? dbConfig[\"development_master\"]\n : dbConfig[\"development_slave\"] ?? dbConfig[\"development_master\"];\n break;\n case \"production\":\n config =\n which === \"w\"\n ? dbConfig[\"production_master\"]\n : dbConfig[\"production_slave\"] ?? dbConfig[\"production_master\"];\n break;\n case \"test\":\n config = dbConfig[\"test\"];\n break;\n default:\n throw new Error(\n `현재 ENV ${process.env.NODE_ENV}에는 설정 가능한 DB설정이 없습니다.`\n );\n }\n this[instanceName] = knex(config);\n }\n\n return this[instanceName]!;\n }\n\n async destroy(): Promise<void> {\n if (this.wdb !== undefined) {\n await this.wdb.destroy();\n this.wdb = undefined;\n }\n if (this.rdb !== undefined) {\n await this.rdb.destroy();\n this.rdb = undefined;\n }\n }\n\n private generateDBConfig(config: SonamuDBBaseConfig): SonamuDBConfig {\n const defaultKnexConfig: Partial<MySQLConfig> = _.merge(\n {\n client: \"mysql2\",\n pool: {\n min: 1,\n max: 5,\n },\n migrations: {\n extension: \"js\",\n directory: \"./dist/migrations\",\n },\n connection: {\n database: config.database,\n ...config.defaultOptions?.connection,\n },\n },\n config.defaultOptions\n );\n\n // 로컬 환경 설정\n const test: MySQLConfig = _.merge({}, defaultKnexConfig, {\n connection: {\n database: `${config.database}_test`,\n ...config.defaultOptions?.connection,\n },\n });\n\n const fixture_local = _.merge({}, defaultKnexConfig, {\n connection: {\n database: `${config.database}_fixture_local`,\n ...config.defaultOptions?.connection,\n },\n });\n\n // 개발 환경 설정\n const devMasterOptions = config.environments?.development;\n const devSlaveOptions = config.environments?.development_slave;\n const development_master = _.merge({}, defaultKnexConfig, devMasterOptions);\n const development_slave = _.merge(\n {},\n defaultKnexConfig,\n devMasterOptions,\n devSlaveOptions\n );\n const fixture_remote = _.merge({}, defaultKnexConfig, devMasterOptions, {\n connection: {\n // NOTE: fixture remote는 default connection의 DB를 override해선 안됨.\n database: `${config.database}_fixture_remote`,\n },\n });\n\n // 프로덕션 환경 설정\n const prodMasterOptions = config.environments?.production ?? {};\n const prodSlaveOptions = config.environments?.production_slave ?? {};\n const production_master = _.merge({}, defaultKnexConfig, prodMasterOptions);\n const production_slave = _.merge(\n {},\n defaultKnexConfig,\n prodMasterOptions,\n prodSlaveOptions\n );\n\n return {\n test,\n fixture_local,\n fixture_remote,\n development_master,\n development_slave,\n production_master,\n production_slave,\n };\n }\n}\nexport const DB = new DBClass();\n"],"names":["DB","DBClass","wdb","rdb","transactionStorage","AsyncLocalStorage","runWithTransaction","callback","run","TransactionContext","getTransactionContext","getStore","readKnexfile","dbConfigPath","knexfileModule","config","path","join","Sonamu","apiRootPath","default","generateDBConfig","ServiceUnavailableException","getDB","which","dbConfig","instanceName","process","env","NODE_ENV","Error","knex","destroy","undefined","defaultKnexConfig","_","merge","client","pool","min","max","migrations","extension","directory","connection","database","defaultOptions","test","fixture_local","devMasterOptions","environments","development","devSlaveOptions","development_slave","development_master","fixture_remote","prodMasterOptions","production","prodSlaveOptions","production_slave","production_master"],"mappings":"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"}