sonamu 0.5.7 → 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.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 +2 -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.js +109 -2
- package/dist/database/puri.d.ts +23 -16
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +539 -2
- package/dist/database/puri.types.d.ts +8 -3
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +3 -2
- 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 -8
- 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 +1 -0
- package/src/api/sonamu.ts +81 -67
- 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 +10 -52
- package/src/database/puri.ts +78 -53
- package/src/database/puri.types.ts +18 -5
- 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 +19 -11
- 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 +38 -61
- 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,64 @@
|
|
|
1
|
+
import { EntityManager } from "../../entity/entity-manager.js";
|
|
2
|
+
import { Template } from "../template.js";
|
|
3
|
+
export class Template__view_search_input extends Template {
|
|
4
|
+
constructor(){
|
|
5
|
+
super("view_search_input");
|
|
6
|
+
}
|
|
7
|
+
getTargetAndPath(names) {
|
|
8
|
+
return {
|
|
9
|
+
target: "web/src/components",
|
|
10
|
+
path: `${names.fs}/${names.capital}SearchInput.tsx`
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
render({ entityId }) {
|
|
14
|
+
const names = EntityManager.getNamesFromId(entityId);
|
|
15
|
+
return {
|
|
16
|
+
...this.getTargetAndPath(names),
|
|
17
|
+
body: `
|
|
18
|
+
import React from "react";
|
|
19
|
+
import { useState } from "react";
|
|
20
|
+
import { DropdownProps, Input, InputProps } from "semantic-ui-react";
|
|
21
|
+
import { ${names.capital}SearchFieldDropdown } from "src/components/${names.fs}/${names.capital}SearchFieldDropdown";
|
|
22
|
+
|
|
23
|
+
export function ${names.capital}SearchInput({
|
|
24
|
+
input: { value: inputValue, onChange: inputOnChange, ...inputProps },
|
|
25
|
+
dropdown: dropdownProps,
|
|
26
|
+
}: {
|
|
27
|
+
input: InputProps;
|
|
28
|
+
dropdown: DropdownProps;
|
|
29
|
+
}) {
|
|
30
|
+
const [keyword, setKeyword] = useState<string>(inputValue ?? '');
|
|
31
|
+
|
|
32
|
+
const handleKeyDown = (e: { key: string }) => {
|
|
33
|
+
if (inputOnChange && e.key === 'Enter') {
|
|
34
|
+
inputOnChange(e as any, {
|
|
35
|
+
value: keyword,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<Input
|
|
42
|
+
size="small"
|
|
43
|
+
placeholder="검색..."
|
|
44
|
+
style={{ margin: 0 }}
|
|
45
|
+
label={<${names.capital}SearchFieldDropdown {...dropdownProps} />}
|
|
46
|
+
labelPosition="left"
|
|
47
|
+
action={{
|
|
48
|
+
icon: 'search',
|
|
49
|
+
onClick: () => handleKeyDown({ key: 'Enter' }),
|
|
50
|
+
}}
|
|
51
|
+
{...inputProps}
|
|
52
|
+
value={keyword}
|
|
53
|
+
onChange={(e, { value }) => setKeyword(value)}
|
|
54
|
+
onKeyDown={handleKeyDown}
|
|
55
|
+
/>
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
`.trim(),
|
|
59
|
+
importKeys: []
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvdmlld19zZWFyY2hfaW5wdXQudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyLCBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZV9fdmlld19zZWFyY2hfaW5wdXQgZXh0ZW5kcyBUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwidmlld19zZWFyY2hfaW5wdXRcIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IFwid2ViL3NyYy9jb21wb25lbnRzXCIsXG4gICAgICBwYXRoOiBgJHtuYW1lcy5mc30vJHtuYW1lcy5jYXBpdGFsfVNlYXJjaElucHV0LnRzeGAsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcih7IGVudGl0eUlkIH06IFRlbXBsYXRlT3B0aW9uc1tcInZpZXdfc2VhcmNoX2lucHV0XCJdKSB7XG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgobmFtZXMpLFxuICAgICAgYm9keTogYFxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IERyb3Bkb3duUHJvcHMsIElucHV0LCBJbnB1dFByb3BzIH0gZnJvbSBcInNlbWFudGljLXVpLXJlYWN0XCI7XG5pbXBvcnQgeyAke25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGREcm9wZG93biB9IGZyb20gXCJzcmMvY29tcG9uZW50cy8ke25hbWVzLmZzfS8ke25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGREcm9wZG93blwiO1xuXG5leHBvcnQgZnVuY3Rpb24gJHtuYW1lcy5jYXBpdGFsfVNlYXJjaElucHV0KHtcbiAgaW5wdXQ6IHsgdmFsdWU6IGlucHV0VmFsdWUsIG9uQ2hhbmdlOiBpbnB1dE9uQ2hhbmdlLCAuLi5pbnB1dFByb3BzIH0sXG4gIGRyb3Bkb3duOiBkcm9wZG93blByb3BzLFxufToge1xuICBpbnB1dDogSW5wdXRQcm9wcztcbiAgZHJvcGRvd246IERyb3Bkb3duUHJvcHM7XG59KSB7XG4gIGNvbnN0IFtrZXl3b3JkLCBzZXRLZXl3b3JkXSA9IHVzZVN0YXRlPHN0cmluZz4oaW5wdXRWYWx1ZSA/PyAnJyk7XG5cbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IChlOiB7IGtleTogc3RyaW5nIH0pID0+IHtcbiAgICBpZiAoaW5wdXRPbkNoYW5nZSAmJiBlLmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgaW5wdXRPbkNoYW5nZShlIGFzIGFueSwge1xuICAgICAgICB2YWx1ZToga2V5d29yZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxJbnB1dFxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwi6rKA7IOJLi4uXCJcbiAgICAgIHN0eWxlPXt7IG1hcmdpbjogMCB9fVxuICAgICAgbGFiZWw9ezwke25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGREcm9wZG93biB7Li4uZHJvcGRvd25Qcm9wc30gLz59XG4gICAgICBsYWJlbFBvc2l0aW9uPVwibGVmdFwiXG4gICAgICBhY3Rpb249e3tcbiAgICAgICAgaWNvbjogJ3NlYXJjaCcsXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUtleURvd24oeyBrZXk6ICdFbnRlcicgfSksXG4gICAgICB9fVxuICAgICAgey4uLmlucHV0UHJvcHN9XG4gICAgICB2YWx1ZT17a2V5d29yZH1cbiAgICAgIG9uQ2hhbmdlPXsoZSwgeyB2YWx1ZSB9KSA9PiBzZXRLZXl3b3JkKHZhbHVlKX1cbiAgICAgIG9uS2V5RG93bj17aGFuZGxlS2V5RG93bn1cbiAgICAvPlxuICApO1xufVxuICAgICAgYC50cmltKCksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsiRW50aXR5TWFuYWdlciIsIlRlbXBsYXRlIiwiVGVtcGxhdGVfX3ZpZXdfc2VhcmNoX2lucHV0IiwiZ2V0VGFyZ2V0QW5kUGF0aCIsIm5hbWVzIiwidGFyZ2V0IiwicGF0aCIsImZzIiwiY2FwaXRhbCIsInJlbmRlciIsImVudGl0eUlkIiwiZ2V0TmFtZXNGcm9tSWQiLCJib2R5IiwidHJpbSIsImltcG9ydEtleXMiXSwibWFwcGluZ3MiOiJBQUNBLFNBQVNBLGFBQWEsUUFBMkIsaUNBQThCO0FBQy9FLFNBQVNDLFFBQVEsUUFBUSxpQkFBYztBQUV2QyxPQUFPLE1BQU1DLG9DQUFvQ0Q7SUFDL0MsYUFBYztRQUNaLEtBQUssQ0FBQztJQUNSO0lBRUFFLGlCQUFpQkMsS0FBd0IsRUFBRTtRQUN6QyxPQUFPO1lBQ0xDLFFBQVE7WUFDUkMsTUFBTSxHQUFHRixNQUFNRyxFQUFFLENBQUMsQ0FBQyxFQUFFSCxNQUFNSSxPQUFPLENBQUMsZUFBZSxDQUFDO1FBQ3JEO0lBQ0Y7SUFFQUMsT0FBTyxFQUFFQyxRQUFRLEVBQXdDLEVBQUU7UUFDekQsTUFBTU4sUUFBUUosY0FBY1csY0FBYyxDQUFDRDtRQUUzQyxPQUFPO1lBQ0wsR0FBRyxJQUFJLENBQUNQLGdCQUFnQixDQUFDQyxNQUFNO1lBQy9CUSxNQUFNLENBQUM7Ozs7U0FJSixFQUFFUixNQUFNSSxPQUFPLENBQUMsMkNBQTJDLEVBQUVKLE1BQU1HLEVBQUUsQ0FBQyxDQUFDLEVBQUVILE1BQU1JLE9BQU8sQ0FBQzs7Z0JBRWhGLEVBQUVKLE1BQU1JLE9BQU8sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztjQXNCbEIsRUFBRUosTUFBTUksT0FBTyxDQUFDOzs7Ozs7Ozs7Ozs7O01BYXhCLENBQUMsQ0FBQ0ssSUFBSTtZQUNOQyxZQUFZLEVBQUU7UUFDaEI7SUFDRjtBQUNGIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/template/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from "./template.js";
|
|
2
|
+
export * from "./helpers.js";
|
|
3
|
+
export * from "./entity-converter.js";
|
|
4
|
+
export * from "./zod-converter.js";
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi90ZW1wbGF0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaGVscGVyc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW50aXR5LWNvbnZlcnRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vem9kLWNvbnZlcnRlclwiO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsZ0JBQWE7QUFDM0IsY0FBYyxlQUFZO0FBQzFCLGNBQWMsd0JBQXFCO0FBQ25DLGNBQWMscUJBQWtCIn0=
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { TemplateKey, TemplateOptions } from "../types/types";
|
|
2
|
+
import { EntityNamesRecord } from "../entity/entity-manager";
|
|
3
|
+
export type RenderedTemplate = {
|
|
4
|
+
target: string;
|
|
5
|
+
path: string;
|
|
6
|
+
body: string;
|
|
7
|
+
importKeys: string[];
|
|
8
|
+
customHeaders?: string[];
|
|
9
|
+
preTemplates?: {
|
|
10
|
+
key: TemplateKey;
|
|
11
|
+
options: TemplateOptions[TemplateKey];
|
|
12
|
+
}[];
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* 템플릿을 나타내는 베이스 클래스입니다.
|
|
16
|
+
*/
|
|
17
|
+
export declare abstract class Template {
|
|
18
|
+
key: TemplateKey;
|
|
19
|
+
private static templates;
|
|
20
|
+
constructor(key: TemplateKey);
|
|
21
|
+
/**
|
|
22
|
+
* 템플릿 구현체가 있는 디렉토리의 모든 템플릿을 로드합니다.
|
|
23
|
+
* 템플릿이 필요(Template.find)해지기 전에 최소 한 번 호출해주셔야 합니다.
|
|
24
|
+
*/
|
|
25
|
+
static autoload(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* 템플릿 **인스턴스**를 key로 찾아옵니다.
|
|
28
|
+
* 만약 템플릿이 로드(loadAll)되지 않았거나 찾는 템플릿이 없다면 에러를 던집니다.
|
|
29
|
+
* @param key
|
|
30
|
+
* @returns
|
|
31
|
+
*/
|
|
32
|
+
static find(key: TemplateKey): Template;
|
|
33
|
+
abstract render(options: TemplateOptions[TemplateKey], ...extra: unknown[]): RenderedTemplate | Promise<RenderedTemplate>;
|
|
34
|
+
abstract getTargetAndPath(names?: EntityNamesRecord, ...extra: unknown[]): {
|
|
35
|
+
target: string;
|
|
36
|
+
path: string;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/template/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAK7D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE;QACb,GAAG,EAAE,WAAW,CAAC;QACjB,OAAO,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;KACvC,EAAE,CAAC;CACL,CAAC;AAEF;;GAEG;AACH,8BAAsB,QAAQ;IAGT,GAAG,EAAE,WAAW;IAFnC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAyC;gBAE9C,GAAG,EAAE,WAAW;IAEnC;;;OAGG;WACiB,QAAQ;IA6B5B;;;;;OAKG;WACW,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,QAAQ;aAQ9B,MAAM,CACpB,OAAO,EAAE,eAAe,CAAC,WAAW,CAAC,EACrC,GAAG,KAAK,EAAE,OAAO,EAAE,GAClB,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;aAE/B,gBAAgB,CAC9B,KAAK,CAAC,EAAE,iBAAiB,EACzB,GAAG,KAAK,EAAE,OAAO,EAAE,GAClB;QACD,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd;CACF"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { globAsync } from "../utils/async-utils.js";
|
|
2
|
+
import { importMembers } from "../utils/esm-utils.js";
|
|
3
|
+
import path from "path";
|
|
4
|
+
/**
|
|
5
|
+
* 템플릿을 나타내는 베이스 클래스입니다.
|
|
6
|
+
*/ export class Template {
|
|
7
|
+
key;
|
|
8
|
+
static templates = new Map();
|
|
9
|
+
constructor(key){
|
|
10
|
+
this.key = key;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 템플릿 구현체가 있는 디렉토리의 모든 템플릿을 로드합니다.
|
|
14
|
+
* 템플릿이 필요(Template.find)해지기 전에 최소 한 번 호출해주셔야 합니다.
|
|
15
|
+
*/ static async autoload() {
|
|
16
|
+
const templateFiles = await globAsync(// Sonamu의 코드베이스는 항상 빌드된 채로 dist 속에 머무르므로,
|
|
17
|
+
// 현재 파일을 기준으로 마찬가지로 dist 속에 있는 템플릿 구현체 js 파일들을 찾습니다.
|
|
18
|
+
path.join(import.meta.dirname, "implementations/*.template.js"));
|
|
19
|
+
for (const templateFile of templateFiles){
|
|
20
|
+
const templates = await importMembers(templateFile);
|
|
21
|
+
if (templates.length === 1 && typeof templates[0].value === "function" && templates[0].value.prototype instanceof Template) {
|
|
22
|
+
// 클래스의 인스턴스를 생성하여 등록
|
|
23
|
+
const instance = new templates[0].value();
|
|
24
|
+
this.templates.set(instance.key, instance);
|
|
25
|
+
} else {
|
|
26
|
+
throw new Error(`Template ${templateFile} should export only one class that extends Template`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// console.log(
|
|
30
|
+
// chalk.gray(`[Loading] Loaded ${this.templates.size} templates.`)
|
|
31
|
+
// );
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 템플릿 **인스턴스**를 key로 찾아옵니다.
|
|
35
|
+
* 만약 템플릿이 로드(loadAll)되지 않았거나 찾는 템플릿이 없다면 에러를 던집니다.
|
|
36
|
+
* @param key
|
|
37
|
+
* @returns
|
|
38
|
+
*/ static find(key) {
|
|
39
|
+
const instance = this.templates.get(key);
|
|
40
|
+
if (!instance) {
|
|
41
|
+
throw new Error(`Template ${key} not found. It might be becasuse you tried to find a template before loading all templates. Did you call Template.loadAll()?`);
|
|
42
|
+
}
|
|
43
|
+
return instance;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS90ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZW1wbGF0ZUtleSwgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IGdsb2JBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgaW1wb3J0TWVtYmVycyB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCB0eXBlIFJlbmRlcmVkVGVtcGxhdGUgPSB7XG4gIHRhcmdldDogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIGJvZHk6IHN0cmluZztcbiAgaW1wb3J0S2V5czogc3RyaW5nW107XG4gIGN1c3RvbUhlYWRlcnM/OiBzdHJpbmdbXTtcbiAgcHJlVGVtcGxhdGVzPzoge1xuICAgIGtleTogVGVtcGxhdGVLZXk7XG4gICAgb3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RlbXBsYXRlS2V5XTtcbiAgfVtdO1xufTtcblxuLyoqXG4gKiDthZztlIzrpr/snYQg64KY7YOA64K064qUIOuyoOydtOyKpCDtgbTrnpjsiqTsnoXri4jri6QuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUZW1wbGF0ZSB7XG4gIHByaXZhdGUgc3RhdGljIHRlbXBsYXRlczogTWFwPFRlbXBsYXRlS2V5LCBUZW1wbGF0ZT4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGtleTogVGVtcGxhdGVLZXkpIHt9XG5cbiAgLyoqXG4gICAqIO2FnO2UjOumvyDqtaztmITssrTqsIAg7J6I64qUIOuUlOugie2GoOumrOydmCDrqqjrk6Ag7YWc7ZSM66a/7J2EIOuhnOuTnO2VqeuLiOuLpC5cbiAgICog7YWc7ZSM66a/7J20IO2VhOyalChUZW1wbGF0ZS5maW5kKe2VtOyngOq4sCDsoITsl5Ag7LWc7IaMIO2VnCDrsogg7Zi47Lac7ZW07KO87IWU7JW8IO2VqeuLiOuLpC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgYXV0b2xvYWQoKSB7XG4gICAgY29uc3QgdGVtcGxhdGVGaWxlcyA9IGF3YWl0IGdsb2JBc3luYyhcbiAgICAgIC8vIFNvbmFtdeydmCDsvZTrk5zrsqDsnbTsiqTripQg7ZWt7IOBIOu5jOuTnOuQnCDssYTroZwgZGlzdCDsho3sl5Ag66i466y066W066+A66GcLFxuICAgICAgLy8g7ZiE7J6sIO2MjOydvOydhCDquLDspIDsnLzroZwg66eI7LCs6rCA7KeA66GcIGRpc3Qg7IaN7JeQIOyeiOuKlCDthZztlIzrpr8g6rWs7ZiE7LK0IGpzIO2MjOydvOuTpOydhCDssL7sirXri4jri6QuXG4gICAgICBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCJpbXBsZW1lbnRhdGlvbnMvKi50ZW1wbGF0ZS5qc1wiKVxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHRlbXBsYXRlRmlsZSBvZiB0ZW1wbGF0ZUZpbGVzKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBhd2FpdCBpbXBvcnRNZW1iZXJzPGFueT4odGVtcGxhdGVGaWxlKTtcbiAgICAgIGlmIChcbiAgICAgICAgdGVtcGxhdGVzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICB0eXBlb2YgdGVtcGxhdGVzWzBdLnZhbHVlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgdGVtcGxhdGVzWzBdLnZhbHVlLnByb3RvdHlwZSBpbnN0YW5jZW9mIFRlbXBsYXRlXG4gICAgICApIHtcbiAgICAgICAgLy8g7YG0656Y7Iqk7J2YIOyduOyKpO2EtOyKpOulvCDsg53shLHtlZjsl6wg65Ox66GdXG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHRlbXBsYXRlc1swXS52YWx1ZSgpO1xuICAgICAgICB0aGlzLnRlbXBsYXRlcy5zZXQoaW5zdGFuY2Uua2V5LCBpbnN0YW5jZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRlbXBsYXRlICR7dGVtcGxhdGVGaWxlfSBzaG91bGQgZXhwb3J0IG9ubHkgb25lIGNsYXNzIHRoYXQgZXh0ZW5kcyBUZW1wbGF0ZWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgIGNoYWxrLmdyYXkoYFtMb2FkaW5nXSBMb2FkZWQgJHt0aGlzLnRlbXBsYXRlcy5zaXplfSB0ZW1wbGF0ZXMuYClcbiAgICAvLyApO1xuICB9XG5cbiAgLyoqXG4gICAqIO2FnO2UjOumvyAqKuyduOyKpO2EtOyKpCoq66W8IGtleeuhnCDssL7slYTsmLXri4jri6QuXG4gICAqIOunjOyVvSDthZztlIzrpr/snbQg66Gc65OcKGxvYWRBbGwp65CY7KeAIOyViuyVmOqxsOuCmCDssL7ripQg7YWc7ZSM66a/7J20IOyXhuuLpOuptCDsl5Drn6zrpbwg642Y7KeR64uI64ukLlxuICAgKiBAcGFyYW0ga2V5IFxuICAgKiBAcmV0dXJucyBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZmluZChrZXk6IFRlbXBsYXRlS2V5KTogVGVtcGxhdGUge1xuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy50ZW1wbGF0ZXMuZ2V0KGtleSk7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZW1wbGF0ZSAke2tleX0gbm90IGZvdW5kLiBJdCBtaWdodCBiZSBiZWNhc3VzZSB5b3UgdHJpZWQgdG8gZmluZCBhIHRlbXBsYXRlIGJlZm9yZSBsb2FkaW5nIGFsbCB0ZW1wbGF0ZXMuIERpZCB5b3UgY2FsbCBUZW1wbGF0ZS5sb2FkQWxsKCk/YCk7XG4gICAgfVxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCByZW5kZXIoXG4gICAgb3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RlbXBsYXRlS2V5XSxcbiAgICAuLi5leHRyYTogdW5rbm93bltdXG4gICk6IFJlbmRlcmVkVGVtcGxhdGUgfCBQcm9taXNlPFJlbmRlcmVkVGVtcGxhdGU+O1xuXG4gIHB1YmxpYyBhYnN0cmFjdCBnZXRUYXJnZXRBbmRQYXRoKFxuICAgIG5hbWVzPzogRW50aXR5TmFtZXNSZWNvcmQsXG4gICAgLi4uZXh0cmE6IHVua25vd25bXVxuICApOiB7XG4gICAgdGFyZ2V0OiBzdHJpbmc7XG4gICAgcGF0aDogc3RyaW5nO1xuICB9O1xufVxuIl0sIm5hbWVzIjpbImdsb2JBc3luYyIsImltcG9ydE1lbWJlcnMiLCJwYXRoIiwiVGVtcGxhdGUiLCJ0ZW1wbGF0ZXMiLCJNYXAiLCJrZXkiLCJhdXRvbG9hZCIsInRlbXBsYXRlRmlsZXMiLCJqb2luIiwiZGlybmFtZSIsInRlbXBsYXRlRmlsZSIsImxlbmd0aCIsInZhbHVlIiwicHJvdG90eXBlIiwiaW5zdGFuY2UiLCJzZXQiLCJFcnJvciIsImZpbmQiLCJnZXQiXSwibWFwcGluZ3MiOiJBQUVBLFNBQVNBLFNBQVMsUUFBUSwwQkFBdUI7QUFDakQsU0FBU0MsYUFBYSxRQUFRLHdCQUFxQjtBQUNuRCxPQUFPQyxVQUFVLE9BQU87QUFjeEI7O0NBRUMsR0FDRCxPQUFPLE1BQWVDOztJQUNwQixPQUFlQyxZQUF3QyxJQUFJQyxNQUFNO0lBRWpFLFlBQVksQUFBT0MsR0FBZ0IsQ0FBRTthQUFsQkEsTUFBQUE7SUFBbUI7SUFFdEM7OztHQUdDLEdBQ0QsYUFBb0JDLFdBQVc7UUFDN0IsTUFBTUMsZ0JBQWdCLE1BQU1SLFVBQzFCLDBDQUEwQztRQUMxQyxxREFBcUQ7UUFDckRFLEtBQUtPLElBQUksQ0FBQyxZQUFZQyxPQUFPLEVBQUU7UUFHakMsS0FBSyxNQUFNQyxnQkFBZ0JILGNBQWU7WUFDeEMsTUFBTUosWUFBWSxNQUFNSCxjQUFtQlU7WUFDM0MsSUFDRVAsVUFBVVEsTUFBTSxLQUFLLEtBQ3JCLE9BQU9SLFNBQVMsQ0FBQyxFQUFFLENBQUNTLEtBQUssS0FBSyxjQUM5QlQsU0FBUyxDQUFDLEVBQUUsQ0FBQ1MsS0FBSyxDQUFDQyxTQUFTLFlBQVlYLFVBQ3hDO2dCQUNBLHFCQUFxQjtnQkFDckIsTUFBTVksV0FBVyxJQUFJWCxTQUFTLENBQUMsRUFBRSxDQUFDUyxLQUFLO2dCQUN2QyxJQUFJLENBQUNULFNBQVMsQ0FBQ1ksR0FBRyxDQUFDRCxTQUFTVCxHQUFHLEVBQUVTO1lBQ25DLE9BQU87Z0JBQ0wsTUFBTSxJQUFJRSxNQUNSLENBQUMsU0FBUyxFQUFFTixhQUFhLG1EQUFtRCxDQUFDO1lBRWpGO1FBQ0Y7SUFFQSxlQUFlO0lBQ2YscUVBQXFFO0lBQ3JFLEtBQUs7SUFDUDtJQUVBOzs7OztHQUtDLEdBQ0QsT0FBY08sS0FBS1osR0FBZ0IsRUFBWTtRQUM3QyxNQUFNUyxXQUFXLElBQUksQ0FBQ1gsU0FBUyxDQUFDZSxHQUFHLENBQUNiO1FBQ3BDLElBQUksQ0FBQ1MsVUFBVTtZQUNiLE1BQU0sSUFBSUUsTUFBTSxDQUFDLFNBQVMsRUFBRVgsSUFBSSw0SEFBNEgsQ0FBQztRQUMvSjtRQUNBLE9BQU9TO0lBQ1Q7QUFjRiJ9
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import z from "zod";
|
|
2
|
+
import { EntityProp, RenderingNode } from "../types/types";
|
|
3
|
+
/**
|
|
4
|
+
* Zod 타입 ID로부터 동적으로 Zod 스키마를 로드합니다.
|
|
5
|
+
* dist 디렉토리에서 ESM으로 import하여 가져옵니다.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getZodTypeById(zodTypeId: string): Promise<z.ZodTypeAny>;
|
|
8
|
+
/**
|
|
9
|
+
* Zod 타입을 UI 렌더링에 사용할 수 있는 RenderingNode로 변환합니다.
|
|
10
|
+
* 재귀적으로 중첩된 타입들을 처리합니다.
|
|
11
|
+
*/
|
|
12
|
+
export declare function zodTypeToRenderingNode(zodType: z.ZodType<any>, baseKey?: string): RenderingNode;
|
|
13
|
+
/**
|
|
14
|
+
* EntityProp을 Zod 타입으로 변환합니다.
|
|
15
|
+
* 각 prop의 타입에 따라 적절한 Zod validator를 생성합니다.
|
|
16
|
+
*/
|
|
17
|
+
export declare function propToZodType(prop: EntityProp): Promise<z.ZodTypeAny>;
|
|
18
|
+
//# sourceMappingURL=zod-converter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod-converter.d.ts","sourceRoot":"","sources":["../../src/template/zod-converter.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,EACL,UAAU,EAoBV,aAAa,EACd,MAAM,gBAAgB,CAAC;AAOxB;;;GAGG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAe7E;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EACvB,OAAO,GAAE,MAAe,GACvB,aAAa,CA0Df;AA8CD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAmD3E"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import z from "zod";
|
|
2
|
+
import { EntityManager } from "../entity/entity-manager.js";
|
|
3
|
+
import { isBelongsToOneRelationProp, isBigIntegerProp, isBooleanProp, isDateProp, isDateTimeProp, isDecimalProp, isDoubleProp, isEnumProp, isFloatProp, isIntegerProp, isJsonProp, isOneToOneRelationProp, isRelationProp, isStringProp, isTextProp, isTimeProp, isTimestampProp, isUuidProp, isVirtualProp } from "../types/types.js";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import { createImportUrl } from "../utils/esm-utils.js";
|
|
6
|
+
import { Sonamu } from "../api/sonamu.js";
|
|
7
|
+
import inflection from "inflection";
|
|
8
|
+
import { getTextTypeLength } from "../api/index.js";
|
|
9
|
+
/**
|
|
10
|
+
* Zod 타입 ID로부터 동적으로 Zod 스키마를 로드합니다.
|
|
11
|
+
* dist 디렉토리에서 ESM으로 import하여 가져옵니다.
|
|
12
|
+
*/ export async function getZodTypeById(zodTypeId) {
|
|
13
|
+
const modulePath = EntityManager.getModulePath(zodTypeId);
|
|
14
|
+
const moduleAbsPath = path.join(Sonamu.apiRootPath, "dist", "application", modulePath + ".js");
|
|
15
|
+
const importUrl = createImportUrl(moduleAbsPath);
|
|
16
|
+
const imported = await import(importUrl);
|
|
17
|
+
if (!imported[zodTypeId]) {
|
|
18
|
+
throw new Error(`존재하지 않는 zodTypeId ${zodTypeId}`);
|
|
19
|
+
}
|
|
20
|
+
return imported[zodTypeId].describe(zodTypeId);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Zod 타입을 UI 렌더링에 사용할 수 있는 RenderingNode로 변환합니다.
|
|
24
|
+
* 재귀적으로 중첩된 타입들을 처리합니다.
|
|
25
|
+
*/ export function zodTypeToRenderingNode(zodType, baseKey = "root") {
|
|
26
|
+
const def = {
|
|
27
|
+
name: baseKey,
|
|
28
|
+
label: inflection.camelize(baseKey, false),
|
|
29
|
+
zodType
|
|
30
|
+
};
|
|
31
|
+
if (zodType instanceof z.ZodObject) {
|
|
32
|
+
const columnKeys = Object.keys(zodType.shape);
|
|
33
|
+
const children = columnKeys.map((key)=>{
|
|
34
|
+
const innerType = zodType.shape[key];
|
|
35
|
+
return zodTypeToRenderingNode(innerType, key);
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
...def,
|
|
39
|
+
renderType: "object",
|
|
40
|
+
children
|
|
41
|
+
};
|
|
42
|
+
} else if (zodType instanceof z.ZodArray) {
|
|
43
|
+
const innerType = zodType.def.element;
|
|
44
|
+
if (innerType instanceof z.ZodString && baseKey.includes("images")) {
|
|
45
|
+
return {
|
|
46
|
+
...def,
|
|
47
|
+
renderType: "array-images"
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
...def,
|
|
52
|
+
renderType: "array",
|
|
53
|
+
element: zodTypeToRenderingNode(innerType, baseKey)
|
|
54
|
+
};
|
|
55
|
+
} else if (zodType instanceof z.ZodUnion) {
|
|
56
|
+
const optionNodes = zodType.def.options.map((opt)=>zodTypeToRenderingNode(opt, baseKey));
|
|
57
|
+
// TODO: ZodUnion이 들어있는 경우 핸들링
|
|
58
|
+
return optionNodes[0];
|
|
59
|
+
} else if (zodType instanceof z.ZodOptional) {
|
|
60
|
+
return {
|
|
61
|
+
...zodTypeToRenderingNode(zodType.def.innerType, baseKey),
|
|
62
|
+
optional: true
|
|
63
|
+
};
|
|
64
|
+
} else if (zodType instanceof z.ZodNullable) {
|
|
65
|
+
return {
|
|
66
|
+
...zodTypeToRenderingNode(zodType.def.innerType, baseKey),
|
|
67
|
+
nullable: true
|
|
68
|
+
};
|
|
69
|
+
} else {
|
|
70
|
+
return {
|
|
71
|
+
...def,
|
|
72
|
+
renderType: resolveRenderType(baseKey, zodType)
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Zod 타입과 키 이름으로부터 적절한 RenderType을 결정합니다.
|
|
78
|
+
*/ function resolveRenderType(key, zodType) {
|
|
79
|
+
if (zodType instanceof z.ZodDate) {
|
|
80
|
+
return "datetime";
|
|
81
|
+
} else if (zodType instanceof z.ZodString) {
|
|
82
|
+
if (key.includes("img") || key.includes("image")) {
|
|
83
|
+
return "string-image";
|
|
84
|
+
} else if (zodType.description === "SQLDateTimeString") {
|
|
85
|
+
return "string-datetime";
|
|
86
|
+
} else if (key.endsWith("date")) {
|
|
87
|
+
return "string-date";
|
|
88
|
+
} else {
|
|
89
|
+
return "string-plain";
|
|
90
|
+
}
|
|
91
|
+
} else if (zodType instanceof z.ZodNumber) {
|
|
92
|
+
if (key === "id") {
|
|
93
|
+
return "number-id";
|
|
94
|
+
} else if (key.endsWith("_id")) {
|
|
95
|
+
return "number-fk_id";
|
|
96
|
+
} else {
|
|
97
|
+
return "number-plain";
|
|
98
|
+
}
|
|
99
|
+
} else if (zodType instanceof z.ZodBoolean) {
|
|
100
|
+
return "boolean";
|
|
101
|
+
} else if (zodType instanceof z.ZodEnum) {
|
|
102
|
+
return "enums";
|
|
103
|
+
} else if (zodType instanceof z.ZodRecord) {
|
|
104
|
+
return "record";
|
|
105
|
+
} else if (zodType instanceof z.ZodAny || zodType instanceof z.ZodUnknown) {
|
|
106
|
+
return "string-plain";
|
|
107
|
+
} else if (zodType instanceof z.ZodUnion) {
|
|
108
|
+
return "string-plain";
|
|
109
|
+
} else if (zodType instanceof z.ZodLiteral) {
|
|
110
|
+
return "string-plain";
|
|
111
|
+
} else {
|
|
112
|
+
throw new Error(`타입 파싱 불가 ${key} ${zodType.def.type}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* EntityProp을 Zod 타입으로 변환합니다.
|
|
117
|
+
* 각 prop의 타입에 따라 적절한 Zod validator를 생성합니다.
|
|
118
|
+
*/ export async function propToZodType(prop) {
|
|
119
|
+
let zodType = z.unknown();
|
|
120
|
+
if (isIntegerProp(prop)) {
|
|
121
|
+
zodType = z.number().int();
|
|
122
|
+
} else if (isBigIntegerProp(prop)) {
|
|
123
|
+
zodType = z.bigint();
|
|
124
|
+
} else if (isTextProp(prop)) {
|
|
125
|
+
zodType = z.string().max(getTextTypeLength(prop.textType));
|
|
126
|
+
} else if (isEnumProp(prop)) {
|
|
127
|
+
zodType = await getZodTypeById(prop.id);
|
|
128
|
+
} else if (isStringProp(prop)) {
|
|
129
|
+
zodType = z.string().max(prop.length);
|
|
130
|
+
} else if (isFloatProp(prop) || isDoubleProp(prop)) {
|
|
131
|
+
zodType = z.number();
|
|
132
|
+
} else if (isDecimalProp(prop)) {
|
|
133
|
+
zodType = z.string();
|
|
134
|
+
} else if (isBooleanProp(prop)) {
|
|
135
|
+
zodType = z.boolean();
|
|
136
|
+
} else if (isDateProp(prop)) {
|
|
137
|
+
zodType = z.string().length(10);
|
|
138
|
+
} else if (isTimeProp(prop)) {
|
|
139
|
+
zodType = z.string().length(8);
|
|
140
|
+
} else if (isDateTimeProp(prop)) {
|
|
141
|
+
zodType = z.date();
|
|
142
|
+
} else if (isTimestampProp(prop)) {
|
|
143
|
+
zodType = z.date();
|
|
144
|
+
} else if (isJsonProp(prop)) {
|
|
145
|
+
zodType = await getZodTypeById(prop.id);
|
|
146
|
+
} else if (isUuidProp(prop)) {
|
|
147
|
+
zodType = z.uuid();
|
|
148
|
+
} else if (isVirtualProp(prop)) {
|
|
149
|
+
zodType = await getZodTypeById(prop.id);
|
|
150
|
+
} else if (isRelationProp(prop)) {
|
|
151
|
+
if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
|
|
152
|
+
zodType = z.number().int();
|
|
153
|
+
}
|
|
154
|
+
} else {
|
|
155
|
+
throw new Error(`prop을 zodType으로 변환하는데 실패 ${prop}}`);
|
|
156
|
+
}
|
|
157
|
+
if (prop.unsigned) {
|
|
158
|
+
zodType = zodType.nonnegative();
|
|
159
|
+
}
|
|
160
|
+
if (prop.nullable) {
|
|
161
|
+
zodType = zodType.nullable();
|
|
162
|
+
}
|
|
163
|
+
return zodType;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS96b2QtY29udmVydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB6IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBFbnRpdHlQcm9wLFxuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNCaWdJbnRlZ2VyUHJvcCxcbiAgaXNCb29sZWFuUHJvcCxcbiAgaXNEYXRlUHJvcCxcbiAgaXNEYXRlVGltZVByb3AsXG4gIGlzRGVjaW1hbFByb3AsXG4gIGlzRG91YmxlUHJvcCxcbiAgaXNFbnVtUHJvcCxcbiAgaXNGbG9hdFByb3AsXG4gIGlzSW50ZWdlclByb3AsXG4gIGlzSnNvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1N0cmluZ1Byb3AsXG4gIGlzVGV4dFByb3AsXG4gIGlzVGltZVByb3AsXG4gIGlzVGltZXN0YW1wUHJvcCxcbiAgaXNVdWlkUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbiAgUmVuZGVyaW5nTm9kZSxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgY3JlYXRlSW1wb3J0VXJsIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyBnZXRUZXh0VHlwZUxlbmd0aCB9IGZyb20gXCIuLi9hcGlcIjtcblxuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICBjb25zdCBtb2R1bGVQYXRoID0gRW50aXR5TWFuYWdlci5nZXRNb2R1bGVQYXRoKHpvZFR5cGVJZCk7XG4gIGNvbnN0IG1vZHVsZUFic1BhdGggPSBwYXRoLmpvaW4oXG4gICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgIFwiZGlzdFwiLFxuICAgIFwiYXBwbGljYXRpb25cIixcbiAgICBtb2R1bGVQYXRoICsgXCIuanNcIlxuICApO1xuICBjb25zdCBpbXBvcnRVcmwgPSBjcmVhdGVJbXBvcnRVcmwobW9kdWxlQWJzUGF0aCk7XG4gIGNvbnN0IGltcG9ydGVkID0gYXdhaXQgaW1wb3J0KGltcG9ydFVybCk7XG5cbiAgaWYgKCFpbXBvcnRlZFt6b2RUeXBlSWRdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHpvZFR5cGVJZCAke3pvZFR5cGVJZH1gKTtcbiAgfVxuICByZXR1cm4gaW1wb3J0ZWRbem9kVHlwZUlkXS5kZXNjcmliZSh6b2RUeXBlSWQpO1xufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXsnYQgVUkg66CM642U66eB7JeQIOyCrOyaqe2VoCDsiJgg7J6I64qUIFJlbmRlcmluZ05vZGXroZwg67OA7ZmY7ZWp64uI64ukLlxuICog7J6s6reA7KCB7Jy866GcIOykkeyyqeuQnCDtg4DsnoXrk6TsnYQg7LKY66as7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgem9kVHlwZTogei5ab2RUeXBlPGFueT4sXG4gIGJhc2VLZXk6IHN0cmluZyA9IFwicm9vdFwiXG4pOiBSZW5kZXJpbmdOb2RlIHtcbiAgY29uc3QgZGVmID0ge1xuICAgIG5hbWU6IGJhc2VLZXksXG4gICAgbGFiZWw6IGluZmxlY3Rpb24uY2FtZWxpemUoYmFzZUtleSwgZmFsc2UpLFxuICAgIHpvZFR5cGUsXG4gIH07XG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RPYmplY3QpIHtcbiAgICBjb25zdCBjb2x1bW5LZXlzID0gT2JqZWN0LmtleXMoem9kVHlwZS5zaGFwZSk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjb2x1bW5LZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUeXBlLnNoYXBlW2tleV07XG4gICAgICByZXR1cm4gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGtleSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBjaGlsZHJlbixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFycmF5KSB7XG4gICAgY29uc3QgaW5uZXJUeXBlID0gKHpvZFR5cGUgYXMgei5ab2RBcnJheTx6LlpvZFR5cGU8YW55Pj4pLmRlZi5lbGVtZW50O1xuICAgIGlmIChpbm5lclR5cGUgaW5zdGFuY2VvZiB6LlpvZFN0cmluZyAmJiBiYXNlS2V5LmluY2x1ZGVzKFwiaW1hZ2VzXCIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWYsXG4gICAgICAgIHJlbmRlclR5cGU6IFwiYXJyYXktaW1hZ2VzXCIsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJhcnJheVwiLFxuICAgICAgZWxlbWVudDogem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICBjb25zdCBvcHRpb25Ob2RlcyA9ICh6b2RUeXBlIGFzIHouWm9kVW5pb248ei5ab2RUeXBlW10+KS5kZWYub3B0aW9ucy5tYXAoXG4gICAgICAob3B0KSA9PiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKG9wdCwgYmFzZUtleSlcbiAgICApO1xuICAgIC8vIFRPRE86IFpvZFVuaW9u7J20IOuTpOyWtOyeiOuKlCDqsr3smrAg7ZW465Ok66eBXG4gICAgcmV0dXJuIG9wdGlvbk5vZGVzWzBdO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9wdGlvbmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gICAgICAgICh6b2RUeXBlIGFzIHouWm9kT3B0aW9uYWw8ei5ab2RUeXBlPikuZGVmLmlubmVyVHlwZSxcbiAgICAgICAgYmFzZUtleVxuICAgICAgKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVsbGFibGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgICAgICAgKHpvZFR5cGUgYXMgei5ab2ROdWxsYWJsZTx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLFxuICAgICAgICBiYXNlS2V5XG4gICAgICApLFxuICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogcmVzb2x2ZVJlbmRlclR5cGUoYmFzZUtleSwgem9kVHlwZSksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXqs7wg7YKkIOydtOumhOycvOuhnOu2gO2EsCDsoIHsoIjtlZwgUmVuZGVyVHlwZeydhCDqsrDsoJXtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSZW5kZXJUeXBlKFxuICBrZXk6IHN0cmluZyxcbiAgem9kVHlwZTogei5ab2RUeXBlQW55XG4pOiBSZW5kZXJpbmdOb2RlW1wicmVuZGVyVHlwZVwiXSB7XG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2REYXRlKSB7XG4gICAgcmV0dXJuIFwiZGF0ZXRpbWVcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RTdHJpbmcpIHtcbiAgICBpZiAoa2V5LmluY2x1ZGVzKFwiaW1nXCIpIHx8IGtleS5pbmNsdWRlcyhcImltYWdlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctaW1hZ2VcIjtcbiAgICB9IGVsc2UgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU1FMRGF0ZVRpbWVTdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGV0aW1lXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJkYXRlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZGF0ZVwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyKSB7XG4gICAgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItaWRcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLWZrX2lkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1wbGFpblwiO1xuICAgIH1cbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RCb29sZWFuKSB7XG4gICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEVudW0pIHtcbiAgICByZXR1cm4gXCJlbnVtc1wiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFJlY29yZCkge1xuICAgIHJldHVybiBcInJlY29yZFwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFueSB8fCB6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmtub3duKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RMaXRlcmFsKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7IuxIOu2iOqwgCAke2tleX0gJHt6b2RUeXBlLmRlZi50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOqwgSBwcm9w7J2YIO2DgOyeheyXkCDrlLDrnbwg7KCB7KCI7ZWcIFpvZCB2YWxpZGF0b3Lrpbwg7IOd7ISx7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvcFRvWm9kVHlwZShwcm9wOiBFbnRpdHlQcm9wKTogUHJvbWlzZTx6LlpvZFR5cGVBbnk+IHtcbiAgbGV0IHpvZFR5cGU6IHouWm9kVHlwZUFueSA9IHoudW5rbm93bigpO1xuICBpZiAoaXNJbnRlZ2VyUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlclByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5iaWdpbnQoKTtcbiAgfSBlbHNlIGlmIChpc1RleHRQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCkubWF4KGdldFRleHRUeXBlTGVuZ3RoKHByb3AudGV4dFR5cGUpKTtcbiAgfSBlbHNlIGlmIChpc0VudW1Qcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gIH0gZWxzZSBpZiAoaXNGbG9hdFByb3AocHJvcCkgfHwgaXNEb3VibGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCk7XG4gIH0gZWxzZSBpZiAoaXNEZWNpbWFsUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5ib29sZWFuKCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLmxlbmd0aCgxMCk7XG4gIH0gZWxzZSBpZiAoaXNUaW1lUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLmxlbmd0aCg4KTtcbiAgfSBlbHNlIGlmIChpc0RhdGVUaW1lUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmRhdGUoKTtcbiAgfSBlbHNlIGlmIChpc1RpbWVzdGFtcFByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCk7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoudXVpZCgpO1xuICB9IGVsc2UgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoXG4gICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICkge1xuICAgICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgcHJvcOydhCB6b2RUeXBl7Jy866GcIOuzgO2ZmO2VmOuKlOuNsCDsi6TtjKggJHtwcm9wfX1gKTtcbiAgfVxuXG4gIGlmICgocHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9KS51bnNpZ25lZCkge1xuICAgIHpvZFR5cGUgPSAoem9kVHlwZSBhcyB6LlpvZE51bWJlcikubm9ubmVnYXRpdmUoKTtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHpvZFR5cGUgPSB6b2RUeXBlLm51bGxhYmxlKCk7XG4gIH1cblxuICByZXR1cm4gem9kVHlwZTtcbn1cbiJdLCJuYW1lcyI6WyJ6IiwiRW50aXR5TWFuYWdlciIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNCaWdJbnRlZ2VyUHJvcCIsImlzQm9vbGVhblByb3AiLCJpc0RhdGVQcm9wIiwiaXNEYXRlVGltZVByb3AiLCJpc0RlY2ltYWxQcm9wIiwiaXNEb3VibGVQcm9wIiwiaXNFbnVtUHJvcCIsImlzRmxvYXRQcm9wIiwiaXNJbnRlZ2VyUHJvcCIsImlzSnNvblByb3AiLCJpc09uZVRvT25lUmVsYXRpb25Qcm9wIiwiaXNSZWxhdGlvblByb3AiLCJpc1N0cmluZ1Byb3AiLCJpc1RleHRQcm9wIiwiaXNUaW1lUHJvcCIsImlzVGltZXN0YW1wUHJvcCIsImlzVXVpZFByb3AiLCJpc1ZpcnR1YWxQcm9wIiwicGF0aCIsImNyZWF0ZUltcG9ydFVybCIsIlNvbmFtdSIsImluZmxlY3Rpb24iLCJnZXRUZXh0VHlwZUxlbmd0aCIsImdldFpvZFR5cGVCeUlkIiwiem9kVHlwZUlkIiwibW9kdWxlUGF0aCIsImdldE1vZHVsZVBhdGgiLCJtb2R1bGVBYnNQYXRoIiwiam9pbiIsImFwaVJvb3RQYXRoIiwiaW1wb3J0VXJsIiwiaW1wb3J0ZWQiLCJFcnJvciIsImRlc2NyaWJlIiwiem9kVHlwZVRvUmVuZGVyaW5nTm9kZSIsInpvZFR5cGUiLCJiYXNlS2V5IiwiZGVmIiwibmFtZSIsImxhYmVsIiwiY2FtZWxpemUiLCJab2RPYmplY3QiLCJjb2x1bW5LZXlzIiwiT2JqZWN0Iiwia2V5cyIsInNoYXBlIiwiY2hpbGRyZW4iLCJtYXAiLCJrZXkiLCJpbm5lclR5cGUiLCJyZW5kZXJUeXBlIiwiWm9kQXJyYXkiLCJlbGVtZW50IiwiWm9kU3RyaW5nIiwiaW5jbHVkZXMiLCJab2RVbmlvbiIsIm9wdGlvbk5vZGVzIiwib3B0aW9ucyIsIm9wdCIsIlpvZE9wdGlvbmFsIiwib3B0aW9uYWwiLCJab2ROdWxsYWJsZSIsIm51bGxhYmxlIiwicmVzb2x2ZVJlbmRlclR5cGUiLCJab2REYXRlIiwiZGVzY3JpcHRpb24iLCJlbmRzV2l0aCIsIlpvZE51bWJlciIsIlpvZEJvb2xlYW4iLCJab2RFbnVtIiwiWm9kUmVjb3JkIiwiWm9kQW55IiwiWm9kVW5rbm93biIsIlpvZExpdGVyYWwiLCJ0eXBlIiwicHJvcFRvWm9kVHlwZSIsInByb3AiLCJ1bmtub3duIiwibnVtYmVyIiwiaW50IiwiYmlnaW50Iiwic3RyaW5nIiwibWF4IiwidGV4dFR5cGUiLCJpZCIsImxlbmd0aCIsImJvb2xlYW4iLCJkYXRlIiwidXVpZCIsImhhc0pvaW5Db2x1bW4iLCJ1bnNpZ25lZCIsIm5vbm5lZ2F0aXZlIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxPQUFPLE1BQU07QUFDcEIsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUVFQywwQkFBMEIsRUFDMUJDLGdCQUFnQixFQUNoQkMsYUFBYSxFQUNiQyxVQUFVLEVBQ1ZDLGNBQWMsRUFDZEMsYUFBYSxFQUNiQyxZQUFZLEVBQ1pDLFVBQVUsRUFDVkMsV0FBVyxFQUNYQyxhQUFhLEVBQ2JDLFVBQVUsRUFD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
|
|
@@ -1,2 +1,80 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { EntityManager } from "../entity/entity-manager.js";
|
|
2
|
+
import { isRelationProp, isBelongsToOneRelationProp, isOneToOneRelationProp, isManyToManyRelationProp } from "../types/types.js";
|
|
3
|
+
// 관계 그래프 처리를 별도 클래스로 분리
|
|
4
|
+
export class RelationGraph {
|
|
5
|
+
graph = new Map();
|
|
6
|
+
buildGraph(fixtures) {
|
|
7
|
+
this.graph.clear();
|
|
8
|
+
// 1. 노드 추가
|
|
9
|
+
for (const fixture of fixtures){
|
|
10
|
+
this.graph.set(fixture.fixtureId, {
|
|
11
|
+
fixtureId: fixture.fixtureId,
|
|
12
|
+
entityId: fixture.entityId,
|
|
13
|
+
related: new Set()
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
// 2. 의존성 추가
|
|
17
|
+
for (const fixture of fixtures){
|
|
18
|
+
const node = this.graph.get(fixture.fixtureId);
|
|
19
|
+
for (const [, column] of Object.entries(fixture.columns)){
|
|
20
|
+
const prop = column.prop;
|
|
21
|
+
if (isRelationProp(prop)) {
|
|
22
|
+
if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
|
|
23
|
+
const relatedFixtureId = `${prop.with}#${column.value}`;
|
|
24
|
+
if (this.graph.has(relatedFixtureId)) {
|
|
25
|
+
node.related.add(relatedFixtureId);
|
|
26
|
+
}
|
|
27
|
+
} else if (isManyToManyRelationProp(prop)) {
|
|
28
|
+
// ManyToMany 관계의 경우 양방향 의존성 추가
|
|
29
|
+
const relatedIds = column.value;
|
|
30
|
+
for (const relatedId of relatedIds){
|
|
31
|
+
const relatedFixtureId = `${prop.with}#${relatedId}`;
|
|
32
|
+
if (this.graph.has(relatedFixtureId)) {
|
|
33
|
+
node.related.add(relatedFixtureId);
|
|
34
|
+
this.graph.get(relatedFixtureId).related.add(fixture.fixtureId);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
getInsertionOrder() {
|
|
43
|
+
const visited = new Set();
|
|
44
|
+
const order = [];
|
|
45
|
+
const tempVisited = new Set();
|
|
46
|
+
const visit = (fixtureId)=>{
|
|
47
|
+
if (visited.has(fixtureId)) return;
|
|
48
|
+
if (tempVisited.has(fixtureId)) {
|
|
49
|
+
console.warn(`Circular dependency detected involving: ${fixtureId}`);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
tempVisited.add(fixtureId);
|
|
53
|
+
const node = this.graph.get(fixtureId);
|
|
54
|
+
const entity = EntityManager.get(node.entityId);
|
|
55
|
+
for (const depId of node.related){
|
|
56
|
+
const depNode = this.graph.get(depId);
|
|
57
|
+
// BelongsToOne 관계이면서 nullable이 아닌 경우 먼저 방문
|
|
58
|
+
const relationProp = entity.props.find((prop)=>isRelationProp(prop) && (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) && prop.with === depNode.entityId);
|
|
59
|
+
if (relationProp && !relationProp.nullable) {
|
|
60
|
+
visit(depId);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
tempVisited.delete(fixtureId);
|
|
64
|
+
visited.add(fixtureId);
|
|
65
|
+
order.push(fixtureId);
|
|
66
|
+
};
|
|
67
|
+
for (const fixtureId of this.graph.keys()){
|
|
68
|
+
visit(fixtureId);
|
|
69
|
+
}
|
|
70
|
+
// circular dependency로 인해 방문되지 않은 fixtureId 추가
|
|
71
|
+
for (const fixtureId of this.graph.keys()){
|
|
72
|
+
if (!visited.has(fixtureId)) {
|
|
73
|
+
order.push(fixtureId);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return order;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL19yZWxhdGlvbi1ncmFwaC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWxhdGlvbk5vZGUsIEVudGl0eVByb3AsIEZpeHR1cmVSZWNvcmQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5cbi8vIOq0gOqzhCDqt7jrnpjtlIQg7LKY66as66W8IOuzhOuPhCDtgbTrnpjsiqTroZwg67aE66asXG5leHBvcnQgY2xhc3MgUmVsYXRpb25HcmFwaCB7XG4gIHByaXZhdGUgZ3JhcGg6IE1hcDxzdHJpbmcsIFJlbGF0aW9uTm9kZT4gPSBuZXcgTWFwKCk7XG5cbiAgYnVpbGRHcmFwaChmaXh0dXJlczogRml4dHVyZVJlY29yZFtdKTogdm9pZCB7XG4gICAgdGhpcy5ncmFwaC5jbGVhcigpO1xuXG4gICAgLy8gMS4g64W465OcIOy2lOqwgFxuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgdGhpcy5ncmFwaC5zZXQoZml4dHVyZS5maXh0dXJlSWQsIHtcbiAgICAgICAgZml4dHVyZUlkOiBmaXh0dXJlLmZpeHR1cmVJZCxcbiAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgIHJlbGF0ZWQ6IG5ldyBTZXQoKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIDIuIOydmOyhtOyEsSDstpTqsIBcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdyYXBoLmdldChmaXh0dXJlLmZpeHR1cmVJZCkhO1xuXG4gICAgICBmb3IgKGNvbnN0IFssIGNvbHVtbl0gb2YgT2JqZWN0LmVudHJpZXMoZml4dHVyZS5jb2x1bW5zKSkge1xuICAgICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3AgYXMgRW50aXR5UHJvcDtcblxuICAgICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtjb2x1bW4udmFsdWV9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyYXBoLmhhcyhyZWxhdGVkRml4dHVyZUlkKSkge1xuICAgICAgICAgICAgICBub2RlLnJlbGF0ZWQuYWRkKHJlbGF0ZWRGaXh0dXJlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBNYW55VG9NYW55IOq0gOqzhOydmCDqsr3smrAg7JaR67Cp7ZalIOydmOyhtOyEsSDstpTqsIBcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBjb2x1bW4udmFsdWUgYXMgbnVtYmVyW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF0ZWRJZCBvZiByZWxhdGVkSWRzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRGaXh0dXJlSWQgPSBgJHtwcm9wLndpdGh9IyR7cmVsYXRlZElkfWA7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmdyYXBoLmhhcyhyZWxhdGVkRml4dHVyZUlkKSkge1xuICAgICAgICAgICAgICAgIG5vZGUucmVsYXRlZC5hZGQocmVsYXRlZEZpeHR1cmVJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmFwaFxuICAgICAgICAgICAgICAgICAgLmdldChyZWxhdGVkRml4dHVyZUlkKSFcbiAgICAgICAgICAgICAgICAgIC5yZWxhdGVkLmFkZChmaXh0dXJlLmZpeHR1cmVJZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRJbnNlcnRpb25PcmRlcigpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IG9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHRlbXBWaXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCB2aXNpdCA9IChmaXh0dXJlSWQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKHZpc2l0ZWQuaGFzKGZpeHR1cmVJZCkpIHJldHVybjtcbiAgICAgIGlmICh0ZW1wVmlzaXRlZC5oYXMoZml4dHVyZUlkKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQgaW52b2x2aW5nOiAke2ZpeHR1cmVJZH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0ZW1wVmlzaXRlZC5hZGQoZml4dHVyZUlkKTtcblxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ3JhcGguZ2V0KGZpeHR1cmVJZCkhO1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQobm9kZS5lbnRpdHlJZCk7XG5cbiAgICAgIGZvciAoY29uc3QgZGVwSWQgb2Ygbm9kZS5yZWxhdGVkKSB7XG4gICAgICAgIGNvbnN0IGRlcE5vZGUgPSB0aGlzLmdyYXBoLmdldChkZXBJZCkhO1xuXG4gICAgICAgIC8vIEJlbG9uZ3NUb09uZSDqtIDqs4TsnbTrqbTshJwgbnVsbGFibGXsnbQg7JWE64uMIOqyveyasCDrqLzsoIAg67Cp66y4XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKFxuICAgICAgICAgIChwcm9wKSA9PlxuICAgICAgICAgICAgaXNSZWxhdGlvblByb3AocHJvcCkgJiZcbiAgICAgICAgICAgIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgICAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSAmJlxuICAgICAgICAgICAgcHJvcC53aXRoID09PSBkZXBOb2RlLmVudGl0eUlkXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZWxhdGlvblByb3AgJiYgIXJlbGF0aW9uUHJvcC5udWxsYWJsZSkge1xuICAgICAgICAgIHZpc2l0KGRlcElkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0ZW1wVmlzaXRlZC5kZWxldGUoZml4dHVyZUlkKTtcbiAgICAgIHZpc2l0ZWQuYWRkKGZpeHR1cmVJZCk7XG4gICAgICBvcmRlci5wdXNoKGZpeHR1cmVJZCk7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgZml4dHVyZUlkIG9mIHRoaXMuZ3JhcGgua2V5cygpKSB7XG4gICAgICB2aXNpdChmaXh0dXJlSWQpO1xuICAgIH1cblxuICAgIC8vIGNpcmN1bGFyIGRlcGVuZGVuY3nroZwg7J247ZW0IOuwqeusuOuQmOyngCDslYrsnYAgZml4dHVyZUlkIOy2lOqwgFxuICAgIGZvciAoY29uc3QgZml4dHVyZUlkIG9mIHRoaXMuZ3JhcGgua2V5cygpKSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGZpeHR1cmVJZCkpIHtcbiAgICAgICAgb3JkZXIucHVzaChmaXh0dXJlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvcmRlcjtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIkVudGl0eU1hbmFnZXIiLCJpc1JlbGF0aW9uUHJvcCIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNPbmVUb09uZVJlbGF0aW9uUHJvcCIsImlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCIsIlJlbGF0aW9uR3JhcGgiLCJncmFwaCIsIk1hcCIsImJ1aWxkR3JhcGgiLCJmaXh0dXJlcyIsImNsZWFyIiwiZml4dHVyZSIsInNldCIsImZpeHR1cmVJZCIsImVudGl0eUlkIiwicmVsYXRlZCIsIlNldCIsIm5vZGUiLCJnZXQiLCJjb2x1bW4iLCJPYmplY3QiLCJlbnRyaWVzIiwiY29sdW1ucyIsInByb3AiLCJoYXNKb2luQ29sdW1uIiwicmVsYXRlZEZpeHR1cmVJZCIsIndpdGgiLCJ2YWx1ZSIsImhhcyIsImFkZCIsInJlbGF0ZWRJZHMiLCJyZWxhdGVkSWQiLCJnZXRJbnNlcnRpb25PcmRlciIsInZpc2l0ZWQiLCJvcmRlciIsInRlbXBWaXNpdGVkIiwidmlzaXQiLCJjb25zb2xlIiwid2FybiIsImVudGl0eSIsImRlcElkIiwiZGVwTm9kZSIsInJlbGF0aW9uUHJvcCIsInByb3BzIiwiZmluZCIsIm51bGxhYmxlIiwiZGVsZXRlIiwicHVzaCIsImtleXMiXSwibWFwcGluZ3MiOiJBQUNBLFNBQVNBLGFBQWEsUUFBUSw4QkFBMkI7QUFDekQsU0FDRUMsY0FBYyxFQUNkQywwQkFBMEIsRUFDMUJDLHNCQUFzQixFQUN0QkMsd0JBQXdCLFFBQ25CLG9CQUFpQjtBQUV4Qix3QkFBd0I7QUFDeEIsT0FBTyxNQUFNQztJQUNIQyxRQUFtQyxJQUFJQyxNQUFNO0lBRXJEQyxXQUFXQyxRQUF5QixFQUFRO1FBQzFDLElBQUksQ0FBQ0gsS0FBSyxDQUFDSSxLQUFLO1FBRWhCLFdBQVc7UUFDWCxLQUFLLE1BQU1DLFdBQVdGLFNBQVU7WUFDOUIsSUFBSSxDQUFDSCxLQUFLLENBQUNNLEdBQUcsQ0FBQ0QsUUFBUUUsU0FBUyxFQUFFO2dCQUNoQ0EsV0FBV0YsUUFBUUUsU0FBUztnQkFDNUJDLFVBQVVILFFBQVFHLFFBQVE7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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixture-manager.d.ts","sourceRoot":"","sources":["../../src/testing/fixture-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EAQrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI1C,OAAa,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IAED,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IACD,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAQ;IAEzC,OAAO,CAAC,aAAa,CAAuB;IAE5C,IAAI;IA0BE,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE;IAmEnC,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM;IAKvC,IAAI;IAgEV,OAAO,CAAC,cAAc,CAAqB;IACrC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE;IAwB7C,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,MAAM,EAAE,CAAC;IA8Ed,OAAO;IAYP,WAAW,CACf,YAAY,EAAE,MAAM,cAAc,EAClC,YAAY,EAAE,MAAM,cAAc,EAClC,aAAa,EAAE,oBAAoB;
|
|
1
|
+
{"version":3,"file":"fixture-manager.d.ts","sourceRoot":"","sources":["../../src/testing/fixture-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EAQrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI1C,OAAa,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IAED,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IACD,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAQ;IAEzC,OAAO,CAAC,aAAa,CAAuB;IAE5C,IAAI;IA0BE,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE;IAmEnC,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM;IAKvC,IAAI;IAgEV,OAAO,CAAC,cAAc,CAAqB;IACrC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE;IAwB7C,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,MAAM,EAAE,CAAC;IA8Ed,OAAO;IAYP,WAAW,CACf,YAAY,EAAE,MAAM,cAAc,EAClC,YAAY,EAAE,MAAM,cAAc,EAClC,aAAa,EAAE,oBAAoB;IA6E/B,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,GAAG,CAAC,EAAE,IAAI,CAAC;KACZ,GACA,OAAO,CAAC,aAAa,EAAE,CAAC;IAoFrB,cAAc,CAClB,MAAM,EAAE,MAAM,cAAc,EAC5B,SAAS,EAAE,aAAa,EAAE;IA2D5B,OAAO,CAAC,iBAAiB;YA0BX,aAAa;YAmCb,yBAAyB;IAkDjC,gBAAgB,CAAC,IAAI,EAAE,MAAM;YAsBrB,oBAAoB;CAyCnC;AACD,eAAO,MAAM,cAAc,qBAA4B,CAAC"}
|