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 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/templates/view_list.template.ts"],"sourcesContent":["import inflection from \"inflection\";\nimport _ from \"lodash\";\nimport { z } from \"zod\";\nimport { RenderingNode, TemplateKey, TemplateOptions } from \"../types/types\";\nimport { EntityManager, EntityNamesRecord } from \"../entity/entity-manager\";\nimport { isEnumProp, isRelationProp, RelationProp } from \"../types/types\";\nimport { RenderedTemplate } from \"../syncer/syncer\";\nimport { Template } from \"./base-template\";\n\nexport class Template__view_list extends Template {\n constructor() {\n super(\"view_list\");\n }\n\n getTargetAndPath(names: EntityNamesRecord) {\n return {\n target: \"web/src/pages/admin\",\n path: `${names.fsPlural}/index.tsx`,\n };\n }\n\n wrapTc(\n body: string,\n key: string,\n collapsing: boolean = true,\n className: string = \"\"\n ) {\n return `<Table.Cell key=\"${key}\"${collapsing ? \" collapsing\" : \"\"}${\n className ? ` className={\\`${className}\\`}` : \"\"\n }>${body}</Table.Cell>`;\n }\n\n renderColumn(\n entityId: string,\n col: RenderingNode,\n names: EntityNamesRecord,\n parentObj: string = \"row\",\n withoutName: boolean = false\n ): string {\n const colName = withoutName ? `${parentObj}` : `${parentObj}.${col.name}`;\n\n switch (col.renderType) {\n case \"string-plain\":\n case \"string-date\":\n case \"number-id\":\n return `<>{${colName}}</>`;\n case \"number-fk_id\":\n const relPropFk = getRelationPropFromColName(\n entityId,\n col.name.replace(\"_id\", \"\")\n );\n return `<>${relPropFk.with}#{${colName}}</>`;\n case \"string-image\":\n return `<>{${\n col.nullable ? `${colName} && ` : \"\"\n }<img src={${colName}} />}</>`;\n case \"datetime\":\n if (col.nullable) {\n return `<span className=\"text-tiny\">{${colName} === null ? '-' : formatDateTime(${colName})}</span>`;\n } else {\n return `<span className=\"text-tiny\">{formatDateTime(${colName})}</span>`;\n }\n case \"string-datetime\":\n if (col.nullable) {\n return `<span className=\"text-tiny\">{${colName} === null ? '-' : dateF(${colName})}</span>`;\n } else {\n return `<span className=\"text-tiny\">{dateF(${colName})}</span>`;\n }\n case \"boolean\":\n return `<>{${colName} ? <Label color='green' circular>O</Label> : <Label color='grey' circular>X</Label> }</>`;\n case \"enums\":\n const { id: enumId } = getEnumInfoFromColName(entityId, col.name);\n return `<>{${\n col.nullable ? `${colName} && ` : \"\"\n }${enumId}Label[${colName}]}</>`;\n case \"array-images\":\n return `<>{ ${colName}.map(r => ${\n col.nullable ? `r && ` : \"\"\n }<img src={r} />) }</>`;\n case \"number-plain\":\n return `<>{${col.nullable ? `${colName} && ` : \"\"}numF(${colName})}</>`;\n case \"object\":\n return `<>{/* object ${colName} */}</>`;\n case \"object-pick\":\n const pickedChild = col.children!.find(\n (child) => child.name === col.config?.picked\n );\n if (!pickedChild) {\n throw new Error(`object-pick 선택 실패 (오브젝트: ${col.name})`);\n }\n return this.renderColumn(\n entityId,\n pickedChild,\n names,\n `${colName}${col.nullable ? \"?\" : \"\"}`\n );\n case \"array\":\n return `<>{ /* array ${colName} */ }</>`;\n default:\n throw new Error(`렌더 불가 컬럼 ${col.renderType}`);\n }\n }\n\n renderColumnImport(\n entityId: string,\n col: RenderingNode,\n names: EntityNamesRecord\n ): (string | null)[] {\n if (col.renderType === \"enums\") {\n const { id: enumId } = getEnumInfoFromColName(names.capital, col.name);\n return [\n `import { ${enumId}Label } from 'src/services/sonamu.generated';`,\n ];\n } else if (col.renderType === \"object\") {\n try {\n const relProp = getRelationPropFromColName(entityId, col.name);\n const result = col.children!.map((child) => {\n entityId = relProp.with;\n names = EntityManager.getNamesFromId(relProp.with);\n return this.renderColumnImport(entityId, child, names);\n });\n return _.flattenDeep(result);\n } catch {\n return [null];\n }\n } else if (col.renderType === \"array\") {\n return this.renderColumnImport(entityId, col.element!, names);\n }\n\n return [null];\n }\n\n renderFilterImport(\n entityId: string,\n col: RenderingNode,\n names: EntityNamesRecord\n ) {\n if (col.name === \"search\") {\n return `import { ${names.capital}SearchInput } from \"src/components/${names.fs}/${names.capital}SearchInput\";`;\n } else if (col.renderType === \"enums\") {\n if (col.name === \"orderBy\") {\n const componentId = `${names.capital}${inflection.camelize(\n col.name\n )}Select`;\n return `import { ${componentId} } from \"src/components/${names.fs}/${componentId}\";`;\n } else {\n try {\n const { id, targetEntityNames: targetMDNames } =\n getEnumInfoFromColName(entityId, col.name);\n const componentId = `${id}Select`;\n return `import { ${componentId} } from \"src/components/${targetMDNames.fs}/${componentId}\";`;\n } catch {\n return \"\";\n }\n }\n } else if (col.renderType === \"number-fk_id\") {\n try {\n const relProp = getRelationPropFromColName(\n entityId,\n col.name.replace(\"_id\", \"\")\n );\n const targetNames = EntityManager.getNamesFromId(relProp.with);\n const componentId = `${relProp.with}IdAsyncSelect`;\n return `import { ${componentId} } from \"src/components/${targetNames.fs}/${componentId}\";`;\n } catch {\n return \"\";\n }\n } else {\n throw new Error(\n `렌더 불가능한 필터 임포트 ${col.name} ${col.renderType}`\n );\n }\n }\n\n renderFilter(entityId: string, col: RenderingNode, names: EntityNamesRecord) {\n if (col.name === \"search\") {\n return \"\";\n }\n\n const isClearable = col.optional === true && col.name !== \"orderBy\";\n let componentId: string;\n if (col.renderType === \"enums\") {\n if (col.name === \"orderBy\") {\n componentId = `${names.capital}${inflection.camelize(col.name)}Select`;\n } else {\n try {\n const { id } = getEnumInfoFromColName(entityId, col.name);\n componentId = `${id}Select`;\n } catch {\n return \"\";\n }\n }\n return `<${componentId} {...register('${col.name}')} ${\n isClearable ? \"clearable\" : \"\"\n } />`;\n } else if (col.renderType === \"number-fk_id\") {\n try {\n const relProp = getRelationPropFromColName(\n entityId,\n col.name.replace(\"_id\", \"\")\n );\n componentId = `${relProp.with}IdAsyncSelect`;\n return `<${componentId} {...register('${col.name}')} ${\n isClearable ? \"clearable\" : \"\"\n } subset=\"A\" />`;\n } catch {\n return \"\";\n }\n } else {\n throw new Error(\n `렌더 불가능한 필터 임포트 ${col.name} ${col.renderType}`\n );\n }\n }\n\n getDefault(columns: RenderingNode[]): {\n orderBy: string;\n search: string;\n } {\n const def = {\n orderBy: \"id-desc\",\n search: \"title\",\n };\n const orderByZodType = columns.find(\n (col) => col.name === \"orderBy\"\n )?.zodType;\n if (orderByZodType && orderByZodType instanceof z.ZodEnum) {\n def.orderBy = orderByZodType.options[0].toString();\n }\n const searchZodType = columns.find((col) => col.name === \"search\")?.zodType;\n if (searchZodType && searchZodType instanceof z.ZodEnum) {\n def.search = searchZodType.options[0].toString();\n }\n return def;\n }\n\n render(\n { entityId }: TemplateOptions[\"view_list\"],\n columnsNode: RenderingNode,\n listParamsNode: RenderingNode\n ) {\n const names = EntityManager.getNamesFromId(entityId);\n const entity = EntityManager.get(entityId);\n\n // 실제 리스트 컬럼\n const columns = (columnsNode.children as RenderingNode[])\n .filter((col) => col.name !== \"id\")\n .map((col) => {\n const propCandidate = entity.props.find((p) => p.name === col.name);\n return {\n name: col.name,\n label: propCandidate?.desc ?? col.label,\n tc: `(row) => ${this.renderColumn(entityId, col, names)}`,\n };\n });\n\n // 필터 컬럼\n const filterColumns = (listParamsNode.children as RenderingNode[])\n .filter(\n (col) =>\n col.name !== \"id\" &&\n col.name !== \"queryMode\" &&\n ([\"enums\", \"number-id\"].includes(col.renderType) ||\n col.name.endsWith(\"_id\"))\n )\n // orderBy가 가장 뒤로 오게 순서 조정\n .sort((a) => {\n return a.name == \"orderBy\" ? 1 : -1;\n });\n\n // 필터 컬럼을 프리 템플릿으로 설정\n const preTemplates: RenderedTemplate[\"preTemplates\"] = [];\n for (let col of filterColumns) {\n let key: TemplateKey;\n let targetEntityId = entityId;\n let enumId: string | undefined;\n\n if (col.renderType === \"enums\") {\n if (col.name === \"search\") {\n key = \"view_enums_dropdown\";\n enumId = `${names.capital}SearchField`;\n targetEntityId = names.capital;\n } else {\n key = \"view_enums_select\";\n try {\n const { targetEntityNames, id } = getEnumInfoFromColName(\n entityId,\n col.name\n );\n targetEntityId = targetEntityNames.capital;\n enumId = id;\n } catch {\n continue;\n }\n }\n } else {\n key = \"view_id_async_select\";\n try {\n const relProp = getRelationPropFromColName(\n entityId,\n col.name.replace(\"_id\", \"\")\n );\n targetEntityId = relProp.with;\n } catch {\n continue;\n }\n }\n\n preTemplates.push({\n key,\n options: {\n entityId: targetEntityId,\n enumId,\n },\n });\n }\n\n // 리스트 컬럼\n const columnImports = _.uniq(\n columnsNode\n .children!.map((col) => {\n return this.renderColumnImport(entityId, col, names);\n })\n .flat()\n .filter((col) => col !== null)\n ).join(\"\\n\");\n\n // SearchInput\n preTemplates!.push({\n key: \"view_search_input\",\n options: {\n entityId,\n },\n });\n\n // 디폴트 파라미터\n const def = this.getDefault(filterColumns);\n\n return {\n ...this.getTargetAndPath(names),\n body: `\nimport React from 'react';\nimport { Link } from 'react-router-dom';\nimport {\n Breadcrumb,\n Checkbox,\n Pagination,\n Segment,\n Table,\n TableRow,\n Message,\n Transition,\n Button,\n Label,\n} from 'semantic-ui-react';\nimport classNames from 'classnames';\nimport { DateTime } from \"luxon\";\nimport { DelButton, EditButton, AppBreadcrumbs, AddButton, useSelection, useListParams, SonamuCol, numF, formatDate, formatDateTime } from '@sonamu-kit/react-sui';\n\nimport { ${names.capital}SubsetA } from \"src/services/sonamu.generated\";\nimport { ${names.capital}Service } from 'src/services/${names.fs}/${\n names.fs\n }.service';\nimport { ${names.capital}ListParams } from 'src/services/${names.fs}/${\n names.fs\n }.types';\n${columnImports}\n${filterColumns\n .map((col) => {\n return this.renderFilterImport(entityId, col, names);\n })\n .join(\"\\n\")}\n\ntype ${names.capital}ListProps = {};\nexport default function ${names.capital}List({}: ${names.capital}ListProps) {\n // 리스트 필터\n const { listParams, register } = useListParams(${names.capital}ListParams, {\n num: 12,\n page: 1,\n orderBy: '${def.orderBy}',\n search: '${def.search}',\n });\n\n // 리스트 쿼리\n const { data, mutate, error, isLoading } = ${names.capital}Service.use${\n names.capitalPlural\n }('A', listParams);\n const { rows, total } = data ?? {};\n\n // 삭제\n const confirmDel = (ids: number[]) => {\n const answer = confirm('삭제하시겠습니까?');\n if (!answer) {\n return;\n }\n\n ${names.capital}Service.del(ids).then(() => {\n mutate();\n });\n };\n\n // 일괄 삭제\n const confirmDelSelected = () => {\n const answer = confirm(\\`\\${selectedKeys.length}건을 일괄 삭제하시겠습니까?\\`);\n if (!answer) {\n return;\n }\n\n ${names.capital}Service.del(selectedKeys).then(() => {\n mutate();\n });\n };\n\n // 현재 경로와 타이틀\n const PAGE = {\n route: '/admin/${names.fsPlural}',\n title: '${entity.title ?? names.capital}',\n };\n\n // 선택\n const {\n getSelected,\n isAllSelected,\n selectedKeys,\n toggle,\n selectAll,\n deselectAll,\n handleCheckboxClick,\n } = useSelection((rows ?? []).map((row) => row.id));\n\n // 컬럼\n const columns:SonamuCol<${names.capital}SubsetA>[] = [${columns\n .map((col) => {\n return [\n `{ label: \"${col.label}\",`,\n `tc: ${col.tc}, `,\n `collapsing: ${[\"Title\", \"Name\"].includes(col.label) === false}, }`,\n ].join(\"\\n\");\n })\n .join(\",\\n\")}];\n\n return (\n <div className=\"list ${names.fsPlural}-index\">\n <div className=\"top-nav\">\n <div className=\"header-row\">\n <div className=\"header\">{PAGE.title}</div>\n <AppBreadcrumbs>\n <Breadcrumb.Section active>{PAGE.title}</Breadcrumb.Section>\n </AppBreadcrumbs>\n <${names.capital}SearchInput\n input={register('keyword')}\n dropdown={register('search')}\n />\n </div>\n <div className=\"filters-row\">\n ${filterColumns\n .map((col) => {\n return this.renderFilter(entityId, col, names);\n })\n .join(\" \\n\")}\n </div>\n </div>\n\n <Segment basic padded className=\"contents-segment\" loading={isLoading}>\n <div className=\"buttons-row\">\n <div className={classNames('count', { hidden: isLoading })}>\n {total} 건\n </div>\n <div className=\"buttons\">\n <AddButton currentRoute={PAGE.route} icon=\"write\" label=\"추가\" />\n </div>\n </div>\n\n <Table\n celled\n compact\n selectable\n className={classNames({ hidden: total === undefined || total === 0 })}\n >\n <Table.Header>\n <TableRow>\n <Table.HeaderCell collapsing>\n <Checkbox\n label=\"ID\"\n checked={isAllSelected}\n onChange={isAllSelected ? deselectAll : selectAll}\n />\n </Table.HeaderCell>\n {\n /* Header */\n columns.map((col, index) => col.th ?? <Table.HeaderCell key={index} collapsing={col.collapsing}>{ col.label }</Table.HeaderCell>)\n }\n <Table.HeaderCell>관리</Table.HeaderCell>\n </TableRow>\n </Table.Header>\n <Table.Body>\n {rows &&\n rows.map((row, rowIndex) => (\n <Table.Row key={row.id}>\n <Table.Cell>\n <Checkbox\n label={row.id}\n checked={getSelected(row.id)}\n onChange={() => toggle(row.id)}\n onClick={(e) =>\n handleCheckboxClick(e, rowIndex)\n }\n />\n </Table.Cell>\n {\n /* Body */\n columns.map((col, colIndex) => (\n <Table.Cell key={colIndex} collapsing={col.collapsing} className={col.className}>\n {col.tc(row, rowIndex)}\n </Table.Cell>\n ))\n }\n <Table.Cell collapsing>\n <EditButton\n as={Link}\n to={\\`\\${PAGE.route}/form?id=\\${row.id}\\`}\n state={{ from: PAGE.route }}\n />\n <DelButton onClick={() => confirmDel([row.id])} />\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n <div\n className={classNames('pagination-row', {\n hidden: (total ?? 0) === 0,\n })}\n >\n <Pagination\n totalPages={Math.ceil((total ?? 0) / (listParams.num ?? 24))}\n {...register('page')}\n />\n </div>\n </Segment>\n\n <div className=\"fixed-menu\">\n <Transition\n visible={selectedKeys.length > 0}\n animation=\"slide left\"\n duration={500}\n >\n <Message size=\"small\" color=\"violet\" className=\"text-center\">\n <span className=\"px-4\">{selectedKeys.length}개 선택됨</span>\n <Button size=\"tiny\" color=\"violet\" onClick={() => deselectAll()}>\n 선택 해제\n </Button>\n <Button size=\"tiny\" color=\"red\" onClick={confirmDelSelected}>\n 일괄 삭제\n </Button>\n </Message>\n </Transition>\n </div>\n </div>\n );\n}\n `.trim(),\n importKeys: [],\n preTemplates,\n };\n }\n}\n\nexport function getEnumInfoFromColName(\n entityId: string,\n colName: string\n): {\n id: string;\n targetEntityNames: EntityNamesRecord;\n targetEntityId: string;\n title: string;\n} {\n const baseEntity = EntityManager.get(entityId);\n const prop = baseEntity.props.find((p) => p.name === colName);\n if (prop && isEnumProp(prop)) {\n return {\n id: prop.id,\n targetEntityId: entityId,\n targetEntityNames: EntityManager.getNamesFromId(entityId),\n title: prop.desc ?? prop.id,\n };\n } else {\n const idCandidate = inflection.camelize(\n inflection.underscore(entityId) + \"_\" + inflection.underscore(colName),\n false\n );\n try {\n const targetEntityNames = EntityManager.getNamesFromId(entityId);\n return {\n id: idCandidate,\n targetEntityId: entityId,\n targetEntityNames: targetEntityNames,\n title: idCandidate,\n };\n } catch {}\n throw new Error(`찾을 수 없는 EnumProp ${colName}`);\n }\n}\n\nexport function getRelationPropFromColName(\n entityId: string,\n colName: string\n): RelationProp {\n const baseEntity = EntityManager.get(entityId);\n const relProp = baseEntity.props.find((prop) => prop.name === colName);\n if (isRelationProp(relProp)) {\n const relEntity = EntityManager.get(relProp.with);\n if (relEntity.parentId !== undefined) {\n throw new Error(\"Only parent entities can be used as relation props\");\n }\n return relProp;\n } else {\n throw new Error(`찾을 수 없는 Relation ${colName}`);\n }\n}\n"],"names":["Template__view_list","getEnumInfoFromColName","getRelationPropFromColName","getTargetAndPath","names","target","path","fsPlural","wrapTc","body","key","collapsing","className","renderColumn","entityId","col","parentObj","withoutName","colName","name","renderType","relPropFk","replace","with","nullable","id","enumId","pickedChild","children","find","child","config","picked","Error","renderColumnImport","capital","relProp","result","map","EntityManager","getNamesFromId","_","flattenDeep","element","renderFilterImport","fs","componentId","inflection","camelize","targetEntityNames","targetMDNames","targetNames","renderFilter","isClearable","optional","getDefault","columns","def","orderBy","search","orderByZodType","zodType","z","ZodEnum","options","toString","searchZodType","render","columnsNode","listParamsNode","entity","get","filter","propCandidate","props","p","label","desc","tc","filterColumns","includes","endsWith","sort","a","preTemplates","targetEntityId","push","columnImports","uniq","flat","join","capitalPlural","title","trim","importKeys","Template","baseEntity","prop","isEnumProp","idCandidate","underscore","isRelationProp","relEntity","parentId","undefined"],"mappings":"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"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { TemplateOptions } from "../types/types";
|
|
2
|
-
import { EntityNamesRecord } from "../entity/entity-manager";
|
|
3
|
-
import { Template } from "./base-template";
|
|
4
|
-
export declare class Template__view_list_columns extends Template {
|
|
5
|
-
constructor();
|
|
6
|
-
getTargetAndPath(names: EntityNamesRecord): {
|
|
7
|
-
target: string;
|
|
8
|
-
path: string;
|
|
9
|
-
};
|
|
10
|
-
render({ entityId, columns, columnImports, }: TemplateOptions["view_list_columns"]): {
|
|
11
|
-
body: string;
|
|
12
|
-
importKeys: never[];
|
|
13
|
-
target: string;
|
|
14
|
-
path: string;
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=view_list_columns.template.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"view_list_columns.template.d.ts","sourceRoot":"","sources":["../../src/templates/view_list_columns.template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAiB,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,qBAAa,2BAA4B,SAAQ,QAAQ;;IAKvD,gBAAgB,CAAC,KAAK,EAAE,iBAAiB;;;;IAQzC,MAAM,CAAC,EACL,QAAQ,EACR,OAAO,EACP,aAAa,GACd,EAAE,eAAe,CAAC,mBAAmB,CAAC;;;;;;CAqCxC"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"Template__view_list_columns",{enumerable:true,get:function(){return Template__view_list_columns}});var _entitymanager=require("../entity/entity-manager");var _basetemplate=require("./base-template");function _assert_this_initialized(self){if(self===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return self}function _call_super(_this,derived,args){derived=_get_prototype_of(derived);return _possible_constructor_return(_this,_is_native_reflect_construct()?Reflect.construct(derived,args||[],_get_prototype_of(_this).constructor):derived.apply(_this,args))}function _class_call_check(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}function _create_class(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _get_prototype_of(o){_get_prototype_of=Object.setPrototypeOf?Object.getPrototypeOf:function getPrototypeOf(o){return o.__proto__||Object.getPrototypeOf(o)};return _get_prototype_of(o)}function _inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function")}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,writable:true,configurable:true}});if(superClass)_set_prototype_of(subClass,superClass)}function _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 _possible_constructor_return(self,call){if(call&&(_type_of(call)==="object"||typeof call==="function")){return call}return _assert_this_initialized(self)}function _set_prototype_of(o,p){_set_prototype_of=Object.setPrototypeOf||function setPrototypeOf(o,p){o.__proto__=p;return o};return _set_prototype_of(o,p)}function _type_of(obj){"@swc/helpers - typeof";return obj&&typeof Symbol!=="undefined"&&obj.constructor===Symbol?"symbol":typeof obj}function _is_native_reflect_construct(){try{var result=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(_){}return(_is_native_reflect_construct=function(){return!!result})()}var Template__view_list_columns=/*#__PURE__*/function(Template){"use strict";_inherits(Template__view_list_columns,Template);function Template__view_list_columns(){_class_call_check(this,Template__view_list_columns);return _call_super(this,Template__view_list_columns,["view_list_columns"])}_create_class(Template__view_list_columns,[{key:"getTargetAndPath",value:function getTargetAndPath(names){return{target:"web/src/pages/admin",path:"".concat(names.fsPlural,"/_columns.tsx")}}},{key:"render",value:function render(param){var entityId=param.entityId,columns=param.columns,columnImports=param.columnImports;var names=_entitymanager.EntityManager.getNamesFromId(entityId);return _object_spread_props(_object_spread({},this.getTargetAndPath(names)),{body:"\nimport React from 'react';\nimport {\n Segment,\n Table,\n TableRow,\n Button,\n Label,\n} from 'semantic-ui-react';\nimport { DateTime } from \"luxon\";\nimport { TFColumn } from \"src/typeframe/iso-types\";\nimport { ".concat(names.capital,'SubsetA } from "src/services/').concat(names.fs,"/").concat(names.fs,'.generated";\n').concat(columnImports,"\n\nconst columns: { [key in Exclude<keyof ").concat(names.capital,"SubsetA, 'id'>]: TFColumn<").concat(names.capital,"SubsetA> } = {").concat(columns.map(function(col){return["".concat(col.name,': { label: "').concat(col.label,'",'),"tc: ".concat(col.tc,", "),"collapsing: ".concat(["Title","Name"].includes(col.label)===false,", }")].join("\n")}).join(",\n"),"};\nexport default columns;\n ").trim(),importKeys:[]})}}]);return Template__view_list_columns}(_basetemplate.Template);
|
|
2
|
-
//# sourceMappingURL=view_list_columns.template.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/templates/view_list_columns.template.ts"],"sourcesContent":["import { TemplateOptions } from \"../types/types\";\nimport { EntityManager, EntityNamesRecord } from \"../entity/entity-manager\";\nimport { Template } from \"./base-template\";\n\nexport class Template__view_list_columns extends Template {\n constructor() {\n super(\"view_list_columns\");\n }\n\n getTargetAndPath(names: EntityNamesRecord) {\n return {\n target: \"web/src/pages/admin\",\n path: `${names.fsPlural}/_columns.tsx`,\n };\n }\n\n // 컬럼\n render({\n entityId,\n columns,\n columnImports,\n }: TemplateOptions[\"view_list_columns\"]) {\n const names = EntityManager.getNamesFromId(entityId);\n\n return {\n ...this.getTargetAndPath(names),\n body: `\nimport React from 'react';\nimport {\n Segment,\n Table,\n TableRow,\n Button,\n Label,\n} from 'semantic-ui-react';\nimport { DateTime } from \"luxon\";\nimport { TFColumn } from \"src/typeframe/iso-types\";\nimport { ${names.capital}SubsetA } from \"src/services/${names.fs}/${\n names.fs\n }.generated\";\n${columnImports}\n\nconst columns: { [key in Exclude<keyof ${\n names.capital\n }SubsetA, 'id'>]: TFColumn<${names.capital}SubsetA> } = {${columns\n .map((col) => {\n return [\n `${col.name}: { label: \"${col.label}\",`,\n `tc: ${col.tc}, `,\n `collapsing: ${[\"Title\", \"Name\"].includes(col.label) === false}, }`,\n ].join(\"\\n\");\n })\n .join(\",\\n\")}};\nexport default columns;\n `.trim(),\n importKeys: [],\n };\n }\n}\n"],"names":["Template__view_list_columns","getTargetAndPath","names","target","path","fsPlural","render","entityId","columns","columnImports","EntityManager","getNamesFromId","body","capital","fs","map","col","name","label","tc","includes","join","trim","importKeys","Template"],"mappings":"oGAIaA,qEAAAA,0DAHoC,sDACxB,y7GAElB,IAAA,AAAMA,yCAAN,0CAAMA,+CAAAA,qDAAAA,6BAET,OAAA,iBAFSA,6BAEH,oCAFGA,8BAKXC,IAAAA,yBAAAA,SAAAA,iBAAiBC,KAAwB,EACvC,MAAO,CACLC,OAAQ,sBACRC,KAAM,AAAC,GAAiB,OAAfF,MAAMG,QAAQ,CAAC,gBAC1B,CACF,IAGAC,IAAAA,eAAAA,SAAAA,OAAO,KAIgC,MAHrCC,SADK,MACLA,SACAC,QAFK,MAELA,QACAC,cAHK,MAGLA,cAEA,IAAMP,MAAQQ,4BAAa,CAACC,cAAc,CAACJ,UAE3C,OAAO,uCACF,IAAI,CAACN,gBAAgB,CAACC,SACzBU,KAAM,AAAC,qOAW2CV,OAA7CA,MAAMW,OAAO,CAAC,iCACjBX,OADgDA,MAAMY,EAAE,CAAC,KAG/DL,OAFMP,MAAMY,EAAE,CACT,kBAICZ,OAHNO,cAAc,+CAImBP,OAD3BA,MAAMW,OAAO,CACd,8BAA0DL,OAA9BN,MAAMW,OAAO,CAAC,kBAQ5B,OAR4CL,QACxDO,GAAG,CAAC,SAACC,KACJ,MAAO,CACL,AAAC,GAAyBA,OAAvBA,IAAIC,IAAI,CAAC,gBAAwB,OAAVD,IAAIE,KAAK,CAAC,MACpC,AAAC,OAAa,OAAPF,IAAIG,EAAE,CAAC,MACd,AAAC,eAA8D,OAAhD,CAAC,QAAS,OAAO,CAACC,QAAQ,CAACJ,IAAIE,KAAK,IAAM,MAAM,OAChE,CAACG,IAAI,CAAC,KACT,GACCA,IAAI,CAAC,OAAO,uCAEbC,IAAI,GACNC,WAAY,EAAE,EAElB,YArDWvB,6BAAoCwB,sBAAQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"view_search_input.template.d.ts","sourceRoot":"","sources":["../../src/templates/view_search_input.template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAiB,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,qBAAa,2BAA4B,SAAQ,QAAQ;;IAKvD,gBAAgB,CAAC,KAAK,EAAE,iBAAiB;;;;IAOzC,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,eAAe,CAAC,mBAAmB,CAAC;;;;;;CAkD1D"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"Template__view_search_input",{enumerable:true,get:function(){return Template__view_search_input}});var _entitymanager=require("../entity/entity-manager");var _basetemplate=require("./base-template");function _assert_this_initialized(self){if(self===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return self}function _call_super(_this,derived,args){derived=_get_prototype_of(derived);return _possible_constructor_return(_this,_is_native_reflect_construct()?Reflect.construct(derived,args||[],_get_prototype_of(_this).constructor):derived.apply(_this,args))}function _class_call_check(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}function _create_class(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _get_prototype_of(o){_get_prototype_of=Object.setPrototypeOf?Object.getPrototypeOf:function getPrototypeOf(o){return o.__proto__||Object.getPrototypeOf(o)};return _get_prototype_of(o)}function _inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function")}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,writable:true,configurable:true}});if(superClass)_set_prototype_of(subClass,superClass)}function _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 _possible_constructor_return(self,call){if(call&&(_type_of(call)==="object"||typeof call==="function")){return call}return _assert_this_initialized(self)}function _set_prototype_of(o,p){_set_prototype_of=Object.setPrototypeOf||function setPrototypeOf(o,p){o.__proto__=p;return o};return _set_prototype_of(o,p)}function _type_of(obj){"@swc/helpers - typeof";return obj&&typeof Symbol!=="undefined"&&obj.constructor===Symbol?"symbol":typeof obj}function _is_native_reflect_construct(){try{var result=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(_){}return(_is_native_reflect_construct=function(){return!!result})()}var Template__view_search_input=/*#__PURE__*/function(Template){"use strict";_inherits(Template__view_search_input,Template);function Template__view_search_input(){_class_call_check(this,Template__view_search_input);return _call_super(this,Template__view_search_input,["view_search_input"])}_create_class(Template__view_search_input,[{key:"getTargetAndPath",value:function getTargetAndPath(names){return{target:"web/src/components",path:"".concat(names.fs,"/").concat(names.capital,"SearchInput.tsx")}}},{key:"render",value:function render(param){var entityId=param.entityId;var names=_entitymanager.EntityManager.getNamesFromId(entityId);return _object_spread_props(_object_spread({},this.getTargetAndPath(names)),{body:'\nimport React from "react";\nimport { useState } from "react";\nimport { DropdownProps, Input, InputProps } from "semantic-ui-react";\nimport { '.concat(names.capital,'SearchFieldDropdown } from "src/components/').concat(names.fs,"/").concat(names.capital,'SearchFieldDropdown";\n\nexport function ').concat(names.capital,"SearchInput({\n input: { value: inputValue, onChange: inputOnChange, ...inputProps },\n dropdown: dropdownProps,\n}: {\n input: InputProps;\n dropdown: DropdownProps;\n}) {\n const [keyword, setKeyword] = useState<string>(inputValue ?? '');\n\n const handleKeyDown = (e: { key: string }) => {\n if (inputOnChange && e.key === 'Enter') {\n inputOnChange(e as any, {\n value: keyword,\n });\n }\n };\n\n return (\n <Input\n size=\"small\"\n placeholder=\"검색...\"\n style={{ margin: 0 }}\n label={<").concat(names.capital,"SearchFieldDropdown {...dropdownProps} />}\n labelPosition=\"left\"\n action={{\n icon: 'search',\n onClick: () => handleKeyDown({ key: 'Enter' }),\n }}\n {...inputProps}\n value={keyword}\n onChange={(e, { value }) => setKeyword(value)}\n onKeyDown={handleKeyDown}\n />\n );\n}\n ").trim(),importKeys:[]})}}]);return Template__view_search_input}(_basetemplate.Template);
|
|
2
|
-
//# sourceMappingURL=view_search_input.template.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/templates/view_search_input.template.ts"],"sourcesContent":["import { TemplateOptions } from \"../types/types\";\nimport { EntityManager, EntityNamesRecord } from \"../entity/entity-manager\";\nimport { Template } from \"./base-template\";\n\nexport class Template__view_search_input extends Template {\n constructor() {\n super(\"view_search_input\");\n }\n\n getTargetAndPath(names: EntityNamesRecord) {\n return {\n target: \"web/src/components\",\n path: `${names.fs}/${names.capital}SearchInput.tsx`,\n };\n }\n\n render({ entityId }: TemplateOptions[\"view_search_input\"]) {\n const names = EntityManager.getNamesFromId(entityId);\n\n return {\n ...this.getTargetAndPath(names),\n body: `\nimport React from \"react\";\nimport { useState } from \"react\";\nimport { DropdownProps, Input, InputProps } from \"semantic-ui-react\";\nimport { ${names.capital}SearchFieldDropdown } from \"src/components/${names.fs}/${names.capital}SearchFieldDropdown\";\n\nexport function ${names.capital}SearchInput({\n input: { value: inputValue, onChange: inputOnChange, ...inputProps },\n dropdown: dropdownProps,\n}: {\n input: InputProps;\n dropdown: DropdownProps;\n}) {\n const [keyword, setKeyword] = useState<string>(inputValue ?? '');\n\n const handleKeyDown = (e: { key: string }) => {\n if (inputOnChange && e.key === 'Enter') {\n inputOnChange(e as any, {\n value: keyword,\n });\n }\n };\n\n return (\n <Input\n size=\"small\"\n placeholder=\"검색...\"\n style={{ margin: 0 }}\n label={<${names.capital}SearchFieldDropdown {...dropdownProps} />}\n labelPosition=\"left\"\n action={{\n icon: 'search',\n onClick: () => handleKeyDown({ key: 'Enter' }),\n }}\n {...inputProps}\n value={keyword}\n onChange={(e, { value }) => setKeyword(value)}\n onKeyDown={handleKeyDown}\n />\n );\n}\n `.trim(),\n importKeys: [],\n };\n }\n}\n"],"names":["Template__view_search_input","getTargetAndPath","names","target","path","fs","capital","render","entityId","EntityManager","getNamesFromId","body","trim","importKeys","Template"],"mappings":"oGAIaA,qEAAAA,0DAHoC,sDACxB,y7GAElB,IAAA,AAAMA,yCAAN,0CAAMA,+CAAAA,qDAAAA,6BAET,OAAA,iBAFSA,6BAEH,oCAFGA,8BAKXC,IAAAA,yBAAAA,SAAAA,iBAAiBC,KAAwB,EACvC,MAAO,CACLC,OAAQ,qBACRC,KAAM,AAAC,GAAcF,OAAZA,MAAMG,EAAE,CAAC,KAAiB,OAAdH,MAAMI,OAAO,CAAC,kBACrC,CACF,IAEAC,IAAAA,eAAAA,SAAAA,OAAO,KAAkD,MAAlD,AAAEC,SAAF,MAAEA,SACP,IAAMN,MAAQO,4BAAa,CAACC,cAAc,CAACF,UAE3C,OAAO,uCACF,IAAI,CAACP,gBAAgB,CAACC,SACzBS,KAAM,AAAC,oJAIyDT,OAA3DA,MAAMI,OAAO,CAAC,+CAAyDJ,OAAZA,MAAMG,EAAE,CAAC,KAE7DH,OAFgEA,MAAMI,OAAO,CAAC,6CAwBhFJ,OAtBEA,MAAMI,OAAO,CAAC,yiBAsBF,OAAdJ,MAAMI,OAAO,CAAC,uVAatBM,IAAI,GACNC,WAAY,EAAE,EAElB,YA7DWb,6BAAoCc,sBAAQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/testing/_relation-graph.ts"],"sourcesContent":["import { RelationNode, EntityProp, FixtureRecord } from \"../types/types\";\nimport { EntityManager } from \"../entity/entity-manager\";\nimport {\n isRelationProp,\n isBelongsToOneRelationProp,\n isOneToOneRelationProp,\n isManyToManyRelationProp,\n} from \"../types/types\";\n\n// 관계 그래프 처리를 별도 클래스로 분리\nexport class RelationGraph {\n private graph: Map<string, RelationNode> = new Map();\n\n buildGraph(fixtures: FixtureRecord[]): void {\n this.graph.clear();\n\n // 1. 노드 추가\n for (const fixture of fixtures) {\n this.graph.set(fixture.fixtureId, {\n fixtureId: fixture.fixtureId,\n entityId: fixture.entityId,\n related: new Set(),\n });\n }\n\n // 2. 의존성 추가\n for (const fixture of fixtures) {\n const node = this.graph.get(fixture.fixtureId)!;\n\n for (const [, column] of Object.entries(fixture.columns)) {\n const prop = column.prop as EntityProp;\n\n if (isRelationProp(prop)) {\n if (\n isBelongsToOneRelationProp(prop) ||\n (isOneToOneRelationProp(prop) && prop.hasJoinColumn)\n ) {\n const relatedFixtureId = `${prop.with}#${column.value}`;\n if (this.graph.has(relatedFixtureId)) {\n node.related.add(relatedFixtureId);\n }\n } else if (isManyToManyRelationProp(prop)) {\n // ManyToMany 관계의 경우 양방향 의존성 추가\n const relatedIds = column.value as number[];\n for (const relatedId of relatedIds) {\n const relatedFixtureId = `${prop.with}#${relatedId}`;\n if (this.graph.has(relatedFixtureId)) {\n node.related.add(relatedFixtureId);\n this.graph\n .get(relatedFixtureId)!\n .related.add(fixture.fixtureId);\n }\n }\n }\n }\n }\n }\n }\n\n getInsertionOrder(): string[] {\n const visited = new Set<string>();\n const order: string[] = [];\n const tempVisited = new Set<string>();\n\n const visit = (fixtureId: string) => {\n if (visited.has(fixtureId)) return;\n if (tempVisited.has(fixtureId)) {\n console.warn(`Circular dependency detected involving: ${fixtureId}`);\n return;\n }\n\n tempVisited.add(fixtureId);\n\n const node = this.graph.get(fixtureId)!;\n const entity = EntityManager.get(node.entityId);\n\n for (const depId of node.related) {\n const depNode = this.graph.get(depId)!;\n\n // BelongsToOne 관계이면서 nullable이 아닌 경우 먼저 방문\n const relationProp = entity.props.find(\n (prop) =>\n isRelationProp(prop) &&\n (isBelongsToOneRelationProp(prop) ||\n (isOneToOneRelationProp(prop) && prop.hasJoinColumn)) &&\n prop.with === depNode.entityId\n );\n if (relationProp && !relationProp.nullable) {\n visit(depId);\n }\n }\n\n tempVisited.delete(fixtureId);\n visited.add(fixtureId);\n order.push(fixtureId);\n };\n\n for (const fixtureId of this.graph.keys()) {\n visit(fixtureId);\n }\n\n // circular dependency로 인해 방문되지 않은 fixtureId 추가\n for (const fixtureId of this.graph.keys()) {\n if (!visited.has(fixtureId)) {\n order.push(fixtureId);\n }\n }\n\n return order;\n }\n}\n"],"names":["RelationGraph","graph","Map","buildGraph","fixtures","clear","fixture","set","fixtureId","entityId","related","Set","node","get","Object","entries","columns","column","prop","isRelationProp","isBelongsToOneRelationProp","isOneToOneRelationProp","hasJoinColumn","relatedFixtureId","with","value","has","add","isManyToManyRelationProp","relatedIds","relatedId","getInsertionOrder","visited","order","tempVisited","visit","console","warn","entity","EntityManager","depId","depNode","relationProp","props","find","nullable","delete","push","keys"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/testing/fixture-manager.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport _ from \"lodash\";\nimport { Sonamu } from \"../api\";\nimport { EntityManager } from \"../entity/entity-manager\";\nimport {\n EntityProp,\n FixtureImportResult,\n FixtureRecord,\n FixtureSearchOptions,\n ManyToManyRelationProp,\n isBelongsToOneRelationProp,\n isHasManyRelationProp,\n isManyToManyRelationProp,\n isOneToOneRelationProp,\n isRelationProp,\n isVirtualProp,\n} from \"../types/types\";\nimport { Entity } from \"../entity/entity\";\nimport inflection from \"inflection\";\nimport { readFileSync, writeFileSync } from \"fs\";\nimport { RelationGraph } from \"./_relation-graph\";\nimport knex, { Knex } from \"knex\";\nimport { BaseModel } from \"../database/base-model\";\nimport { SonamuDBConfig } from \"../database/db\";\n\nexport class FixtureManagerClass {\n private _tdb: Knex | null = null;\n set tdb(tdb: Knex) {\n this._tdb = tdb;\n }\n get tdb(): Knex {\n if (this._tdb === null) {\n throw new Error(\"FixtureManager has not been initialized\");\n }\n return this._tdb;\n }\n\n private _fdb: Knex | null = null;\n set fdb(fdb: Knex) {\n this._fdb = fdb;\n }\n get fdb(): Knex {\n if (this._fdb === null) {\n throw new Error(\"FixtureManager has not been initialized\");\n }\n return this._fdb;\n }\n cachedTableNames: string[] | null = null;\n\n private relationGraph = new RelationGraph();\n\n init() {\n if (this._tdb !== null) {\n return;\n }\n if (Sonamu.dbConfig.test && Sonamu.dbConfig.production_master) {\n const tConn = Sonamu.dbConfig.test.connection as Knex.ConnectionConfig & {\n port?: number;\n };\n const pConn = Sonamu.dbConfig.production_master\n .connection as Knex.ConnectionConfig & { port?: number };\n if (\n `${tConn.host ?? \"localhost\"}:${tConn.port ?? 3306}/${\n tConn.database\n }` ===\n `${pConn.host ?? \"localhost\"}:${pConn.port ?? 3306}/${pConn.database}`\n ) {\n throw new Error(\n `테스트DB와 프로덕션DB에 동일한 데이터베이스가 사용되었습니다.`\n );\n }\n }\n\n this.tdb = knex(Sonamu.dbConfig.test);\n this.fdb = knex(Sonamu.dbConfig.fixture_local);\n }\n\n async cleanAndSeed(usingTables?: string[]) {\n const tableNames: string[] = await (async () => {\n if (usingTables) {\n return usingTables;\n }\n if (this.cachedTableNames) {\n return this.cachedTableNames;\n }\n\n const [tables] = await this.tdb.raw(\n `SHOW TABLE STATUS WHERE Engine IS NOT NULL AND Name != 'migrations'`\n );\n const tableNames = tables.map(\n (tableInfo: { Name: string }) => tableInfo[\"Name\"]\n );\n this.cachedTableNames = tableNames;\n return tableNames;\n })();\n\n // migrations 제외한 테이블 목록\n const tableListStr = tableNames.join(\", \");\n\n // 한 번에 모든 테이블 체크섬 확인\n const [fdbChecksumRows] = await this.fdb.raw<\n [{ Table: string; Checksum: number }[]]\n >(`CHECKSUM TABLE ${tableListStr}`);\n const [tdbChecksumRows] = await this.tdb.raw<\n [{ Table: string; Checksum: number }[]]\n >(`CHECKSUM TABLE ${tableListStr}`);\n\n // 체크섬 맵 생성\n const fdbChecksums = new Map(\n fdbChecksumRows.map((row) => [row.Table.split(\".\").pop()!, row.Checksum])\n );\n const tdbChecksums = new Map(\n tdbChecksumRows.map((row) => [row.Table.split(\".\").pop()!, row.Checksum])\n );\n\n // 변경된 테이블들만 처리\n const changedTables = tableNames.filter(\n (tableName) => fdbChecksums.get(tableName) !== tdbChecksums.get(tableName)\n );\n\n // 병렬로 truncate + insert 실행\n await this.tdb.transaction(async (trx) => {\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 0`);\n\n await Promise.all(\n changedTables.map(async (tableName) => {\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 0`);\n await trx(tableName).truncate();\n const rawQuery = `INSERT INTO ${\n (Sonamu.dbConfig.test.connection as Knex.ConnectionConfig).database\n }.${tableName}\n SELECT * FROM ${\n (Sonamu.dbConfig.fixture_local.connection as Knex.ConnectionConfig)\n .database\n }.${tableName}`;\n await trx.raw(rawQuery);\n })\n );\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 1`);\n });\n\n // console.timeEnd(\"FIXTURE-CleanAndSeed\");\n }\n\n async getChecksum(db: Knex, tableName: string) {\n const [[checksumRow]] = await db.raw(`CHECKSUM TABLE ${tableName}`);\n return checksumRow.Checksum;\n }\n\n async sync() {\n const frdb = knex(Sonamu.dbConfig.fixture_remote);\n\n const [tables] = await this.fdb.raw(\n \"SHOW TABLE STATUS WHERE Engine IS NOT NULL\"\n );\n const tableNames: string[] = tables.map(\n (table: any) => table.Name as string\n );\n\n console.log(chalk.magenta(\"SYNC...\"));\n await Promise.all(\n tableNames.map(async (tableName) => {\n if (tableName.startsWith(\"knex_migrations\")) {\n return;\n }\n\n const remoteChecksum = await this.getChecksum(frdb, tableName);\n const localChecksum = await this.getChecksum(this.fdb, tableName);\n\n if (remoteChecksum !== localChecksum) {\n await this.fdb.transaction(async (transaction) => {\n await transaction.raw(`SET FOREIGN_KEY_CHECKS = 0`);\n await transaction(tableName).truncate();\n\n const rows = await frdb(tableName);\n if (rows.length === 0) {\n return;\n }\n\n console.log(chalk.blue(tableName), rows.length);\n await transaction\n .insert(\n rows.map((row: any) => {\n return Object.fromEntries(\n Object.entries(row).map(([key, value]) => {\n if (value === null) {\n return [key, null];\n } else if (typeof value === \"boolean\") {\n return [key, value ? 1 : 0];\n } else if (\n typeof value === \"object\" &&\n !(value instanceof Date)\n ) {\n return [key, JSON.stringify(value)];\n } else {\n return [key, value];\n }\n })\n );\n })\n )\n .into(tableName);\n console.log(\"OK\");\n await transaction.raw(`SET FOREIGN_KEY_CHECKS = 1`);\n });\n }\n })\n );\n console.log(chalk.magenta(\"DONE!\"));\n\n await frdb.destroy();\n }\n\n private visitedRecords = new Set<string>();\n async importFixture(entityId: string, ids: number[]) {\n // 방문 기록 초기화 (새로운 import 작업 시작)\n this.visitedRecords.clear();\n\n const queries = _.uniq(\n (\n await Promise.all(\n ids.map(async (id) => {\n return await this.getImportQueries(entityId, \"id\", id);\n })\n )\n ).flat()\n );\n\n const wdb = BaseModel.getDB(\"w\");\n for (let query of queries) {\n const [rsh] = await wdb.raw(query);\n console.log({\n query,\n info: rsh.info,\n });\n }\n }\n\n async getImportQueries(\n entityId: string,\n field: string,\n id: number\n ): Promise<string[]> {\n const recordKey = `${entityId}#${field}#${id}`;\n\n // 순환 참조 방지: 이미 방문한 레코드는 스킵\n if (this.visitedRecords.has(recordKey)) {\n return [];\n }\n this.visitedRecords.add(recordKey);\n\n console.log({ entityId, field, id });\n const entity = EntityManager.get(entityId);\n const wdb = BaseModel.getDB(\"w\");\n\n // 여기서 실DB의 row 가져옴\n const [row] = await wdb(entity.table).where(field, id).limit(1);\n if (row === undefined) {\n throw new Error(`${entityId}#${id} row를 찾을 수 없습니다.`);\n }\n\n // 픽스쳐DB, 실DB\n const fixtureDatabase = (Sonamu.dbConfig.fixture_remote.connection as any)\n .database;\n const realDatabase = (Sonamu.dbConfig.production_master.connection as any)\n .database;\n\n const selfQuery = `INSERT IGNORE INTO \\`${fixtureDatabase}\\`.\\`${entity.table}\\` (SELECT * FROM \\`${realDatabase}\\`.\\`${entity.table}\\` WHERE \\`id\\` = ${id})`;\n\n const args = Object.entries(entity.relations)\n .filter(\n ([, relation]) =>\n isBelongsToOneRelationProp(relation) ||\n (isOneToOneRelationProp(relation) &&\n relation.customJoinClause === undefined)\n )\n .map(([, relation]) => {\n /*\n BelongsToOne인 경우\n Category / 'id' / row[category_id] 호출\n OneToOne에 joinColumn === true 인 경우\n Profile / 'id' / row[profile_id] 호출\n OneToOne에 joinColumn === false 인 경우\n Profile / 'profile_id' / row['id'] 호출\n */\n let field: string;\n let id: number;\n if (isOneToOneRelationProp(relation) && !relation.hasJoinColumn) {\n const relatedEntity = EntityManager.get(relation.with);\n const relatedIdColumnName = relatedEntity.props.find(\n (p) => isRelationProp(p) && p.with === entity.id\n )?.name;\n if (!relatedIdColumnName) {\n throw new Error(\n `${relatedEntity.id}의 ${entity.id} 관계 프롭을 찾을 수 없습니다.`\n );\n }\n field = `${relatedIdColumnName}_id`;\n id = row[\"id\"];\n } else {\n field = \"id\";\n id = row[`${relation.name}_id`];\n }\n return {\n entityId: relation.with,\n field,\n id,\n };\n })\n .filter((arg) => arg.id !== null);\n\n const relQueries = await Promise.all(\n args.map(async (args) => {\n return this.getImportQueries(args.entityId, args.field, args.id);\n })\n );\n\n return [..._.uniq(relQueries.reverse().flat()), selfQuery];\n }\n\n async destroy() {\n if (this._tdb) {\n await this._tdb.destroy();\n this._tdb = null;\n }\n if (this._fdb) {\n await this._fdb.destroy();\n this._fdb = null;\n }\n await BaseModel.destroy();\n }\n\n async getFixtures(\n sourceDBName: keyof SonamuDBConfig,\n targetDBName: keyof SonamuDBConfig,\n searchOptions: FixtureSearchOptions\n ) {\n const sourceDB = knex(Sonamu.dbConfig[sourceDBName]);\n const targetDB = knex(Sonamu.dbConfig[targetDBName]);\n const { entityId, field, value, searchType } = searchOptions;\n\n const entity = EntityManager.get(entityId);\n const column =\n entity.props.find((prop) => prop.name === field)?.type === \"relation\"\n ? `${field}_id`\n : field;\n\n let query = sourceDB(entity.table);\n if (searchType === \"equals\") {\n query = query.where(column, value);\n } else if (searchType === \"like\") {\n query = query.where(column, \"like\", `%${value}%`);\n }\n\n const rows = await query;\n if (rows.length === 0) {\n throw new Error(\"No records found\");\n }\n\n const fixtures: FixtureRecord[] = [];\n for (const row of rows) {\n const initialRecordsLength = fixtures.length;\n const newRecords = await this.createFixtureRecord(entity, row);\n fixtures.push(...newRecords);\n const currentFixtureRecord = fixtures.find(\n (r) => r.fixtureId === `${entityId}#${row.id}`\n );\n\n if (currentFixtureRecord) {\n // 현재 fixture로부터 생성된 fetchedRecords 설정\n currentFixtureRecord.fetchedRecords = fixtures\n .filter((r) => r.fixtureId !== currentFixtureRecord.fixtureId)\n .slice(initialRecordsLength)\n .map((r) => r.fixtureId);\n }\n }\n\n for await (const fixture of fixtures) {\n const entity = EntityManager.get(fixture.entityId);\n\n // ID를 이용하여 targetDB에 레코드가 존재하는지 확인\n const row = await targetDB(entity.table).where(\"id\", fixture.id).first();\n if (row) {\n const [record] = await this.createFixtureRecord(entity, row, {\n singleRecord: true,\n _db: targetDB,\n });\n fixture.target = record;\n continue;\n }\n\n // ID를 이용하여 targetDB에서 조회되지 않는 경우, unique 제약을 위반하는지 확인\n const uniqueRow = await this.checkUniqueViolation(\n targetDB,\n entity,\n fixture\n );\n if (uniqueRow) {\n const [record] = await this.createFixtureRecord(entity, uniqueRow, {\n singleRecord: true,\n _db: targetDB,\n });\n fixture.unique = record;\n }\n }\n\n return _.uniqBy(fixtures, (f) => f.fixtureId);\n }\n\n async createFixtureRecord(\n entity: Entity,\n row: any,\n options?: {\n singleRecord?: boolean;\n _db?: Knex;\n }\n ): Promise<FixtureRecord[]> {\n const records: FixtureRecord[] = [];\n const visitedEntities = new Set<string>();\n\n const create = async (entity: Entity, row: any) => {\n const fixtureId = `${entity.id}#${row.id}`;\n if (visitedEntities.has(fixtureId)) {\n return;\n }\n visitedEntities.add(fixtureId);\n\n const record: FixtureRecord = {\n fixtureId,\n entityId: entity.id,\n id: row.id,\n columns: {},\n fetchedRecords: [],\n belongsRecords: [],\n };\n\n for (const prop of entity.props) {\n if (isVirtualProp(prop)) {\n continue;\n }\n\n record.columns[prop.name] = {\n prop: prop,\n value: row[prop.name],\n };\n\n const db = options?._db ?? BaseModel.getDB(\"w\");\n if (isManyToManyRelationProp(prop)) {\n const relatedEntity = EntityManager.get(prop.with);\n const throughTable = prop.joinTable;\n const fromColumn = `${inflection.singularize(entity.table)}_id`;\n const toColumn = `${inflection.singularize(relatedEntity.table)}_id`;\n\n const relatedIds = await db(throughTable)\n .where(fromColumn, row.id)\n .pluck(toColumn);\n record.columns[prop.name].value = relatedIds;\n } else if (isHasManyRelationProp(prop)) {\n const relatedEntity = EntityManager.get(prop.with);\n const relatedIds = await db(relatedEntity.table)\n .where(prop.joinColumn, row.id)\n .pluck(\"id\");\n record.columns[prop.name].value = relatedIds;\n } else if (isOneToOneRelationProp(prop) && !prop.hasJoinColumn) {\n const relatedEntity = EntityManager.get(prop.with);\n const relatedProp = relatedEntity.props.find(\n (p) => isRelationProp(p) && p.with === entity.id\n );\n if (relatedProp) {\n const relatedRow = await db(relatedEntity.table)\n .where(\"id\", row.id)\n .first();\n record.columns[prop.name].value = relatedRow?.id;\n }\n } else if (isRelationProp(prop)) {\n const relatedId = row[`${prop.name}_id`];\n record.columns[prop.name].value = relatedId;\n if (relatedId) {\n record.belongsRecords.push(`${prop.with}#${relatedId}`);\n }\n if (!options?.singleRecord && relatedId) {\n const relatedEntity = EntityManager.get(prop.with);\n const relatedRow = await db(relatedEntity.table)\n .where(\"id\", relatedId)\n .first();\n if (relatedRow) {\n await create(relatedEntity, relatedRow);\n }\n }\n }\n }\n\n records.push(record);\n };\n\n await create(entity, row);\n\n return records;\n }\n\n async insertFixtures(\n dbName: keyof SonamuDBConfig,\n _fixtures: FixtureRecord[]\n ) {\n const fixtures = _.uniqBy(_fixtures, (f) => f.fixtureId);\n\n this.relationGraph.buildGraph(fixtures);\n const insertionOrder = this.relationGraph.getInsertionOrder();\n const db = knex(Sonamu.dbConfig[dbName]);\n\n await db.transaction(async (trx) => {\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 0`);\n\n for (const fixtureId of insertionOrder) {\n const fixture = fixtures.find((f) => f.fixtureId === fixtureId)!;\n const result = await this.insertFixture(trx as any, fixture);\n if (result.id !== fixture.id) {\n // ID가 변경된 경우, 다른 fixture에서 참조하는 경우가 찾아서 수정\n console.log(\n chalk.yellow(\n `Unique constraint violation: ${fixture.entityId}#${fixture.id} -> ${fixture.entityId}#${result.id}`\n )\n );\n fixtures.forEach((f) => {\n Object.values(f.columns).forEach((column) => {\n if (\n column.prop.type === \"relation\" &&\n column.prop.with === result.entityId &&\n column.value === fixture.id\n ) {\n column.value = result.id;\n }\n });\n });\n fixture.id = result.id;\n }\n }\n\n for (const fixtureId of insertionOrder) {\n const fixture = fixtures.find((f) => f.fixtureId === fixtureId)!;\n await this.handleManyToManyRelations(trx as any, fixture, fixtures);\n }\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 1`);\n });\n\n const records: FixtureImportResult[] = [];\n\n for await (const r of fixtures) {\n const entity = EntityManager.get(r.entityId);\n const record = await db(entity.table).where(\"id\", r.id).first();\n records.push({\n entityId: r.entityId,\n data: record,\n });\n }\n\n return _.uniqBy(records, (r) => `${r.entityId}#${r.data.id}`);\n }\n\n private prepareInsertData(fixture: FixtureRecord) {\n const insertData: any = {};\n for (const [propName, column] of Object.entries(fixture.columns)) {\n if (isVirtualProp(column.prop)) {\n continue;\n }\n\n const prop = column.prop as EntityProp;\n if (!isRelationProp(prop)) {\n if (prop.type === \"json\") {\n insertData[propName] = JSON.stringify(column.value);\n } else if (prop.type === \"timestamp\" || prop.type === \"datetime\") {\n insertData[propName] = new Date(column.value);\n } else {\n insertData[propName] = column.value;\n }\n } else if (\n isBelongsToOneRelationProp(prop) ||\n (isOneToOneRelationProp(prop) && prop.hasJoinColumn)\n ) {\n insertData[`${propName}_id`] = column.value;\n }\n }\n return insertData;\n }\n\n private async insertFixture(db: Knex, fixture: FixtureRecord) {\n const insertData = this.prepareInsertData(fixture);\n const entity = EntityManager.get(fixture.entityId);\n\n try {\n const uniqueFound = await this.checkUniqueViolation(db, entity, fixture);\n if (uniqueFound) {\n return {\n entityId: fixture.entityId,\n id: uniqueFound.id,\n };\n }\n\n const found = await db(entity.table).where(\"id\", fixture.id).first();\n if (found && !fixture.override) {\n return {\n entityId: fixture.entityId,\n id: found.id,\n };\n }\n\n const q = db.insert(insertData).into(entity.table);\n await q.onDuplicateUpdate.apply(q, Object.keys(insertData));\n return {\n entityId: fixture.entityId,\n id: fixture.id,\n };\n } catch (err) {\n console.log(err);\n throw err;\n }\n }\n\n private async handleManyToManyRelations(\n db: Knex,\n fixture: FixtureRecord,\n fixtures: FixtureRecord[]\n ) {\n for (const [, column] of Object.entries(fixture.columns)) {\n const prop = column.prop as EntityProp;\n if (isManyToManyRelationProp(prop)) {\n const joinTable = (prop as ManyToManyRelationProp).joinTable;\n const relatedIds = column.value as number[];\n\n for (const relatedId of relatedIds) {\n if (\n !fixtures.find((f) => f.fixtureId === `${prop.with}#${relatedId}`)\n ) {\n continue;\n }\n\n const entity = EntityManager.get(fixture.entityId);\n const relatedEntity = EntityManager.get(prop.with);\n if (!entity || !relatedEntity) {\n throw new Error(\n `Entity not found: ${fixture.entityId}, ${prop.with}`\n );\n }\n\n const [found] = await db(joinTable)\n .where({\n [`${inflection.singularize(entity.table)}_id`]: fixture.id,\n [`${inflection.singularize(relatedEntity.table)}_id`]: relatedId,\n })\n .limit(1);\n if (found) {\n continue;\n }\n\n const newIds = await db(joinTable).insert({\n [`${inflection.singularize(entity.table)}_id`]: fixture.id,\n [`${inflection.singularize(relatedEntity.table)}_id`]: relatedId,\n });\n console.log(\n chalk.green(\n `Inserted into ${joinTable}: ${entity.table}(${fixture.id}) - ${relatedEntity.table}(${relatedId}) ID: ${newIds}`\n )\n );\n }\n }\n }\n }\n\n async addFixtureLoader(code: string) {\n const path = Sonamu.apiRootPath + \"/src/testing/fixture.ts\";\n let content = readFileSync(path).toString();\n\n const fixtureLoaderStart = content.indexOf(\"const fixtureLoader = {\");\n const fixtureLoaderEnd = content.indexOf(\"};\", fixtureLoaderStart);\n\n if (fixtureLoaderStart !== -1 && fixtureLoaderEnd !== -1) {\n const newContent =\n content.slice(0, fixtureLoaderEnd) +\n \" \" +\n code +\n \"\\n\" +\n content.slice(fixtureLoaderEnd);\n\n writeFileSync(path, newContent);\n } else {\n throw new Error(\"Failed to find fixtureLoader in fixture.ts\");\n }\n }\n\n // 해당 픽스쳐의 값으로 유니크 제약에 위배되는 레코드가 있는지 확인\n private async checkUniqueViolation(\n db: Knex,\n entity: Entity,\n fixture: FixtureRecord\n ) {\n const _uniqueIndexes = entity.indexes.filter((i) => i.type === \"unique\");\n\n // ManyToMany 관계 테이블의 유니크 제약은 제외\n const uniqueIndexes = _uniqueIndexes.filter((index) =>\n index.columns.every((column) => !column.startsWith(`${entity.table}__`))\n );\n if (uniqueIndexes.length === 0) {\n return null;\n }\n\n let uniqueQuery = db(entity.table);\n for (const index of uniqueIndexes) {\n // 컬럼 중 하나라도 null이면 유니크 제약을 위반하지 않기 때문에 해당 인덱스는 무시\n const containsNull = index.columns.some((column) => {\n const field = column.split(\"_id\")[0];\n return fixture.columns[field].value === null;\n });\n if (containsNull) {\n continue;\n }\n\n uniqueQuery = uniqueQuery.orWhere((qb) => {\n for (const column of index.columns) {\n const field = column.split(\"_id\")[0];\n\n if (Array.isArray(fixture.columns[field].value)) {\n qb.whereIn(column, fixture.columns[field].value);\n } else {\n qb.andWhere(column, fixture.columns[field].value);\n }\n }\n });\n }\n const [uniqueFound] = await uniqueQuery;\n return uniqueFound;\n }\n}\nexport const FixtureManager = new FixtureManagerClass();\n"],"names":["FixtureManager","FixtureManagerClass","_tdb","_fdb","cachedTableNames","relationGraph","RelationGraph","visitedRecords","Set","tdb","Error","fdb","init","Sonamu","dbConfig","test","production_master","tConn","connection","pConn","host","port","database","knex","fixture_local","cleanAndSeed","usingTables","tableNames","tableListStr","fdbChecksumRows","tdbChecksumRows","fdbChecksums","tdbChecksums","changedTables","tables","raw","map","tableInfo","join","Map","row","Table","split","pop","Checksum","filter","tableName","get","transaction","trx","Promise","all","rawQuery","truncate","getChecksum","db","checksumRow","sync","frdb","fixture_remote","table","Name","console","log","chalk","magenta","remoteChecksum","localChecksum","startsWith","rows","length","blue","insert","Object","fromEntries","entries","key","value","Date","JSON","stringify","into","destroy","importFixture","entityId","ids","queries","wdb","query","rsh","clear","_","uniq","id","getImportQueries","flat","BaseModel","getDB","info","field","recordKey","entity","fixtureDatabase","realDatabase","selfQuery","args","relQueries","has","add","EntityManager","where","limit","undefined","relations","relation","isBelongsToOneRelationProp","isOneToOneRelationProp","customJoinClause","hasJoinColumn","relatedEntity","with","relatedIdColumnName","props","find","p","isRelationProp","name","arg","reverse","getFixtures","sourceDBName","targetDBName","searchOptions","sourceDB","targetDB","searchType","column","fixtures","fixture","record","uniqueRow","prop","type","initialRecordsLength","newRecords","currentFixtureRecord","createFixtureRecord","push","r","fixtureId","fetchedRecords","slice","first","singleRecord","_db","target","checkUniqueViolation","unique","uniqBy","f","options","records","visitedEntities","create","throughTable","fromColumn","toColumn","relatedIds","relatedProp","relatedRow","relatedId","columns","belongsRecords","isVirtualProp","isManyToManyRelationProp","joinTable","inflection","singularize","pluck","isHasManyRelationProp","joinColumn","insertFixtures","dbName","_fixtures","insertionOrder","buildGraph","getInsertionOrder","result","insertFixture","yellow","forEach","values","handleManyToManyRelations","data","prepareInsertData","insertData","propName","uniqueFound","found","q","err","override","onDuplicateUpdate","apply","keys","newIds","green","addFixtureLoader","code","path","content","fixtureLoaderStart","fixtureLoaderEnd","newContent","apiRootPath","readFileSync","toString","indexOf","writeFileSync","_uniqueIndexes","uniqueIndexes","uniqueQuery","indexes","i","index","every","containsNull","some","orWhere","qb","Array","isArray","whereIn","andWhere"],"mappings":"mPA4tBaA,wBAAAA,oBAnsBAC,6BAAAA,gFAzBK,oEACJ,4BACS,qCACO,+CAavB,gFAEgB,+BACqB,iCACd,6EACH,gCACD,i5MAGnB,IAAA,AAAMA,iCAAN,iCAAMA,6CAAAA,qBACX,sBAAQC,OAAoB,MAW5B,sBAAQC,OAAoB,MAU5BC,sBAAAA,mBAAoC,MAEpC,sBAAQC,gBAAgB,IAAIC,4BAAa,EAoKzC,sBAAQC,iBAAiB,IAAIC,mBA5LlBP,sBAEPQ,IAAAA,UAGJ,eACE,GAAI,IAAI,CAACP,IAAI,GAAK,KAAM,CACtB,MAAM,IAAIQ,MAAM,0CAClB,CACA,OAAO,IAAI,CAACR,IAAI,AAClB,MARA,aAAQO,GAAS,EACf,IAAI,CAACP,IAAI,CAAGO,GACd,IASIE,IAAAA,UAGJ,eACE,GAAI,IAAI,CAACR,IAAI,GAAK,KAAM,CACtB,MAAM,IAAIO,MAAM,0CAClB,CACA,OAAO,IAAI,CAACP,IAAI,AAClB,MARA,aAAQQ,GAAS,EACf,IAAI,CAACR,IAAI,CAAGQ,GACd,IAWAC,IAAAA,aAAAA,SAAAA,OACE,GAAI,IAAI,CAACV,IAAI,GAAK,KAAM,CACtB,MACF,CACA,GAAIW,WAAM,CAACC,QAAQ,CAACC,IAAI,EAAIF,WAAM,CAACC,QAAQ,CAACE,iBAAiB,CAAE,CAC7D,IAAMC,MAAQJ,WAAM,CAACC,QAAQ,CAACC,IAAI,CAACG,UAAU,CAG7C,IAAMC,MAAQN,WAAM,CAACC,QAAQ,CAACE,iBAAiB,CAC5CE,UAAU,KAERD,YAA6BA,YAG7BE,YAA6BA,YAJlC,GACE,AAAC,GAA+BF,OAA7BA,CAAAA,YAAAA,MAAMG,IAAI,UAAVH,qBAAAA,YAAc,YAAY,KAC3BA,OAD8BA,CAAAA,YAAAA,MAAMI,IAAI,UAAVJ,qBAAAA,YAAc,KAAK,KAElD,OADCA,MAAMK,QAAQ,IAEhB,AAAC,GAA+BH,OAA7BA,CAAAA,YAAAA,MAAMC,IAAI,UAAVD,qBAAAA,YAAc,YAAY,KAAyBA,OAAtBA,CAAAA,YAAAA,MAAME,IAAI,UAAVF,qBAAAA,YAAc,KAAK,KAAkB,OAAfA,MAAMG,QAAQ,EACpE,CACA,MAAM,IAAIZ,MACR,sCAEJ,CACF,CAEA,IAAI,CAACD,GAAG,CAAGc,GAAAA,aAAI,EAACV,WAAM,CAACC,QAAQ,CAACC,IAAI,CACpC,CAAA,IAAI,CAACJ,GAAG,CAAGY,GAAAA,aAAI,EAACV,WAAM,CAACC,QAAQ,CAACU,aAAa,CAC/C,IAEMC,IAAAA,qBAAN,SAAMA,aAAaC,WAAsB,kDACjCC,WAmBAC,aAGoB,KAAnBC,gBAGmB,MAAnBC,gBAKDC,aAGAC,aAKAC,gGAtCuB,SAAM,AAAC,qDAQjB,KAAVC,OAGDP,kFAVN,GAAID,YAAa,CACf,SAAOA,YACT,CACA,GAAI,IAAI,CAACtB,gBAAgB,CAAE,CACzB,SAAO,IAAI,CAACA,gBAAgB,CAC9B,CAEiB,SAAM,IAAI,CAACK,GAAG,CAAC0B,GAAG,CACjC,+EADe,oCAAA,kBAAVD,OAAU,QAGXP,WAAaO,OAAOE,GAAG,CAC3B,SAACC,kBAAgCA,SAAS,CAAC,OAAO,EAEpD,CAAA,IAAI,CAACjC,gBAAgB,CAAGuB,WACxB,SAAOA,cACT,0BAhBMA,WAAuB,cAmBvBC,aAAeD,WAAWW,IAAI,CAAC,MAGX,SAAM,IAAI,CAAC3B,GAAG,CAACwB,GAAG,CAE1C,AAAC,kBAA8B,OAAbP,uBAFM,oCAAA,kBAAnBC,gBAAmB,QAGA,SAAM,IAAI,CAACpB,GAAG,CAAC0B,GAAG,CAE1C,AAAC,kBAA8B,OAAbP,uBAFM,qCAAA,kBAAnBE,gBAAmB,SAKpBC,aAAe,IAAIQ,IACvBV,gBAAgBO,GAAG,CAAC,SAACI,WAAQ,CAACA,IAAIC,KAAK,CAACC,KAAK,CAAC,KAAKC,GAAG,GAAKH,IAAII,QAAQ,CAAC,IAEpEZ,aAAe,IAAIO,IACvBT,gBAAgBM,GAAG,CAAC,SAACI,WAAQ,CAACA,IAAIC,KAAK,CAACC,KAAK,CAAC,KAAKC,GAAG,GAAKH,IAAII,QAAQ,CAAC,IAIpEX,cAAgBN,WAAWkB,MAAM,CACrC,SAACC,kBAAcf,aAAagB,GAAG,CAACD,aAAed,aAAae,GAAG,CAACD,aAIlE,SAAM,IAAI,CAACrC,GAAG,CAACuC,WAAW,CAAC,SAAOC,kHAChC,SAAMA,IAAId,GAAG,CAAC,sCAAd,cAEA,SAAMe,QAAQC,GAAG,CACflB,cAAcG,GAAG,CAAC,SAAOU,qDAGjBM,gFAFN,SAAMH,IAAId,GAAG,CAAC,sCAAd,cACA,SAAMc,IAAIH,WAAWO,QAAQ,WAA7B,cACMD,SAAW,AAAC,eAEdN,OADF,AAACjC,WAAM,CAACC,QAAQ,CAACC,IAAI,CAACG,UAAU,CAA2BI,QAAQ,CACpE,KAED,OAFIwB,UAAU,4BAIZA,OAFF,AAACjC,WAAM,CAACC,QAAQ,CAACU,aAAa,CAACN,UAAU,CACtCI,QAAQ,CACZ,KAAa,OAAVwB,WACF,SAAMG,IAAId,GAAG,CAACiB,kBAAd,0BACF,gBAZF,cAcA,SAAMH,IAAId,GAAG,CAAC,sCAAd,0BACF,eAlBA,0BAqBF,iBAEMmB,IAAAA,oBAAN,SAAMA,YAAYC,EAAQ,CAAET,SAAiB,4CACnB,WAAhBU,mFAAgB,SAAMD,GAAGpB,GAAG,CAAC,AAAC,kBAA2B,OAAVW,oBAA/B,oCAAA,yCAAA,WAAhBU,qBACR,SAAOA,YAAYZ,QAAQ,IAC7B,QAEMa,IAAAA,aAAN,SAAMA,uDACEC,KAEW,KAAVxB,OAGDP,6FALA+B,KAAOnC,GAAAA,aAAI,EAACV,WAAM,CAACC,QAAQ,CAAC6C,cAAc,EAE/B,SAAM,IAAI,CAAChD,GAAG,CAACwB,GAAG,CACjC,sDADe,oCAAA,kBAAVD,OAAU,QAGXP,WAAuBO,OAAOE,GAAG,CACrC,SAACwB,cAAeA,MAAMC,IAAI,GAG5BC,QAAQC,GAAG,CAACC,cAAK,CAACC,OAAO,CAAC,YAC1B,SAAMf,QAAQC,GAAG,CACfxB,WAAWS,GAAG,CAAC,SAAOU,qDAKdoB,eACAC,qFALN,GAAIrB,UAAUsB,UAAU,CAAC,mBAAoB,CAC3C,SACF,CAEuB,SAAM,IAAI,CAACd,WAAW,CAACI,KAAMZ,mBAA9CoB,eAAiB,cACD,SAAM,IAAI,CAACZ,WAAW,CAAC,IAAI,CAAC3C,GAAG,CAAEmC,mBAAjDqB,cAAgB,kBAElBD,CAAAA,iBAAmBC,aAAY,EAA/BD,YACF,SAAM,IAAI,CAACvD,GAAG,CAACqC,WAAW,CAAC,SAAOA,uDAI1BqB,4EAHN,SAAMrB,YAAYb,GAAG,CAAC,sCAAtB,cACA,SAAMa,YAAYF,WAAWO,QAAQ,WAArC,cAEa,SAAMK,KAAKZ,mBAAlBuB,KAAO,cACb,GAAIA,KAAKC,MAAM,GAAK,EAAG,CACrB,SACF,CAEAR,QAAQC,GAAG,CAACC,cAAK,CAACO,IAAI,CAACzB,WAAYuB,KAAKC,MAAM,EAC9C,SAAMtB,YACHwB,MAAM,CACLH,KAAKjC,GAAG,CAAC,SAACI,KACR,OAAOiC,OAAOC,WAAW,CACvBD,OAAOE,OAAO,CAACnC,KAAKJ,GAAG,CAAC,qDAAEwC,cAAKC,gBAC7B,GAAIA,QAAU,KAAM,CAClB,MAAO,CAACD,IAAK,KAAK,AACpB,MAAO,GAAI,OAAOC,QAAU,UAAW,CACrC,MAAO,CAACD,IAAKC,MAAQ,EAAI,EAAE,AAC7B,MAAO,GACL,CAAA,OAAOA,gCAAP,SAAOA,MAAI,IAAM,UACjB,CAAEA,AAAK,YAALA,MAAiBC,MACnB,CACA,MAAO,CAACF,IAAKG,KAAKC,SAAS,CAACH,OAAO,AACrC,KAAO,CACL,MAAO,CAACD,IAAKC,MAAM,AACrB,CACF,GAEJ,IAEDI,IAAI,CAACnC,mBArBR,cAsBAgB,QAAQC,GAAG,CAAC,MACZ,SAAMf,YAAYb,GAAG,CAAC,sCAAtB,0BACF,eAlCA,gDAoCJ,0BA9CF,cAgDA2B,QAAQC,GAAG,CAACC,cAAK,CAACC,OAAO,CAAC,UAE1B,SAAMP,KAAKwB,OAAO,WAAlB,0BACF,iBAGMC,IAAAA,sBAAN,SAAMA,cAAcC,QAAgB,CAAEC,GAAa,kDAI3CC,UAUAC,IACD,0BAAA,kBAAA,eAAA,UAAA,MAAIC,MACO,KAAPC,0FAdT,IAAI,CAAClF,cAAc,CAACmF,KAAK,KAETC,eAAC,CAACC,IAAI,CAElB,SAAM1C,QAAQC,GAAG,CACfkC,IAAIjD,GAAG,CAAC,SAAOyD,iHACN,SAAM,IAAI,CAACC,gBAAgB,CAACV,SAAU,KAAMS,YAAnD,SAAO,iBACT,0BALAP,QAAUK,QAAAA,eAAC,EACf,AACE,cAKAI,IAAI,KAGFR,IAAMS,oBAAS,CAACC,KAAK,CAAC,KACvB,+BAAA,wBAAA,2EAAA,UAAaX,uDAAb,2BAAA,MAAA,oCAAIE,MAAJ,YACW,SAAMD,IAAIpD,GAAG,CAACqD,eAAd,oCAAA,kBAAPC,IAAO,QACd3B,QAAQC,GAAG,CAAC,CACVyB,MAAAA,MACAU,KAAMT,IAAIS,IAAI,AAChB,yBALG,uFAAA,uBAAA,8CAAA,2BAAA,wBAAA,+BAAA,yBAAA,6CAOP,iBAEMJ,IAAAA,yBAAN,SAAMA,iBACJV,QAAgB,CAChBe,KAAa,CACbN,EAAU,kDAEJO,UASAC,OACAd,IAGQ,KAAP/C,IAMD8D,gBAEAC,aAGAC,UAEAC,KA0CAC,6FApEAN,UAAY,AAAC,GAAcD,OAAZf,SAAS,KAAYS,OAATM,MAAM,KAAM,OAAHN,IAG1C,GAAI,IAAI,CAACtF,cAAc,CAACoG,GAAG,CAACP,WAAY,CACtC,YACF,CACA,IAAI,CAAC7F,cAAc,CAACqG,GAAG,CAACR,WAExBtC,QAAQC,GAAG,CAAC,CAAEqB,SAAAA,SAAUe,MAAAA,MAAON,GAAAA,EAAG,GAC5BQ,OAASQ,4BAAa,CAAC9D,GAAG,CAACqC,UAC3BG,IAAMS,oBAAS,CAACC,KAAK,CAAC,KAGd,SAAMV,IAAIc,OAAOzC,KAAK,EAAEkD,KAAK,CAACX,MAAON,IAAIkB,KAAK,CAAC,WAA/C,oCAAA,kBAAPvE,IAAO,QACd,GAAIA,MAAQwE,UAAW,CACrB,MAAM,IAAItG,MAAM,AAAC,GAAcmF,OAAZT,SAAS,KAAM,OAAHS,GAAG,oBACpC,CAGMS,gBAAkB,AAACzF,WAAM,CAACC,QAAQ,CAAC6C,cAAc,CAACzC,UAAU,CAC/DI,QAAQ,CACLiF,aAAe,AAAC1F,WAAM,CAACC,QAAQ,CAACE,iBAAiB,CAACE,UAAU,CAC/DI,QAAQ,CAELkF,UAAY,AAAC,uBAA8CH,OAAvBC,gBAAgB,OAA0CC,OAAnCF,OAAOzC,KAAK,CAAC,sBAA0CyC,OAApBE,aAAa,OAAwCV,OAAjCQ,OAAOzC,KAAK,CAAC,mBAAuB,OAAHiC,GAAG,KAEtJY,KAAOhC,OAAOE,OAAO,CAAC0B,OAAOY,SAAS,EACzCpE,MAAM,CACL,qDAAIqE,yBACFC,GAAAA,iCAA0B,EAACD,WAC1BE,GAAAA,6BAAsB,EAACF,WACtBA,SAASG,gBAAgB,GAAKL,YAEnC5E,GAAG,CAAC,qDAAI8E,mBASP,IAAIf,QACJ,IAAIN,KACJ,GAAIuB,GAAAA,6BAAsB,EAACF,WAAa,CAACA,SAASI,aAAa,CAAE,KAEnCC,0BAD5B,IAAMA,cAAgBV,4BAAa,CAAC9D,GAAG,CAACmE,SAASM,IAAI,EACrD,IAAMC,qBAAsBF,0BAAAA,cAAcG,KAAK,CAACC,IAAI,CAClD,SAACC,SAAMC,GAAAA,qBAAc,EAACD,IAAMA,EAAEJ,IAAI,GAAKnB,OAAOR,EAAE,YADtB0B,0CAAAA,0BAEzBO,IAAI,CACP,GAAI,CAACL,oBAAqB,CACxB,MAAM,IAAI/G,MACR,AAAC,GAAuB2F,OAArBkB,cAAc1B,EAAE,CAAC,MAAc,OAAVQ,OAAOR,EAAE,CAAC,sBAEtC,CACAM,QAAQ,AAAC,GAAsB,OAApBsB,oBAAoB,OAC/B5B,KAAKrD,GAAG,CAAC,KAAK,AAChB,KAAO,CACL2D,QAAQ,KACRN,KAAKrD,GAAG,CAAC,AAAC,GAAgB,OAAd0E,SAASY,IAAI,CAAC,OAAK,AACjC,CACA,MAAO,CACL1C,SAAU8B,SAASM,IAAI,CACvBrB,MAAAA,QACAN,GAAAA,IACF,CACF,GACChD,MAAM,CAAC,SAACkF,YAAQA,IAAIlC,EAAE,GAAK,OAEX,SAAM3C,QAAQC,GAAG,CAClCsD,KAAKrE,GAAG,CAAC,SAAOqE,uFACd,SAAO,IAAI,CAACX,gBAAgB,CAACW,KAAKrB,QAAQ,CAAEqB,KAAKN,KAAK,CAAEM,KAAKZ,EAAE,IACjE,0BAHIa,WAAa,cAMnB,SAAO,AAAC,qBAAGf,eAAC,CAACC,IAAI,CAACc,WAAWsB,OAAO,GAAGjC,IAAI,aAAKS,eAClD,iBAEMtB,IAAAA,gBAAN,SAAMA,2HACA,IAAI,CAAChF,IAAI,CAAT,YACF,SAAM,IAAI,CAACA,IAAI,CAACgF,OAAO,WAAvB,aACA,CAAA,IAAI,CAAChF,IAAI,CAAG,+BAEV,IAAI,CAACC,IAAI,CAAT,YACF,SAAM,IAAI,CAACA,IAAI,CAAC+E,OAAO,WAAvB,aACA,CAAA,IAAI,CAAC/E,IAAI,CAAG,2BAEd,SAAM6F,oBAAS,CAACd,OAAO,WAAvB,0BACF,iBAEM+C,IAAAA,oBAAN,SAAMA,YACJC,YAAkC,CAClCC,YAAkC,CAClCC,aAAmC,4CAQjC/B,mBANIgC,SACAC,SACElD,SAAUe,MAAOtB,MAAO0D,WAE1BlC,OACAmC,OAKFhD,MAOEnB,KAKAoE,SACD,0BAAA,kBAAA,2BAAA,UAAA,gGAiBYC,QACTrC,QAGA7D,IAEa,KAAVmG,OASHC,UAMa,MAAVD,oFA7DLN,SAAW9G,GAAAA,aAAI,EAACV,WAAM,CAACC,QAAQ,CAACoH,aAAa,EAC7CI,SAAW/G,GAAAA,aAAI,EAACV,WAAM,CAACC,QAAQ,CAACqH,aAAa,EAC3C/C,SAAuCgD,cAAvChD,SAAUe,MAA6BiC,cAA7BjC,MAAOtB,MAAsBuD,cAAtBvD,MAAO0D,WAAeH,cAAfG,WAE1BlC,OAASQ,4BAAa,CAAC9D,GAAG,CAACqC,UAC3BoD,OACJnC,EAAAA,mBAAAA,OAAOqB,KAAK,CAACC,IAAI,CAAC,SAACkB,aAASA,KAAKf,IAAI,GAAK3B,iBAA1CE,mCAAAA,mBAAkDyC,IAAI,IAAK,WACvD,AAAC,GAAQ,OAAN3C,MAAM,OACTA,MAEFX,MAAQ6C,SAAShC,OAAOzC,KAAK,EACjC,GAAI2E,aAAe,SAAU,CAC3B/C,MAAQA,MAAMsB,KAAK,CAAC0B,OAAQ3D,MAC9B,MAAO,GAAI0D,aAAe,OAAQ,CAChC/C,MAAQA,MAAMsB,KAAK,CAAC0B,OAAQ,OAAQ,AAAC,IAAS,OAAN3D,MAAM,KAChD,CAEa,SAAMW,cAAbnB,KAAO,cACb,GAAIA,KAAKC,MAAM,GAAK,EAAG,CACrB,MAAM,IAAI5D,MAAM,mBAClB,CAEM+H,YACD,+BAAA,wBAAA,gGAAMjG,IAGTiG,UAFMM,qBACAC,WAEAC,4FAJGzG,IAAN,YACGuG,qBAAuBN,SAASnE,MAAM,CACzB,SAAM,MAAK4E,mBAAmB,CAAC7C,OAAQ7D,aAApDwG,WAAa,cACnBP,CAAAA,UAAAA,UAASU,IAAI,OAAbV,UAAc,qBAAGO,aACXC,qBAAuBR,SAASd,IAAI,CACxC,SAACyB,UAAMA,EAAEC,SAAS,GAAK,AAAC,GAAc7G,OAAZ4C,SAAS,KAAU,OAAP5C,IAAIqD,EAAE,IAG9C,GAAIoD,qBAAsB,CAExBA,qBAAqBK,cAAc,CAAGb,SACnC5F,MAAM,CAAC,SAACuG,UAAMA,EAAEC,SAAS,GAAKJ,qBAAqBI,SAAS,GAC5DE,KAAK,CAACR,sBACN3G,GAAG,CAAC,SAACgH,UAAMA,EAAEC,SAAS,EAC3B,aACF,EAfK,UAAahF,oDAAb,2BAAA,MAAA,wHAAA,uFAAA,uBAAA,8CAAA,2BAAA,wBAAA,+BAAA,yBAAA,6KAiBuBoE,oKAAXC,eACTrC,QAASQ,4BAAa,CAAC9D,GAAG,CAAC2F,QAAQtD,QAAQ,EAGrC,SAAMkD,SAASjC,QAAOzC,KAAK,EAAEkD,KAAK,CAAC,KAAM4B,QAAQ7C,EAAE,EAAE2D,KAAK,YAAhEhH,IAAM,kBACRA,IAAAA,aACe,SAAM,IAAI,CAAC0G,mBAAmB,CAAC7C,QAAQ7D,IAAK,CAC3DiH,aAAc,KACdC,IAAKpB,QACP,YAHiB,oCAAA,kBAAVK,OAAU,OAIjBD,CAAAA,QAAQiB,MAAM,CAAGhB,OACjB,qBAIgB,SAAM,IAAI,CAACiB,oBAAoB,CAC/CtB,SACAjC,QACAqC,kBAHIE,UAAY,kBAKdA,UAAAA,aACe,SAAM,IAAI,CAACM,mBAAmB,CAAC7C,QAAQuC,UAAW,CACjEa,aAAc,KACdC,IAAKpB,QACP,YAHiB,qCAAA,kBAAVK,QAAU,QAIjBD,CAAAA,QAAQmB,MAAM,CAAGlB,qdAIrB,SAAOhD,eAAC,CAACmE,MAAM,CAACrB,SAAU,SAACsB,UAAMA,EAAEV,SAAS,MAC9C,iBAEMH,IAAAA,4BAAN,SAAMA,oBACJ7C,MAAc,CACd7D,GAAQ,CACRwH,OAGC,4CAEKC,QACAC,gBAEAC,8EAHAF,WACAC,gBAAkB,IAAI1J,IAEtB2J,OAAS,SAAO9D,OAAgB7D,+CAC9B6G,UAMAV,OASD,0BAAA,kBAAA,eAAA,UAAA,MAAME,KAUEmB,aAALzG,GAEEgE,cACA6C,aACAC,WACAC,SAEAC,WAKAhD,eACAgD,YAKAhD,eACAiD,YAIEC,WAMFC,UAMEnD,eACAkD,uFA7DNpB,UAAY,AAAC,GAAe7G,OAAb6D,OAAOR,EAAE,CAAC,KAAU,OAAPrD,IAAIqD,EAAE,EACxC,GAAIqE,gBAAgBvD,GAAG,CAAC0C,WAAY,CAClC,SACF,CACAa,gBAAgBtD,GAAG,CAACyC,WAEdV,OAAwB,CAC5BU,UAAAA,UACAjE,SAAUiB,OAAOR,EAAE,CACnBA,GAAIrD,IAAIqD,EAAE,CACV8E,QAAS,CAAC,EACVrB,cAAc,IACdsB,cAAc,GAChB,EAEK,+BAAA,wBAAA,8EAAA,UAAcvE,OAAOqB,KAAK,gDAA1B,2BAAA,MAAA,qCAAMmB,KAAN,YACH,GAAIgC,GAAAA,oBAAa,EAAChC,MAAO,CACvB,YACF,CAEAF,OAAOgC,OAAO,CAAC9B,KAAKf,IAAI,CAAC,CAAG,CAC1Be,KAAMA,KACNhE,MAAOrC,GAAG,CAACqG,KAAKf,IAAI,CAAC,AACvB,EAEMvE,GAAKyG,CAAAA,aAAAA,gBAAAA,wBAAAA,QAASN,GAAG,UAAZM,sBAAAA,aAAgBhE,oBAAS,CAACC,KAAK,CAAC,SACvC6E,GAAAA,+BAAwB,EAACjC,MAAzBiC,YACIvD,cAAgBV,4BAAa,CAAC9D,GAAG,CAAC8F,KAAKrB,IAAI,EAC3C4C,aAAevB,KAAKkC,SAAS,CAC7BV,WAAa,AAAC,GAAuC,OAArCW,mBAAU,CAACC,WAAW,CAAC5E,OAAOzC,KAAK,EAAE,OACrD0G,SAAW,AAAC,GAA8C,OAA5CU,mBAAU,CAACC,WAAW,CAAC1D,cAAc3D,KAAK,EAAE,OAE7C,SAAML,GAAG6G,cACzBtD,KAAK,CAACuD,WAAY7H,IAAIqD,EAAE,EACxBqF,KAAK,CAACZ,kBAFHC,WAAa,aAGnB5B,CAAAA,OAAOgC,OAAO,CAAC9B,KAAKf,IAAI,CAAC,CAACjD,KAAK,CAAG0F,mCACzBY,GAAAA,4BAAqB,EAACtC,MAAtBsC,YACH5D,eAAgBV,4BAAa,CAAC9D,GAAG,CAAC8F,KAAKrB,IAAI,EAC9B,SAAMjE,GAAGgE,eAAc3D,KAAK,EAC5CkD,KAAK,CAAC+B,KAAKuC,UAAU,CAAE5I,IAAIqD,EAAE,EAC7BqF,KAAK,CAAC,cAFHX,YAAa,aAGnB5B,CAAAA,OAAOgC,OAAO,CAAC9B,KAAKf,IAAI,CAAC,CAACjD,KAAK,CAAG0F,oCACzBnD,CAAAA,GAAAA,6BAAsB,EAACyB,OAAS,CAACA,KAAKvB,aAAa,AAAD,EAAlDF,YACHG,eAAgBV,4BAAa,CAAC9D,GAAG,CAAC8F,KAAKrB,IAAI,EAC3CgD,YAAcjD,eAAcG,KAAK,CAACC,IAAI,CAC1C,SAACC,SAAMC,GAAAA,qBAAc,EAACD,IAAMA,EAAEJ,IAAI,GAAKnB,OAAOR,EAAE,OAE9C2E,YAAAA,YACiB,SAAMjH,GAAGgE,eAAc3D,KAAK,EAC5CkD,KAAK,CAAC,KAAMtE,IAAIqD,EAAE,EAClB2D,KAAK,WAFFiB,WAAa,aAGnB9B,CAAAA,OAAOgC,OAAO,CAAC9B,KAAKf,IAAI,CAAC,CAACjD,KAAK,CAAG4F,mBAAAA,2BAAAA,WAAY5E,EAAE,+CAEzCgC,GAAAA,qBAAc,EAACgB,MAAfhB,aACH6C,UAAYlI,GAAG,CAAC,AAAC,GAAY,OAAVqG,KAAKf,IAAI,CAAC,OAAK,AACxCa,CAAAA,OAAOgC,OAAO,CAAC9B,KAAKf,IAAI,CAAC,CAACjD,KAAK,CAAG6F,UAClC,GAAIA,UAAW,CACb/B,OAAOiC,cAAc,CAACzB,IAAI,CAAC,AAAC,GAAeuB,OAAb7B,KAAKrB,IAAI,CAAC,KAAa,OAAVkD,WAC7C,KACI,CAAA,EAACV,gBAAAA,wBAAAA,QAASP,YAAY,GAAIiB,SAAQ,EAAlC,aACInD,eAAgBV,4BAAa,CAAC9D,GAAG,CAAC8F,KAAKrB,IAAI,EAC9B,SAAMjE,GAAGgE,eAAc3D,KAAK,EAC5CkD,KAAK,CAAC,KAAM4D,WACZlB,KAAK,YAFFiB,YAAa,kBAGfA,YAAAA,aACF,SAAMN,OAAO5C,eAAekD,sBAA5B,sCAlDH,0FAAA,uBAAA,gDAAA,2BAAA,wBAAA,+BAAA,yBAAA,kCAwDLR,QAAQd,IAAI,CAACR,oBACf,MAEA,SAAMwB,OAAO9D,OAAQ7D,aAArB,cAEA,SAAOyH,WACT,QAEMoB,IAAAA,uBAAN,SAAMA,eACJC,MAA4B,CAC5BC,SAA0B,kDAEpB9C,SAGA+C,eACAjI,GAqCA0G,0FAEWb,EACT/C,OACAsC,8FA7CFF,SAAW9C,eAAC,CAACmE,MAAM,CAACyB,UAAW,SAACxB,UAAMA,EAAEV,SAAS,GAEvD,IAAI,CAAChJ,aAAa,CAACoL,UAAU,CAAChD,UACxB+C,eAAiB,IAAI,CAACnL,aAAa,CAACqL,iBAAiB,GACrDnI,GAAKhC,GAAAA,aAAI,EAACV,WAAM,CAACC,QAAQ,CAACwK,OAAO,EAEvC,SAAM/H,GAAGP,WAAW,CAAC,SAAOC,+CAGrB,0BAAA,kBAAA,2BAAA,UAAA,UAyBA,2BAAA,mBAAA,8BAAA,WAAA,kFA3BL,SAAMA,IAAId,GAAG,CAAC,sCAAd,cAEK,+BAAA,wBAAA,gGAAMkH,UACHX,QACAiD,8EAFGtC,UAAN,YACGX,QAAUD,SAASd,IAAI,CAAC,SAACoC,UAAMA,EAAEV,SAAS,GAAKA,YACtC,SAAM,MAAKuC,aAAa,CAAC3I,IAAYyF,iBAA9CiD,OAAS,cACf,GAAIA,OAAO9F,EAAE,GAAK6C,QAAQ7C,EAAE,CAAE,CAE5B/B,QAAQC,GAAG,CACTC,cAAK,CAAC6H,MAAM,CACV,AAAC,gCAAmDnD,OAApBA,QAAQtD,QAAQ,CAAC,KAAoBsD,OAAjBA,QAAQ7C,EAAE,CAAC,QAA0B8F,OAApBjD,QAAQtD,QAAQ,CAAC,KAAa,OAAVuG,OAAO9F,EAAE,IAGtG4C,SAASqD,OAAO,CAAC,SAAC/B,GAChBtF,OAAOsH,MAAM,CAAChC,EAAEY,OAAO,EAAEmB,OAAO,CAAC,SAACtD,QAChC,GACEA,OAAOK,IAAI,CAACC,IAAI,GAAK,YACrBN,OAAOK,IAAI,CAACrB,IAAI,GAAKmE,OAAOvG,QAAQ,EACpCoD,OAAO3D,KAAK,GAAK6D,QAAQ7C,EAAE,CAC3B,CACA2C,OAAO3D,KAAK,CAAG8G,OAAO9F,EAAE,AAC1B,CACF,EACF,EACA6C,CAAAA,QAAQ7C,EAAE,CAAG8F,OAAO9F,EAAE,AACxB,aACF,EAvBK,UAAmB2F,8DAAnB,2BAAA,MAAA,wHAAA,uFAAA,uBAAA,8CAAA,2BAAA,wBAAA,+BAAA,yBAAA,iCAyBA,gCAAA,yBAAA,wGAAMnC,UACHX,+EADGW,UAAN,aACGX,QAAUD,SAASd,IAAI,CAAC,SAACoC,UAAMA,EAAEV,SAAS,GAAKA,YACrD,SAAM,OAAK2C,yBAAyB,CAAC/I,IAAYyF,QAASD,kBAA1D,0BACF,EAHK,WAAmB+C,gEAAnB,4BAAA,OAAA,+HAAA,4FAAA,wBAAA,iDAAA,4BAAA,yBAAA,gCAAA,0BAAA,mCAIL,SAAMvI,IAAId,GAAG,CAAC,uCAAd,0BACF,yBAjCA,cAmCM8H,gJAEgBxB,6JAALW,SACT/C,OAASQ,4BAAa,CAAC9D,GAAG,CAACqG,EAAEhE,QAAQ,EAC5B,SAAM7B,GAAG8C,OAAOzC,KAAK,EAAEkD,KAAK,CAAC,KAAMsC,EAAEvD,EAAE,EAAE2D,KAAK,WAAvDb,OAAS,cACfsB,QAAQd,IAAI,CAAC,CACX/D,SAAUgE,EAAEhE,QAAQ,CACpB6G,KAAMtD,MACR,mcAGF,SAAOhD,eAAC,CAACmE,MAAM,CAACG,QAAS,SAACb,SAAM,AAAC,GAAgBA,OAAdA,EAAEhE,QAAQ,CAAC,KAAa,OAAVgE,EAAE6C,IAAI,CAACpG,EAAE,OAC5D,iBAEQqG,IAAAA,0BAAR,SAAQA,kBAAkBxD,OAAsB,EAC9C,IAAMyD,WAAkB,CAAC,MACpB,+BAAA,wBAAA,6BAAL,QAAK,UAA4B1H,OAAOE,OAAO,CAAC+D,QAAQiC,OAAO,qBAA1D,QAAA,2BAAA,MAAA,wBAAA,+BAA6D,CAA7D,iCAAA,eAAOyB,wBAAU5D,sBACpB,GAAIqC,GAAAA,oBAAa,EAACrC,OAAOK,IAAI,EAAG,CAC9B,QACF,CAEA,IAAMA,KAAOL,OAAOK,IAAI,CACxB,GAAI,CAAChB,GAAAA,qBAAc,EAACgB,MAAO,CACzB,GAAIA,KAAKC,IAAI,GAAK,OAAQ,CACxBqD,UAAU,CAACC,SAAS,CAAGrH,KAAKC,SAAS,CAACwD,OAAO3D,KAAK,CACpD,MAAO,GAAIgE,KAAKC,IAAI,GAAK,aAAeD,KAAKC,IAAI,GAAK,WAAY,CAChEqD,UAAU,CAACC,SAAS,CAAG,IAAItH,KAAK0D,OAAO3D,KAAK,CAC9C,KAAO,CACLsH,UAAU,CAACC,SAAS,CAAG5D,OAAO3D,KAAK,AACrC,CACF,MAAO,GACLsC,GAAAA,iCAA0B,EAAC0B,OAC1BzB,GAAAA,6BAAsB,EAACyB,OAASA,KAAKvB,aAAa,CACnD,CACA6E,UAAU,CAAC,AAAC,GAAW,OAATC,SAAS,OAAK,CAAG5D,OAAO3D,KAAK,AAC7C,CACF,aApBK,uBAAA,mCAAA,2BAAA,wBAAA,+BAAA,yBAAA,iBAqBL,OAAOsH,UACT,IAEcP,IAAAA,sBAAd,SAAcA,cAAcrI,EAAQ,CAAEmF,OAAsB,4CACpDyD,WACA9F,OAGEgG,YAQAC,MAQAC,EAMCC,2EA1BHL,WAAa,IAAI,CAACD,iBAAiB,CAACxD,SACpCrC,OAASQ,4BAAa,CAAC9D,GAAG,CAAC2F,QAAQtD,QAAQ,mDAG3B,SAAM,IAAI,CAACwE,oBAAoB,CAACrG,GAAI8C,OAAQqC,iBAA1D2D,YAAc,cACpB,GAAIA,YAAa,CACf,SAAO,CACLjH,SAAUsD,QAAQtD,QAAQ,CAC1BS,GAAIwG,YAAYxG,EAAE,AACpB,EACF,CAEc,SAAMtC,GAAG8C,OAAOzC,KAAK,EAAEkD,KAAK,CAAC,KAAM4B,QAAQ7C,EAAE,EAAE2D,KAAK,WAA5D8C,MAAQ,cACd,GAAIA,OAAS,CAAC5D,QAAQ+D,QAAQ,CAAE,CAC9B,SAAO,CACLrH,SAAUsD,QAAQtD,QAAQ,CAC1BS,GAAIyG,MAAMzG,EAAE,AACd,EACF,CAEM0G,EAAIhJ,GAAGiB,MAAM,CAAC2H,YAAYlH,IAAI,CAACoB,OAAOzC,KAAK,EACjD,SAAM2I,EAAEG,iBAAiB,CAACC,KAAK,CAACJ,EAAG9H,OAAOmI,IAAI,CAACT,qBAA/C,cACA,SAAO,CACL/G,SAAUsD,QAAQtD,QAAQ,CAC1BS,GAAI6C,QAAQ7C,EAAE,AAChB,UACO2G,kBACP1I,QAAQC,GAAG,CAACyI,IACZ,OAAMA,uBAEV,iBAEcR,IAAAA,kCAAd,SAAcA,0BACZzI,EAAQ,CACRmF,OAAsB,CACtBD,QAAyB,4CAEpB,0BAAA,kBAAA,qBAAA,UAAA,iFAAA,+BAAA,wBAAA,4GAASD,OACNK,KAEEkC,UACAR,WAED,0BAAA,kBAAA,qBAAA,UAAA,+GANJ,eAAS/B,sBACNK,KAAOL,OAAOK,IAAI,KACpBiC,GAAAA,+BAAwB,EAACjC,MAAzBiC,YACIC,UAAY,AAAClC,KAAgCkC,SAAS,CACtDR,WAAa/B,OAAO3D,KAAK,CAE1B,+BAAA,wBAAA,gGAAM6F,UAOHrE,OACAkB,cAQG,KADO,KAAT+E,MAUmC,MAApCO,8EAzBGnC,UAAN,aACH,GACE,CAACjC,SAASd,IAAI,CAAC,SAACoC,UAAMA,EAAEV,SAAS,GAAK,AAAC,GAAeqB,OAAb7B,KAAKrB,IAAI,CAAC,KAAa,OAAVkD,aACtD,CACA,SAAA,WACF,CAEMrE,OAASQ,4BAAa,CAAC9D,GAAG,CAAC2F,QAAQtD,QAAQ,EAC3CmC,cAAgBV,4BAAa,CAAC9D,GAAG,CAAC8F,KAAKrB,IAAI,EACjD,GAAI,CAACnB,QAAU,CAACkB,cAAe,CAC7B,MAAM,IAAI7G,MACR,AAAC,qBAAyCmI,OAArBH,QAAQtD,QAAQ,CAAC,MAAc,OAAVyD,KAAKrB,IAAI,EAEvD,CAEgB,SAAMjE,GAAGwH,WACtBjE,KAAK,EAAC,QACL,iBADK,KACJ,AAAC,GAAuC,OAArCkE,mBAAU,CAACC,WAAW,CAAC5E,OAAOzC,KAAK,EAAE,OAAO8E,QAAQ7C,EAAE,EAC1D,iBAFK,KAEJ,AAAC,GAA8C,OAA5CmF,mBAAU,CAACC,WAAW,CAAC1D,cAAc3D,KAAK,EAAE,OAAO8G,WAFlD,OAIN3D,KAAK,CAAC,WALO,oCAAA,kBAATuF,MAAS,QAMhB,GAAIA,MAAO,CACT,SAAA,WACF,CAEe,SAAM/I,GAAGwH,WAAWvG,MAAM,EAAC,SACxC,iBADwC,MACvC,AAAC,GAAuC,OAArCwG,mBAAU,CAACC,WAAW,CAAC5E,OAAOzC,KAAK,EAAE,OAAO8E,QAAQ7C,EAAE,EAC1D,iBAFwC,MAEvC,AAAC,GAA8C,OAA5CmF,mBAAU,CAACC,WAAW,CAAC1D,cAAc3D,KAAK,EAAE,OAAO8G,WAFf,gBAApCmC,OAAS,cAIf/I,QAAQC,GAAG,CACTC,cAAK,CAAC8I,KAAK,CACT,AAAC,iBAA8BzG,OAAd0E,UAAU,MAAoBrC,OAAhBrC,OAAOzC,KAAK,CAAC,KAAoB2D,OAAjBmB,QAAQ7C,EAAE,CAAC,QAA6B6E,OAAvBnD,cAAc3D,KAAK,CAAC,KAAqBiJ,OAAlBnC,UAAU,UAAe,OAAPmC,sBAG/G,EAlCK,UAAmBtC,0DAAnB,2BAAA,OAAA,6GAAA,uFAAA,uBAAA,8CAAA,2BAAA,wBAAA,+BAAA,yBAAA,6CAoCT,EA1CK,UAAoB9F,OAAOE,OAAO,CAAC+D,QAAQiC,OAAO,iDAAlD,2BAAA,MAAA,6GAAA,uFAAA,uBAAA,8CAAA,2BAAA,wBAAA,+BAAA,yBAAA,6CA2CP,QAEMoC,IAAAA,yBAAN,SAAMA,iBAAiBC,IAAY,4CAC3BC,KACFC,QAEEC,mBACAC,iBAGEC,sDAPFJ,KAAOpM,WAAM,CAACyM,WAAW,CAAG,0BAC9BJ,QAAUK,GAAAA,gBAAY,EAACN,MAAMO,QAAQ,GAEnCL,mBAAqBD,QAAQO,OAAO,CAAC,2BACrCL,iBAAmBF,QAAQO,OAAO,CAAC,KAAMN,oBAE/C,GAAIA,qBAAuB,CAAC,GAAKC,mBAAqB,CAAC,EAAG,CAClDC,WACJH,QAAQ3D,KAAK,CAAC,EAAG6D,kBACjB,KACAJ,KACA,KACAE,QAAQ3D,KAAK,CAAC6D,kBAEhBM,GAAAA,iBAAa,EAACT,KAAMI,WACtB,KAAO,CACL,MAAM,IAAI3M,MAAM,6CAClB,YACF,QAGckJ,IAAAA,6BAAd,SAAcA,qBACZrG,EAAQ,CACR8C,MAAc,CACdqC,OAAsB,4CAEhBiF,eAGAC,cAOFC,YACC,0BAAA,kBAAA,qBAAA,UAAA,MAsBiB,KAAfxB,mFAjCDsB,eAAiBtH,OAAOyH,OAAO,CAACjL,MAAM,CAAC,SAACkL,UAAMA,EAAEjF,IAAI,GAAK,WAGzD8E,cAAgBD,eAAe9K,MAAM,CAAC,SAACmL,cAC3CA,MAAMrD,OAAO,CAACsD,KAAK,CAAC,SAACzF,cAAW,CAACA,OAAOpE,UAAU,CAAC,AAAC,GAAe,OAAbiC,OAAOzC,KAAK,CAAC,WAErE,GAAIgK,cAActJ,MAAM,GAAK,EAAG,CAC9B,SAAO,KACT,CAEIuJ,YAActK,GAAG8C,OAAOzC,KAAK,EAC5B,+BAAA,wBAAA,8CAAA,IAAMoK,MAAN,YAEH,IAAME,aAAeF,MAAMrD,OAAO,CAACwD,IAAI,CAAC,SAAC3F,QACvC,IAAMrC,MAAQqC,OAAO9F,KAAK,CAAC,MAAM,CAAC,EAAE,CACpC,OAAOgG,QAAQiC,OAAO,CAACxE,MAAM,CAACtB,KAAK,GAAK,IAC1C,GACA,GAAIqJ,aAAc,CAChB,MAAA,UACF,CAEAL,YAAcA,YAAYO,OAAO,CAAC,SAACC,QAC5B,+BAAA,wBAAA,6BAAL,QAAK,UAAgBL,MAAMrD,OAAO,oBAA7B,QAAA,2BAAA,MAAA,wBAAA,+BAA+B,CAA/B,IAAMnC,OAAN,YACH,IAAMrC,MAAQqC,OAAO9F,KAAK,CAAC,MAAM,CAAC,EAAE,CAEpC,GAAI4L,MAAMC,OAAO,CAAC7F,QAAQiC,OAAO,CAACxE,MAAM,CAACtB,KAAK,EAAG,CAC/CwJ,GAAGG,OAAO,CAAChG,OAAQE,QAAQiC,OAAO,CAACxE,MAAM,CAACtB,KAAK,CACjD,KAAO,CACLwJ,GAAGI,QAAQ,CAACjG,OAAQE,QAAQiC,OAAO,CAACxE,MAAM,CAACtB,KAAK,CAClD,CACF,aARK,uBAAA,mCAAA,2BAAA,wBAAA,+BAAA,yBAAA,iBASP,EACF,EArBA,IAAK,UAAe+I,mCAAf,2BAAA,MAAA,wBAAA,kDAAA,uBAAA,mCAAA,2BAAA,wBAAA,+BAAA,yBAAA,iBAsBiB,SAAMC,oBAAN,oCAAA,kBAAfxB,YAAe,QACtB,SAAOA,eACT,gBAjsBWpM,uBAmsBN,IAAMD,eAAiB,IAAIC"}
|
package/dist/types/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/types.ts"],"sourcesContent":["import type { GuardKey } from \"./../api/decorators\";\nimport type { FastifyCorsOptions } from \"@fastify/cors\";\nimport type { FastifyFormbodyOptions } from \"@fastify/formbody\";\nimport type {\n FastifyInstance,\n FastifyReply,\n FastifyRequest,\n FastifyServerOptions,\n} from \"fastify\";\nimport type { QsPluginOptions } from \"fastify-qs\";\nimport { z } from \"zod\";\nimport type { ApiDecoratorOptions, AuthContext, Context } from \"../api\";\nimport type { FastifyMultipartOptions } from \"@fastify/multipart\";\nimport type { Driver } from \"../file-storage/driver\";\nimport type { SsePluginOptions } from \"fastify-sse-v2/lib/types\";\nimport type { FastifyStaticOptions } from \"@fastify/static\";\nimport { SecureSessionPluginOptions } from \"@fastify/secure-session\";\nimport {\n DeserializeFunction,\n SerializeFunction,\n} from \"@fastify/passport/dist/Authenticator\";\n\n/*\n Enums\n*/\nexport type EnumsLabel<T extends string, L extends \"ko\" | \"en\"> = {\n [key in T]: { [lang in L]: string };\n};\nexport type EnumsLabelKo<T extends string> = EnumsLabel<T, \"ko\">;\n\n/*\n Custom Scalars\n*/\nexport const SQLDateTimeString = z\n .string()\n .regex(/([0-9]{4}-[0-9]{2}-[0-9]{2}( [0-9]{2}:[0-9]{2}:[0-9]{2})*)$/, {\n message: \"잘못된 SQLDate 타입\",\n })\n .min(10)\n .max(19)\n .describe(\"SQLDateTimeString\");\nexport type SQLDateTimeString = z.infer<typeof SQLDateTimeString>;\n\n/*\n Utility Types\n*/\nexport function zArrayable<T extends z.ZodTypeAny>(\n shape: T\n): z.ZodUnion<[T, z.ZodArray<T>]> {\n return z.union([shape, shape.array()]);\n}\nexport type DistributiveOmit<T, K extends keyof any> = T extends any\n ? Omit<T, K>\n : never;\n\n/*\n Model-Defintion\n*/\nexport type CommonProp = {\n name: string;\n nullable?: boolean;\n toFilter?: true;\n desc?: string;\n dbDefault?: string;\n};\nexport type IntegerProp = CommonProp & {\n type: \"integer\";\n unsigned?: true;\n};\nexport type BigIntegerProp = CommonProp & {\n type: \"bigInteger\";\n unsigned?: true;\n};\nexport type TextProp = CommonProp & {\n type: \"text\";\n textType: \"text\" | \"mediumtext\" | \"longtext\";\n};\nexport type StringProp = CommonProp & {\n type: \"string\";\n length: number;\n};\nexport type EnumProp = CommonProp & {\n type: \"enum\";\n length: number;\n id: string;\n};\nexport type FloatProp = CommonProp & {\n type: \"float\";\n unsigned?: true;\n precision: number;\n scale: number;\n};\nexport type DoubleProp = CommonProp & {\n type: \"double\";\n unsigned?: true;\n precision: number;\n scale: number;\n};\nexport type DecimalProp = CommonProp & {\n type: \"decimal\";\n unsigned?: true;\n precision: number;\n scale: number;\n};\nexport type BooleanProp = CommonProp & {\n type: \"boolean\";\n};\nexport type DateProp = CommonProp & {\n type: \"date\";\n};\nexport type DateTimeProp = CommonProp & {\n type: \"datetime\";\n};\nexport type TimeProp = CommonProp & {\n type: \"time\";\n};\nexport type TimestampProp = CommonProp & {\n type: \"timestamp\";\n};\nexport type JsonProp = CommonProp & {\n type: \"json\";\n id: string;\n};\nexport type UuidProp = CommonProp & {\n type: \"uuid\";\n};\nexport type VirtualProp = CommonProp & {\n type: \"virtual\";\n id: string;\n};\n\nexport type RelationType =\n | \"HasMany\"\n | \"BelongsToOne\"\n | \"ManyToMany\"\n | \"OneToOne\";\nexport type RelationOn =\n | \"CASCADE\"\n | \"SET NULL\"\n | \"NO ACTION\"\n | \"SET DEFAULT\"\n | \"RESTRICT\";\ntype _RelationProp = {\n type: \"relation\";\n name: string;\n with: string;\n nullable?: boolean; // DEFAULT: false\n toFilter?: true; // DEFAULT: false\n desc?: string;\n};\nexport type OneToOneRelationProp = _RelationProp & {\n relationType: \"OneToOne\";\n customJoinClause?: string;\n} & (\n | {\n hasJoinColumn: true;\n useConstraint?: boolean; // DEFAULT: true\n onUpdate?: RelationOn; // DEFAULT: RESTRICT\n onDelete?: RelationOn; // DEFAULT: RESTRICT\n }\n | {\n hasJoinColumn: false;\n }\n );\nexport type BelongsToOneRelationProp = _RelationProp & {\n relationType: \"BelongsToOne\";\n customJoinClause?: string;\n useConstraint?: boolean; // DEFAULT: true\n onUpdate?: RelationOn; // DEFAULT: RESTRICT\n onDelete?: RelationOn; // DEFAULT: RESTRICT\n};\nexport type HasManyRelationProp = _RelationProp & {\n relationType: \"HasMany\";\n joinColumn: string;\n fromColumn?: string;\n};\nexport type ManyToManyRelationProp = _RelationProp & {\n relationType: \"ManyToMany\";\n joinTable: `${string}__${string}`;\n onUpdate: RelationOn;\n onDelete: RelationOn;\n};\nexport type RelationProp =\n | OneToOneRelationProp\n | BelongsToOneRelationProp\n | HasManyRelationProp\n | ManyToManyRelationProp;\n\nexport type EntityProp =\n | IntegerProp\n | BigIntegerProp\n | TextProp\n | StringProp\n | FloatProp\n | DoubleProp\n | DecimalProp\n | BooleanProp\n | DateProp\n | DateTimeProp\n | TimeProp\n | TimestampProp\n | JsonProp\n | UuidProp\n | EnumProp\n | VirtualProp\n | RelationProp;\n\nexport type EntityIndex = {\n type: \"index\" | \"unique\" | \"fulltext\";\n columns: string[];\n name?: string;\n parser?: \"built-in\" | \"ngram\";\n};\nexport type EntityJson = {\n id: string;\n parentId?: string;\n table: string;\n title?: string;\n props: EntityProp[];\n indexes: EntityIndex[];\n subsets: {\n [subset: string]: string[];\n };\n enums: {\n [enumId: string]: {\n [key: string]: string;\n };\n };\n};\nexport type EntitySubsetRow = {\n field: string;\n has: {\n [key: string]: boolean;\n };\n children: EntitySubsetRow[];\n prefixes: string[];\n relationEntity?: string;\n isOpen?: boolean;\n};\nexport type FlattenSubsetRow = Omit<EntitySubsetRow, \"children\">;\n\n// SMD Legacy\nexport type SMDInput<T extends string> = {\n id: string;\n parentId?: string;\n table?: string;\n title?: string;\n props?: EntityProp[];\n indexes?: EntityIndex[];\n subsets?: {\n [subset: string]: T[];\n };\n};\n\n/*\n PropNode\n*/\n\nexport type EntityPropNode =\n | {\n nodeType: \"plain\";\n prop: EntityProp;\n }\n | {\n nodeType: \"object\" | \"array\";\n prop?: EntityProp;\n children: EntityPropNode[];\n };\n\n/*\n Prop Type Guards\n*/\nexport function isIntegerProp(p: any): p is IntegerProp {\n return p?.type === \"integer\";\n}\nexport function isBigIntegerProp(p: any): p is BigIntegerProp {\n return p?.type === \"bigInteger\";\n}\nexport function isTextProp(p: any): p is TextProp {\n return p?.type === \"text\";\n}\nexport function isStringProp(p: any): p is StringProp {\n return p?.type === \"string\";\n}\nexport function isEnumProp(p: any): p is EnumProp {\n return p?.type === \"enum\";\n}\nexport function isFloatProp(p: any): p is FloatProp {\n return p?.type === \"float\";\n}\nexport function isDoubleProp(p: any): p is DoubleProp {\n return p?.type === \"double\";\n}\nexport function isDecimalProp(p: any): p is DecimalProp {\n return p?.type === \"decimal\";\n}\nexport function isBooleanProp(p: any): p is BooleanProp {\n return p?.type === \"boolean\";\n}\nexport function isDateProp(p: any): p is DateProp {\n return p?.type === \"date\";\n}\nexport function isDateTimeProp(p: any): p is DateTimeProp {\n return p?.type === \"datetime\";\n}\nexport function isTimeProp(p: any): p is TimeProp {\n return p?.type === \"time\";\n}\nexport function isTimestampProp(p: any): p is TimestampProp {\n return p?.type === \"timestamp\";\n}\nexport function isJsonProp(p: any): p is JsonProp {\n return p?.type === \"json\";\n}\nexport function isUuidProp(p: any): p is UuidProp {\n return p?.type === \"uuid\";\n}\nexport function isVirtualProp(p: any): p is VirtualProp {\n return p?.type === \"virtual\";\n}\nexport function isRelationProp(p: any): p is RelationProp {\n return p?.type === \"relation\";\n}\nexport function isOneToOneRelationProp(p: any): p is OneToOneRelationProp {\n return p?.relationType === \"OneToOne\";\n}\nexport function isBelongsToOneRelationProp(\n p: any\n): p is BelongsToOneRelationProp {\n return p?.relationType === \"BelongsToOne\";\n}\nexport function isHasManyRelationProp(p: any): p is HasManyRelationProp {\n return p?.relationType === \"HasMany\";\n}\nexport function isManyToManyRelationProp(p: any): p is ManyToManyRelationProp {\n return p?.relationType === \"ManyToMany\";\n}\n\ntype JoinClause =\n | {\n from: string;\n to: string;\n }\n | {\n custom: string;\n };\nexport function isCustomJoinClause(p: any): p is { custom: string } {\n return p?.custom;\n}\n\n/* 서브셋 */\n// type SubsetLoader = {\n// as: string;\n// table: string;\n// manyJoin: {\n// fromTable: string;\n// fromCol: string;\n// idField: string;\n// toTable: string;\n// toCol: string;\n// through?: {\n// table: string;\n// fromCol: string;\n// toCol: string;\n// };\n// };\n// oneJoins: ({\n// as: string;\n// join: \"inner\" | \"outer\";\n// table: string;\n// } & JoinClause)[];\n// select: (string | Knex.Raw)[];\n// loaders?: SubsetLoader[];\n// };\n// export type SubsetQuery = {\n// select: (string | Knex.Raw)[];\n// virtual: string[];\n// joins: ({\n// as: string;\n// join: \"inner\" | \"outer\";\n// table: string;\n// } & JoinClause)[];\n// loaders: SubsetLoader[];\n// };\n\ntype SubsetLoader = {\n as: string;\n table: string;\n manyJoin: {\n fromTable: string;\n fromCol: string;\n idField: string;\n toTable: string;\n toCol: string;\n through?: {\n table: string;\n fromCol: string;\n toCol: string;\n };\n };\n oneJoins: ({\n as: string;\n join: \"inner\" | \"outer\";\n table: string;\n } & JoinClause)[];\n select: string[];\n loaders?: SubsetLoader[];\n};\n\nexport type SubsetQuery = {\n select: string[];\n virtual: string[];\n joins: ({\n as: string;\n join: \"inner\" | \"outer\";\n table: string;\n } & JoinClause)[];\n loaders: SubsetLoader[];\n};\n\n/* BaseModel */\nexport const SonamuQueryMode = z.enum([\"both\", \"list\", \"count\"]);\nexport type SonamuQueryMode = z.infer<typeof SonamuQueryMode>;\n\n/* Knex Migration */\nexport type KnexError = {\n code: string;\n errno: number;\n sql: string;\n sqlMessage: string;\n sqlState: string;\n};\nexport function isKnexError(e: any): e is KnexError {\n return e.code && e.sqlMessage && e.sqlState;\n}\n\nexport type KnexColumnType =\n | \"string\"\n | \"text\"\n | \"smalltext\"\n | \"mediumtext\"\n | \"longtext\"\n | \"integer\"\n | \"bigInteger\"\n | \"decimal\"\n | \"timestamp\"\n | \"boolean\"\n | \"foreign\"\n | \"uuid\"\n | \"json\"\n | \"float\"\n | \"date\"\n | \"time\"\n | \"datetime\";\nexport type MigrationColumn = {\n name: string;\n type: KnexColumnType;\n nullable: boolean;\n unsigned?: boolean;\n length?: number;\n defaultTo?: string;\n precision?: number;\n scale?: number;\n};\nexport type MigrationIndex = {\n columns: string[];\n type: \"unique\" | \"index\" | \"fulltext\";\n parser?: \"built-in\" | \"ngram\";\n};\nexport type MigrationForeign = {\n columns: string[];\n to: string;\n onUpdate: RelationOn;\n onDelete: RelationOn;\n};\nexport type MigrationJoinTable = {\n table: string;\n indexes: MigrationIndex[];\n columns: MigrationColumn[];\n foreigns: MigrationForeign[];\n};\nexport type MigrationSet = {\n table: string;\n columns: MigrationColumn[];\n indexes: MigrationIndex[];\n foreigns: MigrationForeign[];\n};\nexport type MigrationSetAndJoinTable = MigrationSet & {\n joinTables: MigrationJoinTable[];\n};\nexport type GenMigrationCode = {\n title: string;\n table: string;\n type: \"normal\" | \"foreign\";\n formatted: string | null;\n};\n\n/* Api */\nexport type ApiParam = {\n name: string;\n type: ApiParamType;\n optional: boolean;\n defaultDef?: string;\n};\nexport namespace ApiParamType {\n export type Object = {\n t: \"object\";\n props: ApiParam[];\n };\n export type Union = {\n t: \"union\";\n types: ApiParamType[];\n };\n export type Intersection = {\n t: \"intersection\";\n types: ApiParamType[];\n };\n export type StringLiteral = {\n t: \"string-literal\";\n value: string;\n };\n export type NumericLiteral = {\n t: \"numeric-literal\";\n value: number;\n };\n export type Array = {\n t: \"array\";\n elementsType: ApiParamType;\n };\n export type Ref = {\n t: \"ref\";\n id: string;\n args?: ApiParamType[];\n };\n export type IndexedAccess = {\n t: \"indexed-access\";\n object: ApiParamType;\n index: ApiParamType;\n };\n export type TupleType = {\n t: \"tuple-type\";\n elements: ApiParamType[];\n };\n export type Pick = Ref & {\n t: \"ref\";\n id: \"Pick\";\n };\n export type Omit = Ref & {\n t: \"ref\";\n id: \"Omit\";\n };\n export type Partial = Ref & {\n t: \"ref\";\n id: \"Partial\";\n };\n export type Promise = Ref & {\n t: \"ref\";\n id: \"Promise\";\n };\n export type Context = Ref & {\n t: \"ref\";\n id: \"Context\";\n };\n export type TypeParam = {\n t: \"type-param\";\n id: string;\n constraint?: ApiParamType;\n };\n\n export function isObject(v: any): v is ApiParamType.Object {\n return v?.t === \"object\";\n }\n export function isUnion(v: any): v is ApiParamType.Union {\n return v?.t === \"union\";\n }\n export function isIntersection(v: any): v is ApiParamType.Intersection {\n return v?.t === \"intersection\";\n }\n export function isStringLiteral(v: any): v is ApiParamType.StringLiteral {\n return v?.t === \"string-literal\";\n }\n export function isNumericLiteral(v: any): v is ApiParamType.NumericLiteral {\n return v?.t === \"numeric-literal\";\n }\n export function isArray(v: any): v is ApiParamType.Array {\n return v?.t === \"array\";\n }\n export function isRef(v: any): v is ApiParamType.Ref {\n return v?.t === \"ref\";\n }\n export function isIndexedAccess(v: any): v is ApiParamType.IndexedAccess {\n return v?.t === \"indexed-access\";\n }\n export function isTupleType(v: any): v is ApiParamType.TupleType {\n return v?.t === \"tuple-type\";\n }\n export function isPick(v: any): v is ApiParamType.Pick {\n return v?.t === \"ref\" && v.id === \"Pick\";\n }\n export function isOmit(v: any): v is ApiParamType.Omit {\n return v?.t === \"ref\" && v.id === \"Omit\";\n }\n export function isPartial(v: any): v is ApiParamType.Partial {\n return v?.t === \"ref\" && v.id === \"Partial\";\n }\n export function isPromise(v: any): v is ApiParamType.Promise {\n return v?.t === \"ref\" && v.id === \"Promise\";\n }\n export function isContext(v: any): v is ApiParamType.Context {\n return v?.t === \"ref\" && v.id === \"Context\";\n }\n export function isRefKnex(v: any): v is ApiParamType.Ref {\n return v?.t === \"ref\" && v.id === \"Knex\";\n }\n export function isTypeParam(v: any): v is ApiParamType.TypeParam {\n return v?.t === \"type-param\";\n }\n}\nexport type ApiParamType =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"null\"\n | \"undefined\"\n | \"void\"\n | \"any\"\n | \"unknown\"\n | \"true\"\n | \"false\"\n | ApiParamType.StringLiteral\n | ApiParamType.NumericLiteral\n | ApiParamType.Object\n | ApiParamType.Union\n | ApiParamType.Intersection\n | ApiParamType.Array\n | ApiParamType.Ref\n | ApiParamType.IndexedAccess\n | ApiParamType.TypeParam\n | ApiParamType.TupleType;\n\n/* Template */\n// 셀프 참조 타입이므로 Zod 생략하고 직접 정의\nexport const RenderingNode = z.any();\nexport type RenderingNode = {\n name: string;\n label: string;\n renderType:\n | \"string-plain\"\n | \"string-image\"\n | \"string-datetime\"\n | \"string-date\"\n | \"datetime\"\n | \"number-plain\"\n | \"number-id\"\n | \"number-fk_id\"\n | \"boolean\"\n | \"enums\"\n | \"array\"\n | \"array-images\"\n | \"object\"\n | \"object-pick\"\n | \"record\";\n zodType: z.ZodTypeAny;\n element?: RenderingNode;\n children?: RenderingNode[];\n config?: {\n picked: string;\n };\n optional?: boolean;\n nullable?: boolean;\n};\n\nexport const TemplateOptions = z.object({\n entity: z.object({\n entityId: z.string(),\n parentId: z.string().optional(),\n title: z.string(),\n table: z.string().optional(),\n props: z.array(z.object({})).optional(),\n indexes: z.array(z.object({})).optional(),\n subsets: z.object({}).optional(),\n enums: z.object({}).optional(),\n }),\n init_types: z.object({\n entityId: z.string(),\n }),\n generated: z.object({}),\n generated_sso: z.object({}),\n generated_http: z.object({\n entityId: z.string(),\n }),\n model: z.object({\n entityId: z.string(),\n defaultSearchField: z.string(),\n defaultOrderBy: z.string(),\n }),\n model_test: z.object({\n entityId: z.string(),\n }),\n bridge: z.object({\n entityId: z.string(),\n }),\n service: z.object({\n namesRecord: z.object({\n fs: z.string(),\n fsPlural: z.string(),\n camel: z.string(),\n camelPlural: z.string(),\n capital: z.string(),\n capitalPlural: z.string(),\n upper: z.string(),\n constant: z.string(),\n }),\n modelTsPath: z.string(),\n }),\n view_list: z.object({\n entityId: z.string(),\n extra: z.unknown(),\n }),\n view_list_columns: z.object({\n entityId: z.string(),\n columns: z\n .object({\n name: z.string(),\n label: z.string(),\n tc: z.string(),\n })\n .array(),\n columnImports: z.string(),\n }),\n view_search_input: z.object({\n entityId: z.string(),\n }),\n view_form: z.object({\n entityId: z.string(),\n }),\n view_id_all_select: z.object({\n entityId: z.string(),\n }),\n view_id_async_select: z.object({\n entityId: z.string(),\n textField: z.string(),\n }),\n view_enums_select: z.object({\n entityId: z.string(),\n enumId: z.string(),\n }),\n view_enums_dropdown: z.object({\n entityId: z.string(),\n enumId: z.string(),\n }),\n view_enums_buttonset: z.object({\n entityId: z.string(),\n enumId: z.string(),\n }),\n});\nexport type TemplateOptions = z.infer<typeof TemplateOptions>;\n\nexport const TemplateKey = z.enum([\n \"entity\",\n \"init_types\",\n \"generated\",\n \"generated_sso\",\n \"generated_http\",\n \"model\",\n \"model_test\",\n \"bridge\",\n \"service\",\n \"view_list\",\n \"view_list_columns\",\n \"view_search_input\",\n \"view_form\",\n \"view_id_all_select\",\n \"view_id_async_select\",\n \"view_enums_select\",\n \"view_enums_dropdown\",\n \"view_enums_buttonset\",\n]);\nexport type TemplateKey = z.infer<typeof TemplateKey>;\n\nexport const GenerateOptions = z.object({\n overwrite: z.boolean().optional(),\n});\nexport type GenerateOptions = z.infer<typeof GenerateOptions>;\n\nexport const PathAndCode = z.object({\n path: z.string(),\n code: z.string(),\n});\nexport type PathAndCode = z.infer<typeof PathAndCode>;\n\nexport type FixtureSearchOptions = {\n entityId: string;\n field: string;\n value: string;\n searchType: \"equals\" | \"like\";\n};\n\nexport type FixtureRecord = {\n fixtureId: string;\n entityId: string;\n id: number;\n columns: {\n [key: string]: {\n prop: EntityProp;\n value: any;\n };\n };\n fetchedRecords: string[];\n belongsRecords: string[];\n target?: FixtureRecord; // Import 대상 DB 레코드(id가 같은)\n unique?: FixtureRecord; // Import 대상 DB 레코드(unique key가 같은)\n override?: boolean;\n};\n\nexport type FixtureImportResult = {\n entityId: string;\n data: {\n [key: string]: any;\n };\n};\n\nexport type RelationNode = {\n fixtureId: string;\n entityId: string;\n related: Set<string>;\n};\n\nexport interface DatabaseSchemaExtend {}\nexport type ManyToManyBaseSchema<\n FromIdKey extends string,\n ToIdKey extends string,\n> = {\n id: number;\n} & {\n [K in `${FromIdKey}_id`]: number;\n} & {\n [K in `${ToIdKey}_id`]: number;\n};\n\nexport type SonamuFastifyConfig = {\n contextProvider: (\n defaultContext: Pick<\n Context,\n \"request\" | \"reply\" | \"headers\" | \"createSSE\"\n > &\n AuthContext,\n request: FastifyRequest,\n reply: FastifyReply\n ) => Context | Promise<Context>;\n guardHandler: (\n guard: GuardKey,\n request: FastifyRequest,\n api: {\n typeParameters: ApiParamType.TypeParam[];\n parameters: ApiParam[];\n returnType: ApiParamType;\n modelName: string;\n methodName: string;\n path: string;\n options: ApiDecoratorOptions;\n }\n ) => void;\n cache?: {\n get: (key: string) => Promise<unknown | null>;\n put: (key: string, value: unknown, ttl?: number) => Promise<void>;\n resolveKey: (\n path: string,\n reqBody: {\n [key: string]: unknown;\n }\n ) =>\n | {\n cache: false;\n }\n | {\n cache: true;\n key: string;\n ttl?: number;\n };\n };\n};\n\nexport type SonamuServerOptions = {\n fastify?: FastifyServerOptions;\n\n listen?: {\n port: number;\n host?: string;\n };\n\n plugins?: {\n cors?: boolean | FastifyCorsOptions;\n formbody?: boolean | FastifyFormbodyOptions;\n multipart?: boolean | FastifyMultipartOptions;\n qs?: boolean | QsPluginOptions;\n sse?: boolean | SsePluginOptions;\n static?: boolean | FastifyStaticOptions;\n session?: boolean | SecureSessionPluginOptions;\n\n custom?: (server: FastifyInstance) => void;\n };\n\n auth?:\n | boolean\n | {\n userSerializer: SerializeFunction<unknown, unknown>;\n userDeserializer: DeserializeFunction<unknown, unknown>;\n };\n\n apiConfig: SonamuFastifyConfig;\n\n storage?: Driver;\n\n lifecycle?: {\n onStart?: (server: FastifyInstance) => Promise<void> | void;\n onShutdown?: (server: FastifyInstance) => Promise<void> | void;\n onError?: (\n error: Error,\n request: FastifyRequest,\n reply: FastifyReply\n ) => Promise<void> | void;\n };\n};\n"],"names":["GenerateOptions","PathAndCode","RenderingNode","SQLDateTimeString","SonamuQueryMode","TemplateKey","TemplateOptions","isBelongsToOneRelationProp","isBigIntegerProp","isBooleanProp","isCustomJoinClause","isDateProp","isDateTimeProp","isDecimalProp","isDoubleProp","isEnumProp","isFloatProp","isHasManyRelationProp","isIntegerProp","isJsonProp","isKnexError","isManyToManyRelationProp","isOneToOneRelationProp","isRelationProp","isStringProp","isTextProp","isTimeProp","isTimestampProp","isUuidProp","isVirtualProp","zArrayable","z","string","regex","message","min","max","describe","shape","union","array","p","type","relationType","custom","enum","e","code","sqlMessage","sqlState","ApiParamType","isObject","v","t","isUnion","isIntersection","isStringLiteral","isNumericLiteral","isArray","isRef","isIndexedAccess","isTupleType","isPick","id","isOmit","isPartial","isPromise","isContext","isRefKnex","isTypeParam","any","object","entity","entityId","parentId","optional","title","table","props","indexes","subsets","enums","init_types","generated","generated_sso","generated_http","model","defaultSearchField","defaultOrderBy","model_test","bridge","service","namesRecord","fs","fsPlural","camel","camelPlural","capital","capitalPlural","upper","constant","modelTsPath","view_list","extra","unknown","view_list_columns","columns","name","label","tc","columnImports","view_search_input","view_form","view_id_all_select","view_id_async_select","textField","view_enums_select","enumId","view_enums_dropdown","view_enums_buttonset","overwrite","boolean","path"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/typings/knex.d.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/async-utils.ts"],"sourcesContent":["/**\n * 비동기 조건으로 배열을 필터링합니다\n * @example\n * const filtered = await filterAsync([1, 2, 3], async (x) => x > 1);\n */\nexport async function filterAsync<T>(\n arr: T[],\n predicate: (item: T, index: number, array: T[]) => Promise<boolean>\n): Promise<T[]> {\n const results = await Promise.all(\n arr.map((item, index) =>\n predicate(item, index, arr).then((keep) => ({ item, keep }))\n )\n );\n return results.filter((r) => r.keep).map((r) => r.item);\n}\n\n/**\n * 비동기 조건이 모든 요소에 대해 참인지 확인합니다\n * @example\n * const allValid = await everyAsync([1, 2, 3], async (x) => x > 0);\n */\nexport async function everyAsync<T>(\n arr: T[],\n predicate: (item: T, index: number, array: T[]) => Promise<boolean>\n): Promise<boolean> {\n for (let i = 0; i < arr.length; i++) {\n if (!(await predicate(arr[i], i, arr))) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * 비동기 변환 함수를 배열의 각 요소에 적용합니다\n * @example\n * const doubled = await mapAsync([1, 2, 3], async (x) => x * 2);\n */\nexport async function mapAsync<T, U>(\n arr: T[],\n mapper: (item: T, index: number, array: T[]) => Promise<U>\n): Promise<U[]> {\n return Promise.all(\n arr.map((item, index) => mapper(item, index, arr))\n );\n}\n\n/**\n * 비동기 리듀서로 배열을 축약합니다\n * @example\n * const sum = await reduceAsync([1, 2, 3], async (acc, x) => acc + x, 0);\n */\nexport async function reduceAsync<T, U>(\n arr: T[],\n reducer: (accumulator: U, currentValue: T, index: number, array: T[]) => Promise<U>,\n initialValue: U\n): Promise<U> {\n let accumulator = initialValue;\n for (let i = 0; i < arr.length; i++) {\n accumulator = await reducer(accumulator, arr[i], i, arr);\n }\n return accumulator;\n}\n"],"names":["everyAsync","filterAsync","mapAsync","reduceAsync","arr","predicate","results","Promise","all","map","item","index","then","keep","filter","r","i","length","mapper","reducer","initialValue","accumulator"],"mappings":"mPAsBsBA,oBAAAA,gBAjBAC,qBAAAA,iBAkCAC,kBAAAA,cAcAC,qBAAAA,qzDAhDf,SAAeF,YACpBG,GAAQ,CACRC,SAAmE,4CAE7DC,+EAAU,SAAMC,QAAQC,GAAG,CAC/BJ,IAAIK,GAAG,CAAC,SAACC,KAAMC,cACbN,UAAUK,KAAMC,MAAOP,KAAKQ,IAAI,CAAC,SAACC,YAAU,CAAEH,KAAAA,KAAMG,KAAAA,IAAK,eAFvDP,QAAU,cAKhB,SAAOA,QAAQQ,MAAM,CAAC,SAACC,UAAMA,EAAEF,IAAI,GAAEJ,GAAG,CAAC,SAACM,UAAMA,EAAEL,IAAI,MACxD,KAOO,SAAeV,WACpBI,GAAQ,CACRC,SAAmE,4CAE1DW,yEAAAA,EAAI,4BAAGA,CAAAA,EAAIZ,IAAIa,MAAM,AAAD,cACrB,SAAMZ,UAAUD,GAAG,CAACY,EAAE,CAAEA,EAAGZ,aAAjC,GAAI,CAAE,cAAkC,CACtC,SAAO,MACT,uBAH8BY,uBAKhC,SAAO,QACT,KAOO,SAAed,SACpBE,GAAQ,CACRc,MAA0D,mFAE1D,SAAOX,QAAQC,GAAG,CAChBJ,IAAIK,GAAG,CAAC,SAACC,KAAMC,cAAUO,OAAOR,KAAMC,MAAOP,UAEjD,KAOO,SAAeD,YACpBC,GAAQ,CACRe,OAAmF,CACnFC,YAAe,4CAEXC,YACKL,yEADLK,YAAcD,aACTJ,EAAI,4BAAGA,CAAAA,EAAIZ,IAAIa,MAAM,AAAD,cACb,SAAME,QAAQE,YAAajB,GAAG,CAACY,EAAE,CAAEA,EAAGZ,aAApDiB,YAAc,oCADgBL,uBAGhC,SAAOK,eACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/controller.ts"],"sourcesContent":["export function isLocal(): boolean {\n return process.env.LR === undefined || process.env.LR === \"local\";\n}\nexport function isRemote(): boolean {\n return process.env.LR === \"remote\";\n}\nexport function isInDocker(): boolean {\n return process.env.LR !== undefined;\n}\nexport function isDaemonServer(): boolean {\n return process.env.NODE_TYPE === \"daemon\";\n}\nexport function isDevelopment(): boolean {\n return isRemote() && process.env.NODE_ENV === \"development\";\n}\nexport function isStaging(): boolean {\n return isRemote() && process.env.NODE_ENV === \"staging\";\n}\nexport function isProduction(): boolean {\n return isRemote() && process.env.NODE_ENV === \"production\";\n}\nexport function isTest(): boolean {\n return isLocal() && process.env.NODE_ENV === \"test\";\n}\n"],"names":["isDaemonServer","isDevelopment","isInDocker","isLocal","isProduction","isRemote","isStaging","isTest","process","env","LR","undefined","NODE_TYPE","NODE_ENV"],"mappings":"mPASgBA,wBAAAA,oBAGAC,uBAAAA,mBANAC,oBAAAA,gBANAC,iBAAAA,aAkBAC,sBAAAA,kBAfAC,kBAAAA,cAYAC,mBAAAA,eAMAC,gBAAAA,UArBT,SAASJ,UACd,OAAOK,QAAQC,GAAG,CAACC,EAAE,GAAKC,WAAaH,QAAQC,GAAG,CAACC,EAAE,GAAK,OAC5D,CACO,SAASL,WACd,OAAOG,QAAQC,GAAG,CAACC,EAAE,GAAK,QAC5B,CACO,SAASR,aACd,OAAOM,QAAQC,GAAG,CAACC,EAAE,GAAKC,SAC5B,CACO,SAASX,iBACd,OAAOQ,QAAQC,GAAG,CAACG,SAAS,GAAK,QACnC,CACO,SAASX,gBACd,OAAOI,YAAcG,QAAQC,GAAG,CAACI,QAAQ,GAAK,aAChD,CACO,SAASP,YACd,OAAOD,YAAcG,QAAQC,GAAG,CAACI,QAAQ,GAAK,SAChD,CACO,SAAST,eACd,OAAOC,YAAcG,QAAQC,GAAG,CAACI,QAAQ,GAAK,YAChD,CACO,SAASN,SACd,OAAOJ,WAAaK,QAAQC,GAAG,CAACI,QAAQ,GAAK,MAC/C"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/fs-utils.ts"],"sourcesContent":["import { PathLike, constants } from \"fs\";\nimport { access } from \"fs/promises\";\n\n/**\n * fs/promises에는 exists가 없어요. 대신 access가 있습니다.\n * 근데 얘는 인터페이스가 쓰기 불편해요. 그래서 감싸주었습니다.\n * @param path\n * @returns\n */\nexport async function exists(path: PathLike): Promise<boolean> {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n"],"names":["exists","path","access","constants","F_OK"],"mappings":"oGASsBA,gDAAAA,0BATc,4BACb,qzDAQhB,SAAeA,OAAOC,IAAc,gJAEvC,SAAMC,GAAAA,gBAAM,EAACD,KAAME,aAAS,CAACC,IAAI,UAAjC,cACA,SAAO,6BAEP,SAAO,0BAEX"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/lodash-able.ts"],"sourcesContent":["export function wrapIf(\n source: string,\n predicate: (str: string) => [boolean, string]\n): string {\n const [ok, wrapped] = predicate(source);\n return ok ? wrapped : source;\n}\n"],"names":["wrapIf","source","predicate","ok","wrapped"],"mappings":"oGAAgBA,gDAAAA,o2CAAT,SAASA,OACdC,MAAc,CACdC,SAA6C,EAE7C,IAAsBA,4BAAAA,UAAUD,WAAzBE,GAAeD,cAAXE,QAAWF,cACtB,OAAOC,GAAKC,QAAUH,MACxB"}
|
package/dist/utils/model.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/model.ts"],"sourcesContent":["export type ListResult<T> = {\n rows: T[];\n total?: number;\n};\n\nexport type ArrayOr<T> = T | T[];\n\nexport function asArray<T>(param: T | T[]): T[] {\n if (Array.isArray(param)) {\n return param;\n } else {\n return [param as T] as T[];\n }\n}\n\nexport function objToMap<T>(obj: { [k: string]: T }) {\n const keys = Object.keys(obj);\n if (keys.every((key) => parseInt(key).toString() === key)) {\n return new Map<number, T>(keys.map((key) => [parseInt(key), obj[key]]));\n } else {\n return new Map<string, T>(Object.entries(obj));\n }\n}\n\nexport interface BaseListParams {\n id?: number | number[];\n num?: number;\n page?: number;\n keyword?: string;\n queryMode?: \"list\" | \"count\" | \"both\";\n}\n"],"names":["asArray","objToMap","param","Array","isArray","obj","keys","Object","every","key","parseInt","toString","Map","map","entries"],"mappings":"mPAOgBA,iBAAAA,aAQAC,kBAAAA,YART,SAASD,QAAWE,KAAc,EACvC,GAAIC,MAAMC,OAAO,CAACF,OAAQ,CACxB,OAAOA,KACT,KAAO,CACL,MAAO,CAACA,MAAW,AACrB,CACF,CAEO,SAASD,SAAYI,GAAuB,EACjD,IAAMC,KAAOC,OAAOD,IAAI,CAACD,KACzB,GAAIC,KAAKE,KAAK,CAAC,SAACC,YAAQC,SAASD,KAAKE,QAAQ,KAAOF,MAAM,CACzD,OAAO,IAAIG,IAAeN,KAAKO,GAAG,CAAC,SAACJ,WAAQ,CAACC,SAASD,KAAMJ,GAAG,CAACI,IAAI,CAAC,GACvE,KAAO,CACL,OAAO,IAAIG,IAAeL,OAAOO,OAAO,CAACT,KAC3C,CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/sql-parser.ts"],"sourcesContent":["import _ from \"lodash\";\nimport { AST, ColumnRef, Expr, ExpressionValue, Select } from \"node-sql-parser\";\n\nexport function getTableName(expr: ColumnRef) {\n if (\"table\" in expr && expr.table !== null) {\n return typeof expr.table === \"string\"\n ? expr.table\n : (expr.table as { type: string; value: string }).value;\n }\n return null;\n}\n\n// where 조건에 사용된 테이블명을 추출\nexport function getTableNamesFromWhere(ast: AST | AST[]): string[] {\n const extractTableNames = (where: Select[\"where\"]): string[] => {\n if (where === null || !(where.type === \"binary_expr\" && \"left\" in where)) {\n return [];\n }\n\n const extractTableName = (expr: Expr | ExpressionValue): string[] => {\n if (expr.type === \"column_ref\") {\n const table = getTableName(expr as ColumnRef);\n return table ? [table] : [];\n } else if (expr.type === \"binary_expr\" && \"left\" in expr) {\n return extractTableNames(expr);\n }\n return [];\n };\n\n return [...extractTableName(where.left), ...extractTableName(where.right)];\n };\n\n return _.uniq(\n (Array.isArray(ast) ? ast : [ast]).flatMap((a) =>\n a.type === \"select\" || a.type === \"update\" || a.type === \"delete\"\n ? extractTableNames(a.where)\n : []\n )\n );\n}\n"],"names":["getTableName","getTableNamesFromWhere","expr","table","value","ast","extractTableNames","where","type","extractTableName","left","right","_","uniq","Array","isArray","flatMap","a"],"mappings":"mPAGgBA,sBAAAA,kBAUAC,gCAAAA,oFAbF,srCAGP,SAASD,aAAaE,IAAe,EAC1C,GAAI,UAAWA,MAAQA,KAAKC,KAAK,GAAK,KAAM,CAC1C,OAAO,OAAOD,KAAKC,KAAK,GAAK,SACzBD,KAAKC,KAAK,CACV,AAACD,KAAKC,KAAK,CAAqCC,KAAK,AAC3D,CACA,OAAO,IACT,CAGO,SAASH,uBAAuBI,GAAgB,EACrD,IAAMC,kBAAoB,SAACC,OACzB,GAAIA,QAAU,MAAQ,CAAEA,CAAAA,MAAMC,IAAI,GAAK,eAAiB,SAAUD,KAAI,EAAI,CACxE,MAAO,EAAE,AACX,CAEA,IAAME,iBAAmB,SAACP,MACxB,GAAIA,KAAKM,IAAI,GAAK,aAAc,CAC9B,IAAML,MAAQH,aAAaE,MAC3B,OAAOC,MAAQ,CAACA,MAAM,CAAG,EAAE,AAC7B,MAAO,GAAID,KAAKM,IAAI,GAAK,eAAiB,SAAUN,KAAM,CACxD,OAAOI,kBAAkBJ,KAC3B,CACA,MAAO,EAAE,AACX,EAEA,OAAO,AAAC,qBAAGO,iBAAiBF,MAAMG,IAAI,UAAG,qBAAGD,iBAAiBF,MAAMI,KAAK,GAC1E,EAEA,OAAOC,eAAC,CAACC,IAAI,CACX,AAACC,CAAAA,MAAMC,OAAO,CAACV,KAAOA,IAAM,CAACA,IAAI,AAAD,EAAGW,OAAO,CAAC,SAACC,UAC1CA,EAAET,IAAI,GAAK,UAAYS,EAAET,IAAI,GAAK,UAAYS,EAAET,IAAI,GAAK,SACrDF,kBAAkBW,EAAEV,KAAK,EACzB,EAAE,GAGZ"}
|
package/dist/utils/utils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/utils.ts"],"sourcesContent":["import path from \"path\";\nimport { glob } from \"fs/promises\";\nimport fs from \"fs\";\n\nexport async function globAsync(pathPattern: string): Promise<string[]> {\n const files: string[] = [];\n for await (const file of glob(path.resolve(pathPattern))) {\n files.push(file);\n }\n return files;\n}\nexport async function importMultiple(\n filePaths: string[],\n doRefresh: boolean = false\n): Promise<{ filePath: string; imported: any }[]> {\n const results: { filePath: string; imported: any }[] = [];\n\n for (const filePath of filePaths) {\n let importPath = \"./\" + path.relative(__dirname, filePath);\n\n if (doRefresh) {\n if (require.resolve) {\n delete require.cache[require.resolve(importPath)];\n } else {\n importPath += `?t=${Date.now()}`;\n }\n }\n\n const imported = await import(importPath);\n results.push({\n filePath,\n imported,\n });\n }\n\n return results;\n}\nexport async function findAppRootPath() {\n const apiRootPath = findApiRootPath();\n return apiRootPath.split(path.sep).slice(0, -1).join(path.sep);\n}\n\nexport function findApiRootPath() {\n // NOTE: for support npm / yarn workspaces\n const workspacePath = process.env[\"INIT_CWD\"];\n if (workspacePath && workspacePath.length !== 0) {\n return workspacePath;\n }\n\n const basePath = require.main?.path ?? __dirname;\n let dir = path.dirname(basePath);\n if (dir.includes(\"/.yarn/\")) {\n dir = dir.split(\"/.yarn/\")[0];\n }\n do {\n if (fs.existsSync(path.join(dir, \"/package.json\"))) {\n return dir.split(path.sep).join(path.sep);\n }\n dir = dir.split(path.sep).slice(0, -1).join(path.sep);\n } while (dir.split(path.sep).length > 1);\n throw new Error(\"Cannot find AppRoot using Sonamu -2\");\n}\n\nexport function nonNullable<T>(value: T): value is NonNullable<T> {\n return value !== null && value !== undefined;\n}\n"],"names":["findApiRootPath","findAppRootPath","globAsync","importMultiple","nonNullable","pathPattern","files","file","glob","path","resolve","push","filePaths","doRefresh","results","filePath","importPath","imported","relative","__dirname","require","cache","Date","now","apiRootPath","split","sep","slice","join","workspacePath","process","env","length","basePath","main","dir","dirname","includes","fs","existsSync","Error","value","undefined"],"mappings":"mPA0CgBA,yBAAAA,qBALMC,yBAAAA,qBAjCAC,mBAAAA,eAOAC,wBAAAA,oBAoDNC,qBAAAA,uEA/DC,+BACI,qEACN,8iIAER,SAAeF,UAAUG,WAAmB,4CAC3CC,wFACWC,gFADXD,8IACmBE,GAAAA,cAAI,EAACC,aAAI,CAACC,OAAO,CAACL,kKAA1BE,YACfD,MAAMK,IAAI,CAACJ,gcAEb,SAAOD,SACT,KACO,SAAeH,eACpBS,SAAmB,MACnBC,UAAAA,uDAAqB,gDAEfC,QAED,0BAAA,kBAAA,eAAA,UAAA,MAAMC,SACLC,WAUEC,oFAbFH,WAED,+BAAA,wBAAA,2EAAA,UAAkBF,yDAAlB,2BAAA,MAAA,oCAAMG,SAAN,YACCC,WAAa,KAAOP,aAAI,CAACS,QAAQ,CAACC,UAAWJ,UAEjD,GAAIF,UAAW,CACb,GAAIO,QAAQV,OAAO,CAAE,CACnB,OAAOU,QAAQC,KAAK,CAACD,QAAQV,OAAO,CAACM,YAAY,AACnD,KAAO,CACLA,YAAc,AAAC,MAAgB,OAAXM,KAAKC,GAAG,GAC9B,CACF,CAEiB,SAAM,gBAAOP,2EAAP,sBAAjBC,SAAW,cACjBH,QAAQH,IAAI,CAAC,CACXI,SAAAA,SACAE,SAAAA,QACF,yBAfG,uFAAA,uBAAA,8CAAA,2BAAA,wBAAA,+BAAA,yBAAA,iCAkBL,SAAOH,WACT,KACO,SAAeb,4DACduB,uDAAAA,YAAcxB,kBACpB,SAAOwB,YAAYC,KAAK,CAAChB,aAAI,CAACiB,GAAG,EAAEC,KAAK,CAAC,EAAG,CAAC,GAAGC,IAAI,CAACnB,aAAI,CAACiB,GAAG,IAC/D,KAEO,SAAS1B,sBAOGoB,cALjB,IAAMS,cAAgBC,QAAQC,GAAG,CAAC,WAAW,CAC7C,GAAIF,eAAiBA,cAAcG,MAAM,GAAK,EAAG,CAC/C,OAAOH,aACT,KAEiBT,mBAAjB,IAAMa,SAAWb,CAAAA,oBAAAA,cAAAA,QAAQc,IAAI,UAAZd,8BAAAA,cAAcX,IAAI,UAAlBW,4BAAAA,mBAAsBD,UACvC,IAAIgB,IAAM1B,aAAI,CAAC2B,OAAO,CAACH,UACvB,GAAIE,IAAIE,QAAQ,CAAC,WAAY,CAC3BF,IAAMA,IAAIV,KAAK,CAAC,UAAU,CAAC,EAAE,AAC/B,CACA,EAAG,CACD,GAAIa,WAAE,CAACC,UAAU,CAAC9B,aAAI,CAACmB,IAAI,CAACO,IAAK,kBAAmB,CAClD,OAAOA,IAAIV,KAAK,CAAChB,aAAI,CAACiB,GAAG,EAAEE,IAAI,CAACnB,aAAI,CAACiB,GAAG,CAC1C,CACAS,IAAMA,IAAIV,KAAK,CAAChB,aAAI,CAACiB,GAAG,EAAEC,KAAK,CAAC,EAAG,CAAC,GAAGC,IAAI,CAACnB,aAAI,CAACiB,GAAG,CACtD,OAASS,IAAIV,KAAK,CAAChB,aAAI,CAACiB,GAAG,EAAEM,MAAM,CAAG,EAAG,AACzC,OAAM,IAAIQ,MAAM,sCAClB,CAEO,SAASpC,YAAeqC,KAAQ,EACrC,OAAOA,QAAU,MAAQA,QAAUC,SACrC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/zod-error.ts"],"sourcesContent":["\nimport { z } from 'zod';\n\ntype ValidationError = {\n path: string[];\n message: string;\n};\n\nexport function humanizeZodError(error: z.ZodError): ValidationError[] {\n return error.issues.map(({ path: originPath, message }) => {\n const path = originPath.map(item => {\n if (typeof item === \"symbol\") {\n return item.description ?? item.toString();\n }\n\n if (typeof item === \"number\") {\n return `[${item}]`;\n }\n\n return item;\n });\n\n return { path, message: message };\n });\n}\n"],"names":["humanizeZodError","error","issues","map","path","originPath","message","item","description","toString"],"mappings":"oGAQgBA,0DAAAA,yJAAT,SAASA,iBAAiBC,KAAiB,EAChD,OAAOA,MAAMC,MAAM,CAACC,GAAG,CAAC,oBAAIC,AAAMC,iBAAND,KAAkBE,cAAAA,QAC5C,IAAMF,KAAOC,WAAWF,GAAG,CAACI,SAAAA,MAC1B,GAAI,CAAA,OAAOA,+BAAP,SAAOA,KAAG,IAAM,SAAU,KACrBA,kBAAP,MAAOA,CAAAA,kBAAAA,KAAKC,WAAW,UAAhBD,2BAAAA,kBAAoBA,KAAKE,QAAQ,EAC1C,CAEA,GAAI,OAAOF,OAAS,SAAU,CAC5B,MAAO,AAAC,IAAQ,OAALA,KAAK,IAClB,CAEA,OAAOA,IACT,GAEA,MAAO,CAAEH,KAAAA,KAAME,QAASA,OAAQ,CAClC,EACF"}
|
package/src/bin/cli-wrapper.ts
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ts-node
|
|
2
|
-
|
|
3
|
-
import { spawnSync, execSync } from "child_process";
|
|
4
|
-
import { resolve } from "path";
|
|
5
|
-
import { existsSync, rmSync } from "fs";
|
|
6
|
-
import chalk from "chalk";
|
|
7
|
-
import {
|
|
8
|
-
BUILD_DIR,
|
|
9
|
-
SWC_BUILD_COMMAND,
|
|
10
|
-
TSC_TYPE_CHECK_COMMAND,
|
|
11
|
-
} from "./build-config";
|
|
12
|
-
|
|
13
|
-
const scriptPath = resolve(__dirname, "cli.js");
|
|
14
|
-
const args = process.argv.slice(2);
|
|
15
|
-
|
|
16
|
-
// build 명령어는 dist 없이도 실행 가능하도록 cli.ts 외부에서 처리(Sonamu.init에서 dist 필요)
|
|
17
|
-
function build() {
|
|
18
|
-
try {
|
|
19
|
-
console.log(chalk.blue("Removing build directory..."));
|
|
20
|
-
if (existsSync(BUILD_DIR)) {
|
|
21
|
-
rmSync(BUILD_DIR, { recursive: true, force: true });
|
|
22
|
-
}
|
|
23
|
-
} catch (error) {
|
|
24
|
-
console.error(chalk.red("Remove build directory failed."), error);
|
|
25
|
-
process.exit(1);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
try {
|
|
29
|
-
console.log(chalk.blue("Building with swc..."));
|
|
30
|
-
execSync(SWC_BUILD_COMMAND, { cwd: process.cwd(), stdio: "inherit" });
|
|
31
|
-
} catch (error) {
|
|
32
|
-
console.error(chalk.red("Build failed."), error);
|
|
33
|
-
process.exit(1);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function checkTypes() {
|
|
38
|
-
try {
|
|
39
|
-
console.log(chalk.blue("Checking types with tsc..."));
|
|
40
|
-
execSync(TSC_TYPE_CHECK_COMMAND, {
|
|
41
|
-
cwd: process.cwd(),
|
|
42
|
-
stdio: "inherit",
|
|
43
|
-
});
|
|
44
|
-
} catch (error) {
|
|
45
|
-
console.error(chalk.red("Type check failed."), error);
|
|
46
|
-
process.exit(1);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
if (args[0] === "build") {
|
|
51
|
-
console.log(chalk.blue("Building the project..."));
|
|
52
|
-
build();
|
|
53
|
-
checkTypes();
|
|
54
|
-
console.log(chalk.green("Build completed successfully."));
|
|
55
|
-
process.exit(0);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
if (args[0] === "dev:serve") {
|
|
59
|
-
build();
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
if (!existsSync(scriptPath)) {
|
|
63
|
-
console.error(`Error: Script not found at ${scriptPath}`);
|
|
64
|
-
process.exit(1);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
const result = spawnSync(
|
|
68
|
-
process.execPath,
|
|
69
|
-
["-r", "source-map-support/register", "--no-warnings", scriptPath, ...args],
|
|
70
|
-
{
|
|
71
|
-
stdio: "inherit",
|
|
72
|
-
}
|
|
73
|
-
);
|
|
74
|
-
|
|
75
|
-
process.exit(result.status ?? 1);
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import knex from "knex";
|
|
2
|
-
|
|
3
|
-
export function attachOnDuplicateUpdate() {
|
|
4
|
-
try {
|
|
5
|
-
knex.QueryBuilder.extend("onDuplicateUpdate", function (...columns) {
|
|
6
|
-
if (columns.length === 0) {
|
|
7
|
-
// 업데이트 할 컬럼이 없으면 onDuplicateUpdate 구문 처리 패스
|
|
8
|
-
const { sql: originalSQL, bindings: originalBindings } = this.toSQL();
|
|
9
|
-
return this.client.raw(originalSQL, originalBindings);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
const { placeholders, bindings } = columns.reduce(
|
|
13
|
-
(result, column) => {
|
|
14
|
-
if (typeof column === "string") {
|
|
15
|
-
result.placeholders.push(`?? = Values(??)`);
|
|
16
|
-
result.bindings.push(column, column);
|
|
17
|
-
} else if (column && typeof column === "object") {
|
|
18
|
-
Object.keys(column).forEach((key) => {
|
|
19
|
-
result.placeholders.push(`?? = ?`);
|
|
20
|
-
result.bindings.push(key, column[key]);
|
|
21
|
-
});
|
|
22
|
-
} else {
|
|
23
|
-
throw new Error(
|
|
24
|
-
"onDuplicateUpdate error: expected column name to be string or object."
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return result;
|
|
29
|
-
},
|
|
30
|
-
{ placeholders: [], bindings: [] }
|
|
31
|
-
);
|
|
32
|
-
|
|
33
|
-
const { sql: originalSQL, bindings: originalBindings } = this.toSQL();
|
|
34
|
-
|
|
35
|
-
const newBindings = [...originalBindings, ...bindings];
|
|
36
|
-
|
|
37
|
-
return this.client.raw(
|
|
38
|
-
`${originalSQL} ON DUPLICATE KEY UPDATE ${placeholders.join(", ")}`,
|
|
39
|
-
newBindings
|
|
40
|
-
);
|
|
41
|
-
});
|
|
42
|
-
} catch {
|
|
43
|
-
// ignored
|
|
44
|
-
}
|
|
45
|
-
}
|