sonamu 0.4.14 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.swcrc +15 -0
- package/dist/api/base-frame.d.ts +8 -0
- package/dist/api/base-frame.d.ts.map +1 -0
- package/dist/api/base-frame.js +2 -0
- package/dist/api/base-frame.js.map +1 -0
- package/dist/api/caster.d.ts +5 -0
- package/dist/api/caster.d.ts.map +1 -0
- package/dist/api/caster.js +2 -0
- package/dist/api/caster.js.map +1 -0
- package/dist/api/code-converters.d.ts +23 -0
- package/dist/api/code-converters.d.ts.map +1 -0
- package/dist/api/code-converters.js +2 -0
- package/dist/api/code-converters.js.map +1 -0
- package/dist/api/context.d.ts +19 -0
- package/dist/api/context.d.ts.map +1 -0
- package/dist/api/context.js +2 -0
- package/dist/api/context.js.map +1 -0
- package/dist/api/decorators.d.ts +50 -0
- package/dist/api/decorators.d.ts.map +1 -0
- package/dist/api/decorators.js +2 -0
- package/dist/api/decorators.js.map +1 -0
- package/dist/api/index.d.ts +8 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +2 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/sonamu.d.ts +84 -0
- package/dist/api/sonamu.d.ts.map +1 -0
- package/dist/api/sonamu.js +2 -0
- package/dist/api/sonamu.js.map +1 -0
- package/dist/bin/build-config.d.ts +9 -0
- package/dist/bin/build-config.d.ts.map +1 -0
- package/dist/bin/build-config.js +2 -0
- package/dist/bin/build-config.js.map +1 -0
- package/dist/bin/cli-wrapper.d.ts +2 -0
- package/dist/bin/cli-wrapper.d.ts.map +1 -0
- package/dist/bin/cli-wrapper.js +1 -38
- package/dist/bin/cli-wrapper.js.map +1 -1
- package/dist/bin/cli.d.ts +2 -2
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +1 -903
- package/dist/bin/cli.js.map +1 -1
- package/dist/database/_batch_update.d.ts +15 -0
- package/dist/database/_batch_update.d.ts.map +1 -0
- package/dist/database/_batch_update.js +2 -0
- package/dist/database/_batch_update.js.map +1 -0
- package/dist/database/base-model.d.ts +48 -0
- package/dist/database/base-model.d.ts.map +1 -0
- package/dist/database/base-model.js +2 -0
- package/dist/database/base-model.js.map +1 -0
- package/dist/database/code-generator.d.ts +13 -0
- package/dist/database/code-generator.d.ts.map +1 -0
- package/dist/database/code-generator.js +2 -0
- package/dist/database/code-generator.js.map +1 -0
- package/dist/database/db.d.ts +40 -0
- package/dist/database/db.d.ts.map +1 -0
- package/dist/database/db.js +2 -0
- package/dist/database/db.js.map +1 -0
- package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +2 -0
- package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +1 -0
- package/dist/database/knex-plugins/knex-on-duplicate-update.js +2 -0
- package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +1 -0
- package/dist/database/puri-wrapper.d.ts +34 -0
- package/dist/database/puri-wrapper.d.ts.map +1 -0
- package/dist/database/puri-wrapper.js +2 -0
- package/dist/database/puri-wrapper.js.map +1 -0
- package/dist/database/puri.d.ts +83 -0
- package/dist/database/puri.d.ts.map +1 -0
- package/dist/database/puri.js +2 -0
- package/dist/database/puri.js.map +1 -0
- package/dist/database/puri.types.d.ts +60 -0
- package/dist/database/puri.types.d.ts.map +1 -0
- package/dist/database/puri.types.js +2 -0
- package/dist/database/puri.types.js.map +1 -0
- package/dist/database/transaction-context.d.ts +9 -0
- package/dist/database/transaction-context.d.ts.map +1 -0
- package/dist/database/transaction-context.js +2 -0
- package/dist/database/transaction-context.js.map +1 -0
- package/dist/database/upsert-builder.d.ts +34 -0
- package/dist/database/upsert-builder.d.ts.map +1 -0
- package/dist/database/upsert-builder.js +2 -0
- package/dist/database/upsert-builder.js.map +1 -0
- package/dist/entity/entity-manager.d.ts +32 -0
- package/dist/entity/entity-manager.d.ts.map +1 -0
- package/dist/entity/entity-manager.js +2 -0
- package/dist/entity/entity-manager.js.map +1 -0
- package/dist/entity/entity-utils.d.ts +61 -0
- package/dist/entity/entity-utils.d.ts.map +1 -0
- package/dist/entity/entity-utils.js +2 -0
- package/dist/entity/entity-utils.js.map +1 -0
- package/dist/entity/entity.d.ts +62 -0
- package/dist/entity/entity.d.ts.map +1 -0
- package/dist/entity/entity.js +2 -0
- package/dist/entity/entity.js.map +1 -0
- package/dist/entity/migrator.d.ts +135 -0
- package/dist/entity/migrator.d.ts.map +1 -0
- package/dist/entity/migrator.js +2 -0
- package/dist/entity/migrator.js.map +1 -0
- package/dist/exceptions/error-handler.d.ts +3 -0
- package/dist/exceptions/error-handler.d.ts.map +1 -0
- package/dist/exceptions/error-handler.js +2 -0
- package/dist/exceptions/error-handler.js.map +1 -0
- package/dist/exceptions/so-exceptions.d.ts +48 -0
- package/dist/exceptions/so-exceptions.d.ts.map +1 -0
- package/dist/exceptions/so-exceptions.js +2 -0
- package/dist/exceptions/so-exceptions.js.map +1 -0
- package/dist/file-storage/driver.d.ts +48 -0
- package/dist/file-storage/driver.d.ts.map +1 -0
- package/dist/file-storage/driver.js +2 -0
- package/dist/file-storage/driver.js.map +1 -0
- package/dist/file-storage/file-storage.d.ts +50 -0
- package/dist/file-storage/file-storage.d.ts.map +1 -0
- package/dist/file-storage/file-storage.js +2 -0
- package/dist/file-storage/file-storage.js.map +1 -0
- package/dist/index.d.ts +23 -813
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -433
- package/dist/index.js.map +1 -1
- package/dist/migration/code-generation.d.ts +15 -0
- package/dist/migration/code-generation.d.ts.map +1 -0
- package/dist/migration/code-generation.js +2 -0
- package/dist/migration/code-generation.js.map +1 -0
- package/dist/migration/migration-set.d.ts +17 -0
- package/dist/migration/migration-set.d.ts.map +1 -0
- package/dist/migration/migration-set.js +2 -0
- package/dist/migration/migration-set.js.map +1 -0
- package/dist/migration/migrator.d.ts +130 -0
- package/dist/migration/migrator.d.ts.map +1 -0
- package/dist/migration/migrator.js +2 -0
- package/dist/migration/migrator.js.map +1 -0
- package/dist/migration/types.d.ts +52 -0
- package/dist/migration/types.d.ts.map +1 -0
- package/dist/migration/types.js +2 -0
- package/dist/migration/types.js.map +1 -0
- package/dist/stream/index.d.ts +2 -0
- package/dist/stream/index.d.ts.map +1 -0
- package/dist/stream/index.js +2 -0
- package/dist/stream/index.js.map +1 -0
- package/dist/stream/sse.d.ts +13 -0
- package/dist/stream/sse.d.ts.map +1 -0
- package/dist/stream/sse.js +2 -0
- package/dist/stream/sse.js.map +1 -0
- package/dist/syncer/index.d.ts +2 -0
- package/dist/syncer/index.d.ts.map +1 -0
- package/dist/syncer/index.js +2 -0
- package/dist/syncer/index.js.map +1 -0
- package/dist/syncer/syncer.d.ts +127 -0
- package/dist/syncer/syncer.d.ts.map +1 -0
- package/dist/syncer/syncer.js +2 -0
- package/dist/syncer/syncer.js.map +1 -0
- package/dist/templates/base-template.d.ts +13 -0
- package/dist/templates/base-template.d.ts.map +1 -0
- package/dist/templates/base-template.js +2 -0
- package/dist/templates/base-template.js.map +1 -0
- package/dist/templates/entity.template.d.ts +17 -0
- package/dist/templates/entity.template.d.ts.map +1 -0
- package/dist/templates/entity.template.js +2 -0
- package/dist/templates/entity.template.js.map +1 -0
- package/dist/templates/generated.template.d.ts +27 -0
- package/dist/templates/generated.template.d.ts.map +1 -0
- package/dist/templates/generated.template.js +2 -0
- package/dist/templates/generated.template.js.map +1 -0
- package/dist/templates/generated_http.template.d.ts +24 -0
- package/dist/templates/generated_http.template.d.ts.map +1 -0
- package/dist/templates/generated_http.template.js +2 -0
- package/dist/templates/generated_http.template.js.map +1 -0
- package/dist/templates/generated_sso.template.d.ts +20 -0
- package/dist/templates/generated_sso.template.d.ts.map +1 -0
- package/dist/templates/generated_sso.template.js +2 -0
- package/dist/templates/generated_sso.template.js.map +1 -0
- package/dist/templates/index.d.ts +2 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +2 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/init_types.template.d.ts +17 -0
- package/dist/templates/init_types.template.d.ts.map +1 -0
- package/dist/templates/init_types.template.js +2 -0
- package/dist/templates/init_types.template.js.map +1 -0
- package/dist/templates/model.template.d.ts +17 -0
- package/dist/templates/model.template.d.ts.map +1 -0
- package/dist/templates/model.template.js +2 -0
- package/dist/templates/model.template.js.map +1 -0
- package/dist/templates/model_test.template.d.ts +17 -0
- package/dist/templates/model_test.template.d.ts.map +1 -0
- package/dist/templates/model_test.template.js +2 -0
- package/dist/templates/model_test.template.js.map +1 -0
- package/dist/templates/service.template.d.ts +29 -0
- package/dist/templates/service.template.d.ts.map +1 -0
- package/dist/templates/service.template.js +2 -0
- package/dist/templates/service.template.js.map +1 -0
- package/dist/templates/view_enums_buttonset.template.d.ts +17 -0
- package/dist/templates/view_enums_buttonset.template.d.ts.map +1 -0
- package/dist/templates/view_enums_buttonset.template.js +2 -0
- package/dist/templates/view_enums_buttonset.template.js.map +1 -0
- package/dist/templates/view_enums_dropdown.template.d.ts +18 -0
- package/dist/templates/view_enums_dropdown.template.d.ts.map +1 -0
- package/dist/templates/view_enums_dropdown.template.js +2 -0
- package/dist/templates/view_enums_dropdown.template.js.map +1 -0
- package/dist/templates/view_enums_select.template.d.ts +17 -0
- package/dist/templates/view_enums_select.template.d.ts.map +1 -0
- package/dist/templates/view_enums_select.template.js +2 -0
- package/dist/templates/view_enums_select.template.js.map +1 -0
- package/dist/templates/view_form.template.d.ts +26 -0
- package/dist/templates/view_form.template.d.ts.map +1 -0
- package/dist/templates/view_form.template.js +2 -0
- package/dist/templates/view_form.template.js.map +1 -0
- package/dist/templates/view_id_all_select.template.d.ts +17 -0
- package/dist/templates/view_id_all_select.template.d.ts.map +1 -0
- package/dist/templates/view_id_all_select.template.js +2 -0
- package/dist/templates/view_id_all_select.template.js.map +1 -0
- package/dist/templates/view_id_async_select.template.d.ts +17 -0
- package/dist/templates/view_id_async_select.template.d.ts.map +1 -0
- package/dist/templates/view_id_async_select.template.js +2 -0
- package/dist/templates/view_id_async_select.template.js.map +1 -0
- package/dist/templates/view_list.template.d.ts +38 -0
- package/dist/templates/view_list.template.d.ts.map +1 -0
- package/dist/templates/view_list.template.js +2 -0
- package/dist/templates/view_list.template.js.map +1 -0
- package/dist/templates/view_list_columns.template.d.ts +17 -0
- package/dist/templates/view_list_columns.template.d.ts.map +1 -0
- package/dist/templates/view_list_columns.template.js +2 -0
- package/dist/templates/view_list_columns.template.js.map +1 -0
- package/dist/templates/view_search_input.template.d.ts +17 -0
- package/dist/templates/view_search_input.template.d.ts.map +1 -0
- package/dist/templates/view_search_input.template.js +2 -0
- package/dist/templates/view_search_input.template.js.map +1 -0
- package/dist/testing/_relation-graph.d.ts +7 -0
- package/dist/testing/_relation-graph.d.ts.map +1 -0
- package/dist/testing/_relation-graph.js +2 -0
- package/dist/testing/_relation-graph.js.map +1 -0
- package/dist/testing/fixture-manager.d.ts +35 -0
- package/dist/testing/fixture-manager.d.ts.map +1 -0
- package/dist/testing/fixture-manager.js +2 -0
- package/dist/testing/fixture-manager.js.map +1 -0
- package/dist/types/types.d.ts +611 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/types.js +2 -0
- package/dist/types/types.js.map +1 -0
- package/dist/typings/knex.d.js +2 -0
- package/dist/typings/knex.d.js.map +1 -0
- package/dist/utils/async-utils.d.ts +25 -0
- package/dist/utils/async-utils.d.ts.map +1 -0
- package/dist/utils/async-utils.js +2 -0
- package/dist/utils/async-utils.js.map +1 -0
- package/dist/utils/controller.d.ts +9 -0
- package/dist/utils/controller.d.ts.map +1 -0
- package/dist/utils/controller.js +2 -0
- package/dist/utils/controller.js.map +1 -0
- package/dist/utils/fs-utils.d.ts +9 -0
- package/dist/utils/fs-utils.d.ts.map +1 -0
- package/dist/utils/fs-utils.js +2 -0
- package/dist/utils/fs-utils.js.map +1 -0
- package/dist/utils/lodash-able.d.ts +2 -0
- package/dist/utils/lodash-able.d.ts.map +1 -0
- package/dist/utils/lodash-able.js +2 -0
- package/dist/utils/lodash-able.js.map +1 -0
- package/dist/utils/model.d.ts +17 -0
- package/dist/utils/model.d.ts.map +1 -0
- package/dist/utils/model.js +2 -0
- package/dist/utils/model.js.map +1 -0
- package/dist/utils/sql-parser.d.ts +4 -0
- package/dist/utils/sql-parser.d.ts.map +1 -0
- package/dist/utils/sql-parser.js +2 -0
- package/dist/utils/sql-parser.js.map +1 -0
- package/dist/utils/utils.d.ts +9 -0
- package/dist/utils/utils.d.ts.map +1 -0
- package/dist/utils/utils.js +2 -0
- package/dist/utils/utils.js.map +1 -0
- package/dist/utils/zod-error.d.ts +8 -0
- package/dist/utils/zod-error.d.ts.map +1 -0
- package/dist/utils/zod-error.js +2 -0
- package/dist/utils/zod-error.js.map +1 -0
- package/nodemon.json +6 -0
- package/package.json +32 -45
- package/src/api/base-frame.ts +3 -4
- package/src/api/caster.ts +22 -23
- package/src/api/code-converters.ts +170 -134
- package/src/api/context.ts +15 -3
- package/src/api/decorators.ts +144 -20
- package/src/api/index.ts +2 -0
- package/src/api/sonamu.ts +408 -165
- package/src/bin/build-config.ts +10 -0
- package/src/bin/cli-wrapper.ts +35 -32
- package/src/bin/cli.ts +141 -204
- package/src/database/_batch_update.ts +10 -15
- package/src/database/base-model.ts +326 -216
- package/src/database/db.ts +191 -21
- package/src/database/{drivers/knex/plugins → knex-plugins}/knex-on-duplicate-update.ts +1 -1
- package/src/database/puri-wrapper.ts +129 -0
- package/src/database/puri.ts +808 -0
- package/src/database/puri.types.ts +222 -0
- package/src/database/transaction-context.ts +18 -0
- package/src/database/upsert-builder.ts +32 -35
- package/src/entity/entity-manager.ts +7 -15
- package/src/entity/entity.ts +9 -31
- package/src/entity/migrator-/354/235/264/354/202/254/352/260/224/354/226/264/354/232/224.md +1 -0
- package/src/file-storage/driver.ts +131 -0
- package/src/file-storage/file-storage.ts +100 -0
- package/src/index.ts +15 -11
- package/src/migration/code-generation.ts +777 -0
- package/src/migration/migration-set.ts +453 -0
- package/src/migration/migrator.ts +823 -0
- package/src/migration/types.ts +53 -0
- package/src/shared/web.shared.ts.txt +33 -2
- package/src/stream/index.ts +1 -0
- package/src/stream/sse.ts +49 -0
- package/src/syncer/syncer.ts +294 -127
- package/src/templates/generated.template.ts +13 -1
- package/src/templates/generated_http.template.ts +15 -12
- package/src/templates/generated_sso.template.ts +50 -2
- package/src/templates/model.template.ts +138 -2
- package/src/templates/service.template.ts +0 -1
- package/src/templates/view_form.template.ts +11 -7
- package/src/templates/view_list.template.ts +12 -4
- package/src/testing/fixture-manager.ts +229 -174
- package/src/types/types.ts +108 -14
- package/src/utils/async-utils.ts +64 -0
- package/src/utils/fs-utils.ts +17 -0
- package/src/utils/model.ts +0 -2
- package/src/utils/utils.ts +14 -58
- package/src/utils/zod-error.ts +12 -176
- package/tsconfig.json +6 -0
- package/tsup.config.js +4 -2
- package/.pnp.cjs +0 -14363
- package/.pnp.loader.mjs +0 -2047
- package/.vscode/extensions.json +0 -6
- package/.vscode/settings.json +0 -9
- package/.yarnrc.yml +0 -5
- package/dist/base-model-CEB0H0aO.d.mts +0 -43
- package/dist/base-model-CrqDMYhI.d.ts +0 -43
- package/dist/bin/cli-wrapper.d.mts +0 -1
- package/dist/bin/cli-wrapper.mjs +0 -43
- package/dist/bin/cli-wrapper.mjs.map +0 -1
- package/dist/bin/cli.d.mts +0 -2
- package/dist/bin/cli.mjs +0 -907
- package/dist/bin/cli.mjs.map +0 -1
- package/dist/chunk-2WAC2GER.js +0 -7625
- package/dist/chunk-2WAC2GER.js.map +0 -1
- package/dist/chunk-C3IPIF6O.mjs +0 -1581
- package/dist/chunk-C3IPIF6O.mjs.map +0 -1
- package/dist/chunk-EXHKSVTE.js +0 -280
- package/dist/chunk-EXHKSVTE.js.map +0 -1
- package/dist/chunk-FCERKIIF.mjs +0 -7623
- package/dist/chunk-FCERKIIF.mjs.map +0 -1
- package/dist/chunk-HGIBJYOU.mjs +0 -231
- package/dist/chunk-HGIBJYOU.mjs.map +0 -1
- package/dist/chunk-JKSOJRQA.mjs +0 -280
- package/dist/chunk-JKSOJRQA.mjs.map +0 -1
- package/dist/chunk-OTKKFP3Y.js +0 -1581
- package/dist/chunk-OTKKFP3Y.js.map +0 -1
- package/dist/chunk-PTFDTOJU.mjs +0 -19
- package/dist/chunk-PTFDTOJU.mjs.map +0 -1
- package/dist/chunk-UZ2IY5VE.js +0 -231
- package/dist/chunk-UZ2IY5VE.js.map +0 -1
- package/dist/database/drivers/knex/base-model.d.mts +0 -16
- package/dist/database/drivers/knex/base-model.d.ts +0 -16
- package/dist/database/drivers/knex/base-model.js +0 -55
- package/dist/database/drivers/knex/base-model.js.map +0 -1
- package/dist/database/drivers/knex/base-model.mjs +0 -56
- package/dist/database/drivers/knex/base-model.mjs.map +0 -1
- package/dist/database/drivers/kysely/base-model.d.mts +0 -22
- package/dist/database/drivers/kysely/base-model.d.ts +0 -22
- package/dist/database/drivers/kysely/base-model.js +0 -64
- package/dist/database/drivers/kysely/base-model.js.map +0 -1
- package/dist/database/drivers/kysely/base-model.mjs +0 -65
- package/dist/database/drivers/kysely/base-model.mjs.map +0 -1
- package/dist/index.d.mts +0 -813
- package/dist/index.mjs +0 -435
- package/dist/index.mjs.map +0 -1
- package/dist/model-aFgomcdc.d.mts +0 -1112
- package/dist/model-aFgomcdc.d.ts +0 -1112
- package/src/database/base-model.abstract.ts +0 -97
- package/src/database/db.abstract.ts +0 -75
- package/src/database/drivers/knex/base-model.ts +0 -55
- package/src/database/drivers/knex/client.ts +0 -209
- package/src/database/drivers/knex/db.ts +0 -232
- package/src/database/drivers/knex/generator.ts +0 -659
- package/src/database/drivers/kysely/base-model.ts +0 -89
- package/src/database/drivers/kysely/client.ts +0 -309
- package/src/database/drivers/kysely/db.ts +0 -238
- package/src/database/drivers/kysely/generator.ts +0 -714
- package/src/database/types.ts +0 -118
- package/src/entity/migrator.ts +0 -1400
- package/src/smd/smd-manager.ts +0 -139
- package/src/smd/smd.ts +0 -571
- package/src/templates/kysely_types.template.ts +0 -205
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { TemplateOptions } from "../types/types";
|
|
2
|
+
import { EntityNamesRecord } from "../entity/entity-manager";
|
|
3
|
+
import { Template } from "./base-template";
|
|
4
|
+
export declare class Template__view_list_columns extends Template {
|
|
5
|
+
constructor();
|
|
6
|
+
getTargetAndPath(names: EntityNamesRecord): {
|
|
7
|
+
target: string;
|
|
8
|
+
path: string;
|
|
9
|
+
};
|
|
10
|
+
render({ entityId, columns, columnImports, }: TemplateOptions["view_list_columns"]): {
|
|
11
|
+
body: string;
|
|
12
|
+
importKeys: never[];
|
|
13
|
+
target: string;
|
|
14
|
+
path: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=view_list_columns.template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view_list_columns.template.d.ts","sourceRoot":"","sources":["../../src/templates/view_list_columns.template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAiB,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,qBAAa,2BAA4B,SAAQ,QAAQ;;IAKvD,gBAAgB,CAAC,KAAK,EAAE,iBAAiB;;;;IAQzC,MAAM,CAAC,EACL,QAAQ,EACR,OAAO,EACP,aAAa,GACd,EAAE,eAAe,CAAC,mBAAmB,CAAC;;;;;;CAqCxC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"Template__view_list_columns",{enumerable:true,get:function(){return Template__view_list_columns}});var _entitymanager=require("../entity/entity-manager");var _basetemplate=require("./base-template");function _assert_this_initialized(self){if(self===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return self}function _call_super(_this,derived,args){derived=_get_prototype_of(derived);return _possible_constructor_return(_this,_is_native_reflect_construct()?Reflect.construct(derived,args||[],_get_prototype_of(_this).constructor):derived.apply(_this,args))}function _class_call_check(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}function _create_class(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _get_prototype_of(o){_get_prototype_of=Object.setPrototypeOf?Object.getPrototypeOf:function getPrototypeOf(o){return o.__proto__||Object.getPrototypeOf(o)};return _get_prototype_of(o)}function _inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function")}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,writable:true,configurable:true}});if(superClass)_set_prototype_of(subClass,superClass)}function _object_spread(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};var ownKeys=Object.keys(source);if(typeof Object.getOwnPropertySymbols==="function"){ownKeys=ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym){return Object.getOwnPropertyDescriptor(source,sym).enumerable}))}ownKeys.forEach(function(key){_define_property(target,key,source[key])})}return target}function ownKeys(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);if(enumerableOnly){symbols=symbols.filter(function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable})}keys.push.apply(keys,symbols)}return keys}function _object_spread_props(target,source){source=source!=null?source:{};if(Object.getOwnPropertyDescriptors){Object.defineProperties(target,Object.getOwnPropertyDescriptors(source))}else{ownKeys(Object(source)).forEach(function(key){Object.defineProperty(target,key,Object.getOwnPropertyDescriptor(source,key))})}return target}function _possible_constructor_return(self,call){if(call&&(_type_of(call)==="object"||typeof call==="function")){return call}return _assert_this_initialized(self)}function _set_prototype_of(o,p){_set_prototype_of=Object.setPrototypeOf||function setPrototypeOf(o,p){o.__proto__=p;return o};return _set_prototype_of(o,p)}function _type_of(obj){"@swc/helpers - typeof";return obj&&typeof Symbol!=="undefined"&&obj.constructor===Symbol?"symbol":typeof obj}function _is_native_reflect_construct(){try{var result=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(_){}return(_is_native_reflect_construct=function(){return!!result})()}var Template__view_list_columns=/*#__PURE__*/function(Template){"use strict";_inherits(Template__view_list_columns,Template);function Template__view_list_columns(){_class_call_check(this,Template__view_list_columns);return _call_super(this,Template__view_list_columns,["view_list_columns"])}_create_class(Template__view_list_columns,[{key:"getTargetAndPath",value:function getTargetAndPath(names){return{target:"web/src/pages/admin",path:"".concat(names.fsPlural,"/_columns.tsx")}}},{key:"render",value:function render(param){var entityId=param.entityId,columns=param.columns,columnImports=param.columnImports;var names=_entitymanager.EntityManager.getNamesFromId(entityId);return _object_spread_props(_object_spread({},this.getTargetAndPath(names)),{body:"\nimport React from 'react';\nimport {\n Segment,\n Table,\n TableRow,\n Button,\n Label,\n} from 'semantic-ui-react';\nimport { DateTime } from \"luxon\";\nimport { TFColumn } from \"src/typeframe/iso-types\";\nimport { ".concat(names.capital,'SubsetA } from "src/services/').concat(names.fs,"/").concat(names.fs,'.generated";\n').concat(columnImports,"\n\nconst columns: { [key in Exclude<keyof ").concat(names.capital,"SubsetA, 'id'>]: TFColumn<").concat(names.capital,"SubsetA> } = {").concat(columns.map(function(col){return["".concat(col.name,': { label: "').concat(col.label,'",'),"tc: ".concat(col.tc,", "),"collapsing: ".concat(["Title","Name"].includes(col.label)===false,", }")].join("\n")}).join(",\n"),"};\nexport default columns;\n ").trim(),importKeys:[]})}}]);return Template__view_list_columns}(_basetemplate.Template);
|
|
2
|
+
//# sourceMappingURL=view_list_columns.template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/templates/view_list_columns.template.ts"],"sourcesContent":["import { TemplateOptions } from \"../types/types\";\nimport { EntityManager, EntityNamesRecord } from \"../entity/entity-manager\";\nimport { Template } from \"./base-template\";\n\nexport class Template__view_list_columns extends Template {\n constructor() {\n super(\"view_list_columns\");\n }\n\n getTargetAndPath(names: EntityNamesRecord) {\n return {\n target: \"web/src/pages/admin\",\n path: `${names.fsPlural}/_columns.tsx`,\n };\n }\n\n // 컬럼\n render({\n entityId,\n columns,\n columnImports,\n }: TemplateOptions[\"view_list_columns\"]) {\n const names = EntityManager.getNamesFromId(entityId);\n\n return {\n ...this.getTargetAndPath(names),\n body: `\nimport React from 'react';\nimport {\n Segment,\n Table,\n TableRow,\n Button,\n Label,\n} from 'semantic-ui-react';\nimport { DateTime } from \"luxon\";\nimport { TFColumn } from \"src/typeframe/iso-types\";\nimport { ${names.capital}SubsetA } from \"src/services/${names.fs}/${\n names.fs\n }.generated\";\n${columnImports}\n\nconst columns: { [key in Exclude<keyof ${\n names.capital\n }SubsetA, 'id'>]: TFColumn<${names.capital}SubsetA> } = {${columns\n .map((col) => {\n return [\n `${col.name}: { label: \"${col.label}\",`,\n `tc: ${col.tc}, `,\n `collapsing: ${[\"Title\", \"Name\"].includes(col.label) === false}, }`,\n ].join(\"\\n\");\n })\n .join(\",\\n\")}};\nexport default columns;\n `.trim(),\n importKeys: [],\n };\n }\n}\n"],"names":["Template__view_list_columns","getTargetAndPath","names","target","path","fsPlural","render","entityId","columns","columnImports","EntityManager","getNamesFromId","body","capital","fs","map","col","name","label","tc","includes","join","trim","importKeys","Template"],"mappings":"oGAIaA,qEAAAA,0DAHoC,sDACxB,y7GAElB,IAAA,AAAMA,yCAAN,0CAAMA,+CAAAA,qDAAAA,6BAET,OAAA,iBAFSA,6BAEH,oCAFGA,8BAKXC,IAAAA,yBAAAA,SAAAA,iBAAiBC,KAAwB,EACvC,MAAO,CACLC,OAAQ,sBACRC,KAAM,AAAC,GAAiB,OAAfF,MAAMG,QAAQ,CAAC,gBAC1B,CACF,IAGAC,IAAAA,eAAAA,SAAAA,OAAO,KAIgC,MAHrCC,SADK,MACLA,SACAC,QAFK,MAELA,QACAC,cAHK,MAGLA,cAEA,IAAMP,MAAQQ,4BAAa,CAACC,cAAc,CAACJ,UAE3C,OAAO,uCACF,IAAI,CAACN,gBAAgB,CAACC,SACzBU,KAAM,AAAC,qOAW2CV,OAA7CA,MAAMW,OAAO,CAAC,iCACjBX,OADgDA,MAAMY,EAAE,CAAC,KAG/DL,OAFMP,MAAMY,EAAE,CACT,kBAICZ,OAHNO,cAAc,+CAImBP,OAD3BA,MAAMW,OAAO,CACd,8BAA0DL,OAA9BN,MAAMW,OAAO,CAAC,kBAQ5B,OAR4CL,QACxDO,GAAG,CAAC,SAACC,KACJ,MAAO,CACL,AAAC,GAAyBA,OAAvBA,IAAIC,IAAI,CAAC,gBAAwB,OAAVD,IAAIE,KAAK,CAAC,MACpC,AAAC,OAAa,OAAPF,IAAIG,EAAE,CAAC,MACd,AAAC,eAA8D,OAAhD,CAAC,QAAS,OAAO,CAACC,QAAQ,CAACJ,IAAIE,KAAK,IAAM,MAAM,OAChE,CAACG,IAAI,CAAC,KACT,GACCA,IAAI,CAAC,OAAO,uCAEbC,IAAI,GACNC,WAAY,EAAE,EAElB,YArDWvB,6BAAoCwB,sBAAQ"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { TemplateOptions } from "../types/types";
|
|
2
|
+
import { EntityNamesRecord } from "../entity/entity-manager";
|
|
3
|
+
import { Template } from "./base-template";
|
|
4
|
+
export declare class Template__view_search_input extends Template {
|
|
5
|
+
constructor();
|
|
6
|
+
getTargetAndPath(names: EntityNamesRecord): {
|
|
7
|
+
target: string;
|
|
8
|
+
path: string;
|
|
9
|
+
};
|
|
10
|
+
render({ entityId }: TemplateOptions["view_search_input"]): {
|
|
11
|
+
body: string;
|
|
12
|
+
importKeys: never[];
|
|
13
|
+
target: string;
|
|
14
|
+
path: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=view_search_input.template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view_search_input.template.d.ts","sourceRoot":"","sources":["../../src/templates/view_search_input.template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAiB,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,qBAAa,2BAA4B,SAAQ,QAAQ;;IAKvD,gBAAgB,CAAC,KAAK,EAAE,iBAAiB;;;;IAOzC,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,eAAe,CAAC,mBAAmB,CAAC;;;;;;CAkD1D"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"Template__view_search_input",{enumerable:true,get:function(){return Template__view_search_input}});var _entitymanager=require("../entity/entity-manager");var _basetemplate=require("./base-template");function _assert_this_initialized(self){if(self===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return self}function _call_super(_this,derived,args){derived=_get_prototype_of(derived);return _possible_constructor_return(_this,_is_native_reflect_construct()?Reflect.construct(derived,args||[],_get_prototype_of(_this).constructor):derived.apply(_this,args))}function _class_call_check(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}function _create_class(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _get_prototype_of(o){_get_prototype_of=Object.setPrototypeOf?Object.getPrototypeOf:function getPrototypeOf(o){return o.__proto__||Object.getPrototypeOf(o)};return _get_prototype_of(o)}function _inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function")}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,writable:true,configurable:true}});if(superClass)_set_prototype_of(subClass,superClass)}function _object_spread(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};var ownKeys=Object.keys(source);if(typeof Object.getOwnPropertySymbols==="function"){ownKeys=ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym){return Object.getOwnPropertyDescriptor(source,sym).enumerable}))}ownKeys.forEach(function(key){_define_property(target,key,source[key])})}return target}function ownKeys(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);if(enumerableOnly){symbols=symbols.filter(function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable})}keys.push.apply(keys,symbols)}return keys}function _object_spread_props(target,source){source=source!=null?source:{};if(Object.getOwnPropertyDescriptors){Object.defineProperties(target,Object.getOwnPropertyDescriptors(source))}else{ownKeys(Object(source)).forEach(function(key){Object.defineProperty(target,key,Object.getOwnPropertyDescriptor(source,key))})}return target}function _possible_constructor_return(self,call){if(call&&(_type_of(call)==="object"||typeof call==="function")){return call}return _assert_this_initialized(self)}function _set_prototype_of(o,p){_set_prototype_of=Object.setPrototypeOf||function setPrototypeOf(o,p){o.__proto__=p;return o};return _set_prototype_of(o,p)}function _type_of(obj){"@swc/helpers - typeof";return obj&&typeof Symbol!=="undefined"&&obj.constructor===Symbol?"symbol":typeof obj}function _is_native_reflect_construct(){try{var result=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(_){}return(_is_native_reflect_construct=function(){return!!result})()}var Template__view_search_input=/*#__PURE__*/function(Template){"use strict";_inherits(Template__view_search_input,Template);function Template__view_search_input(){_class_call_check(this,Template__view_search_input);return _call_super(this,Template__view_search_input,["view_search_input"])}_create_class(Template__view_search_input,[{key:"getTargetAndPath",value:function getTargetAndPath(names){return{target:"web/src/components",path:"".concat(names.fs,"/").concat(names.capital,"SearchInput.tsx")}}},{key:"render",value:function render(param){var entityId=param.entityId;var names=_entitymanager.EntityManager.getNamesFromId(entityId);return _object_spread_props(_object_spread({},this.getTargetAndPath(names)),{body:'\nimport React from "react";\nimport { useState } from "react";\nimport { DropdownProps, Input, InputProps } from "semantic-ui-react";\nimport { '.concat(names.capital,'SearchFieldDropdown } from "src/components/').concat(names.fs,"/").concat(names.capital,'SearchFieldDropdown";\n\nexport function ').concat(names.capital,"SearchInput({\n input: { value: inputValue, onChange: inputOnChange, ...inputProps },\n dropdown: dropdownProps,\n}: {\n input: InputProps;\n dropdown: DropdownProps;\n}) {\n const [keyword, setKeyword] = useState<string>(inputValue ?? '');\n\n const handleKeyDown = (e: { key: string }) => {\n if (inputOnChange && e.key === 'Enter') {\n inputOnChange(e as any, {\n value: keyword,\n });\n }\n };\n\n return (\n <Input\n size=\"small\"\n placeholder=\"검색...\"\n style={{ margin: 0 }}\n label={<").concat(names.capital,"SearchFieldDropdown {...dropdownProps} />}\n labelPosition=\"left\"\n action={{\n icon: 'search',\n onClick: () => handleKeyDown({ key: 'Enter' }),\n }}\n {...inputProps}\n value={keyword}\n onChange={(e, { value }) => setKeyword(value)}\n onKeyDown={handleKeyDown}\n />\n );\n}\n ").trim(),importKeys:[]})}}]);return Template__view_search_input}(_basetemplate.Template);
|
|
2
|
+
//# sourceMappingURL=view_search_input.template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/templates/view_search_input.template.ts"],"sourcesContent":["import { TemplateOptions } from \"../types/types\";\nimport { EntityManager, EntityNamesRecord } from \"../entity/entity-manager\";\nimport { Template } from \"./base-template\";\n\nexport class Template__view_search_input extends Template {\n constructor() {\n super(\"view_search_input\");\n }\n\n getTargetAndPath(names: EntityNamesRecord) {\n return {\n target: \"web/src/components\",\n path: `${names.fs}/${names.capital}SearchInput.tsx`,\n };\n }\n\n render({ entityId }: TemplateOptions[\"view_search_input\"]) {\n const names = EntityManager.getNamesFromId(entityId);\n\n return {\n ...this.getTargetAndPath(names),\n body: `\nimport React from \"react\";\nimport { useState } from \"react\";\nimport { DropdownProps, Input, InputProps } from \"semantic-ui-react\";\nimport { ${names.capital}SearchFieldDropdown } from \"src/components/${names.fs}/${names.capital}SearchFieldDropdown\";\n\nexport function ${names.capital}SearchInput({\n input: { value: inputValue, onChange: inputOnChange, ...inputProps },\n dropdown: dropdownProps,\n}: {\n input: InputProps;\n dropdown: DropdownProps;\n}) {\n const [keyword, setKeyword] = useState<string>(inputValue ?? '');\n\n const handleKeyDown = (e: { key: string }) => {\n if (inputOnChange && e.key === 'Enter') {\n inputOnChange(e as any, {\n value: keyword,\n });\n }\n };\n\n return (\n <Input\n size=\"small\"\n placeholder=\"검색...\"\n style={{ margin: 0 }}\n label={<${names.capital}SearchFieldDropdown {...dropdownProps} />}\n labelPosition=\"left\"\n action={{\n icon: 'search',\n onClick: () => handleKeyDown({ key: 'Enter' }),\n }}\n {...inputProps}\n value={keyword}\n onChange={(e, { value }) => setKeyword(value)}\n onKeyDown={handleKeyDown}\n />\n );\n}\n `.trim(),\n importKeys: [],\n };\n }\n}\n"],"names":["Template__view_search_input","getTargetAndPath","names","target","path","fs","capital","render","entityId","EntityManager","getNamesFromId","body","trim","importKeys","Template"],"mappings":"oGAIaA,qEAAAA,0DAHoC,sDACxB,y7GAElB,IAAA,AAAMA,yCAAN,0CAAMA,+CAAAA,qDAAAA,6BAET,OAAA,iBAFSA,6BAEH,oCAFGA,8BAKXC,IAAAA,yBAAAA,SAAAA,iBAAiBC,KAAwB,EACvC,MAAO,CACLC,OAAQ,qBACRC,KAAM,AAAC,GAAcF,OAAZA,MAAMG,EAAE,CAAC,KAAiB,OAAdH,MAAMI,OAAO,CAAC,kBACrC,CACF,IAEAC,IAAAA,eAAAA,SAAAA,OAAO,KAAkD,MAAlD,AAAEC,SAAF,MAAEA,SACP,IAAMN,MAAQO,4BAAa,CAACC,cAAc,CAACF,UAE3C,OAAO,uCACF,IAAI,CAACP,gBAAgB,CAACC,SACzBS,KAAM,AAAC,oJAIyDT,OAA3DA,MAAMI,OAAO,CAAC,+CAAyDJ,OAAZA,MAAMG,EAAE,CAAC,KAE7DH,OAFgEA,MAAMI,OAAO,CAAC,6CAwBhFJ,OAtBEA,MAAMI,OAAO,CAAC,yiBAsBF,OAAdJ,MAAMI,OAAO,CAAC,uVAatBM,IAAI,GACNC,WAAY,EAAE,EAElB,YA7DWb,6BAAoCc,sBAAQ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_relation-graph.d.ts","sourceRoot":"","sources":["../../src/testing/_relation-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAUzE,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAwC;IAErD,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI;IA8C3C,iBAAiB,IAAI,MAAM,EAAE;CAmD9B"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"RelationGraph",{enumerable:true,get:function(){return RelationGraph}});var _entitymanager=require("../entity/entity-manager");var _types=require("../types/types");function _array_like_to_array(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _array_with_holes(arr){if(Array.isArray(arr))return arr}function _class_call_check(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}function _create_class(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _iterable_to_array_limit(arr,i){var _i=arr==null?null:typeof Symbol!=="undefined"&&arr[Symbol.iterator]||arr["@@iterator"];if(_i==null)return;var _arr=[];var _n=true;var _d=false;var _s,_e;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i["return"]!=null)_i["return"]()}finally{if(_d)throw _e}}return _arr}function _non_iterable_rest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _sliced_to_array(arr,i){return _array_with_holes(arr)||_iterable_to_array_limit(arr,i)||_unsupported_iterable_to_array(arr,i)||_non_iterable_rest()}function _unsupported_iterable_to_array(o,minLen){if(!o)return;if(typeof o==="string")return _array_like_to_array(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _array_like_to_array(o,minLen)}var RelationGraph=/*#__PURE__*/function(){"use strict";function RelationGraph(){_class_call_check(this,RelationGraph);_define_property(this,"graph",new Map)}_create_class(RelationGraph,[{key:"buildGraph",value:function buildGraph(fixtures){this.graph.clear();var _iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;try{for(var _iterator=fixtures[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){var fixture=_step.value;this.graph.set(fixture.fixtureId,{fixtureId:fixture.fixtureId,entityId:fixture.entityId,related:new Set})}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}var _iteratorNormalCompletion1=true,_didIteratorError1=false,_iteratorError1=undefined;try{for(var _iterator1=fixtures[Symbol.iterator](),_step1;!(_iteratorNormalCompletion1=(_step1=_iterator1.next()).done);_iteratorNormalCompletion1=true){var fixture1=_step1.value;var node=this.graph.get(fixture1.fixtureId);var _iteratorNormalCompletion2=true,_didIteratorError2=false,_iteratorError2=undefined;try{for(var _iterator2=Object.entries(fixture1.columns)[Symbol.iterator](),_step2;!(_iteratorNormalCompletion2=(_step2=_iterator2.next()).done);_iteratorNormalCompletion2=true){var _step_value=_sliced_to_array(_step2.value,2),column=_step_value[1];var prop=column.prop;if((0,_types.isRelationProp)(prop)){if((0,_types.isBelongsToOneRelationProp)(prop)||(0,_types.isOneToOneRelationProp)(prop)&&prop.hasJoinColumn){var relatedFixtureId="".concat(prop.with,"#").concat(column.value);if(this.graph.has(relatedFixtureId)){node.related.add(relatedFixtureId)}}else if((0,_types.isManyToManyRelationProp)(prop)){var relatedIds=column.value;var _iteratorNormalCompletion3=true,_didIteratorError3=false,_iteratorError3=undefined;try{for(var _iterator3=relatedIds[Symbol.iterator](),_step3;!(_iteratorNormalCompletion3=(_step3=_iterator3.next()).done);_iteratorNormalCompletion3=true){var relatedId=_step3.value;var relatedFixtureId1="".concat(prop.with,"#").concat(relatedId);if(this.graph.has(relatedFixtureId1)){node.related.add(relatedFixtureId1);this.graph.get(relatedFixtureId1).related.add(fixture1.fixtureId)}}}catch(err){_didIteratorError3=true;_iteratorError3=err}finally{try{if(!_iteratorNormalCompletion3&&_iterator3.return!=null){_iterator3.return()}}finally{if(_didIteratorError3){throw _iteratorError3}}}}}}}catch(err){_didIteratorError2=true;_iteratorError2=err}finally{try{if(!_iteratorNormalCompletion2&&_iterator2.return!=null){_iterator2.return()}}finally{if(_didIteratorError2){throw _iteratorError2}}}}}catch(err){_didIteratorError1=true;_iteratorError1=err}finally{try{if(!_iteratorNormalCompletion1&&_iterator1.return!=null){_iterator1.return()}}finally{if(_didIteratorError1){throw _iteratorError1}}}}},{key:"getInsertionOrder",value:function getInsertionOrder(){var _this=this;var visited=new Set;var order=[];var tempVisited=new Set;var visit=function(fixtureId){if(visited.has(fixtureId))return;if(tempVisited.has(fixtureId)){console.warn("Circular dependency detected involving: ".concat(fixtureId));return}tempVisited.add(fixtureId);var node=_this.graph.get(fixtureId);var entity=_entitymanager.EntityManager.get(node.entityId);var _iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;try{var _loop=function(){var depId=_step.value;var depNode=_this.graph.get(depId);var relationProp=entity.props.find(function(prop){return(0,_types.isRelationProp)(prop)&&((0,_types.isBelongsToOneRelationProp)(prop)||(0,_types.isOneToOneRelationProp)(prop)&&prop.hasJoinColumn)&&prop.with===depNode.entityId});if(relationProp&&!relationProp.nullable){visit(depId)}};for(var _iterator=node.related[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true)_loop()}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}tempVisited.delete(fixtureId);visited.add(fixtureId);order.push(fixtureId)};var _iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;try{for(var _iterator=this.graph.keys()[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){var fixtureId=_step.value;visit(fixtureId)}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}var _iteratorNormalCompletion1=true,_didIteratorError1=false,_iteratorError1=undefined;try{for(var _iterator1=this.graph.keys()[Symbol.iterator](),_step1;!(_iteratorNormalCompletion1=(_step1=_iterator1.next()).done);_iteratorNormalCompletion1=true){var fixtureId1=_step1.value;if(!visited.has(fixtureId1)){order.push(fixtureId1)}}}catch(err){_didIteratorError1=true;_iteratorError1=err}finally{try{if(!_iteratorNormalCompletion1&&_iterator1.return!=null){_iterator1.return()}}finally{if(_didIteratorError1){throw _iteratorError1}}}return order}}]);return RelationGraph}();
|
|
2
|
+
//# sourceMappingURL=_relation-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/testing/_relation-graph.ts"],"sourcesContent":["import { RelationNode, EntityProp, FixtureRecord } from \"../types/types\";\nimport { EntityManager } from \"../entity/entity-manager\";\nimport {\n isRelationProp,\n isBelongsToOneRelationProp,\n isOneToOneRelationProp,\n isManyToManyRelationProp,\n} from \"../types/types\";\n\n// 관계 그래프 처리를 별도 클래스로 분리\nexport class RelationGraph {\n private graph: Map<string, RelationNode> = new Map();\n\n buildGraph(fixtures: FixtureRecord[]): void {\n this.graph.clear();\n\n // 1. 노드 추가\n for (const fixture of fixtures) {\n this.graph.set(fixture.fixtureId, {\n fixtureId: fixture.fixtureId,\n entityId: fixture.entityId,\n related: new Set(),\n });\n }\n\n // 2. 의존성 추가\n for (const fixture of fixtures) {\n const node = this.graph.get(fixture.fixtureId)!;\n\n for (const [, column] of Object.entries(fixture.columns)) {\n const prop = column.prop as EntityProp;\n\n if (isRelationProp(prop)) {\n if (\n isBelongsToOneRelationProp(prop) ||\n (isOneToOneRelationProp(prop) && prop.hasJoinColumn)\n ) {\n const relatedFixtureId = `${prop.with}#${column.value}`;\n if (this.graph.has(relatedFixtureId)) {\n node.related.add(relatedFixtureId);\n }\n } else if (isManyToManyRelationProp(prop)) {\n // ManyToMany 관계의 경우 양방향 의존성 추가\n const relatedIds = column.value as number[];\n for (const relatedId of relatedIds) {\n const relatedFixtureId = `${prop.with}#${relatedId}`;\n if (this.graph.has(relatedFixtureId)) {\n node.related.add(relatedFixtureId);\n this.graph\n .get(relatedFixtureId)!\n .related.add(fixture.fixtureId);\n }\n }\n }\n }\n }\n }\n }\n\n getInsertionOrder(): string[] {\n const visited = new Set<string>();\n const order: string[] = [];\n const tempVisited = new Set<string>();\n\n const visit = (fixtureId: string) => {\n if (visited.has(fixtureId)) return;\n if (tempVisited.has(fixtureId)) {\n console.warn(`Circular dependency detected involving: ${fixtureId}`);\n return;\n }\n\n tempVisited.add(fixtureId);\n\n const node = this.graph.get(fixtureId)!;\n const entity = EntityManager.get(node.entityId);\n\n for (const depId of node.related) {\n const depNode = this.graph.get(depId)!;\n\n // BelongsToOne 관계이면서 nullable이 아닌 경우 먼저 방문\n const relationProp = entity.props.find(\n (prop) =>\n isRelationProp(prop) &&\n (isBelongsToOneRelationProp(prop) ||\n (isOneToOneRelationProp(prop) && prop.hasJoinColumn)) &&\n prop.with === depNode.entityId\n );\n if (relationProp && !relationProp.nullable) {\n visit(depId);\n }\n }\n\n tempVisited.delete(fixtureId);\n visited.add(fixtureId);\n order.push(fixtureId);\n };\n\n for (const fixtureId of this.graph.keys()) {\n visit(fixtureId);\n }\n\n // circular dependency로 인해 방문되지 않은 fixtureId 추가\n for (const fixtureId of this.graph.keys()) {\n if (!visited.has(fixtureId)) {\n order.push(fixtureId);\n }\n }\n\n return order;\n }\n}\n"],"names":["RelationGraph","graph","Map","buildGraph","fixtures","clear","fixture","set","fixtureId","entityId","related","Set","node","get","Object","entries","columns","column","prop","isRelationProp","isBelongsToOneRelationProp","isOneToOneRelationProp","hasJoinColumn","relatedFixtureId","with","value","has","add","isManyToManyRelationProp","relatedIds","relatedId","getInsertionOrder","visited","order","tempVisited","visit","console","warn","entity","EntityManager","depId","depNode","relationProp","props","find","nullable","delete","push","keys"],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { FixtureImportResult, FixtureRecord, FixtureSearchOptions } from "../types/types";
|
|
2
|
+
import { Entity } from "../entity/entity";
|
|
3
|
+
import { Knex } from "knex";
|
|
4
|
+
import { SonamuDBConfig } from "../database/db";
|
|
5
|
+
export declare class FixtureManagerClass {
|
|
6
|
+
private _tdb;
|
|
7
|
+
set tdb(tdb: Knex);
|
|
8
|
+
get tdb(): Knex;
|
|
9
|
+
private _fdb;
|
|
10
|
+
set fdb(fdb: Knex);
|
|
11
|
+
get fdb(): Knex;
|
|
12
|
+
cachedTableNames: string[] | null;
|
|
13
|
+
private relationGraph;
|
|
14
|
+
init(): void;
|
|
15
|
+
cleanAndSeed(usingTables?: string[]): Promise<void>;
|
|
16
|
+
getChecksum(db: Knex, tableName: string): Promise<any>;
|
|
17
|
+
sync(): Promise<void>;
|
|
18
|
+
private visitedRecords;
|
|
19
|
+
importFixture(entityId: string, ids: number[]): Promise<void>;
|
|
20
|
+
getImportQueries(entityId: string, field: string, id: number): Promise<string[]>;
|
|
21
|
+
destroy(): Promise<void>;
|
|
22
|
+
getFixtures(sourceDBName: keyof SonamuDBConfig, targetDBName: keyof SonamuDBConfig, searchOptions: FixtureSearchOptions): Promise<FixtureRecord[]>;
|
|
23
|
+
createFixtureRecord(entity: Entity, row: any, options?: {
|
|
24
|
+
singleRecord?: boolean;
|
|
25
|
+
_db?: Knex;
|
|
26
|
+
}): Promise<FixtureRecord[]>;
|
|
27
|
+
insertFixtures(dbName: keyof SonamuDBConfig, _fixtures: FixtureRecord[]): Promise<FixtureImportResult[]>;
|
|
28
|
+
private prepareInsertData;
|
|
29
|
+
private insertFixture;
|
|
30
|
+
private handleManyToManyRelations;
|
|
31
|
+
addFixtureLoader(code: string): Promise<void>;
|
|
32
|
+
private checkUniqueViolation;
|
|
33
|
+
}
|
|
34
|
+
export declare const FixtureManager: FixtureManagerClass;
|
|
35
|
+
//# sourceMappingURL=fixture-manager.d.ts.map
|
|
@@ -0,0 +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;IA0E/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;IAyD5B,OAAO,CAAC,iBAAiB;YAwBX,aAAa;YAiCb,yBAAyB;IAkDjC,gBAAgB,CAAC,IAAI,EAAE,MAAM;YAsBrB,oBAAoB;CAyCnC;AACD,eAAO,MAAM,cAAc,qBAA4B,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get FixtureManager(){return FixtureManager},get FixtureManagerClass(){return FixtureManagerClass}});var _chalk=/*#__PURE__*/_interop_require_default(require("chalk"));var _lodash=/*#__PURE__*/_interop_require_default(require("lodash"));var _api=require("../api");var _entitymanager=require("../entity/entity-manager");var _types=require("../types/types");var _inflection=/*#__PURE__*/_interop_require_default(require("inflection"));var _fs=require("fs");var _relationgraph=require("./_relation-graph");var _knex=/*#__PURE__*/_interop_require_default(require("knex"));var _basemodel=require("../database/base-model");function _array_like_to_array(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _array_with_holes(arr){if(Array.isArray(arr))return arr}function _array_without_holes(arr){if(Array.isArray(arr))return _array_like_to_array(arr)}function _async_iterator(iterable){var method,async,sync,retry=2;for("undefined"!=typeof Symbol&&(async=Symbol.asyncIterator,sync=Symbol.iterator);retry--;){if(async&&null!=(method=iterable[async]))return method.call(iterable);if(sync&&null!=(method=iterable[sync]))return new AsyncFromSyncIterator(method.call(iterable));async="@@asyncIterator",sync="@@iterator"}throw new TypeError("Object is not async iterable")}function AsyncFromSyncIterator(s){function AsyncFromSyncIteratorContinuation(r){if(Object(r)!==r)return Promise.reject(new TypeError(r+" is not an object."));var done=r.done;return Promise.resolve(r.value).then(function(value){return{value:value,done:done}})}return AsyncFromSyncIterator=function(s){this.s=s,this.n=s.next},AsyncFromSyncIterator.prototype={s:null,n:null,next:function(){return AsyncFromSyncIteratorContinuation(this.n.apply(this.s,arguments))},return:function(value){var ret=this.s.return;return void 0===ret?Promise.resolve({value:value,done:!0}):AsyncFromSyncIteratorContinuation(ret.apply(this.s,arguments))},throw:function(value){var thr=this.s.return;return void 0===thr?Promise.reject(value):AsyncFromSyncIteratorContinuation(thr.apply(this.s,arguments))}},new AsyncFromSyncIterator(s)}function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{Promise.resolve(value).then(_next,_throw)}}function _async_to_generator(fn){return function(){var self=this,args=arguments;return new Promise(function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value)}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err)}_next(undefined)})}}function _class_call_check(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}function _create_class(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _instanceof(left,right){if(right!=null&&typeof Symbol!=="undefined"&&right[Symbol.hasInstance]){return!!right[Symbol.hasInstance](left)}else{return left instanceof right}}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _iterable_to_array(iter){if(typeof Symbol!=="undefined"&&iter[Symbol.iterator]!=null||iter["@@iterator"]!=null)return Array.from(iter)}function _iterable_to_array_limit(arr,i){var _i=arr==null?null:typeof Symbol!=="undefined"&&arr[Symbol.iterator]||arr["@@iterator"];if(_i==null)return;var _arr=[];var _n=true;var _d=false;var _s,_e;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i["return"]!=null)_i["return"]()}finally{if(_d)throw _e}}return _arr}function _non_iterable_rest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _non_iterable_spread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _sliced_to_array(arr,i){return _array_with_holes(arr)||_iterable_to_array_limit(arr,i)||_unsupported_iterable_to_array(arr,i)||_non_iterable_rest()}function _to_consumable_array(arr){return _array_without_holes(arr)||_iterable_to_array(arr)||_unsupported_iterable_to_array(arr)||_non_iterable_spread()}function _type_of(obj){"@swc/helpers - typeof";return obj&&typeof Symbol!=="undefined"&&obj.constructor===Symbol?"symbol":typeof obj}function _unsupported_iterable_to_array(o,minLen){if(!o)return;if(typeof o==="string")return _array_like_to_array(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _array_like_to_array(o,minLen)}function _ts_generator(thisArg,body){var f,y,t,_={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},g=Object.create((typeof Iterator==="function"?Iterator:Object).prototype);return g.next=verb(0),g["throw"]=verb(1),g["return"]=verb(2),typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(g&&(g=0,op[0]&&(_=0)),_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(op[0]===6&&_.label<t[1]){_.label=t[1];t=op;break}if(t&&_.label<t[2]){_.label=t[2];_.ops.push(op);break}if(t[2])_.ops.pop();_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e];y=0}finally{f=t=0}if(op[0]&5)throw op[1];return{value:op[0]?op[1]:void 0,done:true}}}function _ts_values(o){var s=typeof Symbol==="function"&&Symbol.iterator,m=s&&o[s],i=0;if(m)return m.call(o);if(o&&typeof o.length==="number")return{next:function(){if(o&&i>=o.length)o=void 0;return{value:o&&o[i++],done:!o}}};throw new TypeError(s?"Object is not iterable.":"Symbol.iterator is not defined.")}var FixtureManagerClass=/*#__PURE__*/function(){"use strict";function FixtureManagerClass(){_class_call_check(this,FixtureManagerClass);_define_property(this,"_tdb",null);_define_property(this,"_fdb",null);_define_property(this,"cachedTableNames",null);_define_property(this,"relationGraph",new _relationgraph.RelationGraph);_define_property(this,"visitedRecords",new Set)}_create_class(FixtureManagerClass,[{key:"tdb",get:function get(){if(this._tdb===null){throw new Error("FixtureManager has not been initialized")}return this._tdb},set:function set(tdb){this._tdb=tdb}},{key:"fdb",get:function get(){if(this._fdb===null){throw new Error("FixtureManager has not been initialized")}return this._fdb},set:function set(fdb){this._fdb=fdb}},{key:"init",value:function init(){if(this._tdb!==null){return}if(_api.Sonamu.dbConfig.test&&_api.Sonamu.dbConfig.production_master){var tConn=_api.Sonamu.dbConfig.test.connection;var pConn=_api.Sonamu.dbConfig.production_master.connection;var _tConn_host,_tConn_port,_pConn_host,_pConn_port;if("".concat((_tConn_host=tConn.host)!==null&&_tConn_host!==void 0?_tConn_host:"localhost",":").concat((_tConn_port=tConn.port)!==null&&_tConn_port!==void 0?_tConn_port:3306,"/").concat(tConn.database)==="".concat((_pConn_host=pConn.host)!==null&&_pConn_host!==void 0?_pConn_host:"localhost",":").concat((_pConn_port=pConn.port)!==null&&_pConn_port!==void 0?_pConn_port:3306,"/").concat(pConn.database)){throw new Error("테스트DB와 프로덕션DB에 동일한 데이터베이스가 사용되었습니다.")}}this.tdb=(0,_knex.default)(_api.Sonamu.dbConfig.test);this.fdb=(0,_knex.default)(_api.Sonamu.dbConfig.fixture_local)}},{key:"cleanAndSeed",value:function cleanAndSeed(usingTables){return _async_to_generator(function(){var _this,tableNames,tableListStr,_ref,fdbChecksumRows,_ref1,tdbChecksumRows,fdbChecksums,tdbChecksums,changedTables;return _ts_generator(this,function(_state){switch(_state.label){case 0:_this=this;return[4,function(){return _async_to_generator(function(){var _ref,tables,tableNames;return _ts_generator(this,function(_state){switch(_state.label){case 0:if(usingTables){return[2,usingTables]}if(this.cachedTableNames){return[2,this.cachedTableNames]}return[4,this.tdb.raw("SHOW TABLE STATUS WHERE Engine IS NOT NULL AND Name != 'migrations'")];case 1:_ref=_sliced_to_array.apply(void 0,[_state.sent(),1]),tables=_ref[0];tableNames=tables.map(function(tableInfo){return tableInfo["Name"]});this.cachedTableNames=tableNames;return[2,tableNames]}})}).call(_this)}()];case 1:tableNames=_state.sent();tableListStr=tableNames.join(", ");return[4,this.fdb.raw("CHECKSUM TABLE ".concat(tableListStr))];case 2:_ref=_sliced_to_array.apply(void 0,[_state.sent(),1]),fdbChecksumRows=_ref[0];return[4,this.tdb.raw("CHECKSUM TABLE ".concat(tableListStr))];case 3:_ref1=_sliced_to_array.apply(void 0,[_state.sent(),1]),tdbChecksumRows=_ref1[0];fdbChecksums=new Map(fdbChecksumRows.map(function(row){return[row.Table.split(".").pop(),row.Checksum]}));tdbChecksums=new Map(tdbChecksumRows.map(function(row){return[row.Table.split(".").pop(),row.Checksum]}));changedTables=tableNames.filter(function(tableName){return fdbChecksums.get(tableName)!==tdbChecksums.get(tableName)});return[4,this.tdb.transaction(function(trx){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,trx.raw("SET FOREIGN_KEY_CHECKS = 0")];case 1:_state.sent();return[4,Promise.all(changedTables.map(function(tableName){return _async_to_generator(function(){var rawQuery;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,trx.raw("SET FOREIGN_KEY_CHECKS = 0")];case 1:_state.sent();return[4,trx(tableName).truncate()];case 2:_state.sent();rawQuery="INSERT INTO ".concat(_api.Sonamu.dbConfig.test.connection.database,".").concat(tableName,"\n SELECT * FROM ").concat(_api.Sonamu.dbConfig.fixture_local.connection.database,".").concat(tableName);return[4,trx.raw(rawQuery)];case 3:_state.sent();return[2]}})})()}))];case 2:_state.sent();return[4,trx.raw("SET FOREIGN_KEY_CHECKS = 1")];case 3:_state.sent();return[2]}})})()})];case 4:_state.sent();return[2]}})}).call(this)}},{key:"getChecksum",value:function getChecksum(db,tableName){return _async_to_generator(function(){var _ref,_ref_,checksumRow;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,db.raw("CHECKSUM TABLE ".concat(tableName))];case 1:_ref=_sliced_to_array.apply(void 0,[_state.sent(),1]),_ref_=_sliced_to_array(_ref[0],1),checksumRow=_ref_[0];return[2,checksumRow.Checksum]}})})()}},{key:"sync",value:function sync(){return _async_to_generator(function(){var _this,frdb,_ref,tables,tableNames;return _ts_generator(this,function(_state){switch(_state.label){case 0:_this=this;frdb=(0,_knex.default)(_api.Sonamu.dbConfig.fixture_remote);return[4,this.fdb.raw("SHOW TABLE STATUS WHERE Engine IS NOT NULL")];case 1:_ref=_sliced_to_array.apply(void 0,[_state.sent(),1]),tables=_ref[0];tableNames=tables.map(function(table){return table.Name});console.log(_chalk.default.magenta("SYNC..."));return[4,Promise.all(tableNames.map(function(tableName){return _async_to_generator(function(){var remoteChecksum,localChecksum;return _ts_generator(this,function(_state){switch(_state.label){case 0:if(tableName.startsWith("knex_migrations")){return[2]}return[4,this.getChecksum(frdb,tableName)];case 1:remoteChecksum=_state.sent();return[4,this.getChecksum(this.fdb,tableName)];case 2:localChecksum=_state.sent();if(!(remoteChecksum!==localChecksum))return[3,4];return[4,this.fdb.transaction(function(transaction){return _async_to_generator(function(){var rows;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,transaction.raw("SET FOREIGN_KEY_CHECKS = 0")];case 1:_state.sent();return[4,transaction(tableName).truncate()];case 2:_state.sent();return[4,frdb(tableName)];case 3:rows=_state.sent();if(rows.length===0){return[2]}console.log(_chalk.default.blue(tableName),rows.length);return[4,transaction.insert(rows.map(function(row){return Object.fromEntries(Object.entries(row).map(function(param){var _param=_sliced_to_array(param,2),key=_param[0],value=_param[1];if(value===null){return[key,null]}else if(typeof value==="boolean"){return[key,value?1:0]}else if((typeof value==="undefined"?"undefined":_type_of(value))==="object"&&!_instanceof(value,Date)){return[key,JSON.stringify(value)]}else{return[key,value]}}))})).into(tableName)];case 4:_state.sent();console.log("OK");return[4,transaction.raw("SET FOREIGN_KEY_CHECKS = 1")];case 5:_state.sent();return[2]}})})()})];case 3:_state.sent();_state.label=4;case 4:return[2]}})}).call(_this)}))];case 2:_state.sent();console.log(_chalk.default.magenta("DONE!"));return[4,frdb.destroy()];case 3:_state.sent();return[2]}})}).call(this)}},{key:"importFixture",value:function importFixture(entityId,ids){return _async_to_generator(function(){var _this,queries,_,wdb,_iteratorNormalCompletion,_didIteratorError,_iteratorError,_iterator,_step,query,_ref,rsh,err;return _ts_generator(this,function(_state){switch(_state.label){case 0:_this=this;this.visitedRecords.clear();_=_lodash.default.uniq;return[4,Promise.all(ids.map(function(id){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,this.getImportQueries(entityId,"id",id)];case 1:return[2,_state.sent()]}})}).call(_this)}))];case 1:queries=_.apply(_lodash.default,[_state.sent().flat()]);wdb=_basemodel.BaseModel.getDB("w");_iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;_state.label=2;case 2:_state.trys.push([2,7,8,9]);_iterator=queries[Symbol.iterator]();_state.label=3;case 3:if(!!(_iteratorNormalCompletion=(_step=_iterator.next()).done))return[3,6];query=_step.value;return[4,wdb.raw(query)];case 4:_ref=_sliced_to_array.apply(void 0,[_state.sent(),1]),rsh=_ref[0];console.log({query:query,info:rsh.info});_state.label=5;case 5:_iteratorNormalCompletion=true;return[3,3];case 6:return[3,9];case 7:err=_state.sent();_didIteratorError=true;_iteratorError=err;return[3,9];case 8:try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}return[7];case 9:return[2]}})}).call(this)}},{key:"getImportQueries",value:function getImportQueries(entityId,field,id){return _async_to_generator(function(){var _this,recordKey,entity,wdb,_ref,row,fixtureDatabase,realDatabase,selfQuery,args,relQueries;return _ts_generator(this,function(_state){switch(_state.label){case 0:_this=this;recordKey="".concat(entityId,"#").concat(field,"#").concat(id);if(this.visitedRecords.has(recordKey)){return[2,[]]}this.visitedRecords.add(recordKey);console.log({entityId:entityId,field:field,id:id});entity=_entitymanager.EntityManager.get(entityId);wdb=_basemodel.BaseModel.getDB("w");return[4,wdb(entity.table).where(field,id).limit(1)];case 1:_ref=_sliced_to_array.apply(void 0,[_state.sent(),1]),row=_ref[0];if(row===undefined){throw new Error("".concat(entityId,"#").concat(id," row를 찾을 수 없습니다."))}fixtureDatabase=_api.Sonamu.dbConfig.fixture_remote.connection.database;realDatabase=_api.Sonamu.dbConfig.production_master.connection.database;selfQuery="INSERT IGNORE INTO `".concat(fixtureDatabase,"`.`").concat(entity.table,"` (SELECT * FROM `").concat(realDatabase,"`.`").concat(entity.table,"` WHERE `id` = ").concat(id,")");args=Object.entries(entity.relations).filter(function(param){var _param=_sliced_to_array(param,2),relation=_param[1];return(0,_types.isBelongsToOneRelationProp)(relation)||(0,_types.isOneToOneRelationProp)(relation)&&relation.customJoinClause===undefined}).map(function(param){var _param=_sliced_to_array(param,2),relation=_param[1];var _$field;var _$id;if((0,_types.isOneToOneRelationProp)(relation)&&!relation.hasJoinColumn){var _relatedEntity_props_find;var relatedEntity=_entitymanager.EntityManager.get(relation.with);var relatedIdColumnName=(_relatedEntity_props_find=relatedEntity.props.find(function(p){return(0,_types.isRelationProp)(p)&&p.with===entity.id}))===null||_relatedEntity_props_find===void 0?void 0:_relatedEntity_props_find.name;if(!relatedIdColumnName){throw new Error("".concat(relatedEntity.id,"의 ").concat(entity.id," 관계 프롭을 찾을 수 없습니다."))}_$field="".concat(relatedIdColumnName,"_id");_$id=row["id"]}else{_$field="id";_$id=row["".concat(relation.name,"_id")]}return{entityId:relation.with,field:_$field,id:_$id}}).filter(function(arg){return arg.id!==null});return[4,Promise.all(args.map(function(args){return _async_to_generator(function(){return _ts_generator(this,function(_state){return[2,this.getImportQueries(args.entityId,args.field,args.id)]})}).call(_this)}))];case 2:relQueries=_state.sent();return[2,_to_consumable_array(_lodash.default.uniq(relQueries.reverse().flat())).concat([selfQuery])]}})}).call(this)}},{key:"destroy",value:function destroy(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:if(!this._tdb)return[3,2];return[4,this._tdb.destroy()];case 1:_state.sent();this._tdb=null;_state.label=2;case 2:if(!this._fdb)return[3,4];return[4,this._fdb.destroy()];case 3:_state.sent();this._fdb=null;_state.label=4;case 4:return[4,_basemodel.BaseModel.destroy()];case 5:_state.sent();return[2]}})}).call(this)}},{key:"getFixtures",value:function getFixtures(sourceDBName,targetDBName,searchOptions){return _async_to_generator(function(){var _entity_props_find,sourceDB,targetDB,entityId,field,value,searchType,entity,column,query,rows,fixtures,_iteratorNormalCompletion,_didIteratorError,_iteratorError,_this,_loop,_iterator,_step,err,_iteratorAbruptCompletion,_didIteratorError1,_iteratorError1,_iterator1,_step1,_value,fixture,entity1,row,_ref,record,uniqueRow,_ref1,record1,err1;return _ts_generator(this,function(_state){switch(_state.label){case 0:sourceDB=(0,_knex.default)(_api.Sonamu.dbConfig[sourceDBName]);targetDB=(0,_knex.default)(_api.Sonamu.dbConfig[targetDBName]);entityId=searchOptions.entityId,field=searchOptions.field,value=searchOptions.value,searchType=searchOptions.searchType;entity=_entitymanager.EntityManager.get(entityId);column=((_entity_props_find=entity.props.find(function(prop){return prop.name===field}))===null||_entity_props_find===void 0?void 0:_entity_props_find.type)==="relation"?"".concat(field,"_id"):field;query=sourceDB(entity.table);if(searchType==="equals"){query=query.where(column,value)}else if(searchType==="like"){query=query.where(column,"like","%".concat(value,"%"))}return[4,query];case 1:rows=_state.sent();if(rows.length===0){throw new Error("No records found")}fixtures=[];_iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;_state.label=2;case 2:_state.trys.push([2,7,8,9]);_loop=function(){var row,_fixtures,initialRecordsLength,newRecords,currentFixtureRecord;return _ts_generator(this,function(_state){switch(_state.label){case 0:row=_step.value;initialRecordsLength=fixtures.length;return[4,_this.createFixtureRecord(entity,row)];case 1:newRecords=_state.sent();(_fixtures=fixtures).push.apply(_fixtures,_to_consumable_array(newRecords));currentFixtureRecord=fixtures.find(function(r){return r.fixtureId==="".concat(entityId,"#").concat(row.id)});if(currentFixtureRecord){currentFixtureRecord.fetchedRecords=fixtures.filter(function(r){return r.fixtureId!==currentFixtureRecord.fixtureId}).slice(initialRecordsLength).map(function(r){return r.fixtureId})}return[2]}})};_iterator=rows[Symbol.iterator]();_state.label=3;case 3:if(!!(_iteratorNormalCompletion=(_step=_iterator.next()).done))return[3,6];_this=this;return[5,_ts_values(_loop())];case 4:_state.sent();_state.label=5;case 5:_iteratorNormalCompletion=true;return[3,3];case 6:return[3,9];case 7:err=_state.sent();_didIteratorError=true;_iteratorError=err;return[3,9];case 8:try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}return[7];case 9:_iteratorAbruptCompletion=false,_didIteratorError1=false;_state.label=10;case 10:_state.trys.push([10,20,21,26]);_iterator1=_async_iterator(fixtures);_state.label=11;case 11:return[4,_iterator1.next()];case 12:if(!(_iteratorAbruptCompletion=!(_step1=_state.sent()).done))return[3,19];_value=_step1.value;fixture=_value;entity1=_entitymanager.EntityManager.get(fixture.entityId);return[4,targetDB(entity1.table).where("id",fixture.id).first()];case 13:row=_state.sent();if(!row)return[3,15];return[4,this.createFixtureRecord(entity1,row,{singleRecord:true,_db:targetDB})];case 14:_ref=_sliced_to_array.apply(void 0,[_state.sent(),1]),record=_ref[0];fixture.target=record;return[3,18];case 15:return[4,this.checkUniqueViolation(targetDB,entity1,fixture)];case 16:uniqueRow=_state.sent();if(!uniqueRow)return[3,18];return[4,this.createFixtureRecord(entity1,uniqueRow,{singleRecord:true,_db:targetDB})];case 17:_ref1=_sliced_to_array.apply(void 0,[_state.sent(),1]),record1=_ref1[0];fixture.unique=record1;_state.label=18;case 18:_iteratorAbruptCompletion=false;return[3,11];case 19:return[3,26];case 20:err1=_state.sent();_didIteratorError1=true;_iteratorError1=err1;return[3,26];case 21:_state.trys.push([21,,24,25]);if(!(_iteratorAbruptCompletion&&_iterator1.return!=null))return[3,23];return[4,_iterator1.return()];case 22:_state.sent();_state.label=23;case 23:return[3,25];case 24:if(_didIteratorError1){throw _iteratorError1}return[7];case 25:return[7];case 26:return[2,_lodash.default.uniqBy(fixtures,function(f){return f.fixtureId})]}})}).call(this)}},{key:"createFixtureRecord",value:function createFixtureRecord(entity,row,options){return _async_to_generator(function(){var records,visitedEntities,create;return _ts_generator(this,function(_state){switch(_state.label){case 0:records=[];visitedEntities=new Set;create=function(entity,row){return _async_to_generator(function(){var fixtureId,record,_iteratorNormalCompletion,_didIteratorError,_iteratorError,_iterator,_step,prop,_options__db,db,relatedEntity,throughTable,fromColumn,toColumn,relatedIds,relatedEntity1,relatedIds1,relatedEntity2,relatedProp,relatedRow,relatedId,relatedEntity3,relatedRow1,err;return _ts_generator(this,function(_state){switch(_state.label){case 0:fixtureId="".concat(entity.id,"#").concat(row.id);if(visitedEntities.has(fixtureId)){return[2]}visitedEntities.add(fixtureId);record={fixtureId:fixtureId,entityId:entity.id,id:row.id,columns:{},fetchedRecords:[],belongsRecords:[]};_iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;_state.label=1;case 1:_state.trys.push([1,14,15,16]);_iterator=entity.props[Symbol.iterator]();_state.label=2;case 2:if(!!(_iteratorNormalCompletion=(_step=_iterator.next()).done))return[3,13];prop=_step.value;if((0,_types.isVirtualProp)(prop)){return[3,12]}record.columns[prop.name]={prop:prop,value:row[prop.name]};db=(_options__db=options===null||options===void 0?void 0:options._db)!==null&&_options__db!==void 0?_options__db:_basemodel.BaseModel.getDB("w");if(!(0,_types.isManyToManyRelationProp)(prop))return[3,4];relatedEntity=_entitymanager.EntityManager.get(prop.with);throughTable=prop.joinTable;fromColumn="".concat(_inflection.default.singularize(entity.table),"_id");toColumn="".concat(_inflection.default.singularize(relatedEntity.table),"_id");return[4,db(throughTable).where(fromColumn,row.id).pluck(toColumn)];case 3:relatedIds=_state.sent();record.columns[prop.name].value=relatedIds;return[3,12];case 4:if(!(0,_types.isHasManyRelationProp)(prop))return[3,6];relatedEntity1=_entitymanager.EntityManager.get(prop.with);return[4,db(relatedEntity1.table).where(prop.joinColumn,row.id).pluck("id")];case 5:relatedIds1=_state.sent();record.columns[prop.name].value=relatedIds1;return[3,12];case 6:if(!((0,_types.isOneToOneRelationProp)(prop)&&!prop.hasJoinColumn))return[3,9];relatedEntity2=_entitymanager.EntityManager.get(prop.with);relatedProp=relatedEntity2.props.find(function(p){return(0,_types.isRelationProp)(p)&&p.with===entity.id});if(!relatedProp)return[3,8];return[4,db(relatedEntity2.table).where("id",row.id).first()];case 7:relatedRow=_state.sent();record.columns[prop.name].value=relatedRow===null||relatedRow===void 0?void 0:relatedRow.id;_state.label=8;case 8:return[3,12];case 9:if(!(0,_types.isRelationProp)(prop))return[3,12];relatedId=row["".concat(prop.name,"_id")];record.columns[prop.name].value=relatedId;if(relatedId){record.belongsRecords.push("".concat(prop.with,"#").concat(relatedId))}if(!(!(options===null||options===void 0?void 0:options.singleRecord)&&relatedId))return[3,12];relatedEntity3=_entitymanager.EntityManager.get(prop.with);return[4,db(relatedEntity3.table).where("id",relatedId).first()];case 10:relatedRow1=_state.sent();if(!relatedRow1)return[3,12];return[4,create(relatedEntity3,relatedRow1)];case 11:_state.sent();_state.label=12;case 12:_iteratorNormalCompletion=true;return[3,2];case 13:return[3,16];case 14:err=_state.sent();_didIteratorError=true;_iteratorError=err;return[3,16];case 15:try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}return[7];case 16:records.push(record);return[2]}})})()};return[4,create(entity,row)];case 1:_state.sent();return[2,records]}})})()}},{key:"insertFixtures",value:function insertFixtures(dbName,_fixtures){return _async_to_generator(function(){var _this,fixtures,insertionOrder,db,records,_iteratorAbruptCompletion,_didIteratorError,_iteratorError,_iterator,_step,_value,r,entity,record,err1;return _ts_generator(this,function(_state){switch(_state.label){case 0:_this=this;fixtures=_lodash.default.uniqBy(_fixtures,function(f){return f.fixtureId});this.relationGraph.buildGraph(fixtures);insertionOrder=this.relationGraph.getInsertionOrder();db=(0,_knex.default)(_api.Sonamu.dbConfig[dbName]);return[4,db.transaction(function(trx){return _async_to_generator(function(){var _iteratorNormalCompletion,_didIteratorError,_iteratorError,_this,_loop,_iterator,_step,err,_iteratorNormalCompletion1,_didIteratorError1,_iteratorError1,_this1,_loop1,_iterator1,_step1,err;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,trx.raw("SET FOREIGN_KEY_CHECKS = 0")];case 1:_state.sent();_iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;_state.label=2;case 2:_state.trys.push([2,7,8,9]);_loop=function(){var fixtureId,fixture,result;return _ts_generator(this,function(_state){switch(_state.label){case 0:fixtureId=_step.value;fixture=fixtures.find(function(f){return f.fixtureId===fixtureId});return[4,_this.insertFixture(trx,fixture)];case 1:result=_state.sent();if(result.id!==fixture.id){console.log(_chalk.default.yellow("Unique constraint violation: ".concat(fixture.entityId,"#").concat(fixture.id," -> ").concat(fixture.entityId,"#").concat(result.id)));fixtures.forEach(function(f){Object.values(f.columns).forEach(function(column){if(column.prop.type==="relation"&&column.prop.with===result.entityId&&column.value===fixture.id){column.value=result.id}})});fixture.id=result.id}return[2]}})};_iterator=insertionOrder[Symbol.iterator]();_state.label=3;case 3:if(!!(_iteratorNormalCompletion=(_step=_iterator.next()).done))return[3,6];_this=this;return[5,_ts_values(_loop())];case 4:_state.sent();_state.label=5;case 5:_iteratorNormalCompletion=true;return[3,3];case 6:return[3,9];case 7:err=_state.sent();_didIteratorError=true;_iteratorError=err;return[3,9];case 8:try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}return[7];case 9:_iteratorNormalCompletion1=true,_didIteratorError1=false,_iteratorError1=undefined;_state.label=10;case 10:_state.trys.push([10,15,16,17]);_loop1=function(){var fixtureId,fixture;return _ts_generator(this,function(_state){switch(_state.label){case 0:fixtureId=_step1.value;fixture=fixtures.find(function(f){return f.fixtureId===fixtureId});return[4,_this1.handleManyToManyRelations(trx,fixture,fixtures)];case 1:_state.sent();return[2]}})};_iterator1=insertionOrder[Symbol.iterator]();_state.label=11;case 11:if(!!(_iteratorNormalCompletion1=(_step1=_iterator1.next()).done))return[3,14];_this1=this;return[5,_ts_values(_loop1())];case 12:_state.sent();_state.label=13;case 13:_iteratorNormalCompletion1=true;return[3,11];case 14:return[3,17];case 15:err=_state.sent();_didIteratorError1=true;_iteratorError1=err;return[3,17];case 16:try{if(!_iteratorNormalCompletion1&&_iterator1.return!=null){_iterator1.return()}}finally{if(_didIteratorError1){throw _iteratorError1}}return[7];case 17:return[4,trx.raw("SET FOREIGN_KEY_CHECKS = 1")];case 18:_state.sent();return[2]}})}).call(_this)})];case 1:_state.sent();records=[];_iteratorAbruptCompletion=false,_didIteratorError=false;_state.label=2;case 2:_state.trys.push([2,8,9,14]);_iterator=_async_iterator(fixtures);_state.label=3;case 3:return[4,_iterator.next()];case 4:if(!(_iteratorAbruptCompletion=!(_step=_state.sent()).done))return[3,7];_value=_step.value;r=_value;entity=_entitymanager.EntityManager.get(r.entityId);return[4,db(entity.table).where("id",r.id).first()];case 5:record=_state.sent();records.push({entityId:r.entityId,data:record});_state.label=6;case 6:_iteratorAbruptCompletion=false;return[3,3];case 7:return[3,14];case 8:err1=_state.sent();_didIteratorError=true;_iteratorError=err1;return[3,14];case 9:_state.trys.push([9,,12,13]);if(!(_iteratorAbruptCompletion&&_iterator.return!=null))return[3,11];return[4,_iterator.return()];case 10:_state.sent();_state.label=11;case 11:return[3,13];case 12:if(_didIteratorError){throw _iteratorError}return[7];case 13:return[7];case 14:return[2,_lodash.default.uniqBy(records,function(r){return"".concat(r.entityId,"#").concat(r.data.id)})]}})}).call(this)}},{key:"prepareInsertData",value:function prepareInsertData(fixture){var insertData={};var _iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;try{for(var _iterator=Object.entries(fixture.columns)[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){var _step_value=_sliced_to_array(_step.value,2),propName=_step_value[0],column=_step_value[1];if((0,_types.isVirtualProp)(column.prop)){continue}var prop=column.prop;if(!(0,_types.isRelationProp)(prop)){if(prop.type==="json"){insertData[propName]=JSON.stringify(column.value)}else{insertData[propName]=column.value}}else if((0,_types.isBelongsToOneRelationProp)(prop)||(0,_types.isOneToOneRelationProp)(prop)&&prop.hasJoinColumn){insertData["".concat(propName,"_id")]=column.value}}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}return insertData}},{key:"insertFixture",value:function insertFixture(db,fixture){return _async_to_generator(function(){var insertData,entity,uniqueFound,found,q,err;return _ts_generator(this,function(_state){switch(_state.label){case 0:insertData=this.prepareInsertData(fixture);entity=_entitymanager.EntityManager.get(fixture.entityId);_state.label=1;case 1:_state.trys.push([1,5,,6]);return[4,this.checkUniqueViolation(db,entity,fixture)];case 2:uniqueFound=_state.sent();if(uniqueFound){return[2,{entityId:fixture.entityId,id:uniqueFound.id}]}return[4,db(entity.table).where("id",fixture.id).first()];case 3:found=_state.sent();if(found&&!fixture.override){return[2,{entityId:fixture.entityId,id:found.id}]}q=db.insert(insertData).into(entity.table);return[4,q.onDuplicateUpdate.apply(q,Object.keys(insertData))];case 4:_state.sent();return[2,{entityId:fixture.entityId,id:fixture.id}];case 5:err=_state.sent();console.log(err);throw err;case 6:return[2]}})}).call(this)}},{key:"handleManyToManyRelations",value:function handleManyToManyRelations(db,fixture,fixtures){return _async_to_generator(function(){var _iteratorNormalCompletion,_didIteratorError,_iteratorError,_loop,_iterator,_step,err;return _ts_generator(this,function(_state){switch(_state.label){case 0:_iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;_state.label=1;case 1:_state.trys.push([1,6,7,8]);_loop=function(){var _step_value,column,prop,joinTable,relatedIds,_iteratorNormalCompletion,_didIteratorError,_iteratorError,_loop,_iterator,_step1,err;return _ts_generator(this,function(_state){switch(_state.label){case 0:_step_value=_sliced_to_array(_step.value,2),column=_step_value[1];prop=column.prop;if(!(0,_types.isManyToManyRelationProp)(prop))return[3,8];joinTable=prop.joinTable;relatedIds=column.value;_iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;_state.label=1;case 1:_state.trys.push([1,6,7,8]);_loop=function(){var relatedId,entity,relatedEntity,_obj,_ref,found,_obj1,newIds;return _ts_generator(this,function(_state){switch(_state.label){case 0:relatedId=_step1.value;if(!fixtures.find(function(f){return f.fixtureId==="".concat(prop.with,"#").concat(relatedId)})){return[2,"continue"]}entity=_entitymanager.EntityManager.get(fixture.entityId);relatedEntity=_entitymanager.EntityManager.get(prop.with);if(!entity||!relatedEntity){throw new Error("Entity not found: ".concat(fixture.entityId,", ").concat(prop.with))}return[4,db(joinTable).where((_obj={},_define_property(_obj,"".concat(_inflection.default.singularize(entity.table),"_id"),fixture.id),_define_property(_obj,"".concat(_inflection.default.singularize(relatedEntity.table),"_id"),relatedId),_obj)).limit(1)];case 1:_ref=_sliced_to_array.apply(void 0,[_state.sent(),1]),found=_ref[0];if(found){return[2,"continue"]}return[4,db(joinTable).insert((_obj1={},_define_property(_obj1,"".concat(_inflection.default.singularize(entity.table),"_id"),fixture.id),_define_property(_obj1,"".concat(_inflection.default.singularize(relatedEntity.table),"_id"),relatedId),_obj1))];case 2:newIds=_state.sent();console.log(_chalk.default.green("Inserted into ".concat(joinTable,": ").concat(entity.table,"(").concat(fixture.id,") - ").concat(relatedEntity.table,"(").concat(relatedId,") ID: ").concat(newIds)));return[2]}})};_iterator=relatedIds[Symbol.iterator]();_state.label=2;case 2:if(!!(_iteratorNormalCompletion=(_step1=_iterator.next()).done))return[3,5];return[5,_ts_values(_loop())];case 3:_state.sent();_state.label=4;case 4:_iteratorNormalCompletion=true;return[3,2];case 5:return[3,8];case 6:err=_state.sent();_didIteratorError=true;_iteratorError=err;return[3,8];case 7:try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}return[7];case 8:return[2]}})};_iterator=Object.entries(fixture.columns)[Symbol.iterator]();_state.label=2;case 2:if(!!(_iteratorNormalCompletion=(_step=_iterator.next()).done))return[3,5];return[5,_ts_values(_loop())];case 3:_state.sent();_state.label=4;case 4:_iteratorNormalCompletion=true;return[3,2];case 5:return[3,8];case 6:err=_state.sent();_didIteratorError=true;_iteratorError=err;return[3,8];case 7:try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}return[7];case 8:return[2]}})})()}},{key:"addFixtureLoader",value:function addFixtureLoader(code){return _async_to_generator(function(){var path,content,fixtureLoaderStart,fixtureLoaderEnd,newContent;return _ts_generator(this,function(_state){path=_api.Sonamu.apiRootPath+"/src/testing/fixture.ts";content=(0,_fs.readFileSync)(path).toString();fixtureLoaderStart=content.indexOf("const fixtureLoader = {");fixtureLoaderEnd=content.indexOf("};",fixtureLoaderStart);if(fixtureLoaderStart!==-1&&fixtureLoaderEnd!==-1){newContent=content.slice(0,fixtureLoaderEnd)+" "+code+"\n"+content.slice(fixtureLoaderEnd);(0,_fs.writeFileSync)(path,newContent)}else{throw new Error("Failed to find fixtureLoader in fixture.ts")}return[2]})})()}},{key:"checkUniqueViolation",value:function checkUniqueViolation(db,entity,fixture){return _async_to_generator(function(){var _uniqueIndexes,uniqueIndexes,uniqueQuery,_iteratorNormalCompletion,_didIteratorError,_iteratorError,_loop,_iterator,_step,_ref,uniqueFound;return _ts_generator(this,function(_state){switch(_state.label){case 0:_uniqueIndexes=entity.indexes.filter(function(i){return i.type==="unique"});uniqueIndexes=_uniqueIndexes.filter(function(index){return index.columns.every(function(column){return!column.startsWith("".concat(entity.table,"__"))})});if(uniqueIndexes.length===0){return[2,null]}uniqueQuery=db(entity.table);_iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;try{_loop=function(){var index=_step.value;var containsNull=index.columns.some(function(column){var field=column.split("_id")[0];return fixture.columns[field].value===null});if(containsNull){return"continue"}uniqueQuery=uniqueQuery.orWhere(function(qb){var _iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;try{for(var _iterator=index.columns[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){var column=_step.value;var field=column.split("_id")[0];if(Array.isArray(fixture.columns[field].value)){qb.whereIn(column,fixture.columns[field].value)}else{qb.andWhere(column,fixture.columns[field].value)}}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}})};for(_iterator=uniqueIndexes[Symbol.iterator]();!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true)_loop()}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}return[4,uniqueQuery];case 1:_ref=_sliced_to_array.apply(void 0,[_state.sent(),1]),uniqueFound=_ref[0];return[2,uniqueFound]}})})()}}]);return FixtureManagerClass}();var FixtureManager=new FixtureManagerClass;
|
|
2
|
+
//# sourceMappingURL=fixture-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/testing/fixture-manager.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport _ from \"lodash\";\nimport { Sonamu } from \"../api\";\nimport { EntityManager } from \"../entity/entity-manager\";\nimport {\n EntityProp,\n FixtureImportResult,\n FixtureRecord,\n FixtureSearchOptions,\n ManyToManyRelationProp,\n isBelongsToOneRelationProp,\n isHasManyRelationProp,\n isManyToManyRelationProp,\n isOneToOneRelationProp,\n isRelationProp,\n isVirtualProp,\n} from \"../types/types\";\nimport { Entity } from \"../entity/entity\";\nimport inflection from \"inflection\";\nimport { readFileSync, writeFileSync } from \"fs\";\nimport { RelationGraph } from \"./_relation-graph\";\nimport knex, { Knex } from \"knex\";\nimport { BaseModel } from \"../database/base-model\";\nimport { SonamuDBConfig } from \"../database/db\";\n\nexport class FixtureManagerClass {\n private _tdb: Knex | null = null;\n set tdb(tdb: Knex) {\n this._tdb = tdb;\n }\n get tdb(): Knex {\n if (this._tdb === null) {\n throw new Error(\"FixtureManager has not been initialized\");\n }\n return this._tdb;\n }\n\n private _fdb: Knex | null = null;\n set fdb(fdb: Knex) {\n this._fdb = fdb;\n }\n get fdb(): Knex {\n if (this._fdb === null) {\n throw new Error(\"FixtureManager has not been initialized\");\n }\n return this._fdb;\n }\n cachedTableNames: string[] | null = null;\n\n private relationGraph = new RelationGraph();\n\n init() {\n if (this._tdb !== null) {\n return;\n }\n if (Sonamu.dbConfig.test && Sonamu.dbConfig.production_master) {\n const tConn = Sonamu.dbConfig.test.connection as Knex.ConnectionConfig & {\n port?: number;\n };\n const pConn = Sonamu.dbConfig.production_master\n .connection as Knex.ConnectionConfig & { port?: number };\n if (\n `${tConn.host ?? \"localhost\"}:${tConn.port ?? 3306}/${\n tConn.database\n }` ===\n `${pConn.host ?? \"localhost\"}:${pConn.port ?? 3306}/${pConn.database}`\n ) {\n throw new Error(\n `테스트DB와 프로덕션DB에 동일한 데이터베이스가 사용되었습니다.`\n );\n }\n }\n\n this.tdb = knex(Sonamu.dbConfig.test);\n this.fdb = knex(Sonamu.dbConfig.fixture_local);\n }\n\n async cleanAndSeed(usingTables?: string[]) {\n const tableNames: string[] = await (async () => {\n if (usingTables) {\n return usingTables;\n }\n if (this.cachedTableNames) {\n return this.cachedTableNames;\n }\n\n const [tables] = await this.tdb.raw(\n `SHOW TABLE STATUS WHERE Engine IS NOT NULL AND Name != 'migrations'`\n );\n const tableNames = tables.map(\n (tableInfo: { Name: string }) => tableInfo[\"Name\"]\n );\n this.cachedTableNames = tableNames;\n return tableNames;\n })();\n\n // migrations 제외한 테이블 목록\n const tableListStr = tableNames.join(\", \");\n\n // 한 번에 모든 테이블 체크섬 확인\n const [fdbChecksumRows] = await this.fdb.raw<\n [{ Table: string; Checksum: number }[]]\n >(`CHECKSUM TABLE ${tableListStr}`);\n const [tdbChecksumRows] = await this.tdb.raw<\n [{ Table: string; Checksum: number }[]]\n >(`CHECKSUM TABLE ${tableListStr}`);\n\n // 체크섬 맵 생성\n const fdbChecksums = new Map(\n fdbChecksumRows.map((row) => [row.Table.split(\".\").pop()!, row.Checksum])\n );\n const tdbChecksums = new Map(\n tdbChecksumRows.map((row) => [row.Table.split(\".\").pop()!, row.Checksum])\n );\n\n // 변경된 테이블들만 처리\n const changedTables = tableNames.filter(\n (tableName) => fdbChecksums.get(tableName) !== tdbChecksums.get(tableName)\n );\n\n // 병렬로 truncate + insert 실행\n await this.tdb.transaction(async (trx) => {\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 0`);\n\n await Promise.all(\n changedTables.map(async (tableName) => {\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 0`);\n await trx(tableName).truncate();\n const rawQuery = `INSERT INTO ${\n (Sonamu.dbConfig.test.connection as Knex.ConnectionConfig).database\n }.${tableName}\n SELECT * FROM ${\n (Sonamu.dbConfig.fixture_local.connection as Knex.ConnectionConfig)\n .database\n }.${tableName}`;\n await trx.raw(rawQuery);\n })\n );\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 1`);\n });\n\n // console.timeEnd(\"FIXTURE-CleanAndSeed\");\n }\n\n async getChecksum(db: Knex, tableName: string) {\n const [[checksumRow]] = await db.raw(`CHECKSUM TABLE ${tableName}`);\n return checksumRow.Checksum;\n }\n\n async sync() {\n const frdb = knex(Sonamu.dbConfig.fixture_remote);\n\n const [tables] = await this.fdb.raw(\n \"SHOW TABLE STATUS WHERE Engine IS NOT NULL\"\n );\n const tableNames: string[] = tables.map(\n (table: any) => table.Name as string\n );\n\n console.log(chalk.magenta(\"SYNC...\"));\n await Promise.all(\n tableNames.map(async (tableName) => {\n if (tableName.startsWith(\"knex_migrations\")) {\n return;\n }\n\n const remoteChecksum = await this.getChecksum(frdb, tableName);\n const localChecksum = await this.getChecksum(this.fdb, tableName);\n\n if (remoteChecksum !== localChecksum) {\n await this.fdb.transaction(async (transaction) => {\n await transaction.raw(`SET FOREIGN_KEY_CHECKS = 0`);\n await transaction(tableName).truncate();\n\n const rows = await frdb(tableName);\n if (rows.length === 0) {\n return;\n }\n\n console.log(chalk.blue(tableName), rows.length);\n await transaction\n .insert(\n rows.map((row: any) => {\n return Object.fromEntries(\n Object.entries(row).map(([key, value]) => {\n if (value === null) {\n return [key, null];\n } else if (typeof value === \"boolean\") {\n return [key, value ? 1 : 0];\n } else if (\n typeof value === \"object\" &&\n !(value instanceof Date)\n ) {\n return [key, JSON.stringify(value)];\n } else {\n return [key, value];\n }\n })\n );\n })\n )\n .into(tableName);\n console.log(\"OK\");\n await transaction.raw(`SET FOREIGN_KEY_CHECKS = 1`);\n });\n }\n })\n );\n console.log(chalk.magenta(\"DONE!\"));\n\n await frdb.destroy();\n }\n\n private visitedRecords = new Set<string>();\n async importFixture(entityId: string, ids: number[]) {\n // 방문 기록 초기화 (새로운 import 작업 시작)\n this.visitedRecords.clear();\n\n const queries = _.uniq(\n (\n await Promise.all(\n ids.map(async (id) => {\n return await this.getImportQueries(entityId, \"id\", id);\n })\n )\n ).flat()\n );\n\n const wdb = BaseModel.getDB(\"w\");\n for (let query of queries) {\n const [rsh] = await wdb.raw(query);\n console.log({\n query,\n info: rsh.info,\n });\n }\n }\n\n async getImportQueries(\n entityId: string,\n field: string,\n id: number\n ): Promise<string[]> {\n const recordKey = `${entityId}#${field}#${id}`;\n\n // 순환 참조 방지: 이미 방문한 레코드는 스킵\n if (this.visitedRecords.has(recordKey)) {\n return [];\n }\n this.visitedRecords.add(recordKey);\n\n console.log({ entityId, field, id });\n const entity = EntityManager.get(entityId);\n const wdb = BaseModel.getDB(\"w\");\n\n // 여기서 실DB의 row 가져옴\n const [row] = await wdb(entity.table).where(field, id).limit(1);\n if (row === undefined) {\n throw new Error(`${entityId}#${id} row를 찾을 수 없습니다.`);\n }\n\n // 픽스쳐DB, 실DB\n const fixtureDatabase = (Sonamu.dbConfig.fixture_remote.connection as any)\n .database;\n const realDatabase = (Sonamu.dbConfig.production_master.connection as any)\n .database;\n\n const selfQuery = `INSERT IGNORE INTO \\`${fixtureDatabase}\\`.\\`${entity.table}\\` (SELECT * FROM \\`${realDatabase}\\`.\\`${entity.table}\\` WHERE \\`id\\` = ${id})`;\n\n const args = Object.entries(entity.relations)\n .filter(\n ([, relation]) =>\n isBelongsToOneRelationProp(relation) ||\n (isOneToOneRelationProp(relation) &&\n relation.customJoinClause === undefined)\n )\n .map(([, relation]) => {\n /*\n BelongsToOne인 경우\n Category / 'id' / row[category_id] 호출\n OneToOne에 joinColumn === true 인 경우\n Profile / 'id' / row[profile_id] 호출\n OneToOne에 joinColumn === false 인 경우\n Profile / 'profile_id' / row['id'] 호출\n */\n let field: string;\n let id: number;\n if (isOneToOneRelationProp(relation) && !relation.hasJoinColumn) {\n const relatedEntity = EntityManager.get(relation.with);\n const relatedIdColumnName = relatedEntity.props.find(\n (p) => isRelationProp(p) && p.with === entity.id\n )?.name;\n if (!relatedIdColumnName) {\n throw new Error(\n `${relatedEntity.id}의 ${entity.id} 관계 프롭을 찾을 수 없습니다.`\n );\n }\n field = `${relatedIdColumnName}_id`;\n id = row[\"id\"];\n } else {\n field = \"id\";\n id = row[`${relation.name}_id`];\n }\n return {\n entityId: relation.with,\n field,\n id,\n };\n })\n .filter((arg) => arg.id !== null);\n\n const relQueries = await Promise.all(\n args.map(async (args) => {\n return this.getImportQueries(args.entityId, args.field, args.id);\n })\n );\n\n return [..._.uniq(relQueries.reverse().flat()), selfQuery];\n }\n\n async destroy() {\n if (this._tdb) {\n await this._tdb.destroy();\n this._tdb = null;\n }\n if (this._fdb) {\n await this._fdb.destroy();\n this._fdb = null;\n }\n await BaseModel.destroy();\n }\n\n async getFixtures(\n sourceDBName: keyof SonamuDBConfig,\n targetDBName: keyof SonamuDBConfig,\n searchOptions: FixtureSearchOptions\n ) {\n const sourceDB = knex(Sonamu.dbConfig[sourceDBName]);\n const targetDB = knex(Sonamu.dbConfig[targetDBName]);\n const { entityId, field, value, searchType } = searchOptions;\n\n const entity = EntityManager.get(entityId);\n const column =\n entity.props.find((prop) => prop.name === field)?.type === \"relation\"\n ? `${field}_id`\n : field;\n\n let query = sourceDB(entity.table);\n if (searchType === \"equals\") {\n query = query.where(column, value);\n } else if (searchType === \"like\") {\n query = query.where(column, \"like\", `%${value}%`);\n }\n\n const rows = await query;\n if (rows.length === 0) {\n throw new Error(\"No records found\");\n }\n\n const fixtures: FixtureRecord[] = [];\n for (const row of rows) {\n const initialRecordsLength = fixtures.length;\n const newRecords = await this.createFixtureRecord(entity, row);\n fixtures.push(...newRecords);\n const currentFixtureRecord = fixtures.find(\n (r) => r.fixtureId === `${entityId}#${row.id}`\n );\n\n if (currentFixtureRecord) {\n // 현재 fixture로부터 생성된 fetchedRecords 설정\n currentFixtureRecord.fetchedRecords = fixtures\n .filter((r) => r.fixtureId !== currentFixtureRecord.fixtureId)\n .slice(initialRecordsLength)\n .map((r) => r.fixtureId);\n }\n }\n\n for await (const fixture of fixtures) {\n const entity = EntityManager.get(fixture.entityId);\n\n // ID를 이용하여 targetDB에 레코드가 존재하는지 확인\n const row = await targetDB(entity.table).where(\"id\", fixture.id).first();\n if (row) {\n const [record] = await this.createFixtureRecord(entity, row, {\n singleRecord: true,\n _db: targetDB,\n });\n fixture.target = record;\n continue;\n }\n\n // ID를 이용하여 targetDB에서 조회되지 않는 경우, unique 제약을 위반하는지 확인\n const uniqueRow = await this.checkUniqueViolation(\n targetDB,\n entity,\n fixture\n );\n if (uniqueRow) {\n const [record] = await this.createFixtureRecord(entity, uniqueRow, {\n singleRecord: true,\n _db: targetDB,\n });\n fixture.unique = record;\n }\n }\n\n return _.uniqBy(fixtures, (f) => f.fixtureId);\n }\n\n async createFixtureRecord(\n entity: Entity,\n row: any,\n options?: {\n singleRecord?: boolean;\n _db?: Knex;\n }\n ): Promise<FixtureRecord[]> {\n const records: FixtureRecord[] = [];\n const visitedEntities = new Set<string>();\n\n const create = async (entity: Entity, row: any) => {\n const fixtureId = `${entity.id}#${row.id}`;\n if (visitedEntities.has(fixtureId)) {\n return;\n }\n visitedEntities.add(fixtureId);\n\n const record: FixtureRecord = {\n fixtureId,\n entityId: entity.id,\n id: row.id,\n columns: {},\n fetchedRecords: [],\n belongsRecords: [],\n };\n\n for (const prop of entity.props) {\n if (isVirtualProp(prop)) {\n continue;\n }\n\n record.columns[prop.name] = {\n prop: prop,\n value: row[prop.name],\n };\n\n const db = options?._db ?? BaseModel.getDB(\"w\");\n if (isManyToManyRelationProp(prop)) {\n const relatedEntity = EntityManager.get(prop.with);\n const throughTable = prop.joinTable;\n const fromColumn = `${inflection.singularize(entity.table)}_id`;\n const toColumn = `${inflection.singularize(relatedEntity.table)}_id`;\n\n const relatedIds = await db(throughTable)\n .where(fromColumn, row.id)\n .pluck(toColumn);\n record.columns[prop.name].value = relatedIds;\n } else if (isHasManyRelationProp(prop)) {\n const relatedEntity = EntityManager.get(prop.with);\n const relatedIds = await db(relatedEntity.table)\n .where(prop.joinColumn, row.id)\n .pluck(\"id\");\n record.columns[prop.name].value = relatedIds;\n } else if (isOneToOneRelationProp(prop) && !prop.hasJoinColumn) {\n const relatedEntity = EntityManager.get(prop.with);\n const relatedProp = relatedEntity.props.find(\n (p) => isRelationProp(p) && p.with === entity.id\n );\n if (relatedProp) {\n const relatedRow = await db(relatedEntity.table)\n .where(\"id\", row.id)\n .first();\n record.columns[prop.name].value = relatedRow?.id;\n }\n } else if (isRelationProp(prop)) {\n const relatedId = row[`${prop.name}_id`];\n record.columns[prop.name].value = relatedId;\n if (relatedId) {\n record.belongsRecords.push(`${prop.with}#${relatedId}`);\n }\n if (!options?.singleRecord && relatedId) {\n const relatedEntity = EntityManager.get(prop.with);\n const relatedRow = await db(relatedEntity.table)\n .where(\"id\", relatedId)\n .first();\n if (relatedRow) {\n await create(relatedEntity, relatedRow);\n }\n }\n }\n }\n\n records.push(record);\n };\n\n await create(entity, row);\n\n return records;\n }\n\n async insertFixtures(\n dbName: keyof SonamuDBConfig,\n _fixtures: FixtureRecord[]\n ) {\n const fixtures = _.uniqBy(_fixtures, (f) => f.fixtureId);\n\n this.relationGraph.buildGraph(fixtures);\n const insertionOrder = this.relationGraph.getInsertionOrder();\n const db = knex(Sonamu.dbConfig[dbName]);\n\n await db.transaction(async (trx) => {\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 0`);\n\n for (const fixtureId of insertionOrder) {\n const fixture = fixtures.find((f) => f.fixtureId === fixtureId)!;\n const result = await this.insertFixture(trx as any, fixture);\n if (result.id !== fixture.id) {\n // ID가 변경된 경우, 다른 fixture에서 참조하는 경우가 찾아서 수정\n console.log(\n chalk.yellow(\n `Unique constraint violation: ${fixture.entityId}#${fixture.id} -> ${fixture.entityId}#${result.id}`\n )\n );\n fixtures.forEach((f) => {\n Object.values(f.columns).forEach((column) => {\n if (\n column.prop.type === \"relation\" &&\n column.prop.with === result.entityId &&\n column.value === fixture.id\n ) {\n column.value = result.id;\n }\n });\n });\n fixture.id = result.id;\n }\n }\n\n for (const fixtureId of insertionOrder) {\n const fixture = fixtures.find((f) => f.fixtureId === fixtureId)!;\n await this.handleManyToManyRelations(trx as any, fixture, fixtures);\n }\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 1`);\n });\n\n const records: FixtureImportResult[] = [];\n\n for await (const r of fixtures) {\n const entity = EntityManager.get(r.entityId);\n const record = await db(entity.table).where(\"id\", r.id).first();\n records.push({\n entityId: r.entityId,\n data: record,\n });\n }\n\n return _.uniqBy(records, (r) => `${r.entityId}#${r.data.id}`);\n }\n\n private prepareInsertData(fixture: FixtureRecord) {\n const insertData: any = {};\n for (const [propName, column] of Object.entries(fixture.columns)) {\n if (isVirtualProp(column.prop)) {\n continue;\n }\n\n const prop = column.prop as EntityProp;\n if (!isRelationProp(prop)) {\n if (prop.type === \"json\") {\n insertData[propName] = JSON.stringify(column.value);\n } else {\n insertData[propName] = column.value;\n }\n } else if (\n isBelongsToOneRelationProp(prop) ||\n (isOneToOneRelationProp(prop) && prop.hasJoinColumn)\n ) {\n insertData[`${propName}_id`] = column.value;\n }\n }\n return insertData;\n }\n\n private async insertFixture(db: Knex, fixture: FixtureRecord) {\n const insertData = this.prepareInsertData(fixture);\n const entity = EntityManager.get(fixture.entityId);\n\n try {\n const uniqueFound = await this.checkUniqueViolation(db, entity, fixture);\n if (uniqueFound) {\n return {\n entityId: fixture.entityId,\n id: uniqueFound.id,\n };\n }\n\n const found = await db(entity.table).where(\"id\", fixture.id).first();\n if (found && !fixture.override) {\n return {\n entityId: fixture.entityId,\n id: found.id,\n };\n }\n\n const q = db.insert(insertData).into(entity.table);\n await q.onDuplicateUpdate.apply(q, Object.keys(insertData));\n return {\n entityId: fixture.entityId,\n id: fixture.id,\n };\n } catch (err) {\n console.log(err);\n throw err;\n }\n }\n\n private async handleManyToManyRelations(\n db: Knex,\n fixture: FixtureRecord,\n fixtures: FixtureRecord[]\n ) {\n for (const [, column] of Object.entries(fixture.columns)) {\n const prop = column.prop as EntityProp;\n if (isManyToManyRelationProp(prop)) {\n const joinTable = (prop as ManyToManyRelationProp).joinTable;\n const relatedIds = column.value as number[];\n\n for (const relatedId of relatedIds) {\n if (\n !fixtures.find((f) => f.fixtureId === `${prop.with}#${relatedId}`)\n ) {\n continue;\n }\n\n const entity = EntityManager.get(fixture.entityId);\n const relatedEntity = EntityManager.get(prop.with);\n if (!entity || !relatedEntity) {\n throw new Error(\n `Entity not found: ${fixture.entityId}, ${prop.with}`\n );\n }\n\n const [found] = await db(joinTable)\n .where({\n [`${inflection.singularize(entity.table)}_id`]: fixture.id,\n [`${inflection.singularize(relatedEntity.table)}_id`]: relatedId,\n })\n .limit(1);\n if (found) {\n continue;\n }\n\n const newIds = await db(joinTable).insert({\n [`${inflection.singularize(entity.table)}_id`]: fixture.id,\n [`${inflection.singularize(relatedEntity.table)}_id`]: relatedId,\n });\n console.log(\n chalk.green(\n `Inserted into ${joinTable}: ${entity.table}(${fixture.id}) - ${relatedEntity.table}(${relatedId}) ID: ${newIds}`\n )\n );\n }\n }\n }\n }\n\n async addFixtureLoader(code: string) {\n const path = Sonamu.apiRootPath + \"/src/testing/fixture.ts\";\n let content = readFileSync(path).toString();\n\n const fixtureLoaderStart = content.indexOf(\"const fixtureLoader = {\");\n const fixtureLoaderEnd = content.indexOf(\"};\", fixtureLoaderStart);\n\n if (fixtureLoaderStart !== -1 && fixtureLoaderEnd !== -1) {\n const newContent =\n content.slice(0, fixtureLoaderEnd) +\n \" \" +\n code +\n \"\\n\" +\n content.slice(fixtureLoaderEnd);\n\n writeFileSync(path, newContent);\n } else {\n throw new Error(\"Failed to find fixtureLoader in fixture.ts\");\n }\n }\n\n // 해당 픽스쳐의 값으로 유니크 제약에 위배되는 레코드가 있는지 확인\n private async checkUniqueViolation(\n db: Knex,\n entity: Entity,\n fixture: FixtureRecord\n ) {\n const _uniqueIndexes = entity.indexes.filter((i) => i.type === \"unique\");\n\n // ManyToMany 관계 테이블의 유니크 제약은 제외\n const uniqueIndexes = _uniqueIndexes.filter((index) =>\n index.columns.every((column) => !column.startsWith(`${entity.table}__`))\n );\n if (uniqueIndexes.length === 0) {\n return null;\n }\n\n let uniqueQuery = db(entity.table);\n for (const index of uniqueIndexes) {\n // 컬럼 중 하나라도 null이면 유니크 제약을 위반하지 않기 때문에 해당 인덱스는 무시\n const containsNull = index.columns.some((column) => {\n const field = column.split(\"_id\")[0];\n return fixture.columns[field].value === null;\n });\n if (containsNull) {\n continue;\n }\n\n uniqueQuery = uniqueQuery.orWhere((qb) => {\n for (const column of index.columns) {\n const field = column.split(\"_id\")[0];\n\n if (Array.isArray(fixture.columns[field].value)) {\n qb.whereIn(column, fixture.columns[field].value);\n } else {\n qb.andWhere(column, fixture.columns[field].value);\n }\n }\n });\n }\n const [uniqueFound] = await uniqueQuery;\n return uniqueFound;\n }\n}\nexport const FixtureManager = new FixtureManagerClass();\n"],"names":["FixtureManager","FixtureManagerClass","_tdb","_fdb","cachedTableNames","relationGraph","RelationGraph","visitedRecords","Set","tdb","Error","fdb","init","Sonamu","dbConfig","test","production_master","tConn","connection","pConn","host","port","database","knex","fixture_local","cleanAndSeed","usingTables","tableNames","tableListStr","fdbChecksumRows","tdbChecksumRows","fdbChecksums","tdbChecksums","changedTables","tables","raw","map","tableInfo","join","Map","row","Table","split","pop","Checksum","filter","tableName","get","transaction","trx","Promise","all","rawQuery","truncate","getChecksum","db","checksumRow","sync","frdb","fixture_remote","table","Name","console","log","chalk","magenta","remoteChecksum","localChecksum","startsWith","rows","length","blue","insert","Object","fromEntries","entries","key","value","Date","JSON","stringify","into","destroy","importFixture","entityId","ids","queries","wdb","query","rsh","clear","_","uniq","id","getImportQueries","flat","BaseModel","getDB","info","field","recordKey","entity","fixtureDatabase","realDatabase","selfQuery","args","relQueries","has","add","EntityManager","where","limit","undefined","relations","relation","isBelongsToOneRelationProp","isOneToOneRelationProp","customJoinClause","hasJoinColumn","relatedEntity","with","relatedIdColumnName","props","find","p","isRelationProp","name","arg","reverse","getFixtures","sourceDBName","targetDBName","searchOptions","sourceDB","targetDB","searchType","column","fixtures","fixture","record","uniqueRow","prop","type","initialRecordsLength","newRecords","currentFixtureRecord","createFixtureRecord","push","r","fixtureId","fetchedRecords","slice","first","singleRecord","_db","target","checkUniqueViolation","unique","uniqBy","f","options","records","visitedEntities","create","throughTable","fromColumn","toColumn","relatedIds","relatedProp","relatedRow","relatedId","columns","belongsRecords","isVirtualProp","isManyToManyRelationProp","joinTable","inflection","singularize","pluck","isHasManyRelationProp","joinColumn","insertFixtures","dbName","_fixtures","insertionOrder","buildGraph","getInsertionOrder","result","insertFixture","yellow","forEach","values","handleManyToManyRelations","data","prepareInsertData","insertData","propName","uniqueFound","found","q","err","override","onDuplicateUpdate","apply","keys","newIds","green","addFixtureLoader","code","path","content","fixtureLoaderStart","fixtureLoaderEnd","newContent","apiRootPath","readFileSync","toString","indexOf","writeFileSync","_uniqueIndexes","uniqueIndexes","uniqueQuery","indexes","i","index","every","containsNull","some","orWhere","qb","Array","isArray","whereIn","andWhere"],"mappings":"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"}
|