sonamu 0.5.6 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/base-frame.js +12 -2
- package/dist/api/caster.js +66 -2
- package/dist/api/code-converters.js +489 -2
- package/dist/api/config.d.ts +76 -0
- package/dist/api/config.d.ts.map +1 -0
- package/dist/api/config.js +32 -0
- package/dist/api/context.d.ts +1 -0
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +3 -2
- package/dist/api/decorators.d.ts +1 -0
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +142 -2
- package/dist/api/index.js +9 -2
- package/dist/api/sonamu.d.ts +8 -22
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +482 -2
- package/dist/bin/build-config.d.ts +2 -1
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +12 -2
- package/dist/bin/cli-wrapper.js +71 -2
- package/dist/bin/cli.js +418 -2
- package/dist/bin/hot-hook-register.d.ts +11 -0
- package/dist/bin/hot-hook-register.d.ts.map +1 -0
- package/dist/bin/hot-hook-register.js +21 -0
- package/dist/database/_batch_update.js +78 -2
- package/dist/database/base-model.js +247 -2
- package/dist/database/code-generator.js +53 -2
- package/dist/database/db.d.ts +5 -16
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +132 -2
- package/dist/database/knex-plugins/knex-on-duplicate-update.js +39 -2
- package/dist/database/puri-wrapper.d.ts +22 -10
- package/dist/database/puri-wrapper.d.ts.map +1 -1
- package/dist/database/puri-wrapper.js +109 -2
- package/dist/database/puri.d.ts +105 -73
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +539 -2
- package/dist/database/puri.types.d.ts +33 -42
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +3 -2
- package/dist/database/transaction-context.d.ts +3 -3
- package/dist/database/transaction-context.d.ts.map +1 -1
- package/dist/database/transaction-context.js +14 -2
- package/dist/database/upsert-builder.js +215 -2
- package/dist/entity/entity-manager.d.ts +3 -1
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +114 -2
- package/dist/entity/entity-utils.js +210 -2
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +651 -2
- package/dist/exceptions/error-handler.js +29 -2
- package/dist/exceptions/so-exceptions.js +85 -2
- package/dist/file-storage/driver.js +79 -2
- package/dist/file-storage/file-storage.js +75 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -2
- package/dist/migration/code-generation.js +558 -2
- package/dist/migration/migration-set.js +364 -2
- package/dist/migration/migrator.d.ts +0 -9
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +510 -2
- package/dist/migration/types.js +3 -2
- package/dist/naite/naite.d.ts +12 -0
- package/dist/naite/naite.d.ts.map +1 -0
- package/dist/naite/naite.js +72 -0
- package/dist/stream/index.js +3 -2
- package/dist/stream/sse.js +38 -2
- package/dist/syncer/api-parser.d.ts +20 -0
- package/dist/syncer/api-parser.d.ts.map +1 -0
- package/dist/syncer/api-parser.js +229 -0
- package/dist/syncer/checksum.d.ts +21 -0
- package/dist/syncer/checksum.d.ts.map +1 -0
- package/dist/syncer/checksum.js +98 -0
- package/dist/syncer/code-generator.d.ts +20 -0
- package/dist/syncer/code-generator.d.ts.map +1 -0
- package/dist/syncer/code-generator.js +141 -0
- package/dist/syncer/entity-operations.d.ts +17 -0
- package/dist/syncer/entity-operations.d.ts.map +1 -0
- package/dist/syncer/entity-operations.js +58 -0
- package/dist/syncer/file-patterns.d.ts +29 -0
- package/dist/syncer/file-patterns.d.ts.map +1 -0
- package/dist/syncer/file-patterns.js +38 -0
- package/dist/syncer/index.d.ts +6 -0
- package/dist/syncer/index.d.ts.map +1 -1
- package/dist/syncer/index.js +9 -2
- package/dist/syncer/module-loader.d.ts +35 -0
- package/dist/syncer/module-loader.d.ts.map +1 -0
- package/dist/syncer/module-loader.js +82 -0
- package/dist/syncer/syncer.d.ts +93 -108
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +375 -2
- package/dist/template/entity-converter.d.ts +14 -0
- package/dist/template/entity-converter.d.ts.map +1 -0
- package/dist/template/entity-converter.js +101 -0
- package/dist/template/helpers.d.ts +23 -0
- package/dist/template/helpers.d.ts.map +1 -0
- package/dist/template/helpers.js +64 -0
- package/dist/{templates → template/implementations}/entity.template.d.ts +3 -3
- package/dist/template/implementations/entity.template.d.ts.map +1 -0
- package/dist/template/implementations/entity.template.js +87 -0
- package/dist/{templates → template/implementations}/generated.template.d.ts +3 -3
- package/dist/template/implementations/generated.template.d.ts.map +1 -0
- package/dist/template/implementations/generated.template.js +232 -0
- package/dist/{templates → template/implementations}/generated_http.template.d.ts +3 -3
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -0
- package/dist/template/implementations/generated_http.template.js +131 -0
- package/dist/{templates → template/implementations}/generated_sso.template.d.ts +3 -3
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -0
- package/dist/template/implementations/generated_sso.template.js +105 -0
- package/dist/{templates → template/implementations}/init_types.template.d.ts +3 -3
- package/dist/template/implementations/init_types.template.d.ts.map +1 -0
- package/dist/template/implementations/init_types.template.js +38 -0
- package/dist/template/implementations/model.template.d.ts +17 -0
- package/dist/template/implementations/model.template.d.ts.map +1 -0
- package/dist/template/implementations/model.template.js +171 -0
- package/dist/{templates → template/implementations}/model_test.template.d.ts +3 -3
- package/dist/template/implementations/model_test.template.d.ts.map +1 -0
- package/dist/template/implementations/model_test.template.js +35 -0
- package/dist/{templates → template/implementations}/service.template.d.ts +6 -6
- package/dist/template/implementations/service.template.d.ts.map +1 -0
- package/dist/template/implementations/service.template.js +193 -0
- package/dist/{templates → template/implementations}/view_enums_buttonset.template.d.ts +3 -3
- package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -0
- package/dist/template/implementations/view_enums_buttonset.template.js +31 -0
- package/dist/{templates → template/implementations}/view_enums_dropdown.template.d.ts +3 -4
- package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -0
- package/dist/template/implementations/view_enums_dropdown.template.js +50 -0
- package/dist/{templates → template/implementations}/view_enums_select.template.d.ts +3 -3
- package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -0
- package/dist/template/implementations/view_enums_select.template.js +55 -0
- package/dist/{templates → template/implementations}/view_form.template.d.ts +5 -5
- package/dist/template/implementations/view_form.template.d.ts.map +1 -0
- package/dist/template/implementations/view_form.template.js +337 -0
- package/dist/{templates → template/implementations}/view_id_all_select.template.d.ts +3 -3
- package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -0
- package/dist/template/implementations/view_id_all_select.template.js +31 -0
- package/dist/{templates → template/implementations}/view_id_async_select.template.d.ts +3 -3
- package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -0
- package/dist/template/implementations/view_id_async_select.template.js +105 -0
- package/dist/{templates → template/implementations}/view_list.template.d.ts +5 -13
- package/dist/template/implementations/view_list.template.d.ts.map +1 -0
- package/dist/template/implementations/view_list.template.js +465 -0
- package/dist/{templates → template/implementations}/view_list_columns.template.d.ts +3 -3
- package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -0
- package/dist/template/implementations/view_list_columns.template.js +49 -0
- package/dist/{templates → template/implementations}/view_search_input.template.d.ts +3 -3
- package/dist/template/implementations/view_search_input.template.d.ts.map +1 -0
- package/dist/template/implementations/view_search_input.template.js +64 -0
- package/dist/template/index.d.ts +5 -0
- package/dist/template/index.d.ts.map +1 -0
- package/dist/template/index.js +6 -0
- package/dist/template/template.d.ts +39 -0
- package/dist/template/template.d.ts.map +1 -0
- package/dist/template/template.js +47 -0
- package/dist/template/zod-converter.d.ts +18 -0
- package/dist/template/zod-converter.d.ts.map +1 -0
- package/dist/template/zod-converter.js +166 -0
- package/dist/testing/_relation-graph.js +80 -2
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +521 -2
- package/dist/types/types.d.ts +39 -40
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +289 -2
- package/dist/typings/knex.d.js +3 -2
- package/dist/utils/async-utils.d.ts +7 -0
- package/dist/utils/async-utils.d.ts.map +1 -1
- package/dist/utils/async-utils.js +57 -2
- package/dist/utils/console-util.d.ts +2 -0
- package/dist/utils/console-util.d.ts.map +1 -0
- package/dist/utils/console-util.js +6 -0
- package/dist/utils/controller.js +26 -2
- package/dist/utils/esm-utils.d.ts +45 -0
- package/dist/utils/esm-utils.d.ts.map +1 -0
- package/dist/utils/esm-utils.js +56 -0
- package/dist/utils/fs-utils.js +17 -2
- package/dist/utils/lodash-able.js +6 -2
- package/dist/utils/model.js +22 -2
- package/dist/utils/path-utils.d.ts +89 -0
- package/dist/utils/path-utils.d.ts.map +1 -0
- package/dist/utils/path-utils.js +60 -0
- package/dist/utils/process-utils.d.ts +13 -0
- package/dist/utils/process-utils.d.ts.map +1 -0
- package/dist/utils/process-utils.js +36 -0
- package/dist/utils/sql-parser.js +35 -2
- package/dist/utils/utils.d.ts +4 -7
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +33 -2
- package/dist/utils/zod-error.d.ts.map +1 -1
- package/dist/utils/zod-error.js +19 -2
- package/package.json +21 -9
- package/src/api/code-converters.ts +2 -2
- package/src/api/config.ts +142 -0
- package/src/api/context.ts +1 -0
- package/src/api/decorators.ts +15 -5
- package/src/api/sonamu.ts +102 -87
- package/src/bin/build-config.ts +2 -1
- package/src/bin/cli-wrapper.ts +10 -3
- package/src/bin/cli.ts +108 -56
- package/src/bin/hot-hook-register.ts +22 -0
- package/src/database/base-model.ts +1 -1
- package/src/database/code-generator.ts +1 -1
- package/src/database/db.ts +53 -60
- package/src/database/puri-wrapper.ts +104 -26
- package/src/database/puri.ts +477 -580
- package/src/database/puri.types.ts +111 -201
- package/src/database/transaction-context.ts +4 -4
- package/src/database/upsert-builder.ts +1 -1
- package/src/entity/entity-manager.ts +19 -15
- package/src/entity/entity.ts +4 -3
- package/src/index.ts +2 -0
- package/src/migration/code-generation.ts +1 -1
- package/src/migration/migration-set.ts +1 -1
- package/src/migration/migrator.ts +23 -152
- package/src/naite/naite.ts +70 -0
- package/src/syncer/api-parser.ts +299 -0
- package/src/syncer/checksum.ts +152 -0
- package/src/syncer/code-generator.ts +202 -0
- package/src/syncer/entity-operations.ts +68 -0
- package/src/syncer/file-patterns.ts +56 -0
- package/src/syncer/index.ts +6 -0
- package/src/syncer/module-loader.ts +125 -0
- package/src/syncer/syncer.ts +363 -1420
- package/src/template/entity-converter.ts +123 -0
- package/src/template/helpers.ts +84 -0
- package/src/{templates → template/implementations}/entity.template.ts +4 -4
- package/src/{templates → template/implementations}/generated.template.ts +9 -9
- package/src/{templates → template/implementations}/generated_http.template.ts +9 -6
- package/src/{templates → template/implementations}/generated_sso.template.ts +7 -7
- package/src/{templates → template/implementations}/init_types.template.ts +4 -4
- package/src/{templates → template/implementations}/model.template.ts +9 -9
- package/src/{templates → template/implementations}/model_test.template.ts +5 -5
- package/src/{templates → template/implementations}/service.template.ts +29 -12
- package/src/{templates → template/implementations}/view_enums_buttonset.template.ts +3 -3
- package/src/{templates → template/implementations}/view_enums_dropdown.template.ts +5 -21
- package/src/{templates → template/implementations}/view_enums_select.template.ts +4 -4
- package/src/{templates → template/implementations}/view_form.template.ts +11 -13
- package/src/{templates → template/implementations}/view_id_all_select.template.ts +3 -3
- package/src/{templates → template/implementations}/view_id_async_select.template.ts +3 -3
- package/src/{templates → template/implementations}/view_list.template.ts +13 -64
- package/src/{templates → template/implementations}/view_list_columns.template.ts +3 -3
- package/src/{templates → template/implementations}/view_search_input.template.ts +3 -3
- package/src/template/index.ts +4 -0
- package/src/template/template.ts +86 -0
- package/src/template/zod-converter.ts +219 -0
- package/src/testing/fixture-manager.ts +8 -1
- package/src/types/types.ts +39 -62
- package/src/utils/async-utils.ts +17 -0
- package/src/utils/console-util.ts +4 -0
- package/src/utils/esm-utils.ts +69 -0
- package/src/utils/path-utils.ts +102 -0
- package/src/utils/process-utils.ts +46 -0
- package/src/utils/sql-parser.ts +1 -1
- package/src/utils/utils.ts +14 -40
- package/src/utils/zod-error.ts +0 -1
- package/dist/api/base-frame.js.map +0 -1
- package/dist/api/caster.js.map +0 -1
- package/dist/api/code-converters.js.map +0 -1
- package/dist/api/context.js.map +0 -1
- package/dist/api/decorators.js.map +0 -1
- package/dist/api/index.js.map +0 -1
- package/dist/api/sonamu.js.map +0 -1
- package/dist/bin/build-config.js.map +0 -1
- package/dist/bin/cli-wrapper.js.map +0 -1
- package/dist/bin/cli.js.map +0 -1
- package/dist/database/_batch_update.js.map +0 -1
- package/dist/database/base-model.js.map +0 -1
- package/dist/database/code-generator.js.map +0 -1
- package/dist/database/db.js.map +0 -1
- package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +0 -1
- package/dist/database/puri-wrapper.js.map +0 -1
- package/dist/database/puri.js.map +0 -1
- package/dist/database/puri.types.js.map +0 -1
- package/dist/database/transaction-context.js.map +0 -1
- package/dist/database/upsert-builder.js.map +0 -1
- package/dist/entity/entity-manager.js.map +0 -1
- package/dist/entity/entity-utils.js.map +0 -1
- package/dist/entity/entity.js.map +0 -1
- package/dist/exceptions/error-handler.js.map +0 -1
- package/dist/exceptions/so-exceptions.js.map +0 -1
- package/dist/file-storage/driver.js.map +0 -1
- package/dist/file-storage/file-storage.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/migration/code-generation.js.map +0 -1
- package/dist/migration/migration-set.js.map +0 -1
- package/dist/migration/migrator.js.map +0 -1
- package/dist/migration/types.js.map +0 -1
- package/dist/stream/index.js.map +0 -1
- package/dist/stream/sse.js.map +0 -1
- package/dist/syncer/index.js.map +0 -1
- package/dist/syncer/syncer.js.map +0 -1
- package/dist/templates/base-template.d.ts +0 -13
- package/dist/templates/base-template.d.ts.map +0 -1
- package/dist/templates/base-template.js +0 -2
- package/dist/templates/base-template.js.map +0 -1
- package/dist/templates/entity.template.d.ts.map +0 -1
- package/dist/templates/entity.template.js +0 -2
- package/dist/templates/entity.template.js.map +0 -1
- package/dist/templates/generated.template.d.ts.map +0 -1
- package/dist/templates/generated.template.js +0 -2
- package/dist/templates/generated.template.js.map +0 -1
- package/dist/templates/generated_http.template.d.ts.map +0 -1
- package/dist/templates/generated_http.template.js +0 -2
- package/dist/templates/generated_http.template.js.map +0 -1
- package/dist/templates/generated_sso.template.d.ts.map +0 -1
- package/dist/templates/generated_sso.template.js +0 -2
- package/dist/templates/generated_sso.template.js.map +0 -1
- package/dist/templates/index.d.ts +0 -2
- package/dist/templates/index.d.ts.map +0 -1
- package/dist/templates/index.js +0 -2
- package/dist/templates/index.js.map +0 -1
- package/dist/templates/init_types.template.d.ts.map +0 -1
- package/dist/templates/init_types.template.js +0 -2
- package/dist/templates/init_types.template.js.map +0 -1
- package/dist/templates/model.template.d.ts +0 -17
- package/dist/templates/model.template.d.ts.map +0 -1
- package/dist/templates/model.template.js +0 -2
- package/dist/templates/model.template.js.map +0 -1
- package/dist/templates/model_test.template.d.ts.map +0 -1
- package/dist/templates/model_test.template.js +0 -2
- package/dist/templates/model_test.template.js.map +0 -1
- package/dist/templates/service.template.d.ts.map +0 -1
- package/dist/templates/service.template.js +0 -2
- package/dist/templates/service.template.js.map +0 -1
- package/dist/templates/view_enums_buttonset.template.d.ts.map +0 -1
- package/dist/templates/view_enums_buttonset.template.js +0 -2
- package/dist/templates/view_enums_buttonset.template.js.map +0 -1
- package/dist/templates/view_enums_dropdown.template.d.ts.map +0 -1
- package/dist/templates/view_enums_dropdown.template.js +0 -2
- package/dist/templates/view_enums_dropdown.template.js.map +0 -1
- package/dist/templates/view_enums_select.template.d.ts.map +0 -1
- package/dist/templates/view_enums_select.template.js +0 -2
- package/dist/templates/view_enums_select.template.js.map +0 -1
- package/dist/templates/view_form.template.d.ts.map +0 -1
- package/dist/templates/view_form.template.js +0 -2
- package/dist/templates/view_form.template.js.map +0 -1
- package/dist/templates/view_id_all_select.template.d.ts.map +0 -1
- package/dist/templates/view_id_all_select.template.js +0 -2
- package/dist/templates/view_id_all_select.template.js.map +0 -1
- package/dist/templates/view_id_async_select.template.d.ts.map +0 -1
- package/dist/templates/view_id_async_select.template.js +0 -2
- package/dist/templates/view_id_async_select.template.js.map +0 -1
- package/dist/templates/view_list.template.d.ts.map +0 -1
- package/dist/templates/view_list.template.js +0 -2
- package/dist/templates/view_list.template.js.map +0 -1
- package/dist/templates/view_list_columns.template.d.ts.map +0 -1
- package/dist/templates/view_list_columns.template.js +0 -2
- package/dist/templates/view_list_columns.template.js.map +0 -1
- package/dist/templates/view_search_input.template.d.ts.map +0 -1
- package/dist/templates/view_search_input.template.js +0 -2
- package/dist/templates/view_search_input.template.js.map +0 -1
- package/dist/testing/_relation-graph.js.map +0 -1
- package/dist/testing/fixture-manager.js.map +0 -1
- package/dist/types/types.js.map +0 -1
- package/dist/typings/knex.d.js.map +0 -1
- package/dist/utils/async-utils.js.map +0 -1
- package/dist/utils/controller.js.map +0 -1
- package/dist/utils/fs-utils.js.map +0 -1
- package/dist/utils/lodash-able.js.map +0 -1
- package/dist/utils/model.js.map +0 -1
- package/dist/utils/sql-parser.js.map +0 -1
- package/dist/utils/utils.js.map +0 -1
- package/dist/utils/zod-error.js.map +0 -1
- package/src/templates/base-template.ts +0 -19
- package/src/templates/index.ts +0 -1
package/dist/database/db.js
CHANGED
|
@@ -1,2 +1,132 @@
|
|
|
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,_config_environments4;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")}},(_config_environments2=config.environments)===null||_config_environments2===void 0?void 0:_config_environments2.remote_fixture);var _config_environments_production;var prodMasterOptions=(_config_environments_production=(_config_environments3=config.environments)===null||_config_environments3===void 0?void 0:_config_environments3.production)!==null&&_config_environments_production!==void 0?_config_environments_production:{};var _config_environments_production_slave;var prodSlaveOptions=(_config_environments_production_slave=(_config_environments4=config.environments)===null||_config_environments4===void 0?void 0:_config_environments4.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
|
-
|
|
1
|
+
import knex from "knex";
|
|
2
|
+
import * as _ from "lodash-es";
|
|
3
|
+
import { Sonamu } from "../api/index.js";
|
|
4
|
+
import { AsyncLocalStorage } from "async_hooks";
|
|
5
|
+
import { TransactionContext } from "./transaction-context.js";
|
|
6
|
+
class DBClass {
|
|
7
|
+
wdb;
|
|
8
|
+
rdb;
|
|
9
|
+
transactionStorage = new AsyncLocalStorage();
|
|
10
|
+
runWithTransaction(callback) {
|
|
11
|
+
return this.transactionStorage.run(new TransactionContext(), callback);
|
|
12
|
+
}
|
|
13
|
+
getTransactionContext() {
|
|
14
|
+
return this.transactionStorage.getStore() ?? new TransactionContext();
|
|
15
|
+
}
|
|
16
|
+
getDB(which) {
|
|
17
|
+
const dbConfig = Sonamu.dbConfig;
|
|
18
|
+
// 테스트 트랜잭션 격리
|
|
19
|
+
if (process.env.NODE_ENV === "test") {
|
|
20
|
+
if (this.testTransaction) {
|
|
21
|
+
return this.testTransaction;
|
|
22
|
+
} else if (this.wdb) {
|
|
23
|
+
return this.wdb;
|
|
24
|
+
} else {
|
|
25
|
+
this["wdb"] = knex({
|
|
26
|
+
...dbConfig["test"],
|
|
27
|
+
// 단일 풀
|
|
28
|
+
pool: {
|
|
29
|
+
min: 1,
|
|
30
|
+
max: 1
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
return this["wdb"];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const instanceName = which === "w" ? "wdb" : "rdb";
|
|
37
|
+
if (!this[instanceName]) {
|
|
38
|
+
let config;
|
|
39
|
+
switch(process.env.NODE_ENV ?? "development"){
|
|
40
|
+
case "development":
|
|
41
|
+
case "staging":
|
|
42
|
+
config = which === "w" ? dbConfig["development_master"] : dbConfig["development_slave"] ?? dbConfig["development_master"];
|
|
43
|
+
break;
|
|
44
|
+
case "production":
|
|
45
|
+
config = which === "w" ? dbConfig["production_master"] : dbConfig["production_slave"] ?? dbConfig["production_master"];
|
|
46
|
+
break;
|
|
47
|
+
default:
|
|
48
|
+
throw new Error(`현재 ENV ${process.env.NODE_ENV}에는 설정 가능한 DB설정이 없습니다.`);
|
|
49
|
+
}
|
|
50
|
+
this[instanceName] = knex(config);
|
|
51
|
+
}
|
|
52
|
+
return this[instanceName];
|
|
53
|
+
}
|
|
54
|
+
async destroy() {
|
|
55
|
+
if (this.wdb !== undefined) {
|
|
56
|
+
await this.wdb.destroy();
|
|
57
|
+
this.wdb = undefined;
|
|
58
|
+
}
|
|
59
|
+
if (this.rdb !== undefined) {
|
|
60
|
+
await this.rdb.destroy();
|
|
61
|
+
this.rdb = undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
generateDBConfig(config) {
|
|
65
|
+
const defaultKnexConfig = _.merge({
|
|
66
|
+
client: "mysql2",
|
|
67
|
+
pool: {
|
|
68
|
+
min: 1,
|
|
69
|
+
max: 5
|
|
70
|
+
},
|
|
71
|
+
migrations: {
|
|
72
|
+
directory: "./src/migrations"
|
|
73
|
+
},
|
|
74
|
+
connection: {
|
|
75
|
+
database: config.name,
|
|
76
|
+
...config.defaultOptions?.connection
|
|
77
|
+
}
|
|
78
|
+
}, config.defaultOptions);
|
|
79
|
+
// 로컬 환경 설정
|
|
80
|
+
const test = _.merge({}, defaultKnexConfig, {
|
|
81
|
+
connection: {
|
|
82
|
+
database: `${config.name}_test`,
|
|
83
|
+
...config.defaultOptions?.connection
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
const fixture_local = _.merge({}, defaultKnexConfig, {
|
|
87
|
+
connection: {
|
|
88
|
+
database: `${config.name}_fixture_local`,
|
|
89
|
+
...config.defaultOptions?.connection
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
// 개발 환경 설정
|
|
93
|
+
const devMasterOptions = config.environments?.development;
|
|
94
|
+
const devSlaveOptions = config.environments?.development_slave;
|
|
95
|
+
const development_master = _.merge({}, defaultKnexConfig, devMasterOptions);
|
|
96
|
+
const development_slave = _.merge({}, defaultKnexConfig, devMasterOptions, devSlaveOptions);
|
|
97
|
+
// NOTE: fixture remote는 default connection의 DB를 override해선 안됨.
|
|
98
|
+
const fixture_remote = _.merge({}, defaultKnexConfig, devMasterOptions, {
|
|
99
|
+
connection: {
|
|
100
|
+
database: `${config.name}_fixture_remote`
|
|
101
|
+
}
|
|
102
|
+
}, config.environments?.remote_fixture);
|
|
103
|
+
// 프로덕션 환경 설정
|
|
104
|
+
const prodMasterOptions = config.environments?.production ?? {};
|
|
105
|
+
const prodSlaveOptions = config.environments?.production_slave ?? {};
|
|
106
|
+
const production_master = _.merge({}, defaultKnexConfig, prodMasterOptions);
|
|
107
|
+
const production_slave = _.merge({}, defaultKnexConfig, prodMasterOptions, prodSlaveOptions);
|
|
108
|
+
return {
|
|
109
|
+
test,
|
|
110
|
+
fixture_local,
|
|
111
|
+
fixture_remote,
|
|
112
|
+
development_master,
|
|
113
|
+
development_slave,
|
|
114
|
+
production_master,
|
|
115
|
+
production_slave
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
// Test 환경에서 트랜잭션 사용
|
|
119
|
+
testTransaction = null;
|
|
120
|
+
async createTestTransaction() {
|
|
121
|
+
const db = this.getDB("w");
|
|
122
|
+
this.testTransaction = await db.transaction();
|
|
123
|
+
return this.testTransaction;
|
|
124
|
+
}
|
|
125
|
+
async clearTestTransaction() {
|
|
126
|
+
await this.testTransaction?.rollback();
|
|
127
|
+
this.testTransaction = null;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
export const DB = new DBClass();
|
|
131
|
+
|
|
132
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9kYi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBEQlByZXNldCA9IFwid1wiIHwgXCJyXCI7XG5pbXBvcnQga25leCwgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCAqIGFzIF8gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaVwiO1xuaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ29udGV4dCB9IGZyb20gXCIuL3RyYW5zYWN0aW9uLWNvbnRleHRcIjtcbmltcG9ydCB7IERhdGFiYXNlQ29uZmlnLCBTb25hbXVDb25maWcgfSBmcm9tIFwiLi4vYXBpL2NvbmZpZ1wiO1xuXG5leHBvcnQgdHlwZSBTb25hbXVEQkNvbmZpZyA9IHtcbiAgZGV2ZWxvcG1lbnRfbWFzdGVyOiBLbmV4LkNvbmZpZztcbiAgZGV2ZWxvcG1lbnRfc2xhdmU6IEtuZXguQ29uZmlnO1xuICB0ZXN0OiBLbmV4LkNvbmZpZztcbiAgZml4dHVyZV9sb2NhbDogS25leC5Db25maWc7XG4gIGZpeHR1cmVfcmVtb3RlOiBLbmV4LkNvbmZpZztcbiAgcHJvZHVjdGlvbl9tYXN0ZXI6IEtuZXguQ29uZmlnO1xuICBwcm9kdWN0aW9uX3NsYXZlOiBLbmV4LkNvbmZpZztcbn07XG5cbmNsYXNzIERCQ2xhc3Mge1xuICBwcml2YXRlIHdkYj86IEtuZXg7XG4gIHByaXZhdGUgcmRiPzogS25leDtcblxuICBwdWJsaWMgdHJhbnNhY3Rpb25TdG9yYWdlID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlPFRyYW5zYWN0aW9uQ29udGV4dD4oKTtcblxuICBwdWJsaWMgcnVuV2l0aFRyYW5zYWN0aW9uPFQ+KGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TdG9yYWdlLnJ1bihuZXcgVHJhbnNhY3Rpb25Db250ZXh0KCksIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUcmFuc2FjdGlvbkNvbnRleHQoKTogVHJhbnNhY3Rpb25Db250ZXh0IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblN0b3JhZ2UuZ2V0U3RvcmUoKSA/PyBuZXcgVHJhbnNhY3Rpb25Db250ZXh0KCk7XG4gIH1cblxuICBnZXREQih3aGljaDogREJQcmVzZXQpOiBLbmV4IHtcbiAgICBjb25zdCBkYkNvbmZpZyA9IFNvbmFtdS5kYkNvbmZpZztcblxuICAgIC8vIO2FjOyKpO2KuCDtirjrnpzsnq3shZgg6rKp66asXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIikge1xuICAgICAgaWYgKHRoaXMudGVzdFRyYW5zYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRlc3RUcmFuc2FjdGlvbjtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy53ZGIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2RiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1tcIndkYlwiXSA9IGtuZXgoe1xuICAgICAgICAgIC4uLmRiQ29uZmlnW1widGVzdFwiXSxcbiAgICAgICAgICAvLyDri6jsnbwg7ZKAXG4gICAgICAgICAgcG9vbDoge1xuICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgbWF4OiAxLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpc1tcIndkYlwiXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZU5hbWUgPSB3aGljaCA9PT0gXCJ3XCIgPyBcIndkYlwiIDogXCJyZGJcIjtcblxuICAgIGlmICghdGhpc1tpbnN0YW5jZU5hbWVdKSB7XG4gICAgICBsZXQgY29uZmlnOiBLbmV4LkNvbmZpZztcbiAgICAgIHN3aXRjaCAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPz8gXCJkZXZlbG9wbWVudFwiKSB7XG4gICAgICAgIGNhc2UgXCJkZXZlbG9wbWVudFwiOlxuICAgICAgICBjYXNlIFwic3RhZ2luZ1wiOlxuICAgICAgICAgIGNvbmZpZyA9XG4gICAgICAgICAgICB3aGljaCA9PT0gXCJ3XCJcbiAgICAgICAgICAgICAgPyBkYkNvbmZpZ1tcImRldmVsb3BtZW50X21hc3RlclwiXVxuICAgICAgICAgICAgICA6IChkYkNvbmZpZ1tcImRldmVsb3BtZW50X3NsYXZlXCJdID8/XG4gICAgICAgICAgICAgICAgZGJDb25maWdbXCJkZXZlbG9wbWVudF9tYXN0ZXJcIl0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicHJvZHVjdGlvblwiOlxuICAgICAgICAgIGNvbmZpZyA9XG4gICAgICAgICAgICB3aGljaCA9PT0gXCJ3XCJcbiAgICAgICAgICAgICAgPyBkYkNvbmZpZ1tcInByb2R1Y3Rpb25fbWFzdGVyXCJdXG4gICAgICAgICAgICAgIDogKGRiQ29uZmlnW1wicHJvZHVjdGlvbl9zbGF2ZVwiXSA/PyBkYkNvbmZpZ1tcInByb2R1Y3Rpb25fbWFzdGVyXCJdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBg7ZiE7J6sIEVOViAke3Byb2Nlc3MuZW52Lk5PREVfRU5WfeyXkOuKlCDshKTsoJUg6rCA64ql7ZWcIERC7ISk7KCV7J20IOyXhuyKteuLiOuLpC5gXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXNbaW5zdGFuY2VOYW1lXSA9IGtuZXgoY29uZmlnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1tpbnN0YW5jZU5hbWVdITtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMud2RiICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMud2RiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMud2RiID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZGIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXdhaXQgdGhpcy5yZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5yZGIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdlbmVyYXRlREJDb25maWcoY29uZmlnOiBTb25hbXVDb25maWdbXCJkYXRhYmFzZVwiXSk6IFNvbmFtdURCQ29uZmlnIHtcbiAgICBjb25zdCBkZWZhdWx0S25leENvbmZpZzogUGFydGlhbDxEYXRhYmFzZUNvbmZpZz4gPSBfLm1lcmdlKFxuICAgICAge1xuICAgICAgICBjbGllbnQ6IFwibXlzcWwyXCIsXG4gICAgICAgIHBvb2w6IHtcbiAgICAgICAgICBtaW46IDEsXG4gICAgICAgICAgbWF4OiA1LFxuICAgICAgICB9LFxuICAgICAgICBtaWdyYXRpb25zOiB7XG4gICAgICAgICAgZGlyZWN0b3J5OiBcIi4vc3JjL21pZ3JhdGlvbnNcIixcbiAgICAgICAgfSxcbiAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgIGRhdGFiYXNlOiBjb25maWcubmFtZSxcbiAgICAgICAgICAuLi5jb25maWcuZGVmYXVsdE9wdGlvbnM/LmNvbm5lY3Rpb24sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY29uZmlnLmRlZmF1bHRPcHRpb25zXG4gICAgKTtcblxuICAgIC8vIOuhnOy7rCDtmZjqsr0g7ISk7KCVXG4gICAgY29uc3QgdGVzdDogRGF0YWJhc2VDb25maWcgPSBfLm1lcmdlKHt9LCBkZWZhdWx0S25leENvbmZpZywge1xuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICBkYXRhYmFzZTogYCR7Y29uZmlnLm5hbWV9X3Rlc3RgLFxuICAgICAgICAuLi5jb25maWcuZGVmYXVsdE9wdGlvbnM/LmNvbm5lY3Rpb24sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgZml4dHVyZV9sb2NhbCA9IF8ubWVyZ2Uoe30sIGRlZmF1bHRLbmV4Q29uZmlnLCB7XG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIGRhdGFiYXNlOiBgJHtjb25maWcubmFtZX1fZml4dHVyZV9sb2NhbGAsXG4gICAgICAgIC4uLmNvbmZpZy5kZWZhdWx0T3B0aW9ucz8uY29ubmVjdGlvbixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyDqsJzrsJwg7ZmY6rK9IOyEpOyglVxuICAgIGNvbnN0IGRldk1hc3Rlck9wdGlvbnMgPSBjb25maWcuZW52aXJvbm1lbnRzPy5kZXZlbG9wbWVudDtcbiAgICBjb25zdCBkZXZTbGF2ZU9wdGlvbnMgPSBjb25maWcuZW52aXJvbm1lbnRzPy5kZXZlbG9wbWVudF9zbGF2ZTtcbiAgICBjb25zdCBkZXZlbG9wbWVudF9tYXN0ZXIgPSBfLm1lcmdlKHt9LCBkZWZhdWx0S25leENvbmZpZywgZGV2TWFzdGVyT3B0aW9ucyk7XG4gICAgY29uc3QgZGV2ZWxvcG1lbnRfc2xhdmUgPSBfLm1lcmdlKFxuICAgICAge30sXG4gICAgICBkZWZhdWx0S25leENvbmZpZyxcbiAgICAgIGRldk1hc3Rlck9wdGlvbnMsXG4gICAgICBkZXZTbGF2ZU9wdGlvbnNcbiAgICApO1xuICAgIC8vIE5PVEU6IGZpeHR1cmUgcmVtb3Rl64qUIGRlZmF1bHQgY29ubmVjdGlvbuydmCBEQuulvCBvdmVycmlkZe2VtOyEoCDslYjrkKguXG4gICAgY29uc3QgZml4dHVyZV9yZW1vdGUgPSBfLm1lcmdlKFxuICAgICAge30sXG4gICAgICBkZWZhdWx0S25leENvbmZpZyxcbiAgICAgIGRldk1hc3Rlck9wdGlvbnMsXG4gICAgICB7XG4gICAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgICBkYXRhYmFzZTogYCR7Y29uZmlnLm5hbWV9X2ZpeHR1cmVfcmVtb3RlYCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBjb25maWcuZW52aXJvbm1lbnRzPy5yZW1vdGVfZml4dHVyZVxuICAgICk7XG5cbiAgICAvLyDtlITroZzrjZXshZgg7ZmY6rK9IOyEpOyglVxuICAgIGNvbnN0IHByb2RNYXN0ZXJPcHRpb25zID0gY29uZmlnLmVudmlyb25tZW50cz8ucHJvZHVjdGlvbiA/PyB7fTtcbiAgICBjb25zdCBwcm9kU2xhdmVPcHRpb25zID0gY29uZmlnLmVudmlyb25tZW50cz8ucHJvZHVjdGlvbl9zbGF2ZSA/PyB7fTtcbiAgICBjb25zdCBwcm9kdWN0aW9uX21hc3RlciA9IF8ubWVyZ2Uoe30sIGRlZmF1bHRLbmV4Q29uZmlnLCBwcm9kTWFzdGVyT3B0aW9ucyk7XG4gICAgY29uc3QgcHJvZHVjdGlvbl9zbGF2ZSA9IF8ubWVyZ2UoXG4gICAgICB7fSxcbiAgICAgIGRlZmF1bHRLbmV4Q29uZmlnLFxuICAgICAgcHJvZE1hc3Rlck9wdGlvbnMsXG4gICAgICBwcm9kU2xhdmVPcHRpb25zXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0ZXN0LFxuICAgICAgZml4dHVyZV9sb2NhbCxcbiAgICAgIGZpeHR1cmVfcmVtb3RlLFxuICAgICAgZGV2ZWxvcG1lbnRfbWFzdGVyLFxuICAgICAgZGV2ZWxvcG1lbnRfc2xhdmUsXG4gICAgICBwcm9kdWN0aW9uX21hc3RlcixcbiAgICAgIHByb2R1Y3Rpb25fc2xhdmUsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRlc3Qg7ZmY6rK97JeQ7IScIO2KuOuenOyereyFmCDsgqzsmqlcbiAgcHVibGljIHRlc3RUcmFuc2FjdGlvbjogS25leC5UcmFuc2FjdGlvbiB8IG51bGwgPSBudWxsO1xuICBhc3luYyBjcmVhdGVUZXN0VHJhbnNhY3Rpb24oKTogUHJvbWlzZTxLbmV4LlRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKFwid1wiKTtcbiAgICB0aGlzLnRlc3RUcmFuc2FjdGlvbiA9IGF3YWl0IGRiLnRyYW5zYWN0aW9uKCk7XG4gICAgcmV0dXJuIHRoaXMudGVzdFRyYW5zYWN0aW9uO1xuICB9XG4gIGFzeW5jIGNsZWFyVGVzdFRyYW5zYWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMudGVzdFRyYW5zYWN0aW9uPy5yb2xsYmFjaygpO1xuICAgIHRoaXMudGVzdFRyYW5zYWN0aW9uID0gbnVsbDtcbiAgfVxufVxuZXhwb3J0IGNvbnN0IERCID0gbmV3IERCQ2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJrbmV4IiwiXyIsIlNvbmFtdSIsIkFzeW5jTG9jYWxTdG9yYWdlIiwiVHJhbnNhY3Rpb25Db250ZXh0IiwiREJDbGFzcyIsIndkYiIsInJkYiIsInRyYW5zYWN0aW9uU3RvcmFnZSIsInJ1bldpdGhUcmFuc2FjdGlvbiIsImNhbGxiYWNrIiwicnVuIiwiZ2V0VHJhbnNhY3Rpb25Db250ZXh0IiwiZ2V0U3RvcmUiLCJnZXREQiIsIndoaWNoIiwiZGJDb25maWciLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJ0ZXN0VHJhbnNhY3Rpb24iLCJwb29sIiwibWluIiwibWF4IiwiaW5zdGFuY2VOYW1lIiwiY29uZmlnIiwiRXJyb3IiLCJkZXN0cm95IiwidW5kZWZpbmVkIiwiZ2VuZXJhdGVEQkNvbmZpZyIsImRlZmF1bHRLbmV4Q29uZmlnIiwibWVyZ2UiLCJjbGllbnQiLCJtaWdyYXRpb25zIiwiZGlyZWN0b3J5IiwiY29ubmVjdGlvbiIsImRhdGFiYXNlIiwibmFtZSIsImRlZmF1bHRPcHRpb25zIiwidGVzdCIsImZpeHR1cmVfbG9jYWwiLCJkZXZNYXN0ZXJPcHRpb25zIiwiZW52aXJvbm1lbnRzIiwiZGV2ZWxvcG1lbnQiLCJkZXZTbGF2ZU9wdGlvbnMiLCJkZXZlbG9wbWVudF9zbGF2ZSIsImRldmVsb3BtZW50X21hc3RlciIsImZpeHR1cmVfcmVtb3RlIiwicmVtb3RlX2ZpeHR1cmUiLCJwcm9kTWFzdGVyT3B0aW9ucyIsInByb2R1Y3Rpb24iLCJwcm9kU2xhdmVPcHRpb25zIiwicHJvZHVjdGlvbl9zbGF2ZSIsInByb2R1Y3Rpb25fbWFzdGVyIiwiY3JlYXRlVGVzdFRyYW5zYWN0aW9uIiwiZGIiLCJ0cmFuc2FjdGlvbiIs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
|
|
@@ -1,2 +1,39 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import knex from "knex";
|
|
2
|
+
export function attachOnDuplicateUpdate() {
|
|
3
|
+
try {
|
|
4
|
+
knex.QueryBuilder.extend("onDuplicateUpdate", function(...columns) {
|
|
5
|
+
if (columns.length === 0) {
|
|
6
|
+
// 업데이트 할 컬럼이 없으면 onDuplicateUpdate 구문 처리 패스
|
|
7
|
+
const { sql: originalSQL, bindings: originalBindings } = this.toSQL();
|
|
8
|
+
return this.client.raw(originalSQL, originalBindings);
|
|
9
|
+
}
|
|
10
|
+
const { placeholders, bindings } = columns.reduce((result, column)=>{
|
|
11
|
+
if (typeof column === "string") {
|
|
12
|
+
result.placeholders.push(`?? = Values(??)`);
|
|
13
|
+
result.bindings.push(column, column);
|
|
14
|
+
} else if (column && typeof column === "object") {
|
|
15
|
+
Object.keys(column).forEach((key)=>{
|
|
16
|
+
result.placeholders.push(`?? = ?`);
|
|
17
|
+
result.bindings.push(key, column[key]);
|
|
18
|
+
});
|
|
19
|
+
} else {
|
|
20
|
+
throw new Error("onDuplicateUpdate error: expected column name to be string or object.");
|
|
21
|
+
}
|
|
22
|
+
return result;
|
|
23
|
+
}, {
|
|
24
|
+
placeholders: [],
|
|
25
|
+
bindings: []
|
|
26
|
+
});
|
|
27
|
+
const { sql: originalSQL, bindings: originalBindings } = this.toSQL();
|
|
28
|
+
const newBindings = [
|
|
29
|
+
...originalBindings,
|
|
30
|
+
...bindings
|
|
31
|
+
];
|
|
32
|
+
return this.client.raw(`${originalSQL} ON DUPLICATE KEY UPDATE ${placeholders.join(", ")}`, newBindings);
|
|
33
|
+
});
|
|
34
|
+
} catch {
|
|
35
|
+
// ignored
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhYmFzZS9rbmV4LXBsdWdpbnMva25leC1vbi1kdXBsaWNhdGUtdXBkYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBrbmV4IGZyb20gXCJrbmV4XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hPbkR1cGxpY2F0ZVVwZGF0ZSgpIHtcbiAgdHJ5IHtcbiAgICBrbmV4LlF1ZXJ5QnVpbGRlci5leHRlbmQoXCJvbkR1cGxpY2F0ZVVwZGF0ZVwiLCBmdW5jdGlvbiAoLi4uY29sdW1ucykge1xuICAgICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIOyXheuNsOydtO2KuCDtlaAg7Lus65+87J20IOyXhuycvOuptCBvbkR1cGxpY2F0ZVVwZGF0ZSDqtazrrLgg7LKY66asIO2MqOyKpFxuICAgICAgICBjb25zdCB7IHNxbDogb3JpZ2luYWxTUUwsIGJpbmRpbmdzOiBvcmlnaW5hbEJpbmRpbmdzIH0gPSB0aGlzLnRvU1FMKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5yYXcob3JpZ2luYWxTUUwsIG9yaWdpbmFsQmluZGluZ3MpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHBsYWNlaG9sZGVycywgYmluZGluZ3MgfSA9IGNvbHVtbnMucmVkdWNlKFxuICAgICAgICAocmVzdWx0LCBjb2x1bW4pID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmVzdWx0LnBsYWNlaG9sZGVycy5wdXNoKGA/PyA9IFZhbHVlcyg/PylgKTtcbiAgICAgICAgICAgIHJlc3VsdC5iaW5kaW5ncy5wdXNoKGNvbHVtbiwgY29sdW1uKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbiAmJiB0eXBlb2YgY29sdW1uID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb2x1bW4pLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICByZXN1bHQucGxhY2Vob2xkZXJzLnB1c2goYD8/ID0gP2ApO1xuICAgICAgICAgICAgICByZXN1bHQuYmluZGluZ3MucHVzaChrZXksIGNvbHVtbltrZXldKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIFwib25EdXBsaWNhdGVVcGRhdGUgZXJyb3I6IGV4cGVjdGVkIGNvbHVtbiBuYW1lIHRvIGJlIHN0cmluZyBvciBvYmplY3QuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgICAgeyBwbGFjZWhvbGRlcnM6IFtdLCBiaW5kaW5nczogW10gfVxuICAgICAgKTtcblxuICAgICAgY29uc3QgeyBzcWw6IG9yaWdpbmFsU1FMLCBiaW5kaW5nczogb3JpZ2luYWxCaW5kaW5ncyB9ID0gdGhpcy50b1NRTCgpO1xuXG4gICAgICBjb25zdCBuZXdCaW5kaW5ncyA9IFsuLi5vcmlnaW5hbEJpbmRpbmdzLCAuLi5iaW5kaW5nc107XG5cbiAgICAgIHJldHVybiB0aGlzLmNsaWVudC5yYXcoXG4gICAgICAgIGAke29yaWdpbmFsU1FMfSBPTiBEVVBMSUNBVEUgS0VZIFVQREFURSAke3BsYWNlaG9sZGVycy5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgbmV3QmluZGluZ3NcbiAgICAgICk7XG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZWRcbiAgfVxufSJdLCJuYW1lcyI6WyJrbmV4IiwiYXR0YWNoT25EdXBsaWNhdGVVcGRhdGUiLCJRdWVyeUJ1aWxkZXIiLCJleHRlbmQiLCJjb2x1bW5zIiwibGVuZ3RoIiwic3FsIiwib3JpZ2luYWxTUUwiLCJiaW5kaW5ncyIsIm9yaWdpbmFsQmluZGluZ3MiLCJ0b1NRTCIsImNsaWVudCIsInJhdyIsInBsYWNlaG9sZGVycyIsInJlZHVjZSIsInJlc3VsdCIsImNvbHVtbiIsInB1c2giLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsIkVycm9yIiwibmV3QmluZGluZ3MiLCJqb2luIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxVQUFVLE9BQU87QUFFeEIsT0FBTyxTQUFTQztJQUNkLElBQUk7UUFDRkQsS0FBS0UsWUFBWSxDQUFDQyxNQUFNLENBQUMscUJBQXFCLFNBQVUsR0FBR0MsT0FBTztZQUNoRSxJQUFJQSxRQUFRQyxNQUFNLEtBQUssR0FBRztnQkFDeEIsNENBQTRDO2dCQUM1QyxNQUFNLEVBQUVDLEtBQUtDLFdBQVcsRUFBRUMsVUFBVUMsZ0JBQWdCLEVBQUUsR0FBRyxJQUFJLENBQUNDLEtBQUs7Z0JBQ25FLE9BQU8sSUFBSSxDQUFDQyxNQUFNLENBQUNDLEdBQUcsQ0FBQ0wsYUFBYUU7WUFDdEM7WUFFQSxNQUFNLEVBQUVJLFlBQVksRUFBRUwsUUFBUSxFQUFFLEdBQUdKLFFBQVFVLE1BQU0sQ0FDL0MsQ0FBQ0MsUUFBUUM7Z0JBQ1AsSUFBSSxPQUFPQSxXQUFXLFVBQVU7b0JBQzlCRCxPQUFPRixZQUFZLENBQUNJLElBQUksQ0FBQyxDQUFDLGVBQWUsQ0FBQztvQkFDMUNGLE9BQU9QLFFBQVEsQ0FBQ1MsSUFBSSxDQUFDRCxRQUFRQTtnQkFDL0IsT0FBTyxJQUFJQSxVQUFVLE9BQU9BLFdBQVcsVUFBVTtvQkFDL0NFLE9BQU9DLElBQUksQ0FBQ0gsUUFBUUksT0FBTyxDQUFDLENBQUNDO3dCQUMzQk4sT0FBT0YsWUFBWSxDQUFDSSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7d0JBQ2pDRixPQUFPUCxRQUFRLENBQUNTLElBQUksQ0FBQ0ksS0FBS0wsTUFBTSxDQUFDSyxJQUFJO29CQUN2QztnQkFDRixPQUFPO29CQUNMLE1BQU0sSUFBSUMsTUFDUjtnQkFFSjtnQkFFQSxPQUFPUDtZQUNULEdBQ0E7Z0JBQUVGLGNBQWMsRUFBRTtnQkFBRUwsVUFBVSxFQUFFO1lBQUM7WUFHbkMsTUFBTSxFQUFFRixLQUFLQyxXQUFXLEVBQUVDLFVBQVVDLGdCQUFnQixFQUFFLEdBQUcsSUFBSSxDQUFDQyxLQUFLO1lBRW5FLE1BQU1hLGNBQWM7bUJBQUlkO21CQUFxQkQ7YUFBUztZQUV0RCxPQUFPLElBQUksQ0FBQ0csTUFBTSxDQUFDQyxHQUFHLENBQ3BCLEdBQUdMLFlBQVkseUJBQXlCLEVBQUVNLGFBQWFXLElBQUksQ0FBQyxPQUFPLEVBQ25FRDtRQUVKO0lBQ0YsRUFBRSxPQUFNO0lBQ04sVUFBVTtJQUNaO0FBQ0YifQ==
|
|
@@ -3,27 +3,39 @@ import { Puri } from "./puri";
|
|
|
3
3
|
import { UBRef, UpsertBuilder } from "./upsert-builder";
|
|
4
4
|
import { DatabaseSchemaExtend } from "../types/types";
|
|
5
5
|
import { DBPreset } from "./db";
|
|
6
|
-
type TableName<
|
|
6
|
+
type TableName<TSchema extends DatabaseSchemaExtend> = Extract<keyof TSchema, string>;
|
|
7
7
|
export type TransactionalOptions = {
|
|
8
8
|
isolation?: Exclude<Knex.IsolationLevels, "snapshot">;
|
|
9
9
|
dbPreset?: DBPreset;
|
|
10
10
|
readOnly?: boolean;
|
|
11
11
|
};
|
|
12
|
-
export declare class PuriWrapper<
|
|
12
|
+
export declare class PuriWrapper<TSchema extends DatabaseSchemaExtend = DatabaseSchemaExtend> {
|
|
13
13
|
knex: Knex;
|
|
14
14
|
upsertBuilder: UpsertBuilder;
|
|
15
15
|
constructor(knex: Knex, upsertBuilder: UpsertBuilder);
|
|
16
16
|
raw(sql: string): Knex.Raw;
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
from<TTable extends keyof TSchema>(tableName: TTable): Puri<TSchema, Record<TTable, TSchema[TTable]>, Omit<TSchema[TTable], "__fulltext__">>;
|
|
18
|
+
from<TTable extends keyof TSchema, TAlias extends string>(spec: {
|
|
19
|
+
[K in TAlias]: TTable;
|
|
20
|
+
}): Puri<TSchema, Record<TAlias, TSchema[TTable]>, Omit<TSchema[TTable], "__fulltext__">>;
|
|
21
|
+
from<TAlias extends string, TSubResult>(spec: {
|
|
22
|
+
[K in TAlias]: Puri<TSchema, any, TSubResult>;
|
|
23
|
+
}): Puri<TSchema, Record<TAlias, TSubResult>, Omit<TSubResult, "__fulltext__">>;
|
|
24
|
+
table<TTable extends keyof TSchema>(tableName: TTable): Puri<TSchema, Record<TTable, TSchema[TTable]>, Omit<TSchema[TTable], "__fulltext__">>;
|
|
25
|
+
table<TTable extends keyof TSchema, TAlias extends string>(spec: {
|
|
26
|
+
[K in TAlias]: TTable;
|
|
27
|
+
}): Puri<TSchema, Record<TAlias, TSchema[TTable]>, Omit<TSchema[TTable], "__fulltext__">>;
|
|
28
|
+
table<TAlias extends string, TSubResult>(spec: {
|
|
29
|
+
[K in TAlias]: Puri<TSchema, any, TSubResult>;
|
|
30
|
+
}): Puri<TSchema, Record<TAlias, TSubResult>, Omit<TSubResult, "__fulltext__">>;
|
|
19
31
|
transaction<T>(callback: (trx: PuriTransactionWrapper) => Promise<T>, options?: TransactionalOptions): Promise<T>;
|
|
20
|
-
ubRegister<TTable extends TableName<
|
|
21
|
-
[K in keyof
|
|
32
|
+
ubRegister<TTable extends TableName<TSchema>>(tableName: TTable, row: Partial<{
|
|
33
|
+
[K in keyof TSchema[TTable]]: TSchema[TTable][K] | UBRef;
|
|
22
34
|
}>): UBRef;
|
|
23
|
-
ubUpsert(tableName: TableName<
|
|
24
|
-
ubInsertOnly(tableName: TableName<
|
|
25
|
-
ubUpsertOrInsert(tableName: TableName<
|
|
26
|
-
ubUpdateBatch(tableName: TableName<
|
|
35
|
+
ubUpsert(tableName: TableName<TSchema>, chunkSize?: number): Promise<number[]>;
|
|
36
|
+
ubInsertOnly(tableName: TableName<TSchema>, chunkSize?: number): Promise<number[]>;
|
|
37
|
+
ubUpsertOrInsert(tableName: TableName<TSchema>, mode: "upsert" | "insert", chunkSize?: number): Promise<number[]>;
|
|
38
|
+
ubUpdateBatch(tableName: TableName<TSchema>, options?: {
|
|
27
39
|
chunkSize?: number;
|
|
28
40
|
where?: string | string[];
|
|
29
41
|
}): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puri-wrapper.d.ts","sourceRoot":"","sources":["../../src/database/puri-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhC,KAAK,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"puri-wrapper.d.ts","sourceRoot":"","sources":["../../src/database/puri-wrapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,109 @@
|
|
|
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 PuriTransactionWrapper(){return PuriTransactionWrapper},get PuriWrapper(){return PuriWrapper}});var _puri=require("./puri");var _chalk=/*#__PURE__*/_interop_require_default(require("chalk"));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 _assert_this_initialized(self){if(self===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return self}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 _call_super(_this,derived,args){derived=_get_prototype_of(derived);return _possible_constructor_return(_this,_is_native_reflect_construct()?Reflect.construct(derived,args||[],_get_prototype_of(_this).constructor):derived.apply(_this,args))}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 _get_prototype_of(o){_get_prototype_of=Object.setPrototypeOf?Object.getPrototypeOf:function getPrototypeOf(o){return o.__proto__||Object.getPrototypeOf(o)};return _get_prototype_of(o)}function _inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function")}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,writable:true,configurable:true}});if(superClass)_set_prototype_of(subClass,superClass)}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}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 _possible_constructor_return(self,call){if(call&&(_type_of(call)==="object"||typeof call==="function")){return call}return _assert_this_initialized(self)}function _set_prototype_of(o,p){_set_prototype_of=Object.setPrototypeOf||function setPrototypeOf(o,p){o.__proto__=p;return o};return _set_prototype_of(o,p)}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 _type_of(obj){"@swc/helpers - typeof";return obj&&typeof Symbol!=="undefined"&&obj.constructor===Symbol?"symbol":typeof obj}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 _is_native_reflect_construct(){try{var result=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(_){}return(_is_native_reflect_construct=function(){return!!result})()}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 PuriWrapper=/*#__PURE__*/function(){"use strict";function PuriWrapper(knex,upsertBuilder){_class_call_check(this,PuriWrapper);_define_property(this,"knex",void 0);_define_property(this,"upsertBuilder",void 0);this.knex=knex;this.upsertBuilder=upsertBuilder}_create_class(PuriWrapper,[{key:"raw",value:function raw(sql){return this.knex.raw(sql)}},{key:"table",value:function table(tableName){return new _puri.Puri(this.knex,tableName)}},{key:"fromSubquery",value:function fromSubquery(subquery,alias){return new _puri.Puri(this.knex,subquery,alias)}},{key:"transaction",value:function transaction(_0){return _async_to_generator(function(callback){var _this,options,isolation,readOnly;var _arguments=arguments;return _ts_generator(this,function(_state){_this=this;options=_arguments.length>1&&_arguments[1]!==void 0?_arguments[1]:{};isolation=options.isolation,readOnly=options.readOnly;return[2,this.knex.transaction(function(trx){return _async_to_generator(function(){return _ts_generator(this,function(_state){return[2,callback(new PuriTransactionWrapper(trx,this.upsertBuilder))]})}).call(_this)},{isolationLevel:isolation,readOnly:readOnly})]})}).apply(this,arguments)}},{key:"ubRegister",value:function ubRegister(tableName,row){return this.upsertBuilder.register(tableName,row)}},{key:"ubUpsert",value:function ubUpsert(tableName,chunkSize){return this.upsertBuilder.upsert(this.knex,tableName,chunkSize)}},{key:"ubInsertOnly",value:function ubInsertOnly(tableName,chunkSize){return this.upsertBuilder.insertOnly(this.knex,tableName,chunkSize)}},{key:"ubUpsertOrInsert",value:function ubUpsertOrInsert(tableName,mode,chunkSize){return this.upsertBuilder.upsertOrInsert(this.knex,tableName,mode,chunkSize)}},{key:"ubUpdateBatch",value:function ubUpdateBatch(tableName,options){return this.upsertBuilder.updateBatch(this.knex,tableName,options)}},{key:"debugTransaction",value:function debugTransaction(){return _async_to_generator(function(){var info;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,this.getTransactionInfo()];case 1:info=_state.sent();console.log("".concat(_chalk.default.cyan("[Puri Transaction]")," ").concat(_chalk.default.magenta(info)));return[2]}})}).call(this)}},{key:"getTransactionInfo",value:function getTransactionInfo(){return _async_to_generator(function(){var _ref,connectionIdRows,connectionId,_ref1,trxRows,trx;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,this.knex.raw("SELECT CONNECTION_ID() as connection_id")];case 1:_ref=_sliced_to_array.apply(void 0,[_state.sent(),1]),connectionIdRows=_ref[0];connectionId=connectionIdRows[0].connection_id;return[4,this.knex.raw("\n SELECT STATE, ISOLATION_LEVEL, THREAD_ID, EVENT_ID\n FROM performance_schema.events_transactions_current\n WHERE THREAD_ID = \n (SELECT THREAD_ID\n FROM performance_schema.threads \n WHERE PROCESSLIST_ID = CONNECTION_ID())\n ")];case 2:_ref1=_sliced_to_array.apply(void 0,[_state.sent(),1]),trxRows=_ref1[0];if(trxRows.length>0&&trxRows[0].STATE!=="COMMITTED"){trx=trxRows[0];return[2,"In Transaction, ConnID: ".concat(connectionId,", ThreadID: ").concat(trx.THREAD_ID,", EventID: ").concat(trx.EVENT_ID,", InnoDB TRX: ").concat(trx.STATE,"(").concat(trx.ISOLATION_LEVEL,")")]}else{return[2,"Not in Transaction, ConnID: ".concat(connectionId)]}return[2]}})}).call(this)}}]);return PuriWrapper}();var PuriTransactionWrapper=/*#__PURE__*/function(PuriWrapper){"use strict";_inherits(PuriTransactionWrapper,PuriWrapper);function PuriTransactionWrapper(trx,upsertBuilder){_class_call_check(this,PuriTransactionWrapper);var _this;_this=_call_super(this,PuriTransactionWrapper,[trx,upsertBuilder]),_define_property(_this,"trx",void 0),_define_property(_this,"upsertBuilder",void 0),_this.trx=trx,_this.upsertBuilder=upsertBuilder;return _this}_create_class(PuriTransactionWrapper,[{key:"rollback",value:function rollback(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,this.trx.rollback()];case 1:_state.sent();return[2]}})}).call(this)}},{key:"commit",value:function commit(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,this.trx.commit()];case 1:_state.sent();return[2]}})}).call(this)}}]);return PuriTransactionWrapper}(PuriWrapper);
|
|
2
|
-
|
|
1
|
+
import { Puri } from "./puri.js";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
export class PuriWrapper {
|
|
4
|
+
knex;
|
|
5
|
+
upsertBuilder;
|
|
6
|
+
constructor(knex, upsertBuilder){
|
|
7
|
+
this.knex = knex;
|
|
8
|
+
this.upsertBuilder = upsertBuilder;
|
|
9
|
+
}
|
|
10
|
+
raw(sql) {
|
|
11
|
+
return this.knex.raw(sql);
|
|
12
|
+
}
|
|
13
|
+
from(spec) {
|
|
14
|
+
return new Puri(this.knex, spec);
|
|
15
|
+
}
|
|
16
|
+
table(spec) {
|
|
17
|
+
return new Puri(this.knex, spec);
|
|
18
|
+
}
|
|
19
|
+
async transaction(callback, options = {}) {
|
|
20
|
+
const { isolation, readOnly, dbPreset = "w" } = options;
|
|
21
|
+
// @transactional 데코레이터와 동일한 로직: 이미 트랜잭션 컨텍스트가 있는지 확인
|
|
22
|
+
const { DB } = await import("./db.js");
|
|
23
|
+
const existingContext = DB.transactionStorage.getStore();
|
|
24
|
+
// AsyncLocalStorage 컨텍스트가 없거나 해당 preset의 트랜잭션이 없으면 새로 시작
|
|
25
|
+
const startTransaction = async (knex, upsertBuilder)=>{
|
|
26
|
+
return knex.transaction(async (trx)=>{
|
|
27
|
+
const trxWrapper = new PuriTransactionWrapper(trx, upsertBuilder);
|
|
28
|
+
// TransactionContext에 트랜잭션 저장
|
|
29
|
+
DB.getTransactionContext().setTransaction(dbPreset, trxWrapper);
|
|
30
|
+
try {
|
|
31
|
+
return await callback(trxWrapper);
|
|
32
|
+
} finally{
|
|
33
|
+
// 트랜잭션 제거
|
|
34
|
+
DB.getTransactionContext().deleteTransaction(dbPreset);
|
|
35
|
+
}
|
|
36
|
+
}, {
|
|
37
|
+
isolationLevel: isolation,
|
|
38
|
+
readOnly
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
// AsyncLocalStorage 컨텍스트가 없으면 새로 생성
|
|
42
|
+
if (!existingContext) {
|
|
43
|
+
return DB.runWithTransaction(()=>startTransaction(this.knex, this.upsertBuilder));
|
|
44
|
+
}
|
|
45
|
+
// 해당 preset의 트랜잭션이 이미 있으면 SAVEPOINT로 중첩 트랜잭션 생성
|
|
46
|
+
const existingTrx = existingContext.getTransaction(dbPreset);
|
|
47
|
+
if (existingTrx) {
|
|
48
|
+
return startTransaction(existingTrx.trx, existingTrx.upsertBuilder);
|
|
49
|
+
} else {
|
|
50
|
+
// 컨텍스트는 있지만 이 preset의 트랜잭션은 없는 경우 (같은 컨텍스트 내에서 실행)
|
|
51
|
+
return startTransaction(this.knex, this.upsertBuilder);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
ubRegister(tableName, row) {
|
|
55
|
+
return this.upsertBuilder.register(tableName, row);
|
|
56
|
+
}
|
|
57
|
+
ubUpsert(tableName, chunkSize) {
|
|
58
|
+
return this.upsertBuilder.upsert(this.knex, tableName, chunkSize);
|
|
59
|
+
}
|
|
60
|
+
ubInsertOnly(tableName, chunkSize) {
|
|
61
|
+
return this.upsertBuilder.insertOnly(this.knex, tableName, chunkSize);
|
|
62
|
+
}
|
|
63
|
+
ubUpsertOrInsert(tableName, mode, chunkSize) {
|
|
64
|
+
return this.upsertBuilder.upsertOrInsert(this.knex, tableName, mode, chunkSize);
|
|
65
|
+
}
|
|
66
|
+
ubUpdateBatch(tableName, options) {
|
|
67
|
+
return this.upsertBuilder.updateBatch(this.knex, tableName, options);
|
|
68
|
+
}
|
|
69
|
+
// 트랜잭션 연결 테스트용
|
|
70
|
+
async debugTransaction() {
|
|
71
|
+
const info = await this.getTransactionInfo();
|
|
72
|
+
console.log(`${chalk.cyan("[Puri Transaction]")} ${chalk.magenta(info)}`);
|
|
73
|
+
}
|
|
74
|
+
async getTransactionInfo() {
|
|
75
|
+
// 연결 ID 조회
|
|
76
|
+
const [connectionIdRows] = await this.knex.raw(`SELECT CONNECTION_ID() as connection_id`);
|
|
77
|
+
const connectionId = connectionIdRows[0].connection_id;
|
|
78
|
+
// 트랜잭션 정보 조회
|
|
79
|
+
const [trxRows] = await this.knex.raw(`
|
|
80
|
+
SELECT STATE, ISOLATION_LEVEL, THREAD_ID, EVENT_ID
|
|
81
|
+
FROM performance_schema.events_transactions_current
|
|
82
|
+
WHERE THREAD_ID =
|
|
83
|
+
(SELECT THREAD_ID
|
|
84
|
+
FROM performance_schema.threads
|
|
85
|
+
WHERE PROCESSLIST_ID = CONNECTION_ID())
|
|
86
|
+
`);
|
|
87
|
+
if (trxRows.length > 0 && trxRows[0].STATE !== "COMMITTED") {
|
|
88
|
+
const trx = trxRows[0];
|
|
89
|
+
return `In Transaction, ConnID: ${connectionId}, ThreadID: ${trx.THREAD_ID}, EventID: ${trx.EVENT_ID}, InnoDB TRX: ${trx.STATE}(${trx.ISOLATION_LEVEL})`;
|
|
90
|
+
} else {
|
|
91
|
+
return `Not in Transaction, ConnID: ${connectionId}`;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export class PuriTransactionWrapper extends PuriWrapper {
|
|
96
|
+
trx;
|
|
97
|
+
upsertBuilder;
|
|
98
|
+
constructor(trx, upsertBuilder){
|
|
99
|
+
super(trx, upsertBuilder), this.trx = trx, this.upsertBuilder = upsertBuilder;
|
|
100
|
+
}
|
|
101
|
+
async rollback() {
|
|
102
|
+
await this.trx.rollback();
|
|
103
|
+
}
|
|
104
|
+
async commit() {
|
|
105
|
+
await this.trx.commit();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLXdyYXBwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBQdXJpIH0gZnJvbSBcIi4vcHVyaVwiO1xuaW1wb3J0IHsgVUJSZWYsIFVwc2VydEJ1aWxkZXIgfSBmcm9tIFwiLi91cHNlcnQtYnVpbGRlclwiO1xuaW1wb3J0IHsgRGF0YWJhc2VTY2hlbWFFeHRlbmQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IERCUHJlc2V0IH0gZnJvbSBcIi4vZGJcIjtcblxudHlwZSBUYWJsZU5hbWU8VFNjaGVtYSBleHRlbmRzIERhdGFiYXNlU2NoZW1hRXh0ZW5kPiA9IEV4dHJhY3Q8XG4gIGtleW9mIFRTY2hlbWEsXG4gIHN0cmluZ1xuPjtcblxuZXhwb3J0IHR5cGUgVHJhbnNhY3Rpb25hbE9wdGlvbnMgPSB7XG4gIGlzb2xhdGlvbj86IEV4Y2x1ZGU8S25leC5Jc29sYXRpb25MZXZlbHMsIFwic25hcHNob3RcIj47IC8vIHNuYXBzaG90OiBtc3NxbCBvbmx5XG4gIGRiUHJlc2V0PzogREJQcmVzZXQ7XG4gIHJlYWRPbmx5PzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjbGFzcyBQdXJpV3JhcHBlcjxcbiAgVFNjaGVtYSBleHRlbmRzIERhdGFiYXNlU2NoZW1hRXh0ZW5kID0gRGF0YWJhc2VTY2hlbWFFeHRlbmQsXG4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtuZXg6IEtuZXgsXG4gICAgcHVibGljIHVwc2VydEJ1aWxkZXI6IFVwc2VydEJ1aWxkZXJcbiAgKSB7fVxuXG4gIHJhdyhzcWw6IHN0cmluZyk6IEtuZXguUmF3IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4LnJhdyhzcWwpO1xuICB9XG5cbiAgLy8g7YWM7J2067iU66qF7Jy866GcIOyLnOyekVxuICBmcm9tPFRUYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVFRhYmxlXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBSZWNvcmQ8VFRhYmxlLCBUU2NoZW1hW1RUYWJsZV0+LFxuICAgIE9taXQ8VFNjaGVtYVtUVGFibGVdLCBcIl9fZnVsbHRleHRfX1wiPlxuICA+O1xuICAvLyDthYzsnbTruJTrqoUgKyBBbGlhc+uhnCDsi5zsnpFcbiAgZnJvbTxUVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLCBUQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KHNwZWM6IHtcbiAgICBbSyBpbiBUQWxpYXNdOiBUVGFibGU7XG4gIH0pOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgUmVjb3JkPFRBbGlhcywgVFNjaGVtYVtUVGFibGVdPixcbiAgICBPbWl0PFRTY2hlbWFbVFRhYmxlXSwgXCJfX2Z1bGx0ZXh0X19cIj5cbiAgPjtcbiAgLy8g7ISc67iM7L+866as66GcIOyLnOyekVxuICBmcm9tPFRBbGlhcyBleHRlbmRzIHN0cmluZywgVFN1YlJlc3VsdD4oc3BlYzoge1xuICAgIFtLIGluIFRBbGlhc106IFB1cmk8VFNjaGVtYSwgYW55LCBUU3ViUmVzdWx0PjtcbiAgfSk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBSZWNvcmQ8VEFsaWFzLCBUU3ViUmVzdWx0PixcbiAgICBPbWl0PFRTdWJSZXN1bHQsIFwiX19mdWxsdGV4dF9fXCI+XG4gID47XG4gIGZyb20oc3BlYzogYW55KTogYW55IHtcbiAgICByZXR1cm4gbmV3IFB1cmkodGhpcy5rbmV4LCBzcGVjKTtcbiAgfVxuXG4gIC8vIO2FjOydtOu4lOuqheycvOuhnCDsi5zsnpFcbiAgdGFibGU8VFRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYT4oXG4gICAgdGFibGVOYW1lOiBUVGFibGVcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFJlY29yZDxUVGFibGUsIFRTY2hlbWFbVFRhYmxlXT4sXG4gICAgT21pdDxUU2NoZW1hW1RUYWJsZV0sIFwiX19mdWxsdGV4dF9fXCI+XG4gID47XG4gIC8vIO2FjOydtOu4lOuqhSArIEFsaWFz66GcIOyLnOyekVxuICB0YWJsZTxUVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLCBUQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KHNwZWM6IHtcbiAgICBbSyBpbiBUQWxpYXNdOiBUVGFibGU7XG4gIH0pOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgUmVjb3JkPFRBbGlhcywgVFNjaGVtYVtUVGFibGVdPixcbiAgICBPbWl0PFRTY2hlbWFbVFRhYmxlXSwgXCJfX2Z1bGx0ZXh0X19cIj5cbiAgPjtcbiAgLy8g7ISc67iM7L+866as66GcIOyLnOyekVxuICB0YWJsZTxUQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KHNwZWM6IHtcbiAgICBbSyBpbiBUQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD47XG4gIH0pOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgUmVjb3JkPFRBbGlhcywgVFN1YlJlc3VsdD4sXG4gICAgT21pdDxUU3ViUmVzdWx0LCBcIl9fZnVsbHRleHRfX1wiPlxuICA+O1xuICB0YWJsZShzcGVjOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiBuZXcgUHVyaSh0aGlzLmtuZXgsIHNwZWMpO1xuICB9XG5cbiAgYXN5bmMgdHJhbnNhY3Rpb248VD4oXG4gICAgY2FsbGJhY2s6ICh0cng6IFB1cmlUcmFuc2FjdGlvbldyYXBwZXIpID0+IFByb21pc2U8VD4sXG4gICAgb3B0aW9uczogVHJhbnNhY3Rpb25hbE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCB7IGlzb2xhdGlvbiwgcmVhZE9ubHksIGRiUHJlc2V0ID0gXCJ3XCIgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBAdHJhbnNhY3Rpb25hbCDrjbDsvZTroIjsnbTthLDsmYAg64+Z7J287ZWcIOuhnOyngTog7J2066+4IO2KuOuenOyereyFmCDsu6jthY3siqTtirjqsIAg7J6I64qU7KeAIO2ZleyduFxuICAgIGNvbnN0IHsgREIgfSA9IGF3YWl0IGltcG9ydChcIi4vZGJcIik7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZXh0ID0gREIudHJhbnNhY3Rpb25TdG9yYWdlLmdldFN0b3JlKCk7XG5cbiAgICAvLyBBc3luY0xvY2FsU3RvcmFnZSDsu6jthY3siqTtirjqsIAg7JeG6rGw64KYIO2VtOuLuSBwcmVzZXTsnZgg7Yq4656c7J6t7IWY7J20IOyXhuycvOuptCDsg4jroZwg7Iuc7J6RXG4gICAgY29uc3Qgc3RhcnRUcmFuc2FjdGlvbiA9IGFzeW5jIChcbiAgICAgIGtuZXg6IEtuZXggfCBLbmV4LlRyYW5zYWN0aW9uLFxuICAgICAgdXBzZXJ0QnVpbGRlcjogVXBzZXJ0QnVpbGRlclxuICAgICkgPT4ge1xuICAgICAgcmV0dXJuIGtuZXgudHJhbnNhY3Rpb24oXG4gICAgICAgIGFzeW5jICh0cngpID0+IHtcbiAgICAgICAgICBjb25zdCB0cnhXcmFwcGVyID0gbmV3IFB1cmlUcmFuc2FjdGlvbldyYXBwZXIodHJ4LCB1cHNlcnRCdWlsZGVyKTtcblxuICAgICAgICAgIC8vIFRyYW5zYWN0aW9uQ29udGV4dOyXkCDtirjrnpzsnq3shZgg7KCA7J6lXG4gICAgICAgICAgREIuZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCkuc2V0VHJhbnNhY3Rpb24oZGJQcmVzZXQsIHRyeFdyYXBwZXIpO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjayh0cnhXcmFwcGVyKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgLy8g7Yq4656c7J6t7IWYIOygnOqxsFxuICAgICAgICAgICAgREIuZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCkuZGVsZXRlVHJhbnNhY3Rpb24oZGJQcmVzZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgeyBpc29sYXRpb25MZXZlbDogaXNvbGF0aW9uLCByZWFkT25seSB9XG4gICAgICApO1xuICAgIH07XG5cbiAgICAvLyBBc3luY0xvY2FsU3RvcmFnZSDsu6jthY3siqTtirjqsIAg7JeG7Jy866m0IOyDiOuhnCDsg53shLFcbiAgICBpZiAoIWV4aXN0aW5nQ29udGV4dCkge1xuICAgICAgcmV0dXJuIERCLnJ1bldpdGhUcmFuc2FjdGlvbigoKSA9PlxuICAgICAgICBzdGFydFRyYW5zYWN0aW9uKHRoaXMua25leCwgdGhpcy51cHNlcnRCdWlsZGVyKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyDtlbTri7kgcHJlc2V07J2YIO2KuOuenOyereyFmOydtCDsnbTrr7gg7J6I7Jy866m0IFNBVkVQT0lOVOuhnCDspJHssqkg7Yq4656c7J6t7IWYIOyDneyEsVxuICAgIGNvbnN0IGV4aXN0aW5nVHJ4ID0gZXhpc3RpbmdDb250ZXh0LmdldFRyYW5zYWN0aW9uKGRiUHJlc2V0KTtcbiAgICBpZiAoZXhpc3RpbmdUcngpIHtcbiAgICAgIHJldHVybiBzdGFydFRyYW5zYWN0aW9uKGV4aXN0aW5nVHJ4LnRyeCwgZXhpc3RpbmdUcngudXBzZXJ0QnVpbGRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOy7qO2FjeyKpO2KuOuKlCDsnojsp4Drp4wg7J20IHByZXNldOydmCDtirjrnpzsnq3shZjsnYAg7JeG64qUIOqyveyasCAo6rCZ7J2AIOy7qO2FjeyKpO2KuCDrgrTsl5DshJwg7Iuk7ZaJKVxuICAgICAgcmV0dXJuIHN0YXJ0VHJhbnNhY3Rpb24odGhpcy5rbmV4LCB0aGlzLnVwc2VydEJ1aWxkZXIpO1xuICAgIH1cbiAgfVxuXG4gIHViUmVnaXN0ZXI8VFRhYmxlIGV4dGVuZHMgVGFibGVOYW1lPFRTY2hlbWE+PihcbiAgICB0YWJsZU5hbWU6IFRUYWJsZSxcbiAgICByb3c6IFBhcnRpYWw8e1xuICAgICAgW0sgaW4ga2V5b2YgVFNjaGVtYVtUVGFibGVdXTogVFNjaGVtYVtUVGFibGVdW0tdIHwgVUJSZWY7XG4gICAgfT5cbiAgKTogVUJSZWYge1xuICAgIHJldHVybiB0aGlzLnVwc2VydEJ1aWxkZXIucmVnaXN0ZXIodGFibGVOYW1lLCByb3cpO1xuICB9XG5cbiAgdWJVcHNlcnQoXG4gICAgdGFibGVOYW1lOiBUYWJsZU5hbWU8VFNjaGVtYT4sXG4gICAgY2h1bmtTaXplPzogbnVtYmVyXG4gICk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICByZXR1cm4gdGhpcy51cHNlcnRCdWlsZGVyLnVwc2VydCh0aGlzLmtuZXgsIHRhYmxlTmFtZSwgY2h1bmtTaXplKTtcbiAgfVxuXG4gIHViSW5zZXJ0T25seShcbiAgICB0YWJsZU5hbWU6IFRhYmxlTmFtZTxUU2NoZW1hPixcbiAgICBjaHVua1NpemU/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnVwc2VydEJ1aWxkZXIuaW5zZXJ0T25seSh0aGlzLmtuZXgsIHRhYmxlTmFtZSwgY2h1bmtTaXplKTtcbiAgfVxuXG4gIHViVXBzZXJ0T3JJbnNlcnQoXG4gICAgdGFibGVOYW1lOiBUYWJsZU5hbWU8VFNjaGVtYT4sXG4gICAgbW9kZTogXCJ1cHNlcnRcIiB8IFwiaW5zZXJ0XCIsXG4gICAgY2h1bmtTaXplPzogbnVtYmVyXG4gICk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICByZXR1cm4gdGhpcy51cHNlcnRCdWlsZGVyLnVwc2VydE9ySW5zZXJ0KFxuICAgICAgdGhpcy5rbmV4LFxuICAgICAgdGFibGVOYW1lLFxuICAgICAgbW9kZSxcbiAgICAgIGNodW5rU2l6ZVxuICAgICk7XG4gIH1cblxuICB1YlVwZGF0ZUJhdGNoKFxuICAgIHRhYmxlTmFtZTogVGFibGVOYW1lPFRTY2hlbWE+LFxuICAgIG9wdGlvbnM/OiB7IGNodW5rU2l6ZT86IG51bWJlcjsgd2hlcmU/OiBzdHJpbmcgfCBzdHJpbmdbXSB9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnVwc2VydEJ1aWxkZXIudXBkYXRlQmF0Y2godGhpcy5rbmV4LCB0YWJsZU5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLy8g7Yq4656c7J6t7IWYIOyXsOqysCDthYzsiqTtirjsmqlcbiAgYXN5bmMgZGVidWdUcmFuc2FjdGlvbigpIHtcbiAgICBjb25zdCBpbmZvID0gYXdhaXQgdGhpcy5nZXRUcmFuc2FjdGlvbkluZm8oKTtcbiAgICBjb25zb2xlLmxvZyhgJHtjaGFsay5jeWFuKFwiW1B1cmkgVHJhbnNhY3Rpb25dXCIpfSAke2NoYWxrLm1hZ2VudGEoaW5mbyl9YCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldFRyYW5zYWN0aW9uSW5mbygpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIC8vIOyXsOqysCBJRCDsobDtmoxcbiAgICBjb25zdCBbY29ubmVjdGlvbklkUm93c10gPSBhd2FpdCB0aGlzLmtuZXgucmF3KFxuICAgICAgYFNFTEVDVCBDT05ORUNUSU9OX0lEKCkgYXMgY29ubmVjdGlvbl9pZGBcbiAgICApO1xuICAgIGNvbnN0IGNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZFJvd3NbMF0uY29ubmVjdGlvbl9pZDtcblxuICAgIC8vIO2KuOuenOyereyFmCDsoJXrs7Qg7KGw7ZqMXG4gICAgY29uc3QgW3RyeFJvd3NdID0gYXdhaXQgdGhpcy5rbmV4LnJhdyhgXG4gICAgICAgIFNFTEVDVCBTVEFURSwgSVNPTEFUSU9OX0xFVkVMLCBUSFJFQURfSUQsIEVWRU5UX0lEXG4gICAgICAgIEZST00gcGVyZm9ybWFuY2Vfc2NoZW1hLmV2ZW50c190cmFuc2FjdGlvbnNfY3VycmVudFxuICAgICAgICBXSEVSRSBUSFJFQURfSUQgPSBcbiAgICAgICAgICAoU0VMRUNUIFRIUkVBRF9JRFxuICAgICAgICAgIEZST00gcGVyZm9ybWFuY2Vfc2NoZW1hLnRocmVhZHMgXG4gICAgICAgICAgV0hFUkUgUFJPQ0VTU0xJU1RfSUQgPSBDT05ORUNUSU9OX0lEKCkpXG4gICAgICBgKTtcblxuICAgIGlmICh0cnhSb3dzLmxlbmd0aCA+IDAgJiYgdHJ4Um93c1swXS5TVEFURSAhPT0gXCJDT01NSVRURURcIikge1xuICAgICAgY29uc3QgdHJ4ID0gdHJ4Um93c1swXTtcbiAgICAgIHJldHVybiBgSW4gVHJhbnNhY3Rpb24sIENvbm5JRDogJHtjb25uZWN0aW9uSWR9LCBUaHJlYWRJRDogJHt0cnguVEhSRUFEX0lEfSwgRXZlbnRJRDogJHt0cnguRVZFTlRfSUR9LCBJbm5vREIgVFJYOiAke3RyeC5TVEFURX0oJHt0cnguSVNPTEFUSU9OX0xFVkVMfSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYE5vdCBpbiBUcmFuc2FjdGlvbiwgQ29ubklEOiAke2Nvbm5lY3Rpb25JZH1gO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHVyaVRyYW5zYWN0aW9uV3JhcHBlciBleHRlbmRzIFB1cmlXcmFwcGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHRyeDogS25leC5UcmFuc2FjdGlvbixcbiAgICBwdWJsaWMgdXBzZXJ0QnVpbGRlcjogVXBzZXJ0QnVpbGRlclxuICApIHtcbiAgICBzdXBlcih0cngsIHVwc2VydEJ1aWxkZXIpO1xuICB9XG5cbiAgYXN5bmMgcm9sbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy50cngucm9sbGJhY2soKTtcbiAgfVxuXG4gIGFzeW5jIGNvbW1pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnRyeC5jb21taXQoKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIlB1cmkiLCJjaGFsayIsIlB1cmlXcmFwcGVyIiwia25leCIsInVwc2VydEJ1aWxkZXIiLCJyYXciLCJzcWwiLCJmcm9tIiwic3BlYyIsInRhYmxlIiwidHJhbnNhY3Rpb24iLCJjYWxsYmFjayIsIm9wdGlvbnMiLCJpc29sYXRpb24iLCJyZWFkT25seSIsImRiUHJlc2V0IiwiREIiLCJleGlzdGluZ0NvbnRleHQiLCJ0cmFuc2FjdGlvblN0b3JhZ2UiLCJnZXRTdG9yZSIsInN0YXJ0VHJhbnNhY3Rpb24iLCJ0cngiLCJ0cnhXcmFwcGVyIiwiUHVyaVRyYW5zYWN0aW9uV3JhcHBlciIsImdldFRyYW5zYWN0aW9uQ29udGV4dCIsInNldFRyYW5zYWN0aW9uIiwiZGVsZXRlVHJhbnNhY3Rpb24iLCJpc29sYXRpb25MZXZlbCIsInJ1bldpdGhUcmFuc2FjdGlvbiIsImV4aXN0aW5nVHJ4IiwiZ2V0VHJhbnNhY3Rpb24iLCJ1YlJlZ2lzdGVyIiwidGFibGVOYW1lIiwicm93IiwicmVnaXN0ZXIiLCJ1YlVwc2VydCIsImNodW5rU2l6ZSIsInVwc2VydCIsInViSW5zZXJ0T25seSIsImluc2VydE9ubHkiLCJ1YlVwc2VydE9ySW5zZXJ0IiwibW9kZSIsInVwc2VydE9ySW5zZXJ0IiwidWJVcGRhdGVCYXRjaCIsInVwZGF0ZUJhdGNoIiwiZGVidWdUcmFuc2FjdGlvbiIsImluZm8iLCJnZXRUcmFuc2FjdGlvbkluZm8iLCJjb25zb2xlIiwibG9nIiwiY3lhbiIsIm1hZ2VudGEiLCJjb25uZWN0aW9uSWRSb3dzIiwiY29ubmVjdGlvbklkIiwiY29ubmVjdGlvbl9pZCIsInRyeFJvd3MiLCJsZW5ndGgiLCJTVEFURSIsIlRIUkVBRF9JRCIsIkVWRU5UX0lEIiwiSVNPTEFUSU9OX0xFVkVMIiwicm9sbGJhY2siLCJjb21taXQiXSwibWFwcGluZ3MiOiJBQUNBLFNBQVNBLElBQUksUUFBUSxZQUFTO0FBRzlCLE9BQU9DLFdBQVcsUUFBUTtBQWMxQixPQUFPLE1BQU1DOzs7SUFHWCxZQUNFLEFBQU9DLElBQVUsRUFDakIsQUFBT0MsYUFBNEIsQ0FDbkM7YUFGT0QsT0FBQUE7YUFDQUMsZ0JBQUFBO0lBQ047SUFFSEMsSUFBSUMsR0FBVyxFQUFZO1FBQ3pCLE9BQU8sSUFBSSxDQUFDSCxJQUFJLENBQUNFLEdBQUcsQ0FBQ0M7SUFDdkI7SUEwQkFDLEtBQUtDLElBQVMsRUFBTztRQUNuQixPQUFPLElBQUlSLEtBQUssSUFBSSxDQUFDRyxJQUFJLEVBQUVLO0lBQzdCO0lBMEJBQyxNQUFNRCxJQUFTLEVBQU87UUFDcEIsT0FBTyxJQUFJUixL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
|