sonamu 0.8.26 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +60 -13
- package/dist/_virtual/rolldown_runtime.js +39 -0
- package/dist/ai/agents/agent.d.ts +3 -3
- package/dist/ai/agents/agent.d.ts.map +1 -1
- package/dist/ai/agents/agent.js +76 -73
- package/dist/ai/agents/index.js +3 -3
- package/dist/ai/agents/types.d.ts +3 -3
- package/dist/ai/agents/types.d.ts.map +1 -1
- package/dist/ai/agents/types.js +1 -3
- package/dist/ai/index.js +3 -2
- package/dist/ai/providers/rtzr/api.js +25 -25
- package/dist/ai/providers/rtzr/error.js +25 -26
- package/dist/ai/providers/rtzr/index.js +5 -5
- package/dist/ai/providers/rtzr/model.d.ts +1 -1
- package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/model.js +117 -133
- package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/options.js +35 -41
- package/dist/ai/providers/rtzr/provider.d.ts +1 -1
- package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/provider.js +53 -51
- package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/utils.js +84 -84
- package/dist/api/base-frame.d.ts +2 -2
- package/dist/api/base-frame.d.ts.map +1 -1
- package/dist/api/base-frame.js +29 -19
- package/dist/api/caster.d.ts +1 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +51 -61
- package/dist/api/code-converters.d.ts +4 -3
- package/dist/api/code-converters.d.ts.map +1 -1
- package/dist/api/code-converters.js +226 -249
- package/dist/api/config.d.ts +17 -17
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +37 -30
- package/dist/api/context.d.ts +10 -10
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +8 -2
- package/dist/api/decorators.d.ts +8 -8
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +245 -268
- package/dist/api/index.js +39 -7
- package/dist/api/secret.js +22 -15
- package/dist/api/sonamu.d.ts +15 -15
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +1012 -1131
- package/dist/api/validator.js +88 -79
- package/dist/auth/auth-generator.d.ts.map +1 -1
- package/dist/auth/auth-generator.js +203 -200
- package/dist/auth/better-auth-entities.d.ts +2 -2
- package/dist/auth/better-auth-entities.d.ts.map +1 -1
- package/dist/auth/better-auth-entities.js +369 -429
- package/dist/auth/index.js +21 -6
- package/dist/auth/knex-adapter.d.ts +2 -2
- package/dist/auth/knex-adapter.d.ts.map +1 -1
- package/dist/auth/knex-adapter.js +153 -157
- package/dist/auth/plugins/entity-definitions/admin.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/admin.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/admin.js +58 -56
- package/dist/auth/plugins/entity-definitions/anonymous.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/anonymous.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/anonymous.js +20 -20
- package/dist/auth/plugins/entity-definitions/api-key.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/api-key.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/api-key.js +185 -196
- package/dist/auth/plugins/entity-definitions/index.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/index.js +26 -29
- package/dist/auth/plugins/entity-definitions/jwt.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/jwt.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/jwt.js +62 -64
- package/dist/auth/plugins/entity-definitions/organization.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/organization.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/organization.js +362 -421
- package/dist/auth/plugins/entity-definitions/passkey.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/passkey.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/passkey.js +115 -126
- package/dist/auth/plugins/entity-definitions/phone-number.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/phone-number.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/phone-number.js +31 -40
- package/dist/auth/plugins/entity-definitions/sso.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/sso.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/sso.js +94 -107
- package/dist/auth/plugins/entity-definitions/two-factor.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/two-factor.js +78 -92
- package/dist/auth/plugins/entity-definitions/types.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/types.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/types.js +1 -10
- package/dist/auth/plugins/entity-definitions/username.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/username.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/username.js +31 -40
- package/dist/auth/plugins/index.js +12 -3
- package/dist/auth/plugins/wrappers/admin.d.ts +2 -2
- package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/admin.js +28 -29
- package/dist/auth/plugins/wrappers/anonymous.d.ts +2 -1
- package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/anonymous.js +23 -22
- package/dist/auth/plugins/wrappers/api-key.d.ts +2 -1
- package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/api-key.js +39 -34
- package/dist/auth/plugins/wrappers/index.js +11 -11
- package/dist/auth/plugins/wrappers/jwt.d.ts +2 -1
- package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/jwt.js +31 -26
- package/dist/auth/plugins/wrappers/organization.d.ts +2 -1
- package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/organization.js +65 -62
- package/dist/auth/plugins/wrappers/passkey.d.ts +2 -1
- package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/passkey.js +33 -28
- package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/phone-number.js +26 -23
- package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/sso.js +37 -31
- package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/two-factor.js +31 -28
- package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/username.js +23 -23
- package/dist/bin/build-config.js +31 -31
- package/dist/bin/cli.js +1063 -1204
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +266 -259
- package/dist/bin/hmr-hook-register.d.ts.map +1 -1
- package/dist/bin/hmr-hook-register.js +19 -18
- package/dist/bin/test-command.d.ts.map +1 -1
- package/dist/bin/test-command.js +180 -177
- package/dist/bin/ts-loader-register.js +13 -6
- package/dist/bin/ts-loader-registration.d.ts.map +1 -1
- package/dist/bin/ts-loader-registration.js +28 -38
- package/dist/cache/cache-manager.d.ts +1 -1
- package/dist/cache/cache-manager.d.ts.map +1 -1
- package/dist/cache/cache-manager.js +20 -15
- package/dist/cache/decorator.d.ts +1 -1
- package/dist/cache/decorator.d.ts.map +1 -1
- package/dist/cache/decorator.js +84 -76
- package/dist/cache/drivers.js +21 -34
- package/dist/cache/index.js +10 -7
- package/dist/cache/types.d.ts +2 -2
- package/dist/cache/types.d.ts.map +1 -1
- package/dist/cache/types.js +1 -6
- package/dist/cache-control/cache-control.d.ts +2 -2
- package/dist/cache-control/cache-control.d.ts.map +1 -1
- package/dist/cache-control/cache-control.js +106 -122
- package/dist/cache-control/types.d.ts +2 -2
- package/dist/cache-control/types.d.ts.map +1 -1
- package/dist/cache-control/types.js +1 -19
- package/dist/compress/compress.d.ts +1 -1
- package/dist/compress/compress.d.ts.map +1 -1
- package/dist/compress/compress.js +58 -56
- package/dist/compress/index.js +7 -2
- package/dist/compress/types.js +1 -11
- package/dist/cone/cone-generator.d.ts +1 -1
- package/dist/cone/cone-generator.d.ts.map +1 -1
- package/dist/cone/cone-generator.js +216 -219
- package/dist/database/_batch_update.d.ts +1 -1
- package/dist/database/_batch_update.d.ts.map +1 -1
- package/dist/database/_batch_update.js +107 -102
- package/dist/database/base-model.d.ts +8 -9
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +371 -392
- package/dist/database/base-model.types.d.ts +5 -5
- package/dist/database/base-model.types.d.ts.map +1 -1
- package/dist/database/base-model.types.js +1 -20
- package/dist/database/db.d.ts +5 -2
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +185 -171
- package/dist/database/knex.d.ts +1 -1
- package/dist/database/knex.d.ts.map +1 -1
- package/dist/database/knex.js +48 -42
- package/dist/database/puri-subset.types.d.ts +6 -7
- package/dist/database/puri-subset.types.d.ts.map +1 -1
- package/dist/database/puri-subset.types.js +1 -16
- package/dist/database/puri-wrapper.d.ts +6 -6
- package/dist/database/puri-wrapper.d.ts.map +1 -1
- package/dist/database/puri-wrapper.js +99 -101
- package/dist/database/puri.d.ts +4 -5
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +1021 -1227
- package/dist/database/puri.types.d.ts +6 -6
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +15 -6
- package/dist/database/transaction-context.d.ts +2 -2
- package/dist/database/transaction-context.d.ts.map +1 -1
- package/dist/database/transaction-context.js +22 -13
- package/dist/database/upsert-builder.d.ts +3 -3
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +405 -465
- package/dist/dict/en.js +72 -74
- package/dist/dict/index.js +13 -13
- package/dist/dict/ko.js +72 -74
- package/dist/dict/rc-keys.js +150 -168
- package/dist/dict/sd.d.ts +3 -1
- package/dist/dict/sd.d.ts.map +1 -1
- package/dist/dict/sd.js +54 -40
- package/dist/dict/sonamu-dictionary.d.ts +1 -1
- package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
- package/dist/dict/sonamu-dictionary.js +887 -955
- package/dist/dict/types.js +1 -7
- package/dist/dict/utils.js +26 -24
- package/dist/entity/entity-manager.d.ts +9 -9
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +226 -223
- package/dist/entity/entity-template-cone.d.ts +1 -1
- package/dist/entity/entity-template-cone.d.ts.map +1 -1
- package/dist/entity/entity-template-cone.js +152 -151
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +952 -1089
- package/dist/exceptions/error-handler.d.ts +1 -1
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +32 -27
- package/dist/exceptions/so-exceptions.d.ts +1 -1
- package/dist/exceptions/so-exceptions.d.ts.map +1 -1
- package/dist/exceptions/so-exceptions.js +61 -68
- package/dist/filter/index.js +9 -3
- package/dist/filter/types.js +92 -88
- package/dist/filter/utils.d.ts +1 -1
- package/dist/filter/utils.d.ts.map +1 -1
- package/dist/filter/utils.js +147 -161
- package/dist/index.js +87 -40
- package/dist/logger/category.d.ts.map +1 -1
- package/dist/logger/category.js +30 -29
- package/dist/logger/configure.d.ts.map +1 -1
- package/dist/logger/configure.js +83 -107
- package/dist/migration/code-generation.d.ts +2 -2
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +1385 -1578
- package/dist/migration/migration-set.d.ts +1 -1
- package/dist/migration/migration-set.d.ts.map +1 -1
- package/dist/migration/migration-set.js +177 -227
- package/dist/migration/migrator.d.ts +4 -3
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +340 -345
- package/dist/migration/postgresql-schema-reader.d.ts +2 -2
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +506 -564
- package/dist/migration/slack-confirm.d.ts +2 -2
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +205 -193
- package/dist/migration/types.d.ts +2 -2
- package/dist/migration/types.d.ts.map +1 -1
- package/dist/migration/types.js +1 -3
- package/dist/naite/messaging-types.d.ts +1 -0
- package/dist/naite/messaging-types.d.ts.map +1 -1
- package/dist/naite/messaging-types.js +1 -7
- package/dist/naite/naite-reporter.d.ts +2 -2
- package/dist/naite/naite-reporter.d.ts.map +1 -1
- package/dist/naite/naite-reporter.js +127 -120
- package/dist/naite/naite.d.ts +3 -2
- package/dist/naite/naite.d.ts.map +1 -1
- package/dist/naite/naite.js +266 -300
- package/dist/ssr/index.d.ts +2 -2
- package/dist/ssr/index.d.ts.map +1 -1
- package/dist/ssr/index.js +13 -3
- package/dist/ssr/registry.d.ts +1 -1
- package/dist/ssr/registry.d.ts.map +1 -1
- package/dist/ssr/registry.js +45 -37
- package/dist/ssr/renderer.d.ts +4 -4
- package/dist/ssr/renderer.d.ts.map +1 -1
- package/dist/ssr/renderer.js +84 -91
- package/dist/ssr/types.d.ts +2 -2
- package/dist/ssr/types.d.ts.map +1 -1
- package/dist/ssr/types.js +1 -3
- package/dist/storage/base-file.js +54 -41
- package/dist/storage/buffered-file.d.ts +2 -2
- package/dist/storage/buffered-file.d.ts.map +1 -1
- package/dist/storage/buffered-file.js +51 -44
- package/dist/storage/drivers.d.ts +2 -2
- package/dist/storage/drivers.d.ts.map +1 -1
- package/dist/storage/drivers.js +12 -7
- package/dist/storage/index.js +14 -7
- package/dist/storage/s3-driver.d.ts +2 -2
- package/dist/storage/s3-driver.d.ts.map +1 -1
- package/dist/storage/s3-driver.js +52 -48
- package/dist/storage/storage-manager.d.ts +2 -2
- package/dist/storage/storage-manager.d.ts.map +1 -1
- package/dist/storage/storage-manager.js +33 -25
- package/dist/storage/types.d.ts +2 -2
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/types.js +1 -5
- package/dist/storage/uploaded-file.d.ts +1 -1
- package/dist/storage/uploaded-file.d.ts.map +1 -1
- package/dist/storage/uploaded-file.js +45 -35
- package/dist/stream/index.js +7 -2
- package/dist/stream/sse.d.ts +2 -2
- package/dist/stream/sse.d.ts.map +1 -1
- package/dist/stream/sse.js +72 -67
- package/dist/syncer/api-parser.d.ts +1 -1
- package/dist/syncer/api-parser.d.ts.map +1 -1
- package/dist/syncer/api-parser.js +224 -245
- package/dist/syncer/checksum.d.ts +1 -1
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +86 -72
- package/dist/syncer/code-generator.d.ts +2 -2
- package/dist/syncer/code-generator.d.ts.map +1 -1
- package/dist/syncer/code-generator.js +154 -160
- package/dist/syncer/entity-operations.d.ts +1 -1
- package/dist/syncer/entity-operations.d.ts.map +1 -1
- package/dist/syncer/entity-operations.js +63 -54
- package/dist/syncer/file-patterns.d.ts +1 -1
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +38 -38
- package/dist/syncer/index.js +19 -8
- package/dist/syncer/module-loader.d.ts +5 -5
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +83 -78
- package/dist/syncer/syncer-actions.d.ts +2 -2
- package/dist/syncer/syncer-actions.d.ts.map +1 -1
- package/dist/syncer/syncer-actions.js +76 -91
- package/dist/syncer/syncer.d.ts +7 -6
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +426 -492
- package/dist/tasks/decorator.d.ts +3 -3
- package/dist/tasks/decorator.d.ts.map +1 -1
- package/dist/tasks/decorator.js +32 -28
- package/dist/tasks/step-wrapper.d.ts +1 -1
- package/dist/tasks/step-wrapper.d.ts.map +1 -1
- package/dist/tasks/step-wrapper.js +42 -41
- package/dist/tasks/workflow-manager.d.ts +2 -2
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +192 -221
- package/dist/template/entity-converter.d.ts +1 -1
- package/dist/template/entity-converter.d.ts.map +1 -1
- package/dist/template/entity-converter.js +103 -103
- package/dist/template/helpers.d.ts.map +1 -1
- package/dist/template/helpers.js +163 -163
- package/dist/template/implementations/entity.template.d.ts +1 -1
- package/dist/template/implementations/entity.template.d.ts.map +1 -1
- package/dist/template/implementations/entity.template.js +76 -85
- package/dist/template/implementations/entry-server.template.d.ts +1 -1
- package/dist/template/implementations/entry-server.template.d.ts.map +1 -1
- package/dist/template/implementations/entry-server.template.js +32 -27
- package/dist/template/implementations/generated.template.d.ts +1 -1
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +254 -275
- package/dist/template/implementations/generated_http.template.d.ts +2 -2
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_http.template.js +114 -133
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.js +249 -275
- package/dist/template/implementations/init_types.template.d.ts +1 -1
- package/dist/template/implementations/init_types.template.d.ts.map +1 -1
- package/dist/template/implementations/init_types.template.js +40 -34
- package/dist/template/implementations/model.template.d.ts +1 -1
- package/dist/template/implementations/model.template.d.ts.map +1 -1
- package/dist/template/implementations/model.template.js +56 -53
- package/dist/template/implementations/model_test.template.d.ts +1 -1
- package/dist/template/implementations/model_test.template.d.ts.map +1 -1
- package/dist/template/implementations/model_test.template.js +32 -24
- package/dist/template/implementations/queries.template.d.ts +1 -1
- package/dist/template/implementations/queries.template.d.ts.map +1 -1
- package/dist/template/implementations/queries.template.js +84 -89
- package/dist/template/implementations/sd.template.d.ts +1 -1
- package/dist/template/implementations/sd.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.js +137 -144
- package/dist/template/implementations/services.template.d.ts +1 -1
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/services.template.js +164 -189
- package/dist/template/implementations/view_form.template.d.ts +1 -1
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +258 -285
- package/dist/template/implementations/view_id_all_select.template.d.ts +1 -1
- package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
- package/dist/template/implementations/view_id_all_select.template.js +31 -25
- package/dist/template/implementations/view_list.template.d.ts +1 -1
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +304 -355
- package/dist/template/implementations/view_search_input.template.d.ts +1 -1
- package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
- package/dist/template/implementations/view_search_input.template.js +31 -27
- package/dist/template/index.js +21 -7
- package/dist/template/template-manager.d.ts +1 -1
- package/dist/template/template-manager.d.ts.map +1 -1
- package/dist/template/template-manager.js +132 -123
- package/dist/template/template-types.js +8 -6
- package/dist/template/template.d.ts +2 -2
- package/dist/template/template.d.ts.map +1 -1
- package/dist/template/template.js +73 -68
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +603 -657
- package/dist/testing/_relation-graph.d.ts +1 -1
- package/dist/testing/_relation-graph.d.ts.map +1 -1
- package/dist/testing/_relation-graph.js +93 -88
- package/dist/testing/bootstrap.d.ts +22 -13
- package/dist/testing/bootstrap.d.ts.map +1 -1
- package/dist/testing/bootstrap.js +114 -114
- package/dist/testing/data-explorer.d.ts +3 -3
- package/dist/testing/data-explorer.d.ts.map +1 -1
- package/dist/testing/data-explorer.js +237 -265
- package/dist/testing/dev-test-routes.d.ts +2 -2
- package/dist/testing/dev-test-routes.d.ts.map +1 -1
- package/dist/testing/dev-test-routes.js +258 -249
- package/dist/testing/dev-vitest-manager.d.ts +1 -1
- package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
- package/dist/testing/dev-vitest-manager.js +514 -539
- package/dist/testing/faker-mappings.js +422 -420
- package/dist/testing/fixture-generator.d.ts +3 -3
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +1216 -1346
- package/dist/testing/fixture-loader.js +26 -25
- package/dist/testing/fixture-manager.d.ts +3 -3
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +706 -776
- package/dist/testing/global-setup.js +53 -49
- package/dist/testing/index.js +19 -11
- package/dist/testing/naite-vitest-reporter.js +18 -13
- package/dist/testing/parallel-db-manager.d.ts +1 -1
- package/dist/testing/parallel-db-manager.d.ts.map +1 -1
- package/dist/testing/parallel-db-manager.js +63 -78
- package/dist/testing/vitest-helpers.d.ts +1 -1
- package/dist/testing/vitest-helpers.d.ts.map +1 -1
- package/dist/testing/vitest-helpers.js +37 -33
- package/dist/types/types.d.ts +28 -28
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +764 -890
- package/dist/ui/ai-api.d.ts +1 -1
- package/dist/ui/ai-api.d.ts.map +1 -1
- package/dist/ui/ai-api.js +52 -42
- package/dist/ui/ai-client.d.ts +1 -2
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +353 -388
- package/dist/ui/api.d.ts +1 -1
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +903 -1145
- package/dist/ui/cdd-service.d.ts +1 -1
- package/dist/ui/cdd-service.d.ts.map +1 -1
- package/dist/ui/cdd-service.js +406 -407
- package/dist/ui/cdd-types.js +1 -3
- package/dist/ui-web/assets/index-C-Zz-wYg.css +1 -0
- package/dist/ui-web/assets/index-DejDON8K.js +238 -0
- package/dist/ui-web/index.html +3 -3
- package/dist/utils/async-utils.js +57 -45
- package/dist/utils/console-util.d.ts.map +1 -1
- package/dist/utils/console-util.js +104 -87
- package/dist/utils/controller.js +26 -19
- package/dist/utils/esm-utils.js +49 -38
- package/dist/utils/formatter.d.ts +1 -2
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +89 -115
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +68 -65
- package/dist/utils/lodash-able.js +11 -4
- package/dist/utils/model.d.ts +1 -1
- package/dist/utils/model.d.ts.map +1 -1
- package/dist/utils/model.js +21 -19
- package/dist/utils/object-utils.js +148 -186
- package/dist/utils/path-utils.js +67 -57
- package/dist/utils/process-utils.d.ts.map +1 -1
- package/dist/utils/process-utils.js +37 -31
- package/dist/utils/sql-parser.d.ts +1 -1
- package/dist/utils/sql-parser.d.ts.map +1 -1
- package/dist/utils/sql-parser.js +40 -40
- package/dist/utils/type-utils.js +44 -43
- package/dist/utils/utils.d.ts +2 -3
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +81 -93
- package/dist/utils/zod-error.d.ts +1 -1
- package/dist/utils/zod-error.d.ts.map +1 -1
- package/dist/utils/zod-error.js +24 -17
- package/dist/vector/chunking.d.ts +1 -1
- package/dist/vector/chunking.d.ts.map +1 -1
- package/dist/vector/chunking.js +100 -94
- package/dist/vector/config.d.ts +1 -1
- package/dist/vector/config.d.ts.map +1 -1
- package/dist/vector/config.js +76 -78
- package/dist/vector/embedding.d.ts +1 -1
- package/dist/vector/embedding.d.ts.map +1 -1
- package/dist/vector/embedding.js +128 -125
- package/dist/vector/index.js +5 -5
- package/dist/vector/types.js +1 -5
- package/package.json +31 -36
- package/src/ai/agents/agent.ts +12 -5
- package/src/ai/agents/types.ts +5 -5
- package/src/ai/providers/rtzr/model.ts +8 -10
- package/src/ai/providers/rtzr/options.ts +2 -1
- package/src/ai/providers/rtzr/provider.ts +5 -3
- package/src/ai/providers/rtzr/utils.ts +2 -7
- package/src/api/__tests__/config.test.ts +15 -8
- package/src/api/base-frame.ts +5 -3
- package/src/api/caster.ts +7 -6
- package/src/api/code-converters.ts +23 -26
- package/src/api/config.ts +23 -17
- package/src/api/context.ts +18 -11
- package/src/api/decorators.ts +17 -18
- package/src/api/sonamu.ts +44 -49
- package/src/auth/auth-generator.ts +4 -6
- package/src/auth/better-auth-entities.ts +3 -2
- package/src/auth/knex-adapter.ts +6 -5
- package/src/auth/plugins/entity-definitions/admin.ts +1 -1
- package/src/auth/plugins/entity-definitions/anonymous.ts +1 -1
- package/src/auth/plugins/entity-definitions/api-key.ts +1 -1
- package/src/auth/plugins/entity-definitions/index.ts +1 -1
- package/src/auth/plugins/entity-definitions/jwt.ts +1 -1
- package/src/auth/plugins/entity-definitions/organization.ts +1 -1
- package/src/auth/plugins/entity-definitions/passkey.ts +1 -1
- package/src/auth/plugins/entity-definitions/phone-number.ts +1 -1
- package/src/auth/plugins/entity-definitions/sso.ts +1 -1
- package/src/auth/plugins/entity-definitions/two-factor.ts +1 -1
- package/src/auth/plugins/entity-definitions/types.ts +1 -1
- package/src/auth/plugins/entity-definitions/username.ts +1 -1
- package/src/auth/plugins/wrappers/admin.ts +3 -1
- package/src/auth/plugins/wrappers/anonymous.ts +3 -1
- package/src/auth/plugins/wrappers/api-key.ts +3 -1
- package/src/auth/plugins/wrappers/jwt.ts +3 -1
- package/src/auth/plugins/wrappers/organization.ts +3 -1
- package/src/auth/plugins/wrappers/passkey.ts +3 -1
- package/src/auth/plugins/wrappers/phone-number.ts +3 -1
- package/src/auth/plugins/wrappers/sso.ts +2 -1
- package/src/auth/plugins/wrappers/two-factor.ts +3 -1
- package/src/auth/plugins/wrappers/username.ts +3 -1
- package/src/bin/__tests__/ts-loader-register.test.ts +7 -12
- package/src/bin/build-config.ts +3 -3
- package/src/bin/cli.ts +27 -25
- package/src/bin/fixture.ts +4 -2
- package/src/bin/hmr-hook-register.ts +1 -0
- package/src/bin/test-command.ts +4 -2
- package/src/bin/ts-loader-registration.ts +6 -22
- package/src/cache/cache-manager.ts +2 -1
- package/src/cache/decorator.ts +2 -2
- package/src/cache/types.ts +3 -3
- package/src/cache-control/cache-control.ts +3 -2
- package/src/cache-control/types.ts +2 -2
- package/src/compress/compress.ts +1 -1
- package/src/cone/cone-generator.ts +5 -3
- package/src/database/_batch_update.ts +1 -1
- package/src/database/base-model.ts +20 -14
- package/src/database/base-model.types.ts +12 -11
- package/src/database/db.ts +56 -21
- package/src/database/knex.ts +2 -2
- package/src/database/puri-subset.test-d.ts +33 -32
- package/src/database/puri-subset.types.ts +6 -7
- package/src/database/puri-wrapper.ts +29 -26
- package/src/database/puri.ts +36 -34
- package/src/database/puri.types.test-d.ts +6 -5
- package/src/database/puri.types.ts +9 -12
- package/src/database/transaction-context.ts +2 -2
- package/src/database/upsert-builder.ts +17 -10
- package/src/dict/sd.ts +17 -4
- package/src/dict/sonamu-dictionary.ts +23 -17
- package/src/entity/entity-manager.ts +9 -7
- package/src/entity/entity-template-cone.ts +10 -3
- package/src/entity/entity.ts +20 -16
- package/src/exceptions/error-handler.ts +2 -1
- package/src/exceptions/so-exceptions.ts +1 -1
- package/src/filter/utils.ts +3 -2
- package/src/logger/category.ts +1 -0
- package/src/logger/configure.ts +5 -5
- package/src/migration/__tests__/code-generation.search-text.test.ts +2 -3
- package/src/migration/code-generation.ts +26 -25
- package/src/migration/migration-set.ts +16 -18
- package/src/migration/migrator.ts +38 -33
- package/src/migration/postgresql-schema-reader.ts +12 -12
- package/src/migration/slack-confirm.ts +5 -4
- package/src/migration/types.ts +2 -2
- package/src/naite/messaging-types.ts +1 -1
- package/src/naite/naite-reporter.ts +5 -3
- package/src/naite/naite.ts +12 -7
- package/src/shared/app.shared.ts.txt +2 -2
- package/src/shared/web.shared.ts.txt +2 -2
- package/src/skills/AGENTS.md +19 -18
- package/src/skills/commands/sonamu-skills.md +9 -9
- package/src/skills/sonamu/SKILL.md +111 -104
- package/src/skills/sonamu/ai-agents.md +27 -26
- package/src/skills/sonamu/api.md +81 -69
- package/src/skills/sonamu/auth-migration.md +13 -27
- package/src/skills/sonamu/auth-plugins.md +41 -31
- package/src/skills/sonamu/auth.md +30 -24
- package/src/skills/sonamu/cdd.md +26 -17
- package/src/skills/sonamu/cone.md +50 -50
- package/src/skills/sonamu/config.md +74 -51
- package/src/skills/sonamu/create-sonamu.md +31 -19
- package/src/skills/sonamu/database.md +43 -26
- package/src/skills/sonamu/entity-basic.md +61 -61
- package/src/skills/sonamu/entity-relations.md +84 -80
- package/src/skills/sonamu/entity-validation-checklist.md +19 -15
- package/src/skills/sonamu/fixture-cli.md +52 -30
- package/src/skills/sonamu/framework-change.md +9 -7
- package/src/skills/sonamu/frontend.md +64 -82
- package/src/skills/sonamu/i18n.md +45 -37
- package/src/skills/sonamu/migration.md +54 -31
- package/src/skills/sonamu/model.md +98 -66
- package/src/skills/sonamu/naite.md +34 -32
- package/src/skills/sonamu/project-init.md +28 -8
- package/src/skills/sonamu/puri.md +82 -91
- package/src/skills/sonamu/scaffolding.md +44 -32
- package/src/skills/sonamu/skill-contribution.md +50 -45
- package/src/skills/sonamu/subset.md +13 -13
- package/src/skills/sonamu/tasks.md +73 -58
- package/src/skills/sonamu/testing-devrunner.md +56 -36
- package/src/skills/sonamu/testing.md +23 -58
- package/src/skills/sonamu/upsert.md +32 -31
- package/src/skills/sonamu/vector.md +37 -36
- package/src/ssr/index.ts +2 -12
- package/src/ssr/registry.ts +1 -1
- package/src/ssr/renderer.ts +7 -5
- package/src/ssr/types.ts +2 -2
- package/src/storage/buffered-file.ts +4 -2
- package/src/storage/drivers.ts +3 -2
- package/src/storage/s3-driver.ts +7 -4
- package/src/storage/storage-manager.ts +3 -2
- package/src/storage/types.ts +3 -2
- package/src/storage/uploaded-file.ts +1 -1
- package/src/stream/sse.ts +2 -2
- package/src/syncer/api-parser.ts +8 -5
- package/src/syncer/checksum.ts +9 -5
- package/src/syncer/code-generator.ts +16 -8
- package/src/syncer/entity-operations.ts +5 -3
- package/src/syncer/file-patterns.ts +2 -1
- package/src/syncer/module-loader.ts +9 -6
- package/src/syncer/syncer-actions.ts +5 -3
- package/src/syncer/syncer.ts +18 -24
- package/src/tasks/decorator.ts +10 -8
- package/src/tasks/step-wrapper.ts +1 -1
- package/src/tasks/workflow-manager.ts +18 -15
- package/src/template/__tests__/generated.template.search-text.test.ts +1 -0
- package/src/template/entity-converter.ts +4 -2
- package/src/template/generated.template.test-d.ts +2 -1
- package/src/template/helpers.ts +5 -2
- package/src/template/implementations/entity.template.ts +9 -8
- package/src/template/implementations/entry-server.template.ts +1 -1
- package/src/template/implementations/generated.template.ts +21 -29
- package/src/template/implementations/generated_http.template.ts +9 -6
- package/src/template/implementations/generated_sso.template.ts +6 -4
- package/src/template/implementations/init_types.template.ts +3 -2
- package/src/template/implementations/model.template.ts +4 -2
- package/src/template/implementations/model_test.template.ts +3 -2
- package/src/template/implementations/queries.template.ts +6 -14
- package/src/template/implementations/sd.template.ts +4 -2
- package/src/template/implementations/services.template.ts +7 -11
- package/src/template/implementations/view_form.template.ts +5 -3
- package/src/template/implementations/view_id_all_select.template.ts +3 -2
- package/src/template/implementations/view_list.template.ts +7 -5
- package/src/template/implementations/view_search_input.template.ts +3 -2
- package/src/template/template-manager.ts +4 -3
- package/src/template/template.ts +4 -3
- package/src/template/zod-converter.ts +10 -7
- package/src/testing/__tests__/dev-test-routes.test.ts +3 -2
- package/src/testing/__tests__/dev-vitest-manager.test.ts +1 -0
- package/src/testing/_relation-graph.ts +2 -2
- package/src/testing/bootstrap.ts +55 -27
- package/src/testing/data-explorer.ts +5 -4
- package/src/testing/dev-test-routes.ts +8 -5
- package/src/testing/dev-vitest-manager.ts +13 -12
- package/src/testing/fixture-generator.ts +11 -17
- package/src/testing/fixture-manager.ts +21 -17
- package/src/testing/parallel-db-manager.ts +2 -1
- package/src/testing/vitest-helpers.ts +2 -1
- package/src/types/__tests__/entity-json-schema-search-text.test.ts +1 -0
- package/src/types/types.ts +8 -8
- package/src/typings/knex.d.ts +4 -4
- package/src/ui/ai-api.ts +5 -3
- package/src/ui/ai-client.ts +6 -5
- package/src/ui/api.ts +25 -23
- package/src/ui/cdd-service.ts +12 -11
- package/src/utils/console-util.ts +3 -1
- package/src/utils/formatter.ts +94 -102
- package/src/utils/fs-utils.ts +2 -1
- package/src/utils/model.ts +2 -2
- package/src/utils/object-utils.ts +3 -3
- package/src/utils/process-utils.ts +2 -1
- package/src/utils/sql-parser.ts +10 -1
- package/src/utils/type-utils.ts +3 -3
- package/src/utils/utils.ts +9 -7
- package/src/utils/zod-error.ts +1 -1
- package/src/vector/chunking.ts +1 -1
- package/src/vector/config.ts +1 -1
- package/src/vector/embedding.ts +11 -9
- package/tsdown.api.config.ts +50 -0
- package/.swcrc.project-default +0 -18
- package/dist/api/__tests__/config.test.js +0 -189
- package/dist/bin/__tests__/test-command.test.js +0 -112
- package/dist/bin/__tests__/ts-loader-register.test.js +0 -45
- package/dist/database/puri-subset.test-d.js +0 -89
- package/dist/database/puri.types.test-d.js +0 -129
- package/dist/migration/__tests__/code-generation.search-text.test.js +0 -435
- package/dist/template/__tests__/generated.template.search-text.test.js +0 -99
- package/dist/template/generated.template.test-d.js +0 -24
- package/dist/testing/__tests__/dev-test-routes.test.js +0 -144
- package/dist/testing/__tests__/dev-vitest-manager.test.js +0 -152
- package/dist/types/__tests__/entity-json-schema-search-text.test.js +0 -256
- package/dist/typings/knex.d.js +0 -3
- package/dist/ui-web/assets/index-CKo0Z2Iu.css +0 -1
- package/dist/ui-web/assets/index-DK-2aacv.js +0 -257
package/dist/bin/fixture.js
CHANGED
|
@@ -1,268 +1,275 @@
|
|
|
1
|
+
import { createKnexInstance, init_knex } from "../database/knex.js";
|
|
2
|
+
import { DB, init_db } from "../database/db.js";
|
|
3
|
+
import { Sonamu, init_sonamu } from "../api/sonamu.js";
|
|
4
|
+
import { EntityManager, init_entity_manager } from "../entity/entity-manager.js";
|
|
5
|
+
import { DataExplorer, init_data_explorer } from "../testing/data-explorer.js";
|
|
6
|
+
import { FixtureGenerator, init_fixture_generator } from "../testing/fixture-generator.js";
|
|
1
7
|
import chalk from "chalk";
|
|
2
8
|
import prompts from "prompts";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
|
|
10
|
+
//#region src/bin/fixture.ts
|
|
11
|
+
init_sonamu();
|
|
12
|
+
init_db();
|
|
13
|
+
init_knex();
|
|
14
|
+
init_entity_manager();
|
|
15
|
+
init_data_explorer();
|
|
16
|
+
init_fixture_generator();
|
|
9
17
|
/**
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
} catch (error) {
|
|
165
|
-
console.error(chalk.red("Fixture 생성 중 오류가 발생했습니다.\n" + "원인: Entity 정의나 DB 연결을 확인해주세요.\n" + "자세한 내용:"), error);
|
|
166
|
-
throw error;
|
|
167
|
-
}
|
|
18
|
+
* fixture gen 명령어 - cone 메타데이터를 활용하여 자동으로 fixture를 생성합니다.
|
|
19
|
+
*/
|
|
20
|
+
async function fixtureGenCommand(options) {
|
|
21
|
+
try {
|
|
22
|
+
if (!EntityManager.isAutoloaded) {
|
|
23
|
+
await EntityManager.autoload();
|
|
24
|
+
}
|
|
25
|
+
let entityNames;
|
|
26
|
+
if (options.all) {
|
|
27
|
+
entityNames = EntityManager.getAllIds();
|
|
28
|
+
if (options.exclude) {
|
|
29
|
+
const excludeList = options.exclude.split(",").map((s) => s.trim());
|
|
30
|
+
entityNames = entityNames.filter((name) => !excludeList.includes(name));
|
|
31
|
+
}
|
|
32
|
+
} else if (options.include) {
|
|
33
|
+
entityNames = options.include.split(",").map((s) => s.trim());
|
|
34
|
+
} else {
|
|
35
|
+
const result = await prompts({
|
|
36
|
+
type: "multiselect",
|
|
37
|
+
name: "entities",
|
|
38
|
+
message: "Fixture를 생성할 Entity를 선택하세요:",
|
|
39
|
+
choices: EntityManager.getAllIds().map((id) => ({
|
|
40
|
+
title: id,
|
|
41
|
+
value: id
|
|
42
|
+
})),
|
|
43
|
+
min: 1
|
|
44
|
+
});
|
|
45
|
+
if (!result.entities || result.entities.length === 0) {
|
|
46
|
+
console.log(chalk.yellow("취소되었습니다."));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
entityNames = result.entities;
|
|
50
|
+
}
|
|
51
|
+
let count = options.count ? Number.parseInt(options.count, 10) : 5;
|
|
52
|
+
if (!options.count) {
|
|
53
|
+
const result = await prompts({
|
|
54
|
+
type: "number",
|
|
55
|
+
name: "count",
|
|
56
|
+
message: "각 Entity별 생성 개수:",
|
|
57
|
+
initial: 5,
|
|
58
|
+
min: 1
|
|
59
|
+
});
|
|
60
|
+
if (!result.count) {
|
|
61
|
+
console.log(chalk.yellow("취소되었습니다."));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
count = result.count;
|
|
65
|
+
}
|
|
66
|
+
let saveTarget = options["save-to"] || "db";
|
|
67
|
+
if (!options["save-to"]) {
|
|
68
|
+
const result = await prompts({
|
|
69
|
+
type: "select",
|
|
70
|
+
name: "saveTarget",
|
|
71
|
+
message: "저장 방식:",
|
|
72
|
+
choices: [
|
|
73
|
+
{
|
|
74
|
+
title: "Fixture DB에 저장",
|
|
75
|
+
value: "db"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
title: "파일로 저장 (자동 파일명)",
|
|
79
|
+
value: "file"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
title: "파일로 저장 (파일명 지정)",
|
|
83
|
+
value: "file:custom"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
title: "저장 안 함 (출력만)",
|
|
87
|
+
value: "none"
|
|
88
|
+
}
|
|
89
|
+
]
|
|
90
|
+
});
|
|
91
|
+
saveTarget = result.saveTarget;
|
|
92
|
+
if (saveTarget === "file:custom") {
|
|
93
|
+
const filenameResult = await prompts({
|
|
94
|
+
type: "text",
|
|
95
|
+
name: "filename",
|
|
96
|
+
message: "파일명:",
|
|
97
|
+
initial: "fixtures.json"
|
|
98
|
+
});
|
|
99
|
+
if (!filenameResult.filename) {
|
|
100
|
+
console.log(chalk.yellow("취소되었습니다."));
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
saveTarget = `file:${filenameResult.filename}`;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
let useLLM = options["use-llm"] ?? false;
|
|
107
|
+
if (!options["use-llm"]) {
|
|
108
|
+
const llmResult = await prompts({
|
|
109
|
+
type: "confirm",
|
|
110
|
+
name: "useLLM",
|
|
111
|
+
message: "LLM으로 더 현실적인 데이터를 생성할까요? (fixtureHint 기반, ANTHROPIC_API_KEY 필요)",
|
|
112
|
+
initial: false
|
|
113
|
+
});
|
|
114
|
+
useLLM = llmResult.useLLM ?? false;
|
|
115
|
+
}
|
|
116
|
+
const enableLLMCache = !options["no-cache"];
|
|
117
|
+
const fixtureDb = createKnexInstance(Sonamu.dbConfig.fixture);
|
|
118
|
+
const generator = new FixtureGenerator(fixtureDb, fixtureDb, "fixture", EntityManager, {
|
|
119
|
+
useLLM,
|
|
120
|
+
enableLLMCache
|
|
121
|
+
});
|
|
122
|
+
if (useLLM) {
|
|
123
|
+
console.log(chalk.cyan(`\nLLM 모드로 ${entityNames.join(", ")} 생성 중... (캐싱: ${enableLLMCache ? "ON" : "OFF"})`));
|
|
124
|
+
} else {
|
|
125
|
+
console.log(chalk.cyan(`\n${entityNames.join(", ")} 생성 중...`));
|
|
126
|
+
}
|
|
127
|
+
const specs = entityNames.map((entityName) => ({
|
|
128
|
+
entity: entityName,
|
|
129
|
+
count,
|
|
130
|
+
overrides: {}
|
|
131
|
+
}));
|
|
132
|
+
const results = await generator.generateBatch(specs);
|
|
133
|
+
if (useLLM) {
|
|
134
|
+
const stats = generator.getLLMCacheStats();
|
|
135
|
+
console.log(chalk.cyan(`[LLM Cache] 캐시 크기: ${stats.size}`));
|
|
136
|
+
}
|
|
137
|
+
console.log(chalk.green(`\n✅ ${results.length}개 fixture 생성 완료`));
|
|
138
|
+
if (saveTarget === "none") {
|
|
139
|
+
console.log(JSON.stringify(results, null, 2));
|
|
140
|
+
} else if (saveTarget === "db") {
|
|
141
|
+
console.log(chalk.green("Fixture DB에 저장되었습니다."));
|
|
142
|
+
} else if (saveTarget.startsWith("file")) {
|
|
143
|
+
const fs = await import("node:fs/promises");
|
|
144
|
+
const path = await import("node:path");
|
|
145
|
+
const fixturesDir = path.join(process.cwd(), "test", "fixtures");
|
|
146
|
+
try {
|
|
147
|
+
await fs.access(fixturesDir);
|
|
148
|
+
} catch {
|
|
149
|
+
await fs.mkdir(fixturesDir, { recursive: true });
|
|
150
|
+
}
|
|
151
|
+
for (const entityName of entityNames) {
|
|
152
|
+
const entityResults = results.filter((r) => r.entityId === entityName);
|
|
153
|
+
if (entityResults.length === 0) {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
let filename;
|
|
157
|
+
if (saveTarget === "file") {
|
|
158
|
+
const entity = EntityManager.get(entityName);
|
|
159
|
+
filename = `${entity.table}.json`;
|
|
160
|
+
} else {
|
|
161
|
+
filename = saveTarget.replace("file:", "");
|
|
162
|
+
}
|
|
163
|
+
const filepath = path.join(fixturesDir, filename);
|
|
164
|
+
await fs.writeFile(filepath, JSON.stringify(entityResults.map((r) => r.data), null, 2));
|
|
165
|
+
console.log(chalk.green(`✅ ${filepath} 저장 완료`));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
} catch (error) {
|
|
169
|
+
console.error(chalk.red("Fixture 생성 중 오류가 발생했습니다.\n" + "원인: Entity 정의나 DB 연결을 확인해주세요.\n" + "자세한 내용:"), error);
|
|
170
|
+
throw error;
|
|
171
|
+
}
|
|
168
172
|
}
|
|
169
173
|
/**
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
174
|
+
* fixture fetch 명령어 - 실제 운영 DB에서 데이터를 가져와 fixture로 저장합니다.
|
|
175
|
+
* 관계된 데이터도 함께 가져오므로 현실적인 테스트 데이터를 확보할 수 있습니다.
|
|
176
|
+
*/
|
|
177
|
+
async function fixtureFetchCommand(options) {
|
|
178
|
+
try {
|
|
179
|
+
if (!EntityManager.isAutoloaded) {
|
|
180
|
+
await EntityManager.autoload();
|
|
181
|
+
}
|
|
182
|
+
let entityNames;
|
|
183
|
+
if (options.all) {
|
|
184
|
+
entityNames = EntityManager.getAllIds();
|
|
185
|
+
if (options.exclude) {
|
|
186
|
+
const excludeList = options.exclude.split(",").map((s) => s.trim());
|
|
187
|
+
entityNames = entityNames.filter((name) => !excludeList.includes(name));
|
|
188
|
+
}
|
|
189
|
+
} else if (options.include) {
|
|
190
|
+
entityNames = options.include.split(",").map((s) => s.trim());
|
|
191
|
+
} else {
|
|
192
|
+
const result = await prompts({
|
|
193
|
+
type: "multiselect",
|
|
194
|
+
name: "entities",
|
|
195
|
+
message: "Import할 Entity를 선택하세요:",
|
|
196
|
+
choices: EntityManager.getAllIds().map((id) => ({
|
|
197
|
+
title: id,
|
|
198
|
+
value: id
|
|
199
|
+
})),
|
|
200
|
+
min: 1
|
|
201
|
+
});
|
|
202
|
+
if (!result.entities || result.entities.length === 0) {
|
|
203
|
+
console.log(chalk.yellow("취소되었습니다."));
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
entityNames = result.entities;
|
|
207
|
+
}
|
|
208
|
+
const strategy = options.strategy ?? "recent";
|
|
209
|
+
const limit = options.limit ? Number.parseInt(options.limit, 10) : 10;
|
|
210
|
+
const sourceDb = DB.getDB("r");
|
|
211
|
+
const fixtureDb = createKnexInstance(Sonamu.dbConfig.fixture);
|
|
212
|
+
const generator = new FixtureGenerator(sourceDb, fixtureDb, "fixture", EntityManager);
|
|
213
|
+
console.log(chalk.cyan(`\n${entityNames.join(", ")} import 중...`));
|
|
214
|
+
for (const entityName of entityNames) {
|
|
215
|
+
const results = await generator.importFromSource(entityName, {
|
|
216
|
+
strategy,
|
|
217
|
+
limit,
|
|
218
|
+
includeRelations: true,
|
|
219
|
+
maxDepth: 2
|
|
220
|
+
});
|
|
221
|
+
console.log(chalk.green(`✅ ${entityName}: ${results.length}개 import 완료`));
|
|
222
|
+
}
|
|
223
|
+
} catch (error) {
|
|
224
|
+
console.error(chalk.red("실제 DB에서 데이터를 가져오는 중 오류가 발생했습니다.\n" + "원인: 소스 DB 연결 설정(sonamu.config.ts)이나 Entity 관계 정의를 확인해주세요.\n" + "자세한 내용:"), error);
|
|
225
|
+
throw error;
|
|
226
|
+
}
|
|
223
227
|
}
|
|
224
228
|
/**
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
229
|
+
* fixture explore 명령어 - DB의 실제 데이터를 조회하여 확인합니다.
|
|
230
|
+
* 저장하지 않고 조회만 하므로 데이터를 빠르게 확인할 때 유용합니다.
|
|
231
|
+
*/
|
|
232
|
+
async function fixtureExploreCommand(options) {
|
|
233
|
+
try {
|
|
234
|
+
if (!EntityManager.isAutoloaded) {
|
|
235
|
+
await EntityManager.autoload();
|
|
236
|
+
}
|
|
237
|
+
let entityName = options.include;
|
|
238
|
+
if (!entityName) {
|
|
239
|
+
const result = await prompts({
|
|
240
|
+
type: "select",
|
|
241
|
+
name: "entity",
|
|
242
|
+
message: "탐색할 Entity:",
|
|
243
|
+
choices: EntityManager.getAllIds().map((id) => ({
|
|
244
|
+
title: id,
|
|
245
|
+
value: id
|
|
246
|
+
}))
|
|
247
|
+
});
|
|
248
|
+
if (!result.entity) {
|
|
249
|
+
console.log(chalk.yellow("취소되었습니다."));
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
entityName = result.entity;
|
|
253
|
+
}
|
|
254
|
+
if (!entityName) {
|
|
255
|
+
throw new Error("Entity name is required");
|
|
256
|
+
}
|
|
257
|
+
const strategy = options.strategy ?? "sample";
|
|
258
|
+
const limit = options.limit ? Number.parseInt(options.limit, 10) : 10;
|
|
259
|
+
const db = DB.getDB("r");
|
|
260
|
+
const explorer = new DataExplorer(db, EntityManager);
|
|
261
|
+
const data = await explorer.explore(entityName, {
|
|
262
|
+
strategy,
|
|
263
|
+
limit
|
|
264
|
+
});
|
|
265
|
+
console.log(chalk.cyan(`\n${entityName} ${data.length}개 조회 완료:`));
|
|
266
|
+
console.table(data);
|
|
267
|
+
} catch (error) {
|
|
268
|
+
console.error(chalk.red("데이터 조회 중 오류가 발생했습니다.\n" + "원인: DB 연결이나 Entity 정의를 확인해주세요.\n" + "자세한 내용:"), error);
|
|
269
|
+
throw error;
|
|
270
|
+
}
|
|
266
271
|
}
|
|
267
272
|
|
|
268
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vZml4dHVyZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgcHJvbXB0cyBmcm9tIFwicHJvbXB0c1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaVwiO1xuaW1wb3J0IHsgREIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IGNyZWF0ZUtuZXhJbnN0YW5jZSB9IGZyb20gXCIuLi9kYXRhYmFzZS9rbmV4XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgRGF0YUV4cGxvcmVyLCB0eXBlIERhdGFFeHBsb3JlclN0cmF0ZWd5IH0gZnJvbSBcIi4uL3Rlc3RpbmcvZGF0YS1leHBsb3JlclwiO1xuaW1wb3J0IHsgRml4dHVyZUdlbmVyYXRvciB9IGZyb20gXCIuLi90ZXN0aW5nL2ZpeHR1cmUtZ2VuZXJhdG9yXCI7XG5cbmludGVyZmFjZSBGaXh0dXJlQ29tbWFuZE9wdGlvbnMge1xuICBfPzogc3RyaW5nW107XG4gIGFsbD86IGJvb2xlYW47XG4gIGluY2x1ZGU/OiBzdHJpbmc7XG4gIGV4Y2x1ZGU/OiBzdHJpbmc7XG4gIGNvdW50Pzogc3RyaW5nO1xuICBcInNhdmUtdG9cIj86IHN0cmluZztcbiAgc3RyYXRlZ3k/OiBEYXRhRXhwbG9yZXJTdHJhdGVneTtcbiAgbGltaXQ/OiBzdHJpbmc7XG4gIFwidXNlLWxsbVwiPzogYm9vbGVhbjtcbiAgXCJuby1jYWNoZVwiPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBmaXh0dXJlIGdlbiDrqoXroLnslrQgLSBjb25lIOuplO2DgOuNsOydtO2EsOulvCDtmZzsmqntlZjsl6wg7J6Q64+Z7Jy866GcIGZpeHR1cmXrpbwg7IOd7ISx7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4dHVyZUdlbkNvbW1hbmQob3B0aW9uczogRml4dHVyZUNvbW1hbmRPcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgaWYgKCFFbnRpdHlNYW5hZ2VyLmlzQXV0b2xvYWRlZCkge1xuICAgICAgYXdhaXQgRW50aXR5TWFuYWdlci5hdXRvbG9hZCgpO1xuICAgIH1cblxuICAgIGxldCBlbnRpdHlOYW1lczogc3RyaW5nW107XG5cbiAgICBpZiAob3B0aW9ucy5hbGwpIHtcbiAgICAgIGVudGl0eU5hbWVzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICAgIGlmIChvcHRpb25zLmV4Y2x1ZGUpIHtcbiAgICAgICAgY29uc3QgZXhjbHVkZUxpc3QgPSBvcHRpb25zLmV4Y2x1ZGUuc3BsaXQoXCIsXCIpLm1hcCgoczogc3RyaW5nKSA9PiBzLnRyaW0oKSk7XG4gICAgICAgIGVudGl0eU5hbWVzID0gZW50aXR5TmFtZXMuZmlsdGVyKChuYW1lKSA9PiAhZXhjbHVkZUxpc3QuaW5jbHVkZXMobmFtZSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pbmNsdWRlKSB7XG4gICAgICBlbnRpdHlOYW1lcyA9IG9wdGlvbnMuaW5jbHVkZS5zcGxpdChcIixcIikubWFwKChzOiBzdHJpbmcpID0+IHMudHJpbSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwibXVsdGlzZWxlY3RcIixcbiAgICAgICAgbmFtZTogXCJlbnRpdGllc1wiLFxuICAgICAgICBtZXNzYWdlOiBcIkZpeHR1cmXrpbwg7IOd7ISx7ZWgIEVudGl0eeulvCDshKDtg53tlZjshLjsmpQ6XCIsXG4gICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCkubWFwKChpZCkgPT4gKHsgdGl0bGU6IGlkLCB2YWx1ZTogaWQgfSkpLFxuICAgICAgICBtaW46IDEsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuZW50aXRpZXMgfHwgcmVzdWx0LmVudGl0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCLst6jshozrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlbnRpdHlOYW1lcyA9IHJlc3VsdC5lbnRpdGllcztcbiAgICB9XG5cbiAgICBsZXQgY291bnQgPSBvcHRpb25zLmNvdW50ID8gTnVtYmVyLnBhcnNlSW50KG9wdGlvbnMuY291bnQsIDEwKSA6IDU7XG4gICAgaWYgKCFvcHRpb25zLmNvdW50KSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgbmFtZTogXCJjb3VudFwiLFxuICAgICAgICBtZXNzYWdlOiBcIuqwgSBFbnRpdHnrs4Qg7IOd7ISxIOqwnOyImDpcIixcbiAgICAgICAgaW5pdGlhbDogNSxcbiAgICAgICAgbWluOiAxLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzdWx0LmNvdW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvdW50ID0gcmVzdWx0LmNvdW50O1xuICAgIH1cblxuICAgIGxldCBzYXZlVGFyZ2V0ID0gb3B0aW9uc1tcInNhdmUtdG9cIl0gfHwgXCJkYlwiO1xuICAgIGlmICghb3B0aW9uc1tcInNhdmUtdG9cIl0pIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICB0eXBlOiBcInNlbGVjdFwiLFxuICAgICAgICBuYW1lOiBcInNhdmVUYXJnZXRcIixcbiAgICAgICAgbWVzc2FnZTogXCLsoIDsnqUg67Cp7IudOlwiLFxuICAgICAgICBjaG9pY2VzOiBbXG4gICAgICAgICAgeyB0aXRsZTogXCJGaXh0dXJlIERC7JeQIOyggOyepVwiLCB2YWx1ZTogXCJkYlwiIH0sXG4gICAgICAgICAgeyB0aXRsZTogXCLtjIzsnbzroZwg7KCA7J6lICjsnpDrj5kg7YyM7J2866qFKVwiLCB2YWx1ZTogXCJmaWxlXCIgfSxcbiAgICAgICAgICB7IHRpdGxlOiBcIu2MjOydvOuhnCDsoIDsnqUgKO2MjOydvOuqhSDsp4DsoJUpXCIsIHZhbHVlOiBcImZpbGU6Y3VzdG9tXCIgfSxcbiAgICAgICAgICB7IHRpdGxlOiBcIuyggOyepSDslYgg7ZWoICjstpzroKXrp4wpXCIsIHZhbHVlOiBcIm5vbmVcIiB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIHNhdmVUYXJnZXQgPSByZXN1bHQuc2F2ZVRhcmdldDtcblxuICAgICAgaWYgKHNhdmVUYXJnZXQgPT09IFwiZmlsZTpjdXN0b21cIikge1xuICAgICAgICBjb25zdCBmaWxlbmFtZVJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIG5hbWU6IFwiZmlsZW5hbWVcIixcbiAgICAgICAgICBtZXNzYWdlOiBcIu2MjOydvOuqhTpcIixcbiAgICAgICAgICBpbml0aWFsOiBcImZpeHR1cmVzLmpzb25cIixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFmaWxlbmFtZVJlc3VsdC5maWxlbmFtZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNhdmVUYXJnZXQgPSBgZmlsZToke2ZpbGVuYW1lUmVzdWx0LmZpbGVuYW1lfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTExNIOyCrOyaqSDsl6zrtoAg6rKw7KCVXG4gICAgbGV0IHVzZUxMTSA9IG9wdGlvbnNbXCJ1c2UtbGxtXCJdID8/IGZhbHNlO1xuICAgIGlmICghb3B0aW9uc1tcInVzZS1sbG1cIl0pIHtcbiAgICAgIGNvbnN0IGxsbVJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICB0eXBlOiBcImNvbmZpcm1cIixcbiAgICAgICAgbmFtZTogXCJ1c2VMTE1cIixcbiAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICBcIkxMTeycvOuhnCDrjZQg7ZiE7Iuk7KCB7J24IOuNsOydtO2EsOulvCDsg53shLHtlaDquYzsmpQ/IChmaXh0dXJlSGludCDquLDrsJgsIEFOVEhST1BJQ19BUElfS0VZIO2VhOyalClcIixcbiAgICAgICAgaW5pdGlhbDogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIHVzZUxMTSA9IGxsbVJlc3VsdC51c2VMTE0gPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZW5hYmxlTExNQ2FjaGUgPSAhb3B0aW9uc1tcIm5vLWNhY2hlXCJdO1xuXG4gICAgLy8gZml4dHVyZSBnZW46IGZpeHR1cmUgREIg64K07JeQ7IScIOywuOyhsCDqtIDqs4Trpbwg7ZW06rKw7ZWY6rOgIOyggOyepe2VqeuLiOuLpFxuICAgIGNvbnN0IGZpeHR1cmVEYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcuZml4dHVyZSk7XG4gICAgY29uc3QgZ2VuZXJhdG9yID0gbmV3IEZpeHR1cmVHZW5lcmF0b3IoZml4dHVyZURiLCBmaXh0dXJlRGIsIFwiZml4dHVyZVwiLCBFbnRpdHlNYW5hZ2VyLCB7XG4gICAgICB1c2VMTE0sXG4gICAgICBlbmFibGVMTE1DYWNoZSxcbiAgICB9KTtcblxuICAgIGlmICh1c2VMTE0pIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgIGBcXG5MTE0g66qo65Oc66GcICR7ZW50aXR5TmFtZXMuam9pbihcIiwgXCIpfSDsg53shLEg7KSRLi4uICjsupDsi7E6ICR7ZW5hYmxlTExNQ2FjaGUgPyBcIk9OXCIgOiBcIk9GRlwifSlgLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxuJHtlbnRpdHlOYW1lcy5qb2luKFwiLCBcIil9IOyDneyEsSDspJEuLi5gKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3BlY3MgPSBlbnRpdHlOYW1lcy5tYXAoKGVudGl0eU5hbWUpID0+ICh7XG4gICAgICBlbnRpdHk6IGVudGl0eU5hbWUsXG4gICAgICBjb3VudCxcbiAgICAgIG92ZXJyaWRlczoge30sXG4gICAgfSkpO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGdlbmVyYXRvci5nZW5lcmF0ZUJhdGNoKHNwZWNzKTtcblxuICAgIGlmICh1c2VMTE0pIHtcbiAgICAgIGNvbnN0IHN0YXRzID0gZ2VuZXJhdG9yLmdldExMTUNhY2hlU3RhdHMoKTtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYFtMTE0gQ2FjaGVdIOy6kOyLnCDtgazquLA6ICR7c3RhdHMuc2l6ZX1gKSk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFxcbuKchSAke3Jlc3VsdHMubGVuZ3RofeqwnCBmaXh0dXJlIOyDneyEsSDsmYTro4xgKSk7XG5cbiAgICBpZiAoc2F2ZVRhcmdldCA9PT0gXCJub25lXCIpIHtcbiAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlc3VsdHMsIG51bGwsIDIpKTtcbiAgICB9IGVsc2UgaWYgKHNhdmVUYXJnZXQgPT09IFwiZGJcIikge1xuICAgICAgLy8gZ2VuZXJhdGVCYXRjaOqwgCDsnbTrr7ggRELsl5Ag7KCA7J6l7ZaI7Jy866+A66GcIOuzhOuPhCDsoIDsnqXsnbQg67aI7ZWE7JqU7ZWp64uI64ukLlxuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oXCJGaXh0dXJlIERC7JeQIOyggOyepeuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgIH0gZWxzZSBpZiAoc2F2ZVRhcmdldC5zdGFydHNXaXRoKFwiZmlsZVwiKSkge1xuICAgICAgY29uc3QgZnMgPSBhd2FpdCBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuICAgICAgY29uc3QgcGF0aCA9IGF3YWl0IGltcG9ydChcIm5vZGU6cGF0aFwiKTtcblxuICAgICAgY29uc3QgZml4dHVyZXNEaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJ0ZXN0XCIsIFwiZml4dHVyZXNcIik7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3MoZml4dHVyZXNEaXIpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKGZpeHR1cmVzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBlbnRpdHlOYW1lIG9mIGVudGl0eU5hbWVzKSB7XG4gICAgICAgIGNvbnN0IGVudGl0eVJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcigocikgPT4gci5lbnRpdHlJZCA9PT0gZW50aXR5TmFtZSk7XG5cbiAgICAgICAgaWYgKGVudGl0eVJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZmlsZW5hbWU6IHN0cmluZztcbiAgICAgICAgaWYgKHNhdmVUYXJnZXQgPT09IFwiZmlsZVwiKSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG4gICAgICAgICAgZmlsZW5hbWUgPSBgJHtlbnRpdHkudGFibGV9Lmpzb25gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbGVuYW1lID0gc2F2ZVRhcmdldC5yZXBsYWNlKFwiZmlsZTpcIiwgXCJcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlcGF0aCA9IHBhdGguam9pbihmaXh0dXJlc0RpciwgZmlsZW5hbWUpO1xuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgICAgICAgZmlsZXBhdGgsXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBlbnRpdHlSZXN1bHRzLm1hcCgocikgPT4gci5kYXRhKSxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAyLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinIUgJHtmaWxlcGF0aH0g7KCA7J6lIOyZhOujjGApKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgXCJGaXh0dXJlIOyDneyEsSDspJEg7Jik66WY6rCAIOuwnOyDne2WiOyKteuLiOuLpC5cXG5cIiArXG4gICAgICAgICAgXCLsm5Dsnbg6IEVudGl0eSDsoJXsnZjrgpggREIg7Jew6rKw7J2EIO2ZleyduO2VtOyjvOyEuOyalC5cXG5cIiArXG4gICAgICAgICAgXCLsnpDshLjtlZwg64K07JqpOlwiLFxuICAgICAgKSxcbiAgICAgIGVycm9yLFxuICAgICk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBmaXh0dXJlIGZldGNoIOuqheugueyWtCAtIOyLpOygnCDsmrTsmIEgRELsl5DshJwg642w7J207YSw66W8IOqwgOyguOyZgCBmaXh0dXJl66GcIOyggOyepe2VqeuLiOuLpC5cbiAqIOq0gOqzhOuQnCDrjbDsnbTthLDrj4Qg7ZWo6ruYIOqwgOyguOyYpOuvgOuhnCDtmITsi6TsoIHsnbgg7YWM7Iqk7Yq4IOuNsOydtO2EsOulvCDtmZXrs7TtlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVGZXRjaENvbW1hbmQob3B0aW9uczogRml4dHVyZUNvbW1hbmRPcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgaWYgKCFFbnRpdHlNYW5hZ2VyLmlzQXV0b2xvYWRlZCkge1xuICAgICAgYXdhaXQgRW50aXR5TWFuYWdlci5hdXRvbG9hZCgpO1xuICAgIH1cblxuICAgIGxldCBlbnRpdHlOYW1lczogc3RyaW5nW107XG5cbiAgICBpZiAob3B0aW9ucy5hbGwpIHtcbiAgICAgIGVudGl0eU5hbWVzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICAgIGlmIChvcHRpb25zLmV4Y2x1ZGUpIHtcbiAgICAgICAgY29uc3QgZXhjbHVkZUxpc3QgPSBvcHRpb25zLmV4Y2x1ZGUuc3BsaXQoXCIsXCIpLm1hcCgoczogc3RyaW5nKSA9PiBzLnRyaW0oKSk7XG4gICAgICAgIGVudGl0eU5hbWVzID0gZW50aXR5TmFtZXMuZmlsdGVyKChuYW1lKSA9PiAhZXhjbHVkZUxpc3QuaW5jbHVkZXMobmFtZSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pbmNsdWRlKSB7XG4gICAgICBlbnRpdHlOYW1lcyA9IG9wdGlvbnMuaW5jbHVkZS5zcGxpdChcIixcIikubWFwKChzOiBzdHJpbmcpID0+IHMudHJpbSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwibXVsdGlzZWxlY3RcIixcbiAgICAgICAgbmFtZTogXCJlbnRpdGllc1wiLFxuICAgICAgICBtZXNzYWdlOiBcIkltcG9ydO2VoCBFbnRpdHnrpbwg7ISg7YOd7ZWY7IS47JqUOlwiLFxuICAgICAgICBjaG9pY2VzOiBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpLm1hcCgoaWQpID0+ICh7IHRpdGxlOiBpZCwgdmFsdWU6IGlkIH0pKSxcbiAgICAgICAgbWluOiAxLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzdWx0LmVudGl0aWVzIHx8IHJlc3VsdC5lbnRpdGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwi7Leo7IaM65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZW50aXR5TmFtZXMgPSByZXN1bHQuZW50aXRpZXM7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RyYXRlZ3k6IERhdGFFeHBsb3JlclN0cmF0ZWd5ID0gb3B0aW9ucy5zdHJhdGVneSA/PyBcInJlY2VudFwiO1xuICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucy5saW1pdCA/IE51bWJlci5wYXJzZUludChvcHRpb25zLmxpbWl0LCAxMCkgOiAxMDtcblxuICAgIC8vIGZpeHR1cmUgZmV0Y2g6IHByb2R1Y3Rpb24g642w7J207YSw66W8IGZpeHR1cmUgRELroZwgaW1wb3J07ZWp64uI64ukXG4gICAgY29uc3Qgc291cmNlRGIgPSBEQi5nZXREQihcInJcIik7IC8vIHByb2R1Y3Rpb25fbWFzdGVyICjrmJDripQgZGV2ZWxvcG1lbnRfbWFzdGVyKVxuICAgIGNvbnN0IGZpeHR1cmVEYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcuZml4dHVyZSk7XG4gICAgY29uc3QgZ2VuZXJhdG9yID0gbmV3IEZpeHR1cmVHZW5lcmF0b3Ioc291cmNlRGIsIGZpeHR1cmVEYiwgXCJmaXh0dXJlXCIsIEVudGl0eU1hbmFnZXIpO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxuJHtlbnRpdHlOYW1lcy5qb2luKFwiLCBcIil9IGltcG9ydCDspJEuLi5gKSk7XG5cbiAgICBmb3IgKGNvbnN0IGVudGl0eU5hbWUgb2YgZW50aXR5TmFtZXMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBnZW5lcmF0b3IuaW1wb3J0RnJvbVNvdXJjZShlbnRpdHlOYW1lLCB7XG4gICAgICAgIHN0cmF0ZWd5LFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgaW5jbHVkZVJlbGF0aW9uczogdHJ1ZSxcbiAgICAgICAgbWF4RGVwdGg6IDIsXG4gICAgICB9KTtcblxuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKchSAke2VudGl0eU5hbWV9OiAke3Jlc3VsdHMubGVuZ3RofeqwnCBpbXBvcnQg7JmE66OMYCkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBcIuyLpOygnCBEQuyXkOyEnCDrjbDsnbTthLDrpbwg6rCA7KC47Jik64qUIOykkSDsmKTrpZjqsIAg67Cc7IOd7ZaI7Iq164uI64ukLlxcblwiICtcbiAgICAgICAgICBcIuybkOyduDog7IaM7IqkIERCIOyXsOqysCDshKTsoJUoc29uYW11LmNvbmZpZy50cynsnbTrgpggRW50aXR5IOq0gOqzhCDsoJXsnZjrpbwg7ZmV7J247ZW07KO87IS47JqULlxcblwiICtcbiAgICAgICAgICBcIuyekOyEuO2VnCDrgrTsmqk6XCIsXG4gICAgICApLFxuICAgICAgZXJyb3IsXG4gICAgKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIGZpeHR1cmUgZXhwbG9yZSDrqoXroLnslrQgLSBEQuydmCDsi6TsoJwg642w7J207YSw66W8IOyhsO2ajO2VmOyXrCDtmZXsnbjtlanri4jri6QuXG4gKiDsoIDsnqXtlZjsp4Ag7JWK6rOgIOyhsO2ajOunjCDtlZjrr4DroZwg642w7J207YSw66W8IOu5oOultOqyjCDtmZXsnbjtlaAg65WMIOycoOyaqe2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVFeHBsb3JlQ29tbWFuZChvcHRpb25zOiBGaXh0dXJlQ29tbWFuZE9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIUVudGl0eU1hbmFnZXIuaXNBdXRvbG9hZGVkKSB7XG4gICAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgfVxuXG4gICAgbGV0IGVudGl0eU5hbWUgPSBvcHRpb25zLmluY2x1ZGU7XG5cbiAgICBpZiAoIWVudGl0eU5hbWUpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICB0eXBlOiBcInNlbGVjdFwiLFxuICAgICAgICBuYW1lOiBcImVudGl0eVwiLFxuICAgICAgICBtZXNzYWdlOiBcIu2DkOyDie2VoCBFbnRpdHk6XCIsXG4gICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCkubWFwKChpZCkgPT4gKHsgdGl0bGU6IGlkLCB2YWx1ZTogaWQgfSkpLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzdWx0LmVudGl0eSkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCLst6jshozrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlbnRpdHlOYW1lID0gcmVzdWx0LmVudGl0eTtcbiAgICB9XG5cbiAgICBpZiAoIWVudGl0eU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkVudGl0eSBuYW1lIGlzIHJlcXVpcmVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cmF0ZWd5OiBEYXRhRXhwbG9yZXJTdHJhdGVneSA9IG9wdGlvbnMuc3RyYXRlZ3kgPz8gXCJzYW1wbGVcIjtcbiAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnMubGltaXQgPyBOdW1iZXIucGFyc2VJbnQob3B0aW9ucy5saW1pdCwgMTApIDogMTA7XG5cbiAgICBjb25zdCBkYiA9IERCLmdldERCKFwiclwiKTtcbiAgICBjb25zdCBleHBsb3JlciA9IG5ldyBEYXRhRXhwbG9yZXIoZGIsIEVudGl0eU1hbmFnZXIpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBleHBsb3Jlci5leHBsb3JlKGVudGl0eU5hbWUsIHsgc3RyYXRlZ3ksIGxpbWl0IH0pO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxuJHtlbnRpdHlOYW1lfSAke2RhdGEubGVuZ3RofeqwnCDsobDtmowg7JmE66OMOmApKTtcbiAgICBjb25zb2xlLnRhYmxlKGRhdGEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwi642w7J207YSwIOyhsO2ajCDspJEg7Jik66WY6rCAIOuwnOyDne2WiOyKteuLiOuLpC5cXG5cIiArXG4gICAgICAgICAgXCLsm5Dsnbg6IERCIOyXsOqysOydtOuCmCBFbnRpdHkg7KCV7J2Y66W8IO2ZleyduO2VtOyjvOyEuOyalC5cXG5cIiArXG4gICAgICAgICAgXCLsnpDshLjtlZwg64K07JqpOlwiLFxuICAgICAgKSxcbiAgICAgIGVycm9yLFxuICAgICk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJjaGFsayIsInByb21wdHMiLCJTb25hbXUiLCJEQiIsImNyZWF0ZUtuZXhJbnN0YW5jZSIsIkVudGl0eU1hbmFnZXIiLCJEYXRhRXhwbG9yZXIiLCJGaXh0dXJlR2VuZXJhdG9yIiwiZml4dHVyZUdlbkNvbW1hbmQiLCJvcHRpb25zIiwiaXNBdXRvbG9hZGVkIiwiYXV0b2xvYWQiLCJlbnRpdHlOYW1lcyIsImFsbCIsImdldEFsbElkcyIsImV4Y2x1ZGUiLCJleGNsdWRlTGlzdCIsInNwbGl0IiwibWFwIiwicyIsInRyaW0iLCJmaWx0ZXIiLCJuYW1lIiwiaW5jbHVkZXMiLCJpbmNsdWRlIiwicmVzdWx0IiwidHlwZSIsIm1lc3NhZ2UiLCJjaG9pY2VzIiwiaWQiLCJ0aXRsZSIsInZhbHVlIiwibWluIiwiZW50aXRpZXMiLCJsZW5ndGgiLCJjb25zb2xlIiwibG9nIiwieWVsbG93IiwiY291bnQiLCJOdW1iZXIiLCJwYXJzZUludCIsImluaXRpYWwiLCJzYXZlVGFyZ2V0IiwiZmlsZW5hbWVSZXN1bHQiLCJmaWxlbmFtZSIsInVzZUxMTSIsImxsbVJlc3VsdCIsImVuYWJsZUxMTUNhY2hlIiwiZml4dHVyZURiIiwiZGJDb25maWciLCJmaXh0dXJlIiwiZ2VuZXJhdG9yIiwiY3lhbiIsImpvaW4iLCJzcGVjcyIsImVudGl0eU5hbWUiLCJlbnRpdHkiLCJvdmVycmlkZXMiLCJyZXN1bHRzIiwiZ2VuZXJhdGVCYXRjaCIsInN0YXRzIiwiZ2V0TExNQ2FjaGVTdGF0cyIsInNpemUiLCJncmVlbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJzdGFydHNXaXRoIiwiZnMiLCJwYXRoIiwiZml4dHVyZXNEaXIiLCJwcm9jZXNzIiwiY3dkIiwiYWNjZXNzIiwibWtkaXIiLCJyZWN1cnNpdmUiLCJlbnRpdHlSZXN1bHRzIiwiciIsImVudGl0eUlkIiwiZ2V0IiwidGFibGUiLCJyZXBsYWNlIiwiZmlsZXBhdGgiLCJ3cml0ZUZpbGUiLCJkYXRhIiwiZXJyb3IiLCJyZWQiLCJmaXh0dXJlRmV0Y2hDb21tYW5kIiwic3RyYXRlZ3kiLCJsaW1pdCIsInNvdXJjZURiIiwiZ2V0REIiLCJpbXBvcnRGcm9tU291cmNlIiwiaW5jbHVkZVJlbGF0aW9ucyIsIm1heERlcHRoIiwiZml4dHVyZUV4cGxvcmVDb21tYW5kIiwiRXJyb3IiLCJkYiIsImV4cGxvcmVyIiwiZXhwbG9yZSJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBVyxRQUFRO0FBQzFCLE9BQU9DLGFBQWEsVUFBVTtBQUM5QixTQUFTQyxNQUFNLFFBQVEsa0JBQVM7QUFDaEMsU0FBU0MsRUFBRSxRQUFRLG9CQUFpQjtBQUNwQyxTQUFTQyxrQkFBa0IsUUFBUSxzQkFBbUI7QUFDdEQsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUFTQyxZQUFZLFFBQW1DLDhCQUEyQjtBQUNuRixTQUFTQyxnQkFBZ0IsUUFBUSxrQ0FBK0I7QUFlaEU7O0NBRUMsR0FDRCxPQUFPLGVBQWVDLGtCQUFrQkMsT0FBOEI7SUFDcEUsSUFBSTtRQUNGLElBQUksQ0FBQ0osY0FBY0ssWUFBWSxFQUFFO1lBQy9CLE1BQU1MLGNBQWNNLFFBQVE7UUFDOUI7UUFFQSxJQUFJQztRQUVKLElBQUlILFFBQVFJLEdBQUcsRUFBRTtZQUNmRCxjQUFjUCxjQUFjUyxTQUFTO1lBQ3JDLElBQUlMLFFBQVFNLE9BQU8sRUFBRTtnQkFDbkIsTUFBTUMsY0FBY1AsUUFBUU0sT0FBTyxDQUFDRSxLQUFLLENBQUMsS0FBS0MsR0FBRyxDQUFDLENBQUNDLElBQWNBLEVBQUVDLElBQUk7Z0JBQ3hFUixjQUFjQSxZ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
|
|
273
|
+
//#endregion
|
|
274
|
+
export { fixtureExploreCommand, fixtureFetchCommand, fixtureGenCommand };
|
|
275
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS5qcyIsIm5hbWVzIjpbImVudGl0eU5hbWVzOiBzdHJpbmdbXSIsImZpbGVuYW1lOiBzdHJpbmciLCJzdHJhdGVneTogRGF0YUV4cGxvcmVyU3RyYXRlZ3kiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL2ZpeHR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHByb21wdHMgZnJvbSBcInByb21wdHNcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IERhdGFFeHBsb3JlciB9IGZyb20gXCIuLi90ZXN0aW5nL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IHR5cGUgRGF0YUV4cGxvcmVyU3RyYXRlZ3kgfSBmcm9tIFwiLi4vdGVzdGluZy9kYXRhLWV4cGxvcmVyXCI7XG5pbXBvcnQgeyBGaXh0dXJlR2VuZXJhdG9yIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1nZW5lcmF0b3JcIjtcblxuaW50ZXJmYWNlIEZpeHR1cmVDb21tYW5kT3B0aW9ucyB7XG4gIF8/OiBzdHJpbmdbXTtcbiAgYWxsPzogYm9vbGVhbjtcbiAgaW5jbHVkZT86IHN0cmluZztcbiAgZXhjbHVkZT86IHN0cmluZztcbiAgY291bnQ/OiBzdHJpbmc7XG4gIFwic2F2ZS10b1wiPzogc3RyaW5nO1xuICBzdHJhdGVneT86IERhdGFFeHBsb3JlclN0cmF0ZWd5O1xuICBsaW1pdD86IHN0cmluZztcbiAgXCJ1c2UtbGxtXCI/OiBib29sZWFuO1xuICBcIm5vLWNhY2hlXCI/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIGZpeHR1cmUgZ2VuIOuqheugueyWtCAtIGNvbmUg66mU7YOA642w7J207YSw66W8IO2ZnOyaqe2VmOyXrCDsnpDrj5nsnLzroZwgZml4dHVyZeulvCDsg53shLHtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXh0dXJlR2VuQ29tbWFuZChvcHRpb25zOiBGaXh0dXJlQ29tbWFuZE9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIUVudGl0eU1hbmFnZXIuaXNBdXRvbG9hZGVkKSB7XG4gICAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgfVxuXG4gICAgbGV0IGVudGl0eU5hbWVzOiBzdHJpbmdbXTtcblxuICAgIGlmIChvcHRpb25zLmFsbCkge1xuICAgICAgZW50aXR5TmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgaWYgKG9wdGlvbnMuZXhjbHVkZSkge1xuICAgICAgICBjb25zdCBleGNsdWRlTGlzdCA9IG9wdGlvbnMuZXhjbHVkZS5zcGxpdChcIixcIikubWFwKChzOiBzdHJpbmcpID0+IHMudHJpbSgpKTtcbiAgICAgICAgZW50aXR5TmFtZXMgPSBlbnRpdHlOYW1lcy5maWx0ZXIoKG5hbWUpID0+ICFleGNsdWRlTGlzdC5pbmNsdWRlcyhuYW1lKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmluY2x1ZGUpIHtcbiAgICAgIGVudGl0eU5hbWVzID0gb3B0aW9ucy5pbmNsdWRlLnNwbGl0KFwiLFwiKS5tYXAoKHM6IHN0cmluZykgPT4gcy50cmltKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJtdWx0aXNlbGVjdFwiLFxuICAgICAgICBuYW1lOiBcImVudGl0aWVzXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiRml4dHVyZeulvCDsg53shLHtlaAgRW50aXR566W8IOyEoO2Dne2VmOyEuOyalDpcIixcbiAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKS5tYXAoKGlkKSA9PiAoeyB0aXRsZTogaWQsIHZhbHVlOiBpZCB9KSksXG4gICAgICAgIG1pbjogMSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3VsdC5lbnRpdGllcyB8fCByZXN1bHQuZW50aXRpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGVudGl0eU5hbWVzID0gcmVzdWx0LmVudGl0aWVzO1xuICAgIH1cblxuICAgIGxldCBjb3VudCA9IG9wdGlvbnMuY291bnQgPyBOdW1iZXIucGFyc2VJbnQob3B0aW9ucy5jb3VudCwgMTApIDogNTtcbiAgICBpZiAoIW9wdGlvbnMuY291bnQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBuYW1lOiBcImNvdW50XCIsXG4gICAgICAgIG1lc3NhZ2U6IFwi6rCBIEVudGl0eeuzhCDsg53shLEg6rCc7IiYOlwiLFxuICAgICAgICBpbml0aWFsOiA1LFxuICAgICAgICBtaW46IDEsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuY291bnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwi7Leo7IaM65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY291bnQgPSByZXN1bHQuY291bnQ7XG4gICAgfVxuXG4gICAgbGV0IHNhdmVUYXJnZXQgPSBvcHRpb25zW1wic2F2ZS10b1wiXSB8fCBcImRiXCI7XG4gICAgaWYgKCFvcHRpb25zW1wic2F2ZS10b1wiXSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwic2VsZWN0XCIsXG4gICAgICAgIG5hbWU6IFwic2F2ZVRhcmdldFwiLFxuICAgICAgICBtZXNzYWdlOiBcIuyggOyepSDrsKnsi506XCIsXG4gICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICB7IHRpdGxlOiBcIkZpeHR1cmUgRELsl5Ag7KCA7J6lXCIsIHZhbHVlOiBcImRiXCIgfSxcbiAgICAgICAgICB7IHRpdGxlOiBcIu2MjOydvOuhnCDsoIDsnqUgKOyekOuPmSDtjIzsnbzrqoUpXCIsIHZhbHVlOiBcImZpbGVcIiB9LFxuICAgICAgICAgIHsgdGl0bGU6IFwi7YyM7J2866GcIOyggOyepSAo7YyM7J2866qFIOyngOyglSlcIiwgdmFsdWU6IFwiZmlsZTpjdXN0b21cIiB9LFxuICAgICAgICAgIHsgdGl0bGU6IFwi7KCA7J6lIOyViCDtlaggKOy2nOugpeunjClcIiwgdmFsdWU6IFwibm9uZVwiIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgc2F2ZVRhcmdldCA9IHJlc3VsdC5zYXZlVGFyZ2V0O1xuXG4gICAgICBpZiAoc2F2ZVRhcmdldCA9PT0gXCJmaWxlOmN1c3RvbVwiKSB7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lUmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgbmFtZTogXCJmaWxlbmFtZVwiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwi7YyM7J2866qFOlwiLFxuICAgICAgICAgIGluaXRpYWw6IFwiZml4dHVyZXMuanNvblwiLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIWZpbGVuYW1lUmVzdWx0LmZpbGVuYW1lKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwi7Leo7IaM65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2F2ZVRhcmdldCA9IGBmaWxlOiR7ZmlsZW5hbWVSZXN1bHQuZmlsZW5hbWV9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMTE0g7IKs7JqpIOyXrOu2gCDqsrDsoJVcbiAgICBsZXQgdXNlTExNID0gb3B0aW9uc1tcInVzZS1sbG1cIl0gPz8gZmFsc2U7XG4gICAgaWYgKCFvcHRpb25zW1widXNlLWxsbVwiXSkge1xuICAgICAgY29uc3QgbGxtUmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwiY29uZmlybVwiLFxuICAgICAgICBuYW1lOiBcInVzZUxMTVwiLFxuICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgIFwiTExN7Jy866GcIOuNlCDtmITsi6TsoIHsnbgg642w7J207YSw66W8IOyDneyEse2VoOq5jOyalD8gKGZpeHR1cmVIaW50IOq4sOuwmCwgQU5USFJPUElDX0FQSV9LRVkg7ZWE7JqUKVwiLFxuICAgICAgICBpbml0aWFsOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgdXNlTExNID0gbGxtUmVzdWx0LnVzZUxMTSA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmFibGVMTE1DYWNoZSA9ICFvcHRpb25zW1wibm8tY2FjaGVcIl07XG5cbiAgICAvLyBmaXh0dXJlIGdlbjogZml4dHVyZSBEQiDrgrTsl5DshJwg7LC47KGwIOq0gOqzhOulvCDtlbTqsrDtlZjqs6Ag7KCA7J6l7ZWp64uI64ukXG4gICAgY29uc3QgZml4dHVyZURiID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlKTtcbiAgICBjb25zdCBnZW5lcmF0b3IgPSBuZXcgRml4dHVyZUdlbmVyYXRvcihmaXh0dXJlRGIsIGZpeHR1cmVEYiwgXCJmaXh0dXJlXCIsIEVudGl0eU1hbmFnZXIsIHtcbiAgICAgIHVzZUxMTSxcbiAgICAgIGVuYWJsZUxMTUNhY2hlLFxuICAgIH0pO1xuXG4gICAgaWYgKHVzZUxMTSkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgYFxcbkxMTSDrqqjrk5zroZwgJHtlbnRpdHlOYW1lcy5qb2luKFwiLCBcIil9IOyDneyEsSDspJEuLi4gKOy6kOyLsTogJHtlbmFibGVMTE1DYWNoZSA/IFwiT05cIiA6IFwiT0ZGXCJ9KWAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG4ke2VudGl0eU5hbWVzLmpvaW4oXCIsIFwiKX0g7IOd7ISxIOykkS4uLmApKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGVjcyA9IGVudGl0eU5hbWVzLm1hcCgoZW50aXR5TmFtZSkgPT4gKHtcbiAgICAgIGVudGl0eTogZW50aXR5TmFtZSxcbiAgICAgIGNvdW50LFxuICAgICAgb3ZlcnJpZGVzOiB7fSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgZ2VuZXJhdG9yLmdlbmVyYXRlQmF0Y2goc3BlY3MpO1xuXG4gICAgaWYgKHVzZUxMTSkge1xuICAgICAgY29uc3Qgc3RhdHMgPSBnZW5lcmF0b3IuZ2V0TExNQ2FjaGVTdGF0cygpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgW0xMTSBDYWNoZV0g7LqQ7IucIO2BrOq4sDogJHtzdGF0cy5zaXplfWApKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgXFxu4pyFICR7cmVzdWx0cy5sZW5ndGh96rCcIGZpeHR1cmUg7IOd7ISxIOyZhOujjGApKTtcblxuICAgIGlmIChzYXZlVGFyZ2V0ID09PSBcIm5vbmVcIikge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0cywgbnVsbCwgMikpO1xuICAgIH0gZWxzZSBpZiAoc2F2ZVRhcmdldCA9PT0gXCJkYlwiKSB7XG4gICAgICAvLyBnZW5lcmF0ZUJhdGNo6rCAIOydtOuvuCBEQuyXkCDsoIDsnqXtlojsnLzrr4DroZwg67OE64+EIOyggOyepeydtCDrtojtlYTsmpTtlanri4jri6QuXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIkZpeHR1cmUgRELsl5Ag7KCA7J6l65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgfSBlbHNlIGlmIChzYXZlVGFyZ2V0LnN0YXJ0c1dpdGgoXCJmaWxlXCIpKSB7XG4gICAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIik7XG4gICAgICBjb25zdCBwYXRoID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpO1xuXG4gICAgICBjb25zdCBmaXh0dXJlc0RpciA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInRlc3RcIiwgXCJmaXh0dXJlc1wiKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaXh0dXJlc0Rpcik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoZml4dHVyZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGVudGl0eU5hbWUgb2YgZW50aXR5TmFtZXMpIHtcbiAgICAgICAgY29uc3QgZW50aXR5UmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKChyKSA9PiByLmVudGl0eUlkID09PSBlbnRpdHlOYW1lKTtcblxuICAgICAgICBpZiAoZW50aXR5UmVzdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmaWxlbmFtZTogc3RyaW5nO1xuICAgICAgICBpZiAoc2F2ZVRhcmdldCA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcbiAgICAgICAgICBmaWxlbmFtZSA9IGAke2VudGl0eS50YWJsZX0uanNvbmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmlsZW5hbWUgPSBzYXZlVGFyZ2V0LnJlcGxhY2UoXCJmaWxlOlwiLCBcIlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gcGF0aC5qb2luKGZpeHR1cmVzRGlyLCBmaWxlbmFtZSk7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgICAgICBmaWxlcGF0aCxcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGVudGl0eVJlc3VsdHMubWFwKChyKSA9PiByLmRhdGEpLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIDIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKchSAke2ZpbGVwYXRofSDsoIDsnqUg7JmE66OMYCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBcIkZpeHR1cmUg7IOd7ISxIOykkSDsmKTrpZjqsIAg67Cc7IOd7ZaI7Iq164uI64ukLlxcblwiICtcbiAgICAgICAgICBcIuybkOyduDogRW50aXR5IOygleydmOuCmCBEQiDsl7DqsrDsnYQg7ZmV7J247ZW07KO87IS47JqULlxcblwiICtcbiAgICAgICAgICBcIuyekOyEuO2VnCDrgrTsmqk6XCIsXG4gICAgICApLFxuICAgICAgZXJyb3IsXG4gICAgKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIGZpeHR1cmUgZmV0Y2gg66qF66C57Ja0IC0g7Iuk7KCcIOyatOyYgSBEQuyXkOyEnCDrjbDsnbTthLDrpbwg6rCA7KC47JmAIGZpeHR1cmXroZwg7KCA7J6l7ZWp64uI64ukLlxuICog6rSA6rOE65CcIOuNsOydtO2EsOuPhCDtlajqu5gg6rCA7KC47Jik66+A66GcIO2YhOyLpOyggeyduCDthYzsiqTtirgg642w7J207YSw66W8IO2ZleuztO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4dHVyZUZldGNoQ29tbWFuZChvcHRpb25zOiBGaXh0dXJlQ29tbWFuZE9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIUVudGl0eU1hbmFnZXIuaXNBdXRvbG9hZGVkKSB7XG4gICAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgfVxuXG4gICAgbGV0IGVudGl0eU5hbWVzOiBzdHJpbmdbXTtcblxuICAgIGlmIChvcHRpb25zLmFsbCkge1xuICAgICAgZW50aXR5TmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgaWYgKG9wdGlvbnMuZXhjbHVkZSkge1xuICAgICAgICBjb25zdCBleGNsdWRlTGlzdCA9IG9wdGlvbnMuZXhjbHVkZS5zcGxpdChcIixcIikubWFwKChzOiBzdHJpbmcpID0+IHMudHJpbSgpKTtcbiAgICAgICAgZW50aXR5TmFtZXMgPSBlbnRpdHlOYW1lcy5maWx0ZXIoKG5hbWUpID0+ICFleGNsdWRlTGlzdC5pbmNsdWRlcyhuYW1lKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmluY2x1ZGUpIHtcbiAgICAgIGVudGl0eU5hbWVzID0gb3B0aW9ucy5pbmNsdWRlLnNwbGl0KFwiLFwiKS5tYXAoKHM6IHN0cmluZykgPT4gcy50cmltKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJtdWx0aXNlbGVjdFwiLFxuICAgICAgICBuYW1lOiBcImVudGl0aWVzXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiSW1wb3J07ZWgIEVudGl0eeulvCDshKDtg53tlZjshLjsmpQ6XCIsXG4gICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCkubWFwKChpZCkgPT4gKHsgdGl0bGU6IGlkLCB2YWx1ZTogaWQgfSkpLFxuICAgICAgICBtaW46IDEsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuZW50aXRpZXMgfHwgcmVzdWx0LmVudGl0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCLst6jshozrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlbnRpdHlOYW1lcyA9IHJlc3VsdC5lbnRpdGllcztcbiAgICB9XG5cbiAgICBjb25zdCBzdHJhdGVneTogRGF0YUV4cGxvcmVyU3RyYXRlZ3kgPSBvcHRpb25zLnN0cmF0ZWd5ID8/IFwicmVjZW50XCI7XG4gICAgY29uc3QgbGltaXQgPSBvcHRpb25zLmxpbWl0ID8gTnVtYmVyLnBhcnNlSW50KG9wdGlvbnMubGltaXQsIDEwKSA6IDEwO1xuXG4gICAgLy8gZml4dHVyZSBmZXRjaDogcHJvZHVjdGlvbiDrjbDsnbTthLDrpbwgZml4dHVyZSBEQuuhnCBpbXBvcnTtlanri4jri6RcbiAgICBjb25zdCBzb3VyY2VEYiA9IERCLmdldERCKFwiclwiKTsgLy8gcHJvZHVjdGlvbl9tYXN0ZXIgKOuYkOuKlCBkZXZlbG9wbWVudF9tYXN0ZXIpXG4gICAgY29uc3QgZml4dHVyZURiID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlKTtcbiAgICBjb25zdCBnZW5lcmF0b3IgPSBuZXcgRml4dHVyZUdlbmVyYXRvcihzb3VyY2VEYiwgZml4dHVyZURiLCBcImZpeHR1cmVcIiwgRW50aXR5TWFuYWdlcik7XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG4ke2VudGl0eU5hbWVzLmpvaW4oXCIsIFwiKX0gaW1wb3J0IOykkS4uLmApKTtcblxuICAgIGZvciAoY29uc3QgZW50aXR5TmFtZSBvZiBlbnRpdHlOYW1lcykge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGdlbmVyYXRvci5pbXBvcnRGcm9tU291cmNlKGVudGl0eU5hbWUsIHtcbiAgICAgICAgc3RyYXRlZ3ksXG4gICAgICAgIGxpbWl0LFxuICAgICAgICBpbmNsdWRlUmVsYXRpb25zOiB0cnVlLFxuICAgICAgICBtYXhEZXB0aDogMixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyFICR7ZW50aXR5TmFtZX06ICR7cmVzdWx0cy5sZW5ndGh96rCcIGltcG9ydCDsmYTro4xgKSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwi7Iuk7KCcIERC7JeQ7IScIOuNsOydtO2EsOulvCDqsIDsoLjsmKTripQg7KSRIOyYpOulmOqwgCDrsJzsg53tlojsirXri4jri6QuXFxuXCIgK1xuICAgICAgICAgIFwi7JuQ7J24OiDshozsiqQgREIg7Jew6rKwIOyEpOyglShzb25hbXUuY29uZmlnLnRzKeydtOuCmCBFbnRpdHkg6rSA6rOEIOygleydmOulvCDtmZXsnbjtlbTso7zshLjsmpQuXFxuXCIgK1xuICAgICAgICAgIFwi7J6Q7IS47ZWcIOuCtOyaqTpcIixcbiAgICAgICksXG4gICAgICBlcnJvcixcbiAgICApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogZml4dHVyZSBleHBsb3JlIOuqheugueyWtCAtIERC7J2YIOyLpOygnCDrjbDsnbTthLDrpbwg7KGw7ZqM7ZWY7JesIO2ZleyduO2VqeuLiOuLpC5cbiAqIOyggOyepe2VmOyngCDslYrqs6Ag7KGw7ZqM66eMIO2VmOuvgOuhnCDrjbDsnbTthLDrpbwg67mg66W06rKMIO2ZleyduO2VoCDrlYwg7Jyg7Jqp7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4dHVyZUV4cGxvcmVDb21tYW5kKG9wdGlvbnM6IEZpeHR1cmVDb21tYW5kT3B0aW9ucykge1xuICB0cnkge1xuICAgIGlmICghRW50aXR5TWFuYWdlci5pc0F1dG9sb2FkZWQpIHtcbiAgICAgIGF3YWl0IEVudGl0eU1hbmFnZXIuYXV0b2xvYWQoKTtcbiAgICB9XG5cbiAgICBsZXQgZW50aXR5TmFtZSA9IG9wdGlvbnMuaW5jbHVkZTtcblxuICAgIGlmICghZW50aXR5TmFtZSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwic2VsZWN0XCIsXG4gICAgICAgIG5hbWU6IFwiZW50aXR5XCIsXG4gICAgICAgIG1lc3NhZ2U6IFwi7YOQ7IOJ7ZWgIEVudGl0eTpcIixcbiAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKS5tYXAoKGlkKSA9PiAoeyB0aXRsZTogaWQsIHZhbHVlOiBpZCB9KSksXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuZW50aXR5KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGVudGl0eU5hbWUgPSByZXN1bHQuZW50aXR5O1xuICAgIH1cblxuICAgIGlmICghZW50aXR5TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW50aXR5IG5hbWUgaXMgcmVxdWlyZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RyYXRlZ3k6IERhdGFFeHBsb3JlclN0cmF0ZWd5ID0gb3B0aW9ucy5zdHJhdGVneSA/PyBcInNhbXBsZVwiO1xuICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucy5saW1pdCA/IE51bWJlci5wYXJzZUludChvcHRpb25zLmxpbWl0LCAxMCkgOiAxMDtcblxuICAgIGNvbnN0IGRiID0gREIuZ2V0REIoXCJyXCIpO1xuICAgIGNvbnN0IGV4cGxvcmVyID0gbmV3IERhdGFFeHBsb3JlcihkYiwgRW50aXR5TWFuYWdlcik7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGV4cGxvcmVyLmV4cGxvcmUoZW50aXR5TmFtZSwgeyBzdHJhdGVneSwgbGltaXQgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG4ke2VudGl0eU5hbWV9ICR7ZGF0YS5sZW5ndGh96rCcIOyhsO2ajCDsmYTro4w6YCkpO1xuICAgIGNvbnNvbGUudGFibGUoZGF0YSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgXCLrjbDsnbTthLAg7KGw7ZqMIOykkSDsmKTrpZjqsIAg67Cc7IOd7ZaI7Iq164uI64ukLlxcblwiICtcbiAgICAgICAgICBcIuybkOyduDogREIg7Jew6rKw7J2064KYIEVudGl0eSDsoJXsnZjrpbwg7ZmV7J247ZW07KO87IS47JqULlxcblwiICtcbiAgICAgICAgICBcIuyekOyEuO2VnCDrgrTsmqk6XCIsXG4gICAgICApLFxuICAgICAgZXJyb3IsXG4gICAgKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O2FBR3VDO1NBQ0g7V0FDa0I7cUJBQ0c7b0JBQ0Q7d0JBRVE7Ozs7QUFrQmhFLGVBQXNCLGtCQUFrQixTQUFnQztBQUN0RSxLQUFJO0FBQ0YsTUFBSSxDQUFDLGNBQWMsY0FBYztBQUMvQixTQUFNLGNBQWMsVUFBVTs7RUFHaEMsSUFBSUE7QUFFSixNQUFJLFFBQVEsS0FBSztBQUNmLGlCQUFjLGNBQWMsV0FBVztBQUN2QyxPQUFJLFFBQVEsU0FBUztJQUNuQixNQUFNLGNBQWMsUUFBUSxRQUFRLE1BQU0sSUFBSSxDQUFDLEtBQUssTUFBYyxFQUFFLE1BQU0sQ0FBQztBQUMzRSxrQkFBYyxZQUFZLFFBQVEsU0FBUyxDQUFDLFlBQVksU0FBUyxLQUFLLENBQUM7O2FBRWhFLFFBQVEsU0FBUztBQUMxQixpQkFBYyxRQUFRLFFBQVEsTUFBTSxJQUFJLENBQUMsS0FBSyxNQUFjLEVBQUUsTUFBTSxDQUFDO1NBQ2hFO0dBQ0wsTUFBTSxTQUFTLE1BQU0sUUFBUTtJQUMzQixNQUFNO0lBQ04sTUFBTTtJQUNOLFNBQVM7SUFDVCxTQUFTLGNBQWMsV0FBVyxDQUFDLEtBQUssUUFBUTtLQUFFLE9BQU87S0FB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
|