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
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { Sonamu } from "../api/sonamu.js";
|
|
3
|
+
import { AlreadyProcessedException } from "../exceptions/so-exceptions.js";
|
|
4
|
+
import { everyAsync, filterAsync } from "../utils/async-utils.js";
|
|
5
|
+
import { exists } from "../utils/fs-utils.js";
|
|
6
|
+
import chalk from "chalk";
|
|
7
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
8
|
+
import * as _ from "lodash-es";
|
|
9
|
+
import { Template } from "../template/template.js";
|
|
10
|
+
import { EntityManager } from "../entity/entity-manager.js";
|
|
11
|
+
import { wrapIf } from "../utils/lodash-able.js";
|
|
12
|
+
import prettier from "prettier";
|
|
13
|
+
/**
|
|
14
|
+
* 템플릿을 렌더링하고 파일로 생성합니다.
|
|
15
|
+
* overwrite 옵션이 false인 경우, 이미 존재하는 파일은 건너뜁니다.
|
|
16
|
+
* @param key - 템플릿 키 (예: "entity", "model", "service" 등)
|
|
17
|
+
* @param templateOptions - 템플릿 렌더링에 필요한 옵션
|
|
18
|
+
* @param _generateOptions - 생성 옵션 (overwrite 여부)
|
|
19
|
+
* @returns 생성된 파일 경로 배열
|
|
20
|
+
*/ export async function generateTemplate(key, templateOptions, _generateOptions) {
|
|
21
|
+
const generateOptions = {
|
|
22
|
+
overwrite: false,
|
|
23
|
+
..._generateOptions
|
|
24
|
+
};
|
|
25
|
+
// 키 children
|
|
26
|
+
const keys = [
|
|
27
|
+
key
|
|
28
|
+
];
|
|
29
|
+
// 템플릿 렌더
|
|
30
|
+
const pathAndCodes = (await Promise.all(keys.map(async (key)=>{
|
|
31
|
+
return await renderTemplate(key, templateOptions);
|
|
32
|
+
}))).flat();
|
|
33
|
+
const filteredPathAndCodes = await (async ()=>{
|
|
34
|
+
if (generateOptions.overwrite === true) {
|
|
35
|
+
return pathAndCodes;
|
|
36
|
+
} else {
|
|
37
|
+
return await filterAsync(pathAndCodes, async (pathAndCode)=>{
|
|
38
|
+
const { targets } = Sonamu.config.sync;
|
|
39
|
+
const filePath = `${Sonamu.appRootPath}/${pathAndCode.path}`;
|
|
40
|
+
const dstFilePaths = targets.map((target)=>filePath.replace("/:target/", `/${target}/`));
|
|
41
|
+
return await everyAsync(dstFilePaths, async (dstPath)=>!await exists(dstPath));
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
})();
|
|
45
|
+
if (filteredPathAndCodes.length === 0) {
|
|
46
|
+
throw new AlreadyProcessedException("이미 경로에 모든 파일이 존재합니다.");
|
|
47
|
+
}
|
|
48
|
+
return (await Promise.all(filteredPathAndCodes.map((pathAndCode)=>writeCodeToPathEachTarget(pathAndCode)))).flat();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 템플릿을 렌더링하여 PathAndCode 객체를 반환합니다.
|
|
52
|
+
* 파일로 쓰지 않고 메모리상에서만 렌더링합니다.
|
|
53
|
+
* @param key - 템플릿 키
|
|
54
|
+
* @param options - 템플릿 렌더링 옵션
|
|
55
|
+
* @returns 경로와 코드 쌍의 배열
|
|
56
|
+
*/ export async function renderTemplate(key, options) {
|
|
57
|
+
const template = Template.find(key);
|
|
58
|
+
const rendered = await template.render(options);
|
|
59
|
+
const resolved = await resolveRenderedTemplate(key, rendered);
|
|
60
|
+
let preTemplateResolved = [];
|
|
61
|
+
if (rendered.preTemplates) {
|
|
62
|
+
preTemplateResolved = (await Promise.all(rendered.preTemplates.map(({ key, options })=>{
|
|
63
|
+
return renderTemplate(key, options);
|
|
64
|
+
}))).flat();
|
|
65
|
+
}
|
|
66
|
+
return [
|
|
67
|
+
resolved,
|
|
68
|
+
...preTemplateResolved
|
|
69
|
+
];
|
|
70
|
+
}
|
|
71
|
+
async function resolveRenderedTemplate(key, result) {
|
|
72
|
+
const { target, path: filePath, body, importKeys, customHeaders } = result;
|
|
73
|
+
// import 할 대상의 대상 path 추출
|
|
74
|
+
const importDefs = importKeys.reduce((r, importKey)=>{
|
|
75
|
+
const modulePath = EntityManager.getModulePath(importKey);
|
|
76
|
+
let importPath = modulePath;
|
|
77
|
+
if (modulePath.includes("/") || modulePath.includes(".")) {
|
|
78
|
+
importPath = wrapIf(path.relative(path.dirname(filePath), modulePath), (p)=>[
|
|
79
|
+
p.startsWith(".") === false,
|
|
80
|
+
"./" + p
|
|
81
|
+
]);
|
|
82
|
+
}
|
|
83
|
+
// 같은 파일에서 import 하는 경우 keys 로 나열 처리
|
|
84
|
+
const existsOne = r.find((importDef)=>importDef.from === importPath);
|
|
85
|
+
if (existsOne) {
|
|
86
|
+
existsOne.keys = _.uniq(existsOne.keys.concat(importKey));
|
|
87
|
+
} else {
|
|
88
|
+
r.push({
|
|
89
|
+
keys: [
|
|
90
|
+
importKey
|
|
91
|
+
],
|
|
92
|
+
from: importPath
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return r;
|
|
96
|
+
}, [])// 셀프 참조 방지
|
|
97
|
+
.filter((importDef)=>filePath.endsWith(importDef.from.replace("./", "") + ".ts") === false);
|
|
98
|
+
// 커스텀 헤더 포함하여 헤더 생성
|
|
99
|
+
const header = [
|
|
100
|
+
...customHeaders ?? [],
|
|
101
|
+
...importDefs.map((importDef)=>`import { ${importDef.keys.join(", ")} } from '${importDef.from}'`)
|
|
102
|
+
].join("\n");
|
|
103
|
+
const formatted = await (async ()=>{
|
|
104
|
+
if (key === "generated_http") {
|
|
105
|
+
return [
|
|
106
|
+
header,
|
|
107
|
+
body
|
|
108
|
+
].join("\n\n");
|
|
109
|
+
} else {
|
|
110
|
+
return prettier.format([
|
|
111
|
+
header,
|
|
112
|
+
body
|
|
113
|
+
].join("\n\n"), {
|
|
114
|
+
parser: key === "entity" ? "json" : "typescript"
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
})();
|
|
118
|
+
return {
|
|
119
|
+
path: target + "/" + filePath,
|
|
120
|
+
code: formatted
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
async function writeCodeToPathEachTarget(pathAndCode) {
|
|
124
|
+
const { targets } = Sonamu.config.sync;
|
|
125
|
+
const { appRootPath } = Sonamu;
|
|
126
|
+
const filePath = `${Sonamu.appRootPath}/${pathAndCode.path}`;
|
|
127
|
+
const dstFilePaths = _.uniq(targets.map((target)=>filePath.replace("/:target/", `/${target}/`)));
|
|
128
|
+
return await Promise.all(dstFilePaths.map(async (dstFilePath)=>{
|
|
129
|
+
const dir = path.dirname(dstFilePath);
|
|
130
|
+
if (!await exists(dir)) {
|
|
131
|
+
await mkdir(dir, {
|
|
132
|
+
recursive: true
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
await writeFile(dstFilePath, pathAndCode.code);
|
|
136
|
+
console.log(chalk.bold("Generated: ") + chalk.blue(`${dstFilePath.replace(appRootPath + "/", "")}`));
|
|
137
|
+
return dstFilePath;
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvY29kZS1nZW5lcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBBbHJlYWR5UHJvY2Vzc2VkRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHtcbiAgR2VuZXJhdGVPcHRpb25zLFxuICBQYXRoQW5kQ29kZSxcbiAgVGVtcGxhdGVLZXksXG4gIFRlbXBsYXRlT3B0aW9ucyxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBldmVyeUFzeW5jLCBmaWx0ZXJBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBta2Rpciwgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgKiBhcyBfIGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBSZW5kZXJlZFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgd3JhcElmIH0gZnJvbSBcIi4uL3V0aWxzL2xvZGFzaC1hYmxlXCI7XG5pbXBvcnQgcHJldHRpZXIgZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgeyBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuXG4vKipcbiAqIO2FnO2UjOumv+ydhCDroIzrjZTrp4HtlZjqs6Ag7YyM7J2866GcIOyDneyEse2VqeuLiOuLpC5cbiAqIG92ZXJ3cml0ZSDsmLXshZjsnbQgZmFsc2Xsnbgg6rK97JqwLCDsnbTrr7gg7KG07J6s7ZWY64qUIO2MjOydvOydgCDqsbTrhIjrnIHri4jri6QuXG4gKiBAcGFyYW0ga2V5IC0g7YWc7ZSM66a/IO2CpCAo7JiIOiBcImVudGl0eVwiLCBcIm1vZGVsXCIsIFwic2VydmljZVwiIOuTsSlcbiAqIEBwYXJhbSB0ZW1wbGF0ZU9wdGlvbnMgLSDthZztlIzrpr8g66CM642U66eB7JeQIO2VhOyalO2VnCDsmLXshZhcbiAqIEBwYXJhbSBfZ2VuZXJhdGVPcHRpb25zIC0g7IOd7ISxIOyYteyFmCAob3ZlcndyaXRlIOyXrOu2gClcbiAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUZW1wbGF0ZShcbiAga2V5OiBUZW1wbGF0ZUtleSxcbiAgdGVtcGxhdGVPcHRpb25zOiBhbnksXG4gIF9nZW5lcmF0ZU9wdGlvbnM/OiBHZW5lcmF0ZU9wdGlvbnNcbik6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgY29uc3QgZ2VuZXJhdGVPcHRpb25zID0ge1xuICAgIG92ZXJ3cml0ZTogZmFsc2UsXG4gICAgLi4uX2dlbmVyYXRlT3B0aW9ucyxcbiAgfTtcblxuICAvLyDtgqQgY2hpbGRyZW5cbiAgY29uc3Qga2V5czogVGVtcGxhdGVLZXlbXSA9IFtrZXldO1xuXG4gIC8vIO2FnO2UjOumvyDroIzrjZRcbiAgY29uc3QgcGF0aEFuZENvZGVzID0gKFxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAga2V5cy5tYXAoYXN5bmMgKGtleSkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVuZGVyVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMpO1xuICAgICAgfSlcbiAgICApXG4gICkuZmxhdCgpO1xuXG4gIGNvbnN0IGZpbHRlcmVkUGF0aEFuZENvZGVzOiBQYXRoQW5kQ29kZVtdID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICBpZiAoZ2VuZXJhdGVPcHRpb25zLm92ZXJ3cml0ZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHBhdGhBbmRDb2RlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGF3YWl0IGZpbHRlckFzeW5jKHBhdGhBbmRDb2RlcywgYXN5bmMgKHBhdGhBbmRDb2RlKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGAke1NvbmFtdS5hcHBSb290UGF0aH0vJHtwYXRoQW5kQ29kZS5wYXRofWA7XG4gICAgICAgIGNvbnN0IGRzdEZpbGVQYXRocyA9IHRhcmdldHMubWFwKCh0YXJnZXQpID0+XG4gICAgICAgICAgZmlsZVBhdGgucmVwbGFjZShcIi86dGFyZ2V0L1wiLCBgLyR7dGFyZ2V0fS9gKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gYXdhaXQgZXZlcnlBc3luYyhcbiAgICAgICAgICBkc3RGaWxlUGF0aHMsXG4gICAgICAgICAgYXN5bmMgKGRzdFBhdGgpID0+ICEoYXdhaXQgZXhpc3RzKGRzdFBhdGgpKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICB9KSgpO1xuICBcbiAgaWYgKGZpbHRlcmVkUGF0aEFuZENvZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBBbHJlYWR5UHJvY2Vzc2VkRXhjZXB0aW9uKFwi7J2066+4IOqyveuhnOyXkCDrqqjrk6Ag7YyM7J287J20IOyhtOyerO2VqeuLiOuLpC5cIik7XG4gIH1cblxuICByZXR1cm4gKGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGZpbHRlcmVkUGF0aEFuZENvZGVzLm1hcCgocGF0aEFuZENvZGUpID0+IHdyaXRlQ29kZVRvUGF0aEVhY2hUYXJnZXQocGF0aEFuZENvZGUpKVxuICApKS5mbGF0KCk7XG59XG5cbi8qKlxuICog7YWc7ZSM66a/7J2EIOugjOuNlOunge2VmOyXrCBQYXRoQW5kQ29kZSDqsJ3ssrTrpbwg67CY7ZmY7ZWp64uI64ukLlxuICog7YyM7J2866GcIOyTsOyngCDslYrqs6Ag66mU66qo66as7IOB7JeQ7ISc66eMIOugjOuNlOunge2VqeuLiOuLpC5cbiAqIEBwYXJhbSBrZXkgLSDthZztlIzrpr8g7YKkXG4gKiBAcGFyYW0gb3B0aW9ucyAtIO2FnO2UjOumvyDroIzrjZTrp4Eg7Ji17IWYXG4gKiBAcmV0dXJucyDqsr3roZzsmYAg7L2U65OcIOyMjeydmCDrsLDsl7RcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlclRlbXBsYXRlPFQgZXh0ZW5kcyBrZXlvZiBUZW1wbGF0ZU9wdGlvbnM+KFxuICBrZXk6IFQsXG4gIG9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXVxuKTogUHJvbWlzZTxQYXRoQW5kQ29kZVtdPiB7XG4gIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZmluZChrZXkpO1xuXG4gIGNvbnN0IHJlbmRlcmVkID0gYXdhaXQgdGVtcGxhdGUucmVuZGVyKG9wdGlvbnMpO1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlc29sdmVSZW5kZXJlZFRlbXBsYXRlKGtleSwgcmVuZGVyZWQpO1xuXG4gIGxldCBwcmVUZW1wbGF0ZVJlc29sdmVkOiBQYXRoQW5kQ29kZVtdID0gW107XG4gIGlmIChyZW5kZXJlZC5wcmVUZW1wbGF0ZXMpIHtcbiAgICBwcmVUZW1wbGF0ZVJlc29sdmVkID0gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHJlbmRlcmVkLnByZVRlbXBsYXRlcy5tYXAoKHsga2V5LCBvcHRpb25zIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVuZGVyVGVtcGxhdGUoa2V5LCBvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApLmZsYXQoKTtcbiAgfVxuXG4gIHJldHVybiBbcmVzb2x2ZWQsIC4uLnByZVRlbXBsYXRlUmVzb2x2ZWRdO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlUmVuZGVyZWRUZW1wbGF0ZShcbiAga2V5OiBUZW1wbGF0ZUtleSxcbiAgcmVzdWx0OiBSZW5kZXJlZFRlbXBsYXRlXG4pOiBQcm9taXNlPFBhdGhBbmRDb2RlPiB7XG4gIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBmaWxlUGF0aCwgYm9keSwgaW1wb3J0S2V5cywgY3VzdG9tSGVhZGVycyB9ID0gcmVzdWx0O1xuXG4gIC8vIGltcG9ydCDtlaAg64yA7IOB7J2YIOuMgOyDgSBwYXRoIOy2lOy2nFxuICBjb25zdCBpbXBvcnREZWZzID0gaW1wb3J0S2V5c1xuICAgIC5yZWR1Y2UoXG4gICAgICAociwgaW1wb3J0S2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IG1vZHVsZVBhdGggPSBFbnRpdHlNYW5hZ2VyLmdldE1vZHVsZVBhdGgoaW1wb3J0S2V5KTtcbiAgICAgICAgbGV0IGltcG9ydFBhdGggPSBtb2R1bGVQYXRoO1xuICAgICAgICBpZiAobW9kdWxlUGF0aC5pbmNsdWRlcyhcIi9cIikgfHwgbW9kdWxlUGF0aC5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgICAgICBpbXBvcnRQYXRoID0gd3JhcElmKFxuICAgICAgICAgICAgcGF0aC5yZWxhdGl2ZShwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCBtb2R1bGVQYXRoKSxcbiAgICAgICAgICAgIChwKSA9PiBbcC5zdGFydHNXaXRoKFwiLlwiKSA9PT0gZmFsc2UsIFwiLi9cIiArIHBdXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOqwmeydgCDtjIzsnbzsl5DshJwgaW1wb3J0IO2VmOuKlCDqsr3smrAga2V5cyDroZwg64KY7Je0IOyymOumrFxuICAgICAgICBjb25zdCBleGlzdHNPbmUgPSByLmZpbmQoKGltcG9ydERlZikgPT4gaW1wb3J0RGVmLmZyb20gPT09IGltcG9ydFBhdGgpO1xuICAgICAgICBpZiAoZXhpc3RzT25lKSB7XG4gICAgICAgICAgZXhpc3RzT25lLmtleXMgPSBfLnVuaXEoZXhpc3RzT25lLmtleXMuY29uY2F0KGltcG9ydEtleSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHIucHVzaCh7XG4gICAgICAgICAgICBrZXlzOiBbaW1wb3J0S2V5XSxcbiAgICAgICAgICAgIGZyb206IGltcG9ydFBhdGgsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LFxuICAgICAgW10gYXMge1xuICAgICAgICBrZXlzOiBzdHJpbmdbXTtcbiAgICAgICAgZnJvbTogc3RyaW5nO1xuICAgICAgfVtdXG4gICAgKVxuICAgIC8vIOyFgO2UhCDssLjsobAg67Cp7KeAXG4gICAgLmZpbHRlcihcbiAgICAgIChpbXBvcnREZWYpID0+XG4gICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKGltcG9ydERlZi5mcm9tLnJlcGxhY2UoXCIuL1wiLCBcIlwiKSArIFwiLnRzXCIpID09PSBmYWxzZVxuICAgICk7XG5cbiAgLy8g7Luk7Iqk7YWAIO2XpOuNlCDtj6ztlajtlZjsl6wg7Zek642UIOyDneyEsVxuICBjb25zdCBoZWFkZXIgPSBbXG4gICAgLi4uKGN1c3RvbUhlYWRlcnMgPz8gW10pLFxuICAgIC4uLmltcG9ydERlZnMubWFwKFxuICAgICAgKGltcG9ydERlZikgPT5cbiAgICAgICAgYGltcG9ydCB7ICR7aW1wb3J0RGVmLmtleXMuam9pbihcIiwgXCIpfSB9IGZyb20gJyR7aW1wb3J0RGVmLmZyb219J2BcbiAgICApLFxuICBdLmpvaW4oXCJcXG5cIik7XG5cbiAgY29uc3QgZm9ybWF0dGVkID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICBpZiAoa2V5ID09PSBcImdlbmVyYXRlZF9odHRwXCIpIHtcbiAgICAgIHJldHVybiBbaGVhZGVyLCBib2R5XS5qb2luKFwiXFxuXFxuXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJldHRpZXIuZm9ybWF0KFtoZWFkZXIsIGJvZHldLmpvaW4oXCJcXG5cXG5cIiksIHtcbiAgICAgICAgcGFyc2VyOiBrZXkgPT09IFwiZW50aXR5XCIgPyBcImpzb25cIiA6IFwidHlwZXNjcmlwdFwiLFxuICAgICAgfSk7XG4gICAgfVxuICB9KSgpO1xuXG4gIHJldHVybiB7XG4gICAgcGF0aDogdGFyZ2V0ICsgXCIvXCIgKyBmaWxlUGF0aCxcbiAgICBjb2RlOiBmb3JtYXR0ZWQsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ29kZVRvUGF0aEVhY2hUYXJnZXQoXG4gIHBhdGhBbmRDb2RlOiBQYXRoQW5kQ29kZVxuKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgY29uc3QgeyBhcHBSb290UGF0aCB9ID0gU29uYW11O1xuICBjb25zdCBmaWxlUGF0aCA9IGAke1NvbmFtdS5hcHBSb290UGF0aH0vJHtwYXRoQW5kQ29kZS5wYXRofWAgYXMgQWJzb2x1dGVQYXRoO1xuXG4gIGNvbnN0IGRzdEZpbGVQYXRocyA9IF8udW5pcShcbiAgICB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PlxuICAgICAgZmlsZVBhdGgucmVwbGFjZShcIi86dGFyZ2V0L1wiLCBgLyR7dGFyZ2V0fS9gKVxuICAgICkgYXMgQWJzb2x1dGVQYXRoW11cbiAgKTtcbiAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGRzdEZpbGVQYXRocy5tYXAoYXN5bmMgKGRzdEZpbGVQYXRoKSA9PiB7XG4gICAgICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZHN0RmlsZVBhdGgpO1xuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKGRpcikpKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZHN0RmlsZVBhdGgsIHBhdGhBbmRDb2RlLmNvZGUpO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmJvbGQoXCJHZW5lcmF0ZWQ6IFwiKSArXG4gICAgICAgICAgY2hhbGsuYmx1ZShgJHtkc3RGaWxlUGF0aC5yZXBsYWNlKGFwcFJvb3RQYXRoICsgXCIvXCIsIFwiXCIpfWApXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRzdEZpbGVQYXRoO1xuICAgIH0pXG4gICk7XG59XG4iXSwibmFtZXMiOlsicGF0aCIsIlNvbmFtdSIsIkFscmVhZHlQcm9jZXNzZWRFeGNlcHRpb24iLCJldmVyeUFzeW5jIiwiZmlsdGVyQXN5bmMiLCJleGlzdHMiLCJjaGFsayIsIm1rZGlyIiwid3JpdGVGaWxlIiwiXyIsIlRlbXBsYXRlIiwiRW50aXR5TWFuYWdlciIsIndyYXBJZiIsInByZXR0aWVyIiwiZ2VuZXJhdGVUZW1wbGF0ZSIsImtleSIsInRlbXBsYXRlT3B0aW9ucyIsIl9nZW5lcmF0ZU9wdGlvbnMiLCJnZW5lcmF0ZU9wdGlvbnMiLCJvdmVyd3JpdGUiLCJrZXlzIiwicGF0aEFuZENvZGVzIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsInJlbmRlclRlbXBsYXRlIiwiZmxhdCIsImZpbHRlcmVkUGF0aEFuZENvZGVzIiwicGF0aEFuZENvZGUiLCJ0YXJnZXRzIiwiY29uZmlnIiwic3luYyIsImZpbGVQYXRoIiwiYXBwUm9vdFBhdGgiLCJkc3RGaWxlUGF0aHMiLCJ0YXJnZXQiLCJyZXBsYWNlIiwiZHN0UGF0aCIsImxlbmd0aCIsIndyaXRlQ29kZVRvUGF0aEVhY2hUYXJnZXQiLCJvcHRpb25zIiwidGVtcGxhdGUiLCJmaW5kIiwicmVuZGVyZWQiLCJyZW5kZXIiLCJyZXNvbHZlZCIsInJlc29sdmVSZW5kZXJlZFRlbXBsYXRlIiwicHJlVGVtcGxhdGVSZXNvbHZlZCIsInByZVRlbXBsYXRlcyIsInJlc3VsdCIsImJvZHkiLCJpbXBvcnRLZXlzIiwiY3VzdG9tSGVhZGVycyIsImltcG9ydERlZnMiLCJyZWR1Y2UiLCJyIiwiaW1wb3J0S2V5IiwibW9kdWxlUGF0aCIsImdldE1vZHVsZVBhdGgiLCJpbXBvcnRQYXRoIiwiaW5jbHVkZXMiLCJyZWxhdGl2ZSIsImRpcm5hbWUiLCJwIiwic3RhcnRzV2l0aCIsImV4aXN0c09uZSIsImltcG9ydERlZiIsImZyb20iLCJ1bmlxIiwiY29uY2F0IiwicHVzaCIsImZpbHRlciIsImVuZHNXaXRoIiwiaGVhZGVyIiwiam9pbiIsImZvcm1hdHRlZCIsImZvcm1hdCIsInBhcnNlciIsImNvZGUiLCJkc3RGaWxlUGF0aCIsImRpciIsInJlY3Vyc2l2ZSIsImNvbnNvbGUiLCJsb2ciLCJib2xkIiwiYmx1ZSJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsVUFBVSxPQUFPO0FBQ3hCLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FBU0MseUJBQXlCLFFBQVEsaUNBQThCO0FBT3hFLFNBQVNDLFVBQVUsRUFBRUMsV0FBVyxRQUFRLDBCQUF1QjtBQUMvRCxTQUFTQyxNQUFNLFFBQVEsdUJBQW9CO0FBQzNDLE9BQU9DLFdBQVcsUUFBUTtBQUMxQixTQUFTQyxLQUFLLEVBQUVDLFNBQVMsUUFBUSxtQkFBYztBQUMvQyxZQUFZQyxPQUFPLFlBQVk7QUFDL0IsU0FBU0MsUUFBUSxRQUFRLDBCQUF1QjtBQUVoRCxTQUFTQyxhQUFhLFFBQVEsOEJBQTJCO0FBQ3pELFNBQVNDLE1BQU0sUUFBUSwwQkFBdUI7QUFDOUMsT0FBT0MsY0FBYyxXQUFXO0FBR2hDOzs7Ozs7O0NBT0MsR0FDRCxPQUFPLGVBQWVDLGlCQUNwQkMsR0FBZ0IsRUFDaEJDLGVBQW9CLEVBQ3BCQyxnQkFBa0M7SUFFbEMsTUFBTUMsa0JBQWtCO1FBQ3RCQyxXQUFXO1FBQ1gsR0FBR0YsZ0JBQWdCO0lBQ3JCO0lBRUEsYUFBYTtJQUNiLE1BQU1HLE9BQXNCO1FBQUNMO0tBQUk7SUFFakMsU0FBUztJQUNULE1BQU1NLGVBQWUsQUFDbkIsQ0FBQSxNQUFNQyxRQUFRQyxHQUFHLENBQ2ZILEtBQUtJLEdBQUcsQ0FBQyxPQUFPVDtRQUNkLE9BQU8sTUFBTVUsZUFBZVYsS0FBS0M7SUFDbkMsR0FDRixFQUNBVSxJQUFJ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
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { TemplateOptions } from "../types/types";
|
|
2
|
+
/**
|
|
3
|
+
* 새로운 엔티티를 생성합니다.
|
|
4
|
+
* entityId는 반드시 CamelCase 형식이어야 합니다.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createEntity(form: Omit<TemplateOptions["entity"], "title"> & {
|
|
7
|
+
title?: string;
|
|
8
|
+
}): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* 엔티티를 삭제합니다.
|
|
11
|
+
* parentId가 있는 서브 엔티티의 경우 entity.json만 삭제하고,
|
|
12
|
+
* 루트 엔티티의 경우 디렉토리 전체와 타겟 디렉토리를 삭제합니다.
|
|
13
|
+
*/
|
|
14
|
+
export declare function delEntity(entityId: string): Promise<{
|
|
15
|
+
delPaths: string[];
|
|
16
|
+
}>;
|
|
17
|
+
//# sourceMappingURL=entity-operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-operations.d.ts","sourceRoot":"","sources":["../../src/syncer/entity-operations.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKjD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,iBAUpE;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAkCjC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { rm } from "node:fs/promises";
|
|
2
|
+
import { exists } from "../utils/fs-utils.js";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { EntityManager } from "../entity/entity-manager.js";
|
|
5
|
+
import { BadRequestException } from "../exceptions/so-exceptions.js";
|
|
6
|
+
import { Sonamu } from "../api/sonamu.js";
|
|
7
|
+
import { generateTemplate } from "./code-generator.js";
|
|
8
|
+
/**
|
|
9
|
+
* 새로운 엔티티를 생성합니다.
|
|
10
|
+
* entityId는 반드시 CamelCase 형식이어야 합니다.
|
|
11
|
+
*/ export async function createEntity(form) {
|
|
12
|
+
if (!/^[A-Z][a-zA-Z0-9]*$/.test(form.entityId)) {
|
|
13
|
+
throw new BadRequestException("entityId는 CamelCase 형식이어야 합니다.");
|
|
14
|
+
}
|
|
15
|
+
await generateTemplate("entity", form);
|
|
16
|
+
// reload entities
|
|
17
|
+
await EntityManager.reload();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 엔티티를 삭제합니다.
|
|
21
|
+
* parentId가 있는 서브 엔티티의 경우 entity.json만 삭제하고,
|
|
22
|
+
* 루트 엔티티의 경우 디렉토리 전체와 타겟 디렉토리를 삭제합니다.
|
|
23
|
+
*/ export async function delEntity(entityId) {
|
|
24
|
+
const entity = EntityManager.get(entityId);
|
|
25
|
+
const delPaths = (()=>{
|
|
26
|
+
if (entity.parentId) {
|
|
27
|
+
return [
|
|
28
|
+
`${Sonamu.apiRootPath}/src/application/${entity.names.parentFs}/${entity.names.fs}.entity.json`
|
|
29
|
+
];
|
|
30
|
+
} else {
|
|
31
|
+
return [
|
|
32
|
+
`${Sonamu.apiRootPath}/src/application/${entity.names.fs}`,
|
|
33
|
+
`${Sonamu.apiRootPath}/dist/application/${entity.names.fs}`,
|
|
34
|
+
...Sonamu.config.sync.targets.map((target)=>[
|
|
35
|
+
`${Sonamu.appRootPath}/${target}/src/services/${entity.names.fs}`
|
|
36
|
+
]).flat()
|
|
37
|
+
];
|
|
38
|
+
}
|
|
39
|
+
})(); // iife
|
|
40
|
+
for await (const delPath of delPaths){
|
|
41
|
+
if (await exists(delPath)) {
|
|
42
|
+
console.log(chalk.red(`DELETE ${delPath}`));
|
|
43
|
+
await rm(delPath, {
|
|
44
|
+
recursive: true,
|
|
45
|
+
force: true
|
|
46
|
+
});
|
|
47
|
+
} else {
|
|
48
|
+
console.log(chalk.yellow(`NOT_EXISTS ${delPath}`));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// reload entities
|
|
52
|
+
await EntityManager.reload();
|
|
53
|
+
return {
|
|
54
|
+
delPaths
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvZW50aXR5LW9wZXJhdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcm0gfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IFRlbXBsYXRlT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9IGZyb20gXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVRlbXBsYXRlIH0gZnJvbSBcIi4vY29kZS1nZW5lcmF0b3JcIjtcblxuLyoqXG4gKiDsg4jroZzsmrQg7JeU7Yuw7Yuw66W8IOyDneyEse2VqeuLiOuLpC5cbiAqIGVudGl0eUlk64qUIOuwmOuTnOyLnCBDYW1lbENhc2Ug7ZiV7Iud7J207Ja07JW8IO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUVudGl0eShcbiAgZm9ybTogT21pdDxUZW1wbGF0ZU9wdGlvbnNbXCJlbnRpdHlcIl0sIFwidGl0bGVcIj4gJiB7IHRpdGxlPzogc3RyaW5nIH1cbikge1xuICBpZiAoIS9eW0EtWl1bYS16QS1aMC05XSokLy50ZXN0KGZvcm0uZW50aXR5SWQpKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXCJlbnRpdHlJZOuKlCBDYW1lbENhc2Ug7ZiV7Iud7J207Ja07JW8IO2VqeuLiOuLpC5cIik7XG4gIH1cblxuICBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFwiZW50aXR5XCIsIGZvcm0pO1xuXG4gIC8vIHJlbG9hZCBlbnRpdGllc1xuICBhd2FpdCBFbnRpdHlNYW5hZ2VyLnJlbG9hZCgpO1xufVxuXG4vKipcbiAqIOyXlO2LsO2LsOulvCDsgq3soJztlanri4jri6QuXG4gKiBwYXJlbnRJZOqwgCDsnojripQg7ISc67iMIOyXlO2LsO2LsOydmCDqsr3smrAgZW50aXR5Lmpzb27rp4wg7IKt7KCc7ZWY6rOgLFxuICog66Oo7Yq4IOyXlO2LsO2LsOydmCDqsr3smrAg65SU66CJ7Yag66asIOyghOyytOyZgCDtg4Dqsp8g65SU66CJ7Yag66as66W8IOyCreygnO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbEVudGl0eShcbiAgZW50aXR5SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTx7IGRlbFBhdGhzOiBzdHJpbmdbXSB9PiB7XG4gIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcblxuICBjb25zdCBkZWxQYXRocyA9ICgoKSA9PiB7XG4gICAgaWYgKGVudGl0eS5wYXJlbnRJZCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgYCR7U29uYW11LmFwaVJvb3RQYXRofS9zcmMvYXBwbGljYXRpb24vJHtlbnRpdHkubmFtZXMucGFyZW50RnN9LyR7ZW50aXR5Lm5hbWVzLmZzfS5lbnRpdHkuanNvbmAsXG4gICAgICBdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBgJHtTb25hbXUuYXBpUm9vdFBhdGh9L3NyYy9hcHBsaWNhdGlvbi8ke2VudGl0eS5uYW1lcy5mc31gLFxuICAgICAgICBgJHtTb25hbXUuYXBpUm9vdFBhdGh9L2Rpc3QvYXBwbGljYXRpb24vJHtlbnRpdHkubmFtZXMuZnN9YCxcbiAgICAgICAgLi4uU29uYW11LmNvbmZpZy5zeW5jLnRhcmdldHNcbiAgICAgICAgICAubWFwKCh0YXJnZXQpID0+IFtcbiAgICAgICAgICAgIGAke1NvbmFtdS5hcHBSb290UGF0aH0vJHt0YXJnZXR9L3NyYy9zZXJ2aWNlcy8ke2VudGl0eS5uYW1lcy5mc31gLFxuICAgICAgICAgIF0pXG4gICAgICAgICAgLmZsYXQoKSxcbiAgICAgIF07XG4gICAgfVxuICB9KSgpOyAvLyBpaWZlXG5cbiAgZm9yIGF3YWl0IChjb25zdCBkZWxQYXRoIG9mIGRlbFBhdGhzKSB7XG4gICAgaWYgKGF3YWl0IGV4aXN0cyhkZWxQYXRoKSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkKGBERUxFVEUgJHtkZWxQYXRofWApKTtcbiAgICAgIGF3YWl0IHJtKGRlbFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGBOT1RfRVhJU1RTICR7ZGVsUGF0aH1gKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gcmVsb2FkIGVudGl0aWVzXG4gIGF3YWl0IEVudGl0eU1hbmFnZXIucmVsb2FkKCk7XG5cbiAgcmV0dXJuIHsgZGVsUGF0aHMgfTtcbn1cbiJdLCJuYW1lcyI6WyJybSIsImV4aXN0cyIsImNoYWxrIiwiRW50aXR5TWFuYWdlciIsIkJhZFJlcXVlc3RFeGNlcHRpb24iLCJTb25hbXUiLCJnZW5lcmF0ZVRlbXBsYXRlIiwiY3JlYXRlRW50aXR5IiwiZm9ybSIsInRlc3QiLCJlbnRpdHlJZCIsInJlbG9hZCIsImRlbEVudGl0eSIsImVudGl0eSIsImdldCIsImRlbFBhdGhzIiwicGFyZW50SWQiLCJhcGlSb290UGF0aCIsIm5hbWVzIiwicGFyZW50RnMiLCJmcyIsImNvbmZpZyIsInN5bmMiLCJ0YXJnZXRzIiwibWFwIiwidGFyZ2V0IiwiYXBwUm9vdFBhdGgiLCJmbGF0IiwiZGVsUGF0aCIsImNvbnNvbGUiLCJsb2ciLCJyZWQiLCJyZWN1cnNpdmUiLCJmb3JjZSIsInllbGxvdyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsRUFBRSxRQUFRLG1CQUFjO0FBQ2pDLFNBQVNDLE1BQU0sUUFBUSx1QkFBb0I7QUFDM0MsT0FBT0MsV0FBVyxRQUFRO0FBQzFCLFNBQVNDLGFBQWEsUUFBUSw4QkFBMkI7QUFFekQsU0FBU0MsbUJBQW1CLFFBQVEsaUNBQThCO0FBQ2xFLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FBU0MsZ0JBQWdCLFFBQVEsc0JBQW1CO0FBRXBEOzs7Q0FHQyxHQUNELE9BQU8sZUFBZUMsYUFDcEJDLElBQW1FO0lBRW5FLElBQUksQ0FBQyxzQkFBc0JDLElBQUksQ0FBQ0QsS0FBS0UsUUFBUSxHQUFHO1FBQzlDLE1BQU0sSUFBSU4sb0JBQW9CO0lBQ2hDO0lBRUEsTUFBTUUsaUJBQWlCLFVBQVVFO0lBRWpDLGtCQUFrQjtJQUNsQixNQUFNTCxjQUFjUSxNQUFNO0FBQzVCO0FBRUE7Ozs7Q0FJQyxHQUNELE9BQU8sZUFBZUMsVUFDcEJGLFFBQWdCO0lBRWhCLE1BQU1HLFNBQVNWLGNBQWNXLEdBQUcsQ0FBQ0o7SUFFakMsTUFBTUssV0FBVyxBQUFDLENBQUE7UUFDaEIsSUFBSUYsT0FBT0csUUFBUSxFQUFFO1lBQ25CLE9BQU87Z0JBQ0wsR0FBR1gsT0FBT1ksV0FBVyxDQUFDLGlCQUFpQixFQUFFSixPQUFPSyxLQUFLLENBQUNDLFFBQVEsQ0FBQyxDQUFDLEVBQUVOLE9BQU9LLEtBQUssQ0FBQ0UsRUFBRSxDQUFDLFlBQVksQ0FBQzthQUNoRztRQUNILE9BQU87WUFDTCxPQUFPO2dCQUNMLEdBQUdmLE9BQU9ZLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRUosT0FBT0ssS0FBSyxDQUFDRSxFQUFFLEVBQUU7Z0JBQzFELEdBQUdmLE9BQU9ZLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRUosT0FBT0ssS0FBSyxDQUFDRSxFQUFFLEVBQUU7bUJBQ3hEZixPQUFPZ0IsTUFBTSxDQUFDQyxJQUFJLENBQUNDLE9BQU8sQ0FDMUJDLEdBQUcsQ0FBQyxDQUFDQyxTQUFXO3dCQUNmLEdBQUdwQixPQUFPcUIsV0FBVyxDQUFDLENBQUMsRUFBRUQsT0FBTyxjQUFjLEVBQUVaLE9BQU9LLEtBQUssQ0FBQ0UsRUFBRSxFQUFFO3FCQUNsRSxFQUNBTyxJQUFJO2FBQ1I7UUFDSDtJQUNGLENBQUEsS0FBTSxPQUFPO0lBRWIsV0FBVyxNQUFNQyxXQUFXYixTQUFVO1FBQ3BDLElBQUksTUFBTWQsT0FBTzJCLFVBQVU7WUFDekJDLFFBQVFDLEdBQUcsQ0FBQzVCLE1BQU02QixHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUVILFNBQVM7WUFDekMsTUFBTTVCLEdBQUc0QixTQUFTO2dCQUFFSSxXQUFXO2dCQUFNQyxPQUFPO1lBQUs7UUFDbkQsT0FBTztZQUNMSixRQUFRQyxHQUFHLENBQUM1QixNQUFNZ0MsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFTixTQUFTO1FBQ2xEO0lBQ0Y7SUFFQSxrQkFBa0I7SUFDbEIsTUFBTXpCLGNBQWNRLE1BQU07SUFFMUIsT0FBTztRQUFFSTtJQUFTO0FBQ3BCIn0=
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { AbsolutePath, ApiRelativePath } from "../utils/path-utils";
|
|
2
|
+
export type FileType = "model" | "types" | "functions" | "generated" | "entity" | "frame" | "config";
|
|
3
|
+
export type GlobPattern<T extends ApiRelativePath | AbsolutePath> = {
|
|
4
|
+
[key in FileType]: T;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Syncer가 관심 가지고 지켜보는 파일들입니다.
|
|
8
|
+
* 이 파일들에 변경이 생기면 추가적인 작업(이하 "싱크" 또는 "싱크 액션")을 수행합니다.
|
|
9
|
+
* 이 작업이라 함은 파일 복사 또는 템플릿 렌더링을 통한 code generation을 의미합니다.
|
|
10
|
+
*
|
|
11
|
+
* **경로 형식**: API 상대 경로 (src/로 시작)
|
|
12
|
+
* **사용**: getChecksumPatternGroupInAbsolutePath()로 절대 경로 변환 후 glob 사용
|
|
13
|
+
*/
|
|
14
|
+
export declare const checksumPatternGroup: GlobPattern<ApiRelativePath>;
|
|
15
|
+
/**
|
|
16
|
+
* API 상대 경로 패턴을 절대 경로 패턴으로 변환합니다.
|
|
17
|
+
*
|
|
18
|
+
* **목적**: Glob 패턴을 파일시스템에서 사용할 수 있는 절대 경로로 변환
|
|
19
|
+
*
|
|
20
|
+
* **사용처**: checksum.ts에서 실제 파일을 찾을 때
|
|
21
|
+
*
|
|
22
|
+
* @returns 절대 경로 기반 Glob 패턴 맵
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* // 입력: { entity: "src/application/**\/*.entity.json" }
|
|
26
|
+
* // 출력: { entity: "/Users/.../api/src/application/**\/*.entity.json" }
|
|
27
|
+
*/
|
|
28
|
+
export declare function getChecksumPatternGroupInAbsolutePath(): GlobPattern<AbsolutePath>;
|
|
29
|
+
//# sourceMappingURL=file-patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-patterns.d.ts","sourceRoot":"","sources":["../../src/syncer/file-patterns.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEpE,MAAM,MAAM,QAAQ,GAChB,OAAO,GACP,OAAO,GACP,WAAW,GACX,WAAW,GACX,QAAQ,GACR,OAAO,GACP,QAAQ,CAAC;AAEb,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,eAAe,GAAG,YAAY,IAAI;KACjE,GAAG,IAAI,QAAQ,GAAG,CAAC;CACrB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,eAAe,CAQ7D,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,qCAAqC,IAAI,WAAW,CAAC,YAAY,CAAC,CAOjF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { Sonamu } from "../api/sonamu.js";
|
|
3
|
+
/**
|
|
4
|
+
* Syncer가 관심 가지고 지켜보는 파일들입니다.
|
|
5
|
+
* 이 파일들에 변경이 생기면 추가적인 작업(이하 "싱크" 또는 "싱크 액션")을 수행합니다.
|
|
6
|
+
* 이 작업이라 함은 파일 복사 또는 템플릿 렌더링을 통한 code generation을 의미합니다.
|
|
7
|
+
*
|
|
8
|
+
* **경로 형식**: API 상대 경로 (src/로 시작)
|
|
9
|
+
* **사용**: getChecksumPatternGroupInAbsolutePath()로 절대 경로 변환 후 glob 사용
|
|
10
|
+
*/ export const checksumPatternGroup = {
|
|
11
|
+
entity: "src/application/**/*.entity.json",
|
|
12
|
+
types: "src/application/**/*.types.ts",
|
|
13
|
+
generated: "src/application/sonamu.generated.ts",
|
|
14
|
+
model: "src/application/**/*.model.ts",
|
|
15
|
+
frame: "src/application/**/*.frame.ts",
|
|
16
|
+
functions: "src/application/**/*.functions.ts",
|
|
17
|
+
config: "sonamu.config.ts"
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* API 상대 경로 패턴을 절대 경로 패턴으로 변환합니다.
|
|
21
|
+
*
|
|
22
|
+
* **목적**: Glob 패턴을 파일시스템에서 사용할 수 있는 절대 경로로 변환
|
|
23
|
+
*
|
|
24
|
+
* **사용처**: checksum.ts에서 실제 파일을 찾을 때
|
|
25
|
+
*
|
|
26
|
+
* @returns 절대 경로 기반 Glob 패턴 맵
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* // 입력: { entity: "src/application/**\/*.entity.json" }
|
|
30
|
+
* // 출력: { entity: "/Users/.../api/src/application/**\/*.entity.json" }
|
|
31
|
+
*/ export function getChecksumPatternGroupInAbsolutePath() {
|
|
32
|
+
return Object.fromEntries(Object.entries(checksumPatternGroup).map(([key, value])=>[
|
|
33
|
+
key,
|
|
34
|
+
path.join(Sonamu.apiRootPath, value)
|
|
35
|
+
]));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvZmlsZS1wYXR0ZXJucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEFic29sdXRlUGF0aCwgQXBpUmVsYXRpdmVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcblxuZXhwb3J0IHR5cGUgRmlsZVR5cGUgPVxuICB8IFwibW9kZWxcIlxuICB8IFwidHlwZXNcIlxuICB8IFwiZnVuY3Rpb25zXCJcbiAgfCBcImdlbmVyYXRlZFwiXG4gIHwgXCJlbnRpdHlcIlxuICB8IFwiZnJhbWVcIlxuICB8IFwiY29uZmlnXCI7XG5cbmV4cG9ydCB0eXBlIEdsb2JQYXR0ZXJuPFQgZXh0ZW5kcyBBcGlSZWxhdGl2ZVBhdGggfCBBYnNvbHV0ZVBhdGg+ID0ge1xuICBba2V5IGluIEZpbGVUeXBlXTogVDtcbn07XG5cbi8qKlxuICogU3luY2Vy6rCAIOq0gOyLrCDqsIDsp4Dqs6Ag7KeA7Lyc67O064qUIO2MjOydvOuTpOyeheuLiOuLpC5cbiAqIOydtCDtjIzsnbzrk6Tsl5Ag67OA6rK97J20IOyDneq4sOuptCDstpTqsIDsoIHsnbgg7J6R7JeFKOydtO2VmCBcIuyLse2BrFwiIOuYkOuKlCBcIuyLse2BrCDslaHshZhcIinsnYQg7IiY7ZaJ7ZWp64uI64ukLlxuICog7J20IOyekeyXheydtOudvCDtlajsnYAg7YyM7J28IOuzteyCrCDrmJDripQg7YWc7ZSM66a/IOugjOuNlOungeydhCDthrXtlZwgY29kZSBnZW5lcmF0aW9u7J2EIOydmOuvuO2VqeuLiOuLpC5cbiAqXG4gKiAqKuqyveuhnCDtmJXsi50qKjogQVBJIOyDgeuMgCDqsr3roZwgKHNyYy/roZwg7Iuc7J6RKVxuICogKirsgqzsmqkqKjogZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCgp66GcIOygiOuMgCDqsr3roZwg67OA7ZmYIO2bhCBnbG9iIOyCrOyaqVxuICovXG5leHBvcnQgY29uc3QgY2hlY2tzdW1QYXR0ZXJuR3JvdXA6IEdsb2JQYXR0ZXJuPEFwaVJlbGF0aXZlUGF0aD4gPSB7XG4gIGVudGl0eTogXCJzcmMvYXBwbGljYXRpb24vKiovKi5lbnRpdHkuanNvblwiLFxuICB0eXBlczogXCJzcmMvYXBwbGljYXRpb24vKiovKi50eXBlcy50c1wiLFxuICBnZW5lcmF0ZWQ6IFwic3JjL2FwcGxpY2F0aW9uL3NvbmFtdS5nZW5lcmF0ZWQudHNcIixcbiAgbW9kZWw6IFwic3JjL2FwcGxpY2F0aW9uLyoqLyoubW9kZWwudHNcIixcbiAgZnJhbWU6IFwic3JjL2FwcGxpY2F0aW9uLyoqLyouZnJhbWUudHNcIixcbiAgZnVuY3Rpb25zOiBcInNyYy9hcHBsaWNhdGlvbi8qKi8qLmZ1bmN0aW9ucy50c1wiLFxuICBjb25maWc6IFwic29uYW11LmNvbmZpZy50c1wiLFxufTtcblxuLyoqXG4gKiBBUEkg7IOB64yAIOqyveuhnCDtjKjthLTsnYQg7KCI64yAIOqyveuhnCDtjKjthLTsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICpcbiAqICoq66qp7KCBKio6IEdsb2Ig7Yyo7YS07J2EIO2MjOydvOyLnOyKpO2FnOyXkOyEnCDsgqzsmqntlaAg7IiYIOyeiOuKlCDsoIjrjIAg6rK966Gc66GcIOuzgO2ZmFxuICpcbiAqICoq7IKs7Jqp7LKYKio6IGNoZWNrc3VtLnRz7JeQ7IScIOyLpOygnCDtjIzsnbzsnYQg7LC+7J2EIOuVjFxuICpcbiAqIEByZXR1cm5zIOygiOuMgCDqsr3roZwg6riw67CYIEdsb2Ig7Yyo7YS0IOuntVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyDsnoXroKU6IHsgZW50aXR5OiBcInNyYy9hcHBsaWNhdGlvbi8qKlxcLyouZW50aXR5Lmpzb25cIiB9XG4gKiAvLyDstpzroKU6IHsgZW50aXR5OiBcIi9Vc2Vycy8uLi4vYXBpL3NyYy9hcHBsaWNhdGlvbi8qKlxcLyouZW50aXR5Lmpzb25cIiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCk6IEdsb2JQYXR0ZXJuPEFic29sdXRlUGF0aD4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKGNoZWNrc3VtUGF0dGVybkdyb3VwKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW1xuICAgICAga2V5LFxuICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgdmFsdWUpLCAvLyBBUEkg7IOB64yAIOqyveuhnCDihpIg7KCI64yAIOqyveuhnFxuICAgIF0pXG4gICkgYXMgR2xvYlBhdHRlcm48QWJzb2x1dGVQYXRoPjtcbn1cbiJdLCJuYW1lcyI6WyJwYXRoIiwiU29uYW11IiwiY2hlY2tzdW1QYXR0ZXJuR3JvdXAiLCJlbnRpdHkiLCJ0eXBlcyIsImdlbmVyYXRlZCIsIm1vZGVsIiwiZnJhbWUiLCJmdW5jdGlvbnMiLCJjb25maWciLCJnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIiwiT2JqZWN0IiwiZnJvbUVudHJpZXMiLCJlbnRyaWVzIiwibWFwIiwia2V5IiwidmFsdWUiLCJqb2luIiwiYXBpUm9vdFBhdGgiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFVBQVUsT0FBTztBQUN4QixTQUFTQyxNQUFNLFFBQVEsbUJBQWdCO0FBZ0J2Qzs7Ozs7OztDQU9DLEdBQ0QsT0FBTyxNQUFNQyx1QkFBcUQ7SUFDaEVDLFFBQVE7SUFDUkMsT0FBTztJQUNQQyxXQUFXO0lBQ1hDLE9BQU87SUFDUEMsT0FBTztJQUNQQyxXQUFXO0lBQ1hDLFFBQVE7QUFDVixFQUFFO0FBRUY7Ozs7Ozs7Ozs7OztDQVlDLEdBQ0QsT0FBTyxTQUFTQztJQUNkLE9BQU9DLE9BQU9DLFdBQVcsQ0FDdkJELE9BQU9FLE9BQU8sQ0FBQ1gsc0JBQXNCWSxHQUFHLENBQUMsQ0FBQyxDQUFDQyxLQUFLQyxNQUFNLEdBQUs7WUFDekREO1lBQ0FmLEtBQUtpQixJQUFJLENBQUNoQixPQUFPaUIsV0FBVyxFQUFFRjtTQUMvQjtBQUVMIn0=
|
package/dist/syncer/index.d.ts
CHANGED
|
@@ -1,2 +1,8 @@
|
|
|
1
1
|
export * from "./syncer";
|
|
2
|
+
export * from "./code-generator";
|
|
3
|
+
export * from "./module-loader";
|
|
4
|
+
export * from "./entity-operations";
|
|
5
|
+
export * from "./file-patterns";
|
|
6
|
+
export * from "./checksum";
|
|
7
|
+
export * from "./api-parser";
|
|
2
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/syncer/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/syncer/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
|
package/dist/syncer/index.js
CHANGED
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export * from "./syncer.js";
|
|
2
|
+
export * from "./code-generator.js";
|
|
3
|
+
export * from "./module-loader.js";
|
|
4
|
+
export * from "./entity-operations.js";
|
|
5
|
+
export * from "./file-patterns.js";
|
|
6
|
+
export * from "./checksum.js";
|
|
7
|
+
export * from "./api-parser.js";
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vc3luY2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW50aXR5LW9wZXJhdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZpbGUtcGF0dGVybnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NoZWNrc3VtXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hcGktcGFyc2VyXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxjQUFXO0FBQ3pCLGNBQWMsc0JBQW1CO0FBQ2pDLGNBQWMscUJBQWtCO0FBQ2hDLGNBQWMseUJBQXNCO0FBQ3BDLGNBQWMscUJBQWtCO0FBQ2hDLGNBQWMsZ0JBQWE7QUFDM0IsY0FBYyxrQkFBZSJ9
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { BaseFrameClass } from "../api/base-frame";
|
|
3
|
+
import { BaseModelClass } from "../database/base-model";
|
|
4
|
+
import { ApiParam, ApiParamType } from "../types/types";
|
|
5
|
+
import { ApiDecoratorOptions } from "../api/decorators";
|
|
6
|
+
export type LoadedApis = {
|
|
7
|
+
typeParameters: ApiParamType.TypeParam[];
|
|
8
|
+
parameters: ApiParam[];
|
|
9
|
+
returnType: ApiParamType;
|
|
10
|
+
modelName: string;
|
|
11
|
+
methodName: string;
|
|
12
|
+
path: string;
|
|
13
|
+
options: ApiDecoratorOptions;
|
|
14
|
+
}[];
|
|
15
|
+
export type LoadedTypes = {
|
|
16
|
+
[typeName: string]: z.ZodObject<any>;
|
|
17
|
+
};
|
|
18
|
+
export type LoadedModels = {
|
|
19
|
+
[modelName: string]: BaseModelClass | BaseFrameClass;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* *.model.ts와 *.frame.ts 파일들에서 API 메소드를 파싱하여 로드합니다.
|
|
23
|
+
* registeredApis에 API가 등록되어 있어야 하기 때문에, *.model.ts 파일들을 먼저 import해야 합니다.
|
|
24
|
+
* 따라서 loadModels()를 먼저 호출해야 합니다.
|
|
25
|
+
*/
|
|
26
|
+
export declare function loadApis(): Promise<LoadedApis>;
|
|
27
|
+
/**
|
|
28
|
+
* *.model.ts와 *.frame.ts 파일들에서 Model/Frame 클래스 인스턴스를 로드합니다.
|
|
29
|
+
*/
|
|
30
|
+
export declare function loadModels(): Promise<LoadedModels>;
|
|
31
|
+
/**
|
|
32
|
+
* *.types.ts와 *.generated.ts 파일들에서 Zod 스키마를 로드합니다.
|
|
33
|
+
*/
|
|
34
|
+
export declare function loadTypes(): Promise<LoadedTypes>;
|
|
35
|
+
//# sourceMappingURL=module-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-loader.d.ts","sourceRoot":"","sources":["../../src/syncer/module-loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,MAAM,UAAU,GAAG;IACvB,cAAc,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC;IACzC,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,EAAE,YAAY,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,mBAAmB,CAAC;CAC9B,EAAE,CAAC;AAEJ,MAAM,MAAM,WAAW,GAAG;IAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,YAAY,GAAG;IACzB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,cAAc,CAAC;CACtD,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,CAuBpD;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC,CA4BxD;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC,CA8BtD"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { globAsync } from "../utils/async-utils.js";
|
|
3
|
+
import { importMembers } from "../utils/esm-utils.js";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { Sonamu } from "../api/sonamu.js";
|
|
6
|
+
import { readApisFromFile } from "./api-parser.js";
|
|
7
|
+
import { runtimePath } from "../utils/path-utils.js";
|
|
8
|
+
/**
|
|
9
|
+
* *.model.ts와 *.frame.ts 파일들에서 API 메소드를 파싱하여 로드합니다.
|
|
10
|
+
* registeredApis에 API가 등록되어 있어야 하기 때문에, *.model.ts 파일들을 먼저 import해야 합니다.
|
|
11
|
+
* 따라서 loadModels()를 먼저 호출해야 합니다.
|
|
12
|
+
*/ export async function loadApis() {
|
|
13
|
+
// 얘는 특이하게도 환경에 따라 .ts나 .js를 import하는 경우가 아니고,
|
|
14
|
+
// 타입이 살아있는 .ts 소스 코드만을 읽어야 합니다.
|
|
15
|
+
// 이것은 dev서버(hot reload)가 아닌 production 환경에서도 동일합니다.
|
|
16
|
+
// 모델들의 .ts 파일이 있어야 이를 읽어서 라우트를 등록할 수 있어요!
|
|
17
|
+
const modelPathsPattern = path.join(Sonamu.apiRootPath, "src/application/**/*.{model,frame}.ts" // !! runtimePath 안 씀 주의 !!
|
|
18
|
+
);
|
|
19
|
+
const modelPaths = await globAsync(modelPathsPattern);
|
|
20
|
+
const apis = [];
|
|
21
|
+
let count = 0;
|
|
22
|
+
for (const filePath of modelPaths){
|
|
23
|
+
const parsedApis = await readApisFromFile(filePath);
|
|
24
|
+
apis.push(...parsedApis);
|
|
25
|
+
count++;
|
|
26
|
+
}
|
|
27
|
+
// console.log(
|
|
28
|
+
// chalk.gray(`[Loading] Loaded APIs from "*.model.ts" files: ${count} files.`)
|
|
29
|
+
// );
|
|
30
|
+
return apis;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* *.model.ts와 *.frame.ts 파일들에서 Model/Frame 클래스 인스턴스를 로드합니다.
|
|
34
|
+
*/ export async function loadModels() {
|
|
35
|
+
const modelPathsPattern = path.join(Sonamu.apiRootPath, runtimePath("src/application/**/*.{model,frame}.ts"));
|
|
36
|
+
const modelPaths = await globAsync(modelPathsPattern);
|
|
37
|
+
const models = {};
|
|
38
|
+
let count = 0;
|
|
39
|
+
for (const filePath of modelPaths){
|
|
40
|
+
const importedMembers = await importMembers(filePath);
|
|
41
|
+
for (const { name, value } of importedMembers){
|
|
42
|
+
if (name.endsWith("Model") || name.endsWith("Frame")) {
|
|
43
|
+
models[name] = value;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
count++;
|
|
47
|
+
}
|
|
48
|
+
// console.log(
|
|
49
|
+
// chalk.gray(
|
|
50
|
+
// `[Loading] Loaded model/frame instances from ${runtimePath("*.{model,frame}.ts")} files: ${count} files.`
|
|
51
|
+
// )
|
|
52
|
+
// );
|
|
53
|
+
return models;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* *.types.ts와 *.generated.ts 파일들에서 Zod 스키마를 로드합니다.
|
|
57
|
+
*/ export async function loadTypes() {
|
|
58
|
+
const typePathsPatterns = [
|
|
59
|
+
path.join(Sonamu.apiRootPath, runtimePath("src/application/**/*.types.ts")),
|
|
60
|
+
path.join(Sonamu.apiRootPath, runtimePath("src/application/**/*.generated.ts"))
|
|
61
|
+
];
|
|
62
|
+
const typePaths = (await Promise.all(typePathsPatterns.map(globAsync))).flat();
|
|
63
|
+
const types = {};
|
|
64
|
+
let count = 0;
|
|
65
|
+
for (const filePath of typePaths){
|
|
66
|
+
const importedMembers = await importMembers(filePath);
|
|
67
|
+
for (const { name, value } of importedMembers){
|
|
68
|
+
if (value instanceof z.ZodObject) {
|
|
69
|
+
types[name] = value;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
count++;
|
|
73
|
+
}
|
|
74
|
+
// console.log(
|
|
75
|
+
// chalk.gray(
|
|
76
|
+
// `[Loading] Loaded zod types from ${runtimePath("*.types.ts")} and ${runtimePath("*.generated.ts")} files: ${count} files.`
|
|
77
|
+
// )
|
|
78
|
+
// );
|
|
79
|
+
return types;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvbW9kdWxlLWxvYWRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZ2xvYkFzeW5jIH0gZnJvbSBcIi4uL3V0aWxzL2FzeW5jLXV0aWxzXCI7XG5pbXBvcnQgeyBpbXBvcnRNZW1iZXJzIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyByZWFkQXBpc0Zyb21GaWxlIH0gZnJvbSBcIi4vYXBpLXBhcnNlclwiO1xuaW1wb3J0IHsgQmFzZUZyYW1lQ2xhc3MgfSBmcm9tIFwiLi4vYXBpL2Jhc2UtZnJhbWVcIjtcbmltcG9ydCB7IEJhc2VNb2RlbENsYXNzIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIjtcbmltcG9ydCB7IEFic29sdXRlUGF0aCwgcnVudGltZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHsgQXBpUGFyYW0sIEFwaVBhcmFtVHlwZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgQXBpRGVjb3JhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi9hcGkvZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgdHlwZSBMb2FkZWRBcGlzID0ge1xuICB0eXBlUGFyYW1ldGVyczogQXBpUGFyYW1UeXBlLlR5cGVQYXJhbVtdO1xuICBwYXJhbWV0ZXJzOiBBcGlQYXJhbVtdO1xuICByZXR1cm5UeXBlOiBBcGlQYXJhbVR5cGU7XG4gIG1vZGVsTmFtZTogc3RyaW5nO1xuICBtZXRob2ROYW1lOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgb3B0aW9uczogQXBpRGVjb3JhdG9yT3B0aW9ucztcbn1bXTtcblxuZXhwb3J0IHR5cGUgTG9hZGVkVHlwZXMgPSB7IFt0eXBlTmFtZTogc3RyaW5nXTogei5ab2RPYmplY3Q8YW55PiB9O1xuXG5leHBvcnQgdHlwZSBMb2FkZWRNb2RlbHMgPSB7XG4gIFttb2RlbE5hbWU6IHN0cmluZ106IEJhc2VNb2RlbENsYXNzIHwgQmFzZUZyYW1lQ2xhc3M7XG59O1xuXG4vKipcbiAqICoubW9kZWwudHPsmYAgKi5mcmFtZS50cyDtjIzsnbzrk6Tsl5DshJwgQVBJIOuplOyGjOuTnOulvCDtjIzsi7HtlZjsl6wg66Gc65Oc7ZWp64uI64ukLlxuICogcmVnaXN0ZXJlZEFwaXPsl5AgQVBJ6rCAIOuTseuhneuQmOyWtCDsnojslrTslbwg7ZWY6riwIOuVjOusuOyXkCwgKi5tb2RlbC50cyDtjIzsnbzrk6TsnYQg66i87KCAIGltcG9ydO2VtOyVvCDtlanri4jri6QuXG4gKiDrlLDrnbzshJwgbG9hZE1vZGVscygp66W8IOuovOyggCDtmLjstpztlbTslbwg7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEFwaXMoKTogUHJvbWlzZTxMb2FkZWRBcGlzPiB7XG4gIC8vIOyWmOuKlCDtirnsnbTtlZjqsozrj4Qg7ZmY6rK97JeQIOuUsOudvCAudHPrgpggLmpz66W8IGltcG9ydO2VmOuKlCDqsr3smrDqsIAg7JWE64uI6rOgLFxuICAvLyDtg4DsnoXsnbQg7IK07JWE7J6I64qUIC50cyDshozsiqQg7L2U65Oc66eM7J2EIOydveyWtOyVvCDtlanri4jri6QuXG4gIC8vIOydtOqyg+ydgCBkZXbshJzrsoQoaG90IHJlbG9hZCnqsIAg7JWE64uMIHByb2R1Y3Rpb24g7ZmY6rK97JeQ7ISc64+EIOuPmeydvO2VqeuLiOuLpC5cbiAgLy8g66qo642465Ok7J2YIC50cyDtjIzsnbzsnbQg7J6I7Ja07JW8IOydtOulvCDsnb3slrTshJwg65287Jqw7Yq466W8IOuTseuhne2VoCDsiJgg7J6I7Ja07JqUIVxuICBjb25zdCBtb2RlbFBhdGhzUGF0dGVybiA9IHBhdGguam9pbihcbiAgICBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgXCJzcmMvYXBwbGljYXRpb24vKiovKi57bW9kZWwsZnJhbWV9LnRzXCIgLy8gISEgcnVudGltZVBhdGgg7JWIIOyUgCDso7zsnZggISFcbiAgKTtcbiAgY29uc3QgbW9kZWxQYXRocyA9IChhd2FpdCBnbG9iQXN5bmMobW9kZWxQYXRoc1BhdHRlcm4pKSBhcyBBYnNvbHV0ZVBhdGhbXTtcblxuICBjb25zdCBhcGlzOiBMb2FkZWRBcGlzID0gW107XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgbW9kZWxQYXRocykge1xuICAgIGNvbnN0IHBhcnNlZEFwaXMgPSBhd2FpdCByZWFkQXBpc0Zyb21GaWxlKGZpbGVQYXRoKTtcbiAgICBhcGlzLnB1c2goLi4ucGFyc2VkQXBpcyk7XG4gICAgY291bnQrKztcbiAgfVxuICAvLyBjb25zb2xlLmxvZyhcbiAgLy8gICBjaGFsay5ncmF5KGBbTG9hZGluZ10gTG9hZGVkIEFQSXMgZnJvbSBcIioubW9kZWwudHNcIiBmaWxlczogJHtjb3VudH0gZmlsZXMuYClcbiAgLy8gKTtcblxuICByZXR1cm4gYXBpcztcbn1cblxuLyoqXG4gKiAqLm1vZGVsLnRz7JmAICouZnJhbWUudHMg7YyM7J2865Ok7JeQ7IScIE1vZGVsL0ZyYW1lIO2BtOuemOyKpCDsnbjsiqTthLTsiqTrpbwg66Gc65Oc7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZE1vZGVscygpOiBQcm9taXNlPExvYWRlZE1vZGVscz4ge1xuICBjb25zdCBtb2RlbFBhdGhzUGF0dGVybiA9IHBhdGguam9pbihcbiAgICBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgcnVudGltZVBhdGgoXCJzcmMvYXBwbGljYXRpb24vKiovKi57bW9kZWwsZnJhbWV9LnRzXCIpXG4gICk7XG4gIGNvbnN0IG1vZGVsUGF0aHMgPSBhd2FpdCBnbG9iQXN5bmMobW9kZWxQYXRoc1BhdHRlcm4pO1xuXG4gIGNvbnN0IG1vZGVsczogTG9hZGVkTW9kZWxzID0ge307XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgbW9kZWxQYXRocykge1xuICAgIGNvbnN0IGltcG9ydGVkTWVtYmVycyA9IGF3YWl0IGltcG9ydE1lbWJlcnM8XG4gICAgICBCYXNlTW9kZWxDbGFzcyB8IEJhc2VGcmFtZUNsYXNzXG4gICAgPihmaWxlUGF0aCk7XG5cbiAgICBmb3IgKGNvbnN0IHsgbmFtZSwgdmFsdWUgfSBvZiBpbXBvcnRlZE1lbWJlcnMpIHtcbiAgICAgIGlmIChuYW1lLmVuZHNXaXRoKFwiTW9kZWxcIikgfHwgbmFtZS5lbmRzV2l0aChcIkZyYW1lXCIpKSB7XG4gICAgICAgIG1vZGVsc1tuYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb3VudCsrO1xuICB9XG4gIC8vIGNvbnNvbGUubG9nKFxuICAvLyAgIGNoYWxrLmdyYXkoXG4gIC8vICAgICBgW0xvYWRpbmddIExvYWRlZCBtb2RlbC9mcmFtZSBpbnN0YW5jZXMgZnJvbSAke3J1bnRpbWVQYXRoKFwiKi57bW9kZWwsZnJhbWV9LnRzXCIpfSBmaWxlczogJHtjb3VudH0gZmlsZXMuYFxuICAvLyAgIClcbiAgLy8gKTtcblxuICByZXR1cm4gbW9kZWxzO1xufVxuXG4vKipcbiAqICoudHlwZXMudHPsmYAgKi5nZW5lcmF0ZWQudHMg7YyM7J2865Ok7JeQ7IScIFpvZCDsiqTtgqTrp4jrpbwg66Gc65Oc7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFR5cGVzKCk6IFByb21pc2U8TG9hZGVkVHlwZXM+IHtcbiAgY29uc3QgdHlwZVBhdGhzUGF0dGVybnMgPSBbXG4gICAgcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgcnVudGltZVBhdGgoXCJzcmMvYXBwbGljYXRpb24vKiovKi50eXBlcy50c1wiKSksXG4gICAgcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgcnVudGltZVBhdGgoXCJzcmMvYXBwbGljYXRpb24vKiovKi5nZW5lcmF0ZWQudHNcIilcbiAgICApLFxuICBdO1xuICBjb25zdCB0eXBlUGF0aHMgPSAoXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodHlwZVBhdGhzUGF0dGVybnMubWFwKGdsb2JBc3luYykpXG4gICkuZmxhdCgpO1xuXG4gIGNvbnN0IHR5cGVzOiBMb2FkZWRUeXBlcyA9IHt9O1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHR5cGVQYXRocykge1xuICAgIGNvbnN0IGltcG9ydGVkTWVtYmVycyA9IGF3YWl0IGltcG9ydE1lbWJlcnM8ei5ab2RPYmplY3Q8YW55Pj4oZmlsZVBhdGgpO1xuICAgIGZvciAoY29uc3QgeyBuYW1lLCB2YWx1ZSB9IG9mIGltcG9ydGVkTWVtYmVycykge1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2Ygei5ab2RPYmplY3QpIHtcbiAgICAgICAgdHlwZXNbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgY291bnQrKztcbiAgfVxuICAvLyBjb25zb2xlLmxvZyhcbiAgLy8gICBjaGFsay5ncmF5KFxuICAvLyAgICAgYFtMb2FkaW5nXSBMb2FkZWQgem9kIHR5cGVzIGZyb20gJHtydW50aW1lUGF0aChcIioudHlwZXMudHNcIil9IGFuZCAke3J1bnRpbWVQYXRoKFwiKi5nZW5lcmF0ZWQudHNcIil9IGZpbGVzOiAke2NvdW50fSBmaWxlcy5gXG4gIC8vICAgKVxuICAvLyApO1xuXG4gIHJldHVybiB0eXBlcztcbn1cbiJdLCJuYW1lcyI6WyJwYXRoIiwiZ2xvYkFzeW5jIiwiaW1wb3J0TWVtYmVycyIsInoiLCJTb25hbXUiLCJyZWFkQXBpc0Zyb21GaWxlIiwicnVudGltZVBhdGgiLCJsb2FkQXBpcyIsIm1vZGVsUGF0aHNQYXR0ZXJuIiwiam9pbiIsImFwaVJvb3RQYXRoIiwibW9kZWxQYXRocyIsImFwaXMiLCJjb3VudCIsImZpbGVQYXRoIiwicGFyc2VkQXBpcyIsInB1c2giLCJsb2FkTW9kZWxzIiwibW9kZWxzIiwiaW1wb3J0ZWRNZW1iZXJzIiwibmFtZSIsInZhbHVlIiwiZW5kc1dpdGgiLCJsb2FkVHlwZXMiLCJ0eXBlUGF0aHNQYXR0ZXJucyIsInR5cGVQYXRocyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJmbGF0IiwidHlwZXMiLCJab2RPYmplY3QiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFVBQVUsT0FBTztBQUN4QixTQUFTQyxTQUFTLFFBQVEsMEJBQXVCO0FBQ2pELFNBQVNDLGFBQWEsUUFBUSx3QkFBcUI7QUFDbkQsU0FBU0MsQ0FBQyxRQUFRLE1BQU07QUFDeEIsU0FBU0MsTUFBTSxRQUFRLG1CQUFnQjtBQUN2QyxTQUFTQyxnQkFBZ0IsUUFBUSxrQkFBZTtBQUdoRCxTQUF1QkMsV0FBVyxRQUFRLHlCQUFzQjtBQW9CaEU7Ozs7Q0FJQyxHQUNELE9BQU8sZUFBZUM7SUFDcEIsOENBQThDO0lBQzlDLGdDQUFnQztJQUNoQyxvREFBb0Q7SUFDcEQsMENBQTBDO0lBQzFDLE1BQU1DLG9CQUFvQlIsS0FBS1MsSUFBSSxDQUNqQ0wsT0FBT00sV0FBVyxFQUNsQix3Q0FBd0MsMkJBQTJCOztJQUVyRSxNQUFNQyxhQUFjLE1BQU1WLFVBQVVPO0lBRXBDLE1BQU1JLE9BQW1CLEVBQUU7SUFDM0IsSUFBSUMsUUFBUTtJQUNaLEtBQUssTUFBTUMsWUFBWUgsV0FBWTtRQUNqQyxNQUFNSSxhQUFhLE1BQU1WLGlCQUFpQlM7UUFDMUNGLEtBQUtJLElBQUksSUFBSUQ7UUFDYkY7SUFDRjtJQUNBLGVBQWU7SUFDZixpRkFBaUY7SUFDakYsS0FBSztJQUVMLE9BQU9EO0FBQ1Q7QUFFQTs7Q0FFQyxHQUNELE9BQU8sZUFBZUs7SUFDcEIsTUFBTVQsb0JBQW9CUixLQUFLUyxJQUFJLENBQ2pDTCxPQUFPTSxXQUFXLEVBQ2xCSixZQUFZO0lBRWQsTUFBTUssYUFBYSxNQUFNVixVQUFVTztJQUVuQyxNQUFNVSxTQUF1QixDQUFDO0lBQzlCLElBQUlMLFFBQVE7SUFDWixLQUFLLE1BQU1DLFlBQVlILFdBQVk7UUFDakMsTUFBTVEsa0JBQWtCLE1BQU1qQixjQUU1Qlk7UUFFRixLQUFLLE1BQU0sRUFBRU0sSUFBSSxFQUFFQyxLQUFLLEVBQUUsSUFBSUYsZ0JBQWlCO1lBQzdDLElBQUlDLEtBQUtFLFFBQVEsQ0FBQyxZQUFZRixLQUFLRSxRQUFRLENBQUMsVUFBVTtnQkFDcERKLE1BQU0sQ0FBQ0UsS0FBSyxHQUFHQztZQUNqQjtRQUNGO1FBQ0FSO0lBQ0Y7SUFDQSxlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLGdIQUFnSDtJQUNoSCxNQUFNO0lBQ04sS0FBSztJQUVMLE9BQU9LO0FBQ1Q7QUFFQTs7Q0FFQyxHQUNELE9BQU8sZUFBZUs7SUFDcEIsTUFBTUMsb0JBQW9CO1FBQ3hCeEIsS0FBS1MsSUFBSSxDQUFDTCxPQUFPTSxXQUFXLEVBQUVKLFlBQVk7UUFDMUNOLEtBQUtTLElBQUksQ0FDUEwsT0FBT00sV0FBVyxFQUNsQkosWUFBWTtLQUVmO0lBQ0QsTUFBTW1CLFlBQVksQUFDaEIsQ0FBQSxNQUFNQyxRQUFRQyxHQUFHLENBQUNILGtCQUFrQkksR0FBRyxDQUFDM0IsV0FBVSxFQUNsRDRCLElBQUk7SUFFTixNQUFNQyxRQUFxQixDQUFDO0lBQzVCLElBQUlqQixRQUFRO0lBQ1osS0FBSyxNQUFNQyxZQUFZVyxVQUFXO1FBQ2hDLE1BQU1OLGtCQUFrQixNQUFNakIsY0FBZ0NZO1FBQzlELEtBQUssTUFBTSxFQUFFTSxJQUFJLEVBQUVDLEtBQUssRUFBRSxJQUFJRixnQkFBaUI7WUFDN0MsSUFBSUUsaUJBQWlCbEIsRUFBRTRCLFNBQVMsRUFBRTtnQkFDaENELEtBQUssQ0FBQ1YsS0FBSyxHQUFHQztZQUNoQjtRQUNGO1FBQ0FSO0lBQ0Y7SUFDQSxlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLGlJQUFpSTtJQUNqSSxNQUFNO0lBQ04sS0FBSztJQUVMLE9BQU9pQjtBQUNUIn0=
|