sonamu 0.5.6 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/base-frame.js +12 -2
- package/dist/api/caster.js +66 -2
- package/dist/api/code-converters.js +489 -2
- package/dist/api/config.d.ts +76 -0
- package/dist/api/config.d.ts.map +1 -0
- package/dist/api/config.js +32 -0
- package/dist/api/context.d.ts +1 -0
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +3 -2
- package/dist/api/decorators.d.ts +1 -0
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +142 -2
- package/dist/api/index.js +9 -2
- package/dist/api/sonamu.d.ts +8 -22
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +482 -2
- package/dist/bin/build-config.d.ts +2 -1
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +12 -2
- package/dist/bin/cli-wrapper.js +71 -2
- package/dist/bin/cli.js +418 -2
- package/dist/bin/hot-hook-register.d.ts +11 -0
- package/dist/bin/hot-hook-register.d.ts.map +1 -0
- package/dist/bin/hot-hook-register.js +21 -0
- package/dist/database/_batch_update.js +78 -2
- package/dist/database/base-model.js +247 -2
- package/dist/database/code-generator.js +53 -2
- package/dist/database/db.d.ts +5 -16
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +132 -2
- package/dist/database/knex-plugins/knex-on-duplicate-update.js +39 -2
- package/dist/database/puri-wrapper.d.ts +22 -10
- package/dist/database/puri-wrapper.d.ts.map +1 -1
- package/dist/database/puri-wrapper.js +109 -2
- package/dist/database/puri.d.ts +105 -73
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +539 -2
- package/dist/database/puri.types.d.ts +33 -42
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +3 -2
- package/dist/database/transaction-context.d.ts +3 -3
- package/dist/database/transaction-context.d.ts.map +1 -1
- package/dist/database/transaction-context.js +14 -2
- package/dist/database/upsert-builder.js +215 -2
- package/dist/entity/entity-manager.d.ts +3 -1
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +114 -2
- package/dist/entity/entity-utils.js +210 -2
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +651 -2
- package/dist/exceptions/error-handler.js +29 -2
- package/dist/exceptions/so-exceptions.js +85 -2
- package/dist/file-storage/driver.js +79 -2
- package/dist/file-storage/file-storage.js +75 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -2
- package/dist/migration/code-generation.js +558 -2
- package/dist/migration/migration-set.js +364 -2
- package/dist/migration/migrator.d.ts +0 -9
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +510 -2
- package/dist/migration/types.js +3 -2
- package/dist/naite/naite.d.ts +12 -0
- package/dist/naite/naite.d.ts.map +1 -0
- package/dist/naite/naite.js +72 -0
- package/dist/stream/index.js +3 -2
- package/dist/stream/sse.js +38 -2
- package/dist/syncer/api-parser.d.ts +20 -0
- package/dist/syncer/api-parser.d.ts.map +1 -0
- package/dist/syncer/api-parser.js +229 -0
- package/dist/syncer/checksum.d.ts +21 -0
- package/dist/syncer/checksum.d.ts.map +1 -0
- package/dist/syncer/checksum.js +98 -0
- package/dist/syncer/code-generator.d.ts +20 -0
- package/dist/syncer/code-generator.d.ts.map +1 -0
- package/dist/syncer/code-generator.js +141 -0
- package/dist/syncer/entity-operations.d.ts +17 -0
- package/dist/syncer/entity-operations.d.ts.map +1 -0
- package/dist/syncer/entity-operations.js +58 -0
- package/dist/syncer/file-patterns.d.ts +29 -0
- package/dist/syncer/file-patterns.d.ts.map +1 -0
- package/dist/syncer/file-patterns.js +38 -0
- package/dist/syncer/index.d.ts +6 -0
- package/dist/syncer/index.d.ts.map +1 -1
- package/dist/syncer/index.js +9 -2
- package/dist/syncer/module-loader.d.ts +35 -0
- package/dist/syncer/module-loader.d.ts.map +1 -0
- package/dist/syncer/module-loader.js +82 -0
- package/dist/syncer/syncer.d.ts +93 -108
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +375 -2
- package/dist/template/entity-converter.d.ts +14 -0
- package/dist/template/entity-converter.d.ts.map +1 -0
- package/dist/template/entity-converter.js +101 -0
- package/dist/template/helpers.d.ts +23 -0
- package/dist/template/helpers.d.ts.map +1 -0
- package/dist/template/helpers.js +64 -0
- package/dist/{templates → template/implementations}/entity.template.d.ts +3 -3
- package/dist/template/implementations/entity.template.d.ts.map +1 -0
- package/dist/template/implementations/entity.template.js +87 -0
- package/dist/{templates → template/implementations}/generated.template.d.ts +3 -3
- package/dist/template/implementations/generated.template.d.ts.map +1 -0
- package/dist/template/implementations/generated.template.js +232 -0
- package/dist/{templates → template/implementations}/generated_http.template.d.ts +3 -3
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -0
- package/dist/template/implementations/generated_http.template.js +131 -0
- package/dist/{templates → template/implementations}/generated_sso.template.d.ts +3 -3
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -0
- package/dist/template/implementations/generated_sso.template.js +105 -0
- package/dist/{templates → template/implementations}/init_types.template.d.ts +3 -3
- package/dist/template/implementations/init_types.template.d.ts.map +1 -0
- package/dist/template/implementations/init_types.template.js +38 -0
- package/dist/template/implementations/model.template.d.ts +17 -0
- package/dist/template/implementations/model.template.d.ts.map +1 -0
- package/dist/template/implementations/model.template.js +171 -0
- package/dist/{templates → template/implementations}/model_test.template.d.ts +3 -3
- package/dist/template/implementations/model_test.template.d.ts.map +1 -0
- package/dist/template/implementations/model_test.template.js +35 -0
- package/dist/{templates → template/implementations}/service.template.d.ts +6 -6
- package/dist/template/implementations/service.template.d.ts.map +1 -0
- package/dist/template/implementations/service.template.js +193 -0
- package/dist/{templates → template/implementations}/view_enums_buttonset.template.d.ts +3 -3
- package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -0
- package/dist/template/implementations/view_enums_buttonset.template.js +31 -0
- package/dist/{templates → template/implementations}/view_enums_dropdown.template.d.ts +3 -4
- package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -0
- package/dist/template/implementations/view_enums_dropdown.template.js +50 -0
- package/dist/{templates → template/implementations}/view_enums_select.template.d.ts +3 -3
- package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -0
- package/dist/template/implementations/view_enums_select.template.js +55 -0
- package/dist/{templates → template/implementations}/view_form.template.d.ts +5 -5
- package/dist/template/implementations/view_form.template.d.ts.map +1 -0
- package/dist/template/implementations/view_form.template.js +337 -0
- package/dist/{templates → template/implementations}/view_id_all_select.template.d.ts +3 -3
- package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -0
- package/dist/template/implementations/view_id_all_select.template.js +31 -0
- package/dist/{templates → template/implementations}/view_id_async_select.template.d.ts +3 -3
- package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -0
- package/dist/template/implementations/view_id_async_select.template.js +105 -0
- package/dist/{templates → template/implementations}/view_list.template.d.ts +5 -13
- package/dist/template/implementations/view_list.template.d.ts.map +1 -0
- package/dist/template/implementations/view_list.template.js +465 -0
- package/dist/{templates → template/implementations}/view_list_columns.template.d.ts +3 -3
- package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -0
- package/dist/template/implementations/view_list_columns.template.js +49 -0
- package/dist/{templates → template/implementations}/view_search_input.template.d.ts +3 -3
- package/dist/template/implementations/view_search_input.template.d.ts.map +1 -0
- package/dist/template/implementations/view_search_input.template.js +64 -0
- package/dist/template/index.d.ts +5 -0
- package/dist/template/index.d.ts.map +1 -0
- package/dist/template/index.js +6 -0
- package/dist/template/template.d.ts +39 -0
- package/dist/template/template.d.ts.map +1 -0
- package/dist/template/template.js +47 -0
- package/dist/template/zod-converter.d.ts +18 -0
- package/dist/template/zod-converter.d.ts.map +1 -0
- package/dist/template/zod-converter.js +166 -0
- package/dist/testing/_relation-graph.js +80 -2
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +521 -2
- package/dist/types/types.d.ts +39 -40
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +289 -2
- package/dist/typings/knex.d.js +3 -2
- package/dist/utils/async-utils.d.ts +7 -0
- package/dist/utils/async-utils.d.ts.map +1 -1
- package/dist/utils/async-utils.js +57 -2
- package/dist/utils/console-util.d.ts +2 -0
- package/dist/utils/console-util.d.ts.map +1 -0
- package/dist/utils/console-util.js +6 -0
- package/dist/utils/controller.js +26 -2
- package/dist/utils/esm-utils.d.ts +45 -0
- package/dist/utils/esm-utils.d.ts.map +1 -0
- package/dist/utils/esm-utils.js +56 -0
- package/dist/utils/fs-utils.js +17 -2
- package/dist/utils/lodash-able.js +6 -2
- package/dist/utils/model.js +22 -2
- package/dist/utils/path-utils.d.ts +89 -0
- package/dist/utils/path-utils.d.ts.map +1 -0
- package/dist/utils/path-utils.js +60 -0
- package/dist/utils/process-utils.d.ts +13 -0
- package/dist/utils/process-utils.d.ts.map +1 -0
- package/dist/utils/process-utils.js +36 -0
- package/dist/utils/sql-parser.js +35 -2
- package/dist/utils/utils.d.ts +4 -7
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +33 -2
- package/dist/utils/zod-error.d.ts.map +1 -1
- package/dist/utils/zod-error.js +19 -2
- package/package.json +21 -9
- package/src/api/code-converters.ts +2 -2
- package/src/api/config.ts +142 -0
- package/src/api/context.ts +1 -0
- package/src/api/decorators.ts +15 -5
- package/src/api/sonamu.ts +102 -87
- package/src/bin/build-config.ts +2 -1
- package/src/bin/cli-wrapper.ts +10 -3
- package/src/bin/cli.ts +108 -56
- package/src/bin/hot-hook-register.ts +22 -0
- package/src/database/base-model.ts +1 -1
- package/src/database/code-generator.ts +1 -1
- package/src/database/db.ts +53 -60
- package/src/database/puri-wrapper.ts +104 -26
- package/src/database/puri.ts +477 -580
- package/src/database/puri.types.ts +111 -201
- package/src/database/transaction-context.ts +4 -4
- package/src/database/upsert-builder.ts +1 -1
- package/src/entity/entity-manager.ts +19 -15
- package/src/entity/entity.ts +4 -3
- package/src/index.ts +2 -0
- package/src/migration/code-generation.ts +1 -1
- package/src/migration/migration-set.ts +1 -1
- package/src/migration/migrator.ts +23 -152
- package/src/naite/naite.ts +70 -0
- package/src/syncer/api-parser.ts +299 -0
- package/src/syncer/checksum.ts +152 -0
- package/src/syncer/code-generator.ts +202 -0
- package/src/syncer/entity-operations.ts +68 -0
- package/src/syncer/file-patterns.ts +56 -0
- package/src/syncer/index.ts +6 -0
- package/src/syncer/module-loader.ts +125 -0
- package/src/syncer/syncer.ts +363 -1420
- package/src/template/entity-converter.ts +123 -0
- package/src/template/helpers.ts +84 -0
- package/src/{templates → template/implementations}/entity.template.ts +4 -4
- package/src/{templates → template/implementations}/generated.template.ts +9 -9
- package/src/{templates → template/implementations}/generated_http.template.ts +9 -6
- package/src/{templates → template/implementations}/generated_sso.template.ts +7 -7
- package/src/{templates → template/implementations}/init_types.template.ts +4 -4
- package/src/{templates → template/implementations}/model.template.ts +9 -9
- package/src/{templates → template/implementations}/model_test.template.ts +5 -5
- package/src/{templates → template/implementations}/service.template.ts +29 -12
- package/src/{templates → template/implementations}/view_enums_buttonset.template.ts +3 -3
- package/src/{templates → template/implementations}/view_enums_dropdown.template.ts +5 -21
- package/src/{templates → template/implementations}/view_enums_select.template.ts +4 -4
- package/src/{templates → template/implementations}/view_form.template.ts +11 -13
- package/src/{templates → template/implementations}/view_id_all_select.template.ts +3 -3
- package/src/{templates → template/implementations}/view_id_async_select.template.ts +3 -3
- package/src/{templates → template/implementations}/view_list.template.ts +13 -64
- package/src/{templates → template/implementations}/view_list_columns.template.ts +3 -3
- package/src/{templates → template/implementations}/view_search_input.template.ts +3 -3
- package/src/template/index.ts +4 -0
- package/src/template/template.ts +86 -0
- package/src/template/zod-converter.ts +219 -0
- package/src/testing/fixture-manager.ts +8 -1
- package/src/types/types.ts +39 -62
- package/src/utils/async-utils.ts +17 -0
- package/src/utils/console-util.ts +4 -0
- package/src/utils/esm-utils.ts +69 -0
- package/src/utils/path-utils.ts +102 -0
- package/src/utils/process-utils.ts +46 -0
- package/src/utils/sql-parser.ts +1 -1
- package/src/utils/utils.ts +14 -40
- package/src/utils/zod-error.ts +0 -1
- package/dist/api/base-frame.js.map +0 -1
- package/dist/api/caster.js.map +0 -1
- package/dist/api/code-converters.js.map +0 -1
- package/dist/api/context.js.map +0 -1
- package/dist/api/decorators.js.map +0 -1
- package/dist/api/index.js.map +0 -1
- package/dist/api/sonamu.js.map +0 -1
- package/dist/bin/build-config.js.map +0 -1
- package/dist/bin/cli-wrapper.js.map +0 -1
- package/dist/bin/cli.js.map +0 -1
- package/dist/database/_batch_update.js.map +0 -1
- package/dist/database/base-model.js.map +0 -1
- package/dist/database/code-generator.js.map +0 -1
- package/dist/database/db.js.map +0 -1
- package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +0 -1
- package/dist/database/puri-wrapper.js.map +0 -1
- package/dist/database/puri.js.map +0 -1
- package/dist/database/puri.types.js.map +0 -1
- package/dist/database/transaction-context.js.map +0 -1
- package/dist/database/upsert-builder.js.map +0 -1
- package/dist/entity/entity-manager.js.map +0 -1
- package/dist/entity/entity-utils.js.map +0 -1
- package/dist/entity/entity.js.map +0 -1
- package/dist/exceptions/error-handler.js.map +0 -1
- package/dist/exceptions/so-exceptions.js.map +0 -1
- package/dist/file-storage/driver.js.map +0 -1
- package/dist/file-storage/file-storage.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/migration/code-generation.js.map +0 -1
- package/dist/migration/migration-set.js.map +0 -1
- package/dist/migration/migrator.js.map +0 -1
- package/dist/migration/types.js.map +0 -1
- package/dist/stream/index.js.map +0 -1
- package/dist/stream/sse.js.map +0 -1
- package/dist/syncer/index.js.map +0 -1
- package/dist/syncer/syncer.js.map +0 -1
- package/dist/templates/base-template.d.ts +0 -13
- package/dist/templates/base-template.d.ts.map +0 -1
- package/dist/templates/base-template.js +0 -2
- package/dist/templates/base-template.js.map +0 -1
- package/dist/templates/entity.template.d.ts.map +0 -1
- package/dist/templates/entity.template.js +0 -2
- package/dist/templates/entity.template.js.map +0 -1
- package/dist/templates/generated.template.d.ts.map +0 -1
- package/dist/templates/generated.template.js +0 -2
- package/dist/templates/generated.template.js.map +0 -1
- package/dist/templates/generated_http.template.d.ts.map +0 -1
- package/dist/templates/generated_http.template.js +0 -2
- package/dist/templates/generated_http.template.js.map +0 -1
- package/dist/templates/generated_sso.template.d.ts.map +0 -1
- package/dist/templates/generated_sso.template.js +0 -2
- package/dist/templates/generated_sso.template.js.map +0 -1
- package/dist/templates/index.d.ts +0 -2
- package/dist/templates/index.d.ts.map +0 -1
- package/dist/templates/index.js +0 -2
- package/dist/templates/index.js.map +0 -1
- package/dist/templates/init_types.template.d.ts.map +0 -1
- package/dist/templates/init_types.template.js +0 -2
- package/dist/templates/init_types.template.js.map +0 -1
- package/dist/templates/model.template.d.ts +0 -17
- package/dist/templates/model.template.d.ts.map +0 -1
- package/dist/templates/model.template.js +0 -2
- package/dist/templates/model.template.js.map +0 -1
- package/dist/templates/model_test.template.d.ts.map +0 -1
- package/dist/templates/model_test.template.js +0 -2
- package/dist/templates/model_test.template.js.map +0 -1
- package/dist/templates/service.template.d.ts.map +0 -1
- package/dist/templates/service.template.js +0 -2
- package/dist/templates/service.template.js.map +0 -1
- package/dist/templates/view_enums_buttonset.template.d.ts.map +0 -1
- package/dist/templates/view_enums_buttonset.template.js +0 -2
- package/dist/templates/view_enums_buttonset.template.js.map +0 -1
- package/dist/templates/view_enums_dropdown.template.d.ts.map +0 -1
- package/dist/templates/view_enums_dropdown.template.js +0 -2
- package/dist/templates/view_enums_dropdown.template.js.map +0 -1
- package/dist/templates/view_enums_select.template.d.ts.map +0 -1
- package/dist/templates/view_enums_select.template.js +0 -2
- package/dist/templates/view_enums_select.template.js.map +0 -1
- package/dist/templates/view_form.template.d.ts.map +0 -1
- package/dist/templates/view_form.template.js +0 -2
- package/dist/templates/view_form.template.js.map +0 -1
- package/dist/templates/view_id_all_select.template.d.ts.map +0 -1
- package/dist/templates/view_id_all_select.template.js +0 -2
- package/dist/templates/view_id_all_select.template.js.map +0 -1
- package/dist/templates/view_id_async_select.template.d.ts.map +0 -1
- package/dist/templates/view_id_async_select.template.js +0 -2
- package/dist/templates/view_id_async_select.template.js.map +0 -1
- package/dist/templates/view_list.template.d.ts.map +0 -1
- package/dist/templates/view_list.template.js +0 -2
- package/dist/templates/view_list.template.js.map +0 -1
- package/dist/templates/view_list_columns.template.d.ts.map +0 -1
- package/dist/templates/view_list_columns.template.js +0 -2
- package/dist/templates/view_list_columns.template.js.map +0 -1
- package/dist/templates/view_search_input.template.d.ts.map +0 -1
- package/dist/templates/view_search_input.template.js +0 -2
- package/dist/templates/view_search_input.template.js.map +0 -1
- package/dist/testing/_relation-graph.js.map +0 -1
- package/dist/testing/fixture-manager.js.map +0 -1
- package/dist/types/types.js.map +0 -1
- package/dist/typings/knex.d.js.map +0 -1
- package/dist/utils/async-utils.js.map +0 -1
- package/dist/utils/controller.js.map +0 -1
- package/dist/utils/fs-utils.js.map +0 -1
- package/dist/utils/lodash-able.js.map +0 -1
- package/dist/utils/model.js.map +0 -1
- package/dist/utils/sql-parser.js.map +0 -1
- package/dist/utils/utils.js.map +0 -1
- package/dist/utils/zod-error.js.map +0 -1
- package/src/templates/base-template.ts +0 -19
- package/src/templates/index.ts +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/migration/code-generation.ts"],"sourcesContent":["import _ from \"lodash\";\nimport prettier from \"prettier\";\nimport equal from \"fast-deep-equal\";\nimport {\n GenMigrationCode,\n MigrationColumn,\n MigrationForeign,\n MigrationIndex,\n MigrationSet,\n} from \"../types/types\";\n\n/**\n * 테이블 생성하는 케이스 - 컬럼/인덱스 생성\n */\nasync function generateCreateCode_ColumnAndIndexes(\n table: string,\n columns: MigrationColumn[],\n indexes: MigrationIndex[]\n): Promise<GenMigrationCode> {\n // fulltext index 분리\n const [ngramIndexes, standardIndexes] = _.partition(\n indexes,\n (i) => i.type === \"fulltext\" && i.parser === \"ngram\"\n );\n\n // 컬럼, 인덱스 처리\n const lines: string[] = [\n 'import { Knex } from \"knex\";',\n \"\",\n \"export async function up(knex: Knex): Promise<void> {\",\n `await knex.schema.createTable(\"${table}\", (table) => {`,\n \"// columns\",\n ...genColumnDefinitions(columns),\n \"\",\n \"// indexes\",\n ...standardIndexes.map((index) => genIndexDefinition(index, table)),\n \"});\",\n // ngram은 knex.raw로 처리하므로 createTable 밖에서 실행\n ...ngramIndexes.map((index) => genIndexDefinition(index, table)),\n \"}\",\n \"\",\n \"export async function down(knex: Knex): Promise<void> {\",\n ` return knex.schema.dropTable(\"${table}\");`,\n \"}\",\n ];\n return {\n table,\n type: \"normal\",\n title: `create__${table}`,\n formatted: await prettier.format(lines.join(\"\\n\"), {\n parser: \"typescript\",\n }),\n };\n}\n\n/**\n * MigrationColumn[] 읽어서 컬럼 정의하는 구문 생성\n */\nfunction genColumnDefinitions(columns: MigrationColumn[]): string[] {\n return columns.map((column) => {\n const chains: string[] = [];\n if (column.name === \"id\") {\n return `table.increments().primary();`;\n }\n\n // FIXME: float(M,D) deprecated -> decimal(M,D) 이용하도록 하고, float/double 처리 추가\n if (column.type === \"float\" || column.type === \"decimal\") {\n chains.push(\n `${column.type}('${column.name}', ${column.precision}, ${column.scale})`\n );\n } else {\n // type, length\n let columnType = column.type;\n let extraType: string | undefined;\n if (columnType.includes(\"text\") && columnType !== \"text\") {\n extraType = columnType;\n columnType = \"text\";\n }\n chains.push(\n `${columnType}('${column.name}'${\n column.length ? `, ${column.length}` : \"\"\n }${extraType ? `, '${extraType}'` : \"\"})`\n );\n }\n if (column.unsigned) {\n chains.push(\"unsigned()\");\n }\n\n // nullable\n chains.push(column.nullable ? \"nullable()\" : \"notNullable()\");\n\n // defaultTo\n if (column.defaultTo !== undefined) {\n if (\n typeof column.defaultTo === \"string\" &&\n column.defaultTo.startsWith(`\"`)\n ) {\n chains.push(`defaultTo(${column.defaultTo})`);\n } else {\n chains.push(`defaultTo(knex.raw('${column.defaultTo}'))`);\n }\n }\n\n return `table.${chains.join(\".\")};`;\n });\n}\n\n/**\n * 개별 인덱스 정의 생성\n */\nfunction genIndexDefinition(index: MigrationIndex, table: string) {\n const methodMap = {\n index: \"index\",\n fulltext: \"index\",\n unique: \"unique\",\n };\n\n if (index.type === \"fulltext\" && index.parser === \"ngram\") {\n const indexName = `${table}_${index.columns.join(\"_\")}_index`;\n return `await knex.raw(\\`ALTER TABLE ${table} ADD FULLTEXT INDEX ${indexName} (${index.columns.join(\n \", \"\n )}) WITH PARSER ngram\\`);`;\n }\n\n return `table.${methodMap[index.type]}([${index.columns\n .map((col) => `'${col}'`)\n .join(\",\")}]${index.type === \"fulltext\" ? \", undefined, 'FULLTEXT'\" : \"\"})`;\n}\n\n/**\n * 테이블 생성하는 케이스 - FK 생성\n */\nasync function generateCreateCode_Foreign(\n table: string,\n foreigns: MigrationForeign[]\n): Promise<GenMigrationCode[]> {\n if (foreigns.length === 0) {\n return [];\n }\n\n const { up, down } = genForeignDefinitions(table, foreigns);\n if (up.length === 0 && down.length === 0) {\n console.log(\"fk 가 뭔가 다릅니다\");\n return [];\n }\n\n const lines: string[] = [\n 'import { Knex } from \"knex\";',\n \"\",\n \"export async function up(knex: Knex): Promise<void> {\",\n `return knex.schema.alterTable(\"${table}\", (table) => {`,\n \"// create fk\",\n ...up,\n \"});\",\n \"}\",\n \"\",\n \"export async function down(knex: Knex): Promise<void> {\",\n `return knex.schema.alterTable(\"${table}\", (table) => {`,\n \"// drop fk\",\n ...down,\n \"});\",\n \"}\",\n ];\n\n const foreignKeysString = foreigns\n .map((foreign) => foreign.columns.join(\"_\"))\n .join(\"_\");\n return [\n {\n table,\n type: \"foreign\",\n title: `foreign__${table}__${foreignKeysString}`,\n formatted: await prettier.format(lines.join(\"\\n\"), {\n parser: \"typescript\",\n }),\n },\n ];\n}\n\n/**\n * MigrationForeign[] 읽어서 외부키 constraint 정의하는 구문 생성\n */\nfunction genForeignDefinitions(\n table: string,\n foreigns: MigrationForeign[]\n): { up: string[]; down: string[] } {\n return foreigns.reduce(\n (r, foreign) => {\n const columnsStringQuote = foreign.columns\n .map((col) => `'${col.replace(`${table}.`, \"\")}'`)\n .join(\",\");\n r.up.push(\n `table.foreign('${foreign.columns.join(\",\")}')\n .references('${foreign.to}')\n .onUpdate('${foreign.onUpdate}')\n .onDelete('${foreign.onDelete}')`\n );\n r.down.push(`table.dropForeign([${columnsStringQuote}])`);\n return r;\n },\n {\n up: [] as string[],\n down: [] as string[],\n }\n );\n}\n\n/**\n * 테이블 변경 케이스 - 컬럼/인덱스 변경\n */\nasync function generateAlterCode_ColumnAndIndexes(\n table: string,\n entityColumns: MigrationColumn[],\n entityIndexes: MigrationIndex[],\n dbColumns: MigrationColumn[],\n dbIndexes: MigrationIndex[],\n dbForeigns: MigrationForeign[]\n): Promise<GenMigrationCode[]> {\n /*\n 세부 비교 후 다른점 찾아서 코드 생성\n\n 1. 컬럼갯수 다름: MD에 있으나, DB에 없다면 추가\n 2. 컬럼갯수 다름: MD에 없으나, DB에 있다면 삭제\n 3. 그외 컬럼(컬럼 갯수가 동일하거나, 다른 경우 동일한 컬럼끼리) => alter\n 4. 다른거 다 동일하고 index만 변경되는 경우\n\n ** 컬럼명을 변경하는 경우는 따로 핸들링하지 않음\n => drop/add 형태의 마이그레이션 코드가 생성되는데, 수동으로 rename 코드로 수정하여 처리\n */\n\n // 각 컬럼 이름 기준으로 add, drop, alter 여부 확인\n const alterColumnsTo = getAlterColumnsTo(entityColumns, dbColumns);\n\n // 추출된 컬럼들을 기준으로 각각 라인 생성\n const alterColumnLinesTo = getAlterColumnLinesTo(\n alterColumnsTo,\n entityColumns,\n table,\n dbForeigns\n );\n\n // 인덱스의 add, drop 여부 확인\n const alterIndexesTo = getAlterIndexesTo(entityIndexes, dbIndexes);\n\n // fulltext index 분리\n const [ngramIndexes, standardIndexes] = _.partition(\n alterIndexesTo.add,\n (i) => i.type === \"fulltext\" && i.parser === \"ngram\"\n );\n\n // 인덱스가 삭제되는 경우, 컬럼과 같이 삭제된 케이스에는 drop에서 제외해야함!\n const indexNeedsToDrop = alterIndexesTo.drop.filter(\n (index) =>\n index.columns.every((colName) =>\n alterColumnsTo.drop.map((col) => col.name).includes(colName)\n ) === false\n );\n\n const lines: string[] = [\n 'import { Knex } from \"knex\";',\n \"\",\n \"export async function up(knex: Knex): Promise<void> {\",\n `await knex.schema.alterTable(\"${table}\", (table) => {`,\n // 1. add column\n ...(alterColumnsTo.add.length > 0 ? alterColumnLinesTo.add.up : []),\n // 2. drop column\n ...(alterColumnsTo.drop.length > 0 ? alterColumnLinesTo.drop.up : []),\n // 3. alter column\n ...(alterColumnsTo.alter.length > 0 ? alterColumnLinesTo.alter.up : []),\n // 4. add index\n ...standardIndexes.map((index) => genIndexDefinition(index, table)),\n // 5. drop index\n ...indexNeedsToDrop.map(genIndexDropDefinition),\n \"});\",\n // ngram은 knex.raw로 처리하므로 alterTable 밖에서 실행\n ...ngramIndexes.map((index) => genIndexDefinition(index, table)),\n \"}\",\n \"\",\n \"export async function down(knex: Knex): Promise<void> {\",\n `return knex.schema.alterTable(\"${table}\", (table) => {`,\n ...(alterColumnsTo.add.length > 0 ? alterColumnLinesTo.add.down : []),\n ...(alterColumnsTo.drop.length > 0 ? alterColumnLinesTo.drop.down : []),\n ...(alterColumnsTo.alter.length > 0 ? alterColumnLinesTo.alter.down : []),\n ...alterIndexesTo.add\n .filter(\n (index) =>\n index.columns.every((colName) =>\n alterColumnsTo.add.map((col) => col.name).includes(colName)\n ) === false\n )\n .map(genIndexDropDefinition),\n ...indexNeedsToDrop.map((index) => genIndexDefinition(index, table)),\n \"});\",\n \"}\",\n ];\n\n const formatted = await prettier.format(lines.join(\"\\n\"), {\n parser: \"typescript\",\n });\n\n const title = [\n \"alter\",\n table,\n ...([\"add\", \"drop\", \"alter\"] as const)\n .map((action) => {\n const len = alterColumnsTo[action].length;\n if (len > 0) {\n return action + len;\n }\n return null;\n })\n .filter((part) => part !== null),\n ].join(\"_\");\n\n return [\n {\n table,\n title,\n formatted,\n type: \"normal\",\n },\n ];\n}\n\n/**\n * 각 컬럼 이름 기준으로 add, drop, alter 여부 확인\n */\nfunction getAlterColumnsTo(\n entityColumns: MigrationColumn[],\n dbColumns: MigrationColumn[]\n) {\n const columnsTo = {\n add: [] as MigrationColumn[],\n drop: [] as MigrationColumn[],\n alter: [] as MigrationColumn[],\n };\n\n // 컬럼명 기준 비교\n const extraColumns = {\n db: _.differenceBy(dbColumns, entityColumns, (col) => col.name),\n entity: _.differenceBy(entityColumns, dbColumns, (col) => col.name),\n };\n if (extraColumns.entity.length > 0) {\n columnsTo.add = columnsTo.add.concat(extraColumns.entity);\n }\n if (extraColumns.db.length > 0) {\n columnsTo.drop = columnsTo.drop.concat(extraColumns.db);\n }\n\n // 동일 컬럼명의 세부 필드 비교\n const sameDbColumns = _.intersectionBy(\n dbColumns,\n entityColumns,\n (col) => col.name\n );\n const sameMdColumns = _.intersectionBy(\n entityColumns,\n dbColumns,\n (col) => col.name\n );\n columnsTo.alter = _.differenceWith(sameDbColumns, sameMdColumns, (a, b) =>\n equal(a, b)\n );\n\n return columnsTo;\n}\n\n/**\n * 추출된 컬럼들을 기준으로 각각 라인 생성\n */\nfunction getAlterColumnLinesTo(\n columnsTo: ReturnType<typeof getAlterColumnsTo>,\n entityColumns: MigrationColumn[],\n table: string,\n dbForeigns: MigrationForeign[]\n) {\n let linesTo = {\n add: {\n up: [] as string[],\n down: [] as string[],\n },\n drop: {\n up: [] as string[],\n down: [] as string[],\n },\n alter: {\n up: [] as string[],\n down: [] as string[],\n },\n };\n\n linesTo.add = {\n up: [\"// add\", ...genColumnDefinitions(columnsTo.add)],\n down: [\n \"// rollback - add\",\n `table.dropColumns(${columnsTo.add\n .map((col) => `'${col.name}'`)\n .join(\", \")})`,\n ],\n };\n\n // drop할 컬럼에 걸린 FK 찾기\n const dropColumnNames = columnsTo.drop.map((col) => col.name);\n const fkToDropBeforeColumn = dbForeigns.filter((fk) =>\n fk.columns.some((col) => dropColumnNames.includes(col))\n );\n\n const dropFkLines = fkToDropBeforeColumn.map((fk) => {\n const columnsStringQuote = fk.columns.map((col) => `'${col}'`).join(\",\");\n return `table.dropForeign([${columnsStringQuote}])`;\n });\n\n const restoreFkLines = genForeignDefinitions(table, fkToDropBeforeColumn).up;\n\n linesTo.drop = {\n up: [\n ...(dropFkLines.length > 0\n ? [\"// drop foreign keys on columns to be dropped\", ...dropFkLines]\n : []),\n \"// drop columns\",\n `table.dropColumns(${columnsTo.drop\n .map((col) => `'${col.name}'`)\n .join(\", \")})`,\n ],\n down: [\n \"// rollback - drop columns\",\n ...genColumnDefinitions(columnsTo.drop),\n ...(restoreFkLines.length > 0\n ? [\"// restore foreign keys\", ...restoreFkLines]\n : []),\n ],\n };\n linesTo.alter = columnsTo.alter.reduce(\n (r, dbColumn) => {\n const entityColumn = entityColumns.find(\n (col) => col.name == dbColumn.name\n );\n if (entityColumn === undefined) {\n return r;\n }\n\n // 컬럼 변경사항\n const columnDiffUp = _.difference(\n genColumnDefinitions([entityColumn]),\n genColumnDefinitions([dbColumn])\n );\n const columnDiffDown = _.difference(\n genColumnDefinitions([dbColumn]),\n genColumnDefinitions([entityColumn])\n );\n if (columnDiffUp.length > 0) {\n r.up = [\n ...r.up,\n \"// alter column\",\n ...columnDiffUp.map((l) => l.replace(\";\", \"\") + \".alter();\"),\n ];\n r.down = [\n ...r.down,\n \"// rollback - alter column\",\n ...columnDiffDown.map((l) => l.replace(\";\", \"\") + \".alter();\"),\n ];\n }\n\n return r;\n },\n {\n up: [] as string[],\n down: [] as string[],\n }\n );\n\n return linesTo;\n}\n\n/**\n * 인덱스의 add, drop 여부 확인\n */\nfunction getAlterIndexesTo(\n entityIndexes: MigrationIndex[],\n dbIndexes: MigrationIndex[]\n) {\n // 인덱스 비교\n let indexesTo = {\n add: [] as MigrationIndex[],\n drop: [] as MigrationIndex[],\n };\n const extraIndexes = {\n db: _.differenceBy(dbIndexes, entityIndexes, (col) =>\n [col.type, col.columns.join(\"-\")].join(\"//\")\n ),\n entity: _.differenceBy(entityIndexes, dbIndexes, (col) =>\n [col.type, col.columns.join(\"-\")].join(\"//\")\n ),\n };\n if (extraIndexes.entity.length > 0) {\n indexesTo.add = indexesTo.add.concat(extraIndexes.entity);\n }\n if (extraIndexes.db.length > 0) {\n indexesTo.drop = indexesTo.drop.concat(extraIndexes.db);\n }\n\n return indexesTo;\n}\n\n/**\n * 인덱스 삭제 정의 생성\n */\nfunction genIndexDropDefinition(index: MigrationIndex) {\n const methodMap = {\n index: \"Index\",\n fulltext: \"Index\",\n unique: \"Unique\",\n };\n\n return `table.drop${methodMap[index.type]}([${index.columns\n .map((columnName) => `'${columnName}'`)\n .join(\",\")}])`;\n}\n\n/**\n * 테이블 변경 케이스 - Foreign Key 변경\n */\nasync function generateAlterCode_Foreigns(\n table: string,\n entityForeigns: MigrationForeign[],\n dbForeigns: MigrationForeign[],\n droppingColumns: MigrationColumn[] = []\n): Promise<GenMigrationCode[]> {\n // console.log({ entityForeigns, dbForeigns });\n\n const getKey = (mf: MigrationForeign): string => {\n return [mf.columns.join(\"-\"), mf.to].join(\"///\");\n };\n\n // 삭제될 컬럼명 목록\n const droppingColumnNames = droppingColumns.map((col) => col.name);\n\n const fkTo = entityForeigns.reduce(\n (result, entityF) => {\n const matchingDbF = dbForeigns.find(\n (dbF) => getKey(entityF) === getKey(dbF)\n );\n if (!matchingDbF) {\n result.add.push(entityF);\n return result;\n }\n\n if (equal(entityF, matchingDbF) === false) {\n result.alterSrc.push(matchingDbF);\n result.alterDst.push(entityF);\n return result;\n }\n return result;\n },\n {\n add: [] as MigrationForeign[],\n drop: [] as MigrationForeign[],\n alterSrc: [] as MigrationForeign[],\n alterDst: [] as MigrationForeign[],\n }\n );\n\n // dbForeigns에는 있지만 entityForeigns에는 없는 경우 (삭제된 FK)\n // 단, 삭제될 컬럼의 FK는 제외 (generateAlterCode_ColumnAndIndexes에서 처리)\n dbForeigns.forEach((dbF) => {\n const matchingEntityF = entityForeigns.find(\n (entityF) => getKey(entityF) === getKey(dbF)\n );\n if (!matchingEntityF) {\n // 이 FK의 컬럼이 삭제될 컬럼 목록에 있는지 확인\n const isColumnDropping = dbF.columns.some((col) =>\n droppingColumnNames.includes(col)\n );\n // 컬럼이 삭제되지 않는 경우에만 FK drop 목록에 추가\n if (!isColumnDropping) {\n fkTo.drop.push(dbF);\n }\n }\n });\n\n const linesTo = {\n add: genForeignDefinitions(table, fkTo.add),\n drop: genForeignDefinitions(table, fkTo.drop),\n alterSrc: genForeignDefinitions(table, fkTo.alterSrc),\n alterDst: genForeignDefinitions(table, fkTo.alterDst),\n };\n\n // drop fk columns인 경우(생성될 코드 없는 경우) 패스\n const hasLines = Object.values(linesTo).some(\n (l) => l.up.length > 0 || l.down.length > 0\n );\n if (!hasLines) {\n return [];\n }\n\n const lines: string[] = [\n 'import { Knex } from \"knex\";',\n \"\",\n \"export async function up(knex: Knex): Promise<void> {\",\n `return knex.schema.alterTable(\"${table}\", (table) => {`,\n ...linesTo.drop.down,\n ...linesTo.add.up,\n ...linesTo.alterSrc.down,\n ...linesTo.alterDst.up,\n \"})\",\n \"}\",\n \"\",\n \"export async function down(knex: Knex): Promise<void> {\",\n `return knex.schema.alterTable(\"${table}\", (table) => {`,\n ...linesTo.add.down,\n ...linesTo.alterDst.down,\n ...linesTo.alterSrc.up,\n ...linesTo.drop.up,\n \"})\",\n \"}\",\n ];\n\n const formatted = await prettier.format(lines.join(\"\\n\"), {\n parser: \"typescript\",\n });\n\n const title = [\n \"alter\",\n table,\n \"foreigns\",\n // TODO 바뀌는 부분\n ].join(\"_\");\n\n return [\n {\n table,\n title,\n formatted,\n type: \"normal\",\n },\n ];\n}\n\n/**\n * 주어진 EntitySet을 기반으로 테이블 CREATE 마이그레이션 코드를 생성합니다.\n * @param entitySet\n * @returns CREATE 마이그레이션 코드\n */\nexport async function generateCreateCode(\n entitySet: MigrationSet\n): Promise<GenMigrationCode[]> {\n return [\n await generateCreateCode_ColumnAndIndexes(\n entitySet.table,\n entitySet.columns,\n entitySet.indexes\n ),\n ...(await generateCreateCode_Foreign(entitySet.table, entitySet.foreigns)),\n ];\n}\n\n/**\n * 주어진 entitySet을 목표로, dbSet을 현 상황으로 하여 테이블 ALTER 마이그레이션 코드를 생성합니다.\n * @param entitySet 현 상황의 MigrationSet\n * @param dbSet 목표 상황의 MigrationSet\n * @returns ALTER 마이그레이션 코드\n */\nexport async function generateAlterCode(\n entitySet: MigrationSet,\n dbSet: MigrationSet\n): Promise<GenMigrationCode[]> {\n const replaceColumnDefaultTo = (col: MigrationColumn) => {\n // float인 경우 기본값을 0으로 지정하는 경우 \"0.00\"으로 변환되는 케이스 대응\n if (\n col.type === \"float\" &&\n col.defaultTo &&\n String(col.defaultTo).includes('\"') === false\n ) {\n col.defaultTo = `\"${Number(col.defaultTo).toFixed(col.scale ?? 2)}\"`;\n }\n // string인 경우 기본값이 빈 스트링인 경우 대응\n if (col.type === \"string\" && col.defaultTo === \"\") {\n col.defaultTo = '\"\"';\n }\n // boolean인 경우 기본값 정규화 (MySQL에서는 TINYINT(1)로 저장되므로 0 또는 1로 정규화)\n // TODO: db.ts에 typeCase 설정 확인하여 처리하도록 수정 필요\n if (col.type === \"boolean\" && col.defaultTo !== undefined) {\n if (col.defaultTo === \"0\" || col.defaultTo.toLowerCase() === \"false\") {\n col.defaultTo = \"0\";\n } else if (col.defaultTo === \"1\" || col.defaultTo.toLowerCase() === \"true\") {\n col.defaultTo = \"1\";\n }\n }\n return col;\n };\n const entityColumns = _.sortBy(entitySet.columns, (a) => a.name).map(\n replaceColumnDefaultTo\n );\n const dbColumns = _.sortBy(dbSet.columns, (a) => a.name).map(\n replaceColumnDefaultTo\n );\n\n /* 디버깅용 코드, 특정 컬럼에서 불일치 발생할 때 확인\n const entityColumn = entitySet.columns.find(\n (col) => col.name === \"price_krw\"\n );\n const dbColumn = dbSet.columns.find(\n (col) => col.name === \"price_krw\"\n );\n console.debug({ entityColumn, dbColumn });\n */\n\n const entityIndexes = _.sortBy(entitySet.indexes, (a) =>\n [a.type, ...a.columns.sort((c1, c2) => (c1 > c2 ? 1 : -1))].join(\"-\")\n );\n const dbIndexes = _.sortBy(dbSet.indexes, (a) =>\n [a.type, ...a.columns.sort((c1, c2) => (c1 > c2 ? 1 : -1))].join(\"-\")\n );\n\n const replaceNoActionOnMySQL = (f: MigrationForeign) => {\n // MySQL에서 RESTRICT와 NO ACTION은 동일함\n const { onDelete, onUpdate } = f;\n return {\n ...f,\n onUpdate: onUpdate === \"RESTRICT\" ? \"NO ACTION\" : onUpdate,\n onDelete: onDelete === \"RESTRICT\" ? \"NO ACTION\" : onDelete,\n };\n };\n\n const entityForeigns = _.sortBy(entitySet.foreigns, (a) =>\n [a.to, ...a.columns].join(\"-\")\n ).map((f) => replaceNoActionOnMySQL(f));\n const dbForeigns = _.sortBy(dbSet.foreigns, (a) =>\n [a.to, ...a.columns].join(\"-\")\n ).map((f) => replaceNoActionOnMySQL(f));\n\n // 삭제될 컬럼 목록 계산\n const droppingColumns = _.differenceBy(\n dbColumns,\n entityColumns,\n (col) => col.name\n );\n\n const alterCodes: (GenMigrationCode | GenMigrationCode[] | null)[] = [];\n\n // 1. columnsAndIndexes 처리\n const isEqualColumns = equal(entityColumns, dbColumns);\n const isEqualIndexes = equal(\n entityIndexes.map((index) => _.omit(index, [\"parser\"])),\n dbIndexes\n );\n if (!isEqualColumns || !isEqualIndexes) {\n alterCodes.push(\n await generateAlterCode_ColumnAndIndexes(\n entitySet.table,\n entityColumns,\n entityIndexes,\n dbColumns,\n dbIndexes,\n dbSet.foreigns\n )\n );\n }\n\n // 2. foreigns 처리 (삭제될 컬럼 정보 전달)\n if (equal(entityForeigns, dbForeigns) === false) {\n alterCodes.push(\n await generateAlterCode_Foreigns(\n entitySet.table,\n entityForeigns,\n dbForeigns,\n droppingColumns\n )\n );\n }\n\n if (alterCodes.every((alterCode) => alterCode === null)) {\n return [];\n }\n\n return alterCodes.filter((alterCode) => alterCode !== null).flat();\n}\n"],"names":["generateAlterCode","generateCreateCode","generateCreateCode_ColumnAndIndexes","table","columns","indexes","_","ngramIndexes","standardIndexes","lines","partition","i","type","parser","genColumnDefinitions","map","index","genIndexDefinition","title","prettier","format","join","formatted","column","chains","name","push","precision","scale","columnType","extraType","includes","length","unsigned","nullable","defaultTo","undefined","startsWith","methodMap","fulltext","unique","indexName","col","generateCreateCode_Foreign","foreigns","genForeignDefinitions","up","down","foreignKeysString","console","log","foreign","reduce","r","columnsStringQuote","replace","to","onUpdate","onDelete","generateAlterCode_ColumnAndIndexes","entityColumns","entityIndexes","dbColumns","dbIndexes","dbForeigns","alterColumnsTo","alterColumnLinesTo","alterIndexesTo","indexNeedsToDrop","getAlterColumnsTo","getAlterColumnLinesTo","getAlterIndexesTo","add","drop","filter","every","colName","alter","genIndexDropDefinition","action","len","part","columnsTo","extraColumns","db","differenceBy","entity","concat","sameDbColumns","intersectionBy","sameMdColumns","differenceWith","a","b","equal","linesTo","dropColumnNames","fkToDropBeforeColumn","fk","some","dropFkLines","restoreFkLines","dbColumn","entityColumn","find","columnDiffUp","difference","columnDiffDown","l","indexesTo","extraIndexes","columnName","generateAlterCode_Foreigns","entityForeigns","droppingColumns","getKey","droppingColumnNames","fkTo","hasLines","mf","result","entityF","matchingDbF","dbF","alterSrc","alterDst","forEach","matchingEntityF","isColumnDropping","Object","values","entitySet","dbSet","replaceColumnDefaultTo","replaceNoActionOnMySQL","alterCodes","isEqualColumns","isEqualIndexes","String","Number","toFixed","toLowerCase","sortBy","sort","c1","c2","f","omit","alterCode","flat"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/migration/migration-set.ts"],"sourcesContent":["import { Knex } from \"knex\";\nimport { DBColumn, DBForeign, DBIndex } from \"./types\";\nimport _ from \"lodash\";\nimport inflection from \"inflection\";\nimport { Entity } from \"../entity/entity\";\nimport { EntityManager } from \"../entity/entity-manager\";\nimport {\n isKnexError,\n MigrationSet,\n RelationOn,\n isBelongsToOneRelationProp,\n isDecimalProp,\n isEnumProp,\n isFloatProp,\n isHasManyRelationProp,\n isIntegerProp,\n isManyToManyRelationProp,\n isOneToOneRelationProp,\n isRelationProp,\n isStringProp,\n isTextProp,\n isVirtualProp,\n KnexColumnType,\n MigrationColumn,\n MigrationForeign,\n MigrationIndex,\n MigrationJoinTable,\n MigrationSetAndJoinTable,\n} from \"../types/types\";\n\n/**\n * DB에서 테이블 정보를 읽어서 MigrationSet을 만들어옵니다.\n * @param compareDB Knex 인스턴스\n * @param table 테이블 이름\n * @returns MigrationSet 객체\n */\nexport async function getMigrationSetFromDB(\n compareDB: Knex,\n table: string\n): Promise<MigrationSet | null> {\n let dbColumns: DBColumn[], dbIndexes: DBIndex[], dbForeigns: DBForeign[];\n try {\n [dbColumns, dbIndexes, dbForeigns] = await readTable(compareDB, table);\n } catch (e: unknown) {\n if (isKnexError(e) && e.code === \"ER_NO_SUCH_TABLE\") {\n return null;\n }\n console.error(e);\n return null;\n }\n\n const columns: MigrationColumn[] = dbColumns.map((dbColumn) => {\n const dbColType = resolveDBColType(dbColumn.Type, dbColumn.Field);\n return {\n name: dbColumn.Field,\n nullable: dbColumn.Null !== \"NO\",\n ...dbColType,\n ...(() => {\n if (dbColumn.Default !== null) {\n return {\n defaultTo: dbColumn.Default,\n };\n }\n return {};\n })(),\n };\n });\n\n const dbIndexesGroup = _.groupBy(\n dbIndexes.filter(\n (dbIndex) =>\n dbIndex.Key_name !== \"PRIMARY\" &&\n !dbForeigns.find((dbForeign) => dbForeign.keyName === dbIndex.Key_name)\n ),\n (dbIndex) => dbIndex.Key_name\n );\n\n const parseIndexType = (index: DBIndex) => {\n if (index.Index_type === \"FULLTEXT\") {\n return \"fulltext\";\n }\n return index.Non_unique === 1 ? \"index\" : \"unique\";\n };\n\n // indexes 처리\n const indexes: MigrationIndex[] = Object.keys(dbIndexesGroup).map(\n (keyName) => {\n const currentIndexes = dbIndexesGroup[keyName];\n return {\n type: parseIndexType(currentIndexes[0]),\n columns: currentIndexes.map((currentIndex) => currentIndex.Column_name),\n };\n }\n );\n // console.log(table);\n // console.table(dbIndexes);\n // console.table(dbForeigns);\n\n // foreigns 처리\n const foreigns: MigrationForeign[] = dbForeigns.map((dbForeign) => {\n return {\n columns: [dbForeign.from],\n to: `${dbForeign.referencesTable}.${dbForeign.referencesField}`,\n onUpdate: dbForeign.onUpdate as RelationOn,\n onDelete: dbForeign.onDelete as RelationOn,\n };\n });\n\n return {\n table,\n columns,\n indexes,\n foreigns,\n };\n}\n\n/*\n * 기존 테이블 읽어서 cols, indexes 반환\n */\nasync function readTable(\n compareDB: Knex,\n tableName: string\n): Promise<[DBColumn[], DBIndex[], DBForeign[]]> {\n // 테이블 정보\n try {\n const [_cols] = (await compareDB.raw(`SHOW FIELDS FROM ${tableName}`)) as [\n DBColumn[],\n ];\n const cols = _cols.map((col) => ({\n ...col,\n // Default 값은 숫자나 MySQL Expression이 아닌 경우 \"\"로 감싸줌\n ...(col.Default !== null && {\n Default:\n col.Default.replace(/[0-9]+/g, \"\").length > 0 &&\n col.Extra !== \"DEFAULT_GENERATED\"\n ? `\"${col.Default}\"`\n : col.Default,\n }),\n }));\n\n const [indexes] = await compareDB.raw(`SHOW INDEX FROM ${tableName}`);\n const [[row]] = await compareDB.raw(`SHOW CREATE TABLE ${tableName}`);\n const ddl = row[\"Create Table\"];\n const matched = ddl.match(/CONSTRAINT .+/g);\n const foreignKeys = (matched ?? []).map((line: string) => {\n // 해당 라인을 정규식으로 파싱\n const matched = line.match(\n /CONSTRAINT `(.+)` FOREIGN KEY \\(`(.+)`\\) REFERENCES `(.+)` \\(`(.+)`\\)( ON [A-Z ]+)*/\n );\n if (!matched) {\n throw new Error(`인식할 수 없는 FOREIGN KEY CONSTRAINT ${line}`);\n }\n const [, keyName, from, referencesTable, referencesField, onClause] =\n matched;\n // console.debug({ tableName, line, onClause });\n\n const [onUpdateFull, _onUpdate] =\n (onClause ?? \"\").match(/ON UPDATE ([A-Z ]+)$/) ?? [];\n const onUpdate = _onUpdate ?? \"NO ACTION\";\n\n const onDelete =\n (onClause ?? \"\")\n .replace(onUpdateFull ?? \"\", \"\")\n .match(/ON DELETE ([A-Z ]+)/)?.[1]\n ?.trim() ?? \"NO ACTION\";\n\n return {\n keyName,\n from,\n referencesTable,\n referencesField,\n onDelete,\n onUpdate,\n };\n });\n return [cols, indexes, foreignKeys];\n } catch (e) {\n throw e;\n }\n}\n\nfunction resolveDBColType(\n colType: string,\n colField: string\n): Pick<\n MigrationColumn,\n \"type\" | \"unsigned\" | \"length\" | \"precision\" | \"scale\"\n> {\n let [rawType, unsigned] = colType.split(\" \");\n const matched = rawType.match(/\\(([0-9]+)\\)/);\n let length;\n if (matched !== null && matched[1]) {\n rawType = rawType.replace(/\\(([0-9]+)\\)/, \"\");\n length = parseInt(matched[1]);\n }\n\n if (rawType === \"char\" && colField === \"uuid\") {\n return {\n type: \"uuid\",\n };\n }\n\n switch (rawType) {\n case \"int\":\n return {\n type: \"integer\",\n unsigned: unsigned === \"unsigned\",\n };\n case \"varchar\":\n // case \"char\":\n return {\n type: \"string\",\n ...(length !== undefined && {\n length,\n }),\n };\n case \"text\":\n case \"mediumtext\":\n case \"longtext\":\n case \"timestamp\":\n case \"json\":\n case \"date\":\n case \"time\":\n return {\n type: rawType,\n };\n case \"datetime\":\n return {\n type: \"datetime\",\n };\n case \"tinyint\":\n return {\n type: \"boolean\",\n };\n default:\n // decimal 처리\n if (rawType.startsWith(\"decimal\")) {\n const [, precision, scale] =\n rawType.match(/decimal\\(([0-9]+),([0-9]+)\\)/) ?? [];\n return {\n type: \"decimal\",\n precision: parseInt(precision),\n scale: parseInt(scale),\n ...(unsigned === \"unsigned\" && {\n unsigned: true,\n }),\n };\n } else if (rawType.startsWith(\"float\")) {\n const [, precision, scale] =\n rawType.match(/float\\(([0-9]+),([0-9]+)\\)/) ?? [];\n return {\n type: \"float\",\n precision: parseInt(precision),\n scale: parseInt(scale),\n ...(unsigned === \"unsigned\" && {\n unsigned: true,\n }),\n };\n }\n throw new Error(`resolve 불가능한 DB컬럼 타입 ${colType} ${rawType}`);\n }\n}\n\n/**\n * Entity를 읽어서 MigrationSetAndJoinTable을 만들어옵니다.\n * @param entity Entity 객체\n * @returns MigrationSetAndJoinTable 객체\n */\nexport function getMigrationSetFromEntity(\n entity: Entity\n): MigrationSetAndJoinTable {\n const migrationSet: MigrationSetAndJoinTable = entity.props.reduce(\n (r, prop) => {\n // virtual 필드 제외\n if (isVirtualProp(prop)) {\n return r;\n }\n // HasMany 케이스는 아무 처리도 하지 않음\n if (isHasManyRelationProp(prop)) {\n return r;\n }\n\n // 일반 컬럼\n if (!isRelationProp(prop)) {\n // type resolve\n let type: KnexColumnType;\n if (isTextProp(prop)) {\n type = prop.textType;\n } else if (isEnumProp(prop)) {\n type = \"string\";\n } else {\n type = prop.type as KnexColumnType;\n }\n\n const column = {\n name: prop.name,\n type,\n ...(isIntegerProp(prop) && { unsigned: prop.unsigned === true }),\n ...((isStringProp(prop) || isEnumProp(prop)) && {\n length: prop.length,\n }),\n nullable: prop.nullable === true,\n ...(() => {\n if (prop.dbDefault !== undefined) {\n return {\n defaultTo: prop.dbDefault,\n };\n }\n return {};\n })(),\n // FIXME: float(N, M) deprecated\n // Decimal, Float 타입의 경우 precision, scale 추가\n ...((isDecimalProp(prop) || isFloatProp(prop)) && {\n precision: prop.precision ?? 8,\n scale: prop.scale ?? 2,\n }),\n };\n\n r.columns.push(column);\n }\n\n if (isManyToManyRelationProp(prop)) {\n // ManyToMany 케이스\n const relMd = EntityManager.get(prop.with);\n const table1 = entity.table;\n const table2 = relMd.table;\n const join = {\n from: `${entity.table}.id`,\n through: {\n from: `${prop.joinTable}.${inflection.singularize(table1)}_id`,\n to: `${prop.joinTable}.${inflection.singularize(table2)}_id`,\n onUpdate: prop.onUpdate,\n onDelete: prop.onDelete,\n },\n to: `${relMd.table}.id`,\n };\n const through = join.through;\n const fields = [through.from, through.to];\n r.joinTables.push({\n table: through.from.split(\".\")[0],\n indexes: [\n {\n type: \"unique\",\n columns: [\"uuid\"],\n },\n // 조인 테이블에 걸린 인덱스 찾아와서 연결\n ...entity.indexes\n .filter((index) =>\n index.columns.find((col) => col.includes(prop.joinTable + \".\"))\n )\n .map((index) => ({\n ...index,\n columns: index.columns.map((col) =>\n col.replace(prop.joinTable + \".\", \"\")\n ),\n })),\n ],\n columns: [\n {\n name: \"id\",\n type: \"integer\",\n nullable: false,\n unsigned: true,\n },\n ...fields.map((field) => {\n return {\n name: field.split(\".\")[1],\n type: \"integer\",\n nullable: false,\n unsigned: true,\n } as MigrationColumn;\n }),\n {\n name: \"uuid\",\n nullable: true,\n type: \"uuid\",\n },\n ],\n foreigns: fields.map((field) => {\n // 현재 필드가 어떤 테이블에 속하는지 판단\n const col = field.split(\".\")[1];\n const to = (() => {\n if (\n inflection.singularize(join.to.split(\".\")[0]) + \"_id\" ===\n col\n ) {\n return join.to;\n } else {\n return join.from;\n }\n })();\n return {\n columns: [col],\n to,\n onUpdate: through.onUpdate,\n onDelete: through.onDelete,\n };\n }),\n });\n return r;\n } else if (\n isBelongsToOneRelationProp(prop) ||\n (isOneToOneRelationProp(prop) && prop.hasJoinColumn)\n ) {\n // -OneRelation 케이스\n const idColumnName = prop.name + \"_id\";\n r.columns.push({\n name: idColumnName,\n type: \"integer\",\n unsigned: true,\n nullable: prop.nullable ?? false,\n });\n if ((prop.useConstraint ?? true) === true) {\n r.foreigns.push({\n columns: [idColumnName],\n to: `${inflection\n .underscore(inflection.pluralize(prop.with))\n .toLowerCase()}.id`,\n onUpdate: prop.onUpdate ?? \"RESTRICT\",\n onDelete: prop.onDelete ?? \"RESTRICT\",\n });\n }\n }\n\n return r;\n },\n {\n table: entity.table,\n columns: [] as MigrationColumn[],\n indexes: [] as MigrationIndex[],\n foreigns: [] as MigrationForeign[],\n joinTables: [] as MigrationJoinTable[],\n }\n );\n\n // indexes\n migrationSet.indexes = entity.indexes.filter((index) =>\n index.columns.find((col) => col.includes(\".\") === false)\n );\n\n // uuid\n migrationSet.columns = migrationSet.columns.concat({\n name: \"uuid\",\n nullable: true,\n type: \"uuid\",\n } as MigrationColumn);\n migrationSet.indexes = migrationSet.indexes.concat({\n type: \"unique\",\n columns: [\"uuid\"],\n } as MigrationIndex);\n\n return migrationSet;\n}\n"],"names":["getMigrationSetFromDB","getMigrationSetFromEntity","compareDB","table","dbColumns","dbIndexes","dbForeigns","e","columns","dbIndexesGroup","parseIndexType","indexes","foreigns","readTable","isKnexError","code","console","error","map","dbColumn","dbColType","resolveDBColType","Type","Field","name","nullable","Null","Default","defaultTo","_","groupBy","filter","dbIndex","Key_name","find","dbForeign","keyName","index","Index_type","Non_unique","Object","keys","currentIndexes","type","currentIndex","Column_name","from","to","referencesTable","referencesField","onUpdate","onDelete","tableName","_cols","cols","row","ddl","matched","foreignKeys","raw","col","replace","length","Extra","match","line","Error","onClause","onUpdateFull","_onUpdate","trim","colType","colField","split","rawType","unsigned","parseInt","undefined","startsWith","precision","scale","entity","migrationSet","props","reduce","r","prop","isVirtualProp","isHasManyRelationProp","isRelationProp","isTextProp","textType","isEnumProp","column","isIntegerProp","isStringProp","dbDefault","isDecimalProp","isFloatProp","push","isManyToManyRelationProp","relMd","EntityManager","get","with","table1","table2","join","through","inflection","joinTable","singularize","fields","joinTables","includes","field","isBelongsToOneRelationProp","isOneToOneRelationProp","hasJoinColumn","idColumnName","useConstraint","underscore","pluralize","toLowerCase","concat"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/migration/migrator.ts"],"sourcesContent":["import _ from \"lodash\";\nimport knex, { Knex } from \"knex\";\nimport chalk from \"chalk\";\nimport { DateTime } from \"luxon\";\nimport { mkdir, readdir, unlink, writeFile } from \"fs/promises\";\nimport { exists } from \"../utils/fs-utils\";\nimport prompts from \"prompts\";\nimport { execSync } from \"child_process\";\nimport path from \"path\";\nimport { GenMigrationCode, MigrationSet } from \"../types/types\";\nimport { EntityManager } from \"../entity/entity-manager\";\nimport { Sonamu } from \"../api\";\nimport { ServiceUnavailableException } from \"../exceptions/so-exceptions\";\nimport { SonamuDBConfig } from \"../database/db\";\nimport { generateCreateCode, generateAlterCode } from \"./code-generation\";\nimport { MigrationStatus, MigrationCode, ConnString } from \"./types\";\nimport { getMigrationSetFromDB } from \"./migration-set\";\nimport { getMigrationSetFromEntity } from \"./migration-set\";\n\ntype MigratorMode = \"dev\" | \"deploy\";\nexport type MigratorOptions = {\n readonly mode: MigratorMode;\n};\n\nexport class Migrator {\n targets: {\n compare?: Knex;\n pending: Knex;\n shadow: Knex;\n apply: Knex[];\n };\n\n constructor(private readonly options: MigratorOptions) {\n const { dbConfig } = Sonamu;\n\n if (this.options.mode === \"dev\") {\n const devDB = knex(dbConfig.development_master);\n const testDB = knex(dbConfig.test);\n const fixtureLocalDB = knex(dbConfig.fixture_local);\n\n const applyDBs = [devDB, testDB, fixtureLocalDB];\n if (\n (dbConfig.fixture_local.connection as Knex.MySql2ConnectionConfig)\n .host !==\n (dbConfig.fixture_remote.connection as Knex.MySql2ConnectionConfig)\n .host ||\n (dbConfig.fixture_local.connection as Knex.MySql2ConnectionConfig)\n .database !==\n (dbConfig.fixture_remote.connection as Knex.MySql2ConnectionConfig)\n .database\n ) {\n const fixtureRemoteDB = knex(dbConfig.fixture_remote);\n applyDBs.push(fixtureRemoteDB);\n }\n\n this.targets = {\n compare: devDB,\n pending: devDB,\n shadow: testDB,\n apply: applyDBs,\n };\n } else if (this.options.mode === \"deploy\") {\n const productionDB = knex(dbConfig.production_master);\n const testDB = knex(dbConfig.test);\n\n this.targets = {\n pending: productionDB,\n shadow: testDB,\n apply: [productionDB],\n };\n } else {\n throw new Error(`잘못된 모드 ${this.options.mode} 입력`);\n }\n }\n\n private async getMigrationCodes(): Promise<{\n normal: MigrationCode[];\n onlyTs: MigrationCode[];\n onlyJs: MigrationCode[];\n }> {\n const srcMigrationsDir = `${Sonamu.apiRootPath}/src/migrations`;\n const distMigrationsDir = `${Sonamu.apiRootPath}/dist/migrations`;\n\n if (!(await exists(srcMigrationsDir))) {\n await mkdir(srcMigrationsDir, {\n recursive: true,\n });\n }\n if (!(await exists(distMigrationsDir))) {\n await mkdir(distMigrationsDir, {\n recursive: true,\n });\n }\n const srcMigrations = (await readdir(srcMigrationsDir))\n .filter((f) => f.endsWith(\".ts\"))\n .map((f) => f.split(\".\")[0]);\n const distMigrations = (await readdir(distMigrationsDir))\n .filter((f) => f.endsWith(\".js\"))\n .map((f) => f.split(\".\")[0]);\n\n const normal = _.intersection(srcMigrations, distMigrations)\n .map((filename) => {\n return {\n name: filename,\n path: path.join(srcMigrationsDir, filename) + \".ts\",\n };\n })\n .sort((a, b) => (a > b ? 1 : -1));\n\n const onlyTs = _.difference(srcMigrations, distMigrations).map(\n (filename) => {\n return {\n name: filename,\n path: path.join(srcMigrationsDir, filename) + \".ts\",\n };\n }\n );\n\n const onlyJs = _.difference(distMigrations, srcMigrations).map(\n (filename) => {\n return {\n name: filename,\n path: path.join(distMigrationsDir, filename) + \".js\",\n };\n }\n );\n\n return {\n normal,\n onlyTs,\n onlyJs,\n };\n }\n\n /**\n * 타겟별 마이그레이션 상태와 코드 생성/준비 상태를 구해옵니다.\n * 실제로 DB에 접근도 하고 마이그레이션 코드 파일도 확인하고,\n * 필요하다면 적용할 수 있는 코드를 생성까지 해옵니다.\n *\n * CLI와 Sonamu UI에서 사용됩니다.\n *\n * @returns\n */\n async getStatus(): Promise<MigrationStatus> {\n const { normal, onlyTs, onlyJs } = await this.getMigrationCodes();\n if (onlyTs.length > 0) {\n console.debug({ onlyTs });\n throw new ServiceUnavailableException(\n `There are un-compiled TS migration files.\\nPlease compile them first. You might want to run a development server with HMR.\\n\\n${onlyTs\n .map((f) => f.name)\n .join(\"\\n\")}`\n );\n }\n if (onlyJs.length > 0) {\n console.debug({ onlyJs });\n await Promise.all(\n onlyJs.map(async (f) => {\n execSync(\n `rm -f ${f.path.replace(\"/src/\", \"/dist/\").replace(\".ts\", \".js\")}`\n );\n })\n );\n }\n\n const connKeys = Object.keys(Sonamu.dbConfig).filter(\n (key) => key.endsWith(\"_slave\") === false\n ) as (keyof typeof Sonamu.dbConfig)[];\n\n const statuses = await Promise.all(\n connKeys.map(async (connKey) => {\n const knexOptions = Sonamu.dbConfig[connKey];\n const tConn = knex(knexOptions);\n\n const status = await (async () => {\n try {\n return await tConn.migrate.status();\n } catch (err) {\n console.warn(\n chalk.yellow(\n `${connKey}의 마이그레이션 상태를 가져오는 데에 실패하였습니다. 데이터베이스가 올바르게 구성되지 않은 것 같습니다. 확인하시고 다시 시도해주세요.\\n시도한 연결 설정:\\n${JSON.stringify(knexOptions.connection, null, 2)}\\n발생한 에러:\\n${err}\\n`\n )\n );\n return \"error\" /*클라이언트에서 에러 체크에 사용하는 리터럴입니다.*/;\n }\n })();\n const pending = await (async () => {\n try {\n const [, fdList] = await tConn.migrate.list();\n return fdList.map((fd: { file: string }) =>\n fd.file.replace(\".js\", \"\")\n );\n } catch (err) {\n return [];\n }\n })();\n const currentVersion = await (async () => {\n try {\n return await tConn.migrate.currentVersion();\n } catch (err) {\n return \"error\";\n }\n })();\n\n const connection =\n knexOptions.connection as Knex.MySql2ConnectionConfig;\n\n await tConn.destroy();\n\n return {\n name: connKey.replace(\"_master\", \"\"),\n connKey,\n connString: `mysql2://${connection.user ?? \"\"}@${connection.host}:${\n connection.port\n }/${connection.database}` as ConnString,\n currentVersion,\n status,\n pending,\n };\n })\n );\n\n const preparedCodes: GenMigrationCode[] = await (async () => {\n const status0conn = statuses.find((status) => status.status === 0);\n if (status0conn === undefined) {\n return [];\n }\n\n const compareDBconn = knex(Sonamu.dbConfig[status0conn.connKey]);\n const genCodes = await this.compareMigrations(compareDBconn);\n\n await compareDBconn.destroy();\n\n return genCodes;\n })();\n\n return {\n conns: statuses,\n codes: normal,\n preparedCodes,\n };\n /*\n TS/JS 코드 컴파일 상태 확인\n 1. 원본 파일 없는 JS파일이 존재하는 경우: 삭제\n 2. 컴파일 되지 않은 TS파일이 존재하는 경우: throw 쳐서 데브 서버 오픈 요청\n \n DB 마이그레이션 상태 확인\n 1. 전체 DB설정에 대해서 현재 마이그레이션 상태 확인\n - connKey: string\n - status: number\n - currentVersion: string\n - list: { file: string; directory: string }[]\n \n */\n }\n\n /**\n * 마이그레이션을 적용하거나 롤백합니다.\n * Sonamu UI에서 마이그레이션 작업을 수행할 때 사용됩니다.\n *\n * CLI와 Sonamu UI에서 사용됩니다.\n *\n * @param action 작업 유형 (apply/rollback)\n * @param targets 작업 대상 DB 설정 키 (keyof SonamuDBConfig)\n * @returns 작업 결과\n */\n async runAction(\n action: \"apply\" | \"rollback\",\n targets: (keyof SonamuDBConfig)[]\n ): Promise<\n {\n connKey: string;\n batchNo: number;\n applied: string[];\n }[]\n > {\n // get uniq knex configs\n const configs = _.uniqBy(\n targets\n .map((target) => ({\n connKey: target,\n options: Sonamu.dbConfig[target as keyof typeof Sonamu.dbConfig],\n }))\n .filter((c) => c.options !== undefined),\n ({ options }) =>\n `${(options.connection as Knex.MySql2ConnectionConfig).host}:${\n (options.connection as Knex.MySql2ConnectionConfig).port ?? 3306\n }/${(options.connection as Knex.MySql2ConnectionConfig).database}`\n );\n\n // get connections\n const conns = await Promise.all(\n configs.map(async (config) => ({\n connKey: config.connKey,\n knex: knex(config.options),\n }))\n );\n\n // action\n const result = await (async () => {\n switch (action) {\n case \"apply\":\n return Promise.all(\n conns.map(async ({ connKey, knex }) => {\n const [batchNo, applied] = await knex.migrate.latest();\n return {\n connKey,\n batchNo,\n applied,\n };\n })\n );\n case \"rollback\":\n return Promise.all(\n conns.map(async ({ connKey, knex }) => {\n const [batchNo, applied] = await knex.migrate.rollback();\n return {\n connKey,\n batchNo,\n applied,\n };\n })\n );\n }\n })();\n\n // destroy\n await Promise.all(\n conns.map(({ knex }) => {\n return knex.destroy();\n })\n );\n\n return result;\n }\n\n /**\n * 마이그레이션 코드 파일을 삭제합니다.\n *\n * Sonamu UI에서 사용됩니다.\n *\n * @param codeNames 삭제할 마이그레이션 코드 파일 이름 배열\n * @returns 삭제된 마이그레이션 코드 파일 개수\n */\n async delCodes(codeNames: string[]): Promise<number> {\n const { conns } = await this.getStatus();\n if (\n conns.some((conn) => {\n return codeNames.some(\n (codeName) => conn.pending.includes(codeName) === false\n );\n })\n ) {\n throw new Error(\n \"You cannot delete a migration file if there is already applied.\"\n );\n }\n\n const delFiles = codeNames\n .map((codeName) => [\n `${Sonamu.apiRootPath}/src/migrations/${codeName}.ts`,\n `${Sonamu.apiRootPath}/dist/migrations/${codeName}.js`,\n ])\n .flat();\n\n const res = await Promise.all(\n delFiles.map(async (delFile) => {\n if (await exists(delFile)) {\n console.log(chalk.red(`DELETE: ${delFile}`));\n await unlink(delFile);\n return delFiles.includes(\".ts\") ? 1 : 0;\n }\n return 0;\n })\n );\n return _.sum(res);\n }\n\n /**\n * 마이그레이션 코드 파일을 생성합니다.\n *\n * Sonamu UI에서 사용됩니다.\n *\n * @returns 생성된 마이그레이션 코드 파일 개수\n */\n async generatePreparedCodes(): Promise<number> {\n const { preparedCodes } = await this.getStatus();\n if (preparedCodes.length === 0) {\n console.log(chalk.green(\"\\n현재 모두 싱크된 상태입니다.\"));\n return 0;\n }\n\n // 실제 코드 생성\n const migrationsDir = `${Sonamu.apiRootPath}/src/migrations`;\n\n for (const [index, pcode] of preparedCodes.entries()) {\n if (pcode.formatted) {\n const dateTag = DateTime.local()\n .plus({ seconds: index })\n .toFormat(\"yyyyMMddHHmmss\");\n const filePath = `${migrationsDir}/${dateTag}_${pcode.title}.ts`;\n await writeFile(filePath, pcode.formatted!);\n console.log(chalk.green(`MIGRTAION CREATED ${filePath}`));\n }\n }\n\n return preparedCodes.length;\n }\n\n /**\n * pending 마이그레이션 목록을 삭제합니다.\n *\n * CLI에서 사용됩니다.\n */\n async clearPendingList(): Promise<void> {\n const [, pendingList] = (await this.targets.pending.migrate.list()) as [\n unknown,\n {\n file: string;\n directory: string;\n }[],\n ];\n const migrationsDir = `${Sonamu.apiRootPath}/src/migrations`;\n const delList = pendingList.map((df) => {\n return path.join(migrationsDir, df.file).replace(\".js\", \".ts\");\n });\n for (let p of delList) {\n if (await exists(p)) {\n await unlink(p);\n }\n }\n await this.cleanUpDist(true);\n }\n\n /**\n * 마이그레이션 코드 파일을 확인합니다.\n *\n * CLI에서 사용됩니다.\n */\n async check(): Promise<void> {\n const codes = await this.compareMigrations(this.targets.compare!);\n if (codes.length === 0) {\n console.log(chalk.green(\"\\n현재 모두 싱크된 상태입니다.\"));\n return;\n }\n\n // 현재 생성된 코드 표기\n console.table(codes, [\"type\", \"title\"]);\n console.log(codes[0]);\n }\n\n /**\n * 마이그레이션을 수행합니다.\n *\n * runAction이 인자로 들어온 타겟들에 대해 주어진 동작(apply/rollback)을 수행한다면,\n * 이 함수는 생성자로 들어온 connection(knex)들에 대해 마이그레이션을 수행합니다.\n *\n * CLI에서 사용됩니다.\n */\n async run(): Promise<void> {\n // pending 마이그레이션 확인\n const [, pendingList] = await this.targets.pending.migrate.list();\n if (pendingList.length > 0) {\n console.log(\n chalk.red(\"pending 된 마이그레이션이 존재합니다.\"),\n pendingList.map((pending: any) => pending.file)\n );\n\n // pending이 있는 경우 Shadow DB 테스트 진행 여부 컨펌\n const answer = await prompts({\n type: \"confirm\",\n name: \"value\",\n message: \"Shadow DB 테스트를 진행하시겠습니까?\",\n initial: true,\n });\n if (answer.value === false) {\n return;\n }\n\n console.time(chalk.blue(\"Migrator - runShadowTest\"));\n await this.runShadowTest();\n console.timeEnd(chalk.blue(\"Migrator - runShadowTest\"));\n await Promise.all(\n this.targets.apply.map(async (applyDb) => {\n const label = chalk.green(\n `APPLIED ${\n applyDb.client.connectionSettings.host\n } ${applyDb.client.database()}`\n );\n console.time(label);\n const [,] = await applyDb.migrate.latest();\n console.timeEnd(label);\n })\n );\n }\n\n // Entity-DB간 비교하여 코드 생성 리턴\n const codes = await this.compareMigrations(this.targets.compare!);\n if (codes.length === 0) {\n console.log(chalk.green(\"\\n현재 모두 싱크된 상태입니다.\"));\n return;\n }\n\n // 현재 생성된 코드 표기\n console.table(codes, [\"type\", \"title\"]);\n\n /* DEBUG: 디버깅용 코드\n codes.map((code) => console.log(code.formatted));\n process.exit();\n */\n\n // 실제 파일 생성 프롬프트\n const answer = await prompts({\n type: \"confirm\",\n name: \"value\",\n message: \"마이그레이션 코드를 생성하시겠습니까?\",\n initial: false,\n });\n if (answer.value === false) {\n return;\n }\n\n // 실제 코드 생성\n const migrationsDir = `${Sonamu.apiRootPath}/src/migrations`;\n\n for (const [index, code] of codes.entries()) {\n if (code.formatted) {\n const dateTag = DateTime.local()\n .plus({ seconds: index })\n .toFormat(\"yyyyMMddHHmmss\");\n const filePath = `${migrationsDir}/${dateTag}_${code.title}.ts`;\n await writeFile(filePath, code.formatted!);\n console.log(chalk.green(`MIGRTAION CREATED ${filePath}`));\n }\n }\n }\n\n /**\n * 타겟으로 지정된 DB를 롤백합니다.\n *\n * runAction이 인자로 들어온 타겟들에 대해 주어진 동작(apply/rollback)을 수행한다면,\n * 이 함수는 생성자로 들어온 connection(knex)들에 대해 롤백을 수행합니다.\n *\n * CLI에서 사용됩니다.\n */\n async rollback() {\n console.time(chalk.red(\"rollback:\"));\n const rollbackAllResult = await Promise.all(\n this.targets.apply.map(async (db) => {\n await db.migrate.forceFreeMigrationsLock();\n return db.migrate.rollback(undefined, false);\n })\n );\n console.dir({ rollbackAllResult }, { depth: null });\n console.timeEnd(chalk.red(\"rollback:\"));\n }\n\n /**\n * 빌드된 마이그레이션 파일을 삭제합니다.\n *\n * CLI에서 사용됩니다.\n *\n * @param force 강제 삭제 여부\n * @returns\n */\n async cleanUpDist(force: boolean = false): Promise<void> {\n async function getFilesUnder(dir: string): Promise<string[]> {\n const migrationPath = path.join(Sonamu.apiRootPath, dir, \"migrations\");\n if (!(await exists(migrationPath))) {\n await mkdir(migrationPath, {\n recursive: true,\n });\n }\n return (await readdir(migrationPath)).filter(\n (filename) => filename.startsWith(\".\") === false\n );\n }\n\n const files = {\n src: await getFilesUnder(\"src\"),\n dist: await getFilesUnder(\"dist\"),\n };\n\n const diffOnSrc = _.differenceBy(\n files.src,\n files.dist,\n (filename) => filename.split(\".\")[0]\n );\n if (diffOnSrc.length > 0) {\n throw new Error(\n \"컴파일 되지 않은 파일이 있습니다.\\n\" + diffOnSrc.join(\"\\n\")\n );\n }\n\n const diffOnDist = _.differenceBy(\n files.dist,\n files.src,\n (filename) => filename.split(\".\")[0]\n );\n if (diffOnDist.length > 0) {\n console.log(chalk.red(\"원본 ts파일을 찾을 수 없는 js파일이 있습니다.\"));\n console.log(diffOnDist);\n\n if (!force) {\n const answer = await prompts({\n type: \"confirm\",\n name: \"value\",\n message: \"삭제를 진행하시겠습니까?\",\n initial: true,\n });\n if (answer.value === false) {\n return;\n }\n }\n\n const filesToRm = diffOnDist.map((filename) => {\n return path.join(Sonamu.apiRootPath, \"dist\", \"migrations\", filename);\n });\n for (const filePath of filesToRm) {\n await unlink(filePath);\n }\n console.log(chalk.green(`${filesToRm.length}건 삭제되었습니다!`));\n }\n }\n\n /**\n * Shadow DB 테스트를 진행합니다.\n *\n * Sonamu UI에서 사용됩니다.\n *\n * @returns Shadow DB 테스트 결과\n */\n async runShadowTest(): Promise<\n {\n connKey: string;\n batchNo: number;\n applied: string[];\n }[]\n > {\n // ShadowDB 생성 후 테스트 진행\n const tdb = knex(Sonamu.dbConfig.test);\n const tdbConn = Sonamu.dbConfig.test\n .connection as Knex.MySql2ConnectionConfig;\n const shadowDatabase = tdbConn.database + \"__migration_shadow\";\n const tmpSqlPath = `/tmp/${shadowDatabase}.sql`;\n\n // 테스트DB 덤프 후 Database명 치환\n console.log(\n chalk.magenta(`${tdbConn.database}의 데이터 ${tmpSqlPath}로 덤프`)\n );\n execSync(\n `mysqldump -h${tdbConn.host} -P${tdbConn.port ?? 3306} -u${tdbConn.user} -p'${tdbConn.password}' ${tdbConn.database} --single-transaction --no-create-db --triggers > ${tmpSqlPath};`\n );\n execSync(\n `sed -i'' -e 's/\\`${tdbConn.database}\\`/\\`${shadowDatabase}\\`/g' ${tmpSqlPath};`\n );\n\n // 기존 ShadowDB 리셋\n console.log(chalk.magenta(`${shadowDatabase} 리셋`));\n await tdb.raw(`DROP DATABASE IF EXISTS \\`${shadowDatabase}\\`;`);\n await tdb.raw(`CREATE DATABASE \\`${shadowDatabase}\\`;`);\n\n // ShadowDB 테이블 + 데이터 생성\n console.log(chalk.magenta(`${shadowDatabase} 데이터베이스 생성`));\n execSync(\n `mysql -h${tdbConn.host} -P${tdbConn.port ?? 3306} -u${tdbConn.user} -p'${tdbConn.password}' ${shadowDatabase} < ${tmpSqlPath};`\n );\n\n // shadow db 테스트 진행\n const sdb = knex({\n ...Sonamu.dbConfig.test,\n connection: {\n ...tdbConn,\n database: shadowDatabase,\n password: tdbConn.password,\n },\n });\n\n // shadow db 테스트 진행\n try {\n const [batchNo, applied] = await sdb.migrate.latest();\n console.log(chalk.green(\"Shadow DB 테스트에 성공했습니다!\"), {\n batchNo,\n applied,\n });\n\n // 생성한 Shadow DB 삭제\n console.log(chalk.magenta(`${shadowDatabase} 삭제`));\n await tdb.raw(`DROP DATABASE IF EXISTS \\`${shadowDatabase}\\`;`);\n\n return [\n {\n connKey: \"shadow\",\n batchNo,\n applied,\n },\n ];\n } catch (e) {\n console.error(e);\n throw new ServiceUnavailableException(\"Shadow DB 테스트 진행 중 에러\");\n } finally {\n await tdb.destroy();\n }\n }\n\n /**\n * 모든 DB를 롤백하고 전체 마이그레이션 파일을 삭제합니다.\n *\n * CLI에서 사용됩니다.\n *\n * @returns\n */\n async resetAll() {\n const answer = await prompts({\n type: \"confirm\",\n name: \"value\",\n message: \"모든 DB를 롤백하고 전체 마이그레이션 파일을 삭제하시겠습니까?\",\n initial: false,\n });\n if (answer.value === false) {\n return;\n }\n\n console.time(chalk.red(\"rollback-all:\"));\n const rollbackAllResult = await Promise.all(\n this.targets.apply.map(async (db) => {\n await db.migrate.forceFreeMigrationsLock();\n return db.migrate.rollback(undefined, true);\n })\n );\n console.log({ rollbackAllResult });\n console.timeEnd(chalk.red(\"rollback-all:\"));\n\n const migrationsDir = `${Sonamu.apiRootPath}/src/migrations`;\n console.time(chalk.red(\"delete migration files\"));\n execSync(`rm -f ${migrationsDir}/*`);\n execSync(`rm -f ${migrationsDir.replace(\"/src/\", \"/dist/\")}/*`);\n console.timeEnd(chalk.red(\"delete migration files\"));\n }\n\n private async compareMigrations(\n compareDB: Knex\n ): Promise<GenMigrationCode[]> {\n // Entity 순회하여 싱크\n const entityIds = EntityManager.getAllIds();\n\n // 조인테이블 포함하여 Entity에서 MigrationSet 추출\n const entitySetsWithJoinTable = entityIds\n .filter((entityId) => EntityManager.get(entityId).props.length > 0)\n .map((entityId) =>\n getMigrationSetFromEntity(EntityManager.get(entityId))\n );\n\n // 조인테이블만 추출\n const joinTablesWithDup = entitySetsWithJoinTable\n .map((entitySet) => entitySet.joinTables)\n .flat();\n // 중복 제거 (중복인 경우 indexes를 병합)\n const joinTables = Object.values(\n _.groupBy(joinTablesWithDup, (jt) => jt.table)\n ).map((tables) => {\n if (tables.length === 1) {\n return tables[0];\n }\n return {\n ...tables[0],\n indexes: _.uniqBy(\n tables.flatMap((t) => t.indexes),\n (index) => [index.type, ...index.columns.sort()].join(\"-\")\n ),\n };\n });\n\n // 조인테이블 포함하여 MigrationSet 배열\n const entitySets: MigrationSet[] = [\n ...entitySetsWithJoinTable,\n ...joinTables,\n ];\n\n const codes: GenMigrationCode[] = (\n await Promise.all(\n entitySets.map(async (entitySet) => {\n const dbSet = await getMigrationSetFromDB(compareDB, entitySet.table);\n\n if (dbSet === null) {\n // 기존 테이블 없음, 새로 테이블 생성\n return await generateCreateCode(entitySet);\n } else {\n // 기존 테이블 존재하는 케이스\n return await generateAlterCode(entitySet, dbSet);\n }\n })\n )\n ).flat();\n\n // normal 타입이 앞으로, foreign이 뒤로\n codes.sort((codeA, codeB) => {\n if (codeA.type === \"foreign\" && codeB.type == \"normal\") {\n return 1;\n } else if (codeA.type === \"normal\" && codeB.type === \"foreign\") {\n return -1;\n } else {\n return 0;\n }\n });\n\n return codes;\n }\n\n /**\n * 마이그레이션 대상 커넥션을 종료합니다.\n *\n * CLI에서 사용됩니다.\n *\n * @returns {Promise<void>} 종료 결과\n */\n async destroy(): Promise<void> {\n await Promise.all(\n this.targets.apply.map((db) => {\n return db.destroy();\n })\n );\n }\n}\n"],"names":["Migrator","options","targets","dbConfig","Sonamu","mode","devDB","knex","development_master","testDB","test","fixtureLocalDB","fixture_local","applyDBs","connection","host","fixture_remote","database","fixtureRemoteDB","push","compare","pending","shadow","apply","productionDB","production_master","Error","getMigrationCodes","srcMigrationsDir","distMigrationsDir","srcMigrations","distMigrations","normal","onlyTs","onlyJs","apiRootPath","exists","mkdir","recursive","readdir","filter","f","endsWith","map","split","_","intersection","filename","name","path","join","sort","a","b","difference","getStatus","connKeys","statuses","preparedCodes","length","console","debug","ServiceUnavailableException","Promise","all","execSync","replace","Object","keys","key","connKey","knexOptions","tConn","status","currentVersion","err","migrate","warn","chalk","yellow","JSON","stringify","fdList","list","fd","file","destroy","connString","user","port","status0conn","compareDBconn","genCodes","find","undefined","compareMigrations","conns","codes","runAction","action","configs","result","uniqBy","target","c","config","batchNo","applied","latest","rollback","delCodes","codeNames","delFiles","res","some","conn","codeName","includes","flat","delFile","log","red","unlink","sum","generatePreparedCodes","migrationsDir","index","pcode","dateTag","filePath","green","entries","formatted","DateTime","local","plus","seconds","toFormat","title","writeFile","clearPendingList","pendingList","delList","p","df","cleanUpDist","check","table","run","answer","code","prompts","type","message","initial","value","time","blue","runShadowTest","timeEnd","applyDb","label","client","connectionSettings","rollbackAllResult","db","forceFreeMigrationsLock","dir","depth","force","files","diffOnSrc","diffOnDist","filesToRm","getFilesUnder","migrationPath","startsWith","src","dist","differenceBy","tdb","tdbConn","shadowDatabase","tmpSqlPath","sdb","e","magenta","password","raw","error","resetAll","compareDB","entityIds","entitySetsWithJoinTable","joinTablesWithDup","joinTables","entitySets","EntityManager","getAllIds","entityId","get","props","getMigrationSetFromEntity","entitySet","values","groupBy","jt","tables","indexes","flatMap","t","columns","dbSet","getMigrationSetFromDB","generateCreateCode","generateAlterCode","codeA","codeB"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/migration/types.ts"],"names":[],"mappings":""}
|
package/dist/stream/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/stream/index.ts"],"sourcesContent":["export * from \"./sse\";\n"],"names":[],"mappings":"2FAAc"}
|
package/dist/stream/sse.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/stream/sse.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { FastifyRequest, FastifyReply } from \"fastify\";\n\n// NOTE(Haze, 251106): context provider에서 인자를 채워주면 createSSE(events)만으로 사용 가능\nexport function createSSEFactory<T extends z.ZodObject>(\n socket: FastifyRequest[\"socket\"],\n reply: FastifyReply,\n _events: T\n) {\n return new SSEConnection<T>(socket, reply);\n}\n\nclass SSEConnection<T extends z.ZodObject> {\n private _closed = false;\n\n constructor(\n private readonly socket: FastifyRequest[\"socket\"],\n private readonly reply: FastifyReply\n ) {\n this.socket.on(\"close\", () => {\n this._closed = true;\n });\n }\n\n publish<K extends keyof z.infer<T>>(event: K, data: z.infer<T>[K]): void {\n if (this._closed) {\n return;\n }\n\n this.reply.sse({\n event: event as string,\n data: JSON.stringify(data),\n });\n }\n\n async end(): Promise<void> {\n if (this._closed) {\n return;\n }\n\n this.reply.sse({\n event: \"end\",\n data: \"END\",\n });\n \n await new Promise((resolve) => setTimeout(resolve, 200));\n this.reply.raw.end();\n }\n}\n"],"names":["createSSEFactory","socket","reply","_events","SSEConnection","_closed","on","publish","event","data","sse","JSON","stringify","end","Promise","resolve","setTimeout","raw"],"mappings":"oGAIgBA,0DAAAA,qmFAAT,SAASA,iBACdC,MAAgC,CAChCC,KAAmB,CACnBC,OAAU,EAEV,OAAO,IAAIC,cAAiBH,OAAQC,MACtC,CAEA,IAAA,AAAME,2BAAN,iCAAMA,cAIF,AAAiBH,MAAgC,CACjD,AAAiBC,KAAmB,wCALlCE,4FACJ,sBAAQC,UAAR,KAAA,QAGmBJ,OAAAA,YACAC,MAAAA,WAJXG,QAAU,MAMhB,IAAI,CAACJ,MAAM,CAACK,EAAE,CAAC,QAAS,WACtB,MAAKD,OAAO,CAAG,IACjB,iBATED,gBAYJG,IAAAA,gBAAAA,SAAAA,QAAoCC,KAAQ,CAAEC,IAAmB,EAC/D,GAAI,IAAI,CAACJ,OAAO,CAAE,CAChB,MACF,CAEA,IAAI,CAACH,KAAK,CAACQ,GAAG,CAAC,CACbF,MAAOA,MACPC,KAAME,KAAKC,SAAS,CAACH,KACvB,EACF,IAEMI,IAAAA,YAAN,SAAMA,mHACJ,GAAI,IAAI,CAACR,OAAO,CAAE,CAChB,SACF,CAEA,IAAI,CAACH,KAAK,CAACQ,GAAG,CAAC,CACbF,MAAO,MACPC,KAAM,KACR,GAEA,SAAM,IAAIK,QAAQ,SAACC,gBAAYC,WAAWD,QAAS,eAAnD,cACA,IAAI,CAACb,KAAK,CAACe,GAAG,CAACJ,GAAG,eACpB,yBAnCIT"}
|
package/dist/syncer/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/syncer/index.ts"],"sourcesContent":["export * from \"./syncer\";\n"],"names":[],"mappings":"2FAAc"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/syncer/syncer.ts"],"sourcesContent":["import path, { dirname } from \"path\";\nimport { globAsync, importMultiple } from \"../utils/utils\";\nimport { createReadStream } from \"fs\";\nimport { mkdir, readFile, rm, writeFile } from \"fs/promises\";\nimport { exists } from \"../utils/fs-utils\";\nimport crypto from \"crypto\";\nimport equal from \"fast-deep-equal\";\nimport _, { chunk } from \"lodash\";\nimport inflection from \"inflection\";\nimport { EntityManager, EntityNamesRecord } from \"../entity/entity-manager\";\nimport ts from \"typescript\";\nimport {\n ApiParam,\n ApiParamType,\n EntityProp,\n EntityPropNode,\n isBelongsToOneRelationProp,\n isBigIntegerProp,\n isBooleanProp,\n isDateProp,\n isDateTimeProp,\n isDecimalProp,\n isDoubleProp,\n isEnumProp,\n isFloatProp,\n isIntegerProp,\n isJsonProp,\n isOneToOneRelationProp,\n isRelationProp,\n isStringProp,\n isTextProp,\n isTimeProp,\n isTimestampProp,\n isUuidProp,\n isVirtualProp,\n} from \"../types/types\";\nimport {\n ApiDecoratorOptions,\n registeredApis,\n ExtendedApi,\n} from \"../api/decorators\";\nimport { z } from \"zod\";\nimport chalk from \"chalk\";\nimport {\n TemplateKey,\n PathAndCode,\n TemplateOptions,\n GenerateOptions,\n RenderingNode,\n} from \"../types/types\";\nimport {\n AlreadyProcessedException,\n BadRequestException,\n ServiceUnavailableException,\n} from \"../exceptions/so-exceptions\";\nimport { wrapIf } from \"../utils/lodash-able\";\nimport { getTextTypeLength } from \"../api/code-converters\";\nimport { Template } from \"../templates/base-template\";\nimport { Template__generated } from \"../templates/generated.template\";\nimport { Template__init_types } from \"../templates/init_types.template\";\nimport { Template__entity } from \"../templates/entity.template\";\nimport { Template__model } from \"../templates/model.template\";\nimport { Template__model_test } from \"../templates/model_test.template\";\nimport { Template__service } from \"../templates/service.template\";\nimport { Template__view_form } from \"../templates/view_form.template\";\nimport { Template__view_list } from \"../templates/view_list.template\";\nimport prettier from \"prettier\";\nimport { Template__view_id_all_select } from \"../templates/view_id_all_select.template\";\nimport { Template__view_id_async_select } from \"../templates/view_id_async_select.template\";\nimport { Template__view_enums_dropdown } from \"../templates/view_enums_dropdown.template\";\nimport { Template__view_enums_select } from \"../templates/view_enums_select.template\";\nimport { Template__view_enums_buttonset } from \"../templates/view_enums_buttonset.template\";\nimport { Template__view_search_input } from \"../templates/view_search_input.template\";\nimport { Template__view_list_columns } from \"../templates/view_list_columns.template\";\nimport { Template__generated_http } from \"../templates/generated_http.template\";\nimport { Sonamu } from \"../api/sonamu\";\nimport { Template__generated_sso } from \"../templates/generated_sso.template\";\nimport { setTimeout as setTimeoutPromises } from \"timers/promises\";\nimport assert from \"assert\";\nimport * as swc from \"@swc/core\";\nimport { minimatch } from \"minimatch\";\nimport {\n everyAsync,\n filterAsync,\n mapAsync,\n reduceAsync,\n} from \"../utils/async-utils\";\n\ntype FileType =\n | \"model\"\n | \"types\"\n | \"functions\"\n | \"generated\"\n | \"entity\"\n | \"frame\";\ntype GlobPattern = {\n [key in FileType]: string;\n};\ntype PathAndChecksum = {\n path: string;\n checksum: string;\n};\ntype DiffGroups = {\n [key in FileType]: string[];\n};\nexport type RenderedTemplate = {\n target: string;\n path: string;\n body: string;\n importKeys: string[];\n customHeaders?: string[];\n preTemplates?: {\n key: TemplateKey;\n options: TemplateOptions[TemplateKey];\n }[];\n};\n\nexport class Syncer {\n apis: {\n typeParameters: ApiParamType.TypeParam[];\n parameters: ApiParam[];\n returnType: ApiParamType;\n modelName: string;\n methodName: string;\n path: string;\n options: ApiDecoratorOptions;\n }[] = [];\n types: { [typeName: string]: z.ZodObject<any> } = {};\n models: { [modelName: string]: unknown } = {};\n isSyncing: boolean = false;\n\n public checksumPatternGroup: GlobPattern = {\n /* 원본 체크 */\n entity: Sonamu.apiRootPath + \"/src/application/**/*.entity.json\",\n types: Sonamu.apiRootPath + \"/src/application/**/*.types.ts\",\n generated: Sonamu.apiRootPath + \"/src/application/sonamu.generated.ts\",\n functions: Sonamu.apiRootPath + \"/src/application/**/*.functions.ts\",\n /* compiled-JS 체크 */\n model: Sonamu.apiRootPath + \"/dist/application/**/*.model.js\",\n frame: Sonamu.apiRootPath + \"/dist/application/**/*.frame.js\",\n };\n\n get checksumsPath(): string {\n return path.join(Sonamu.apiRootPath, \"/sonamu.lock\");\n }\n public constructor() {}\n\n async sync(): Promise<void> {\n const { targets } = Sonamu.config.sync;\n\n // 번들러 여부에 따라 현재 디렉토리가 바뀌므로\n const currentDirname = __dirname.endsWith(\"/syncer\")\n ? __dirname\n : path.join(__dirname, \"./syncer\");\n\n // 트리거와 무관하게 shared 분배\n await Promise.all(\n targets.map(async (target) => {\n const srcCodePath = path\n .join(currentDirname, `../shared/${target}.shared.ts.txt`)\n .replace(\"/dist/\", \"/src/\");\n if (!(await exists(srcCodePath))) {\n return;\n }\n\n const dstCodePath = path.join(\n Sonamu.appRootPath,\n target,\n \"src/services/sonamu.shared.ts\"\n );\n\n const srcChecksum = await this.getChecksumOfFile(srcCodePath);\n const dstChecksum = await (async () => {\n if (!(await exists(dstCodePath))) {\n return \"\";\n }\n return this.getChecksumOfFile(dstCodePath);\n })();\n\n if (srcChecksum === dstChecksum) {\n return;\n }\n await writeFile(dstCodePath, await readFile(srcCodePath));\n console.log(chalk.blue(\"shared.ts is synced\"));\n })\n );\n\n // 현재 checksums\n let currentChecksums = await this.getCurrentChecksums();\n // 이전 checksums\n const previousChecksums = await this.getPreviousChecksums();\n\n // 비교\n const isSame = equal(currentChecksums, previousChecksums);\n if (isSame) {\n const msg = \"All files are synced!\";\n const margin = (process.stdout.columns - msg.length) / 2;\n console.log(\n chalk.black.bgGreen(\" \".repeat(margin) + msg + \" \".repeat(margin))\n );\n return;\n }\n\n const abc = new AbortController();\n this.isSyncing = true;\n const onSIGUSR2 = async () => {\n if (this.isSyncing === false) {\n process.exit(0);\n }\n console.log(chalk.magentaBright(`wait for syncing done....`));\n\n // 싱크 완료 대기\n try {\n await setTimeoutPromises(20000, \"waiting-sync\", { signal: abc.signal });\n } catch {}\n console.log(chalk.magentaBright(`Syncing DONE!`));\n process.exit(0);\n };\n process.on(\"SIGUSR2\", onSIGUSR2);\n\n // 변경된 파일 찾기\n const diff = _.differenceWith(\n currentChecksums,\n previousChecksums,\n _.isEqual\n );\n const diffFiles = diff.map((r) => r.path);\n console.log(\"Changed Files: \", diffFiles);\n\n const { changedChecksums } = await this.doSyncActions(\n diffFiles,\n currentChecksums\n );\n // checksum 오버라이드 (액션 실행 과정 중간에 체크섬이 바뀐 경우)\n currentChecksums = changedChecksums ?? currentChecksums;\n\n // 저장\n await this.saveChecksums(currentChecksums);\n\n // 싱크 종료\n this.isSyncing = false;\n abc.abort();\n process.off(\"SIGUSR2\", onSIGUSR2);\n }\n\n async doSyncActions(\n diffFiles: string[],\n currentChecksums?: PathAndChecksum[]\n ): Promise<{\n diffTypes: string[];\n changedChecksums?: PathAndChecksum[];\n }> {\n // 다른 부분 찾아 액션\n const diffGroups = _.groupBy(diffFiles, (r) => {\n const matched = r.match(\n /\\.(model|types|functions|entity|generated|frame)\\.[tj]s/\n );\n return matched?.[1] ?? \"unknown\";\n }) as unknown as DiffGroups;\n\n // 변경된 파일들을 타입별로 분리하여 각 타입별 액션 처리\n const diffTypes = Object.keys(diffGroups);\n\n // 트리거: entity, types\n // 액션: 스키마 생성\n if (diffTypes.includes(\"entity\") || diffTypes.includes(\"types\")) {\n await EntityManager.reload();\n\n await this.actionGenerateSchemas();\n\n // types 생성(entity 새로 추가된 경우)\n // parentId가 없고, types가 없는 경우에만 생성\n const entityId = this.getEntityIdFromPath([\n ...(diffGroups[\"entity\"] ?? []),\n ])[0];\n if (entityId) {\n const entity = EntityManager.get(entityId);\n const typeFilePath = path.join(\n Sonamu.apiRootPath,\n `src/application/${entity.names.fs}/${entity.names.fs}.types.ts`\n );\n if (entity.parentId === undefined && !(await exists(typeFilePath))) {\n await this.generateTemplate(\"init_types\", { entityId });\n }\n }\n\n // generated 싱크까지 동시에 처리 후 체크섬 갱신\n diffGroups[\"generated\"] = _.uniq([\n ...(diffGroups[\"generated\"] ?? []),\n \"/src/application/sonamu.generated.ts\",\n ]);\n diffTypes.push(\"generated\");\n\n // fullSync인 경우만 실행\n if (currentChecksums) {\n currentChecksums = await this.getCurrentChecksums();\n }\n }\n\n // 트리거: types, enums, generated 변경시\n // 액션: 파일 싱크 types, enums, generated\n if (\n diffTypes.includes(\"types\") ||\n diffTypes.includes(\"functions\") ||\n diffTypes.includes(\"generated\")\n ) {\n const tsPaths = _.uniq(\n [\n ...(diffGroups[\"types\"] ?? []),\n ...(diffGroups[\"functions\"] ?? []),\n ...(diffGroups[\"generated\"] ?? []),\n ].map((p) => p.replace(\"/dist/\", \"/src/\").replace(\".js\", \".ts\"))\n );\n await this.actionSyncFilesToTargets(tsPaths);\n }\n\n // 트리거: model\n if (diffTypes.includes(\"model\") || diffTypes.includes(\"frame\")) {\n const mergedGroup = [\n ...(diffGroups[\"model\"] ?? []),\n ...(diffGroups[\"frame\"] ?? []),\n ];\n\n // registeredApis 초기화\n await this.autoloadModels();\n\n // Syncer.apis 초기화\n await this.autoloadApis();\n\n const params: { namesRecord: EntityNamesRecord; modelTsPath: string }[] =\n mergedGroup.map((modelPath) => {\n if (modelPath.endsWith(\".model.js\")) {\n const entityId = this.getEntityIdFromPath([modelPath])[0];\n assert(entityId);\n return {\n namesRecord: EntityManager.getNamesFromId(entityId),\n modelTsPath: path.join(\n Sonamu.apiRootPath,\n modelPath\n .replace(\"/dist/\", \"/src/\")\n .replace(\".model.js\", \".model.ts\")\n ),\n };\n }\n if (modelPath.endsWith(\"frame.js\")) {\n const [, frameName] = modelPath.match(/.+\\/(.+)\\.frame.js$/) ?? [];\n assert(frameName);\n return {\n namesRecord: EntityManager.getNamesFromId(frameName),\n modelTsPath: path.join(\n Sonamu.apiRootPath,\n modelPath\n .replace(\"/dist/\", \"/src/\")\n .replace(\".frame.js\", \".frame.ts\")\n ),\n };\n }\n throw new Error(\"not reachable\");\n });\n await this.actionGenerateServices(params);\n\n await this.actionGenerateHttps();\n }\n\n return {\n diffTypes,\n changedChecksums: currentChecksums,\n };\n }\n\n async syncFromWatcher(diffFiles: string[]): Promise<void> {\n const tsFiles = diffFiles.filter((file) => file.endsWith(\".ts\"));\n const jsonFiles = diffFiles.filter((file) => file.endsWith(\".json\"));\n\n // transpile (성능 이슈를 고려하여 5개 동시 실행)\n const chunks = chunk(tsFiles, 5);\n let transpiledFilePaths: string[] = [];\n for (const chunk of chunks) {\n const _transpiledFilePaths = await Promise.all(\n chunk.map(async (diffFile) => {\n const { code, map } = await swc.transformFile(diffFile, {\n module: {\n type: \"commonjs\",\n },\n jsc: {\n parser: {\n syntax: \"typescript\",\n decorators: true,\n },\n target: \"es5\",\n },\n sourceMaps: true,\n });\n\n const jsPath = diffFile\n .replace(\"/src/\", \"/dist/\")\n .replace(\".ts\", \".js\");\n await mkdir(path.dirname(jsPath), { recursive: true }); // 파일 새로 추가된 경우 디렉토리 생성\n await writeFile(jsPath, code);\n\n if (map) {\n const mapPath = jsPath + \".map\";\n await mkdir(path.dirname(mapPath), { recursive: true });\n await writeFile(mapPath, map);\n\n const sourceMapComment =\n \"\\n//# sourceMappingURL=\" + path.basename(mapPath);\n await writeFile(jsPath, sourceMapComment, {\n flag: \"a\" /*파일 끝에 붙이기만 해요*/,\n });\n }\n\n console.log(\n chalk.bold(\"Transpiled: \") +\n chalk.blue(`${jsPath.replace(Sonamu.apiRootPath, \"api\")}`)\n );\n return jsPath;\n })\n );\n transpiledFilePaths.push(..._transpiledFilePaths);\n }\n\n // module reload - doSyncActions 전에 캐시 삭제\n function clearModuleAndDependents(filePath: string) {\n const resolved = require.resolve(filePath);\n const toDelete = new Set([resolved]);\n\n // 이 파일을 children으로 가진 모듈 찾기\n Object.keys(require.cache).forEach((key) => {\n const mod = require.cache[key];\n if (mod?.children?.some((child) => child.id === resolved)) {\n toDelete.add(key);\n }\n });\n\n toDelete.forEach((key) => {\n if (key.includes(\"dist/index.js\")) {\n process.kill(process.pid, \"SIGUSR2\");\n }\n delete require.cache[key];\n // console.debug(\n // chalk.bold(\"ModuleCleared: \") +\n // chalk.blue(`${key.replace(Sonamu.apiRootPath, \"api\")}`)\n // );\n });\n }\n transpiledFilePaths.map((filePath) => {\n clearModuleAndDependents(filePath);\n });\n\n // doSyncActions\n const allFilePaths = [...tsFiles, ...transpiledFilePaths, ...jsonFiles];\n const targetFilePaths = allFilePaths\n .filter((filePath) => {\n return Object.values(this.checksumPatternGroup).some((pattern) =>\n minimatch(filePath, pattern)\n );\n })\n .map((filePath) => \"/\" + path.relative(Sonamu.apiRootPath, filePath));\n await this.doSyncActions(targetFilePaths);\n\n this.apis = [];\n this.types = {};\n this.models = {};\n await this.autoloadTypes();\n await this.autoloadModels();\n await this.autoloadApis();\n\n this.syncUI();\n }\n\n getEntityIdFromPath(filePaths: string[]): string[] {\n return _.uniq(\n filePaths.map((p) => {\n const matched = p.match(/application\\/(.+)\\//);\n assert(matched && matched[1]);\n return inflection.camelize(matched[1].replace(/\\-/g, \"_\"));\n })\n );\n }\n\n async actionGenerateSchemas(): Promise<string[]> {\n return (\n await Promise.all([\n this.generateTemplate(\"generated_sso\", {}, { overwrite: true }),\n this.generateTemplate(\"generated\", {}, { overwrite: true }),\n ])\n )\n .flat()\n .flat();\n }\n\n async actionGenerateServices(\n paramsArray: {\n namesRecord: EntityNamesRecord;\n modelTsPath: string;\n }[]\n ): Promise<string[]> {\n return (\n await Promise.all(\n paramsArray.map(async (params) =>\n this.generateTemplate(\"service\", params, {\n overwrite: true,\n })\n )\n )\n )\n .flat()\n .flat();\n }\n\n async actionGenerateHttps(): Promise<string[]> {\n const [res] = await this.generateTemplate(\n \"generated_http\",\n {},\n { overwrite: true }\n );\n assert(res);\n return res;\n }\n\n async copyFileWithReplaceCoreToShared(fromPath: string, toPath: string) {\n if (!(await exists(fromPath))) {\n return;\n }\n\n const oldFileContent = (await readFile(fromPath)).toString();\n\n const newFileContent = (() => {\n const nfc = oldFileContent.replace(\n /from \"sonamu\"/g,\n `from \"src/services/sonamu.shared\"`\n );\n\n if (toPath.includes(\"/web/\")) {\n return nfc.replace(/from \"lodash\";/g, `from \"lodash-es\";`);\n } else {\n return nfc;\n }\n })();\n return writeFile(toPath, newFileContent);\n }\n\n async actionSyncFilesToTargets(tsPaths: string[]): Promise<string[]> {\n const { targets } = Sonamu.config.sync;\n const { dir: apiDir } = Sonamu.config.api;\n\n return (\n await Promise.all(\n targets.map(async (target) =>\n Promise.all(\n tsPaths.map(async (src) => {\n const realSrc = Sonamu.apiRootPath + src;\n const dst = realSrc\n .replace(`/${apiDir}/`, `/${target}/`)\n .replace(\"/application/\", \"/services/\");\n const dir = dirname(dst);\n if (!(await exists(dir))) {\n await mkdir(dir, { recursive: true });\n }\n console.log(\n chalk.bold(\"Copied: \") +\n chalk.blue(\n `Copied: ${dst.replace(Sonamu.appRootPath + \"/\", \"\")}`\n )\n );\n await this.copyFileWithReplaceCoreToShared(realSrc, dst);\n return dst;\n })\n )\n )\n )\n ).flat();\n }\n\n async getCurrentChecksums(): Promise<PathAndChecksum[]> {\n const filePaths = (\n await Promise.all(\n Object.entries(this.checksumPatternGroup).map(\n async ([_fileType, pattern]) => {\n return globAsync(pattern);\n }\n )\n )\n )\n .flat()\n .sort();\n\n const fileChecksums: {\n path: string;\n checksum: string;\n }[] = await Promise.all(\n filePaths.map(async (filePath) => {\n return {\n path: filePath.substring(Sonamu.apiRootPath.length),\n checksum: await this.getChecksumOfFile(filePath),\n };\n })\n );\n return fileChecksums;\n }\n\n async getPreviousChecksums(): Promise<PathAndChecksum[]> {\n if (!(await exists(this.checksumsPath))) {\n return [];\n }\n\n const previousChecksums = JSON.parse(\n (await readFile(this.checksumsPath, \"utf-8\"))\n ) as PathAndChecksum[];\n return previousChecksums;\n }\n\n async saveChecksums(checksums: PathAndChecksum[]): Promise<void> {\n await writeFile(\n this.checksumsPath,\n JSON.stringify(checksums, null, 2),\n \"utf-8\"\n );\n console.log(\"checksum saved\", this.checksumsPath);\n }\n\n async getChecksumOfFile(filePath: string): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const hash = crypto.createHash(\"sha1\");\n const input = createReadStream(filePath);\n input.on(\"error\", reject);\n input.on(\"data\", function (chunk: any) {\n hash.update(chunk);\n });\n input.on(\"close\", function () {\n resolve(hash.digest(\"hex\"));\n });\n });\n }\n\n async readApisFromFile(filePath: string) {\n const sourceFile = ts.createSourceFile(\n filePath,\n (await readFile(filePath)).toString(),\n ts.ScriptTarget.Latest\n );\n\n const methods: Omit<ExtendedApi, \"path\" | \"options\">[] = [];\n let modelName: string = \"UnknownModel\";\n let methodName: string = \"unknownMethod\";\n const visitor = (node: ts.Node) => {\n if (ts.isClassDeclaration(node)) {\n if (node.name && ts.isIdentifier(node.name)) {\n modelName = node.name.escapedText.toString().replace(/Class$/, \"\");\n }\n }\n if (ts.isMethodDeclaration(node)) {\n if (ts.isIdentifier(node.name)) {\n methodName = node.name.escapedText.toString();\n }\n\n const typeParameters: ApiParamType.TypeParam[] = (\n node.typeParameters ?? []\n ).map((typeParam) => {\n const tp = typeParam as ts.TypeParameterDeclaration;\n\n return {\n t: \"type-param\",\n id: tp.name.escapedText.toString(),\n constraint: tp.constraint\n ? this.resolveTypeNode(tp.constraint)\n : undefined,\n };\n });\n const parameters: ApiParam[] = node.parameters.map(\n (paramDec, index) => {\n const defaultDef = this.printNode(paramDec.initializer, sourceFile);\n\n // 기본값이 있는 경우 paramDec.type가 undefined로 나옴\n\n return this.resolveParamDec(\n {\n name: paramDec.name,\n type: paramDec.type as ts.TypeNode,\n optional:\n paramDec.questionToken !== undefined ||\n paramDec.initializer !== undefined,\n defaultDef,\n },\n index\n );\n }\n );\n if (node.type === undefined) {\n throw new Error(\n `리턴 타입이 기재되지 않은 메소드 ${modelName}.${methodName}`\n );\n }\n const returnType = this.resolveTypeNode(node.type!);\n\n methods.push({\n modelName,\n methodName,\n typeParameters,\n parameters,\n returnType,\n });\n }\n ts.forEachChild(node, visitor);\n };\n visitor(sourceFile);\n\n if (methods.length === 0) {\n return [];\n }\n\n // 현재 파일의 등록된 API 필터\n const currentModelApis = registeredApis.filter((api) => {\n return methods.find(\n (method) =>\n method.modelName === api.modelName &&\n method.methodName === api.methodName\n );\n });\n if (currentModelApis.length === 0) {\n // const p = path.join(tmpdir(), \"sonamu-syncer-error.json\");\n // writeFileSync(p, JSON.stringify(registeredApis, null, 2));\n // execSync(`open ${p}`);\n throw new Error(`현재 파일에 사전 등록된 API가 없습니다. ${filePath}`);\n }\n\n // 등록된 API에 현재 메소드 타입 정보 확장\n const extendedApis = currentModelApis.map((api) => {\n const foundMethod = methods.find(\n (method) =>\n method.modelName === api.modelName &&\n method.methodName === api.methodName\n );\n return {\n ...api,\n typeParameters: foundMethod!.typeParameters,\n parameters: foundMethod!.parameters,\n returnType: foundMethod!.returnType,\n };\n });\n return extendedApis;\n }\n\n resolveTypeNode(typeNode: ts.TypeNode): ApiParamType {\n switch (typeNode?.kind) {\n case ts.SyntaxKind.AnyKeyword:\n return \"any\";\n case ts.SyntaxKind.UnknownKeyword:\n return \"unknown\";\n case ts.SyntaxKind.StringKeyword:\n return \"string\";\n case ts.SyntaxKind.NumberKeyword:\n return \"number\";\n case ts.SyntaxKind.BooleanKeyword:\n return \"boolean\";\n case ts.SyntaxKind.UndefinedKeyword:\n return \"undefined\";\n case ts.SyntaxKind.NullKeyword:\n return \"null\";\n case ts.SyntaxKind.VoidKeyword:\n return \"void\";\n case ts.SyntaxKind.LiteralType:\n const literal = (typeNode as ts.LiteralTypeNode).literal;\n if (ts.isStringLiteral(literal)) {\n return {\n t: \"string-literal\",\n value: literal.text,\n };\n } else if (ts.isNumericLiteral(literal)) {\n return {\n t: \"numeric-literal\",\n value: Number(literal.text),\n };\n } else {\n if (literal.kind === ts.SyntaxKind.NullKeyword) {\n return \"null\";\n } else if (literal.kind === ts.SyntaxKind.UndefinedKeyword) {\n return \"undefined\";\n } else if (literal.kind === ts.SyntaxKind.TrueKeyword) {\n return \"true\";\n } else if (literal.kind === ts.SyntaxKind.FalseKeyword) {\n return \"false\";\n }\n throw new Error(\"알 수 없는 리터럴\");\n }\n case ts.SyntaxKind.ArrayType:\n const arrNode = typeNode as ts.ArrayTypeNode;\n return {\n t: \"array\",\n elementsType: this.resolveTypeNode(arrNode.elementType),\n };\n case ts.SyntaxKind.TypeLiteral:\n const literalNode = typeNode as ts.TypeLiteralNode;\n return {\n t: \"object\",\n props: literalNode.members.map((member) => {\n if (ts.isIndexSignatureDeclaration(member)) {\n assert(member.parameters[0]);\n const res = this.resolveParamDec({\n name: member.parameters[0].name as ts.Identifier,\n type: member.parameters[0].type as ts.TypeNode,\n });\n\n return this.resolveParamDec({\n name: {\n escapedText: `[${res.name}${res.optional ? \"?\" : \"\"}: ${\n res.type\n }]`,\n } as ts.Identifier,\n type: member.type as ts.TypeNode,\n });\n } else {\n return this.resolveParamDec({\n name: (member as ts.PropertySignature).name as ts.Identifier,\n type: (member as ts.PropertySignature).type as ts.TypeNode,\n optional:\n (member as ts.PropertySignature).questionToken !== undefined,\n });\n }\n }),\n };\n case ts.SyntaxKind.TypeReference:\n return {\n t: \"ref\",\n id: (\n (typeNode as ts.TypeReferenceNode).typeName as ts.Identifier\n ).escapedText.toString(),\n args: (typeNode as ts.TypeReferenceNode).typeArguments?.map(\n (typeArg) => this.resolveTypeNode(typeArg)\n ),\n };\n case ts.SyntaxKind.UnionType:\n return {\n t: \"union\",\n types: (typeNode as ts.UnionTypeNode).types.map((type) =>\n this.resolveTypeNode(type)\n ),\n };\n case ts.SyntaxKind.IntersectionType:\n return {\n t: \"intersection\",\n types: (typeNode as ts.IntersectionTypeNode).types.map((type) =>\n this.resolveTypeNode(type)\n ),\n };\n case ts.SyntaxKind.IndexedAccessType:\n return {\n t: \"indexed-access\",\n object: this.resolveTypeNode(\n (typeNode as ts.IndexedAccessTypeNode).objectType\n ),\n index: this.resolveTypeNode(\n (typeNode as ts.IndexedAccessTypeNode).indexType\n ),\n };\n case ts.SyntaxKind.TupleType:\n if (ts.isTupleTypeNode(typeNode)) {\n return {\n t: \"tuple-type\",\n elements: typeNode.elements.map((elem) =>\n this.resolveTypeNode(elem)\n ),\n };\n }\n break;\n case undefined:\n throw new Error(`typeNode undefined`);\n }\n\n console.debug(typeNode);\n throw new Error(`알 수 없는 SyntaxKind ${typeNode.kind}`);\n }\n\n resolveParamDec = (\n paramDec: {\n name: ts.BindingName;\n type: ts.TypeNode;\n optional?: boolean;\n defaultDef?: string;\n },\n index: number = 0\n ): ApiParam => {\n const name = paramDec.name as ts.Identifier;\n const type = this.resolveTypeNode(paramDec.type);\n\n if (name === undefined) {\n console.debug({ name, type, paramDec });\n }\n\n const result: ApiParam = {\n name: name.escapedText ? name.escapedText.toString() : `nonameAt${index}`,\n type,\n optional: paramDec.optional === true,\n defaultDef: paramDec?.defaultDef,\n };\n\n // 구조분해할당의 경우 타입이름 사용\n if (\n ts.isObjectBindingPattern(name) &&\n ts.isTypeReferenceNode(paramDec.type) &&\n ts.isIdentifier(paramDec.type.typeName)\n ) {\n result.name = inflection.camelize(paramDec.type.typeName.text, true);\n }\n\n return result;\n };\n\n printNode(\n node: ts.Node | undefined,\n sourceFile: ts.SourceFile\n ): string | undefined {\n if (node === undefined) {\n return undefined;\n }\n\n const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });\n return printer.printNode(ts.EmitHint.Unspecified, node, sourceFile);\n }\n\n async autoloadApis() {\n const pathPattern = path.join(\n Sonamu.apiRootPath,\n \"/src/application/**/*.{model,frame}.ts\"\n );\n // console.debug(chalk.yellow(`autoload:APIs @ ${pathPattern}`));\n\n const filePaths = await globAsync(pathPattern);\n const result = await Promise.all(\n filePaths.map((filePath) => this.readApisFromFile(filePath))\n );\n this.apis = result.flat();\n return this.apis;\n }\n\n async autoloadModels(): Promise<{ [modelName: string]: unknown }> {\n const pathPattern = path.join(\n Sonamu.apiRootPath,\n \"dist/application/**/*.{model,frame}.js\"\n );\n // console.debug(chalk.yellow(`autoload:models @ ${pathPattern}`));\n\n const filePaths = await filterAsync(\n await globAsync(pathPattern),\n async (path) => {\n // src 디렉터리 내에 있는 해당 파일이 존재할 경우에만 로드\n // 삭제된 파일이지만 dist에 남아있는 경우 BaseSchema undefined 에러 방지\n const srcPath = path.replace(\"/dist/\", \"/src/\").replace(\".js\", \".ts\");\n return await exists(srcPath);\n }\n );\n const modules = await importMultiple(filePaths);\n const functions = modules\n .map(({ imported }) => Object.entries(imported))\n .flat();\n this.models = Object.fromEntries(\n functions.filter(\n ([name]) => name.endsWith(\"Model\") || name.endsWith(\"Frame\")\n )\n );\n return this.models;\n }\n\n async autoloadTypes(\n doRefresh: boolean = false\n ): Promise<{ [typeName: string]: z.ZodObject<any> }> {\n if (!doRefresh && Object.keys(this.types).length > 0) {\n return this.types;\n }\n\n const pathPatterns = [\n path.join(Sonamu.apiRootPath, \"/dist/application/**/*.types.js\"),\n path.join(Sonamu.apiRootPath, \"/dist/application/**/*.generated.js\"),\n ];\n // console.debug(chalk.magenta(`autoload:types @ ${pathPatterns.join(\"\\n\")}`));\n\n const filePaths = await filterAsync(\n (await mapAsync(pathPatterns, globAsync)).flat(),\n async (path) => {\n // src 디렉터리 내에 있는 해당 파일이 존재할 경우에만 로드\n // 삭제된 파일이지만 dist에 남아있는 경우 BaseSchema undefined 에러 방지\n const srcPath = path.replace(\"/dist/\", \"/src/\").replace(\".js\", \".ts\");\n return await exists(srcPath);\n }\n );\n const modules = await importMultiple(filePaths, doRefresh);\n const functions = modules\n .map(({ imported }) => Object.entries(imported))\n .flat();\n this.types = Object.fromEntries(\n functions.filter(([, f]) => f instanceof z.ZodType)\n ) as typeof this.types;\n return this.types;\n }\n\n getTemplate(key: TemplateKey): Template {\n if (key === \"entity\") {\n return new Template__entity();\n } else if (key === \"init_types\") {\n return new Template__init_types();\n } else if (key === \"generated\") {\n return new Template__generated();\n } else if (key === \"generated_sso\") {\n return new Template__generated_sso();\n } else if (key === \"generated_http\") {\n return new Template__generated_http();\n } else if (key === \"model\") {\n return new Template__model();\n } else if (key === \"model_test\") {\n return new Template__model_test();\n } else if (key === \"service\") {\n return new Template__service();\n } else if (key === \"view_list\") {\n return new Template__view_list();\n } else if (key === \"view_list_columns\") {\n return new Template__view_list_columns();\n } else if (key === \"view_search_input\") {\n return new Template__view_search_input();\n } else if (key === \"view_form\") {\n return new Template__view_form();\n } else if (key === \"view_id_all_select\") {\n return new Template__view_id_all_select();\n } else if (key === \"view_id_async_select\") {\n return new Template__view_id_async_select();\n } else if (key === \"view_enums_select\") {\n return new Template__view_enums_select();\n } else if (key === \"view_enums_dropdown\") {\n return new Template__view_enums_dropdown();\n } else if (key === \"view_enums_buttonset\") {\n return new Template__view_enums_buttonset();\n } else {\n throw new BadRequestException(`잘못된 템플릿 키 ${key}`);\n }\n }\n\n async renderTemplate<T extends keyof TemplateOptions>(\n key: T,\n options: TemplateOptions[T]\n ): Promise<PathAndCode[]> {\n const template: Template = this.getTemplate(key);\n\n let extra: unknown[] = [];\n if (key === \"service\") {\n // service 필요 정보 (API 리스트)\n const { modelTsPath } = options as TemplateOptions[\"service\"];\n extra = [await this.readApisFromFile(modelTsPath)];\n } else if ([\"model\", \"view_list\", \"view_form\"].includes(key)) {\n const entityId = (options as TemplateOptions[\"model\"]).entityId;\n if (key === \"view_list\" || key === \"model\") {\n // view_list 필요 정보 (컬럼 노드, 리스트파라미터 노드)\n const columnsNode = await this.getColumnsNode(entityId, \"A\");\n const listParamsZodType = await this.getZodTypeById(\n `${entityId}ListParams`\n );\n const listParamsNode = this.zodTypeToRenderingNode(listParamsZodType);\n extra = [columnsNode, listParamsNode];\n } else if (key === \"view_form\") {\n // view_form 필요 정보 (세이브파라미터 노드)\n const saveParamsZodType = await this.getZodTypeById(\n `${entityId}SaveParams`\n );\n const saveParamsNode = this.zodTypeToRenderingNode(saveParamsZodType);\n extra = [saveParamsNode];\n }\n }\n\n const rendered = await template.render(options, ...extra);\n const resolved = await this.resolveRenderedTemplate(key, rendered);\n\n let preTemplateResolved: PathAndCode[] = [];\n if (rendered.preTemplates) {\n preTemplateResolved = (\n await Promise.all(\n rendered.preTemplates.map(({ key, options }) => {\n return this.renderTemplate(key, options);\n })\n )\n ).flat();\n }\n\n return [resolved, ...preTemplateResolved];\n }\n\n async resolveRenderedTemplate(\n key: TemplateKey,\n result: RenderedTemplate\n ): Promise<PathAndCode> {\n const { target, path: filePath, body, importKeys, customHeaders } = result;\n\n // import 할 대상의 대상 path 추출\n const importDefs = importKeys\n .reduce(\n (r, importKey) => {\n const modulePath = EntityManager.getModulePath(importKey);\n let importPath = modulePath;\n if (modulePath.includes(\"/\") || modulePath.includes(\".\")) {\n importPath = wrapIf(\n path.relative(path.dirname(filePath), modulePath),\n (p) => [p.startsWith(\".\") === false, \"./\" + p]\n );\n }\n\n // 같은 파일에서 import 하는 경우 keys 로 나열 처리\n const existsOne = r.find(\n (importDef) => importDef.from === importPath\n );\n if (existsOne) {\n existsOne.keys = _.uniq(existsOne.keys.concat(importKey));\n } else {\n r.push({\n keys: [importKey],\n from: importPath,\n });\n }\n return r;\n },\n [] as {\n keys: string[];\n from: string;\n }[]\n )\n // 셀프 참조 방지\n .filter(\n (importDef) =>\n filePath.endsWith(importDef.from.replace(\"./\", \"\") + \".ts\") === false\n );\n\n // 커스텀 헤더 포함하여 헤더 생성\n const header = [\n ...(customHeaders ?? []),\n ...importDefs.map(\n (importDef) =>\n `import { ${importDef.keys.join(\", \")} } from '${importDef.from}'`\n ),\n ].join(\"\\n\");\n\n const formatted = await (async () => {\n if (key === \"generated_http\") {\n return [header, body].join(\"\\n\\n\");\n } else {\n return prettier.format([header, body].join(\"\\n\\n\"), {\n parser: key === \"entity\" ? \"json\" : \"typescript\",\n });\n }\n })();\n\n return {\n path: target + \"/\" + filePath,\n code: formatted,\n };\n }\n\n async writeCodeToPath(pathAndCode: PathAndCode): Promise<string[]> {\n const { targets } = Sonamu.config.sync;\n const { appRootPath } = Sonamu;\n const filePath = `${Sonamu.appRootPath}/${pathAndCode.path}`;\n\n const dstFilePaths = _.uniq(\n targets.map((target) => filePath.replace(\"/:target/\", `/${target}/`))\n );\n return await Promise.all(\n dstFilePaths.map(async (dstFilePath) => {\n const dir = path.dirname(dstFilePath);\n if (!(await exists(dir))) {\n await mkdir(dir, { recursive: true });\n }\n await writeFile(dstFilePath, pathAndCode.code);\n console.log(\n chalk.bold(\"Generated: \") +\n chalk.blue(`${dstFilePath.replace(appRootPath + \"/\", \"\")}`)\n );\n return dstFilePath;\n })\n );\n }\n\n async generateTemplate(\n key: TemplateKey,\n templateOptions: any,\n _generateOptions?: GenerateOptions\n ) {\n const generateOptions = {\n overwrite: false,\n ..._generateOptions,\n };\n\n // 키 children\n const keys: TemplateKey[] = [key];\n\n // 템플릿 렌더\n const pathAndCodes = (\n await Promise.all(\n keys.map(async (key) => {\n return await this.renderTemplate(key, templateOptions);\n })\n )\n ).flat();\n\n const filteredPathAndCodes: PathAndCode[] = await (async () => {\n if (generateOptions.overwrite === true) {\n return pathAndCodes;\n } else {\n return await filterAsync(pathAndCodes, async (pathAndCode) => {\n const { targets } = Sonamu.config.sync;\n const filePath = `${Sonamu.appRootPath}/${pathAndCode.path}`;\n const dstFilePaths = targets.map((target) =>\n filePath.replace(\"/:target/\", `/${target}/`)\n );\n return await everyAsync(\n dstFilePaths,\n async (dstPath) => !(await exists(dstPath))\n );\n });\n }\n })();\n if (filteredPathAndCodes.length === 0) {\n throw new AlreadyProcessedException(\n \"이미 경로에 모든 파일이 존재합니다.\"\n );\n }\n\n return Promise.all(\n filteredPathAndCodes.map((pathAndCode) =>\n this.writeCodeToPath(pathAndCode)\n )\n );\n }\n\n async checkExistsGenCode(\n entityId: string,\n templateKey: TemplateKey,\n enumId?: string\n ): Promise<{ subPath: string; fullPath: string; isExists: boolean }> {\n const { target, path: genPath } = this.getTemplate(\n templateKey\n ).getTargetAndPath(EntityManager.getNamesFromId(entityId), enumId);\n\n const fullPath = path.join(Sonamu.appRootPath, target, genPath);\n const subPath = path.join(target, genPath);\n return {\n subPath,\n fullPath,\n isExists: await exists(fullPath),\n };\n }\n\n async checkExists(\n entityId: string,\n enums: {\n [name: string]: z.ZodEnum<any>;\n }\n ): Promise<Record<`${TemplateKey}${string}`, boolean>> {\n const keys: TemplateKey[] = TemplateKey.options;\n const names = EntityManager.getNamesFromId(entityId);\n const enumsKeys = Object.keys(enums).filter(\n (name) => name !== names.constant\n );\n\n return await reduceAsync(\n keys,\n async (result, key) => {\n const tpl = this.getTemplate(key);\n if (key.startsWith(\"view_enums\")) {\n await mapAsync(enumsKeys, async (componentId) => {\n const { target, path: p } = tpl.getTargetAndPath(\n names,\n componentId\n );\n result[`${key}__${componentId}`] = await exists(\n path.join(Sonamu.appRootPath, target, p)\n );\n });\n return result;\n }\n\n const { target, path: p } = tpl.getTargetAndPath(names);\n const { targets } = Sonamu.config.sync;\n if (target.includes(\":target\")) {\n await mapAsync(targets, async (t) => {\n result[`${key}__${t}`] = await exists(\n path.join(Sonamu.appRootPath, target.replace(\":target\", t), p)\n );\n });\n } else {\n result[key] = await exists(path.join(Sonamu.appRootPath, target, p));\n }\n\n return result;\n },\n {} as Record<`${TemplateKey}${string}`, boolean>\n );\n }\n\n async getZodTypeById(zodTypeId: string): Promise<z.ZodTypeAny> {\n const modulePath = EntityManager.getModulePath(zodTypeId);\n const moduleAbsPath = path.join(\n Sonamu.apiRootPath,\n \"dist\",\n \"application\",\n modulePath + \".js\"\n );\n const importPath = \"./\" + path.relative(__dirname, moduleAbsPath);\n const imported = await import(importPath);\n\n if (!imported[zodTypeId]) {\n throw new Error(`존재하지 않는 zodTypeId ${zodTypeId}`);\n }\n return imported[zodTypeId].describe(zodTypeId);\n }\n\n async propNodeToZodType(propNode: EntityPropNode): Promise<z.ZodTypeAny> {\n if (propNode.nodeType === \"plain\") {\n return this.propToZodType(propNode.prop);\n } else if (propNode.nodeType === \"array\") {\n if (propNode.prop === undefined) {\n throw new Error();\n } else if (propNode.children.length > 0) {\n return (\n await this.propNodeToZodType({\n ...propNode,\n nodeType: \"object\",\n })\n ).array();\n } else {\n const innerType = await this.propToZodType(propNode.prop);\n if (propNode.prop.nullable === true) {\n return z.array(innerType).nullable();\n } else {\n return z.array(innerType);\n }\n }\n } else if (propNode.nodeType === \"object\") {\n const obj = await propNode.children.reduce(\n async (promise, childPropNode) => {\n const result = await promise;\n result[childPropNode.prop!.name] =\n await this.propNodeToZodType(childPropNode);\n return result;\n },\n {} as any\n );\n\n if (propNode.prop?.nullable === true) {\n return z.object(obj).nullable();\n } else {\n return z.object(obj);\n }\n } else {\n throw Error;\n }\n }\n async propToZodType(prop: EntityProp): Promise<z.ZodTypeAny> {\n let zodType: z.ZodTypeAny = z.unknown();\n if (isIntegerProp(prop)) {\n zodType = z.number().int();\n } else if (isBigIntegerProp(prop)) {\n zodType = z.bigint();\n } else if (isTextProp(prop)) {\n zodType = z.string().max(getTextTypeLength(prop.textType));\n } else if (isEnumProp(prop)) {\n zodType = await this.getZodTypeById(prop.id);\n } else if (isStringProp(prop)) {\n zodType = z.string().max(prop.length);\n } else if (isFloatProp(prop) || isDoubleProp(prop)) {\n zodType = z.number();\n } else if (isDecimalProp(prop)) {\n zodType = z.string();\n } else if (isBooleanProp(prop)) {\n zodType = z.boolean();\n } else if (isDateProp(prop)) {\n zodType = z.string().length(10);\n } else if (isTimeProp(prop)) {\n zodType = z.string().length(8);\n } else if (isDateTimeProp(prop)) {\n zodType = z.date();\n } else if (isTimestampProp(prop)) {\n zodType = z.date();\n } else if (isJsonProp(prop)) {\n zodType = await this.getZodTypeById(prop.id);\n } else if (isUuidProp(prop)) {\n zodType = z.uuid();\n } else if (isVirtualProp(prop)) {\n zodType = await this.getZodTypeById(prop.id);\n } else if (isRelationProp(prop)) {\n if (\n isBelongsToOneRelationProp(prop) ||\n (isOneToOneRelationProp(prop) && prop.hasJoinColumn)\n ) {\n zodType = z.number().int();\n }\n } else {\n throw new Error(`prop을 zodType으로 변환하는데 실패 ${prop}}`);\n }\n\n if ((prop as { unsigned?: boolean }).unsigned) {\n zodType = (zodType as z.ZodNumber).nonnegative();\n }\n if (prop.nullable) {\n zodType = zodType.nullable();\n }\n\n return zodType;\n }\n\n resolveRenderType(\n key: string,\n zodType: z.ZodTypeAny\n ): RenderingNode[\"renderType\"] {\n if (zodType instanceof z.ZodDate) {\n return \"datetime\";\n } else if (zodType instanceof z.ZodString) {\n if (key.includes(\"img\") || key.includes(\"image\")) {\n return \"string-image\";\n } else if (zodType.description === \"SQLDateTimeString\") {\n return \"string-datetime\";\n } else if (key.endsWith(\"date\")) {\n return \"string-date\";\n } else {\n return \"string-plain\";\n }\n } else if (zodType instanceof z.ZodNumber) {\n if (key === \"id\") {\n return \"number-id\";\n } else if (key.endsWith(\"_id\")) {\n return \"number-fk_id\";\n } else {\n return \"number-plain\";\n }\n } else if (zodType instanceof z.ZodBoolean) {\n return \"boolean\";\n } else if (zodType instanceof z.ZodEnum) {\n return \"enums\";\n } else if (zodType instanceof z.ZodRecord) {\n return \"record\";\n } else if (zodType instanceof z.ZodAny || zodType instanceof z.ZodUnknown) {\n return \"string-plain\";\n } else if (zodType instanceof z.ZodUnion) {\n return \"string-plain\";\n } else if (zodType instanceof z.ZodLiteral) {\n return \"string-plain\";\n } else {\n throw new Error(`타입 파싱 불가 ${key} ${zodType.def.type}`);\n }\n }\n\n zodTypeToRenderingNode(\n zodType: z.ZodType<any>,\n baseKey: string = \"root\"\n ): RenderingNode {\n const def = {\n name: baseKey,\n label: inflection.camelize(baseKey, false),\n zodType,\n };\n if (zodType instanceof z.ZodObject) {\n const columnKeys = Object.keys(zodType.shape);\n const children = columnKeys.map((key) => {\n const innerType = zodType.shape[key];\n return this.zodTypeToRenderingNode(innerType, key);\n });\n return {\n ...def,\n renderType: \"object\",\n children,\n };\n } else if (zodType instanceof z.ZodArray) {\n const innerType = (zodType as z.ZodArray<z.ZodType<any>>).def.element;\n if (innerType instanceof z.ZodString && baseKey.includes(\"images\")) {\n return {\n ...def,\n renderType: \"array-images\",\n };\n }\n return {\n ...def,\n renderType: \"array\",\n element: this.zodTypeToRenderingNode(innerType, baseKey),\n };\n } else if (zodType instanceof z.ZodUnion) {\n const optionNodes = (zodType as z.ZodUnion<z.ZodType[]>).def.options.map((opt) =>\n this.zodTypeToRenderingNode(opt, baseKey)\n );\n // TODO: ZodUnion이 들어있는 경우 핸들링\n return optionNodes[0];\n } else if (zodType instanceof z.ZodOptional) {\n return {\n ...this.zodTypeToRenderingNode((zodType as z.ZodOptional<z.ZodType>).def.innerType, baseKey),\n optional: true,\n };\n } else if (zodType instanceof z.ZodNullable) {\n return {\n ...this.zodTypeToRenderingNode((zodType as z.ZodNullable<z.ZodType>).def.innerType, baseKey),\n nullable: true,\n };\n } else {\n return {\n ...def,\n renderType: this.resolveRenderType(baseKey, zodType),\n };\n }\n }\n\n async getColumnsNode(\n entityId: string,\n subsetKey: string\n ): Promise<RenderingNode> {\n const entity = EntityManager.get(entityId);\n const subsetA = entity.subsets[subsetKey];\n if (subsetA === undefined) {\n throw new ServiceUnavailableException(\"SubsetA 가 없습니다.\");\n }\n const propNodes = entity.fieldExprsToPropNodes(subsetA);\n const rootPropNode: EntityPropNode = {\n nodeType: \"object\",\n children: propNodes,\n };\n\n const columnsZodType = (await this.propNodeToZodType(\n rootPropNode\n )) as z.ZodObject<any>;\n\n const columnsNode = this.zodTypeToRenderingNode(columnsZodType);\n columnsNode.children = columnsNode.children!.map((child) => {\n if (child.renderType === \"object\") {\n const pickedCol = child.children!.find((cc) =>\n [\"title\", \"name\"].includes(cc.name)\n );\n if (pickedCol) {\n return {\n ...child,\n renderType: \"object-pick\",\n config: {\n picked: pickedCol.name,\n },\n };\n } else {\n return child;\n }\n } else if (\n child.renderType === \"array\" &&\n child.element &&\n child.element.renderType === \"object\"\n ) {\n const pickedCol = child.element!.children!.find((cc) =>\n [\"title\", \"name\"].includes(cc.name)\n );\n if (pickedCol) {\n return {\n ...child,\n element: {\n ...child.element,\n renderType: \"object-pick\",\n config: {\n picked: pickedCol.name,\n },\n },\n };\n } else {\n return child;\n }\n }\n return child;\n });\n\n return columnsNode;\n }\n\n async createEntity(\n form: Omit<TemplateOptions[\"entity\"], \"title\"> & { title?: string }\n ) {\n if (!/^[A-Z][a-zA-Z0-9]*$/.test(form.entityId)) {\n throw new BadRequestException(\"entityId는 CamelCase 형식이어야 합니다.\");\n }\n\n await this.generateTemplate(\"entity\", form);\n\n // reload entities\n await EntityManager.reload();\n\n // syncFromWatcher에서 처리하므로 주석처리\n // this.actionGenerateSchemas();\n\n // // generate schemas, types\n // await Promise.all([\n // ...(form.parentId === undefined\n // ? [\n // this.generateTemplate(\"init_types\", {\n // entityId: form.entityId,\n // }),\n // ]\n // : []),\n // ]);\n }\n\n async delEntity(entityId: string): Promise<{ delPaths: string[] }> {\n const entity = EntityManager.get(entityId);\n\n const delPaths = (() => {\n if (entity.parentId) {\n return [\n `${Sonamu.apiRootPath}/src/application/${entity.names.parentFs}/${entity.names.fs}.entity.json`,\n ];\n } else {\n return [\n `${Sonamu.apiRootPath}/src/application/${entity.names.fs}`,\n `${Sonamu.apiRootPath}/dist/application/${entity.names.fs}`,\n ...Sonamu.config.sync.targets\n .map((target) => [\n `${Sonamu.appRootPath}/${target}/src/services/${entity.names.fs}`,\n ])\n .flat(),\n ];\n }\n })(); // iife\n\n for await (const delPath of delPaths) {\n if (await exists(delPath)) {\n console.log(chalk.red(`DELETE ${delPath}`));\n await rm(delPath, { recursive: true, force: true });\n } else {\n console.log(chalk.yellow(`NOT_EXISTS ${delPath}`));\n }\n }\n\n // reload entities\n await EntityManager.reload();\n\n return { delPaths };\n }\n\n syncUI() {\n const uiPort = Sonamu.config.ui?.port ?? 57000;\n\n fetch(`http://127.0.0.1:${uiPort}/api/reload`, {\n method: \"GET\",\n }).catch((e) =>\n console.log(chalk.dim(`Failed to reload Sonamu UI: ${e.message}`))\n );\n }\n}\n"],"names":["Syncer","apis","types","models","isSyncing","checksumPatternGroup","entity","Sonamu","apiRootPath","generated","functions","model","frame","resolveParamDec","paramDec","index","name","type","resolveTypeNode","undefined","console","debug","result","escapedText","toString","optional","defaultDef","ts","isObjectBindingPattern","isTypeReferenceNode","isIdentifier","typeName","inflection","camelize","text","checksumsPath","path","join","sync","targets","currentDirname","currentChecksums","previousChecksums","isSame","msg","margin","abc","onSIGUSR2","diff","diffFiles","changedChecksums","config","__dirname","endsWith","Promise","all","map","target","srcCodePath","dstCodePath","srcChecksum","dstChecksum","replace","exists","appRootPath","getChecksumOfFile","readFile","writeFile","log","chalk","blue","getCurrentChecksums","getPreviousChecksums","equal","process","stdout","columns","length","black","bgGreen","repeat","AbortController","exit","magentaBright","setTimeoutPromises","signal","on","_","differenceWith","isEqual","r","doSyncActions","saveChecksums","abort","off","diffGroups","diffTypes","entityId","typeFilePath","tsPaths","mergedGroup","params","groupBy","matched","match","Object","keys","includes","EntityManager","reload","actionGenerateSchemas","getEntityIdFromPath","get","names","fs","parentId","generateTemplate","uniq","push","p","actionSyncFilesToTargets","autoloadModels","autoloadApis","modelPath","assert","namesRecord","getNamesFromId","modelTsPath","frameName","Error","actionGenerateServices","actionGenerateHttps","syncFromWatcher","tsFiles","jsonFiles","chunks","transpiledFilePaths","chunk","_transpiledFilePaths","allFilePaths","targetFilePaths","clearModuleAndDependents","filePath","resolved","require","resolve","toDelete","Set","cache","forEach","key","mod","children","some","child","id","add","kill","pid","filter","file","diffFile","code","jsPath","mapPath","sourceMapComment","swc","transformFile","module","jsc","parser","syntax","decorators","sourceMaps","mkdir","dirname","recursive","basename","flag","bold","values","pattern","minimatch","relative","autoloadTypes","syncUI","filePaths","overwrite","flat","paramsArray","res","copyFileWithReplaceCoreToShared","fromPath","toPath","oldFileContent","newFileContent","nfc","apiDir","api","dir","src","realSrc","dst","fileChecksums","entries","_fileType","globAsync","sort","substring","checksum","JSON","parse","checksums","stringify","reject","hash","crypto","createHash","input","createReadStream","update","digest","readApisFromFile","sourceFile","methods","modelName","methodName","visitor","currentModelApis","extendedApis","createSourceFile","ScriptTarget","Latest","node","isClassDeclaration","isMethodDeclaration","typeParameters","typeParam","tp","t","constraint","parameters","printNode","initializer","questionToken","returnType","forEachChild","registeredApis","find","method","foundMethod","typeNode","kind","SyntaxKind","AnyKeyword","UnknownKeyword","StringKeyword","NumberKeyword","BooleanKeyword","UndefinedKeyword","NullKeyword","VoidKeyword","LiteralType","literal","isStringLiteral","value","isNumericLiteral","Number","TrueKeyword","FalseKeyword","ArrayType","arrNode","elementsType","elementType","TypeLiteral","literalNode","props","members","member","isIndexSignatureDeclaration","TypeReference","args","typeArguments","typeArg","UnionType","IntersectionType","IndexedAccessType","object","objectType","indexType","TupleType","isTupleTypeNode","elements","elem","printer","createPrinter","newLine","NewLineKind","LineFeed","EmitHint","Unspecified","pathPattern","modules","filterAsync","srcPath","importMultiple","imported","fromEntries","doRefresh","pathPatterns","mapAsync","f","z","ZodType","getTemplate","Template__entity","Template__init_types","Template__generated","Template__generated_sso","Template__generated_http","Template__model","Template__model_test","Template__service","Template__view_list","Template__view_list_columns","Template__view_search_input","Template__view_form","Template__view_id_all_select","Template__view_id_async_select","Template__view_enums_select","Template__view_enums_dropdown","Template__view_enums_buttonset","BadRequestException","renderTemplate","options","template","extra","columnsNode","listParamsZodType","listParamsNode","saveParamsZodType","saveParamsNode","rendered","preTemplateResolved","getColumnsNode","getZodTypeById","zodTypeToRenderingNode","render","resolveRenderedTemplate","preTemplates","body","importKeys","customHeaders","importDefs","header","formatted","reduce","importKey","modulePath","getModulePath","importPath","wrapIf","startsWith","existsOne","importDef","from","concat","prettier","format","writeCodeToPath","pathAndCode","dstFilePaths","dstFilePath","templateOptions","_generateOptions","generateOptions","pathAndCodes","filteredPathAndCodes","everyAsync","dstPath","AlreadyProcessedException","checkExistsGenCode","templateKey","enumId","genPath","fullPath","subPath","getTargetAndPath","isExists","checkExists","enums","enumsKeys","TemplateKey","constant","reduceAsync","tpl","componentId","zodTypeId","moduleAbsPath","describe","propNodeToZodType","propNode","innerType","obj","nodeType","propToZodType","prop","array","nullable","promise","childPropNode","zodType","unknown","isIntegerProp","number","int","isBigIntegerProp","bigint","isTextProp","string","max","getTextTypeLength","textType","isEnumProp","isStringProp","isFloatProp","isDoubleProp","isDecimalProp","isBooleanProp","boolean","isDateProp","isTimeProp","isDateTimeProp","date","isTimestampProp","isJsonProp","isUuidProp","uuid","isVirtualProp","isRelationProp","isBelongsToOneRelationProp","isOneToOneRelationProp","hasJoinColumn","unsigned","nonnegative","resolveRenderType","ZodDate","ZodString","description","ZodNumber","ZodBoolean","ZodEnum","ZodRecord","ZodAny","ZodUnknown","ZodUnion","ZodLiteral","def","baseKey","label","ZodObject","columnKeys","shape","renderType","ZodArray","element","optionNodes","opt","ZodOptional","ZodNullable","subsetKey","subsetA","propNodes","rootPropNode","columnsZodType","subsets","ServiceUnavailableException","fieldExprsToPropNodes","pickedCol","cc","picked","createEntity","form","test","delEntity","delPaths","delPath","parentFs","red","rm","force","yellow","uiPort","ui","port","fetch","catch","e","dim","message"],"mappings":"oGAqHaA,gDAAAA,mEArHiB,4BACY,kCACT,4BACc,oCACxB,+EACJ,4EACD,+EACO,yEACF,0CAC0B,0FAClC,kCAyBR,0CAKA,sCACW,gEACA,oCAYX,uDACgB,oDACW,yDAEE,mEACC,gEACJ,2DACD,+DACK,iEACH,gEACE,kEACA,+FACf,qDACwB,sFACE,uFACD,oFACF,qFACG,qFACH,kFACA,+EACH,4DAClB,oDACiB,8DACS,6EAC9B,oEACE,qCACK,qCAMnB,4+PA+BA,IAAA,AAAMA,oBAAN,iCAAMA,+CAAAA,QACXC,sBAAAA,OAQM,EAAE,EACRC,sBAAAA,QAAkD,CAAC,GACnDC,sBAAAA,SAA2C,CAAC,GAC5CC,sBAAAA,YAAqB,OAErB,sBAAOC,uBAAoC,CAEzCC,OAAQC,cAAM,CAACC,WAAW,CAAG,oCAC7BN,MAAOK,cAAM,CAACC,WAAW,CAAG,iCAC5BC,UAAWF,cAAM,CAACC,WAAW,CAAG,uCAChCE,UAAWH,cAAM,CAACC,WAAW,CAAG,qCAEhCG,MAAOJ,cAAM,CAACC,WAAW,CAAG,kCAC5BI,MAAOL,cAAM,CAACC,WAAW,CAAG,iCAC9B,GA8tBAK,sBAAAA,kBAAkB,SAChBC,cAMAC,6DAAgB,EAEhB,IAAMC,KAAOF,SAASE,IAAI,CAC1B,IAAMC,KAAO,MAAKC,eAAe,CAACJ,SAASG,IAAI,EAE/C,GAAID,OAASG,UAAW,CACtBC,QAAQC,KAAK,CAAC,CAAEL,KAAAA,KAAMC,KAAAA,KAAMH,SAAAA,QAAS,EACvC,CAEA,IAAMQ,OAAmB,CACvBN,KAAMA,KAAKO,WAAW,CAAGP,KAAKO,WAAW,CAACC,QAAQ,GAAK,AAAC,WAAgB,OAANT,OAClEE,KAAAA,KACAQ,SAAUX,SAASW,QAAQ,GAAK,KAChCC,UAAU,CAAEZ,iBAAAA,yBAAAA,SAAUY,UAAU,AAClC,EAGA,GACEC,mBAAE,CAACC,sBAAsB,CAACZ,OAC1BW,mBAAE,CAACE,mBAAmB,CAACf,SAASG,IAAI,GACpCU,mBAAE,CAACG,YAAY,CAAChB,SAASG,IAAI,CAACc,QAAQ,EACtC,CACAT,OAAON,IAAI,CAAGgB,mBAAU,CAACC,QAAQ,CAACnB,SAASG,IAAI,CAACc,QAAQ,CAACG,IAAI,CAAE,KACjE,CAEA,OAAOZ,MACT,iBAtxBWtB,SAyBPmC,IAAAA,oBAAJ,eACE,OAAOC,aAAI,CAACC,IAAI,CAAC9B,cAAM,CAACC,WAAW,CAAE,eACvC,IAGM8B,IAAAA,aAAN,SAAMA,uDACIC,QAGFC,eAqCFC,iBAEEC,kBAGAC,OAEEC,IACAC,OAOFC,IAEAC,UAgBAC,KAKAC,UAGEC,mGAjFAX,QAAYhC,cAAM,CAAC4C,MAAM,CAACb,IAAI,CAA9BC,QAGFC,eAAiBY,UAAUC,QAAQ,CAAC,WACtCD,UACAhB,aAAI,CAACC,IAAI,CAACe,UAAW,YAGzB,SAAME,QAAQC,GAAG,CACfhB,QAAQiB,GAAG,CAAC,SAAOC,wDACXC,YAOAC,YAMAC,YACAC,mGAdAH,YAActB,aAAI,CACrBC,IAAI,CAACG,eAAgB,AAAC,aAAmB,OAAPiB,OAAO,mBACzCK,OAAO,CAAC,SAAU,SACf,SAAMC,GAAAA,eAAM,EAACL,qBAAnB,GAAI,CAAE,cAA4B,CAChC,SACF,CAEMC,YAAcvB,aAAI,CAACC,IAAI,CAC3B9B,cAAM,CAACyD,WAAW,CAClBP,OACA,iCAGkB,SAAM,IAAI,CAACQ,iBAAiB,CAACP,qBAA3CE,YAAc,cACA,SAAM,AAAC,wHACnB,SAAMG,GAAAA,eAAM,EAACJ,qBAAnB,GAAI,CAAE,cAA4B,CAChC,SAAO,GACT,CACA,SAAO,IAAI,CAACM,iBAAiB,CAACN,gBAChC,0BALME,YAAc,cAOpB,GAAID,cAAgBC,YAAa,CAC/B,SACF,OACgBF,aAAa,SAAMO,GAAAA,kBAAQ,EAACR,qBAA5C,SAAMS,mBAAS,2BAAc,yBAA7B,cACA/C,QAAQgD,GAAG,CAACC,cAAK,CAACC,IAAI,CAAC,oCACzB,0BA5BF,cAgCuB,SAAM,IAAI,CAACC,mBAAmB,WAAjD9B,iBAAmB,cAEG,SAAM,IAAI,CAAC+B,oBAAoB,WAAnD9B,kBAAoB,cAGpBC,OAAS8B,GAAAA,sBAAK,EAAChC,iBAAkBC,mBACvC,GAAIC,OAAQ,CACJC,IAAM,wBACNC,OAAS,AAAC6B,CAAAA,QAAQC,MAAM,CAACC,OAAO,CAAGhC,IAAIiC,MAAM,AAAD,EAAK,EACvDzD,QAAQgD,GAAG,CACTC,cAAK,CAACS,KAAK,CAACC,OAAO,CAAC,IAAIC,MAAM,CAACnC,QAAUD,IAAM,IAAIoC,MAAM,CAACnC,UAE5D,SACF,CAEMC,IAAM,IAAImC,eAChB,CAAA,IAAI,CAAC7E,SAAS,CAAG,KACX2C,UAAY,8HAChB,GAAI,IAAI,CAAC3C,SAAS,GAAK,MAAO,CAC5BsE,QAAQQ,IAAI,CAAC,EACf,CACA9D,QAAQgD,GAAG,CAACC,cAAK,CAACc,aAAa,CAAC,+EAI9B,SAAMC,GAAAA,qBAAkB,EAAC,IAAO,eAAgB,CAAEC,OAAQvC,IAAIuC,MAAM,AAAC,WAArE,oEAEFjE,QAAQgD,GAAG,CAACC,cAAK,CAACc,aAAa,CAAC,kBAChCT,QAAQQ,IAAI,CAAC,eACf,gBACAR,QAAQY,EAAE,CAAC,UAAWvC,WAGhBC,KAAOuC,eAAC,CAACC,cAAc,CAC3B/C,iBACAC,kBACA6C,eAAC,CAACE,OAAO,EAELxC,UAAYD,KAAKQ,GAAG,CAAC,SAACkC,UAAMA,EAAEtD,IAAI,GACxChB,QAAQgD,GAAG,CAAC,kBAAmBnB,WAEF,SAAM,IAAI,CAAC0C,aAAa,CACnD1C,UACAR,0BAFMS,iBAAqB,cAArBA,iBAKRT,iBAAmBS,yBAAAA,0BAAAA,iBAAoBT,iBAGvC,SAAM,IAAI,CAACmD,aAAa,CAACnD,0BAAzB,aAGA,CAAA,IAAI,CAACrC,SAAS,CAAG,MACjB0C,IAAI+C,KAAK,GACTnB,QAAQoB,GAAG,CAAC,UAAW/C,uBACzB,iBAEM4C,IAAAA,sBAAN,SAAMA,cACJ1C,SAAmB,CACnBR,gBAAoC,kDAM9BsD,WAQAC,UAYED,mBADAE,SAIE3F,OACA4F,kBAWFH,sBAoBEA,kBACAA,sBACAA,uBAJFI,QAaAJ,kBACAA,kBAFAK,YAWAC,yFA5EFN,WAAaR,eAAC,CAACe,OAAO,CAACrD,UAAW,SAACyC,GACvC,IAAMa,QAAUb,EAAEc,KAAK,CACrB,+DAEKD,UAAP,MAAOA,CAAAA,UAAAA,gBAAAA,wBAAAA,OAAS,CAAC,EAAE,UAAZA,mBAAAA,UAAgB,SACzB,GAGMP,UAAYS,OAAOC,IAAI,CAACX,gBAI1BC,CAAAA,UAAUW,QAAQ,CAAC,WAAaX,UAAUW,QAAQ,CAAC,QAAO,EAA1DX,YACF,SAAMY,4BAAa,CAACC,MAAM,WAA1B,cAEA,SAAM,IAAI,CAACC,qBAAqB,WAAhC,cAIMb,SAAW,IAAI,CAACc,mBAAmB,CACvC,qBAAIhB,CAAAA,mBAAAA,UAAU,CAAC,SAAS,UAApBA,4BAAAA,uBACJ,CAAC,EAAE,KACDE,SAAAA,YACI3F,OAASsG,4BAAa,CAACI,GAAG,CAACf,UAC3BC,aAAe9D,aAAI,CAACC,IAAI,CAC5B9B,cAAM,CAACC,WAAW,CAClB,AAAC,mBAAqCF,OAAnBA,OAAO2G,KAAK,CAACC,EAAE,CAAC,KAAmB,OAAhB5G,OAAO2G,KAAK,CAACC,EAAE,CAAC,mBAEpD5G,OAAO6G,QAAQ,GAAKhG,mBAApBb,YAAmC,SAAMyD,GAAAA,eAAM,EAACmC,2BAAf,CAAE,yDACrC,SAAM,IAAI,CAACkB,gBAAgB,CAAC,aAAc,CAAEnB,SAAAA,QAAS,WAArD,oCAKJF,UAAU,CAAC,YAAY,CAAGR,eAAC,CAAC8B,IAAI,CAAC,AAC/B,qBAAItB,CAAAA,sBAAAA,UAAU,CAAC,YAAY,UAAvBA,+BAAAA,kCACJ,0CAEFC,UAAUsB,IAAI,CAAC,iBAGX7E,iBAAAA,YACiB,SAAM,IAAI,CAAC8B,mBAAmB,WAAjD9B,iBAAmB,wCAOrBuD,CAAAA,UAAUW,QAAQ,CAAC,UACnBX,UAAUW,QAAQ,CAAC,cACnBX,UAAUW,QAAQ,CAAC,YAAW,EAF9BX,aAIMG,QAAUZ,eAAC,CAAC8B,IAAI,CACpB,AACE,qBAAItB,CAAAA,kBAAAA,UAAU,CAAC,QAAQ,UAAnBA,2BAAAA,6BACJ,qBAAIA,CAAAA,sBAAAA,UAAU,CAAC,YAAY,UAAvBA,+BAAAA,0BACJ,qBAAIA,CAAAA,uBAAAA,UAAU,CAAC,YAAY,UAAvBA,gCAAAA,4BACJvC,GAAG,CAAC,SAAC+D,UAAMA,EAAEzD,OAAO,CAAC,SAAU,SAASA,OAAO,CAAC,MAAO,UAE3D,SAAM,IAAI,CAAC0D,wBAAwB,CAACrB,iBAApC,0CAIEH,CAAAA,UAAUW,QAAQ,CAAC,UAAYX,UAAUW,QAAQ,CAAC,QAAO,EAAzDX,aACII,YAAc,AAClB,qBAAIL,CAAAA,kBAAAA,UAAU,CAAC,QAAQ,UAAnBA,2BAAAA,6BACJ,qBAAIA,CAAAA,kBAAAA,UAAU,CAAC,QAAQ,UAAnBA,2BAAAA,uBAIN,SAAM,IAAI,CAAC0B,cAAc,YAAzB,cAGA,SAAM,IAAI,CAACC,YAAY,YAAvB,cAEMrB,OACJD,YAAY5C,GAAG,CAAC,SAACmE,WACf,GAAIA,UAAUtE,QAAQ,CAAC,aAAc,CACnC,IAAM4C,SAAW,MAAKc,mBAAmB,CAAC,CAACY,UAAU,CAAC,CAAC,EAAE,CACzDC,GAAAA,eAAM,EAAC3B,UACP,MAAO,CACL4B,YAAajB,4BAAa,CAACkB,cAAc,CAAC7B,UAC1C8B,YAAa3F,aAAI,CAACC,IAAI,CACpB9B,cAAM,CAACC,WAAW,CAClBmH,UACG7D,OAAO,CAAC,SAAU,SAClBA,OAAO,CAAC,YAAa,aAE5B,CACF,CACA,GAAI6D,UAAUtE,QAAQ,CAAC,YAAa,KACZsE,iBAAtB,IAAsBA,sBAAAA,CAAAA,iBAAAA,UAAUnB,KAAK,CAAC,gCAAhBmB,0BAAAA,iBAA0C,EAAE,IAAzDK,UAAaL,QACtBC,GAAAA,eAAM,EAACI,WACP,MAAO,CACLH,YAAajB,4BAAa,CAACkB,cAAc,CAACE,WAC1CD,YAAa3F,aAAI,CAACC,IAAI,CACpB9B,cAAM,CAACC,WAAW,CAClBmH,UACG7D,OAAO,CAAC,SAAU,SAClBA,OAAO,CAAC,YAAa,aAE5B,CACF,CACA,MAAM,IAAImE,MAAM,gBAClB,GACF,SAAM,IAAI,CAACC,sBAAsB,CAAC7B,iBAAlC,cAEA,SAAM,IAAI,CAAC8B,mBAAmB,YAA9B,sCAGF,SAAO,CACLnC,UAAAA,UACA9C,iBAAkBT,gBACpB,KACF,iBAEM2F,IAAAA,wBAAN,SAAMA,gBAAgBnF,SAAmB,kDACjCoF,QACAC,UAGAC,OACFC,oBACC,0BAAA,kBAAA,eAAA,UAAA,MAAMC,QA0CTD,qBAzCME,0BAyEFC,aACAC,gBA7BN,SAASC,yBAAyBC,QAAgB,EAChD,IAAMC,SAAWC,QAAQC,OAAO,CAACH,UACjC,IAAMI,SAAW,IAAIC,IAAI,CAACJ,SAAS,EAGnCtC,OAAOC,IAAI,CAACsC,QAAQI,KAAK,EAAEC,OAAO,CAAC,SAACC,SAE9BC,cADJ,IAAMA,IAAMP,QAAQI,KAAK,CAACE,IAAI,CAC9B,GAAIC,YAAAA,qBAAAA,cAAAA,IAAKC,QAAQ,UAAbD,8BAAAA,cAAeE,IAAI,CAAC,SAACC,cAAUA,MAAMC,EAAE,GAAKZ,WAAW,CACzDG,SAASU,GAAG,CAACN,IACf,CACF,GAEAJ,SAASG,OAAO,CAAC,SAACC,KAChB,GAAIA,IAAI3C,QAAQ,CAAC,iBAAkB,CACjCjC,QAAQmF,IAAI,CAACnF,QAAQoF,GAAG,CAAE,UAC5B,CACA,OAAOd,QAAQI,KAAK,CAACE,IAAI,AAK3B,EACF,mFA1EMjB,QAAUpF,UAAU8G,MAAM,CAAC,SAACC,aAASA,KAAK3G,QAAQ,CAAC,SACnDiF,UAAYrF,UAAU8G,MAAM,CAAC,SAACC,aAASA,KAAK3G,QAAQ,CAAC,WAGrDkF,OAASE,GAAAA,aAAK,EAACJ,QAAS,GAC1BG,uBACC,+BAAA,wBAAA,2EAAA,UAAeD,sDAAf,2BAAA,MAAA,oCAAME,QAAN,YAC0B,SAAMnF,QAAQC,GAAG,CAC5CkF,QAAMjF,GAAG,CAAC,SAAOyG,oDACO,KAAdC,KAAM1G,IAcR2G,OAOEC,QAIAC,wFAzBc,SAAMC,MAAIC,aAAa,CAACN,SAAU,CACtDO,OAAQ,CACNvJ,KAAM,UACR,EACAwJ,IAAK,CACHC,OAAQ,CACNC,OAAQ,aACRC,WAAY,IACd,EACAnH,OAAQ,KACV,EACAoH,WAAY,IACd,WAZsB,KAAA,cAAdX,KAAc,KAAdA,KAAM1G,IAAQ,KAARA,IAcR2G,OAASF,SACZnG,OAAO,CAAC,QAAS,UACjBA,OAAO,CAAC,MAAO,OAClB,SAAMgH,GAAAA,eAAK,EAAC1I,aAAI,CAAC2I,OAAO,CAACZ,QAAS,CAAEa,UAAW,IAAK,WAApD,cACA,SAAM7G,GAAAA,mBAAS,EAACgG,OAAQD,cAAxB,kBAEI1G,IAAAA,YACI4G,QAAUD,OAAS,OACzB,SAAMW,GAAAA,eAAK,EAAC1I,aAAI,CAAC2I,OAAO,CAACX,SAAU,CAAEY,UAAW,IAAK,WAArD,cACA,SAAM7G,GAAAA,mBAAS,EAACiG,QAAS5G,aAAzB,cAEM6G,iBACJ,0BAA4BjI,aAAI,CAAC6I,QAAQ,CAACb,SAC5C,SAAMjG,GAAAA,mBAAS,EAACgG,OAAQE,iBAAkB,CACxCa,KAAM,GACR,WAFA,oCAKF9J,QAAQgD,GAAG,CACTC,cAAK,CAAC8G,IAAI,CAAC,gBACT9G,cAAK,CAACC,IAAI,CAAC,AAAC,GAA4C,OAA1C6F,OAAOrG,OAAO,CAACvD,cAAM,CAACC,WAAW,CAAE,UAErD,SAAO2J,UACT,gBAvCIzB,sBAAuB,cAyC7BF,CAAAA,qBAAAA,qBAAoBlB,IAAI,OAAxBkB,qBAAyB,qBAAGE,8CA1CzB,uFAAA,uBAAA,8CAAA,2BAAA,wBAAA,+BAAA,yBAAA,iCAqELF,oBAAoBhF,GAAG,CAAC,SAACsF,UACvBD,yBAAyBC,SAC3B,GAGMH,aAAe,AAAC,qBAAGN,gBAAS,qBAAGG,qBAAqB,qBAAGF,YACvDM,gBAAkBD,aACrBoB,MAAM,CAAC,SAACjB,UACP,OAAOrC,OAAO2E,MAAM,CAAC,MAAK/K,oBAAoB,EAAEoJ,IAAI,CAAC,SAAC4B,eACpDC,GAAAA,oBAAS,EAACxC,SAAUuC,UAExB,GACC7H,GAAG,CAAC,SAACsF,gBAAa,IAAM1G,aAAI,CAACmJ,QAAQ,CAAChL,cAAM,CAACC,WAAW,CAAEsI,YAC7D,SAAM,IAAI,CAACnD,aAAa,CAACiD,yBAAzB,aAEA,CAAA,IAAI,CAAC3I,IAAI,GACT,CAAA,IAAI,CAACC,KAAK,CAAG,CAAC,CACd,CAAA,IAAI,CAACC,MAAM,CAAG,CAAC,EACf,SAAM,IAAI,CAACqL,aAAa,YAAxB,cACA,SAAM,IAAI,CAAC/D,cAAc,YAAzB,cACA,SAAM,IAAI,CAACC,YAAY,YAAvB,cAEA,IAAI,CAAC+D,MAAM,eACb,iBAEA1E,IAAAA,4BAAAA,SAAAA,oBAAoB2E,SAAmB,EACrC,OAAOnG,eAAC,CAAC8B,IAAI,CACXqE,UAAUlI,GAAG,CAAC,SAAC+D,GACb,IAAMhB,QAAUgB,EAAEf,KAAK,CAAC,uBACxBoB,GAAAA,eAAM,EAACrB,SAAWA,OAAO,CAAC,EAAE,EAC5B,OAAOvE,mBAAU,CAACC,QAAQ,CAACsE,OAAO,CAAC,EAAE,CAACzC,OAAO,CAAC,MAAO,KACvD,GAEJ,IAEMgD,IAAAA,8BAAN,SAAMA,qIAEF,SAAMxD,QAAQC,GAAG,EACf,IAAI,CAAC6D,gBAAgB,CAAC,gBAAiB,CAAC,EAAG,CAAEuE,UAAW,IAAK,GAC7D,IAAI,CAACvE,gBAAgB,CAAC,YAAa,CAAC,EAAG,CAAEuE,UAAW,IAAK,aAH7D,SAAO,AACL,cAKCC,IAAI,GACJA,IAAI,MACT,iBAEM1D,IAAAA,+BAAN,SAAMA,uBACJ2D,WAGG,oIAGD,SAAMvI,QAAQC,GAAG,CACfsI,YAAYrI,GAAG,CAAC,SAAO6C,kGACrB,IAAI,CAACe,gBAAgB,CAAC,UAAWf,OAAQ,CACvCsF,UAAW,IACb,+BALN,SAAO,AACL,cAQCC,IAAI,GACJA,IAAI,MACT,iBAEMzD,IAAAA,4BAAN,SAAMA,gEACU,KAAP2D,2EAAO,SAAM,IAAI,CAAC1E,gBAAgB,CACvC,iBACA,CAAC,EACD,CAAEuE,UAAW,IAAK,WAHN,oCAAA,kBAAPG,IAAO,QAKdlE,GAAAA,eAAM,EAACkE,KACP,SAAOA,OACT,iBAEMC,IAAAA,wCAAN,SAAMA,gCAAgCC,QAAgB,CAAEC,MAAc,4CAK9DC,eAEAC,sFANA,SAAMpI,GAAAA,eAAM,EAACiI,kBAAnB,GAAI,CAAE,cAAyB,CAC7B,SACF,CAEwB,SAAM9H,GAAAA,kBAAQ,EAAC8H,kBAAjCE,eAAiB,AAAC,cAA0B1K,QAAQ,GAEpD2K,eAAiB,AAAC,WACtB,IAAMC,IAAMF,eAAepI,OAAO,CAChC,iBACA,qCAGF,GAAImI,OAAOtF,QAAQ,CAAC,SAAU,CAC5B,OAAOyF,IAAItI,OAAO,CAAC,kBAAmB,oBACxC,KAAO,CACL,OAAOsI,GACT,CACF,IACA,SAAOjI,GAAAA,mBAAS,EAAC8H,OAAQE,mBAC3B,QAEM3E,IAAAA,iCAAN,SAAMA,yBAAyBrB,OAAiB,kDACtC5D,QACgBhC,mBAAX8L,yFADL9J,QAAYhC,cAAM,CAAC4C,MAAM,CAACb,IAAI,CAA9BC,QACgBhC,mBAAAA,cAAM,CAAC4C,MAAM,CAACmJ,GAAG,CAA5BD,OAAW9L,mBAAhBgM,IAGN,SAAMjJ,QAAQC,GAAG,CACfhB,QAAQiB,GAAG,CAAC,SAAOC,uHACjBH,QAAQC,GAAG,CACT4C,QAAQ3C,GAAG,CAAC,SAAOgJ,+CACXC,QACAC,IAGAH,2EAJAE,QAAUlM,cAAM,CAACC,WAAW,CAAGgM,IAC/BE,IAAMD,QACT3I,OAAO,CAAC,AAAC,IAAU,OAAPuI,OAAO,KAAI,AAAC,IAAU,OAAP5I,OAAO,MAClCK,OAAO,CAAC,gBAAiB,cACtByI,IAAMxB,GAAAA,aAAO,EAAC2B,KACd,SAAM3I,GAAAA,eAAM,EAACwI,iBAAf,CAAE,cAAF,YACF,SAAMzB,GAAAA,eAAK,EAACyB,IAAK,CAAEvB,UAAW,IAAK,WAAnC,oCAEF5J,QAAQgD,GAAG,CACTC,cAAK,CAAC8G,IAAI,CAAC,YACT9G,cAAK,CAACC,IAAI,CACR,AAAC,WAAoD,OAA1CoI,IAAI5I,OAAO,CAACvD,cAAM,CAACyD,WAAW,CAAG,IAAK,OAGvD,SAAM,IAAI,CAAC+H,+BAA+B,CAACU,QAASC,aAApD,cACA,SAAOA,OACT,8CArBR,SAAO,AACL,cAwBAd,IAAI,MACR,iBAEMrH,IAAAA,4BAAN,SAAMA,sEACEmH,UAYAiB,gGAXJ,SAAMrJ,QAAQC,GAAG,CACfkD,OAAOmG,OAAO,CAAC,IAAI,CAACvM,oBAAoB,EAAEmD,GAAG,CAC3C,qDAAQqJ,oBAAWxB,mGACjB,SAAOyB,GAAAA,gBAAS,EAACzB,WACnB,gBALAK,UAAY,AAChB,cAQCE,IAAI,GACJmB,IAAI,GAKD,SAAMzJ,QAAQC,GAAG,CACrBmI,UAAUlI,GAAG,CAAC,SAAOsF,sIAEjB1G,KAAM0G,SAASkE,SAAS,CAACzM,cAAM,CAACC,WAAW,CAACqE,MAAM,GACxC,SAAM,IAAI,CAACZ,iBAAiB,CAAC6E,kBAFzC,eAEEmE,SAAU,uBAEd,0BATIN,cAGA,cAQN,SAAOA,iBACT,iBAEMnI,IAAAA,6BAAN,SAAMA,iEAKE9B,2FAJA,SAAMqB,GAAAA,eAAM,EAAC,IAAI,CAAC5B,aAAa,UAArC,GAAI,CAAE,cAAmC,CACvC,YACF,GAE0B+K,KAAKC,KAAK,CACjC,SAAMjJ,GAAAA,kBAAQ,EAAC,IAAI,CAAC/B,aAAa,CAAE,iBADhCO,kBAAoBwK,QAAAA,MACvB,gBAEH,SAAOxK,qBACT,iBAEMkD,IAAAA,sBAAN,SAAMA,cAAcwH,SAA4B,+GAC9C,SAAMjJ,GAAAA,mBAAS,EACb,IAAI,CAAChC,aAAa,CAClB+K,KAAKG,SAAS,CAACD,UAAW,KAAM,GAChC,iBAHF,cAKAhM,QAAQgD,GAAG,CAAC,iBAAkB,IAAI,CAACjC,aAAa,cAClD,iBAEM8B,IAAAA,0BAAN,SAAMA,kBAAkB6E,QAAgB,mFACtC,SAAO,IAAIxF,QAAgB,SAAC2F,QAASqE,QACnC,IAAMC,KAAOC,eAAM,CAACC,UAAU,CAAC,QAC/B,IAAMC,MAAQC,GAAAA,oBAAgB,EAAC7E,UAC/B4E,MAAMpI,EAAE,CAAC,QAASgI,QAClBI,MAAMpI,EAAE,CAAC,OAAQ,SAAUmD,KAAU,EACnC8E,KAAKK,MAAM,CAACnF,MACd,GACAiF,MAAMpI,EAAE,CAAC,QAAS,WAChB2D,QAAQsE,KAAKM,MAAM,CAAC,OACtB,EACF,KACF,QAEMC,IAAAA,yBAAN,SAAMA,iBAAiBhF,QAAgB,kDAC/BiF,kBAMAC,QACFC,UACAC,WACEC,QAmEAC,iBAeAC,iGA3Fa1M,mBAAE,CAAC2M,gBAAgB,OACpCxF,UACC,SAAM5E,GAAAA,kBAAQ,EAAC4E,kBAFZiF,WAAapM,QAAAA,mBAAE,cAEnB,AAAC,cAA0BH,QAAQ,GACnCG,mBAAE,CAAC4M,YAAY,CAACC,MAAM,IAGlBR,WACFC,UAAoB,eACpBC,WAAqB,gBACnBC,QAAU,SAACM,MACf,GAAI9M,mBAAE,CAAC+M,kBAAkB,CAACD,MAAO,CAC/B,GAAIA,KAAKzN,IAAI,EAAIW,mBAAE,CAACG,YAAY,CAAC2M,KAAKzN,IAAI,EAAG,CAC3CiN,UAAYQ,KAAKzN,IAAI,CAACO,WAAW,CAACC,QAAQ,GAAGsC,OAAO,CAAC,SAAU,GACjE,CACF,CACA,GAAInC,mBAAE,CAACgN,mBAAmB,CAACF,MAAO,CAChC,GAAI9M,mBAAE,CAACG,YAAY,CAAC2M,KAAKzN,IAAI,EAAG,CAC9BkN,WAAaO,KAAKzN,IAAI,CAACO,WAAW,CAACC,QAAQ,EAC7C,KAGEiN,qBADF,IAAMG,eAA2C,AAC/CH,CAAAA,CAAAA,qBAAAA,KAAKG,cAAc,UAAnBH,8BAAAA,qBAAuB,EAAE,AAAD,EACxBjL,GAAG,CAAC,SAACqL,WACL,IAAMC,GAAKD,UAEX,MAAO,CACLE,EAAG,aACHpF,GAAImF,GAAG9N,IAAI,CAACO,WAAW,CAACC,QAAQ,GAChCwN,WAAYF,GAAGE,UAAU,CACrB,MAAK9N,eAAe,CAAC4N,GAAGE,UAAU,EAClC7N,SACN,CACF,GACA,IAAM8N,WAAyBR,KAAKQ,UAAU,CAACzL,GAAG,CAChD,SAAC1C,SAAUC,OACT,IAAMW,WAAa,MAAKwN,SAAS,CAACpO,SAASqO,WAAW,CAAEpB,YAIxD,OAAO,MAAKlN,eAAe,CACzB,CACEG,KAAMF,SAASE,IAAI,CACnBC,KAAMH,SAASG,IAAI,CACnBQ,SACEX,SAASsO,aAAa,GAAKjO,WAC3BL,SAASqO,WAAW,GAAKhO,UAC3BO,WAAAA,UACF,EACAX,MAEJ,GAEF,GAAI0N,KAAKxN,IAAI,GAAKE,UAAW,CAC3B,MAAM,IAAI8G,MACR,AAAC,sBAAkCiG,OAAbD,UAAU,KAAc,OAAXC,YAEvC,CACA,IAAMmB,WAAa,MAAKnO,eAAe,CAACuN,KAAKxN,IAAI,EAEjD+M,QAAQ1G,IAAI,CAAC,CACX2G,UAAAA,UACAC,WAAAA,WACAU,eAAAA,eACAK,WAAAA,WACAI,WAAAA,UACF,EACF,CACA1N,mBAAE,CAAC2N,YAAY,CAACb,KAAMN,QACxB,EACAA,QAAQJ,YAER,GAAIC,QAAQnJ,MAAM,GAAK,EAAG,CACxB,YACF,CAGMuJ,iBAAmBmB,0BAAc,CAACxF,MAAM,CAAC,SAACuC,KAC9C,OAAO0B,QAAQwB,IAAI,CACjB,SAACC,eACCA,OAAOxB,SAAS,GAAK3B,IAAI2B,SAAS,EAClCwB,OAAOvB,UAAU,GAAK5B,IAAI4B,UAAU,EAE1C,GACA,GAAIE,iBAAiBvJ,MAAM,GAAK,EAAG,CAIjC,MAAM,IAAIoD,MAAM,AAAC,4BAAoC,OAATa,UAC9C,CAGMuF,aAAeD,iBAAiB5K,GAAG,CAAC,SAAC8I,KACzC,IAAMoD,YAAc1B,QAAQwB,IAAI,CAC9B,SAACC,eACCA,OAAOxB,SAAS,GAAK3B,IAAI2B,SAAS,EAClCwB,OAAOvB,UAAU,GAAK5B,IAAI4B,UAAU,GAExC,OAAO,uCACF5B,MACHsC,eAAgBc,YAAad,cAAc,CAC3CK,WAAYS,YAAaT,UAAU,CACnCI,WAAYK,YAAaL,UAAU,EAEvC,GACA,SAAOhB,gBACT,iBAEAnN,IAAAA,wBAAAA,SAAAA,gBAAgByO,QAAqB,iBACnC,OAAQA,iBAAAA,yBAAAA,SAAUC,IAAI,EACpB,KAAKjO,mBAAE,CAACkO,UAAU,CAACC,UAAU,CAC3B,MAAO,KACT,MAAKnO,mBAAE,CAACkO,UAAU,CAACE,cAAc,CAC/B,MAAO,SACT,MAAKpO,mBAAE,CAACkO,UAAU,CAACG,aAAa,CAC9B,MAAO,QACT,MAAKrO,mBAAE,CAACkO,UAAU,CAACI,aAAa,CAC9B,MAAO,QACT,MAAKtO,mBAAE,CAACkO,UAAU,CAACK,cAAc,CAC/B,MAAO,SACT,MAAKvO,mBAAE,CAACkO,UAAU,CAACM,gBAAgB,CACjC,MAAO,WACT,MAAKxO,mBAAE,CAACkO,UAAU,CAACO,WAAW,CAC5B,MAAO,MACT,MAAKzO,mBAAE,CAACkO,UAAU,CAACQ,WAAW,CAC5B,MAAO,MACT,MAAK1O,mBAAE,CAACkO,UAAU,CAACS,WAAW,CAC5B,IAAMC,QAAU,AAACZ,SAAgCY,OAAO,CACxD,GAAI5O,mBAAE,CAAC6O,eAAe,CAACD,SAAU,CAC/B,MAAO,CACLxB,EAAG,iBACH0B,MAAOF,QAAQrO,IAAI,AACrB,CACF,MAAO,GAAIP,mBAAE,CAAC+O,gBAAgB,CAACH,SAAU,CACvC,MAAO,CACLxB,EAAG,kBACH0B,MAAOE,OAAOJ,QAAQrO,IAAI,CAC5B,CACF,KAAO,CACL,GAAIqO,QAAQX,IAAI,GAAKjO,mBAAE,CAACkO,UAAU,CAACO,WAAW,CAAE,CAC9C,MAAO,MACT,MAAO,GAAIG,QAAQX,IAAI,GAAKjO,mBAAE,CAACkO,UAAU,CAACM,gBAAgB,CAAE,CAC1D,MAAO,WACT,MAAO,GAAII,QAAQX,IAAI,GAAKjO,mBAAE,CAACkO,UAAU,CAACe,WAAW,CAAE,CACrD,MAAO,MACT,MAAO,GAAIL,QAAQX,IAAI,GAAKjO,mBAAE,CAACkO,UAAU,CAACgB,YAAY,CAAE,CACtD,MAAO,OACT,CACA,MAAM,IAAI5I,MAAM,aAClB,CACF,KAAKtG,mBAAE,CAACkO,UAAU,CAACiB,SAAS,CAC1B,IAAMC,QAAUpB,SAChB,MAAO,CACLZ,EAAG,QACHiC,aAAc,IAAI,CAAC9P,eAAe,CAAC6P,QAAQE,WAAW,CACxD,CACF,MAAKtP,mBAAE,CAACkO,UAAU,CAACqB,WAAW,CAC5B,IAAMC,YAAcxB,SACpB,MAAO,CACLZ,EAAG,SACHqC,MAAOD,YAAYE,OAAO,CAAC7N,GAAG,CAAC,SAAC8N,QAC9B,GAAI3P,mBAAE,CAAC4P,2BAA2B,CAACD,QAAS,CAC1C1J,GAAAA,eAAM,EAAC0J,OAAOrC,UAAU,CAAC,EAAE,EAC3B,IAAMnD,IAAM,MAAKjL,eAAe,CAAC,CAC/BG,KAAMsQ,OAAOrC,UAAU,CAAC,EAAE,CAACjO,IAAI,CAC/BC,KAAMqQ,OAAOrC,UAAU,CAAC,EAAE,CAAChO,IAAI,AACjC,GAEA,OAAO,MAAKJ,eAAe,CAAC,CAC1BG,KAAM,CACJO,YAAa,AAAC,IAAcuK,OAAXA,IAAI9K,IAAI,EACvB8K,OAD0BA,IAAIrK,QAAQ,CAAG,IAAM,GAAG,MAEnD,OADCqK,IAAI7K,IAAI,CACT,IACH,EACAA,KAAMqQ,OAAOrQ,IAAI,AACnB,EACF,KAAO,CACL,OAAO,MAAKJ,eAAe,CAAC,CAC1BG,KAAM,AAACsQ,OAAgCtQ,IAAI,CAC3CC,KAAM,AAACqQ,OAAgCrQ,IAAI,CAC3CQ,SACE,AAAC6P,OAAgClC,aAAa,GAAKjO,SACvD,EACF,CACF,EACF,CACF,MAAKQ,mBAAE,CAACkO,UAAU,CAAC2B,aAAa,KAMtB,wBALR,MAAO,CACLzC,EAAG,MACHpF,GAAI,AACF,AAACgG,SAAkC5N,QAAQ,CAC3CR,WAAW,CAACC,QAAQ,GACtBiQ,IAAI,EAAE,wBAAA,AAAC9B,SAAkC+B,aAAa,UAAhD,wCAAA,wBAAkDlO,GAAG,CACzD,SAACmO,gBAAY,MAAKzQ,eAAe,CAACyQ,UAEtC,CACF,MAAKhQ,mBAAE,CAACkO,UAAU,CAAC+B,SAAS,CAC1B,MAAO,CACL7C,EAAG,QACH7O,MAAO,AAACyP,SAA8BzP,KAAK,CAACsD,GAAG,CAAC,SAACvC,aAC/C,MAAKC,eAAe,CAACD,OAEzB,CACF,MAAKU,mBAAE,CAACkO,UAAU,CAACgC,gBAAgB,CACjC,MAAO,CACL9C,EAAG,eACH7O,MAAO,AAACyP,SAAqCzP,KAAK,CAACsD,GAAG,CAAC,SAACvC,aACtD,MAAKC,eAAe,CAACD,OAEzB,CACF,MAAKU,mBAAE,CAACkO,UAAU,CAACiC,iBAAiB,CAClC,MAAO,CACL/C,EAAG,iBACHgD,OAAQ,IAAI,CAAC7Q,eAAe,CAC1B,AAACyO,SAAsCqC,UAAU,EAEnDjR,MAAO,IAAI,CAACG,eAAe,CACzB,AAACyO,SAAsCsC,SAAS,CAEpD,CACF,MAAKtQ,mBAAE,CAACkO,UAAU,CAACqC,SAAS,CAC1B,GAAIvQ,mBAAE,CAACwQ,eAAe,CAACxC,UAAW,CAChC,MAAO,CACLZ,EAAG,aACHqD,SAAUzC,SAASyC,QAAQ,CAAC5O,GAAG,CAAC,SAAC6O,aAC/B,MAAKnR,eAAe,CAACmR,OAEzB,CACF,CACA,KACF,MAAKlR,UACH,MAAM,IAAI8G,MAAM,qBACpB,CAEA7G,QAAQC,KAAK,CAACsO,SACd,OAAM,IAAI1H,MAAM,AAAC,qBAAkC,OAAd0H,SAASC,IAAI,EACpD,IAqCAV,IAAAA,kBAAAA,SAAAA,UACET,IAAyB,CACzBV,UAAyB,EAEzB,GAAIU,OAAStN,UAAW,CACtB,OAAOA,SACT,CAEA,IAAMmR,QAAU3Q,mBAAE,CAAC4Q,aAAa,CAAC,CAAEC,QAAS7Q,mBAAE,CAAC8Q,WAAW,CAACC,QAAQ,AAAC,GACpE,OAAOJ,QAAQpD,SAAS,CAACvN,mBAAE,CAACgR,QAAQ,CAACC,WAAW,CAAEnE,KAAMV,WAC1D,IAEMrG,IAAAA,qBAAN,SAAMA,+DACEmL,YAMAnH,UACApK,yFAPAuR,YAAczQ,aAAI,CAACC,IAAI,CAC3B9B,cAAM,CAACC,WAAW,CAClB,0CAIgB,SAAMsM,GAAAA,gBAAS,EAAC+F,qBAA5BnH,UAAY,cACH,SAAMpI,QAAQC,GAAG,CAC9BmI,UAAUlI,GAAG,CAAC,SAACsF,iBAAa,MAAKgF,gBAAgB,CAAChF,qBAD9CxH,OAAS,aAGf,CAAA,IAAI,CAACrB,IAAI,CAAGqB,OAAOsK,IAAI,GACvB,SAAO,IAAI,CAAC3L,IAAI,IAClB,iBAEMwH,IAAAA,uBAAN,SAAMA,2DACEoL,YAMAnH,UASAoH,QACApS,iFAhBAmS,YAAczQ,aAAI,CAACC,IAAI,CAC3B9B,cAAM,CAACC,WAAW,CAClB,0CAKA,SAAMsM,GAAAA,gBAAS,EAAC+F,qBADA,SAAME,uBAAW,eACjC,cACA,SAAO3Q,gDAGC4Q,+EAAAA,QAAU5Q,KAAK0B,OAAO,CAAC,SAAU,SAASA,OAAO,CAAC,MAAO,OACxD,SAAMC,GAAAA,eAAM,EAACiP,iBAApB,SAAO,iBACT,gBAPItH,UAAY,cASF,SAAMuH,GAAAA,qBAAc,EAACvH,mBAA/BoH,QAAU,cACVpS,UAAYoS,QACftP,GAAG,CAAC,oBAAG0P,eAAAA,gBAAezM,OAAOmG,OAAO,CAACsG,YACrCtH,IAAI,EACP,CAAA,IAAI,CAACzL,MAAM,CAAGsG,OAAO0M,WAAW,CAC9BzS,UAAUqJ,MAAM,CACd,qDAAE/I,sBAAUA,KAAKqC,QAAQ,CAAC,UAAYrC,KAAKqC,QAAQ,CAAC,YAGxD,SAAO,IAAI,CAAClD,MAAM,IACpB,iBAEMqL,IAAAA,sBAAN,SAAMA,oBACJ4H,UAAAA,uDAAqB,gDAMfC,aAMA3H,UASAoH,QACApS,iFApBN,GAAI,CAAC0S,WAAa3M,OAAOC,IAAI,CAAC,IAAI,CAACxG,KAAK,EAAE2E,MAAM,CAAG,EAAG,CACpD,SAAO,IAAI,CAAC3E,KAAK,CACnB,CAEMmT,cACJjR,aAAI,CAACC,IAAI,CAAC9B,cAAM,CAACC,WAAW,CAAE,mCAC9B4B,aAAI,CAACC,IAAI,CAAC9B,cAAM,CAACC,WAAW,CAAE,wCAK7B,SAAM8S,GAAAA,oBAAQ,EAACD,aAAcvG,gBAAS,UADvB,SAAMiG,uBAAW,eACjC,AAAC,cAAyCnH,IAAI,GAC9C,SAAOxJ,gDAGC4Q,+EAAAA,QAAU5Q,KAAK0B,OAAO,CAAC,SAAU,SAASA,OAAO,CAAC,MAAO,OACxD,SAAMC,GAAAA,eAAM,EAACiP,iBAApB,SAAO,iBACT,gBAPItH,UAAY,cASF,SAAMuH,GAAAA,qBAAc,EAACvH,UAAW0H,mBAA1CN,QAAU,cACVpS,UAAYoS,QACftP,GAAG,CAAC,oBAAG0P,eAAAA,gBAAezM,OAAOmG,OAAO,CAACsG,YACrCtH,IAAI,EACP,CAAA,IAAI,CAAC1L,KAAK,CAAGuG,OAAO0M,WAAW,CAC7BzS,UAAUqJ,MAAM,CAAC,qDAAIwJ,mBAAOA,AAAC,YAADA,EAAaC,MAAC,CAACC,OAAO,KAEpD,SAAO,IAAI,CAACvT,KAAK,IACnB,iBAEAwT,IAAAA,oBAAAA,SAAAA,YAAYpK,GAAgB,EAC1B,GAAIA,MAAQ,SAAU,CACpB,OAAO,IAAIqK,gCAAgB,AAC7B,MAAO,GAAIrK,MAAQ,aAAc,CAC/B,OAAO,IAAIsK,wCAAoB,AACjC,MAAO,GAAItK,MAAQ,YAAa,CAC9B,OAAO,IAAIuK,sCAAmB,AAChC,MAAO,GAAIvK,MAAQ,gBAAiB,CAClC,OAAO,IAAIwK,8CAAuB,AACpC,MAAO,GAAIxK,MAAQ,iBAAkB,CACnC,OAAO,IAAIyK,gDAAwB,AACrC,MAAO,GAAIzK,MAAQ,QAAS,CAC1B,OAAO,IAAI0K,8BAAe,AAC5B,MAAO,GAAI1K,MAAQ,aAAc,CAC/B,OAAO,IAAI2K,wCAAoB,AACjC,MAAO,GAAI3K,MAAQ,UAAW,CAC5B,OAAO,IAAI4K,kCAAiB,AAC9B,MAAO,GAAI5K,MAAQ,YAAa,CAC9B,OAAO,IAAI6K,sCAAmB,AAChC,MAAO,GAAI7K,MAAQ,oBAAqB,CACtC,OAAO,IAAI8K,sDAA2B,AACxC,MAAO,GAAI9K,MAAQ,oBAAqB,CACtC,OAAO,IAAI+K,sDAA2B,AACxC,MAAO,GAAI/K,MAAQ,YAAa,CAC9B,OAAO,IAAIgL,sCAAmB,AAChC,MAAO,GAAIhL,MAAQ,qBAAsB,CACvC,OAAO,IAAIiL,wDAA4B,AACzC,MAAO,GAAIjL,MAAQ,uBAAwB,CACzC,OAAO,IAAIkL,4DAA8B,AAC3C,MAAO,GAAIlL,MAAQ,oBAAqB,CACtC,OAAO,IAAImL,sDAA2B,AACxC,MAAO,GAAInL,MAAQ,sBAAuB,CACxC,OAAO,IAAIoL,0DAA6B,AAC1C,MAAO,GAAIpL,MAAQ,uBAAwB,CACzC,OAAO,IAAIqL,4DAA8B,AAC3C,KAAO,CACL,MAAM,IAAIC,iCAAmB,CAAC,AAAC,aAAgB,OAAJtL,KAC7C,CACF,IAEMuL,IAAAA,uBAAN,SAAMA,eACJvL,GAAM,CACNwL,OAA2B,kDA6BJC,UA3BjBA,SAEFC,MAGMjN,YAGF9B,SAGEgP,YACAC,kBAGAC,eAIAC,kBAGAC,eAKJC,SACAvM,SAEFwM,sGA9BER,SAAqB,IAAI,CAACrB,WAAW,CAACpK,KAExC0L,aACA1L,CAAAA,MAAQ,SAAQ,EAAhBA,YAEMvB,YAAgB+M,QAAhB/M,YACC,SAAM,IAAI,CAAC+F,gBAAgB,CAAC/F,qBAArCiN,OAAS,sCACA,CAAC,QAAS,YAAa,aAAarO,QAAQ,CAAC2C,KAA7C,YACHrD,SAAW,AAAC6O,QAAqC7O,QAAQ,KAC3DqD,CAAAA,MAAQ,aAAeA,MAAQ,OAAM,EAArCA,YAEkB,SAAM,IAAI,CAACkM,cAAc,CAACvP,SAAU,aAAlDgP,YAAc,cACM,SAAM,IAAI,CAACQ,cAAc,CACjD,AAAC,GAAW,OAATxP,SAAS,uBADRiP,kBAAoB,cAGpBC,eAAiB,IAAI,CAACO,sBAAsB,CAACR,mBACnDF,OAASC,YAAaE,uCACb7L,CAAAA,MAAQ,WAAU,EAAlBA,YAEiB,SAAM,IAAI,CAACmM,cAAc,CACjD,AAAC,GAAW,OAATxP,SAAS,uBADRmP,kBAAoB,cAGpBC,eAAiB,IAAI,CAACK,sBAAsB,CAACN,mBACnDJ,OAASK,sCAII,SAAMN,CAAAA,UAAAA,UAASY,MAAM,OAAfZ,UAAAA,CAAgBD,SAAhBC,OAAyB,qBAAGC,iBAA7CM,SAAW,cACA,SAAM,IAAI,CAACM,uBAAuB,CAACtM,IAAKgM,kBAAnDvM,SAAW,cAEbwM,2BACAD,SAASO,YAAY,CAArBP,aAEA,SAAMhS,QAAQC,GAAG,CACf+R,SAASO,YAAY,CAACrS,GAAG,CAAC,oBAAG8F,YAAAA,IAAKwL,gBAAAA,QAChC,OAAO,MAAKD,cAAc,CAACvL,MAAKwL,UAClC,aAJJS,oBAAsB,AACpB,cAKA3J,IAAI,2BAGR,SAAO,CAAC7C,UAAD,OAAW,qBAAGwM,yBACvB,iBAEMK,IAAAA,gCAAN,SAAMA,wBACJtM,GAAgB,CAChBhI,MAAwB,4CAEhBmC,OAAcqF,SAAUgN,KAAMC,WAAYC,cAG5CC,WAsCAC,OAQAC,iFAjDE1S,OAA4DnC,OAA5DmC,OAAcqF,SAA8CxH,OAApDc,KAAgB0T,KAAoCxU,OAApCwU,KAAMC,WAA8BzU,OAA9ByU,WAAYC,cAAkB1U,OAAlB0U,cAG5CC,WAAaF,WAChBK,MAAM,CACL,SAAC1Q,EAAG2Q,WACF,IAAMC,WAAa1P,4BAAa,CAAC2P,aAAa,CAACF,WAC/C,IAAIG,WAAaF,WACjB,GAAIA,WAAW3P,QAAQ,CAAC,MAAQ2P,WAAW3P,QAAQ,CAAC,KAAM,CACxD6P,WAAaC,GAAAA,kBAAM,EACjBrU,aAAI,CAACmJ,QAAQ,CAACnJ,aAAI,CAAC2I,OAAO,CAACjC,UAAWwN,YACtC,SAAC/O,SAAM,CAACA,EAAEmP,UAAU,CAAC,OAAS,MAAO,KAAOnP,EAAE,EAElD,CAGA,IAAMoP,UAAYjR,EAAE8J,IAAI,CACtB,SAACoH,kBAAcA,UAAUC,IAAI,GAAKL,aAEpC,GAAIG,UAAW,CACbA,UAAUjQ,IAAI,CAAGnB,eAAC,CAAC8B,IAAI,CAACsP,UAAUjQ,IAAI,CAACoQ,MAAM,CAACT,WAChD,KAAO,CACL3Q,EAAE4B,IAAI,CAAC,CACLZ,KAAM,CAAC2P,UAAU,CACjBQ,KAAML,UACR,EACF,CACA,OAAO9Q,CACT,MAODqE,MAAM,CACL,SAAC6M,kBACC9N,SAASzF,QAAQ,CAACuT,UAAUC,IAAI,CAAC/S,OAAO,CAAC,KAAM,IAAM,SAAW,QAIhEoS,OAAS,AACb,qBAAIF,sBAAAA,uBAAAA,yBACJ,qBAAGC,WAAWzS,GAAG,CACf,SAACoT,iBACC,AAAC,YAAgDA,OAArCA,UAAUlQ,IAAI,CAACrE,IAAI,CAAC,MAAM,aAA0B,OAAfuU,UAAUC,IAAI,CAAC,SAEpExU,IAAI,CAAC,MAEW,SAAM,AAAC,4FACvB,GAAIiH,MAAQ,iBAAkB,CAC5B,SAAO,CAAC4M,OAAQJ,MAAMzT,IAAI,CAAC,QAC7B,KAAO,CACL,SAAO0U,iBAAQ,CAACC,MAAM,CAAC,CAACd,OAAQJ,MAAMzT,IAAI,CAAC,QAAS,CAClDqI,OAAQpB,MAAQ,SAAW,OAAS,YACtC,GACF,YACF,gBARM6M,UAAY,cAUlB,SAAO,CACL/T,KAAMqB,OAAS,IAAMqF,SACrBoB,KAAMiM,SACR,KACF,QAEMc,IAAAA,wBAAN,SAAMA,gBAAgBC,WAAwB,4CACpC3U,QACAyB,YACF8E,SAEAqO,oFAJE5U,QAAYhC,cAAM,CAAC4C,MAAM,CAACb,IAAI,CAA9BC,QACAyB,YAAgBzD,cAAM,CAAtByD,YACF8E,SAAW,AAAC,GAAwBoO,OAAtB3W,cAAM,CAACyD,WAAW,CAAC,KAAoB,OAAjBkT,YAAY9U,IAAI,EAEpD+U,aAAe5R,eAAC,CAAC8B,IAAI,CACzB9E,QAAQiB,GAAG,CAAC,SAACC,eAAWqF,SAAShF,OAAO,CAAC,YAAa,AAAC,IAAU,OAAPL,OAAO,SAE5D,SAAMH,QAAQC,GAAG,CACtB4T,aAAa3T,GAAG,CAAC,SAAO4T,uDAChB7K,2EAAAA,IAAMnK,aAAI,CAAC2I,OAAO,CAACqM,aACnB,SAAMrT,GAAAA,eAAM,EAACwI,iBAAf,CAAE,cAAF,YACF,SAAMzB,GAAAA,eAAK,EAACyB,IAAK,CAAEvB,UAAW,IAAK,WAAnC,oCAEF,SAAM7G,GAAAA,mBAAS,EAACiT,YAAaF,YAAYhN,IAAI,UAA7C,cACA9I,QAAQgD,GAAG,CACTC,cAAK,CAAC8G,IAAI,CAAC,eACT9G,cAAK,CAACC,IAAI,CAAC,AAAC,GAA6C,OAA3C8S,YAAYtT,OAAO,CAACE,YAAc,IAAK,OAEzD,SAAOoT,eACT,gBAZF,SAAO,iBAcT,QAEMhQ,IAAAA,yBAAN,SAAMA,iBACJkC,GAAgB,CAChB+N,eAAoB,CACpBC,gBAAkC,kDAE5BC,gBAMA7Q,KAGA8Q,aAQAC,uGAjBAF,gBAAkB,gBACtB5L,UAAW,OACR2L,kBAIC5Q,MAAuB4C,KAI3B,SAAMhG,QAAQC,GAAG,CACfmD,KAAKlD,GAAG,CAAC,SAAO8F,kHACP,SAAM,IAAI,CAACuL,cAAc,CAACvL,IAAK+N,yBAAtC,SAAO,iBACT,0BAJEG,aAAe,AACnB,cAKA5L,IAAI,GAEsC,SAAM,AAAC,4HAC7C2L,CAAAA,gBAAgB5L,SAAS,GAAK,IAAG,EAAjC4L,YACF,SAAOC,qBAEA,SAAMzE,GAAAA,uBAAW,EAACyE,aAAc,SAAON,uDACpC3U,QACFuG,SACAqO,oFAFE5U,QAAYhC,cAAM,CAAC4C,MAAM,CAACb,IAAI,CAA9BC,QACFuG,SAAW,AAAC,GAAwBoO,OAAtB3W,cAAM,CAACyD,WAAW,CAAC,KAAoB,OAAjBkT,YAAY9U,IAAI,EACpD+U,aAAe5U,QAAQiB,GAAG,CAAC,SAACC,eAChCqF,SAAShF,OAAO,CAAC,YAAa,AAAC,IAAU,OAAPL,OAAO,QAEpC,SAAMiU,GAAAA,sBAAU,EACrBP,aACA,SAAOQ,sHAAc,SAAM5T,GAAAA,eAAM,EAAC4T,0BAAf,CAAE,gCAFvB,SAAO,iBAIT,eAVA,SAAO,kCAYX,gBAhBMF,qBAAsC,cAiB5C,GAAIA,qBAAqB5S,MAAM,GAAK,EAAG,CACrC,MAAM,IAAI+S,uCAAyB,CACjC,uBAEJ,CAEA,SAAOtU,QAAQC,GAAG,CAChBkU,qBAAqBjU,GAAG,CAAC,SAAC0T,oBACxB,MAAKD,eAAe,CAACC,mBAG3B,iBAEMW,IAAAA,2BAAN,SAAMA,mBACJ5R,QAAgB,CAChB6R,WAAwB,CACxBC,MAAe,4CAEmB,mCAA1BtU,OAAcuU,QAIhBC,SACAC,oFAL4B,mCAAA,IAAI,CAACxE,WAAW,CAChDoE,aACAK,gBAAgB,CAACvR,4BAAa,CAACkB,cAAc,CAAC7B,UAAW8R,QAFnDtU,OAA0B,mCAA1BA,OAAcuU,QAAY,mCAAlB5V,KAIV6V,SAAW7V,aAAI,CAACC,IAAI,CAAC9B,cAAM,CAACyD,WAAW,CAAEP,OAAQuU,SACjDE,QAAU9V,aAAI,CAACC,IAAI,CAACoB,OAAQuU,eAEhCE,QAAAA,QACAD,SAAAA,UACU,SAAMlU,GAAAA,eAAM,EAACkU,kBAHzB,eAGEG,SAAU,uBAEd,iBAEMC,IAAAA,oBAAN,SAAMA,YACJpS,QAAgB,CAChBqS,KAEC,kDAEK5R,KACAO,MACAsR,4FAFA7R,KAAsB8R,kBAAW,CAAC1D,OAAO,CACzC7N,MAAQL,4BAAa,CAACkB,cAAc,CAAC7B,UACrCsS,UAAY9R,OAAOC,IAAI,CAAC4R,OAAOvO,MAAM,CACzC,SAAC/I,aAASA,OAASiG,MAAMwR,QAAQ,GAG5B,SAAMC,GAAAA,uBAAW,EACtBhS,KACA,SAAOpF,OAAQgI,+CACPqP,IAcsBA,sBAApBlV,OAAc8D,EACdhF,+EAfFoW,IAAM,IAAI,CAACjF,WAAW,CAACpK,SACzBA,IAAIoN,UAAU,CAAC,cAAfpN,YACF,SAAMgK,GAAAA,oBAAQ,EAACiF,UAAW,SAAOK,uDACHD,sBAApBlV,OAAc8D,2EAAMoR,sBAAAA,IAAIR,gBAAgB,CAC9ClR,MACA2R,aAFMnV,OAAoBkV,sBAApBlV,OAAc8D,EAAMoR,sBAAZvW,OAIT,AAAC,GAAUwW,OAARtP,IAAI,MAAgB,OAAZsP,aAAiB,SAAM7U,GAAAA,eAAM,EAC7C3B,aAAI,CAACC,IAAI,CAAC9B,cAAM,CAACyD,WAAW,CAAEP,OAAQ8D,YADxCjG,MAAM,GAA0B,CAAG,0BAGrC,eARA,cASA,SAAOA,eAGmBqX,sBAAAA,IAAIR,gBAAgB,CAAClR,OAAzCxD,OAAoBkV,sBAApBlV,OAAc8D,EAAMoR,sBAAZvW,KACRG,QAAYhC,cAAM,CAAC4C,MAAM,CAACb,IAAI,CAA9BC,YACJkB,OAAOkD,QAAQ,CAAC,WAAhBlD,YACF,SAAM6P,GAAAA,oBAAQ,EAAC/Q,QAAS,SAAOwM,wHACtB,AAAC,GAAUA,OAARzF,IAAI,MAAM,OAAFyF,GAAO,SAAMhL,GAAAA,eAAM,EACnC3B,aAAI,CAACC,IAAI,CAAC9B,cAAM,CAACyD,WAAW,CAAEP,OAAOK,OAAO,CAAC,UAAWiL,GAAIxH,YAD9DjG,MAAM,GAAgB,CAAG,0BAG3B,eAJA,iCAMc,SAAMyC,GAAAA,eAAM,EAAC3B,aAAI,CAACC,IAAI,CAAC9B,cAAM,CAACyD,WAAW,CAAEP,OAAQ8D,YAAjEjG,MAAM,CAACgI,IAAI,CAAG,oCAGhB,SAAOhI,UACT,gBACA,CAAC,WA/BH,SAAO,iBAiCT,iBAEMmU,IAAAA,uBAAN,SAAMA,eAAeoD,SAAiB,4CAC9BvC,WACAwC,cAMAtC,WACAtD,gFARAoD,WAAa1P,4BAAa,CAAC2P,aAAa,CAACsC,WACzCC,cAAgB1W,aAAI,CAACC,IAAI,CAC7B9B,cAAM,CAACC,WAAW,CAClB,OACA,cACA8V,WAAa,OAETE,WAAa,KAAOpU,aAAI,CAACmJ,QAAQ,CAACnI,UAAW0V,eAClC,SAAM,gBAAOtC,2EAAP,sBAAjBtD,SAAW,cAEjB,GAAI,CAACA,QAAQ,CAAC2F,UAAU,CAAE,CACxB,MAAM,IAAI5Q,MAAM,AAAC,qBAA8B,OAAV4Q,WACvC,CACA,SAAO3F,QAAQ,CAAC2F,UAAU,CAACE,QAAQ,CAACF,cACtC,QAEMG,IAAAA,0BAAN,SAAMA,kBAAkBC,QAAwB,kDAcpCC,UAkBJD,eAVEE,0FArBJF,CAAAA,SAASG,QAAQ,GAAK,OAAM,EAA5BH,YACF,SAAO,IAAI,CAACI,aAAa,CAACJ,SAASK,IAAI,cAC9BL,CAAAA,SAASG,QAAQ,GAAK,OAAM,EAA5BH,gBACLA,CAAAA,SAASK,IAAI,GAAKnY,SAAQ,EAA1B8X,WACF,OAAM,IAAIhR,iBACDgR,CAAAA,SAASzP,QAAQ,CAAC3E,MAAM,CAAG,CAAA,EAA3BoU,YAEP,SAAM,IAAI,CAACD,iBAAiB,CAAC,uCACxBC,WACHG,SAAU,oBAHd,SAAO,AACL,cAIAG,KAAK,WAEW,SAAM,IAAI,CAACF,aAAa,CAACJ,SAASK,IAAI,UAAlDJ,UAAY,cAClB,GAAID,SAASK,IAAI,CAACE,QAAQ,GAAK,KAAM,CACnC,SAAOhG,MAAC,CAAC+F,KAAK,CAACL,WAAWM,QAAQ,GACpC,KAAO,CACL,SAAOhG,MAAC,CAAC+F,KAAK,CAACL,WACjB,+CAEOD,CAAAA,SAASG,QAAQ,GAAK,QAAO,EAA7BH,YACG,SAAMA,SAASzP,QAAQ,CAAC4M,MAAM,CACxC,SAAOqD,QAASC,yDACRpY,gFAAS,SAAMmY,gBAAfnY,OAAS,gBACRoY,cAAcJ,IAAI,CAAEtY,IAAI,CAC7B,SAAM,IAAI,CAACgY,iBAAiB,CAACU,uBAD/BpY,MAAM,GAA0B,CAC9B,cACF,SAAOA,UACT,gBACA,CAAC,WAPG6X,IAAM,cAUZ,GAAIF,EAAAA,eAAAA,SAASK,IAAI,UAAbL,+BAAAA,eAAeO,QAAQ,IAAK,KAAM,CACpC,SAAOhG,MAAC,CAACzB,MAAM,CAACoH,KAAKK,QAAQ,GAC/B,KAAO,CACL,SAAOhG,MAAC,CAACzB,MAAM,CAACoH,KAClB,qBAEA,MAAMlR,0BAEV,iBACMoR,IAAAA,sBAAN,SAAMA,cAAcC,IAAgB,4CAC9BK,+EAAAA,QAAwBnG,MAAC,CAACoG,OAAO,OACjCC,GAAAA,oBAAa,EAACP,MAAdO,YACFF,QAAUnG,MAAC,CAACsG,MAAM,GAAGC,GAAG,2BACfC,GAAAA,uBAAgB,EAACV,MAAjBU,YACTL,QAAUnG,MAAC,CAACyG,MAAM,2BACTC,GAAAA,iBAAU,EAACZ,MAAXY,YACTP,QAAUnG,MAAC,CAAC2G,MAAM,GAAGC,GAAG,CAACC,GAAAA,iCAAiB,EAACf,KAAKgB,QAAQ,2BAC/CC,GAAAA,iBAAU,EAACjB,MAAXiB,YACC,SAAM,IAAI,CAAC9E,cAAc,CAAC6D,KAAK3P,EAAE,UAA3CgQ,QAAU,sCACDa,GAAAA,mBAAY,EAAClB,MAAbkB,YACTb,QAAUnG,MAAC,CAAC2G,MAAM,GAAGC,GAAG,CAACd,KAAKzU,MAAM,0BAC3B4V,CAAAA,GAAAA,kBAAW,EAACnB,OAASoB,GAAAA,mBAAY,EAACpB,KAAI,EAAtCmB,YACTd,QAAUnG,MAAC,CAACsG,MAAM,2BACTa,GAAAA,oBAAa,EAACrB,MAAdqB,YACThB,QAAUnG,MAAC,CAAC2G,MAAM,2BACTS,GAAAA,oBAAa,EAACtB,MAAdsB,YACTjB,QAAUnG,MAAC,CAACqH,OAAO,2BACVC,GAAAA,iBAAU,EAACxB,MAAXwB,aACTnB,QAAUnG,MAAC,CAAC2G,MAAM,GAAGtV,MAAM,CAAC,6BACnBkW,GAAAA,iBAAU,EAACzB,MAAXyB,aACTpB,QAAUnG,MAAC,CAAC2G,MAAM,GAAGtV,MAAM,CAAC,4BACnBmW,GAAAA,qBAAc,EAAC1B,MAAf0B,aACTrB,QAAUnG,MAAC,CAACyH,IAAI,4BACPC,GAAAA,sBAAe,EAAC5B,MAAhB4B,aACTvB,QAAUnG,MAAC,CAACyH,IAAI,4BACPE,GAAAA,iBAAU,EAAC7B,MAAX6B,aACC,SAAM,IAAI,CAAC1F,cAAc,CAAC6D,KAAK3P,EAAE,WAA3CgQ,QAAU,uCACDyB,GAAAA,iBAAU,EAAC9B,MAAX8B,aACTzB,QAAUnG,MAAC,CAAC6H,IAAI,4BACPC,GAAAA,oBAAa,EAAChC,MAAdgC,aACC,SAAM,IAAI,CAAC7F,cAAc,CAAC6D,KAAK3P,EAAE,WAA3CgQ,QAAU,mCACL,GAAI4B,GAAAA,qBAAc,EAACjC,MAAO,CAC/B,GACEkC,GAAAA,iCAA0B,EAAClC,OAC1BmC,GAAAA,6BAAsB,EAACnC,OAASA,KAAKoC,aAAa,CACnD,CACA/B,QAAUnG,MAAC,CAACsG,MAAM,GAAGC,GAAG,EAC1B,CACF,KAAO,CACL,MAAM,IAAI9R,MAAM,AAAC,4BAAgC,OAALqR,KAAK,KACnD,yBAEA,GAAI,AAACA,KAAgCqC,QAAQ,CAAE,CAC7ChC,QAAU,AAACA,QAAwBiC,WAAW,EAChD,CACA,GAAItC,KAAKE,QAAQ,CAAE,CACjBG,QAAUA,QAAQH,QAAQ,EAC5B,CAEA,SAAOG,WACT,iBAEAkC,IAAAA,0BAAAA,SAAAA,kBACEvS,GAAW,CACXqQ,OAAqB,EAErB,GAAIA,AAAO,YAAPA,QAAmBnG,MAAC,CAACsI,OAAO,EAAE,CAChC,MAAO,UACT,MAAO,GAAInC,AAAO,YAAPA,QAAmBnG,MAAC,CAACuI,SAAS,EAAE,CACzC,GAAIzS,IAAI3C,QAAQ,CAAC,QAAU2C,IAAI3C,QAAQ,CAAC,SAAU,CAChD,MAAO,cACT,MAAO,GAAIgT,QAAQqC,WAAW,GAAK,oBAAqB,CACtD,MAAO,iBACT,MAAO,GAAI1S,IAAIjG,QAAQ,CAAC,QAAS,CAC/B,MAAO,aACT,KAAO,CACL,MAAO,cACT,CACF,MAAO,GAAIsW,AAAO,YAAPA,QAAmBnG,MAAC,CAACyI,SAAS,EAAE,CACzC,GAAI3S,MAAQ,KAAM,CAChB,MAAO,WACT,MAAO,GAAIA,IAAIjG,QAAQ,CAAC,OAAQ,CAC9B,MAAO,cACT,KAAO,CACL,MAAO,cACT,CACF,MAAO,GAAIsW,AAAO,YAAPA,QAAmBnG,MAAC,CAAC0I,UAAU,EAAE,CAC1C,MAAO,SACT,MAAO,GAAIvC,AAAO,YAAPA,QAAmBnG,MAAC,CAAC2I,OAAO,EAAE,CACvC,MAAO,OACT,MAAO,GAAIxC,AAAO,YAAPA,QAAmBnG,MAAC,CAAC4I,SAAS,EAAE,CACzC,MAAO,QACT,MAAO,GAAIzC,AAAO,YAAPA,QAAmBnG,MAAC,CAAC6I,MAAM,GAAI1C,AAAO,YAAPA,QAAmBnG,MAAC,CAAC8I,UAAU,EAAE,CACzE,MAAO,cACT,MAAO,GAAI3C,AAAO,YAAPA,QAAmBnG,MAAC,CAAC+I,QAAQ,EAAE,CACxC,MAAO,cACT,MAAO,GAAI5C,AAAO,YAAPA,QAAmBnG,MAAC,CAACgJ,UAAU,EAAE,CAC1C,MAAO,cACT,KAAO,CACL,MAAM,IAAIvU,MAAM,AAAC,YAAkB0R,OAAPrQ,IAAI,KAAoB,OAAjBqQ,QAAQ8C,GAAG,CAACxb,IAAI,EACrD,CACF,IAEAyU,IAAAA,+BAAAA,SAAAA,uBACEiE,OAAuB,qBACvB+C,QAAAA,uDAAkB,OAElB,IAAMD,IAAM,CACVzb,KAAM0b,QACNC,MAAO3a,mBAAU,CAACC,QAAQ,CAACya,QAAS,OACpC/C,QAAAA,OACF,EACA,GAAIA,AAAO,YAAPA,QAAmBnG,MAAC,CAACoJ,SAAS,EAAE,CAClC,IAAMC,WAAapW,OAAOC,IAAI,CAACiT,QAAQmD,KAAK,EAC5C,IAAMtT,SAAWqT,WAAWrZ,GAAG,CAAC,SAAC8F,KAC/B,IAAM4P,UAAYS,QAAQmD,KAAK,CAACxT,IAAI,CACpC,OAAO,MAAKoM,sBAAsB,CAACwD,UAAW5P,IAChD,GACA,OAAO,uCACFmT,MACHM,WAAY,SACZvT,SAAAA,UAEJ,MAAO,GAAImQ,AAAO,YAAPA,QAAmBnG,MAAC,CAACwJ,QAAQ,EAAE,CACxC,IAAM9D,UAAY,AAACS,QAAuC8C,GAAG,CAACQ,OAAO,CACrE,GAAI/D,AAAS,YAATA,UAAqB1F,MAAC,CAACuI,SAAS,GAAIW,QAAQ/V,QAAQ,CAAC,UAAW,CAClE,OAAO,uCACF8V,MACHM,WAAY,gBAEhB,CACA,OAAO,uCACFN,MACHM,WAAY,QACZE,QAAS,IAAI,CAACvH,sBAAsB,CAACwD,UAAWwD,UAEpD,MAAO,GAAI/C,AAAO,YAAPA,QAAmBnG,MAAC,CAAC+I,QAAQ,EAAE,CACxC,IAAMW,YAAc,AAACvD,QAAoC8C,GAAG,CAAC3H,OAAO,CAACtR,GAAG,CAAC,SAAC2Z,YACxE,MAAKzH,sBAAsB,CAACyH,IAAKT,WAGnC,OAAOQ,WAAW,CAAC,EAAE,AACvB,MAAO,GAAIvD,AAAO,YAAPA,QAAmBnG,MAAC,CAAC4J,WAAW,EAAE,CAC3C,OAAO,uCACF,IAAI,CAAC1H,sBAAsB,CAAC,AAACiE,QAAqC8C,GAAG,CAACvD,SAAS,CAAEwD,WACpFjb,SAAU,MAEd,MAAO,GAAIkY,AAAO,YAAPA,QAAmBnG,MAAC,CAAC6J,WAAW,EAAE,CAC3C,OAAO,uCACF,IAAI,CAAC3H,sBAAsB,CAAC,AAACiE,QAAqC8C,GAAG,CAACvD,SAAS,CAAEwD,WACpFlD,SAAU,MAEd,KAAO,CACL,OAAO,uCACFiD,MACHM,WAAY,IAAI,CAAClB,iBAAiB,CAACa,QAAS/C,UAEhD,CACF,IAEMnE,IAAAA,uBAAN,SAAMA,eACJvP,QAAgB,CAChBqX,SAAiB,4CAEXhd,OACAid,QAIAC,UACAC,aAKAC,eAIAzI,mFAfA3U,OAASsG,4BAAa,CAACI,GAAG,CAACf,UAC3BsX,QAAUjd,OAAOqd,OAAO,CAACL,UAAU,CACzC,GAAIC,UAAYpc,UAAW,CACzB,MAAM,IAAIyc,yCAA2B,CAAC,kBACxC,CACMJ,UAAYld,OAAOud,qBAAqB,CAACN,SACzCE,aAA+B,CACnCrE,SAAU,SACV5P,SAAUgU,SACZ,EAEwB,SAAM,IAAI,CAACxE,iBAAiB,CAClDyE,sBADIC,eAAkB,cAIlBzI,YAAc,IAAI,CAACS,sBAAsB,CAACgI,eAChDzI,CAAAA,YAAYzL,QAAQ,CAAGyL,YAAYzL,QAAQ,CAAEhG,GAAG,CAAC,SAACkG,OAChD,GAAIA,MAAMqT,UAAU,GAAK,SAAU,CACjC,IAAMe,UAAYpU,MAAMF,QAAQ,CAAEgG,IAAI,CAAC,SAACuO,UACtC,CAAC,QAAS,OAAO,CAACpX,QAAQ,CAACoX,GAAG/c,IAAI,IAEpC,GAAI8c,UAAW,CACb,OAAO,uCACFpU,QACHqT,WAAY,cACZ5Z,OAAQ,CACN6a,OAAQF,UAAU9c,IAAI,AACxB,GAEJ,KAAO,CACL,OAAO0I,KACT,CACF,MAAO,GACLA,MAAMqT,UAAU,GAAK,SACrBrT,MAAMuT,OAAO,EACbvT,MAAMuT,OAAO,CAACF,UAAU,GAAK,SAC7B,CACA,IAAMe,WAAYpU,MAAMuT,OAAO,CAAEzT,QAAQ,CAAEgG,IAAI,CAAC,SAACuO,UAC/C,CAAC,QAAS,OAAO,CAACpX,QAAQ,CAACoX,GAAG/c,IAAI,IAEpC,GAAI8c,WAAW,CACb,OAAO,uCACFpU,QACHuT,QAAS,uCACJvT,MAAMuT,OAAO,GAChBF,WAAY,cACZ5Z,OAAQ,CACN6a,OAAQF,WAAU9c,IAAI,AACxB,KAGN,KAAO,CACL,OAAO0I,KACT,CACF,CACA,OAAOA,KACT,GAEA,SAAOuL,eACT,iBAEMgJ,IAAAA,qBAAN,SAAMA,aACJC,IAAmE,+GAEnE,GAAI,CAAC,sBAAsBC,IAAI,CAACD,KAAKjY,QAAQ,EAAG,CAC9C,MAAM,IAAI2O,iCAAmB,CAAC,iCAChC,CAEA,SAAM,IAAI,CAACxN,gBAAgB,CAAC,SAAU8W,cAAtC,cAGA,SAAMtX,4BAAa,CAACC,MAAM,WAA1B,0BAeF,iBAEMuX,IAAAA,kBAAN,SAAMA,UAAUnY,QAAgB,4CACxB3F,OAEA+d,2FAkBWC,mFApBXhe,OAASsG,4BAAa,CAACI,GAAG,CAACf,UAE3BoY,SAAW,AAAC,WAChB,GAAI/d,OAAO6G,QAAQ,CAAE,CACnB,MAAO,CACL,AAAC,GAAwC7G,OAAtCC,cAAM,CAACC,WAAW,CAAC,qBAA4CF,OAAzBA,OAAO2G,KAAK,CAACsX,QAAQ,CAAC,KAAmB,OAAhBje,OAAO2G,KAAK,CAACC,EAAE,CAAC,gBACnF,AACH,KAAO,CACL,MAAO,CACL,AAAC,GAAwC5G,OAAtCC,cAAM,CAACC,WAAW,CAAC,qBAAmC,OAAhBF,OAAO2G,KAAK,CAACC,EAAE,EACxD,AAAC,GAAyC5G,OAAvCC,cAAM,CAACC,WAAW,CAAC,sBAAoC,OAAhBF,OAAO2G,KAAK,CAACC,EAAE,EAM1D,CARM,OAGL,qBAAG3G,cAAM,CAAC4C,MAAM,CAACb,IAAI,CAACC,OAAO,CAC1BiB,GAAG,CAAC,SAACC,cAAW,CACf,AAAC,GAAwBA,OAAtBlD,cAAM,CAACyD,WAAW,CAAC,KAA0B1D,OAAvBmD,OAAO,kBAAgC,OAAhBnD,OAAO2G,KAAK,CAACC,EAAE,EAChE,GACA0E,IAAI,IAEX,CACF,0IAE4ByS,6JAAXC,eACX,SAAMva,GAAAA,eAAM,EAACua,qBAAb,cAAA,YACFld,QAAQgD,GAAG,CAACC,cAAK,CAACma,GAAG,CAAC,AAAC,UAAiB,OAARF,WAChC,SAAMG,GAAAA,YAAE,EAACH,QAAS,CAAEtT,UAAW,KAAM0T,MAAO,IAAK,WAAjD,iCAEAtd,QAAQgD,GAAG,CAACC,cAAK,CAACsa,MAAM,CAAC,AAAC,cAAqB,OAARL,2cAK3C,SAAM1X,4BAAa,CAACC,MAAM,YAA1B,cAEA,SAAO,CAAEwX,SAAAA,QAAS,KACpB,QAEA5S,IAAAA,eAAAA,SAAAA,aACiBlL,sBAAAA,uBAAf,IAAMqe,OAASre,CAAAA,wBAAAA,kBAAAA,cAAM,CAAC4C,MAAM,CAAC0b,EAAE,UAAhBte,kCAAAA,kBAAkBue,IAAI,UAAtBve,gCAAAA,uBAA0B,KAEzCwe,MAAM,AAAC,oBAA0B,OAAPH,OAAO,eAAc,CAC7CnP,OAAQ,KACV,GAAGuP,KAAK,CAAC,SAACC,UACR7d,QAAQgD,GAAG,CAACC,cAAK,CAAC6a,GAAG,CAAC,AAAC,+BAAwC,OAAVD,EAAEE,OAAO,KAElE,YAl/CWnf"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { TemplateKey, TemplateOptions } from "../types/types";
|
|
2
|
-
import { EntityNamesRecord } from "../entity/entity-manager";
|
|
3
|
-
import { RenderedTemplate } from "../syncer/syncer";
|
|
4
|
-
export declare abstract class Template {
|
|
5
|
-
key: TemplateKey;
|
|
6
|
-
constructor(key: TemplateKey);
|
|
7
|
-
abstract render(options: TemplateOptions[TemplateKey], ...extra: unknown[]): RenderedTemplate | Promise<RenderedTemplate>;
|
|
8
|
-
abstract getTargetAndPath(names?: EntityNamesRecord, ...extra: unknown[]): {
|
|
9
|
-
target: string;
|
|
10
|
-
path: string;
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=base-template.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base-template.d.ts","sourceRoot":"","sources":["../../src/templates/base-template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,8BAAsB,QAAQ;IACT,GAAG,EAAE,WAAW;gBAAhB,GAAG,EAAE,WAAW;aACnB,MAAM,CACpB,OAAO,EAAE,eAAe,CAAC,WAAW,CAAC,EACrC,GAAG,KAAK,EAAE,OAAO,EAAE,GAClB,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;aAE/B,gBAAgB,CAC9B,KAAK,CAAC,EAAE,iBAAiB,EACzB,GAAG,KAAK,EAAE,OAAO,EAAE,GAClB;QACD,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd;CACF"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"Template",{enumerable:true,get:function(){return Template}});function _class_call_check(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}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}var Template=function Template(key){"use strict";_class_call_check(this,Template);_define_property(this,"key",void 0);this.key=key};
|
|
2
|
-
//# sourceMappingURL=base-template.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/templates/base-template.ts"],"sourcesContent":["import { TemplateKey, TemplateOptions } from \"../types/types\";\nimport { EntityNamesRecord } from \"../entity/entity-manager\";\nimport { RenderedTemplate } from \"../syncer/syncer\";\n\nexport abstract class Template {\n constructor(public key: TemplateKey) {}\n public abstract render(\n options: TemplateOptions[TemplateKey],\n ...extra: unknown[]\n ): RenderedTemplate | Promise<RenderedTemplate>;\n\n public abstract getTargetAndPath(\n names?: EntityNamesRecord,\n ...extra: unknown[]\n ): {\n target: string;\n path: string;\n };\n}\n"],"names":["Template","key"],"mappings":"oGAIsBA,kDAAAA,kVAAf,IAAA,AAAeA,SAAf,SAAeA,SACR,AAAOC,GAAgB,sCADfD,mDACDC,IAAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"entity.template.d.ts","sourceRoot":"","sources":["../../src/templates/entity.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;AAG3C,qBAAa,gBAAiB,SAAQ,QAAQ;;IAK5C,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,EAAE,WAAW,CAAC,EAAE,iBAAiB;;;;IAS1E,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,QAAQ,CAAC;;;;;;CAoE1C"}
|