sonamu 0.9.19 → 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 +7 -7
- 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/entity-basic.md +31 -0
- package/src/skills/sonamu/puri.md +22 -0
- package/src/skills/sonamu/testing-devrunner.md +1 -1
- package/src/skills/sonamu/upsert.md +53 -6
- 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
package/dist/bin/test-command.js
CHANGED
|
@@ -2,22 +2,17 @@ import { findApiRootPath, init_utils } from "../utils/utils.js";
|
|
|
2
2
|
import { init_config, loadConfig } from "../api/config.js";
|
|
3
3
|
import chalk from "chalk";
|
|
4
4
|
import path from "node:path";
|
|
5
|
-
|
|
6
5
|
//#region src/bin/test-command.ts
|
|
7
6
|
init_config();
|
|
8
7
|
init_utils();
|
|
9
|
-
async function
|
|
8
|
+
async function loadDevServerConfig() {
|
|
10
9
|
const prevVitest = process.env.VITEST;
|
|
11
10
|
process.env.VITEST = "true";
|
|
12
11
|
try {
|
|
13
|
-
|
|
14
|
-
return await loadConfig(apiRootPath);
|
|
12
|
+
return await loadConfig(findApiRootPath());
|
|
15
13
|
} finally {
|
|
16
|
-
if (prevVitest ===
|
|
17
|
-
|
|
18
|
-
} else {
|
|
19
|
-
process.env.VITEST = prevVitest;
|
|
20
|
-
}
|
|
14
|
+
if (prevVitest === void 0) delete process.env.VITEST;
|
|
15
|
+
else process.env.VITEST = prevVitest;
|
|
21
16
|
}
|
|
22
17
|
}
|
|
23
18
|
function resolveTestBaseUrl(config) {
|
|
@@ -33,26 +28,19 @@ function resolveTestBaseUrl(config) {
|
|
|
33
28
|
}
|
|
34
29
|
async function testCommand() {
|
|
35
30
|
const args = process.argv.slice(3);
|
|
36
|
-
const config = await
|
|
31
|
+
const config = await loadDevServerConfig();
|
|
37
32
|
const files = [];
|
|
38
33
|
let pattern;
|
|
39
34
|
let showTraces = false;
|
|
40
35
|
let showStatus = false;
|
|
41
36
|
for (let i = 0; i < args.length; i++) {
|
|
42
37
|
const arg = args[i];
|
|
43
|
-
if (arg === "--pattern" || arg === "-p")
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
} else if (arg === "--status" || arg === "-s") {
|
|
48
|
-
showStatus = true;
|
|
49
|
-
} else if (!arg.startsWith("-")) {
|
|
50
|
-
files.push(arg);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
if (showStatus) {
|
|
54
|
-
return testStatusCommand(config);
|
|
38
|
+
if (arg === "--pattern" || arg === "-p") pattern = args[++i];
|
|
39
|
+
else if (arg === "--traces" || arg === "-t") showTraces = true;
|
|
40
|
+
else if (arg === "--status" || arg === "-s") showStatus = true;
|
|
41
|
+
else if (!arg.startsWith("-")) files.push(arg);
|
|
55
42
|
}
|
|
43
|
+
if (showStatus) return testStatusCommand(config);
|
|
56
44
|
if (!config.test?.devRunner?.enabled) {
|
|
57
45
|
console.error(chalk.red("devRunner가 활성화되지 않았습니다. sonamu.config.ts에서 test.devRunner.enabled: true 설정이 필요합니다"));
|
|
58
46
|
process.exit(1);
|
|
@@ -60,12 +48,8 @@ async function testCommand() {
|
|
|
60
48
|
const { baseUrl } = resolveTestBaseUrl(config);
|
|
61
49
|
const url = `${baseUrl}/run`;
|
|
62
50
|
const payload = {};
|
|
63
|
-
if (files.length > 0)
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
if (pattern) {
|
|
67
|
-
payload.pattern = pattern;
|
|
68
|
-
}
|
|
51
|
+
if (files.length > 0) payload.files = files;
|
|
52
|
+
if (pattern) payload.pattern = pattern;
|
|
69
53
|
try {
|
|
70
54
|
const response = await fetch(url, {
|
|
71
55
|
method: "POST",
|
|
@@ -79,9 +63,7 @@ async function testCommand() {
|
|
|
79
63
|
if (response.status === 500) {
|
|
80
64
|
const errorBody = await response.json();
|
|
81
65
|
console.error(chalk.red("Vitest 인스턴스가 아직 준비되지 않았습니다"));
|
|
82
|
-
if (errorBody.error)
|
|
83
|
-
console.error(chalk.red(errorBody.error));
|
|
84
|
-
}
|
|
66
|
+
if (errorBody.error) console.error(chalk.red(errorBody.error));
|
|
85
67
|
process.exit(1);
|
|
86
68
|
}
|
|
87
69
|
if (!response.ok) {
|
|
@@ -99,9 +81,7 @@ async function testCommand() {
|
|
|
99
81
|
console.log(chalk.red.bold("\nFailed tests:"));
|
|
100
82
|
for (const f of failedTests) {
|
|
101
83
|
console.log(` ${chalk.red("x")} ${f.fullName} ${chalk.dim(`(${f.file})`)}`);
|
|
102
|
-
if (f.error) {
|
|
103
|
-
console.log(` ${chalk.red(f.error.message)}`);
|
|
104
|
-
}
|
|
84
|
+
if (f.error) console.log(` ${chalk.red(f.error.message)}`);
|
|
105
85
|
}
|
|
106
86
|
}
|
|
107
87
|
if (showTraces) {
|
|
@@ -121,9 +101,7 @@ async function testCommand() {
|
|
|
121
101
|
}
|
|
122
102
|
}
|
|
123
103
|
}
|
|
124
|
-
if (!result.ok)
|
|
125
|
-
process.exit(1);
|
|
126
|
-
}
|
|
104
|
+
if (!result.ok) process.exit(1);
|
|
127
105
|
} catch (err) {
|
|
128
106
|
if (err instanceof TypeError && err.cause) {
|
|
129
107
|
console.error(chalk.red("dev 서버에 연결할 수 없습니다. sonamu dev가 실행 중인지 확인하세요"));
|
|
@@ -135,28 +113,20 @@ async function testCommand() {
|
|
|
135
113
|
function collectFailedFromResults(nodes) {
|
|
136
114
|
const result = [];
|
|
137
115
|
for (const node of nodes) {
|
|
138
|
-
if (node.kind === "test" && node.state === "failed")
|
|
139
|
-
|
|
140
|
-
}
|
|
141
|
-
if (node.children.length > 0) {
|
|
142
|
-
result.push(...collectFailedFromResults(node.children));
|
|
143
|
-
}
|
|
116
|
+
if (node.kind === "test" && node.state === "failed") result.push(node);
|
|
117
|
+
if (node.children.length > 0) result.push(...collectFailedFromResults(node.children));
|
|
144
118
|
}
|
|
145
119
|
return result;
|
|
146
120
|
}
|
|
147
121
|
function collectTracesFromResults(nodes) {
|
|
148
122
|
const result = [];
|
|
149
123
|
for (const node of nodes) {
|
|
150
|
-
if (node.kind === "test" && node.traces.length > 0) {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
}
|
|
157
|
-
if (node.children.length > 0) {
|
|
158
|
-
result.push(...collectTracesFromResults(node.children));
|
|
159
|
-
}
|
|
124
|
+
if (node.kind === "test" && node.traces.length > 0) result.push({
|
|
125
|
+
testName: node.fullName,
|
|
126
|
+
file: node.file,
|
|
127
|
+
traces: node.traces
|
|
128
|
+
});
|
|
129
|
+
if (node.children.length > 0) result.push(...collectTracesFromResults(node.children));
|
|
160
130
|
}
|
|
161
131
|
return result;
|
|
162
132
|
}
|
|
@@ -187,7 +157,7 @@ async function testStatusCommand(config) {
|
|
|
187
157
|
throw err;
|
|
188
158
|
}
|
|
189
159
|
}
|
|
190
|
-
|
|
191
160
|
//#endregion
|
|
192
161
|
export { testCommand };
|
|
193
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jb21tYW5kLmpzIiwibmFtZXMiOlsiZmlsZXM6IHN0cmluZ1tdIiwicGF0dGVybjogc3RyaW5nIHwgdW5kZWZpbmVkIiwicGF5bG9hZDogeyBmaWxlcz86IHN0cmluZ1tdOyBwYXR0ZXJuPzogc3RyaW5nIH0iLCJyZXN1bHQ6IFRlc3RDYXNlUmVzdWx0W10iLCJyZXN1bHQ6IHsgdGVzdE5hbWU6IHN0cmluZzsgZmlsZTogc3RyaW5nOyB0cmFjZXM6IFRlc3RDYXNlUmVzdWx0W1widHJhY2VzXCJdIH1bXSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vdGVzdC1jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuXG5pbXBvcnQgeyB0eXBlIFNvbmFtdUNvbmZpZyB9IGZyb20gXCIuLi9hcGkvY29uZmlnXCI7XG5pbXBvcnQgeyBsb2FkQ29uZmlnIH0gZnJvbSBcIi4uL2FwaS9jb25maWdcIjtcbmltcG9ydCB7IHR5cGUgUnVuUmVzdWx0LCB0eXBlIFRlc3RDYXNlUmVzdWx0IH0gZnJvbSBcIi4uL3Rlc3RpbmdcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkVGVzdENvbmZpZygpOiBQcm9taXNlPFNvbmFtdUNvbmZpZz4ge1xuICBjb25zdCBwcmV2Vml0ZXN0ID0gcHJvY2Vzcy5lbnYuVklURVNUO1xuICBwcm9jZXNzLmVudi5WSVRFU1QgPSBcInRydWVcIjtcbiAgdHJ5IHtcbiAgICBjb25zdCBhcGlSb290UGF0aCA9IGZpbmRBcGlSb290UGF0aCgpO1xuICAgIHJldHVybiBhd2FpdCBsb2FkQ29uZmlnKGFwaVJvb3RQYXRoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAocHJldlZpdGVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWxldGUgcHJvY2Vzcy5lbnYuVklURVNUO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzLmVudi5WSVRFU1QgPSBwcmV2Vml0ZXN0O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlVGVzdEJhc2VVcmwoY29uZmlnOiBTb25hbXVDb25maWcpOiB7XG4gIGhvc3Q6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyO1xuICByb3V0ZVByZWZpeDogc3RyaW5nO1xuICBiYXNlVXJsOiBzdHJpbmc7XG59IHtcbiAgY29uc3QgcG9ydCA9IGNvbmZpZy5zZXJ2ZXIubGlzdGVuPy5wb3J0ID8/IDMwMDA7XG4gIGNvbnN0IGhvc3QgPSBjb25maWcuc2VydmVyLmxpc3Rlbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuICBjb25zdCByb3V0ZVByZWZpeCA9IGNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LnJvdXRlUHJlZml4ID8/IFwiL19fdGVzdF9fXCI7XG4gIHJldHVybiB7IGhvc3QsIHBvcnQsIHJvdXRlUHJlZml4LCBiYXNlVXJsOiBgaHR0cDovLyR7aG9zdH06JHtwb3J0fSR7cm91dGVQcmVmaXh9YCB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdENvbW1hbmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3MgPSBwcm9jZXNzLmFyZ3Yuc2xpY2UoMyk7XG5cbiAgY29uc3QgY29uZmlnID0gYXdhaXQgbG9hZFRlc3RDb25maWcoKTtcblxuICAvLyBwcm9jZXNzLmFyZ3Yg7YyM7IuxOiBzb25hbXUgdGVzdCBbZmlsZS4uLl0gLS1wYXR0ZXJuIFwi7J2066aEXCIgLS10cmFjZXMgLS1zdGF0dXNcbiAgY29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBwYXR0ZXJuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBzaG93VHJhY2VzID0gZmFsc2U7XG4gIGxldCBzaG93U3RhdHVzID0gZmFsc2U7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXJnID0gYXJnc1tpXTtcbiAgICBpZiAoYXJnID09PSBcIi0tcGF0dGVyblwiIHx8IGFyZyA9PT0gXCItcFwiKSB7XG4gICAgICBwYXR0ZXJuID0gYXJnc1srK2ldO1xuICAgIH0gZWxzZSBpZiAoYXJnID09PSBcIi0tdHJhY2VzXCIgfHwgYXJnID09PSBcIi10XCIpIHtcbiAgICAgIHNob3dUcmFjZXMgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoYXJnID09PSBcIi0tc3RhdHVzXCIgfHwgYXJnID09PSBcIi1zXCIpIHtcbiAgICAgIHNob3dTdGF0dXMgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIWFyZy5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgZmlsZXMucHVzaChhcmcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzaG93U3RhdHVzKSB7XG4gICAgcmV0dXJuIHRlc3RTdGF0dXNDb21tYW5kKGNvbmZpZyk7XG4gIH1cblxuICBpZiAoIWNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LmVuYWJsZWQpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBcImRldlJ1bm5lcuqwgCDtmZzshLHtmZTrkJjsp4Ag7JWK7JWY7Iq164uI64ukLiBzb25hbXUuY29uZmlnLnRz7JeQ7IScIHRlc3QuZGV2UnVubmVyLmVuYWJsZWQ6IHRydWUg7ISk7KCV7J20IO2VhOyalO2VqeuLiOuLpFwiLFxuICAgICAgKSxcbiAgICApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IHsgYmFzZVVybCB9ID0gcmVzb2x2ZVRlc3RCYXNlVXJsKGNvbmZpZyk7XG4gIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9L3J1bmA7XG5cbiAgY29uc3QgcGF5bG9hZDogeyBmaWxlcz86IHN0cmluZ1tdOyBwYXR0ZXJuPzogc3RyaW5nIH0gPSB7fTtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBwYXlsb2FkLmZpbGVzID0gZmlsZXM7XG4gIH1cbiAgaWYgKHBhdHRlcm4pIHtcbiAgICBwYXlsb2FkLnBhdHRlcm4gPSBwYXR0ZXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgXCJkZXZSdW5uZXLqsIAg7Zmc7ISx7ZmU65CY7KeAIOyViuyVmOyKteuLiOuLpC4gc29uYW11LmNvbmZpZy50c+yXkOyEnCB0ZXN0LmRldlJ1bm5lci5lbmFibGVkOiB0cnVlIOyEpOygleydtCDtlYTsmpTtlanri4jri6RcIixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICBjb25zdCBlcnJvckJvZHkgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGVycm9yPzogc3RyaW5nIH07XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChcIlZpdGVzdCDsnbjsiqTthLTsiqTqsIAg7JWE7KeBIOykgOu5hOuQmOyngCDslYrslZjsirXri4jri6RcIikpO1xuICAgICAgaWYgKGVycm9yQm9keS5lcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvckJvZHkuZXJyb3IpKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChg7JiI7IOB7ZWY7KeAIOuqu+2VnCDsnZHri7U6ICR7cmVzcG9uc2Uuc3RhdHVzfWApKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBSdW5SZXN1bHQ7XG5cbiAgICBjb25zdCB7IHBhc3NlZCwgZmFpbGVkOiBmYWlsZWRDb3VudCwgdG90YWwsIGR1cmF0aW9uTXMgfSA9IHJlc3VsdC5zdW1tYXJ5O1xuICAgIGNvbnN0IHBhc3NlZFN0ciA9IGNoYWxrLmdyZWVuKGAke3Bhc3NlZH0gcGFzc2VkYCk7XG4gICAgY29uc3QgZmFpbGVkU3RyID1cbiAgICAgIGZhaWxlZENvdW50ID4gMCA/IGNoYWxrLnJlZChgJHtmYWlsZWRDb3VudH0gZmFpbGVkYCkgOiBgJHtmYWlsZWRDb3VudH0gZmFpbGVkYDtcbiAgICBjb25zb2xlLmxvZyhgXFxuVGVzdHM6ICR7cGFzc2VkU3RyfSwgJHtmYWlsZWRTdHJ9LCAke3RvdGFsfSB0b3RhbGApO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgRHVyYXRpb246ICR7ZHVyYXRpb25Nc31tc2ApKTtcblxuICAgIGNvbnN0IGZhaWxlZFRlc3RzID0gY29sbGVjdEZhaWxlZEZyb21SZXN1bHRzKHJlc3VsdC5yZXN1bHRzKTtcbiAgICBpZiAoZmFpbGVkVGVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkLmJvbGQoXCJcXG5GYWlsZWQgdGVzdHM6XCIpKTtcbiAgICAgIGZvciAoY29uc3QgZiBvZiBmYWlsZWRUZXN0cykge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2NoYWxrLnJlZChcInhcIil9ICR7Zi5mdWxsTmFtZX0gJHtjaGFsay5kaW0oYCgke2YuZmlsZX0pYCl9YCk7XG4gICAgICAgIGlmIChmLmVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgICAke2NoYWxrLnJlZChmLmVycm9yLm1lc3NhZ2UpfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dUcmFjZXMpIHtcbiAgICAgIGNvbnN0IHRlc3RzV2l0aFRyYWNlcyA9IGNvbGxlY3RUcmFjZXNGcm9tUmVzdWx0cyhyZXN1bHQucmVzdWx0cyk7XG4gICAgICBpZiAodGVzdHNXaXRoVHJhY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbi5ib2xkKFwiXFxuVHJhY2VzOlwiKSk7XG4gICAgICAgIGZvciAoY29uc3QgeyB0ZXN0TmFtZSwgZmlsZSwgdHJhY2VzIH0gb2YgdGVzdHNXaXRoVHJhY2VzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFxcbiAgJHtjaGFsay5ib2xkKHRlc3ROYW1lKX1gKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAke2NoYWxrLmRpbShwYXRoLmJhc2VuYW1lKGZpbGUpKX1gKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHRyYWNlIG9mIHRyYWNlcykge1xuICAgICAgICAgICAgY29uc3QgbG9jID0gYCR7cGF0aC5iYXNlbmFtZSh0cmFjZS5maWxlUGF0aCl9OiR7dHJhY2UubGluZU51bWJlcn1gO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVTdHIgPVxuICAgICAgICAgICAgICB0eXBlb2YgdHJhY2UudmFsdWUgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICA/IHRyYWNlLnZhbHVlXG4gICAgICAgICAgICAgICAgOiAoSlNPTi5zdHJpbmdpZnkodHJhY2UudmFsdWUsIG51bGwsIDIpID8/IFwidW5kZWZpbmVkXCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFxcbiAgICAke2NoYWxrLnllbGxvdyhgWyR7dHJhY2Uua2V5fV1gKX0gJHtjaGFsay5kaW0obG9jKX1gKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGVudGVkID0gdmFsdWVTdHIuc3BsaXQoXCJcXG5cIikuam9pbihcIlxcbiAgICBcIik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICR7aW5kZW50ZWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUeXBlRXJyb3IgJiYgZXJyLmNhdXNlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXCJkZXYg7ISc67KE7JeQIOyXsOqysO2VoCDsiJgg7JeG7Iq164uI64ukLiBzb25hbXUgZGV26rCAIOyLpO2WiSDspJHsnbjsp4Ag7ZmV7J247ZWY7IS47JqUXCIpLFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RGYWlsZWRGcm9tUmVzdWx0cyhub2RlczogVGVzdENhc2VSZXN1bHRbXSk6IFRlc3RDYXNlUmVzdWx0W10ge1xuICBjb25zdCByZXN1bHQ6IFRlc3RDYXNlUmVzdWx0W10gPSBbXTtcbiAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgaWYgKG5vZGUua2luZCA9PT0gXCJ0ZXN0XCIgJiYgbm9kZS5zdGF0ZSA9PT0gXCJmYWlsZWRcIikge1xuICAgICAgcmVzdWx0LnB1c2gobm9kZSk7XG4gICAgfVxuICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmNvbGxlY3RGYWlsZWRGcm9tUmVzdWx0cyhub2RlLmNoaWxkcmVuKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RUcmFjZXNGcm9tUmVzdWx0cyhcbiAgbm9kZXM6IFRlc3RDYXNlUmVzdWx0W10sXG4pOiB7IHRlc3ROYW1lOiBzdHJpbmc7IGZpbGU6IHN0cmluZzsgdHJhY2VzOiBUZXN0Q2FzZVJlc3VsdFtcInRyYWNlc1wiXSB9W10ge1xuICBjb25zdCByZXN1bHQ6IHsgdGVzdE5hbWU6IHN0cmluZzsgZmlsZTogc3RyaW5nOyB0cmFjZXM6IFRlc3RDYXNlUmVzdWx0W1widHJhY2VzXCJdIH1bXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICBpZiAobm9kZS5raW5kID09PSBcInRlc3RcIiAmJiBub2RlLnRyYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXN1bHQucHVzaCh7IHRlc3ROYW1lOiBub2RlLmZ1bGxOYW1lLCBmaWxlOiBub2RlLmZpbGUsIHRyYWNlczogbm9kZS50cmFjZXMgfSk7XG4gICAgfVxuICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmNvbGxlY3RUcmFjZXNGcm9tUmVzdWx0cyhub2RlLmNoaWxkcmVuKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RTdGF0dXNDb21tYW5kKGNvbmZpZzogU29uYW11Q29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghY29uZmlnLnRlc3Q/LmRldlJ1bm5lcj8uZW5hYmxlZCkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwiZGV2UnVubmVy6rCAIO2ZnOyEse2ZlOuQmOyngCDslYrslZjsirXri4jri6QuIHNvbmFtdS5jb25maWcudHPsl5DshJwgdGVzdC5kZXZSdW5uZXIuZW5hYmxlZDogdHJ1ZSDshKTsoJXsnbQg7ZWE7JqU7ZWp64uI64ukXCIsXG4gICAgICApLFxuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgeyBiYXNlVXJsIH0gPSByZXNvbHZlVGVzdEJhc2VVcmwoY29uZmlnKTtcbiAgY29uc3QgdXJsID0gYCR7YmFzZVVybH0vc3RhdHVzYDtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGDsmIjsg4HtlZjsp4Ag66q77ZWcIOydkeuLtTogJHtyZXNwb25zZS5zdGF0dXN9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1cyA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHtcbiAgICAgIHJlYWR5OiBib29sZWFuO1xuICAgICAgcnVubmluZzogYm9vbGVhbjtcbiAgICAgIGxhc3RSdW5BdDogc3RyaW5nIHwgbnVsbDtcbiAgICAgIHNzZUF2YWlsYWJsZTogYm9vbGVhbjtcbiAgICB9O1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIkRldlJ1bm5lciDsg4Htg5w6XCIpKTtcbiAgICBjb25zb2xlLmxvZyhgICByZWFkeTogICAgICAgICR7c3RhdHVzLnJlYWR5ID8gY2hhbGsuZ3JlZW4oXCJ0cnVlXCIpIDogY2hhbGsucmVkKFwiZmFsc2VcIil9YCk7XG4gICAgY29uc29sZS5sb2coYCAgcnVubmluZzogICAgICAke3N0YXR1cy5ydW5uaW5nID8gY2hhbGsueWVsbG93KFwidHJ1ZVwiKSA6IFwiZmFsc2VcIn1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBsYXN0UnVuQXQ6ICAgICR7c3RhdHVzLmxhc3RSdW5BdCA/PyBjaGFsay5kaW0oXCLsl4bsnYxcIil9YCk7XG4gICAgY29uc29sZS5sb2coYCAgc3NlQXZhaWxhYmxlOiAke3N0YXR1cy5zc2VBdmFpbGFibGUgPyBjaGFsay5ncmVlbihcInRydWVcIikgOiBcImZhbHNlXCJ9YCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUeXBlRXJyb3IgJiYgZXJyLmNhdXNlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXCJkZXYg7ISc67KE7JeQIOyXsOqysO2VoCDsiJgg7JeG7Iq164uI64ukLiBzb25hbXUgZGV26rCAIOyLpO2WiSDspJHsnbjsp4Ag7ZmV7J247ZWY7IS47JqUXCIpLFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OzthQUsyQztZQUVNO0FBRWpELGVBQWUsaUJBQXdDO0NBQ3JELE1BQU0sYUFBYSxRQUFRLElBQUk7QUFDL0IsU0FBUSxJQUFJLFNBQVM7QUFDckIsS0FBSTtFQUNGLE1BQU0sY0FBYyxpQkFBaUI7QUFDckMsU0FBTyxNQUFNLFdBQVcsWUFBWTtXQUM1QjtBQUNSLE1BQUksZUFBZSxXQUFXO0FBQzVCLFVBQU8sUUFBUSxJQUFJO1NBQ2Q7QUFDTCxXQUFRLElBQUksU0FBUzs7OztBQUszQixTQUFTLG1CQUFtQixRQUsxQjtDQUNBLE1BQU0sT0FBTyxPQUFPLE9BQU8sUUFBUSxRQUFRO0NBQzNDLE1BQU0sT0FBTyxPQUFPLE9BQU8sUUFBUSxRQUFRO0NBQzNDLE1BQU0sY0FBYyxPQUFPLE1BQU0sV0FBVyxlQUFlO0FBQzNELFFBQU87RUFBRTtFQUFNO0VBQU07RUFBYSxTQUFTLFVBQVUsS0FBSyxHQUFHLE9BQU87RUFBZTs7QUFHckYsZUFBc0IsY0FBNkI7Q0FDakQsTUFBTSxPQUFPLFFBQVEsS0FBSyxNQUFNLEVBQUU7Q0FFbEMsTUFBTSxTQUFTLE1BQU0sZ0JBQWdCO0NBR3JDLE1BQU1BLFFBQWtCLEVBQUU7Q0FDMUIsSUFBSUM7Q0FDSixJQUFJLGFBQWE7Q0FDakIsSUFBSSxhQUFhO0FBRWpCLE1BQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsS0FBSztFQUNwQyxNQUFNLE1BQU0sS0FBSztBQUNqQixNQUFJLFFBQVEsZUFBZSxRQUFRLE1BQU07QUFDdkMsYUFBVSxLQUFLLEVBQUU7YUFDUixRQUFRLGNBQWMsUUFBUSxNQUFNO0FBQzdDLGdCQUFhO2FBQ0osUUFBUSxjQUFjLFFBQVEsTUFBTTtBQUM3QyxnQkFBYTthQUNKLENBQUMsSUFB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
|
|
162
|
+
|
|
163
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jb21tYW5kLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vdGVzdC1jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuXG5pbXBvcnQgeyB0eXBlIFNvbmFtdUNvbmZpZyB9IGZyb20gXCIuLi9hcGkvY29uZmlnXCI7XG5pbXBvcnQgeyBsb2FkQ29uZmlnIH0gZnJvbSBcIi4uL2FwaS9jb25maWdcIjtcbmltcG9ydCB7IHR5cGUgUnVuUmVzdWx0LCB0eXBlIFRlc3RDYXNlUmVzdWx0IH0gZnJvbSBcIi4uL3Rlc3RpbmdcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkRGV2U2VydmVyQ29uZmlnKCk6IFByb21pc2U8U29uYW11Q29uZmlnPiB7XG4gIGNvbnN0IHByZXZWaXRlc3QgPSBwcm9jZXNzLmVudi5WSVRFU1Q7XG4gIHByb2Nlc3MuZW52LlZJVEVTVCA9IFwidHJ1ZVwiO1xuICB0cnkge1xuICAgIGNvbnN0IGFwaVJvb3RQYXRoID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gICAgcmV0dXJuIGF3YWl0IGxvYWRDb25maWcoYXBpUm9vdFBhdGgpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChwcmV2Vml0ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5WSVRFU1Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3MuZW52LlZJVEVTVCA9IHByZXZWaXRlc3Q7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUZXN0QmFzZVVybChjb25maWc6IFNvbmFtdUNvbmZpZyk6IHtcbiAgaG9zdDogc3RyaW5nO1xuICBwb3J0OiBudW1iZXI7XG4gIHJvdXRlUHJlZml4OiBzdHJpbmc7XG4gIGJhc2VVcmw6IHN0cmluZztcbn0ge1xuICBjb25zdCBwb3J0ID0gY29uZmlnLnNlcnZlci5saXN0ZW4/LnBvcnQgPz8gMzAwMDtcbiAgY29uc3QgaG9zdCA9IGNvbmZpZy5zZXJ2ZXIubGlzdGVuPy5ob3N0ID8/IFwibG9jYWxob3N0XCI7XG4gIGNvbnN0IHJvdXRlUHJlZml4ID0gY29uZmlnLnRlc3Q/LmRldlJ1bm5lcj8ucm91dGVQcmVmaXggPz8gXCIvX190ZXN0X19cIjtcbiAgcmV0dXJuIHsgaG9zdCwgcG9ydCwgcm91dGVQcmVmaXgsIGJhc2VVcmw6IGBodHRwOi8vJHtob3N0fToke3BvcnR9JHtyb3V0ZVByZWZpeH1gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0Q29tbWFuZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgzKTtcblxuICBjb25zdCBjb25maWcgPSBhd2FpdCBsb2FkRGV2U2VydmVyQ29uZmlnKCk7XG5cbiAgLy8gcHJvY2Vzcy5hcmd2IO2MjOyLsTogc29uYW11IHRlc3QgW2ZpbGUuLi5dIC0tcGF0dGVybiBcIuydtOumhFwiIC0tdHJhY2VzIC0tc3RhdHVzXG4gIGNvbnN0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgcGF0dGVybjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgc2hvd1RyYWNlcyA9IGZhbHNlO1xuICBsZXQgc2hvd1N0YXR1cyA9IGZhbHNlO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFyZyA9IGFyZ3NbaV07XG4gICAgaWYgKGFyZyA9PT0gXCItLXBhdHRlcm5cIiB8fCBhcmcgPT09IFwiLXBcIikge1xuICAgICAgcGF0dGVybiA9IGFyZ3NbKytpXTtcbiAgICB9IGVsc2UgaWYgKGFyZyA9PT0gXCItLXRyYWNlc1wiIHx8IGFyZyA9PT0gXCItdFwiKSB7XG4gICAgICBzaG93VHJhY2VzID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGFyZyA9PT0gXCItLXN0YXR1c1wiIHx8IGFyZyA9PT0gXCItc1wiKSB7XG4gICAgICBzaG93U3RhdHVzID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCFhcmcuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgIGZpbGVzLnB1c2goYXJnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2hvd1N0YXR1cykge1xuICAgIHJldHVybiB0ZXN0U3RhdHVzQ29tbWFuZChjb25maWcpO1xuICB9XG5cbiAgaWYgKCFjb25maWcudGVzdD8uZGV2UnVubmVyPy5lbmFibGVkKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgXCJkZXZSdW5uZXLqsIAg7Zmc7ISx7ZmU65CY7KeAIOyViuyVmOyKteuLiOuLpC4gc29uYW11LmNvbmZpZy50c+yXkOyEnCB0ZXN0LmRldlJ1bm5lci5lbmFibGVkOiB0cnVlIOyEpOygleydtCDtlYTsmpTtlanri4jri6RcIixcbiAgICAgICksXG4gICAgKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCB7IGJhc2VVcmwgfSA9IHJlc29sdmVUZXN0QmFzZVVybChjb25maWcpO1xuICBjb25zdCB1cmwgPSBgJHtiYXNlVXJsfS9ydW5gO1xuXG4gIGNvbnN0IHBheWxvYWQ6IHsgZmlsZXM/OiBzdHJpbmdbXTsgcGF0dGVybj86IHN0cmluZyB9ID0ge307XG4gIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgcGF5bG9hZC5maWxlcyA9IGZpbGVzO1xuICB9XG4gIGlmIChwYXR0ZXJuKSB7XG4gICAgcGF5bG9hZC5wYXR0ZXJuID0gcGF0dGVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICB9KTtcblxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIFwiZGV2UnVubmVy6rCAIO2ZnOyEse2ZlOuQmOyngCDslYrslZjsirXri4jri6QuIHNvbmFtdS5jb25maWcudHPsl5DshJwgdGVzdC5kZXZSdW5uZXIuZW5hYmxlZDogdHJ1ZSDshKTsoJXsnbQg7ZWE7JqU7ZWp64uI64ukXCIsXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDUwMCkge1xuICAgICAgY29uc3QgZXJyb3JCb2R5ID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgeyBlcnJvcj86IHN0cmluZyB9O1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJWaXRlc3Qg7J247Iqk7YS07Iqk6rCAIOyVhOyngSDspIDruYTrkJjsp4Ag7JWK7JWY7Iq164uI64ukXCIpKTtcbiAgICAgIGlmIChlcnJvckJvZHkuZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoZXJyb3JCb2R5LmVycm9yKSk7XG4gICAgICB9XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYOyYiOyDge2VmOyngCDrqrvtlZwg7J2R64u1OiAke3Jlc3BvbnNlLnN0YXR1c31gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgUnVuUmVzdWx0O1xuXG4gICAgY29uc3QgeyBwYXNzZWQsIGZhaWxlZDogZmFpbGVkQ291bnQsIHRvdGFsLCBkdXJhdGlvbk1zIH0gPSByZXN1bHQuc3VtbWFyeTtcbiAgICBjb25zdCBwYXNzZWRTdHIgPSBjaGFsay5ncmVlbihgJHtwYXNzZWR9IHBhc3NlZGApO1xuICAgIGNvbnN0IGZhaWxlZFN0ciA9XG4gICAgICBmYWlsZWRDb3VudCA+IDAgPyBjaGFsay5yZWQoYCR7ZmFpbGVkQ291bnR9IGZhaWxlZGApIDogYCR7ZmFpbGVkQ291bnR9IGZhaWxlZGA7XG4gICAgY29uc29sZS5sb2coYFxcblRlc3RzOiAke3Bhc3NlZFN0cn0sICR7ZmFpbGVkU3RyfSwgJHt0b3RhbH0gdG90YWxgKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYER1cmF0aW9uOiAke2R1cmF0aW9uTXN9bXNgKSk7XG5cbiAgICBjb25zdCBmYWlsZWRUZXN0cyA9IGNvbGxlY3RGYWlsZWRGcm9tUmVzdWx0cyhyZXN1bHQucmVzdWx0cyk7XG4gICAgaWYgKGZhaWxlZFRlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZC5ib2xkKFwiXFxuRmFpbGVkIHRlc3RzOlwiKSk7XG4gICAgICBmb3IgKGNvbnN0IGYgb2YgZmFpbGVkVGVzdHMpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtjaGFsay5yZWQoXCJ4XCIpfSAke2YuZnVsbE5hbWV9ICR7Y2hhbGsuZGltKGAoJHtmLmZpbGV9KWApfWApO1xuICAgICAgICBpZiAoZi5lcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtjaGFsay5yZWQoZi5lcnJvci5tZXNzYWdlKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG93VHJhY2VzKSB7XG4gICAgICBjb25zdCB0ZXN0c1dpdGhUcmFjZXMgPSBjb2xsZWN0VHJhY2VzRnJvbVJlc3VsdHMocmVzdWx0LnJlc3VsdHMpO1xuICAgICAgaWYgKHRlc3RzV2l0aFRyYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4uYm9sZChcIlxcblRyYWNlczpcIikpO1xuICAgICAgICBmb3IgKGNvbnN0IHsgdGVzdE5hbWUsIGZpbGUsIHRyYWNlcyB9IG9mIHRlc3RzV2l0aFRyYWNlcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBcXG4gICR7Y2hhbGsuYm9sZCh0ZXN0TmFtZSl9YCk7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgJHtjaGFsay5kaW0ocGF0aC5iYXNlbmFtZShmaWxlKSl9YCk7XG4gICAgICAgICAgZm9yIChjb25zdCB0cmFjZSBvZiB0cmFjZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYyA9IGAke3BhdGguYmFzZW5hbWUodHJhY2UuZmlsZVBhdGgpfToke3RyYWNlLmxpbmVOdW1iZXJ9YDtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlU3RyID1cbiAgICAgICAgICAgICAgdHlwZW9mIHRyYWNlLnZhbHVlID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgPyB0cmFjZS52YWx1ZVxuICAgICAgICAgICAgICAgIDogKEpTT04uc3RyaW5naWZ5KHRyYWNlLnZhbHVlLCBudWxsLCAyKSA/PyBcInVuZGVmaW5lZFwiKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBcXG4gICAgJHtjaGFsay55ZWxsb3coYFske3RyYWNlLmtleX1dYCl9ICR7Y2hhbGsuZGltKGxvYyl9YCk7XG4gICAgICAgICAgICBjb25zdCBpbmRlbnRlZCA9IHZhbHVlU3RyLnNwbGl0KFwiXFxuXCIpLmpvaW4oXCJcXG4gICAgXCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCAgICAke2luZGVudGVkfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgVHlwZUVycm9yICYmIGVyci5jYXVzZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFwiZGV2IOyEnOuyhOyXkCDsl7DqsrDtlaAg7IiYIOyXhuyKteuLiOuLpC4gc29uYW11IGRlduqwgCDsi6Ttlokg7KSR7J247KeAIO2ZleyduO2VmOyEuOyalFwiKSxcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0RmFpbGVkRnJvbVJlc3VsdHMobm9kZXM6IFRlc3RDYXNlUmVzdWx0W10pOiBUZXN0Q2FzZVJlc3VsdFtdIHtcbiAgY29uc3QgcmVzdWx0OiBUZXN0Q2FzZVJlc3VsdFtdID0gW107XG4gIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgIGlmIChub2RlLmtpbmQgPT09IFwidGVzdFwiICYmIG5vZGUuc3RhdGUgPT09IFwiZmFpbGVkXCIpIHtcbiAgICAgIHJlc3VsdC5wdXNoKG5vZGUpO1xuICAgIH1cbiAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5jb2xsZWN0RmFpbGVkRnJvbVJlc3VsdHMobm9kZS5jaGlsZHJlbikpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0VHJhY2VzRnJvbVJlc3VsdHMoXG4gIG5vZGVzOiBUZXN0Q2FzZVJlc3VsdFtdLFxuKTogeyB0ZXN0TmFtZTogc3RyaW5nOyBmaWxlOiBzdHJpbmc7IHRyYWNlczogVGVzdENhc2VSZXN1bHRbXCJ0cmFjZXNcIl0gfVtdIHtcbiAgY29uc3QgcmVzdWx0OiB7IHRlc3ROYW1lOiBzdHJpbmc7IGZpbGU6IHN0cmluZzsgdHJhY2VzOiBUZXN0Q2FzZVJlc3VsdFtcInRyYWNlc1wiXSB9W10gPSBbXTtcbiAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgaWYgKG5vZGUua2luZCA9PT0gXCJ0ZXN0XCIgJiYgbm9kZS50cmFjZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0LnB1c2goeyB0ZXN0TmFtZTogbm9kZS5mdWxsTmFtZSwgZmlsZTogbm9kZS5maWxlLCB0cmFjZXM6IG5vZGUudHJhY2VzIH0pO1xuICAgIH1cbiAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5jb2xsZWN0VHJhY2VzRnJvbVJlc3VsdHMobm9kZS5jaGlsZHJlbikpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0U3RhdHVzQ29tbWFuZChjb25maWc6IFNvbmFtdUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LmVuYWJsZWQpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBcImRldlJ1bm5lcuqwgCDtmZzshLHtmZTrkJjsp4Ag7JWK7JWY7Iq164uI64ukLiBzb25hbXUuY29uZmlnLnRz7JeQ7IScIHRlc3QuZGV2UnVubmVyLmVuYWJsZWQ6IHRydWUg7ISk7KCV7J20IO2VhOyalO2VqeuLiOuLpFwiLFxuICAgICAgKSxcbiAgICApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IHsgYmFzZVVybCB9ID0gcmVzb2x2ZVRlc3RCYXNlVXJsKGNvbmZpZyk7XG4gIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9L3N0YXR1c2A7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChg7JiI7IOB7ZWY7KeAIOuqu+2VnCDsnZHri7U6ICR7cmVzcG9uc2Uuc3RhdHVzfWApKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0dXMgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7XG4gICAgICByZWFkeTogYm9vbGVhbjtcbiAgICAgIHJ1bm5pbmc6IGJvb2xlYW47XG4gICAgICBsYXN0UnVuQXQ6IHN0cmluZyB8IG51bGw7XG4gICAgICBzc2VBdmFpbGFibGU6IGJvb2xlYW47XG4gICAgfTtcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoXCJEZXZSdW5uZXIg7IOB7YOcOlwiKSk7XG4gICAgY29uc29sZS5sb2coYCAgcmVhZHk6ICAgICAgICAke3N0YXR1cy5yZWFkeSA/IGNoYWxrLmdyZWVuKFwidHJ1ZVwiKSA6IGNoYWxrLnJlZChcImZhbHNlXCIpfWApO1xuICAgIGNvbnNvbGUubG9nKGAgIHJ1bm5pbmc6ICAgICAgJHtzdGF0dXMucnVubmluZyA/IGNoYWxrLnllbGxvdyhcInRydWVcIikgOiBcImZhbHNlXCJ9YCk7XG4gICAgY29uc29sZS5sb2coYCAgbGFzdFJ1bkF0OiAgICAke3N0YXR1cy5sYXN0UnVuQXQgPz8gY2hhbGsuZGltKFwi7JeG7J2MXCIpfWApO1xuICAgIGNvbnNvbGUubG9nKGAgIHNzZUF2YWlsYWJsZTogJHtzdGF0dXMuc3NlQXZhaWxhYmxlID8gY2hhbGsuZ3JlZW4oXCJ0cnVlXCIpIDogXCJmYWxzZVwifWApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgVHlwZUVycm9yICYmIGVyci5jYXVzZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFwiZGV2IOyEnOuyhOyXkCDsl7DqsrDtlaAg7IiYIOyXhuyKteuLiOuLpC4gc29uYW11IGRlduqwgCDsi6Ttlokg7KSR7J247KeAIO2ZleyduO2VmOyEuOyalFwiKSxcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztZQUswQztXQUVNO0FBRWhELGVBQWUsc0JBQTZDO0NBQzFELE1BQU0sYUFBYSxRQUFRLElBQUk7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
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { findApiRootPath, init_utils } from "../utils/utils.js";
|
|
2
2
|
import { ensureTsLoaderRegistered, init_ts_loader_registration } from "./ts-loader-registration.js";
|
|
3
|
-
|
|
4
3
|
//#region src/bin/ts-loader-register.ts
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
init_utils();
|
|
5
|
+
init_ts_loader_registration();
|
|
7
6
|
/**
|
|
8
7
|
* @sonamu-kit/ts-loader/loader를 등록하는 스크립트입니다.
|
|
9
8
|
* 이 스크립트는 sonamu cli로 dev 실행할 때 --import로 실행됩니다.
|
|
10
9
|
*/
|
|
11
10
|
await ensureTsLoaderRegistered(findApiRootPath());
|
|
12
|
-
|
|
13
11
|
//#endregion
|
|
14
|
-
export {
|
|
15
|
-
|
|
12
|
+
export {};
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHMtbG9hZGVyLXJlZ2lzdGVyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vdHMtbG9hZGVyLXJlZ2lzdGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpbmRBcGlSb290UGF0aCB9IGZyb20gXCIuLi91dGlscy91dGlscy5qc1wiO1xuaW1wb3J0IHsgZW5zdXJlVHNMb2FkZXJSZWdpc3RlcmVkIH0gZnJvbSBcIi4vdHMtbG9hZGVyLXJlZ2lzdHJhdGlvbi5qc1wiO1xuXG4vKipcbiAqIEBzb25hbXUta2l0L3RzLWxvYWRlci9sb2FkZXLrpbwg65Ox66Gd7ZWY64qUIOyKpO2BrOumve2KuOyeheuLiOuLpC5cbiAqIOydtCDsiqTtgazrpr3tirjripQgc29uYW11IGNsaeuhnCBkZXYg7Iuk7ZaJ7ZWgIOuVjCAtLWltcG9ydOuhnCDsi6TtlonrkKnri4jri6QuXG4gKi9cbmF3YWl0IGVuc3VyZVRzTG9hZGVyUmVnaXN0ZXJlZChmaW5kQXBpUm9vdFBhdGgoKSk7XG4iXSwibWFwcGluZ3MiOiI7OztXQUFtRDs0QkFDbUI7Ozs7O0FBTXRFLE1BQU0seUJBQXlCLGdCQUFnQixDQUFDIn0=
|
|
@@ -1,23 +1,16 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { createRequire, register } from "node:module";
|
|
3
3
|
import { pathToFileURL } from "node:url";
|
|
4
|
-
|
|
5
4
|
//#region src/bin/ts-loader-registration.ts
|
|
6
5
|
function getTsLoaderRegisterState() {
|
|
7
6
|
const globalState = globalThis;
|
|
8
|
-
if (!globalState[tsLoaderRegisterStateKey]) {
|
|
9
|
-
globalState[tsLoaderRegisterStateKey] = { registered: false };
|
|
10
|
-
}
|
|
7
|
+
if (!globalState[tsLoaderRegisterStateKey]) globalState[tsLoaderRegisterStateKey] = { registered: false };
|
|
11
8
|
return globalState[tsLoaderRegisterStateKey];
|
|
12
9
|
}
|
|
13
10
|
async function ensureTsLoaderRegistered(apiRoot) {
|
|
14
11
|
const state = getTsLoaderRegisterState();
|
|
15
|
-
if (state.registered)
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
void apiRoot;
|
|
19
|
-
const loaderPath = require.resolve("@sonamu-kit/ts-loader/loader");
|
|
20
|
-
register(pathToFileURL(loaderPath).href, { parentURL: import.meta.url });
|
|
12
|
+
if (state.registered) return;
|
|
13
|
+
register(pathToFileURL(require.resolve("@sonamu-kit/ts-loader/loader")).href, { parentURL: import.meta.url });
|
|
21
14
|
state.registered = true;
|
|
22
15
|
}
|
|
23
16
|
var tsLoaderRegisterStateKey, require;
|
|
@@ -25,8 +18,8 @@ var init_ts_loader_registration = __esmMin((() => {
|
|
|
25
18
|
tsLoaderRegisterStateKey = Symbol.for("sonamu.ts-loader-register.state");
|
|
26
19
|
require = createRequire(import.meta.url);
|
|
27
20
|
}));
|
|
28
|
-
|
|
29
21
|
//#endregion
|
|
30
22
|
init_ts_loader_registration();
|
|
31
23
|
export { ensureTsLoaderRegistered, init_ts_loader_registration };
|
|
32
|
-
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHMtbG9hZGVyLXJlZ2lzdHJhdGlvbi5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL3RzLWxvYWRlci1yZWdpc3RyYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tIFwibm9kZTp1cmxcIjtcblxuY29uc3QgdHNMb2FkZXJSZWdpc3RlclN0YXRlS2V5ID0gU3ltYm9sLmZvcihcInNvbmFtdS50cy1sb2FkZXItcmVnaXN0ZXIuc3RhdGVcIik7XG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG50eXBlIFRzTG9hZGVyUmVnaXN0ZXJTdGF0ZSA9IHtcbiAgcmVnaXN0ZXJlZDogYm9vbGVhbjtcbn07XG5cbnR5cGUgR2xvYmFsV2l0aFRzTG9hZGVyUmVnaXN0ZXJTdGF0ZSA9IHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICBbdHNMb2FkZXJSZWdpc3RlclN0YXRlS2V5XT86IFRzTG9hZGVyUmVnaXN0ZXJTdGF0ZTtcbn07XG5cbmZ1bmN0aW9uIGdldFRzTG9hZGVyUmVnaXN0ZXJTdGF0ZSgpOiBUc0xvYWRlclJlZ2lzdGVyU3RhdGUge1xuICBjb25zdCBnbG9iYWxTdGF0ZSA9IGdsb2JhbFRoaXMgYXMgR2xvYmFsV2l0aFRzTG9hZGVyUmVnaXN0ZXJTdGF0ZTtcblxuICBpZiAoIWdsb2JhbFN0YXRlW3RzTG9hZGVyUmVnaXN0ZXJTdGF0ZUtleV0pIHtcbiAgICBnbG9iYWxTdGF0ZVt0c0xvYWRlclJlZ2lzdGVyU3RhdGVLZXldID0geyByZWdpc3RlcmVkOiBmYWxzZSB9O1xuICB9XG5cbiAgcmV0dXJuIGdsb2JhbFN0YXRlW3RzTG9hZGVyUmVnaXN0ZXJTdGF0ZUtleV07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVUc0xvYWRlclJlZ2lzdGVyZWQoYXBpUm9vdDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHN0YXRlID0gZ2V0VHNMb2FkZXJSZWdpc3RlclN0YXRlKCk7XG4gIGlmIChzdGF0ZS5yZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdm9pZCBhcGlSb290O1xuICBjb25zdCBsb2FkZXJQYXRoID0gcmVxdWlyZS5yZXNvbHZlKFwiQHNvbmFtdS1raXQvdHMtbG9hZGVyL2xvYWRlclwiKTtcblxuICByZWdpc3RlcihwYXRoVG9GaWxlVVJMKGxvYWRlclBhdGgpLmhyZWYsIHtcbiAgICBwYXJlbnRVUkw6IGltcG9ydC5tZXRhLnVybCxcbiAgfSk7XG4gIHN0YXRlLnJlZ2lzdGVyZWQgPSB0cnVlO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBZUEsU0FBUywyQkFBa0Q7Q0FDekQsTUFBTSxjQUFjO0NBRXBCLElBQUksQ0FBQyxZQUFZLDJCQUNmLFlBQVksNEJBQTRCLEVBQUUsWUFBWSxNQUFNO0NBRzlELE9BQU8sWUFBWTtBQUNyQjtBQUVBLGVBQXNCLHlCQUF5QixTQUFnQztDQUM3RSxNQUFNLFFBQVEseUJBQXlCO0NBQ3ZDLElBQUksTUFBTSxZQUNSO0NBTUYsU0FBUyxjQUZVLFFBQVEsUUFBUSw4QkFFWixDQUFVLENBQUMsQ0FBQyxNQUFNLEVBQ3ZDLFdBQVcsT0FBTyxLQUFLLElBQ3pCLENBQUM7Q0FDRCxNQUFNLGFBQWE7QUFDckI7OztDQWxDTSwyQkFBMkIsT0FBTyxJQUFJLGlDQUFpQztDQUN2RSxVQUFVLGNBQWMsT0FBTyxLQUFLLEdBQUcifQ==
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { BentoCache, bentostore } from "bentocache";
|
|
3
3
|
import { memoryDriver } from "bentocache/drivers/memory";
|
|
4
|
-
|
|
5
4
|
//#region src/cache/cache-manager.ts
|
|
6
5
|
/**
|
|
7
6
|
* BentoCache 인스턴스를 생성합니다.
|
|
@@ -20,8 +19,8 @@ function createTestCacheManager() {
|
|
|
20
19
|
});
|
|
21
20
|
}
|
|
22
21
|
var init_cache_manager = __esmMin((() => {}));
|
|
23
|
-
|
|
24
22
|
//#endregion
|
|
25
23
|
init_cache_manager();
|
|
26
24
|
export { createCacheManager, createTestCacheManager, init_cache_manager };
|
|
27
|
-
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtbWFuYWdlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY2FjaGUvY2FjaGUtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCZW50b0NhY2hlLCBiZW50b3N0b3JlIH0gZnJvbSBcImJlbnRvY2FjaGVcIjtcbmltcG9ydCB7IG1lbW9yeURyaXZlciB9IGZyb20gXCJiZW50b2NhY2hlL2RyaXZlcnMvbWVtb3J5XCI7XG5cbmltcG9ydCB7IHR5cGUgQ2FjaGVDb25maWcsIHR5cGUgQ2FjaGVNYW5hZ2VyIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBCZW50b0NhY2hlIOyduOyKpO2EtOyKpOulvCDsg53shLHtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDYWNoZU1hbmFnZXIoY29uZmlnOiBDYWNoZUNvbmZpZyk6IENhY2hlTWFuYWdlciB7XG4gIHJldHVybiBuZXcgQmVudG9DYWNoZShjb25maWcpO1xufVxuXG4vKipcbiAqIO2FjOyKpO2KuCDtmZjqsr3smqkg6riw67O4IENhY2hlTWFuYWdlcuulvCDsg53shLHtlanri4jri6QuXG4gKiDrqZTrqqjrpqwg65Oc65287J2067KE66eMIOyCrOyaqe2VmOuKlCDqsITri6jtlZwg7ISk7KCVXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyKCk6IENhY2hlTWFuYWdlciB7XG4gIHJldHVybiBuZXcgQmVudG9DYWNoZSh7XG4gICAgZGVmYXVsdDogXCJtZW1vcnlcIixcbiAgICBzdG9yZXM6IHtcbiAgICAgIG1lbW9yeTogYmVudG9zdG9yZSgpLnVzZUwxTGF5ZXIobWVtb3J5RHJpdmVyKHsgbWF4SXRlbXM6IDEwMDAgfSkpLFxuICAgIH0sXG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBUUEsU0FBZ0IsbUJBQW1CLFFBQW1DO0NBQ3BFLE9BQU8sSUFBSSxXQUFXLE1BQU07QUFDOUI7Ozs7O0FBTUEsU0FBZ0IseUJBQXVDO0NBQ3JELE9BQU8sSUFBSSxXQUFXO0VBQ3BCLFNBQVM7RUFDVCxRQUFRLEVBQ04sUUFBUSxXQUFXLENBQUMsQ0FBQyxXQUFXLGFBQWEsRUFBRSxVQUFVLElBQUssQ0FBQyxDQUFDLEVBQ2xFO0NBQ0YsQ0FBQztBQUNIIn0=
|
package/dist/cache/decorator.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { BaseModelClass, init_base_model } from "../database/base-model.js";
|
|
3
|
-
|
|
4
3
|
//#region src/cache/decorator.ts
|
|
5
4
|
/**
|
|
6
5
|
* 캐시 매니저 참조 설정 (내부 사용)
|
|
@@ -18,12 +17,10 @@ function getCacheManagerRef() {
|
|
|
18
17
|
* 캐시 키 생성
|
|
19
18
|
*/
|
|
20
19
|
function generateCacheKey(modelName, methodName, args, keyOption) {
|
|
21
|
-
if (typeof keyOption === "function")
|
|
22
|
-
return keyOption(...args);
|
|
23
|
-
}
|
|
20
|
+
if (typeof keyOption === "function") return keyOption(...args);
|
|
24
21
|
if (typeof keyOption === "string") {
|
|
25
|
-
const argsSuffix
|
|
26
|
-
return argsSuffix
|
|
22
|
+
const argsSuffix = serializeArgs(args);
|
|
23
|
+
return argsSuffix ? `${keyOption}:${argsSuffix}` : keyOption;
|
|
27
24
|
}
|
|
28
25
|
const baseKey = `${modelName}.${methodName}`;
|
|
29
26
|
const argsSuffix = serializeArgs(args);
|
|
@@ -36,10 +33,8 @@ function serializeArgs(args) {
|
|
|
36
33
|
if (args.length === 0) return "";
|
|
37
34
|
if (args.length === 1) {
|
|
38
35
|
const arg = args[0];
|
|
39
|
-
if (arg === null || arg ===
|
|
40
|
-
if (typeof arg === "string" || typeof arg === "number" || typeof arg === "boolean")
|
|
41
|
-
return String(arg);
|
|
42
|
-
}
|
|
36
|
+
if (arg === null || arg === void 0) return "";
|
|
37
|
+
if (typeof arg === "string" || typeof arg === "number" || typeof arg === "boolean") return String(arg);
|
|
43
38
|
}
|
|
44
39
|
try {
|
|
45
40
|
return JSON.stringify(args);
|
|
@@ -67,14 +62,9 @@ function cache(options = {}) {
|
|
|
67
62
|
const originalMethod = descriptor.value;
|
|
68
63
|
descriptor.value = async function(...args) {
|
|
69
64
|
const manager = cacheManagerRef;
|
|
70
|
-
if (!manager)
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const modelName = this instanceof BaseModelClass ? this.modelName : this.frameName;
|
|
74
|
-
const methodName = propertyKey;
|
|
75
|
-
const cacheKey = generateCacheKey(modelName, methodName, args, options.key);
|
|
76
|
-
const store = options.store ? manager.use(options.store) : manager;
|
|
77
|
-
return store.getOrSet({
|
|
65
|
+
if (!manager) throw new Error("CacheManager is not initialized. Please configure 'cache' in sonamu.config.ts.");
|
|
66
|
+
const cacheKey = generateCacheKey(this instanceof BaseModelClass ? this.modelName : this.frameName, propertyKey, args, options.key);
|
|
67
|
+
return (options.store ? manager.use(options.store) : manager).getOrSet({
|
|
78
68
|
...options,
|
|
79
69
|
key: cacheKey,
|
|
80
70
|
factory: () => originalMethod.apply(this, args)
|
|
@@ -88,8 +78,8 @@ var init_decorator = __esmMin((() => {
|
|
|
88
78
|
init_base_model();
|
|
89
79
|
cacheManagerRef = null;
|
|
90
80
|
}));
|
|
91
|
-
|
|
92
81
|
//#endregion
|
|
93
82
|
init_decorator();
|
|
94
83
|
export { cache, getCacheManagerRef, init_decorator, setCacheManagerRef };
|
|
95
|
-
|
|
84
|
+
|
|
85
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9yLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jYWNoZS9kZWNvcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBCYXNlRnJhbWVDbGFzcyB9IGZyb20gXCIuLi9hcGkvYmFzZS1mcmFtZVwiO1xuaW1wb3J0IHsgQmFzZU1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBDYWNoZURlY29yYXRvck9wdGlvbnMsIHR5cGUgQ2FjaGVNYW5hZ2VyIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxudHlwZSBEZWNvcmF0b3JUYXJnZXQgPSB7IGNvbnN0cnVjdG9yOiB7IG5hbWU6IHN0cmluZyB9IH07XG5cbi8vIOy6kOyLnCDrp6Tri4jsoIAg7LC47KGwIChTb25hbXUuaW5pdOyXkOyEnCDshKTsoJXrkKgpXG5sZXQgY2FjaGVNYW5hZ2VyUmVmOiBDYWNoZU1hbmFnZXIgfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiDsupDsi5wg66ek64uI7KCAIOywuOyhsCDshKTsoJUgKOuCtOu2gCDsgqzsmqkpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWNoZU1hbmFnZXJSZWYobWFuYWdlcjogQ2FjaGVNYW5hZ2VyIHwgbnVsbCk6IHZvaWQge1xuICBjYWNoZU1hbmFnZXJSZWYgPSBtYW5hZ2VyO1xufVxuXG4vKipcbiAqIOy6kOyLnCDrp6Tri4jsoIAg7LC47KGwIOqwgOyguOyYpOq4sCAo64K067aAIOyCrOyaqSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhY2hlTWFuYWdlclJlZigpOiBDYWNoZU1hbmFnZXIgfCBudWxsIHtcbiAgcmV0dXJuIGNhY2hlTWFuYWdlclJlZjtcbn1cblxuLyoqXG4gKiDsupDsi5wg7YKkIOyDneyEsVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUNhY2hlS2V5KFxuICBtb2RlbE5hbWU6IHN0cmluZyxcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBhcmdzOiB1bmtub3duW10sXG4gIGtleU9wdGlvbj86IENhY2hlRGVjb3JhdG9yT3B0aW9uc1tcImtleVwiXSxcbik6IHN0cmluZyB7XG4gIC8vIOy7pOyKpO2FgCDtgqQg7ZWo7IiYIOyCrOyaqVxuICBpZiAodHlwZW9mIGtleU9wdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGtleU9wdGlvbiguLi5hcmdzKTtcbiAgfVxuXG4gIC8vIOusuOyekOyXtCDtgqQgKyBhcmdzIHN1ZmZpeFxuICBpZiAodHlwZW9mIGtleU9wdGlvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGFyZ3NTdWZmaXggPSBzZXJpYWxpemVBcmdzKGFyZ3MpO1xuICAgIHJldHVybiBhcmdzU3VmZml4ID8gYCR7a2V5T3B0aW9ufToke2FyZ3NTdWZmaXh9YCA6IGtleU9wdGlvbjtcbiAgfVxuXG4gIC8vIOyekOuPmSDsg53shLE6IE1vZGVsTmFtZS5tZXRob2ROYW1lOnNlcmlhbGl6ZWRBcmdzXG4gIGNvbnN0IGJhc2VLZXkgPSBgJHttb2RlbE5hbWV9LiR7bWV0aG9kTmFtZX1gO1xuICBjb25zdCBhcmdzU3VmZml4ID0gc2VyaWFsaXplQXJncyhhcmdzKTtcbiAgcmV0dXJuIGFyZ3NTdWZmaXggPyBgJHtiYXNlS2V5fToke2FyZ3NTdWZmaXh9YCA6IGJhc2VLZXk7XG59XG5cbi8qKlxuICog7J247J6QIOyngeugrO2ZlFxuICovXG5mdW5jdGlvbiBzZXJpYWxpemVBcmdzKGFyZ3M6IHVua25vd25bXSk6IHN0cmluZyB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG5cbiAgLy8g64uo7J28IHByaW1pdGl2ZSDqsJJcbiAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgY29uc3QgYXJnID0gYXJnc1swXTtcbiAgICBpZiAoYXJnID09PSBudWxsIHx8IGFyZyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gXCJcIjtcbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgYXJnID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiBhcmcgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGFyZyk7XG4gICAgfVxuICB9XG5cbiAgLy8g67O17J6h7ZWcIOqwkuydgCBKU09OIOyngeugrO2ZlFxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8g7KeB66Cs7ZmUIOyLpO2MqCDsi5wgdG9TdHJpbmcg7IKs7JqpXG4gICAgcmV0dXJuIGFyZ3MubWFwKChhcmcpID0+IFN0cmluZyhhcmcpKS5qb2luKFwiOlwiKTtcbiAgfVxufVxuXG4vKipcbiAqIEBjYWNoZSDrjbDsvZTroIjsnbTthLBcbiAqXG4gKiDrqZTshJzrk5zsnZgg6rKw6rO866W8IOy6kOyLse2VqeuLiOuLpC5cbiAqXG4gKiBAZXhhbXBsZVxuICogY2xhc3MgVXNlck1vZGVsQ2xhc3MgZXh0ZW5kcyBCYXNlTW9kZWxDbGFzczwuLi4+IHtcbiAqICAgQGNhY2hlKHsgdHRsOiAnMTBtJywgdGFnczogWyd1c2VyJ10gfSlcbiAqICAgQGFwaSgpXG4gKiAgIGFzeW5jIGZpbmRCeUlkKHN1YnNldDogVXNlclN1YnNldEtleSwgaWQ6IHN0cmluZykge1xuICogICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHsgaWQsIG51bTogMSwgcGFnZTogMSB9KTtcbiAqICAgICByZXR1cm4gcm93c1swXTtcbiAqICAgfVxuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FjaGUob3B0aW9uczogQ2FjaGVEZWNvcmF0b3JPcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIChfdGFyZ2V0OiBEZWNvcmF0b3JUYXJnZXQsIHByb3BlcnR5S2V5OiBzdHJpbmcsIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcblxuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhc3luYyBmdW5jdGlvbiAodGhpczogQmFzZU1vZGVsQ2xhc3MgfCBCYXNlRnJhbWVDbGFzcywgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICBjb25zdCBtYW5hZ2VyID0gY2FjaGVNYW5hZ2VyUmVmO1xuXG4gICAgICBpZiAoIW1hbmFnZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ2FjaGVNYW5hZ2VyIGlzIG5vdCBpbml0aWFsaXplZC4gUGxlYXNlIGNvbmZpZ3VyZSAnY2FjaGUnIGluIHNvbmFtdS5jb25maWcudHMuXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IHRoaXMgaW5zdGFuY2VvZiBCYXNlTW9kZWxDbGFzcyA/IHRoaXMubW9kZWxOYW1lIDogdGhpcy5mcmFtZU5hbWU7XG4gICAgICBjb25zdCBtZXRob2ROYW1lID0gcHJvcGVydHlLZXk7XG5cbiAgICAgIGNvbnN0IGNhY2hlS2V5ID0gZ2VuZXJhdGVDYWNoZUtleShtb2RlbE5hbWUsIG1ldGhvZE5hbWUsIGFyZ3MsIG9wdGlvbnMua2V5KTtcbiAgICAgIGNvbnN0IHN0b3JlID0gb3B0aW9ucy5zdG9yZSA/IG1hbmFnZXIudXNlKG9wdGlvbnMuc3RvcmUpIDogbWFuYWdlcjtcblxuICAgICAgcmV0dXJuIHN0b3JlLmdldE9yU2V0KHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAga2V5OiBjYWNoZUtleSxcbiAgICAgICAgZmFjdG9yeTogKCkgPT4gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyksXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQVlBLFNBQWdCLG1CQUFtQixTQUFvQztDQUNyRSxrQkFBa0I7QUFDcEI7Ozs7QUFLQSxTQUFnQixxQkFBMEM7Q0FDeEQsT0FBTztBQUNUOzs7O0FBS0EsU0FBUyxpQkFDUCxXQUNBLFlBQ0EsTUFDQSxXQUNRO0NBRVIsSUFBSSxPQUFPLGNBQWMsWUFDdkIsT0FBTyxVQUFVLEdBQUcsSUFBSTtDQUkxQixJQUFJLE9BQU8sY0FBYyxVQUFVO0VBQ2pDLE1BQU0sYUFBYSxjQUFjLElBQUk7RUFDckMsT0FBTyxhQUFhLEdBQUcsVUFBVSxHQUFHLGVBQWU7Q0FDckQ7Q0FHQSxNQUFNLFVBQVUsR0FBRyxVQUFVLEdBQUc7Q0FDaEMsTUFBTSxhQUFhLGNBQWMsSUFBSTtDQUNyQyxPQUFPLGFBQWEsR0FBRyxRQUFRLEdBQUcsZUFBZTtBQUNuRDs7OztBQUtBLFNBQVMsY0FBYyxNQUF5QjtDQUM5QyxJQUFJLEtBQUssV0FBVyxHQUFHLE9BQU87Q0FHOUIsSUFBSSxLQUFLLFdBQVcsR0FBRztFQUNyQixNQUFNLE1BQU0sS0FBSztFQUNqQixJQUFJLFFBQVEsUUFBUSxRQUFRLFFBQVcsT0FBTztFQUM5QyxJQUFJLE9BQU8sUUFBUSxZQUFZLE9BQU8sUUFBUSxZQUFZLE9BQU8sUUFBUSxXQUN2RSxPQUFPLE9BQU8sR0FBRztDQUVyQjtDQUdBLElBQUk7RUFDRixPQUFPLEtBQUssVUFBVSxJQUFJO0NBQzVCLFFBQVE7RUFFTixPQUFPLEtBQUssS0FBSyxRQUFRLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUc7Q0FDaEQ7QUFDRjs7Ozs7Ozs7Ozs7Ozs7OztBQWlCQSxTQUFnQixNQUFNLFVBQWlDLENBQUMsR0FBRztDQUN6RCxRQUFRLFNBQTBCLGFBQXFCLGVBQW1DO0VBQ3hGLE1BQU0saUJBQWlCLFdBQVc7RUFFbEMsV0FBVyxRQUFRLGVBQXVELEdBQUcsTUFBaUI7R0FDNUYsTUFBTSxVQUFVO0dBRWhCLElBQUksQ0FBQyxTQUNILE1BQU0sSUFBSSxNQUNSLGdGQUNGO0dBTUYsTUFBTSxXQUFXLGlCQUhDLGdCQUFnQixpQkFBaUIsS0FBSyxZQUFZLEtBQUssV0FHNUIsYUFBWSxNQUFNLFFBQVEsR0FBRztHQUcxRSxRQUZjLFFBQVEsUUFBUSxRQUFRLElBQUksUUFBUSxLQUFLLElBQUksUUFFcEQsQ0FBTSxTQUFTO0lBQ3BCLEdBQUc7SUFDSCxLQUFLO0lBQ0wsZUFBZSxlQUFlLE1BQU0sTUFBTSxJQUFJO0dBQ2hELENBQUM7RUFDSDtFQUVBLE9BQU87Q0FDVDtBQUNGOzs7aUJBbkh1RDtDQU1uRCxrQkFBdUMifQ==
|
package/dist/cache/drivers.js
CHANGED
|
@@ -3,7 +3,6 @@ import { memoryDriver as memoryDriver$1 } from "bentocache/drivers/memory";
|
|
|
3
3
|
import { fileDriver as fileDriver$1 } from "bentocache/drivers/file";
|
|
4
4
|
import { knexDriver as knexDriver$1 } from "bentocache/drivers/knex";
|
|
5
5
|
import { redisBusDriver as redisBusDriver$1, redisDriver as redisDriver$1 } from "bentocache/drivers/redis";
|
|
6
|
-
|
|
7
6
|
//#region src/cache/drivers.ts
|
|
8
7
|
const memoryDriver = memoryDriver$1;
|
|
9
8
|
const fileDriver = fileDriver$1;
|
|
@@ -17,7 +16,7 @@ const drivers = {
|
|
|
17
16
|
redisBus: redisBusDriver$1,
|
|
18
17
|
knex: knexDriver$1
|
|
19
18
|
};
|
|
20
|
-
|
|
21
19
|
//#endregion
|
|
22
20
|
export { drivers, fileDriver, knexDriver, memoryDriver, redisBusDriver, redisDriver, store };
|
|
23
|
-
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpdmVycy5qcyIsIm5hbWVzIjpbIl9tZW1vcnlEcml2ZXIiLCJfZmlsZURyaXZlciIsIl9yZWRpc0RyaXZlciIsIl9yZWRpc0J1c0RyaXZlciIsIl9rbmV4RHJpdmVyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NhY2hlL2RyaXZlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCZW50b0NhY2hlIOuTnOudvOydtOuyhCByZS1leHBvcnRcbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgZHJpdmVycywgc3RvcmUgfSBmcm9tICdzb25hbXUvY2FjaGUnO1xuICpcbiAqIGNhY2hlOiB7XG4gKiAgIHN0b3Jlczoge1xuICogICAgIG1haW46IHN0b3JlKClcbiAqICAgICAgIC51c2VMMUxheWVyKGRyaXZlcnMubWVtb3J5KHsgbWF4U2l6ZTogJzEwMG1iJyB9KSlcbiAqICAgICAgIC51c2VMMkxheWVyKGRyaXZlcnMucmVkaXMoeyBjb25uZWN0aW9uIH0pKVxuICogICAgICAgLnVzZUJ1cyhkcml2ZXJzLnJlZGlzQnVzKHsgY29ubmVjdGlvbiB9KSlcbiAqICAgfVxuICogfVxuICovXG5cbi8vIFN0b3JlIGJ1aWxkZXJcbmV4cG9ydCB7IGJlbnRvc3RvcmUgYXMgc3RvcmUgfSBmcm9tIFwiYmVudG9jYWNoZVwiO1xuXG5pbXBvcnQgeyBmaWxlRHJpdmVyIGFzIF9maWxlRHJpdmVyIH0gZnJvbSBcImJlbnRvY2FjaGUvZHJpdmVycy9maWxlXCI7XG5pbXBvcnQgeyBrbmV4RHJpdmVyIGFzIF9rbmV4RHJpdmVyIH0gZnJvbSBcImJlbnRvY2FjaGUvZHJpdmVycy9rbmV4XCI7XG5pbXBvcnQgeyBtZW1vcnlEcml2ZXIgYXMgX21lbW9yeURyaXZlciB9IGZyb20gXCJiZW50b2NhY2hlL2RyaXZlcnMvbWVtb3J5XCI7XG5pbXBvcnQge1xuICByZWRpc0J1c0RyaXZlciBhcyBfcmVkaXNCdXNEcml2ZXIsXG4gIHJlZGlzRHJpdmVyIGFzIF9yZWRpc0RyaXZlcixcbn0gZnJvbSBcImJlbnRvY2FjaGUvZHJpdmVycy9yZWRpc1wiO1xuXG4vLyDqsJzrs4Qg65Oc65287J2067KEIGV4cG9ydFxuZXhwb3J0IGNvbnN0IG1lbW9yeURyaXZlciA9IF9tZW1vcnlEcml2ZXI7XG5leHBvcnQgY29uc3QgZmlsZURyaXZlciA9IF9maWxlRHJpdmVyO1xuZXhwb3J0IGNvbnN0IHJlZGlzRHJpdmVyID0gX3JlZGlzRHJpdmVyO1xuZXhwb3J0IGNvbnN0IHJlZGlzQnVzRHJpdmVyID0gX3JlZGlzQnVzRHJpdmVyO1xuZXhwb3J0IGNvbnN0IGtuZXhEcml2ZXIgPSBfa25leERyaXZlcjtcblxuLy8g7Y647J2Y66W8IOychO2VnCBkcml2ZXJzIOqwneyytFxuZXhwb3J0IGNvbnN0IGRyaXZlcnMgPSB7XG4gIG1lbW9yeTogX21lbW9yeURyaXZlcixcbiAgZmlsZTogX2ZpbGVEcml2ZXIsXG4gIHJlZGlzOiBfcmVkaXNEcml2ZXIsXG4gIHJlZGlzQnVzOiBfcmVkaXNCdXNEcml2ZXIsXG4gIGtuZXg6IF9rbmV4RHJpdmVyLFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBNEJBLE1BQWEsZUFBZUE7QUFDNUIsTUFBYSxhQUFhQztBQUMxQixNQUFhLGNBQWNDO0FBQzNCLE1BQWEsaUJBQWlCQztBQUM5QixNQUFhLGFBQWFDO0FBRzFCLE1BQWEsVUFBVTtDQUNyQixRQUFRSjtDQUNSLE1BQU1DO0NBQ04sT0FBT0M7Q0FDUCxVQUFVQztDQUNWLE1BQU1DO0FBQ1IifQ==
|
package/dist/cache/index.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { createCacheManager, createTestCacheManager, init_cache_manager } from "./cache-manager.js";
|
|
2
2
|
import { cache, getCacheManagerRef, init_decorator, setCacheManagerRef } from "./decorator.js";
|
|
3
3
|
import { drivers, fileDriver, knexDriver, memoryDriver, redisBusDriver, redisDriver, store } from "./drivers.js";
|
|
4
|
-
|
|
5
4
|
//#region src/cache/index.ts
|
|
6
5
|
init_cache_manager();
|
|
7
6
|
init_decorator();
|
|
8
|
-
|
|
9
7
|
//#endregion
|
|
10
8
|
export { cache, createCacheManager, createTestCacheManager, drivers, fileDriver, getCacheManagerRef, knexDriver, memoryDriver, redisBusDriver, redisDriver, setCacheManagerRef, store };
|
|
11
|
-
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NhY2hlL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENhY2hlIG1hbmFnZXIgZmFjdG9yeVxuZXhwb3J0IHsgY3JlYXRlQ2FjaGVNYW5hZ2VyLCBjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyIH0gZnJvbSBcIi4vY2FjaGUtbWFuYWdlclwiO1xuXG4vLyBEZWNvcmF0b3JcbmV4cG9ydCB7IGNhY2hlLCBnZXRDYWNoZU1hbmFnZXJSZWYsIHNldENhY2hlTWFuYWdlclJlZiB9IGZyb20gXCIuL2RlY29yYXRvclwiO1xuXG4vLyBEcml2ZXJzICYgU3RvcmUgYnVpbGRlclxuZXhwb3J0IHtcbiAgZHJpdmVycyxcbiAgZmlsZURyaXZlcixcbiAga25leERyaXZlcixcbiAgbWVtb3J5RHJpdmVyLFxuICByZWRpc0J1c0RyaXZlcixcbiAgcmVkaXNEcml2ZXIsXG4gIHN0b3JlLFxufSBmcm9tIFwiLi9kcml2ZXJzXCI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7bUJBQzRFO2VBR0QifQ==
|
package/dist/cache/types.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
2
|
-
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
3
2
|
//#region src/cache-control/cache-control.ts
|
|
4
3
|
/**
|
|
5
4
|
* CacheControlConfig 객체를 HTTP Cache-Control 헤더 문자열로 변환합니다.
|
|
@@ -18,37 +17,19 @@ import { __esmMin } from "../_virtual/rolldown_runtime.js";
|
|
|
18
17
|
*/
|
|
19
18
|
function buildCacheControl(config) {
|
|
20
19
|
const parts = [];
|
|
21
|
-
if (config.noStore)
|
|
22
|
-
return "no-store";
|
|
23
|
-
}
|
|
20
|
+
if (config.noStore) return "no-store";
|
|
24
21
|
if (config.noCache) {
|
|
25
|
-
if (config.visibility === "private")
|
|
26
|
-
return "private, no-cache";
|
|
27
|
-
}
|
|
22
|
+
if (config.visibility === "private") return "private, no-cache";
|
|
28
23
|
return "no-cache";
|
|
29
24
|
}
|
|
30
25
|
parts.push(config.visibility ?? "public");
|
|
31
|
-
if (config.maxAge !==
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (config.
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
if (config.
|
|
38
|
-
parts.push("must-revalidate");
|
|
39
|
-
}
|
|
40
|
-
if (config.proxyRevalidate) {
|
|
41
|
-
parts.push("proxy-revalidate");
|
|
42
|
-
}
|
|
43
|
-
if (config.immutable) {
|
|
44
|
-
parts.push("immutable");
|
|
45
|
-
}
|
|
46
|
-
if (config.staleWhileRevalidate !== undefined) {
|
|
47
|
-
parts.push(`stale-while-revalidate=${config.staleWhileRevalidate}`);
|
|
48
|
-
}
|
|
49
|
-
if (config.staleIfError !== undefined) {
|
|
50
|
-
parts.push(`stale-if-error=${config.staleIfError}`);
|
|
51
|
-
}
|
|
26
|
+
if (config.maxAge !== void 0) parts.push(`max-age=${config.maxAge}`);
|
|
27
|
+
if (config.sMaxAge !== void 0) parts.push(`s-maxage=${config.sMaxAge}`);
|
|
28
|
+
if (config.mustRevalidate) parts.push("must-revalidate");
|
|
29
|
+
if (config.proxyRevalidate) parts.push("proxy-revalidate");
|
|
30
|
+
if (config.immutable) parts.push("immutable");
|
|
31
|
+
if (config.staleWhileRevalidate !== void 0) parts.push(`stale-while-revalidate=${config.staleWhileRevalidate}`);
|
|
32
|
+
if (config.staleIfError !== void 0) parts.push(`stale-if-error=${config.staleIfError}`);
|
|
52
33
|
return parts.join(", ");
|
|
53
34
|
}
|
|
54
35
|
/**
|
|
@@ -67,45 +48,51 @@ function buildCacheControl(config) {
|
|
|
67
48
|
*/
|
|
68
49
|
function applyCacheHeaders(reply, config) {
|
|
69
50
|
reply.header("Cache-Control", buildCacheControl(config));
|
|
70
|
-
if (config.vary && config.vary.length > 0)
|
|
71
|
-
reply.header("Vary", config.vary.join(", "));
|
|
72
|
-
}
|
|
51
|
+
if (config.vary && config.vary.length > 0) reply.header("Vary", config.vary.join(", "));
|
|
73
52
|
}
|
|
74
53
|
var CachePresets;
|
|
75
54
|
var init_cache_control = __esmMin((() => {
|
|
76
55
|
CachePresets = {
|
|
56
|
+
/** 캐시 금지 (민감한 데이터, mutation 요청) */
|
|
77
57
|
noStore: { noStore: true },
|
|
58
|
+
/** 캐시하되 매번 재검증 */
|
|
78
59
|
noCache: { noCache: true },
|
|
60
|
+
/** 짧은 캐시 (1분) - CSR fallback, 자주 변경되는 데이터에 적합 */
|
|
79
61
|
shortLived: {
|
|
80
62
|
visibility: "public",
|
|
81
63
|
maxAge: 60
|
|
82
64
|
},
|
|
65
|
+
/** SSR 캐시 (10초 + stale-while-revalidate 30초) */
|
|
83
66
|
ssr: {
|
|
84
67
|
visibility: "public",
|
|
85
68
|
maxAge: 10,
|
|
86
69
|
staleWhileRevalidate: 30
|
|
87
70
|
},
|
|
71
|
+
/** 중간 캐시 (5분) - 거의 변경되지 않는 데이터 (약관, 설정 등) */
|
|
88
72
|
mediumLived: {
|
|
89
73
|
visibility: "public",
|
|
90
74
|
maxAge: 300
|
|
91
75
|
},
|
|
76
|
+
/** 긴 캐시 (1시간) - 정적 컨텐츠 */
|
|
92
77
|
longLived: {
|
|
93
78
|
visibility: "public",
|
|
94
79
|
maxAge: 3600
|
|
95
80
|
},
|
|
81
|
+
/** 영구 캐시 (1년 + immutable) - 해시가 포함된 정적 파일 */
|
|
96
82
|
immutable: {
|
|
97
83
|
visibility: "public",
|
|
98
84
|
maxAge: 31536e3,
|
|
99
85
|
immutable: true
|
|
100
86
|
},
|
|
87
|
+
/** 개인화된 데이터 (로그인 사용자별 다른 응답) */
|
|
101
88
|
private: {
|
|
102
89
|
visibility: "private",
|
|
103
90
|
noCache: true
|
|
104
91
|
}
|
|
105
92
|
};
|
|
106
93
|
}));
|
|
107
|
-
|
|
108
94
|
//#endregion
|
|
109
95
|
init_cache_control();
|
|
110
96
|
export { CachePresets, applyCacheHeaders, buildCacheControl, init_cache_control };
|
|
111
|
-
|
|
97
|
+
|
|
98
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtY29udHJvbC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY2FjaGUtY29udHJvbC9jYWNoZS1jb250cm9sLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgRmFzdGlmeVJlcGx5IH0gZnJvbSBcImZhc3RpZnlcIjtcblxuaW1wb3J0IHsgdHlwZSBDYWNoZUNvbnRyb2xDb25maWcgfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuXG4vKipcbiAqIOyekOyjvCDsgqzsmqntlZjripQgQ2FjaGUtQ29udHJvbCDtlITrpqzshYvsnoXri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEFQSeyXkOyEnCDsgqzsmqlcbiAqIEBhcGkoe1xuICogICBodHRwTWV0aG9kOiAnR0VUJyxcbiAqICAgY2FjaGVDb250cm9sOiBDYWNoZVByZXNldHMuc2hvcnRMaXZlZCxcbiAqIH0pXG4gKlxuICogLy8gU1NSIOudvOyasO2KuOyXkOyEnCDsgqzsmqlcbiAqIHJlZ2lzdGVyU1NSKHtcbiAqICAgcGF0aDogJy9wcm9kdWN0cycsXG4gKiAgIGNhY2hlQ29udHJvbDogQ2FjaGVQcmVzZXRzLnNzcixcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBDYWNoZVByZXNldHMgPSB7XG4gIC8qKiDsupDsi5wg6riI7KeAICjrr7zqsJDtlZwg642w7J207YSwLCBtdXRhdGlvbiDsmpTssq0pICovXG4gIG5vU3RvcmU6IHtcbiAgICBub1N0b3JlOiB0cnVlLFxuICB9LFxuXG4gIC8qKiDsupDsi5ztlZjrkJgg66ek67KIIOyerOqygOymnSAqL1xuICBub0NhY2hlOiB7XG4gICAgbm9DYWNoZTogdHJ1ZSxcbiAgfSxcblxuICAvKiog7Ken7J2AIOy6kOyLnCAoMeu2hCkgLSBDU1IgZmFsbGJhY2ssIOyekOyjvCDrs4Dqsr3rkJjripQg642w7J207YSw7JeQIOygge2VqSAqL1xuICBzaG9ydExpdmVkOiB7XG4gICAgdmlzaWJpbGl0eTogXCJwdWJsaWNcIiBhcyBjb25zdCxcbiAgICBtYXhBZ2U6IDYwLFxuICB9LFxuXG4gIC8qKiBTU1Ig7LqQ7IucICgxMOy0iCArIHN0YWxlLXdoaWxlLXJldmFsaWRhdGUgMzDstIgpICovXG4gIHNzcjoge1xuICAgIHZpc2liaWxpdHk6IFwicHVibGljXCIgYXMgY29uc3QsXG4gICAgbWF4QWdlOiAxMCxcbiAgICBzdGFsZVdoaWxlUmV2YWxpZGF0ZTogMzAsXG4gIH0sXG5cbiAgLyoqIOykkeqwhCDsupDsi5wgKDXrtoQpIC0g6rGw7J2YIOuzgOqyveuQmOyngCDslYrripQg642w7J207YSwICjslb3qtIAsIOyEpOyglSDrk7EpICovXG4gIG1lZGl1bUxpdmVkOiB7XG4gICAgdmlzaWJpbGl0eTogXCJwdWJsaWNcIiBhcyBjb25zdCxcbiAgICBtYXhBZ2U6IDMwMCxcbiAgfSxcblxuICAvKiog6ri0IOy6kOyLnCAoMeyLnOqwhCkgLSDsoJXsoIEg7Luo7YWQ7LigICovXG4gIGxvbmdMaXZlZDoge1xuICAgIHZpc2liaWxpdHk6IFwicHVibGljXCIgYXMgY29uc3QsXG4gICAgbWF4QWdlOiAzNjAwLFxuICB9LFxuXG4gIC8qKiDsmIHqtawg7LqQ7IucICgx64WEICsgaW1tdXRhYmxlKSAtIO2VtOyLnOqwgCDtj6ztlajrkJwg7KCV7KCBIO2MjOydvCAqL1xuICBpbW11dGFibGU6IHtcbiAgICB2aXNpYmlsaXR5OiBcInB1YmxpY1wiIGFzIGNvbnN0LFxuICAgIG1heEFnZTogMzE1MzYwMDAsXG4gICAgaW1tdXRhYmxlOiB0cnVlLFxuICB9LFxuXG4gIC8qKiDqsJzsnbjtmZTrkJwg642w7J207YSwICjroZzqt7jsnbgg7IKs7Jqp7J6Q67OEIOuLpOuluCDsnZHri7UpICovXG4gIHByaXZhdGU6IHtcbiAgICB2aXNpYmlsaXR5OiBcInByaXZhdGVcIiBhcyBjb25zdCxcbiAgICBub0NhY2hlOiB0cnVlLFxuICB9LFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgQ2FjaGVDb250cm9sQ29uZmlnPjtcblxuLyoqXG4gKiBDYWNoZUNvbnRyb2xDb25maWcg6rCd7LK066W8IEhUVFAgQ2FjaGUtQ29udHJvbCDtl6TrjZQg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogYnVpbGRDYWNoZUNvbnRyb2woeyB2aXNpYmlsaXR5OiAncHVibGljJywgbWF4QWdlOiA2MCB9KTtcbiAqIC8vID0+ICdwdWJsaWMsIG1heC1hZ2U9NjAnXG4gKlxuICogYnVpbGRDYWNoZUNvbnRyb2woeyBub1N0b3JlOiB0cnVlIH0pO1xuICogLy8gPT4gJ25vLXN0b3JlJ1xuICpcbiAqIGJ1aWxkQ2FjaGVDb250cm9sKENhY2hlUHJlc2V0cy5pbW11dGFibGUpO1xuICogLy8gPT4gJ3B1YmxpYywgbWF4LWFnZT0zMTUzNjAwMCwgaW1tdXRhYmxlJ1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENhY2hlQ29udHJvbChjb25maWc6IENhY2hlQ29udHJvbENvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIG5vU3RvcmXqsIAg7ISk7KCV65CY66m0IOuLpOuluCDrqqjrk6Ag6rKD7J2EIOustOyLnO2VqeuLiOuLpC5cbiAgaWYgKGNvbmZpZy5ub1N0b3JlKSB7XG4gICAgcmV0dXJuIFwibm8tc3RvcmVcIjtcbiAgfVxuXG4gIC8vIG5vQ2FjaGXqsIAg7ISk7KCV65CY66m0IHZpc2liaWxpdHnsmYAg7ZWo6ruYIOuwmO2ZmO2VqeuLiOuLpC5cbiAgaWYgKGNvbmZpZy5ub0NhY2hlKSB7XG4gICAgaWYgKGNvbmZpZy52aXNpYmlsaXR5ID09PSBcInByaXZhdGVcIikge1xuICAgICAgcmV0dXJuIFwicHJpdmF0ZSwgbm8tY2FjaGVcIjtcbiAgICB9XG4gICAgcmV0dXJuIFwibm8tY2FjaGVcIjtcbiAgfVxuXG4gIC8vIHZpc2liaWxpdHkgKOq4sOuzuOqwkjogcHVibGljKVxuICBwYXJ0cy5wdXNoKGNvbmZpZy52aXNpYmlsaXR5ID8/IFwicHVibGljXCIpO1xuXG4gIC8vIFRUTCDshKTsoJVcbiAgaWYgKGNvbmZpZy5tYXhBZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHBhcnRzLnB1c2goYG1heC1hZ2U9JHtjb25maWcubWF4QWdlfWApO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5zTWF4QWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICBwYXJ0cy5wdXNoKGBzLW1heGFnZT0ke2NvbmZpZy5zTWF4QWdlfWApO1xuICB9XG5cbiAgLy8g7J6s6rKA7KadIOyYteyFmFxuICBpZiAoY29uZmlnLm11c3RSZXZhbGlkYXRlKSB7XG4gICAgcGFydHMucHVzaChcIm11c3QtcmV2YWxpZGF0ZVwiKTtcbiAgfVxuXG4gIGlmIChjb25maWcucHJveHlSZXZhbGlkYXRlKSB7XG4gICAgcGFydHMucHVzaChcInByb3h5LXJldmFsaWRhdGVcIik7XG4gIH1cblxuICBpZiAoY29uZmlnLmltbXV0YWJsZSkge1xuICAgIHBhcnRzLnB1c2goXCJpbW11dGFibGVcIik7XG4gIH1cblxuICAvLyBTdGFsZSDsmLXshZhcbiAgaWYgKGNvbmZpZy5zdGFsZVdoaWxlUmV2YWxpZGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcGFydHMucHVzaChgc3RhbGUtd2hpbGUtcmV2YWxpZGF0ZT0ke2NvbmZpZy5zdGFsZVdoaWxlUmV2YWxpZGF0ZX1gKTtcbiAgfVxuXG4gIGlmIChjb25maWcuc3RhbGVJZkVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBwYXJ0cy5wdXNoKGBzdGFsZS1pZi1lcnJvcj0ke2NvbmZpZy5zdGFsZUlmRXJyb3J9YCk7XG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbihcIiwgXCIpO1xufVxuXG4vKipcbiAqIENhY2hlLUNvbnRyb2wg7Zek642U7JmAIOq0gOugqCDtl6TrjZQoVmFyeSnrpbwgRmFzdGlmeVJlcGx57JeQIOyEpOygle2VqeuLiOuLpC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIHtcbiAqICAgdmlzaWJpbGl0eTogXCJwdWJsaWNcIixcbiAqICAgbWF4QWdlOiAzMDAsXG4gKiAgIHZhcnk6IFtcIkFjY2VwdC1MYW5ndWFnZVwiXSxcbiAqIH0pO1xuICogLy8gPT4gQ2FjaGUtQ29udHJvbDogcHVibGljLCBtYXgtYWdlPTMwMFxuICogLy8gPT4gVmFyeTogQWNjZXB0LUxhbmd1YWdlXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5OiBGYXN0aWZ5UmVwbHksIGNvbmZpZzogQ2FjaGVDb250cm9sQ29uZmlnKTogdm9pZCB7XG4gIHJlcGx5LmhlYWRlcihcIkNhY2hlLUNvbnRyb2xcIiwgYnVpbGRDYWNoZUNvbnRyb2woY29uZmlnKSk7XG5cbiAgaWYgKGNvbmZpZy52YXJ5ICYmIGNvbmZpZy52YXJ5Lmxlbmd0aCA+IDApIHtcbiAgICByZXBseS5oZWFkZXIoXCJWYXJ5XCIsIGNvbmZpZy52YXJ5LmpvaW4oXCIsIFwiKSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1RkEsU0FBZ0Isa0JBQWtCLFFBQW9DO0NBQ3BFLE1BQU0sUUFBa0IsQ0FBQztDQUd6QixJQUFJLE9BQU8sU0FDVCxPQUFPO0NBSVQsSUFBSSxPQUFPLFNBQVM7RUFDbEIsSUFBSSxPQUFPLGVBQWUsV0FDeEIsT0FBTztFQUVULE9BQU87Q0FDVDtDQUdBLE1BQU0sS0FBSyxPQUFPLGNBQWMsUUFBUTtDQUd4QyxJQUFJLE9BQU8sV0FBVyxRQUNwQixNQUFNLEtBQUssV0FBVyxPQUFPLFFBQVE7Q0FHdkMsSUFBSSxPQUFPLFlBQVksUUFDckIsTUFBTSxLQUFLLFlBQVksT0FBTyxTQUFTO0NBSXpDLElBQUksT0FBTyxnQkFDVCxNQUFNLEtBQUssaUJBQWlCO0NBRzlCLElBQUksT0FBTyxpQkFDVCxNQUFNLEtBQUssa0JBQWtCO0NBRy9CLElBQUksT0FBTyxXQUNULE1BQU0sS0FBSyxXQUFXO0NBSXhCLElBQUksT0FBTyx5QkFBeUIsUUFDbEMsTUFBTSxLQUFLLDBCQUEwQixPQUFPLHNCQUFzQjtDQUdwRSxJQUFJLE9BQU8saUJBQWlCLFFBQzFCLE1BQU0sS0FBSyxrQkFBa0IsT0FBTyxjQUFjO0NBR3BELE9BQU8sTUFBTSxLQUFLLElBQUk7QUFDeEI7Ozs7Ozs7Ozs7Ozs7OztBQWdCQSxTQUFnQixrQkFBa0IsT0FBcUIsUUFBa0M7Q0FDdkYsTUFBTSxPQUFPLGlCQUFpQixrQkFBa0IsTUFBTSxDQUFDO0NBRXZELElBQUksT0FBTyxRQUFRLE9BQU8sS0FBSyxTQUFTLEdBQ3RDLE1BQU0sT0FBTyxRQUFRLE9BQU8sS0FBSyxLQUFLLElBQUksQ0FBQztBQUUvQzs7O0NBMUlhLGVBQWU7O0VBRTFCLFNBQVMsRUFDUCxTQUFTLEtBQ1g7O0VBR0EsU0FBUyxFQUNQLFNBQVMsS0FDWDs7RUFHQSxZQUFZO0dBQ1YsWUFBWTtHQUNaLFFBQVE7RUFDVjs7RUFHQSxLQUFLO0dBQ0gsWUFBWTtHQUNaLFFBQVE7R0FDUixzQkFBc0I7RUFDeEI7O0VBR0EsYUFBYTtHQUNYLFlBQVk7R0FDWixRQUFRO0VBQ1Y7O0VBR0EsV0FBVztHQUNULFlBQVk7R0FDWixRQUFRO0VBQ1Y7O0VBR0EsV0FBVztHQUNULFlBQVk7R0FDWixRQUFRO0dBQ1IsV0FBVztFQUNiOztFQUdBLFNBQVM7R0FDUCxZQUFZO0dBQ1osU0FBUztFQUNYO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {};
|