@decohere/create 0.0.1-dev.48 → 0.0.1-dev.49
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/commonjs/src/cli.js +3 -3
- package/commonjs/src/resolve-launch.js +53 -0
- package/commonjs/src/runner.js +5 -45
- package/commonjs/src/version.js +1 -1
- package/es6/src/cli.js +3 -3
- package/es6/src/resolve-launch.js +46 -0
- package/es6/src/runner.js +8 -57
- package/es6/src/version.js +3 -3
- package/pack-builder-tgz.mjs +1 -1
- package/package.json +4 -11
- package/types/src/resolve-launch.d.ts +10 -0
- package/types/src/runner.d.ts +3 -13
- package/types/src/version.d.ts +0 -2
- package/commonjs/src/domain/prompt.js +0 -64
- package/commonjs/src/models/compose.model.js +0 -138
- package/commonjs/src/models/config-yaml.model.js +0 -88
- package/commonjs/src/models/const.js +0 -31
- package/commonjs/src/models/dev-container.model.js +0 -100
- package/commonjs/src/models/docker-image.model.js +0 -221
- package/commonjs/src/models/env-file.model.js +0 -47
- package/commonjs/src/models/gitignore.model.js +0 -31
- package/commonjs/src/models/launch-json.model.js +0 -74
- package/commonjs/src/models/package-json.model.js +0 -133
- package/commonjs/src/models/project.model.js +0 -134
- package/commonjs/src/models/source-file.js +0 -6
- package/commonjs/src/models/tsconfig.model.js +0 -34
- package/commonjs/src/models/vscode-settings.model.js +0 -31
- package/commonjs/src/program.js +0 -135
- package/commonjs/src/resolve-target-dir.js +0 -19
- package/commonjs/src/services/scaffold.service.js +0 -62
- package/commonjs/src/webapi/api-name.js +0 -95
- package/commonjs/src/webapi/const.js +0 -50
- package/commonjs/src/webapi/create-api.js +0 -285
- package/commonjs/src/webapi/features/auth.feature.js +0 -463
- package/commonjs/src/webapi/features/auth0-cli.js +0 -406
- package/commonjs/src/webapi/features/biome-format.js +0 -49
- package/commonjs/src/webapi/features/database.feature.js +0 -273
- package/commonjs/src/webapi/features/finalize.feature.js +0 -91
- package/commonjs/src/webapi/features/postman.feature.js +0 -319
- package/commonjs/src/webapi/models/api-package-json.model.js +0 -63
- package/commonjs/src/webapi/models/auth-config.model.js +0 -26
- package/commonjs/src/webapi/models/controller-source-file.model.js +0 -188
- package/commonjs/src/webapi/models/github-ci.model.js +0 -193
- package/commonjs/src/webapi/models/main-source-file.model.js +0 -165
- package/commonjs/src/webapi/models/production-dockerfile.model.js +0 -138
- package/commonjs/src/webapi/models/sample-files.model.js +0 -60
- package/commonjs/src/webapi/models/webapi-image.model.js +0 -22
- package/commonjs/src/webapi/postman/hello-openapi.js +0 -175
- package/commonjs/src/webapi/postman/local-view.js +0 -184
- package/commonjs/src/webapi/postman/openapi-to-postman.js +0 -202
- package/es6/src/domain/prompt.js +0 -43
- package/es6/src/models/compose.model.js +0 -132
- package/es6/src/models/config-yaml.model.js +0 -76
- package/es6/src/models/const.js +0 -21
- package/es6/src/models/dev-container.model.js +0 -90
- package/es6/src/models/docker-image.model.js +0 -185
- package/es6/src/models/env-file.model.js +0 -43
- package/es6/src/models/gitignore.model.js +0 -21
- package/es6/src/models/launch-json.model.js +0 -64
- package/es6/src/models/package-json.model.js +0 -129
- package/es6/src/models/project.model.js +0 -119
- package/es6/src/models/source-file.js +0 -3
- package/es6/src/models/tsconfig.model.js +0 -24
- package/es6/src/models/vscode-settings.model.js +0 -21
- package/es6/src/program.js +0 -76
- package/es6/src/resolve-target-dir.js +0 -9
- package/es6/src/services/scaffold.service.js +0 -52
- package/es6/src/webapi/api-name.js +0 -59
- package/es6/src/webapi/const.js +0 -20
- package/es6/src/webapi/create-api.js +0 -265
- package/es6/src/webapi/features/auth.feature.js +0 -412
- package/es6/src/webapi/features/auth0-cli.js +0 -348
- package/es6/src/webapi/features/biome-format.js +0 -42
- package/es6/src/webapi/features/database.feature.js +0 -263
- package/es6/src/webapi/features/finalize.feature.js +0 -81
- package/es6/src/webapi/features/postman.feature.js +0 -253
- package/es6/src/webapi/models/api-package-json.model.js +0 -58
- package/es6/src/webapi/models/auth-config.model.js +0 -22
- package/es6/src/webapi/models/controller-source-file.model.js +0 -179
- package/es6/src/webapi/models/github-ci.model.js +0 -186
- package/es6/src/webapi/models/main-source-file.model.js +0 -161
- package/es6/src/webapi/models/production-dockerfile.model.js +0 -126
- package/es6/src/webapi/models/sample-files.model.js +0 -42
- package/es6/src/webapi/models/webapi-image.model.js +0 -12
- package/es6/src/webapi/postman/hello-openapi.js +0 -168
- package/es6/src/webapi/postman/local-view.js +0 -169
- package/es6/src/webapi/postman/openapi-to-postman.js +0 -179
- package/types/src/domain/prompt.d.ts +0 -4
- package/types/src/models/compose.model.d.ts +0 -59
- package/types/src/models/config-yaml.model.d.ts +0 -27
- package/types/src/models/const.d.ts +0 -19
- package/types/src/models/dev-container.model.d.ts +0 -33
- package/types/src/models/docker-image.model.d.ts +0 -56
- package/types/src/models/env-file.model.d.ts +0 -15
- package/types/src/models/gitignore.model.d.ts +0 -6
- package/types/src/models/launch-json.model.d.ts +0 -7
- package/types/src/models/package-json.model.d.ts +0 -32
- package/types/src/models/project.model.d.ts +0 -60
- package/types/src/models/source-file.d.ts +0 -11
- package/types/src/models/tsconfig.model.d.ts +0 -5
- package/types/src/models/vscode-settings.model.d.ts +0 -7
- package/types/src/program.d.ts +0 -3
- package/types/src/resolve-target-dir.d.ts +0 -5
- package/types/src/services/scaffold.service.d.ts +0 -22
- package/types/src/webapi/api-name.d.ts +0 -14
- package/types/src/webapi/const.d.ts +0 -17
- package/types/src/webapi/create-api.d.ts +0 -15
- package/types/src/webapi/features/auth.feature.d.ts +0 -10
- package/types/src/webapi/features/auth0-cli.d.ts +0 -72
- package/types/src/webapi/features/biome-format.d.ts +0 -5
- package/types/src/webapi/features/database.feature.d.ts +0 -5
- package/types/src/webapi/features/finalize.feature.d.ts +0 -2
- package/types/src/webapi/features/postman.feature.d.ts +0 -16
- package/types/src/webapi/models/api-package-json.model.d.ts +0 -18
- package/types/src/webapi/models/auth-config.model.d.ts +0 -26
- package/types/src/webapi/models/controller-source-file.model.d.ts +0 -45
- package/types/src/webapi/models/github-ci.model.d.ts +0 -9
- package/types/src/webapi/models/main-source-file.model.d.ts +0 -54
- package/types/src/webapi/models/production-dockerfile.model.d.ts +0 -20
- package/types/src/webapi/models/sample-files.model.d.ts +0 -7
- package/types/src/webapi/models/webapi-image.model.d.ts +0 -5
- package/types/src/webapi/postman/hello-openapi.d.ts +0 -19
- package/types/src/webapi/postman/local-view.d.ts +0 -17
- package/types/src/webapi/postman/openapi-to-postman.d.ts +0 -62
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
import { WELL_KNOWN_FILES } from "./const.js";
|
|
2
|
-
export class DockerStep {
|
|
3
|
-
key;
|
|
4
|
-
content;
|
|
5
|
-
order;
|
|
6
|
-
constructor(key, content, order = 0){
|
|
7
|
-
this.key = key;
|
|
8
|
-
this.content = content;
|
|
9
|
-
this.order = order;
|
|
10
|
-
}
|
|
11
|
-
static run(key, command, order = 0) {
|
|
12
|
-
return new DockerStep(key, `RUN ${command}`, order);
|
|
13
|
-
}
|
|
14
|
-
static raw(key, content, order = 0) {
|
|
15
|
-
return new DockerStep(key, content, order);
|
|
16
|
-
}
|
|
17
|
-
static entrypoint(key, value, order = 0) {
|
|
18
|
-
const content = typeof value === "string" ? `ENTRYPOINT ${value}` : `ENTRYPOINT ${JSON.stringify(value)}`;
|
|
19
|
-
return new DockerStep(key, content, order);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
const StepOrder = {
|
|
23
|
-
base: 1_000,
|
|
24
|
-
features: 5_000,
|
|
25
|
-
user: 9_000,
|
|
26
|
-
entrypoint: 10_000
|
|
27
|
-
};
|
|
28
|
-
const VSCODE_BOOTLOADER_FIX_BASH_SNIPPET = `if [[ -n "\${NODE_OPTIONS:-}" && "\${NODE_OPTIONS}" == *"bootloader.js"* ]]; then
|
|
29
|
-
_bootloader_path="$(printf '%s\\n' "$NODE_OPTIONS" | sed -n 's/.*--require[= ]\\([^[:space:]]*bootloader\\.js\\).*/\\1/p')"
|
|
30
|
-
if [[ -n "\${_bootloader_path}" && ! -f "\${_bootloader_path}" ]]; then
|
|
31
|
-
_stable_bootloader="$(find /vscode/vscode-server /home/node/.vscode-server/extensions -name "bootloader.js" -path "*/ms-vscode.js-debug/*" 2>/dev/null | head -1)"
|
|
32
|
-
if [[ -n "\${_stable_bootloader}" ]]; then
|
|
33
|
-
NODE_OPTIONS="\${NODE_OPTIONS//\${_bootloader_path}/\${_stable_bootloader}}"
|
|
34
|
-
else
|
|
35
|
-
NODE_OPTIONS="$(printf '%s\\n' "$NODE_OPTIONS" | sed -E 's#(^| )--require(=| )[[:graph:]]*bootloader\\.js( |$)# #g; s# +# #g; s#^ ##; s# $##')"
|
|
36
|
-
unset VSCODE_INSPECTOR_OPTIONS
|
|
37
|
-
fi
|
|
38
|
-
export NODE_OPTIONS
|
|
39
|
-
if [[ -z "$NODE_OPTIONS" ]]; then
|
|
40
|
-
unset NODE_OPTIONS
|
|
41
|
-
fi
|
|
42
|
-
fi
|
|
43
|
-
unset _bootloader_path _stable_bootloader
|
|
44
|
-
fi`;
|
|
45
|
-
export function withCommandHistory(options) {
|
|
46
|
-
const historyDir = options?.historyDir ?? "/commandhistory";
|
|
47
|
-
const historyFileName = options?.historyFileName ?? ".bash_history";
|
|
48
|
-
const order = options?.order ?? StepOrder.base;
|
|
49
|
-
const historyFile = `${historyDir}/${historyFileName}`;
|
|
50
|
-
return (dockerfile)=>{
|
|
51
|
-
dockerfile.addStep(DockerStep.run("history-dir", `mkdir -p ${historyDir} && touch ${historyFile}`, order)).addStep(DockerStep.raw("history-env", `ENV HISTFILE=${historyFile}`, order + 1));
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
export function withNodeUser(options) {
|
|
55
|
-
const username = options?.username ?? "node";
|
|
56
|
-
const includeUserInstruction = options?.includeUserInstruction ?? true;
|
|
57
|
-
const order = options?.order ?? StepOrder.features;
|
|
58
|
-
return (dockerfile)=>{
|
|
59
|
-
dockerfile.addStep(DockerStep.raw("arg-username", `ARG USERNAME=${username}`, order));
|
|
60
|
-
if (includeUserInstruction) {
|
|
61
|
-
dockerfile.addStep(DockerStep.raw("user", "USER ${USERNAME}", StepOrder.user));
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
export function withPnpm(options) {
|
|
66
|
-
const version = options?.version ?? "10";
|
|
67
|
-
const usernameExpr = options?.usernameExpr ?? "${USERNAME}";
|
|
68
|
-
const order = options?.order ?? StepOrder.features + 100;
|
|
69
|
-
return (dockerfile)=>{
|
|
70
|
-
dockerfile.addStep(DockerStep.run("pnpm-install", `npm install --global npm@latest && npm add --global pnpm@${version}`, order)).addStep(DockerStep.run("pnpm-config", `mkdir -p /home/${usernameExpr}/.config/pnpm /home/${usernameExpr}/.pnpm-store && chown -R ${usernameExpr}:${usernameExpr} /home/${usernameExpr}/.config /home/${usernameExpr}/.pnpm-store && printf "store-dir=/home/${usernameExpr}/.pnpm-store\\n" > /home/${usernameExpr}/.config/pnpm/rc`, order + 1));
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
export function withWorkspaceNodeModulesOwnership(options) {
|
|
74
|
-
const workspaceDir = options?.workspaceDir ?? "/workspace";
|
|
75
|
-
const usernameExpr = options?.usernameExpr ?? "${USERNAME}";
|
|
76
|
-
const order = options?.order ?? StepOrder.features + 200;
|
|
77
|
-
return (dockerfile)=>{
|
|
78
|
-
dockerfile.addStep(DockerStep.raw("workspace-node-modules", `RUN mkdir -p ${workspaceDir}/node_modules && chown ${usernameExpr}:${usernameExpr} ${workspaceDir}/node_modules`, order));
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
export function withVsCodeJsDebugBootloaderFix(options) {
|
|
82
|
-
const bashrcPath = options?.bashrcPath ?? "/home/${USERNAME}/.bashrc";
|
|
83
|
-
const order = options?.order ?? StepOrder.features + 300;
|
|
84
|
-
return (dockerfile)=>{
|
|
85
|
-
dockerfile.addStep(DockerStep.raw("vscode-bootloader-fix", [
|
|
86
|
-
"# VS Code / Cursor js-debug Auto Attach injects --require …/bootloader.js into",
|
|
87
|
-
"# NODE_OPTIONS. On a fresh Dev Container that path often does not exist yet",
|
|
88
|
-
"# (workspaceStorage file is only created after toggling Auto Attach), which crashes",
|
|
89
|
-
"# every Node command. If the injected path is missing, prefer the stable",
|
|
90
|
-
"# bootloader from the server extension install; otherwise strip the bad require.",
|
|
91
|
-
`RUN cat <<'EOF' >> "${bashrcPath}"`,
|
|
92
|
-
VSCODE_BOOTLOADER_FIX_BASH_SNIPPET,
|
|
93
|
-
"EOF"
|
|
94
|
-
].join("\n"), order));
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
export class DockerfileModel {
|
|
98
|
-
key = WELL_KNOWN_FILES.DOCKERFILE;
|
|
99
|
-
_steps = new Map();
|
|
100
|
-
_layerWriters = [];
|
|
101
|
-
_fromImage;
|
|
102
|
-
_layerCounter = 0;
|
|
103
|
-
constructor(baseImage){
|
|
104
|
-
this._fromImage = baseImage;
|
|
105
|
-
this.registerBaseLayers();
|
|
106
|
-
}
|
|
107
|
-
from(baseImage) {
|
|
108
|
-
this._fromImage = baseImage;
|
|
109
|
-
return this;
|
|
110
|
-
}
|
|
111
|
-
addLayer(layer, order = StepOrder.features) {
|
|
112
|
-
if (typeof layer === "string") {
|
|
113
|
-
const idx = ++this._layerCounter;
|
|
114
|
-
const key = `layer-run-${idx}`;
|
|
115
|
-
this._layerWriters.push((dockerfile)=>{
|
|
116
|
-
dockerfile.addStep(DockerStep.run(key, layer, order + idx));
|
|
117
|
-
});
|
|
118
|
-
return this;
|
|
119
|
-
}
|
|
120
|
-
this._layerWriters.push(layer);
|
|
121
|
-
return this;
|
|
122
|
-
}
|
|
123
|
-
addStep(step) {
|
|
124
|
-
this._steps.set(step.key, step);
|
|
125
|
-
return this;
|
|
126
|
-
}
|
|
127
|
-
removeStep(key) {
|
|
128
|
-
this._steps.delete(key);
|
|
129
|
-
return this;
|
|
130
|
-
}
|
|
131
|
-
entrypoint(value, order = StepOrder.entrypoint) {
|
|
132
|
-
this.addStep(DockerStep.entrypoint("entrypoint", value, order));
|
|
133
|
-
return this;
|
|
134
|
-
}
|
|
135
|
-
addRunStep(cmd) {
|
|
136
|
-
return this.addLayer(cmd);
|
|
137
|
-
}
|
|
138
|
-
build() {
|
|
139
|
-
for (const layerWriter of this._layerWriters){
|
|
140
|
-
layerWriter(this);
|
|
141
|
-
}
|
|
142
|
-
const lines = [
|
|
143
|
-
`FROM ${this._fromImage}`
|
|
144
|
-
];
|
|
145
|
-
const sortedSteps = [
|
|
146
|
-
...this._steps.values()
|
|
147
|
-
].sort((left, right)=>{
|
|
148
|
-
if (left.order !== right.order) {
|
|
149
|
-
return left.order - right.order;
|
|
150
|
-
}
|
|
151
|
-
return left.key.localeCompare(right.key, "en");
|
|
152
|
-
});
|
|
153
|
-
for (const step of sortedSteps){
|
|
154
|
-
lines.push("", step.content);
|
|
155
|
-
}
|
|
156
|
-
return `${lines.join("\n")}\n`;
|
|
157
|
-
}
|
|
158
|
-
registerBaseLayers() {
|
|
159
|
-
// Generic base model intentionally has no default layers.
|
|
160
|
-
}
|
|
161
|
-
files() {
|
|
162
|
-
return [
|
|
163
|
-
{
|
|
164
|
-
filePath: "./Dockerfile",
|
|
165
|
-
content: this.build()
|
|
166
|
-
}
|
|
167
|
-
];
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
export class DevContainerImageModel extends DockerfileModel {
|
|
171
|
-
registerBaseLayers() {
|
|
172
|
-
super.registerBaseLayers();
|
|
173
|
-
this.addLayer(withCommandHistory()).addLayer(withVsCodeJsDebugBootloaderFix());
|
|
174
|
-
}
|
|
175
|
-
files() {
|
|
176
|
-
return [
|
|
177
|
-
{
|
|
178
|
-
filePath: ".devcontainer/Dockerfile",
|
|
179
|
-
content: this.build()
|
|
180
|
-
}
|
|
181
|
-
];
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2RvY2tlci1pbWFnZS5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4vY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSB9IGZyb20gXCIuL3NvdXJjZS1maWxlLmpzXCI7XG5cbmV4cG9ydCB0eXBlIExheWVyV3JpdGVyID0gKGRvY2tlcmZpbGU6IERvY2tlcmZpbGVNb2RlbCkgPT4gdm9pZDtcblxuZXhwb3J0IGNsYXNzIERvY2tlclN0ZXAge1xuXHRwdWJsaWMgY29uc3RydWN0b3IoXG5cdFx0cHVibGljIHJlYWRvbmx5IGtleTogc3RyaW5nLFxuXHRcdHB1YmxpYyByZWFkb25seSBjb250ZW50OiBzdHJpbmcsXG5cdFx0cHVibGljIHJlYWRvbmx5IG9yZGVyID0gMCxcblx0KSB7fVxuXG5cdHB1YmxpYyBzdGF0aWMgcnVuKGtleTogc3RyaW5nLCBjb21tYW5kOiBzdHJpbmcsIG9yZGVyID0gMCkge1xuXHRcdHJldHVybiBuZXcgRG9ja2VyU3RlcChrZXksIGBSVU4gJHtjb21tYW5kfWAsIG9yZGVyKTtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgcmF3KGtleTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIG9yZGVyID0gMCkge1xuXHRcdHJldHVybiBuZXcgRG9ja2VyU3RlcChrZXksIGNvbnRlbnQsIG9yZGVyKTtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgZW50cnlwb2ludChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdLCBvcmRlciA9IDApIHtcblx0XHRjb25zdCBjb250ZW50ID1cblx0XHRcdHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIlxuXHRcdFx0XHQ/IGBFTlRSWVBPSU5UICR7dmFsdWV9YFxuXHRcdFx0XHQ6IGBFTlRSWVBPSU5UICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWA7XG5cdFx0cmV0dXJuIG5ldyBEb2NrZXJTdGVwKGtleSwgY29udGVudCwgb3JkZXIpO1xuXHR9XG59XG5cbmNvbnN0IFN0ZXBPcmRlciA9IHtcblx0YmFzZTogMV8wMDAsXG5cdGZlYXR1cmVzOiA1XzAwMCxcblx0dXNlcjogOV8wMDAsXG5cdGVudHJ5cG9pbnQ6IDEwXzAwMCxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IFZTQ09ERV9CT09UTE9BREVSX0ZJWF9CQVNIX1NOSVBQRVQgPSBgaWYgW1sgLW4gXCJcXCR7Tk9ERV9PUFRJT05TOi19XCIgJiYgXCJcXCR7Tk9ERV9PUFRJT05TfVwiID09ICpcImJvb3Rsb2FkZXIuanNcIiogXV07IHRoZW5cbiAgICBfYm9vdGxvYWRlcl9wYXRoPVwiJChwcmludGYgJyVzXFxcXG4nIFwiJE5PREVfT1BUSU9OU1wiIHwgc2VkIC1uICdzLy4qLS1yZXF1aXJlWz0gXVxcXFwoW15bOnNwYWNlOl1dKmJvb3Rsb2FkZXJcXFxcLmpzXFxcXCkuKi9cXFxcMS9wJylcIlxuICAgIGlmIFtbIC1uIFwiXFwke19ib290bG9hZGVyX3BhdGh9XCIgJiYgISAtZiBcIlxcJHtfYm9vdGxvYWRlcl9wYXRofVwiIF1dOyB0aGVuXG4gICAgICAgIF9zdGFibGVfYm9vdGxvYWRlcj1cIiQoZmluZCAvdnNjb2RlL3ZzY29kZS1zZXJ2ZXIgL2hvbWUvbm9kZS8udnNjb2RlLXNlcnZlci9leHRlbnNpb25zIC1uYW1lIFwiYm9vdGxvYWRlci5qc1wiIC1wYXRoIFwiKi9tcy12c2NvZGUuanMtZGVidWcvKlwiIDI+L2Rldi9udWxsIHwgaGVhZCAtMSlcIlxuICAgICAgICBpZiBbWyAtbiBcIlxcJHtfc3RhYmxlX2Jvb3Rsb2FkZXJ9XCIgXV07IHRoZW5cbiAgICAgICAgICAgIE5PREVfT1BUSU9OUz1cIlxcJHtOT0RFX09QVElPTlMvL1xcJHtfYm9vdGxvYWRlcl9wYXRofS9cXCR7X3N0YWJsZV9ib290bG9hZGVyfX1cIlxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBOT0RFX09QVElPTlM9XCIkKHByaW50ZiAnJXNcXFxcbicgXCIkTk9ERV9PUFRJT05TXCIgfCBzZWQgLUUgJ3MjKF58ICktLXJlcXVpcmUoPXwgKVtbOmdyYXBoOl1dKmJvb3Rsb2FkZXJcXFxcLmpzKCB8JCkjICNnOyBzIyAgKyMgI2c7IHMjXiAjIzsgcyMgJCMjJylcIlxuICAgICAgICAgICAgdW5zZXQgVlNDT0RFX0lOU1BFQ1RPUl9PUFRJT05TXG4gICAgICAgIGZpXG4gICAgICAgIGV4cG9ydCBOT0RFX09QVElPTlNcbiAgICAgICAgaWYgW1sgLXogXCIkTk9ERV9PUFRJT05TXCIgXV07IHRoZW5cbiAgICAgICAgICAgIHVuc2V0IE5PREVfT1BUSU9OU1xuICAgICAgICBmaVxuICAgIGZpXG4gICAgdW5zZXQgX2Jvb3Rsb2FkZXJfcGF0aCBfc3RhYmxlX2Jvb3Rsb2FkZXJcbmZpYDtcblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhDb21tYW5kSGlzdG9yeShvcHRpb25zPzoge1xuXHRoaXN0b3J5RGlyPzogc3RyaW5nO1xuXHRoaXN0b3J5RmlsZU5hbWU/OiBzdHJpbmc7XG5cdG9yZGVyPzogbnVtYmVyO1xufSk6IExheWVyV3JpdGVyIHtcblx0Y29uc3QgaGlzdG9yeURpciA9IG9wdGlvbnM/Lmhpc3RvcnlEaXIgPz8gXCIvY29tbWFuZGhpc3RvcnlcIjtcblx0Y29uc3QgaGlzdG9yeUZpbGVOYW1lID0gb3B0aW9ucz8uaGlzdG9yeUZpbGVOYW1lID8/IFwiLmJhc2hfaGlzdG9yeVwiO1xuXHRjb25zdCBvcmRlciA9IG9wdGlvbnM/Lm9yZGVyID8/IFN0ZXBPcmRlci5iYXNlO1xuXHRjb25zdCBoaXN0b3J5RmlsZSA9IGAke2hpc3RvcnlEaXJ9LyR7aGlzdG9yeUZpbGVOYW1lfWA7XG5cblx0cmV0dXJuIChkb2NrZXJmaWxlKSA9PiB7XG5cdFx0ZG9ja2VyZmlsZVxuXHRcdFx0LmFkZFN0ZXAoXG5cdFx0XHRcdERvY2tlclN0ZXAucnVuKFwiaGlzdG9yeS1kaXJcIiwgYG1rZGlyIC1wICR7aGlzdG9yeURpcn0gJiYgdG91Y2ggJHtoaXN0b3J5RmlsZX1gLCBvcmRlciksXG5cdFx0XHQpXG5cdFx0XHQuYWRkU3RlcChEb2NrZXJTdGVwLnJhdyhcImhpc3RvcnktZW52XCIsIGBFTlYgSElTVEZJTEU9JHtoaXN0b3J5RmlsZX1gLCBvcmRlciArIDEpKTtcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhOb2RlVXNlcihvcHRpb25zPzoge1xuXHR1c2VybmFtZT86IHN0cmluZztcblx0aW5jbHVkZVVzZXJJbnN0cnVjdGlvbj86IGJvb2xlYW47XG5cdG9yZGVyPzogbnVtYmVyO1xufSk6IExheWVyV3JpdGVyIHtcblx0Y29uc3QgdXNlcm5hbWUgPSBvcHRpb25zPy51c2VybmFtZSA/PyBcIm5vZGVcIjtcblx0Y29uc3QgaW5jbHVkZVVzZXJJbnN0cnVjdGlvbiA9IG9wdGlvbnM/LmluY2x1ZGVVc2VySW5zdHJ1Y3Rpb24gPz8gdHJ1ZTtcblx0Y29uc3Qgb3JkZXIgPSBvcHRpb25zPy5vcmRlciA/PyBTdGVwT3JkZXIuZmVhdHVyZXM7XG5cblx0cmV0dXJuIChkb2NrZXJmaWxlKSA9PiB7XG5cdFx0ZG9ja2VyZmlsZS5hZGRTdGVwKERvY2tlclN0ZXAucmF3KFwiYXJnLXVzZXJuYW1lXCIsIGBBUkcgVVNFUk5BTUU9JHt1c2VybmFtZX1gLCBvcmRlcikpO1xuXG5cdFx0aWYgKGluY2x1ZGVVc2VySW5zdHJ1Y3Rpb24pIHtcblx0XHRcdGRvY2tlcmZpbGUuYWRkU3RlcChEb2NrZXJTdGVwLnJhdyhcInVzZXJcIiwgXCJVU0VSICR7VVNFUk5BTUV9XCIsIFN0ZXBPcmRlci51c2VyKSk7XG5cdFx0fVxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFBucG0ob3B0aW9ucz86IHtcblx0dmVyc2lvbj86IHN0cmluZztcblx0dXNlcm5hbWVFeHByPzogc3RyaW5nO1xuXHRvcmRlcj86IG51bWJlcjtcbn0pOiBMYXllcldyaXRlciB7XG5cdGNvbnN0IHZlcnNpb24gPSBvcHRpb25zPy52ZXJzaW9uID8/IFwiMTBcIjtcblx0Y29uc3QgdXNlcm5hbWVFeHByID0gb3B0aW9ucz8udXNlcm5hbWVFeHByID8/IFwiJHtVU0VSTkFNRX1cIjtcblx0Y29uc3Qgb3JkZXIgPSBvcHRpb25zPy5vcmRlciA/PyBTdGVwT3JkZXIuZmVhdHVyZXMgKyAxMDA7XG5cblx0cmV0dXJuIChkb2NrZXJmaWxlKSA9PiB7XG5cdFx0ZG9ja2VyZmlsZVxuXHRcdFx0LmFkZFN0ZXAoXG5cdFx0XHRcdERvY2tlclN0ZXAucnVuKFxuXHRcdFx0XHRcdFwicG5wbS1pbnN0YWxsXCIsXG5cdFx0XHRcdFx0YG5wbSBpbnN0YWxsIC0tZ2xvYmFsIG5wbUBsYXRlc3QgJiYgbnBtIGFkZCAtLWdsb2JhbCBwbnBtQCR7dmVyc2lvbn1gLFxuXHRcdFx0XHRcdG9yZGVyLFxuXHRcdFx0XHQpLFxuXHRcdFx0KVxuXHRcdFx0LmFkZFN0ZXAoXG5cdFx0XHRcdERvY2tlclN0ZXAucnVuKFxuXHRcdFx0XHRcdFwicG5wbS1jb25maWdcIixcblx0XHRcdFx0XHRgbWtkaXIgLXAgL2hvbWUvJHt1c2VybmFtZUV4cHJ9Ly5jb25maWcvcG5wbSAvaG9tZS8ke3VzZXJuYW1lRXhwcn0vLnBucG0tc3RvcmUgJiYgY2hvd24gLVIgJHt1c2VybmFtZUV4cHJ9OiR7dXNlcm5hbWVFeHByfSAvaG9tZS8ke3VzZXJuYW1lRXhwcn0vLmNvbmZpZyAvaG9tZS8ke3VzZXJuYW1lRXhwcn0vLnBucG0tc3RvcmUgJiYgcHJpbnRmIFwic3RvcmUtZGlyPS9ob21lLyR7dXNlcm5hbWVFeHByfS8ucG5wbS1zdG9yZVxcXFxuXCIgPiAvaG9tZS8ke3VzZXJuYW1lRXhwcn0vLmNvbmZpZy9wbnBtL3JjYCxcblx0XHRcdFx0XHRvcmRlciArIDEsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFdvcmtzcGFjZU5vZGVNb2R1bGVzT3duZXJzaGlwKG9wdGlvbnM/OiB7XG5cdHdvcmtzcGFjZURpcj86IHN0cmluZztcblx0dXNlcm5hbWVFeHByPzogc3RyaW5nO1xuXHRvcmRlcj86IG51bWJlcjtcbn0pOiBMYXllcldyaXRlciB7XG5cdGNvbnN0IHdvcmtzcGFjZURpciA9IG9wdGlvbnM/LndvcmtzcGFjZURpciA/PyBcIi93b3Jrc3BhY2VcIjtcblx0Y29uc3QgdXNlcm5hbWVFeHByID0gb3B0aW9ucz8udXNlcm5hbWVFeHByID8/IFwiJHtVU0VSTkFNRX1cIjtcblx0Y29uc3Qgb3JkZXIgPSBvcHRpb25zPy5vcmRlciA/PyBTdGVwT3JkZXIuZmVhdHVyZXMgKyAyMDA7XG5cblx0cmV0dXJuIChkb2NrZXJmaWxlKSA9PiB7XG5cdFx0ZG9ja2VyZmlsZS5hZGRTdGVwKFxuXHRcdFx0RG9ja2VyU3RlcC5yYXcoXG5cdFx0XHRcdFwid29ya3NwYWNlLW5vZGUtbW9kdWxlc1wiLFxuXHRcdFx0XHRgUlVOIG1rZGlyIC1wICR7d29ya3NwYWNlRGlyfS9ub2RlX21vZHVsZXMgJiYgY2hvd24gJHt1c2VybmFtZUV4cHJ9OiR7dXNlcm5hbWVFeHByfSAke3dvcmtzcGFjZURpcn0vbm9kZV9tb2R1bGVzYCxcblx0XHRcdFx0b3JkZXIsXG5cdFx0XHQpLFxuXHRcdCk7XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoVnNDb2RlSnNEZWJ1Z0Jvb3Rsb2FkZXJGaXgob3B0aW9ucz86IHtcblx0YmFzaHJjUGF0aD86IHN0cmluZztcblx0b3JkZXI/OiBudW1iZXI7XG59KTogTGF5ZXJXcml0ZXIge1xuXHRjb25zdCBiYXNocmNQYXRoID0gb3B0aW9ucz8uYmFzaHJjUGF0aCA/PyBcIi9ob21lLyR7VVNFUk5BTUV9Ly5iYXNocmNcIjtcblx0Y29uc3Qgb3JkZXIgPSBvcHRpb25zPy5vcmRlciA/PyBTdGVwT3JkZXIuZmVhdHVyZXMgKyAzMDA7XG5cblx0cmV0dXJuIChkb2NrZXJmaWxlKSA9PiB7XG5cdFx0ZG9ja2VyZmlsZS5hZGRTdGVwKFxuXHRcdFx0RG9ja2VyU3RlcC5yYXcoXG5cdFx0XHRcdFwidnNjb2RlLWJvb3Rsb2FkZXItZml4XCIsXG5cdFx0XHRcdFtcblx0XHRcdFx0XHRcIiMgVlMgQ29kZSAvIEN1cnNvciBqcy1kZWJ1ZyBBdXRvIEF0dGFjaCBpbmplY3RzIC0tcmVxdWlyZSDigKYvYm9vdGxvYWRlci5qcyBpbnRvXCIsXG5cdFx0XHRcdFx0XCIjIE5PREVfT1BUSU9OUy4gT24gYSBmcmVzaCBEZXYgQ29udGFpbmVyIHRoYXQgcGF0aCBvZnRlbiBkb2VzIG5vdCBleGlzdCB5ZXRcIixcblx0XHRcdFx0XHRcIiMgKHdvcmtzcGFjZVN0b3JhZ2UgZmlsZSBpcyBvbmx5IGNyZWF0ZWQgYWZ0ZXIgdG9nZ2xpbmcgQXV0byBBdHRhY2gpLCB3aGljaCBjcmFzaGVzXCIsXG5cdFx0XHRcdFx0XCIjIGV2ZXJ5IE5vZGUgY29tbWFuZC4gSWYgdGhlIGluamVjdGVkIHBhdGggaXMgbWlzc2luZywgcHJlZmVyIHRoZSBzdGFibGVcIixcblx0XHRcdFx0XHRcIiMgYm9vdGxvYWRlciBmcm9tIHRoZSBzZXJ2ZXIgZXh0ZW5zaW9uIGluc3RhbGw7IG90aGVyd2lzZSBzdHJpcCB0aGUgYmFkIHJlcXVpcmUuXCIsXG5cdFx0XHRcdFx0YFJVTiBjYXQgPDwnRU9GJyA+PiBcIiR7YmFzaHJjUGF0aH1cImAsXG5cdFx0XHRcdFx0VlNDT0RFX0JPT1RMT0FERVJfRklYX0JBU0hfU05JUFBFVCxcblx0XHRcdFx0XHRcIkVPRlwiLFxuXHRcdFx0XHRdLmpvaW4oXCJcXG5cIiksXG5cdFx0XHRcdG9yZGVyLFxuXHRcdFx0KSxcblx0XHQpO1xuXHR9O1xufVxuXG5leHBvcnQgY2xhc3MgRG9ja2VyZmlsZU1vZGVsIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHB1YmxpYyByZWFkb25seSBrZXkgPSBXRUxMX0tOT1dOX0ZJTEVTLkRPQ0tFUkZJTEU7XG5cdHByaXZhdGUgcmVhZG9ubHkgX3N0ZXBzID0gbmV3IE1hcDxzdHJpbmcsIERvY2tlclN0ZXA+KCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2xheWVyV3JpdGVyczogTGF5ZXJXcml0ZXJbXSA9IFtdO1xuXHRwcml2YXRlIF9mcm9tSW1hZ2U6IHN0cmluZztcblx0cHJpdmF0ZSBfbGF5ZXJDb3VudGVyID0gMDtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoYmFzZUltYWdlOiBzdHJpbmcpIHtcblx0XHR0aGlzLl9mcm9tSW1hZ2UgPSBiYXNlSW1hZ2U7XG5cdFx0dGhpcy5yZWdpc3RlckJhc2VMYXllcnMoKTtcblx0fVxuXG5cdHB1YmxpYyBmcm9tKGJhc2VJbWFnZTogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fZnJvbUltYWdlID0gYmFzZUltYWdlO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGFkZExheWVyKGxheWVyOiBMYXllcldyaXRlciB8IHN0cmluZywgb3JkZXIgPSBTdGVwT3JkZXIuZmVhdHVyZXMpOiB0aGlzIHtcblx0XHRpZiAodHlwZW9mIGxheWVyID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRjb25zdCBpZHggPSArK3RoaXMuX2xheWVyQ291bnRlcjtcblx0XHRcdGNvbnN0IGtleSA9IGBsYXllci1ydW4tJHtpZHh9YDtcblx0XHRcdHRoaXMuX2xheWVyV3JpdGVycy5wdXNoKChkb2NrZXJmaWxlKSA9PiB7XG5cdFx0XHRcdGRvY2tlcmZpbGUuYWRkU3RlcChEb2NrZXJTdGVwLnJ1bihrZXksIGxheWVyLCBvcmRlciArIGlkeCkpO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHR0aGlzLl9sYXllcldyaXRlcnMucHVzaChsYXllcik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgYWRkU3RlcChzdGVwOiBEb2NrZXJTdGVwKTogdGhpcyB7XG5cdFx0dGhpcy5fc3RlcHMuc2V0KHN0ZXAua2V5LCBzdGVwKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyByZW1vdmVTdGVwKGtleTogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fc3RlcHMuZGVsZXRlKGtleSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZW50cnlwb2ludCh2YWx1ZTogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW10sIG9yZGVyID0gU3RlcE9yZGVyLmVudHJ5cG9pbnQpOiB0aGlzIHtcblx0XHR0aGlzLmFkZFN0ZXAoRG9ja2VyU3RlcC5lbnRyeXBvaW50KFwiZW50cnlwb2ludFwiLCB2YWx1ZSwgb3JkZXIpKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBhZGRSdW5TdGVwKGNtZDogc3RyaW5nKTogdGhpcyB7XG5cdFx0cmV0dXJuIHRoaXMuYWRkTGF5ZXIoY21kKTtcblx0fVxuXG5cdHB1YmxpYyBidWlsZCgpOiBzdHJpbmcge1xuXHRcdGZvciAoY29uc3QgbGF5ZXJXcml0ZXIgb2YgdGhpcy5fbGF5ZXJXcml0ZXJzKSB7XG5cdFx0XHRsYXllcldyaXRlcih0aGlzKTtcblx0XHR9XG5cblx0XHRjb25zdCBsaW5lcyA9IFtgRlJPTSAke3RoaXMuX2Zyb21JbWFnZX1gXTtcblx0XHRjb25zdCBzb3J0ZWRTdGVwcyA9IFsuLi50aGlzLl9zdGVwcy52YWx1ZXMoKV0uc29ydCgobGVmdCwgcmlnaHQpID0+IHtcblx0XHRcdGlmIChsZWZ0Lm9yZGVyICE9PSByaWdodC5vcmRlcikge1xuXHRcdFx0XHRyZXR1cm4gbGVmdC5vcmRlciAtIHJpZ2h0Lm9yZGVyO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGxlZnQua2V5LmxvY2FsZUNvbXBhcmUocmlnaHQua2V5LCBcImVuXCIpO1xuXHRcdH0pO1xuXG5cdFx0Zm9yIChjb25zdCBzdGVwIG9mIHNvcnRlZFN0ZXBzKSB7XG5cdFx0XHRsaW5lcy5wdXNoKFwiXCIsIHN0ZXAuY29udGVudCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGAke2xpbmVzLmpvaW4oXCJcXG5cIil9XFxuYDtcblx0fVxuXG5cdHByb3RlY3RlZCByZWdpc3RlckJhc2VMYXllcnMoKTogdm9pZCB7XG5cdFx0Ly8gR2VuZXJpYyBiYXNlIG1vZGVsIGludGVudGlvbmFsbHkgaGFzIG5vIGRlZmF1bHQgbGF5ZXJzLlxuXHR9XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLi9Eb2NrZXJmaWxlXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IHRoaXMuYnVpbGQoKSxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgRGV2Q29udGFpbmVySW1hZ2VNb2RlbCBleHRlbmRzIERvY2tlcmZpbGVNb2RlbCB7XG5cdHByb3RlY3RlZCBvdmVycmlkZSByZWdpc3RlckJhc2VMYXllcnMoKTogdm9pZCB7XG5cdFx0c3VwZXIucmVnaXN0ZXJCYXNlTGF5ZXJzKCk7XG5cdFx0dGhpcy5hZGRMYXllcih3aXRoQ29tbWFuZEhpc3RvcnkoKSkuYWRkTGF5ZXIod2l0aFZzQ29kZUpzRGVidWdCb290bG9hZGVyRml4KCkpO1xuXHR9XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLmRldmNvbnRhaW5lci9Eb2NrZXJmaWxlXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IHRoaXMuYnVpbGQoKSxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIldFTExfS05PV05fRklMRVMiLCJEb2NrZXJTdGVwIiwia2V5IiwiY29udGVudCIsIm9yZGVyIiwicnVuIiwiY29tbWFuZCIsInJhdyIsImVudHJ5cG9pbnQiLCJ2YWx1ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJTdGVwT3JkZXIiLCJiYXNlIiwiZmVhdHVyZXMiLCJ1c2VyIiwiVlNDT0RFX0JPT1RMT0FERVJfRklYX0JBU0hfU05JUFBFVCIsIndpdGhDb21tYW5kSGlzdG9yeSIsIm9wdGlvbnMiLCJoaXN0b3J5RGlyIiwiaGlzdG9yeUZpbGVOYW1lIiwiaGlzdG9yeUZpbGUiLCJkb2NrZXJmaWxlIiwiYWRkU3RlcCIsIndpdGhOb2RlVXNlciIsInVzZXJuYW1lIiwiaW5jbHVkZVVzZXJJbnN0cnVjdGlvbiIsIndpdGhQbnBtIiwidmVyc2lvbiIsInVzZXJuYW1lRXhwciIsIndpdGhXb3Jrc3BhY2VOb2RlTW9kdWxlc093bmVyc2hpcCIsIndvcmtzcGFjZURpciIsIndpdGhWc0NvZGVKc0RlYnVnQm9vdGxvYWRlckZpeCIsImJhc2hyY1BhdGgiLCJqb2luIiwiRG9ja2VyZmlsZU1vZGVsIiwiRE9DS0VSRklMRSIsIl9zdGVwcyIsIk1hcCIsIl9sYXllcldyaXRlcnMiLCJfZnJvbUltYWdlIiwiX2xheWVyQ291bnRlciIsImJhc2VJbWFnZSIsInJlZ2lzdGVyQmFzZUxheWVycyIsImZyb20iLCJhZGRMYXllciIsImxheWVyIiwiaWR4IiwicHVzaCIsInN0ZXAiLCJzZXQiLCJyZW1vdmVTdGVwIiwiZGVsZXRlIiwiYWRkUnVuU3RlcCIsImNtZCIsImJ1aWxkIiwibGF5ZXJXcml0ZXIiLCJsaW5lcyIsInNvcnRlZFN0ZXBzIiwidmFsdWVzIiwic29ydCIsImxlZnQiLCJyaWdodCIsImxvY2FsZUNvbXBhcmUiLCJmaWxlcyIsImZpbGVQYXRoIiwiRGV2Q29udGFpbmVySW1hZ2VNb2RlbCJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsZ0JBQWdCLFFBQVEsYUFBYTtBQUs5QyxPQUFPLE1BQU1DOzs7O0lBQ1osWUFDQyxBQUFnQkMsR0FBVyxFQUMzQixBQUFnQkMsT0FBZSxFQUMvQixBQUFnQkMsUUFBUSxDQUFDLENBQ3hCO2FBSGVGLE1BQUFBO2FBQ0FDLFVBQUFBO2FBQ0FDLFFBQUFBO0lBQ2Q7SUFFSCxPQUFjQyxJQUFJSCxHQUFXLEVBQUVJLE9BQWUsRUFBRUYsUUFBUSxDQUFDLEVBQUU7UUFDMUQsT0FBTyxJQUFJSCxXQUFXQyxLQUFLLENBQUMsSUFBSSxFQUFFSSxTQUFTLEVBQUVGO0lBQzlDO0lBRUEsT0FBY0csSUFBSUwsR0FBVyxFQUFFQyxPQUFl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
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs";
|
|
2
|
-
import { WELL_KNOWN_FILES } from "./const.js";
|
|
3
|
-
/**
|
|
4
|
-
* Accumulates key=value pairs and renders them as a `.env` file.
|
|
5
|
-
*
|
|
6
|
-
* Register once in the workspace; features call `addEntry` during their
|
|
7
|
-
* scaffold phase to contribute environment variables. The final file is
|
|
8
|
-
* written at render time when `workspace.scaffold()` is called.
|
|
9
|
-
*/ export class EnvFile {
|
|
10
|
-
key = WELL_KNOWN_FILES.ENV_FILE;
|
|
11
|
-
_entries = new Map();
|
|
12
|
-
addEntry(key, value) {
|
|
13
|
-
this._entries.set(key, value);
|
|
14
|
-
return this;
|
|
15
|
-
}
|
|
16
|
-
static fromFile(absolutePath) {
|
|
17
|
-
const env = new EnvFile();
|
|
18
|
-
const raw = readFileSync(absolutePath, "utf8");
|
|
19
|
-
for (const line of raw.split("\n")){
|
|
20
|
-
const trimmed = line.trim();
|
|
21
|
-
if (trimmed === "" || trimmed.startsWith("#")) continue;
|
|
22
|
-
const eq = line.indexOf("=");
|
|
23
|
-
if (eq <= 0) continue;
|
|
24
|
-
env.addEntry(line.slice(0, eq).trim(), line.slice(eq + 1));
|
|
25
|
-
}
|
|
26
|
-
return env;
|
|
27
|
-
}
|
|
28
|
-
files() {
|
|
29
|
-
if (this._entries.size === 0) return [];
|
|
30
|
-
const body = [
|
|
31
|
-
...this._entries.entries()
|
|
32
|
-
].map(([k, v])=>`${k}=${v}`).join("\n");
|
|
33
|
-
const content = `${body}\n`;
|
|
34
|
-
return [
|
|
35
|
-
{
|
|
36
|
-
filePath: ".env",
|
|
37
|
-
content
|
|
38
|
-
}
|
|
39
|
-
];
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2Vudi1maWxlLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4vY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSB9IGZyb20gXCIuL3NvdXJjZS1maWxlLmpzXCI7XG5cbi8qKlxuICogQWNjdW11bGF0ZXMga2V5PXZhbHVlIHBhaXJzIGFuZCByZW5kZXJzIHRoZW0gYXMgYSBgLmVudmAgZmlsZS5cbiAqXG4gKiBSZWdpc3RlciBvbmNlIGluIHRoZSB3b3Jrc3BhY2U7IGZlYXR1cmVzIGNhbGwgYGFkZEVudHJ5YCBkdXJpbmcgdGhlaXJcbiAqIHNjYWZmb2xkIHBoYXNlIHRvIGNvbnRyaWJ1dGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBUaGUgZmluYWwgZmlsZSBpc1xuICogd3JpdHRlbiBhdCByZW5kZXIgdGltZSB3aGVuIGB3b3Jrc3BhY2Uuc2NhZmZvbGQoKWAgaXMgY2FsbGVkLlxuICovXG5leHBvcnQgY2xhc3MgRW52RmlsZSBpbXBsZW1lbnRzIEtleWVkTW9kZWwge1xuXHRwdWJsaWMgcmVhZG9ubHkga2V5ID0gV0VMTF9LTk9XTl9GSUxFUy5FTlZfRklMRTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IF9lbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuXHRwdWJsaWMgYWRkRW50cnkoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9lbnRyaWVzLnNldChrZXksIHZhbHVlKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgZnJvbUZpbGUoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBFbnZGaWxlIHtcblx0XHRjb25zdCBlbnYgPSBuZXcgRW52RmlsZSgpO1xuXHRcdGNvbnN0IHJhdyA9IHJlYWRGaWxlU3luYyhhYnNvbHV0ZVBhdGgsIFwidXRmOFwiKTtcblx0XHRmb3IgKGNvbnN0IGxpbmUgb2YgcmF3LnNwbGl0KFwiXFxuXCIpKSB7XG5cdFx0XHRjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG5cdFx0XHRpZiAodHJpbW1lZCA9PT0gXCJcIiB8fCB0cmltbWVkLnN0YXJ0c1dpdGgoXCIjXCIpKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IGVxID0gbGluZS5pbmRleE9mKFwiPVwiKTtcblx0XHRcdGlmIChlcSA8PSAwKSBjb250aW51ZTtcblx0XHRcdGVudi5hZGRFbnRyeShsaW5lLnNsaWNlKDAsIGVxKS50cmltKCksIGxpbmUuc2xpY2UoZXEgKyAxKSk7XG5cdFx0fVxuXHRcdHJldHVybiBlbnY7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRpZiAodGhpcy5fZW50cmllcy5zaXplID09PSAwKSByZXR1cm4gW107XG5cdFx0Y29uc3QgYm9keSA9IFsuLi50aGlzLl9lbnRyaWVzLmVudHJpZXMoKV0ubWFwKChbaywgdl0pID0+IGAke2t9PSR7dn1gKS5qb2luKFwiXFxuXCIpO1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBgJHtib2R5fVxcbmA7XG5cdFx0cmV0dXJuIFt7IGZpbGVQYXRoOiBcIi5lbnZcIiwgY29udGVudCB9XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbInJlYWRGaWxlU3luYyIsIldFTExfS05PV05fRklMRVMiLCJFbnZGaWxlIiwia2V5IiwiRU5WX0ZJTEUiLCJfZW50cmllcyIsIk1hcCIsImFkZEVudHJ5IiwidmFsdWUiLCJzZXQiLCJmcm9tRmlsZSIsImFic29sdXRlUGF0aCIsImVudiIsInJhdyIsImxpbmUiLCJzcGxpdCIsInRyaW1tZWQiLCJ0cmltIiwic3RhcnRzV2l0aCIsImVxIiwiaW5kZXhPZiIsInNsaWNlIiwiZmlsZXMiLCJzaXplIiwiYm9keSIsImVudHJpZXMiLCJtYXAiLCJrIiwidiIsImpvaW4iLCJjb250ZW50IiwiZmlsZVBhdGgiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFlBQVksUUFBUSxVQUFVO0FBQ3ZDLFNBQVNDLGdCQUFnQixRQUFRLGFBQWE7QUFHOUM7Ozs7OztDQU1DLEdBQ0QsT0FBTyxNQUFNQztJQUNJQyxNQUFNRixpQkFBaUJHLFFBQVEsQ0FBQztJQUUvQkMsV0FBVyxJQUFJQyxNQUFzQjtJQUUvQ0MsU0FBU0osR0FBVyxFQUFFSyxLQUFhLEVBQVE7UUFDakQsSUFBSSxDQUFDSCxRQUFRLENBQUNJLEdBQUcsQ0FBQ04sS0FBS0s7UUFDdkIsT0FBTyxJQUFJO0lBQ1o7SUFFQSxPQUFjRSxTQUFTQyxZQUFvQixFQUFXO1FBQ3JELE1BQU1DLE1BQU0sSUFBSVY7UUFDaEIsTUFBTVcsTUFBTWIsYUFBYVcsY0FBYztRQUN2QyxLQUFLLE1BQU1HLFFBQVFELElBQUlFLEtBQUssQ0FBQyxNQUFPO1lBQ25DLE1BQU1DLFVBQVVGLEtBQUtHLElBQUk7WUFDekIsSUFBSUQsWUFBWSxNQUFNQSxRQUFRRSxVQUFVLENBQUMsTUFBTTtZQUMvQyxNQUFNQyxLQUFLTCxLQUFLTSxPQUFPLENBQUM7WUFDeEIsSUFBSUQsTUFBTSxHQUFHO1lBQ2JQLElBQUlMLFFBQVEsQ0FBQ08sS0FBS08sS0FBSyxDQUFDLEdBQUdGLElBQUlGLElBQUksSUFBSUgsS0FBS08sS0FBSyxDQUFDRixLQUFLO1FBQ3hEO1FBQ0EsT0FBT1A7SUFDUjtJQUVPVSxRQUFzQjtRQUM1QixJQUFJLElBQUksQ0FBQ2pCLFFBQVEsQ0FBQ2tCLElBQUksS0FBSyxHQUFHLE9BQU8sRUFBRTtRQUN2QyxNQUFNQyxPQUFPO2VBQUksSUFBSSxDQUFDbkIsUUFBUSxDQUFDb0IsT0FBTztTQUFHLENBQUNDLEdBQUcsQ0FBQyxDQUFDLENBQUNDLEdBQUdDLEVBQUUsR0FBSyxHQUFHRCxFQUFFLENBQUMsRUFBRUMsR0FBRyxFQUFFQyxJQUFJLENBQUM7UUFDNUUsTUFBTUMsVUFBVSxHQUFHTixLQUFLLEVBQUUsQ0FBQztRQUMzQixPQUFPO1lBQUM7Z0JBQUVPLFVBQVU7Z0JBQVFEO1lBQVE7U0FBRTtJQUN2QztBQUNEIn0=
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { WELL_KNOWN_FILES } from "./const.js";
|
|
2
|
-
export class Gitignore {
|
|
3
|
-
key = WELL_KNOWN_FILES.GITIGNORE;
|
|
4
|
-
ignoreList = [
|
|
5
|
-
"node_modules",
|
|
6
|
-
"dist",
|
|
7
|
-
".pnpm-store",
|
|
8
|
-
".env",
|
|
9
|
-
".DS_Store"
|
|
10
|
-
];
|
|
11
|
-
files() {
|
|
12
|
-
return [
|
|
13
|
-
{
|
|
14
|
-
filePath: ".gitignore",
|
|
15
|
-
content: this.ignoreList.join("\n")
|
|
16
|
-
}
|
|
17
|
-
];
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2dpdGlnbm9yZS5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4vY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSB9IGZyb20gXCIuL3NvdXJjZS1maWxlLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBHaXRpZ25vcmUgaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuR0lUSUdOT1JFO1xuXHRwcml2YXRlIGlnbm9yZUxpc3QgPSBbXCJub2RlX21vZHVsZXNcIiwgXCJkaXN0XCIsIFwiLnBucG0tc3RvcmVcIiwgXCIuZW52XCIsIFwiLkRTX1N0b3JlXCJdO1xuXG5cdHB1YmxpYyBmaWxlcygpOiBTb3VyY2VGaWxlW10ge1xuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcIi5naXRpZ25vcmVcIixcblx0XHRcdFx0Y29udGVudDogdGhpcy5pZ25vcmVMaXN0LmpvaW4oXCJcXG5cIiksXG5cdFx0XHR9LFxuXHRcdF07XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJXRUxMX0tOT1dOX0ZJTEVTIiwiR2l0aWdub3JlIiwia2V5IiwiR0lUSUdOT1JFIiwiaWdub3JlTGlzdCIsImZpbGVzIiwiZmlsZVBhdGgiLCJjb250ZW50Iiwiam9pbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsZ0JBQWdCLFFBQVEsYUFBYTtBQUc5QyxPQUFPLE1BQU1DO0lBQ0lDLE1BQU1GLGlCQUFpQkcsU0FBUyxDQUFDO0lBQ3pDQyxhQUFhO1FBQUM7UUFBZ0I7UUFBUTtRQUFlO1FBQVE7S0FBWSxDQUFDO0lBRTNFQyxRQUFzQjtRQUM1QixPQUFPO1lBQ047Z0JBQ0NDLFVBQVU7Z0JBQ1ZDLFNBQVMsSUFBSSxDQUFDSCxVQUFVLENBQUNJLElBQUksQ0FBQztZQUMvQjtTQUNBO0lBQ0Y7QUFDRCJ9
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { WELL_KNOWN_FILES } from "./const.js";
|
|
2
|
-
export class LaunchJson {
|
|
3
|
-
apiNames;
|
|
4
|
-
key = WELL_KNOWN_FILES.LAUNCH_JSON;
|
|
5
|
-
constructor(apiNames = [
|
|
6
|
-
"api"
|
|
7
|
-
]){
|
|
8
|
-
this.apiNames = apiNames;
|
|
9
|
-
}
|
|
10
|
-
files() {
|
|
11
|
-
const configurations = [
|
|
12
|
-
{
|
|
13
|
-
name: "Build",
|
|
14
|
-
type: "node",
|
|
15
|
-
request: "launch",
|
|
16
|
-
runtimeExecutable: "pnpm",
|
|
17
|
-
runtimeArgs: [
|
|
18
|
-
"build"
|
|
19
|
-
],
|
|
20
|
-
console: "integratedTerminal",
|
|
21
|
-
// biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code variable
|
|
22
|
-
cwd: "${workspaceFolder}"
|
|
23
|
-
}
|
|
24
|
-
];
|
|
25
|
-
const first = this.apiNames[0] ?? "api";
|
|
26
|
-
const defaultDevArgs = first === "api" && this.apiNames.length === 1 ? [
|
|
27
|
-
"dev"
|
|
28
|
-
] : [
|
|
29
|
-
"run",
|
|
30
|
-
`dev:${first}`
|
|
31
|
-
];
|
|
32
|
-
configurations.push(serveConfig("Serve / Dev", defaultDevArgs));
|
|
33
|
-
for (const apiName of this.apiNames){
|
|
34
|
-
if (apiName === first && this.apiNames.length === 1 && apiName === "api") continue;
|
|
35
|
-
configurations.push(serveConfig(`Serve / Dev (${apiName})`, [
|
|
36
|
-
"run",
|
|
37
|
-
`dev:${apiName}`
|
|
38
|
-
]));
|
|
39
|
-
}
|
|
40
|
-
return [
|
|
41
|
-
{
|
|
42
|
-
filePath: ".vscode/launch.json",
|
|
43
|
-
content: JSON.stringify({
|
|
44
|
-
version: "0.2.0",
|
|
45
|
-
configurations
|
|
46
|
-
}, null, 2)
|
|
47
|
-
}
|
|
48
|
-
];
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
function serveConfig(name, runtimeArgs) {
|
|
52
|
-
return {
|
|
53
|
-
name,
|
|
54
|
-
type: "node",
|
|
55
|
-
request: "launch",
|
|
56
|
-
runtimeExecutable: "pnpm",
|
|
57
|
-
runtimeArgs,
|
|
58
|
-
console: "integratedTerminal",
|
|
59
|
-
// biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code variable
|
|
60
|
-
cwd: "${workspaceFolder}"
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2xhdW5jaC1qc29uLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLZXllZE1vZGVsLCBTb3VyY2VGaWxlIH0gZnJvbSBcIi4vc291cmNlLWZpbGUuanNcIjtcblxuZXhwb3J0IGNsYXNzIExhdW5jaEpzb24gaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuTEFVTkNIX0pTT047XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXBpTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1wiYXBpXCJdKSB7fVxuXG5cdHB1YmxpYyBmaWxlcygpOiBTb3VyY2VGaWxlW10ge1xuXHRcdGNvbnN0IGNvbmZpZ3VyYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0gW1xuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkJ1aWxkXCIsXG5cdFx0XHRcdHR5cGU6IFwibm9kZVwiLFxuXHRcdFx0XHRyZXF1ZXN0OiBcImxhdW5jaFwiLFxuXHRcdFx0XHRydW50aW1lRXhlY3V0YWJsZTogXCJwbnBtXCIsXG5cdFx0XHRcdHJ1bnRpbWVBcmdzOiBbXCJidWlsZFwiXSxcblx0XHRcdFx0Y29uc29sZTogXCJpbnRlZ3JhdGVkVGVybWluYWxcIixcblx0XHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1RlbXBsYXRlQ3VybHlJblN0cmluZzogVlMgQ29kZSB2YXJpYWJsZVxuXHRcdFx0XHRjd2Q6IFwiJHt3b3Jrc3BhY2VGb2xkZXJ9XCIsXG5cdFx0XHR9LFxuXHRcdF07XG5cblx0XHRjb25zdCBmaXJzdCA9IHRoaXMuYXBpTmFtZXNbMF0gPz8gXCJhcGlcIjtcblx0XHRjb25zdCBkZWZhdWx0RGV2QXJncyA9XG5cdFx0XHRmaXJzdCA9PT0gXCJhcGlcIiAmJiB0aGlzLmFwaU5hbWVzLmxlbmd0aCA9PT0gMSA/IFtcImRldlwiXSA6IFtcInJ1blwiLCBgZGV2OiR7Zmlyc3R9YF07XG5cdFx0Y29uZmlndXJhdGlvbnMucHVzaChzZXJ2ZUNvbmZpZyhcIlNlcnZlIC8gRGV2XCIsIGRlZmF1bHREZXZBcmdzKSk7XG5cblx0XHRmb3IgKGNvbnN0IGFwaU5hbWUgb2YgdGhpcy5hcGlOYW1lcykge1xuXHRcdFx0aWYgKGFwaU5hbWUgPT09IGZpcnN0ICYmIHRoaXMuYXBpTmFtZXMubGVuZ3RoID09PSAxICYmIGFwaU5hbWUgPT09IFwiYXBpXCIpIGNvbnRpbnVlO1xuXHRcdFx0Y29uZmlndXJhdGlvbnMucHVzaChzZXJ2ZUNvbmZpZyhgU2VydmUgLyBEZXYgKCR7YXBpTmFtZX0pYCwgW1wicnVuXCIsIGBkZXY6JHthcGlOYW1lfWBdKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLnZzY29kZS9sYXVuY2guanNvblwiLFxuXHRcdFx0XHRjb250ZW50OiBKU09OLnN0cmluZ2lmeShcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR2ZXJzaW9uOiBcIjAuMi4wXCIsXG5cdFx0XHRcdFx0XHRjb25maWd1cmF0aW9ucyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0Mixcblx0XHRcdFx0KSxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuXG5mdW5jdGlvbiBzZXJ2ZUNvbmZpZyhuYW1lOiBzdHJpbmcsIHJ1bnRpbWVBcmdzOiBzdHJpbmdbXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcblx0cmV0dXJuIHtcblx0XHRuYW1lLFxuXHRcdHR5cGU6IFwibm9kZVwiLFxuXHRcdHJlcXVlc3Q6IFwibGF1bmNoXCIsXG5cdFx0cnVudGltZUV4ZWN1dGFibGU6IFwicG5wbVwiLFxuXHRcdHJ1bnRpbWVBcmdzLFxuXHRcdGNvbnNvbGU6IFwiaW50ZWdyYXRlZFRlcm1pbmFsXCIsXG5cdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1RlbXBsYXRlQ3VybHlJblN0cmluZzogVlMgQ29kZSB2YXJpYWJsZVxuXHRcdGN3ZDogXCIke3dvcmtzcGFjZUZvbGRlcn1cIixcblx0fTtcbn1cbiJdLCJuYW1lcyI6WyJXRUxMX0tOT1dOX0ZJTEVTIiwiTGF1bmNoSnNvbiIsImtleSIsIkxBVU5DSF9KU09OIiwiYXBpTmFtZXMiLCJmaWxlcyIsImNvbmZpZ3VyYXRpb25zIiwibmFtZSIsInR5cGUiLCJyZXF1ZXN0IiwicnVudGltZUV4ZWN1dGFibGUiLCJydW50aW1lQXJncyIsImNvbnNvbGUiLCJjd2QiLCJmaXJzdCIsImRlZmF1bHREZXZBcmdzIiwibGVuZ3RoIiwicHVzaCIsInNlcnZlQ29uZmlnIiwiYXBpTmFtZSIsImZpbGVQYXRoIiwiY29udGVudCIsIkpTT04iLCJzdHJpbmdpZnkiLCJ2ZXJzaW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxnQkFBZ0IsUUFBUSxhQUFhO0FBRzlDLE9BQU8sTUFBTUM7O0lBQ0lDLE1BQU1GLGlCQUFpQkcsV0FBVyxDQUFDO0lBRW5ELFlBQW1CLEFBQWlCQyxXQUE4QjtRQUFDO0tBQU0sQ0FBRTthQUF2Q0EsV0FBQUE7SUFBd0M7SUFFckVDLFFBQXNCO1FBQzVCLE1BQU1DLGlCQUE0QztZQUNqRDtnQkFDQ0MsTUFBTTtnQkFDTkMsTUFBTTtnQkFDTkMsU0FBUztnQkFDVEMsbUJBQW1CO2dCQUNuQkMsYUFBYTtvQkFBQztpQkFBUTtnQkFDdEJDLFNBQVM7Z0JBQ1QseUVBQXlFO2dCQUN6RUMsS0FBSztZQUNOO1NBQ0E7UUFFRCxNQUFNQyxRQUFRLElBQUksQ0FBQ1YsUUFBUSxDQUFDLEVBQUUsSUFBSTtRQUNsQyxNQUFNVyxpQkFDTEQsVUFBVSxTQUFTLElBQUksQ0FBQ1YsUUFBUSxDQUFDWSxNQUFNLEtBQUssSUFBSTtZQUFDO1NBQU0sR0FBRztZQUFDO1lBQU8sQ0FBQyxJQUFJLEVBQUVGLE9BQU87U0FBQztRQUNsRlIsZUFBZVcsSUFBSSxDQUFDQyxZQUFZLGVBQWVIO1FBRS9DLEtBQUssTUFBTUksV0FBVyxJQUFJLENBQUNmLFFBQVEsQ0FBRTtZQUNwQyxJQUFJZSxZQUFZTCxTQUFTLElBQUksQ0FBQ1YsUUFBUSxDQUFDWSxNQUFNLEtBQUssS0FBS0csWUFBWSxPQUFPO1lBQzFFYixlQUFlVyxJQUFJLENBQUNDLFlBQVksQ0FBQyxhQUFhLEVBQUVDLFFBQVEsQ0FBQyxDQUFDLEVBQUU7Z0JBQUM7Z0JBQU8sQ0FBQyxJQUFJLEVBQUVBLFNBQVM7YUFBQztRQUN0RjtRQUVBLE9BQU87WUFDTjtnQkFDQ0MsVUFBVTtnQkFDVkMsU0FBU0MsS0FBS0MsU0FBUyxDQUN0QjtvQkFDQ0MsU0FBUztvQkFDVGxCO2dCQUNELEdBQ0EsTUFDQTtZQUVGO1NBQ0E7SUFDRjtBQUNEO0FBRUEsU0FBU1ksWUFBWVgsSUFBWSxFQUFFSSxXQUFxQjtJQUN2RCxPQUFPO1FBQ05KO1FBQ0FDLE1BQU07UUFDTkMsU0FBUztRQUNUQyxtQkFBbUI7UUFDbkJDO1FBQ0FDLFNBQVM7UUFDVCx5RUFBeUU7UUFDekVDLEtBQUs7SUFDTjtBQUNEIn0=
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs";
|
|
2
|
-
import { CREATE_VERSION } from "../version.js";
|
|
3
|
-
import { DEFAULT_WEBAPI_NAME, webapiPackageName, webapiPort, webapiReleaseEntry } from "../webapi/const.js";
|
|
4
|
-
import { WELL_KNOWN_FILES } from "./const.js";
|
|
5
|
-
/**
|
|
6
|
-
* Builder for the root `package.json`.
|
|
7
|
-
*
|
|
8
|
-
* Starts with the core API dependencies. Features call `addDependency` /
|
|
9
|
-
* `addDevDependency` during their scaffold phase to inject their own deps
|
|
10
|
-
* before `files()` is called at render time.
|
|
11
|
-
*/ export class PackageJson {
|
|
12
|
-
name;
|
|
13
|
-
key = WELL_KNOWN_FILES.PACKAGE_JSON;
|
|
14
|
-
_dependencies;
|
|
15
|
-
_devDependencies;
|
|
16
|
-
_scripts;
|
|
17
|
-
_version = "0.0.1";
|
|
18
|
-
_type = "module";
|
|
19
|
-
_rest = {};
|
|
20
|
-
constructor(name, options){
|
|
21
|
-
this.name = name;
|
|
22
|
-
const apiNames = options?.apiNames ?? [
|
|
23
|
-
DEFAULT_WEBAPI_NAME
|
|
24
|
-
];
|
|
25
|
-
const first = apiNames[0] ?? DEFAULT_WEBAPI_NAME;
|
|
26
|
-
const startEntry = options?.startEntry ?? webapiReleaseEntry(first);
|
|
27
|
-
const workspaceName = options?.workspaceName ?? stripApiSuffix(name);
|
|
28
|
-
const namedOrMany = apiNames.length > 1 || first !== DEFAULT_WEBAPI_NAME;
|
|
29
|
-
this._scripts = {
|
|
30
|
-
build: "forge build --configuration release",
|
|
31
|
-
"build:watch": "forge build --watch",
|
|
32
|
-
start: `node ${startEntry}`,
|
|
33
|
-
dev: namedOrMany ? fluxDevScript(workspaceName, first, webapiPort(0)) : "flux serve",
|
|
34
|
-
"lint:check": "biome check .",
|
|
35
|
-
typecheck: "tsc --noEmit",
|
|
36
|
-
test: "vitest run --passWithNoTests"
|
|
37
|
-
};
|
|
38
|
-
for (const [index, apiName] of apiNames.entries()){
|
|
39
|
-
this._scripts[`start:${apiName}`] = `node ${webapiReleaseEntry(apiName)}`;
|
|
40
|
-
this._scripts[`dev:${apiName}`] = fluxDevScript(workspaceName, apiName, webapiPort(index));
|
|
41
|
-
}
|
|
42
|
-
this._dependencies = {
|
|
43
|
-
"@decohere/cortex": CREATE_VERSION,
|
|
44
|
-
"@decohere/crucible": CREATE_VERSION,
|
|
45
|
-
"@decohere/nexus": CREATE_VERSION,
|
|
46
|
-
"@decohere/protocol": CREATE_VERSION,
|
|
47
|
-
"@decohere/scribe": CREATE_VERSION,
|
|
48
|
-
"@decohere/scribe-pino": CREATE_VERSION,
|
|
49
|
-
"pino-pretty": "^13.0.0"
|
|
50
|
-
};
|
|
51
|
-
this._devDependencies = {
|
|
52
|
-
"@decohere/terminal": CREATE_VERSION,
|
|
53
|
-
typescript: "^6.0.3",
|
|
54
|
-
"@biomejs/biome": "^2.0.0",
|
|
55
|
-
vitest: "^3.2.4"
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
/** Load an existing root package.json so `webapi add` can merge scripts/deps. */ static fromFile(filePath) {
|
|
59
|
-
const raw = JSON.parse(readFileSync(filePath, "utf8"));
|
|
60
|
-
const pkg = new PackageJson(typeof raw.name === "string" ? raw.name : "app", {
|
|
61
|
-
apiNames: []
|
|
62
|
-
});
|
|
63
|
-
pkg._version = typeof raw.version === "string" ? raw.version : "0.0.1";
|
|
64
|
-
pkg._type = typeof raw.type === "string" ? raw.type : "module";
|
|
65
|
-
pkg._scripts = {
|
|
66
|
-
...asStringMap(raw.scripts)
|
|
67
|
-
};
|
|
68
|
-
pkg._dependencies = {
|
|
69
|
-
...asStringMap(raw.dependencies)
|
|
70
|
-
};
|
|
71
|
-
pkg._devDependencies = {
|
|
72
|
-
...asStringMap(raw.devDependencies)
|
|
73
|
-
};
|
|
74
|
-
const reserved = new Set([
|
|
75
|
-
"name",
|
|
76
|
-
"version",
|
|
77
|
-
"type",
|
|
78
|
-
"scripts",
|
|
79
|
-
"dependencies",
|
|
80
|
-
"devDependencies"
|
|
81
|
-
]);
|
|
82
|
-
pkg._rest = Object.fromEntries(Object.entries(raw).filter(([key])=>!reserved.has(key)));
|
|
83
|
-
return pkg;
|
|
84
|
-
}
|
|
85
|
-
addDependency(name, version) {
|
|
86
|
-
this._dependencies[name] = version;
|
|
87
|
-
return this;
|
|
88
|
-
}
|
|
89
|
-
addDevDependency(name, version) {
|
|
90
|
-
this._devDependencies[name] = version;
|
|
91
|
-
return this;
|
|
92
|
-
}
|
|
93
|
-
addScript(name, command) {
|
|
94
|
-
this._scripts[name] = command;
|
|
95
|
-
return this;
|
|
96
|
-
}
|
|
97
|
-
files() {
|
|
98
|
-
return [
|
|
99
|
-
{
|
|
100
|
-
filePath: "package.json",
|
|
101
|
-
content: JSON.stringify({
|
|
102
|
-
name: this.name,
|
|
103
|
-
version: this._version,
|
|
104
|
-
type: this._type,
|
|
105
|
-
...this._rest,
|
|
106
|
-
scripts: this._scripts,
|
|
107
|
-
dependencies: this._dependencies,
|
|
108
|
-
devDependencies: this._devDependencies
|
|
109
|
-
}, null, 2)
|
|
110
|
-
}
|
|
111
|
-
];
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
function stripApiSuffix(name) {
|
|
115
|
-
return name.endsWith(".api") ? name.slice(0, -".api".length) : name;
|
|
116
|
-
}
|
|
117
|
-
function asStringMap(value) {
|
|
118
|
-
if (value == null || typeof value !== "object") return {};
|
|
119
|
-
const result = {};
|
|
120
|
-
for (const [key, entry] of Object.entries(value)){
|
|
121
|
-
if (typeof entry === "string") result[key] = entry;
|
|
122
|
-
}
|
|
123
|
-
return result;
|
|
124
|
-
}
|
|
125
|
-
function fluxDevScript(workspaceName, apiName, port) {
|
|
126
|
-
return `PORT=${port} flux serve --project ${webapiPackageName(workspaceName, apiName)}`;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL3BhY2thZ2UtanNvbi5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgQ1JFQVRFX1ZFUlNJT04gfSBmcm9tIFwiLi4vdmVyc2lvbi5qc1wiO1xuaW1wb3J0IHtcblx0REVGQVVMVF9XRUJBUElfTkFNRSxcblx0d2ViYXBpUGFja2FnZU5hbWUsXG5cdHdlYmFwaVBvcnQsXG5cdHdlYmFwaVJlbGVhc2VFbnRyeSxcbn0gZnJvbSBcIi4uL3dlYmFwaS9jb25zdC5qc1wiO1xuaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi9zb3VyY2UtZmlsZS5qc1wiO1xuXG5leHBvcnQgdHlwZSBQYWNrYWdlSnNvbk9wdGlvbnMgPSB7XG5cdHN0YXJ0RW50cnk/OiBzdHJpbmc7XG5cdC8qKiBBUEkgc2x1Z3MgaW4gdGhpcyB3b3Jrc3BhY2UuIERyaXZlcyBgc3RhcnQ6PG5hbWU+YCAvIGBkZXY6PG5hbWU+YC4gKi9cblx0YXBpTmFtZXM/OiByZWFkb25seSBzdHJpbmdbXTtcblx0LyoqIEhvc3Qgd29ya3NwYWNlIG5hbWUgdXNlZCBpbiBgQDx3b3Jrc3BhY2U+LzxhcGk+YCBmb3IgZmx1eCBgLS1wcm9qZWN0YC4gKi9cblx0d29ya3NwYWNlTmFtZT86IHN0cmluZztcbn07XG5cbi8qKlxuICogQnVpbGRlciBmb3IgdGhlIHJvb3QgYHBhY2thZ2UuanNvbmAuXG4gKlxuICogU3RhcnRzIHdpdGggdGhlIGNvcmUgQVBJIGRlcGVuZGVuY2llcy4gRmVhdHVyZXMgY2FsbCBgYWRkRGVwZW5kZW5jeWAgL1xuICogYGFkZERldkRlcGVuZGVuY3lgIGR1cmluZyB0aGVpciBzY2FmZm9sZCBwaGFzZSB0byBpbmplY3QgdGhlaXIgb3duIGRlcHNcbiAqIGJlZm9yZSBgZmlsZXMoKWAgaXMgY2FsbGVkIGF0IHJlbmRlciB0aW1lLlxuICovXG5leHBvcnQgY2xhc3MgUGFja2FnZUpzb24gaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuUEFDS0FHRV9KU09OO1xuXG5cdHByaXZhdGUgX2RlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblx0cHJpdmF0ZSBfZGV2RGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXHRwcml2YXRlIF9zY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXHRwcml2YXRlIF92ZXJzaW9uID0gXCIwLjAuMVwiO1xuXHRwcml2YXRlIF90eXBlID0gXCJtb2R1bGVcIjtcblx0cHJpdmF0ZSBfcmVzdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoXG5cdFx0cHJpdmF0ZSByZWFkb25seSBuYW1lOiBzdHJpbmcsXG5cdFx0b3B0aW9ucz86IFBhY2thZ2VKc29uT3B0aW9ucyxcblx0KSB7XG5cdFx0Y29uc3QgYXBpTmFtZXMgPSBvcHRpb25zPy5hcGlOYW1lcyA/PyBbREVGQVVMVF9XRUJBUElfTkFNRV07XG5cdFx0Y29uc3QgZmlyc3QgPSBhcGlOYW1lc1swXSA/PyBERUZBVUxUX1dFQkFQSV9OQU1FO1xuXHRcdGNvbnN0IHN0YXJ0RW50cnkgPSBvcHRpb25zPy5zdGFydEVudHJ5ID8/IHdlYmFwaVJlbGVhc2VFbnRyeShmaXJzdCk7XG5cdFx0Y29uc3Qgd29ya3NwYWNlTmFtZSA9IG9wdGlvbnM/LndvcmtzcGFjZU5hbWUgPz8gc3RyaXBBcGlTdWZmaXgobmFtZSk7XG5cdFx0Y29uc3QgbmFtZWRPck1hbnkgPSBhcGlOYW1lcy5sZW5ndGggPiAxIHx8IGZpcnN0ICE9PSBERUZBVUxUX1dFQkFQSV9OQU1FO1xuXG5cdFx0dGhpcy5fc2NyaXB0cyA9IHtcblx0XHRcdGJ1aWxkOiBcImZvcmdlIGJ1aWxkIC0tY29uZmlndXJhdGlvbiByZWxlYXNlXCIsXG5cdFx0XHRcImJ1aWxkOndhdGNoXCI6IFwiZm9yZ2UgYnVpbGQgLS13YXRjaFwiLFxuXHRcdFx0c3RhcnQ6IGBub2RlICR7c3RhcnRFbnRyeX1gLFxuXHRcdFx0ZGV2OiBuYW1lZE9yTWFueSA/IGZsdXhEZXZTY3JpcHQod29ya3NwYWNlTmFtZSwgZmlyc3QsIHdlYmFwaVBvcnQoMCkpIDogXCJmbHV4IHNlcnZlXCIsXG5cdFx0XHRcImxpbnQ6Y2hlY2tcIjogXCJiaW9tZSBjaGVjayAuXCIsXG5cdFx0XHR0eXBlY2hlY2s6IFwidHNjIC0tbm9FbWl0XCIsXG5cdFx0XHR0ZXN0OiBcInZpdGVzdCBydW4gLS1wYXNzV2l0aE5vVGVzdHNcIixcblx0XHR9O1xuXHRcdGZvciAoY29uc3QgW2luZGV4LCBhcGlOYW1lXSBvZiBhcGlOYW1lcy5lbnRyaWVzKCkpIHtcblx0XHRcdHRoaXMuX3NjcmlwdHNbYHN0YXJ0OiR7YXBpTmFtZX1gXSA9IGBub2RlICR7d2ViYXBpUmVsZWFzZUVudHJ5KGFwaU5hbWUpfWA7XG5cdFx0XHR0aGlzLl9zY3JpcHRzW2BkZXY6JHthcGlOYW1lfWBdID0gZmx1eERldlNjcmlwdChcblx0XHRcdFx0d29ya3NwYWNlTmFtZSxcblx0XHRcdFx0YXBpTmFtZSxcblx0XHRcdFx0d2ViYXBpUG9ydChpbmRleCksXG5cdFx0XHQpO1xuXHRcdH1cblx0XHR0aGlzLl9kZXBlbmRlbmNpZXMgPSB7XG5cdFx0XHRcIkBkZWNvaGVyZS9jb3J0ZXhcIjogQ1JFQVRFX1ZFUlNJT04sXG5cdFx0XHRcIkBkZWNvaGVyZS9jcnVjaWJsZVwiOiBDUkVBVEVfVkVSU0lPTixcblx0XHRcdFwiQGRlY29oZXJlL25leHVzXCI6IENSRUFURV9WRVJTSU9OLFxuXHRcdFx0XCJAZGVjb2hlcmUvcHJvdG9jb2xcIjogQ1JFQVRFX1ZFUlNJT04sXG5cdFx0XHRcIkBkZWNvaGVyZS9zY3JpYmVcIjogQ1JFQVRFX1ZFUlNJT04sXG5cdFx0XHRcIkBkZWNvaGVyZS9zY3JpYmUtcGlub1wiOiBDUkVBVEVfVkVSU0lPTixcblx0XHRcdFwicGluby1wcmV0dHlcIjogXCJeMTMuMC4wXCIsXG5cdFx0fTtcblx0XHR0aGlzLl9kZXZEZXBlbmRlbmNpZXMgPSB7XG5cdFx0XHRcIkBkZWNvaGVyZS90ZXJtaW5hbFwiOiBDUkVBVEVfVkVSU0lPTixcblx0XHRcdHR5cGVzY3JpcHQ6IFwiXjYuMC4zXCIsXG5cdFx0XHRcIkBiaW9tZWpzL2Jpb21lXCI6IFwiXjIuMC4wXCIsXG5cdFx0XHR2aXRlc3Q6IFwiXjMuMi40XCIsXG5cdFx0fTtcblx0fVxuXG5cdC8qKiBMb2FkIGFuIGV4aXN0aW5nIHJvb3QgcGFja2FnZS5qc29uIHNvIGB3ZWJhcGkgYWRkYCBjYW4gbWVyZ2Ugc2NyaXB0cy9kZXBzLiAqL1xuXHRwdWJsaWMgc3RhdGljIGZyb21GaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQYWNrYWdlSnNvbiB7XG5cdFx0Y29uc3QgcmF3ID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmOFwiKSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0Y29uc3QgcGtnID0gbmV3IFBhY2thZ2VKc29uKHR5cGVvZiByYXcubmFtZSA9PT0gXCJzdHJpbmdcIiA/IHJhdy5uYW1lIDogXCJhcHBcIiwge1xuXHRcdFx0YXBpTmFtZXM6IFtdLFxuXHRcdH0pO1xuXHRcdHBrZy5fdmVyc2lvbiA9IHR5cGVvZiByYXcudmVyc2lvbiA9PT0gXCJzdHJpbmdcIiA/IHJhdy52ZXJzaW9uIDogXCIwLjAuMVwiO1xuXHRcdHBrZy5fdHlwZSA9IHR5cGVvZiByYXcudHlwZSA9PT0gXCJzdHJpbmdcIiA/IHJhdy50eXBlIDogXCJtb2R1bGVcIjtcblx0XHRwa2cuX3NjcmlwdHMgPSB7IC4uLmFzU3RyaW5nTWFwKHJhdy5zY3JpcHRzKSB9O1xuXHRcdHBrZy5fZGVwZW5kZW5jaWVzID0geyAuLi5hc1N0cmluZ01hcChyYXcuZGVwZW5kZW5jaWVzKSB9O1xuXHRcdHBrZy5fZGV2RGVwZW5kZW5jaWVzID0geyAuLi5hc1N0cmluZ01hcChyYXcuZGV2RGVwZW5kZW5jaWVzKSB9O1xuXHRcdGNvbnN0IHJlc2VydmVkID0gbmV3IFNldChbXG5cdFx0XHRcIm5hbWVcIixcblx0XHRcdFwidmVyc2lvblwiLFxuXHRcdFx0XCJ0eXBlXCIsXG5cdFx0XHRcInNjcmlwdHNcIixcblx0XHRcdFwiZGVwZW5kZW5jaWVzXCIsXG5cdFx0XHRcImRldkRlcGVuZGVuY2llc1wiLFxuXHRcdF0pO1xuXHRcdHBrZy5fcmVzdCA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhyYXcpLmZpbHRlcigoW2tleV0pID0+ICFyZXNlcnZlZC5oYXMoa2V5KSkpO1xuXHRcdHJldHVybiBwa2c7XG5cdH1cblxuXHRwdWJsaWMgYWRkRGVwZW5kZW5jeShuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2RlcGVuZGVuY2llc1tuYW1lXSA9IHZlcnNpb247XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgYWRkRGV2RGVwZW5kZW5jeShuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2RldkRlcGVuZGVuY2llc1tuYW1lXSA9IHZlcnNpb247XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgYWRkU2NyaXB0KG5hbWU6IHN0cmluZywgY29tbWFuZDogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fc2NyaXB0c1tuYW1lXSA9IGNvbW1hbmQ7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCJwYWNrYWdlLmpzb25cIixcblx0XHRcdFx0Y29udGVudDogSlNPTi5zdHJpbmdpZnkoXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogdGhpcy5uYW1lLFxuXHRcdFx0XHRcdFx0dmVyc2lvbjogdGhpcy5fdmVyc2lvbixcblx0XHRcdFx0XHRcdHR5cGU6IHRoaXMuX3R5cGUsXG5cdFx0XHRcdFx0XHQuLi50aGlzLl9yZXN0LFxuXHRcdFx0XHRcdFx0c2NyaXB0czogdGhpcy5fc2NyaXB0cyxcblx0XHRcdFx0XHRcdGRlcGVuZGVuY2llczogdGhpcy5fZGVwZW5kZW5jaWVzLFxuXHRcdFx0XHRcdFx0ZGV2RGVwZW5kZW5jaWVzOiB0aGlzLl9kZXZEZXBlbmRlbmNpZXMsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdDIsXG5cdFx0XHRcdCksXG5cdFx0XHR9LFxuXHRcdF07XG5cdH1cbn1cblxuZnVuY3Rpb24gc3RyaXBBcGlTdWZmaXgobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIG5hbWUuZW5kc1dpdGgoXCIuYXBpXCIpID8gbmFtZS5zbGljZSgwLCAtXCIuYXBpXCIubGVuZ3RoKSA6IG5hbWU7XG59XG5cbmZ1bmN0aW9uIGFzU3RyaW5nTWFwKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG5cdGlmICh2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHt9O1xuXHRjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0Zm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG5cdFx0aWYgKHR5cGVvZiBlbnRyeSA9PT0gXCJzdHJpbmdcIikgcmVzdWx0W2tleV0gPSBlbnRyeTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmbHV4RGV2U2NyaXB0KHdvcmtzcGFjZU5hbWU6IHN0cmluZywgYXBpTmFtZTogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuXHRyZXR1cm4gYFBPUlQ9JHtwb3J0fSBmbHV4IHNlcnZlIC0tcHJvamVjdCAke3dlYmFwaVBhY2thZ2VOYW1lKHdvcmtzcGFjZU5hbWUsIGFwaU5hbWUpfWA7XG59XG4iXSwibmFtZXMiOlsicmVhZEZpbGVTeW5jIiwiQ1JFQVRFX1ZFUlNJT04iLCJERUZBVUxUX1dFQkFQSV9OQU1FIiwid2ViYXBpUGFja2FnZU5hbWUiLCJ3ZWJhcGlQb3J0Iiwid2ViYXBpUmVsZWFzZUVudHJ5IiwiV0VMTF9LTk9XTl9GSUxFUyIsIlBhY2thZ2VKc29uIiwia2V5IiwiUEFDS0FHRV9KU09OIiwiX2RlcGVuZGVuY2llcyIsIl9kZXZEZXBlbmRlbmNpZXMiLCJfc2NyaXB0cyIsIl92ZXJzaW9uIiwiX3R5cGUiLCJfcmVzdCIsIm5hbWUiLCJvcHRpb25zIiwiYXBpTmFtZXMiLCJmaXJzdCIsInN0YXJ0RW50cnkiLCJ3b3Jrc3BhY2VOYW1lIiwic3RyaXBBcGlTdWZmaXgiLCJuYW1lZE9yTWFueSIsImxlbmd0aCIsImJ1aWxkIiwic3RhcnQiLCJkZXYiLCJmbHV4RGV2U2NyaXB0IiwidHlwZWNoZWNrIiwidGVzdCIsImluZGV4IiwiYXBpTmFtZSIsImVudHJpZXMiLCJ0eXBlc2NyaXB0Iiwidml0ZXN0IiwiZnJvbUZpbGUiLCJmaWxlUGF0aCIsInJhdyIsIkpTT04iLCJwYXJzZSIsInBrZyIsInZlcnNpb24iLCJ0eXBlIiwiYXNTdHJpbmdNYXAiLCJzY3JpcHRzIiwiZGVwZW5kZW5jaWVzIiwiZGV2RGVwZW5kZW5jaWVzIiwicmVzZXJ2ZWQiLCJTZXQiLCJPYmplY3QiLCJmcm9tRW50cmllcyIsImZpbHRlciIsImhhcyIsImFkZERlcGVuZGVuY3kiLCJhZGREZXZEZXBlbmRlbmN5IiwiYWRkU2NyaXB0IiwiY29tbWFuZCIsImZpbGVzIiwiY29udGVudCIsInN0cmluZ2lmeSIsImVuZHNXaXRoIiwic2xpY2UiLCJ2YWx1ZSIsInJlc3VsdCIsImVudHJ5IiwicG9ydCJd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
|