@decohere/create 0.0.1-dev.48 → 0.0.1-dev.5

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.
Files changed (127) hide show
  1. package/commonjs/src/cli.js +9 -3
  2. package/commonjs/src/scaffold.js +48 -0
  3. package/commonjs/src/templates.js +64 -0
  4. package/es6/src/cli.js +9 -3
  5. package/es6/src/scaffold.js +38 -0
  6. package/es6/src/templates.js +40 -0
  7. package/package.json +3 -8
  8. package/types/src/scaffold.d.ts +4 -0
  9. package/types/src/templates.d.ts +4 -0
  10. package/commonjs/src/domain/prompt.js +0 -64
  11. package/commonjs/src/models/compose.model.js +0 -138
  12. package/commonjs/src/models/config-yaml.model.js +0 -88
  13. package/commonjs/src/models/const.js +0 -31
  14. package/commonjs/src/models/dev-container.model.js +0 -100
  15. package/commonjs/src/models/docker-image.model.js +0 -221
  16. package/commonjs/src/models/env-file.model.js +0 -47
  17. package/commonjs/src/models/gitignore.model.js +0 -31
  18. package/commonjs/src/models/launch-json.model.js +0 -74
  19. package/commonjs/src/models/package-json.model.js +0 -133
  20. package/commonjs/src/models/project.model.js +0 -134
  21. package/commonjs/src/models/source-file.js +0 -6
  22. package/commonjs/src/models/tsconfig.model.js +0 -34
  23. package/commonjs/src/models/vscode-settings.model.js +0 -31
  24. package/commonjs/src/program.js +0 -135
  25. package/commonjs/src/resolve-target-dir.js +0 -19
  26. package/commonjs/src/runner.js +0 -144
  27. package/commonjs/src/services/scaffold.service.js +0 -62
  28. package/commonjs/src/version.js +0 -50
  29. package/commonjs/src/webapi/api-name.js +0 -95
  30. package/commonjs/src/webapi/const.js +0 -50
  31. package/commonjs/src/webapi/create-api.js +0 -285
  32. package/commonjs/src/webapi/features/auth.feature.js +0 -463
  33. package/commonjs/src/webapi/features/auth0-cli.js +0 -406
  34. package/commonjs/src/webapi/features/biome-format.js +0 -49
  35. package/commonjs/src/webapi/features/database.feature.js +0 -273
  36. package/commonjs/src/webapi/features/finalize.feature.js +0 -91
  37. package/commonjs/src/webapi/features/postman.feature.js +0 -319
  38. package/commonjs/src/webapi/models/api-package-json.model.js +0 -63
  39. package/commonjs/src/webapi/models/auth-config.model.js +0 -26
  40. package/commonjs/src/webapi/models/controller-source-file.model.js +0 -188
  41. package/commonjs/src/webapi/models/github-ci.model.js +0 -193
  42. package/commonjs/src/webapi/models/main-source-file.model.js +0 -165
  43. package/commonjs/src/webapi/models/production-dockerfile.model.js +0 -138
  44. package/commonjs/src/webapi/models/sample-files.model.js +0 -60
  45. package/commonjs/src/webapi/models/webapi-image.model.js +0 -22
  46. package/commonjs/src/webapi/postman/hello-openapi.js +0 -175
  47. package/commonjs/src/webapi/postman/local-view.js +0 -184
  48. package/commonjs/src/webapi/postman/openapi-to-postman.js +0 -202
  49. package/es6/src/domain/prompt.js +0 -43
  50. package/es6/src/models/compose.model.js +0 -132
  51. package/es6/src/models/config-yaml.model.js +0 -76
  52. package/es6/src/models/const.js +0 -21
  53. package/es6/src/models/dev-container.model.js +0 -90
  54. package/es6/src/models/docker-image.model.js +0 -185
  55. package/es6/src/models/env-file.model.js +0 -43
  56. package/es6/src/models/gitignore.model.js +0 -21
  57. package/es6/src/models/launch-json.model.js +0 -64
  58. package/es6/src/models/package-json.model.js +0 -129
  59. package/es6/src/models/project.model.js +0 -119
  60. package/es6/src/models/source-file.js +0 -3
  61. package/es6/src/models/tsconfig.model.js +0 -24
  62. package/es6/src/models/vscode-settings.model.js +0 -21
  63. package/es6/src/program.js +0 -76
  64. package/es6/src/resolve-target-dir.js +0 -9
  65. package/es6/src/runner.js +0 -146
  66. package/es6/src/services/scaffold.service.js +0 -52
  67. package/es6/src/version.js +0 -32
  68. package/es6/src/webapi/api-name.js +0 -59
  69. package/es6/src/webapi/const.js +0 -20
  70. package/es6/src/webapi/create-api.js +0 -265
  71. package/es6/src/webapi/features/auth.feature.js +0 -412
  72. package/es6/src/webapi/features/auth0-cli.js +0 -348
  73. package/es6/src/webapi/features/biome-format.js +0 -42
  74. package/es6/src/webapi/features/database.feature.js +0 -263
  75. package/es6/src/webapi/features/finalize.feature.js +0 -81
  76. package/es6/src/webapi/features/postman.feature.js +0 -253
  77. package/es6/src/webapi/models/api-package-json.model.js +0 -58
  78. package/es6/src/webapi/models/auth-config.model.js +0 -22
  79. package/es6/src/webapi/models/controller-source-file.model.js +0 -179
  80. package/es6/src/webapi/models/github-ci.model.js +0 -186
  81. package/es6/src/webapi/models/main-source-file.model.js +0 -161
  82. package/es6/src/webapi/models/production-dockerfile.model.js +0 -126
  83. package/es6/src/webapi/models/sample-files.model.js +0 -42
  84. package/es6/src/webapi/models/webapi-image.model.js +0 -12
  85. package/es6/src/webapi/postman/hello-openapi.js +0 -168
  86. package/es6/src/webapi/postman/local-view.js +0 -169
  87. package/es6/src/webapi/postman/openapi-to-postman.js +0 -179
  88. package/pack-builder-tgz.mjs +0 -177
  89. package/types/src/domain/prompt.d.ts +0 -4
  90. package/types/src/models/compose.model.d.ts +0 -59
  91. package/types/src/models/config-yaml.model.d.ts +0 -27
  92. package/types/src/models/const.d.ts +0 -19
  93. package/types/src/models/dev-container.model.d.ts +0 -33
  94. package/types/src/models/docker-image.model.d.ts +0 -56
  95. package/types/src/models/env-file.model.d.ts +0 -15
  96. package/types/src/models/gitignore.model.d.ts +0 -6
  97. package/types/src/models/launch-json.model.d.ts +0 -7
  98. package/types/src/models/package-json.model.d.ts +0 -32
  99. package/types/src/models/project.model.d.ts +0 -60
  100. package/types/src/models/source-file.d.ts +0 -11
  101. package/types/src/models/tsconfig.model.d.ts +0 -5
  102. package/types/src/models/vscode-settings.model.d.ts +0 -7
  103. package/types/src/program.d.ts +0 -3
  104. package/types/src/resolve-target-dir.d.ts +0 -5
  105. package/types/src/runner.d.ts +0 -15
  106. package/types/src/services/scaffold.service.d.ts +0 -22
  107. package/types/src/version.d.ts +0 -4
  108. package/types/src/webapi/api-name.d.ts +0 -14
  109. package/types/src/webapi/const.d.ts +0 -17
  110. package/types/src/webapi/create-api.d.ts +0 -15
  111. package/types/src/webapi/features/auth.feature.d.ts +0 -10
  112. package/types/src/webapi/features/auth0-cli.d.ts +0 -72
  113. package/types/src/webapi/features/biome-format.d.ts +0 -5
  114. package/types/src/webapi/features/database.feature.d.ts +0 -5
  115. package/types/src/webapi/features/finalize.feature.d.ts +0 -2
  116. package/types/src/webapi/features/postman.feature.d.ts +0 -16
  117. package/types/src/webapi/models/api-package-json.model.d.ts +0 -18
  118. package/types/src/webapi/models/auth-config.model.d.ts +0 -26
  119. package/types/src/webapi/models/controller-source-file.model.d.ts +0 -45
  120. package/types/src/webapi/models/github-ci.model.d.ts +0 -9
  121. package/types/src/webapi/models/main-source-file.model.d.ts +0 -54
  122. package/types/src/webapi/models/production-dockerfile.model.d.ts +0 -20
  123. package/types/src/webapi/models/sample-files.model.d.ts +0 -7
  124. package/types/src/webapi/models/webapi-image.model.d.ts +0 -5
  125. package/types/src/webapi/postman/hello-openapi.d.ts +0 -19
  126. package/types/src/webapi/postman/local-view.d.ts +0 -17
  127. package/types/src/webapi/postman/openapi-to-postman.d.ts +0 -62
