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
|
@@ -1,263 +1,240 @@
|
|
|
1
|
+
import { __esmMin } from "../_virtual/rolldown_runtime.js";
|
|
2
|
+
import { ApiParamType, init_types } from "../types/types.js";
|
|
3
|
+
import { z as z$1 } from "zod";
|
|
4
|
+
|
|
5
|
+
//#region src/api/code-converters.ts
|
|
1
6
|
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
import { ApiParamType } from "../types/types.js";
|
|
7
|
+
* code-converters는 API 타입 정의들을 Zod 객체나 TypeScript 코드로 변환하는 함수들을 제공합니다.
|
|
8
|
+
*
|
|
9
|
+
* 1. API 시리즈들:
|
|
10
|
+
* - ExtendedApi, ApiParam, ApiParamType
|
|
11
|
+
* - API 메타데이터를 표현하는 타입 정의들
|
|
12
|
+
*
|
|
13
|
+
* 2. ZodObject 변환
|
|
14
|
+
* - API 타입 정의 → Zod 타입 인스턴스 (런타임 밸리데이션용)
|
|
15
|
+
* - getZodTypeFromApiParamType → getZodObjectFromApiParams → getZodObjectFromApi
|
|
16
|
+
*
|
|
17
|
+
* 3. TsTypeDef 변환
|
|
18
|
+
* - API 타입 정의 → TypeScript 타입 코드 문자열 (코드 생성용)
|
|
19
|
+
* - apiParamTypeToTsType → apiParamToTsCode, apiParamToTsCodeAsObject
|
|
20
|
+
*
|
|
21
|
+
* 참고:
|
|
22
|
+
* - ZodTypeDef 생성 (Zod 코드 문자열): zod-converter.ts의 zodTypeToZodCode 사용
|
|
23
|
+
* - EntityProp 변환: zod-converter.ts 참조
|
|
24
|
+
*/
|
|
21
25
|
/**
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
* Promise 타입을 한 번 언래핑하여 내부 타입을 반환합니다.
|
|
27
|
+
* Promise가 아닌 경우 원본 타입을 그대로 반환합니다.
|
|
28
|
+
*/
|
|
29
|
+
function unwrapPromiseOnce(paramType) {
|
|
30
|
+
if (ApiParamType.isPromise(paramType)) {
|
|
31
|
+
return paramType.args?.[0];
|
|
32
|
+
} else {
|
|
33
|
+
return paramType;
|
|
34
|
+
}
|
|
30
35
|
}
|
|
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
|
-
} else {
|
|
125
|
-
return getZodTypeFromApiParamType(unionType.types[0], references).nullable();
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
// 일반 유니온
|
|
129
|
-
return z.union(unionType.types.map((type)=>getZodTypeFromApiParamType(type, references)));
|
|
130
|
-
}
|
|
131
|
-
case "intersection":
|
|
132
|
-
{
|
|
133
|
-
const intersectionType = paramType;
|
|
134
|
-
return intersectionType.types.reduce((result, type, index)=>{
|
|
135
|
-
const resolvedType = getZodTypeFromApiParamType(type, references);
|
|
136
|
-
if (index === 0) {
|
|
137
|
-
return resolvedType;
|
|
138
|
-
} else {
|
|
139
|
-
return z.intersection(result, resolvedType);
|
|
140
|
-
}
|
|
141
|
-
}, z.unknown());
|
|
142
|
-
}
|
|
143
|
-
case "tuple-type":
|
|
144
|
-
{
|
|
145
|
-
const tupleType = paramType;
|
|
146
|
-
return z.tuple(// biome-ignore lint/suspicious/noExplicitAny: 생성되는 ZodTuple의 타입을 추적하기 어려움
|
|
147
|
-
tupleType.elements.map((elem)=>getZodTypeFromApiParamType(elem, references)));
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
return z.unknown();
|
|
151
|
-
}
|
|
152
|
-
}
|
|
36
|
+
/**
|
|
37
|
+
* ApiParamType을 Zod 타입 인스턴스로 변환합니다.
|
|
38
|
+
* string, number, array, union 등 모든 ApiParamType을 처리하며,
|
|
39
|
+
* 순환참조가 발생하는 경우 z.unknown()으로 fallback합니다.
|
|
40
|
+
*/
|
|
41
|
+
function getZodTypeFromApiParamType(paramType, references) {
|
|
42
|
+
switch (paramType) {
|
|
43
|
+
case "string": return z$1.string();
|
|
44
|
+
case "number": return z$1.number();
|
|
45
|
+
case "boolean": return z$1.boolean();
|
|
46
|
+
default: {
|
|
47
|
+
const advType = paramType;
|
|
48
|
+
switch (advType.t) {
|
|
49
|
+
case "string-literal":
|
|
50
|
+
case "numeric-literal": return z$1.literal(advType.value);
|
|
51
|
+
case "object": {
|
|
52
|
+
const objType = paramType;
|
|
53
|
+
return getZodObjectFromApiParams(objType.props);
|
|
54
|
+
}
|
|
55
|
+
case "array": {
|
|
56
|
+
const arrType = paramType;
|
|
57
|
+
return z$1.array(getZodTypeFromApiParamType(arrType.elementsType, references));
|
|
58
|
+
}
|
|
59
|
+
case "ref": {
|
|
60
|
+
const refType = paramType;
|
|
61
|
+
if (refType.id === "Date") {
|
|
62
|
+
return z$1.date();
|
|
63
|
+
}
|
|
64
|
+
if (["Pick", "Omit"].includes(refType.id)) {
|
|
65
|
+
if (refType.args?.length !== 2) {
|
|
66
|
+
throw new Error(`잘못된 ${refType.id}`);
|
|
67
|
+
}
|
|
68
|
+
const [obj, literalOrUnion] = refType.args.map((arg) => getZodTypeFromApiParamType(arg, references));
|
|
69
|
+
let keys = [];
|
|
70
|
+
if (literalOrUnion instanceof z$1.ZodUnion) {
|
|
71
|
+
keys = literalOrUnion.def.options.map((option) => option.def.values[0]);
|
|
72
|
+
} else {
|
|
73
|
+
keys = literalOrUnion.def.values;
|
|
74
|
+
}
|
|
75
|
+
const keyRecord = Object.fromEntries(keys.map((key) => [key, true]));
|
|
76
|
+
if (refType.id === "Pick") {
|
|
77
|
+
if (obj.pick) {
|
|
78
|
+
return obj.pick(keyRecord);
|
|
79
|
+
}
|
|
80
|
+
} else {
|
|
81
|
+
if (obj.omit) {
|
|
82
|
+
return obj.omit(keyRecord);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (["Partial"].includes(refType.id)) {
|
|
87
|
+
if (refType.args?.length !== 1) {
|
|
88
|
+
throw new Error(`잘못된 ${refType.id}`);
|
|
89
|
+
}
|
|
90
|
+
const obj = getZodTypeFromApiParamType(refType.args[0], references);
|
|
91
|
+
return obj.partial();
|
|
92
|
+
}
|
|
93
|
+
const reference = references[refType.id];
|
|
94
|
+
if (reference === undefined) {
|
|
95
|
+
return z$1.unknown();
|
|
96
|
+
}
|
|
97
|
+
return reference;
|
|
98
|
+
}
|
|
99
|
+
case "union": {
|
|
100
|
+
const unionType = paramType;
|
|
101
|
+
if (unionType.types.length === 2 && unionType.types.some((type) => type === "null")) {
|
|
102
|
+
if (unionType.types[0] === "null") {
|
|
103
|
+
return getZodTypeFromApiParamType(unionType.types[1], references).nullable();
|
|
104
|
+
} else {
|
|
105
|
+
return getZodTypeFromApiParamType(unionType.types[0], references).nullable();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return z$1.union(unionType.types.map((type) => getZodTypeFromApiParamType(type, references)));
|
|
109
|
+
}
|
|
110
|
+
case "intersection": {
|
|
111
|
+
const intersectionType = paramType;
|
|
112
|
+
return intersectionType.types.reduce((result, type, index) => {
|
|
113
|
+
const resolvedType = getZodTypeFromApiParamType(type, references);
|
|
114
|
+
if (index === 0) {
|
|
115
|
+
return resolvedType;
|
|
116
|
+
} else {
|
|
117
|
+
return z$1.intersection(result, resolvedType);
|
|
118
|
+
}
|
|
119
|
+
}, z$1.unknown());
|
|
120
|
+
}
|
|
121
|
+
case "tuple-type": {
|
|
122
|
+
const tupleType = paramType;
|
|
123
|
+
return z$1.tuple(tupleType.elements.map((elem) => getZodTypeFromApiParamType(elem, references)));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return z$1.unknown();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
153
129
|
}
|
|
154
130
|
/**
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
];
|
|
167
|
-
})));
|
|
131
|
+
* ApiParam 배열을 ZodObject로 변환합니다.
|
|
132
|
+
* 각 파라미터의 optional 여부를 반영하여 Zod 스키마를 생성합니다.
|
|
133
|
+
*/
|
|
134
|
+
function getZodObjectFromApiParams(apiParams, references = {}) {
|
|
135
|
+
return z$1.object(Object.fromEntries(apiParams.map((param) => {
|
|
136
|
+
let zodType = getZodTypeFromApiParamType(param.type, references);
|
|
137
|
+
if (param.optional) {
|
|
138
|
+
zodType = zodType.optional();
|
|
139
|
+
}
|
|
140
|
+
return [param.name, zodType];
|
|
141
|
+
})));
|
|
168
142
|
}
|
|
169
143
|
/**
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
api.parameters.filter((param)=>!ApiParamType.isContext(param.type) && !ApiParamType.isRefKnex(param.type) && !(param.optional === true && param.name.startsWith("_"))), references);
|
|
186
|
-
return ReqType;
|
|
144
|
+
* ExtendedApi를 ZodObject로 변환합니다.
|
|
145
|
+
* TypeParameter와 일반 파라미터를 처리하며,
|
|
146
|
+
* Context, RefKnex, _로 시작하는 optional 파라미터는 제외합니다.
|
|
147
|
+
*/
|
|
148
|
+
function getZodObjectFromApi(api, references = {}) {
|
|
149
|
+
if (api.typeParameters?.length > 0) {
|
|
150
|
+
for (const typeParam of api.typeParameters) {
|
|
151
|
+
if (typeParam.constraint) {
|
|
152
|
+
const zodType = getZodTypeFromApiParamType(typeParam.constraint, references);
|
|
153
|
+
references[typeParam.id] = zodType;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const ReqType = getZodObjectFromApiParams(api.parameters.filter((param) => !ApiParamType.isContext(param.type) && !ApiParamType.isRefKnex(param.type) && !(param.optional && param.name.startsWith("_"))), references);
|
|
158
|
+
return ReqType;
|
|
187
159
|
}
|
|
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
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
} else {
|
|
245
|
-
throw new Error(`resolve 불가 ApiParamType ${paramType}`);
|
|
246
|
-
}
|
|
160
|
+
/**
|
|
161
|
+
* ApiParamType을 TypeScript 타입 문자열로 변환합니다.
|
|
162
|
+
* union, intersection, array, ref 등 모든 타입을 TS 문법으로 표현하며,
|
|
163
|
+
* import가 필요한 타입 ID는 injectImportKeys에 수집합니다.
|
|
164
|
+
*/
|
|
165
|
+
function apiParamTypeToTsType(paramType, injectImportKeys) {
|
|
166
|
+
if ([
|
|
167
|
+
"string",
|
|
168
|
+
"number",
|
|
169
|
+
"boolean",
|
|
170
|
+
"true",
|
|
171
|
+
"false",
|
|
172
|
+
"null",
|
|
173
|
+
"undefined",
|
|
174
|
+
"void",
|
|
175
|
+
"any",
|
|
176
|
+
"unknown"
|
|
177
|
+
].includes(paramType)) {
|
|
178
|
+
return paramType;
|
|
179
|
+
} else if (ApiParamType.isObject(paramType)) {
|
|
180
|
+
return `{ ${apiParamToTsCode(paramType.props, injectImportKeys)} }`;
|
|
181
|
+
} else if (ApiParamType.isStringLiteral(paramType)) {
|
|
182
|
+
return `"${paramType.value}"`;
|
|
183
|
+
} else if (ApiParamType.isNumericLiteral(paramType)) {
|
|
184
|
+
return String(paramType.value);
|
|
185
|
+
} else if (ApiParamType.isUnion(paramType)) {
|
|
186
|
+
return paramType.types.map((type) => apiParamTypeToTsType(type, injectImportKeys)).join(" | ");
|
|
187
|
+
} else if (ApiParamType.isIntersection(paramType)) {
|
|
188
|
+
return paramType.types.map((type) => apiParamTypeToTsType(type, injectImportKeys)).join(" & ");
|
|
189
|
+
} else if (ApiParamType.isArray(paramType)) {
|
|
190
|
+
const elementsType = apiParamTypeToTsType(paramType.elementsType, injectImportKeys);
|
|
191
|
+
return ApiParamType.isIntersection(paramType.elementsType) || ApiParamType.isUnion(paramType.elementsType) ? `(${elementsType})[]` : `${elementsType}[]`;
|
|
192
|
+
} else if (ApiParamType.isRef(paramType)) {
|
|
193
|
+
if (![
|
|
194
|
+
"Pick",
|
|
195
|
+
"Omit",
|
|
196
|
+
"Promise",
|
|
197
|
+
"Partial",
|
|
198
|
+
"Date"
|
|
199
|
+
].includes(paramType.id)) {
|
|
200
|
+
injectImportKeys.push(paramType.id);
|
|
201
|
+
}
|
|
202
|
+
if (paramType.args === undefined || paramType.args.length === 0) {
|
|
203
|
+
return paramType.id;
|
|
204
|
+
} else {
|
|
205
|
+
return `${paramType.id}<${paramType.args.map((arg) => apiParamTypeToTsType(arg, injectImportKeys)).join(",")}>`;
|
|
206
|
+
}
|
|
207
|
+
} else if (ApiParamType.isIndexedAccess(paramType)) {
|
|
208
|
+
return `${apiParamTypeToTsType(paramType.object, injectImportKeys)}[${apiParamTypeToTsType(paramType.index, injectImportKeys)}]`;
|
|
209
|
+
} else if (ApiParamType.isTupleType(paramType)) {
|
|
210
|
+
return `[ ${paramType.elements.map((elem) => apiParamTypeToTsType(elem, injectImportKeys))} ]`;
|
|
211
|
+
} else if (ApiParamType.isTypeParam(paramType)) {
|
|
212
|
+
return `${paramType.id}${paramType.constraint ? ` extends ${apiParamTypeToTsType(paramType.constraint, injectImportKeys)}` : ""}`;
|
|
213
|
+
} else {
|
|
214
|
+
throw new Error(`resolve 불가 ApiParamType ${paramType}`);
|
|
215
|
+
}
|
|
247
216
|
}
|
|
248
217
|
/**
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
218
|
+
* ApiParam 배열을 TypeScript 함수 파라미터 코드로 변환합니다.
|
|
219
|
+
* 예: "name: string, age?: number, active: boolean = true"
|
|
220
|
+
*/
|
|
221
|
+
function apiParamToTsCode(params, injectImportKeys) {
|
|
222
|
+
return params.map((param) => {
|
|
223
|
+
return `${param.name}${param.optional && !param.defaultDef ? "?" : ""}: ${apiParamTypeToTsType(param.type, injectImportKeys)}${param.defaultDef ? `= ${param.defaultDef}` : ""}`;
|
|
224
|
+
}).join(", ");
|
|
255
225
|
}
|
|
256
226
|
/**
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
227
|
+
* ApiParam 배열을 TypeScript 객체 타입 코드로 변환합니다.
|
|
228
|
+
* 예: "{ name: string, age?: number, active: boolean = true }"
|
|
229
|
+
*/
|
|
230
|
+
function apiParamToTsCodeAsObject(params, injectImportKeys) {
|
|
231
|
+
return `{ ${params.map((param) => `${param.name}${param.optional ? "?" : ""}: ${apiParamTypeToTsType(param.type, injectImportKeys)}${param.defaultDef ? `= ${param.defaultDef}` : ""}`).join(", ")} }`;
|
|
261
232
|
}
|
|
233
|
+
var init_code_converters = __esmMin((() => {
|
|
234
|
+
init_types();
|
|
235
|
+
}));
|
|
262
236
|
|
|
263
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvY29kZS1jb252ZXJ0ZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogY29kZS1jb252ZXJ0ZXJz64qUIEFQSSDtg4DsnoUg7KCV7J2Y65Ok7J2EIFpvZCDqsJ3ssrTrgpggVHlwZVNjcmlwdCDsvZTrk5zroZwg67OA7ZmY7ZWY64qUIO2VqOyImOuTpOydhCDsoJzqs7Xtlanri4jri6QuXG4gKlxuICogMS4gQVBJIOyLnOumrOymiOuTpDpcbiAqIC0gRXh0ZW5kZWRBcGksIEFwaVBhcmFtLCBBcGlQYXJhbVR5cGVcbiAqIC0gQVBJIOuplO2DgOuNsOydtO2EsOulvCDtkZztmITtlZjripQg7YOA7J6FIOygleydmOuTpFxuICpcbiAqIDIuIFpvZE9iamVjdCDrs4DtmZhcbiAqIC0gQVBJIO2DgOyehSDsoJXsnZgg4oaSIFpvZCDtg4DsnoUg7J247Iqk7YS07IqkICjrn7Dtg4DsnoQg67C466as642w7J207IWY7JqpKVxuICogLSBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZSDihpIgZ2V0Wm9kT2JqZWN0RnJvbUFwaVBhcmFtcyDihpIgZ2V0Wm9kT2JqZWN0RnJvbUFwaVxuICpcbiAqIDMuIFRzVHlwZURlZiDrs4DtmZhcbiAqIC0gQVBJIO2DgOyehSDsoJXsnZgg4oaSIFR5cGVTY3JpcHQg7YOA7J6FIOy9lOuTnCDrrLjsnpDsl7QgKOy9lOuTnCDsg53shLHsmqkpXG4gKiAtIGFwaVBhcmFtVHlwZVRvVHNUeXBlIOKGkiBhcGlQYXJhbVRvVHNDb2RlLCBhcGlQYXJhbVRvVHNDb2RlQXNPYmplY3RcbiAqXG4gKiDssLjqs6A6XG4gKiAtIFpvZFR5cGVEZWYg7IOd7ISxIChab2Qg7L2U65OcIOusuOyekOyXtCk6IHpvZC1jb252ZXJ0ZXIudHPsnZggem9kVHlwZVRvWm9kQ29kZSDsgqzsmqlcbiAqIC0gRW50aXR5UHJvcCDrs4DtmZg6IHpvZC1jb252ZXJ0ZXIudHMg7LC47KGwXG4gKi9cblxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgY29yZSB9IGZyb20gXCJ6b2QvdjRcIjtcbmltcG9ydCB0eXBlIHsgJFpvZExvb3NlU2hhcGUgfSBmcm9tIFwiem9kL3Y0L2NvcmVcIjtcbmltcG9ydCB7IHR5cGUgQXBpUGFyYW0sIEFwaVBhcmFtVHlwZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBFeHRlbmRlZEFwaSB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcblxuLy8gPGFueT7rpbwg7J6Q7KCc7ZWY6rOgLCBab2Tsl5DshJwg7KCc7JW97ZWY64qUIOq4sOuzuOyggeyduCBHZW5lcmljIFR5cGUgUGFyYW1ldGVy66W8IOyCrOyaqe2VqC5cbnR5cGUgQW55Wm9kT2JqZWN0ID0gei5ab2RPYmplY3Q8JFpvZExvb3NlU2hhcGU+O1xudHlwZSBBbnlab2RMaXRlcmFsID0gei5ab2RMaXRlcmFsPGNvcmUudXRpbC5MaXRlcmFsPjtcblxuLyoqXG4gKiBQcm9taXNlIO2DgOyeheydhCDtlZwg67KIIOyWuOuemO2Vke2VmOyXrCDrgrTrtoAg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAqIFByb21pc2XqsIAg7JWE64uMIOqyveyasCDsm5Drs7gg7YOA7J6F7J2EIOq3uOuMgOuhnCDrsJjtmZjtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXBQcm9taXNlT25jZShwYXJhbVR5cGU6IEFwaVBhcmFtVHlwZSkge1xuICBpZiAoQXBpUGFyYW1UeXBlLmlzUHJvbWlzZShwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIHBhcmFtVHlwZS5hcmdzPy5bMF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHBhcmFtVHlwZTtcbiAgfVxufVxuXG4vKlxuICogQVBJ66W8IOq1rOyEse2VmOuKlCDsmpTshozrk6TsnYQgWm9kT2JqZWN066GcIOuzgO2ZmO2VmOq4sCDsnITtlZwg7ZWo7IiY65Ok7J6F64uI64ukLlxuICovXG5cbi8qKlxuICogQXBpUGFyYW1UeXBl7J2EIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIHN0cmluZywgbnVtYmVyLCBhcnJheSwgdW5pb24g65OxIOuqqOuToCBBcGlQYXJhbVR5cGXsnYQg7LKY66as7ZWY66mwLFxuICog7Iic7ZmY7LC47KGw6rCAIOuwnOyDne2VmOuKlCDqsr3smrAgei51bmtub3duKCnsnLzroZwgZmFsbGJhY2vtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZShcbiAgcGFyYW1UeXBlOiBBcGlQYXJhbVR5cGUsXG4gIHJlZmVyZW5jZXM6IHtcbiAgICBbaWQ6IHN0cmluZ106IHouWm9kVHlwZTtcbiAgfSxcbik6IHouWm9kVHlwZTx1bmtub3duPiB7XG4gIHN3aXRjaCAocGFyYW1UeXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIHouc3RyaW5nKCk7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIHoubnVtYmVyKCk7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiB6LmJvb2xlYW4oKTtcbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zdCBhZHZUeXBlID0gcGFyYW1UeXBlIGFzIHsgdDogc3RyaW5nOyB2YWx1ZT86IHN0cmluZyB8IG51bWJlciB9O1xuICAgICAgc3dpdGNoIChhZHZUeXBlLnQpIHtcbiAgICAgICAgY2FzZSBcInN0cmluZy1saXRlcmFsXCI6XG4gICAgICAgIGNhc2UgXCJudW1lcmljLWxpdGVyYWxcIjpcbiAgICAgICAgICByZXR1cm4gei5saXRlcmFsKGFkdlR5cGUudmFsdWUpO1xuICAgICAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgICAgICBjb25zdCBvYmpUeXBlID0gcGFyYW1UeXBlIGFzIHsgdDogc3RyaW5nOyBwcm9wczogQXBpUGFyYW1bXSB9O1xuICAgICAgICAgIHJldHVybiBnZXRab2RPYmplY3RGcm9tQXBpUGFyYW1zKG9ialR5cGUucHJvcHMpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJhcnJheVwiOiB7XG4gICAgICAgICAgY29uc3QgYXJyVHlwZSA9IHBhcmFtVHlwZSBhcyB7XG4gICAgICAgICAgICB0OiBzdHJpbmc7XG4gICAgICAgICAgICBlbGVtZW50c1R5cGU6IEFwaVBhcmFtVHlwZTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiB6LmFycmF5KGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKGFyclR5cGUuZWxlbWVudHNUeXBlLCByZWZlcmVuY2VzKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJlZlwiOiB7XG4gICAgICAgICAgY29uc3QgcmVmVHlwZSA9IHBhcmFtVHlwZSBhcyB7XG4gICAgICAgICAgICB0OiBzdHJpbmc7XG4gICAgICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICAgICAgYXJncz86IEFwaVBhcmFtVHlwZVtdO1xuICAgICAgICAgIH07XG4gICAgICAgICAgLy8gRGF0ZSDtg4DsnoUg7LKY66asXG4gICAgICAgICAgaWYgKHJlZlR5cGUuaWQgPT09IFwiRGF0ZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gei5kYXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIOqwneyytCDtgqQg6rSA66asIOycoO2LuOumrO2LsFxuICAgICAgICAgIGlmIChbXCJQaWNrXCIsIFwiT21pdFwiXS5pbmNsdWRlcyhyZWZUeXBlLmlkKSkge1xuICAgICAgICAgICAgaWYgKHJlZlR5cGUuYXJncz8ubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7J6Y66q765CcICR7cmVmVHlwZS5pZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IFtvYmosIGxpdGVyYWxPclVuaW9uXSA9IHJlZlR5cGUuYXJncy5tYXAoXG4gICAgICAgICAgICAgIChhcmcpID0+IGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKGFyZywgcmVmZXJlbmNlcyksXG4gICAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTog7IOd7ISx65CY64qUIFpvZFVuaW9u7J2YIO2DgOyeheydhCDstpTsoIHtlZjquLAg7Ja066Ck7JuAXG4gICAgICAgICAgICApIGFzIFtBbnlab2RPYmplY3QsIHouWm9kVW5pb248YW55PiB8IEFueVpvZExpdGVyYWxdO1xuXG4gICAgICAgICAgICBsZXQga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGlmIChsaXRlcmFsT3JVbmlvbiBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICAgICAgICAgICAga2V5cyA9IGxpdGVyYWxPclVuaW9uLmRlZi5vcHRpb25zLm1hcChcbiAgICAgICAgICAgICAgICAob3B0aW9uOiB7IGRlZjogeyB2YWx1ZXM6IHN0cmluZ1tdIH0gfSkgPT4gb3B0aW9uLmRlZi52YWx1ZXNbMF0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBrZXlzID0gKGxpdGVyYWxPclVuaW9uIGFzIHouWm9kTGl0ZXJhbDxzdHJpbmc+KS5kZWYudmFsdWVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qga2V5UmVjb3JkID0gT2JqZWN0LmZyb21FbnRyaWVzKGtleXMubWFwKChrZXkpID0+IFtrZXksIHRydWUgYXMgY29uc3RdKSk7XG4gICAgICAgICAgICBpZiAocmVmVHlwZS5pZCA9PT0gXCJQaWNrXCIpIHtcbiAgICAgICAgICAgICAgaWYgKG9iai5waWNrKSB7XG4gICAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBab2QgNC4zLjYgcGljayDtg4DsnoUg7Zi47ZmY7ISxXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iai5waWNrKGtleVJlY29yZCBhcyBhbnkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAob2JqLm9taXQpIHtcbiAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFpvZCA0LjMuNiBvbWl0IO2DgOyehSDtmLjtmZjshLFcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqLm9taXQoa2V5UmVjb3JkIGFzIGFueSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFtcIlBhcnRpYWxcIl0uaW5jbHVkZXMocmVmVHlwZS5pZCkpIHtcbiAgICAgICAgICAgIGlmIChyZWZUeXBlLmFyZ3M/Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOyemOuqu+uQnCAke3JlZlR5cGUuaWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvYmogPSBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZShyZWZUeXBlLmFyZ3NbMF0sIHJlZmVyZW5jZXMpO1xuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQYXJ0aWFsIOyduOyImCDtg4DsnoUg7LqQ7Iqk7YyFXG4gICAgICAgICAgICByZXR1cm4gKG9iaiBhcyB6LlpvZE9iamVjdDxhbnk+KS5wYXJ0aWFsKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZSA9IHJlZmVyZW5jZXNbcmVmVHlwZS5pZF07XG4gICAgICAgICAgaWYgKHJlZmVyZW5jZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gei51bmtub3duKCk7XG4gICAgICAgICAgICAvLyB0aHJvdyBuZXcgRXJyb3IoYHJlZiDssLjsobAg67aI6rCAICR7cmVmVHlwZS5pZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwidW5pb25cIjoge1xuICAgICAgICAgIGNvbnN0IHVuaW9uVHlwZSA9IHBhcmFtVHlwZSBhcyB7XG4gICAgICAgICAgICB0OiBzdHJpbmc7XG4gICAgICAgICAgICB0eXBlczogQXBpUGFyYW1UeXBlW107XG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBudWxsYWJsZSDsnKDri4jsmKhcbiAgICAgICAgICBpZiAodW5pb25UeXBlLnR5cGVzLmxlbmd0aCA9PT0gMiAmJiB1bmlvblR5cGUudHlwZXMuc29tZSgodHlwZSkgPT4gdHlwZSA9PT0gXCJudWxsXCIpKSB7XG4gICAgICAgICAgICBpZiAodW5pb25UeXBlLnR5cGVzWzBdID09PSBcIm51bGxcIikge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUodW5pb25UeXBlLnR5cGVzWzFdLCByZWZlcmVuY2VzKS5udWxsYWJsZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKHVuaW9uVHlwZS50eXBlc1swXSwgcmVmZXJlbmNlcykubnVsbGFibGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8g7J2867CYIOycoOuLiOyYqFxuICAgICAgICAgIHJldHVybiB6LnVuaW9uKFxuICAgICAgICAgICAgdW5pb25UeXBlLnR5cGVzLm1hcCgodHlwZSkgPT4gZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUodHlwZSwgcmVmZXJlbmNlcykpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImludGVyc2VjdGlvblwiOiB7XG4gICAgICAgICAgY29uc3QgaW50ZXJzZWN0aW9uVHlwZSA9IHBhcmFtVHlwZSBhcyB7XG4gICAgICAgICAgICB0OiBzdHJpbmc7XG4gICAgICAgICAgICB0eXBlczogQXBpUGFyYW1UeXBlW107XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gaW50ZXJzZWN0aW9uVHlwZS50eXBlcy5yZWR1Y2UoXG4gICAgICAgICAgICAocmVzdWx0LCB0eXBlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZFR5cGUgPSBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZSh0eXBlLCByZWZlcmVuY2VzKTtcbiAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkVHlwZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gei5pbnRlcnNlY3Rpb24ocmVzdWx0LCByZXNvbHZlZFR5cGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgei51bmtub3duKCkgYXMgei5ab2RUeXBlPHVua25vd24+LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInR1cGxlLXR5cGVcIjoge1xuICAgICAgICAgIGNvbnN0IHR1cGxlVHlwZSA9IHBhcmFtVHlwZSBhcyBBcGlQYXJhbVR5cGUuVHVwbGVUeXBlO1xuICAgICAgICAgIHJldHVybiB6LnR1cGxlKFxuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiDsg53shLHrkJjripQgWm9kVHVwbGXsnZgg7YOA7J6F7J2EIOy2lOygge2VmOq4sCDslrTroKTsm4BcbiAgICAgICAgICAgIHR1cGxlVHlwZS5lbGVtZW50cy5tYXAoKGVsZW0pID0+IGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKGVsZW0sIHJlZmVyZW5jZXMpKSBhcyBhbnksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHoudW5rbm93bigpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFwaVBhcmFtIOuwsOyXtOydhCBab2RPYmplY3TroZwg67OA7ZmY7ZWp64uI64ukLlxuICog6rCBIO2MjOudvOuvuO2EsOydmCBvcHRpb25hbCDsl6zrtoDrpbwg67CY7JiB7ZWY7JesIFpvZCDsiqTtgqTrp4jrpbwg7IOd7ISx7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Wm9kT2JqZWN0RnJvbUFwaVBhcmFtcyhcbiAgYXBpUGFyYW1zOiBBcGlQYXJhbVtdLFxuICByZWZlcmVuY2VzOiB7XG4gICAgW2lkOiBzdHJpbmddOiB6LlpvZFR5cGU7XG4gIH0gPSB7fSxcbik6IHouWm9kT2JqZWN0IHtcbiAgcmV0dXJuIHoub2JqZWN0KFxuICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIGFwaVBhcmFtcy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgIGxldCB6b2RUeXBlID0gZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUocGFyYW0udHlwZSwgcmVmZXJlbmNlcyk7XG4gICAgICAgIGlmIChwYXJhbS5vcHRpb25hbCkge1xuICAgICAgICAgIHpvZFR5cGUgPSB6b2RUeXBlLm9wdGlvbmFsKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtwYXJhbS5uYW1lLCB6b2RUeXBlXTtcbiAgICAgIH0pLFxuICAgICksXG4gICk7XG59XG5cbi8qKlxuICogRXh0ZW5kZWRBcGnrpbwgWm9kT2JqZWN066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIFR5cGVQYXJhbWV0ZXLsmYAg7J2867CYIO2MjOudvOuvuO2EsOulvCDsspjrpqztlZjrqbAsXG4gKiBDb250ZXh0LCBSZWZLbmV4LCBf66GcIOyLnOyeke2VmOuKlCBvcHRpb25hbCDtjIzrnbzrr7jthLDripQg7KCc7Jm47ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Wm9kT2JqZWN0RnJvbUFwaShcbiAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgcmVmZXJlbmNlczoge1xuICAgIFtpZDogc3RyaW5nXTogei5ab2RUeXBlO1xuICB9ID0ge30sXG4pIHtcbiAgaWYgKGFwaS50eXBlUGFyYW1ldGVycz8ubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgdHlwZVBhcmFtIG9mIGFwaS50eXBlUGFyYW1ldGVycykge1xuICAgICAgaWYgKHR5cGVQYXJhbS5jb25zdHJhaW50KSB7XG4gICAgICAgIGNvbnN0IHpvZFR5cGUgPSBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZSh0eXBlUGFyYW0uY29uc3RyYWludCwgcmVmZXJlbmNlcyk7XG5cbiAgICAgICAgLy8gRklYTUU6IHJlZmVyZW5jZXPripQg6riA66Gc67KMIOyYpOu4jOygne2KuOuhnCwgdHlwZVBhcmFtLmlkKFwiVFwiIOuTsSnrpbwga2V566GcIOydtOugh+qyjCDrja7slrTslIzsm4zrsoTrpqzrqbQgbG9hZGVkVHlwZXPqsIAg7Jik7Je865CoLlxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IOugiO2NvOufsOyKpCDtg4DsnoUg7LqQ7Iqk7YyFXG4gICAgICAgIChyZWZlcmVuY2VzW3R5cGVQYXJhbS5pZF0gYXMgei5ab2RUeXBlPGFueT4pID0gem9kVHlwZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgUmVxVHlwZSA9IGdldFpvZE9iamVjdEZyb21BcGlQYXJhbXMoXG4gICAgLy8gYXBpIHBhcnNpbmftlZwg6rKw6rO86rCAIGFwaSBwYXJhbXNcbiAgICBhcGkucGFyYW1ldGVycy5maWx0ZXIoXG4gICAgICAocGFyYW0pID0+XG4gICAgICAgICFBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICFBcGlQYXJhbVR5cGUuaXNSZWZLbmV4KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICEocGFyYW0ub3B0aW9uYWwgPT09IHRydWUgJiYgcGFyYW0ubmFtZS5zdGFydHNXaXRoKFwiX1wiKSksIC8vIF/roZwg7Iuc7J6R7ZWY64qUIO2MjOudvOuvuO2EsOuKlCDsoJzsmbhcbiAgICApLFxuICAgIHJlZmVyZW5jZXMsXG4gICk7XG4gIHJldHVybiBSZXFUeXBlO1xufVxuXG4vKlxuICogQVBJIO2DgOyehSDsoJXsnZjrpbwgVHlwZVNjcmlwdCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VmOq4sCDsnITtlZwg7ZWo7IiY65Ok7J6F64uI64ukLlxuICovXG5cbi8qKlxuICogQXBpUGFyYW1UeXBl7J2EIFR5cGVTY3JpcHQg7YOA7J6FIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiB1bmlvbiwgaW50ZXJzZWN0aW9uLCBhcnJheSwgcmVmIOuTsSDrqqjrk6Ag7YOA7J6F7J2EIFRTIOusuOuyleycvOuhnCDtkZztmITtlZjrqbAsXG4gKiBpbXBvcnTqsIAg7ZWE7JqU7ZWcIO2DgOyehSBJROuKlCBpbmplY3RJbXBvcnRLZXlz7JeQIOyImOynke2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwaVBhcmFtVHlwZVRvVHNUeXBlKHBhcmFtVHlwZTogQXBpUGFyYW1UeXBlLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGlmIChcbiAgICBbXG4gICAgICBcInN0cmluZ1wiLFxuICAgICAgXCJudW1iZXJcIixcbiAgICAgIFwiYm9vbGVhblwiLFxuICAgICAgXCJ0cnVlXCIsXG4gICAgICBcImZhbHNlXCIsXG4gICAgICBcIm51bGxcIixcbiAgICAgIFwidW5kZWZpbmVkXCIsXG4gICAgICBcInZvaWRcIixcbiAgICAgIFwiYW55XCIsXG4gICAgICBcInVua25vd25cIixcbiAgICBdLmluY2x1ZGVzKHBhcmFtVHlwZSBhcyBzdHJpbmcpXG4gICkge1xuICAgIHJldHVybiBwYXJhbVR5cGUgYXMgc3RyaW5nO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc09iamVjdChwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIGB7ICR7YXBpUGFyYW1Ub1RzQ29kZShwYXJhbVR5cGUucHJvcHMsIGluamVjdEltcG9ydEtleXMpfSB9YDtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNTdHJpbmdMaXRlcmFsKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gYFwiJHtwYXJhbVR5cGUudmFsdWV9XCJgO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc051bWVyaWNMaXRlcmFsKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gU3RyaW5nKHBhcmFtVHlwZS52YWx1ZSk7XG4gIH0gZWxzZSBpZiAoQXBpUGFyYW1UeXBlLmlzVW5pb24ocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBwYXJhbVR5cGUudHlwZXMubWFwKCh0eXBlKSA9PiBhcGlQYXJhbVR5cGVUb1RzVHlwZSh0eXBlLCBpbmplY3RJbXBvcnRLZXlzKSkuam9pbihcIiB8IFwiKTtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNJbnRlcnNlY3Rpb24ocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBwYXJhbVR5cGUudHlwZXMubWFwKCh0eXBlKSA9PiBhcGlQYXJhbVR5cGVUb1RzVHlwZSh0eXBlLCBpbmplY3RJbXBvcnRLZXlzKSkuam9pbihcIiAmIFwiKTtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNBcnJheShwYXJhbVR5cGUpKSB7XG4gICAgLy8gaW50ZXJzZWN0aW9u7J2064KYIHVuaW9u7J24IOqyveyasCDqtITtmLjroZwg6rCQ7Iu46riwXG4gICAgY29uc3QgZWxlbWVudHNUeXBlID0gYXBpUGFyYW1UeXBlVG9Uc1R5cGUocGFyYW1UeXBlLmVsZW1lbnRzVHlwZSwgaW5qZWN0SW1wb3J0S2V5cyk7XG4gICAgcmV0dXJuIEFwaVBhcmFtVHlwZS5pc0ludGVyc2VjdGlvbihwYXJhbVR5cGUuZWxlbWVudHNUeXBlKSB8fFxuICAgICAgQXBpUGFyYW1UeXBlLmlzVW5pb24ocGFyYW1UeXBlLmVsZW1lbnRzVHlwZSlcbiAgICAgID8gYCgke2VsZW1lbnRzVHlwZX0pW11gXG4gICAgICA6IGAke2VsZW1lbnRzVHlwZX1bXWA7XG4gIH0gZWxzZSBpZiAoQXBpUGFyYW1UeXBlLmlzUmVmKHBhcmFtVHlwZSkpIHtcbiAgICBpZiAoW1wiUGlja1wiLCBcIk9taXRcIiwgXCJQcm9taXNlXCIsIFwiUGFydGlhbFwiLCBcIkRhdGVcIl0uaW5jbHVkZXMocGFyYW1UeXBlLmlkKSA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIGltcG9ydEtleXMg7J247KCd7IWYXG4gICAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocGFyYW1UeXBlLmlkKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtVHlwZS5hcmdzID09PSB1bmRlZmluZWQgfHwgcGFyYW1UeXBlLmFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcGFyYW1UeXBlLmlkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCR7cGFyYW1UeXBlLmlkfTwke3BhcmFtVHlwZS5hcmdzXG4gICAgICAgIC5tYXAoKGFyZykgPT4gYXBpUGFyYW1UeXBlVG9Uc1R5cGUoYXJnLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCIsXCIpfT5gO1xuICAgIH1cbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNJbmRleGVkQWNjZXNzKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gYCR7YXBpUGFyYW1UeXBlVG9Uc1R5cGUoXG4gICAgICBwYXJhbVR5cGUub2JqZWN0LFxuICAgICAgaW5qZWN0SW1wb3J0S2V5cyxcbiAgICApfVske2FwaVBhcmFtVHlwZVRvVHNUeXBlKHBhcmFtVHlwZS5pbmRleCwgaW5qZWN0SW1wb3J0S2V5cyl9XWA7XG4gIH0gZWxzZSBpZiAoQXBpUGFyYW1UeXBlLmlzVHVwbGVUeXBlKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gYFsgJHtwYXJhbVR5cGUuZWxlbWVudHMubWFwKChlbGVtKSA9PiBhcGlQYXJhbVR5cGVUb1RzVHlwZShlbGVtLCBpbmplY3RJbXBvcnRLZXlzKSl9IF1gO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc1R5cGVQYXJhbShwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIGAke3BhcmFtVHlwZS5pZH0ke1xuICAgICAgcGFyYW1UeXBlLmNvbnN0cmFpbnRcbiAgICAgICAgPyBgIGV4dGVuZHMgJHthcGlQYXJhbVR5cGVUb1RzVHlwZShwYXJhbVR5cGUuY29uc3RyYWludCwgaW5qZWN0SW1wb3J0S2V5cyl9YFxuICAgICAgICA6IFwiXCJcbiAgICB9YDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJlc29sdmUg67aI6rCAIEFwaVBhcmFtVHlwZSAke3BhcmFtVHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEFwaVBhcmFtIOuwsOyXtOydhCBUeXBlU2NyaXB0IO2VqOyImCDtjIzrnbzrr7jthLAg7L2U65Oc66GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOyYiDogXCJuYW1lOiBzdHJpbmcsIGFnZT86IG51bWJlciwgYWN0aXZlOiBib29sZWFuID0gdHJ1ZVwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcGlQYXJhbVRvVHNDb2RlKHBhcmFtczogQXBpUGFyYW1bXSwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gcGFyYW1zXG4gICAgLm1hcCgocGFyYW0pID0+IHtcbiAgICAgIHJldHVybiBgJHtwYXJhbS5uYW1lfSR7XG4gICAgICAgIHBhcmFtLm9wdGlvbmFsICYmICFwYXJhbS5kZWZhdWx0RGVmID8gXCI/XCIgOiBcIlwiXG4gICAgICB9OiAke2FwaVBhcmFtVHlwZVRvVHNUeXBlKHBhcmFtLnR5cGUsIGluamVjdEltcG9ydEtleXMpfSR7XG4gICAgICAgIHBhcmFtLmRlZmF1bHREZWYgPyBgPSAke3BhcmFtLmRlZmF1bHREZWZ9YCA6IFwiXCJcbiAgICAgIH1gO1xuICAgIH0pXG4gICAgLmpvaW4oXCIsIFwiKTtcbn1cblxuLyoqXG4gKiBBcGlQYXJhbSDrsLDsl7TsnYQgVHlwZVNjcmlwdCDqsJ3ssrQg7YOA7J6FIOy9lOuTnOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiDsmIg6IFwieyBuYW1lOiBzdHJpbmcsIGFnZT86IG51bWJlciwgYWN0aXZlOiBib29sZWFuID0gdHJ1ZSB9XCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwaVBhcmFtVG9Uc0NvZGVBc09iamVjdChwYXJhbXM6IEFwaVBhcmFtW10sIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGB7ICR7cGFyYW1zXG4gICAgLm1hcChcbiAgICAgIChwYXJhbSkgPT5cbiAgICAgICAgYCR7cGFyYW0ubmFtZX0ke3BhcmFtLm9wdGlvbmFsID8gXCI/XCIgOiBcIlwifTogJHthcGlQYXJhbVR5cGVUb1RzVHlwZShcbiAgICAgICAgICBwYXJhbS50eXBlLFxuICAgICAgICAgIGluamVjdEltcG9ydEtleXMsXG4gICAgICAgICl9JHtwYXJhbS5kZWZhdWx0RGVmID8gYD0gJHtwYXJhbS5kZWZhdWx0RGVmfWAgOiBcIlwifWAsXG4gICAgKVxuICAgIC5qb2luKFwiLCBcIil9IH1gO1xufVxuIl0sIm5hbWVzIjpbInoiLCJBcGlQYXJhbVR5cGUiLCJ1bndyYXBQcm9taXNlT25jZSIsInBhcmFtVHlwZSIsImlzUHJvbWlzZSIsImFyZ3MiLCJnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZSIsInJlZmVyZW5jZXMiLCJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIiwiYWR2VHlwZSIsInQiLCJsaXRlcmFsIiwidmFsdWUiLCJvYmpUeXBlIiwiZ2V0Wm9kT2JqZWN0RnJvbUFwaVBhcmFtcyIsInByb3BzIiwiYXJyVHlwZSIsImFycmF5IiwiZWxlbWVudHNUeXBlIiwicmVmVHlwZSIsImlkIiwiZGF0ZSIsImluY2x1ZGVzIiwibGVuZ3RoIiwiRXJyb3IiLCJvYmoiLCJsaXRlcmFsT3JVbmlvbiIsIm1hcCIsImFyZyIsImtleXMiLCJab2RVbmlvbiIsImRlZiIsIm9wdGlvbnMiLCJvcHRpb24iLCJ2YWx1ZXMiLCJrZXlSZWNvcmQiLCJPYmplY3QiLCJmcm9tRW50cmllcyIsImtleSIsInBpY2siLCJvbWl0IiwicGFydGlhbCIsInJlZmVyZW5jZSIsInVuZGVmaW5lZCIsInVua25vd24iLCJ1bmlvblR5cGUiLCJ0eXBlcyIsInNvbWUiLCJ0eXBlIiwibnVsbGFibGUiLCJ1bmlvbiIsImludGVyc2VjdGlvblR5cGUiLCJyZWR1Y2UiLCJyZXN1bHQiLCJpbmRleCIsInJlc29sdmVkVHlwZSIsImludGVyc2VjdGlvbiIsInR1cGxlVHlwZSIsInR1cGxlIiwiZWxlbWVudHMiLCJlbGVtIiwiYXBpUGFyYW1zIiwib2JqZWN0IiwicGFyYW0iLCJ6b2RUeXBlIiwib3B0aW9uYWwiLCJuYW1lIiwiZ2V0Wm9kT2JqZWN0RnJvbUFwaSIsImFwaSIsInR5cGVQYXJhbWV0ZXJzIiwidHlwZVBhcmFtIiwiY29uc3RyYWludCIsIlJlcVR5cGUiLCJwYXJhbWV0ZXJzIiwiZmlsdGVyIiwiaXNDb250ZXh0IiwiaXNSZWZLbmV4Iiwic3RhcnRzV2l0aCIsImFwaVBhcmFtVHlwZVRvVHNUeXBlIiwiaW5qZWN0SW1wb3J0S2V5cyIsImlzT2JqZWN0IiwiYXBpUGFyYW1Ub1RzQ29kZSIsImlzU3RyaW5nTGl0ZXJhbCIsImlzTnVtZXJpY0xpdGVyYWwiLCJTdHJpbmciLCJpc1VuaW9uIiwiam9pbiIsImlzSW50ZXJzZWN0aW9uIiwiaXNBcnJheSIsImlzUmVmIiwicHVzaCIsImlzSW5kZXhlZEFjY2VzcyIsImlzVHVwbGVUeXBlIiwiaXNUeXBlUGFyYW0iLCJwYXJhbXMiLCJkZWZhdWx0RGVmIiwiYXBpUGFyYW1Ub1RzQ29kZUFzT2JqZWN0Il0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0JDLEdBRUQsU0FBU0EsQ0FBQyxRQUFRLE1BQU07QUFHeEIsU0FBd0JDLFlBQVksUUFBUSxvQkFBaUI7QUFPN0Q7OztDQUdDLEdBQ0QsT0FBTyxTQUFTQyxrQkFBa0JDLFNBQXVCO0lBQ3ZELElBQUlGLGFBQWFHLFNBQVMsQ0FBQ0QsWUFBWTtRQUNyQyxPQUFPQSxVQUFVRSxJQUFJLEVBQUUsQ0FBQyxFQUFFO0lBQzVCLE9BQU87UUFDTCxPQUFPRjtJQUNUO0FBQ0Y7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
|
|
237
|
+
//#endregion
|
|
238
|
+
init_code_converters();
|
|
239
|
+
export { apiParamToTsCode, apiParamToTsCodeAsObject, apiParamTypeToTsType, getZodObjectFromApi, getZodObjectFromApiParams, getZodTypeFromApiParamType, init_code_converters, unwrapPromiseOnce };
|
|
240
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1jb252ZXJ0ZXJzLmpzIiwibmFtZXMiOlsieiIsImtleXM6IHN0cmluZ1tdIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9jb2RlLWNvbnZlcnRlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjb2RlLWNvbnZlcnRlcnPripQgQVBJIO2DgOyehSDsoJXsnZjrk6TsnYQgWm9kIOqwneyytOuCmCBUeXBlU2NyaXB0IOy9lOuTnOuhnCDrs4DtmZjtlZjripQg7ZWo7IiY65Ok7J2EIOygnOqzte2VqeuLiOuLpC5cbiAqXG4gKiAxLiBBUEkg7Iuc66as7KaI65OkOlxuICogLSBFeHRlbmRlZEFwaSwgQXBpUGFyYW0sIEFwaVBhcmFtVHlwZVxuICogLSBBUEkg66mU7YOA642w7J207YSw66W8IO2RnO2YhO2VmOuKlCDtg4DsnoUg7KCV7J2Y65OkXG4gKlxuICogMi4gWm9kT2JqZWN0IOuzgO2ZmFxuICogLSBBUEkg7YOA7J6FIOygleydmCDihpIgWm9kIO2DgOyehSDsnbjsiqTthLTsiqQgKOufsO2DgOyehCDrsLjrpqzrjbDsnbTshZjsmqkpXG4gKiAtIGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlIOKGkiBnZXRab2RPYmplY3RGcm9tQXBpUGFyYW1zIOKGkiBnZXRab2RPYmplY3RGcm9tQXBpXG4gKlxuICogMy4gVHNUeXBlRGVmIOuzgO2ZmFxuICogLSBBUEkg7YOA7J6FIOygleydmCDihpIgVHlwZVNjcmlwdCDtg4DsnoUg7L2U65OcIOusuOyekOyXtCAo7L2U65OcIOyDneyEseyaqSlcbiAqIC0gYXBpUGFyYW1UeXBlVG9Uc1R5cGUg4oaSIGFwaVBhcmFtVG9Uc0NvZGUsIGFwaVBhcmFtVG9Uc0NvZGVBc09iamVjdFxuICpcbiAqIOywuOqzoDpcbiAqIC0gWm9kVHlwZURlZiDsg53shLEgKFpvZCDsvZTrk5wg66y47J6Q7Je0KTogem9kLWNvbnZlcnRlci50c+ydmCB6b2RUeXBlVG9ab2RDb2RlIOyCrOyaqVxuICogLSBFbnRpdHlQcm9wIOuzgO2ZmDogem9kLWNvbnZlcnRlci50cyDssLjsobBcbiAqL1xuXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBBcGlQYXJhbVR5cGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgQXBpUGFyYW0gfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgRXh0ZW5kZWRBcGkgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbi8vIDxhbnk+66W8IOyekOygnO2VmOqzoCwgWm9k7JeQ7IScIOygnOyVve2VmOuKlCDquLDrs7jsoIHsnbggR2VuZXJpYyBUeXBlIFBhcmFtZXRlcuulvCDsgqzsmqntlaguXG50eXBlIEFueVpvZE9iamVjdCA9IHouWm9kT2JqZWN0O1xudHlwZSBBbnlab2RMaXRlcmFsID0gei5ab2RMaXRlcmFsO1xuXG4vKipcbiAqIFByb21pc2Ug7YOA7J6F7J2EIO2VnCDrsogg7Ja4656Y7ZWR7ZWY7JesIOuCtOu2gCDtg4DsnoXsnYQg67CY7ZmY7ZWp64uI64ukLlxuICogUHJvbWlzZeqwgCDslYTri4wg6rK97JqwIOybkOuzuCDtg4DsnoXsnYQg6re464yA66GcIOuwmO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVud3JhcFByb21pc2VPbmNlKHBhcmFtVHlwZTogQXBpUGFyYW1UeXBlKSB7XG4gIGlmIChBcGlQYXJhbVR5cGUuaXNQcm9taXNlKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gcGFyYW1UeXBlLmFyZ3M/LlswXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcGFyYW1UeXBlO1xuICB9XG59XG5cbi8qXG4gKiBBUEnrpbwg6rWs7ISx7ZWY64qUIOyalOyGjOuTpOydhCBab2RPYmplY3TroZwg67OA7ZmY7ZWY6riwIOychO2VnCDtlajsiJjrk6TsnoXri4jri6QuXG4gKi9cblxuLyoqXG4gKiBBcGlQYXJhbVR5cGXsnYQgWm9kIO2DgOyehSDsnbjsiqTthLTsiqTroZwg67OA7ZmY7ZWp64uI64ukLlxuICogc3RyaW5nLCBudW1iZXIsIGFycmF5LCB1bmlvbiDrk7Eg66qo65OgIEFwaVBhcmFtVHlwZeydhCDsspjrpqztlZjrqbAsXG4gKiDsiJztmZjssLjsobDqsIAg67Cc7IOd7ZWY64qUIOqyveyasCB6LnVua25vd24oKeycvOuhnCBmYWxsYmFja+2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKFxuICBwYXJhbVR5cGU6IEFwaVBhcmFtVHlwZSxcbiAgcmVmZXJlbmNlczoge1xuICAgIFtpZDogc3RyaW5nXTogei5ab2RUeXBlO1xuICB9LFxuKTogei5ab2RUeXBlIHtcbiAgc3dpdGNoIChwYXJhbVR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gei5zdHJpbmcoKTtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gei5udW1iZXIoKTtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIHouYm9vbGVhbigpO1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnN0IGFkdlR5cGUgPSBwYXJhbVR5cGUgYXMgeyB0OiBzdHJpbmc7IHZhbHVlPzogc3RyaW5nIHwgbnVtYmVyIH07XG4gICAgICBzd2l0Y2ggKGFkdlR5cGUudCkge1xuICAgICAgICBjYXNlIFwic3RyaW5nLWxpdGVyYWxcIjpcbiAgICAgICAgY2FzZSBcIm51bWVyaWMtbGl0ZXJhbFwiOlxuICAgICAgICAgIHJldHVybiB6LmxpdGVyYWwoYWR2VHlwZS52YWx1ZSk7XG4gICAgICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgICAgIGNvbnN0IG9ialR5cGUgPSBwYXJhbVR5cGUgYXMgeyB0OiBzdHJpbmc7IHByb3BzOiBBcGlQYXJhbVtdIH07XG4gICAgICAgICAgcmV0dXJuIGdldFpvZE9iamVjdEZyb21BcGlQYXJhbXMob2JqVHlwZS5wcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImFycmF5XCI6IHtcbiAgICAgICAgICBjb25zdCBhcnJUeXBlID0gcGFyYW1UeXBlIGFzIHtcbiAgICAgICAgICAgIHQ6IHN0cmluZztcbiAgICAgICAgICAgIGVsZW1lbnRzVHlwZTogQXBpUGFyYW1UeXBlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIHouYXJyYXkoZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUoYXJyVHlwZS5lbGVtZW50c1R5cGUsIHJlZmVyZW5jZXMpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVmXCI6IHtcbiAgICAgICAgICBjb25zdCByZWZUeXBlID0gcGFyYW1UeXBlIGFzIHtcbiAgICAgICAgICAgIHQ6IHN0cmluZztcbiAgICAgICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgICAgICBhcmdzPzogQXBpUGFyYW1UeXBlW107XG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBEYXRlIO2DgOyehSDsspjrpqxcbiAgICAgICAgICBpZiAocmVmVHlwZS5pZCA9PT0gXCJEYXRlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB6LmRhdGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8g6rCd7LK0IO2CpCDqtIDrpqwg7Jyg7Yu466as7YuwXG4gICAgICAgICAgaWYgKFtcIlBpY2tcIiwgXCJPbWl0XCJdLmluY2x1ZGVzKHJlZlR5cGUuaWQpKSB7XG4gICAgICAgICAgICBpZiAocmVmVHlwZS5hcmdzPy5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwgJHtyZWZUeXBlLmlkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgW29iaiwgbGl0ZXJhbE9yVW5pb25dID0gcmVmVHlwZS5hcmdzLm1hcChcbiAgICAgICAgICAgICAgKGFyZykgPT4gZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUoYXJnLCByZWZlcmVuY2VzKSxcbiAgICAgICAgICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0g7IOd7ISx65CY64qUIFpvZFVuaW9u7J2YIO2DgOyeheydhCDstpTsoIHtlZjquLAg7Ja066Ck7JuAXG4gICAgICAgICAgICApIGFzIFtBbnlab2RPYmplY3QsIHouWm9kVW5pb248YW55PiB8IEFueVpvZExpdGVyYWxdO1xuXG4gICAgICAgICAgICBsZXQga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGlmIChsaXRlcmFsT3JVbmlvbiBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICAgICAgICAgICAga2V5cyA9IGxpdGVyYWxPclVuaW9uLmRlZi5vcHRpb25zLm1hcChcbiAgICAgICAgICAgICAgICAob3B0aW9uOiB7IGRlZjogeyB2YWx1ZXM6IHN0cmluZ1tdIH0gfSkgPT4gb3B0aW9uLmRlZi52YWx1ZXNbMF0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBrZXlzID0gKGxpdGVyYWxPclVuaW9uIGFzIHouWm9kTGl0ZXJhbDxzdHJpbmc+KS5kZWYudmFsdWVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qga2V5UmVjb3JkID0gT2JqZWN0LmZyb21FbnRyaWVzKGtleXMubWFwKChrZXkpID0+IFtrZXksIHRydWUgYXMgY29uc3RdKSk7XG4gICAgICAgICAgICBpZiAocmVmVHlwZS5pZCA9PT0gXCJQaWNrXCIpIHtcbiAgICAgICAgICAgICAgaWYgKG9iai5waWNrKSB7XG4gICAgICAgICAgICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gWm9kIDQuMy42IHBpY2sg7YOA7J6FIO2YuO2ZmOyEsVxuICAgICAgICAgICAgICAgIHJldHVybiBvYmoucGljayhrZXlSZWNvcmQgYXMgYW55KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKG9iai5vbWl0KSB7XG4gICAgICAgICAgICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gWm9kIDQuMy42IG9taXQg7YOA7J6FIO2YuO2ZmOyEsVxuICAgICAgICAgICAgICAgIHJldHVybiBvYmoub21pdChrZXlSZWNvcmQgYXMgYW55KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoW1wiUGFydGlhbFwiXS5pbmNsdWRlcyhyZWZUeXBlLmlkKSkge1xuICAgICAgICAgICAgaWYgKHJlZlR5cGUuYXJncz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7J6Y66q765CcICR7cmVmVHlwZS5pZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKHJlZlR5cGUuYXJnc1swXSwgcmVmZXJlbmNlcyk7XG4gICAgICAgICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSBQYXJ0aWFsIOyduOyImCDtg4DsnoUg7LqQ7Iqk7YyFXG4gICAgICAgICAgICByZXR1cm4gKG9iaiBhcyB6LlpvZE9iamVjdDxhbnk+KS5wYXJ0aWFsKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZSA9IHJlZmVyZW5jZXNbcmVmVHlwZS5pZF07XG4gICAgICAgICAgaWYgKHJlZmVyZW5jZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gei51bmtub3duKCk7XG4gICAgICAgICAgICAvLyB0aHJvdyBuZXcgRXJyb3IoYHJlZiDssLjsobAg67aI6rCAICR7cmVmVHlwZS5pZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwidW5pb25cIjoge1xuICAgICAgICAgIGNvbnN0IHVuaW9uVHlwZSA9IHBhcmFtVHlwZSBhcyB7XG4gICAgICAgICAgICB0OiBzdHJpbmc7XG4gICAgICAgICAgICB0eXBlczogQXBpUGFyYW1UeXBlW107XG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBudWxsYWJsZSDsnKDri4jsmKhcbiAgICAgICAgICBpZiAodW5pb25UeXBlLnR5cGVzLmxlbmd0aCA9PT0gMiAmJiB1bmlvblR5cGUudHlwZXMuc29tZSgodHlwZSkgPT4gdHlwZSA9PT0gXCJudWxsXCIpKSB7XG4gICAgICAgICAgICBpZiAodW5pb25UeXBlLnR5cGVzWzBdID09PSBcIm51bGxcIikge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUodW5pb25UeXBlLnR5cGVzWzFdLCByZWZlcmVuY2VzKS5udWxsYWJsZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKHVuaW9uVHlwZS50eXBlc1swXSwgcmVmZXJlbmNlcykubnVsbGFibGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8g7J2867CYIOycoOuLiOyYqFxuICAgICAgICAgIHJldHVybiB6LnVuaW9uKFxuICAgICAgICAgICAgdW5pb25UeXBlLnR5cGVzLm1hcCgodHlwZSkgPT4gZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUodHlwZSwgcmVmZXJlbmNlcykpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImludGVyc2VjdGlvblwiOiB7XG4gICAgICAgICAgY29uc3QgaW50ZXJzZWN0aW9uVHlwZSA9IHBhcmFtVHlwZSBhcyB7XG4gICAgICAgICAgICB0OiBzdHJpbmc7XG4gICAgICAgICAgICB0eXBlczogQXBpUGFyYW1UeXBlW107XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gaW50ZXJzZWN0aW9uVHlwZS50eXBlcy5yZWR1Y2UoKHJlc3VsdCwgdHlwZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVHlwZSA9IGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKHR5cGUsIHJlZmVyZW5jZXMpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlZFR5cGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gei5pbnRlcnNlY3Rpb24ocmVzdWx0LCByZXNvbHZlZFR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHoudW5rbm93bigpIGFzIHouWm9kVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInR1cGxlLXR5cGVcIjoge1xuICAgICAgICAgIGNvbnN0IHR1cGxlVHlwZSA9IHBhcmFtVHlwZSBhcyBBcGlQYXJhbVR5cGUuVHVwbGVUeXBlO1xuICAgICAgICAgIHJldHVybiB6LnR1cGxlKFxuICAgICAgICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0g7IOd7ISx65CY64qUIFpvZFR1cGxl7J2YIO2DgOyeheydhCDstpTsoIHtlZjquLAg7Ja066Ck7JuAXG4gICAgICAgICAgICB0dXBsZVR5cGUuZWxlbWVudHMubWFwKChlbGVtKSA9PiBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZShlbGVtLCByZWZlcmVuY2VzKSkgYXMgYW55LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB6LnVua25vd24oKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBcGlQYXJhbSDrsLDsl7TsnYQgWm9kT2JqZWN066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOqwgSDtjIzrnbzrr7jthLDsnZggb3B0aW9uYWwg7Jes67aA66W8IOuwmOyYge2VmOyXrCBab2Qg7Iqk7YKk66eI66W8IOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFpvZE9iamVjdEZyb21BcGlQYXJhbXMoXG4gIGFwaVBhcmFtczogQXBpUGFyYW1bXSxcbiAgcmVmZXJlbmNlczoge1xuICAgIFtpZDogc3RyaW5nXTogei5ab2RUeXBlO1xuICB9ID0ge30sXG4pOiB6LlpvZE9iamVjdCB7XG4gIHJldHVybiB6Lm9iamVjdChcbiAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBhcGlQYXJhbXMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICBsZXQgem9kVHlwZSA9IGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKHBhcmFtLnR5cGUsIHJlZmVyZW5jZXMpO1xuICAgICAgICBpZiAocGFyYW0ub3B0aW9uYWwpIHtcbiAgICAgICAgICB6b2RUeXBlID0gem9kVHlwZS5vcHRpb25hbCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbcGFyYW0ubmFtZSwgem9kVHlwZV07XG4gICAgICB9KSxcbiAgICApLFxuICApO1xufVxuXG4vKipcbiAqIEV4dGVuZGVkQXBp66W8IFpvZE9iamVjdOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBUeXBlUGFyYW1ldGVy7JmAIOydvOuwmCDtjIzrnbzrr7jthLDrpbwg7LKY66as7ZWY66mwLFxuICogQ29udGV4dCwgUmVmS25leCwgX+uhnCDsi5zsnpHtlZjripQgb3B0aW9uYWwg7YyM652866+47YSw64qUIOygnOyZuO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFpvZE9iamVjdEZyb21BcGkoXG4gIGFwaTogRXh0ZW5kZWRBcGksXG4gIHJlZmVyZW5jZXM6IHtcbiAgICBbaWQ6IHN0cmluZ106IHouWm9kVHlwZTtcbiAgfSA9IHt9LFxuKSB7XG4gIGlmIChhcGkudHlwZVBhcmFtZXRlcnM/Lmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHR5cGVQYXJhbSBvZiBhcGkudHlwZVBhcmFtZXRlcnMpIHtcbiAgICAgIGlmICh0eXBlUGFyYW0uY29uc3RyYWludCkge1xuICAgICAgICBjb25zdCB6b2RUeXBlID0gZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUodHlwZVBhcmFtLmNvbnN0cmFpbnQsIHJlZmVyZW5jZXMpO1xuXG4gICAgICAgIC8vIEZJWE1FOiByZWZlcmVuY2Vz64qUIOq4gOuhnOuyjCDsmKTruIzsoJ3tirjroZwsIHR5cGVQYXJhbS5pZChcIlRcIiDrk7Ep66W8IGtleeuhnCDsnbTroIfqsowg642u7Ja07JSM7JuM67KE66as66m0IGxvYWRlZFR5cGVz6rCAIOyYpOyXvOuQqC5cbiAgICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0g66CI7Y2865+w7IqkIO2DgOyehSDsupDsiqTtjIVcbiAgICAgICAgKHJlZmVyZW5jZXNbdHlwZVBhcmFtLmlkXSBhcyB6LlpvZFR5cGU8YW55PikgPSB6b2RUeXBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBSZXFUeXBlID0gZ2V0Wm9kT2JqZWN0RnJvbUFwaVBhcmFtcyhcbiAgICAvLyBhcGkgcGFyc2luZ+2VnCDqsrDqs7zqsIAgYXBpIHBhcmFtc1xuICAgIGFwaS5wYXJhbWV0ZXJzLmZpbHRlcihcbiAgICAgIChwYXJhbSkgPT5cbiAgICAgICAgIUFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkgJiZcbiAgICAgICAgIUFwaVBhcmFtVHlwZS5pc1JlZktuZXgocGFyYW0udHlwZSkgJiZcbiAgICAgICAgIShwYXJhbS5vcHRpb25hbCAmJiBwYXJhbS5uYW1lLnN0YXJ0c1dpdGgoXCJfXCIpKSwgLy8gX+uhnCDsi5zsnpHtlZjripQg7YyM652866+47YSw64qUIOygnOyZuFxuICAgICksXG4gICAgcmVmZXJlbmNlcyxcbiAgKTtcbiAgcmV0dXJuIFJlcVR5cGU7XG59XG5cbi8qXG4gKiBBUEkg7YOA7J6FIOygleydmOulvCBUeXBlU2NyaXB0IOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWY6riwIOychO2VnCDtlajsiJjrk6TsnoXri4jri6QuXG4gKi9cblxuLyoqXG4gKiBBcGlQYXJhbVR5cGXsnYQgVHlwZVNjcmlwdCDtg4DsnoUg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIHVuaW9uLCBpbnRlcnNlY3Rpb24sIGFycmF5LCByZWYg65OxIOuqqOuToCDtg4DsnoXsnYQgVFMg66y467KV7Jy866GcIO2RnO2YhO2VmOupsCxcbiAqIGltcG9ydOqwgCDtlYTsmpTtlZwg7YOA7J6FIElE64qUIGluamVjdEltcG9ydEtleXPsl5Ag7IiY7KeR7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBpUGFyYW1UeXBlVG9Uc1R5cGUocGFyYW1UeXBlOiBBcGlQYXJhbVR5cGUsIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKFxuICAgIFtcbiAgICAgIFwic3RyaW5nXCIsXG4gICAgICBcIm51bWJlclwiLFxuICAgICAgXCJib29sZWFuXCIsXG4gICAgICBcInRydWVcIixcbiAgICAgIFwiZmFsc2VcIixcbiAgICAgIFwibnVsbFwiLFxuICAgICAgXCJ1bmRlZmluZWRcIixcbiAgICAgIFwidm9pZFwiLFxuICAgICAgXCJhbnlcIixcbiAgICAgIFwidW5rbm93blwiLFxuICAgIF0uaW5jbHVkZXMocGFyYW1UeXBlIGFzIHN0cmluZylcbiAgKSB7XG4gICAgcmV0dXJuIHBhcmFtVHlwZSBhcyBzdHJpbmc7XG4gIH0gZWxzZSBpZiAoQXBpUGFyYW1UeXBlLmlzT2JqZWN0KHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gYHsgJHthcGlQYXJhbVRvVHNDb2RlKHBhcmFtVHlwZS5wcm9wcywgaW5qZWN0SW1wb3J0S2V5cyl9IH1gO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc1N0cmluZ0xpdGVyYWwocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBgXCIke3BhcmFtVHlwZS52YWx1ZX1cImA7XG4gIH0gZWxzZSBpZiAoQXBpUGFyYW1UeXBlLmlzTnVtZXJpY0xpdGVyYWwocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBTdHJpbmcocGFyYW1UeXBlLnZhbHVlKTtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNVbmlvbihwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIHBhcmFtVHlwZS50eXBlcy5tYXAoKHR5cGUpID0+IGFwaVBhcmFtVHlwZVRvVHNUeXBlKHR5cGUsIGluamVjdEltcG9ydEtleXMpKS5qb2luKFwiIHwgXCIpO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc0ludGVyc2VjdGlvbihwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIHBhcmFtVHlwZS50eXBlcy5tYXAoKHR5cGUpID0+IGFwaVBhcmFtVHlwZVRvVHNUeXBlKHR5cGUsIGluamVjdEltcG9ydEtleXMpKS5qb2luKFwiICYgXCIpO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc0FycmF5KHBhcmFtVHlwZSkpIHtcbiAgICAvLyBpbnRlcnNlY3Rpb27snbTrgpggdW5pb27snbgg6rK97JqwIOq0hO2YuOuhnCDqsJDsi7jquLBcbiAgICBjb25zdCBlbGVtZW50c1R5cGUgPSBhcGlQYXJhbVR5cGVUb1RzVHlwZShwYXJhbVR5cGUuZWxlbWVudHNUeXBlLCBpbmplY3RJbXBvcnRLZXlzKTtcbiAgICByZXR1cm4gQXBpUGFyYW1UeXBlLmlzSW50ZXJzZWN0aW9uKHBhcmFtVHlwZS5lbGVtZW50c1R5cGUpIHx8XG4gICAgICBBcGlQYXJhbVR5cGUuaXNVbmlvbihwYXJhbVR5cGUuZWxlbWVudHNUeXBlKVxuICAgICAgPyBgKCR7ZWxlbWVudHNUeXBlfSlbXWBcbiAgICAgIDogYCR7ZWxlbWVudHNUeXBlfVtdYDtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNSZWYocGFyYW1UeXBlKSkge1xuICAgIGlmICghW1wiUGlja1wiLCBcIk9taXRcIiwgXCJQcm9taXNlXCIsIFwiUGFydGlhbFwiLCBcIkRhdGVcIl0uaW5jbHVkZXMocGFyYW1UeXBlLmlkKSkge1xuICAgICAgLy8gaW1wb3J0S2V5cyDsnbjsoJ3shZhcbiAgICAgIGluamVjdEltcG9ydEtleXMucHVzaChwYXJhbVR5cGUuaWQpO1xuICAgIH1cbiAgICBpZiAocGFyYW1UeXBlLmFyZ3MgPT09IHVuZGVmaW5lZCB8fCBwYXJhbVR5cGUuYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBwYXJhbVR5cGUuaWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgJHtwYXJhbVR5cGUuaWR9PCR7cGFyYW1UeXBlLmFyZ3NcbiAgICAgICAgLm1hcCgoYXJnKSA9PiBhcGlQYXJhbVR5cGVUb1RzVHlwZShhcmcsIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAuam9pbihcIixcIil9PmA7XG4gICAgfVxuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc0luZGV4ZWRBY2Nlc3MocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBgJHthcGlQYXJhbVR5cGVUb1RzVHlwZShcbiAgICAgIHBhcmFtVHlwZS5vYmplY3QsXG4gICAgICBpbmplY3RJbXBvcnRLZXlzLFxuICAgICl9WyR7YXBpUGFyYW1UeXBlVG9Uc1R5cGUocGFyYW1UeXBlLmluZGV4LCBpbmplY3RJbXBvcnRLZXlzKX1dYDtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNUdXBsZVR5cGUocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBgWyAke3BhcmFtVHlwZS5lbGVtZW50cy5tYXAoKGVsZW0pID0+IGFwaVBhcmFtVHlwZVRvVHNUeXBlKGVsZW0sIGluamVjdEltcG9ydEtleXMpKX0gXWA7XG4gIH0gZWxzZSBpZiAoQXBpUGFyYW1UeXBlLmlzVHlwZVBhcmFtKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gYCR7cGFyYW1UeXBlLmlkfSR7XG4gICAgICBwYXJhbVR5cGUuY29uc3RyYWludFxuICAgICAgICA/IGAgZXh0ZW5kcyAke2FwaVBhcmFtVHlwZVRvVHNUeXBlKHBhcmFtVHlwZS5jb25zdHJhaW50LCBpbmplY3RJbXBvcnRLZXlzKX1gXG4gICAgICAgIDogXCJcIlxuICAgIH1gO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmVzb2x2ZSDrtojqsIAgQXBpUGFyYW1UeXBlICR7cGFyYW1UeXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogQXBpUGFyYW0g67Cw7Je07J2EIFR5cGVTY3JpcHQg7ZWo7IiYIO2MjOudvOuvuO2EsCDsvZTrk5zroZwg67OA7ZmY7ZWp64uI64ukLlxuICog7JiIOiBcIm5hbWU6IHN0cmluZywgYWdlPzogbnVtYmVyLCBhY3RpdmU6IGJvb2xlYW4gPSB0cnVlXCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwaVBhcmFtVG9Uc0NvZGUocGFyYW1zOiBBcGlQYXJhbVtdLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBwYXJhbXNcbiAgICAubWFwKChwYXJhbSkgPT4ge1xuICAgICAgcmV0dXJuIGAke3BhcmFtLm5hbWV9JHtcbiAgICAgICAgcGFyYW0ub3B0aW9uYWwgJiYgIXBhcmFtLmRlZmF1bHREZWYgPyBcIj9cIiA6IFwiXCJcbiAgICAgIH06ICR7YXBpUGFyYW1UeXBlVG9Uc1R5cGUocGFyYW0udHlwZSwgaW5qZWN0SW1wb3J0S2V5cyl9JHtcbiAgICAgICAgcGFyYW0uZGVmYXVsdERlZiA/IGA9ICR7cGFyYW0uZGVmYXVsdERlZn1gIDogXCJcIlxuICAgICAgfWA7XG4gICAgfSlcbiAgICAuam9pbihcIiwgXCIpO1xufVxuXG4vKipcbiAqIEFwaVBhcmFtIOuwsOyXtOydhCBUeXBlU2NyaXB0IOqwneyytCDtg4DsnoUg7L2U65Oc66GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOyYiDogXCJ7IG5hbWU6IHN0cmluZywgYWdlPzogbnVtYmVyLCBhY3RpdmU6IGJvb2xlYW4gPSB0cnVlIH1cIlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBpUGFyYW1Ub1RzQ29kZUFzT2JqZWN0KHBhcmFtczogQXBpUGFyYW1bXSwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYHsgJHtwYXJhbXNcbiAgICAubWFwKFxuICAgICAgKHBhcmFtKSA9PlxuICAgICAgICBgJHtwYXJhbS5uYW1lfSR7cGFyYW0ub3B0aW9uYWwgPyBcIj9cIiA6IFwiXCJ9OiAke2FwaVBhcmFtVHlwZVRvVHNUeXBlKFxuICAgICAgICAgIHBhcmFtLnR5cGUsXG4gICAgICAgICAgaW5qZWN0SW1wb3J0S2V5cyxcbiAgICAgICAgKX0ke3BhcmFtLmRlZmF1bHREZWYgPyBgPSAke3BhcmFtLmRlZmF1bHREZWZ9YCA6IFwiXCJ9YCxcbiAgICApXG4gICAgLmpvaW4oXCIsIFwiKX0gfWA7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQ0EsU0FBZ0Isa0JBQWtCLFdBQXlCO0FBQ3pELEtBQUksYUFBYSxVQUFVLFVBQVUsRUFBRTtBQUNyQyxTQUFPLFVBQVUsT0FBTztRQUNuQjtBQUNMLFNBQU87Ozs7Ozs7O0FBYVgsU0FBZ0IsMkJBQ2QsV0FDQSxZQUdXO0FBQ1gsU0FBUSxXQUFSO0VBQ0UsS0FBSyxTQUNILFFBQU9BLElBQUUsUUFBUTtFQUNuQixLQUFLLFNBQ0gsUUFBT0EsSUFBRSxRQUFRO0VBQ25CLEtBQUssVUFDSCxRQUFPQSxJQUFFLFNBQVM7RUFDcEIsU0FBUztHQUNQLE1BQU0sVUFBVTtBQUNoQixXQUFRLFFBQVEsR0FBaEI7SUFDRSxLQUFLO0lBQ0wsS0FBSyxrQkFDSCxRQUFPQSxJQUFFLFFBQVEsUUFBUSxNQUFNO0lBQ2pDLEtBQUssVUFBVTtLQUNiLE1BQU0sVUFBVTtBQUNoQixZQUFPLDBCQUEwQixRQUFRLE1BQU07O0lBRWpELEtBQUssU0FBUztLQUNaLE1BQU0sVUFBVTtBQUloQixZQUFPQSxJ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
|