sonamu 0.5.7 → 0.7.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/.swcrc.project-default +18 -0
- package/bin/cli.js +24 -0
- package/dist/ai/agents/agent.d.ts +11 -0
- package/dist/ai/agents/agent.d.ts.map +1 -0
- package/dist/ai/agents/agent.js +65 -0
- package/dist/ai/agents/index.d.ts +3 -0
- package/dist/ai/agents/index.d.ts.map +1 -0
- package/dist/ai/agents/index.js +4 -0
- package/dist/ai/agents/types.d.ts +43 -0
- package/dist/ai/agents/types.d.ts.map +1 -0
- package/dist/ai/agents/types.js +3 -0
- package/dist/ai/index.d.ts +2 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +3 -0
- package/dist/ai/providers/rtzr/api.d.ts +22 -0
- package/dist/ai/providers/rtzr/api.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/api.js +28 -0
- package/dist/ai/providers/rtzr/error.d.ts +18 -0
- package/dist/ai/providers/rtzr/error.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/error.js +29 -0
- package/dist/ai/providers/rtzr/index.d.ts +5 -0
- package/dist/ai/providers/rtzr/index.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/index.js +6 -0
- package/dist/ai/providers/rtzr/model.d.ts +52 -0
- package/dist/ai/providers/rtzr/model.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/model.js +137 -0
- package/dist/ai/providers/rtzr/options.d.ts +7 -0
- package/dist/ai/providers/rtzr/options.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/options.js +47 -0
- package/dist/ai/providers/rtzr/provider.d.ts +18 -0
- package/dist/ai/providers/rtzr/provider.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/provider.js +54 -0
- package/dist/ai/providers/rtzr/utils.d.ts +19 -0
- package/dist/ai/providers/rtzr/utils.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/utils.js +88 -0
- package/dist/api/base-frame.d.ts +2 -2
- package/dist/api/base-frame.d.ts.map +1 -1
- package/dist/api/base-frame.js +13 -2
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +71 -2
- package/dist/api/code-converters.d.ts +58 -14
- package/dist/api/code-converters.d.ts.map +1 -1
- package/dist/api/code-converters.js +258 -2
- package/dist/api/config.d.ts +90 -0
- package/dist/api/config.d.ts.map +1 -0
- package/dist/api/config.js +25 -0
- package/dist/api/context.d.ts +4 -2
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +3 -2
- package/dist/api/decorators.d.ts +20 -6
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +235 -2
- package/dist/api/index.d.ts +2 -2
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +9 -2
- package/dist/api/sonamu.d.ts +10 -24
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +514 -2
- package/dist/api/validator.d.ts +6 -0
- package/dist/api/validator.d.ts.map +1 -0
- package/dist/api/validator.js +81 -0
- package/dist/bin/build-config.d.ts +6 -1
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +15 -2
- package/dist/bin/cli.js +519 -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/bin/loader-register.d.ts +2 -0
- package/dist/bin/loader-register.d.ts.map +1 -0
- package/dist/bin/loader-register.js +34 -0
- package/dist/database/_batch_update.d.ts +5 -3
- package/dist/database/_batch_update.d.ts.map +1 -1
- package/dist/database/_batch_update.js +95 -2
- package/dist/database/base-model.d.ts +96 -10
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +390 -2
- package/dist/database/base-model.types.d.ts +93 -0
- package/dist/database/base-model.types.d.ts.map +1 -0
- package/dist/database/base-model.types.js +10 -0
- package/dist/database/code-generator.d.ts +1 -1
- package/dist/database/code-generator.d.ts.map +1 -1
- package/dist/database/code-generator.js +54 -2
- package/dist/database/db.d.ts +6 -21
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +129 -2
- package/dist/database/puri-subset.test-d.js +81 -0
- package/dist/database/puri-subset.types.d.ts +123 -0
- package/dist/database/puri-subset.types.d.ts.map +1 -0
- package/dist/database/puri-subset.types.js +16 -0
- package/dist/database/puri-wrapper.d.ts +13 -11
- package/dist/database/puri-wrapper.d.ts.map +1 -1
- package/dist/database/puri-wrapper.js +109 -2
- package/dist/database/puri.d.ts +41 -23
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +601 -2
- package/dist/database/puri.types.d.ts +25 -6
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +6 -2
- package/dist/database/transaction-context.d.ts +1 -1
- package/dist/database/transaction-context.d.ts.map +1 -1
- package/dist/database/transaction-context.js +14 -2
- package/dist/database/upsert-builder.d.ts +9 -3
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +365 -2
- package/dist/entity/entity-manager.d.ts +167 -2
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +130 -2
- package/dist/entity/entity.d.ts +5 -3
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +750 -2
- package/dist/exceptions/error-handler.d.ts +1 -1
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +29 -2
- package/dist/exceptions/so-exceptions.d.ts +1 -1
- package/dist/exceptions/so-exceptions.d.ts.map +1 -1
- package/dist/exceptions/so-exceptions.js +85 -2
- package/dist/file-storage/driver.d.ts +1 -1
- package/dist/file-storage/driver.d.ts.map +1 -1
- package/dist/file-storage/driver.js +79 -2
- package/dist/file-storage/file-storage.js +75 -2
- package/dist/index.d.ts +18 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -2
- package/dist/migration/code-generation.d.ts +1 -1
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +614 -2
- package/dist/migration/migration-set.d.ts +2 -10
- package/dist/migration/migration-set.d.ts.map +1 -1
- package/dist/migration/migration-set.js +213 -2
- package/dist/migration/migrator.d.ts +24 -82
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +330 -2
- package/dist/migration/postgresql-schema-reader.d.ts +51 -0
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -0
- package/dist/migration/postgresql-schema-reader.js +245 -0
- package/dist/migration/types.d.ts +6 -38
- package/dist/migration/types.d.ts.map +1 -1
- package/dist/migration/types.js +3 -2
- package/dist/naite/messaging-types.d.ts +43 -0
- package/dist/naite/messaging-types.d.ts.map +1 -0
- package/dist/naite/messaging-types.js +7 -0
- package/dist/naite/naite-reporter.d.ts +41 -0
- package/dist/naite/naite-reporter.d.ts.map +1 -0
- package/dist/naite/naite-reporter.js +102 -0
- package/dist/naite/naite.d.ts +95 -0
- package/dist/naite/naite.d.ts.map +1 -0
- package/dist/naite/naite.js +316 -0
- package/dist/stream/index.js +3 -2
- package/dist/stream/sse.d.ts +2 -2
- package/dist/stream/sse.d.ts.map +1 -1
- package/dist/stream/sse.js +38 -2
- package/dist/syncer/api-parser.d.ts +10 -0
- package/dist/syncer/api-parser.d.ts.map +1 -0
- package/dist/syncer/api-parser.js +240 -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 +161 -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 +59 -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 +87 -0
- package/dist/syncer/syncer.d.ts +98 -106
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +422 -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 +108 -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 +86 -0
- package/dist/{templates → template/implementations}/generated.template.d.ts +3 -4
- package/dist/template/implementations/generated.template.d.ts.map +1 -0
- package/dist/template/implementations/generated.template.js +249 -0
- package/dist/{templates → template/implementations}/generated_http.template.d.ts +3 -4
- 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 +4 -5
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -0
- package/dist/template/implementations/generated_sso.template.js +134 -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 +181 -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 +201 -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 +475 -0
- package/dist/template/implementations/view_list_columns.template.d.ts +17 -0
- 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 +7 -0
- package/dist/template/index.d.ts.map +1 -0
- package/dist/template/index.js +8 -0
- package/dist/template/template-manager.d.ts +56 -0
- package/dist/template/template-manager.d.ts.map +1 -0
- package/dist/template/template-manager.js +125 -0
- package/dist/template/template-types.d.ts +16 -0
- package/dist/template/template-types.d.ts.map +1 -0
- package/dist/template/template-types.js +7 -0
- package/dist/template/template.d.ts +49 -0
- package/dist/template/template.d.ts.map +1 -0
- package/dist/template/template.js +60 -0
- package/dist/template/zod-converter.d.ts +51 -0
- package/dist/template/zod-converter.d.ts.map +1 -0
- package/dist/template/zod-converter.js +449 -0
- package/dist/testing/_relation-graph.d.ts +1 -1
- package/dist/testing/_relation-graph.d.ts.map +1 -1
- package/dist/testing/_relation-graph.js +89 -2
- package/dist/testing/fixture-manager.d.ts +42 -11
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +623 -2
- package/dist/types/types.d.ts +747 -143
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +546 -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.d.ts +1 -0
- package/dist/utils/controller.d.ts.map +1 -1
- package/dist/utils/controller.js +29 -2
- package/dist/utils/esm-utils.d.ts +39 -0
- package/dist/utils/esm-utils.d.ts.map +1 -0
- package/dist/utils/esm-utils.js +49 -0
- package/dist/utils/formatter.d.ts +3 -0
- package/dist/utils/formatter.d.ts.map +1 -0
- package/dist/utils/formatter.js +110 -0
- package/dist/utils/fs-utils.d.ts +1 -1
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +17 -2
- package/dist/utils/lodash-able.d.ts.map +1 -1
- package/dist/utils/lodash-able.js +6 -2
- package/dist/utils/model.js +22 -2
- package/dist/utils/object-utils.d.ts +44 -0
- package/dist/utils/object-utils.d.ts.map +1 -0
- package/dist/utils/object-utils.js +191 -0
- 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.d.ts +5 -1
- package/dist/utils/sql-parser.d.ts.map +1 -1
- package/dist/utils/sql-parser.js +46 -2
- package/dist/utils/type-utils.d.ts +23 -0
- package/dist/utils/type-utils.d.ts.map +1 -0
- package/dist/utils/type-utils.js +45 -0
- package/dist/utils/utils.d.ts +10 -7
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +72 -2
- package/dist/utils/zod-error.d.ts +1 -1
- package/dist/utils/zod-error.d.ts.map +1 -1
- package/dist/utils/zod-error.js +19 -2
- package/package.json +65 -27
- package/src/ai/agents/agent.ts +87 -0
- package/src/ai/agents/index.ts +2 -0
- package/src/ai/agents/types.ts +47 -0
- package/src/ai/index.ts +1 -0
- package/src/ai/providers/rtzr/api.ts +37 -0
- package/src/ai/providers/rtzr/error.ts +34 -0
- package/src/ai/providers/rtzr/index.ts +4 -0
- package/src/ai/providers/rtzr/model.ts +201 -0
- package/src/ai/providers/rtzr/options.ts +49 -0
- package/src/ai/providers/rtzr/provider.ts +91 -0
- package/src/ai/providers/rtzr/utils.ts +127 -0
- package/src/api/base-frame.ts +4 -2
- package/src/api/caster.ts +17 -23
- package/src/api/code-converters.ts +178 -535
- package/src/api/config.ts +125 -0
- package/src/api/context.ts +7 -17
- package/src/api/decorators.ts +176 -46
- package/src/api/index.ts +2 -2
- package/src/api/sonamu.ts +190 -167
- package/src/api/validator.ts +83 -0
- package/src/bin/build-config.ts +8 -1
- package/src/bin/cli.ts +258 -124
- package/src/bin/hot-hook-register.ts +22 -0
- package/src/bin/loader-register.ts +38 -0
- package/src/database/_batch_update.ts +46 -31
- package/src/database/base-model.ts +390 -182
- package/src/database/base-model.types.ts +155 -0
- package/src/database/code-generator.ts +13 -32
- package/src/database/db.ts +40 -96
- package/src/database/puri-subset.test-d.ts +471 -0
- package/src/database/puri-subset.types.ts +195 -0
- package/src/database/puri-wrapper.ts +58 -67
- package/src/database/puri.ts +229 -148
- package/src/database/puri.types.ts +76 -30
- package/src/database/transaction-context.ts +1 -1
- package/src/database/upsert-builder.ts +262 -132
- package/src/entity/entity-manager.ts +48 -36
- package/src/entity/entity.ts +330 -248
- package/src/exceptions/error-handler.ts +3 -3
- package/src/exceptions/so-exceptions.ts +11 -11
- package/src/file-storage/driver.ts +5 -5
- package/src/file-storage/file-storage.ts +2 -2
- package/src/index.ts +18 -10
- package/src/migration/code-generation.ts +185 -172
- package/src/migration/migration-set.ts +80 -293
- package/src/migration/migrator.ts +199 -571
- package/src/migration/mysql-schema-reader.ts.txt +272 -0
- package/src/migration/postgresql-schema-reader.ts +310 -0
- package/src/migration/types.ts +6 -39
- package/src/naite/messaging-types.ts +51 -0
- package/src/naite/naite-reporter.ts +128 -0
- package/src/naite/naite.ts +415 -0
- package/src/shared/web.shared.ts.txt +20 -24
- package/src/stream/sse.ts +5 -5
- package/src/syncer/api-parser.ts +282 -0
- package/src/syncer/checksum.ts +140 -0
- package/src/syncer/code-generator.ts +198 -0
- package/src/syncer/entity-operations.ts +65 -0
- package/src/syncer/file-patterns.ts +56 -0
- package/src/syncer/index.ts +6 -0
- package/src/syncer/module-loader.ts +128 -0
- package/src/syncer/syncer.ts +389 -1453
- package/src/template/entity-converter.ts +114 -0
- package/src/template/helpers.ts +81 -0
- package/src/{templates → template/implementations}/entity.template.ts +7 -7
- package/src/{templates → template/implementations}/generated.template.ts +101 -101
- package/src/{templates → template/implementations}/generated_http.template.ts +27 -57
- package/src/template/implementations/generated_sso.template.ts +151 -0
- package/src/{templates → template/implementations}/init_types.template.ts +5 -7
- package/src/{templates → template/implementations}/model.template.ts +52 -43
- package/src/{templates → template/implementations}/model_test.template.ts +5 -5
- package/src/{templates → template/implementations}/service.template.ts +66 -82
- package/src/{templates → template/implementations}/view_enums_buttonset.template.ts +3 -3
- package/src/{templates → template/implementations}/view_enums_dropdown.template.ts +4 -20
- package/src/{templates → template/implementations}/view_enums_select.template.ts +4 -4
- package/src/{templates → template/implementations}/view_form.template.ts +40 -83
- package/src/{templates → template/implementations}/view_id_all_select.template.ts +3 -3
- package/src/{templates → template/implementations}/view_id_async_select.template.ts +10 -24
- package/src/{templates → template/implementations}/view_list.template.ts +60 -152
- package/src/{templates → template/implementations}/view_list_columns.template.ts +5 -11
- package/src/{templates → template/implementations}/view_search_input.template.ts +3 -3
- package/src/template/index.ts +6 -0
- package/src/template/template-manager.ts +166 -0
- package/src/template/template-types.ts +16 -0
- package/src/template/template.ts +105 -0
- package/src/template/zod-converter.ts +525 -0
- package/src/testing/_relation-graph.ts +18 -11
- package/src/testing/fixture-manager.ts +472 -359
- package/src/types/types.ts +553 -308
- package/src/typings/knex.d.ts +7 -9
- package/src/utils/async-utils.ts +23 -10
- package/src/utils/console-util.ts +4 -0
- package/src/utils/controller.ts +3 -0
- package/src/utils/esm-utils.ts +59 -0
- package/src/utils/formatter.ts +109 -0
- package/src/utils/fs-utils.ts +1 -1
- package/src/utils/lodash-able.ts +1 -4
- package/src/utils/object-utils.ts +217 -0
- package/src/utils/path-utils.ts +99 -0
- package/src/utils/process-utils.ts +46 -0
- package/src/utils/sql-parser.ts +23 -5
- package/src/utils/type-utils.ts +83 -0
- package/src/utils/utils.ts +66 -43
- package/src/utils/zod-error.ts +3 -4
- 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.d.ts +0 -3
- package/dist/bin/cli-wrapper.d.ts.map +0 -1
- package/dist/bin/cli-wrapper.js +0 -3
- 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.d.ts +0 -2
- package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +0 -1
- package/dist/database/knex-plugins/knex-on-duplicate-update.js +0 -2
- 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.d.ts +0 -61
- package/dist/entity/entity-utils.d.ts.map +0 -1
- package/dist/entity/entity-utils.js +0 -2
- 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 +0 -17
- 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/bin/cli-wrapper.ts +0 -75
- package/src/database/knex-plugins/knex-on-duplicate-update.ts +0 -45
- package/src/entity/entity-utils.ts +0 -291
- package/src/templates/base-template.ts +0 -19
- package/src/templates/generated_sso.template.ts +0 -138
- package/src/templates/index.ts +0 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BaseModel 타입 시스템
|
|
3
|
+
*
|
|
4
|
+
* BaseModelClass에서 사용하는 타입 유틸리티들.
|
|
5
|
+
* Enhancer, SubsetQuery 교집합 등 Model 계층에서 필요한 타입 정의.
|
|
6
|
+
*/ /**
|
|
7
|
+
* executeSubsetQuery 반환 타입
|
|
8
|
+
*/ export { };
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9iYXNlLW1vZGVsLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmFzZU1vZGVsIO2DgOyehSDsi5zsiqTthZxcbiAqXG4gKiBCYXNlTW9kZWxDbGFzc+yXkOyEnCDsgqzsmqntlZjripQg7YOA7J6FIOycoO2LuOumrO2LsOuTpC5cbiAqIEVuaGFuY2VyLCBTdWJzZXRRdWVyeSDqtZDsp5Htlakg65OxIE1vZGVsIOqzhOy4teyXkOyEnCDtlYTsmpTtlZwg7YOA7J6FIOygleydmC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlU2NoZW1hRXh0ZW5kIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmkgfSBmcm9tIFwiLi9wdXJpXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmlTdWJzZXRGbiB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFB1cmkg7YWM7J2067iUIOy2lOy2nCDsnKDti7jrpqzti7Bcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQdXJpIOyduOyKpO2EtOyKpOyXkOyEnCBUVGFibGVzIO2DgOyehSDstpTstpxcbiAqL1xuZXhwb3J0IHR5cGUgRXh0cmFjdFB1cmlUYWJsZXM8VD4gPSBUIGV4dGVuZHMgUHVyaTxhbnksIGluZmVyIFRUYWJsZXMsIGFueT4gPyBUVGFibGVzIDogbmV2ZXI7XG5cbi8qKlxuICogU3Vic2V0UXVlcmllc+yXkOyEnCDrqqjrk6AgVFRhYmxlc+ydmCDsnKDri4jsmKgg7LaU7LacXG4gKiBnZXRTdWJzZXRRdWVyaWVz7J2YIHFiIO2DgOyehSDsoJXsnZjsl5Ag7IKs7JqpXG4gKi9cbmV4cG9ydCB0eXBlIFVuaW9uRXh0cmFjdGVkVFRhYmxlczxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgVFN1YnNldFF1ZXJpZXMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgUHVyaVN1YnNldEZuPixcbj4gPSBFeHRyYWN0UHVyaVRhYmxlczxSZXR1cm5UeXBlPFRTdWJzZXRRdWVyaWVzW1RTdWJzZXRLZXldPj47XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFN1YnNldCDqtZDsp5Htlakg6rOE7IKwIChvblN1YnNldCDrqZTshJzrk5zsmqkpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICog65GQIFB1cmnsnZgg7YWM7J2067iUIOq1kOynke2VqeydhCDqsIDsp4Qg7IOI66Gc7Jq0IFB1cmkg7IOd7ISxXG4gKi9cbnR5cGUgTWVyZ2VQdXJpVGFibGVzPEEsIEIsIFRBID0gRXh0cmFjdFB1cmlUYWJsZXM8QT4sIFRCID0gRXh0cmFjdFB1cmlUYWJsZXM8Qj4+ID0gUHVyaTxcbiAgRGF0YWJhc2VTY2hlbWFFeHRlbmQsXG4gIFBpY2s8VEEsIEV4dHJhY3Q8a2V5b2YgVEEsIGtleW9mIFRCPj4sXG4gIGFueVxuPjtcblxuLyoqXG4gKiDshJzruIzshYsg7YKkIOuwsOyXtOydhCDsiJztmoztlZjrqbAg7YWM7J2067iUIOq1kOynke2VqSBQdXJpIOqzhOyCsFxuICpcbiAqIG9uU3Vic2V0KFsnQScsICdQJ10p7JmAIOqwmeydtCDsl6zrn6wgc3Vic2V07J2EIOyngOygle2WiOydhCDrlYwsXG4gKiDqs7XthrXsnLzroZwg7IKs7JqpIOqwgOuKpe2VnCDthYzsnbTruJTrp4wg7Y+s7ZWo65CcIFB1cmkg7YOA7J6FIOuwmO2ZmFxuICovXG5leHBvcnQgdHlwZSBSZXNvbHZlU3Vic2V0SW50ZXJzZWN0aW9uPFxuICBLZXlzIGV4dGVuZHMgcmVhZG9ubHkgc3RyaW5nW10sXG4gIFF1ZXJpZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCAoLi4uYXJnczogYW55KSA9PiBhbnk+LFxuPiA9IEtleXMgZXh0ZW5kcyBbaW5mZXIgSGVhZCBleHRlbmRzIHN0cmluZywgLi4uaW5mZXIgVGFpbCBleHRlbmRzIHN0cmluZ1tdXVxuICA/IFRhaWwgZXh0ZW5kcyBbXVxuICAgID8gUmV0dXJuVHlwZTxRdWVyaWVzW0hlYWRdPlxuICAgIDogTWVyZ2VQdXJpVGFibGVzPFJldHVyblR5cGU8UXVlcmllc1tIZWFkXT4sIFJlc29sdmVTdWJzZXRJbnRlcnNlY3Rpb248VGFpbCwgUXVlcmllcz4+XG4gIDogbmV2ZXI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVuaGFuY2VyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICog64uo7J28IEVuaGFuY2VyIO2VqOyImCDtg4DsnoVcbiAqIGNvbXB1dGVkIOqysOqzvOulvCDrsJvslYQg7LWc7KKFIG1hcHBpbmcg7YOA7J6F7Jy866GcIOuzgO2ZmFxuICovXG5leHBvcnQgdHlwZSBFbmhhbmNlckZuPFRDb21wdXRlZCwgVE1hcHBpbmc+ID0gKHJvdzogVENvbXB1dGVkKSA9PiBUTWFwcGluZyB8IFByb21pc2U8VE1hcHBpbmc+O1xuXG4vKipcbiAqIEVuaGFuY2Vy6rCAIO2VhOyImOyduCBTdWJzZXRLZXkg7LaU7LacXG4gKlxuICogQ29tcHV0ZWRSZXN1bHRzW0td6rCAIFN1YnNldE1hcHBpbmdbS13sl5Ag7ZWg64u5IOu2iOqwgOuKpe2VmOuptCDtlbTri7kgS+uKlCDtlYTsiJhcbiAqICjspoksIHZpcnR1YWwg7ZWE65OcIOuTsSDstpTqsIAg67OA7ZmY7J20IO2VhOyalO2VnCDqsr3smrApXG4gKi9cbmV4cG9ydCB0eXBlIFJlcXVpcmVkRW5oYW5jZXJLZXlzPFxuICBUU3Vic2V0S2V5IGV4dGVuZHMgc3RyaW5nLFxuICBUQ29tcHV0ZWRSZXN1bHRzIGV4dGVuZHMgUmVjb3JkPFRTdWJzZXRLZXksIGFueT4sXG4gIFRTdWJzZXRNYXBwaW5nIGV4dGVuZHMgUmVjb3JkPFRTdWJzZXRLZXksIGFueT4sXG4+ID0ge1xuICBbSyBpbiBUU3Vic2V0S2V5XTogVENvbXB1dGVkUmVzdWx0c1tLXSBleHRlbmRzIFRTdWJzZXRNYXBwaW5nW0tdID8gbmV2ZXIgOiBLO1xufVtUU3Vic2V0S2V5XTtcblxuLyoqXG4gKiBFbmhhbmNlciDqsJ3ssrQg7YOA7J6FIOygleydmFxuICpcbiAqIC0gQ29tcHV0ZWRSZXN1bHRzW0td6rCAIFN1YnNldE1hcHBpbmdbS13sl5AgYXNzaWduYWJsZe2VmOuptCDihpIgZW5oYW5jZXIg7ISg7YOd7KCBXG4gKiAtIOq3uOugh+yngCDslYrsnLzrqbQg4oaSIGVuaGFuY2VyIO2VhOyImFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyB2aXJ0dWFsIO2VhOuTnCBlbXBsb3llZV9jb3VudOqwgCDsnojripQg6rK97JqwXG4gKiB0eXBlIENvbXB1dGVkID0geyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfVxuICogdHlwZSBNYXBwaW5nID0geyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGVtcGxveWVlX2NvdW50OiBudW1iZXIgfVxuICogLy8g4oaSIEVuaGFuY2VyIO2VhOyImCAoZW1wbG95ZWVfY291bnQg6rOE7IKwIO2VhOyalClcbiAqL1xuZXhwb3J0IHR5cGUgRW5oYW5jZXJNYXA8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55Pixcbj4gPSB7XG4gIC8vIENvbXB1dGVk6rCAIE1hcHBpbmfsl5Ag7Zi47ZmY65CY66m0IOyEoO2DneyggVxuICBbSyBpbiBUU3Vic2V0S2V5IGFzIFRDb21wdXRlZFJlc3VsdHNbS10gZXh0ZW5kcyBUU3Vic2V0TWFwcGluZ1tLXSA/IEsgOiBuZXZlcl0/OiBFbmhhbmNlckZuPFxuICAgIFRDb21wdXRlZFJlc3VsdHNbS10sXG4gICAgVFN1YnNldE1hcHBpbmdbS11cbiAgPjtcbn0gJiB7XG4gIC8vIO2YuO2ZmOuQmOyngCDslYrsnLzrqbQg7ZWE7IiYXG4gIFtLIGluIFRTdWJzZXRLZXkgYXMgVENvbXB1dGVkUmVzdWx0c1tLXSBleHRlbmRzIFRTdWJzZXRNYXBwaW5nW0tdID8gbmV2ZXIgOiBLXTogRW5oYW5jZXJGbjxcbiAgICBUQ29tcHV0ZWRSZXN1bHRzW0tdLFxuICAgIFRTdWJzZXRNYXBwaW5nW0tdXG4gID47XG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBleGVjdXRlU3Vic2V0UXVlcnlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBleGVjdXRlU3Vic2V0UXVlcnkg6riw67O4IO2MjOudvOuvuO2EsFxuICovXG5leHBvcnQgdHlwZSBFeGVjdXRlU3Vic2V0UXVlcnlCYXNlUGFyYW1zPFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuICBzdWJzZXQ6IFRTdWJzZXRLZXk7XG4gIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+O1xuICBwYXJhbXM6IHtcbiAgICBudW0/OiBudW1iZXI7XG4gICAgcGFnZT86IG51bWJlcjtcbiAgICBxdWVyeU1vZGU/OiBcImxpc3RcIiB8IFwiY291bnRcIiB8IFwiYm90aFwiO1xuICB9O1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIG9wdGltaXplQ291bnRRdWVyeT86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIGV4ZWN1dGVTdWJzZXRRdWVyeSDtjIzrnbzrr7jthLAgKEVuaGFuY2VyIO2PrO2VqClcbiAqXG4gKiBSZXF1aXJlZEVuaGFuY2VyS2V5c+qwgCDsl4bsnLzrqbQgZW5oYW5jZXJzIOyEoO2DneyggSwg7J6I7Jy866m0IO2VhOyImFxuICovXG5leHBvcnQgdHlwZSBFeGVjdXRlU3Vic2V0UXVlcnlQYXJhbXM8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVCBleHRlbmRzIFRTdWJzZXRLZXksXG4+ID0gRXhlY3V0ZVN1YnNldFF1ZXJ5QmFzZVBhcmFtczxUPiAmXG4gIChbUmVxdWlyZWRFbmhhbmNlcktleXM8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+XSBleHRlbmRzIFtuZXZlcl1cbiAgICA/IHsgZW5oYW5jZXJzPzogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH1cbiAgICA6IHsgZW5oYW5jZXJzOiBFbmhhbmNlck1hcDxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZz4gfSk7XG5cbi8qKlxuICogZXhlY3V0ZVN1YnNldFF1ZXJ5IOuwmO2ZmCDtg4DsnoVcbiAqL1xuZXhwb3J0IHR5cGUgRXhlY3V0ZVN1YnNldFF1ZXJ5UmVzdWx0PFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIFQgZXh0ZW5kcyBzdHJpbmcsXG4+ID0ge1xuICByb3dzOiBUU3Vic2V0TWFwcGluZ1tUXVtdO1xuICB0b3RhbDogbnVtYmVyO1xufTtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Q0FLQyxHQTRJRDs7Q0FFQyxHQUNELFdBTUUifQ==
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MigrationColumn, MigrationIndex } from "../types/types";
|
|
1
|
+
import type { MigrationColumn, MigrationIndex } from "../types/types";
|
|
2
2
|
export declare class CodeGenerator {
|
|
3
3
|
getAlterColumnsTo(entityColumns: MigrationColumn[], dbColumns: MigrationColumn[]): {
|
|
4
4
|
add: MigrationColumn[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../src/database/code-generator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../src/database/code-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGtE,qBAAa,aAAa;IACxB,iBAAiB,CAAC,aAAa,EAAE,eAAe,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE;aAEjE,eAAe,EAAE;cAChB,eAAe,EAAE;eAChB,eAAe,EAAE;;IAuBlC,iBAAiB,CAAC,aAAa,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE;aAG/D,cAAc,EAAE;cACf,cAAc,EAAE;;CAejC"}
|
|
@@ -1,2 +1,54 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import equal from "fast-deep-equal";
|
|
2
|
+
import { diff } from "radashi";
|
|
3
|
+
import { differenceWith, intersectionBy } from "../utils/utils.js";
|
|
4
|
+
export class CodeGenerator {
|
|
5
|
+
getAlterColumnsTo(entityColumns, dbColumns) {
|
|
6
|
+
const columnsTo = {
|
|
7
|
+
add: [],
|
|
8
|
+
drop: [],
|
|
9
|
+
alter: []
|
|
10
|
+
};
|
|
11
|
+
// 컬럼명 기준 비교
|
|
12
|
+
const extraColumns = {
|
|
13
|
+
db: diff(dbColumns, entityColumns, (col)=>col.name),
|
|
14
|
+
entity: diff(entityColumns, dbColumns, (col)=>col.name)
|
|
15
|
+
};
|
|
16
|
+
if (extraColumns.entity.length > 0) {
|
|
17
|
+
columnsTo.add = columnsTo.add.concat(extraColumns.entity);
|
|
18
|
+
}
|
|
19
|
+
if (extraColumns.db.length > 0) {
|
|
20
|
+
columnsTo.drop = columnsTo.drop.concat(extraColumns.db);
|
|
21
|
+
}
|
|
22
|
+
// 동일 컬럼명의 세부 필드 비교
|
|
23
|
+
const sameDbColumns = intersectionBy(dbColumns, entityColumns, (col)=>col.name);
|
|
24
|
+
const sameMdColumns = intersectionBy(entityColumns, dbColumns, (col)=>col.name);
|
|
25
|
+
columnsTo.alter = differenceWith(sameDbColumns, sameMdColumns, (a, b)=>equal(a, b));
|
|
26
|
+
return columnsTo;
|
|
27
|
+
}
|
|
28
|
+
getAlterIndexesTo(entityIndexes, dbIndexes) {
|
|
29
|
+
// 인덱스 비교
|
|
30
|
+
const indexesTo = {
|
|
31
|
+
add: [],
|
|
32
|
+
drop: []
|
|
33
|
+
};
|
|
34
|
+
const extraIndexes = {
|
|
35
|
+
db: diff(dbIndexes, entityIndexes, (col)=>[
|
|
36
|
+
col.type,
|
|
37
|
+
col.columns.join("-")
|
|
38
|
+
].join("//")),
|
|
39
|
+
entity: diff(entityIndexes, dbIndexes, (col)=>[
|
|
40
|
+
col.type,
|
|
41
|
+
col.columns.join("-")
|
|
42
|
+
].join("//"))
|
|
43
|
+
};
|
|
44
|
+
if (extraIndexes.entity.length > 0) {
|
|
45
|
+
indexesTo.add = indexesTo.add.concat(extraIndexes.entity);
|
|
46
|
+
}
|
|
47
|
+
if (extraIndexes.db.length > 0) {
|
|
48
|
+
indexesTo.drop = indexesTo.drop.concat(extraIndexes.db);
|
|
49
|
+
}
|
|
50
|
+
return indexesTo;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9jb2RlLWdlbmVyYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZXF1YWwgZnJvbSBcImZhc3QtZGVlcC1lcXVhbFwiO1xuaW1wb3J0IHsgZGlmZiB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgdHlwZSB7IE1pZ3JhdGlvbkNvbHVtbiwgTWlncmF0aW9uSW5kZXggfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VXaXRoLCBpbnRlcnNlY3Rpb25CeSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgQ29kZUdlbmVyYXRvciB7XG4gIGdldEFsdGVyQ29sdW1uc1RvKGVudGl0eUNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLCBkYkNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdKSB7XG4gICAgY29uc3QgY29sdW1uc1RvID0ge1xuICAgICAgYWRkOiBbXSBhcyBNaWdyYXRpb25Db2x1bW5bXSxcbiAgICAgIGRyb3A6IFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICAgICAgYWx0ZXI6IFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICAgIH07XG5cbiAgICAvLyDsu6zrn7zrqoUg6riw7KSAIOu5hOq1kFxuICAgIGNvbnN0IGV4dHJhQ29sdW1ucyA9IHtcbiAgICAgIGRiOiBkaWZmKGRiQ29sdW1ucywgZW50aXR5Q29sdW1ucywgKGNvbCkgPT4gY29sLm5hbWUpLFxuICAgICAgZW50aXR5OiBkaWZmKGVudGl0eUNvbHVtbnMsIGRiQ29sdW1ucywgKGNvbCkgPT4gY29sLm5hbWUpLFxuICAgIH07XG4gICAgaWYgKGV4dHJhQ29sdW1ucy5lbnRpdHkubGVuZ3RoID4gMCkge1xuICAgICAgY29sdW1uc1RvLmFkZCA9IGNvbHVtbnNUby5hZGQuY29uY2F0KGV4dHJhQ29sdW1ucy5lbnRpdHkpO1xuICAgIH1cbiAgICBpZiAoZXh0cmFDb2x1bW5zLmRiLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbHVtbnNUby5kcm9wID0gY29sdW1uc1RvLmRyb3AuY29uY2F0KGV4dHJhQ29sdW1ucy5kYik7XG4gICAgfVxuXG4gICAgLy8g64+Z7J28IOy7rOufvOuqheydmCDshLjrtoAg7ZWE65OcIOu5hOq1kFxuICAgIGNvbnN0IHNhbWVEYkNvbHVtbnMgPSBpbnRlcnNlY3Rpb25CeShkYkNvbHVtbnMsIGVudGl0eUNvbHVtbnMsIChjb2wpID0+IGNvbC5uYW1lKTtcbiAgICBjb25zdCBzYW1lTWRDb2x1bW5zID0gaW50ZXJzZWN0aW9uQnkoZW50aXR5Q29sdW1ucywgZGJDb2x1bW5zLCAoY29sKSA9PiBjb2wubmFtZSk7XG4gICAgY29sdW1uc1RvLmFsdGVyID0gZGlmZmVyZW5jZVdpdGgoc2FtZURiQ29sdW1ucywgc2FtZU1kQ29sdW1ucywgKGEsIGIpID0+IGVxdWFsKGEsIGIpKTtcblxuICAgIHJldHVybiBjb2x1bW5zVG87XG4gIH1cblxuICBnZXRBbHRlckluZGV4ZXNUbyhlbnRpdHlJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLCBkYkluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10pIHtcbiAgICAvLyDsnbjrjbHsiqQg67mE6rWQXG4gICAgY29uc3QgaW5kZXhlc1RvID0ge1xuICAgICAgYWRkOiBbXSBhcyBNaWdyYXRpb25JbmRleFtdLFxuICAgICAgZHJvcDogW10gYXMgTWlncmF0aW9uSW5kZXhbXSxcbiAgICB9O1xuICAgIGNvbnN0IGV4dHJhSW5kZXhlcyA9IHtcbiAgICAgIGRiOiBkaWZmKGRiSW5kZXhlcywgZW50aXR5SW5kZXhlcywgKGNvbCkgPT4gW2NvbC50eXBlLCBjb2wuY29sdW1ucy5qb2luKFwiLVwiKV0uam9pbihcIi8vXCIpKSxcbiAgICAgIGVudGl0eTogZGlmZihlbnRpdHlJbmRleGVzLCBkYkluZGV4ZXMsIChjb2wpID0+IFtjb2wudHlwZSwgY29sLmNvbHVtbnMuam9pbihcIi1cIildLmpvaW4oXCIvL1wiKSksXG4gICAgfTtcbiAgICBpZiAoZXh0cmFJbmRleGVzLmVudGl0eS5sZW5ndGggPiAwKSB7XG4gICAgICBpbmRleGVzVG8uYWRkID0gaW5kZXhlc1RvLmFkZC5jb25jYXQoZXh0cmFJbmRleGVzLmVudGl0eSk7XG4gICAgfVxuICAgIGlmIChleHRyYUluZGV4ZXMuZGIubGVuZ3RoID4gMCkge1xuICAgICAgaW5kZXhlc1RvLmRyb3AgPSBpbmRleGVzVG8uZHJvcC5jb25jYXQoZXh0cmFJbmRleGVzLmRiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZXhlc1RvO1xuICB9XG59XG4iXSwibmFtZXMiOlsiZXF1YWwiLCJkaWZmIiwiZGlmZmVyZW5jZVdpdGgiLCJpbnRlcnNlY3Rpb25CeSIsIkNvZGVHZW5lcmF0b3IiLCJnZXRBbHRlckNvbHVtbnNUbyIsImVudGl0eUNvbHVtbnMiLCJkYkNvbHVtbnMiLCJjb2x1bW5zVG8iLCJhZGQiLCJkcm9wIiwiYWx0ZXIiLCJleHRyYUNvbHVtbnMiLCJkYiIsImNvbCIsIm5hbWUiLCJlbnRpdHkiLCJsZW5ndGgiLCJjb25jYXQiLCJzYW1lRGJDb2x1bW5zIiwic2FtZU1kQ29sdW1ucyIsImEiLCJiIiwiZ2V0QWx0ZXJJbmRleGVzVG8iLCJlbnRpdHlJbmRleGVzIiwiZGJJbmRleGVzIiwiaW5kZXhlc1RvIiwiZXh0cmFJbmRleGVzIiwidHlwZSIsImNvbHVtbnMiLCJqb2luIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFXLGtCQUFrQjtBQUNwQyxTQUFTQyxJQUFJLFFBQVEsVUFBVTtBQUUvQixTQUFTQyxjQUFjLEVBQUVDLGNBQWMsUUFBUSxvQkFBaUI7QUFFaEUsT0FBTyxNQUFNQztJQUNYQyxrQkFBa0JDLGFBQWdDLEVBQUVDLFNBQTRCLEVBQUU7UUFDaEYsTUFBTUMsWUFBWTtZQUNoQkMsS0FBSyxFQUFFO1lBQ1BDLE1BQU0sRUFBRTtZQUNSQyxPQUFPLEVBQUU7UUFDWDtRQUVBLFlBQVk7UUFDWixNQUFNQyxlQUFlO1lBQ25CQyxJQUFJWixLQUFLTSxXQUFXRCxlQUFlLENBQUNRLE1BQVFBLElBQUlDLElBQUk7WUFDcERDLFFBQVFmLEtBQUtLLGVBQWVDLFdBQVcsQ0FBQ08sTUFBUUEsSUFBSUMsSUFBSTtRQUMxRDtRQUNBLElBQUlILGFBQWFJLE1BQU0sQ0FBQ0MsTUFBTSxHQUFHLEdBQUc7WUFDbENULFVBQVVDLEdBQUcsR0FBR0QsVUFBVUMsR0FBRyxDQUFDUyxNQUFNLENBQUNOLGFBQWFJLE1BQU07UUFDMUQ7UUFDQSxJQUFJSixhQUFhQyxFQUFFLENBQUNJLE1BQU0sR0FBRyxHQUFHO1lBQzlCVCxVQUFVRSxJQUFJLEdBQUdGLFVBQVVFLElBQUksQ0FBQ1EsTUFBTSxDQUFDTixhQUFhQyxFQUFFO1FBQ3hEO1FBRUEsbUJBQW1CO1FBQ25CLE1BQU1NLGdCQUFnQmhCLGVBQWVJLFdBQVdELGVBQWUsQ0FBQ1EsTUFBUUEsSUFBSUMsSUFBSTtRQUNoRixNQUFNSyxnQkFBZ0JqQixlQUFlRyxlQUFlQyxXQUFXLENBQUNPLE1BQVFBLElBQUlDLElBQUk7UUFDaEZQLFVBQVVHLEtBQUssR0FBR1QsZUFBZWlCLGVBQWVDLGVBQWUsQ0FBQ0MsR0FBR0MsSUFBTXRCLE1BQU1xQixHQUFHQztRQUVsRixPQUFPZDtJQUNUO0lBRUFlLGtCQUFrQkMsYUFBK0IsRUFBRUMsU0FBMkIsRUFBRTtRQUM5RSxTQUFTO1FBQ1QsTUFBTUMsWUFBWTtZQUNoQmpCLEtBQUssRUFBRTtZQUNQQyxNQUFNLEVBQUU7UUFDVjtRQUNBLE1BQU1pQixlQUFlO1lBQ25CZCxJQUFJWixLQUFLd0IsV0FBV0QsZUFBZSxDQUFDVixNQUFRO29CQUFDQSxJQUFJYyxJQUFJO29CQUFFZCxJQUFJZSxPQUFPLENBQUNDLElBQUksQ0FBQztpQkFBSyxDQUFDQSxJQUFJLENBQUM7WUFDbkZkLFFBQVFmLEtBQUt1QixlQUFlQyxXQUFXLENBQUNYLE1BQVE7b0JBQUNBLElBQUljLElBQUk7b0JBQUVkLElBQUllLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDO2lCQUFLLENBQUNBLElBQUksQ0FBQztRQUN6RjtRQUNBLElBQUlILGFBQWFYLE1BQU0sQ0FBQ0MsTUFBTSxHQUFHLEdBQUc7WUFDbENTLFVBQVVqQixHQUFHLEdBQUdpQixVQUFVakIsR0FBRyxDQUFDUyxNQUFNLENBQUNTLGFBQWFYLE1BQU07UUFDMUQ7UUFDQSxJQUFJVyxhQUFhZCxFQUFFLENBQUNJLE1BQU0sR0FBRyxHQUFHO1lBQzlCUyxVQUFVaEIsSUFBSSxHQUFHZ0IsVUFBVWhCLElBQUksQ0FBQ1EsTUFBTSxDQUFDUyxhQUFhZCxFQUFFO1FBQ3hEO1FBRUEsT0FBT2E7SUFDVDtBQUNGIn0=
|
package/dist/database/db.d.ts
CHANGED
|
@@ -1,44 +1,29 @@
|
|
|
1
|
-
export type DBPreset = "w" | "r";
|
|
2
|
-
import { Knex } from "knex";
|
|
3
1
|
import { AsyncLocalStorage } from "async_hooks";
|
|
2
|
+
import { type Knex } from "knex";
|
|
3
|
+
import type { SonamuConfig } from "../api/config";
|
|
4
4
|
import { TransactionContext } from "./transaction-context";
|
|
5
|
-
type
|
|
6
|
-
connection?: Knex.MySql2ConnectionConfig;
|
|
7
|
-
};
|
|
8
|
-
export type SonamuDBBaseConfig = {
|
|
9
|
-
database: string;
|
|
10
|
-
defaultOptions?: MySQLConfig;
|
|
11
|
-
environments?: {
|
|
12
|
-
development?: MySQLConfig;
|
|
13
|
-
development_slave?: MySQLConfig;
|
|
14
|
-
production?: MySQLConfig;
|
|
15
|
-
production_slave?: MySQLConfig;
|
|
16
|
-
remote_fixture?: MySQLConfig;
|
|
17
|
-
};
|
|
18
|
-
};
|
|
5
|
+
export type DBPreset = "w" | "r";
|
|
19
6
|
export type SonamuDBConfig = {
|
|
20
7
|
development_master: Knex.Config;
|
|
21
8
|
development_slave: Knex.Config;
|
|
22
9
|
test: Knex.Config;
|
|
23
|
-
fixture_local: Knex.Config;
|
|
24
10
|
fixture_remote: Knex.Config;
|
|
25
11
|
production_master: Knex.Config;
|
|
26
12
|
production_slave: Knex.Config;
|
|
27
13
|
};
|
|
28
|
-
declare class DBClass {
|
|
14
|
+
export declare class DBClass {
|
|
29
15
|
private wdb?;
|
|
30
16
|
private rdb?;
|
|
31
17
|
transactionStorage: AsyncLocalStorage<TransactionContext>;
|
|
32
18
|
runWithTransaction<T>(callback: () => Promise<T>): Promise<T>;
|
|
33
19
|
getTransactionContext(): TransactionContext;
|
|
34
|
-
readKnexfile(): Promise<SonamuDBConfig>;
|
|
35
20
|
getDB(which: DBPreset): Knex;
|
|
36
21
|
destroy(): Promise<void>;
|
|
37
|
-
|
|
22
|
+
generateDBConfig(config: SonamuConfig["database"]): SonamuDBConfig;
|
|
38
23
|
testTransaction: Knex.Transaction | null;
|
|
39
24
|
createTestTransaction(): Promise<Knex.Transaction>;
|
|
40
25
|
clearTestTransaction(): Promise<void>;
|
|
26
|
+
getTestConnection(): Promise<Knex>;
|
|
41
27
|
}
|
|
42
28
|
export declare const DB: DBClass;
|
|
43
|
-
export {};
|
|
44
29
|
//# sourceMappingURL=db.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/database/db.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/database/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAa,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAGvC,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,MAAM,QAAQ,GAAG,GAAG,GAAG,GAAG,CAAC;AAEjC,MAAM,MAAM,cAAc,GAAG;IAC3B,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC;IAChC,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;IAClB,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC;IAC5B,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC;IAC/B,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC;CAC/B,CAAC;AAEF,qBAAa,OAAO;IAClB,OAAO,CAAC,GAAG,CAAC,CAAO;IACnB,OAAO,CAAC,GAAG,CAAC,CAAO;IAEZ,kBAAkB,wCAA+C;IAEjE,kBAAkB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI7D,qBAAqB,IAAI,kBAAkB;IAIlD,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAiDtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAWvB,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC,GAAG,cAAc;IAiElE,eAAe,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAQ;IACjD,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;IAKlD,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrC,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;CAIzC;AACD,eAAO,MAAM,EAAE,SAAgB,CAAC"}
|
package/dist/database/db.js
CHANGED
|
@@ -1,2 +1,129 @@
|
|
|
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 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 _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);_define_property(this,"testTransaction",null)}_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;if(process.env.NODE_ENV==="test"){if(this.testTransaction){return this.testTransaction}else if(this.wdb){return this.wdb}else{this["wdb"]=(0,_knex.default)(_object_spread_props(_object_spread({},dbConfig["test"]),{pool:{min:1,max:1}}));return this["wdb"]}}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;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}}},{key:"createTestTransaction",value:function createTestTransaction(){return _async_to_generator(function(){var db,_;return _ts_generator(this,function(_state){switch(_state.label){case 0:db=this.getDB("w");_=this;return[4,db.transaction()];case 1:_.testTransaction=_state.sent();return[2,this.testTransaction]}})}).call(this)}},{key:"clearTestTransaction",value:function clearTestTransaction(){return _async_to_generator(function(){var _this_testTransaction;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,(_this_testTransaction=this.testTransaction)===null||_this_testTransaction===void 0?void 0:_this_testTransaction.rollback()];case 1:_state.sent();this.testTransaction=null;return[2]}})}).call(this)}}]);return DBClass}();var DB=new DBClass;
|
|
2
|
-
|
|
1
|
+
import { AsyncLocalStorage } from "async_hooks";
|
|
2
|
+
import knex from "knex";
|
|
3
|
+
import { assign } from "radashi";
|
|
4
|
+
import { Sonamu } from "../api/index.js";
|
|
5
|
+
import { TransactionContext } from "./transaction-context.js";
|
|
6
|
+
export 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 = assign({
|
|
66
|
+
client: "pg",
|
|
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 = assign(defaultKnexConfig, {
|
|
81
|
+
connection: {
|
|
82
|
+
database: `${config.name}_test`,
|
|
83
|
+
...config.defaultOptions?.connection
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// 개발 환경 설정
|
|
87
|
+
const devMasterOptions = config.environments?.development;
|
|
88
|
+
const devSlaveOptions = config.environments?.development_slave;
|
|
89
|
+
const development_master = assign(defaultKnexConfig, devMasterOptions ?? {});
|
|
90
|
+
const development_slave = assign(assign(defaultKnexConfig, devMasterOptions ?? {}), devSlaveOptions ?? {});
|
|
91
|
+
// NOTE: fixture remote는 default connection의 DB를 override해선 안됨.
|
|
92
|
+
const fixture_remote = assign(assign(assign(defaultKnexConfig, devMasterOptions ?? {}), {
|
|
93
|
+
connection: {
|
|
94
|
+
database: `${config.name}_fixture_remote`
|
|
95
|
+
}
|
|
96
|
+
}), config.environments?.remote_fixture ?? {});
|
|
97
|
+
// 프로덕션 환경 설정
|
|
98
|
+
const prodMasterOptions = config.environments?.production ?? {};
|
|
99
|
+
const prodSlaveOptions = config.environments?.production_slave ?? {};
|
|
100
|
+
const production_master = assign(defaultKnexConfig, prodMasterOptions);
|
|
101
|
+
const production_slave = assign(assign(defaultKnexConfig, prodMasterOptions), prodSlaveOptions ?? {});
|
|
102
|
+
return {
|
|
103
|
+
test,
|
|
104
|
+
fixture_remote,
|
|
105
|
+
development_master,
|
|
106
|
+
development_slave,
|
|
107
|
+
production_master,
|
|
108
|
+
production_slave
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// Test 환경에서 트랜잭션 사용
|
|
112
|
+
testTransaction = null;
|
|
113
|
+
async createTestTransaction() {
|
|
114
|
+
const db = this.getDB("w");
|
|
115
|
+
this.testTransaction = await db.transaction();
|
|
116
|
+
return this.testTransaction;
|
|
117
|
+
}
|
|
118
|
+
async clearTestTransaction() {
|
|
119
|
+
await this.testTransaction?.rollback();
|
|
120
|
+
this.testTransaction = null;
|
|
121
|
+
}
|
|
122
|
+
async getTestConnection() {
|
|
123
|
+
const db = this.getDB("w");
|
|
124
|
+
return db;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export const DB = new DBClass();
|
|
128
|
+
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9kYi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gXCJhc3luY19ob29rc1wiO1xuaW1wb3J0IGtuZXgsIHsgdHlwZSBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGFzc2lnbiB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29uZmlnLCBTb25hbXVDb25maWcgfSBmcm9tIFwiLi4vYXBpL2NvbmZpZ1wiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vdHJhbnNhY3Rpb24tY29udGV4dFwiO1xuXG5leHBvcnQgdHlwZSBEQlByZXNldCA9IFwid1wiIHwgXCJyXCI7XG5cbmV4cG9ydCB0eXBlIFNvbmFtdURCQ29uZmlnID0ge1xuICBkZXZlbG9wbWVudF9tYXN0ZXI6IEtuZXguQ29uZmlnO1xuICBkZXZlbG9wbWVudF9zbGF2ZTogS25leC5Db25maWc7XG4gIHRlc3Q6IEtuZXguQ29uZmlnO1xuICBmaXh0dXJlX3JlbW90ZTogS25leC5Db25maWc7XG4gIHByb2R1Y3Rpb25fbWFzdGVyOiBLbmV4LkNvbmZpZztcbiAgcHJvZHVjdGlvbl9zbGF2ZTogS25leC5Db25maWc7XG59O1xuXG5leHBvcnQgY2xhc3MgREJDbGFzcyB7XG4gIHByaXZhdGUgd2RiPzogS25leDtcbiAgcHJpdmF0ZSByZGI/OiBLbmV4O1xuXG4gIHB1YmxpYyB0cmFuc2FjdGlvblN0b3JhZ2UgPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8VHJhbnNhY3Rpb25Db250ZXh0PigpO1xuXG4gIHB1YmxpYyBydW5XaXRoVHJhbnNhY3Rpb248VD4oY2FsbGJhY2s6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblN0b3JhZ2UucnVuKG5ldyBUcmFuc2FjdGlvbkNvbnRleHQoKSwgY2FsbGJhY2spO1xuICB9XG5cbiAgcHVibGljIGdldFRyYW5zYWN0aW9uQ29udGV4dCgpOiBUcmFuc2FjdGlvbkNvbnRleHQge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU3RvcmFnZS5nZXRTdG9yZSgpID8/IG5ldyBUcmFuc2FjdGlvbkNvbnRleHQoKTtcbiAgfVxuXG4gIGdldERCKHdoaWNoOiBEQlByZXNldCk6IEtuZXgge1xuICAgIGNvbnN0IGRiQ29uZmlnID0gU29uYW11LmRiQ29uZmlnO1xuXG4gICAgLy8g7YWM7Iqk7Yq4IO2KuOuenOyereyFmCDqsqnrpqxcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiKSB7XG4gICAgICBpZiAodGhpcy50ZXN0VHJhbnNhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGVzdFRyYW5zYWN0aW9uO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLndkYikge1xuICAgICAgICByZXR1cm4gdGhpcy53ZGI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndkYiA9IGtuZXgoe1xuICAgICAgICAgIC4uLmRiQ29uZmlnLnRlc3QsXG4gICAgICAgICAgLy8g64uo7J28IO2SgFxuICAgICAgICAgIHBvb2w6IHtcbiAgICAgICAgICAgIG1pbjogMSxcbiAgICAgICAgICAgIG1heDogMSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMud2RiO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlTmFtZSA9IHdoaWNoID09PSBcIndcIiA/IFwid2RiXCIgOiBcInJkYlwiO1xuXG4gICAgaWYgKCF0aGlzW2luc3RhbmNlTmFtZV0pIHtcbiAgICAgIGxldCBjb25maWc6IEtuZXguQ29uZmlnO1xuICAgICAgc3dpdGNoIChwcm9jZXNzLmVudi5OT0RFX0VOViA/PyBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgICAgY2FzZSBcImRldmVsb3BtZW50XCI6XG4gICAgICAgIGNhc2UgXCJzdGFnaW5nXCI6XG4gICAgICAgICAgY29uZmlnID1cbiAgICAgICAgICAgIHdoaWNoID09PSBcIndcIlxuICAgICAgICAgICAgICA/IGRiQ29uZmlnLmRldmVsb3BtZW50X21hc3RlclxuICAgICAgICAgICAgICA6IChkYkNvbmZpZy5kZXZlbG9wbWVudF9zbGF2ZSA/PyBkYkNvbmZpZy5kZXZlbG9wbWVudF9tYXN0ZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicHJvZHVjdGlvblwiOlxuICAgICAgICAgIGNvbmZpZyA9XG4gICAgICAgICAgICB3aGljaCA9PT0gXCJ3XCJcbiAgICAgICAgICAgICAgPyBkYkNvbmZpZy5wcm9kdWN0aW9uX21hc3RlclxuICAgICAgICAgICAgICA6IChkYkNvbmZpZy5wcm9kdWN0aW9uX3NsYXZlID8/IGRiQ29uZmlnLnByb2R1Y3Rpb25fbWFzdGVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYO2YhOyerCBFTlYgJHtwcm9jZXNzLmVudi5OT0RFX0VOVn3sl5DripQg7ISk7KCVIOqwgOuKpe2VnCBEQuyEpOygleydtCDsl4bsirXri4jri6QuYCk7XG4gICAgICB9XG4gICAgICB0aGlzW2luc3RhbmNlTmFtZV0gPSBrbmV4KGNvbmZpZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNbaW5zdGFuY2VOYW1lXTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMud2RiICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMud2RiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMud2RiID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZGIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXdhaXQgdGhpcy5yZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5yZGIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdlbmVyYXRlREJDb25maWcoY29uZmlnOiBTb25hbXVDb25maWdbXCJkYXRhYmFzZVwiXSk6IFNvbmFtdURCQ29uZmlnIHtcbiAgICBjb25zdCBkZWZhdWx0S25leENvbmZpZzogUGFydGlhbDxEYXRhYmFzZUNvbmZpZz4gPSBhc3NpZ24oXG4gICAgICB7XG4gICAgICAgIGNsaWVudDogXCJwZ1wiLFxuICAgICAgICBwb29sOiB7XG4gICAgICAgICAgbWluOiAxLFxuICAgICAgICAgIG1heDogNSxcbiAgICAgICAgfSxcbiAgICAgICAgbWlncmF0aW9uczoge1xuICAgICAgICAgIGRpcmVjdG9yeTogXCIuL3NyYy9taWdyYXRpb25zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgICBkYXRhYmFzZTogY29uZmlnLm5hbWUsXG4gICAgICAgICAgLi4uY29uZmlnLmRlZmF1bHRPcHRpb25zPy5jb25uZWN0aW9uLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGNvbmZpZy5kZWZhdWx0T3B0aW9ucyxcbiAgICApO1xuXG4gICAgLy8g66Gc7LusIO2ZmOqyvSDshKTsoJVcbiAgICBjb25zdCB0ZXN0OiBEYXRhYmFzZUNvbmZpZyA9IGFzc2lnbihkZWZhdWx0S25leENvbmZpZywge1xuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICBkYXRhYmFzZTogYCR7Y29uZmlnLm5hbWV9X3Rlc3RgLFxuICAgICAgICAuLi5jb25maWcuZGVmYXVsdE9wdGlvbnM/LmNvbm5lY3Rpb24sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8g6rCc67CcIO2ZmOqyvSDshKTsoJVcbiAgICBjb25zdCBkZXZNYXN0ZXJPcHRpb25zID0gY29uZmlnLmVudmlyb25tZW50cz8uZGV2ZWxvcG1lbnQ7XG4gICAgY29uc3QgZGV2U2xhdmVPcHRpb25zID0gY29uZmlnLmVudmlyb25tZW50cz8uZGV2ZWxvcG1lbnRfc2xhdmU7XG4gICAgY29uc3QgZGV2ZWxvcG1lbnRfbWFzdGVyID0gYXNzaWduKGRlZmF1bHRLbmV4Q29uZmlnLCBkZXZNYXN0ZXJPcHRpb25zID8/IHt9KTtcbiAgICBjb25zdCBkZXZlbG9wbWVudF9zbGF2ZSA9IGFzc2lnbihcbiAgICAgIGFzc2lnbihkZWZhdWx0S25leENvbmZpZywgZGV2TWFzdGVyT3B0aW9ucyA/PyB7fSksXG4gICAgICBkZXZTbGF2ZU9wdGlvbnMgPz8ge30sXG4gICAgKTtcbiAgICAvLyBOT1RFOiBmaXh0dXJlIHJlbW90ZeuKlCBkZWZhdWx0IGNvbm5lY3Rpb27snZggRELrpbwgb3ZlcnJpZGXtlbTshKAg7JWI65CoLlxuICAgIGNvbnN0IGZpeHR1cmVfcmVtb3RlID0gYXNzaWduKFxuICAgICAgYXNzaWduKGFzc2lnbihkZWZhdWx0S25leENvbmZpZywgZGV2TWFzdGVyT3B0aW9ucyA/PyB7fSksIHtcbiAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgIGRhdGFiYXNlOiBgJHtjb25maWcubmFtZX1fZml4dHVyZV9yZW1vdGVgLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBjb25maWcuZW52aXJvbm1lbnRzPy5yZW1vdGVfZml4dHVyZSA/PyB7fSxcbiAgICApO1xuXG4gICAgLy8g7ZSE66Gc642V7IWYIO2ZmOqyvSDshKTsoJVcbiAgICBjb25zdCBwcm9kTWFzdGVyT3B0aW9ucyA9IGNvbmZpZy5lbnZpcm9ubWVudHM/LnByb2R1Y3Rpb24gPz8ge307XG4gICAgY29uc3QgcHJvZFNsYXZlT3B0aW9ucyA9IGNvbmZpZy5lbnZpcm9ubWVudHM/LnByb2R1Y3Rpb25fc2xhdmUgPz8ge307XG4gICAgY29uc3QgcHJvZHVjdGlvbl9tYXN0ZXIgPSBhc3NpZ24oZGVmYXVsdEtuZXhDb25maWcsIHByb2RNYXN0ZXJPcHRpb25zKTtcbiAgICBjb25zdCBwcm9kdWN0aW9uX3NsYXZlID0gYXNzaWduKFxuICAgICAgYXNzaWduKGRlZmF1bHRLbmV4Q29uZmlnLCBwcm9kTWFzdGVyT3B0aW9ucyksXG4gICAgICBwcm9kU2xhdmVPcHRpb25zID8/IHt9LFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGVzdCxcbiAgICAgIGZpeHR1cmVfcmVtb3RlLFxuICAgICAgZGV2ZWxvcG1lbnRfbWFzdGVyLFxuICAgICAgZGV2ZWxvcG1lbnRfc2xhdmUsXG4gICAgICBwcm9kdWN0aW9uX21hc3RlcixcbiAgICAgIHByb2R1Y3Rpb25fc2xhdmUsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRlc3Qg7ZmY6rK97JeQ7IScIO2KuOuenOyereyFmCDsgqzsmqlcbiAgcHVibGljIHRlc3RUcmFuc2FjdGlvbjogS25leC5UcmFuc2FjdGlvbiB8IG51bGwgPSBudWxsO1xuICBhc3luYyBjcmVhdGVUZXN0VHJhbnNhY3Rpb24oKTogUHJvbWlzZTxLbmV4LlRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKFwid1wiKTtcbiAgICB0aGlzLnRlc3RUcmFuc2FjdGlvbiA9IGF3YWl0IGRiLnRyYW5zYWN0aW9uKCk7XG4gICAgcmV0dXJuIHRoaXMudGVzdFRyYW5zYWN0aW9uO1xuICB9XG4gIGFzeW5jIGNsZWFyVGVzdFRyYW5zYWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMudGVzdFRyYW5zYWN0aW9uPy5yb2xsYmFjaygpO1xuICAgIHRoaXMudGVzdFRyYW5zYWN0aW9uID0gbnVsbDtcbiAgfVxuICBhc3luYyBnZXRUZXN0Q29ubmVjdGlvbigpOiBQcm9taXNlPEtuZXg+IHtcbiAgICBjb25zdCBkYiA9IHRoaXMuZ2V0REIoXCJ3XCIpO1xuICAgIHJldHVybiBkYjtcbiAgfVxufVxuZXhwb3J0IGNvbnN0IERCID0gbmV3IERCQ2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJBc3luY0xvY2FsU3RvcmFnZSIsImtuZXgiLCJhc3NpZ24iLCJTb25hbXUiLCJUcmFuc2FjdGlvbkNvbnRleHQiLCJEQkNsYXNzIiwid2RiIiwicmRiIiwidHJhbnNhY3Rpb25TdG9yYWdlIiwicnVuV2l0aFRyYW5zYWN0aW9uIiwiY2FsbGJhY2siLCJydW4iLCJnZXRUcmFuc2FjdGlvbkNvbnRleHQiLCJnZXRTdG9yZSIsImdldERCIiwid2hpY2giLCJkYkNvbmZpZyIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsInRlc3RUcmFuc2FjdGlvbiIsInRlc3QiLCJwb29sIiwibWluIiwibWF4IiwiaW5zdGFuY2VOYW1lIiwiY29uZmlnIiwiZGV2ZWxvcG1lbnRfbWFzdGVyIiwiZGV2ZWxvcG1lbnRfc2xhdmUiLCJwcm9kdWN0aW9uX21hc3RlciIsInByb2R1Y3Rpb25fc2xhdmUiLCJFcnJvciIsImRlc3Ryb3kiLCJ1bmRlZmluZWQiLCJnZW5lcmF0ZURCQ29uZmlnIiwiZGVmYXVsdEtuZXhDb25maWciLCJjbGllbnQiLCJtaWdyYXRpb25zIiwiZGlyZWN0b3J5IiwiY29ubmVjdGlvbiIsImRhdGFiYXNlIiwibmFtZSIsImRlZmF1bHRPcHRpb25zIiwiZGV2TWFzdGVyT3B0aW9ucyIsImVudmlyb25tZW50cyIsImRldmVsb3BtZW50IiwiZGV2U2xhdmVPcHRpb25zIiwiZml4dHVyZV9yZW1vdGUiLCJyZW1vdGVfZml4dHVyZSIsInByb2RNYXN0ZXJPcHRpb25zIiwicHJvZHVjdGlvbiIsInByb2RTbGF2ZU9wdGlvbnMiLCJjcmVhdGVUZXN0VHJhbnNhY3Rpb24iLCJkYiIsInRyYW5zYWN0aW9uIiwiY2xlYXJUZXN0VHJhbnNhY3Rpb24iLCJyb2xsYmFjayIsImdldFRlc3RDb25uZWN0aW9uIiwiREIiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGlCQUFpQixRQUFRLGNBQWM7QUFDaEQsT0FBT0MsVUFBeUIsT0FBTztBQUN2QyxTQUFTQyxNQUFNLFFBQVEsVUFBVTtBQUNqQyxTQUFTQyxNQUFNLFFBQVEsa0JBQVM7QUFFaEMsU0FBU0Msa0JBQWtCLFFBQVEsMkJBQXdCO0FBYTNELE9BQU8sTUFBTUM7SUFDSEMsSUFBVztJQUNYQyxJQUFXO0lB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
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { describe, expectTypeOf, it } from "vitest";
|
|
2
|
+
describe("Hydrate", ()=>{
|
|
3
|
+
it("flat 객체를 그대로 유지한다 (__ 없는 경우)", ()=>{
|
|
4
|
+
const result = {};
|
|
5
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
6
|
+
});
|
|
7
|
+
it("단일 depth의 __ 키를 중첩 객체로 변환한다", ()=>{
|
|
8
|
+
const result = {};
|
|
9
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
10
|
+
});
|
|
11
|
+
it("다중 depth의 __ 키를 재귀적으로 중첩 객체로 변환한다", ()=>{
|
|
12
|
+
const result = {};
|
|
13
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
14
|
+
});
|
|
15
|
+
it("여러 관계를 동시에 처리한다", ()=>{
|
|
16
|
+
const result = {};
|
|
17
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
18
|
+
});
|
|
19
|
+
it("빈 객체를 처리한다", ()=>{
|
|
20
|
+
const result = {};
|
|
21
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
22
|
+
});
|
|
23
|
+
it("nullable 필드가 있는 중첩 객체를 처리한다", ()=>{
|
|
24
|
+
const result = {};
|
|
25
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
26
|
+
});
|
|
27
|
+
it("동일한 prefix를 가진 여러 필드를 올바르게 그룹화한다", ()=>{
|
|
28
|
+
const result = {};
|
|
29
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe("LoadersResult", ()=>{
|
|
33
|
+
it("단일 로더의 결과 타입을 생성한다", ()=>{
|
|
34
|
+
const result = {};
|
|
35
|
+
expectTypeOf(result).toHaveProperty("posts");
|
|
36
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
37
|
+
});
|
|
38
|
+
it("중첩 로더를 처리한다", ()=>{
|
|
39
|
+
const result = {};
|
|
40
|
+
expectTypeOf(result).toHaveProperty("posts");
|
|
41
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
42
|
+
});
|
|
43
|
+
it("여러 로더를 처리한다", ()=>{
|
|
44
|
+
const result = {};
|
|
45
|
+
expectTypeOf(result).toHaveProperty("projects");
|
|
46
|
+
expectTypeOf(result).toHaveProperty("employees");
|
|
47
|
+
expectTypeOf(result).toHaveProperty("department");
|
|
48
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe("InferAllSubsets", ()=>{
|
|
52
|
+
describe("서브셋이 하나인 경우", ()=>{
|
|
53
|
+
it("로더 없이 기본 Subset 결과를 추론한다", ()=>{
|
|
54
|
+
const result = {};
|
|
55
|
+
expectTypeOf(result).toHaveProperty("A");
|
|
56
|
+
expectTypeOf(result.A).toEqualTypeOf();
|
|
57
|
+
expectTypeOf(result.A.department.company).toEqualTypeOf();
|
|
58
|
+
});
|
|
59
|
+
it("로더를 포함한 Subset 결과를 추론한다", ()=>{
|
|
60
|
+
const result = {};
|
|
61
|
+
expectTypeOf(result).toHaveProperty("A");
|
|
62
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
63
|
+
});
|
|
64
|
+
it("중첩 로더를 포함한 Subset 결과를 추론한다", ()=>{
|
|
65
|
+
const result = {};
|
|
66
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe("서브셋이 여러 개인 경우", ()=>{
|
|
70
|
+
it("로더 없이 기본 Subset 결과를 추론한다", ()=>{
|
|
71
|
+
const result = {};
|
|
72
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
73
|
+
});
|
|
74
|
+
it("로더를 포함한 Subset 결과를 추론한다", ()=>{
|
|
75
|
+
const result = {};
|
|
76
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLXN1YnNldC50ZXN0LWQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdFR5cGVPZiwgaXQgfSBmcm9tIFwidml0ZXN0XCI7XG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlU2NoZW1hRXh0ZW5kIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmkgfSBmcm9tIFwiLi9wdXJpXCI7XG5pbXBvcnQgdHlwZSB7IEh5ZHJhdGUsIEluZmVyQWxsU3Vic2V0cywgTG9hZGVyc1Jlc3VsdCB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmlXcmFwcGVyIH0gZnJvbSBcIi4vcHVyaS13cmFwcGVyXCI7XG5cbnR5cGUgTW9ja1B1cmk8VD4gPSBQdXJpPERhdGFiYXNlU2NoZW1hRXh0ZW5kLCBhbnksIFQ+O1xuXG5kZXNjcmliZShcIkh5ZHJhdGVcIiwgKCkgPT4ge1xuICBpdChcImZsYXQg6rCd7LK066W8IOq3uOuMgOuhnCDsnKDsp4DtlZzri6QgKF9fIOyXhuuKlCDqsr3smrApXCIsICgpID0+IHtcbiAgICB0eXBlIElucHV0ID0geyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfTtcbiAgICB0eXBlIFJlc3VsdCA9IEh5ZHJhdGU8SW5wdXQ+O1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8SHlkcmF0ZTxJbnB1dD4+KCk7XG4gIH0pO1xuXG4gIGl0KFwi64uo7J28IGRlcHRo7J2YIF9fIO2CpOulvCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBJbnB1dCA9IHsgaWQ6IG51bWJlcjsgdXNlcl9fbmFtZTogc3RyaW5nOyB1c2VyX19lbWFpbDogc3RyaW5nIH07XG4gICAgdHlwZSBSZXN1bHQgPSBIeWRyYXRlPElucHV0PjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VyOiB7IG5hbWU6IHN0cmluZzsgZW1haWw6IHN0cmluZyB9O1xuICAgIH0+KCk7XG4gIH0pO1xuXG4gIGl0KFwi64uk7KSRIGRlcHRo7J2YIF9fIO2CpOulvCDsnqzqt4DsoIHsnLzroZwg7KSR7LKpIOqwneyytOuhnCDrs4DtmZjtlZzri6RcIiwgKCkgPT4ge1xuICAgIHR5cGUgSW5wdXQgPSB7XG4gICAgICBpZDogbnVtYmVyO1xuICAgICAgdXNlcl9fcHJvZmlsZV9fYmlvOiBzdHJpbmc7XG4gICAgICB1c2VyX19wcm9maWxlX19hdmF0YXI6IHN0cmluZztcbiAgICAgIHVzZXJfX25hbWU6IHN0cmluZztcbiAgICB9O1xuICAgIHR5cGUgUmVzdWx0ID0gSHlkcmF0ZTxJbnB1dD47XG5cbiAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICBpZDogbnVtYmVyO1xuICAgICAgdXNlcjoge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHByb2ZpbGU6IHsgYmlvOiBzdHJpbmc7IGF2YXRhcjogc3RyaW5nIH07XG4gICAgICB9O1xuICAgIH0+KCk7XG4gIH0pO1xuXG4gIGl0KFwi7Jes65+sIOq0gOqzhOulvCDrj5nsi5zsl5Ag7LKY66as7ZWc64ukXCIsICgpID0+IHtcbiAgICB0eXBlIElucHV0ID0ge1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHVzZXJfX2lkOiBudW1iZXI7XG4gICAgICB1c2VyX19uYW1lOiBzdHJpbmc7XG4gICAgICBwb3N0X19pZDogbnVtYmVyO1xuICAgICAgcG9zdF9fdGl0bGU6IHN0cmluZztcbiAgICB9O1xuICAgIHR5cGUgUmVzdWx0ID0gSHlkcmF0ZTxJbnB1dD47XG5cbiAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICBpZDogbnVtYmVyO1xuICAgICAgdXNlcjogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfTtcbiAgICAgIHBvc3Q6IHsgaWQ6IG51bWJlcjsgdGl0bGU6IHN0cmluZyB9O1xuICAgIH0+KCk7XG4gIH0pO1xuXG4gIGl0KFwi67mIIOqwneyytOulvCDsspjrpqztlZzri6RcIiwgKCkgPT4ge1xuICAgIHR5cGUgSW5wdXQgPSB7fTtcbiAgICB0eXBlIFJlc3VsdCA9IEh5ZHJhdGU8SW5wdXQ+O1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e30+KCk7XG4gIH0pO1xuXG4gIGl0KFwibnVsbGFibGUg7ZWE65Oc6rCAIOyeiOuKlCDspJHssqkg6rCd7LK066W8IOyymOumrO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBJbnB1dCA9IHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VyX19pZDogbnVtYmVyIHwgbnVsbDtcbiAgICAgIHVzZXJfX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgfTtcbiAgICB0eXBlIFJlc3VsdCA9IEh5ZHJhdGU8SW5wdXQ+O1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHVzZXI6IHsgaWQ6IG51bWJlciB8IG51bGw7IG5hbWU6IHN0cmluZyB8IG51bGwgfTtcbiAgICB9PigpO1xuICB9KTtcblxuICBpdChcIuuPmeydvO2VnCBwcmVmaXjrpbwg6rCA7KeEIOyXrOufrCDtlYTrk5zrpbwg7Jis67CU66W06rKMIOq3uOujue2ZlO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBJbnB1dCA9IHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VyX19pZDogbnVtYmVyO1xuICAgICAgdXNlcl9fbmFtZTogc3RyaW5nO1xuICAgICAgdXNlcl9jb3VudDogbnVtYmVyO1xuICAgIH07XG4gICAgdHlwZSBSZXN1bHQgPSBIeWRyYXRlPElucHV0PjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VyOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZyB9O1xuICAgICAgdXNlcl9jb3VudDogbnVtYmVyO1xuICAgIH0+KCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiTG9hZGVyc1Jlc3VsdFwiLCAoKSA9PiB7XG4gIGl0KFwi64uo7J28IOuhnOuNlOydmCDqsrDqs7wg7YOA7J6F7J2EIOyDneyEse2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBNb2NrTG9hZGVyUWIgPSAoXG4gICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgIGZyb21JZHM6IG51bWJlcltdLFxuICAgICkgPT4gTW9ja1B1cmk8eyBpZDogbnVtYmVyOyB0aXRsZTogc3RyaW5nOyByZWZJZDogbnVtYmVyIH0+O1xuXG4gICAgdHlwZSBMb2FkZXJzID0gW1xuICAgICAge1xuICAgICAgICBhczogXCJwb3N0c1wiO1xuICAgICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgICBxYjogTW9ja0xvYWRlclFiO1xuICAgICAgfSxcbiAgICBdO1xuICAgIHR5cGUgUmVzdWx0ID0gTG9hZGVyc1Jlc3VsdDxMb2FkZXJzPjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0hhdmVQcm9wZXJ0eShcInBvc3RzXCIpO1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8eyBwb3N0czogeyBpZDogbnVtYmVyOyB0aXRsZTogc3RyaW5nIH1bXSB9PigpO1xuICB9KTtcblxuICBpdChcIuykkeyyqSDroZzrjZTrpbwg7LKY66as7ZWc64ukXCIsICgpID0+IHtcbiAgICB0eXBlIENvbW1lbnRMb2FkZXJRYiA9IChcbiAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgZnJvbUlkczogbnVtYmVyW10sXG4gICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IGNvbnRlbnQ6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcblxuICAgIHR5cGUgUG9zdExvYWRlclFiID0gKFxuICAgICAgcWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sXG4gICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICApID0+IE1vY2tQdXJpPHsgaWQ6IG51bWJlcjsgdGl0bGU6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcblxuICAgIHR5cGUgTG9hZGVycyA9IFtcbiAgICAgIHtcbiAgICAgICAgYXM6IFwicG9zdHNcIjtcbiAgICAgICAgcmVmSWQ6IFwiaWRcIjtcbiAgICAgICAgcWI6IFBvc3RMb2FkZXJRYjtcbiAgICAgICAgbG9hZGVyczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFzOiBcImNvbW1lbnRzXCI7XG4gICAgICAgICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgICAgICAgcWI6IENvbW1lbnRMb2FkZXJRYjtcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfSxcbiAgICBdO1xuICAgIHR5cGUgUmVzdWx0ID0gTG9hZGVyc1Jlc3VsdDxMb2FkZXJzPjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0hhdmVQcm9wZXJ0eShcInBvc3RzXCIpO1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgcG9zdHM6IHsgaWQ6IG51bWJlcjsgdGl0bGU6IHN0cmluZzsgY29tbWVudHM6IHsgaWQ6IG51bWJlcjsgY29udGVudDogc3RyaW5nIH1bXSB9W107XG4gICAgfT4oKTtcbiAgfSk7XG5cbiAgaXQoXCLsl6zrn6wg66Gc642U66W8IOyymOumrO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBQcm9qZWN0TG9hZGVyID0ge1xuICAgICAgYXM6IFwicHJvamVjdHNcIjtcbiAgICAgIHJlZklkOiBcImlkXCI7XG4gICAgICBxYjogKFxuICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgZnJvbUlkczogbnVtYmVyW10sXG4gICAgICApID0+IE1vY2tQdXJpPHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyByZWZJZDogbnVtYmVyIH0+O1xuICAgIH07XG4gICAgdHlwZSBEZXBhcnRtZW50TG9hZGVyID0ge1xuICAgICAgYXM6IFwiZGVwYXJ0bWVudFwiO1xuICAgICAgcmVmSWQ6IFwiaWRcIjtcbiAgICAgIHFiOiAoXG4gICAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICAgICkgPT4gTW9ja1B1cmk8eyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGNvbXBhbnlfbmFtZTogc3RyaW5nOyByZWZJZDogbnVtYmVyIH0+O1xuICAgIH07XG4gICAgdHlwZSBFbXBsb3llZUxvYWRlciA9IHtcbiAgICAgIGFzOiBcImVtcGxveWVlc1wiO1xuICAgICAgcmVmSWQ6IFwiaWRcIjtcbiAgICAgIHFiOiAoXG4gICAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICAgICkgPT4gTW9ja1B1cmk8eyBpZDogbnVtYmVyOyBlbXBsb3llZV9udW1iZXI6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICAgIGxvYWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFzOiBcInVzZXJcIjtcbiAgICAgICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgICAgIHFiOiAoXG4gICAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICAgIGZyb21JZHM6IG51bWJlcltdLFxuICAgICAgICAgICkgPT4gTW9ja1B1cmk8eyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmc7IHJlZklkOiBudW1iZXIgfT47XG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH07XG5cbiAgICB0eXBlIExvYWRlcnMgPSBbUHJvamVjdExvYWRlciwgRGVwYXJ0bWVudExvYWRlciwgRW1wbG95ZWVMb2FkZXJdO1xuICAgIHR5cGUgUmVzdWx0ID0gTG9hZGVyc1Jlc3VsdDxMb2FkZXJzPjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0hhdmVQcm9wZXJ0eShcInByb2plY3RzXCIpO1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvSGF2ZVByb3BlcnR5KFwiZW1wbG95ZWVzXCIpO1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvSGF2ZVByb3BlcnR5KFwiZGVwYXJ0bWVudFwiKTtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgIHByb2plY3RzOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZyB9W107XG4gICAgICBkZXBhcnRtZW50OiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgY29tcGFueV9uYW1lOiBzdHJpbmcgfVtdO1xuICAgICAgZW1wbG95ZWVzOiB7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIGVtcGxveWVlX251bWJlcjogc3RyaW5nO1xuICAgICAgICB1c2VyOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgZW1haWw6IHN0cmluZyB9W107XG4gICAgICB9W107XG4gICAgfT4oKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJJbmZlckFsbFN1YnNldHNcIiwgKCkgPT4ge1xuICBkZXNjcmliZShcIuyEnOu4jOyFi+ydtCDtlZjrgpjsnbgg6rK97JqwXCIsICgpID0+IHtcbiAgICBpdChcIuuhnOuNlCDsl4bsnbQg6riw67O4IFN1YnNldCDqsrDqs7zrpbwg7LaU66Gg7ZWc64ukXCIsICgpID0+IHtcbiAgICAgIC8vIFN1YnNldFF1ZXJ5XG4gICAgICB0eXBlIFN1YnNldEZuQSA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICB1c2VyX19uYW1lOiBzdHJpbmc7XG4gICAgICAgIHVzZXJfX2VtYWlsOiBzdHJpbmc7XG4gICAgICAgIGRlcGFydG1lbnRfX25hbWU6IHN0cmluZztcbiAgICAgICAgZGVwYXJ0bWVudF9fY29tcGFueV9fbmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICB0eXBlIFN1YnNldFF1ZXJpZXMgPSB7XG4gICAgICAgIEE6IFN1YnNldEZuQTtcbiAgICAgIH07XG5cbiAgICAgIC8vIExvYWRlclF1ZXJ5XG4gICAgICB0eXBlIExvYWRlclF1ZXJpZXMgPSB7XG4gICAgICAgIEE6IFtdO1xuICAgICAgfTtcblxuICAgICAgLy8gUmVzdWx0XG4gICAgICB0eXBlIFJlc3VsdCA9IEluZmVyQWxsU3Vic2V0czxTdWJzZXRRdWVyaWVzLCBMb2FkZXJRdWVyaWVzPjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9IYXZlUHJvcGVydHkoXCJBXCIpO1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdC5BKS50b0VxdWFsVHlwZU9mPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgdXNlcjogeyBuYW1lOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmcgfTtcbiAgICAgICAgZGVwYXJ0bWVudDogeyBuYW1lOiBzdHJpbmc7IGNvbXBhbnk6IHsgbmFtZTogc3RyaW5nIH0gfTtcbiAgICAgIH0+KCk7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0LkEuZGVwYXJ0bWVudC5jb21wYW55KS50b0VxdWFsVHlwZU9mPHsgbmFtZTogc3RyaW5nIH0+KCk7XG4gICAgfSk7XG5cbiAgICBpdChcIuuhnOuNlOulvCDtj6ztlajtlZwgU3Vic2V0IOqysOqzvOulvCDstpTroaDtlZzri6RcIiwgKCkgPT4ge1xuICAgICAgLy8gU3Vic2V0UXVlcnlcbiAgICAgIHR5cGUgU3Vic2V0Rm5BID0gKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiBNb2NrUHVyaTx7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIGNvbXBhbnlfX2lkOiBudW1iZXI7XG4gICAgICAgIGNvbXBhbnlfX25hbWU6IHN0cmluZztcbiAgICAgICAgZGVwYXJ0bWVudF9faWQ6IG51bWJlcjtcbiAgICAgICAgZGVwYXJ0bWVudF9fbmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICB0eXBlIFN1YnNldFF1ZXJpZXMgPSB7XG4gICAgICAgIEE6IFN1YnNldEZuQTtcbiAgICAgIH07XG5cbiAgICAgIC8vIExvYWRlclF1ZXJ5XG4gICAgICB0eXBlIENvbXBhbnlEZXBhcnRtZW50c0xvYWRlciA9IHtcbiAgICAgICAgYXM6IFwiY29tcGFueV9fZGVwYXJ0bWVudHNcIjtcbiAgICAgICAgcmVmSWQ6IFwiY29tcGFueV9faWRcIjtcbiAgICAgICAgcWI6IChcbiAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICAgIH07XG4gICAgICB0eXBlIERlcGFydG1lbnRQcm9qZWN0c0xvYWRlciA9IHtcbiAgICAgICAgYXM6IFwiZGVwYXJ0bWVudF9fcHJvamVjdHNcIjtcbiAgICAgICAgcmVmSWQ6IFwiZGVwYXJ0bWVudF9faWRcIjtcbiAgICAgICAgcWI6IChcbiAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmc7IHJlZklkOiBudW1iZXIgfT47XG4gICAgICB9O1xuICAgICAgdHlwZSBMb2FkZXJRdWVyaWVzID0ge1xuICAgICAgICBBOiBbQ29tcGFueURlcGFydG1lbnRzTG9hZGVyLCBEZXBhcnRtZW50UHJvamVjdHNMb2FkZXJdO1xuICAgICAgfTtcblxuICAgICAgLy8gUmVzdWx0XG4gICAgICB0eXBlIFJlc3VsdCA9IEluZmVyQWxsU3Vic2V0czxTdWJzZXRRdWVyaWVzLCBMb2FkZXJRdWVyaWVzPjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9IYXZlUHJvcGVydHkoXCJBXCIpO1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICAgIEE6IHtcbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIGNvbXBhbnk6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBkZXBhcnRtZW50czogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfVtdIH07XG4gICAgICAgICAgZGVwYXJ0bWVudDoge1xuICAgICAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHByb2plY3RzOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmcgfVtdO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB9PigpO1xuICAgIH0pO1xuXG4gICAgaXQoXCLspJHssqkg66Gc642U66W8IO2PrO2VqO2VnCBTdWJzZXQg6rKw6rO866W8IOy2lOuhoO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgICAvLyBTdWJzZXRRdWVyeVxuICAgICAgdHlwZSBTdWJzZXRGbkEgPSAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IE1vY2tQdXJpPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgY29tcGFueV9fbmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICB0eXBlIFN1YnNldFF1ZXJpZXMgPSB7XG4gICAgICAgIEE6IFN1YnNldEZuQTtcbiAgICAgIH07XG5cbiAgICAgIC8vIExvYWRlclF1ZXJ5XG4gICAgICB0eXBlIENvbXBhbnlEZXBhcnRtZW50c0xvYWRlciA9IHtcbiAgICAgICAgYXM6IFwiY29tcGFueV9fZGVwYXJ0bWVudHNcIjtcbiAgICAgICAgcmVmSWQ6IFwiY29tcGFueV9faWRcIjtcbiAgICAgICAgcWI6IChcbiAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICAgICAgbG9hZGVyczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFzOiBcInByb2plY3RzXCI7XG4gICAgICAgICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgICAgICAgcWI6IChcbiAgICAgICAgICAgICAgcWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sXG4gICAgICAgICAgICAgIGZyb21JZHM6IG51bWJlcltdLFxuICAgICAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmc7IHJlZklkOiBudW1iZXIgfT47XG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH07XG4gICAgICB0eXBlIExvYWRlclF1ZXJpZXMgPSB7XG4gICAgICAgIEE6IFtDb21wYW55RGVwYXJ0bWVudHNMb2FkZXJdO1xuICAgICAgfTtcblxuICAgICAgLy8gUmVzdWx0XG4gICAgICB0eXBlIFJlc3VsdCA9IEluZmVyQWxsU3Vic2V0czxTdWJzZXRRdWVyaWVzLCBMb2FkZXJRdWVyaWVzPjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICAgIEE6IHtcbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIGNvbXBhbnk6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGRlcGFydG1lbnRzOiB7XG4gICAgICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgICAgcHJvamVjdHM6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBzdGF0dXM6IHN0cmluZyB9W107XG4gICAgICAgICAgICB9W107XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIH0+KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwi7ISc67iM7IWL7J20IOyXrOufrCDqsJzsnbgg6rK97JqwXCIsICgpID0+IHtcbiAgICBpdChcIuuhnOuNlCDsl4bsnbQg6riw67O4IFN1YnNldCDqsrDqs7zrpbwg7LaU66Gg7ZWc64ukXCIsICgpID0+IHtcbiAgICAgIC8vIFN1YnNldFF1ZXJ5XG4gICAgICB0eXBlIFN1YnNldEZuQSA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgICAgIGRlcGFydG1lbnRfX25hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgdHlwZSBTdWJzZXRGblAgPSAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IE1vY2tQdXJpPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBkZXBhcnRtZW50X19uYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0Rm5TUyA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgICAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0UXVlcmllcyA9IHtcbiAgICAgICAgQTogU3Vic2V0Rm5BO1xuICAgICAgICBQOiBTdWJzZXRGblA7XG4gICAgICAgIFNTOiBTdWJzZXRGblNTO1xuICAgICAgfTtcblxuICAgICAgLy8gTG9hZGVyUXVlcnlcbiAgICAgIHR5cGUgTG9hZGVyUXVlcmllcyA9IHtcbiAgICAgICAgQTogW107XG4gICAgICAgIFA6IFtdO1xuICAgICAgICBTUzogW107XG4gICAgICB9O1xuXG4gICAgICAvLyBSZXN1bHRcbiAgICAgIHR5cGUgUmVzdWx0ID0gSW5mZXJBbGxTdWJzZXRzPFN1YnNldFF1ZXJpZXMsIExvYWRlclF1ZXJpZXM+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgICAgQTogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmc7IGRlcGFydG1lbnQ6IHsgbmFtZTogc3RyaW5nIH0gfTtcbiAgICAgICAgUDogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGRlcGFydG1lbnQ6IHsgbmFtZTogc3RyaW5nIH0gfTtcbiAgICAgICAgU1M6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBlbWFpbDogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH07XG4gICAgICB9PigpO1xuICAgIH0pO1xuXG4gICAgaXQoXCLroZzrjZTrpbwg7Y+s7ZWo7ZWcIFN1YnNldCDqsrDqs7zrpbwg7LaU66Gg7ZWc64ukXCIsICgpID0+IHtcbiAgICAgIC8vIFN1YnNldFF1ZXJ5XG4gICAgICB0eXBlIFN1YnNldEZuQSA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgICAgIGRlcGFydG1lbnRfX25hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgdHlwZSBTdWJzZXRGblAgPSAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IE1vY2tQdXJpPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBkZXBhcnRtZW50X19uYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0Rm5TUyA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgICAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0UXVlcmllcyA9IHtcbiAgICAgICAgQTogU3Vic2V0Rm5BO1xuICAgICAgICBQOiBTdWJzZXRGblA7XG4gICAgICAgIFNTOiBTdWJzZXRGblNTO1xuICAgICAgfTtcblxuICAgICAgLy8gTG9hZGVyUXVlcnlcbiAgICAgIHR5cGUgUHJvamVjdExvYWRlciA9IHtcbiAgICAgICAgYXM6IFwicHJvamVjdHNcIjtcbiAgICAgICAgcmVmSWQ6IFwiaWRcIjtcbiAgICAgICAgcWI6IChcbiAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmc7IHJlZklkOiBudW1iZXIgfT47XG4gICAgICAgIGxvYWRlcnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhczogXCJ0YWdzXCI7XG4gICAgICAgICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgICAgICAgcWI6IChcbiAgICAgICAgICAgICAgcWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sXG4gICAgICAgICAgICAgIGZyb21JZHM6IG51bWJlcltdLFxuICAgICAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfTtcbiAgICAgIHR5cGUgTG9hZGVyUXVlcmllcyA9IHtcbiAgICAgICAgQTogW1Byb2plY3RMb2FkZXJdO1xuICAgICAgICBQOiBbXTtcbiAgICAgICAgU1M6IFtdO1xuICAgICAgfTtcblxuICAgICAgLy8gUmVzdWx0XG4gICAgICB0eXBlIFJlc3VsdCA9IEluZmVyQWxsU3Vic2V0czxTdWJzZXRRdWVyaWVzLCBMb2FkZXJRdWVyaWVzPjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICAgIEE6IHtcbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICBlbWFpbDogc3RyaW5nO1xuICAgICAgICAgIGRlcGFydG1lbnQ6IHsgbmFtZTogc3RyaW5nIH07XG4gICAgICAgICAgcHJvamVjdHM6IHtcbiAgICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBzdGF0dXM6IHN0cmluZztcbiAgICAgICAgICAgIHRhZ3M6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nIH1bXTtcbiAgICAgICAgICB9W107XG4gICAgICAgIH07XG4gICAgICAgIFA6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBkZXBhcnRtZW50OiB7IG5hbWU6IHN0cmluZyB9IH07XG4gICAgICAgIFNTOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgZW1haWw6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZyB9O1xuICAgICAgfT4oKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJuYW1lcyI6WyJkZXNjcmliZSIsImV4cGVjdFR5cGVPZiIsIml0IiwicmVzdWx0IiwidG9FcXVhbFR5cGVPZiIsInRvSGF2ZVByb3BlcnR5IiwiQSIsImRlcGFydG1lbnQiLCJjb21wYW55Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFRLEVBQUVDLFlBQVksRUFBRUMsRUFBRSxRQUFRLFNBQVM7QUFRcERGLFNBQVMsV0FBVztJQUNsQkUsR0FBRyxnQ0FBZ0M7UUFJakMsTUFBTUMsU0FBUyxDQUFDO1FBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO0lBQ3BDO0lBRUFGLEdBQUcsK0JBQStCO1FBSWhDLE1BQU1DLFNBQVMsQ0FBQztRQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtJQUlwQztJQUVBRixHQUFHLHFDQUFxQztRQVN0QyxNQUFNQyxTQUFTLENBQUM7UUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7SUFPcEM7SUFFQUYsR0FBRyxtQkFBbUI7UUFVcEIsTUFBTUMsU0FBUyxDQUFDO1FBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO0lBS3BDO0lBRUFGLEdBQUcsY0FBYztRQUlmLE1BQU1DLFNBQVMsQ0FBQztRQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtJQUNwQztJQUVBRixHQUFHLCtCQUErQjtRQVFoQyxNQUFNQyxTQUFTLENBQUM7UUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7SUFJcEM7SUFFQUYsR0FBRyxvQ0FBb0M7UUFTckMsTUFBTUMsU0FBUyxDQUFDO1FBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO0lBS3BDO0FBQ0Y7QUFFQUosU0FBUyxpQkFBaUI7SUFDeEJFLEdBQUcsc0JBQXNCO1FBZXZCLE1BQU1DLFNBQVMsQ0FBQztRQUNoQkYsYUFBYUUsUUFBUUUsY0FBYyxDQUFDO1FBQ3BDSixhQUFhRSxRQUFRQyxhQUFhO0lBQ3BDO0lBRUFGLEdBQUcsZUFBZTtRQTJCaEIsTUFBTUMsU0FBUyxDQUFDO1FBQ2hCRixhQUFhRSxRQUFRRSxjQUFjLENBQUM7UUFDcENKLGFBQWFFLFFBQVFDLGFBQWE7SUFHcEM7SUFFQUYsR0FBRyxlQUFlO1FBdUNoQixNQUFNQyxTQUFTLENBQUM7UUFDaEJGLGFBQWFFLFFBQVFFLGNBQWMsQ0FBQztRQUNwQ0osYUFBYUUsUUFBUUUsY0FBYyxDQUFDO1FBQ3BDSixhQUFhRSxRQUFRRSxjQUFjLENBQUM7UUFDcENKLGFBQWFFLFFBQVFDLGFBQWE7SUFTcEM7QUFDRjtBQUVBSixTQUFTLG1CQUFtQjtJQUMxQkEsU0FBUyxlQUFlO1FBQ3RCRSxHQUFHLDRCQUE0QjtZQXFCN0IsTUFBTUMsU0FBUyxDQUFDO1lBQ2hCRixhQUFhRSxRQUFRRSxjQUFjLENBQUM7WUFDcENKLGFBQWFFLE9BQU9HLENBQUMsRUFBRUYsYUFBYTtZQUtwQ0gsYUFBYUUsT0FBT0csQ0FBQyxDQUFDQyxVQUFVLENBQUNDLE9BQU8sRUFBRUosYUFBYTtRQUN6RDtRQUVBRixHQUFHLDJCQUEyQjtZQXFDNUIsTUFBTUMsU0FBUyxDQUFDO1lBQ2hCRixhQUFhRSxRQUFRRSxjQUFjLENBQUM7WUFDcENKLGFBQWFFLFFBQVFDLGFBQWE7UUFXcEM7UUFFQUYsR0FBRyw4QkFBOEI7WUFvQy9CLE1BQU1DLFNBQVMsQ0FBQztZQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtRQWFwQztJQUNGO0lBRUFKLFNBQVMsaUJBQWlCO1FBQ3hCRSxHQUFHLDRCQUE0QjtZQW1DN0IsTUFBTUMsU0FBUyxDQUFDO1lBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO1FBS3BDO1FBRUFGLEdBQUcsMkJBQTJCO1lBcUQ1QixNQUFNQyxTQUFTLENBQUM7WUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7UUFnQnBDO0lBQ0Y7QUFDRiJ9
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Puri Subset 타입 시스템
|
|
3
|
+
*
|
|
4
|
+
* SubsetQuery와 LoaderQuery를 기반으로 최종 결과 타입을 추론하는 타입 유틸리티들.
|
|
5
|
+
* 핵심 개념:
|
|
6
|
+
* - SubsetQuery: 기본 쿼리 (join, select)
|
|
7
|
+
* - LoaderQuery: 1:N, N:M 관계 데이터 로딩
|
|
8
|
+
* - Hydrate: flat한 결과를 중첩 객체로 변환 (예: user__name → { user: { name } })
|
|
9
|
+
*/
|
|
10
|
+
import type { DatabaseSchemaExtend } from "../types/types";
|
|
11
|
+
import type { Puri } from "./puri";
|
|
12
|
+
import type { Expand } from "./puri.types";
|
|
13
|
+
import type { PuriWrapper } from "./puri-wrapper";
|
|
14
|
+
/**
|
|
15
|
+
* SubsetQuery 함수 시그니처
|
|
16
|
+
* PuriWrapper를 받아 Puri 쿼리 빌더를 반환
|
|
17
|
+
*/
|
|
18
|
+
export type PuriSubsetFn = (qbWrapper: PuriWrapper<DatabaseSchemaExtend>) => Puri<any, any, any>;
|
|
19
|
+
/**
|
|
20
|
+
* Puri 인스턴스에서 TResult 타입 추출
|
|
21
|
+
*/
|
|
22
|
+
export type ExtractPuriResult<T> = T extends Puri<any, any, infer R> ? R : never;
|
|
23
|
+
/**
|
|
24
|
+
* Loader 쿼리 빌더 함수 시그니처
|
|
25
|
+
* @param qbWrapper - Puri 래퍼
|
|
26
|
+
* @param fromIds - 부모 레코드 ID 배열
|
|
27
|
+
*/
|
|
28
|
+
export type PuriLoaderQbFn = (qbWrapper: PuriWrapper<DatabaseSchemaExtend>, fromIds: number[]) => Puri<any, any, any>;
|
|
29
|
+
/**
|
|
30
|
+
* 단일 Loader 정의
|
|
31
|
+
* 1:N 또는 N:M 관계 데이터를 로드하는 설정
|
|
32
|
+
*/
|
|
33
|
+
export type GenericPuriLoader = {
|
|
34
|
+
/** 결과 객체에서 사용할 필드명 */
|
|
35
|
+
as: string;
|
|
36
|
+
/** 부모 레코드와 연결할 참조 필드명 */
|
|
37
|
+
refId: string;
|
|
38
|
+
/** 데이터 로딩 쿼리 빌더 */
|
|
39
|
+
qb: PuriLoaderQbFn;
|
|
40
|
+
/** 중첩 로더 (재귀적 로딩 지원) */
|
|
41
|
+
loaders?: GenericPuriLoader[];
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* 모델별 Loader 쿼리 컬렉션
|
|
45
|
+
* 각 SubsetKey에 대해 Loader 배열을 정의
|
|
46
|
+
*/
|
|
47
|
+
export type PuriLoaderQueries<TSubsetKey extends string> = Record<TSubsetKey, GenericPuriLoader[]>;
|
|
48
|
+
/**
|
|
49
|
+
* 구분자(__) 앞부분 추출
|
|
50
|
+
* @example ExtractHead<"user__name"> = "user"
|
|
51
|
+
*/
|
|
52
|
+
type ExtractHead<K extends string> = K extends `${infer Head}__${string}` ? Head : never;
|
|
53
|
+
/**
|
|
54
|
+
* 구분자(__) 뒷부분 추출
|
|
55
|
+
* @example ExtractTail<"user__profile__name", "user"> = "profile__name"
|
|
56
|
+
*/
|
|
57
|
+
type ExtractTail<K extends string, Head extends string> = K extends `${Head}__${infer Tail}` ? Tail : never;
|
|
58
|
+
/**
|
|
59
|
+
* Flat 객체를 중첩 객체로 변환
|
|
60
|
+
*
|
|
61
|
+
* 런타임 hydrate 함수와 동일한 동작을 타입 레벨에서 구현.
|
|
62
|
+
* `__`로 구분된 키를 중첩 객체 구조로 변환.
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* type Input = { id: number; user__name: string; user__profile__bio: string }
|
|
66
|
+
* type Output = Hydrate<Input>
|
|
67
|
+
* // { id: number; user: { name: string; profile: { bio: string } } }
|
|
68
|
+
*/
|
|
69
|
+
export type Hydrate<T> = Expand<HydrateInner<T>>;
|
|
70
|
+
type HydrateInner<T> = {
|
|
71
|
+
[K in keyof T as K extends `${string}__${string}` ? never : K]: T[K];
|
|
72
|
+
} & {
|
|
73
|
+
[K in ExtractHead<keyof T & string>]: Expand<HydrateInner<{
|
|
74
|
+
[P in keyof T as P extends `${K}__${string}` ? ExtractTail<P & string, K> : never]: T[P];
|
|
75
|
+
}>>;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Loader 쿼리 함수에서 결과 타입 추출 (refId 제외, Hydrate 적용)
|
|
79
|
+
*/
|
|
80
|
+
type ExtractLoaderResult<TLoaderQb> = TLoaderQb extends PuriLoaderQbFn ? Expand<Hydrate<Omit<ExtractPuriResult<ReturnType<TLoaderQb>>, "refId">>> : never;
|
|
81
|
+
/**
|
|
82
|
+
* Loader 배열에서 결과 객체 타입 빌드 (재귀적으로 중첩 loader 처리)
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* type Loaders = [
|
|
86
|
+
* { as: "employees"; refId: "id"; qb: ...; loaders: [{ as: "projects"; ... }] }
|
|
87
|
+
* ]
|
|
88
|
+
* type Result = LoadersResult<Loaders>
|
|
89
|
+
* // { employees: Array<{ ...employee fields; projects: Array<...> }> }
|
|
90
|
+
*/
|
|
91
|
+
export type LoadersResult<TLoaders extends GenericPuriLoader[]> = Expand<{
|
|
92
|
+
[L in TLoaders[number] as L["as"]]: WithLoaders<ExtractLoaderResult<L["qb"]>, L["loaders"]>[];
|
|
93
|
+
}>;
|
|
94
|
+
/**
|
|
95
|
+
* 기본 결과와 Loader 결과 병합
|
|
96
|
+
*/
|
|
97
|
+
type WithLoaders<TBase, TLoaders> = TLoaders extends GenericPuriLoader[] ? Expand<TBase & LoadersResult<TLoaders>> : TBase;
|
|
98
|
+
/**
|
|
99
|
+
* 단일 Subset 함수 + Loader에서 최종 결과 타입 추론
|
|
100
|
+
*/
|
|
101
|
+
type InferSubsetWithLoaders<TSubsetFn extends (...args: any) => Puri<any, any, any>, TLoaders extends GenericPuriLoader[] | undefined = undefined> = Expand<Hydrate<WithLoaders<ExtractPuriResult<ReturnType<TSubsetFn>>, TLoaders>>>;
|
|
102
|
+
/**
|
|
103
|
+
* 전체 SubsetQueries + LoaderQueries 객체에서 전체 결과 맵 생성
|
|
104
|
+
*
|
|
105
|
+
* @template TSubsetMap - Subset 함수들의 모음 객체
|
|
106
|
+
* @template TLoaderMap - Loader 배열들의 모음 객체
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* type Result = InferAllSubsets<
|
|
110
|
+
* { A: () => Puri<...>, P: () => Puri<...> },
|
|
111
|
+
* { A: [...loaders], P: [] }
|
|
112
|
+
* >
|
|
113
|
+
* // { A: InferredTypeA; P: InferredTypeP }
|
|
114
|
+
*/
|
|
115
|
+
export type InferAllSubsets<TSubsetMap extends Record<string, (...args: any) => any>, TLoaderMap extends Partial<Record<string, GenericPuriLoader[]>>> = {
|
|
116
|
+
[K in keyof TSubsetMap]: InferSubsetWithLoaders<TSubsetMap[K], K extends keyof TLoaderMap ? TLoaderMap[K] : undefined>;
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Knex QueryBuilder에서 clear 가능한 statement 목록
|
|
120
|
+
*/
|
|
121
|
+
export type ClearStatements = "with" | "select" | "columns" | "hintComments" | "where" | "union" | "using" | "join" | "group" | "order" | "having" | "limit" | "offset" | "counter" | "counters";
|
|
122
|
+
export {};
|
|
123
|
+
//# sourceMappingURL=puri-subset.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"puri-subset.types.d.ts","sourceRoot":"","sources":["../../src/database/puri-subset.types.ts"],"names":[],"mappings":"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"}
|