@@ -1,406 +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 Auth0AuthError () {
13
- return Auth0AuthError;
14
- },
15
- get DB_CONNECTION_NAME () {
16
- return DB_CONNECTION_NAME;
17
- },
18
- get HELLO_API_SCOPES () {
19
- return HELLO_API_SCOPES;
20
- },
21
- get REQUIRED_SCOPES () {
22
- return REQUIRED_SCOPES;
23
- },
24
- get createAdminDatabaseUser () {
25
- return createAdminDatabaseUser;
26
- },
27
- get createApi () {
28
- return createApi;
29
- },
30
- get createSpaApp () {
31
- return createSpaApp;
32
- },
33
- get enableConnectionForClient () {
34
- return enableConnectionForClient;
35
- },
36
- get ensureSpaApp () {
37
- return ensureSpaApp;
38
- },
39
- get findUserByEmail () {
40
- return findUserByEmail;
41
- },
42
- get generateAdminPassword () {
43
- return generateAdminPassword;
44
- },
45
- get isInstalled () {
46
- return isInstalled;
47
- },
48
- get listApis () {
49
- return listApis;
50
- },
51
- get listApps () {
52
- return listApps;
53
- },
54
- get listTenants () {
55
- return listTenants;
56
- },
57
- get login () {
58
- return login;
59
- },
60
- get updateApiScopes () {
61
- return updateApiScopes;
62
- },
63
- get updateSpaCallbacks () {
64
- return updateSpaCallbacks;
65
- },
66
- get updateUserPassword () {
67
- return updateUserPassword;
68
- }
69
- });
70
- const _nodechild_process = require("node:child_process");
71
- const _nodecrypto = require("node:crypto");
72
- /** Management API scopes needed for API, SPA, connections, and admin users. */ const REQUIRED_SCOPES = [
73
- "create:clients",
74
- "read:clients",
75
- "update:clients",
76
- "create:resource_servers",
77
- "read:resource_servers",
78
- "update:resource_servers",
79
- "read:connections",
80
- "update:connections",
81
- "create:users",
82
- "read:users",
83
- "update:users"
84
- ].join(",");
85
- /** Hard timeout for any Management API call. Prevents indefinite hangs on token re-auth. */ const API_TIMEOUT_MS = 8_000;
86
- const HELLO_API_SCOPES = [
87
- "read:Hello",
88
- "create:Hello",
89
- "update:Hello",
90
- "delete:Hello"
91
- ];
92
- const DB_CONNECTION_NAME = "Username-Password-Authentication";
93
- class Auth0AuthError extends Error {
94
- constructor(message){
95
- super(message);
96
- this.name = "Auth0AuthError";
97
- }
98
- }
99
- /** Returns true if an error or stderr output looks like an expired/missing token. */ function isAuthError(text) {
100
- return text.includes("renew access token") || text.includes("log in") || text.includes("Unauthorized");
101
- }
102
- /** Strip Auth0 CLI banner lines before JSON. */ function parseJsonOutput(stdout) {
103
- const start = stdout.indexOf("{");
104
- const arrayStart = stdout.indexOf("[");
105
- let idx = -1;
106
- if (start === -1) idx = arrayStart;
107
- else if (arrayStart === -1) idx = start;
108
- else idx = Math.min(start, arrayStart);
109
- if (idx < 0) throw new Error(`Expected JSON from auth0 CLI, got: ${stdout.slice(0, 200)}`);
110
- return JSON.parse(stdout.slice(idx));
111
- }
112
- /** Run an auth0 CLI command with a hard timeout. Returns stdout on success, throws on failure. */ function runAuth0(args) {
113
- const result = (0, _nodechild_process.spawnSync)("auth0", args, {
114
- encoding: "utf8",
115
- timeout: API_TIMEOUT_MS,
116
- input: "",
117
- stdio: "pipe"
118
- });
119
- if (result.error) {
120
- const msg = result.error.message;
121
- if (isAuthError(msg) || result.error.code === "ETIMEDOUT") {
122
- throw new Auth0AuthError(msg);
123
- }
124
- throw result.error;
125
- }
126
- if (result.status !== 0) {
127
- const stderr = result.stderr ?? "";
128
- if (isAuthError(stderr)) throw new Auth0AuthError(stderr);
129
- throw new Error(stderr || `auth0 exited with code ${result.status}`);
130
- }
131
- return result.stdout;
132
- }
133
- function isInstalled() {
134
- try {
135
- (0, _nodechild_process.execFileSync)("auth0", [
136
- "--version"
137
- ], {
138
- stdio: "pipe"
139
- });
140
- return true;
141
- } catch {
142
- return false;
143
- }
144
- }
145
- function listTenants() {
146
- try {
147
- const out = (0, _nodechild_process.execFileSync)("auth0", [
148
- "tenants",
149
- "list",
150
- "--json"
151
- ], {
152
- encoding: "utf8",
153
- stdio: "pipe"
154
- });
155
- return JSON.parse(out);
156
- } catch {
157
- return [];
158
- }
159
- }
160
- function login() {
161
- const result = (0, _nodechild_process.spawnSync)("auth0", [
162
- "login",
163
- "--scopes",
164
- REQUIRED_SCOPES
165
- ], {
166
- stdio: "inherit"
167
- });
168
- return result.status === 0;
169
- }
170
- function listApis() {
171
- try {
172
- const out = runAuth0([
173
- "apis",
174
- "list",
175
- "--json",
176
- "--no-input"
177
- ]);
178
- return parseJsonOutput(out);
179
- } catch (err) {
180
- if (err instanceof Auth0AuthError) throw err;
181
- return [];
182
- }
183
- }
184
- function createApi(name, identifier, scopes = HELLO_API_SCOPES) {
185
- const out = runAuth0([
186
- "apis",
187
- "create",
188
- "--name",
189
- name,
190
- "--identifier",
191
- identifier,
192
- "--scopes",
193
- scopes.join(","),
194
- // RBAC: only permissions assigned to the user/role appear on the token.
195
- "--enforce-policies",
196
- // Include Auth0 `permissions[]` claim (consumed by sample principalMapper).
197
- "--token-dialect",
198
- "access_token_authz",
199
- "--json",
200
- "--no-input"
201
- ]);
202
- return parseJsonOutput(out);
203
- }
204
- function updateApiScopes(identifier, scopes = HELLO_API_SCOPES) {
205
- runAuth0([
206
- "apis",
207
- "update",
208
- identifier,
209
- "--scopes",
210
- scopes.join(","),
211
- "--enforce-policies",
212
- "--token-dialect",
213
- "access_token_authz",
214
- "--no-input"
215
- ]);
216
- }
217
- function createSpaApp(name, callbackUrls) {
218
- const callbacks = typeof callbackUrls === "string" ? callbackUrls : callbackUrls.join(",");
219
- const out = runAuth0([
220
- "apps",
221
- "create",
222
- "--name",
223
- name,
224
- "--type",
225
- "spa",
226
- "--callbacks",
227
- callbacks,
228
- "--json",
229
- "--no-input"
230
- ]);
231
- const app = parseJsonOutput(out);
232
- const clientId = app.client_id ?? app.clientId;
233
- if (!clientId) {
234
- throw new Error(`Auth0 create SPA response missing client_id. stdout: ${out.slice(0, 300)}`);
235
- }
236
- return {
237
- client_id: clientId
238
- };
239
- }
240
- function listApps() {
241
- try {
242
- const out = runAuth0([
243
- "apps",
244
- "list",
245
- "--json",
246
- "--no-input"
247
- ]);
248
- const apps = parseJsonOutput(out);
249
- return apps.map((a)=>({
250
- client_id: a.client_id ?? a.clientId ?? "",
251
- name: a.name ?? ""
252
- })).filter((a)=>a.client_id && a.name);
253
- } catch (err) {
254
- if (err instanceof Auth0AuthError) throw err;
255
- return [];
256
- }
257
- }
258
- function updateSpaCallbacks(clientId, callbackUrls) {
259
- const callbacks = typeof callbackUrls === "string" ? callbackUrls : callbackUrls.join(",");
260
- runAuth0([
261
- "apps",
262
- "update",
263
- clientId,
264
- "--callbacks",
265
- callbacks,
266
- "--no-input"
267
- ]);
268
- }
269
- function ensureSpaApp(name, callbackUrls) {
270
- const existing = listApps().find((a)=>a.name === name);
271
- if (existing) {
272
- try {
273
- updateSpaCallbacks(existing.client_id, callbackUrls);
274
- } catch {
275
- // Callbacks may already match; still usable for Postman.
276
- }
277
- return {
278
- client_id: existing.client_id,
279
- reused: true
280
- };
281
- }
282
- return {
283
- ...createSpaApp(name, callbackUrls),
284
- reused: false
285
- };
286
- }
287
- function enableConnectionForClient(connectionName, clientId) {
288
- const listOut = runAuth0([
289
- "api",
290
- "get",
291
- "connections",
292
- "--no-input"
293
- ]);
294
- const connections = parseJsonOutput(listOut);
295
- const connection = connections.find((c)=>c.name === connectionName);
296
- if (!connection) {
297
- throw new Error(`Auth0 connection not found: ${connectionName}`);
298
- }
299
- const clientsOut = runAuth0([
300
- "api",
301
- "get",
302
- `connections/${connection.id}/clients`,
303
- "--no-input"
304
- ]);
305
- const { clients } = parseJsonOutput(clientsOut);
306
- if (clients.some((c)=>c.client_id === clientId)) return;
307
- // Dedicated enabled-clients endpoint (enabled_clients on connection PATCH is deprecated).
308
- runAuth0([
309
- "api",
310
- "patch",
311
- `connections/${connection.id}/clients`,
312
- "--data",
313
- JSON.stringify([
314
- {
315
- client_id: clientId,
316
- status: true
317
- }
318
- ]),
319
- "--no-input"
320
- ]);
321
- }
322
- function generateAdminPassword() {
323
- return `${(0, _nodecrypto.randomBytes)(12).toString("base64url")}aA1!`;
324
- }
325
- function isUserAlreadyExistsError(err) {
326
- const text = err instanceof Error ? err.message : String(err);
327
- return /already exists|user exists|Conflict|409/i.test(text);
328
- }
329
- function findUserByEmail(email) {
330
- const out = runAuth0([
331
- "api",
332
- "get",
333
- `users-by-email?email=${encodeURIComponent(email)}`,
334
- "--no-input"
335
- ]);
336
- const users = parseJsonOutput(out);
337
- const user = users.find((u)=>u.user_id && u.email);
338
- if (!user?.user_id || !user.email) return null;
339
- return {
340
- user_id: user.user_id,
341
- email: user.email
342
- };
343
- }
344
- function updateUserPassword(userId, password) {
345
- runAuth0([
346
- "api",
347
- "patch",
348
- `users/${encodeURIComponent(userId)}`,
349
- "--data",
350
- JSON.stringify({
351
- password,
352
- connection: DB_CONNECTION_NAME
353
- }),
354
- "--no-input"
355
- ]);
356
- }
357
- function createAdminDatabaseUser(input) {
358
- const body = {
359
- email: input.email,
360
- connection: DB_CONNECTION_NAME,
361
- password: input.password,
362
- name: input.username,
363
- email_verified: true,
364
- verify_email: false,
365
- app_metadata: {
366
- roles: [
367
- "admin"
368
- ]
369
- }
370
- };
371
- try {
372
- const out = runAuth0([
373
- "api",
374
- "post",
375
- "users",
376
- "--data",
377
- JSON.stringify(body),
378
- "--no-input"
379
- ]);
380
- const user = parseJsonOutput(out);
381
- if (!user.user_id || !user.email) {
382
- throw new Error(`Auth0 create user response missing user_id/email. stdout: ${out.slice(0, 300)}`);
383
- }
384
- return {
385
- user_id: user.user_id,
386
- email: user.email,
387
- password: input.password,
388
- username: input.username
389
- };
390
- } catch (err) {
391
- if (!isUserAlreadyExistsError(err)) throw err;
392
- const existing = findUserByEmail(input.email);
393
- if (!existing) {
394
- throw new Error(`Auth0 user already exists for ${input.email}, but lookup by email returned no user.`);
395
- }
396
- updateUserPassword(existing.user_id, input.password);
397
- return {
398
- user_id: existing.user_id,
399
- email: existing.email,
400
- password: input.password,
401
- username: input.username
402
- };
403
- }
404
- }
405
-
406
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL2F1dGgwLWNsaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjRmlsZVN5bmMsIHNwYXduU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbi8qKiBNYW5hZ2VtZW50IEFQSSBzY29wZXMgbmVlZGVkIGZvciBBUEksIFNQQSwgY29ubmVjdGlvbnMsIGFuZCBhZG1pbiB1c2Vycy4gKi9cbmNvbnN0IFJFUVVJUkVEX1NDT1BFUyA9IFtcblx0XCJjcmVhdGU6Y2xpZW50c1wiLFxuXHRcInJlYWQ6Y2xpZW50c1wiLFxuXHRcInVwZGF0ZTpjbGllbnRzXCIsXG5cdFwiY3JlYXRlOnJlc291cmNlX3NlcnZlcnNcIixcblx0XCJyZWFkOnJlc291cmNlX3NlcnZlcnNcIixcblx0XCJ1cGRhdGU6cmVzb3VyY2Vfc2VydmVyc1wiLFxuXHRcInJlYWQ6Y29ubmVjdGlvbnNcIixcblx0XCJ1cGRhdGU6Y29ubmVjdGlvbnNcIixcblx0XCJjcmVhdGU6dXNlcnNcIixcblx0XCJyZWFkOnVzZXJzXCIsXG5cdFwidXBkYXRlOnVzZXJzXCIsXG5dLmpvaW4oXCIsXCIpO1xuXG4vKiogSGFyZCB0aW1lb3V0IGZvciBhbnkgTWFuYWdlbWVudCBBUEkgY2FsbC4gUHJldmVudHMgaW5kZWZpbml0ZSBoYW5ncyBvbiB0b2tlbiByZS1hdXRoLiAqL1xuY29uc3QgQVBJX1RJTUVPVVRfTVMgPSA4XzAwMDtcblxuLyoqIERlZmF1bHQgQVBJIHNjb3BlcyBtYXRjaGluZyBIZWxsbyBDQVNMIEF1dGhvcml6ZSBkZWNvcmF0b3JzLiAqL1xuZXhwb3J0IGNvbnN0IEhFTExPX0FQSV9TQ09QRVMgPSBbXG5cdFwicmVhZDpIZWxsb1wiLFxuXHRcImNyZWF0ZTpIZWxsb1wiLFxuXHRcInVwZGF0ZTpIZWxsb1wiLFxuXHRcImRlbGV0ZTpIZWxsb1wiLFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IERCX0NPTk5FQ1RJT05fTkFNRSA9IFwiVXNlcm5hbWUtUGFzc3dvcmQtQXV0aGVudGljYXRpb25cIjtcblxuZXhwb3J0IGNsYXNzIEF1dGgwQXV0aEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG5cdFx0c3VwZXIobWVzc2FnZSk7XG5cdFx0dGhpcy5uYW1lID0gXCJBdXRoMEF1dGhFcnJvclwiO1xuXHR9XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb3Igc3RkZXJyIG91dHB1dCBsb29rcyBsaWtlIGFuIGV4cGlyZWQvbWlzc2luZyB0b2tlbi4gKi9cbmZ1bmN0aW9uIGlzQXV0aEVycm9yKHRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdHRleHQuaW5jbHVkZXMoXCJyZW5ldyBhY2Nlc3MgdG9rZW5cIikgfHxcblx0XHR0ZXh0LmluY2x1ZGVzKFwibG9nIGluXCIpIHx8XG5cdFx0dGV4dC5pbmNsdWRlcyhcIlVuYXV0aG9yaXplZFwiKVxuXHQpO1xufVxuXG4vKiogU3RyaXAgQXV0aDAgQ0xJIGJhbm5lciBsaW5lcyBiZWZvcmUgSlNPTi4gKi9cbmZ1bmN0aW9uIHBhcnNlSnNvbk91dHB1dDxUPihzdGRvdXQ6IHN0cmluZyk6IFQge1xuXHRjb25zdCBzdGFydCA9IHN0ZG91dC5pbmRleE9mKFwie1wiKTtcblx0Y29uc3QgYXJyYXlTdGFydCA9IHN0ZG91dC5pbmRleE9mKFwiW1wiKTtcblx0bGV0IGlkeCA9IC0xO1xuXHRpZiAoc3RhcnQgPT09IC0xKSBpZHggPSBhcnJheVN0YXJ0O1xuXHRlbHNlIGlmIChhcnJheVN0YXJ0ID09PSAtMSkgaWR4ID0gc3RhcnQ7XG5cdGVsc2UgaWR4ID0gTWF0aC5taW4oc3RhcnQsIGFycmF5U3RhcnQpO1xuXHRpZiAoaWR4IDwgMCkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBKU09OIGZyb20gYXV0aDAgQ0xJLCBnb3Q6ICR7c3Rkb3V0LnNsaWNlKDAsIDIwMCl9YCk7XG5cdHJldHVybiBKU09OLnBhcnNlKHN0ZG91dC5zbGljZShpZHgpKSBhcyBUO1xufVxuXG4vKiogUnVuIGFuIGF1dGgwIENMSSBjb21tYW5kIHdpdGggYSBoYXJkIHRpbWVvdXQuIFJldHVybnMgc3Rkb3V0IG9uIHN1Y2Nlc3MsIHRocm93cyBvbiBmYWlsdXJlLiAqL1xuZnVuY3Rpb24gcnVuQXV0aDAoYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuXHRjb25zdCByZXN1bHQgPSBzcGF3blN5bmMoXCJhdXRoMFwiLCBhcmdzLCB7XG5cdFx0ZW5jb2Rpbmc6IFwidXRmOFwiLFxuXHRcdHRpbWVvdXQ6IEFQSV9USU1FT1VUX01TLFxuXHRcdGlucHV0OiBcIlwiLFxuXHRcdHN0ZGlvOiBcInBpcGVcIixcblx0fSk7XG5cblx0aWYgKHJlc3VsdC5lcnJvcikge1xuXHRcdGNvbnN0IG1zZyA9IHJlc3VsdC5lcnJvci5tZXNzYWdlO1xuXHRcdGlmIChpc0F1dGhFcnJvcihtc2cpIHx8IChyZXN1bHQuZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSBcIkVUSU1FRE9VVFwiKSB7XG5cdFx0XHR0aHJvdyBuZXcgQXV0aDBBdXRoRXJyb3IobXNnKTtcblx0XHR9XG5cdFx0dGhyb3cgcmVzdWx0LmVycm9yO1xuXHR9XG5cblx0aWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcblx0XHRjb25zdCBzdGRlcnIgPSByZXN1bHQuc3RkZXJyID8/IFwiXCI7XG5cdFx0aWYgKGlzQXV0aEVycm9yKHN0ZGVycikpIHRocm93IG5ldyBBdXRoMEF1dGhFcnJvcihzdGRlcnIpO1xuXHRcdHRocm93IG5ldyBFcnJvcihzdGRlcnIgfHwgYGF1dGgwIGV4aXRlZCB3aXRoIGNvZGUgJHtyZXN1bHQuc3RhdHVzfWApO1xuXHR9XG5cblx0cmV0dXJuIHJlc3VsdC5zdGRvdXQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aDBUZW5hbnQge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGFjdGl2ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0luc3RhbGxlZCgpOiBib29sZWFuIHtcblx0dHJ5IHtcblx0XHRleGVjRmlsZVN5bmMoXCJhdXRoMFwiLCBbXCItLXZlcnNpb25cIl0sIHsgc3RkaW86IFwicGlwZVwiIH0pO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RUZW5hbnRzKCk6IEF1dGgwVGVuYW50W10ge1xuXHR0cnkge1xuXHRcdGNvbnN0IG91dCA9IGV4ZWNGaWxlU3luYyhcImF1dGgwXCIsIFtcInRlbmFudHNcIiwgXCJsaXN0XCIsIFwiLS1qc29uXCJdLCB7XG5cdFx0XHRlbmNvZGluZzogXCJ1dGY4XCIsXG5cdFx0XHRzdGRpbzogXCJwaXBlXCIsXG5cdFx0fSk7XG5cdFx0cmV0dXJuIEpTT04ucGFyc2Uob3V0KSBhcyBBdXRoMFRlbmFudFtdO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gW107XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvZ2luKCk6IGJvb2xlYW4ge1xuXHRjb25zdCByZXN1bHQgPSBzcGF3blN5bmMoXCJhdXRoMFwiLCBbXCJsb2dpblwiLCBcIi0tc2NvcGVzXCIsIFJFUVVJUkVEX1NDT1BFU10sIHtcblx0XHRzdGRpbzogXCJpbmhlcml0XCIsXG5cdH0pO1xuXHRyZXR1cm4gcmVzdWx0LnN0YXR1cyA9PT0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RBcGlzKCk6IEFycmF5PHsgaWRlbnRpZmllcjogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT4ge1xuXHR0cnkge1xuXHRcdGNvbnN0IG91dCA9IHJ1bkF1dGgwKFtcImFwaXNcIiwgXCJsaXN0XCIsIFwiLS1qc29uXCIsIFwiLS1uby1pbnB1dFwiXSk7XG5cdFx0cmV0dXJuIHBhcnNlSnNvbk91dHB1dChvdXQpO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRpZiAoZXJyIGluc3RhbmNlb2YgQXV0aDBBdXRoRXJyb3IpIHRocm93IGVycjtcblx0XHRyZXR1cm4gW107XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFwaShcblx0bmFtZTogc3RyaW5nLFxuXHRpZGVudGlmaWVyOiBzdHJpbmcsXG5cdHNjb3BlczogcmVhZG9ubHkgc3RyaW5nW10gPSBIRUxMT19BUElfU0NPUEVTLFxuKTogeyBpZGVudGlmaWVyOiBzdHJpbmcgfSB7XG5cdGNvbnN0IG91dCA9IHJ1bkF1dGgwKFtcblx0XHRcImFwaXNcIixcblx0XHRcImNyZWF0ZVwiLFxuXHRcdFwiLS1uYW1lXCIsXG5cdFx0bmFtZSxcblx0XHRcIi0taWRlbnRpZmllclwiLFxuXHRcdGlkZW50aWZpZXIsXG5cdFx0XCItLXNjb3Blc1wiLFxuXHRcdHNjb3Blcy5qb2luKFwiLFwiKSxcblx0XHQvLyBSQkFDOiBvbmx5IHBlcm1pc3Npb25zIGFzc2lnbmVkIHRvIHRoZSB1c2VyL3JvbGUgYXBwZWFyIG9uIHRoZSB0b2tlbi5cblx0XHRcIi0tZW5mb3JjZS1wb2xpY2llc1wiLFxuXHRcdC8vIEluY2x1ZGUgQXV0aDAgYHBlcm1pc3Npb25zW11gIGNsYWltIChjb25zdW1lZCBieSBzYW1wbGUgcHJpbmNpcGFsTWFwcGVyKS5cblx0XHRcIi0tdG9rZW4tZGlhbGVjdFwiLFxuXHRcdFwiYWNjZXNzX3Rva2VuX2F1dGh6XCIsXG5cdFx0XCItLWpzb25cIixcblx0XHRcIi0tbm8taW5wdXRcIixcblx0XSk7XG5cdHJldHVybiBwYXJzZUpzb25PdXRwdXQob3V0KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGFuIEFQSSdzIHNjb3BlcyBhbmQgZW5hYmxlIFJCQUMgcG9saWN5IGVuZm9yY2VtZW50LlxuICogQXV0aDAgQ0xJIGAtLXNjb3Blc2AgcmVwbGFjZXMgdGhlIGZ1bGwgc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQXBpU2NvcGVzKFxuXHRpZGVudGlmaWVyOiBzdHJpbmcsXG5cdHNjb3BlczogcmVhZG9ubHkgc3RyaW5nW10gPSBIRUxMT19BUElfU0NPUEVTLFxuKTogdm9pZCB7XG5cdHJ1bkF1dGgwKFtcblx0XHRcImFwaXNcIixcblx0XHRcInVwZGF0ZVwiLFxuXHRcdGlkZW50aWZpZXIsXG5cdFx0XCItLXNjb3Blc1wiLFxuXHRcdHNjb3Blcy5qb2luKFwiLFwiKSxcblx0XHRcIi0tZW5mb3JjZS1wb2xpY2llc1wiLFxuXHRcdFwiLS10b2tlbi1kaWFsZWN0XCIsXG5cdFx0XCJhY2Nlc3NfdG9rZW5fYXV0aHpcIixcblx0XHRcIi0tbm8taW5wdXRcIixcblx0XSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTcGFBcHAoXG5cdG5hbWU6IHN0cmluZyxcblx0Y2FsbGJhY2tVcmxzOiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXSxcbik6IHsgY2xpZW50X2lkOiBzdHJpbmcgfSB7XG5cdGNvbnN0IGNhbGxiYWNrcyA9IHR5cGVvZiBjYWxsYmFja1VybHMgPT09IFwic3RyaW5nXCIgPyBjYWxsYmFja1VybHMgOiBjYWxsYmFja1VybHMuam9pbihcIixcIik7XG5cdGNvbnN0IG91dCA9IHJ1bkF1dGgwKFtcblx0XHRcImFwcHNcIixcblx0XHRcImNyZWF0ZVwiLFxuXHRcdFwiLS1uYW1lXCIsXG5cdFx0bmFtZSxcblx0XHRcIi0tdHlwZVwiLFxuXHRcdFwic3BhXCIsXG5cdFx0XCItLWNhbGxiYWNrc1wiLFxuXHRcdGNhbGxiYWNrcyxcblx0XHRcIi0tanNvblwiLFxuXHRcdFwiLS1uby1pbnB1dFwiLFxuXHRdKTtcblx0Y29uc3QgYXBwID0gcGFyc2VKc29uT3V0cHV0PHsgY2xpZW50X2lkPzogc3RyaW5nOyBjbGllbnRJZD86IHN0cmluZyB9PihvdXQpO1xuXHRjb25zdCBjbGllbnRJZCA9IGFwcC5jbGllbnRfaWQgPz8gYXBwLmNsaWVudElkO1xuXHRpZiAoIWNsaWVudElkKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0YEF1dGgwIGNyZWF0ZSBTUEEgcmVzcG9uc2UgbWlzc2luZyBjbGllbnRfaWQuIHN0ZG91dDogJHtvdXQuc2xpY2UoMCwgMzAwKX1gLFxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHsgY2xpZW50X2lkOiBjbGllbnRJZCB9O1xufVxuXG5leHBvcnQgdHlwZSBBdXRoMEFwcCA9IHsgY2xpZW50X2lkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdEFwcHMoKTogQXV0aDBBcHBbXSB7XG5cdHRyeSB7XG5cdFx0Y29uc3Qgb3V0ID0gcnVuQXV0aDAoW1wiYXBwc1wiLCBcImxpc3RcIiwgXCItLWpzb25cIiwgXCItLW5vLWlucHV0XCJdKTtcblx0XHRjb25zdCBhcHBzID1cblx0XHRcdHBhcnNlSnNvbk91dHB1dDxBcnJheTx7IGNsaWVudF9pZD86IHN0cmluZzsgY2xpZW50SWQ/OiBzdHJpbmc7IG5hbWU/OiBzdHJpbmcgfT4+KG91dCk7XG5cdFx0cmV0dXJuIGFwcHNcblx0XHRcdC5tYXAoKGEpID0+ICh7XG5cdFx0XHRcdGNsaWVudF9pZDogYS5jbGllbnRfaWQgPz8gYS5jbGllbnRJZCA/PyBcIlwiLFxuXHRcdFx0XHRuYW1lOiBhLm5hbWUgPz8gXCJcIixcblx0XHRcdH0pKVxuXHRcdFx0LmZpbHRlcigoYSkgPT4gYS5jbGllbnRfaWQgJiYgYS5uYW1lKTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0aWYgKGVyciBpbnN0YW5jZW9mIEF1dGgwQXV0aEVycm9yKSB0aHJvdyBlcnI7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTcGFDYWxsYmFja3MoXG5cdGNsaWVudElkOiBzdHJpbmcsXG5cdGNhbGxiYWNrVXJsczogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW10sXG4pOiB2b2lkIHtcblx0Y29uc3QgY2FsbGJhY2tzID0gdHlwZW9mIGNhbGxiYWNrVXJscyA9PT0gXCJzdHJpbmdcIiA/IGNhbGxiYWNrVXJscyA6IGNhbGxiYWNrVXJscy5qb2luKFwiLFwiKTtcblx0cnVuQXV0aDAoW1wiYXBwc1wiLCBcInVwZGF0ZVwiLCBjbGllbnRJZCwgXCItLWNhbGxiYWNrc1wiLCBjYWxsYmFja3MsIFwiLS1uby1pbnB1dFwiXSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgUG9zdG1hbiBTUEEsIG9yIHJldXNlIGFuIGV4aXN0aW5nIGFwcCB3aXRoIHRoZSBzYW1lIG5hbWUgKHJlLXNjYWZmb2xkKS5cbiAqIEFsd2F5cyByZXR1cm5zIGEgY2xpZW50X2lkIHN1aXRhYmxlIGZvciBQb3N0bWFuIGF1dGgwQ2xpZW50SWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVTcGFBcHAoXG5cdG5hbWU6IHN0cmluZyxcblx0Y2FsbGJhY2tVcmxzOiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXSxcbik6IHsgY2xpZW50X2lkOiBzdHJpbmc7IHJldXNlZDogYm9vbGVhbiB9IHtcblx0Y29uc3QgZXhpc3RpbmcgPSBsaXN0QXBwcygpLmZpbmQoKGEpID0+IGEubmFtZSA9PT0gbmFtZSk7XG5cdGlmIChleGlzdGluZykge1xuXHRcdHRyeSB7XG5cdFx0XHR1cGRhdGVTcGFDYWxsYmFja3MoZXhpc3RpbmcuY2xpZW50X2lkLCBjYWxsYmFja1VybHMpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0Ly8gQ2FsbGJhY2tzIG1heSBhbHJlYWR5IG1hdGNoOyBzdGlsbCB1c2FibGUgZm9yIFBvc3RtYW4uXG5cdFx0fVxuXHRcdHJldHVybiB7IGNsaWVudF9pZDogZXhpc3RpbmcuY2xpZW50X2lkLCByZXVzZWQ6IHRydWUgfTtcblx0fVxuXHRyZXR1cm4geyAuLi5jcmVhdGVTcGFBcHAobmFtZSwgY2FsbGJhY2tVcmxzKSwgcmV1c2VkOiBmYWxzZSB9O1xufVxuXG50eXBlIEF1dGgwQ29ubmVjdGlvbiA9IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBzdHJhdGVneTogc3RyaW5nIH07XG5cbi8qKiBFbmFibGUgYSBkYXRhYmFzZSBjb25uZWN0aW9uIGZvciBhbiBhcHBsaWNhdGlvbiAocmVxdWlyZWQgZm9yIHVzZXJuYW1lL3Bhc3N3b3JkIGxvZ2luKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVDb25uZWN0aW9uRm9yQ2xpZW50KGNvbm5lY3Rpb25OYW1lOiBzdHJpbmcsIGNsaWVudElkOiBzdHJpbmcpOiB2b2lkIHtcblx0Y29uc3QgbGlzdE91dCA9IHJ1bkF1dGgwKFtcImFwaVwiLCBcImdldFwiLCBcImNvbm5lY3Rpb25zXCIsIFwiLS1uby1pbnB1dFwiXSk7XG5cdGNvbnN0IGNvbm5lY3Rpb25zID0gcGFyc2VKc29uT3V0cHV0PEF1dGgwQ29ubmVjdGlvbltdPihsaXN0T3V0KTtcblx0Y29uc3QgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb25zLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gY29ubmVjdGlvbk5hbWUpO1xuXHRpZiAoIWNvbm5lY3Rpb24pIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYEF1dGgwIGNvbm5lY3Rpb24gbm90IGZvdW5kOiAke2Nvbm5lY3Rpb25OYW1lfWApO1xuXHR9XG5cblx0Y29uc3QgY2xpZW50c091dCA9IHJ1bkF1dGgwKFtcblx0XHRcImFwaVwiLFxuXHRcdFwiZ2V0XCIsXG5cdFx0YGNvbm5lY3Rpb25zLyR7Y29ubmVjdGlvbi5pZH0vY2xpZW50c2AsXG5cdFx0XCItLW5vLWlucHV0XCIsXG5cdF0pO1xuXHRjb25zdCB7IGNsaWVudHMgfSA9IHBhcnNlSnNvbk91dHB1dDx7IGNsaWVudHM6IEFycmF5PHsgY2xpZW50X2lkOiBzdHJpbmcgfT4gfT4oY2xpZW50c091dCk7XG5cdGlmIChjbGllbnRzLnNvbWUoKGMpID0+IGMuY2xpZW50X2lkID09PSBjbGllbnRJZCkpIHJldHVybjtcblxuXHQvLyBEZWRpY2F0ZWQgZW5hYmxlZC1jbGllbnRzIGVuZHBvaW50IChlbmFibGVkX2NsaWVudHMgb24gY29ubmVjdGlvbiBQQVRDSCBpcyBkZXByZWNhdGVkKS5cblx0cnVuQXV0aDAoW1xuXHRcdFwiYXBpXCIsXG5cdFx0XCJwYXRjaFwiLFxuXHRcdGBjb25uZWN0aW9ucy8ke2Nvbm5lY3Rpb24uaWR9L2NsaWVudHNgLFxuXHRcdFwiLS1kYXRhXCIsXG5cdFx0SlNPTi5zdHJpbmdpZnkoW3sgY2xpZW50X2lkOiBjbGllbnRJZCwgc3RhdHVzOiB0cnVlIH1dKSxcblx0XHRcIi0tbm8taW5wdXRcIixcblx0XSk7XG59XG5cbmV4cG9ydCB0eXBlIEFkbWluRGF0YWJhc2VVc2VyID0ge1xuXHR1c2VyX2lkOiBzdHJpbmc7XG5cdGVtYWlsOiBzdHJpbmc7XG5cdHBhc3N3b3JkOiBzdHJpbmc7XG5cdHVzZXJuYW1lOiBzdHJpbmc7XG59O1xuXG4vKiogU3Ryb25nIGRlZmF1bHQgcGFzc3dvcmQgd2hlbiB0aGUgc2NhZmZvbGRlciBjYWxsZXIgbGVhdmVzIHBhc3N3b3JkIGJsYW5rLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQWRtaW5QYXNzd29yZCgpOiBzdHJpbmcge1xuXHRyZXR1cm4gYCR7cmFuZG9tQnl0ZXMoMTIpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpfWFBMSFgO1xufVxuXG5mdW5jdGlvbiBpc1VzZXJBbHJlYWR5RXhpc3RzRXJyb3IoZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG5cdGNvbnN0IHRleHQgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG5cdHJldHVybiAvYWxyZWFkeSBleGlzdHN8dXNlciBleGlzdHN8Q29uZmxpY3R8NDA5L2kudGVzdCh0ZXh0KTtcbn1cblxuLyoqIExvb2sgdXAgYSB1c2VyIGJ5IGVtYWlsIChNYW5hZ2VtZW50IEFQSSB1c2Vycy1ieS1lbWFpbCkuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFVzZXJCeUVtYWlsKGVtYWlsOiBzdHJpbmcpOiB7IHVzZXJfaWQ6IHN0cmluZzsgZW1haWw6IHN0cmluZyB9IHwgbnVsbCB7XG5cdGNvbnN0IG91dCA9IHJ1bkF1dGgwKFtcblx0XHRcImFwaVwiLFxuXHRcdFwiZ2V0XCIsXG5cdFx0YHVzZXJzLWJ5LWVtYWlsP2VtYWlsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGVtYWlsKX1gLFxuXHRcdFwiLS1uby1pbnB1dFwiLFxuXHRdKTtcblx0Y29uc3QgdXNlcnMgPSBwYXJzZUpzb25PdXRwdXQ8QXJyYXk8eyB1c2VyX2lkPzogc3RyaW5nOyBlbWFpbD86IHN0cmluZyB9Pj4ob3V0KTtcblx0Y29uc3QgdXNlciA9IHVzZXJzLmZpbmQoKHUpID0+IHUudXNlcl9pZCAmJiB1LmVtYWlsKTtcblx0aWYgKCF1c2VyPy51c2VyX2lkIHx8ICF1c2VyLmVtYWlsKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIHsgdXNlcl9pZDogdXNlci51c2VyX2lkLCBlbWFpbDogdXNlci5lbWFpbCB9O1xufVxuXG4vKiogUmVzZXQgcGFzc3dvcmQgc28gYSByZS1zY2FmZm9sZCBjYW4gd3JpdGUgYSBrbm93biBwYXNzd29yZCB0byAuZW52LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVVzZXJQYXNzd29yZCh1c2VySWQ6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IHZvaWQge1xuXHRydW5BdXRoMChbXG5cdFx0XCJhcGlcIixcblx0XHRcInBhdGNoXCIsXG5cdFx0YHVzZXJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHVzZXJJZCl9YCxcblx0XHRcIi0tZGF0YVwiLFxuXHRcdEpTT04uc3RyaW5naWZ5KHsgcGFzc3dvcmQsIGNvbm5lY3Rpb246IERCX0NPTk5FQ1RJT05fTkFNRSB9KSxcblx0XHRcIi0tbm8taW5wdXRcIixcblx0XSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgREIgY29ubmVjdGlvbiByb290LWFkbWluIHVzZXIgZm9yIGxvY2FsIC8gUG9zdG1hbiBsb2dpbi5cbiAqIElmIHRoZSB1c2VyIGFscmVhZHkgZXhpc3RzLCBsb29rIHRoZW0gdXAsIHJlc2V0IHBhc3N3b3JkIHRvIGBpbnB1dC5wYXNzd29yZGAsXG4gKiBhbmQgcmV0dXJuIHRoYXQgaWRlbnRpdHkgc28gY2FsbGVycyBjYW4gc3RpbGwgd3JpdGUgLmVudiBjcmVkZW50aWFscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFkbWluRGF0YWJhc2VVc2VyKGlucHV0OiB7XG5cdGVtYWlsOiBzdHJpbmc7XG5cdHBhc3N3b3JkOiBzdHJpbmc7XG5cdHVzZXJuYW1lOiBzdHJpbmc7XG59KTogQWRtaW5EYXRhYmFzZVVzZXIge1xuXHRjb25zdCBib2R5ID0ge1xuXHRcdGVtYWlsOiBpbnB1dC5lbWFpbCxcblx0XHRjb25uZWN0aW9uOiBEQl9DT05ORUNUSU9OX05BTUUsXG5cdFx0cGFzc3dvcmQ6IGlucHV0LnBhc3N3b3JkLFxuXHRcdG5hbWU6IGlucHV0LnVzZXJuYW1lLFxuXHRcdGVtYWlsX3ZlcmlmaWVkOiB0cnVlLFxuXHRcdHZlcmlmeV9lbWFpbDogZmFsc2UsXG5cdFx0YXBwX21ldGFkYXRhOiB7IHJvbGVzOiBbXCJhZG1pblwiXSB9LFxuXHR9O1xuXG5cdHRyeSB7XG5cdFx0Y29uc3Qgb3V0ID0gcnVuQXV0aDAoW1xuXHRcdFx0XCJhcGlcIixcblx0XHRcdFwicG9zdFwiLFxuXHRcdFx0XCJ1c2Vyc1wiLFxuXHRcdFx0XCItLWRhdGFcIixcblx0XHRcdEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuXHRcdFx0XCItLW5vLWlucHV0XCIsXG5cdFx0XSk7XG5cdFx0Y29uc3QgdXNlciA9IHBhcnNlSnNvbk91dHB1dDx7IHVzZXJfaWQ/OiBzdHJpbmc7IGVtYWlsPzogc3RyaW5nIH0+KG91dCk7XG5cdFx0aWYgKCF1c2VyLnVzZXJfaWQgfHwgIXVzZXIuZW1haWwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YEF1dGgwIGNyZWF0ZSB1c2VyIHJlc3BvbnNlIG1pc3NpbmcgdXNlcl9pZC9lbWFpbC4gc3Rkb3V0OiAke291dC5zbGljZSgwLCAzMDApfWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0dXNlcl9pZDogdXNlci51c2VyX2lkLFxuXHRcdFx0ZW1haWw6IHVzZXIuZW1haWwsXG5cdFx0XHRwYXNzd29yZDogaW5wdXQucGFzc3dvcmQsXG5cdFx0XHR1c2VybmFtZTogaW5wdXQudXNlcm5hbWUsXG5cdFx0fTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0aWYgKCFpc1VzZXJBbHJlYWR5RXhpc3RzRXJyb3IoZXJyKSkgdGhyb3cgZXJyO1xuXG5cdFx0Y29uc3QgZXhpc3RpbmcgPSBmaW5kVXNlckJ5RW1haWwoaW5wdXQuZW1haWwpO1xuXHRcdGlmICghZXhpc3RpbmcpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YEF1dGgwIHVzZXIgYWxyZWFkeSBleGlzdHMgZm9yICR7aW5wdXQuZW1haWx9LCBidXQgbG9va3VwIGJ5IGVtYWlsIHJldHVybmVkIG5vIHVzZXIuYCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0dXBkYXRlVXNlclBhc3N3b3JkKGV4aXN0aW5nLnVzZXJfaWQsIGlucHV0LnBhc3N3b3JkKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dXNlcl9pZDogZXhpc3RpbmcudXNlcl9pZCxcblx0XHRcdGVtYWlsOiBleGlzdGluZy5lbWFpbCxcblx0XHRcdHBhc3N3b3JkOiBpbnB1dC5wYXNzd29yZCxcblx0XHRcdHVzZXJuYW1lOiBpbnB1dC51c2VybmFtZSxcblx0XHR9O1xuXHR9XG59XG5cbmV4cG9ydCB7IFJFUVVJUkVEX1NDT1BFUyB9O1xuIl0sIm5hbWVzIjpbIkF1dGgwQXV0aEVycm9yIiwiREJfQ09OTkVDVElPTl9OQU1FIiwiSEVMTE9fQVBJX1NDT1BFUyIsIlJFUVVJUkVEX1NDT1BFUyIsImNyZWF0ZUFkbWluRGF0YWJhc2VVc2VyIiwiY3JlYXRlQXBpIiwiY3JlYXRlU3BhQXBwIiwiZW5hYmxlQ29ubmVjdGlvbkZvckNsaWVudCIsImVuc3VyZVNwYUFwcCIsImZpbmRVc2VyQnlFbWFpbCIsImdlbmVyYXRlQWRtaW5QYXNzd29yZCIsImlzSW5zdGFsbGVkIiwibGlzdEFwaXMiLCJsaXN0QXBwcyIsImxpc3RUZW5hbnRzIiwibG9naW4iLCJ1cGRhdGVBcGlTY29wZXMiLCJ1cGRhdGVTcGFDYWxsYmFja3MiLCJ1cGRhdGVVc2VyUGFzc3dvcmQiLCJqb2luIiwiQVBJX1RJTUVPVVRfTVMiLCJFcnJvciIsIm1lc3NhZ2UiLCJuYW1lIiwiaXNBdXRoRXJyb3IiLCJ0ZXh0IiwiaW5jbHVkZXMiLCJwYXJzZUpzb25PdXRwdXQiLCJzdGRvdXQiLCJzdGFydCIsImluZGV4T2YiLCJhcnJheVN0YXJ0IiwiaWR4IiwiTWF0aCIsIm1pbiIsInNsaWNlIiwiSlNPTiIsInBhcnNlIiwicnVuQXV0aDAiLCJhcmdzIiwicmVzdWx0Iiwic3Bhd25TeW5jIiwiZW5jb2RpbmciLCJ0aW1lb3V0IiwiaW5wdXQiLCJzdGRpbyIsImVycm9yIiwibXNnIiwiY29kZSIsInN0YXR1cyIsInN0ZGVyciIsImV4ZWNGaWxlU3luYyIsIm91dCIsImVyciIsImlkZW50aWZpZXIiLCJzY29wZXMiLCJjYWxsYmFja1VybHMiLCJjYWxsYmFja3MiLCJhcHAiLCJjbGllbnRJZCIsImNsaWVudF9pZCIsImFwcHMiLCJtYXAiLCJhIiwiZmlsdGVyIiwiZXhpc3RpbmciLCJmaW5kIiwicmV1c2VkIiwiY29ubmVjdGlvbk5hbWUiLCJsaXN0T3V0IiwiY29ubmVjdGlvbnMiLCJjb25uZWN0aW9uIiwiYyIsImNsaWVudHNPdXQiLCJpZCIsImNsaWVudHMiLCJzb21lIiwic3RyaW5naWZ5IiwicmFuZG9tQnl0ZXMiLCJ0b1N0cmluZyIsImlzVXNlckFscmVhZHlFeGlzdHNFcnJvciIsIlN0cmluZyIsInRlc3QiLCJlbWFpbCIsImVuY29kZVVSSUNvbXBvbmVudCIsInVzZXJzIiwidXNlciIsInUiLCJ1c2VyX2lkIiwidXNlcklkIiwicGFzc3dvcmQiLCJib2R5IiwidXNlcm5hbWUiLCJlbWFpbF92ZXJpZmllZCIsInZlcmlmeV9lbWFpbCIsImFwcF9tZXRhZGF0YSIsInJvbGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7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
@@ -1,49 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "formatScaffoldedFiles", {
6
- enumerable: true,
7
- get: function() {
8
- return formatScaffoldedFiles;
9
- }
10
- });
11
- const _nodechild_process = require("node:child_process");
12
- function formatScaffoldedFiles(targetDir, paths = [
13
- "."
14
- ]) {
15
- process.stdout.write("\n Formatting scaffolded files with Biome...");
16
- let result = (0, _nodechild_process.spawnSync)("biome", [
17
- "check",
18
- "--write",
19
- ...paths
20
- ], {
21
- cwd: targetDir,
22
- encoding: "utf8",
23
- stdio: "pipe"
24
- });
25
- if (result.error && result.error.code === "ENOENT") {
26
- result = (0, _nodechild_process.spawnSync)("npx", [
27
- "--yes",
28
- "@biomejs/biome",
29
- "check",
30
- "--write",
31
- ...paths
32
- ], {
33
- cwd: targetDir,
34
- encoding: "utf8",
35
- stdio: "pipe"
36
- });
37
- }
38
- if (result.status === 0) {
39
- process.stdout.write(" done.\n");
40
- return;
41
- }
42
- const detail = (result.stderr || result.stdout || result.error?.message || "").trim();
43
- process.stdout.write(" failed.\n");
44
- if (detail) {
45
- console.error(` ✗ Biome: ${detail.slice(0, 400)}`);
46
- }
47
- }
48
-
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL2Jpb21lLWZvcm1hdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5cbi8qKlxuICogRm9ybWF0L2xpbnQtZml4IGFsbCBmaWxlcyBpbiB0aGUgc2NhZmZvbGRlZCB3b3Jrc3BhY2Ugd2l0aCBCaW9tZS5cbiAqIFByZWZlciBhIGdsb2JhbCBgYmlvbWVgIGJpbmFyeSAoYnVpbGRlciBpbWFnZSk7IGZhbGwgYmFjayB0byBgbnB4YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFNjYWZmb2xkZWRGaWxlcyh0YXJnZXREaXI6IHN0cmluZywgcGF0aHM6IHN0cmluZ1tdID0gW1wiLlwiXSk6IHZvaWQge1xuXHRwcm9jZXNzLnN0ZG91dC53cml0ZShcIlxcbiAgRm9ybWF0dGluZyBzY2FmZm9sZGVkIGZpbGVzIHdpdGggQmlvbWUuLi5cIik7XG5cblx0bGV0IHJlc3VsdCA9IHNwYXduU3luYyhcImJpb21lXCIsIFtcImNoZWNrXCIsIFwiLS13cml0ZVwiLCAuLi5wYXRoc10sIHtcblx0XHRjd2Q6IHRhcmdldERpcixcblx0XHRlbmNvZGluZzogXCJ1dGY4XCIsXG5cdFx0c3RkaW86IFwicGlwZVwiLFxuXHR9KTtcblxuXHRpZiAocmVzdWx0LmVycm9yICYmIChyZXN1bHQuZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSBcIkVOT0VOVFwiKSB7XG5cdFx0cmVzdWx0ID0gc3Bhd25TeW5jKFwibnB4XCIsIFtcIi0teWVzXCIsIFwiQGJpb21lanMvYmlvbWVcIiwgXCJjaGVja1wiLCBcIi0td3JpdGVcIiwgLi4ucGF0aHNdLCB7XG5cdFx0XHRjd2Q6IHRhcmdldERpcixcblx0XHRcdGVuY29kaW5nOiBcInV0ZjhcIixcblx0XHRcdHN0ZGlvOiBcInBpcGVcIixcblx0XHR9KTtcblx0fVxuXG5cdGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XG5cdFx0cHJvY2Vzcy5zdGRvdXQud3JpdGUoXCIgZG9uZS5cXG5cIik7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgZGV0YWlsID0gKHJlc3VsdC5zdGRlcnIgfHwgcmVzdWx0LnN0ZG91dCB8fCByZXN1bHQuZXJyb3I/Lm1lc3NhZ2UgfHwgXCJcIikudHJpbSgpO1xuXHRwcm9jZXNzLnN0ZG91dC53cml0ZShcIiBmYWlsZWQuXFxuXCIpO1xuXHRpZiAoZGV0YWlsKSB7XG5cdFx0Y29uc29sZS5lcnJvcihgICDinJcgQmlvbWU6ICR7ZGV0YWlsLnNsaWNlKDAsIDQwMCl9YCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJmb3JtYXRTY2FmZm9sZGVkRmlsZXMiLCJ0YXJnZXREaXIiLCJwYXRocyIsInByb2Nlc3MiLCJzdGRvdXQiLCJ3cml0ZSIsInJlc3VsdCIsInNwYXduU3luYyIsImN3ZCIsImVuY29kaW5nIiwic3RkaW8iLCJlcnJvciIsImNvZGUiLCJzdGF0dXMiLCJkZXRhaWwiLCJzdGRlcnIiLCJtZXNzYWdlIiwidHJpbSIsImNvbnNvbGUiLCJzbGljZSJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFNZ0JBOzs7ZUFBQUE7OzttQ0FOVTtBQU1uQixTQUFTQSxzQkFBc0JDLFNBQWlCLEVBQUVDLFFBQWtCO0lBQUM7Q0FBSTtJQUMvRUMsUUFBUUMsTUFBTSxDQUFDQyxLQUFLLENBQUM7SUFFckIsSUFBSUMsU0FBU0MsSUFBQUEsNEJBQVMsRUFBQyxTQUFTO1FBQUM7UUFBUztXQUFjTDtLQUFNLEVBQUU7UUFDL0RNLEtBQUtQO1FBQ0xRLFVBQVU7UUFDVkMsT0FBTztJQUNSO0lBRUEsSUFBSUosT0FBT0ssS0FBSyxJQUFJLEFBQUNMLE9BQU9LLEtBQUssQ0FBMkJDLElBQUksS0FBSyxVQUFVO1FBQzlFTixTQUFTQyxJQUFBQSw0QkFBUyxFQUFDLE9BQU87WUFBQztZQUFTO1lBQWtCO1lBQVM7ZUFBY0w7U0FBTSxFQUFFO1lBQ3BGTSxLQUFLUDtZQUNMUSxVQUFVO1lBQ1ZDLE9BQU87UUFDUjtJQUNEO0lBRUEsSUFBSUosT0FBT08sTUFBTSxLQUFLLEdBQUc7UUFDeEJWLFFBQVFDLE1BQU0sQ0FBQ0MsS0FBSyxDQUFDO1FBQ3JCO0lBQ0Q7SUFFQSxNQUFNUyxTQUFTLEFBQUNSLENBQUFBLE9BQU9TLE1BQU0sSUFBSVQsT0FBT0YsTUFBTSxJQUFJRSxPQUFPSyxLQUFLLEVBQUVLLFdBQVcsRUFBQyxFQUFHQyxJQUFJO0lBQ25GZCxRQUFRQyxNQUFNLENBQUNDLEtBQUssQ0FBQztJQUNyQixJQUFJUyxRQUFRO1FBQ1hJLFFBQVFQLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRUcsT0FBT0ssS0FBSyxDQUFDLEdBQUcsTUFBTTtJQUNuRDtBQUNEIn0=