sonamu 0.9.20 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.js +36 -0
- package/dist/ai/agents/agent.js +5 -7
- package/dist/ai/agents/index.js +1 -2
- package/dist/ai/agents/types.js +1 -1
- package/dist/ai/index.js +1 -2
- package/dist/ai/providers/rtzr/api.js +2 -3
- package/dist/ai/providers/rtzr/error.js +14 -29
- package/dist/ai/providers/rtzr/index.js +1 -2
- package/dist/ai/providers/rtzr/model.js +13 -20
- package/dist/ai/providers/rtzr/options.js +2 -3
- package/dist/ai/providers/rtzr/provider.js +2 -3
- package/dist/ai/providers/rtzr/utils.js +12 -21
- package/dist/api/base-frame.js +4 -4
- package/dist/api/caster.js +21 -38
- package/dist/api/code-converters.js +41 -98
- package/dist/api/config.d.ts +1 -10
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +9 -8
- package/dist/api/context.js +2 -3
- package/dist/api/decorators.js +80 -116
- package/dist/api/index.js +2 -3
- package/dist/api/secret.js +6 -10
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +200 -387
- package/dist/api/validator.js +5 -8
- package/dist/api/websocket-helpers.js +21 -32
- package/dist/auth/audit-log/builders.js +2 -3
- package/dist/auth/audit-log/events.js +2 -2
- package/dist/auth/audit-log/plugin.js +30 -61
- package/dist/auth/audit-log-ingestor.js +19 -41
- package/dist/auth/auth-generator.js +16 -41
- package/dist/auth/better-auth-entities.js +3 -4
- package/dist/auth/index.js +2 -3
- package/dist/auth/knex-adapter.js +18 -45
- package/dist/auth/plugins/entity-definitions/admin.js +2 -2
- package/dist/auth/plugins/entity-definitions/anonymous.js +2 -2
- package/dist/auth/plugins/entity-definitions/api-key.js +2 -2
- package/dist/auth/plugins/entity-definitions/audit-log.js +2 -2
- package/dist/auth/plugins/entity-definitions/index.js +2 -3
- package/dist/auth/plugins/entity-definitions/jwt.js +2 -2
- package/dist/auth/plugins/entity-definitions/organization.js +2 -2
- package/dist/auth/plugins/entity-definitions/passkey.js +2 -2
- package/dist/auth/plugins/entity-definitions/phone-number.js +2 -2
- package/dist/auth/plugins/entity-definitions/sso.js +2 -2
- package/dist/auth/plugins/entity-definitions/two-factor.js +2 -2
- package/dist/auth/plugins/entity-definitions/types.js +1 -1
- package/dist/auth/plugins/entity-definitions/username.js +2 -2
- package/dist/auth/plugins/index.js +1 -2
- package/dist/auth/plugins/wrappers/admin.js +2 -3
- package/dist/auth/plugins/wrappers/anonymous.js +2 -3
- package/dist/auth/plugins/wrappers/api-key.js +2 -3
- package/dist/auth/plugins/wrappers/index.js +1 -2
- package/dist/auth/plugins/wrappers/jwt.js +2 -3
- package/dist/auth/plugins/wrappers/organization.js +2 -3
- package/dist/auth/plugins/wrappers/passkey.js +2 -3
- package/dist/auth/plugins/wrappers/phone-number.js +2 -3
- package/dist/auth/plugins/wrappers/sso.js +2 -3
- package/dist/auth/plugins/wrappers/two-factor.js +2 -3
- package/dist/auth/plugins/wrappers/username.js +2 -3
- package/dist/bin/build-config.js +2 -2
- package/dist/bin/cli.js +151 -258
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +55 -97
- package/dist/bin/hmr-hook-register.js +3 -3
- package/dist/bin/migrate-targets.d.ts +3 -0
- package/dist/bin/migrate-targets.d.ts.map +1 -0
- package/dist/bin/migrate-targets.js +11 -0
- package/dist/bin/test-command.js +25 -55
- package/dist/bin/ts-loader-register.js +5 -6
- package/dist/bin/ts-loader-registration.js +6 -13
- package/dist/cache/cache-manager.js +3 -4
- package/dist/cache/decorator.js +11 -21
- package/dist/cache/drivers.js +2 -3
- package/dist/cache/index.js +2 -3
- package/dist/cache/types.js +1 -1
- package/dist/cache-control/cache-control.js +21 -34
- package/dist/cache-control/types.js +1 -1
- package/dist/compress/compress.js +10 -10
- package/dist/compress/index.js +1 -2
- package/dist/compress/types.js +1 -1
- package/dist/cone/cone-generator.js +25 -63
- package/dist/database/_batch_update.js +26 -46
- package/dist/database/base-model.js +44 -97
- package/dist/database/base-model.types.js +1 -1
- package/dist/database/db.d.ts +8 -14
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +127 -72
- package/dist/database/knex.js +5 -8
- package/dist/database/puri-subset.types.js +1 -1
- package/dist/database/puri-wrapper.js +11 -15
- package/dist/database/puri.js +117 -234
- package/dist/database/puri.types.js +3 -4
- package/dist/database/transaction-context.js +4 -5
- package/dist/database/upsert-builder.js +109 -176
- package/dist/dict/en.d.ts +1 -0
- package/dist/dict/en.d.ts.map +1 -1
- package/dist/dict/en.js +4 -4
- package/dist/dict/index.js +2 -3
- package/dist/dict/ko.d.ts +1 -0
- package/dist/dict/ko.d.ts.map +1 -1
- package/dist/dict/ko.js +4 -4
- package/dist/dict/rc-keys.js +3 -4
- package/dist/dict/sd.js +8 -19
- package/dist/dict/sonamu-dictionary.js +141 -284
- package/dist/dict/types.js +1 -1
- package/dist/dict/utils.js +4 -5
- package/dist/entity/entity-manager.d.ts +2 -2
- package/dist/entity/entity-manager.js +34 -82
- package/dist/entity/entity-template-cone.js +33 -66
- package/dist/entity/entity.js +156 -310
- package/dist/env.d.ts +14 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +75 -0
- package/dist/exceptions/error-handler.js +2 -3
- package/dist/exceptions/so-exceptions.js +7 -5
- package/dist/filter/index.js +1 -2
- package/dist/filter/types.js +3 -4
- package/dist/filter/utils.js +21 -54
- package/dist/index.js +8 -7
- package/dist/logger/category.js +6 -12
- package/dist/logger/configure.js +23 -34
- package/dist/migration/code-generation.js +146 -314
- package/dist/migration/index-where-predicate.js +52 -144
- package/dist/migration/migration-set.js +19 -33
- package/dist/migration/migrator.d.ts +2 -0
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +69 -53
- package/dist/migration/postgresql-schema-reader.js +126 -225
- package/dist/migration/slack-confirm.d.ts +1 -0
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +28 -38
- package/dist/migration/types.js +1 -1
- package/dist/naite/messaging-types.js +1 -1
- package/dist/naite/naite-reporter.js +15 -32
- package/dist/naite/naite.js +43 -76
- package/dist/ssr/index.js +6 -9
- package/dist/ssr/registry.js +10 -18
- package/dist/ssr/renderer.js +10 -21
- package/dist/ssr/types.js +1 -1
- package/dist/storage/base-file.js +5 -10
- package/dist/storage/buffered-file.js +3 -4
- package/dist/storage/drivers.js +2 -3
- package/dist/storage/index.js +2 -3
- package/dist/storage/s3-driver.js +5 -9
- package/dist/storage/storage-manager.js +5 -5
- package/dist/storage/types.js +1 -1
- package/dist/storage/uploaded-file.js +4 -6
- package/dist/stream/index.js +1 -2
- package/dist/stream/sse.js +8 -13
- package/dist/stream/ws-audience-resolver.js +5 -5
- package/dist/stream/ws-audience.js +3 -4
- package/dist/stream/ws-cluster-bus.js +3 -4
- package/dist/stream/ws-core.js +1 -1
- package/dist/stream/ws-delivery.js +11 -25
- package/dist/stream/ws-local-connection-store.js +9 -18
- package/dist/stream/ws-presence-store.js +43 -97
- package/dist/stream/ws-registry.js +17 -22
- package/dist/stream/ws-telemetry-memory.js +38 -45
- package/dist/stream/ws-telemetry-trace.js +4 -6
- package/dist/stream/ws-telemetry.js +82 -135
- package/dist/stream/ws.js +47 -91
- package/dist/syncer/api-parser.js +81 -147
- package/dist/syncer/checksum.js +9 -20
- package/dist/syncer/code-generator.js +29 -47
- package/dist/syncer/entity-operations.js +17 -27
- package/dist/syncer/event-batcher.js +8 -15
- package/dist/syncer/file-patterns.js +3 -4
- package/dist/syncer/file-tracking.js +6 -10
- package/dist/syncer/index.js +1 -2
- package/dist/syncer/module-loader.js +10 -26
- package/dist/syncer/syncer-actions.js +19 -37
- package/dist/syncer/syncer.js +46 -98
- package/dist/syncer/watcher.js +12 -26
- package/dist/tasks/decorator.js +7 -11
- package/dist/tasks/step-wrapper.js +7 -8
- package/dist/tasks/workflow-manager.js +18 -25
- package/dist/template/entity-converter.js +40 -64
- package/dist/template/helpers.js +32 -63
- package/dist/template/implementations/entity.template.js +7 -11
- package/dist/template/implementations/entry-server.template.js +2 -3
- package/dist/template/implementations/generated.template.js +25 -51
- package/dist/template/implementations/generated_http.template.js +31 -58
- package/dist/template/implementations/generated_sso.template.js +45 -85
- package/dist/template/implementations/init_types.template.js +4 -7
- package/dist/template/implementations/model.template.js +5 -10
- package/dist/template/implementations/model_test.template.js +2 -3
- package/dist/template/implementations/queries.template.js +4 -7
- package/dist/template/implementations/sd.template.js +17 -35
- package/dist/template/implementations/services.template.js +18 -30
- package/dist/template/implementations/view_form.template.js +72 -125
- package/dist/template/implementations/view_id_all_select.template.js +2 -3
- package/dist/template/implementations/view_list.template.js +86 -143
- package/dist/template/implementations/view_search_input.template.js +2 -3
- package/dist/template/index.js +5 -8
- package/dist/template/template-manager.js +13 -26
- package/dist/template/template-types.js +2 -3
- package/dist/template/template.js +7 -11
- package/dist/template/zod-converter.js +173 -348
- package/dist/testing/_relation-graph.js +18 -37
- package/dist/testing/bootstrap.js +5 -8
- package/dist/testing/data-explorer.js +34 -78
- package/dist/testing/dev-test-routes.js +54 -60
- package/dist/testing/dev-vitest-manager.js +33 -84
- package/dist/testing/faker-mappings.js +3 -4
- package/dist/testing/fixture-generator.d.ts +2 -1
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +159 -321
- package/dist/testing/fixture-loader.js +2 -2
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +124 -227
- package/dist/testing/global-setup.d.ts.map +1 -1
- package/dist/testing/global-setup.js +29 -17
- package/dist/testing/index.js +1 -2
- package/dist/testing/naite-vitest-reporter.js +2 -3
- package/dist/testing/parallel-db-manager.js +5 -3
- package/dist/testing/vitest-helpers.d.ts.map +1 -1
- package/dist/testing/vitest-helpers.js +15 -12
- package/dist/types/types.d.ts +14 -14
- package/dist/types/types.js +27 -50
- package/dist/ui/ai-api.js +6 -11
- package/dist/ui/ai-client.js +86 -134
- package/dist/ui/api.js +99 -195
- package/dist/ui/cdd-service.js +78 -130
- package/dist/ui/cdd-types.js +1 -1
- package/dist/ui-web/assets/{index-Df8q-fhb.js → index-DFStGyd0.js} +49 -49
- package/dist/ui-web/assets/index-Dx4ap5i4.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/async-utils.js +13 -25
- package/dist/utils/class-name.js +3 -4
- package/dist/utils/console-util.js +11 -26
- package/dist/utils/controller.d.ts.map +1 -1
- package/dist/utils/controller.js +14 -12
- package/dist/utils/esm-utils.js +5 -8
- package/dist/utils/formatter.js +10 -22
- package/dist/utils/fs-utils.js +14 -25
- package/dist/utils/lodash-able.js +3 -4
- package/dist/utils/model.js +7 -14
- package/dist/utils/object-utils.js +41 -73
- package/dist/utils/path-utils.js +5 -9
- package/dist/utils/process-utils.js +4 -7
- package/dist/utils/sql-parser.js +6 -13
- package/dist/utils/type-utils.js +16 -26
- package/dist/utils/utils.js +18 -40
- package/dist/utils/zod-error.js +9 -16
- package/dist/vector/chunking.js +24 -37
- package/dist/vector/config.js +2 -2
- package/dist/vector/embedding.js +8 -19
- package/dist/vector/index.js +1 -2
- package/dist/vector/types.js +1 -1
- package/package.json +6 -6
- package/src/__tests__/env.test.ts +127 -0
- package/src/api/__tests__/config.test.ts +10 -1
- package/src/api/config.ts +4 -12
- package/src/api/sonamu.ts +14 -4
- package/src/bin/__tests__/migrate-targets.test.ts +28 -0
- package/src/bin/__tests__/test-command.test.ts +82 -1
- package/src/bin/cli.ts +9 -18
- package/src/bin/fixture.ts +5 -4
- package/src/bin/migrate-targets.ts +7 -0
- package/src/bin/test-command.ts +2 -2
- package/src/database/__tests__/db.test.ts +175 -0
- package/src/database/db.ts +193 -71
- package/src/dict/en.ts +2 -0
- package/src/dict/ko.ts +2 -0
- package/src/env.ts +123 -0
- package/src/migration/__tests__/migrator.test.ts +149 -0
- package/src/migration/migrator.ts +74 -17
- package/src/migration/slack-confirm.ts +21 -0
- package/src/skills/sonamu/database.md +1 -1
- package/src/skills/sonamu/testing-devrunner.md +1 -1
- package/src/stream/ws-telemetry-memory.ts +2 -2
- package/src/testing/fixture-generator.ts +2 -1
- package/src/testing/fixture-manager.ts +3 -4
- package/src/testing/global-setup.ts +42 -18
- package/src/testing/vitest-helpers.ts +14 -0
- package/src/utils/controller.ts +14 -7
- package/tsdown.api.config.ts +6 -0
- package/dist/_virtual/rolldown_runtime.js +0 -39
- package/dist/ui-web/assets/index-D4rYm-Xz.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-confirm.d.ts","sourceRoot":"","sources":["../../src/migration/slack-confirm.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,gBAAgB,GAAG,OAAO,CAAC;IACzE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA8B;IAE5C;;OAEG;IACH,YAAY,IAAI,OAAO;
|
|
1
|
+
{"version":3,"file":"slack-confirm.d.ts","sourceRoot":"","sources":["../../src/migration/slack-confirm.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,gBAAgB,GAAG,OAAO,CAAC;IACzE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA8B;IAE5C,OAAO,CAAC,yBAAyB;IAkBjC;;OAEG;IACH,YAAY,IAAI,OAAO;IAKvB;;OAEG;IACH,wBAAwB,CAAC,MAAM,EAAE,MAAM,cAAc,GAAG,OAAO;IAK/D;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM;IAK/C;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACG,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAgB/F;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnF;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACG,mBAAmB,CACvB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAsC3C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,GACT,OAAO,CAAC;QACT,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IA0CF;;OAEG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAyChB;;OAEG;IACG,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,eAAe,EACxB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;CAmCjB"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { SD, init_sd } from "../dict/sd.js";
|
|
3
3
|
import { Sonamu, init_sonamu } from "../api/sonamu.js";
|
|
4
4
|
import assert from "assert";
|
|
5
|
+
import path from "path";
|
|
5
6
|
import crypto from "crypto";
|
|
6
7
|
import fs from "fs/promises";
|
|
7
|
-
import path from "path";
|
|
8
8
|
import os from "os";
|
|
9
|
-
|
|
10
9
|
//#region src/migration/slack-confirm.ts
|
|
11
10
|
var SlackConfirm;
|
|
12
11
|
var init_slack_confirm = __esmMin((() => {
|
|
@@ -14,16 +13,24 @@ var init_slack_confirm = __esmMin((() => {
|
|
|
14
13
|
init_sd();
|
|
15
14
|
SlackConfirm = class {
|
|
16
15
|
config = Sonamu.config.slackConfirm;
|
|
16
|
+
validateConfiguredTargets() {
|
|
17
|
+
if (!this.config) return;
|
|
18
|
+
const validTargets = Object.keys(Sonamu.dbConfig);
|
|
19
|
+
const invalidTargets = this.config.targets.filter((target) => !validTargets.includes(target));
|
|
20
|
+
if (invalidTargets.length > 0) assert.fail(SD("sonamu.error.slackConfirmInvalidTargets")(invalidTargets.join(", "), validTargets.join(", ")));
|
|
21
|
+
}
|
|
17
22
|
/**
|
|
18
23
|
* 설정이 있는지 확인합니다.
|
|
19
24
|
*/
|
|
20
25
|
isConfigured() {
|
|
26
|
+
this.validateConfiguredTargets();
|
|
21
27
|
return !!(this.config?.botToken && this.config?.channelId);
|
|
22
28
|
}
|
|
23
29
|
/**
|
|
24
30
|
* 해당 target이 승인 대상인지 확인합니다.
|
|
25
31
|
*/
|
|
26
32
|
isTargetRequiresApproval(target) {
|
|
33
|
+
this.validateConfiguredTargets();
|
|
27
34
|
return this.config?.targets?.includes(target) ?? false;
|
|
28
35
|
}
|
|
29
36
|
/**
|
|
@@ -46,14 +53,11 @@ var init_slack_confirm = __esmMin((() => {
|
|
|
46
53
|
const hash = this.getMigrationsHash(migrations);
|
|
47
54
|
const filePath = this.getConfirmFilePath(hash);
|
|
48
55
|
try {
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
ts
|
|
55
|
-
};
|
|
56
|
-
}
|
|
56
|
+
const [channel, ts] = (await fs.readFile(filePath, "utf-8")).trim().split(":");
|
|
57
|
+
if (channel && ts) return {
|
|
58
|
+
channel,
|
|
59
|
+
ts
|
|
60
|
+
};
|
|
57
61
|
return null;
|
|
58
62
|
} catch {
|
|
59
63
|
return null;
|
|
@@ -78,6 +82,7 @@ var init_slack_confirm = __esmMin((() => {
|
|
|
78
82
|
*/
|
|
79
83
|
async postApprovalRequest(migrations, targets, requestor) {
|
|
80
84
|
assert(this.config, SD("sonamu.error.slackConfirmNotConfigured"));
|
|
85
|
+
this.validateConfiguredTargets();
|
|
81
86
|
const response = await fetch("https://slack.com/api/chat.postMessage", {
|
|
82
87
|
method: "POST",
|
|
83
88
|
headers: {
|
|
@@ -91,13 +96,9 @@ var init_slack_confirm = __esmMin((() => {
|
|
|
91
96
|
unfurl_media: false
|
|
92
97
|
})
|
|
93
98
|
});
|
|
94
|
-
if (!response.ok) {
|
|
95
|
-
throw new Error(`Slack API HTTP error: ${response.status}`);
|
|
96
|
-
}
|
|
99
|
+
if (!response.ok) throw new Error(`Slack API HTTP error: ${response.status}`);
|
|
97
100
|
const data = await response.json();
|
|
98
|
-
if (!data.ok) {
|
|
99
|
-
throw new Error(`Slack API error: ${data.error}`);
|
|
100
|
-
}
|
|
101
|
+
if (!data.ok) throw new Error(`Slack API error: ${data.error}`);
|
|
101
102
|
return {
|
|
102
103
|
channel: data.channel,
|
|
103
104
|
ts: data.ts
|
|
@@ -108,13 +109,12 @@ var init_slack_confirm = __esmMin((() => {
|
|
|
108
109
|
*/
|
|
109
110
|
buildMessageText(migrations, targets, requestor) {
|
|
110
111
|
const projectName = Sonamu.config.projectName ?? "Unknown";
|
|
111
|
-
const timestamp = new Date().toLocaleString("ko-KR", { timeZone: "Asia/Seoul" });
|
|
112
|
+
const timestamp = (/* @__PURE__ */ new Date()).toLocaleString("ko-KR", { timeZone: "Asia/Seoul" });
|
|
112
113
|
const migrationsText = migrations.map((m) => `• ${m}`).join("\n");
|
|
113
|
-
const targetsText = targets.join(", ");
|
|
114
114
|
return `🗄️ *[${projectName}] Production 마이그레이션 승인 요청*
|
|
115
115
|
|
|
116
116
|
*요청자:* ${requestor}
|
|
117
|
-
*대상 DB:* ${
|
|
117
|
+
*대상 DB:* ${targets.join(", ")}
|
|
118
118
|
*시간:* ${timestamp}
|
|
119
119
|
|
|
120
120
|
*적용 예정 마이그레이션:*
|
|
@@ -129,13 +129,9 @@ ${migrationsText}`;
|
|
|
129
129
|
method: "GET",
|
|
130
130
|
headers: { Authorization: `Bearer ${this.config.botToken}` }
|
|
131
131
|
});
|
|
132
|
-
if (!response.ok) {
|
|
133
|
-
throw new Error(`Slack API HTTP error: ${response.status}`);
|
|
134
|
-
}
|
|
132
|
+
if (!response.ok) throw new Error(`Slack API HTTP error: ${response.status}`);
|
|
135
133
|
const data = await response.json();
|
|
136
|
-
if (!data.ok) {
|
|
137
|
-
throw new Error(`Slack API error: ${data.error}`);
|
|
138
|
-
}
|
|
134
|
+
if (!data.ok) throw new Error(`Slack API error: ${data.error}`);
|
|
139
135
|
const reactions = data.message?.reactions ?? [];
|
|
140
136
|
const approved = reactions.find((r) => r.name === "white_check_mark");
|
|
141
137
|
const rejected = reactions.find((r) => r.name === "x");
|
|
@@ -163,9 +159,7 @@ ${migrationsText}`;
|
|
|
163
159
|
name: "white_check_mark"
|
|
164
160
|
})
|
|
165
161
|
});
|
|
166
|
-
if (!addReactionResponse.ok) {
|
|
167
|
-
throw new Error(`Slack API HTTP error: ${addReactionResponse.status}`);
|
|
168
|
-
}
|
|
162
|
+
if (!addReactionResponse.ok) throw new Error(`Slack API HTTP error: ${addReactionResponse.status}`);
|
|
169
163
|
const postMessageResponse = await fetch("https://slack.com/api/chat.postMessage", {
|
|
170
164
|
method: "POST",
|
|
171
165
|
headers: {
|
|
@@ -178,9 +172,7 @@ ${migrationsText}`;
|
|
|
178
172
|
text: `⚠️ *Force 승인*\n요청자: ${actualRequestor}\n사유: ${reason}`
|
|
179
173
|
})
|
|
180
174
|
});
|
|
181
|
-
if (!postMessageResponse.ok) {
|
|
182
|
-
throw new Error(`Slack API HTTP error: ${postMessageResponse.status}`);
|
|
183
|
-
}
|
|
175
|
+
if (!postMessageResponse.ok) throw new Error(`Slack API HTTP error: ${postMessageResponse.status}`);
|
|
184
176
|
}
|
|
185
177
|
/**
|
|
186
178
|
* 실행 완료 로그를 남깁니다.
|
|
@@ -189,7 +181,7 @@ ${migrationsText}`;
|
|
|
189
181
|
const config = this.config;
|
|
190
182
|
assert(config, SD("sonamu.error.slackConfirmNotConfigured"));
|
|
191
183
|
const actualRequestor = requestor ?? this.getRequestor();
|
|
192
|
-
const timestamp = new Date().toLocaleString("ko-KR", { timeZone: "Asia/Seoul" });
|
|
184
|
+
const timestamp = (/* @__PURE__ */ new Date()).toLocaleString("ko-KR", { timeZone: "Asia/Seoul" });
|
|
193
185
|
const appliedText = results.length > 0 ? results.filter((r) => r.applied.length > 0).map((r) => `[${r.connKey}]\n${r.applied.map((m) => `• ${m}`).join("\n")}`).join("\n\n") : "(없음)";
|
|
194
186
|
const response = await fetch("https://slack.com/api/chat.postMessage", {
|
|
195
187
|
method: "POST",
|
|
@@ -203,14 +195,12 @@ ${migrationsText}`;
|
|
|
203
195
|
text: `✅ *마이그레이션 실행 완료*\n실행자: ${actualRequestor}\n시간: ${timestamp}\n\n적용됨:\n${appliedText}`
|
|
204
196
|
})
|
|
205
197
|
});
|
|
206
|
-
if (!response.ok) {
|
|
207
|
-
throw new Error(`Slack API HTTP error: ${response.status}`);
|
|
208
|
-
}
|
|
198
|
+
if (!response.ok) throw new Error(`Slack API HTTP error: ${response.status}`);
|
|
209
199
|
}
|
|
210
200
|
};
|
|
211
201
|
}));
|
|
212
|
-
|
|
213
202
|
//#endregion
|
|
214
203
|
init_slack_confirm();
|
|
215
204
|
export { SlackConfirm, init_slack_confirm };
|
|
216
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stY29uZmlybS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlncmF0aW9uL3NsYWNrLWNvbmZpcm0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi9kaWN0L3NkXCI7XG5pbXBvcnQgeyB0eXBlIE1pZ3JhdGlvblJlc3VsdCB9IGZyb20gXCIuL21pZ3JhdG9yXCI7XG5cbmV4cG9ydCB0eXBlIFNsYWNrQ29uZmlybVJlc3VsdCA9IHtcbiAgc3RhdHVzOiBcImFwcHJvdmVkXCIgfCBcInJlamVjdGVkXCIgfCBcInBlbmRpbmdcIiB8IFwibm90X2NvbmZpZ3VyZWRcIiB8IFwiZXJyb3JcIjtcbiAgdHM/OiBzdHJpbmc7XG4gIGNoYW5uZWw/OiBzdHJpbmc7XG4gIGVycm9yPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdCA9IHtcbiAgdHlwZTogXCJwZW5kaW5nXCI7XG4gIGNoYW5uZWw6IHN0cmluZztcbiAgdHM6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBTbGFja0NvbmZpcm0ge1xuICBwcml2YXRlIGNvbmZpZyA9IFNvbmFtdS5jb25maWcuc2xhY2tDb25maXJtO1xuXG4gIC8qKlxuICAgKiDshKTsoJXsnbQg7J6I64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICovXG4gIGlzQ29uZmlndXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5jb25maWc/LmJvdFRva2VuICYmIHRoaXMuY29uZmlnPy5jaGFubmVsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VtOuLuSB0YXJnZXTsnbQg7Iq57J24IOuMgOyDgeyduOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqL1xuICBpc1RhcmdldFJlcXVpcmVzQXBwcm92YWwodGFyZ2V0OiBrZXlvZiBTb25hbXVEQkNvbmZpZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZz8udGFyZ2V0cz8uaW5jbHVkZXModGFyZ2V0KSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrp4jsnbTqt7jroIjsnbTshZgg66qp66Gd7J2YIO2VtOyLnOulvCDsg53shLHtlanri4jri6QuXG4gICAqL1xuICBnZXRNaWdyYXRpb25zSGFzaChtaWdyYXRpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc29ydGVkID0gWy4uLm1pZ3JhdGlvbnNdLnRvU29ydGVkKCk7XG4gICAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKFwibWQ1XCIpLnVwZGF0ZShzb3J0ZWQuam9pbihcIixcIikpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCAxMik7XG4gIH1cblxuICAvKipcbiAgICog66Gc7LusIO2MjOydvCDqsr3roZzrpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb25maXJtRmlsZVBhdGgoaGFzaDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJtaWdyYXRpb25zXCIsIGAuc2xhY2stY29uZmlybS0ke2hhc2h9YCk7XG4gIH1cblxuICAvKipcbiAgICog6riw7KG0IOyKueyduCDsmpTssq3snYQg7KGw7ZqM7ZWp64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZ2V0RXhpc3RpbmdSZXF1ZXN0KG1pZ3JhdGlvbnM6IHN0cmluZ1tdKTogUHJvbWlzZTx7IGNoYW5uZWw6IHN0cmluZzsgdHM6IHN0cmluZyB9IHwgbnVsbD4ge1xuICAgIGNvbnN0IGhhc2ggPSB0aGlzLmdldE1pZ3JhdGlvbnNIYXNoKG1pZ3JhdGlvbnMpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gdGhpcy5nZXRDb25maXJtRmlsZVBhdGgoaGFzaCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCBcInV0Zi04XCIpO1xuICAgICAgY29uc3QgW2NoYW5uZWwsIHRzXSA9IGNvbnRlbnQudHJpbSgpLnNwbGl0KFwiOlwiKTtcbiAgICAgIGlmIChjaGFubmVsICYmIHRzKSB7XG4gICAgICAgIHJldHVybiB7IGNoYW5uZWwsIHRzIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDsirnsnbgg7JqU7LKt7J2EIOyggOyepe2VqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIHNhdmVSZXF1ZXN0KG1pZ3JhdGlvbnM6IHN0cmluZ1tdLCBjaGFubmVsOiBzdHJpbmcsIHRzOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBoYXNoID0gdGhpcy5nZXRNaWdyYXRpb25zSGFzaChtaWdyYXRpb25zKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHRoaXMuZ2V0Q29uZmlybUZpbGVQYXRoKGhhc2gpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgYCR7Y2hhbm5lbH06JHt0c31gLCBcInV0Zi04XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2YhOyerCDsgqzsmqnsnpAg7J2066aE7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0UmVxdWVzdG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LlVTRVIgPz8gb3MudXNlckluZm8oKS51c2VybmFtZSA/PyBcIlVua25vd25cIjtcbiAgfVxuXG4gIC8qKlxuICAgKiDsiqzrnpkg66mU7Iuc7KeA66W8IOuwnOyGoe2VqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIHBvc3RBcHByb3ZhbFJlcXVlc3QoXG4gICAgbWlncmF0aW9uczogc3RyaW5nW10sXG4gICAgdGFyZ2V0czogc3RyaW5nW10sXG4gICAgcmVxdWVzdG9yPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgY2hhbm5lbDogc3RyaW5nOyB0czogc3RyaW5nIH0+IHtcbiAgICBhc3NlcnQodGhpcy5jb25maWcsIFNEKFwic29uYW11LmVycm9yLnNsYWNrQ29uZmlybU5vdENvbmZpZ3VyZWRcIikpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vc2xhY2suY29tL2FwaS9jaGF0LnBvc3RNZXNzYWdlXCIsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy5ib3RUb2tlbn1gLFxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGNoYW5uZWw6IHRoaXMuY29uZmlnLmNoYW5uZWxJZCxcbiAgICAgICAgdGV4dDogdGhpcy5idWlsZE1lc3NhZ2VUZXh0KG1pZ3JhdGlvbnMsIHRhcmdldHMsIHJlcXVlc3RvciA/PyB0aGlzLmdldFJlcXVlc3RvcigpKSxcbiAgICAgICAgdW5mdXJsX2xpbmtzOiBmYWxzZSxcbiAgICAgICAgdW5mdXJsX21lZGlhOiBmYWxzZSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbGFjayBBUEkgSFRUUCBlcnJvcjogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHtcbiAgICAgIG9rOiBib29sZWFuO1xuICAgICAgZXJyb3I/OiBzdHJpbmc7XG4gICAgICBjaGFubmVsOiBzdHJpbmc7XG4gICAgICB0czogc3RyaW5nO1xuICAgIH07XG4gICAgaWYgKCFkYXRhLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNsYWNrIEFQSSBlcnJvcjogJHtkYXRhLmVycm9yfWApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjaGFubmVsOiBkYXRhLmNoYW5uZWwsXG4gICAgICB0czogZGF0YS50cyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOuplOyLnOyngCDthY3siqTtirjrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE1lc3NhZ2VUZXh0KG1pZ3JhdGlvbnM6IHN0cmluZ1tdLCB0YXJnZXRzOiBzdHJpbmdbXSwgcmVxdWVzdG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByb2plY3ROYW1lID0gU29uYW11LmNvbmZpZy5wcm9qZWN0TmFtZSA/PyBcIlVua25vd25cIjtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKFwia28tS1JcIiwge1xuICAgICAgdGltZVpvbmU6IFwiQXNpYS9TZW91bFwiLFxuICAgIH0pO1xuICAgIGNvbnN0IG1pZ3JhdGlvbnNUZXh0ID0gbWlncmF0aW9ucy5tYXAoKG0pID0+IGDigKIgJHttfWApLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3QgdGFyZ2V0c1RleHQgPSB0YXJnZXRzLmpvaW4oXCIsIFwiKTtcblxuICAgIHJldHVybiBg8J+XhO+4jyAqWyR7cHJvamVjdE5hbWV9XSBQcm9kdWN0aW9uIOuniOydtOq3uOugiOydtOyFmCDsirnsnbgg7JqU7LKtKlxuXG4q7JqU7LKt7J6QOiogJHtyZXF1ZXN0b3J9XG4q64yA7IOBIERCOiogJHt0YXJnZXRzVGV4dH1cbirsi5zqsIQ6KiAke3RpbWVzdGFtcH1cblxuKuyggeyaqSDsmIjsoJUg66eI7J206re466CI7J207IWYOipcbiR7bWlncmF0aW9uc1RleHR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsirnsnbgg7IOB7YOc66W8IO2ZleyduO2VqeuLiOuLpCAocmVhY3Rpb25zLmdldCkuXG4gICAqL1xuICBhc3luYyBjaGVja0FwcHJvdmFsKFxuICAgIGNoYW5uZWw6IHN0cmluZyxcbiAgICB0czogc3RyaW5nLFxuICApOiBQcm9taXNlPHtcbiAgICBhcHByb3ZlZDogYm9vbGVhbjtcbiAgICByZWplY3RlZDogYm9vbGVhbjtcbiAgICBhcHByb3Zlcj86IHN0cmluZztcbiAgfT4ge1xuICAgIGFzc2VydCh0aGlzLmNvbmZpZywgU0QoXCJzb25hbXUuZXJyb3Iuc2xhY2tDb25maXJtTm90Q29uZmlndXJlZFwiKSk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgYGh0dHBzOi8vc2xhY2suY29tL2FwaS9yZWFjdGlvbnMuZ2V0P2NoYW5uZWw9JHtjaGFubmVsfSZ0aW1lc3RhbXA9JHt0c31gLFxuICAgICAge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5jb25maWcuYm90VG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2xhY2sgQVBJIEhUVFAgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7XG4gICAgICBvazogYm9vbGVhbjtcbiAgICAgIGVycm9yPzogc3RyaW5nO1xuICAgICAgbWVzc2FnZT86IHtcbiAgICAgICAgcmVhY3Rpb25zPzogQXJyYXk8e1xuICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICB1c2Vycz86IHN0cmluZ1tdO1xuICAgICAgICB9PjtcbiAgICAgIH07XG4gICAgfTtcbiAgICBpZiAoIWRhdGEub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2xhY2sgQVBJIGVycm9yOiAke2RhdGEuZXJyb3J9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVhY3Rpb25zID0gZGF0YS5tZXNzYWdlPy5yZWFjdGlvbnMgPz8gW107XG4gICAgY29uc3QgYXBwcm92ZWQgPSByZWFjdGlvbnMuZmluZCgocikgPT4gci5uYW1lID09PSBcIndoaXRlX2NoZWNrX21hcmtcIik7XG4gICAgY29uc3QgcmVqZWN0ZWQgPSByZWFjdGlvbnMuZmluZCgocikgPT4gci5uYW1lID09PSBcInhcIik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXBwcm92ZWQ6ICEhYXBwcm92ZWQsXG4gICAgICByZWplY3RlZDogISFyZWplY3RlZCxcbiAgICAgIGFwcHJvdmVyOiBhcHByb3ZlZD8udXNlcnM/LlswXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlIOyKueyduCDsspjrpqzrpbwg7IiY7ZaJ7ZWp64uI64ukICjrs7jsnbjsnbQg4pyFIOywjeqzoCDsiqTroIjrk5zsl5Ag7IKs7JygIOuCqOq5gCkuXG4gICAqL1xuICBhc3luYyBmb3JjZUFwcHJvdmFsKFxuICAgIGNoYW5uZWw6IHN0cmluZyxcbiAgICB0czogc3RyaW5nLFxuICAgIHJlYXNvbjogc3RyaW5nLFxuICAgIHJlcXVlc3Rvcj86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXNzZXJ0KHRoaXMuY29uZmlnLCBTRChcInNvbmFtdS5lcnJvci5zbGFja0NvbmZpcm1Ob3RDb25maWd1cmVkXCIpKTtcbiAgICBjb25zdCBhY3R1YWxSZXF1ZXN0b3IgPSByZXF1ZXN0b3IgPz8gdGhpcy5nZXRSZXF1ZXN0b3IoKTtcblxuICAgIC8vIDEuIOKchSDsnbTrqqjsp4Ag7LaU6rCAXG4gICAgY29uc3QgYWRkUmVhY3Rpb25SZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9zbGFjay5jb20vYXBpL3JlYWN0aW9ucy5hZGRcIiwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuY29uZmlnLmJvdFRva2VufWAsXG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgdGltZXN0YW1wOiB0cyxcbiAgICAgICAgbmFtZTogXCJ3aGl0ZV9jaGVja19tYXJrXCIsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGlmICghYWRkUmVhY3Rpb25SZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbGFjayBBUEkgSFRUUCBlcnJvcjogJHthZGRSZWFjdGlvblJlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICAvLyAyLiDsiqTroIjrk5zsl5Ag7IKs7JygIOuCqOq5gFxuICAgIGNvbnN0IHBvc3RNZXNzYWdlUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vc2xhY2suY29tL2FwaS9jaGF0LnBvc3RNZXNzYWdlXCIsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy5ib3RUb2tlbn1gLFxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGNoYW5uZWwsXG4gICAgICAgIHRocmVhZF90czogdHMsXG4gICAgICAgIHRleHQ6IGDimqDvuI8gKkZvcmNlIOyKueyduCpcXG7smpTssq3snpA6ICR7YWN0dWFsUmVxdWVzdG9yfVxcbuyCrOycoDogJHtyZWFzb259YCxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgaWYgKCFwb3N0TWVzc2FnZVJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNsYWNrIEFQSSBIVFRQIGVycm9yOiAke3Bvc3RNZXNzYWdlUmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDsi6Ttlokg7JmE66OMIOuhnOq3uOulvCDrgqjquYHri4jri6QuXG4gICAqL1xuICBhc3luYyBsb2dFeGVjdXRpb24oXG4gICAgY2hhbm5lbDogc3RyaW5nLFxuICAgIHRzOiBzdHJpbmcsXG4gICAgcmVzdWx0czogTWlncmF0aW9uUmVzdWx0LFxuICAgIHJlcXVlc3Rvcj86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgYXNzZXJ0KGNvbmZpZywgU0QoXCJzb25hbXUuZXJyb3Iuc2xhY2tDb25maXJtTm90Q29uZmlndXJlZFwiKSk7XG5cbiAgICBjb25zdCBhY3R1YWxSZXF1ZXN0b3IgPSByZXF1ZXN0b3IgPz8gdGhpcy5nZXRSZXF1ZXN0b3IoKTtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKFwia28tS1JcIiwge1xuICAgICAgdGltZVpvbmU6IFwiQXNpYS9TZW91bFwiLFxuICAgIH0pO1xuXG4gICAgLy8gRELrs4TroZwg6re466O57ZmU7ZWY7JesIO2RnOyLnO2VqeuLiOuLpC5cbiAgICBjb25zdCBhcHBsaWVkVGV4dCA9XG4gICAgICByZXN1bHRzLmxlbmd0aCA+IDBcbiAgICAgICAgPyByZXN1bHRzXG4gICAgICAgICAgICAuZmlsdGVyKChyKSA9PiByLmFwcGxpZWQubGVuZ3RoID4gMClcbiAgICAgICAgICAgIC5tYXAoKHIpID0+IGBbJHtyLmNvbm5LZXl9XVxcbiR7ci5hcHBsaWVkLm1hcCgobSkgPT4gYOKAoiAke219YCkuam9pbihcIlxcblwiKX1gKVxuICAgICAgICAgICAgLmpvaW4oXCJcXG5cXG5cIilcbiAgICAgICAgOiBcIijsl4bsnYwpXCI7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9zbGFjay5jb20vYXBpL2NoYXQucG9zdE1lc3NhZ2VcIiwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2NvbmZpZy5ib3RUb2tlbn1gLFxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGNoYW5uZWwsXG4gICAgICAgIHRocmVhZF90czogdHMsXG4gICAgICAgIHRleHQ6IGDinIUgKuuniOydtOq3uOugiOydtOyFmCDsi6Ttlokg7JmE66OMKlxcbuyLpO2WieyekDogJHthY3R1YWxSZXF1ZXN0b3J9XFxu7Iuc6rCEOiAke3RpbWVzdGFtcH1cXG5cXG7soIHsmqnrkKg6XFxuJHthcHBsaWVkVGV4dH1gLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNsYWNrIEFQSSBIVFRQIGVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O2NBTXVDO1VBRVA7Q0FnQm5CLGVBQWIsTUFBMEI7RUFDeEIsQUFBUSxTQUFTLE9BQU8sT0FBTzs7OztFQUsvQixlQUF3QjtBQUN0QixVQUFPLENBQUMsRUFBRSxLQUFLLFFBQVEsWUFBWSxLQUFLLFFBQVE7Ozs7O0VBTWxELHlCQUF5QixRQUF1QztBQUM5RCxVQUFPLEtBQUssUUFBUSxT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
|
|
205
|
+
|
|
206
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stY29uZmlybS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlncmF0aW9uL3NsYWNrLWNvbmZpcm0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi9kaWN0L3NkXCI7XG5pbXBvcnQgeyB0eXBlIE1pZ3JhdGlvblJlc3VsdCB9IGZyb20gXCIuL21pZ3JhdG9yXCI7XG5cbmV4cG9ydCB0eXBlIFNsYWNrQ29uZmlybVJlc3VsdCA9IHtcbiAgc3RhdHVzOiBcImFwcHJvdmVkXCIgfCBcInJlamVjdGVkXCIgfCBcInBlbmRpbmdcIiB8IFwibm90X2NvbmZpZ3VyZWRcIiB8IFwiZXJyb3JcIjtcbiAgdHM/OiBzdHJpbmc7XG4gIGNoYW5uZWw/OiBzdHJpbmc7XG4gIGVycm9yPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdCA9IHtcbiAgdHlwZTogXCJwZW5kaW5nXCI7XG4gIGNoYW5uZWw6IHN0cmluZztcbiAgdHM6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBTbGFja0NvbmZpcm0ge1xuICBwcml2YXRlIGNvbmZpZyA9IFNvbmFtdS5jb25maWcuc2xhY2tDb25maXJtO1xuXG4gIHByaXZhdGUgdmFsaWRhdGVDb25maWd1cmVkVGFyZ2V0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRUYXJnZXRzID0gT2JqZWN0LmtleXMoU29uYW11LmRiQ29uZmlnKTtcbiAgICBjb25zdCBpbnZhbGlkVGFyZ2V0cyA9IHRoaXMuY29uZmlnLnRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+ICF2YWxpZFRhcmdldHMuaW5jbHVkZXModGFyZ2V0KSk7XG5cbiAgICBpZiAoaW52YWxpZFRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgICAgYXNzZXJ0LmZhaWwoXG4gICAgICAgIFNEKFwic29uYW11LmVycm9yLnNsYWNrQ29uZmlybUludmFsaWRUYXJnZXRzXCIpKFxuICAgICAgICAgIGludmFsaWRUYXJnZXRzLmpvaW4oXCIsIFwiKSxcbiAgICAgICAgICB2YWxpZFRhcmdldHMuam9pbihcIiwgXCIpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7ISk7KCV7J20IOyeiOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqL1xuICBpc0NvbmZpZ3VyZWQoKTogYm9vbGVhbiB7XG4gICAgdGhpcy52YWxpZGF0ZUNvbmZpZ3VyZWRUYXJnZXRzKCk7XG4gICAgcmV0dXJuICEhKHRoaXMuY29uZmlnPy5ib3RUb2tlbiAmJiB0aGlzLmNvbmZpZz8uY2hhbm5lbElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlbTri7kgdGFyZ2V07J20IOyKueyduCDrjIDsg4Hsnbjsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKi9cbiAgaXNUYXJnZXRSZXF1aXJlc0FwcHJvdmFsKHRhcmdldDoga2V5b2YgU29uYW11REJDb25maWcpOiBib29sZWFuIHtcbiAgICB0aGlzLnZhbGlkYXRlQ29uZmlndXJlZFRhcmdldHMoKTtcbiAgICByZXR1cm4gdGhpcy5jb25maWc/LnRhcmdldHM/LmluY2x1ZGVzKHRhcmdldCkgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICog66eI7J206re466CI7J207IWYIOuqqeuhneydmCDtlbTsi5zrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0TWlncmF0aW9uc0hhc2gobWlncmF0aW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5taWdyYXRpb25zXS50b1NvcnRlZCgpO1xuICAgIHJldHVybiBjcnlwdG8uY3JlYXRlSGFzaChcIm1kNVwiKS51cGRhdGUoc29ydGVkLmpvaW4oXCIsXCIpKS5kaWdlc3QoXCJoZXhcIikuc2xpY2UoMCwgMTIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOuhnOy7rCDtjIzsnbwg6rK966Gc66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0Q29uZmlybUZpbGVQYXRoKGhhc2g6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwibWlncmF0aW9uc1wiLCBgLnNsYWNrLWNvbmZpcm0tJHtoYXNofWApO1xuICB9XG5cbiAgLyoqXG4gICAqIOq4sOyhtCDsirnsnbgg7JqU7LKt7J2EIOyhsO2ajO2VqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGdldEV4aXN0aW5nUmVxdWVzdChtaWdyYXRpb25zOiBzdHJpbmdbXSk6IFByb21pc2U8eyBjaGFubmVsOiBzdHJpbmc7IHRzOiBzdHJpbmcgfSB8IG51bGw+IHtcbiAgICBjb25zdCBoYXNoID0gdGhpcy5nZXRNaWdyYXRpb25zSGFzaChtaWdyYXRpb25zKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHRoaXMuZ2V0Q29uZmlybUZpbGVQYXRoKGhhc2gpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICAgIGNvbnN0IFtjaGFubmVsLCB0c10gPSBjb250ZW50LnRyaW0oKS5zcGxpdChcIjpcIik7XG4gICAgICBpZiAoY2hhbm5lbCAmJiB0cykge1xuICAgICAgICByZXR1cm4geyBjaGFubmVsLCB0cyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7Iq57J24IOyalOyyreydhCDsoIDsnqXtlanri4jri6QuXG4gICAqL1xuICBhc3luYyBzYXZlUmVxdWVzdChtaWdyYXRpb25zOiBzdHJpbmdbXSwgY2hhbm5lbDogc3RyaW5nLCB0czogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGFzaCA9IHRoaXMuZ2V0TWlncmF0aW9uc0hhc2gobWlncmF0aW9ucyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmdldENvbmZpcm1GaWxlUGF0aChoYXNoKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIGAke2NoYW5uZWx9OiR7dHN9YCwgXCJ1dGYtOFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtmITsnqwg7IKs7Jqp7J6QIOydtOumhOydhCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGdldFJlcXVlc3RvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5VU0VSID8/IG9zLnVzZXJJbmZvKCkudXNlcm5hbWUgPz8gXCJVbmtub3duXCI7XG4gIH1cblxuICAvKipcbiAgICog7Iqs656ZIOuplOyLnOyngOulvCDrsJzshqHtlanri4jri6QuXG4gICAqL1xuICBhc3luYyBwb3N0QXBwcm92YWxSZXF1ZXN0KFxuICAgIG1pZ3JhdGlvbnM6IHN0cmluZ1tdLFxuICAgIHRhcmdldHM6IHN0cmluZ1tdLFxuICAgIHJlcXVlc3Rvcj86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IGNoYW5uZWw6IHN0cmluZzsgdHM6IHN0cmluZyB9PiB7XG4gICAgYXNzZXJ0KHRoaXMuY29uZmlnLCBTRChcInNvbmFtdS5lcnJvci5zbGFja0NvbmZpcm1Ob3RDb25maWd1cmVkXCIpKTtcbiAgICB0aGlzLnZhbGlkYXRlQ29uZmlndXJlZFRhcmdldHMoKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCJodHRwczovL3NsYWNrLmNvbS9hcGkvY2hhdC5wb3N0TWVzc2FnZVwiLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5jb25maWcuYm90VG9rZW59YCxcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjaGFubmVsOiB0aGlzLmNvbmZpZy5jaGFubmVsSWQsXG4gICAgICAgIHRleHQ6IHRoaXMuYnVpbGRNZXNzYWdlVGV4dChtaWdyYXRpb25zLCB0YXJnZXRzLCByZXF1ZXN0b3IgPz8gdGhpcy5nZXRSZXF1ZXN0b3IoKSksXG4gICAgICAgIHVuZnVybF9saW5rczogZmFsc2UsXG4gICAgICAgIHVuZnVybF9tZWRpYTogZmFsc2UsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2xhY2sgQVBJIEhUVFAgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7XG4gICAgICBvazogYm9vbGVhbjtcbiAgICAgIGVycm9yPzogc3RyaW5nO1xuICAgICAgY2hhbm5lbDogc3RyaW5nO1xuICAgICAgdHM6IHN0cmluZztcbiAgICB9O1xuICAgIGlmICghZGF0YS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbGFjayBBUEkgZXJyb3I6ICR7ZGF0YS5lcnJvcn1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2hhbm5lbDogZGF0YS5jaGFubmVsLFxuICAgICAgdHM6IGRhdGEudHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrqZTsi5zsp4Ag7YWN7Iqk7Yq466W8IOyDneyEse2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRNZXNzYWdlVGV4dChtaWdyYXRpb25zOiBzdHJpbmdbXSwgdGFyZ2V0czogc3RyaW5nW10sIHJlcXVlc3Rvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcm9qZWN0TmFtZSA9IFNvbmFtdS5jb25maWcucHJvamVjdE5hbWUgPz8gXCJVbmtub3duXCI7XG4gICAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZyhcImtvLUtSXCIsIHtcbiAgICAgIHRpbWVab25lOiBcIkFzaWEvU2VvdWxcIixcbiAgICB9KTtcbiAgICBjb25zdCBtaWdyYXRpb25zVGV4dCA9IG1pZ3JhdGlvbnMubWFwKChtKSA9PiBg4oCiICR7bX1gKS5qb2luKFwiXFxuXCIpO1xuICAgIGNvbnN0IHRhcmdldHNUZXh0ID0gdGFyZ2V0cy5qb2luKFwiLCBcIik7XG5cbiAgICByZXR1cm4gYPCfl4TvuI8gKlske3Byb2plY3ROYW1lfV0gUHJvZHVjdGlvbiDrp4jsnbTqt7jroIjsnbTshZgg7Iq57J24IOyalOyyrSpcblxuKuyalOyyreyekDoqICR7cmVxdWVzdG9yfVxuKuuMgOyDgSBEQjoqICR7dGFyZ2V0c1RleHR9XG4q7Iuc6rCEOiogJHt0aW1lc3RhbXB9XG5cbirsoIHsmqkg7JiI7KCVIOuniOydtOq3uOugiOydtOyFmDoqXG4ke21pZ3JhdGlvbnNUZXh0fWA7XG4gIH1cblxuICAvKipcbiAgICog7Iq57J24IOyDge2DnOulvCDtmZXsnbjtlanri4jri6QgKHJlYWN0aW9ucy5nZXQpLlxuICAgKi9cbiAgYXN5bmMgY2hlY2tBcHByb3ZhbChcbiAgICBjaGFubmVsOiBzdHJpbmcsXG4gICAgdHM6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7XG4gICAgYXBwcm92ZWQ6IGJvb2xlYW47XG4gICAgcmVqZWN0ZWQ6IGJvb2xlYW47XG4gICAgYXBwcm92ZXI/OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBhc3NlcnQodGhpcy5jb25maWcsIFNEKFwic29uYW11LmVycm9yLnNsYWNrQ29uZmlybU5vdENvbmZpZ3VyZWRcIikpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgIGBodHRwczovL3NsYWNrLmNvbS9hcGkvcmVhY3Rpb25zLmdldD9jaGFubmVsPSR7Y2hhbm5lbH0mdGltZXN0YW1wPSR7dHN9YCxcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuY29uZmlnLmJvdFRva2VufWAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNsYWNrIEFQSSBIVFRQIGVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMge1xuICAgICAgb2s6IGJvb2xlYW47XG4gICAgICBlcnJvcj86IHN0cmluZztcbiAgICAgIG1lc3NhZ2U/OiB7XG4gICAgICAgIHJlYWN0aW9ucz86IEFycmF5PHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgdXNlcnM/OiBzdHJpbmdbXTtcbiAgICAgICAgfT47XG4gICAgICB9O1xuICAgIH07XG4gICAgaWYgKCFkYXRhLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNsYWNrIEFQSSBlcnJvcjogJHtkYXRhLmVycm9yfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWN0aW9ucyA9IGRhdGEubWVzc2FnZT8ucmVhY3Rpb25zID8/IFtdO1xuICAgIGNvbnN0IGFwcHJvdmVkID0gcmVhY3Rpb25zLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gXCJ3aGl0ZV9jaGVja19tYXJrXCIpO1xuICAgIGNvbnN0IHJlamVjdGVkID0gcmVhY3Rpb25zLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gXCJ4XCIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcHJvdmVkOiAhIWFwcHJvdmVkLFxuICAgICAgcmVqZWN0ZWQ6ICEhcmVqZWN0ZWQsXG4gICAgICBhcHByb3ZlcjogYXBwcm92ZWQ/LnVzZXJzPy5bMF0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSDsirnsnbgg7LKY66as66W8IOyImO2Wie2VqeuLiOuLpCAo67O47J247J20IOKchSDssI3qs6Ag7Iqk66CI65Oc7JeQIOyCrOycoCDrgqjquYApLlxuICAgKi9cbiAgYXN5bmMgZm9yY2VBcHByb3ZhbChcbiAgICBjaGFubmVsOiBzdHJpbmcsXG4gICAgdHM6IHN0cmluZyxcbiAgICByZWFzb246IHN0cmluZyxcbiAgICByZXF1ZXN0b3I/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzc2VydCh0aGlzLmNvbmZpZywgU0QoXCJzb25hbXUuZXJyb3Iuc2xhY2tDb25maXJtTm90Q29uZmlndXJlZFwiKSk7XG4gICAgY29uc3QgYWN0dWFsUmVxdWVzdG9yID0gcmVxdWVzdG9yID8/IHRoaXMuZ2V0UmVxdWVzdG9yKCk7XG5cbiAgICAvLyAxLiDinIUg7J2066qo7KeAIOy2lOqwgFxuICAgIGNvbnN0IGFkZFJlYWN0aW9uUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vc2xhY2suY29tL2FwaS9yZWFjdGlvbnMuYWRkXCIsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy5ib3RUb2tlbn1gLFxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGNoYW5uZWwsXG4gICAgICAgIHRpbWVzdGFtcDogdHMsXG4gICAgICAgIG5hbWU6IFwid2hpdGVfY2hlY2tfbWFya1wiLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBpZiAoIWFkZFJlYWN0aW9uUmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2xhY2sgQVBJIEhUVFAgZXJyb3I6ICR7YWRkUmVhY3Rpb25SZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgLy8gMi4g7Iqk66CI65Oc7JeQIOyCrOycoCDrgqjquYBcbiAgICBjb25zdCBwb3N0TWVzc2FnZVJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCJodHRwczovL3NsYWNrLmNvbS9hcGkvY2hhdC5wb3N0TWVzc2FnZVwiLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5jb25maWcuYm90VG9rZW59YCxcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjaGFubmVsLFxuICAgICAgICB0aHJlYWRfdHM6IHRzLFxuICAgICAgICB0ZXh0OiBg4pqg77iPICpGb3JjZSDsirnsnbgqXFxu7JqU7LKt7J6QOiAke2FjdHVhbFJlcXVlc3Rvcn1cXG7sgqzsnKA6ICR7cmVhc29ufWAsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGlmICghcG9zdE1lc3NhZ2VSZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbGFjayBBUEkgSFRUUCBlcnJvcjogJHtwb3N0TWVzc2FnZVJlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7Iuk7ZaJIOyZhOujjCDroZzqt7jrpbwg64Ko6rmB64uI64ukLlxuICAgKi9cbiAgYXN5bmMgbG9nRXhlY3V0aW9uKFxuICAgIGNoYW5uZWw6IHN0cmluZyxcbiAgICB0czogc3RyaW5nLFxuICAgIHJlc3VsdHM6IE1pZ3JhdGlvblJlc3VsdCxcbiAgICByZXF1ZXN0b3I/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgIGFzc2VydChjb25maWcsIFNEKFwic29uYW11LmVycm9yLnNsYWNrQ29uZmlybU5vdENvbmZpZ3VyZWRcIikpO1xuXG4gICAgY29uc3QgYWN0dWFsUmVxdWVzdG9yID0gcmVxdWVzdG9yID8/IHRoaXMuZ2V0UmVxdWVzdG9yKCk7XG4gICAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZyhcImtvLUtSXCIsIHtcbiAgICAgIHRpbWVab25lOiBcIkFzaWEvU2VvdWxcIixcbiAgICB9KTtcblxuICAgIC8vIERC67OE66GcIOq3uOujue2ZlO2VmOyXrCDtkZzsi5ztlanri4jri6QuXG4gICAgY29uc3QgYXBwbGllZFRleHQgPVxuICAgICAgcmVzdWx0cy5sZW5ndGggPiAwXG4gICAgICAgID8gcmVzdWx0c1xuICAgICAgICAgICAgLmZpbHRlcigocikgPT4gci5hcHBsaWVkLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAubWFwKChyKSA9PiBgWyR7ci5jb25uS2V5fV1cXG4ke3IuYXBwbGllZC5tYXAoKG0pID0+IGDigKIgJHttfWApLmpvaW4oXCJcXG5cIil9YClcbiAgICAgICAgICAgIC5qb2luKFwiXFxuXFxuXCIpXG4gICAgICAgIDogXCIo7JeG7J2MKVwiO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vc2xhY2suY29tL2FwaS9jaGF0LnBvc3RNZXNzYWdlXCIsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtjb25maWcuYm90VG9rZW59YCxcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjaGFubmVsLFxuICAgICAgICB0aHJlYWRfdHM6IHRzLFxuICAgICAgICB0ZXh0OiBg4pyFICrrp4jsnbTqt7jroIjsnbTshZgg7Iuk7ZaJIOyZhOujjCpcXG7si6TtlonsnpA6ICR7YWN0dWFsUmVxdWVzdG9yfVxcbuyLnOqwhDogJHt0aW1lc3RhbXB9XFxuXFxu7KCB7Jqp65CoOlxcbiR7YXBwbGllZFRleHR9YCxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbGFjayBBUEkgSFRUUCBlcnJvcjogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O2FBTXNDO1NBRVA7Q0FnQmxCLGVBQWIsTUFBMEI7RUFDeEIsU0FBaUIsT0FBTyxPQUFPO0VBRS9CLDRCQUEwQztHQUN4QyxJQUFJLENBQUMsS0FBSyxRQUNSO0dBR0YsTUFBTSxlQUFlLE9BQU8sS0FBSyxPQUFPLFFBQVE7R0FDaEQsTUFBTSxpQkFBaUIsS0FBSyxPQUFPLFFBQVEsUUFBUSxXQUFXLENBQUMsYUFBYSxTQUFTLE1BQU0sQ0FBQztHQUU1RixJQUFJLGVBQWUsU0FBUyxHQUMxQixPQUFPLEtBQ0wsR0FBRyx5Q0FBeUMsQ0FBQyxDQUMzQyxlQUFlLEtBQUssSUFBSSxHQUN4QixhQUFhLEtBQUssSUFBSSxDQUN4QixDQUNGO0VBRUo7Ozs7RUFLQSxlQUF3QjtHQUN0QixLQUFLLDBCQUEwQjtHQUMvQixPQUFPLENBQUMsRUFBRSxLQUFLLFFBQVEsWUFBWSxLQUFLLFFBQVE7RUFDbEQ7Ozs7RUFLQSx5QkFBeUIsUUFBdUM7R0FDOUQsS0FBSywwQkFBMEI7R0FDL0IsT0FBTyxLQUFLLFFBQVEsU0FBUyxTQUFTLE1B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
|
package/dist/migration/types.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {};
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { findApiRootPath, init_utils } from "../utils/utils.js";
|
|
2
|
-
import { createHash } from "crypto";
|
|
3
2
|
import { join } from "path";
|
|
3
|
+
import { createHash } from "crypto";
|
|
4
4
|
import { homedir } from "os";
|
|
5
5
|
import { connect } from "net";
|
|
6
|
-
|
|
7
6
|
//#region src/naite/naite-reporter.ts
|
|
8
7
|
/**
|
|
9
8
|
* NaiteReporter
|
|
@@ -28,8 +27,7 @@ function getProjectHash(configPath) {
|
|
|
28
27
|
* Sonamu.apiRootPath가 설정된 후에 호출해야 합니다.
|
|
29
28
|
*/
|
|
30
29
|
function getSocketPath() {
|
|
31
|
-
const
|
|
32
|
-
const hash = getProjectHash(configPath);
|
|
30
|
+
const hash = getProjectHash(join(findApiRootPath(), "src", "sonamu.config.ts"));
|
|
33
31
|
return process.platform === "win32" ? `\\\\.\\pipe\\naite-${hash}` : join(homedir(), ".sonamu", `naite-${hash}.sock`);
|
|
34
32
|
}
|
|
35
33
|
var NaiteReporterClass = class {
|
|
@@ -41,19 +39,13 @@ var NaiteReporterClass = class {
|
|
|
41
39
|
* 소켓 연결 시도
|
|
42
40
|
*/
|
|
43
41
|
async ensureConnection() {
|
|
44
|
-
if (this.connected || this.socket)
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
42
|
+
if (this.connected || this.socket) return;
|
|
47
43
|
return new Promise((res, rej) => {
|
|
48
|
-
if (!this.socketPath)
|
|
49
|
-
this.socketPath = getSocketPath();
|
|
50
|
-
}
|
|
44
|
+
if (!this.socketPath) this.socketPath = getSocketPath();
|
|
51
45
|
this.socket = connect(this.socketPath);
|
|
52
46
|
this.socket.on("connect", () => {
|
|
53
47
|
this.connected = true;
|
|
54
|
-
for (const msg of this.buffer)
|
|
55
|
-
this.socket?.write(msg);
|
|
56
|
-
}
|
|
48
|
+
for (const msg of this.buffer) this.socket?.write(msg);
|
|
57
49
|
this.buffer = [];
|
|
58
50
|
res();
|
|
59
51
|
});
|
|
@@ -74,23 +66,18 @@ var NaiteReporterClass = class {
|
|
|
74
66
|
async send(data) {
|
|
75
67
|
const msg = `${JSON.stringify(data)}\n`;
|
|
76
68
|
await this.ensureConnection().catch((_) => {});
|
|
77
|
-
if (this.connected && this.socket)
|
|
78
|
-
|
|
79
|
-
} else {
|
|
80
|
-
this.buffer.push(msg);
|
|
81
|
-
}
|
|
69
|
+
if (this.connected && this.socket) this.socket.write(msg);
|
|
70
|
+
else this.buffer.push(msg);
|
|
82
71
|
}
|
|
83
72
|
/**
|
|
84
73
|
* beforeAll에서 호출합니다.
|
|
85
74
|
* 테스트 run 시작을 알립니다 (데이터 클리어 신호).
|
|
86
75
|
*/
|
|
87
76
|
async startTestRun() {
|
|
88
|
-
if (process.env.CI)
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
77
|
+
if (process.env.CI) return;
|
|
91
78
|
await this.send({
|
|
92
79
|
type: "run/start",
|
|
93
|
-
startedAt: new Date().toISOString()
|
|
80
|
+
startedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
94
81
|
});
|
|
95
82
|
}
|
|
96
83
|
/**
|
|
@@ -98,12 +85,10 @@ var NaiteReporterClass = class {
|
|
|
98
85
|
* 테스트 케이스 결과를 traces와 함께 전송합니다.
|
|
99
86
|
*/
|
|
100
87
|
async reportTestResult(result) {
|
|
101
|
-
if (process.env.CI)
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
88
|
+
if (process.env.CI) return;
|
|
104
89
|
await this.send({
|
|
105
90
|
type: "test/result",
|
|
106
|
-
receivedAt: new Date().toISOString(),
|
|
91
|
+
receivedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
107
92
|
...result
|
|
108
93
|
});
|
|
109
94
|
}
|
|
@@ -112,12 +97,10 @@ var NaiteReporterClass = class {
|
|
|
112
97
|
* 테스트 run 종료를 알립니다.
|
|
113
98
|
*/
|
|
114
99
|
async endTestRun() {
|
|
115
|
-
if (process.env.CI)
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
100
|
+
if (process.env.CI) return;
|
|
118
101
|
await this.send({
|
|
119
102
|
type: "run/end",
|
|
120
|
-
endedAt: new Date().toISOString()
|
|
103
|
+
endedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
121
104
|
});
|
|
122
105
|
if (this.socket) {
|
|
123
106
|
this.socket.end();
|
|
@@ -127,7 +110,7 @@ var NaiteReporterClass = class {
|
|
|
127
110
|
}
|
|
128
111
|
};
|
|
129
112
|
const NaiteReporter = new NaiteReporterClass();
|
|
130
|
-
|
|
131
113
|
//#endregion
|
|
132
114
|
export { NaiteReporter };
|
|
133
|
-
|
|
115
|
+
|
|
116
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFpdGUtcmVwb3J0ZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL25haXRlL25haXRlLXJlcG9ydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTmFpdGVSZXBvcnRlclxuICpcbiAqIO2FjOyKpO2KuCDqsrDqs7zsmYAgVHJhY2Ug7KCV67O066W8IFVuaXggU29ja2V07Jy866GcIFZTIENvZGUgZXh0ZW5zaW9u7JeQIOyghOuLrO2VqeuLiOuLpC5cbiAqIGV4dGVuc2lvbuydtCB+Ly5zb25hbXUvbmFpdGUte2hhc2h9LnNvY2vsl5Ag7IaM7LyTIOyEnOuyhOulvCDsl7TslrTrkaHri4jri6QuXG4gKlxuICog7ZSE66Gc7KCd7Yq467OE66GcIOqzoOycoO2VnCDshozsvJPsnYQg7IKs7Jqp7ZWY6riwIOychO2VtCBzb25hbXUuY29uZmlnLnRzIOqyveuhnOydmCDtlbTsi5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIGZzIG1vY2sg7Lap64+M7J2EIO2UvO2VmOq4sCDsnITtlbQgbmV0IOuqqOuTiOunjCDsgqzsmqntlanri4jri6QuXG4gKi9cbi8qIG94bGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi8gLy8gTmFpdGXripQgZXhwZWN07JmAIO2YuOydke2VmOuPhOuhnSBhbnnrpbwg7ZeI7Jqp7ZWoXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSBcIm5ldFwiO1xuaW1wb3J0IHsgdHlwZSBTb2NrZXQgfSBmcm9tIFwibmV0XCI7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgZmluZEFwaVJvb3RQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIE5haXRlTWVzc2FnaW5nVHlwZXMgfSBmcm9tIFwiLi9tZXNzYWdpbmctdHlwZXNcIjtcblxuLyoqXG4gKiBzb25hbXUuY29uZmlnLnRzIOqyveuhnOulvCDrsJvslYTshJwg7ZSE66Gc7KCd7Yq467OEIOqzoOycoCDtlbTsi5zrpbwg7IOd7ISx7ZWp64uI64ukLlxuICog7J217Iqk7YWQ7IWY6rO8IOuPmeydvO2VnCDrsKnsi53snLzroZwg6rOE7IKw7ZW07JW8IO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJvamVjdEhhc2goY29uZmlnUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goXCJtZDVcIikudXBkYXRlKGNvbmZpZ1BhdGgpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCA4KTtcbn1cblxuLyoqXG4gKiDtmITsnqwg7ZSE66Gc7KCd7Yq47J2YIOyGjOy8kyDqsr3roZzrpbwg6rOE7IKw7ZWp64uI64ukLlxuICogU29uYW11LmFwaVJvb3RQYXRo6rCAIOyEpOygleuQnCDtm4Tsl5Ag7Zi47Lac7ZW07JW8IO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0U29ja2V0UGF0aCgpOiBzdHJpbmcge1xuICAvLyBzb25hbXUuY29uZmlnLnRz7J2YIOygiOuMgCDqsr3roZwg6rOE7IKwXG4gIC8vIGFwaVJvb3RQYXRo64qUIC9wcm9qZWN0L2FwaSDtmJXtg5zsnbTqs6AsIGNvbmZpZ+uKlCAvcHJvamVjdC9hcGkvc3JjL3NvbmFtdS5jb25maWcudHPsl5Ag7J6I7J2MXG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKGZpbmRBcGlSb290UGF0aCgpLCBcInNyY1wiLCBcInNvbmFtdS5jb25maWcudHNcIik7XG4gIGNvbnN0IGhhc2ggPSBnZXRQcm9qZWN0SGFzaChjb25maWdQYXRoKTtcblxuICByZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiXG4gICAgPyBgXFxcXFxcXFwuXFxcXHBpcGVcXFxcbmFpdGUtJHtoYXNofWBcbiAgICA6IGpvaW4oaG9tZWRpcigpLCBcIi5zb25hbXVcIiwgYG5haXRlLSR7aGFzaH0uc29ja2ApO1xufVxuXG5jbGFzcyBOYWl0ZVJlcG9ydGVyQ2xhc3Mge1xuICBwcml2YXRlIHNvY2tldFBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNvY2tldDogU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgYnVmZmVyOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiDshozsvJMg7Jew6rKwIOyLnOuPhFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVDb25uZWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3RlZCB8fCB0aGlzLnNvY2tldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICAgIGlmICghdGhpcy5zb2NrZXRQYXRoKSB7XG4gICAgICAgIHRoaXMuc29ja2V0UGF0aCA9IGdldFNvY2tldFBhdGgoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc29ja2V0ID0gY29ubmVjdCh0aGlzLnNvY2tldFBhdGgpO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgIC8vIOuyhO2NvOyXkCDsjJPsnbgg66mU7Iuc7KeAIOyghOyGoVxuICAgICAgICBmb3IgKGNvbnN0IG1zZyBvZiB0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgIHRoaXMuc29ja2V0Py53cml0ZShtc2cpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmZmVyID0gW107XG4gICAgICAgIHJlcygpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uKFwiZXJyb3JcIiwgKGUpID0+IHtcbiAgICAgICAgLy8g7Jew6rKwIOyLpO2MqCDrrLTsi5wgKGV4dGVuc2lvbuydtCDqurzsoLjsnojsnYQg7IiYIOyeiOydjClcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgICByZWooZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOuplOyLnOyngCDsoITshqEgKOykhOuwlOq/iOycvOuhnCDqtazrtoQpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmQoZGF0YTogTmFpdGVNZXNzYWdpbmdUeXBlcy5OYWl0ZU1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtc2cgPSBgJHtKU09OLnN0cmluZ2lmeShkYXRhKX1cXG5gO1xuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0aW9uKCkuY2F0Y2goKF8pID0+IHt9KTtcblxuICAgIGlmICh0aGlzLmNvbm5lY3RlZCAmJiB0aGlzLnNvY2tldCkge1xuICAgICAgdGhpcy5zb2NrZXQud3JpdGUobXNnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7Jew6rKwIOuMgOq4sCDspJHsnbTrqbQg67KE7Y287JeQIOyggOyepVxuICAgICAgdGhpcy5idWZmZXIucHVzaChtc2cpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiZWZvcmVBbGzsl5DshJwg7Zi47Lac7ZWp64uI64ukLlxuICAgKiDthYzsiqTtirggcnVuIOyLnOyekeydhCDslYzrpr3ri4jri6QgKOuNsOydtO2EsCDtgbTrpqzslrQg7Iug7Zi4KS5cbiAgICovXG4gIGFzeW5jIHN0YXJ0VGVzdFJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQ0kpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNlbmQoe1xuICAgICAgdHlwZTogXCJydW4vc3RhcnRcIixcbiAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGFmdGVyRWFjaOyXkOyEnCDtmLjstpztlanri4jri6QuXG4gICAqIO2FjOyKpO2KuCDsvIDsnbTsiqQg6rKw6rO866W8IHRyYWNlc+yZgCDtlajqu5gg7KCE7Iah7ZWp64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVwb3J0VGVzdFJlc3VsdChcbiAgICByZXN1bHQ6IE9taXQ8TmFpdGVNZXNzYWdpbmdUeXBlcy5UZXN0UmVzdWx0LCBcInJlY2VpdmVkQXRcIj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5DSSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICB0eXBlOiBcInRlc3QvcmVzdWx0XCIsXG4gICAgICByZWNlaXZlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAuLi5yZXN1bHQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogYWZ0ZXJBbGzsl5DshJwg7Zi47Lac7ZWp64uI64ukLlxuICAgKiDthYzsiqTtirggcnVuIOyiheujjOulvCDslYzrpr3ri4jri6QuXG4gICAqL1xuICBhc3luYyBlbmRUZXN0UnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5DSSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICB0eXBlOiBcInJ1bi9lbmRcIixcbiAgICAgIGVuZGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9KTtcblxuICAgIC8vIOyXsOqysCDsooXro4xcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgIHRoaXMuc29ja2V0LmVuZCgpO1xuICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IE5haXRlUmVwb3J0ZXIgPSBuZXcgTmFpdGVSZXBvcnRlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7V0FrQmdEOzs7OztBQU9oRCxTQUFTLGVBQWUsWUFBNEI7Q0FDbEQsT0FBTyxXQUFXLEtBQUssQ0FBQyxDQUFDLE9BQU8sVUFBVSxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztBQUN0RTs7Ozs7QUFNQSxTQUFTLGdCQUF3QjtDQUkvQixNQUFNLE9BQU8sZUFETSxLQUFLLGdCQUFnQixHQUFHLE9BQU8sa0JBQ3RCLENBQVU7Q0FFdEMsT0FBTyxRQUFRLGFBQWEsVUFDeEIsc0JBQXNCLFNBQ3RCLEtBQUssUUFBUSxHQUFHLFdBQVcsU0FBUyxLQUFLLE1BQU07QUFDckQ7QUFFQSxJQUFNLHFCQUFOLE1BQXlCO0NBQ3ZCLGFBQW9DO0NBQ3BDLFNBQWdDO0NBQ2hDLFlBQW9CO0NBQ3BCLFNBQTJCLENBQUM7Ozs7Q0FLNUIsTUFBYyxtQkFBa0M7RUFDOUMsSUFBSSxLQUFLLGFBQWEsS0FBSyxRQUN6QjtFQUdGLE9BQU8sSUFBSSxTQUFTLEtBQUssUUFBUTtHQUMvQixJQUFJLENBQUMsS0FBSyxZQUNSLEtBQUssYUFBYSxjQUFjO0dBRWxDLEtBQUssU0FBUyxRQUFRLEtBQUssVUFBVTtHQUVyQyxLQUFLLE9BQU8sR0FBRyxpQkFBaUI7SUFDOUIsS0FBSyxZQUFZO0lBRWpCLEtBQUssTUFBTSxPQUFPLEtBQUssUUFDckIsS0FBSyxRQUFRLE1BQU0sR0FBRztJQUV4QixLQUFLLFNBQVMsQ0FBQztJQUNmLElBQUk7R0FDTixDQUFDO0dBRUQsS0FBSyxPQUFPLEdBQUcsVUFBVSxNQUFNO0lBRTdCLEtBQUssWUFBWTtJQUNqQixLQUFLLFNBQVM7SUFDZCxJQUFJLENBQUM7R0FDUCxDQUFDO0dBRUQsS0FBSyxPQUFPLEdBQUcsZUFBZTtJQUM1QixLQUFLLFlBQVk7SUFDakIsS0FBSyxTQUFTO0dBQ2hCLENBQUM7RUFDSCxDQUFDO0NBQ0g7Ozs7Q0FLQSxNQUFjLEtBQUssTUFBdUQ7RUFDeEUsTUFBTSxNQUFNLEdBQUcsS0FBSyxVQUFVLElBQUksRUFBRTtFQUVwQyxNQUFNLEtBQUssaUJBQWlCLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDO0VBRTdDLElBQUksS0FBSyxhQUFhLEtBQUssUUFDekIsS0FBSyxPQUFPLE1BQU0sR0FBRztPQUdyQixLQUFLLE9BQU8sS0FBSyxHQUFHO0NBRXhCOzs7OztDQU1BLE1BQU0sZUFBOEI7RUFDbEMsSUFBSSxRQUFRLElBQUksSUFDZDtFQUdGLE1BQU0sS0FBSyxLQUFLO0dBQ2QsTUFBTTtHQUNOLDRCQUFXLElBQUksS0FBSyxFQUFDLENBQUMsWUFBWTtFQUNwQyxDQUFDO0NBQ0g7Ozs7O0NBTUEsTUFBTSxpQkFDSixRQUNlO0VBQ2YsSUFBSSxRQUFRLElBQUksSUFDZDtFQUdGLE1BQU0sS0FBSyxLQUFLO0dBQ2QsTUFBTTtHQUNOLDZCQUFZLElBQUksS0FBSyxFQUFDLENBQUMsWUFBWTtHQUNuQyxHQUFHO0VBQ0wsQ0FBQztDQUNIOzs7OztDQU1BLE1BQU0sYUFBNEI7RUFDaEMsSUFBSSxRQUFRLElBQUksSUFDZDtFQUdGLE1BQU0sS0FBSyxLQUFLO0dBQ2QsTUFBTTtHQUNOLDBCQUFTLElBQUksS0FBSyxFQUFDLENBQUMsWUFBWTtFQUNsQyxDQUFDO0VBR0QsSUFBSSxLQUFLLFFBQVE7R0FDZixLQUFLLE9BQU8sSUFBSTtHQUNoQixLQUFLLFNBQVM7R0FDZCxLQUFLLFlBQVk7RUFDbkI7Q0FDRjtBQUNGO0FBRUEsTUFBYSxnQkFBZ0IsSUFBSSxtQkFBbUIifQ==
|