@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,202 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
function _export(target, all) {
|
|
6
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
-
enumerable: true,
|
|
8
|
-
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
-
});
|
|
10
|
-
}
|
|
11
|
-
_export(exports, {
|
|
12
|
-
get applyPostmanAuthOverlay () {
|
|
13
|
-
return applyPostmanAuthOverlay;
|
|
14
|
-
},
|
|
15
|
-
get openApiPathParamsToColon () {
|
|
16
|
-
return openApiPathParamsToColon;
|
|
17
|
-
},
|
|
18
|
-
get openApiToPostmanCollection () {
|
|
19
|
-
return openApiToPostmanCollection;
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
const _openapitopostmanv2 = /*#__PURE__*/ _interop_require_default(require("openapi-to-postmanv2"));
|
|
23
|
-
function _interop_require_default(obj) {
|
|
24
|
-
return obj && obj.__esModule ? obj : {
|
|
25
|
-
default: obj
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
function convertAsync(data, options) {
|
|
29
|
-
return new Promise((resolve, reject)=>{
|
|
30
|
-
_openapitopostmanv2.default.convert({
|
|
31
|
-
type: "json",
|
|
32
|
-
data
|
|
33
|
-
}, options, (err, result)=>{
|
|
34
|
-
if (err) {
|
|
35
|
-
reject(err);
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
resolve(result);
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
async function openApiToPostmanCollection(document) {
|
|
43
|
-
const result = await convertAsync(document, {
|
|
44
|
-
folderStrategy: "Tags",
|
|
45
|
-
requestNameSource: "Fallback",
|
|
46
|
-
includeAuthInfoInExample: false
|
|
47
|
-
});
|
|
48
|
-
if (!result.result || result.output?.[0]?.data == null) {
|
|
49
|
-
throw new Error(result.reason ?? "openapi-to-postmanv2 conversion failed");
|
|
50
|
-
}
|
|
51
|
-
return result.output[0].data;
|
|
52
|
-
}
|
|
53
|
-
function applyPostmanAuthOverlay(collection, projectName, auth, options) {
|
|
54
|
-
const next = {
|
|
55
|
-
...collection,
|
|
56
|
-
info: {
|
|
57
|
-
...collection.info,
|
|
58
|
-
name: `${projectName} WebAPI`,
|
|
59
|
-
description: options.description,
|
|
60
|
-
schema: collection.info.schema ?? "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
if (auth?.auth0Domain) {
|
|
64
|
-
next.auth = {
|
|
65
|
-
type: "oauth2",
|
|
66
|
-
oauth2: [
|
|
67
|
-
{
|
|
68
|
-
key: "grant_type",
|
|
69
|
-
value: "authorization_code_with_pkce",
|
|
70
|
-
type: "string"
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
key: "authUrl",
|
|
74
|
-
value: "https://{{auth0Domain}}/authorize?audience={{auth0Audience}}",
|
|
75
|
-
type: "string"
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
key: "accessTokenUrl",
|
|
79
|
-
value: "https://{{auth0Domain}}/oauth/token",
|
|
80
|
-
type: "string"
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
key: "clientId",
|
|
84
|
-
value: "{{auth0ClientId}}",
|
|
85
|
-
type: "string"
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
key: "scope",
|
|
89
|
-
value: options.scopes,
|
|
90
|
-
type: "string"
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
key: "redirect_uri",
|
|
94
|
-
value: options.callbacks[0],
|
|
95
|
-
type: "string"
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
key: "useBrowser",
|
|
99
|
-
value: "true",
|
|
100
|
-
type: "boolean"
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
key: "addTokenTo",
|
|
104
|
-
value: "header",
|
|
105
|
-
type: "string"
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
key: "challengeAlgorithm",
|
|
109
|
-
value: "S256",
|
|
110
|
-
type: "string"
|
|
111
|
-
},
|
|
112
|
-
{
|
|
113
|
-
key: "client_authentication",
|
|
114
|
-
value: "body",
|
|
115
|
-
type: "string"
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
key: "clientSecret",
|
|
119
|
-
value: "",
|
|
120
|
-
type: "string"
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
key: "tokenName",
|
|
124
|
-
value: `${projectName} Access Token`,
|
|
125
|
-
type: "string"
|
|
126
|
-
}
|
|
127
|
-
]
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
next.item = rewriteCollectionItems(collection.item ?? [], {
|
|
131
|
-
markListAnonymous: true
|
|
132
|
-
});
|
|
133
|
-
return next;
|
|
134
|
-
}
|
|
135
|
-
function rewriteCollectionItems(items, opts) {
|
|
136
|
-
return items.map((item)=>{
|
|
137
|
-
if (item.item != null) {
|
|
138
|
-
return {
|
|
139
|
-
...item,
|
|
140
|
-
item: rewriteCollectionItems(item.item, opts)
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
const request = item.request;
|
|
144
|
-
if (request == null) {
|
|
145
|
-
return item;
|
|
146
|
-
}
|
|
147
|
-
const method = (request.method ?? "GET").toUpperCase();
|
|
148
|
-
const rawUrl = requestUrlRaw(request);
|
|
149
|
-
const nextRequest = {
|
|
150
|
-
...request,
|
|
151
|
-
url: toPostmanUrl(rawUrl)
|
|
152
|
-
};
|
|
153
|
-
// List Hello stays anonymous (matches scaffold AllowAnonymous on GET /hello).
|
|
154
|
-
if (opts.markListAnonymous && method === "GET" && normalizePath(rawUrl) === "/hello" && !rawUrl.includes("/:")) {
|
|
155
|
-
nextRequest.auth = {
|
|
156
|
-
type: "noauth"
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
return {
|
|
160
|
-
...item,
|
|
161
|
-
request: nextRequest
|
|
162
|
-
};
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
function requestUrlRaw(request) {
|
|
166
|
-
const url = request.url;
|
|
167
|
-
if (typeof url === "string") {
|
|
168
|
-
return url;
|
|
169
|
-
}
|
|
170
|
-
if (url?.raw) {
|
|
171
|
-
return url.raw;
|
|
172
|
-
}
|
|
173
|
-
const host = url?.host?.[0] ?? "{{baseUrl}}";
|
|
174
|
-
const path = (url?.path ?? []).join("/");
|
|
175
|
-
return path ? `${host}/${path}` : host;
|
|
176
|
-
}
|
|
177
|
-
function openApiPathParamsToColon(url) {
|
|
178
|
-
return url.replace(/(?<!\{)\{([A-Za-z_][\w]*)\}(?!\})/g, ":$1");
|
|
179
|
-
}
|
|
180
|
-
function normalizePath(rawUrl) {
|
|
181
|
-
const withoutBase = rawUrl.replace(/\{\{baseUrl\}\}/g, "").split("?")[0] ?? "";
|
|
182
|
-
const withSlash = withoutBase.startsWith("/") ? withoutBase : `/${withoutBase}`;
|
|
183
|
-
return openApiPathParamsToColon(withSlash);
|
|
184
|
-
}
|
|
185
|
-
/** Prefer Postman template URL shape used by existing Local View / API uploads. */ function toPostmanUrl(rawUrl) {
|
|
186
|
-
let pathPart = rawUrl.replace(/\{\{baseUrl\}\}/g, "");
|
|
187
|
-
if (!pathPart.startsWith("/")) {
|
|
188
|
-
pathPart = `/${pathPart}`;
|
|
189
|
-
}
|
|
190
|
-
// openapi-to-postman uses {id}; Local View / prior collections use :id
|
|
191
|
-
pathPart = openApiPathParamsToColon(pathPart);
|
|
192
|
-
const segments = pathPart.split("/").filter(Boolean);
|
|
193
|
-
return {
|
|
194
|
-
raw: `{{baseUrl}}${pathPart}`,
|
|
195
|
-
host: [
|
|
196
|
-
"{{baseUrl}}"
|
|
197
|
-
],
|
|
198
|
-
path: segments
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL3Bvc3RtYW4vb3BlbmFwaS10by1wb3N0bWFuLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjb252ZXJ0ZXIgZnJvbSBcIm9wZW5hcGktdG8tcG9zdG1hbnYyXCI7XG5pbXBvcnQgdHlwZSB7IFNjYWZmb2xkT3BlbkFwaURvY3VtZW50IH0gZnJvbSBcIi4vaGVsbG8tb3BlbmFwaS5qc1wiO1xuXG5leHBvcnQgdHlwZSBQb3N0bWFuQ29sbGVjdGlvbiA9IHtcblx0aW5mbzoge1xuXHRcdF9wb3N0bWFuX2lkPzogc3RyaW5nO1xuXHRcdG5hbWU6IHN0cmluZztcblx0XHRzY2hlbWE6IHN0cmluZztcblx0XHRkZXNjcmlwdGlvbj86IHN0cmluZztcblx0fTtcblx0YXV0aD86IHVua25vd247XG5cdGl0ZW0/OiBQb3N0bWFuSXRlbVtdO1xuXHR2YXJpYWJsZT86IEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT47XG5cdFtrZXk6IHN0cmluZ106IHVua25vd247XG59O1xuXG5leHBvcnQgdHlwZSBQb3N0bWFuSXRlbSA9IHtcblx0bmFtZT86IHN0cmluZztcblx0aXRlbT86IFBvc3RtYW5JdGVtW107XG5cdHJlcXVlc3Q/OiBQb3N0bWFuUmVxdWVzdDtcblx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcbn07XG5cbmV4cG9ydCB0eXBlIFBvc3RtYW5SZXF1ZXN0ID0ge1xuXHRtZXRob2Q/OiBzdHJpbmc7XG5cdGhlYWRlcj86IEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT47XG5cdGJvZHk/OiB7IG1vZGU/OiBzdHJpbmc7IHJhdz86IHN0cmluZyB9O1xuXHR1cmw/OiBzdHJpbmcgfCB7IHJhdz86IHN0cmluZzsgaG9zdD86IHN0cmluZ1tdOyBwYXRoPzogc3RyaW5nW107IHZhcmlhYmxlPzogdW5rbm93bltdIH07XG5cdGF1dGg/OiB7IHR5cGU6IHN0cmluZzsgW2tleTogc3RyaW5nXTogdW5rbm93biB9O1xuXHRba2V5OiBzdHJpbmddOiB1bmtub3duO1xufTtcblxuZXhwb3J0IHR5cGUgQXV0aDBFbnYgPSB7XG5cdGF1dGgwRG9tYWluPzogc3RyaW5nO1xuXHRhdXRoMEF1ZGllbmNlPzogc3RyaW5nO1xuXHRhdXRoMENsaWVudElkPzogc3RyaW5nO1xufTtcblxudHlwZSBDb252ZXJ0UmVzdWx0ID0ge1xuXHRyZXN1bHQ6IGJvb2xlYW47XG5cdHJlYXNvbj86IHN0cmluZztcblx0b3V0cHV0PzogQXJyYXk8eyB0eXBlOiBzdHJpbmc7IGRhdGE6IFBvc3RtYW5Db2xsZWN0aW9uIH0+O1xufTtcblxuZnVuY3Rpb24gY29udmVydEFzeW5jKFxuXHRkYXRhOiBTY2FmZm9sZE9wZW5BcGlEb2N1bWVudCxcblx0b3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiBQcm9taXNlPENvbnZlcnRSZXN1bHQ+IHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb252ZXJ0ZXIuY29udmVydChcblx0XHRcdHsgdHlwZTogXCJqc29uXCIsIGRhdGEgfSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHQoZXJyOiBFcnJvciB8IG51bGwsIHJlc3VsdDogQ29udmVydFJlc3VsdCkgPT4ge1xuXHRcdFx0XHRpZiAoZXJyKSB7XG5cdFx0XHRcdFx0cmVqZWN0KGVycik7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJlc29sdmUocmVzdWx0KTtcblx0XHRcdH0sXG5cdFx0KTtcblx0fSk7XG59XG5cbi8qKiBDb252ZXJ0IGFuIE9wZW5BUEkgZG9jdW1lbnQgdG8gYSBQb3N0bWFuIENvbGxlY3Rpb24gdjIuMSB2aWEgb3BlbmFwaS10by1wb3N0bWFudjIuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3BlbkFwaVRvUG9zdG1hbkNvbGxlY3Rpb24oXG5cdGRvY3VtZW50OiBTY2FmZm9sZE9wZW5BcGlEb2N1bWVudCxcbik6IFByb21pc2U8UG9zdG1hbkNvbGxlY3Rpb24+IHtcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgY29udmVydEFzeW5jKGRvY3VtZW50LCB7XG5cdFx0Zm9sZGVyU3RyYXRlZ3k6IFwiVGFnc1wiLFxuXHRcdHJlcXVlc3ROYW1lU291cmNlOiBcIkZhbGxiYWNrXCIsXG5cdFx0aW5jbHVkZUF1dGhJbmZvSW5FeGFtcGxlOiBmYWxzZSxcblx0fSk7XG5cdGlmICghcmVzdWx0LnJlc3VsdCB8fCByZXN1bHQub3V0cHV0Py5bMF0/LmRhdGEgPT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihyZXN1bHQucmVhc29uID8/IFwib3BlbmFwaS10by1wb3N0bWFudjIgY29udmVyc2lvbiBmYWlsZWRcIik7XG5cdH1cblx0cmV0dXJuIHJlc3VsdC5vdXRwdXRbMF0uZGF0YTtcbn1cblxuLyoqXG4gKiBPdmVybGF5IEF1dGgwIE9BdXRoMiAoUEtDRSkgY29sbGVjdGlvbiBhdXRoIGFuZCBmaXggTG9jYWwgVmlldy1mcmllbmRseSBVUkxzLlxuICogUm91dGUgaXRlbXMgY29tZSBmcm9tIE9wZW5BUEk7IGF1dGgvZW52IHJlbWFpbiBoYW5kLWF1dGhvcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQb3N0bWFuQXV0aE92ZXJsYXkoXG5cdGNvbGxlY3Rpb246IFBvc3RtYW5Db2xsZWN0aW9uLFxuXHRwcm9qZWN0TmFtZTogc3RyaW5nLFxuXHRhdXRoOiBBdXRoMEVudiB8IHVuZGVmaW5lZCxcblx0b3B0aW9uczoge1xuXHRcdGNhbGxiYWNrczogcmVhZG9ubHkgc3RyaW5nW107XG5cdFx0c2NvcGVzOiBzdHJpbmc7XG5cdFx0ZGVzY3JpcHRpb246IHN0cmluZztcblx0fSxcbik6IFBvc3RtYW5Db2xsZWN0aW9uIHtcblx0Y29uc3QgbmV4dDogUG9zdG1hbkNvbGxlY3Rpb24gPSB7XG5cdFx0Li4uY29sbGVjdGlvbixcblx0XHRpbmZvOiB7XG5cdFx0XHQuLi5jb2xsZWN0aW9uLmluZm8sXG5cdFx0XHRuYW1lOiBgJHtwcm9qZWN0TmFtZX0gV2ViQVBJYCxcblx0XHRcdGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuXHRcdFx0c2NoZW1hOlxuXHRcdFx0XHRjb2xsZWN0aW9uLmluZm8uc2NoZW1hID8/XG5cdFx0XHRcdFwiaHR0cHM6Ly9zY2hlbWEuZ2V0cG9zdG1hbi5jb20vanNvbi9jb2xsZWN0aW9uL3YyLjEuMC9jb2xsZWN0aW9uLmpzb25cIixcblx0XHR9LFxuXHR9O1xuXG5cdGlmIChhdXRoPy5hdXRoMERvbWFpbikge1xuXHRcdG5leHQuYXV0aCA9IHtcblx0XHRcdHR5cGU6IFwib2F1dGgyXCIsXG5cdFx0XHRvYXV0aDI6IFtcblx0XHRcdFx0eyBrZXk6IFwiZ3JhbnRfdHlwZVwiLCB2YWx1ZTogXCJhdXRob3JpemF0aW9uX2NvZGVfd2l0aF9wa2NlXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGtleTogXCJhdXRoVXJsXCIsXG5cdFx0XHRcdFx0dmFsdWU6IFwiaHR0cHM6Ly97e2F1dGgwRG9tYWlufX0vYXV0aG9yaXplP2F1ZGllbmNlPXt7YXV0aDBBdWRpZW5jZX19XCIsXG5cdFx0XHRcdFx0dHlwZTogXCJzdHJpbmdcIixcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGtleTogXCJhY2Nlc3NUb2tlblVybFwiLFxuXHRcdFx0XHRcdHZhbHVlOiBcImh0dHBzOi8ve3thdXRoMERvbWFpbn19L29hdXRoL3Rva2VuXCIsXG5cdFx0XHRcdFx0dHlwZTogXCJzdHJpbmdcIixcblx0XHRcdFx0fSxcblx0XHRcdFx0eyBrZXk6IFwiY2xpZW50SWRcIiwgdmFsdWU6IFwie3thdXRoMENsaWVudElkfX1cIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHR7IGtleTogXCJzY29wZVwiLCB2YWx1ZTogb3B0aW9ucy5zY29wZXMsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0eyBrZXk6IFwicmVkaXJlY3RfdXJpXCIsIHZhbHVlOiBvcHRpb25zLmNhbGxiYWNrc1swXSwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHR7IGtleTogXCJ1c2VCcm93c2VyXCIsIHZhbHVlOiBcInRydWVcIiwgdHlwZTogXCJib29sZWFuXCIgfSxcblx0XHRcdFx0eyBrZXk6IFwiYWRkVG9rZW5Ub1wiLCB2YWx1ZTogXCJoZWFkZXJcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHR7IGtleTogXCJjaGFsbGVuZ2VBbGdvcml0aG1cIiwgdmFsdWU6IFwiUzI1NlwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG5cdFx0XHRcdHsga2V5OiBcImNsaWVudF9hdXRoZW50aWNhdGlvblwiLCB2YWx1ZTogXCJib2R5XCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0eyBrZXk6IFwiY2xpZW50U2VjcmV0XCIsIHZhbHVlOiBcIlwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG5cdFx0XHRcdHsga2V5OiBcInRva2VuTmFtZVwiLCB2YWx1ZTogYCR7cHJvamVjdE5hbWV9IEFjY2VzcyBUb2tlbmAsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdF0sXG5cdFx0fTtcblx0fVxuXG5cdG5leHQuaXRlbSA9IHJld3JpdGVDb2xsZWN0aW9uSXRlbXMoY29sbGVjdGlvbi5pdGVtID8/IFtdLCB7XG5cdFx0bWFya0xpc3RBbm9ueW1vdXM6IHRydWUsXG5cdH0pO1xuXHRyZXR1cm4gbmV4dDtcbn1cblxuZnVuY3Rpb24gcmV3cml0ZUNvbGxlY3Rpb25JdGVtcyhcblx0aXRlbXM6IFBvc3RtYW5JdGVtW10sXG5cdG9wdHM6IHsgbWFya0xpc3RBbm9ueW1vdXM6IGJvb2xlYW4gfSxcbik6IFBvc3RtYW5JdGVtW10ge1xuXHRyZXR1cm4gaXRlbXMubWFwKChpdGVtKSA9PiB7XG5cdFx0aWYgKGl0ZW0uaXRlbSAhPSBudWxsKSB7XG5cdFx0XHRyZXR1cm4geyAuLi5pdGVtLCBpdGVtOiByZXdyaXRlQ29sbGVjdGlvbkl0ZW1zKGl0ZW0uaXRlbSwgb3B0cykgfTtcblx0XHR9XG5cdFx0Y29uc3QgcmVxdWVzdCA9IGl0ZW0ucmVxdWVzdDtcblx0XHRpZiAocmVxdWVzdCA9PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gaXRlbTtcblx0XHR9XG5cdFx0Y29uc3QgbWV0aG9kID0gKHJlcXVlc3QubWV0aG9kID8/IFwiR0VUXCIpLnRvVXBwZXJDYXNlKCk7XG5cdFx0Y29uc3QgcmF3VXJsID0gcmVxdWVzdFVybFJhdyhyZXF1ZXN0KTtcblx0XHRjb25zdCBuZXh0UmVxdWVzdDogUG9zdG1hblJlcXVlc3QgPSB7XG5cdFx0XHQuLi5yZXF1ZXN0LFxuXHRcdFx0dXJsOiB0b1Bvc3RtYW5VcmwocmF3VXJsKSxcblx0XHR9O1xuXHRcdC8vIExpc3QgSGVsbG8gc3RheXMgYW5vbnltb3VzIChtYXRjaGVzIHNjYWZmb2xkIEFsbG93QW5vbnltb3VzIG9uIEdFVCAvaGVsbG8pLlxuXHRcdGlmIChcblx0XHRcdG9wdHMubWFya0xpc3RBbm9ueW1vdXMgJiZcblx0XHRcdG1ldGhvZCA9PT0gXCJHRVRcIiAmJlxuXHRcdFx0bm9ybWFsaXplUGF0aChyYXdVcmwpID09PSBcIi9oZWxsb1wiICYmXG5cdFx0XHQhcmF3VXJsLmluY2x1ZGVzKFwiLzpcIilcblx0XHQpIHtcblx0XHRcdG5leHRSZXF1ZXN0LmF1dGggPSB7IHR5cGU6IFwibm9hdXRoXCIgfTtcblx0XHR9XG5cdFx0cmV0dXJuIHsgLi4uaXRlbSwgcmVxdWVzdDogbmV4dFJlcXVlc3QgfTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RVcmxSYXcocmVxdWVzdDogUG9zdG1hblJlcXVlc3QpOiBzdHJpbmcge1xuXHRjb25zdCB1cmwgPSByZXF1ZXN0LnVybDtcblx0aWYgKHR5cGVvZiB1cmwgPT09IFwic3RyaW5nXCIpIHtcblx0XHRyZXR1cm4gdXJsO1xuXHR9XG5cdGlmICh1cmw/LnJhdykge1xuXHRcdHJldHVybiB1cmwucmF3O1xuXHR9XG5cdGNvbnN0IGhvc3QgPSB1cmw/Lmhvc3Q/LlswXSA/PyBcInt7YmFzZVVybH19XCI7XG5cdGNvbnN0IHBhdGggPSAodXJsPy5wYXRoID8/IFtdKS5qb2luKFwiL1wiKTtcblx0cmV0dXJuIHBhdGggPyBgJHtob3N0fS8ke3BhdGh9YCA6IGhvc3Q7XG59XG5cbi8qKiBPcGVuQVBJIGB7aWR9YCDihpIgUG9zdG1hbiBgOmlkYCwgd2l0aG91dCB0b3VjaGluZyBge3t2YXJpYWJsZXN9fWAuICovXG5leHBvcnQgZnVuY3Rpb24gb3BlbkFwaVBhdGhQYXJhbXNUb0NvbG9uKHVybDogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHVybC5yZXBsYWNlKC8oPzwhXFx7KVxceyhbQS1aYS16X11bXFx3XSopXFx9KD8hXFx9KS9nLCBcIjokMVwiKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGF0aChyYXdVcmw6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IHdpdGhvdXRCYXNlID0gcmF3VXJsLnJlcGxhY2UoL1xce1xce2Jhc2VVcmxcXH1cXH0vZywgXCJcIikuc3BsaXQoXCI/XCIpWzBdID8/IFwiXCI7XG5cdGNvbnN0IHdpdGhTbGFzaCA9IHdpdGhvdXRCYXNlLnN0YXJ0c1dpdGgoXCIvXCIpID8gd2l0aG91dEJhc2UgOiBgLyR7d2l0aG91dEJhc2V9YDtcblx0cmV0dXJuIG9wZW5BcGlQYXRoUGFyYW1zVG9Db2xvbih3aXRoU2xhc2gpO1xufVxuXG4vKiogUHJlZmVyIFBvc3RtYW4gdGVtcGxhdGUgVVJMIHNoYXBlIHVzZWQgYnkgZXhpc3RpbmcgTG9jYWwgVmlldyAvIEFQSSB1cGxvYWRzLiAqL1xuZnVuY3Rpb24gdG9Qb3N0bWFuVXJsKHJhd1VybDogc3RyaW5nKTogUG9zdG1hblJlcXVlc3RbXCJ1cmxcIl0ge1xuXHRsZXQgcGF0aFBhcnQgPSByYXdVcmwucmVwbGFjZSgvXFx7XFx7YmFzZVVybFxcfVxcfS9nLCBcIlwiKTtcblx0aWYgKCFwYXRoUGFydC5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdHBhdGhQYXJ0ID0gYC8ke3BhdGhQYXJ0fWA7XG5cdH1cblx0Ly8gb3BlbmFwaS10by1wb3N0bWFuIHVzZXMge2lkfTsgTG9jYWwgVmlldyAvIHByaW9yIGNvbGxlY3Rpb25zIHVzZSA6aWRcblx0cGF0aFBhcnQgPSBvcGVuQXBpUGF0aFBhcmFtc1RvQ29sb24ocGF0aFBhcnQpO1xuXHRjb25zdCBzZWdtZW50cyA9IHBhdGhQYXJ0LnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG5cdHJldHVybiB7XG5cdFx0cmF3OiBge3tiYXNlVXJsfX0ke3BhdGhQYXJ0fWAsXG5cdFx0aG9zdDogW1wie3tiYXNlVXJsfX1cIl0sXG5cdFx0cGF0aDogc2VnbWVudHMsXG5cdH07XG59XG4iXSwibmFtZXMiOlsiYXBwbHlQb3N0bWFuQXV0aE92ZXJsYXkiLCJvcGVuQXBpUGF0aFBhcmFtc1RvQ29sb24iLCJvcGVuQXBpVG9Qb3N0bWFuQ29sbGVjdGlvbiIsImNvbnZlcnRBc3luYyIsImRhdGEiLCJvcHRpb25zIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJjb252ZXJ0ZXIiLCJjb252ZXJ0IiwidHlwZSIsImVyciIsInJlc3VsdCIsImRvY3VtZW50IiwiZm9sZGVyU3RyYXRlZ3kiLCJyZXF1ZXN0TmFtZVNvdXJjZSIsImluY2x1ZGVBdXRoSW5mb0luRXhhbXBsZSIsIm91dHB1dCIsIkVycm9yIiwicmVhc29uIiwiY29sbGVjdGlvbiIsInByb2plY3ROYW1lIiwiYXV0aCIsIm5leHQiLCJpbmZvIiwibmFtZSIsImRlc2NyaXB0aW9uIiwic2NoZW1hIiwiYXV0aDBEb21haW4iLCJvYXV0aDIiLCJrZXkiLCJ2YWx1ZSIsInNjb3BlcyIsImNhbGxiYWNrcyIsIml0ZW0iLCJyZXdyaXRlQ29sbGVjdGlvbkl0ZW1zIiwibWFya0xpc3RBbm9ueW1vdXMiLCJpdGVtcyIsIm9wdHMiLCJtYXAiLCJyZXF1ZXN0IiwibWV0aG9kIiwidG9VcHBlckNhc2UiLCJyYXdVcmwiLCJyZXF1ZXN0VXJsUmF3IiwibmV4dFJlcXVlc3QiLCJ1cmwiLCJ0b1Bvc3RtYW5VcmwiLCJub3JtYWxpemVQYXRoIiwiaW5jbHVkZXMiLCJyYXciLCJob3N0IiwicGF0aCIsImpvaW4iLCJyZXBsYWNlIiwid2l0aG91dEJhc2UiLCJzcGxpdCIsIndpdGhTbGFzaCIsInN0YXJ0c1dpdGgiLCJwYXRoUGFydCIsInNlZ21lbnRzIiwiZmlsdGVyIiwiQm9vbGVhbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7UUFrRmdCQTtlQUFBQTs7UUFxR0FDO2VBQUFBOztRQXZITUM7ZUFBQUE7OzsyRUFoRUE7Ozs7OztBQTRDdEIsU0FBU0MsYUFDUkMsSUFBNkIsRUFDN0JDLE9BQWdDO0lBRWhDLE9BQU8sSUFBSUMsUUFBUSxDQUFDQyxTQUFTQztRQUM1QkMsMkJBQVMsQ0FBQ0MsT0FBTyxDQUNoQjtZQUFFQyxNQUFNO1lBQVFQO1FBQUssR0FDckJDLFNBQ0EsQ0FBQ08sS0FBbUJDO1lBQ25CLElBQUlELEtBQUs7Z0JBQ1JKLE9BQU9JO2dCQUNQO1lBQ0Q7WUFDQUwsUUFBUU07UUFDVDtJQUVGO0FBQ0Q7QUFHTyxlQUFlWCwyQkFDckJZLFFBQWlDO0lBRWpDLE1BQU1ELFNBQVMsTUFBTVYsYUFBYVcsVUFBVTtRQUMzQ0MsZ0JBQWdCO1FBQ2hCQyxtQkFBbUI7UUFDbkJDLDBCQUEwQjtJQUMzQjtJQUNBLElBQUksQ0FBQ0osT0FBT0EsTUFBTSxJQUFJQSxPQUFPSyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUVkLFFBQVEsTUFBTTtRQUN2RCxNQUFNLElBQUllLE1BQU1OLE9BQU9PLE1BQU0sSUFBSTtJQUNsQztJQUNBLE9BQU9QLE9BQU9LLE1BQU0sQ0FBQyxFQUFFLENBQUNkLElBQUk7QUFDN0I7QUFNTyxTQUFTSix3QkFDZnFCLFVBQTZCLEVBQzdCQyxXQUFtQixFQUNuQkMsSUFBMEIsRUFDMUJsQixPQUlDO0lBRUQsTUFBTW1CLE9BQTBCO1FBQy9CLEdBQUdILFVBQVU7UUFDYkksTUFBTTtZQUNMLEdBQUdKLFdBQVdJLElBQUk7WUFDbEJD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
|
package/es6/src/domain/prompt.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { createInterface } from "node:readline";
|
|
2
|
-
// readline/promises rl.question() has a race condition with piped (non-TTY) stdin
|
|
3
|
-
// in Node ≥ 22: after the first line is read, stdin emits 'end', readline closes,
|
|
4
|
-
// and all subsequent question() calls resolve to "".
|
|
5
|
-
// Fix: use the async-iterator API, which buffers all lines before the close event fires.
|
|
6
|
-
let _rl = null;
|
|
7
|
-
let _lines = null;
|
|
8
|
-
function getLines() {
|
|
9
|
-
if (_lines == null) {
|
|
10
|
-
_rl = createInterface({
|
|
11
|
-
input: process.stdin,
|
|
12
|
-
terminal: false
|
|
13
|
-
});
|
|
14
|
-
_lines = _rl[Symbol.asyncIterator]();
|
|
15
|
-
}
|
|
16
|
-
return _lines;
|
|
17
|
-
}
|
|
18
|
-
/** Release stdin so the process can exit after interactive prompts. */ export function closePrompt() {
|
|
19
|
-
_rl?.close();
|
|
20
|
-
_rl = null;
|
|
21
|
-
_lines = null;
|
|
22
|
-
}
|
|
23
|
-
async function readLine(prompt) {
|
|
24
|
-
process.stdout.write(prompt);
|
|
25
|
-
const { value, done } = await getLines().next();
|
|
26
|
-
return done ? "" : value.trim();
|
|
27
|
-
}
|
|
28
|
-
export async function ask(question, fallback = "") {
|
|
29
|
-
const answer = await readLine(question);
|
|
30
|
-
return answer || fallback;
|
|
31
|
-
}
|
|
32
|
-
export async function pick(label, items, display) {
|
|
33
|
-
console.log(label.trimEnd());
|
|
34
|
-
for (const [i, item] of items.entries()){
|
|
35
|
-
console.log(` ${i + 1}. ${display(item)}`);
|
|
36
|
-
}
|
|
37
|
-
const answer = await readLine(" > ");
|
|
38
|
-
const idx = Number.parseInt(answer, 10);
|
|
39
|
-
if (Number.isNaN(idx) || idx < 1 || idx > items.length) return null;
|
|
40
|
-
return items[idx - 1];
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvZG9tYWluL3Byb21wdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVJbnRlcmZhY2UsIHR5cGUgSW50ZXJmYWNlIH0gZnJvbSBcIm5vZGU6cmVhZGxpbmVcIjtcblxuLy8gcmVhZGxpbmUvcHJvbWlzZXMgcmwucXVlc3Rpb24oKSBoYXMgYSByYWNlIGNvbmRpdGlvbiB3aXRoIHBpcGVkIChub24tVFRZKSBzdGRpblxuLy8gaW4gTm9kZSDiiaUgMjI6IGFmdGVyIHRoZSBmaXJzdCBsaW5lIGlzIHJlYWQsIHN0ZGluIGVtaXRzICdlbmQnLCByZWFkbGluZSBjbG9zZXMsXG4vLyBhbmQgYWxsIHN1YnNlcXVlbnQgcXVlc3Rpb24oKSBjYWxscyByZXNvbHZlIHRvIFwiXCIuXG4vLyBGaXg6IHVzZSB0aGUgYXN5bmMtaXRlcmF0b3IgQVBJLCB3aGljaCBidWZmZXJzIGFsbCBsaW5lcyBiZWZvcmUgdGhlIGNsb3NlIGV2ZW50IGZpcmVzLlxuXG5sZXQgX3JsOiBJbnRlcmZhY2UgfCBudWxsID0gbnVsbDtcbmxldCBfbGluZXM6IEFzeW5jSXRlcmF0b3I8c3RyaW5nPiB8IG51bGwgPSBudWxsO1xuXG5mdW5jdGlvbiBnZXRMaW5lcygpOiBBc3luY0l0ZXJhdG9yPHN0cmluZz4ge1xuXHRpZiAoX2xpbmVzID09IG51bGwpIHtcblx0XHRfcmwgPSBjcmVhdGVJbnRlcmZhY2UoeyBpbnB1dDogcHJvY2Vzcy5zdGRpbiwgdGVybWluYWw6IGZhbHNlIH0pO1xuXHRcdF9saW5lcyA9IF9ybFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblx0fVxuXHRyZXR1cm4gX2xpbmVzO1xufVxuXG4vKiogUmVsZWFzZSBzdGRpbiBzbyB0aGUgcHJvY2VzcyBjYW4gZXhpdCBhZnRlciBpbnRlcmFjdGl2ZSBwcm9tcHRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlUHJvbXB0KCk6IHZvaWQge1xuXHRfcmw/LmNsb3NlKCk7XG5cdF9ybCA9IG51bGw7XG5cdF9saW5lcyA9IG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRMaW5lKHByb21wdDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0cHJvY2Vzcy5zdGRvdXQud3JpdGUocHJvbXB0KTtcblx0Y29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gYXdhaXQgZ2V0TGluZXMoKS5uZXh0KCk7XG5cdHJldHVybiBkb25lID8gXCJcIiA6IHZhbHVlLnRyaW0oKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzayhxdWVzdGlvbjogc3RyaW5nLCBmYWxsYmFjayA9IFwiXCIpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRjb25zdCBhbnN3ZXIgPSBhd2FpdCByZWFkTGluZShxdWVzdGlvbik7XG5cdHJldHVybiBhbnN3ZXIgfHwgZmFsbGJhY2s7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwaWNrPFQ+KFxuXHRsYWJlbDogc3RyaW5nLFxuXHRpdGVtczogVFtdLFxuXHRkaXNwbGF5OiAoaXRlbTogVCkgPT4gc3RyaW5nLFxuKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuXHRjb25zb2xlLmxvZyhsYWJlbC50cmltRW5kKCkpO1xuXHRmb3IgKGNvbnN0IFtpLCBpdGVtXSBvZiBpdGVtcy5lbnRyaWVzKCkpIHtcblx0XHRjb25zb2xlLmxvZyhgICAgICR7aSArIDF9LiAke2Rpc3BsYXkoaXRlbSl9YCk7XG5cdH1cblx0Y29uc3QgYW5zd2VyID0gYXdhaXQgcmVhZExpbmUoXCIgID4gXCIpO1xuXHRjb25zdCBpZHggPSBOdW1iZXIucGFyc2VJbnQoYW5zd2VyLCAxMCk7XG5cdGlmIChOdW1iZXIuaXNOYU4oaWR4KSB8fCBpZHggPCAxIHx8IGlkeCA+IGl0ZW1zLmxlbmd0aCkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBpdGVtc1tpZHggLSAxXTtcbn1cbiJdLCJuYW1lcyI6WyJjcmVhdGVJbnRlcmZhY2UiLCJfcmwiLCJfbGluZXMiLCJnZXRMaW5lcyIsImlucHV0IiwicHJvY2VzcyIsInN0ZGluIiwidGVybWluYWwiLCJTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwiY2xvc2VQcm9tcHQiLCJjbG9zZSIsInJlYWRMaW5lIiwicHJvbXB0Iiwic3Rkb3V0Iiwid3JpdGUiLCJ2YWx1ZSIsImRvbmUiLCJuZXh0IiwidHJpbSIsImFzayIsInF1ZXN0aW9uIiwiZmFsbGJhY2siLCJhbnN3ZXIiLCJwaWNrIiwibGFiZWwiLCJpdGVtcyIsImRpc3BsYXkiLCJjb25zb2xlIiwibG9nIiwidHJpbUVuZCIsImkiLCJpdGVtIiwiZW50cmllcyIsImlkeCIsIk51bWJlciIsInBhcnNlSW50IiwiaXNOYU4iLCJsZW5ndGgiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGVBQWUsUUFBd0IsZ0JBQWdCO0FBRWhFLGtGQUFrRjtBQUNsRixrRkFBa0Y7QUFDbEYscURBQXFEO0FBQ3JELHlGQUF5RjtBQUV6RixJQUFJQyxNQUF3QjtBQUM1QixJQUFJQyxTQUF1QztBQUUzQyxTQUFTQztJQUNSLElBQUlELFVBQVUsTUFBTTtRQUNuQkQsTUFBTUQsZ0JBQWdCO1lBQUVJLE9BQU9DLFFBQVFDLEtBQUs7WUFBRUMsVUFBVTtRQUFNO1FBQzlETCxTQUFTRCxHQUFHLENBQUNPLE9BQU9DLGFBQWEsQ0FBQztJQUNuQztJQUNBLE9BQU9QO0FBQ1I7QUFFQSxxRUFBcUUsR0FDckUsT0FBTyxTQUFTUTtJQUNmVCxLQUFLVTtJQUNMVixNQUFNO0lBQ05DLFNBQVM7QUFDVjtBQUVBLGVBQWVVLFNBQVNDLE1BQWM7SUFDckNSLFFBQVFTLE1BQU0sQ0FBQ0MsS0FBSyxDQUFDRjtJQUNyQixNQUFNLEVBQUVHLEtBQUssRUFBRUMsSUFBSSxFQUFFLEdBQUcsTUFBTWQsV0FBV2UsSUFBSTtJQUM3QyxPQUFPRCxPQUFPLEtBQUtELE1BQU1HLElBQUk7QUFDOUI7QUFFQSxPQUFPLGVBQWVDLElBQUlDLFFBQWdCLEVBQUVDLFdBQVcsRUFBRTtJQUN4RCxNQUFNQyxTQUFTLE1BQU1YLFNBQVNTO0lBQzlCLE9BQU9FLFVBQVVEO0FBQ2xCO0FBRUEsT0FBTyxlQUFlRSxLQUNyQkMsS0FBYSxFQUNiQyxLQUFVLEVBQ1ZDLE9BQTRCO0lBRTVCQyxRQUFRQyxHQUFHLENBQUNKLE1BQU1LLE9BQU87SUFDekIsS0FBSyxNQUFNLENBQUNDLEdBQUdDLEtBQUssSUFBSU4sTUFBTU8sT0FBTyxHQUFJO1FBQ3hDTCxRQUFRQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUVFLElBQUksRUFBRSxFQUFFLEVBQUVKLFFBQVFLLE9BQU87SUFDN0M7SUFDQSxNQUFNVCxTQUFTLE1BQU1YLFNBQVM7SUFDOUIsTUFBTXNCLE1BQU1DLE9BQU9DLFFBQVEsQ0FBQ2IsUUFBUTtJQUNwQyxJQUFJWSxPQUFPRSxLQUFLLENBQUNILFFBQVFBLE1BQU0sS0FBS0EsTUFBTVIsTUFBTVksTUFBTSxFQUFFLE9BQU87SUFDL0QsT0FBT1osS0FBSyxDQUFDUSxNQUFNLEVBQUU7QUFDdEIifQ==
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { WELL_KNOWN_FILES } from "./const.js";
|
|
2
|
-
/**
|
|
3
|
-
* Live builder for `docker-compose.yml`.
|
|
4
|
-
*
|
|
5
|
-
* Features call `addService` / `addVolume` / `addNetwork` in their scaffold phases.
|
|
6
|
-
*/ export class DockerCompose {
|
|
7
|
-
key = WELL_KNOWN_FILES.DOCKER_COMPOSE;
|
|
8
|
-
_projectName;
|
|
9
|
-
_services = new Map();
|
|
10
|
-
_volumes = new Set();
|
|
11
|
-
_networks = new Map();
|
|
12
|
-
/** Compose project name (`name:` top-level) — isolates containers/volumes. */ setProjectName(name) {
|
|
13
|
-
this._projectName = name;
|
|
14
|
-
return this;
|
|
15
|
-
}
|
|
16
|
-
addService(name, config) {
|
|
17
|
-
this._services.set(name, config);
|
|
18
|
-
return this;
|
|
19
|
-
}
|
|
20
|
-
files() {
|
|
21
|
-
return [
|
|
22
|
-
{
|
|
23
|
-
filePath: ".devcontainer/docker-compose.yml",
|
|
24
|
-
content: this.getContent()
|
|
25
|
-
}
|
|
26
|
-
];
|
|
27
|
-
}
|
|
28
|
-
addVolume(name) {
|
|
29
|
-
this._volumes.add(name);
|
|
30
|
-
return this;
|
|
31
|
-
}
|
|
32
|
-
addNetwork(key, network) {
|
|
33
|
-
this._networks.set(key, network);
|
|
34
|
-
return this;
|
|
35
|
-
}
|
|
36
|
-
/** Append an env_file path to an existing service. */ addEnvFile(serviceName, filePath) {
|
|
37
|
-
const svc = this._services.get(serviceName);
|
|
38
|
-
if (svc) svc.env_file = [
|
|
39
|
-
...svc.env_file ?? [],
|
|
40
|
-
filePath
|
|
41
|
-
];
|
|
42
|
-
return this;
|
|
43
|
-
}
|
|
44
|
-
getContent() {
|
|
45
|
-
const lines = [];
|
|
46
|
-
if (this._projectName) {
|
|
47
|
-
lines.push(`name: ${this._projectName}`, "");
|
|
48
|
-
}
|
|
49
|
-
lines.push("services:");
|
|
50
|
-
for (const [name, svc] of this._services){
|
|
51
|
-
lines.push(` ${name}:`);
|
|
52
|
-
if (svc.build) lines.push(` build: ${svc.build}`);
|
|
53
|
-
if (svc.image) lines.push(` image: ${svc.image}`);
|
|
54
|
-
if (svc.container_name) lines.push(` container_name: ${svc.container_name}`);
|
|
55
|
-
if (svc.command) lines.push(` command: ${svc.command}`);
|
|
56
|
-
if (svc.restart) lines.push(` restart: ${svc.restart}`);
|
|
57
|
-
if (svc.profiles && svc.profiles.length > 0) {
|
|
58
|
-
lines.push(" profiles:");
|
|
59
|
-
for (const p of svc.profiles)lines.push(` - ${p}`);
|
|
60
|
-
}
|
|
61
|
-
if (svc.env_file && svc.env_file.length > 0) {
|
|
62
|
-
lines.push(" env_file:");
|
|
63
|
-
for (const f of svc.env_file)lines.push(` - ${f}`);
|
|
64
|
-
}
|
|
65
|
-
if (svc.environment && Object.keys(svc.environment).length > 0) {
|
|
66
|
-
lines.push(" environment:");
|
|
67
|
-
for (const [k, v] of Object.entries(svc.environment)){
|
|
68
|
-
lines.push(` ${k}: ${v}`);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
if (svc.ports && svc.ports.length > 0) {
|
|
72
|
-
lines.push(" ports:");
|
|
73
|
-
for (const p of svc.ports)lines.push(` - "${p}"`);
|
|
74
|
-
}
|
|
75
|
-
if (svc.volumes && svc.volumes.length > 0) {
|
|
76
|
-
lines.push(" volumes:");
|
|
77
|
-
for (const v of svc.volumes)lines.push(` - ${v}`);
|
|
78
|
-
}
|
|
79
|
-
if (svc.networks && svc.networks.length > 0) {
|
|
80
|
-
const onlyStrings = svc.networks.every((n)=>typeof n === "string");
|
|
81
|
-
if (onlyStrings) {
|
|
82
|
-
lines.push(" networks:");
|
|
83
|
-
for (const n of svc.networks)lines.push(` - ${n}`);
|
|
84
|
-
} else {
|
|
85
|
-
lines.push(" networks:");
|
|
86
|
-
for (const n of svc.networks){
|
|
87
|
-
if (typeof n === "string") {
|
|
88
|
-
lines.push(` ${n}:`);
|
|
89
|
-
} else {
|
|
90
|
-
for (const [netKey, cfg] of Object.entries(n)){
|
|
91
|
-
lines.push(` ${netKey}:`);
|
|
92
|
-
if (cfg.aliases && cfg.aliases.length > 0) {
|
|
93
|
-
lines.push(" aliases:");
|
|
94
|
-
for (const a of cfg.aliases)lines.push(` - ${a}`);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
if (svc.depends_on && svc.depends_on.length > 0) {
|
|
102
|
-
lines.push(" depends_on:");
|
|
103
|
-
for (const d of svc.depends_on)lines.push(` - ${d}`);
|
|
104
|
-
}
|
|
105
|
-
if (svc.healthcheck) {
|
|
106
|
-
const hc = svc.healthcheck;
|
|
107
|
-
lines.push(" healthcheck:");
|
|
108
|
-
lines.push(` test: ${JSON.stringify(hc.test)}`);
|
|
109
|
-
if (hc.interval) lines.push(` interval: ${hc.interval}`);
|
|
110
|
-
if (hc.timeout) lines.push(` timeout: ${hc.timeout}`);
|
|
111
|
-
if (hc.retries != null) lines.push(` retries: ${hc.retries}`);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
if (this._networks.size > 0) {
|
|
115
|
-
lines.push("");
|
|
116
|
-
lines.push("networks:");
|
|
117
|
-
for (const [key, net] of this._networks){
|
|
118
|
-
lines.push(` ${key}:`);
|
|
119
|
-
lines.push(` name: ${net.name}`);
|
|
120
|
-
if (net.external) lines.push(" external: true");
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
if (this._volumes.size > 0) {
|
|
124
|
-
lines.push("");
|
|
125
|
-
lines.push("volumes:");
|
|
126
|
-
for (const v of this._volumes)lines.push(` ${v}:`);
|
|
127
|
-
}
|
|
128
|
-
return `${lines.join("\n")}\n`;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2NvbXBvc2UubW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwgfSBmcm9tIFwiLi9zb3VyY2UtZmlsZS5qc1wiO1xuXG5leHBvcnQgdHlwZSBDb21wb3NlTmV0d29ya1JlZiA9XG5cdHwgc3RyaW5nXG5cdHwge1xuXHRcdFx0LyoqIE5ldHdvcmsga2V5IHVuZGVyIGBuZXR3b3JrczpgIG9uIHRoaXMgc2VydmljZSAqL1xuXHRcdFx0W25ldHdvcmtLZXk6IHN0cmluZ106IHsgYWxpYXNlcz86IHN0cmluZ1tdIH07XG5cdCAgfTtcblxuZXhwb3J0IGludGVyZmFjZSBDb21wb3NlSGVhbHRoY2hlY2sge1xuXHR0ZXN0OiBzdHJpbmdbXTtcblx0aW50ZXJ2YWw/OiBzdHJpbmc7XG5cdHRpbWVvdXQ/OiBzdHJpbmc7XG5cdHJldHJpZXM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9zZVNlcnZpY2Uge1xuXHRidWlsZD86IHN0cmluZztcblx0aW1hZ2U/OiBzdHJpbmc7XG5cdGNvbnRhaW5lcl9uYW1lPzogc3RyaW5nO1xuXHRlbnZfZmlsZT86IHN0cmluZ1tdO1xuXHRlbnZpcm9ubWVudD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdHBvcnRzPzogc3RyaW5nW107XG5cdHZvbHVtZXM/OiBzdHJpbmdbXTtcblx0Y29tbWFuZD86IHN0cmluZztcblx0cmVzdGFydD86IHN0cmluZztcblx0ZGVwZW5kc19vbj86IHN0cmluZ1tdO1xuXHQvKiogQ29tcG9zZSBwcm9maWxlcyAoc2VydmljZSBvbmx5IHN0YXJ0cyB3aGVuIHByb2ZpbGUgaXMgZW5hYmxlZCkuICovXG5cdHByb2ZpbGVzPzogc3RyaW5nW107XG5cdC8qKiBBdHRhY2ggdG8gY29tcG9zZSBuZXR3b3JrcyAoc3RyaW5nIG5hbWUgb3IgbWFwIHdpdGggYWxpYXNlcykuICovXG5cdG5ldHdvcmtzPzogQ29tcG9zZU5ldHdvcmtSZWZbXTtcblx0aGVhbHRoY2hlY2s/OiBDb21wb3NlSGVhbHRoY2hlY2s7XG59XG5cbmV4cG9ydCB0eXBlIENvbXBvc2VOZXR3b3JrID0ge1xuXHQvKiogRml4ZWQgRG9ja2VyIG5ldHdvcmsgbmFtZSAoc2hhcmVhYmxlIGFjcm9zcyBjb21wb3NlIHByb2plY3RzKS4gKi9cblx0bmFtZTogc3RyaW5nO1xuXHRleHRlcm5hbD86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIExpdmUgYnVpbGRlciBmb3IgYGRvY2tlci1jb21wb3NlLnltbGAuXG4gKlxuICogRmVhdHVyZXMgY2FsbCBgYWRkU2VydmljZWAgLyBgYWRkVm9sdW1lYCAvIGBhZGROZXR3b3JrYCBpbiB0aGVpciBzY2FmZm9sZCBwaGFzZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEb2NrZXJDb21wb3NlIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHB1YmxpYyByZWFkb25seSBrZXkgPSBXRUxMX0tOT1dOX0ZJTEVTLkRPQ0tFUl9DT01QT1NFO1xuXHRwcml2YXRlIF9wcm9qZWN0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9zZXJ2aWNlczogTWFwPHN0cmluZywgQ29tcG9zZVNlcnZpY2U+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIHJlYWRvbmx5IF92b2x1bWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblx0cHJpdmF0ZSByZWFkb25seSBfbmV0d29ya3M6IE1hcDxzdHJpbmcsIENvbXBvc2VOZXR3b3JrPiA9IG5ldyBNYXAoKTtcblxuXHQvKiogQ29tcG9zZSBwcm9qZWN0IG5hbWUgKGBuYW1lOmAgdG9wLWxldmVsKSDigJQgaXNvbGF0ZXMgY29udGFpbmVycy92b2x1bWVzLiAqL1xuXHRwdWJsaWMgc2V0UHJvamVjdE5hbWUobmFtZTogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fcHJvamVjdE5hbWUgPSBuYW1lO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGFkZFNlcnZpY2UobmFtZTogc3RyaW5nLCBjb25maWc6IENvbXBvc2VTZXJ2aWNlKTogdGhpcyB7XG5cdFx0dGhpcy5fc2VydmljZXMuc2V0KG5hbWUsIGNvbmZpZyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLmRldmNvbnRhaW5lci9kb2NrZXItY29tcG9zZS55bWxcIixcblx0XHRcdFx0Y29udGVudDogdGhpcy5nZXRDb250ZW50KCksXG5cdFx0XHR9LFxuXHRcdF07XG5cdH1cblxuXHRwdWJsaWMgYWRkVm9sdW1lKG5hbWU6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX3ZvbHVtZXMuYWRkKG5hbWUpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGFkZE5ldHdvcmsoa2V5OiBzdHJpbmcsIG5ldHdvcms6IENvbXBvc2VOZXR3b3JrKTogdGhpcyB7XG5cdFx0dGhpcy5fbmV0d29ya3Muc2V0KGtleSwgbmV0d29yayk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKiogQXBwZW5kIGFuIGVudl9maWxlIHBhdGggdG8gYW4gZXhpc3Rpbmcgc2VydmljZS4gKi9cblx0cHVibGljIGFkZEVudkZpbGUoc2VydmljZU5hbWU6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHRoaXMge1xuXHRcdGNvbnN0IHN2YyA9IHRoaXMuX3NlcnZpY2VzLmdldChzZXJ2aWNlTmFtZSk7XG5cdFx0aWYgKHN2Yykgc3ZjLmVudl9maWxlID0gWy4uLihzdmMuZW52X2ZpbGUgPz8gW10pLCBmaWxlUGF0aF07XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29udGVudCgpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGlmICh0aGlzLl9wcm9qZWN0TmFtZSkge1xuXHRcdFx0bGluZXMucHVzaChgbmFtZTogJHt0aGlzLl9wcm9qZWN0TmFtZX1gLCBcIlwiKTtcblx0XHR9XG5cdFx0bGluZXMucHVzaChcInNlcnZpY2VzOlwiKTtcblxuXHRcdGZvciAoY29uc3QgW25hbWUsIHN2Y10gb2YgdGhpcy5fc2VydmljZXMpIHtcblx0XHRcdGxpbmVzLnB1c2goYCAgJHtuYW1lfTpgKTtcblx0XHRcdGlmIChzdmMuYnVpbGQpIGxpbmVzLnB1c2goYCAgICBidWlsZDogJHtzdmMuYnVpbGR9YCk7XG5cdFx0XHRpZiAoc3ZjLmltYWdlKSBsaW5lcy5wdXNoKGAgICAgaW1hZ2U6ICR7c3ZjLmltYWdlfWApO1xuXHRcdFx0aWYgKHN2Yy5jb250YWluZXJfbmFtZSkgbGluZXMucHVzaChgICAgIGNvbnRhaW5lcl9uYW1lOiAke3N2Yy5jb250YWluZXJfbmFtZX1gKTtcblx0XHRcdGlmIChzdmMuY29tbWFuZCkgbGluZXMucHVzaChgICAgIGNvbW1hbmQ6ICR7c3ZjLmNvbW1hbmR9YCk7XG5cdFx0XHRpZiAoc3ZjLnJlc3RhcnQpIGxpbmVzLnB1c2goYCAgICByZXN0YXJ0OiAke3N2Yy5yZXN0YXJ0fWApO1xuXG5cdFx0XHRpZiAoc3ZjLnByb2ZpbGVzICYmIHN2Yy5wcm9maWxlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgcHJvZmlsZXM6XCIpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHAgb2Ygc3ZjLnByb2ZpbGVzKSBsaW5lcy5wdXNoKGAgICAgICAtICR7cH1gKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHN2Yy5lbnZfZmlsZSAmJiBzdmMuZW52X2ZpbGUubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRsaW5lcy5wdXNoKFwiICAgIGVudl9maWxlOlwiKTtcblx0XHRcdFx0Zm9yIChjb25zdCBmIG9mIHN2Yy5lbnZfZmlsZSkgbGluZXMucHVzaChgICAgICAgLSAke2Z9YCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMuZW52aXJvbm1lbnQgJiYgT2JqZWN0LmtleXMoc3ZjLmVudmlyb25tZW50KS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgZW52aXJvbm1lbnQ6XCIpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhzdmMuZW52aXJvbm1lbnQpKSB7XG5cdFx0XHRcdFx0bGluZXMucHVzaChgICAgICAgJHtrfTogJHt2fWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMucG9ydHMgJiYgc3ZjLnBvcnRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bGluZXMucHVzaChcIiAgICBwb3J0czpcIik7XG5cdFx0XHRcdGZvciAoY29uc3QgcCBvZiBzdmMucG9ydHMpIGxpbmVzLnB1c2goYCAgICAgIC0gXCIke3B9XCJgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHN2Yy52b2x1bWVzICYmIHN2Yy52b2x1bWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bGluZXMucHVzaChcIiAgICB2b2x1bWVzOlwiKTtcblx0XHRcdFx0Zm9yIChjb25zdCB2IG9mIHN2Yy52b2x1bWVzKSBsaW5lcy5wdXNoKGAgICAgICAtICR7dn1gKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHN2Yy5uZXR3b3JrcyAmJiBzdmMubmV0d29ya3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb25zdCBvbmx5U3RyaW5ncyA9IHN2Yy5uZXR3b3Jrcy5ldmVyeSgobikgPT4gdHlwZW9mIG4gPT09IFwic3RyaW5nXCIpO1xuXHRcdFx0XHRpZiAob25seVN0cmluZ3MpIHtcblx0XHRcdFx0XHRsaW5lcy5wdXNoKFwiICAgIG5ldHdvcmtzOlwiKTtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IG4gb2Ygc3ZjLm5ldHdvcmtzKSBsaW5lcy5wdXNoKGAgICAgICAtICR7biBhcyBzdHJpbmd9YCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGluZXMucHVzaChcIiAgICBuZXR3b3JrczpcIik7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBuIG9mIHN2Yy5uZXR3b3Jrcykge1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBuID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0XHRcdGxpbmVzLnB1c2goYCAgICAgICR7bn06YCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IFtuZXRLZXksIGNmZ10gb2YgT2JqZWN0LmVudHJpZXMobikpIHtcblx0XHRcdFx0XHRcdFx0XHRsaW5lcy5wdXNoKGAgICAgICAke25ldEtleX06YCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNmZy5hbGlhc2VzICYmIGNmZy5hbGlhc2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgICAgIGFsaWFzZXM6XCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBhIG9mIGNmZy5hbGlhc2VzKSBsaW5lcy5wdXNoKGAgICAgICAgICAgLSAke2F9YCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMuZGVwZW5kc19vbiAmJiBzdmMuZGVwZW5kc19vbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgZGVwZW5kc19vbjpcIik7XG5cdFx0XHRcdGZvciAoY29uc3QgZCBvZiBzdmMuZGVwZW5kc19vbikgbGluZXMucHVzaChgICAgICAgLSAke2R9YCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMuaGVhbHRoY2hlY2spIHtcblx0XHRcdFx0Y29uc3QgaGMgPSBzdmMuaGVhbHRoY2hlY2s7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgaGVhbHRoY2hlY2s6XCIpO1xuXHRcdFx0XHRsaW5lcy5wdXNoKGAgICAgICB0ZXN0OiAke0pTT04uc3RyaW5naWZ5KGhjLnRlc3QpfWApO1xuXHRcdFx0XHRpZiAoaGMuaW50ZXJ2YWwpIGxpbmVzLnB1c2goYCAgICAgIGludGVydmFsOiAke2hjLmludGVydmFsfWApO1xuXHRcdFx0XHRpZiAoaGMudGltZW91dCkgbGluZXMucHVzaChgICAgICAgdGltZW91dDogJHtoYy50aW1lb3V0fWApO1xuXHRcdFx0XHRpZiAoaGMucmV0cmllcyAhPSBudWxsKSBsaW5lcy5wdXNoKGAgICAgICByZXRyaWVzOiAke2hjLnJldHJpZXN9YCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX25ldHdvcmtzLnNpemUgPiAwKSB7XG5cdFx0XHRsaW5lcy5wdXNoKFwiXCIpO1xuXHRcdFx0bGluZXMucHVzaChcIm5ldHdvcmtzOlwiKTtcblx0XHRcdGZvciAoY29uc3QgW2tleSwgbmV0XSBvZiB0aGlzLl9uZXR3b3Jrcykge1xuXHRcdFx0XHRsaW5lcy5wdXNoKGAgICR7a2V5fTpgKTtcblx0XHRcdFx0bGluZXMucHVzaChgICAgIG5hbWU6ICR7bmV0Lm5hbWV9YCk7XG5cdFx0XHRcdGlmIChuZXQuZXh0ZXJuYWwpIGxpbmVzLnB1c2goXCIgICAgZXh0ZXJuYWw6IHRydWVcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX3ZvbHVtZXMuc2l6ZSA+IDApIHtcblx0XHRcdGxpbmVzLnB1c2goXCJcIik7XG5cdFx0XHRsaW5lcy5wdXNoKFwidm9sdW1lczpcIik7XG5cdFx0XHRmb3IgKGNvbnN0IHYgb2YgdGhpcy5fdm9sdW1lcykgbGluZXMucHVzaChgICAke3Z9OmApO1xuXHRcdH1cblxuXHRcdHJldHVybiBgJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbmA7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJXRUxMX0tOT1dOX0ZJTEVTIiwiRG9ja2VyQ29tcG9zZSIsImtleSIsIkRPQ0tFUl9DT01QT1NFIiwiX3Byb2plY3ROYW1lIiwiX3NlcnZpY2VzIiwiTWFwIiwiX3ZvbHVtZXMiLCJTZXQiLCJfbmV0d29ya3MiLCJzZXRQcm9qZWN0TmFtZSIsIm5hbWUiLCJhZGRTZXJ2aWNlIiwiY29uZmlnIiwic2V0IiwiZmlsZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJnZXRDb250ZW50IiwiYWRkVm9sdW1lIiwiYWRkIiwiYWRkTmV0d29yayIsIm5ldHdvcmsiLCJhZGRFbnZGaWxlIiwic2VydmljZU5hbWUiLCJzdmMiLCJnZXQiLCJlbnZfZmlsZSIsImxpbmVzIiwicHVzaCIsImJ1aWxkIiwiaW1hZ2UiLCJjb250YWluZXJfbmFtZSIsImNvbW1hbmQiLCJyZXN0YXJ0IiwicHJvZmlsZXMiLCJsZW5ndGgiLCJwIiwiZiIsImVudmlyb25tZW50IiwiT2JqZWN0Iiwia2V5cyIsImsiLCJ2IiwiZW50cmllcyIsInBvcnRzIiwidm9sdW1lcyIsIm5ldHdvcmtzIiwib25seVN0cmluZ3MiLCJldmVyeSIsIm4iLCJuZXRLZXkiLCJjZmciLCJhbGlhc2VzIiwiYSIsImRlcGVuZHNfb24iLCJkIiwiaGVhbHRoY2hlY2siLCJoYyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0ZXN0IiwiaW50ZXJ2YWwiLCJ0aW1lb3V0IiwicmV0cmllcyIsInNpemUiLCJuZXQiLCJleHRlcm5hbCIsImpvaW4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGdCQUFnQixRQUFRLGFBQWE7QUF5QzlDOzs7O0NBSUMsR0FDRCxPQUFPLE1BQU1DO0lBQ0lDLE1BQU1GLGlCQUFpQkcsY0FBYyxDQUFDO0lBQzlDQyxhQUFpQztJQUN4QkMsWUFBeUMsSUFBSUMsTUFBTTtJQUNuREMsV0FBd0IsSUFBSUMsTUFBTTtJQUNsQ0MsWUFBeUMsSUFBSUgsTUFBTTtJQUVwRSw0RUFBNEUsR0FDNUUsQUFBT0ksZUFBZUMsSUFBWSxFQUFRO1FBQ3pDLElBQUksQ0FBQ1AsWUFBWSxHQUFHTztRQUNwQixPQUFPLElBQUk7SUFDWjtJQUVPQyxXQUFXRCxJQUFZLEVBQUVFLE1BQXNCLEVB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
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs";
|
|
2
|
-
/**
|
|
3
|
-
* Builder for a YAML config file (e.g. config/config.yaml or config/config.dev.yaml).
|
|
4
|
-
*
|
|
5
|
-
* Starts with a base section passed to the constructor. Features call
|
|
6
|
-
* `addSection(yaml)` during their scaffold phase to append their own block.
|
|
7
|
-
* `files()` joins all sections with a blank line separator.
|
|
8
|
-
*/ export class ConfigYaml {
|
|
9
|
-
key;
|
|
10
|
-
filePath;
|
|
11
|
-
_sections = [];
|
|
12
|
-
constructor(key, filePath, baseContent){
|
|
13
|
-
this.key = key;
|
|
14
|
-
this.filePath = filePath;
|
|
15
|
-
this._sections.push(baseContent);
|
|
16
|
-
}
|
|
17
|
-
addSection(yaml) {
|
|
18
|
-
this._sections.push(yaml);
|
|
19
|
-
return this;
|
|
20
|
-
}
|
|
21
|
-
/** True when a datasource with this `name:` already appears in the file. */ hasDataSource(name) {
|
|
22
|
-
return this._sections.join("\n").includes(`name: ${name}\n`);
|
|
23
|
-
}
|
|
24
|
-
hasDataSources() {
|
|
25
|
-
return this._sections.join("\n").includes("dataSources:");
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Insert a `dataSources` list item. Used by `webapi add` so we do not write a
|
|
29
|
-
* second top-level `database:` key (YAML last-key-wins).
|
|
30
|
-
*/ appendDataSource(item) {
|
|
31
|
-
const current = this._sections.join("\n");
|
|
32
|
-
this._sections.length = 0;
|
|
33
|
-
this._sections.push(injectYamlDataSource(current, item));
|
|
34
|
-
return this;
|
|
35
|
-
}
|
|
36
|
-
static fromFile(key, relativePath, absolutePath) {
|
|
37
|
-
const content = readFileSync(absolutePath, "utf8");
|
|
38
|
-
return new ConfigYaml(key, relativePath, content);
|
|
39
|
-
}
|
|
40
|
-
files() {
|
|
41
|
-
return [
|
|
42
|
-
{
|
|
43
|
-
filePath: this.filePath,
|
|
44
|
-
content: this._sections.join("\n")
|
|
45
|
-
}
|
|
46
|
-
];
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
/** Insert a YAML list item under `dataSources:`; append a new `database:` block if missing. */ export function injectYamlDataSource(yaml, item) {
|
|
50
|
-
const block = item.replace(/\n$/, "");
|
|
51
|
-
if (!yaml.includes("dataSources:")) {
|
|
52
|
-
const prefix = yaml.trimEnd();
|
|
53
|
-
const section = `database:\n dataSources:\n${block}\n`;
|
|
54
|
-
return prefix.length > 0 ? `${prefix}\n\n${section}` : section;
|
|
55
|
-
}
|
|
56
|
-
const lines = yaml.split("\n");
|
|
57
|
-
const dsIndex = lines.findIndex((line)=>/^\s*dataSources:\s*$/.test(line));
|
|
58
|
-
if (dsIndex < 0) {
|
|
59
|
-
return `${yaml.trimEnd()}\n\ndatabase:\n dataSources:\n${block}\n`;
|
|
60
|
-
}
|
|
61
|
-
let insertAt = lines.length;
|
|
62
|
-
for(let i = dsIndex + 1; i < lines.length; i++){
|
|
63
|
-
if (/^[A-Za-z]/.test(lines[i] ?? "")) {
|
|
64
|
-
insertAt = i;
|
|
65
|
-
break;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
const insertLines = block.split("\n");
|
|
69
|
-
if (insertAt < lines.length && lines[insertAt - 1] !== "") {
|
|
70
|
-
insertLines.push("");
|
|
71
|
-
}
|
|
72
|
-
lines.splice(insertAt, 0, ...insertLines);
|
|
73
|
-
return lines.join("\n");
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2NvbmZpZy15YW1sLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi9zb3VyY2UtZmlsZS5qc1wiO1xuXG4vKipcbiAqIEJ1aWxkZXIgZm9yIGEgWUFNTCBjb25maWcgZmlsZSAoZS5nLiBjb25maWcvY29uZmlnLnlhbWwgb3IgY29uZmlnL2NvbmZpZy5kZXYueWFtbCkuXG4gKlxuICogU3RhcnRzIHdpdGggYSBiYXNlIHNlY3Rpb24gcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4gRmVhdHVyZXMgY2FsbFxuICogYGFkZFNlY3Rpb24oeWFtbClgIGR1cmluZyB0aGVpciBzY2FmZm9sZCBwaGFzZSB0byBhcHBlbmQgdGhlaXIgb3duIGJsb2NrLlxuICogYGZpbGVzKClgIGpvaW5zIGFsbCBzZWN0aW9ucyB3aXRoIGEgYmxhbmsgbGluZSBzZXBhcmF0b3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25maWdZYW1sIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHByaXZhdGUgcmVhZG9ubHkgX3NlY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihcblx0XHRwdWJsaWMgcmVhZG9ubHkga2V5OiBzdHJpbmcsXG5cdFx0cHJpdmF0ZSByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nLFxuXHRcdGJhc2VDb250ZW50OiBzdHJpbmcsXG5cdCkge1xuXHRcdHRoaXMuX3NlY3Rpb25zLnB1c2goYmFzZUNvbnRlbnQpO1xuXHR9XG5cblx0cHVibGljIGFkZFNlY3Rpb24oeWFtbDogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fc2VjdGlvbnMucHVzaCh5YW1sKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBUcnVlIHdoZW4gYSBkYXRhc291cmNlIHdpdGggdGhpcyBgbmFtZTpgIGFscmVhZHkgYXBwZWFycyBpbiB0aGUgZmlsZS4gKi9cblx0cHVibGljIGhhc0RhdGFTb3VyY2UobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX3NlY3Rpb25zLmpvaW4oXCJcXG5cIikuaW5jbHVkZXMoYG5hbWU6ICR7bmFtZX1cXG5gKTtcblx0fVxuXG5cdHB1YmxpYyBoYXNEYXRhU291cmNlcygpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fc2VjdGlvbnMuam9pbihcIlxcblwiKS5pbmNsdWRlcyhcImRhdGFTb3VyY2VzOlwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbnNlcnQgYSBgZGF0YVNvdXJjZXNgIGxpc3QgaXRlbS4gVXNlZCBieSBgd2ViYXBpIGFkZGAgc28gd2UgZG8gbm90IHdyaXRlIGFcblx0ICogc2Vjb25kIHRvcC1sZXZlbCBgZGF0YWJhc2U6YCBrZXkgKFlBTUwgbGFzdC1rZXktd2lucykuXG5cdCAqL1xuXHRwdWJsaWMgYXBwZW5kRGF0YVNvdXJjZShpdGVtOiBzdHJpbmcpOiB0aGlzIHtcblx0XHRjb25zdCBjdXJyZW50ID0gdGhpcy5fc2VjdGlvbnMuam9pbihcIlxcblwiKTtcblx0XHR0aGlzLl9zZWN0aW9ucy5sZW5ndGggPSAwO1xuXHRcdHRoaXMuX3NlY3Rpb25zLnB1c2goaW5qZWN0WWFtbERhdGFTb3VyY2UoY3VycmVudCwgaXRlbSkpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBmcm9tRmlsZShrZXk6IHN0cmluZywgcmVsYXRpdmVQYXRoOiBzdHJpbmcsIGFic29sdXRlUGF0aDogc3RyaW5nKTogQ29uZmlnWWFtbCB7XG5cdFx0Y29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhhYnNvbHV0ZVBhdGgsIFwidXRmOFwiKTtcblx0XHRyZXR1cm4gbmV3IENvbmZpZ1lhbWwoa2V5LCByZWxhdGl2ZVBhdGgsIGNvbnRlbnQpO1xuXHR9XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0cmV0dXJuIFt7IGZpbGVQYXRoOiB0aGlzLmZpbGVQYXRoLCBjb250ZW50OiB0aGlzLl9zZWN0aW9ucy5qb2luKFwiXFxuXCIpIH1dO1xuXHR9XG59XG5cbi8qKiBJbnNlcnQgYSBZQU1MIGxpc3QgaXRlbSB1bmRlciBgZGF0YVNvdXJjZXM6YDsgYXBwZW5kIGEgbmV3IGBkYXRhYmFzZTpgIGJsb2NrIGlmIG1pc3NpbmcuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0WWFtbERhdGFTb3VyY2UoeWFtbDogc3RyaW5nLCBpdGVtOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBibG9jayA9IGl0ZW0ucmVwbGFjZSgvXFxuJC8sIFwiXCIpO1xuXHRpZiAoIXlhbWwuaW5jbHVkZXMoXCJkYXRhU291cmNlczpcIikpIHtcblx0XHRjb25zdCBwcmVmaXggPSB5YW1sLnRyaW1FbmQoKTtcblx0XHRjb25zdCBzZWN0aW9uID0gYGRhdGFiYXNlOlxcbiAgZGF0YVNvdXJjZXM6XFxuJHtibG9ja31cXG5gO1xuXHRcdHJldHVybiBwcmVmaXgubGVuZ3RoID4gMCA/IGAke3ByZWZpeH1cXG5cXG4ke3NlY3Rpb259YCA6IHNlY3Rpb247XG5cdH1cblx0Y29uc3QgbGluZXMgPSB5YW1sLnNwbGl0KFwiXFxuXCIpO1xuXHRjb25zdCBkc0luZGV4ID0gbGluZXMuZmluZEluZGV4KChsaW5lKSA9PiAvXlxccypkYXRhU291cmNlczpcXHMqJC8udGVzdChsaW5lKSk7XG5cdGlmIChkc0luZGV4IDwgMCkge1xuXHRcdHJldHVybiBgJHt5YW1sLnRyaW1FbmQoKX1cXG5cXG5kYXRhYmFzZTpcXG4gIGRhdGFTb3VyY2VzOlxcbiR7YmxvY2t9XFxuYDtcblx0fVxuXHRsZXQgaW5zZXJ0QXQgPSBsaW5lcy5sZW5ndGg7XG5cdGZvciAobGV0IGkgPSBkc0luZGV4ICsgMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKC9eW0EtWmEtel0vLnRlc3QobGluZXNbaV0gPz8gXCJcIikpIHtcblx0XHRcdGluc2VydEF0ID0gaTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXHRjb25zdCBpbnNlcnRMaW5lcyA9IGJsb2NrLnNwbGl0KFwiXFxuXCIpO1xuXHRpZiAoaW5zZXJ0QXQgPCBsaW5lcy5sZW5ndGggJiYgbGluZXNbaW5zZXJ0QXQgLSAxXSAhPT0gXCJcIikge1xuXHRcdGluc2VydExpbmVzLnB1c2goXCJcIik7XG5cdH1cblx0bGluZXMuc3BsaWNlKGluc2VydEF0LCAwLCAuLi5pbnNlcnRMaW5lcyk7XG5cdHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xufVxuIl0sIm5hbWVzIjpbInJlYWRGaWxlU3luYyIsIkNvbmZpZ1lhbWwiLCJfc2VjdGlvbnMiLCJrZXkiLCJmaWxlUGF0aCIsImJhc2VDb250ZW50IiwicHVzaCIsImFkZFNlY3Rpb24iLCJ5YW1sIiwiaGFzRGF0YVNvdXJjZSIsIm5hbWUiLCJqb2luIiwiaW5jbHVkZXMiLCJoYXNEYXRhU291cmNlcyIsImFwcGVuZERhdGFTb3VyY2UiLCJpdGVtIiwiY3VycmVudCIsImxlbmd0aCIsImluamVjdFlhbWxEYXRhU291cmNlIiwiZnJvbUZpbGUiLCJyZWxhdGl2ZVBhdGgiLCJhYnNvbHV0ZVBhdGgiLCJjb250ZW50IiwiZmlsZXMiLCJibG9jayIsInJlcGxhY2UiLCJwcmVmaXgiLCJ0cmltRW5kIiwic2VjdGlvbiIsImxpbmVzIiwic3BsaXQiLCJkc0luZGV4IiwiZmluZEluZGV4IiwibGluZSIsInRlc3QiLCJpbnNlcnRBdCIsImkiLCJpbnNlcnRMaW5lcyIsInNwbGljZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsWUFBWSxRQUFRLFVBQVU7QUFHdkM7Ozs7OztDQU1DLEdBQ0QsT0FBTyxNQUFNQzs7O0lBQ0tDLFlBQXNCLEVBQUUsQ0FBQztJQUUxQyxZQUNDLEFBQWdCQyxHQUFXLEVBQzNCLEFB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
|
package/es6/src/models/const.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export const WELL_KNOWN_FILES = {
|
|
2
|
-
VSCODE_SETTINGS: "VSCODE_SETTINGS",
|
|
3
|
-
LAUNCH_JSON: "LAUNCH_JSON",
|
|
4
|
-
DOCKER_COMPOSE: "DOCKER_COMPOSE",
|
|
5
|
-
DEVCONTAINER_JSON: "DEVCONTAINER_JSON",
|
|
6
|
-
DOCKERFILE: "DOCKERFILE",
|
|
7
|
-
PRODUCTION_DOCKERFILE: "PRODUCTION_DOCKERFILE",
|
|
8
|
-
GITHUB_CI: "GITHUB_CI",
|
|
9
|
-
PACKAGE_JSON: "PACKAGE_JSON",
|
|
10
|
-
API_PACKAGE_JSON: "API_PACKAGE_JSON",
|
|
11
|
-
TSCONFIG: "TSCONFIG",
|
|
12
|
-
MAIN_TS: "MAIN_TS",
|
|
13
|
-
CONTROLLER_TS: "CONTROLLER_TS",
|
|
14
|
-
CONFIG_YAML: "CONFIG_YAML",
|
|
15
|
-
CONFIG_DEV_YAML: "CONFIG_DEV_YAML",
|
|
16
|
-
GITIGNORE: "GITIGNORE",
|
|
17
|
-
AUTH_CONFIG: "AUTH_CONFIG",
|
|
18
|
-
ENV_FILE: "ENV_FILE"
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2NvbnN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBXRUxMX0tOT1dOX0ZJTEVTID0ge1xuXHRWU0NPREVfU0VUVElOR1M6IFwiVlNDT0RFX1NFVFRJTkdTXCIsXG5cdExBVU5DSF9KU09OOiBcIkxBVU5DSF9KU09OXCIsXG5cdERPQ0tFUl9DT01QT1NFOiBcIkRPQ0tFUl9DT01QT1NFXCIsXG5cdERFVkNPTlRBSU5FUl9KU09OOiBcIkRFVkNPTlRBSU5FUl9KU09OXCIsXG5cdERPQ0tFUkZJTEU6IFwiRE9DS0VSRklMRVwiLFxuXHRQUk9EVUNUSU9OX0RPQ0tFUkZJTEU6IFwiUFJPRFVDVElPTl9ET0NLRVJGSUxFXCIsXG5cdEdJVEhVQl9DSTogXCJHSVRIVUJfQ0lcIixcblx0UEFDS0FHRV9KU09OOiBcIlBBQ0tBR0VfSlNPTlwiLFxuXHRBUElfUEFDS0FHRV9KU09OOiBcIkFQSV9QQUNLQUdFX0pTT05cIixcblx0VFNDT05GSUc6IFwiVFNDT05GSUdcIixcblx0TUFJTl9UUzogXCJNQUlOX1RTXCIsXG5cdENPTlRST0xMRVJfVFM6IFwiQ09OVFJPTExFUl9UU1wiLFxuXHRDT05GSUdfWUFNTDogXCJDT05GSUdfWUFNTFwiLFxuXHRDT05GSUdfREVWX1lBTUw6IFwiQ09ORklHX0RFVl9ZQU1MXCIsXG5cdEdJVElHTk9SRTogXCJHSVRJR05PUkVcIixcblx0QVVUSF9DT05GSUc6IFwiQVVUSF9DT05GSUdcIixcblx0RU5WX0ZJTEU6IFwiRU5WX0ZJTEVcIixcbn07XG4iXSwibmFtZXMiOlsiV0VMTF9LTk9XTl9GSUxFUyIsIlZTQ09ERV9TRVRUSU5HUyIsIkxBVU5DSF9KU09OIiwiRE9DS0VSX0NPTVBPU0UiLCJERVZDT05UQUlORVJfSlNPTiIsIkRPQ0tFUkZJTEUiLCJQUk9EVUNUSU9OX0RPQ0tFUkZJTEUiLCJHSVRIVUJfQ0kiLCJQQUNLQUdFX0pTT04iLCJBUElfUEFDS0FHRV9KU09OIiwiVFNDT05GSUciLCJNQUlOX1RTIiwiQ09OVFJPTExFUl9UUyIsIkNPTkZJR19ZQU1MIiwiQ09ORklHX0RFVl9ZQU1MIiwiR0lUSUdOT1JFIiwiQVVUSF9DT05GSUciLCJFTlZfRklMRSJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNQSxtQkFBbUI7SUFDL0JDLGlCQUFpQjtJQUNqQkMsYUFBYTtJQUNiQyxnQkFBZ0I7SUFDaEJDLG1CQUFtQjtJQUNuQkMsWUFBWTtJQUNaQyx1QkFBdUI7SUFDdkJDLFdBQVc7SUFDWEMsY0FBYztJQUNkQyxrQkFBa0I7SUFDbEJDLFVBQVU7SUFDVkMsU0FBUztJQUNUQyxlQUFlO0lBQ2ZDLGFBQWE7SUFDYkMsaUJBQWlCO0lBQ2pCQyxXQUFXO0lBQ1hDLGFBQWE7SUFDYkMsVUFBVTtBQUNYLEVBQUUifQ==
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { WELL_KNOWN_FILES } from "./const.js";
|
|
2
|
-
export class DevContainer {
|
|
3
|
-
key = WELL_KNOWN_FILES.DEVCONTAINER_JSON;
|
|
4
|
-
_extensions = [];
|
|
5
|
-
_ports = [];
|
|
6
|
-
_portAttributes = new Map();
|
|
7
|
-
_mounts;
|
|
8
|
-
_postStartCommand;
|
|
9
|
-
_initializeCommand;
|
|
10
|
-
_remoteUser = "node";
|
|
11
|
-
_useCompose = false;
|
|
12
|
-
constructor(){
|
|
13
|
-
this._mounts = [
|
|
14
|
-
"source=..,target=/workspace,type=bind,consistency=cached"
|
|
15
|
-
];
|
|
16
|
-
}
|
|
17
|
-
addExtension(...ids) {
|
|
18
|
-
this._extensions.push(...ids);
|
|
19
|
-
return this;
|
|
20
|
-
}
|
|
21
|
-
forwardPort(...ports) {
|
|
22
|
-
this._ports.push(...ports);
|
|
23
|
-
return this;
|
|
24
|
-
}
|
|
25
|
-
setPortAttributes(port, attrs) {
|
|
26
|
-
this._portAttributes.set(port, attrs);
|
|
27
|
-
return this;
|
|
28
|
-
}
|
|
29
|
-
setPostStartCommand(cmd) {
|
|
30
|
-
this._postStartCommand = cmd;
|
|
31
|
-
return this;
|
|
32
|
-
}
|
|
33
|
-
setInitializeCommand(cmd) {
|
|
34
|
-
this._initializeCommand = cmd;
|
|
35
|
-
return this;
|
|
36
|
-
}
|
|
37
|
-
setRemoteUser(user) {
|
|
38
|
-
this._remoteUser = user;
|
|
39
|
-
return this;
|
|
40
|
-
}
|
|
41
|
-
useCompose() {
|
|
42
|
-
this._useCompose = true;
|
|
43
|
-
return this;
|
|
44
|
-
}
|
|
45
|
-
files() {
|
|
46
|
-
const config = {};
|
|
47
|
-
if (this._useCompose) {
|
|
48
|
-
config.dockerComposeFile = "docker-compose.yml";
|
|
49
|
-
config.service = "devcontainer";
|
|
50
|
-
config.workspaceFolder = "/workspace";
|
|
51
|
-
}
|
|
52
|
-
if (this._initializeCommand) {
|
|
53
|
-
config.initializeCommand = this._initializeCommand;
|
|
54
|
-
}
|
|
55
|
-
if (this._mounts) {
|
|
56
|
-
config.mounts = this._mounts;
|
|
57
|
-
}
|
|
58
|
-
if (this._extensions.length > 0) {
|
|
59
|
-
config.customizations = {
|
|
60
|
-
vscode: {
|
|
61
|
-
extensions: this._extensions
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
if (this._ports.length > 0) {
|
|
66
|
-
config.forwardPorts = this._ports;
|
|
67
|
-
}
|
|
68
|
-
if (this._portAttributes.size > 0) {
|
|
69
|
-
const portsAttributes = {};
|
|
70
|
-
for (const [port, attrs] of this._portAttributes){
|
|
71
|
-
portsAttributes[String(port)] = attrs;
|
|
72
|
-
}
|
|
73
|
-
config.portsAttributes = portsAttributes;
|
|
74
|
-
}
|
|
75
|
-
if (this._postStartCommand) {
|
|
76
|
-
config.postStartCommand = this._postStartCommand;
|
|
77
|
-
}
|
|
78
|
-
if (this._remoteUser) {
|
|
79
|
-
config.remoteUser = this._remoteUser;
|
|
80
|
-
}
|
|
81
|
-
return [
|
|
82
|
-
{
|
|
83
|
-
filePath: ".devcontainer/devcontainer.json",
|
|
84
|
-
content: JSON.stringify(config, null, 2)
|
|
85
|
-
}
|
|
86
|
-
];
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2Rldi1jb250YWluZXIubW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi9zb3VyY2UtZmlsZS5qc1wiO1xuXG4vKipcbiAqIE1vZGVsIGZvciBgLmRldmNvbnRhaW5lci9kZXZjb250YWluZXIuanNvbmAuXG4gKlxuICogRmVhdHVyZXMgY2FsbCBidWlsZGVyIG1ldGhvZHMgKGBhZGRFeHRlbnNpb25gLCBgZm9yd2FyZFBvcnRgLCBldGMuKSBkdXJpbmdcbiAqIHRoZWlyIGNvbmZpZ3VyZSBwaGFzZS4gYE1vbm9SZXBvU2NhZmZvbGRgIGNhbGxzIGBmaWxlcygpYCBhdCByZW5kZXIgdGltZS5cbiAqL1xuXG5leHBvcnQgdHlwZSBQb3J0QXR0cmlidXRlcyA9IHtcblx0bGFiZWw/OiBzdHJpbmc7XG5cdC8qKiBXaGVuIHRydWUsIGhvc3QgcG9ydCBtdXN0IG1hdGNoIHRoZSBjb250YWluZXIgcG9ydCAobm8gcmFuZG9tIHJlbWFwKS4gKi9cblx0cmVxdWlyZUxvY2FsUG9ydD86IGJvb2xlYW47XG5cdG9uQXV0b0ZvcndhcmQ/OiBcIm5vdGlmeVwiIHwgXCJvcGVuQnJvd3NlclwiIHwgXCJvcGVuUHJldmlld1wiIHwgXCJzaWxlbnRcIiB8IFwiaWdub3JlXCI7XG59O1xuXG5leHBvcnQgY2xhc3MgRGV2Q29udGFpbmVyIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHB1YmxpYyByZWFkb25seSBrZXkgPSBXRUxMX0tOT1dOX0ZJTEVTLkRFVkNPTlRBSU5FUl9KU09OO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9leHRlbnNpb25zOiBzdHJpbmdbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9wb3J0czogbnVtYmVyW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSBfcG9ydEF0dHJpYnV0ZXMgPSBuZXcgTWFwPG51bWJlciwgUG9ydEF0dHJpYnV0ZXM+KCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgX21vdW50czogc3RyaW5nW107XG5cdHByaXZhdGUgX3Bvc3RTdGFydENvbW1hbmQ/OiBzdHJpbmc7XG5cdHByaXZhdGUgX2luaXRpYWxpemVDb21tYW5kPzogc3RyaW5nO1xuXHRwcml2YXRlIF9yZW1vdGVVc2VyID0gXCJub2RlXCI7XG5cdHByaXZhdGUgX3VzZUNvbXBvc2UgPSBmYWxzZTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5fbW91bnRzID0gW1wic291cmNlPS4uLHRhcmdldD0vd29ya3NwYWNlLHR5cGU9YmluZCxjb25zaXN0ZW5jeT1jYWNoZWRcIl07XG5cdH1cblxuXHRwdWJsaWMgYWRkRXh0ZW5zaW9uKC4uLmlkczogc3RyaW5nW10pOiB0aGlzIHtcblx0XHR0aGlzLl9leHRlbnNpb25zLnB1c2goLi4uaWRzKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBmb3J3YXJkUG9ydCguLi5wb3J0czogbnVtYmVyW10pOiB0aGlzIHtcblx0XHR0aGlzLl9wb3J0cy5wdXNoKC4uLnBvcnRzKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBzZXRQb3J0QXR0cmlidXRlcyhwb3J0OiBudW1iZXIsIGF0dHJzOiBQb3J0QXR0cmlidXRlcyk6IHRoaXMge1xuXHRcdHRoaXMuX3BvcnRBdHRyaWJ1dGVzLnNldChwb3J0LCBhdHRycyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgc2V0UG9zdFN0YXJ0Q29tbWFuZChjbWQ6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX3Bvc3RTdGFydENvbW1hbmQgPSBjbWQ7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgc2V0SW5pdGlhbGl6ZUNvbW1hbmQoY21kOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9pbml0aWFsaXplQ29tbWFuZCA9IGNtZDtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBzZXRSZW1vdGVVc2VyKHVzZXI6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX3JlbW90ZVVzZXIgPSB1c2VyO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIHVzZUNvbXBvc2UoKTogdGhpcyB7XG5cdFx0dGhpcy5fdXNlQ29tcG9zZSA9IHRydWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRjb25zdCBjb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cblx0XHRpZiAodGhpcy5fdXNlQ29tcG9zZSkge1xuXHRcdFx0Y29uZmlnLmRvY2tlckNvbXBvc2VGaWxlID0gXCJkb2NrZXItY29tcG9zZS55bWxcIjtcblx0XHRcdGNvbmZpZy5zZXJ2aWNlID0gXCJkZXZjb250YWluZXJcIjtcblx0XHRcdGNvbmZpZy53b3Jrc3BhY2VGb2xkZXIgPSBcIi93b3Jrc3BhY2VcIjtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5faW5pdGlhbGl6ZUNvbW1hbmQpIHtcblx0XHRcdGNvbmZpZy5pbml0aWFsaXplQ29tbWFuZCA9IHRoaXMuX2luaXRpYWxpemVDb21tYW5kO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9tb3VudHMpIHtcblx0XHRcdGNvbmZpZy5tb3VudHMgPSB0aGlzLl9tb3VudHM7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX2V4dGVuc2lvbnMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uZmlnLmN1c3RvbWl6YXRpb25zID0geyB2c2NvZGU6IHsgZXh0ZW5zaW9uczogdGhpcy5fZXh0ZW5zaW9ucyB9IH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX3BvcnRzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbmZpZy5mb3J3YXJkUG9ydHMgPSB0aGlzLl9wb3J0cztcblx0XHR9XG5cblx0XHRpZiAodGhpcy5fcG9ydEF0dHJpYnV0ZXMuc2l6ZSA+IDApIHtcblx0XHRcdGNvbnN0IHBvcnRzQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgUG9ydEF0dHJpYnV0ZXM+ID0ge307XG5cdFx0XHRmb3IgKGNvbnN0IFtwb3J0LCBhdHRyc10gb2YgdGhpcy5fcG9ydEF0dHJpYnV0ZXMpIHtcblx0XHRcdFx0cG9ydHNBdHRyaWJ1dGVzW1N0cmluZyhwb3J0KV0gPSBhdHRycztcblx0XHRcdH1cblx0XHRcdGNvbmZpZy5wb3J0c0F0dHJpYnV0ZXMgPSBwb3J0c0F0dHJpYnV0ZXM7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX3Bvc3RTdGFydENvbW1hbmQpIHtcblx0XHRcdGNvbmZpZy5wb3N0U3RhcnRDb21tYW5kID0gdGhpcy5fcG9zdFN0YXJ0Q29tbWFuZDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5fcmVtb3RlVXNlcikge1xuXHRcdFx0Y29uZmlnLnJlbW90ZVVzZXIgPSB0aGlzLl9yZW1vdGVVc2VyO1xuXHRcdH1cblxuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcIi5kZXZjb250YWluZXIvZGV2Y29udGFpbmVyLmpzb25cIixcblx0XHRcdFx0Y29udGVudDogSlNPTi5zdHJpbmdpZnkoY29uZmlnLCBudWxsLCAyKSxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIldFTExfS05PV05fRklMRVMiLCJEZXZDb250YWluZXIiLCJrZXkiLCJERVZDT05UQUlORVJfSlNPTiIsIl9leHRlbnNpb25zIiwiX3BvcnRzIiwiX3BvcnRBdHRyaWJ1dGVzIiwiTWFwIiwiX21vdW50cyIsIl9wb3N0U3RhcnRDb21tYW5kIiwiX2luaXRpYWxpemVDb21tYW5kIiwiX3JlbW90ZVVzZXIiLCJfdXNlQ29tcG9zZSIsImFkZEV4dGVuc2lvbiIsImlkcyIsInB1c2giLCJmb3J3YXJkUG9ydCIsInBvcnRzIiwic2V0UG9ydEF0dHJpYnV0ZXMiLCJwb3J0IiwiYXR0cnMiLCJzZXQiLCJzZXRQb3N0U3RhcnRDb21tYW5kIiwiY21kIiwic2V0SW5pdGlhbGl6ZUNvbW1hbmQiLCJzZXRSZW1vdGVVc2VyIiwidXNlciIsInVzZUNvbXBvc2UiLCJmaWxlcyIsImNvbmZpZyIsImRvY2tlckNvbXBvc2VGaWxlIiwic2VydmljZSIsIndvcmtzcGFjZUZvbGRlciIsImluaXRpYWxpemVDb21tYW5kIiwibW91bnRzIiwibGVuZ3RoIiwiY3VzdG9taXphdGlvbnMiLCJ2c2NvZGUiLCJleHRlbnNpb25zIiwiZm9yd2FyZFBvcnRzIiwic2l6ZSIsInBvcnRzQXR0cmlidXRlcyIsIlN0cmluZyIsInBvc3RTdGFydENvbW1hbmQiLCJyZW1vdGVVc2VyIiwiZmlsZVBhdGgiLCJjb250ZW50IiwiSlNPTiIsInN0cmluZ2lmeSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsZ0JBQWdCLFFBQVEsYUFBYTtBQWlCOUMsT0FBTyxNQUFNQztJQUNJQyxNQUFNRixpQkFBaUJHLGlCQUFpQixDQUFDO0lBQ3hDQyxjQUF3QixFQUFFLENBQUM7SUFDM0JDLFNBQW1CLEVBQUUsQ0FBQztJQUN0QkMsa0JBQWtCLElBQUlDLE1BQThCO0lBQ3BEQyxRQUFrQjtJQUMzQkMsa0JBQTJCO0lBQzNCQyxtQkFBNEI7SUFDNUJDLGNBQWMsT0FBTztJQUNyQkMsY0FBYyxNQUFNO0lBRTVCLGFBQXFCO1FBQ3BCLElBQUksQ0FBQ0osT0FBTyxHQUFHO1lBQUM7U0FBMkQ7SUFDNUU7SUFFT0ssYUFBYSxHQUFHQyxHQUFhLEVBQVE7UUFDM0MsSUFBSSxDQUFDVixXQUFXLENBQUNXLElBQUksSUFBSUQ7UUFDekIsT0FBTyxJQUFJO0lBQ1o7SUFFT0UsWUFBWSxHQUFHQyxLQUFlLEVBQVE7UUFDNUMsSUFBSSxDQUFDWixNQUFNLENBQUNVLElBQUksSUFBSUU7UUFDcEIsT0FBTyxJQUFJO0lBQ1o7SUFFT0Msa0JBQWtCQyxJQUFZLEVBQUVDLEtBQXFCLEVBQVE7UUFDbkUsSUFBSSxDQUFDZCxlQUFlLENBQUNlLEdBQUcsQ0FBQ0YsTUFBTUM7UUFDL0IsT0FBTyxJQUFJO0lBQ1o7SUFFT0Usb0JBQW9CQyxHQUFXLEVBQVE7UUFDN0MsSUFBSSxDQUFDZCxpQkFBaUIsR0FBR2M7UUFDekIsT0FBTyxJQUFJO0lBQ1o7SUFFT0MscUJBQXFCRCxHQUFXLEVBQVE7UUFDOUMsSUFBSSxDQUFDYixrQkFBa0IsR0FBR2E7UUFDMUIsT0FBTyxJQUFJO0lBQ1o7SUFFT0UsY0FBY0MsSUFBWSxFQUFRO1FBQ3hDLElBQUksQ0FBQ2YsV0FBVyxHQUFHZTtRQUNuQixPQUFPLElBQUk7SUFDWjtJQUVPQyxhQUFtQjtRQUN6QixJQUFJLENBQUNmLFdBQVcsR0FBRztRQUNuQixPQUFPLElBQUk7SUFDWjtJQUVPZ0IsUUFBc0I7UUFDNUIsTUFBTUMsU0FBa0MsQ0FBQztRQUV6QyxJQUFJLElBQUksQ0FBQ2pCLFdBQVcsRUFBRTtZQUNyQmlCLE9BQU9DLGlCQUFpQixHQUFHO1lBQzNCRCxPQUFPRSxPQUFPLEdBQUc7WUFDakJGLE9BQU9HLGVBQWUsR0FBRztRQUMxQjtRQUVBLElBQUksSUFBSSxDQUFDdEIsa0JBQWtCLEVBQUU7WUFDNUJtQixPQUFPSSxpQkFBaUIsR0FBRyxJQUFJLENBQUN2QixrQkFBa0I7UUFDbkQ7UUFFQSxJQUFJLElBQUksQ0FBQ0YsT0FBTyxFQUFFO1lBQ2pCcUIsT0FBT0ssTUFBTSxHQUFHLElBQUksQ0FBQzFCLE9BQU87UUFDN0I7UUFFQSxJQUFJLElBQUksQ0FBQ0osV0FBVyxDQUFDK0IsTUFBTSxHQUFHLEdBQUc7WUFDaENOLE9BQU9PLGNBQWMsR0FBRztnQkFBRUMsUUFBUTtvQkFBRUMsWUFBWSxJQUFJLENBQUNsQyxXQUFXO2dCQUFDO1lBQUU7UUFDcEU7UUFFQSxJQUFJLElBQUksQ0FBQ0MsTUFBTSxDQUFDOEIsTUFBTSxHQUFHLEdBQUc7WUFDM0JOLE9BQU9VLFlBQVksR0FBRyxJQUFJLENBQUNsQyxNQUFNO1FBQ2xDO1FBRUEsSUFBSSxJQUFJLENBQUNDLGVBQWUsQ0FBQ2tDLElBQUksR0FBRyxHQUFHO1lBQ2xDLE1BQU1DLGtCQUFrRCxDQUFDO1lBQ3pELEtBQUssTUFBTSxDQUFDdEIsTUFBTUMsTUFBTSxJQUFJLElBQUksQ0FBQ2QsZUFBZSxDQUFFO2dCQUNqRG1DLGVBQWUsQ0FBQ0MsT0FBT3ZCLE1BQU0sR0FBR0M7WUFDakM7WUFDQVMsT0FBT1ksZUFBZSxHQUFHQTtRQUMxQjtRQUVBLElBQUksSUFBSSxDQUFDaEMsaUJBQWlCLEVBQUU7WUFDM0JvQixPQUFPYyxnQkFBZ0IsR0FBRyxJQUFJLENBQUNsQyxpQkFBaUI7UUFDakQ7UUFFQSxJQUFJLElBQUksQ0FBQ0UsV0FBVyxFQUFFO1lBQ3JCa0IsT0FBT2UsVUFBVSxHQUFHLElBQUksQ0FBQ2pDLFdBQVc7UUFDckM7UUFFQSxPQUFPO1lBQ047Z0JBQ0NrQyxVQUFVO2dCQUNWQyxTQUFTQyxLQUFLQyxTQUFTLENBQUNuQixRQUFRLE1BQU07WUFDdkM7U0FDQTtJQUNGO0FBQ0QifQ==
|