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
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { init_decorators, registeredApis } from "../api/decorators.js";
|
|
3
3
|
import { init_validator, validateMethodName } from "../api/validator.js";
|
|
4
4
|
import inflection from "inflection";
|
|
5
5
|
import assert from "assert";
|
|
6
6
|
import { readFile } from "fs/promises";
|
|
7
7
|
import ts from "typescript";
|
|
8
|
-
|
|
9
8
|
//#region src/syncer/api-parser.ts
|
|
10
9
|
/**
|
|
11
10
|
* TypeScript 파일을 파싱하여 API 메소드 정보를 추출합니다.
|
|
@@ -14,18 +13,14 @@ import ts from "typescript";
|
|
|
14
13
|
* @returns API 메소드 정보 배열 (타입 파라미터, 파라미터, 리턴 타입 등)
|
|
15
14
|
*/
|
|
16
15
|
async function readApisFromFile(filePath) {
|
|
17
|
-
if (!filePath.endsWith(".ts")) {
|
|
18
|
-
throw new Error(`${filePath} does not seem to be a TypeScript file. Please check the file path. We only support parsing TypeScript files.`);
|
|
19
|
-
}
|
|
16
|
+
if (!filePath.endsWith(".ts")) throw new Error(`${filePath} does not seem to be a TypeScript file. Please check the file path. We only support parsing TypeScript files.`);
|
|
20
17
|
const sourceFile = ts.createSourceFile(filePath, (await readFile(filePath)).toString(), ts.ScriptTarget.Latest);
|
|
21
18
|
const methods = [];
|
|
22
19
|
let modelName = "UnknownModel";
|
|
23
20
|
let methodName = "unknownMethod";
|
|
24
21
|
const visitor = (node) => {
|
|
25
22
|
if (ts.isClassDeclaration(node)) {
|
|
26
|
-
if (node.name && ts.isIdentifier(node.name))
|
|
27
|
-
modelName = node.name.escapedText.toString().replace(/Class$/, "");
|
|
28
|
-
}
|
|
23
|
+
if (node.name && ts.isIdentifier(node.name)) modelName = node.name.escapedText.toString().replace(/Class$/, "");
|
|
29
24
|
}
|
|
30
25
|
if (ts.isMethodDeclaration(node)) {
|
|
31
26
|
if (ts.isIdentifier(node.name)) {
|
|
@@ -37,7 +32,7 @@ async function readApisFromFile(filePath) {
|
|
|
37
32
|
return {
|
|
38
33
|
t: "type-param",
|
|
39
34
|
id: tp.name.escapedText.toString(),
|
|
40
|
-
constraint: tp.constraint ? resolveTypeNode(tp.constraint) :
|
|
35
|
+
constraint: tp.constraint ? resolveTypeNode(tp.constraint) : void 0
|
|
41
36
|
};
|
|
42
37
|
});
|
|
43
38
|
const parameters = node.parameters.map((paramDec, index) => {
|
|
@@ -45,13 +40,11 @@ async function readApisFromFile(filePath) {
|
|
|
45
40
|
return resolveParamDec({
|
|
46
41
|
name: paramDec.name,
|
|
47
42
|
type: paramDec.type,
|
|
48
|
-
optional: paramDec.questionToken !==
|
|
43
|
+
optional: paramDec.questionToken !== void 0 || paramDec.initializer !== void 0,
|
|
49
44
|
defaultDef
|
|
50
45
|
}, index);
|
|
51
46
|
});
|
|
52
|
-
if (node.type ===
|
|
53
|
-
throw new Error(`리턴 타입이 기재되지 않은 메소드 ${modelName}.${methodName}`);
|
|
54
|
-
}
|
|
47
|
+
if (node.type === void 0) throw new Error(`리턴 타입이 기재되지 않은 메소드 ${modelName}.${methodName}`);
|
|
55
48
|
const returnType = resolveTypeNode(node.type);
|
|
56
49
|
const websocketTypeRefs = readWebSocketTypeRefs(node);
|
|
57
50
|
methods.push({
|
|
@@ -66,24 +59,18 @@ async function readApisFromFile(filePath) {
|
|
|
66
59
|
ts.forEachChild(node, visitor);
|
|
67
60
|
};
|
|
68
61
|
visitor(sourceFile);
|
|
69
|
-
if (methods.length === 0)
|
|
70
|
-
return [];
|
|
71
|
-
}
|
|
62
|
+
if (methods.length === 0) return [];
|
|
72
63
|
const currentModelApis = registeredApis.filter((api) => {
|
|
73
64
|
return methods.find((method) => method.modelName === api.modelName && method.methodName === api.methodName);
|
|
74
65
|
});
|
|
75
|
-
if (currentModelApis.length === 0)
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
const extendedApis = currentModelApis.map((api) => {
|
|
66
|
+
if (currentModelApis.length === 0) return [];
|
|
67
|
+
return currentModelApis.map((api) => {
|
|
79
68
|
const foundMethod = methods.find((method) => method.modelName === api.modelName && method.methodName === api.methodName);
|
|
80
|
-
if (!foundMethod) {
|
|
81
|
-
throw new Error(`API ${api.modelName}.${api.methodName} not found in ${filePath}`);
|
|
82
|
-
}
|
|
69
|
+
if (!foundMethod) throw new Error(`API ${api.modelName}.${api.methodName} not found in ${filePath}`);
|
|
83
70
|
const websocketOptions = api.websocketOptions ? {
|
|
84
71
|
...api.websocketOptions,
|
|
85
72
|
...foundMethod.websocketTypeRefs
|
|
86
|
-
} :
|
|
73
|
+
} : void 0;
|
|
87
74
|
return {
|
|
88
75
|
...api,
|
|
89
76
|
websocketOptions,
|
|
@@ -92,70 +79,41 @@ async function readApisFromFile(filePath) {
|
|
|
92
79
|
returnType: foundMethod?.returnType
|
|
93
80
|
};
|
|
94
81
|
});
|
|
95
|
-
return extendedApis;
|
|
96
82
|
}
|
|
97
83
|
function readWebSocketTypeRefs(node) {
|
|
98
84
|
const optionsLiteral = getDecoratorOptionsObjectLiteral(node, "websocket");
|
|
99
|
-
if (!optionsLiteral) {
|
|
100
|
-
return {};
|
|
101
|
-
}
|
|
85
|
+
if (!optionsLiteral) return {};
|
|
102
86
|
const refs = {};
|
|
103
87
|
for (const property of optionsLiteral.properties) {
|
|
104
|
-
if (!ts.isPropertyAssignment(property))
|
|
105
|
-
continue;
|
|
106
|
-
}
|
|
88
|
+
if (!ts.isPropertyAssignment(property)) continue;
|
|
107
89
|
const propertyName = getPropertyNameText(property.name);
|
|
108
|
-
if (propertyName !== "outEvents" && propertyName !== "inEvents")
|
|
109
|
-
continue;
|
|
110
|
-
}
|
|
90
|
+
if (propertyName !== "outEvents" && propertyName !== "inEvents") continue;
|
|
111
91
|
const typeRef = resolveDecoratorTypeRef(property.initializer);
|
|
112
|
-
if (!typeRef)
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
if (propertyName === "outEvents") {
|
|
116
|
-
refs.outEventsTypeRef = typeRef;
|
|
117
|
-
} else {
|
|
118
|
-
refs.inEventsTypeRef = typeRef;
|
|
119
|
-
}
|
|
92
|
+
if (!typeRef) continue;
|
|
93
|
+
if (propertyName === "outEvents") refs.outEventsTypeRef = typeRef;
|
|
94
|
+
else refs.inEventsTypeRef = typeRef;
|
|
120
95
|
}
|
|
121
96
|
return refs;
|
|
122
97
|
}
|
|
123
98
|
function getDecoratorOptionsObjectLiteral(node, decoratorName) {
|
|
124
99
|
for (const modifier of node.modifiers ?? []) {
|
|
125
|
-
if (!ts.isDecorator(modifier))
|
|
126
|
-
continue;
|
|
127
|
-
}
|
|
100
|
+
if (!ts.isDecorator(modifier)) continue;
|
|
128
101
|
const expression = modifier.expression;
|
|
129
|
-
if (!ts.isCallExpression(expression))
|
|
130
|
-
|
|
131
|
-
}
|
|
132
|
-
if (!ts.isIdentifier(expression.expression) || expression.expression.text !== decoratorName) {
|
|
133
|
-
continue;
|
|
134
|
-
}
|
|
102
|
+
if (!ts.isCallExpression(expression)) continue;
|
|
103
|
+
if (!ts.isIdentifier(expression.expression) || expression.expression.text !== decoratorName) continue;
|
|
135
104
|
const [firstArg] = expression.arguments;
|
|
136
|
-
if (firstArg && ts.isObjectLiteralExpression(firstArg))
|
|
137
|
-
return firstArg;
|
|
138
|
-
}
|
|
105
|
+
if (firstArg && ts.isObjectLiteralExpression(firstArg)) return firstArg;
|
|
139
106
|
}
|
|
140
|
-
return undefined;
|
|
141
107
|
}
|
|
142
108
|
function getPropertyNameText(name) {
|
|
143
|
-
if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name))
|
|
144
|
-
return name.text;
|
|
145
|
-
}
|
|
146
|
-
return undefined;
|
|
109
|
+
if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name)) return name.text;
|
|
147
110
|
}
|
|
148
111
|
function resolveDecoratorTypeRef(expression) {
|
|
149
|
-
if (ts.isIdentifier(expression)) {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
}
|
|
155
|
-
if (ts.isAsExpression(expression) || ts.isParenthesizedExpression(expression) || ts.isNonNullExpression(expression) || ts.isTypeAssertionExpression(expression)) {
|
|
156
|
-
return resolveDecoratorTypeRef(expression.expression);
|
|
157
|
-
}
|
|
158
|
-
return undefined;
|
|
112
|
+
if (ts.isIdentifier(expression)) return {
|
|
113
|
+
t: "ref",
|
|
114
|
+
id: expression.text
|
|
115
|
+
};
|
|
116
|
+
if (ts.isAsExpression(expression) || ts.isParenthesizedExpression(expression) || ts.isNonNullExpression(expression) || ts.isTypeAssertionExpression(expression)) return resolveDecoratorTypeRef(expression.expression);
|
|
159
117
|
}
|
|
160
118
|
function resolveTypeNode(typeNode) {
|
|
161
119
|
switch (typeNode?.kind) {
|
|
@@ -169,61 +127,46 @@ function resolveTypeNode(typeNode) {
|
|
|
169
127
|
case ts.SyntaxKind.VoidKeyword: return "void";
|
|
170
128
|
case ts.SyntaxKind.LiteralType: {
|
|
171
129
|
const literal = typeNode.literal;
|
|
172
|
-
if (ts.isStringLiteral(literal)) {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
value: literal.text
|
|
176
|
-
};
|
|
177
|
-
} else if (ts.isNumericLiteral(literal)) {
|
|
178
|
-
return {
|
|
179
|
-
t: "numeric-literal",
|
|
180
|
-
value: Number(literal.text)
|
|
181
|
-
};
|
|
182
|
-
} else {
|
|
183
|
-
if (literal.kind === ts.SyntaxKind.NullKeyword) {
|
|
184
|
-
return "null";
|
|
185
|
-
} else if (literal.kind === ts.SyntaxKind.UndefinedKeyword) {
|
|
186
|
-
return "undefined";
|
|
187
|
-
} else if (literal.kind === ts.SyntaxKind.TrueKeyword) {
|
|
188
|
-
return "true";
|
|
189
|
-
} else if (literal.kind === ts.SyntaxKind.FalseKeyword) {
|
|
190
|
-
return "false";
|
|
191
|
-
}
|
|
192
|
-
throw new Error("알 수 없는 리터럴");
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
case ts.SyntaxKind.ArrayType: {
|
|
196
|
-
const arrNode = typeNode;
|
|
197
|
-
return {
|
|
198
|
-
t: "array",
|
|
199
|
-
elementsType: resolveTypeNode(arrNode.elementType)
|
|
130
|
+
if (ts.isStringLiteral(literal)) return {
|
|
131
|
+
t: "string-literal",
|
|
132
|
+
value: literal.text
|
|
200
133
|
};
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
return {
|
|
205
|
-
t: "object",
|
|
206
|
-
props: literalNode.members.map((member) => {
|
|
207
|
-
if (ts.isIndexSignatureDeclaration(member)) {
|
|
208
|
-
assert(member.parameters[0]);
|
|
209
|
-
const res = resolveParamDec({
|
|
210
|
-
name: member.parameters[0].name,
|
|
211
|
-
type: member.parameters[0].type
|
|
212
|
-
});
|
|
213
|
-
return resolveParamDec({
|
|
214
|
-
name: { escapedText: `[${res.name}${res.optional ? "?" : ""}: ${res.type}]` },
|
|
215
|
-
type: member.type
|
|
216
|
-
});
|
|
217
|
-
} else {
|
|
218
|
-
return resolveParamDec({
|
|
219
|
-
name: member.name,
|
|
220
|
-
type: member.type,
|
|
221
|
-
optional: member.questionToken !== undefined
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
})
|
|
134
|
+
else if (ts.isNumericLiteral(literal)) return {
|
|
135
|
+
t: "numeric-literal",
|
|
136
|
+
value: Number(literal.text)
|
|
225
137
|
};
|
|
138
|
+
else {
|
|
139
|
+
if (literal.kind === ts.SyntaxKind.NullKeyword) return "null";
|
|
140
|
+
else if (literal.kind === ts.SyntaxKind.UndefinedKeyword) return "undefined";
|
|
141
|
+
else if (literal.kind === ts.SyntaxKind.TrueKeyword) return "true";
|
|
142
|
+
else if (literal.kind === ts.SyntaxKind.FalseKeyword) return "false";
|
|
143
|
+
throw new Error("알 수 없는 리터럴");
|
|
144
|
+
}
|
|
226
145
|
}
|
|
146
|
+
case ts.SyntaxKind.ArrayType: return {
|
|
147
|
+
t: "array",
|
|
148
|
+
elementsType: resolveTypeNode(typeNode.elementType)
|
|
149
|
+
};
|
|
150
|
+
case ts.SyntaxKind.TypeLiteral: return {
|
|
151
|
+
t: "object",
|
|
152
|
+
props: typeNode.members.map((member) => {
|
|
153
|
+
if (ts.isIndexSignatureDeclaration(member)) {
|
|
154
|
+
assert(member.parameters[0]);
|
|
155
|
+
const res = resolveParamDec({
|
|
156
|
+
name: member.parameters[0].name,
|
|
157
|
+
type: member.parameters[0].type
|
|
158
|
+
});
|
|
159
|
+
return resolveParamDec({
|
|
160
|
+
name: { escapedText: `[${res.name}${res.optional ? "?" : ""}: ${res.type}]` },
|
|
161
|
+
type: member.type
|
|
162
|
+
});
|
|
163
|
+
} else return resolveParamDec({
|
|
164
|
+
name: member.name,
|
|
165
|
+
type: member.type,
|
|
166
|
+
optional: member.questionToken !== void 0
|
|
167
|
+
});
|
|
168
|
+
})
|
|
169
|
+
};
|
|
227
170
|
case ts.SyntaxKind.TypeReference: return {
|
|
228
171
|
t: "ref",
|
|
229
172
|
id: typeNode.typeName.escapedText.toString(),
|
|
@@ -243,12 +186,10 @@ function resolveTypeNode(typeNode) {
|
|
|
243
186
|
index: resolveTypeNode(typeNode.indexType)
|
|
244
187
|
};
|
|
245
188
|
case ts.SyntaxKind.TupleType:
|
|
246
|
-
if (ts.isTupleTypeNode(typeNode)) {
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
};
|
|
251
|
-
}
|
|
189
|
+
if (ts.isTupleTypeNode(typeNode)) return {
|
|
190
|
+
t: "tuple-type",
|
|
191
|
+
elements: typeNode.elements.map((elem) => resolveTypeNode(elem))
|
|
192
|
+
};
|
|
252
193
|
break;
|
|
253
194
|
case ts.SyntaxKind.ParenthesizedType: return resolveTypeNode(typeNode.type);
|
|
254
195
|
case ts.SyntaxKind.FunctionType: return {
|
|
@@ -256,12 +197,12 @@ function resolveTypeNode(typeNode) {
|
|
|
256
197
|
parameters: typeNode.parameters.map((param) => ({
|
|
257
198
|
name: param.name.getText(),
|
|
258
199
|
type: param.type ? resolveTypeNode(param.type) : "unknown",
|
|
259
|
-
optional: param.questionToken !==
|
|
260
|
-
defaultDef:
|
|
200
|
+
optional: param.questionToken !== void 0,
|
|
201
|
+
defaultDef: void 0
|
|
261
202
|
})),
|
|
262
203
|
returnType: resolveTypeNode(typeNode.type)
|
|
263
204
|
};
|
|
264
|
-
case
|
|
205
|
+
case void 0: throw new Error(`typeNode undefined`);
|
|
265
206
|
}
|
|
266
207
|
console.debug(typeNode);
|
|
267
208
|
throw new Error(`알 수 없는 SyntaxKind ${typeNode.kind}`);
|
|
@@ -269,37 +210,30 @@ function resolveTypeNode(typeNode) {
|
|
|
269
210
|
function resolveParamDec(paramDec, index = 0) {
|
|
270
211
|
const name = paramDec.name;
|
|
271
212
|
const type = resolveTypeNode(paramDec.type);
|
|
272
|
-
if (name ===
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
});
|
|
278
|
-
}
|
|
213
|
+
if (name === void 0) console.debug({
|
|
214
|
+
name,
|
|
215
|
+
type,
|
|
216
|
+
paramDec
|
|
217
|
+
});
|
|
279
218
|
const result = {
|
|
280
219
|
name: name.escapedText ? name.escapedText.toString() : `nonameAt${index}`,
|
|
281
220
|
type,
|
|
282
221
|
optional: paramDec.optional === true,
|
|
283
222
|
defaultDef: paramDec?.defaultDef
|
|
284
223
|
};
|
|
285
|
-
if (ts.isObjectBindingPattern(name) && ts.isTypeReferenceNode(paramDec.type) && ts.isIdentifier(paramDec.type.typeName))
|
|
286
|
-
result.name = inflection.camelize(paramDec.type.typeName.text, true);
|
|
287
|
-
}
|
|
224
|
+
if (ts.isObjectBindingPattern(name) && ts.isTypeReferenceNode(paramDec.type) && ts.isIdentifier(paramDec.type.typeName)) result.name = inflection.camelize(paramDec.type.typeName.text, true);
|
|
288
225
|
return result;
|
|
289
226
|
}
|
|
290
227
|
function printNode(node, sourceFile) {
|
|
291
|
-
if (node ===
|
|
292
|
-
|
|
293
|
-
}
|
|
294
|
-
const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
|
|
295
|
-
return printer.printNode(ts.EmitHint.Unspecified, node, sourceFile);
|
|
228
|
+
if (node === void 0) return;
|
|
229
|
+
return ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }).printNode(ts.EmitHint.Unspecified, node, sourceFile);
|
|
296
230
|
}
|
|
297
231
|
var init_api_parser = __esmMin((() => {
|
|
298
232
|
init_decorators();
|
|
299
233
|
init_validator();
|
|
300
234
|
}));
|
|
301
|
-
|
|
302
235
|
//#endregion
|
|
303
236
|
init_api_parser();
|
|
304
237
|
export { init_api_parser, readApisFromFile };
|
|
305
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLXBhcnNlci5qcyIsIm5hbWVzIjpbIm1ldGhvZHM6IFBhcnNlZE1ldGhvZFtdIiwibW9kZWxOYW1lOiBzdHJpbmciLCJtZXRob2ROYW1lOiBzdHJpbmciLCJ0eXBlUGFyYW1ldGVyczogQXBpUGFyYW1UeXBlLlR5cGVQYXJhbVtdIiwicGFyYW1ldGVyczogQXBpUGFyYW1bXSIsInJlZnM6IFdlYlNvY2tldFR5cGVSZWZzIiwicmVzdWx0OiBBcGlQYXJhbSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvYXBpLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5cbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuaW1wb3J0IHsgcmVnaXN0ZXJlZEFwaXMgfSBmcm9tIFwiLi4vYXBpL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IHR5cGUgRXh0ZW5kZWRBcGkgfSBmcm9tIFwiLi4vYXBpL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IHR5cGUgUmVzb2x2ZWRXZWJTb2NrZXREZWNvcmF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZU1ldGhvZE5hbWUgfSBmcm9tIFwiLi4vYXBpL3ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgdHlwZSBBcGlQYXJhbSwgdHlwZSBBcGlQYXJhbVR5cGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcblxudHlwZSBXZWJTb2NrZXRUeXBlUmVmcyA9IFBpY2s8XG4gIFJlc29sdmVkV2ViU29ja2V0RGVjb3JhdG9yT3B0aW9ucyxcbiAgXCJvdXRFdmVudHNUeXBlUmVmXCIgfCBcImluRXZlbnRzVHlwZVJlZlwiXG4+O1xudHlwZSBQYXJzZWRNZXRob2QgPSB7XG4gIG1vZGVsTmFtZTogc3RyaW5nO1xuICBtZXRob2ROYW1lOiBzdHJpbmc7XG4gIHR5cGVQYXJhbWV0ZXJzOiBBcGlQYXJhbVR5cGUuVHlwZVBhcmFtW107XG4gIHBhcmFtZXRlcnM6IEFwaVBhcmFtW107XG4gIHJldHVyblR5cGU6IEFwaVBhcmFtVHlwZTtcbiAgd2Vic29ja2V0VHlwZVJlZnM6IFdlYlNvY2tldFR5cGVSZWZzO1xufTtcblxuLyoqXG4gKiBUeXBlU2NyaXB0IO2MjOydvOydhCDtjIzsi7HtlZjsl6wgQVBJIOuplOyGjOuTnCDsoJXrs7Trpbwg7LaU7Lac7ZWp64uI64ukLlxuICogQGFwaSDrjbDsvZTroIjsnbTthLDqsIAg67aZ7J2AIOuplOyGjOuTnOuTpOydmCDtg4DsnoUg7KCV67O066W8IOu2hOyEne2VqeuLiOuLpC5cbiAqIEBwYXJhbSBmaWxlUGF0aCAtIO2MjOyLse2VoCBUeXBlU2NyaXB0IO2MjOydvOydmCDsoIjrjIAg6rK966GcXG4gKiBAcmV0dXJucyBBUEkg66mU7IaM65OcIOygleuztCDrsLDsl7QgKO2DgOyehSDtjIzrnbzrr7jthLAsIO2MjOudvOuvuO2EsCwg66as7YS0IO2DgOyehSDrk7EpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkQXBpc0Zyb21GaWxlKGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPEV4dGVuZGVkQXBpW10+IHtcbiAgaWYgKCFmaWxlUGF0aC5lbmRzV2l0aChcIi50c1wiKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke2ZpbGVQYXRofSBkb2VzIG5vdCBzZWVtIHRvIGJlIGEgVHlwZVNjcmlwdCBmaWxlLiBQbGVhc2UgY2hlY2sgdGhlIGZpbGUgcGF0aC4gV2Ugb25seSBzdXBwb3J0IHBhcnNpbmcgVHlwZVNjcmlwdCBmaWxlcy5gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICBmaWxlUGF0aCxcbiAgICAoYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgpKS50b1N0cmluZygpLFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICk7XG5cbiAgY29uc3QgbWV0aG9kczogUGFyc2VkTWV0aG9kW10gPSBbXTtcbiAgbGV0IG1vZGVsTmFtZTogc3RyaW5nID0gXCJVbmtub3duTW9kZWxcIjtcbiAgbGV0IG1ldGhvZE5hbWU6IHN0cmluZyA9IFwidW5rbm93bk1ldGhvZFwiO1xuICBjb25zdCB2aXNpdG9yID0gKG5vZGU6IHRzLk5vZGUpID0+IHtcbiAgICBpZiAodHMuaXNDbGFzc0RlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICBpZiAobm9kZS5uYW1lICYmIHRzLmlzSWRlbnRpZmllcihub2RlLm5hbWUpKSB7XG4gICAgICAgIG1vZGVsTmFtZSA9IG5vZGUubmFtZS5lc2NhcGVkVGV4dC50b1N0cmluZygpLnJlcGxhY2UoL0NsYXNzJC8sIFwiXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHMuaXNNZXRob2REZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgaWYgKHRzLmlzSWRlbnRpZmllcihub2RlLm5hbWUpKSB7XG4gICAgICAgIG1ldGhvZE5hbWUgPSBub2RlLm5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKTtcbiAgICAgICAgdmFsaWRhdGVNZXRob2ROYW1lKG1ldGhvZE5hbWUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0eXBlUGFyYW1ldGVyczogQXBpUGFyYW1UeXBlLlR5cGVQYXJhbVtdID0gKG5vZGUudHlwZVBhcmFtZXRlcnMgPz8gW10pLm1hcChcbiAgICAgICAgKHR5cGVQYXJhbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRwID0gdHlwZVBhcmFtO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHQ6IFwidHlwZS1wYXJhbVwiLFxuICAgICAgICAgICAgaWQ6IHRwLm5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGNvbnN0cmFpbnQ6IHRwLmNvbnN0cmFpbnQgPyByZXNvbHZlVHlwZU5vZGUodHAuY29uc3RyYWludCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJzOiBBcGlQYXJhbVtdID0gbm9kZS5wYXJhbWV0ZXJzLm1hcCgocGFyYW1EZWMsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHREZWYgPSBwcmludE5vZGUocGFyYW1EZWMuaW5pdGlhbGl6ZXIsIHNvdXJjZUZpbGUpO1xuXG4gICAgICAgIC8vIOq4sOuzuOqwkuydtCDsnojripQg6rK97JqwIHBhcmFtRGVjLnR5cGXqsIAgdW5kZWZpbmVk66GcIOuCmOyYtFxuXG4gICAgICAgIHJldHVybiByZXNvbHZlUGFyYW1EZWMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogcGFyYW1EZWMubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IHBhcmFtRGVjLnR5cGUgYXMgdHMuVHlwZU5vZGUsXG4gICAgICAgICAgICBvcHRpb25hbDogcGFyYW1EZWMucXVlc3Rpb25Ub2tlbiAhPT0gdW5kZWZpbmVkIHx8IHBhcmFtRGVjLmluaXRpYWxpemVyICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICBkZWZhdWx0RGVmLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIGlmIChub2RlLnR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOumrO2EtCDtg4DsnoXsnbQg6riw7J6s65CY7KeAIOyViuydgCDrqZTshozrk5wgJHttb2RlbE5hbWV9LiR7bWV0aG9kTmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJldHVyblR5cGUgPSByZXNvbHZlVHlwZU5vZGUobm9kZS50eXBlKTtcbiAgICAgIGNvbnN0IHdlYnNvY2tldFR5cGVSZWZzID0gcmVhZFdlYlNvY2tldFR5cGVSZWZzKG5vZGUpO1xuXG4gICAgICBtZXRob2RzLnB1c2goe1xuICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHR5cGVQYXJhbWV0ZXJzLFxuICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICByZXR1cm5UeXBlLFxuICAgICAgICB3ZWJzb2NrZXRUeXBlUmVmcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXRvcik7XG4gIH07XG4gIHZpc2l0b3Ioc291cmNlRmlsZSk7XG5cbiAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8g7ZiE7J6sIO2MjOydvOydmCDrk7HroZ3rkJwgQVBJIO2VhO2EsFxuICBjb25zdCBjdXJyZW50TW9kZWxBcGlzID0gcmVnaXN0ZXJlZEFwaXMuZmlsdGVyKChhcGkpID0+IHtcbiAgICByZXR1cm4gbWV0aG9kcy5maW5kKFxuICAgICAgKG1ldGhvZCkgPT4gbWV0aG9kLm1vZGVsTmFtZSA9PT0gYXBpLm1vZGVsTmFtZSAmJiBtZXRob2QubWV0aG9kTmFtZSA9PT0gYXBpLm1ldGhvZE5hbWUsXG4gICAgKTtcbiAgfSk7XG4gIGlmIChjdXJyZW50TW9kZWxBcGlzLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIGNvbnN0IHAgPSBwYXRoLmpvaW4odG1wZGlyKCksIFwic29uYW11LXN5bmNlci1lcnJvci5qc29uXCIpO1xuICAgIC8vIHdyaXRlRmlsZVN5bmMocCwgSlNPTi5zdHJpbmdpZnkocmVnaXN0ZXJlZEFwaXMsIG51bGwsIDIpKTtcbiAgICAvLyBleGVjU3luYyhgb3BlbiAke3B9YCk7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKGDtmITsnqwg7YyM7J287JeQIOyCrOyghCDrk7HroZ3rkJwgQVBJ6rCAIOyXhuyKteuLiOuLpC4gJHtmaWxlUGF0aH1gKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvLyDrk7HroZ3rkJwgQVBJ7JeQIO2YhOyerCDrqZTshozrk5wg7YOA7J6FIOygleuztCDtmZXsnqVcbiAgY29uc3QgZXh0ZW5kZWRBcGlzID0gY3VycmVudE1vZGVsQXBpcy5tYXAoKGFwaSkgPT4ge1xuICAgIGNvbnN0IGZvdW5kTWV0aG9kID0gbWV0aG9kcy5maW5kKFxuICAgICAgKG1ldGhvZCkgPT4gbWV0aG9kLm1vZGVsTmFtZSA9PT0gYXBpLm1vZGVsTmFtZSAmJiBtZXRob2QubWV0aG9kTmFtZSA9PT0gYXBpLm1ldGhvZE5hbWUsXG4gICAgKTtcbiAgICBpZiAoIWZvdW5kTWV0aG9kKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFQSSAke2FwaS5tb2RlbE5hbWV9LiR7YXBpLm1ldGhvZE5hbWV9IG5vdCBmb3VuZCBpbiAke2ZpbGVQYXRofWApO1xuICAgIH1cbiAgICBjb25zdCB3ZWJzb2NrZXRPcHRpb25zID0gYXBpLndlYnNvY2tldE9wdGlvbnNcbiAgICAgID8ge1xuICAgICAgICAgIC4uLmFwaS53ZWJzb2NrZXRPcHRpb25zLFxuICAgICAgICAgIC4uLmZvdW5kTWV0aG9kLndlYnNvY2tldFR5cGVSZWZzLFxuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5hcGksXG4gICAgICB3ZWJzb2NrZXRPcHRpb25zLFxuICAgICAgdHlwZVBhcmFtZXRlcnM6IGZvdW5kTWV0aG9kPy50eXBlUGFyYW1ldGVycyxcbiAgICAgIHBhcmFtZXRlcnM6IGZvdW5kTWV0aG9kPy5wYXJhbWV0ZXJzLFxuICAgICAgcmV0dXJuVHlwZTogZm91bmRNZXRob2Q/LnJldHVyblR5cGUsXG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiBleHRlbmRlZEFwaXM7XG59XG5cbmZ1bmN0aW9uIHJlYWRXZWJTb2NrZXRUeXBlUmVmcyhub2RlOiB0cy5NZXRob2REZWNsYXJhdGlvbik6IFdlYlNvY2tldFR5cGVSZWZzIHtcbiAgY29uc3Qgb3B0aW9uc0xpdGVyYWwgPSBnZXREZWNvcmF0b3JPcHRpb25zT2JqZWN0TGl0ZXJhbChub2RlLCBcIndlYnNvY2tldFwiKTtcbiAgaWYgKCFvcHRpb25zTGl0ZXJhbCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHJlZnM6IFdlYlNvY2tldFR5cGVSZWZzID0ge307XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2Ygb3B0aW9uc0xpdGVyYWwucHJvcGVydGllcykge1xuICAgIGlmICghdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBnZXRQcm9wZXJ0eU5hbWVUZXh0KHByb3BlcnR5Lm5hbWUpO1xuICAgIGlmIChwcm9wZXJ0eU5hbWUgIT09IFwib3V0RXZlbnRzXCIgJiYgcHJvcGVydHlOYW1lICE9PSBcImluRXZlbnRzXCIpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGVSZWYgPSByZXNvbHZlRGVjb3JhdG9yVHlwZVJlZihwcm9wZXJ0eS5pbml0aWFsaXplcik7XG4gICAgaWYgKCF0eXBlUmVmKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcGVydHlOYW1lID09PSBcIm91dEV2ZW50c1wiKSB7XG4gICAgICByZWZzLm91dEV2ZW50c1R5cGVSZWYgPSB0eXBlUmVmO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWZzLmluRXZlbnRzVHlwZVJlZiA9IHR5cGVSZWY7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlZnM7XG59XG5cbmZ1bmN0aW9uIGdldERlY29yYXRvck9wdGlvbnNPYmplY3RMaXRlcmFsKFxuICBub2RlOiB0cy5NZXRob2REZWNsYXJhdGlvbixcbiAgZGVjb3JhdG9yTmFtZTogc3RyaW5nLFxuKTogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IG1vZGlmaWVyIG9mIG5vZGUubW9kaWZpZXJzID8/IFtdKSB7XG4gICAgaWYgKCF0cy5pc0RlY29yYXRvcihtb2RpZmllcikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGV4cHJlc3Npb24gPSBtb2RpZmllci5leHByZXNzaW9uO1xuICAgIGlmICghdHMuaXNDYWxsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCF0cy5pc0lkZW50aWZpZXIoZXhwcmVzc2lvbi5leHByZXNzaW9uKSB8fCBleHByZXNzaW9uLmV4cHJlc3Npb24udGV4dCAhPT0gZGVjb3JhdG9yTmFtZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZpcnN0QXJnXSA9IGV4cHJlc3Npb24uYXJndW1lbnRzO1xuICAgIGlmIChmaXJzdEFyZyAmJiB0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGZpcnN0QXJnKSkge1xuICAgICAgcmV0dXJuIGZpcnN0QXJnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5TmFtZVRleHQobmFtZTogdHMuUHJvcGVydHlOYW1lKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRzLmlzSWRlbnRpZmllcihuYW1lKSB8fCB0cy5pc1N0cmluZ0xpdGVyYWwobmFtZSkgfHwgdHMuaXNOdW1lcmljTGl0ZXJhbChuYW1lKSkge1xuICAgIHJldHVybiBuYW1lLnRleHQ7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGVjb3JhdG9yVHlwZVJlZihleHByZXNzaW9uOiB0cy5FeHByZXNzaW9uKTogQXBpUGFyYW1UeXBlLlJlZiB8IHVuZGVmaW5lZCB7XG4gIGlmICh0cy5pc0lkZW50aWZpZXIoZXhwcmVzc2lvbikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdDogXCJyZWZcIixcbiAgICAgIGlkOiBleHByZXNzaW9uLnRleHQsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChcbiAgICB0cy5pc0FzRXhwcmVzc2lvbihleHByZXNzaW9uKSB8fFxuICAgIHRzLmlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24oZXhwcmVzc2lvbikgfHxcbiAgICB0cy5pc05vbk51bGxFeHByZXNzaW9uKGV4cHJlc3Npb24pIHx8XG4gICAgdHMuaXNUeXBlQXNzZXJ0aW9uRXhwcmVzc2lvbihleHByZXNzaW9uKVxuICApIHtcbiAgICByZXR1cm4gcmVzb2x2ZURlY29yYXRvclR5cGVSZWYoZXhwcmVzc2lvbi5leHByZXNzaW9uKTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUeXBlTm9kZSh0eXBlTm9kZTogdHMuVHlwZU5vZGUpOiBBcGlQYXJhbVR5cGUge1xuICBzd2l0Y2ggKHR5cGVOb2RlPy5raW5kKSB7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkFueUtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJhbnlcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVW5rbm93bktleXdvcmQ6XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlN0cmluZ0tleXdvcmQ6XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuTnVtYmVyS2V5d29yZDpcbiAgICAgIHJldHVybiBcIm51bWJlclwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5Cb29sZWFuS2V5d29yZDpcbiAgICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZDpcbiAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5OdWxsS2V5d29yZDpcbiAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVm9pZEtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJ2b2lkXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkxpdGVyYWxUeXBlOiB7XG4gICAgICBjb25zdCBsaXRlcmFsID0gKHR5cGVOb2RlIGFzIHRzLkxpdGVyYWxUeXBlTm9kZSkubGl0ZXJhbDtcbiAgICAgIGlmICh0cy5pc1N0cmluZ0xpdGVyYWwobGl0ZXJhbCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0OiBcInN0cmluZy1saXRlcmFsXCIsXG4gICAgICAgICAgdmFsdWU6IGxpdGVyYWwudGV4dCxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHMuaXNOdW1lcmljTGl0ZXJhbChsaXRlcmFsKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHQ6IFwibnVtZXJpYy1saXRlcmFsXCIsXG4gICAgICAgICAgdmFsdWU6IE51bWJlcihsaXRlcmFsLnRleHQpLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGxpdGVyYWwua2luZCA9PT0gdHMuU3ludGF4S2luZC5OdWxsS2V5d29yZCkge1xuICAgICAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICAgICAgfSBlbHNlIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZCkge1xuICAgICAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICAgICAgICB9IGVsc2UgaWYgKGxpdGVyYWwua2luZCA9PT0gdHMuU3ludGF4S2luZC5UcnVlS2V5d29yZCkge1xuICAgICAgICAgIHJldHVybiBcInRydWVcIjtcbiAgICAgICAgfSBlbHNlIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuRmFsc2VLZXl3b3JkKSB7XG4gICAgICAgICAgcmV0dXJuIFwiZmFsc2VcIjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLslYwg7IiYIOyXhuuKlCDrpqzthLDrn7RcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5BcnJheVR5cGU6IHtcbiAgICAgIGNvbnN0IGFyck5vZGUgPSB0eXBlTm9kZSBhcyB0cy5BcnJheVR5cGVOb2RlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJhcnJheVwiLFxuICAgICAgICBlbGVtZW50c1R5cGU6IHJlc29sdmVUeXBlTm9kZShhcnJOb2RlLmVsZW1lbnRUeXBlKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5UeXBlTGl0ZXJhbDoge1xuICAgICAgY29uc3QgbGl0ZXJhbE5vZGUgPSB0eXBlTm9kZSBhcyB0cy5UeXBlTGl0ZXJhbE5vZGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0OiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wczogbGl0ZXJhbE5vZGUubWVtYmVycy5tYXAoKG1lbWJlcikgPT4ge1xuICAgICAgICAgIGlmICh0cy5pc0luZGV4U2lnbmF0dXJlRGVjbGFyYXRpb24obWVtYmVyKSkge1xuICAgICAgICAgICAgYXNzZXJ0KG1lbWJlci5wYXJhbWV0ZXJzWzBdKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IHJlc29sdmVQYXJhbURlYyh7XG4gICAgICAgICAgICAgIG5hbWU6IG1lbWJlci5wYXJhbWV0ZXJzWzBdLm5hbWUgYXMgdHMuSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgdHlwZTogbWVtYmVyLnBhcmFtZXRlcnNbMF0udHlwZSBhcyB0cy5UeXBlTm9kZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVBhcmFtRGVjKHtcbiAgICAgICAgICAgICAgbmFtZToge1xuICAgICAgICAgICAgICAgIGVzY2FwZWRUZXh0OiBgWyR7cmVzLm5hbWV9JHtyZXMub3B0aW9uYWwgPyBcIj9cIiA6IFwiXCJ9OiAke3Jlcy50eXBlfV1gLFxuICAgICAgICAgICAgICB9IGFzIHRzLklkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHR5cGU6IG1lbWJlci50eXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlUGFyYW1EZWMoe1xuICAgICAgICAgICAgICBuYW1lOiAobWVtYmVyIGFzIHRzLlByb3BlcnR5U2lnbmF0dXJlKS5uYW1lIGFzIHRzLklkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHR5cGU6IChtZW1iZXIgYXMgdHMuUHJvcGVydHlTaWduYXR1cmUpLnR5cGUgYXMgdHMuVHlwZU5vZGUsXG4gICAgICAgICAgICAgIG9wdGlvbmFsOiAobWVtYmVyIGFzIHRzLlByb3BlcnR5U2lnbmF0dXJlKS5xdWVzdGlvblRva2VuICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlR5cGVSZWZlcmVuY2U6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0OiBcInJlZlwiLFxuICAgICAgICBpZDogKCh0eXBlTm9kZSBhcyB0cy5UeXBlUmVmZXJlbmNlTm9kZSkudHlwZU5hbWUgYXMgdHMuSWRlbnRpZmllcikuZXNjYXBlZFRleHQudG9TdHJpbmcoKSxcbiAgICAgICAgYXJnczogKHR5cGVOb2RlIGFzIHRzLlR5cGVSZWZlcmVuY2VOb2RlKS50eXBlQXJndW1lbnRzPy5tYXAoKHR5cGVBcmcpID0+XG4gICAgICAgICAgcmVzb2x2ZVR5cGVOb2RlKHR5cGVBcmcpLFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVW5pb25UeXBlOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJ1bmlvblwiLFxuICAgICAgICB0eXBlczogKHR5cGVOb2RlIGFzIHRzLlVuaW9uVHlwZU5vZGUpLnR5cGVzLm1hcCgodHlwZSkgPT4gcmVzb2x2ZVR5cGVOb2RlKHR5cGUpKSxcbiAgICAgIH07XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkludGVyc2VjdGlvblR5cGU6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0OiBcImludGVyc2VjdGlvblwiLFxuICAgICAgICB0eXBlczogKHR5cGVOb2RlIGFzIHRzLkludGVyc2VjdGlvblR5cGVOb2RlKS50eXBlcy5tYXAoKHR5cGUpID0+IHJlc29sdmVUeXBlTm9kZSh0eXBlKSksXG4gICAgICB9O1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5JbmRleGVkQWNjZXNzVHlwZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwiaW5kZXhlZC1hY2Nlc3NcIixcbiAgICAgICAgb2JqZWN0OiByZXNvbHZlVHlwZU5vZGUoKHR5cGVOb2RlIGFzIHRzLkluZGV4ZWRBY2Nlc3NUeXBlTm9kZSkub2JqZWN0VHlwZSksXG4gICAgICAgIGluZGV4OiByZXNvbHZlVHlwZU5vZGUoKHR5cGVOb2RlIGFzIHRzLkluZGV4ZWRBY2Nlc3NUeXBlTm9kZSkuaW5kZXhUeXBlKSxcbiAgICAgIH07XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlR1cGxlVHlwZTpcbiAgICAgIGlmICh0cy5pc1R1cGxlVHlwZU5vZGUodHlwZU5vZGUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdDogXCJ0dXBsZS10eXBlXCIsXG4gICAgICAgICAgZWxlbWVudHM6IHR5cGVOb2RlLmVsZW1lbnRzLm1hcCgoZWxlbSkgPT4gcmVzb2x2ZVR5cGVOb2RlKGVsZW0pKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5QYXJlbnRoZXNpemVkVHlwZTpcbiAgICAgIC8vIOq0hO2YuOuhnCDrrLbsnbgg7YOA7J6FICjsmIg6IChBICYgQilbXSDsl5DshJwgKEEgJiBCKSlcbiAgICAgIC8vIOuCtOu2gCDtg4DsnoXsnYQg7J6s6reA7KCB7Jy866GcIHJlc29sdmVcbiAgICAgIHJldHVybiByZXNvbHZlVHlwZU5vZGUoKHR5cGVOb2RlIGFzIHRzLlBhcmVudGhlc2l6ZWRUeXBlTm9kZSkudHlwZSk7XG5cbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuRnVuY3Rpb25UeXBlOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJmdW5jdGlvblwiLFxuICAgICAgICBwYXJhbWV0ZXJzOiAodHlwZU5vZGUgYXMgdHMuRnVuY3Rpb25UeXBlTm9kZSkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiAoe1xuICAgICAgICAgIG5hbWU6IHBhcmFtLm5hbWUuZ2V0VGV4dCgpLFxuICAgICAgICAgIHR5cGU6IHBhcmFtLnR5cGUgPyByZXNvbHZlVHlwZU5vZGUocGFyYW0udHlwZSkgOiBcInVua25vd25cIixcbiAgICAgICAgICBvcHRpb25hbDogcGFyYW0ucXVlc3Rpb25Ub2tlbiAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgIGRlZmF1bHREZWY6IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpLFxuICAgICAgICByZXR1cm5UeXBlOiByZXNvbHZlVHlwZU5vZGUoKHR5cGVOb2RlIGFzIHRzLkZ1bmN0aW9uVHlwZU5vZGUpLnR5cGUpLFxuICAgICAgfTtcbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHlwZU5vZGUgdW5kZWZpbmVkYCk7XG4gIH1cblxuICBjb25zb2xlLmRlYnVnKHR5cGVOb2RlKTtcbiAgdGhyb3cgbmV3IEVycm9yKGDslYwg7IiYIOyXhuuKlCBTeW50YXhLaW5kICR7dHlwZU5vZGUua2luZH1gKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhcmFtRGVjKFxuICBwYXJhbURlYzoge1xuICAgIG5hbWU6IHRzLkJpbmRpbmdOYW1lO1xuICAgIHR5cGU6IHRzLlR5cGVOb2RlO1xuICAgIG9wdGlvbmFsPzogYm9vbGVhbjtcbiAgICBkZWZhdWx0RGVmPzogc3RyaW5nO1xuICB9LFxuICBpbmRleDogbnVtYmVyID0gMCxcbik6IEFwaVBhcmFtIHtcbiAgY29uc3QgbmFtZSA9IHBhcmFtRGVjLm5hbWUgYXMgdHMuSWRlbnRpZmllcjtcbiAgY29uc3QgdHlwZSA9IHJlc29sdmVUeXBlTm9kZShwYXJhbURlYy50eXBlKTtcblxuICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS5kZWJ1Zyh7IG5hbWUsIHR5cGUsIHBhcmFtRGVjIH0pO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0OiBBcGlQYXJhbSA9IHtcbiAgICBuYW1lOiBuYW1lLmVzY2FwZWRUZXh0ID8gbmFtZS5lc2NhcGVkVGV4dC50b1N0cmluZygpIDogYG5vbmFtZUF0JHtpbmRleH1gLFxuICAgIHR5cGUsXG4gICAgb3B0aW9uYWw6IHBhcmFtRGVjLm9wdGlvbmFsID09PSB0cnVlLFxuICAgIGRlZmF1bHREZWY6IHBhcmFtRGVjPy5kZWZhdWx0RGVmLFxuICB9O1xuXG4gIC8vIOq1rOyhsOu2hO2VtO2VoOuLueydmCDqsr3smrAg7YOA7J6F7J2066aEIOyCrOyaqVxuICBpZiAoXG4gICAgdHMuaXNPYmplY3RCaW5kaW5nUGF0dGVybihuYW1lKSAmJlxuICAgIHRzLmlzVHlwZVJlZmVyZW5jZU5vZGUocGFyYW1EZWMudHlwZSkgJiZcbiAgICB0cy5pc0lkZW50aWZpZXIocGFyYW1EZWMudHlwZS50eXBlTmFtZSlcbiAgKSB7XG4gICAgcmVzdWx0Lm5hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKHBhcmFtRGVjLnR5cGUudHlwZU5hbWUudGV4dCwgdHJ1ZSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBwcmludE5vZGUobm9kZTogdHMuTm9kZSB8IHVuZGVmaW5lZCwgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgcHJpbnRlciA9IHRzLmNyZWF0ZVByaW50ZXIoeyBuZXdMaW5lOiB0cy5OZXdMaW5lS2luZC5MaW5lRmVlZCB9KTtcbiAgcmV0dXJuIHByaW50ZXIucHJpbnROb2RlKHRzLkVtaXRIaW50LlVuc3BlY2lmaWVkLCBub2RlLCBzb3VyY2VGaWxlKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NBLGVBQXNCLGlCQUFpQixVQUFnRDtBQUNyRixLQUFJLENBQUMsU0FBUyxTQUFTLE1BQU0sRUFBRTtBQUM3QixRQUFNLElBQUksTUFDUixHQUFHLFNBQVMsK0dBQ2I7O0NBR0gsTUFBTSxhQUFhLEdBQUcsaUJBQ3BCLFdBQ0MsTUFBTSxTQUFTLFNBQVMsRUFBRSxVQUFVLEVBQ3JDLEdBQUcsYUFBYSxPQUNqQjtDQUVELE1BQU1BLFVBQTBCLEVBQUU7Q0FDbEMsSUFBSUMsWUFBb0I7Q0FDeEIsSUFBSUMsYUFBcUI7Q0FDekIsTUFBTSxXQUFXLFNBQWtCO0FBQ2pDLE1BQUksR0FBRyxtQkFBbUIsS0FBSyxFQUFFO0FBQy9CLE9BQUksS0FBSyxRQUFRLEdBQUcsYUFBYSxLQUFLLEtBQUssRUFBRTtBQUMzQyxnQkFBWSxLQUFLLEtBQUssWUFBWSxVQUFVLENBQUMsUUFBUSxVQUFVLEdBQUc7OztBQUd0RSxNQUFJLEdBQUcsb0JBQW9CLEtBQUssRUFBRTtBQUNoQyxPQUFJLEdBQUcsYUFBYSxLQUFLLEtBQUssRUFBRTtBQUM5QixpQkFBYSxLQUFLLEtBQUssWUFBWSxVQUFVO0FBQzdDLHVCQUFtQixXQUFXOztHQUdoQyxNQUFNQyxrQkFBNEMsS0FBSyxrQkFBa0IsRUFBRSxFQUFFLEtBQzFFLGNBQWM7SUFDYixNQUFNLEtBQUs7QUFFWCxXQUFPO0tBQ0wsR0FBRztLQUNILElBQUksR0FBRyxLQUFLLFlBQVksVUFBVTtLQUNsQyxZQUFZLEdBQUcsYUFBYSxnQkFBZ0IsR0FBRyxXQUFXLEdBQUc7S0FDOUQ7S0FFSjtHQUNELE1BQU1DLGFBQXlCLEtBQUssV0FBVyxLQUFLLFVBQVUsVUFBVTtJQUN0RSxNQUFNLGFBQWEsVUFBVSxTQUFTLGFBQWEsV0FBVztBQUk5RCxXQUFPLGdCQUNMO0tBQ0UsTUFBTSxTQUFTO0tBQ2YsTUFB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
|
|
238
|
+
|
|
239
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLXBhcnNlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3luY2VyL2FwaS1wYXJzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyB0eXBlIEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyB0eXBlIFJlc29sdmVkV2ViU29ja2V0RGVjb3JhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVNZXRob2ROYW1lIH0gZnJvbSBcIi4uL2FwaS92YWxpZGF0b3JcIjtcbmltcG9ydCB7IHR5cGUgQXBpUGFyYW0sIHR5cGUgQXBpUGFyYW1UeXBlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5cbnR5cGUgV2ViU29ja2V0VHlwZVJlZnMgPSBQaWNrPFxuICBSZXNvbHZlZFdlYlNvY2tldERlY29yYXRvck9wdGlvbnMsXG4gIFwib3V0RXZlbnRzVHlwZVJlZlwiIHwgXCJpbkV2ZW50c1R5cGVSZWZcIlxuPjtcbnR5cGUgUGFyc2VkTWV0aG9kID0ge1xuICBtb2RlbE5hbWU6IHN0cmluZztcbiAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICB0eXBlUGFyYW1ldGVyczogQXBpUGFyYW1UeXBlLlR5cGVQYXJhbVtdO1xuICBwYXJhbWV0ZXJzOiBBcGlQYXJhbVtdO1xuICByZXR1cm5UeXBlOiBBcGlQYXJhbVR5cGU7XG4gIHdlYnNvY2tldFR5cGVSZWZzOiBXZWJTb2NrZXRUeXBlUmVmcztcbn07XG5cbi8qKlxuICogVHlwZVNjcmlwdCDtjIzsnbzsnYQg7YyM7Iux7ZWY7JesIEFQSSDrqZTshozrk5wg7KCV67O066W8IOy2lOy2nO2VqeuLiOuLpC5cbiAqIEBhcGkg642w7L2U66CI7J207YSw6rCAIOu2meydgCDrqZTshozrk5zrk6TsnZgg7YOA7J6FIOygleuztOulvCDrtoTshJ3tlanri4jri6QuXG4gKiBAcGFyYW0gZmlsZVBhdGggLSDtjIzsi7HtlaAgVHlwZVNjcmlwdCDtjIzsnbzsnZgg7KCI64yAIOqyveuhnFxuICogQHJldHVybnMgQVBJIOuplOyGjOuTnCDsoJXrs7Qg67Cw7Je0ICjtg4DsnoUg7YyM652866+47YSwLCDtjIzrnbzrr7jthLAsIOumrO2EtCDtg4DsnoUg65OxKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEFwaXNGcm9tRmlsZShmaWxlUGF0aDogQWJzb2x1dGVQYXRoKTogUHJvbWlzZTxFeHRlbmRlZEFwaVtdPiB7XG4gIGlmICghZmlsZVBhdGguZW5kc1dpdGgoXCIudHNcIikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtmaWxlUGF0aH0gZG9lcyBub3Qgc2VlbSB0byBiZSBhIFR5cGVTY3JpcHQgZmlsZS4gUGxlYXNlIGNoZWNrIHRoZSBmaWxlIHBhdGguIFdlIG9ubHkgc3VwcG9ydCBwYXJzaW5nIFR5cGVTY3JpcHQgZmlsZXMuYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgZmlsZVBhdGgsXG4gICAgKGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoKSkudG9TdHJpbmcoKSxcbiAgICB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LFxuICApO1xuXG4gIGNvbnN0IG1ldGhvZHM6IFBhcnNlZE1ldGhvZFtdID0gW107XG4gIGxldCBtb2RlbE5hbWU6IHN0cmluZyA9IFwiVW5rbm93bk1vZGVsXCI7XG4gIGxldCBtZXRob2ROYW1lOiBzdHJpbmcgPSBcInVua25vd25NZXRob2RcIjtcbiAgY29uc3QgdmlzaXRvciA9IChub2RlOiB0cy5Ob2RlKSA9PiB7XG4gICAgaWYgKHRzLmlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgaWYgKG5vZGUubmFtZSAmJiB0cy5pc0lkZW50aWZpZXIobm9kZS5uYW1lKSkge1xuICAgICAgICBtb2RlbE5hbWUgPSBub2RlLm5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKS5yZXBsYWNlKC9DbGFzcyQvLCBcIlwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRzLmlzTWV0aG9kRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIobm9kZS5uYW1lKSkge1xuICAgICAgICBtZXRob2ROYW1lID0gbm9kZS5uYW1lLmVzY2FwZWRUZXh0LnRvU3RyaW5nKCk7XG4gICAgICAgIHZhbGlkYXRlTWV0aG9kTmFtZShtZXRob2ROYW1lKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHlwZVBhcmFtZXRlcnM6IEFwaVBhcmFtVHlwZS5UeXBlUGFyYW1bXSA9IChub2RlLnR5cGVQYXJhbWV0ZXJzID8/IFtdKS5tYXAoXG4gICAgICAgICh0eXBlUGFyYW0pID0+IHtcbiAgICAgICAgICBjb25zdCB0cCA9IHR5cGVQYXJhbTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0OiBcInR5cGUtcGFyYW1cIixcbiAgICAgICAgICAgIGlkOiB0cC5uYW1lLmVzY2FwZWRUZXh0LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBjb25zdHJhaW50OiB0cC5jb25zdHJhaW50ID8gcmVzb2x2ZVR5cGVOb2RlKHRwLmNvbnN0cmFpbnQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgY29uc3QgcGFyYW1ldGVyczogQXBpUGFyYW1bXSA9IG5vZGUucGFyYW1ldGVycy5tYXAoKHBhcmFtRGVjLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBkZWZhdWx0RGVmID0gcHJpbnROb2RlKHBhcmFtRGVjLmluaXRpYWxpemVyLCBzb3VyY2VGaWxlKTtcblxuICAgICAgICAvLyDquLDrs7jqsJLsnbQg7J6I64qUIOqyveyasCBwYXJhbURlYy50eXBl6rCAIHVuZGVmaW5lZOuhnCDrgpjsmLRcblxuICAgICAgICByZXR1cm4gcmVzb2x2ZVBhcmFtRGVjKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IHBhcmFtRGVjLm5hbWUsXG4gICAgICAgICAgICB0eXBlOiBwYXJhbURlYy50eXBlIGFzIHRzLlR5cGVOb2RlLFxuICAgICAgICAgICAgb3B0aW9uYWw6IHBhcmFtRGVjLnF1ZXN0aW9uVG9rZW4gIT09IHVuZGVmaW5lZCB8fCBwYXJhbURlYy5pbml0aWFsaXplciAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGVmYXVsdERlZixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICBpZiAobm9kZS50eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDrpqzthLQg7YOA7J6F7J20IOq4sOyerOuQmOyngCDslYrsnYAg66mU7IaM65OcICR7bW9kZWxOYW1lfS4ke21ldGhvZE5hbWV9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXR1cm5UeXBlID0gcmVzb2x2ZVR5cGVOb2RlKG5vZGUudHlwZSk7XG4gICAgICBjb25zdCB3ZWJzb2NrZXRUeXBlUmVmcyA9IHJlYWRXZWJTb2NrZXRUeXBlUmVmcyhub2RlKTtcblxuICAgICAgbWV0aG9kcy5wdXNoKHtcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICB0eXBlUGFyYW1ldGVycyxcbiAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgcmV0dXJuVHlwZSxcbiAgICAgICAgd2Vic29ja2V0VHlwZVJlZnMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0b3IpO1xuICB9O1xuICB2aXNpdG9yKHNvdXJjZUZpbGUpO1xuXG4gIGlmIChtZXRob2RzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vIO2YhOyerCDtjIzsnbzsnZgg65Ox66Gd65CcIEFQSSDtlYTthLBcbiAgY29uc3QgY3VycmVudE1vZGVsQXBpcyA9IHJlZ2lzdGVyZWRBcGlzLmZpbHRlcigoYXBpKSA9PiB7XG4gICAgcmV0dXJuIG1ldGhvZHMuZmluZChcbiAgICAgIChtZXRob2QpID0+IG1ldGhvZC5tb2RlbE5hbWUgPT09IGFwaS5tb2RlbE5hbWUgJiYgbWV0aG9kLm1ldGhvZE5hbWUgPT09IGFwaS5tZXRob2ROYW1lLFxuICAgICk7XG4gIH0pO1xuICBpZiAoY3VycmVudE1vZGVsQXBpcy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBjb25zdCBwID0gcGF0aC5qb2luKHRtcGRpcigpLCBcInNvbmFtdS1zeW5jZXItZXJyb3IuanNvblwiKTtcbiAgICAvLyB3cml0ZUZpbGVTeW5jKHAsIEpTT04uc3RyaW5naWZ5KHJlZ2lzdGVyZWRBcGlzLCBudWxsLCAyKSk7XG4gICAgLy8gZXhlY1N5bmMoYG9wZW4gJHtwfWApO1xuICAgIC8vIHRocm93IG5ldyBFcnJvcihg7ZiE7J6sIO2MjOydvOyXkCDsgqzsoIQg65Ox66Gd65CcIEFQSeqwgCDsl4bsirXri4jri6QuICR7ZmlsZVBhdGh9YCk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8g65Ox66Gd65CcIEFQSeyXkCDtmITsnqwg66mU7IaM65OcIO2DgOyehSDsoJXrs7Qg7ZmV7J6lXG4gIGNvbnN0IGV4dGVuZGVkQXBpcyA9IGN1cnJlbnRNb2RlbEFwaXMubWFwKChhcGkpID0+IHtcbiAgICBjb25zdCBmb3VuZE1ldGhvZCA9IG1ldGhvZHMuZmluZChcbiAgICAgIChtZXRob2QpID0+IG1ldGhvZC5tb2RlbE5hbWUgPT09IGFwaS5tb2RlbE5hbWUgJiYgbWV0aG9kLm1ldGhvZE5hbWUgPT09IGFwaS5tZXRob2ROYW1lLFxuICAgICk7XG4gICAgaWYgKCFmb3VuZE1ldGhvZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBUEkgJHthcGkubW9kZWxOYW1lfS4ke2FwaS5tZXRob2ROYW1lfSBub3QgZm91bmQgaW4gJHtmaWxlUGF0aH1gKTtcbiAgICB9XG4gICAgY29uc3Qgd2Vic29ja2V0T3B0aW9ucyA9IGFwaS53ZWJzb2NrZXRPcHRpb25zXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5hcGkud2Vic29ja2V0T3B0aW9ucyxcbiAgICAgICAgICAuLi5mb3VuZE1ldGhvZC53ZWJzb2NrZXRUeXBlUmVmcyxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uYXBpLFxuICAgICAgd2Vic29ja2V0T3B0aW9ucyxcbiAgICAgIHR5cGVQYXJhbWV0ZXJzOiBmb3VuZE1ldGhvZD8udHlwZVBhcmFtZXRlcnMsXG4gICAgICBwYXJhbWV0ZXJzOiBmb3VuZE1ldGhvZD8ucGFyYW1ldGVycyxcbiAgICAgIHJldHVyblR5cGU6IGZvdW5kTWV0aG9kPy5yZXR1cm5UeXBlLFxuICAgIH07XG4gIH0pO1xuICByZXR1cm4gZXh0ZW5kZWRBcGlzO1xufVxuXG5mdW5jdGlvbiByZWFkV2ViU29ja2V0VHlwZVJlZnMobm9kZTogdHMuTWV0aG9kRGVjbGFyYXRpb24pOiBXZWJTb2NrZXRUeXBlUmVmcyB7XG4gIGNvbnN0IG9wdGlvbnNMaXRlcmFsID0gZ2V0RGVjb3JhdG9yT3B0aW9uc09iamVjdExpdGVyYWwobm9kZSwgXCJ3ZWJzb2NrZXRcIik7XG4gIGlmICghb3B0aW9uc0xpdGVyYWwpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCByZWZzOiBXZWJTb2NrZXRUeXBlUmVmcyA9IHt9O1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIG9wdGlvbnNMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAoIXRzLmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcGVydHlOYW1lID0gZ2V0UHJvcGVydHlOYW1lVGV4dChwcm9wZXJ0eS5uYW1lKTtcbiAgICBpZiAocHJvcGVydHlOYW1lICE9PSBcIm91dEV2ZW50c1wiICYmIHByb3BlcnR5TmFtZSAhPT0gXCJpbkV2ZW50c1wiKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlUmVmID0gcmVzb2x2ZURlY29yYXRvclR5cGVSZWYocHJvcGVydHkuaW5pdGlhbGl6ZXIpO1xuICAgIGlmICghdHlwZVJlZikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BlcnR5TmFtZSA9PT0gXCJvdXRFdmVudHNcIikge1xuICAgICAgcmVmcy5vdXRFdmVudHNUeXBlUmVmID0gdHlwZVJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVmcy5pbkV2ZW50c1R5cGVSZWYgPSB0eXBlUmVmO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWZzO1xufVxuXG5mdW5jdGlvbiBnZXREZWNvcmF0b3JPcHRpb25zT2JqZWN0TGl0ZXJhbChcbiAgbm9kZTogdHMuTWV0aG9kRGVjbGFyYXRpb24sXG4gIGRlY29yYXRvck5hbWU6IHN0cmluZyxcbik6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCBtb2RpZmllciBvZiBub2RlLm1vZGlmaWVycyA/PyBbXSkge1xuICAgIGlmICghdHMuaXNEZWNvcmF0b3IobW9kaWZpZXIpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBleHByZXNzaW9uID0gbW9kaWZpZXIuZXhwcmVzc2lvbjtcbiAgICBpZiAoIXRzLmlzQ2FsbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghdHMuaXNJZGVudGlmaWVyKGV4cHJlc3Npb24uZXhwcmVzc2lvbikgfHwgZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHQgIT09IGRlY29yYXRvck5hbWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IFtmaXJzdEFyZ10gPSBleHByZXNzaW9uLmFyZ3VtZW50cztcbiAgICBpZiAoZmlyc3RBcmcgJiYgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihmaXJzdEFyZykpIHtcbiAgICAgIHJldHVybiBmaXJzdEFyZztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRQcm9wZXJ0eU5hbWVUZXh0KG5hbWU6IHRzLlByb3BlcnR5TmFtZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0cy5pc0lkZW50aWZpZXIobmFtZSkgfHwgdHMuaXNTdHJpbmdMaXRlcmFsKG5hbWUpIHx8IHRzLmlzTnVtZXJpY0xpdGVyYWwobmFtZSkpIHtcbiAgICByZXR1cm4gbmFtZS50ZXh0O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURlY29yYXRvclR5cGVSZWYoZXhwcmVzc2lvbjogdHMuRXhwcmVzc2lvbik6IEFwaVBhcmFtVHlwZS5SZWYgfCB1bmRlZmluZWQge1xuICBpZiAodHMuaXNJZGVudGlmaWVyKGV4cHJlc3Npb24pKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHQ6IFwicmVmXCIsXG4gICAgICBpZDogZXhwcmVzc2lvbi50ZXh0LFxuICAgIH07XG4gIH1cblxuICBpZiAoXG4gICAgdHMuaXNBc0V4cHJlc3Npb24oZXhwcmVzc2lvbikgfHxcbiAgICB0cy5pc1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKGV4cHJlc3Npb24pIHx8XG4gICAgdHMuaXNOb25OdWxsRXhwcmVzc2lvbihleHByZXNzaW9uKSB8fFxuICAgIHRzLmlzVHlwZUFzc2VydGlvbkV4cHJlc3Npb24oZXhwcmVzc2lvbilcbiAgKSB7XG4gICAgcmV0dXJuIHJlc29sdmVEZWNvcmF0b3JUeXBlUmVmKGV4cHJlc3Npb24uZXhwcmVzc2lvbik7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlVHlwZU5vZGUodHlwZU5vZGU6IHRzLlR5cGVOb2RlKTogQXBpUGFyYW1UeXBlIHtcbiAgc3dpdGNoICh0eXBlTm9kZT8ua2luZCkge1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5BbnlLZXl3b3JkOlxuICAgICAgcmV0dXJuIFwiYW55XCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlVua25vd25LZXl3b3JkOlxuICAgICAgcmV0dXJuIFwidW5rbm93blwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5TdHJpbmdLZXl3b3JkOlxuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLk51bWJlcktleXdvcmQ6XG4gICAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuQm9vbGVhbktleXdvcmQ6XG4gICAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuTnVsbEtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlZvaWRLZXl3b3JkOlxuICAgICAgcmV0dXJuIFwidm9pZFwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5MaXRlcmFsVHlwZToge1xuICAgICAgY29uc3QgbGl0ZXJhbCA9ICh0eXBlTm9kZSBhcyB0cy5MaXRlcmFsVHlwZU5vZGUpLmxpdGVyYWw7XG4gICAgICBpZiAodHMuaXNTdHJpbmdMaXRlcmFsKGxpdGVyYWwpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdDogXCJzdHJpbmctbGl0ZXJhbFwiLFxuICAgICAgICAgIHZhbHVlOiBsaXRlcmFsLnRleHQsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHRzLmlzTnVtZXJpY0xpdGVyYWwobGl0ZXJhbCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0OiBcIm51bWVyaWMtbGl0ZXJhbFwiLFxuICAgICAgICAgIHZhbHVlOiBOdW1iZXIobGl0ZXJhbC50ZXh0KSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuTnVsbEtleXdvcmQpIHtcbiAgICAgICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobGl0ZXJhbC5raW5kID09PSB0cy5TeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQpIHtcbiAgICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgICAgICAgfSBlbHNlIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuVHJ1ZUtleXdvcmQpIHtcbiAgICAgICAgICByZXR1cm4gXCJ0cnVlXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobGl0ZXJhbC5raW5kID09PSB0cy5TeW50YXhLaW5kLkZhbHNlS2V5d29yZCkge1xuICAgICAgICAgIHJldHVybiBcImZhbHNlXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi7JWMIOyImCDsl4bripQg66as7YSw65+0XCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuQXJyYXlUeXBlOiB7XG4gICAgICBjb25zdCBhcnJOb2RlID0gdHlwZU5vZGUgYXMgdHMuQXJyYXlUeXBlTm9kZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwiYXJyYXlcIixcbiAgICAgICAgZWxlbWVudHNUeXBlOiByZXNvbHZlVHlwZU5vZGUoYXJyTm9kZS5lbGVtZW50VHlwZSksXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVHlwZUxpdGVyYWw6IHtcbiAgICAgIGNvbnN0IGxpdGVyYWxOb2RlID0gdHlwZU5vZGUgYXMgdHMuVHlwZUxpdGVyYWxOb2RlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcHM6IGxpdGVyYWxOb2RlLm1lbWJlcnMubWFwKChtZW1iZXIpID0+IHtcbiAgICAgICAgICBpZiAodHMuaXNJbmRleFNpZ25hdHVyZURlY2xhcmF0aW9uKG1lbWJlcikpIHtcbiAgICAgICAgICAgIGFzc2VydChtZW1iZXIucGFyYW1ldGVyc1swXSk7XG4gICAgICAgICAgICBjb25zdCByZXMgPSByZXNvbHZlUGFyYW1EZWMoe1xuICAgICAgICAgICAgICBuYW1lOiBtZW1iZXIucGFyYW1ldGVyc1swXS5uYW1lIGFzIHRzLklkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHR5cGU6IG1lbWJlci5wYXJhbWV0ZXJzWzBdLnR5cGUgYXMgdHMuVHlwZU5vZGUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVQYXJhbURlYyh7XG4gICAgICAgICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgICAgICBlc2NhcGVkVGV4dDogYFske3Jlcy5uYW1lfSR7cmVzLm9wdGlvbmFsID8gXCI/XCIgOiBcIlwifTogJHtyZXMudHlwZX1dYCxcbiAgICAgICAgICAgICAgfSBhcyB0cy5JZGVudGlmaWVyLFxuICAgICAgICAgICAgICB0eXBlOiBtZW1iZXIudHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVBhcmFtRGVjKHtcbiAgICAgICAgICAgICAgbmFtZTogKG1lbWJlciBhcyB0cy5Qcm9wZXJ0eVNpZ25hdHVyZSkubmFtZSBhcyB0cy5JZGVudGlmaWVyLFxuICAgICAgICAgICAgICB0eXBlOiAobWVtYmVyIGFzIHRzLlByb3BlcnR5U2lnbmF0dXJlKS50eXBlIGFzIHRzLlR5cGVOb2RlLFxuICAgICAgICAgICAgICBvcHRpb25hbDogKG1lbWJlciBhcyB0cy5Qcm9wZXJ0eVNpZ25hdHVyZSkucXVlc3Rpb25Ub2tlbiAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5UeXBlUmVmZXJlbmNlOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJyZWZcIixcbiAgICAgICAgaWQ6ICgodHlwZU5vZGUgYXMgdHMuVHlwZVJlZmVyZW5jZU5vZGUpLnR5cGVOYW1lIGFzIHRzLklkZW50aWZpZXIpLmVzY2FwZWRUZXh0LnRvU3RyaW5nKCksXG4gICAgICAgIGFyZ3M6ICh0eXBlTm9kZSBhcyB0cy5UeXBlUmVmZXJlbmNlTm9kZSkudHlwZUFyZ3VtZW50cz8ubWFwKCh0eXBlQXJnKSA9PlxuICAgICAgICAgIHJlc29sdmVUeXBlTm9kZSh0eXBlQXJnKSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlVuaW9uVHlwZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwidW5pb25cIixcbiAgICAgICAgdHlwZXM6ICh0eXBlTm9kZSBhcyB0cy5VbmlvblR5cGVOb2RlKS50eXBlcy5tYXAoKHR5cGUpID0+IHJlc29sdmVUeXBlTm9kZSh0eXBlKSksXG4gICAgICB9O1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5JbnRlcnNlY3Rpb25UeXBlOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJpbnRlcnNlY3Rpb25cIixcbiAgICAgICAgdHlwZXM6ICh0eXBlTm9kZSBhcyB0cy5JbnRlcnNlY3Rpb25UeXBlTm9kZSkudHlwZXMubWFwKCh0eXBlKSA9PiByZXNvbHZlVHlwZU5vZGUodHlwZSkpLFxuICAgICAgfTtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuSW5kZXhlZEFjY2Vzc1R5cGU6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0OiBcImluZGV4ZWQtYWNjZXNzXCIsXG4gICAgICAgIG9iamVjdDogcmVzb2x2ZVR5cGVOb2RlKCh0eXBlTm9kZSBhcyB0cy5JbmRleGVkQWNjZXNzVHlwZU5vZGUpLm9iamVjdFR5cGUpLFxuICAgICAgICBpbmRleDogcmVzb2x2ZVR5cGVOb2RlKCh0eXBlTm9kZSBhcyB0cy5JbmRleGVkQWNjZXNzVHlwZU5vZGUpLmluZGV4VHlwZSksXG4gICAgICB9O1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5UdXBsZVR5cGU6XG4gICAgICBpZiAodHMuaXNUdXBsZVR5cGVOb2RlKHR5cGVOb2RlKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHQ6IFwidHVwbGUtdHlwZVwiLFxuICAgICAgICAgIGVsZW1lbnRzOiB0eXBlTm9kZS5lbGVtZW50cy5tYXAoKGVsZW0pID0+IHJlc29sdmVUeXBlTm9kZShlbGVtKSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuUGFyZW50aGVzaXplZFR5cGU6XG4gICAgICAvLyDqtITtmLjroZwg66y27J24IO2DgOyehSAo7JiIOiAoQSAmIEIpW10g7JeQ7IScIChBICYgQikpXG4gICAgICAvLyDrgrTrtoAg7YOA7J6F7J2EIOyerOq3gOyggeycvOuhnCByZXNvbHZlXG4gICAgICByZXR1cm4gcmVzb2x2ZVR5cGVOb2RlKCh0eXBlTm9kZSBhcyB0cy5QYXJlbnRoZXNpemVkVHlwZU5vZGUpLnR5cGUpO1xuXG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkZ1bmN0aW9uVHlwZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgcGFyYW1ldGVyczogKHR5cGVOb2RlIGFzIHRzLkZ1bmN0aW9uVHlwZU5vZGUpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4gKHtcbiAgICAgICAgICBuYW1lOiBwYXJhbS5uYW1lLmdldFRleHQoKSxcbiAgICAgICAgICB0eXBlOiBwYXJhbS50eXBlID8gcmVzb2x2ZVR5cGVOb2RlKHBhcmFtLnR5cGUpIDogXCJ1bmtub3duXCIsXG4gICAgICAgICAgb3B0aW9uYWw6IHBhcmFtLnF1ZXN0aW9uVG9rZW4gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICBkZWZhdWx0RGVmOiB1bmRlZmluZWQsXG4gICAgICAgIH0pKSxcbiAgICAgICAgcmV0dXJuVHlwZTogcmVzb2x2ZVR5cGVOb2RlKCh0eXBlTm9kZSBhcyB0cy5GdW5jdGlvblR5cGVOb2RlKS50eXBlKSxcbiAgICAgIH07XG4gICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHR5cGVOb2RlIHVuZGVmaW5lZGApO1xuICB9XG5cbiAgY29uc29sZS5kZWJ1Zyh0eXBlTm9kZSk7XG4gIHRocm93IG5ldyBFcnJvcihg7JWMIOyImCDsl4bripQgU3ludGF4S2luZCAke3R5cGVOb2RlLmtpbmR9YCk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQYXJhbURlYyhcbiAgcGFyYW1EZWM6IHtcbiAgICBuYW1lOiB0cy5CaW5kaW5nTmFtZTtcbiAgICB0eXBlOiB0cy5UeXBlTm9kZTtcbiAgICBvcHRpb25hbD86IGJvb2xlYW47XG4gICAgZGVmYXVsdERlZj86IHN0cmluZztcbiAgfSxcbiAgaW5kZXg6IG51bWJlciA9IDAsXG4pOiBBcGlQYXJhbSB7XG4gIGNvbnN0IG5hbWUgPSBwYXJhbURlYy5uYW1lIGFzIHRzLklkZW50aWZpZXI7XG4gIGNvbnN0IHR5cGUgPSByZXNvbHZlVHlwZU5vZGUocGFyYW1EZWMudHlwZSk7XG5cbiAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnNvbGUuZGVidWcoeyBuYW1lLCB0eXBlLCBwYXJhbURlYyB9KTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogQXBpUGFyYW0gPSB7XG4gICAgbmFtZTogbmFtZS5lc2NhcGVkVGV4dCA/IG5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKSA6IGBub25hbWVBdCR7aW5kZXh9YCxcbiAgICB0eXBlLFxuICAgIG9wdGlvbmFsOiBwYXJhbURlYy5vcHRpb25hbCA9PT0gdHJ1ZSxcbiAgICBkZWZhdWx0RGVmOiBwYXJhbURlYz8uZGVmYXVsdERlZixcbiAgfTtcblxuICAvLyDqtazsobDrtoTtlbTtlaDri7nsnZgg6rK97JqwIO2DgOyeheydtOumhCDsgqzsmqlcbiAgaWYgKFxuICAgIHRzLmlzT2JqZWN0QmluZGluZ1BhdHRlcm4obmFtZSkgJiZcbiAgICB0cy5pc1R5cGVSZWZlcmVuY2VOb2RlKHBhcmFtRGVjLnR5cGUpICYmXG4gICAgdHMuaXNJZGVudGlmaWVyKHBhcmFtRGVjLnR5cGUudHlwZU5hbWUpXG4gICkge1xuICAgIHJlc3VsdC5uYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShwYXJhbURlYy50eXBlLnR5cGVOYW1lLnRleHQsIHRydWUpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcHJpbnROb2RlKG5vZGU6IHRzLk5vZGUgfCB1bmRlZmluZWQsIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHByaW50ZXIgPSB0cy5jcmVhdGVQcmludGVyKHsgbmV3TGluZTogdHMuTmV3TGluZUtpbmQuTGluZUZlZWQgfSk7XG4gIHJldHVybiBwcmludGVyLnByaW50Tm9kZSh0cy5FbWl0SGludC5VbnNwZWNpZmllZCwgbm9kZSwgc291cmNlRmlsZSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBZ0NBLGVBQXNCLGlCQUFpQixVQUFnRDtDQUNyRixJQUFJLENBQUMsU0FBUyxTQUFTLEtBQUssR0FDMUIsTUFBTSxJQUFJLE1BQ1IsR0FB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
|
package/dist/syncer/checksum.js
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { globAsync, init_async_utils } from "../utils/async-utils.js";
|
|
3
3
|
import { exists, init_fs_utils } from "../utils/fs-utils.js";
|
|
4
4
|
import { differenceWith, init_utils } from "../utils/utils.js";
|
|
5
5
|
import { Sonamu, init_sonamu } from "../api/sonamu.js";
|
|
6
6
|
import { GLOB_EXCLUDE, getChecksumPatternGroupInAbsolutePath, init_file_patterns } from "./file-patterns.js";
|
|
7
7
|
import { isEqual } from "radashi";
|
|
8
|
+
import { createReadStream } from "fs";
|
|
9
|
+
import path from "path";
|
|
8
10
|
import crypto from "crypto";
|
|
9
11
|
import { readFile, writeFile } from "fs/promises";
|
|
10
|
-
import path from "path";
|
|
11
|
-
import { createReadStream } from "fs";
|
|
12
12
|
import equal from "fast-deep-equal";
|
|
13
|
-
|
|
14
13
|
//#region src/syncer/checksum.ts
|
|
15
14
|
/**
|
|
16
15
|
* 체크섬 파일에 저장된 내용과 현재 실제 파일의 체크섬을 비교하여 변경된 파일을 찾습니다.
|
|
@@ -19,10 +18,7 @@ import equal from "fast-deep-equal";
|
|
|
19
18
|
async function findChangedFilesUsingChecksums() {
|
|
20
19
|
const calculatedChecksums = await getCurrentChecksums();
|
|
21
20
|
const savedChecksums = await getPreviousChecksums();
|
|
22
|
-
|
|
23
|
-
if (isSame) {
|
|
24
|
-
return [];
|
|
25
|
-
}
|
|
21
|
+
if (equal(calculatedChecksums, savedChecksums)) return [];
|
|
26
22
|
return differenceWith(calculatedChecksums, savedChecksums, isEqual).map((r) => r.path);
|
|
27
23
|
}
|
|
28
24
|
/**
|
|
@@ -31,11 +27,7 @@ async function findChangedFilesUsingChecksums() {
|
|
|
31
27
|
*/
|
|
32
28
|
async function renewChecksums() {
|
|
33
29
|
const calculatedChecksums = await getCurrentChecksums();
|
|
34
|
-
|
|
35
|
-
const isSame = equal(calculatedChecksums, savedChecksums);
|
|
36
|
-
if (isSame) {
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
30
|
+
if (equal(calculatedChecksums, await getPreviousChecksums())) return;
|
|
39
31
|
await saveChecksums(calculatedChecksums);
|
|
40
32
|
}
|
|
41
33
|
async function getCurrentChecksums() {
|
|
@@ -52,15 +44,12 @@ async function getCurrentChecksums() {
|
|
|
52
44
|
}
|
|
53
45
|
async function getPreviousChecksums() {
|
|
54
46
|
const checksumFilePath = getChecksumFilePath();
|
|
55
|
-
if (!await exists(checksumFilePath))
|
|
56
|
-
return [];
|
|
57
|
-
}
|
|
47
|
+
if (!await exists(checksumFilePath)) return [];
|
|
58
48
|
try {
|
|
59
|
-
|
|
49
|
+
return JSON.parse(await readFile(checksumFilePath, "utf-8")).map((r) => ({
|
|
60
50
|
path: path.join(Sonamu.appRootPath, r.path),
|
|
61
51
|
checksum: r.checksum
|
|
62
52
|
}));
|
|
63
|
-
return previousChecksums;
|
|
64
53
|
} catch (e) {
|
|
65
54
|
console.warn(`체크섬 파일(${checksumFilePath})을 파싱하는 데 실패했습니다. 전체 재동기화를 진행합니다.`, e);
|
|
66
55
|
return [];
|
|
@@ -97,8 +86,8 @@ var init_checksum = __esmMin((() => {
|
|
|
97
86
|
init_utils();
|
|
98
87
|
init_file_patterns();
|
|
99
88
|
}));
|
|
100
|
-
|
|
101
89
|
//#endregion
|
|
102
90
|
init_checksum();
|
|
103
91
|
export { findChangedFilesUsingChecksums, init_checksum, renewChecksums };
|
|
104
|
-
|
|
92
|
+
|
|
93
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tzdW0uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNlci9jaGVja3N1bS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3J5cHRvLCB7IHR5cGUgQmluYXJ5TGlrZSB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IGNyZWF0ZVJlYWRTdHJlYW0sIHR5cGUgUGF0aExpa2UgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IGdsb2JBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCwgdHlwZSBBcHBSZWxhdGl2ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHsgZGlmZmVyZW5jZVdpdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgsIEdMT0JfRVhDTFVERSB9IGZyb20gXCIuL2ZpbGUtcGF0dGVybnNcIjtcblxudHlwZSBQYXRoQW5kQ2hlY2tzdW0gPSB7XG4gIHBhdGg6IEFic29sdXRlUGF0aDtcbiAgY2hlY2tzdW06IHN0cmluZztcbn07XG5cbi8qKlxuICog7LK07YGs7ISsIO2MjOydvOyXkCDsoIDsnqXrkJwg64K07Jqp6rO8IO2YhOyerCDsi6TsoJwg7YyM7J287J2YIOyytO2BrOyErOydhCDruYTqtZDtlZjsl6wg67OA6rK965CcIO2MjOydvOydhCDssL7sirXri4jri6QuXG4gKiBAcmV0dXJucyDrs4Dqsr3rkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuIO2UhOuhnOygne2KuCDro6jtirjrtoDthLAg7Iqs656Y7Iuc66GcIOyLnOyeke2VqeuLiOuLpC4g7JiI7IucOiBcIi9zcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcygpOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gIGNvbnN0IGNhbGN1bGF0ZWRDaGVja3N1bXMgPSBhd2FpdCBnZXRDdXJyZW50Q2hlY2tzdW1zKCk7XG4gIGNvbnN0IHNhdmVkQ2hlY2tzdW1zID0gYXdhaXQgZ2V0UHJldmlvdXNDaGVja3N1bXMoKTtcblxuICBjb25zdCBpc1NhbWUgPSBlcXVhbChjYWxjdWxhdGVkQ2hlY2tzdW1zLCBzYXZlZENoZWNrc3Vtcyk7XG4gIGlmIChpc1NhbWUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gZGlmZmVyZW5jZVdpdGgoY2FsY3VsYXRlZENoZWNrc3Vtcywgc2F2ZWRDaGVja3N1bXMsIGlzRXF1YWwpLm1hcCgocikgPT4gci5wYXRoKTtcbn1cblxuLyoqXG4gKiDssrTtgazshKzsnYQg6rCx7Iug7ZWp64uI64ukLlxuICog7ZiE7J6sIO2MjOydvOuTpOydmCDssrTtgazshKzsnYQg6rOE7IKw7ZW07IScIOq1rO2VnCDri6TsnYwsIOyytO2BrOyErCDtjIzsnbzsl5Ag7KCA7J6l65CcIOuCtOyaqeqzvCDri6TrpbTrqbQg7LK07YGs7ISsIO2MjOydvOydhCDqsLHsi6Dtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5ld0NoZWNrc3VtcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FsY3VsYXRlZENoZWNrc3VtcyA9IGF3YWl0IGdldEN1cnJlbnRDaGVja3N1bXMoKTtcbiAgY29uc3Qgc2F2ZWRDaGVja3N1bXMgPSBhd2FpdCBnZXRQcmV2aW91c0NoZWNrc3VtcygpO1xuXG4gIGNvbnN0IGlzU2FtZSA9IGVxdWFsKGNhbGN1bGF0ZWRDaGVja3N1bXMsIHNhdmVkQ2hlY2tzdW1zKTtcbiAgaWYgKGlzU2FtZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IHNhdmVDaGVja3N1bXMoY2FsY3VsYXRlZENoZWNrc3Vtcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRDaGVja3N1bXMoKTogUHJvbWlzZTxQYXRoQW5kQ2hlY2tzdW1bXT4ge1xuICBjb25zdCBhbGxQYXRocyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIE9iamVjdC5lbnRyaWVzKGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgoKSkubWFwKChbX2ZpbGVUeXBlLCBwYXR0ZXJuXSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2xvYkFzeW5jKHBhdHRlcm4sIHsgZXhjbHVkZTogR0xPQl9FWENMVURFIH0pO1xuICAgICAgfSksXG4gICAgKVxuICApLmZsYXQoKTtcblxuICAvLyDrj5nsnbwg7YyM7J287J20IOyXrOufrCDtjKjthLTsl5Ag66ek7LmY65CgIOyImCDsnojsnLzrr4DroZwo7JiIOiBzZC5nZW5lcmF0ZWQudHPripQgZ2VuZXJhdGVk7JmAIHNkR2VuZXJhdGVk7JeQIOuqqOuRkCDrp6TsuZgpXG4gIC8vIOykkeuztSDsoJzqsbAg7ZuEIOyViOyglSDsoJXroKwuXG4gIGNvbnN0IGZpbGVQYXRocyA9IEFycmF5LmZyb20obmV3IFNldChhbGxQYXRocykpLnRvU29ydGVkKCkgYXMgQWJzb2x1dGVQYXRoW107XG5cbiAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGZpbGVQYXRocy5tYXAoYXN5bmMgKGZpbGVQYXRoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgY2hlY2tzdW06IGF3YWl0IGdldENoZWNrc3VtT2ZGaWxlKGZpbGVQYXRoKSxcbiAgICAgIH07XG4gICAgfSksXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFByZXZpb3VzQ2hlY2tzdW1zKCk6IFByb21pc2U8UGF0aEFuZENoZWNrc3VtW10+IHtcbiAgY29uc3QgY2hlY2tzdW1GaWxlUGF0aCA9IGdldENoZWNrc3VtRmlsZVBhdGgoKTtcbiAgaWYgKCEoYXdhaXQgZXhpc3RzKGNoZWNrc3VtRmlsZVBhdGgpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcHJldmlvdXNDaGVja3N1bXMgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGNoZWNrc3VtRmlsZVBhdGgsIFwidXRmLThcIikpLm1hcChcbiAgICAgIChyOiB7IHBhdGg6IEFwcFJlbGF0aXZlUGF0aDsgY2hlY2tzdW06IHN0cmluZyB9KSA9PiAoe1xuICAgICAgICBwYXRoOiBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCByLnBhdGgpLCAvLyDssrTtgazshKwg7YyM7J287JeQ7IScIOydveydhCDrlYw6IGFwcFJvb3Qg7IOB64yAIOqyveuhnCDihpIg7KCI64yAIOqyveuhnFxuICAgICAgICBjaGVja3N1bTogci5jaGVja3N1bSxcbiAgICAgIH0pLFxuICAgICkgYXMgUGF0aEFuZENoZWNrc3VtW107XG4gICAgcmV0dXJuIHByZXZpb3VzQ2hlY2tzdW1zO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8g7LK07YGs7ISsIO2MjOydvOydtCDshpDsg4HrkJwg6rK97JqwIOu5iCDrsLDsl7Qg67CY7ZmYICjsoITssrQg7J6s64+Z6riw7ZmUIOycoOuPhClcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBg7LK07YGs7ISsIO2MjOydvCgke2NoZWNrc3VtRmlsZVBhdGh9KeydhCDtjIzsi7HtlZjripQg642wIOyLpO2MqO2WiOyKteuLiOuLpC4g7KCE7LK0IOyerOuPmeq4sO2ZlOulvCDsp4Ttlontlanri4jri6QuYCxcbiAgICAgIGUsXG4gICAgKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q2hlY2tzdW1GaWxlUGF0aCgpOiBBYnNvbHV0ZVBhdGgge1xuICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzb25hbXUubG9ja1wiKSBhcyBBYnNvbHV0ZVBhdGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVDaGVja3N1bXMoY2hlY2tzdW1zOiBQYXRoQW5kQ2hlY2tzdW1bXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjaGVja3N1bUZpbGVQYXRoID0gZ2V0Q2hlY2tzdW1GaWxlUGF0aCgpO1xuICAvLyBhcHBSb290IOyDgeuMgCDqsr3roZzroZwg7KeB66Cs7ZmUICsg7JWM7YyM67KzIOyViOyglSDsoJXroKwgKFBSIGRpZmYg6rmo64GX7ZWY6rKMIOycoOyngClcbiAgY29uc3Qgc2VyaWFsaXplZCA9IGNoZWNrc3Vtc1xuICAgIC5tYXAoKHIpID0+ICh7XG4gICAgICBwYXRoOiBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcHBSb290UGF0aCwgci5wYXRoKSwgLy8g7LK07YGs7ISsIO2MjOydvOyXkCDsoIDsnqXtlaAg65WMOiDsoIjrjIAg6rK966GcIOKGkiBhcHBSb290IOyDgeuMgCDqsr3roZxcbiAgICAgIGNoZWNrc3VtOiByLmNoZWNrc3VtLFxuICAgIH0pKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLnBhdGgubG9jYWxlQ29tcGFyZShiLnBhdGgpKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGNoZWNrc3VtRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQsIG51bGwsIDIpLCBcInV0Zi04XCIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDaGVja3N1bU9mRmlsZShmaWxlUGF0aDogUGF0aExpa2UpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMVwiKTtcbiAgICBjb25zdCBpbnB1dCA9IGNyZWF0ZVJlYWRTdHJlYW0oZmlsZVBhdGgpO1xuICAgIGlucHV0Lm9uKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgICBpbnB1dC5vbihcImRhdGFcIiwgKGNodW5rOiBCaW5hcnlMaWtlKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShjaHVuayk7XG4gICAgfSk7XG4gICAgaW5wdXQub24oXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKGhhc2guZGlnZXN0KFwiaGV4XCIpKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0JBLGVBQXNCLGlDQUEwRDtDQUM5RSxNQUFNLHNCQUFzQixNQUFNLG9CQUFvQjtDQUN0RCxNQUFNLGlCQUFpQixNQUFNLHFCQUFxQjtDQUdsRCxJQURlLE1BQU0scUJBQXFCLGNBQ3RDLEdBQ0YsT0FBTyxDQUFDO0NBR1YsT0FBTyxlQUFlLHFCQUFxQixnQkFBZ0IsT0FBTyxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsSUFBSTtBQUN2Rjs7Ozs7QUFNQSxlQUFzQixpQkFBZ0M7Q0FDcEQsTUFBTSxzQkFBc0IsTUFBTSxvQkFBb0I7Q0FJdEQsSUFEZSxNQUFNLHFCQUFxQixNQUZiLHFCQUFxQixDQUc5QyxHQUNGO0NBR0YsTUFBTSxjQUFjLG1CQUFtQjtBQUN6QztBQUVBLGVBQWUsc0JBQWtEO0NBQy9ELE1BQU0sWUFDSixNQUFNLFFBQVEsSUFDWixPQUFPLFFBQVEsc0NBQXNDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLGFBQWE7RUFDcEYsT0FBTyxVQUFVLFNBQVMsRUFBRSxTQUFTLGFBQWEsQ0FBQztDQUNyRCxDQUFDLENBQ0gsRUFBQSxDQUNBLEtBQUs7Q0FJUCxNQUFNLFlBQVksTUFBTSxLQUFLLElBQUksSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7Q0FFekQsT0FBTyxNQUFNLFFBQVEsSUFDbkIsVUFBVSxJQUFJLE9BQU8sYUFBYTtFQUNoQyxPQUFPO0dBQ0wsTUFBTTtHQUNOLFVBQVUsTUFBTSxrQkFBa0IsUUFBUTtFQUM1QztDQUNGLENBQUMsQ0FDSDtBQUNGO0FBRUEsZUFBZSx1QkFBbUQ7Q0FDaEUsTUFBTSxtQkFBbUIsb0JBQW9CO0NBQzdDLElBQUksQ0FBRSxNQUFNLE9BQU8sZ0JBQWdCLEdBQ2pDLE9BQU8sQ0FBQztDQUdWLElBQUk7RUFPRixPQU4wQixLQUFLLE1BQU0sTUFBTSxTQUFTLGtCQUFrQixPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQzdFLE9BQW9EO0dBQ25ELE1BQU0sS0FBSyxLQUFLLE9BQU8sYUFBYSxFQUFFLElBQUk7R0FDMUMsVUFBVSxFQUFFO0VBQ2QsRUFFSztDQUNULFNBQVMsR0FBRztFQUVWLFFBQVEsS0FDTixVQUFVLGlCQUFpQixvQ0FDM0IsQ0FDRjtFQUNBLE9BQU8sQ0FBQztDQUNWO0FBQ0Y7QUFFQSxTQUFTLHNCQUFvQztDQUMzQyxPQUFPLEtBQUssS0FBSyxPQUFPLGFBQWEsYUFBYTtBQUNwRDtBQUVBLGVBQWUsY0FBYyxXQUE2QztDQUN4RSxNQUFNLG1CQUFtQixvQkFBb0I7Q0FFN0MsTUFBTSxhQUFhLFVBQ2hCLEtBQUssT0FBTztFQUNYLE1BQU0sS0FBSyxTQUFTLE9BQU8sYUFBYSxFQUFFLElBQUk7RUFDOUMsVUFBVSxFQUFFO0NBQ2QsRUFBRSxDQUFDLENBQ0YsTUFBTSxHQUFHLE1BQU0sRUFBRSxLQUFLLGNBQWMsRUFBRSxJQUFJLENBQUM7Q0FDOUMsTUFBTSxVQUFVLGtCQUFrQixLQUFLLFVBQVUsWUFBWSxNQUFNLENBQUMsR0FBRyxPQUFPO0FBQ2hGO0FBRUEsZUFBZSxrQkFBa0IsVUFBcUM7Q0FDcEUsT0FBTyxJQUFJLFNBQWlCLFNBQVMsV0FBVztFQUM5QyxNQUFNLE9BQU8sT0FBTyxXQUFXLE1BQU07RUFDckMsTUFBTSxRQUFRLGlCQUFpQixRQUFRO0VBQ3ZDLE1BQU0sR0FBRyxTQUFTLE1BQU07RUFDeEIsTUFBTSxHQUFHLFNBQVMsVUFBc0I7R0FDdEMsS0FBSyxPQUFPLEtBQUs7RUFDbkIsQ0FBQztFQUNELE1BQU0sR0FBRyxlQUFlO0dBQ3RCLFFBQVEsS0FBSyxPQUFPLEtBQUssQ0FBQztFQUM1QixDQUFDO0NBQ0gsQ0FBQztBQUNIOzthQXZIc0M7a0JBQ1U7ZUFDTjtZQUVLO29CQUNzQyJ9
|