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
|
@@ -1,2 +1,365 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get UpsertBuilder(){return UpsertBuilder},get isRefField(){return isRefField}});var _crypto=require("crypto");var _lodash=/*#__PURE__*/_interop_require_default(require("lodash"));var _entitymanager=require("../entity/entity-manager");var _utils=require("../utils/utils");var _batch_update=require("./_batch_update");function _array_like_to_array(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _array_with_holes(arr){if(Array.isArray(arr))return arr}function _array_without_holes(arr){if(Array.isArray(arr))return _array_like_to_array(arr)}function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{Promise.resolve(value).then(_next,_throw)}}function _async_to_generator(fn){return function(){var self=this,args=arguments;return new Promise(function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value)}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err)}_next(undefined)})}}function _class_call_check(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}function _create_class(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _instanceof(left,right){if(right!=null&&typeof Symbol!=="undefined"&&right[Symbol.hasInstance]){return!!right[Symbol.hasInstance](left)}else{return left instanceof right}}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _iterable_to_array(iter){if(typeof Symbol!=="undefined"&&iter[Symbol.iterator]!=null||iter["@@iterator"]!=null)return Array.from(iter)}function _iterable_to_array_limit(arr,i){var _i=arr==null?null:typeof Symbol!=="undefined"&&arr[Symbol.iterator]||arr["@@iterator"];if(_i==null)return;var _arr=[];var _n=true;var _d=false;var _s,_e;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i["return"]!=null)_i["return"]()}finally{if(_d)throw _e}}return _arr}function _non_iterable_rest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _non_iterable_spread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _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 _object_without_properties(source,excluded){if(source==null)return{};var target=_object_without_properties_loose(source,excluded);var key,i;if(Object.getOwnPropertySymbols){var sourceSymbolKeys=Object.getOwnPropertySymbols(source);for(i=0;i<sourceSymbolKeys.length;i++){key=sourceSymbolKeys[i];if(excluded.indexOf(key)>=0)continue;if(!Object.prototype.propertyIsEnumerable.call(source,key))continue;target[key]=source[key]}}return target}function _object_without_properties_loose(source,excluded){if(source==null)return{};var target={};var sourceKeys=Object.keys(source);var key,i;for(i=0;i<sourceKeys.length;i++){key=sourceKeys[i];if(excluded.indexOf(key)>=0)continue;target[key]=source[key]}return target}function _sliced_to_array(arr,i){return _array_with_holes(arr)||_iterable_to_array_limit(arr,i)||_unsupported_iterable_to_array(arr,i)||_non_iterable_rest()}function _to_consumable_array(arr){return _array_without_holes(arr)||_iterable_to_array(arr)||_unsupported_iterable_to_array(arr)||_non_iterable_spread()}function _type_of(obj){"@swc/helpers - typeof";return obj&&typeof Symbol!=="undefined"&&obj.constructor===Symbol?"symbol":typeof obj}function _unsupported_iterable_to_array(o,minLen){if(!o)return;if(typeof o==="string")return _array_like_to_array(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _array_like_to_array(o,minLen)}function _ts_generator(thisArg,body){var f,y,t,_={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},g=Object.create((typeof Iterator==="function"?Iterator:Object).prototype);return g.next=verb(0),g["throw"]=verb(1),g["return"]=verb(2),typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(g&&(g=0,op[0]&&(_=0)),_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(op[0]===6&&_.label<t[1]){_.label=t[1];t=op;break}if(t&&_.label<t[2]){_.label=t[2];_.ops.push(op);break}if(t[2])_.ops.pop();_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e];y=0}finally{f=t=0}if(op[0]&5)throw op[1];return{value:op[0]?op[1]:void 0,done:true}}}function isRefField(field){return field!==undefined&&field!==null&&field.of!==undefined&&field.uuid!==undefined}var UpsertBuilder=/*#__PURE__*/function(){"use strict";function UpsertBuilder(){_class_call_check(this,UpsertBuilder);_define_property(this,"tables",void 0);this.tables=new Map}_create_class(UpsertBuilder,[{key:"getTable",value:function getTable(tableName){var table=this.tables.get(tableName);if(table===undefined){var tableSpec=function(){try{return _entitymanager.EntityManager.getTableSpec(tableName)}catch(e){return null}}();var _tableSpec_uniqueIndexes;this.tables.set(tableName,{references:new Set,rows:[],uniqueIndexes:(_tableSpec_uniqueIndexes=tableSpec===null||tableSpec===void 0?void 0:tableSpec.uniqueIndexes)!==null&&_tableSpec_uniqueIndexes!==void 0?_tableSpec_uniqueIndexes:[],uniquesMap:new Map})}return this.tables.get(tableName)}},{key:"hasTable",value:function hasTable(tableName){return this.tables.has(tableName)}},{key:"register",value:function register(tableName,row){var table=this.getTable(tableName);var uniqueKeys=table.uniqueIndexes.map(function(unqIndex){var uniqueKeyArray=unqIndex.columns.map(function(unqCol){var val=row[unqCol];if(isRefField(val)){return val.uuid}else{var _row_unqCol;return(_row_unqCol=row[unqCol])!==null&&_row_unqCol!==void 0?_row_unqCol:(0,_crypto.randomUUID)()}});if(uniqueKeyArray.length===0){return null}return uniqueKeyArray.join("---delimiter--")}).filter(_utils.nonNullable);var uuid=function(){if(uniqueKeys.length>0){var _iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;try{for(var _iterator=uniqueKeys[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){var uniqueKey=_step.value;if(table.uniquesMap.has(uniqueKey)){return table.uniquesMap.get(uniqueKey)}}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}}return(0,_crypto.randomUUID)()}();if(uniqueKeys.length>0){var _iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;try{for(var _iterator=uniqueKeys[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){var uniqueKey=_step.value;table.uniquesMap.set(uniqueKey,uuid)}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}}row=Object.keys(row).reduce(function(r,rowKey){var rowValue=row[rowKey];if(isRefField(rowValue)){var _rowValue;var _use;(_use=(_rowValue=rowValue).use)!==null&&_use!==void 0?_use:_rowValue.use="id";table.references.add(rowValue.of+"."+rowValue.use);r[rowKey]=rowValue}else if((typeof rowValue==="undefined"?"undefined":_type_of(rowValue))==="object"&&!_instanceof(rowValue,Date)){r[rowKey]=rowValue===null?null:JSON.stringify(rowValue)}else{r[rowKey]=rowValue}return r},{});table.rows.push(_object_spread({uuid:uuid},row));var _row_uuid;return{of:tableName,uuid:(_row_uuid=row.uuid)!==null&&_row_uuid!==void 0?_row_uuid:uuid}}},{key:"upsert",value:function upsert(wdb,tableName,chunkSize){return _async_to_generator(function(){return _ts_generator(this,function(_state){return[2,this.upsertOrInsert(wdb,tableName,"upsert",chunkSize)]})}).call(this)}},{key:"insertOnly",value:function insertOnly(wdb,tableName,chunkSize){return _async_to_generator(function(){return _ts_generator(this,function(_state){return[2,this.upsertOrInsert(wdb,tableName,"insert",chunkSize)]})}).call(this)}},{key:"upsertOrInsert",value:function upsertOrInsert(wdb,tableName,mode,chunkSize){return _async_to_generator(function(){var table,_Array_from_reduce,references,refTables,extractFields,groups,_groups_normal,normalRows,_groups_selfRef,selfRefRows,chunks,uuidMap,_iteratorNormalCompletion,_didIteratorError,_iteratorError,_iterator,_step,chunk,q,uuids,upsertedRows,err,allIds,_allIds,selfRefIds;return _ts_generator(this,function(_state){switch(_state.label){case 0:if(this.hasTable(tableName)===false){return[2,[]]}table=this.tables.get(tableName);if(table===undefined){throw new Error("존재하지 않는 테이블 ".concat(tableName,"에 upsert 요청"))}else if(table.rows.length===0){throw new Error("".concat(tableName,"에 upsert 할 데이터가 없습니다."))}if(table.rows.some(function(row){return Object.entries(row).some(function(param){var _param=_sliced_to_array(param,2),value=_param[1];return isRefField(value)&&value.of!==tableName})})){throw new Error("".concat(tableName," 해결되지 않은 참조가 있습니다."))}_Array_from_reduce=Array.from(this.tables).reduce(function(r,param){var _param=_sliced_to_array(param,2),table=_param[1];var reference=Array.from(table.references.values()).find(function(ref){return ref.includes(tableName+".")});if(reference){r.references.push(reference);r.refTables.push(table)}return r},{references:[],refTables:[]}),references=_Array_from_reduce.references,refTables=_Array_from_reduce.refTables;extractFields=_lodash.default.uniq(references).map(function(reference){return reference.split(".")[1]});groups=_lodash.default.groupBy(table.rows,function(row){return Object.entries(row).some(function(param){var _param=_sliced_to_array(param,2),value=_param[1];return isRefField(value)})?"selfRef":"normal"});normalRows=(_groups_normal=groups.normal)!==null&&_groups_normal!==void 0?_groups_normal:[];selfRefRows=(_groups_selfRef=groups.selfRef)!==null&&_groups_selfRef!==void 0?_groups_selfRef:[];chunks=chunkSize?_lodash.default.chunk(normalRows,chunkSize):[normalRows];uuidMap=new Map;_iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;_state.label=1;case 1:_state.trys.push([1,10,11,12]);_iterator=chunks[Symbol.iterator]();_state.label=2;case 2:if(!!(_iteratorNormalCompletion=(_step=_iterator.next()).done))return[3,9];chunk=_step.value;q=wdb.insert(chunk).into(tableName);if(!(mode==="insert"))return[3,4];return[4,q];case 3:_state.sent();return[3,6];case 4:if(!(mode==="upsert"))return[3,6];return[4,q.onDuplicateUpdate.apply(q,Object.keys(normalRows[0]))];case 5:_state.sent();_state.label=6;case 6:uuids=chunk.map(function(row){return row.uuid});return[4,wdb(tableName).select(_lodash.default.uniq(["uuid","id"].concat(_to_consumable_array(extractFields)))).whereIn("uuid",uuids)];case 7:upsertedRows=_state.sent();upsertedRows.forEach(function(row){uuidMap.set(row.uuid,row)});_state.label=8;case 8:_iteratorNormalCompletion=true;return[3,2];case 9:return[3,12];case 10:err=_state.sent();_didIteratorError=true;_iteratorError=err;return[3,12];case 11:try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}return[7];case 12:refTables.map(function(table){table.rows=table.rows.map(function(row){Object.keys(row).map(function(key){var prop=row[key];if(isRefField(prop)&&prop.of===tableName){var parent=uuidMap.get(prop.uuid);if(parent===undefined){console.error(prop);throw new Error("존재하지 않는 uuid ".concat(prop.uuid," -- in ").concat(tableName))}var _prop_use;row[key]=parent[(_prop_use=prop.use)!==null&&_prop_use!==void 0?_prop_use:"id"]}});return row})});allIds=Array.from(uuidMap.values()).map(function(row){return row.id});if(!(selfRefRows.length>0))return[3,14];table.rows=selfRefRows;return[4,this.upsert(wdb,tableName,chunkSize)];case 13:selfRefIds=_state.sent();(_allIds=allIds).push.apply(_allIds,_to_consumable_array(selfRefIds));return[3,15];case 14:table.rows=[];table.references.clear();table.uniquesMap.clear();_state.label=15;case 15:return[2,allIds]}})}).call(this)}},{key:"updateBatch",value:function updateBatch(wdb,tableName,options){return _async_to_generator(function(){var table,_options_where,whereColumns,rows;return _ts_generator(this,function(_state){switch(_state.label){case 0:options=_lodash.default.defaults(options,{chunkSize:500,where:"id"});if(this.hasTable(tableName)===false){return[2]}table=this.tables.get(tableName);if(table.rows.length===0){return[2]}whereColumns=Array.isArray(options.where)?options.where:[(_options_where=options.where)!==null&&_options_where!==void 0?_options_where:"id"];rows=table.rows.map(function(_row){var uuid=_row.uuid,row=_object_without_properties(_row,["uuid"]);return row});return[4,(0,_batch_update.batchUpdate)(wdb,tableName,whereColumns,rows,options.chunkSize)];case 1:_state.sent();table.rows=[];table.references.clear();table.uniquesMap.clear();return[2]}})}).call(this)}}]);return UpsertBuilder}();
|
|
2
|
-
|
|
1
|
+
import { randomUUID } from "crypto";
|
|
2
|
+
import { unique } from "radashi";
|
|
3
|
+
import { EntityManager } from "../entity/entity-manager.js";
|
|
4
|
+
import { Naite } from "../naite/naite.js";
|
|
5
|
+
import { assertDefined, chunk, nonNullable } from "../utils/utils.js";
|
|
6
|
+
import { batchUpdate } from "./_batch_update.js";
|
|
7
|
+
export function isRefField(field) {
|
|
8
|
+
return field !== undefined && field !== null && field?.of !== undefined && field?.uuid !== undefined;
|
|
9
|
+
}
|
|
10
|
+
export class UpsertBuilder {
|
|
11
|
+
tables;
|
|
12
|
+
constructor(){
|
|
13
|
+
this.tables = new Map();
|
|
14
|
+
}
|
|
15
|
+
getTable(tableName) {
|
|
16
|
+
const table = this.tables.get(tableName);
|
|
17
|
+
if (table) {
|
|
18
|
+
return table;
|
|
19
|
+
}
|
|
20
|
+
const tableSpec = (()=>{
|
|
21
|
+
try {
|
|
22
|
+
return EntityManager.getTableSpec(tableName);
|
|
23
|
+
} catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
})();
|
|
27
|
+
const tableData = {
|
|
28
|
+
references: new Set(),
|
|
29
|
+
rows: [],
|
|
30
|
+
uniqueIndexes: tableSpec?.uniqueIndexes ?? [],
|
|
31
|
+
uniquesMap: new Map()
|
|
32
|
+
};
|
|
33
|
+
this.tables.set(tableName, tableData);
|
|
34
|
+
return tableData;
|
|
35
|
+
}
|
|
36
|
+
hasTable(tableName) {
|
|
37
|
+
return this.tables.has(tableName);
|
|
38
|
+
}
|
|
39
|
+
register(tableName, row) {
|
|
40
|
+
const table = this.getTable(tableName);
|
|
41
|
+
// 해당 테이블의 unique 인덱스를 순회하며 키 생성
|
|
42
|
+
const uniqueKeys = table.uniqueIndexes.map((unqIndex)=>{
|
|
43
|
+
const uniqueKeyArray = unqIndex.columns.map((unqCol)=>{
|
|
44
|
+
const val = row[unqCol];
|
|
45
|
+
if (isRefField(val)) {
|
|
46
|
+
return val.uuid;
|
|
47
|
+
} else {
|
|
48
|
+
return row[unqCol] ?? randomUUID(); // nullable인 경우 uuid로 랜덤값 삽입
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
// 값이 모두 null인 경우 키 생성 패스
|
|
52
|
+
if (uniqueKeyArray.length === 0) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
return uniqueKeyArray.join("---delimiter--");
|
|
56
|
+
}).filter(nonNullable);
|
|
57
|
+
// uuid 생성 로직
|
|
58
|
+
const { uuid, isReused } = (()=>{
|
|
59
|
+
// 키를 순회하여 이미 존재하는 키가 있는지 확인
|
|
60
|
+
if (uniqueKeys.length > 0) {
|
|
61
|
+
for (const uniqueKey of uniqueKeys){
|
|
62
|
+
if (table.uniquesMap.has(uniqueKey)) {
|
|
63
|
+
return {
|
|
64
|
+
uuid: assertDefined(table.uniquesMap.get(uniqueKey), "Unique key not found"),
|
|
65
|
+
isReused: true
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// 찾을 수 없는 경우 생성
|
|
71
|
+
return {
|
|
72
|
+
uuid: randomUUID(),
|
|
73
|
+
isReused: false
|
|
74
|
+
};
|
|
75
|
+
})();
|
|
76
|
+
// 모든 유니크키에 대해 유니크맵에 uuid 저장
|
|
77
|
+
if (uniqueKeys.length > 0) {
|
|
78
|
+
for (const uniqueKey of uniqueKeys){
|
|
79
|
+
table.uniquesMap.set(uniqueKey, uuid);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// 이 테이블에 사용된 RefField를 순회하여, 현재 테이블 정보에 어떤 필드를 참조하는지 추가
|
|
83
|
+
// 이 정보를 나중에 치환할 때 사용
|
|
84
|
+
row = Object.fromEntries(Object.entries(row).map(([rowKey, rowValue])=>{
|
|
85
|
+
if (isRefField(rowValue)) {
|
|
86
|
+
rowValue.use ??= "id";
|
|
87
|
+
table.references.add(`${rowValue.of}.${rowValue.use}`);
|
|
88
|
+
return [
|
|
89
|
+
rowKey,
|
|
90
|
+
rowValue
|
|
91
|
+
];
|
|
92
|
+
} else if (typeof rowValue === "object" && !(rowValue instanceof Date)) {
|
|
93
|
+
// object인 경우 JSON으로 변환
|
|
94
|
+
return [
|
|
95
|
+
rowKey,
|
|
96
|
+
rowValue === null ? null : JSON.stringify(rowValue)
|
|
97
|
+
];
|
|
98
|
+
} else {
|
|
99
|
+
return [
|
|
100
|
+
rowKey,
|
|
101
|
+
rowValue
|
|
102
|
+
];
|
|
103
|
+
}
|
|
104
|
+
}));
|
|
105
|
+
table.rows.push({
|
|
106
|
+
uuid,
|
|
107
|
+
...row
|
|
108
|
+
});
|
|
109
|
+
const result = {
|
|
110
|
+
of: tableName,
|
|
111
|
+
uuid: row.uuid ?? uuid
|
|
112
|
+
};
|
|
113
|
+
Naite.t("puri:ub-register", {
|
|
114
|
+
tableName,
|
|
115
|
+
uuid: result.uuid,
|
|
116
|
+
isUuidReused: isReused,
|
|
117
|
+
row
|
|
118
|
+
});
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
async upsert(wdb, tableName, chunkSize) {
|
|
122
|
+
return this.upsertOrInsert(wdb, tableName, "upsert", chunkSize);
|
|
123
|
+
}
|
|
124
|
+
async insertOnly(wdb, tableName, chunkSize) {
|
|
125
|
+
return this.upsertOrInsert(wdb, tableName, "insert", chunkSize);
|
|
126
|
+
}
|
|
127
|
+
async upsertOrInsert(wdb, tableName, mode, chunkSize) {
|
|
128
|
+
if (this.hasTable(tableName) === false) {
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
const table = this.tables.get(tableName);
|
|
132
|
+
if (table === undefined) {
|
|
133
|
+
throw new Error(`존재하지 않는 테이블 ${tableName}에 upsert 요청`);
|
|
134
|
+
} else if (table.rows.length === 0) {
|
|
135
|
+
throw new Error(`${tableName}에 upsert 할 데이터가 없습니다.`);
|
|
136
|
+
}
|
|
137
|
+
if (table.rows.some((row)=>Object.entries(row).some(([, value])=>isRefField(value) && value.of !== tableName))) {
|
|
138
|
+
throw new Error(`${tableName} 해결되지 않은 참조가 있습니다.`);
|
|
139
|
+
}
|
|
140
|
+
// 전체 테이블 순회하여 현재 테이블 참조하는 모든 테이블 추출
|
|
141
|
+
const { references, refTables } = Array.from(this.tables).reduce((r, [, table])=>{
|
|
142
|
+
const reference = Array.from(table.references.values()).find((ref)=>ref.includes(`${tableName}.`));
|
|
143
|
+
if (reference) {
|
|
144
|
+
r.references.push(reference);
|
|
145
|
+
r.refTables.push(table);
|
|
146
|
+
}
|
|
147
|
+
return r;
|
|
148
|
+
}, {
|
|
149
|
+
references: [],
|
|
150
|
+
refTables: []
|
|
151
|
+
});
|
|
152
|
+
const extractFields = unique(references).map((reference)=>reference.split(".")[1]).filter((field)=>field !== undefined);
|
|
153
|
+
// 의존성 순서에 따라 레벨별 그룹화 (자기 참조가 없으면 Level 0 하나)
|
|
154
|
+
const { levels, hasCircular } = this.buildInsertLevels(table.rows, tableName);
|
|
155
|
+
if (hasCircular) {
|
|
156
|
+
throw new Error(`${tableName}에 순환 자기 참조가 있습니다.`);
|
|
157
|
+
}
|
|
158
|
+
// upsert 모드일 때 유니크 인덱스가 없으면 에러
|
|
159
|
+
if (mode === "upsert" && table.uniqueIndexes.length === 0) {
|
|
160
|
+
throw new Error(`${tableName}에 unique index가 정의되지 않아 upsert를 할 수 없습니다.`);
|
|
161
|
+
}
|
|
162
|
+
const uuidMap = new Map();
|
|
163
|
+
const allIds = [];
|
|
164
|
+
// 레벨별로 순차 처리
|
|
165
|
+
for (const levelRows of levels){
|
|
166
|
+
// 이전 레벨에서 얻은 ID로 자기 참조 해결
|
|
167
|
+
const resolvedRows = levelRows.map((row)=>{
|
|
168
|
+
const resolved = {
|
|
169
|
+
...row
|
|
170
|
+
};
|
|
171
|
+
for (const [key, value] of Object.entries(row)){
|
|
172
|
+
if (isRefField(value) && value.of === tableName) {
|
|
173
|
+
const parent = uuidMap.get(value.uuid);
|
|
174
|
+
if (!parent) throw new Error(`존재하지 않는 uuid ${value.uuid} -- in ${tableName}`);
|
|
175
|
+
resolved[key] = parent[value.use ?? "id"];
|
|
176
|
+
Naite.t("puri:ub-ref-resolved", {
|
|
177
|
+
tableName,
|
|
178
|
+
field: key,
|
|
179
|
+
from: {
|
|
180
|
+
of: value.of,
|
|
181
|
+
uuid: value.uuid,
|
|
182
|
+
use: value.use ?? "id"
|
|
183
|
+
},
|
|
184
|
+
to: resolved[key]
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return resolved;
|
|
189
|
+
});
|
|
190
|
+
// 현재 레벨 upsert
|
|
191
|
+
const levelChunks = chunkSize ? chunk(resolvedRows, chunkSize) : [
|
|
192
|
+
resolvedRows
|
|
193
|
+
];
|
|
194
|
+
const selectFields = unique([
|
|
195
|
+
"uuid",
|
|
196
|
+
"id",
|
|
197
|
+
...extractFields
|
|
198
|
+
]);
|
|
199
|
+
for (const dataChunk of levelChunks){
|
|
200
|
+
if (dataChunk.length === 0) continue;
|
|
201
|
+
let resultRows;
|
|
202
|
+
if (mode === "insert") {
|
|
203
|
+
// INSERT 모드
|
|
204
|
+
await wdb.insert(dataChunk).into(tableName);
|
|
205
|
+
const uuids = dataChunk.map((r)=>r.uuid);
|
|
206
|
+
resultRows = await wdb(tableName).select(selectFields).whereIn("uuid", uuids);
|
|
207
|
+
} else {
|
|
208
|
+
// UPSERT 모드 (uniqueIndexes 이미 체크됨)
|
|
209
|
+
const conflictColumns = table.uniqueIndexes[0].columns;
|
|
210
|
+
const updateColumns = Object.keys(dataChunk[0]).filter((col)=>col !== "uuid" && !conflictColumns.includes(col));
|
|
211
|
+
// RETURNING으로 결과 받기
|
|
212
|
+
const query = wdb.insert(dataChunk).into(tableName).onConflict(conflictColumns);
|
|
213
|
+
// updateColumns가 비어있으면 ignore(), 아니면 merge()
|
|
214
|
+
if (updateColumns.length === 0) {
|
|
215
|
+
resultRows = await query.ignore().returning(selectFields);
|
|
216
|
+
} else {
|
|
217
|
+
resultRows = await query.merge(updateColumns).returning(selectFields);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// 양쪽 모드 공통 처리
|
|
221
|
+
for (const row of resultRows){
|
|
222
|
+
uuidMap.set(row.uuid, row);
|
|
223
|
+
allIds.push(row.id);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// 해당 테이블 참조를 실제 밸류로 변경
|
|
228
|
+
for (const table of refTables){
|
|
229
|
+
table.rows = table.rows.map((row)=>{
|
|
230
|
+
for (const key of Object.keys(row)){
|
|
231
|
+
const prop = row[key];
|
|
232
|
+
if (isRefField(prop) && prop.of === tableName) {
|
|
233
|
+
const parent = uuidMap.get(prop.uuid);
|
|
234
|
+
if (!parent) {
|
|
235
|
+
console.error(prop);
|
|
236
|
+
throw new Error(`존재하지 않는 uuid ${prop.uuid} -- in ${tableName}`);
|
|
237
|
+
}
|
|
238
|
+
const resolvedValue = parent[prop.use ?? "id"];
|
|
239
|
+
row[key] = resolvedValue;
|
|
240
|
+
Naite.t("puri:ub-ref-resolved", {
|
|
241
|
+
tableName,
|
|
242
|
+
field: key,
|
|
243
|
+
from: {
|
|
244
|
+
of: prop.of,
|
|
245
|
+
uuid: prop.uuid,
|
|
246
|
+
use: prop.use ?? "id"
|
|
247
|
+
},
|
|
248
|
+
to: resolvedValue
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return row;
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
// 해당 테이블의 데이터 초기화
|
|
256
|
+
table.rows = [];
|
|
257
|
+
table.references.clear();
|
|
258
|
+
table.uniquesMap.clear();
|
|
259
|
+
Naite.t("puri:ub-upserted", {
|
|
260
|
+
tableName,
|
|
261
|
+
mode,
|
|
262
|
+
rowCount: allIds.length,
|
|
263
|
+
returnedIds: allIds
|
|
264
|
+
});
|
|
265
|
+
return allIds;
|
|
266
|
+
}
|
|
267
|
+
async updateBatch(wdb, tableName, options) {
|
|
268
|
+
options = {
|
|
269
|
+
...options,
|
|
270
|
+
chunkSize: options?.chunkSize ?? 500,
|
|
271
|
+
where: options?.where ?? "id"
|
|
272
|
+
};
|
|
273
|
+
if (this.hasTable(tableName) === false) {
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const table = this.tables.get(tableName);
|
|
277
|
+
if (!table) {
|
|
278
|
+
throw new Error(`등록되지 않은 테이블 ${tableName}에 updateBatch 요청`);
|
|
279
|
+
} else if (table.rows.length === 0) {
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
const whereColumns = Array.isArray(options.where) ? options.where : [
|
|
283
|
+
options.where ?? "id"
|
|
284
|
+
];
|
|
285
|
+
const rows = table.rows.map((_row)=>{
|
|
286
|
+
const { uuid: _, ...row } = _row; // uuid 제외
|
|
287
|
+
return row;
|
|
288
|
+
});
|
|
289
|
+
await batchUpdate(wdb, tableName, whereColumns, rows, options.chunkSize);
|
|
290
|
+
Naite.t("puri:ub-batch-updated", {
|
|
291
|
+
tableName,
|
|
292
|
+
rowCount: rows.length,
|
|
293
|
+
whereColumns
|
|
294
|
+
});
|
|
295
|
+
// updateBatch 완료 후 처리된 데이터 제거
|
|
296
|
+
table.rows = [];
|
|
297
|
+
table.references.clear();
|
|
298
|
+
table.uniquesMap.clear();
|
|
299
|
+
}
|
|
300
|
+
// ============================================================================
|
|
301
|
+
// Private Helpers
|
|
302
|
+
// ============================================================================
|
|
303
|
+
/**
|
|
304
|
+
* rows를 의존성 순서에 따라 레벨별로 그룹화
|
|
305
|
+
* - 자기 참조 없는 경우 : 모든 rows가 Level 0
|
|
306
|
+
* - 자기 참조 있는 경우 : 자기 참조 관계를 위상 정렬하여 레벨별로 그룹화
|
|
307
|
+
*/ buildInsertLevels(rows, tableName) {
|
|
308
|
+
// 1. 자기 참조가 없으면 한 레벨로 처리
|
|
309
|
+
const hasSelfRef = rows.flatMap((row)=>Object.values(row)).some((value)=>isRefField(value) && value.of === tableName);
|
|
310
|
+
if (!hasSelfRef) return {
|
|
311
|
+
levels: [
|
|
312
|
+
rows
|
|
313
|
+
],
|
|
314
|
+
hasCircular: false
|
|
315
|
+
};
|
|
316
|
+
// 2. uuid → row 매핑 (중복 uuid 방지)
|
|
317
|
+
const rowByUuid = new Map();
|
|
318
|
+
for (const row of rows){
|
|
319
|
+
const uuid = row.uuid;
|
|
320
|
+
if (!uuid) throw new Error(`buildInsertLevels: uuid가 없는 row -- in ${tableName}`);
|
|
321
|
+
rowByUuid.set(uuid, row);
|
|
322
|
+
}
|
|
323
|
+
let pending = Array.from(rowByUuid.values());
|
|
324
|
+
const levels = [];
|
|
325
|
+
const inserted = new Set();
|
|
326
|
+
// 3. 레벨별 분류
|
|
327
|
+
while(pending.length > 0){
|
|
328
|
+
const currentLevel = [];
|
|
329
|
+
const nextPending = [];
|
|
330
|
+
for (const row of pending){
|
|
331
|
+
// 이 row가 참조하는 자기 참조들
|
|
332
|
+
const selfRefs = Object.values(row).filter((value)=>isRefField(value) && value.of === tableName);
|
|
333
|
+
// 참조하는 모든 uuid가 이미 inserted에 있어야 이번 레벨에 포함
|
|
334
|
+
const canInsert = selfRefs.every((ref)=>{
|
|
335
|
+
if (!rowByUuid.has(ref.uuid)) {
|
|
336
|
+
throw new Error(`존재하지 않는 uuid ${ref.uuid} -- in ${tableName}`);
|
|
337
|
+
}
|
|
338
|
+
return inserted.has(ref.uuid);
|
|
339
|
+
});
|
|
340
|
+
if (canInsert) {
|
|
341
|
+
currentLevel.push(row);
|
|
342
|
+
} else {
|
|
343
|
+
nextPending.push(row);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// 순환 참조 감지
|
|
347
|
+
if (currentLevel.length === 0) return {
|
|
348
|
+
levels: [],
|
|
349
|
+
hasCircular: true
|
|
350
|
+
};
|
|
351
|
+
// 레벨 확정 + inserted 갱신
|
|
352
|
+
levels.push(currentLevel);
|
|
353
|
+
for (const row of currentLevel){
|
|
354
|
+
inserted.add(row.uuid);
|
|
355
|
+
}
|
|
356
|
+
pending = nextPending;
|
|
357
|
+
}
|
|
358
|
+
return {
|
|
359
|
+
levels,
|
|
360
|
+
hasCircular: false
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS91cHNlcnQtYnVpbGRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IGFzc2VydERlZmluZWQsIGNodW5rLCBub25OdWxsYWJsZSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgYmF0Y2hVcGRhdGUsIHR5cGUgUm93V2l0aElkIH0gZnJvbSBcIi4vX2JhdGNoX3VwZGF0ZVwiO1xuXG50eXBlIFRhYmxlRGF0YSA9IHtcbiAgcmVmZXJlbmNlczogU2V0PHN0cmluZz47XG4gIHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG4gIHVuaXF1ZUluZGV4ZXM6IHsgbmFtZT86IHN0cmluZzsgY29sdW1uczogc3RyaW5nW10gfVtdO1xuICB1bmlxdWVzTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xufTtcbmV4cG9ydCB0eXBlIFVCUmVmID0ge1xuICB1dWlkOiBzdHJpbmc7XG4gIG9mOiBzdHJpbmc7XG4gIHVzZT86IHN0cmluZztcbn07XG5leHBvcnQgZnVuY3Rpb24gaXNSZWZGaWVsZChmaWVsZDogdW5rbm93bik6IGZpZWxkIGlzIFVCUmVmIHtcbiAgcmV0dXJuIChcbiAgICBmaWVsZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgZmllbGQgIT09IG51bGwgJiZcbiAgICAoZmllbGQgYXMgVUJSZWYpPy5vZiAhPT0gdW5kZWZpbmVkICYmXG4gICAgKGZpZWxkIGFzIFVCUmVmKT8udXVpZCAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbmV4cG9ydCBjbGFzcyBVcHNlcnRCdWlsZGVyIHtcbiAgdGFibGVzOiBNYXA8c3RyaW5nLCBUYWJsZURhdGE+O1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnRhYmxlcyA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIGdldFRhYmxlKHRhYmxlTmFtZTogc3RyaW5nKTogVGFibGVEYXRhIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldCh0YWJsZU5hbWUpO1xuICAgIGlmICh0YWJsZSkge1xuICAgICAgcmV0dXJuIHRhYmxlO1xuICAgIH1cblxuICAgIGNvbnN0IHRhYmxlU3BlYyA9ICgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRUYWJsZVNwZWModGFibGVOYW1lKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9KSgpO1xuXG4gICAgY29uc3QgdGFibGVEYXRhID0ge1xuICAgICAgcmVmZXJlbmNlczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICByb3dzOiBbXSxcbiAgICAgIHVuaXF1ZUluZGV4ZXM6IHRhYmxlU3BlYz8udW5pcXVlSW5kZXhlcyA/PyBbXSxcbiAgICAgIHVuaXF1ZXNNYXA6IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCksXG4gICAgfTtcbiAgICB0aGlzLnRhYmxlcy5zZXQodGFibGVOYW1lLCB0YWJsZURhdGEpO1xuICAgIHJldHVybiB0YWJsZURhdGE7XG4gIH1cblxuICBoYXNUYWJsZSh0YWJsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhYmxlcy5oYXModGFibGVOYW1lKTtcbiAgfVxuXG4gIHJlZ2lzdGVyPFQgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIHJvdzoge1xuICAgICAgW2tleSBpbiBUXT86IFVCUmVmIHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IGJpZ2ludCB8IG51bGwgfCBvYmplY3QgfCB1bmtub3duO1xuICAgIH0sXG4gICk6IFVCUmVmIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuZ2V0VGFibGUodGFibGVOYW1lKTtcblxuICAgIC8vIO2VtOuLuSDthYzsnbTruJTsnZggdW5pcXVlIOyduOuNseyKpOulvCDsiJztmoztlZjrqbAg7YKkIOyDneyEsVxuICAgIGNvbnN0IHVuaXF1ZUtleXMgPSB0YWJsZS51bmlxdWVJbmRleGVzXG4gICAgICAubWFwKCh1bnFJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB1bmlxdWVLZXlBcnJheSA9IHVucUluZGV4LmNvbHVtbnMubWFwKCh1bnFDb2wpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWwgPSByb3dbdW5xQ29sIGFzIGtleW9mIHR5cGVvZiByb3ddO1xuICAgICAgICAgIGlmIChpc1JlZkZpZWxkKHZhbCkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWwudXVpZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJvd1t1bnFDb2wgYXMga2V5b2YgdHlwZW9mIHJvd10gPz8gcmFuZG9tVVVJRCgpOyAvLyBudWxsYWJsZeyduCDqsr3smrAgdXVpZOuhnCDrnpzrjaTqsJIg7IK97J6FXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyDqsJLsnbQg66qo65GQIG51bGzsnbgg6rK97JqwIO2CpCDsg53shLEg7Yyo7IqkXG4gICAgICAgIGlmICh1bmlxdWVLZXlBcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5pcXVlS2V5QXJyYXkuam9pbihcIi0tLWRlbGltaXRlci0tXCIpO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpO1xuXG4gICAgLy8gdXVpZCDsg53shLEg66Gc7KeBXG4gICAgY29uc3QgeyB1dWlkLCBpc1JldXNlZCB9ID0gKCgpID0+IHtcbiAgICAgIC8vIO2CpOulvCDsiJztmoztlZjsl6wg7J2066+4IOyhtOyerO2VmOuKlCDtgqTqsIAg7J6I64qU7KeAIO2ZleyduFxuICAgICAgaWYgKHVuaXF1ZUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHVuaXF1ZUtleSBvZiB1bmlxdWVLZXlzKSB7XG4gICAgICAgICAgaWYgKHRhYmxlLnVuaXF1ZXNNYXAuaGFzKHVuaXF1ZUtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHV1aWQ6IGFzc2VydERlZmluZWQodGFibGUudW5pcXVlc01hcC5nZXQodW5pcXVlS2V5KSwgXCJVbmlxdWUga2V5IG5vdCBmb3VuZFwiKSxcbiAgICAgICAgICAgICAgaXNSZXVzZWQ6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDssL7snYQg7IiYIOyXhuuKlCDqsr3smrAg7IOd7ISxXG4gICAgICByZXR1cm4geyB1dWlkOiByYW5kb21VVUlEKCksIGlzUmV1c2VkOiBmYWxzZSB9O1xuICAgIH0pKCk7XG5cbiAgICAvLyDrqqjrk6Ag7Jyg64uI7YGs7YKk7JeQIOuMgO2VtCDsnKDri4jtgazrp7Xsl5AgdXVpZCDsoIDsnqVcbiAgICBpZiAodW5pcXVlS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IHVuaXF1ZUtleSBvZiB1bmlxdWVLZXlzKSB7XG4gICAgICAgIHRhYmxlLnVuaXF1ZXNNYXAuc2V0KHVuaXF1ZUtleSwgdXVpZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7J20IO2FjOydtOu4lOyXkCDsgqzsmqnrkJwgUmVmRmllbGTrpbwg7Iic7ZqM7ZWY7JesLCDtmITsnqwg7YWM7J2067iUIOygleuztOyXkCDslrTrlqQg7ZWE65Oc66W8IOywuOyhsO2VmOuKlOyngCDstpTqsIBcbiAgICAvLyDsnbQg7KCV67O066W8IOuCmOykkeyXkCDsuZjtmZjtlaAg65WMIOyCrOyaqVxuICAgIHJvdyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJvdykubWFwKChbcm93S2V5LCByb3dWYWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKGlzUmVmRmllbGQocm93VmFsdWUpKSB7XG4gICAgICAgICAgcm93VmFsdWUudXNlID8/PSBcImlkXCI7XG4gICAgICAgICAgdGFibGUucmVmZXJlbmNlcy5hZGQoYCR7cm93VmFsdWUub2Z9LiR7cm93VmFsdWUudXNlfWApO1xuICAgICAgICAgIHJldHVybiBbcm93S2V5LCByb3dWYWx1ZV07XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJvd1ZhbHVlID09PSBcIm9iamVjdFwiICYmICEocm93VmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgIC8vIG9iamVjdOyduCDqsr3smrAgSlNPTuycvOuhnCDrs4DtmZhcbiAgICAgICAgICByZXR1cm4gW3Jvd0tleSwgcm93VmFsdWUgPT09IG51bGwgPyBudWxsIDogSlNPTi5zdHJpbmdpZnkocm93VmFsdWUpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW3Jvd0tleSwgcm93VmFsdWVdO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApIGFzIHsgW2tleSBpbiBUXT86IHVua25vd24gfTtcblxuICAgIHRhYmxlLnJvd3MucHVzaCh7XG4gICAgICB1dWlkLFxuICAgICAgLi4ucm93LFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0OiBVQlJlZiA9IHtcbiAgICAgIG9mOiB0YWJsZU5hbWUsXG4gICAgICB1dWlkOiAocm93IGFzIHsgdXVpZD86IHN0cmluZyB9KS51dWlkID8/IHV1aWQsXG4gICAgfTtcblxuICAgIE5haXRlLnQoXCJwdXJpOnViLXJlZ2lzdGVyXCIsIHtcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHV1aWQ6IHJlc3VsdC51dWlkLFxuICAgICAgaXNVdWlkUmV1c2VkOiBpc1JldXNlZCxcbiAgICAgIHJvdyxcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyB1cHNlcnQod2RiOiBLbmV4LCB0YWJsZU5hbWU6IHN0cmluZywgY2h1bmtTaXplPzogbnVtYmVyKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnVwc2VydE9ySW5zZXJ0KHdkYiwgdGFibGVOYW1lLCBcInVwc2VydFwiLCBjaHVua1NpemUpO1xuICB9XG4gIGFzeW5jIGluc2VydE9ubHkod2RiOiBLbmV4LCB0YWJsZU5hbWU6IHN0cmluZywgY2h1bmtTaXplPzogbnVtYmVyKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnVwc2VydE9ySW5zZXJ0KHdkYiwgdGFibGVOYW1lLCBcImluc2VydFwiLCBjaHVua1NpemUpO1xuICB9XG5cbiAgYXN5bmMgdXBzZXJ0T3JJbnNlcnQoXG4gICAgd2RiOiBLbmV4LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIG1vZGU6IFwidXBzZXJ0XCIgfCBcImluc2VydFwiLFxuICAgIGNodW5rU2l6ZT86IG51bWJlcixcbiAgKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGlmICh0aGlzLmhhc1RhYmxlKHRhYmxlTmFtZSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnRhYmxlcy5nZXQodGFibGVOYW1lKTtcbiAgICBpZiAodGFibGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIO2FjOydtOu4lCAke3RhYmxlTmFtZX3sl5AgdXBzZXJ0IOyalOyyrWApO1xuICAgIH0gZWxzZSBpZiAodGFibGUucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0YWJsZU5hbWV97JeQIHVwc2VydCDtlaAg642w7J207YSw6rCAIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0YWJsZS5yb3dzLnNvbWUoKHJvdykgPT5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMocm93KS5zb21lKChbLCB2YWx1ZV0pID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mICE9PSB0YWJsZU5hbWUpLFxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhYmxlTmFtZX0g7ZW06rKw65CY7KeAIOyViuydgCDssLjsobDqsIAg7J6I7Iq164uI64ukLmApO1xuICAgIH1cblxuICAgIC8vIOyghOyytCDthYzsnbTruJQg7Iic7ZqM7ZWY7JesIO2YhOyerCDthYzsnbTruJQg7LC47KGw7ZWY64qUIOuqqOuToCDthYzsnbTruJQg7LaU7LacXG4gICAgY29uc3QgeyByZWZlcmVuY2VzLCByZWZUYWJsZXMgfSA9IEFycmF5LmZyb20odGhpcy50YWJsZXMpLnJlZHVjZShcbiAgICAgIChyLCBbLCB0YWJsZV0pID0+IHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlID0gQXJyYXkuZnJvbSh0YWJsZS5yZWZlcmVuY2VzLnZhbHVlcygpKS5maW5kKChyZWYpID0+XG4gICAgICAgICAgcmVmLmluY2x1ZGVzKGAke3RhYmxlTmFtZX0uYCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZWZlcmVuY2UpIHtcbiAgICAgICAgICByLnJlZmVyZW5jZXMucHVzaChyZWZlcmVuY2UpO1xuICAgICAgICAgIHIucmVmVGFibGVzLnB1c2godGFibGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICByZWZlcmVuY2VzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgcmVmVGFibGVzOiBbXSBhcyBUYWJsZURhdGFbXSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBjb25zdCBleHRyYWN0RmllbGRzID0gdW5pcXVlKHJlZmVyZW5jZXMpXG4gICAgICAubWFwKChyZWZlcmVuY2UpID0+IHJlZmVyZW5jZS5zcGxpdChcIi5cIilbMV0pXG4gICAgICAuZmlsdGVyKChmaWVsZCk6IGZpZWxkIGlzIHN0cmluZyA9PiBmaWVsZCAhPT0gdW5kZWZpbmVkKTtcblxuICAgIC8vIOydmOyhtOyEsSDsiJzshJzsl5Ag65Sw6528IOugiOuyqOuzhCDqt7jro7ntmZQgKOyekOq4sCDssLjsobDqsIAg7JeG7Jy866m0IExldmVsIDAg7ZWY64KYKVxuICAgIGNvbnN0IHsgbGV2ZWxzLCBoYXNDaXJjdWxhciB9ID0gdGhpcy5idWlsZEluc2VydExldmVscyh0YWJsZS5yb3dzLCB0YWJsZU5hbWUpO1xuXG4gICAgaWYgKGhhc0NpcmN1bGFyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFibGVOYW1lfeyXkCDsiJztmZgg7J6Q6riwIOywuOyhsOqwgCDsnojsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgLy8gdXBzZXJ0IOuqqOuTnOydvCDrlYwg7Jyg64uI7YGsIOyduOuNseyKpOqwgCDsl4bsnLzrqbQg7JeQ65+sXG4gICAgaWYgKG1vZGUgPT09IFwidXBzZXJ0XCIgJiYgdGFibGUudW5pcXVlSW5kZXhlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0YWJsZU5hbWV97JeQIHVuaXF1ZSBpbmRleOqwgCDsoJXsnZjrkJjsp4Ag7JWK7JWEIHVwc2VydOulvCDtlaAg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCB1dWlkTWFwID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG4gICAgY29uc3QgYWxsSWRzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgLy8g66CI67Ko67OE66GcIOyInOywqCDsspjrpqxcbiAgICBmb3IgKGNvbnN0IGxldmVsUm93cyBvZiBsZXZlbHMpIHtcbiAgICAgIC8vIOydtOyghCDroIjrsqjsl5DshJwg7Ja77J2AIElE66GcIOyekOq4sCDssLjsobAg7ZW06rKwXG4gICAgICBjb25zdCByZXNvbHZlZFJvd3MgPSBsZXZlbFJvd3MubWFwKChyb3cpID0+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB7IC4uLnJvdyB9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyb3cpKSB7XG4gICAgICAgICAgaWYgKGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHV1aWRNYXAuZ2V0KHZhbHVlLnV1aWQpO1xuXG4gICAgICAgICAgICBpZiAoIXBhcmVudCkgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHt2YWx1ZS51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcblxuICAgICAgICAgICAgcmVzb2x2ZWRba2V5XSA9IChwYXJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3ZhbHVlLnVzZSA/PyBcImlkXCJdO1xuXG4gICAgICAgICAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWYtcmVzb2x2ZWRcIiwge1xuICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBrZXksXG4gICAgICAgICAgICAgIGZyb206IHsgb2Y6IHZhbHVlLm9mLCB1dWlkOiB2YWx1ZS51dWlkLCB1c2U6IHZhbHVlLnVzZSA/PyBcImlkXCIgfSxcbiAgICAgICAgICAgICAgdG86IHJlc29sdmVkW2tleV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIO2YhOyerCDroIjrsqggdXBzZXJ0XG4gICAgICBjb25zdCBsZXZlbENodW5rcyA9IGNodW5rU2l6ZSA/IGNodW5rKHJlc29sdmVkUm93cywgY2h1bmtTaXplKSA6IFtyZXNvbHZlZFJvd3NdO1xuICAgICAgY29uc3Qgc2VsZWN0RmllbGRzID0gdW5pcXVlKFtcInV1aWRcIiwgXCJpZFwiLCAuLi5leHRyYWN0RmllbGRzXSk7XG5cbiAgICAgIGZvciAoY29uc3QgZGF0YUNodW5rIG9mIGxldmVsQ2h1bmtzKSB7XG4gICAgICAgIGlmIChkYXRhQ2h1bmsubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICBsZXQgcmVzdWx0Um93czogeyB1dWlkOiBzdHJpbmc7IGlkOiBudW1iZXI7IFtrZXk6IHN0cmluZ106IHVua25vd24gfVtdO1xuXG4gICAgICAgIGlmIChtb2RlID09PSBcImluc2VydFwiKSB7XG4gICAgICAgICAgLy8gSU5TRVJUIOuqqOuTnFxuICAgICAgICAgIGF3YWl0IHdkYi5pbnNlcnQoZGF0YUNodW5rKS5pbnRvKHRhYmxlTmFtZSk7XG5cbiAgICAgICAgICBjb25zdCB1dWlkcyA9IGRhdGFDaHVuay5tYXAoKHIpID0+IHIudXVpZCk7XG4gICAgICAgICAgcmVzdWx0Um93cyA9IGF3YWl0IHdkYih0YWJsZU5hbWUpXG4gICAgICAgICAgICAuc2VsZWN0KHNlbGVjdEZpZWxkcylcbiAgICAgICAgICAgIC53aGVyZUluKFwidXVpZFwiLCB1dWlkcyBhcyByZWFkb25seSBzdHJpbmdbXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVVBTRVJUIOuqqOuTnCAodW5pcXVlSW5kZXhlcyDsnbTrr7gg7LK07YGs65CoKVxuICAgICAgICAgIGNvbnN0IGNvbmZsaWN0Q29sdW1ucyA9IHRhYmxlLnVuaXF1ZUluZGV4ZXNbMF0uY29sdW1ucztcbiAgICAgICAgICBjb25zdCB1cGRhdGVDb2x1bW5zID0gT2JqZWN0LmtleXMoZGF0YUNodW5rWzBdKS5maWx0ZXIoXG4gICAgICAgICAgICAoY29sKSA9PiBjb2wgIT09IFwidXVpZFwiICYmICFjb25mbGljdENvbHVtbnMuaW5jbHVkZXMoY29sKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gUkVUVVJOSU5H7Jy866GcIOqysOqzvCDrsJvquLBcbiAgICAgICAgICBjb25zdCBxdWVyeSA9IHdkYi5pbnNlcnQoZGF0YUNodW5rKS5pbnRvKHRhYmxlTmFtZSkub25Db25mbGljdChjb25mbGljdENvbHVtbnMpO1xuXG4gICAgICAgICAgLy8gdXBkYXRlQ29sdW1uc+qwgCDruYTslrTsnojsnLzrqbQgaWdub3JlKCksIOyVhOuLiOuptCBtZXJnZSgpXG4gICAgICAgICAgaWYgKHVwZGF0ZUNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXN1bHRSb3dzID0gYXdhaXQgcXVlcnkuaWdub3JlKCkucmV0dXJuaW5nKHNlbGVjdEZpZWxkcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdFJvd3MgPSBhd2FpdCBxdWVyeS5tZXJnZSh1cGRhdGVDb2x1bW5zKS5yZXR1cm5pbmcoc2VsZWN0RmllbGRzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDslpHsqr0g66qo65OcIOqzte2GtSDsspjrpqxcbiAgICAgICAgZm9yIChjb25zdCByb3cgb2YgcmVzdWx0Um93cykge1xuICAgICAgICAgIHV1aWRNYXAuc2V0KHJvdy51dWlkLCByb3cpO1xuICAgICAgICAgIGFsbElkcy5wdXNoKHJvdy5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtlbTri7kg7YWM7J2067iUIOywuOyhsOulvCDsi6TsoJwg67C466WY66GcIOuzgOqyvVxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgcmVmVGFibGVzKSB7XG4gICAgICB0YWJsZS5yb3dzID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyb3cpKSB7XG4gICAgICAgICAgY29uc3QgcHJvcCA9IHJvd1trZXldO1xuICAgICAgICAgIGlmIChpc1JlZkZpZWxkKHByb3ApICYmIHByb3Aub2YgPT09IHRhYmxlTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdXVpZE1hcC5nZXQocHJvcC51dWlkKTtcbiAgICAgICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocHJvcCk7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB1dWlkICR7cHJvcC51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVmFsdWUgPSAocGFyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwcm9wLnVzZSA/PyBcImlkXCJdO1xuICAgICAgICAgICAgcm93W2tleV0gPSByZXNvbHZlZFZhbHVlO1xuXG4gICAgICAgICAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWYtcmVzb2x2ZWRcIiwge1xuICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBrZXksXG4gICAgICAgICAgICAgIGZyb206IHsgb2Y6IHByb3Aub2YsIHV1aWQ6IHByb3AudXVpZCwgdXNlOiBwcm9wLnVzZSA/PyBcImlkXCIgfSxcbiAgICAgICAgICAgICAgdG86IHJlc29sdmVkVmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIO2VtOuLuSDthYzsnbTruJTsnZgg642w7J207YSwIOy0iOq4sO2ZlFxuICAgIHRhYmxlLnJvd3MgPSBbXTtcbiAgICB0YWJsZS5yZWZlcmVuY2VzLmNsZWFyKCk7XG4gICAgdGFibGUudW5pcXVlc01hcC5jbGVhcigpO1xuXG4gICAgTmFpdGUudChcInB1cmk6dWItdXBzZXJ0ZWRcIiwge1xuICAgICAgdGFibGVOYW1lLFxuICAgICAgbW9kZSxcbiAgICAgIHJvd0NvdW50OiBhbGxJZHMubGVuZ3RoLFxuICAgICAgcmV0dXJuZWRJZHM6IGFsbElkcyxcbiAgICB9KTtcblxuICAgIHJldHVybiBhbGxJZHM7XG4gIH1cblxuICBhc3luYyB1cGRhdGVCYXRjaChcbiAgICB3ZGI6IEtuZXgsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGNodW5rU2l6ZT86IG51bWJlcjtcbiAgICAgIHdoZXJlPzogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgfSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBjaHVua1NpemU6IG9wdGlvbnM/LmNodW5rU2l6ZSA/PyA1MDAsXG4gICAgICB3aGVyZTogb3B0aW9ucz8ud2hlcmUgPz8gXCJpZFwiLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5oYXNUYWJsZSh0YWJsZU5hbWUpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldCh0YWJsZU5hbWUpO1xuICAgIGlmICghdGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg65Ox66Gd65CY7KeAIOyViuydgCDthYzsnbTruJQgJHt0YWJsZU5hbWV97JeQIHVwZGF0ZUJhdGNoIOyalOyyrWApO1xuICAgIH0gZWxzZSBpZiAodGFibGUucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3aGVyZUNvbHVtbnMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMud2hlcmUpID8gb3B0aW9ucy53aGVyZSA6IFtvcHRpb25zLndoZXJlID8/IFwiaWRcIl07XG4gICAgY29uc3Qgcm93cyA9IHRhYmxlLnJvd3MubWFwKChfcm93KSA9PiB7XG4gICAgICBjb25zdCB7IHV1aWQ6IF8sIC4uLnJvdyB9ID0gX3JvdzsgLy8gdXVpZCDsoJzsmbhcbiAgICAgIHJldHVybiByb3cgYXMgUm93V2l0aElkPHN0cmluZz47XG4gICAgfSk7XG5cbiAgICBhd2FpdCBiYXRjaFVwZGF0ZSh3ZGIsIHRhYmxlTmFtZSwgd2hlcmVDb2x1bW5zLCByb3dzLCBvcHRpb25zLmNodW5rU2l6ZSk7XG5cbiAgICBOYWl0ZS50KFwicHVyaTp1Yi1iYXRjaC11cGRhdGVkXCIsIHtcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHJvd0NvdW50OiByb3dzLmxlbmd0aCxcbiAgICAgIHdoZXJlQ29sdW1ucyxcbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZUJhdGNoIOyZhOujjCDtm4Qg7LKY66as65CcIOuNsOydtO2EsCDsoJzqsbBcbiAgICB0YWJsZS5yb3dzID0gW107XG4gICAgdGFibGUucmVmZXJlbmNlcy5jbGVhcigpO1xuICAgIHRhYmxlLnVuaXF1ZXNNYXAuY2xlYXIoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUHJpdmF0ZSBIZWxwZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogcm93c+ulvCDsnZjsobTshLEg7Iic7ISc7JeQIOuUsOudvCDroIjrsqjrs4TroZwg6re466O57ZmUXG4gICAqIC0g7J6Q6riwIOywuOyhsCDsl4bripQg6rK97JqwIDog66qo65OgIHJvd3PqsIAgTGV2ZWwgMFxuICAgKiAtIOyekOq4sCDssLjsobAg7J6I64qUIOqyveyasCA6IOyekOq4sCDssLjsobAg6rSA6rOE66W8IOychOyDgSDsoJXroKztlZjsl6wg66CI67Ko67OE66GcIOq3uOujue2ZlFxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEluc2VydExldmVscyhcbiAgICByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiB7IGxldmVsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXVtdOyBoYXNDaXJjdWxhcjogYm9vbGVhbiB9IHtcbiAgICAvLyAxLiDsnpDquLAg7LC47KGw6rCAIOyXhuycvOuptCDtlZwg66CI67Ko66GcIOyymOumrFxuICAgIGNvbnN0IGhhc1NlbGZSZWYgPSByb3dzXG4gICAgICAuZmxhdE1hcCgocm93KSA9PiBPYmplY3QudmFsdWVzKHJvdykpXG4gICAgICAuc29tZSgodmFsdWUpID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUpO1xuICAgIGlmICghaGFzU2VsZlJlZikgcmV0dXJuIHsgbGV2ZWxzOiBbcm93c10sIGhhc0NpcmN1bGFyOiBmYWxzZSB9O1xuXG4gICAgLy8gMi4gdXVpZCDihpIgcm93IOunpO2VkSAo7KSR67O1IHV1aWQg67Cp7KeAKVxuICAgIGNvbnN0IHJvd0J5VXVpZCA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBjb25zdCB1dWlkID0gcm93LnV1aWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCF1dWlkKSB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkSW5zZXJ0TGV2ZWxzOiB1dWlk6rCAIOyXhuuKlCByb3cgLS0gaW4gJHt0YWJsZU5hbWV9YCk7XG4gICAgICByb3dCeVV1aWQuc2V0KHV1aWQsIHJvdyk7XG4gICAgfVxuXG4gICAgbGV0IHBlbmRpbmcgPSBBcnJheS5mcm9tKHJvd0J5VXVpZC52YWx1ZXMoKSk7XG4gICAgY29uc3QgbGV2ZWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdW10gPSBbXTtcbiAgICBjb25zdCBpbnNlcnRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgLy8gMy4g66CI67Ko67OEIOu2hOulmFxuICAgIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuICAgICAgY29uc3QgbmV4dFBlbmRpbmc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCByb3cgb2YgcGVuZGluZykge1xuICAgICAgICAvLyDsnbQgcm936rCAIOywuOyhsO2VmOuKlCDsnpDquLAg7LC47KGw65OkXG4gICAgICAgIGNvbnN0IHNlbGZSZWZzID0gT2JqZWN0LnZhbHVlcyhyb3cpLmZpbHRlcihcbiAgICAgICAgICAodmFsdWUpID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUsXG4gICAgICAgICkgYXMgVUJSZWZbXTtcblxuICAgICAgICAvLyDssLjsobDtlZjripQg66qo65OgIHV1aWTqsIAg7J2066+4IGluc2VydGVk7JeQIOyeiOyWtOyVvCDsnbTrsogg66CI67Ko7JeQIO2PrO2VqFxuICAgICAgICBjb25zdCBjYW5JbnNlcnQgPSBzZWxmUmVmcy5ldmVyeSgocmVmKSA9PiB7XG4gICAgICAgICAgaWYgKCFyb3dCeVV1aWQuaGFzKHJlZi51dWlkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHtyZWYudXVpZH0gLS0gaW4gJHt0YWJsZU5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpbnNlcnRlZC5oYXMocmVmLnV1aWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY2FuSW5zZXJ0KSB7XG4gICAgICAgICAgY3VycmVudExldmVsLnB1c2gocm93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0UGVuZGluZy5wdXNoKHJvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7Iic7ZmYIOywuOyhsCDqsJDsp4BcbiAgICAgIGlmIChjdXJyZW50TGV2ZWwubGVuZ3RoID09PSAwKSByZXR1cm4geyBsZXZlbHM6IFtdLCBoYXNDaXJjdWxhcjogdHJ1ZSB9O1xuXG4gICAgICAvLyDroIjrsqgg7ZmV7KCVICsgaW5zZXJ0ZWQg6rCx7IugXG4gICAgICBsZXZlbHMucHVzaChjdXJyZW50TGV2ZWwpO1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgY3VycmVudExldmVsKSB7XG4gICAgICAgIGluc2VydGVkLmFkZChyb3cudXVpZCBhcyBzdHJpbmcpO1xuICAgICAgfVxuXG4gICAgICBwZW5kaW5nID0gbmV4dFBlbmRpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbGV2ZWxzLCBoYXNDaXJjdWxhcjogZmFsc2UgfTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbInJhbmRvbVVVSUQiLCJ1bmlxdWUiLCJFbnRpdHlNYW5hZ2VyIiwiTmFpdGUiLCJhc3NlcnREZWZpbmVkIiwiY2h1bmsiLCJub25OdWxsYWJsZSIsImJhdGNoVXBkYXRlIiwiaXNSZWZGaWVsZCIsImZpZWxkIiwidW5kZWZpbmVkIiwib2YiLCJ1dWlkIiwiVXBzZXJ0QnVpbGRlciIsInRhYmxlcyIsIk1hcCIsImdldFRhYmxlIiwidGFibGVOYW1lIiwidGFibGUiLCJnZXQiLCJ0YWJsZVNwZWMiLCJnZXRUYWJsZVNwZWMiLCJ0YWJsZURhdGEiLCJyZWZlcmVuY2VzIiwiU2V0Iiwicm93cyIsInVuaXF1ZUluZGV4ZXMiLCJ1bmlxdWVzTWFwIiwic2V0IiwiaGFzVGFibGUiLCJoYXMiLCJyZWdpc3RlciIsInJvdyIsInVuaXF1ZUtleXMiLCJtYXAiLCJ1bnFJbmRleCIsInVuaXF1ZUtleUFycmF5IiwiY29sdW1ucyIsInVucUNvbCIsInZhbCIsImxlbmd0aCIsImpvaW4iLCJmaWx0ZXIiLCJpc1JldXNlZCIsInVuaXF1ZUtleSIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwiZW50cmllcyIsInJvd0tleSIsInJvd1ZhbHVlIiwidXNlIiwiYWRkIiwiRGF0ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJwdXNoIiwicmVzdWx0IiwidCIsImlzVXVpZFJldXNlZCIsInVwc2VydCIsIndkYiIsImNodW5rU2l6ZSIsInVwc2VydE9ySW5zZXJ0IiwiaW5zZXJ0T25seSIsIm1vZGUiLCJFcnJvciIsInNvbWUiLCJ2YWx1ZSIsInJlZlRhYmxlcyIsIkFycmF5IiwiZnJvbSIsInJlZHVjZSIsInIiLCJyZWZlcmVuY2UiLCJ2YWx1ZXMiLCJmaW5kIiwicmVmIiwiaW5jbHVkZXMiLCJleHRyYWN0RmllbGRzIiwic3BsaXQiLCJsZXZlbHMiLCJoYXNDaXJjdWxhciIsImJ1aWxkSW5zZXJ0TGV2ZWxzIiwidXVpZE1hcCIsImFsbElkcyIsImxldmVsUm93cyIsInJlc29sdmVkUm93cyIsInJlc29sdmVkIiwia2V5IiwicGFyZW50IiwidG8iLCJsZXZlbENodW5rcyIsInNlbGVjdEZpZWxkcyIsImRhdGFDaHVuayIsInJlc3VsdFJvd3MiLCJpbnNlcnQiLCJpbnRvIiwidXVpZHMiLCJzZWxlY3QiLCJ3aGVyZUluIiwiY29uZmxpY3RDb2x1bW5zIiwidXBkYXRlQ29sdW1ucyIsImtleXMiLCJjb2wiLCJxdWVyeSIsIm9uQ29uZmxpY3QiLCJpZ25vcmUiLCJyZXR1cm5pbmciLCJtZXJnZSIsImlkIiwicHJvcCIsImNvbnNvbGUiLCJlcnJvciIsInJlc29sdmVkVmFsdWUiLCJjbGVhciIsInJvd0NvdW50IiwicmV0dXJuZWRJZHMiLCJ1cGRhdGVCYXRjaCIsIm9wdGlvbnMiLCJ3aGVyZSIsIndoZXJlQ29sdW1ucyIsImlzQXJyYXkiLCJfcm93IiwiXyIsImhhc1NlbGZSZWYiLCJmbGF0TWFwIiwicm93QnlVdWlkIiwicGVuZGluZyIsImluc2VydGVkIiwiY3VycmVudExldmVsIiwibmV4dFBlbmRpbmciLCJzZWxmUmVmcyIsImNhbkluc2VydCIsImV2ZXJ5Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxVQUFVLFFBQVEsU0FBUztBQUVwQyxTQUFTQyxNQUFNLFFBQVEsVUFBVTtBQUNqQyxTQUFTQyxhQUFhLFFBQVEsOEJBQTJCO0FBQ3pELFNBQVNDLEtBQUssUUFBUSxvQkFBaUI7QUFDdkMsU0FBU0MsYUFBYSxFQUFFQyxLQUFLLEVBQUVDLFdBQVcsUUFBUSxvQkFBaUI7QUFD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
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { type EntityJson } from "../types/types";
|
|
2
|
+
import type { AbsolutePath } from "../utils/path-utils";
|
|
1
3
|
import { Entity } from "./entity";
|
|
2
|
-
import { EntityJson } from "../types/types";
|
|
3
4
|
export type EntityNamesRecord = Record<"fs" | "fsPlural" | "camel" | "camelPlural" | "capital" | "capitalPlural" | "upper" | "constant", string>;
|
|
4
5
|
type TableSpec = {
|
|
5
6
|
name: string;
|
|
@@ -13,7 +14,165 @@ declare class EntityManagerClass {
|
|
|
13
14
|
modulePaths: Map<string, string>;
|
|
14
15
|
private tableSpecs;
|
|
15
16
|
isAutoloaded: boolean;
|
|
16
|
-
autoload(
|
|
17
|
+
autoload(_?: boolean): Promise<void>;
|
|
18
|
+
schemaValidate(json: unknown): import("zod").ZodError<{
|
|
19
|
+
id: string;
|
|
20
|
+
title: string;
|
|
21
|
+
table: string;
|
|
22
|
+
props: ({
|
|
23
|
+
type: "boolean" | "date" | "integer" | "integer[]" | "bigInteger" | "bigInteger[]" | "boolean[]" | "date[]" | "uuid" | "uuid[]";
|
|
24
|
+
name: string;
|
|
25
|
+
desc?: string | undefined;
|
|
26
|
+
nullable?: boolean | undefined;
|
|
27
|
+
toFilter?: true | undefined;
|
|
28
|
+
dbDefault?: string | number | boolean | undefined;
|
|
29
|
+
} | {
|
|
30
|
+
type: "string";
|
|
31
|
+
name: string;
|
|
32
|
+
length?: number | undefined;
|
|
33
|
+
desc?: string | undefined;
|
|
34
|
+
nullable?: boolean | undefined;
|
|
35
|
+
toFilter?: true | undefined;
|
|
36
|
+
dbDefault?: string | number | boolean | undefined;
|
|
37
|
+
} | {
|
|
38
|
+
type: "string[]";
|
|
39
|
+
name: string;
|
|
40
|
+
length?: number | undefined;
|
|
41
|
+
desc?: string | undefined;
|
|
42
|
+
nullable?: boolean | undefined;
|
|
43
|
+
toFilter?: true | undefined;
|
|
44
|
+
dbDefault?: string | number | boolean | undefined;
|
|
45
|
+
} | {
|
|
46
|
+
type: "enum";
|
|
47
|
+
id: string;
|
|
48
|
+
name: string;
|
|
49
|
+
desc?: string | undefined;
|
|
50
|
+
nullable?: boolean | undefined;
|
|
51
|
+
toFilter?: true | undefined;
|
|
52
|
+
dbDefault?: string | number | boolean | undefined;
|
|
53
|
+
} | {
|
|
54
|
+
type: "enum[]";
|
|
55
|
+
id: string;
|
|
56
|
+
name: string;
|
|
57
|
+
desc?: string | undefined;
|
|
58
|
+
nullable?: boolean | undefined;
|
|
59
|
+
toFilter?: true | undefined;
|
|
60
|
+
dbDefault?: string | number | boolean | undefined;
|
|
61
|
+
} | {
|
|
62
|
+
type: "number";
|
|
63
|
+
name: string;
|
|
64
|
+
numberType?: "numeric" | "real" | "double precision" | undefined;
|
|
65
|
+
precision?: number | undefined;
|
|
66
|
+
scale?: number | undefined;
|
|
67
|
+
desc?: string | undefined;
|
|
68
|
+
nullable?: boolean | undefined;
|
|
69
|
+
toFilter?: true | undefined;
|
|
70
|
+
dbDefault?: string | number | boolean | undefined;
|
|
71
|
+
} | {
|
|
72
|
+
type: "number[]";
|
|
73
|
+
name: string;
|
|
74
|
+
numberType?: "numeric" | "real" | "double precision" | undefined;
|
|
75
|
+
precision?: number | undefined;
|
|
76
|
+
scale?: number | undefined;
|
|
77
|
+
desc?: string | undefined;
|
|
78
|
+
nullable?: boolean | undefined;
|
|
79
|
+
toFilter?: true | undefined;
|
|
80
|
+
dbDefault?: string | number | boolean | undefined;
|
|
81
|
+
} | {
|
|
82
|
+
type: "numeric";
|
|
83
|
+
name: string;
|
|
84
|
+
precision?: number | undefined;
|
|
85
|
+
scale?: number | undefined;
|
|
86
|
+
desc?: string | undefined;
|
|
87
|
+
nullable?: boolean | undefined;
|
|
88
|
+
toFilter?: true | undefined;
|
|
89
|
+
dbDefault?: string | number | boolean | undefined;
|
|
90
|
+
} | {
|
|
91
|
+
type: "numeric[]";
|
|
92
|
+
name: string;
|
|
93
|
+
precision?: number | undefined;
|
|
94
|
+
scale?: number | undefined;
|
|
95
|
+
desc?: string | undefined;
|
|
96
|
+
nullable?: boolean | undefined;
|
|
97
|
+
toFilter?: true | undefined;
|
|
98
|
+
dbDefault?: string | number | boolean | undefined;
|
|
99
|
+
} | {
|
|
100
|
+
type: "json";
|
|
101
|
+
id: string;
|
|
102
|
+
name: string;
|
|
103
|
+
desc?: string | undefined;
|
|
104
|
+
nullable?: boolean | undefined;
|
|
105
|
+
toFilter?: true | undefined;
|
|
106
|
+
dbDefault?: string | number | boolean | undefined;
|
|
107
|
+
} | {
|
|
108
|
+
type: "virtual";
|
|
109
|
+
id: string;
|
|
110
|
+
name: string;
|
|
111
|
+
desc?: string | undefined;
|
|
112
|
+
nullable?: boolean | undefined;
|
|
113
|
+
toFilter?: true | undefined;
|
|
114
|
+
dbDefault?: string | number | boolean | undefined;
|
|
115
|
+
} | {
|
|
116
|
+
relationType: "BelongsToOne";
|
|
117
|
+
type: "relation";
|
|
118
|
+
with: string;
|
|
119
|
+
name: string;
|
|
120
|
+
customJoinClause?: string | undefined;
|
|
121
|
+
useConstraint?: boolean | undefined;
|
|
122
|
+
onUpdate?: "CASCADE" | "SET NULL" | "NO ACTION" | "SET DEFAULT" | "RESTRICT" | undefined;
|
|
123
|
+
onDelete?: "CASCADE" | "SET NULL" | "NO ACTION" | "SET DEFAULT" | "RESTRICT" | undefined;
|
|
124
|
+
desc?: string | undefined;
|
|
125
|
+
nullable?: boolean | undefined;
|
|
126
|
+
toFilter?: true | undefined;
|
|
127
|
+
dbDefault?: string | number | boolean | undefined;
|
|
128
|
+
} | {
|
|
129
|
+
relationType: "HasMany";
|
|
130
|
+
joinColumn: string;
|
|
131
|
+
type: "relation";
|
|
132
|
+
with: string;
|
|
133
|
+
name: string;
|
|
134
|
+
fromColumn?: string | undefined;
|
|
135
|
+
desc?: string | undefined;
|
|
136
|
+
nullable?: boolean | undefined;
|
|
137
|
+
toFilter?: true | undefined;
|
|
138
|
+
dbDefault?: string | number | boolean | undefined;
|
|
139
|
+
} | {
|
|
140
|
+
relationType: "ManyToMany";
|
|
141
|
+
joinTable: string;
|
|
142
|
+
onUpdate: "CASCADE" | "SET NULL" | "NO ACTION" | "SET DEFAULT" | "RESTRICT";
|
|
143
|
+
onDelete: "CASCADE" | "SET NULL" | "NO ACTION" | "SET DEFAULT" | "RESTRICT";
|
|
144
|
+
type: "relation";
|
|
145
|
+
with: string;
|
|
146
|
+
name: string;
|
|
147
|
+
desc?: string | undefined;
|
|
148
|
+
nullable?: boolean | undefined;
|
|
149
|
+
toFilter?: true | undefined;
|
|
150
|
+
dbDefault?: string | number | boolean | undefined;
|
|
151
|
+
} | {
|
|
152
|
+
relationType: "OneToOne";
|
|
153
|
+
type: "relation";
|
|
154
|
+
with: string;
|
|
155
|
+
name: string;
|
|
156
|
+
customJoinClause?: string | undefined;
|
|
157
|
+
hasJoinColumn?: boolean | undefined;
|
|
158
|
+
useConstraint?: boolean | undefined;
|
|
159
|
+
onUpdate?: "CASCADE" | "SET NULL" | "NO ACTION" | "SET DEFAULT" | "RESTRICT" | undefined;
|
|
160
|
+
onDelete?: "CASCADE" | "SET NULL" | "NO ACTION" | "SET DEFAULT" | "RESTRICT" | undefined;
|
|
161
|
+
desc?: string | undefined;
|
|
162
|
+
nullable?: boolean | undefined;
|
|
163
|
+
toFilter?: true | undefined;
|
|
164
|
+
dbDefault?: string | number | boolean | undefined;
|
|
165
|
+
})[];
|
|
166
|
+
indexes: {
|
|
167
|
+
type: "index" | "unique" | "fulltext";
|
|
168
|
+
columns: string[];
|
|
169
|
+
name?: string | undefined;
|
|
170
|
+
parser?: "built-in" | "ngram" | undefined;
|
|
171
|
+
}[];
|
|
172
|
+
subsets: Record<string, string[]>;
|
|
173
|
+
enums: Record<string, Record<string, string>>;
|
|
174
|
+
parentId?: string | undefined;
|
|
175
|
+
}> | null;
|
|
17
176
|
reload(doSilent?: boolean): Promise<void>;
|
|
18
177
|
register(json: EntityJson): Promise<void>;
|
|
19
178
|
get(entityId: string): Entity;
|
|
@@ -26,6 +185,12 @@ declare class EntityManagerClass {
|
|
|
26
185
|
setTableSpec(tableSpec: TableSpec): void;
|
|
27
186
|
getTableSpec(key: string): TableSpec;
|
|
28
187
|
getNamesFromId(entityId: string): EntityNamesRecord;
|
|
188
|
+
/**
|
|
189
|
+
* EntityId는 Model을 제외한 PascalCase 이름입니다. (ex. "User")
|
|
190
|
+
* @param filePath
|
|
191
|
+
* @returns
|
|
192
|
+
*/
|
|
193
|
+
getEntityIdFromPath(filePath: AbsolutePath): string;
|
|
29
194
|
}
|
|
30
195
|
export declare const EntityManager: EntityManagerClass;
|
|
31
196
|
export {};
|