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,130 +1,41 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
: T extends object
|
|
5
|
-
? { [K in keyof T]: T[K] }
|
|
6
|
-
: T;
|
|
1
|
+
import { DatabaseSchemaExtend } from "../types/types";
|
|
2
|
+
import { Puri } from "./puri";
|
|
3
|
+
import { PuriWrapper } from "./puri-wrapper";
|
|
7
4
|
|
|
8
|
-
//
|
|
9
|
-
|
|
10
|
-
? TNew // 첫 join: EmptyRecord 제거하고 대체
|
|
11
|
-
: TExisting & TNew; // 이후 join: 누적
|
|
12
|
-
|
|
13
|
-
type DeepEqual<T, U> = [T] extends [U]
|
|
14
|
-
? [U] extends [T]
|
|
15
|
-
? true
|
|
16
|
-
: false
|
|
17
|
-
: false;
|
|
18
|
-
type Extends<T, U> =
|
|
19
|
-
DeepEqual<T, Record<string, never>> extends true
|
|
20
|
-
? false
|
|
21
|
-
: T extends U
|
|
22
|
-
? true
|
|
23
|
-
: false;
|
|
24
|
-
type NullableToOptional<T> = {
|
|
25
|
-
[K in keyof T as T[K] extends null | undefined ? K : never]?: Exclude<
|
|
26
|
-
T[K],
|
|
27
|
-
null | undefined
|
|
28
|
-
>;
|
|
29
|
-
} & Partial<{
|
|
30
|
-
[K in keyof T as T[K] extends null | undefined ? never : K]: T[K];
|
|
31
|
-
}>;
|
|
32
|
-
|
|
33
|
-
// Join 등이 Empty 상태일 떄 {}가 아니라 EmptyRecord를 써서
|
|
34
|
-
export type EmptyRecord = Record<string, never>;
|
|
5
|
+
// 메타데이터 컬럼 제외
|
|
6
|
+
type ExcludeMetadataColumns<T> = Exclude<T, "__fulltext__">;
|
|
35
7
|
|
|
8
|
+
// TTables의 모든 테이블에서 사용 가능한 컬럼 경로
|
|
9
|
+
export type AvailableColumns<TTables extends Record<string, any>> =
|
|
10
|
+
| {
|
|
11
|
+
[TAlias in keyof TTables]: `${TAlias & string}.${ExcludeMetadataColumns<keyof TTables[TAlias]> & string}`;
|
|
12
|
+
}[keyof TTables]
|
|
13
|
+
| (IsSingleKey<TTables> extends true
|
|
14
|
+
? ExcludeMetadataColumns<keyof TTables[keyof TTables]> // 단일 테이블이면 컬럼명만도 허용
|
|
15
|
+
: never);
|
|
36
16
|
// Group By, Order By, Having 등에서 선택 가능한 컬럼
|
|
37
17
|
export type ResultAvailableColumns<
|
|
38
|
-
|
|
39
|
-
T extends keyof TSchema | string,
|
|
40
|
-
TOriginal = any,
|
|
18
|
+
TTables extends Record<string, any>,
|
|
41
19
|
TResult = any,
|
|
42
|
-
|
|
43
|
-
> = Exclude<
|
|
44
|
-
| AvailableColumns<TSchema, T, TOriginal, TJoined>
|
|
45
|
-
| `${keyof TResult & string}`,
|
|
46
|
-
"__fulltext__" | `${T & string}.__fulltext__`
|
|
47
|
-
>;
|
|
20
|
+
> = AvailableColumns<TTables> | `${keyof TResult & string}`;
|
|
48
21
|
|
|
49
|
-
//
|
|
50
|
-
export type
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
TOriginal = any,
|
|
54
|
-
TJoined = EmptyRecord,
|
|
55
|
-
> = T extends keyof TSchema
|
|
56
|
-
? // 기존 테이블 케이스
|
|
57
|
-
| (Extends<TJoined, Record<string, any>> extends false
|
|
58
|
-
? // 이게 TSchema[T]에 존재하면
|
|
59
|
-
keyof TSchema[T]
|
|
60
|
-
: {
|
|
61
|
-
[K in keyof TJoined]: TJoined[K] extends Record<string, any>
|
|
62
|
-
? `${string & K}.${keyof TJoined[K] & string}`
|
|
63
|
-
: never;
|
|
64
|
-
}[keyof TJoined])
|
|
65
|
-
| `${T & string}.${keyof TSchema[T] & string}`
|
|
66
|
-
: // 서브쿼리 케이스 (T는 alias string)
|
|
67
|
-
| keyof TOriginal
|
|
68
|
-
| `${T & string}.${keyof TOriginal & string}`
|
|
69
|
-
| (Extends<TJoined, Record<string, any>> extends true
|
|
70
|
-
? {
|
|
71
|
-
[K in keyof TJoined]: TJoined[K] extends Record<string, any>
|
|
72
|
-
? `${string & K}.${keyof TJoined[K] & string}`
|
|
73
|
-
: never;
|
|
74
|
-
}[keyof TJoined]
|
|
75
|
-
: never);
|
|
76
|
-
|
|
77
|
-
// 컬럼 경로에서 타입 추출
|
|
78
|
-
export type ExtractColumnType<
|
|
79
|
-
TSchema,
|
|
80
|
-
T extends keyof TSchema | string,
|
|
81
|
-
Path extends string,
|
|
82
|
-
TOriginal = any,
|
|
83
|
-
TJoined = EmptyRecord,
|
|
84
|
-
> = T extends keyof TSchema
|
|
85
|
-
? // 기존 테이블 케이스
|
|
86
|
-
Path extends keyof TSchema[T]
|
|
87
|
-
? TSchema[T][Path] // 메인 테이블 컬럼
|
|
88
|
-
: Path extends `${T & string}.${infer Column}`
|
|
89
|
-
? Column extends keyof TSchema[T]
|
|
90
|
-
? TSchema[T][Column]
|
|
91
|
-
: never
|
|
92
|
-
: Path extends `${infer Table}.${infer Column}`
|
|
93
|
-
? Table extends keyof TJoined
|
|
94
|
-
? TJoined[Table] extends Record<string, any>
|
|
95
|
-
? Column extends keyof TJoined[Table]
|
|
96
|
-
? TJoined[Table][Column]
|
|
97
|
-
: never
|
|
98
|
-
: never
|
|
99
|
-
: never
|
|
100
|
-
: never
|
|
101
|
-
: // 서브쿼리 케이스 (T는 alias)
|
|
102
|
-
Path extends `${T & string}.${infer Column}`
|
|
103
|
-
? Column extends keyof TOriginal
|
|
104
|
-
? TOriginal[Column] // 서브쿼리 alias.컬럼
|
|
105
|
-
: never
|
|
106
|
-
: Path extends `${infer Table}.${infer Column}`
|
|
107
|
-
? Table extends keyof TJoined
|
|
108
|
-
? TJoined[Table] extends Record<string, any>
|
|
109
|
-
? Column extends keyof TJoined[Table]
|
|
110
|
-
? TJoined[Table][Column]
|
|
111
|
-
: never
|
|
112
|
-
: never
|
|
113
|
-
: never
|
|
114
|
-
: Path extends keyof TOriginal
|
|
115
|
-
? TOriginal[Path] // 서브쿼리 컬럼 직접 접근 (가장 마지막에)
|
|
116
|
-
: never;
|
|
22
|
+
// Select 값 타입 확장
|
|
23
|
+
export type SelectValue<TTables extends Record<string, any>> =
|
|
24
|
+
| AvailableColumns<TTables>
|
|
25
|
+
| SqlExpression<"string" | "number" | "boolean" | "date">;
|
|
117
26
|
|
|
118
|
-
//
|
|
119
|
-
export type
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
};
|
|
27
|
+
// Select 객체 타입 (현재는 컬럼 경로만 지원)
|
|
28
|
+
export type SelectObject<TTables extends Record<string, any>> = Record<
|
|
29
|
+
string,
|
|
30
|
+
SelectValue<TTables> // AvailableColumns 대신
|
|
31
|
+
>;
|
|
124
32
|
|
|
125
|
-
//
|
|
126
|
-
type
|
|
127
|
-
|
|
33
|
+
// Select 결과 타입 추론
|
|
34
|
+
export type ParseSelectObject<
|
|
35
|
+
TTables extends Record<string, any>,
|
|
36
|
+
TSelect extends SelectObject<TTables>,
|
|
37
|
+
> = {
|
|
38
|
+
[K in keyof TSelect]: TSelect[K] extends SqlExpression<infer R>
|
|
128
39
|
? R extends "string"
|
|
129
40
|
? string
|
|
130
41
|
: R extends "number"
|
|
@@ -134,96 +45,95 @@ type ExtractSqlType<T> =
|
|
|
134
45
|
: R extends "date"
|
|
135
46
|
? Date
|
|
136
47
|
: never
|
|
48
|
+
: ExtractColumnType<TTables, TSelect[K] & string>;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// 컬럼 경로에서 타입 추출
|
|
52
|
+
export type ExtractColumnType<
|
|
53
|
+
TTables extends Record<string, any>,
|
|
54
|
+
Path extends string,
|
|
55
|
+
> = Path extends `${infer TAlias}.${infer TColumn}`
|
|
56
|
+
? TAlias extends keyof TTables
|
|
57
|
+
? TColumn extends keyof TTables[TAlias]
|
|
58
|
+
? TTables[TAlias][TColumn]
|
|
59
|
+
: never
|
|
60
|
+
: never
|
|
61
|
+
: IsSingleKey<TTables> extends true // 추가
|
|
62
|
+
? Path extends keyof TTables[keyof TTables]
|
|
63
|
+
? TTables[keyof TTables][Path]
|
|
64
|
+
: never
|
|
137
65
|
: never;
|
|
66
|
+
// Where 조건 객체 타입
|
|
67
|
+
// 예: { "u.id": 1, "u.status": "active" }
|
|
68
|
+
export type WhereCondition<TTables extends Record<string, any>> = {
|
|
69
|
+
[key in AvailableColumns<TTables>]?: ExtractColumnType<TTables, key & string>;
|
|
70
|
+
};
|
|
138
71
|
|
|
139
|
-
//
|
|
140
|
-
export type
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
72
|
+
// Fulltext index 컬럼 추출 타입
|
|
73
|
+
export type FulltextColumns<TTables extends Record<string, any>> = {
|
|
74
|
+
[TAlias in keyof TTables]: TTables[TAlias] extends {
|
|
75
|
+
__fulltext__: readonly (infer Col)[];
|
|
76
|
+
}
|
|
77
|
+
? Col extends string
|
|
78
|
+
? `${TAlias & string}.${Col}`
|
|
79
|
+
: never
|
|
80
|
+
: never;
|
|
81
|
+
}[keyof TTables];
|
|
148
82
|
|
|
149
|
-
//
|
|
150
|
-
export type
|
|
151
|
-
TSchema,
|
|
152
|
-
T extends keyof TSchema | string,
|
|
153
|
-
TOriginal = any,
|
|
154
|
-
TJoined = EmptyRecord,
|
|
155
|
-
> = Record<string, SelectValue<TSchema, T, TOriginal, TJoined>>;
|
|
83
|
+
// 비교 연산자
|
|
84
|
+
export type ComparisonOperator = "=" | ">" | ">=" | "<" | "<=" | "<>" | "!=";
|
|
156
85
|
|
|
157
|
-
//
|
|
158
|
-
export type
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
> = {
|
|
165
|
-
[K in keyof S]: S[K] extends SqlFunction<any>
|
|
166
|
-
? ExtractSqlType<S[K]> // SQL 함수면 타입 추출
|
|
167
|
-
: ExtractColumnType<TSchema, T, S[K] & string, TOriginal, TJoined>;
|
|
168
|
-
};
|
|
86
|
+
// SQL Expression 타입 정의
|
|
87
|
+
export type SqlExpression<T extends "string" | "number" | "boolean" | "date"> =
|
|
88
|
+
{
|
|
89
|
+
_type: "sql_expression"; // 또는 "computed_value"
|
|
90
|
+
_return: T;
|
|
91
|
+
_sql: string;
|
|
92
|
+
};
|
|
169
93
|
|
|
170
|
-
//
|
|
171
|
-
export type
|
|
172
|
-
|
|
173
|
-
T extends
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
> = {
|
|
177
|
-
[key in AvailableColumns<TSchema, T, TOriginal, TJoined>]?: ExtractColumnType<
|
|
178
|
-
TSchema,
|
|
179
|
-
T,
|
|
180
|
-
key & string,
|
|
181
|
-
TOriginal,
|
|
182
|
-
TJoined
|
|
183
|
-
>;
|
|
184
|
-
};
|
|
94
|
+
// 결과 타입 가독성을 위한 타입 확장
|
|
95
|
+
export type Expand<T> = T extends any[]
|
|
96
|
+
? { [K in keyof T[0]]: T[0][K] }[] // 배열이면 첫 번째 요소를 Expand하고 배열로 감쌈
|
|
97
|
+
: T extends object
|
|
98
|
+
? { [K in keyof T]: T[K] }
|
|
99
|
+
: T;
|
|
185
100
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
}[keyof TJoined]
|
|
208
|
-
: never)
|
|
209
|
-
: // 서브쿼리 케이스 (T는 alias)
|
|
210
|
-
| (TOriginal extends { __fulltext__: readonly (infer Col)[] }
|
|
211
|
-
? Col & string
|
|
212
|
-
: never)
|
|
213
|
-
| (TOriginal extends { __fulltext__: readonly (infer Col)[] }
|
|
214
|
-
? `${T & string}.${Col & string}`
|
|
215
|
-
: never)
|
|
216
|
-
| (TJoined extends Record<string, any>
|
|
217
|
-
? {
|
|
218
|
-
[K in keyof TJoined]: TJoined[K] extends {
|
|
219
|
-
__fulltext__: readonly (infer Col)[];
|
|
220
|
-
}
|
|
221
|
-
? (Col & string) | `${string & K}.${Col & string}`
|
|
222
|
-
: never;
|
|
223
|
-
}[keyof TJoined]
|
|
224
|
-
: never);
|
|
101
|
+
type IsSingleKey<TTables extends Record<string, any>> =
|
|
102
|
+
keyof TTables extends infer K
|
|
103
|
+
? K extends keyof TTables
|
|
104
|
+
? keyof TTables extends K // 역방향 체크로 단일 키 확인
|
|
105
|
+
? true
|
|
106
|
+
: false
|
|
107
|
+
: false
|
|
108
|
+
: false;
|
|
109
|
+
|
|
110
|
+
export type SingleTableValue<TTables extends Record<string, any>> =
|
|
111
|
+
IsSingleKey<TTables> extends true ? TTables[keyof TTables] : never;
|
|
112
|
+
|
|
113
|
+
// Nullable을 Optional로 변환
|
|
114
|
+
type NullableToOptional<T> = {
|
|
115
|
+
[K in keyof T as T[K] extends null | undefined ? K : never]?: Exclude<
|
|
116
|
+
T[K],
|
|
117
|
+
null | undefined
|
|
118
|
+
>;
|
|
119
|
+
} & Partial<{
|
|
120
|
+
[K in keyof T as T[K] extends null | undefined ? never : K]: T[K];
|
|
121
|
+
}>;
|
|
225
122
|
|
|
226
123
|
// Insert 타입: id, created_at 제외
|
|
227
124
|
export type InsertData<T> = NullableToOptional<
|
|
228
125
|
Omit<T, "id" | "created_at" | "__fulltext__">
|
|
229
126
|
>;
|
|
127
|
+
|
|
128
|
+
// SubsetQuery를 위한 타입 유틸리티
|
|
129
|
+
type ExtractTTables<T extends Puri<any, any, any>> =
|
|
130
|
+
T extends Puri<any, infer TTables, any> ? TTables : never;
|
|
131
|
+
export type UnionExtractedTTables<
|
|
132
|
+
SubsetKey extends string,
|
|
133
|
+
SubsetQueries extends Record<
|
|
134
|
+
SubsetKey,
|
|
135
|
+
(qbWrapper: PuriWrapper<DatabaseSchemaExtend>) => Puri<any, any, any>
|
|
136
|
+
>,
|
|
137
|
+
> = {
|
|
138
|
+
[K in SubsetKey]: ExtractTTables<ReturnType<SubsetQueries[K]>>;
|
|
139
|
+
}[SubsetKey];
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { PuriTransactionWrapper } from "./puri-wrapper";
|
|
2
2
|
import type { DBPreset } from "./db";
|
|
3
3
|
|
|
4
4
|
export class TransactionContext {
|
|
5
|
-
private transactions: Map<DBPreset,
|
|
5
|
+
private transactions: Map<DBPreset, PuriTransactionWrapper> = new Map();
|
|
6
6
|
|
|
7
|
-
getTransaction(preset: DBPreset):
|
|
7
|
+
getTransaction(preset: DBPreset): PuriTransactionWrapper | undefined {
|
|
8
8
|
return this.transactions.get(preset);
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
setTransaction(preset: DBPreset, trx:
|
|
11
|
+
setTransaction(preset: DBPreset, trx: PuriTransactionWrapper): void {
|
|
12
12
|
this.transactions.set(preset, trx);
|
|
13
13
|
}
|
|
14
14
|
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import chalk from "chalk";
|
|
2
1
|
import { glob } from "fs/promises";
|
|
3
2
|
import inflection from "inflection";
|
|
4
|
-
import _ from "lodash";
|
|
3
|
+
import * as _ from "lodash-es";
|
|
5
4
|
import path from "path";
|
|
6
5
|
import { Entity } from "./entity";
|
|
7
6
|
import { EntityJson } from "../types/types";
|
|
8
7
|
import { Sonamu } from "../api/sonamu";
|
|
9
8
|
import { readFile } from "fs/promises";
|
|
9
|
+
import { AbsolutePath } from "../utils/path-utils";
|
|
10
|
+
import assert from "assert";
|
|
10
11
|
|
|
11
12
|
export type EntityNamesRecord = Record<
|
|
12
13
|
| "fs"
|
|
@@ -30,7 +31,7 @@ class EntityManagerClass {
|
|
|
30
31
|
public isAutoloaded: boolean = false;
|
|
31
32
|
|
|
32
33
|
// 경로 전달받아 모든 entity.json 파일 로드
|
|
33
|
-
async autoload(
|
|
34
|
+
async autoload(_: boolean = false) {
|
|
34
35
|
if (this.isAutoloaded) {
|
|
35
36
|
return;
|
|
36
37
|
}
|
|
@@ -38,30 +39,28 @@ class EntityManagerClass {
|
|
|
38
39
|
Sonamu.apiRootPath,
|
|
39
40
|
"/src/application/**/*.entity.json"
|
|
40
41
|
);
|
|
41
|
-
!doSilent && console.log(chalk.yellow(`autoload ${pathPattern}`));
|
|
42
42
|
|
|
43
|
+
let count = 0;
|
|
43
44
|
for await (const file of glob(path.resolve(pathPattern!))) {
|
|
44
45
|
await this.register(JSON.parse((await readFile(file)).toString()));
|
|
46
|
+
count++;
|
|
45
47
|
}
|
|
48
|
+
// !doSilent &&
|
|
49
|
+
// console.log(
|
|
50
|
+
// chalk.gray(
|
|
51
|
+
// `[Loading] Loaded entity definitions from "*.entity.json" files: ${count} files.`
|
|
52
|
+
// )
|
|
53
|
+
// );
|
|
54
|
+
|
|
46
55
|
this.isAutoloaded = true;
|
|
47
56
|
}
|
|
48
57
|
|
|
49
58
|
async reload(doSilent: boolean = false) {
|
|
50
|
-
console.log("reload");
|
|
51
59
|
this.entities.clear();
|
|
52
60
|
this.modulePaths.clear();
|
|
53
61
|
this.tableSpecs.clear();
|
|
54
62
|
this.isAutoloaded = false;
|
|
55
63
|
|
|
56
|
-
const sonamuPath = path.join(
|
|
57
|
-
Sonamu.apiRootPath,
|
|
58
|
-
`dist/application/sonamu.generated.js`
|
|
59
|
-
);
|
|
60
|
-
// CJS
|
|
61
|
-
if (require?.cache && require.cache[sonamuPath]) {
|
|
62
|
-
delete require.cache[sonamuPath];
|
|
63
|
-
}
|
|
64
|
-
|
|
65
64
|
return await this.autoload(doSilent);
|
|
66
65
|
}
|
|
67
66
|
|
|
@@ -70,7 +69,6 @@ class EntityManagerClass {
|
|
|
70
69
|
await entity.registerModulePaths();
|
|
71
70
|
entity.registerTableSpecs();
|
|
72
71
|
this.entities.set(json.id, entity);
|
|
73
|
-
// console.debug(chalk.cyan(`register :: ${entity.id}`));
|
|
74
72
|
}
|
|
75
73
|
|
|
76
74
|
get(entityId: string): Entity {
|
|
@@ -152,6 +150,12 @@ class EntityManagerClass {
|
|
|
152
150
|
constant: inflection.underscore(entityId).toUpperCase(),
|
|
153
151
|
};
|
|
154
152
|
}
|
|
153
|
+
|
|
154
|
+
getEntityIdFromPath(filePath: AbsolutePath): string {
|
|
155
|
+
const matched = filePath.match(/application\/(.+)\//);
|
|
156
|
+
assert(matched?.[1]);
|
|
157
|
+
return inflection.camelize(matched[1].replace(/\-/g, "_"));
|
|
158
|
+
}
|
|
155
159
|
}
|
|
156
160
|
|
|
157
161
|
export const EntityManager = new EntityManagerClass();
|
package/src/entity/entity.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import _ from "lodash";
|
|
1
|
+
import * as _ from "lodash-es";
|
|
2
|
+
import { createImportUrl } from "../utils/esm-utils";
|
|
2
3
|
import { EntityManager as EntityManager } from "./entity-manager";
|
|
3
4
|
import {
|
|
4
5
|
EntityProp,
|
|
@@ -553,8 +554,8 @@ export class Entity {
|
|
|
553
554
|
);
|
|
554
555
|
|
|
555
556
|
if (await exists(typesFileDistPath)) {
|
|
556
|
-
const
|
|
557
|
-
const t = await import(
|
|
557
|
+
const importUrl = createImportUrl(typesFileDistPath);
|
|
558
|
+
const t = await import(importUrl);
|
|
558
559
|
this.types = Object.keys(t).reduce((result, key) => {
|
|
559
560
|
EntityManager.setModulePath(key, typesModulePath);
|
|
560
561
|
return {
|
package/src/index.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export type * from "./api/context";
|
|
2
|
+
export * from "./api/config";
|
|
2
3
|
export * from "./api/decorators";
|
|
3
4
|
export * from "./api/sonamu";
|
|
4
5
|
export * from "./database/base-model";
|
|
@@ -21,6 +22,7 @@ export * from "./entity/entity";
|
|
|
21
22
|
export * from "./migration/migrator";
|
|
22
23
|
export * from "./migration/types";
|
|
23
24
|
export * from "./file-storage/driver";
|
|
25
|
+
export * from "./naite/naite";
|
|
24
26
|
|
|
25
27
|
// export * from "./api/code-converters";
|
|
26
28
|
// export * from "./entity/entity-utils";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Knex } from "knex";
|
|
2
2
|
import { DBColumn, DBForeign, DBIndex } from "./types";
|
|
3
|
-
import _ from "lodash";
|
|
3
|
+
import * as _ from "lodash-es";
|
|
4
4
|
import inflection from "inflection";
|
|
5
5
|
import { Entity } from "../entity/entity";
|
|
6
6
|
import { EntityManager } from "../entity/entity-manager";
|