@clef-sh/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/clef.js +2 -0
- package/dist/commands/delete.d.ts +6 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +130 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/diff.d.ts +6 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +168 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +331 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/exec.d.ts +6 -0
- package/dist/commands/exec.d.ts.map +1 -0
- package/dist/commands/exec.js +187 -0
- package/dist/commands/exec.js.map +1 -0
- package/dist/commands/export.d.ts +6 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +110 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/get.d.ts +6 -0
- package/dist/commands/get.d.ts.map +1 -0
- package/dist/commands/get.js +85 -0
- package/dist/commands/get.js.map +1 -0
- package/dist/commands/hooks.d.ts +6 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +89 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/import.d.ts +6 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +210 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/init.d.ts +11 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +499 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/lint.d.ts +6 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +152 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/merge-driver.d.ts +6 -0
- package/dist/commands/merge-driver.d.ts.map +1 -0
- package/dist/commands/merge-driver.js +152 -0
- package/dist/commands/merge-driver.js.map +1 -0
- package/dist/commands/recipients.d.ts +7 -0
- package/dist/commands/recipients.d.ts.map +1 -0
- package/dist/commands/recipients.js +316 -0
- package/dist/commands/recipients.js.map +1 -0
- package/dist/commands/rotate.d.ts +6 -0
- package/dist/commands/rotate.d.ts.map +1 -0
- package/dist/commands/rotate.js +97 -0
- package/dist/commands/rotate.js.map +1 -0
- package/dist/commands/scan.d.ts +6 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +152 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/set.d.ts +6 -0
- package/dist/commands/set.d.ts.map +1 -0
- package/dist/commands/set.js +137 -0
- package/dist/commands/set.js.map +1 -0
- package/dist/commands/ui.d.ts +7 -0
- package/dist/commands/ui.d.ts.map +1 -0
- package/dist/commands/ui.js +100 -0
- package/dist/commands/ui.js.map +1 -0
- package/dist/commands/update.d.ts +6 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +119 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +121 -0
- package/dist/index.js.map +1 -0
- package/dist/output/formatter.d.ts +20 -0
- package/dist/output/formatter.d.ts.map +1 -0
- package/dist/output/formatter.js +191 -0
- package/dist/output/formatter.js.map +1 -0
- package/dist/output/symbols.d.ts +21 -0
- package/dist/output/symbols.d.ts.map +1 -0
- package/dist/output/symbols.js +59 -0
- package/dist/output/symbols.js.map +1 -0
- package/dist/subprocess.d.ts +5 -0
- package/dist/subprocess.d.ts.map +1 -0
- package/dist/subprocess.js +27 -0
- package/dist/subprocess.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.registerInitCommand = registerInitCommand;
|
|
37
|
+
exports.scaffoldSopsConfig = scaffoldSopsConfig;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const readline = __importStar(require("readline"));
|
|
41
|
+
const YAML = __importStar(require("yaml"));
|
|
42
|
+
const core_1 = require("@clef-sh/core");
|
|
43
|
+
const formatter_1 = require("../output/formatter");
|
|
44
|
+
const CLEF_DIR = ".clef";
|
|
45
|
+
const CLEF_CONFIG_FILENAME = "config.yaml";
|
|
46
|
+
const DEFAULT_CLEFIGNORE = `# .clefignore
|
|
47
|
+
# Files excluded from clef scan.
|
|
48
|
+
# See https://docs.clef.sh/cli/scan
|
|
49
|
+
|
|
50
|
+
# Dependencies
|
|
51
|
+
node_modules/
|
|
52
|
+
vendor/
|
|
53
|
+
.yarn/
|
|
54
|
+
|
|
55
|
+
# Build output
|
|
56
|
+
dist/
|
|
57
|
+
build/
|
|
58
|
+
.next/
|
|
59
|
+
.nuxt/
|
|
60
|
+
|
|
61
|
+
# Lock files (high entropy but not secrets)
|
|
62
|
+
*.lock
|
|
63
|
+
package-lock.json
|
|
64
|
+
yarn.lock
|
|
65
|
+
`;
|
|
66
|
+
function defaultAgeKeyPath() {
|
|
67
|
+
return path.join(process.env.HOME || process.env.USERPROFILE || "", ".config", "clef", "keys.txt");
|
|
68
|
+
}
|
|
69
|
+
async function isInsideAnyGitRepo(keyPath) {
|
|
70
|
+
const { execFile } = await Promise.resolve().then(() => __importStar(require("child_process")));
|
|
71
|
+
const { promisify } = await Promise.resolve().then(() => __importStar(require("util")));
|
|
72
|
+
const execFileAsync = promisify(execFile);
|
|
73
|
+
const dir = path.dirname(path.resolve(keyPath));
|
|
74
|
+
try {
|
|
75
|
+
const { stdout } = await execFileAsync("git", ["-C", dir, "rev-parse", "--show-toplevel"]);
|
|
76
|
+
return stdout.trim().length > 0;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return false; // git command failed = not a git repo
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async function promptKeyLocation(defaultPath) {
|
|
83
|
+
const answer = await promptWithDefault("Where should your age private key be stored? (must be outside any git repository)", defaultPath);
|
|
84
|
+
const resolved = path.resolve(answer);
|
|
85
|
+
if (await isInsideAnyGitRepo(resolved)) {
|
|
86
|
+
throw new Error(`Key path '${answer}' is inside a git repository. Choose a path outside any git repo to keep your private key secure.`);
|
|
87
|
+
}
|
|
88
|
+
return resolved;
|
|
89
|
+
}
|
|
90
|
+
function registerInitCommand(program, deps) {
|
|
91
|
+
program
|
|
92
|
+
.command("init")
|
|
93
|
+
.description("Initialise a new Clef repo with a manifest, encrypted file matrix, and pre-commit hook")
|
|
94
|
+
.option("--environments <envs>", "Comma-separated list of environments", "dev,staging,production")
|
|
95
|
+
.option("--namespaces <namespaces>", "Comma-separated list of namespaces")
|
|
96
|
+
.option("--backend <backend>", "SOPS encryption backend (age, awskms, gcpkms, pgp)", "age")
|
|
97
|
+
.option("--non-interactive", "Skip interactive prompts and use defaults/flags")
|
|
98
|
+
.option("--random-values", "Scaffold required schema keys with random placeholder values (marks them as pending)")
|
|
99
|
+
.option("--include-optional", "When used with --random-values, also scaffold optional keys")
|
|
100
|
+
.action(async (options) => {
|
|
101
|
+
try {
|
|
102
|
+
const repoRoot = program.opts().repo || process.cwd();
|
|
103
|
+
const manifestPath = path.join(repoRoot, "clef.yaml");
|
|
104
|
+
const clefConfigPath = path.join(repoRoot, CLEF_DIR, CLEF_CONFIG_FILENAME);
|
|
105
|
+
const manifestExists = fs.existsSync(manifestPath);
|
|
106
|
+
const localConfigExists = fs.existsSync(clefConfigPath);
|
|
107
|
+
// Idempotency: both exist — already initialised
|
|
108
|
+
if (manifestExists && localConfigExists) {
|
|
109
|
+
formatter_1.formatter.print("Already initialised. Run 'clef update' to scaffold new environments.");
|
|
110
|
+
process.exit(0);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
// Second-dev onboarding: manifest exists but local config missing
|
|
114
|
+
if (manifestExists && !localConfigExists) {
|
|
115
|
+
await handleSecondDevOnboarding(repoRoot, clefConfigPath, options);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
// Full setup: neither exists (or manifest is missing)
|
|
119
|
+
// Check dependencies first — fail fast with a clean error
|
|
120
|
+
try {
|
|
121
|
+
await (0, core_1.assertSops)(deps.runner);
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
if (err instanceof core_1.SopsMissingError || err instanceof core_1.SopsVersionError) {
|
|
125
|
+
formatter_1.formatter.formatDependencyError(err);
|
|
126
|
+
process.exit(1);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
/* istanbul ignore next -- only reachable if assertSops throws a non-dependency error */
|
|
130
|
+
throw err;
|
|
131
|
+
}
|
|
132
|
+
await handleFullSetup(repoRoot, manifestPath, clefConfigPath, deps, options);
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
formatter_1.formatter.error(err.message);
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
async function handleSecondDevOnboarding(repoRoot, clefConfigPath, options) {
|
|
141
|
+
let keyPath;
|
|
142
|
+
if (options.nonInteractive || !process.stdin.isTTY) {
|
|
143
|
+
// Non-interactive: use SOPS_AGE_KEY_FILE env or default
|
|
144
|
+
keyPath = process.env.SOPS_AGE_KEY_FILE || defaultAgeKeyPath();
|
|
145
|
+
keyPath = path.resolve(keyPath);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
keyPath = await promptKeyLocation(defaultAgeKeyPath());
|
|
149
|
+
}
|
|
150
|
+
if (await isInsideAnyGitRepo(keyPath)) {
|
|
151
|
+
throw new Error(`Key path '${keyPath}' is inside a git repository. Choose a path outside any git repo to keep your private key secure.`);
|
|
152
|
+
}
|
|
153
|
+
// Write .clef/config.yaml and .clef/.gitignore
|
|
154
|
+
const clefDir = path.dirname(clefConfigPath);
|
|
155
|
+
if (!fs.existsSync(clefDir)) {
|
|
156
|
+
fs.mkdirSync(clefDir, { recursive: true });
|
|
157
|
+
}
|
|
158
|
+
const config = { age_key_file: keyPath };
|
|
159
|
+
fs.writeFileSync(clefConfigPath, YAML.stringify(config), "utf-8");
|
|
160
|
+
formatter_1.formatter.success("Created .clef/config.yaml");
|
|
161
|
+
const gitignorePath = path.join(clefDir, ".gitignore");
|
|
162
|
+
if (!fs.existsSync(gitignorePath)) {
|
|
163
|
+
fs.writeFileSync(gitignorePath, "*\n", "utf-8");
|
|
164
|
+
formatter_1.formatter.success("Created .clef/.gitignore");
|
|
165
|
+
}
|
|
166
|
+
formatter_1.formatter.section("Next steps:");
|
|
167
|
+
formatter_1.formatter.hint("clef update — scaffold new environments");
|
|
168
|
+
formatter_1.formatter.hint("clef lint — check repo health");
|
|
169
|
+
}
|
|
170
|
+
async function handleFullSetup(repoRoot, manifestPath, clefConfigPath, deps, options) {
|
|
171
|
+
let environments = (options.environments ?? "dev,staging,production")
|
|
172
|
+
.split(",")
|
|
173
|
+
.map((s) => s.trim());
|
|
174
|
+
let namespaces = options.namespaces
|
|
175
|
+
? options.namespaces.split(",").map((s) => s.trim())
|
|
176
|
+
: [];
|
|
177
|
+
const backend = options.backend ?? "age";
|
|
178
|
+
if (!options.nonInteractive && process.stdin.isTTY) {
|
|
179
|
+
const envAnswer = await promptWithDefault("Environments (comma-separated)", environments.join(","));
|
|
180
|
+
environments = envAnswer.split(",").map((s) => s.trim());
|
|
181
|
+
if (namespaces.length === 0) {
|
|
182
|
+
const nsAnswer = await promptWithDefault("Namespaces (comma-separated)", "");
|
|
183
|
+
if (nsAnswer) {
|
|
184
|
+
namespaces = nsAnswer.split(",").map((s) => s.trim());
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (namespaces.length === 0) {
|
|
189
|
+
formatter_1.formatter.error("At least one namespace is required. Use --namespaces or provide interactively.");
|
|
190
|
+
process.exit(1);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const manifest = {
|
|
194
|
+
version: 1,
|
|
195
|
+
environments: environments.map((name, _i) => ({
|
|
196
|
+
name,
|
|
197
|
+
description: name === "production"
|
|
198
|
+
? "Live system"
|
|
199
|
+
: name === "staging"
|
|
200
|
+
? "Pre-production"
|
|
201
|
+
: "Local development",
|
|
202
|
+
...(name === "production" ? { protected: true } : {}),
|
|
203
|
+
})),
|
|
204
|
+
namespaces: namespaces.map((name) => ({
|
|
205
|
+
name,
|
|
206
|
+
description: `${name.charAt(0).toUpperCase() + name.slice(1)} configuration`,
|
|
207
|
+
})),
|
|
208
|
+
sops: {
|
|
209
|
+
default_backend: backend,
|
|
210
|
+
},
|
|
211
|
+
file_pattern: "{namespace}/{environment}.enc.yaml",
|
|
212
|
+
};
|
|
213
|
+
// Validate the manifest
|
|
214
|
+
const initParser = new core_1.ManifestParser();
|
|
215
|
+
initParser.validate(manifest);
|
|
216
|
+
// Write clef.yaml
|
|
217
|
+
fs.writeFileSync(manifestPath, YAML.stringify(manifest), "utf-8");
|
|
218
|
+
formatter_1.formatter.success("Created clef.yaml");
|
|
219
|
+
// Handle age backend: generate key and write local config
|
|
220
|
+
let ageKeyFile;
|
|
221
|
+
if (backend === "age") {
|
|
222
|
+
// Determine key path
|
|
223
|
+
let keyPath;
|
|
224
|
+
if (options.nonInteractive || !process.stdin.isTTY) {
|
|
225
|
+
keyPath = defaultAgeKeyPath();
|
|
226
|
+
if (await isInsideAnyGitRepo(path.resolve(keyPath))) {
|
|
227
|
+
throw new Error(`Default key path '${keyPath}' is inside a git repository. Set HOME to a non-git location.`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
keyPath = await promptKeyLocation(defaultAgeKeyPath());
|
|
232
|
+
}
|
|
233
|
+
// Generate age key pair
|
|
234
|
+
const identity = await (0, core_1.generateAgeIdentity)();
|
|
235
|
+
const keyContent = (0, core_1.formatAgeKeyFile)(identity.privateKey, identity.publicKey);
|
|
236
|
+
// Write key file
|
|
237
|
+
const keyDir = path.dirname(keyPath);
|
|
238
|
+
if (!fs.existsSync(keyDir)) {
|
|
239
|
+
fs.mkdirSync(keyDir, { recursive: true });
|
|
240
|
+
}
|
|
241
|
+
fs.writeFileSync(keyPath, keyContent, { encoding: "utf-8", mode: 0o600 });
|
|
242
|
+
formatter_1.formatter.success(`Generated age key at ${keyPath}`);
|
|
243
|
+
ageKeyFile = keyPath;
|
|
244
|
+
// Write .clef/config.yaml and .clef/.gitignore
|
|
245
|
+
const clefDir = path.dirname(clefConfigPath);
|
|
246
|
+
if (!fs.existsSync(clefDir)) {
|
|
247
|
+
fs.mkdirSync(clefDir, { recursive: true });
|
|
248
|
+
}
|
|
249
|
+
const config = { age_key_file: keyPath };
|
|
250
|
+
fs.writeFileSync(clefConfigPath, YAML.stringify(config), "utf-8");
|
|
251
|
+
formatter_1.formatter.success("Created .clef/config.yaml");
|
|
252
|
+
const gitignorePath = path.join(clefDir, ".gitignore");
|
|
253
|
+
if (!fs.existsSync(gitignorePath)) {
|
|
254
|
+
fs.writeFileSync(gitignorePath, "*\n", "utf-8");
|
|
255
|
+
formatter_1.formatter.success("Created .clef/.gitignore");
|
|
256
|
+
}
|
|
257
|
+
// Generate .sops.yaml using the new public key
|
|
258
|
+
const sopsYamlPath = path.join(repoRoot, ".sops.yaml");
|
|
259
|
+
const sopsConfig = buildSopsYaml(manifest, repoRoot, identity.publicKey);
|
|
260
|
+
fs.writeFileSync(sopsYamlPath, YAML.stringify(sopsConfig), "utf-8");
|
|
261
|
+
formatter_1.formatter.success("Created .sops.yaml");
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
// Non-age backend: generate .sops.yaml without a key
|
|
265
|
+
const sopsYamlPath = path.join(repoRoot, ".sops.yaml");
|
|
266
|
+
const sopsConfig = buildSopsYaml(manifest, repoRoot, undefined);
|
|
267
|
+
fs.writeFileSync(sopsYamlPath, YAML.stringify(sopsConfig), "utf-8");
|
|
268
|
+
formatter_1.formatter.success("Created .sops.yaml");
|
|
269
|
+
}
|
|
270
|
+
// Scaffold the matrix
|
|
271
|
+
const sopsClient = new core_1.SopsClient(deps.runner, ageKeyFile);
|
|
272
|
+
const matrixManager = new core_1.MatrixManager();
|
|
273
|
+
const cells = matrixManager.resolveMatrix(manifest, repoRoot);
|
|
274
|
+
let scaffoldedCount = 0;
|
|
275
|
+
for (const cell of cells) {
|
|
276
|
+
if (!cell.exists) {
|
|
277
|
+
try {
|
|
278
|
+
await matrixManager.scaffoldCell(cell, sopsClient, manifest);
|
|
279
|
+
scaffoldedCount++;
|
|
280
|
+
}
|
|
281
|
+
catch (err) {
|
|
282
|
+
formatter_1.formatter.warn(`Could not scaffold ${cell.namespace}/${cell.environment}: ${err.message}`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
if (scaffoldedCount > 0) {
|
|
287
|
+
formatter_1.formatter.success(`Scaffolded ${scaffoldedCount} encrypted file(s)`);
|
|
288
|
+
}
|
|
289
|
+
// --random-values: populate schema keys with random placeholders
|
|
290
|
+
if (options.randomValues) {
|
|
291
|
+
const schemaValidator = new core_1.SchemaValidator();
|
|
292
|
+
let pendingTotal = 0;
|
|
293
|
+
for (const ns of manifest.namespaces) {
|
|
294
|
+
if (!ns.schema) {
|
|
295
|
+
formatter_1.formatter.warn(`${ns.name} — no schema defined, skipped.\n` +
|
|
296
|
+
` To scaffold manually: clef set ${ns.name}/<environment> <KEY> --random`);
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
/* istanbul ignore next -- init creates namespaces without schema; this path only runs if a user edits clef.yaml before running init */
|
|
300
|
+
await scaffoldRandomValues(ns, manifest, schemaValidator, sopsClient, repoRoot, options.includeOptional,
|
|
301
|
+
/* istanbul ignore next */ (count) => {
|
|
302
|
+
pendingTotal += count;
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
/* istanbul ignore next -- pendingTotal is always 0 during init since namespaces have no schema */
|
|
306
|
+
if (pendingTotal > 0) {
|
|
307
|
+
formatter_1.formatter.success(`Scaffolded ${pendingTotal} random placeholder value(s) — replace with real secrets using clef set`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// Create .clefignore if it doesn't exist
|
|
311
|
+
const clefignorePath = path.join(repoRoot, ".clefignore");
|
|
312
|
+
if (!fs.existsSync(clefignorePath)) {
|
|
313
|
+
fs.writeFileSync(clefignorePath, DEFAULT_CLEFIGNORE, "utf-8");
|
|
314
|
+
formatter_1.formatter.success("Created .clefignore");
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
formatter_1.formatter.print(" .clefignore already exists — skipping");
|
|
318
|
+
}
|
|
319
|
+
// Install git hooks and merge driver
|
|
320
|
+
try {
|
|
321
|
+
const git = new core_1.GitIntegration(deps.runner);
|
|
322
|
+
await git.installPreCommitHook(repoRoot);
|
|
323
|
+
formatter_1.formatter.success("Installed pre-commit hook");
|
|
324
|
+
await git.installMergeDriver(repoRoot);
|
|
325
|
+
formatter_1.formatter.success("Configured SOPS merge driver");
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
formatter_1.formatter.warn("Could not install git hooks. Run 'clef hooks install' inside a git repository.");
|
|
329
|
+
}
|
|
330
|
+
formatter_1.formatter.section("Next steps:");
|
|
331
|
+
formatter_1.formatter.hint("clef set <namespace>/<env> <KEY> <value> \u2014 add a secret");
|
|
332
|
+
formatter_1.formatter.hint("clef scan \u2014 check for existing plaintext secrets");
|
|
333
|
+
formatter_1.formatter.hint("clef lint \u2014 check repo health");
|
|
334
|
+
formatter_1.formatter.hint("clef ui \u2014 open the web UI");
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Generate .sops.yaml from a manifest and write it to disk.
|
|
338
|
+
* Used by `clef init` and `clef doctor --fix`.
|
|
339
|
+
*/
|
|
340
|
+
function scaffoldSopsConfig(repoRoot) {
|
|
341
|
+
const manifestPath = path.join(repoRoot, "clef.yaml");
|
|
342
|
+
const parser = new core_1.ManifestParser();
|
|
343
|
+
const manifest = parser.parse(manifestPath);
|
|
344
|
+
const sopsYamlPath = path.join(repoRoot, ".sops.yaml");
|
|
345
|
+
// Resolve age public key from environment or local config
|
|
346
|
+
let agePublicKey;
|
|
347
|
+
if (manifest.sops.default_backend === "age") {
|
|
348
|
+
agePublicKey = resolveAgePublicKeyFromEnvOrFile(repoRoot);
|
|
349
|
+
}
|
|
350
|
+
const sopsConfig = buildSopsYaml(manifest, repoRoot, agePublicKey);
|
|
351
|
+
fs.writeFileSync(sopsYamlPath, YAML.stringify(sopsConfig), "utf-8");
|
|
352
|
+
}
|
|
353
|
+
function buildSopsYaml(manifest, _repoRoot, agePublicKey) {
|
|
354
|
+
const creationRules = [];
|
|
355
|
+
for (const ns of manifest.namespaces) {
|
|
356
|
+
for (const env of manifest.environments) {
|
|
357
|
+
const pathRegex = `${ns.name}/${env.name}\\.enc\\.yaml$`;
|
|
358
|
+
const rule = { path_regex: pathRegex };
|
|
359
|
+
// Resolve the effective backend for this environment, respecting per-env overrides
|
|
360
|
+
const backend = env.sops?.backend ?? manifest.sops.default_backend;
|
|
361
|
+
switch (backend) {
|
|
362
|
+
case "age": {
|
|
363
|
+
const envRecipients = (0, core_1.resolveRecipientsForEnvironment)(manifest, env.name);
|
|
364
|
+
if (envRecipients && envRecipients.length > 0) {
|
|
365
|
+
const keys = envRecipients.map((r) => (typeof r === "string" ? r : r.key));
|
|
366
|
+
rule.age = keys.join(",");
|
|
367
|
+
}
|
|
368
|
+
else if (agePublicKey) {
|
|
369
|
+
rule.age = agePublicKey;
|
|
370
|
+
}
|
|
371
|
+
break;
|
|
372
|
+
}
|
|
373
|
+
case "awskms": {
|
|
374
|
+
const arn = env.sops?.aws_kms_arn ?? manifest.sops.aws_kms_arn;
|
|
375
|
+
if (arn) {
|
|
376
|
+
rule.kms = arn;
|
|
377
|
+
}
|
|
378
|
+
break;
|
|
379
|
+
}
|
|
380
|
+
case "gcpkms": {
|
|
381
|
+
const resourceId = env.sops?.gcp_kms_resource_id ?? manifest.sops.gcp_kms_resource_id;
|
|
382
|
+
if (resourceId) {
|
|
383
|
+
rule.gcp_kms = resourceId;
|
|
384
|
+
}
|
|
385
|
+
break;
|
|
386
|
+
}
|
|
387
|
+
case "pgp": {
|
|
388
|
+
const fingerprint = env.sops?.pgp_fingerprint ?? manifest.sops.pgp_fingerprint;
|
|
389
|
+
if (fingerprint) {
|
|
390
|
+
rule.pgp = fingerprint;
|
|
391
|
+
}
|
|
392
|
+
break;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
creationRules.push(rule);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
return { creation_rules: creationRules };
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Resolve the age public key for .sops.yaml generation.
|
|
402
|
+
* Checks (in order): SOPS_AGE_KEY_FILE env, SOPS_AGE_KEY env, .clef/config.yaml, default path.
|
|
403
|
+
*/
|
|
404
|
+
function resolveAgePublicKeyFromEnvOrFile(repoRoot) {
|
|
405
|
+
// 1. Try SOPS_AGE_KEY_FILE env
|
|
406
|
+
if (process.env.SOPS_AGE_KEY_FILE) {
|
|
407
|
+
const pubKey = extractAgePublicKey(process.env.SOPS_AGE_KEY_FILE);
|
|
408
|
+
if (pubKey)
|
|
409
|
+
return pubKey;
|
|
410
|
+
}
|
|
411
|
+
// 2. Try SOPS_AGE_KEY env (inline key — extract public key comment)
|
|
412
|
+
if (process.env.SOPS_AGE_KEY) {
|
|
413
|
+
const match = process.env.SOPS_AGE_KEY.match(/# public key: (age1[a-z0-9]+)/);
|
|
414
|
+
if (match)
|
|
415
|
+
return match[1];
|
|
416
|
+
}
|
|
417
|
+
// 3. Try .clef/config.yaml
|
|
418
|
+
const clefConfigPath = path.join(repoRoot, CLEF_DIR, CLEF_CONFIG_FILENAME);
|
|
419
|
+
if (fs.existsSync(clefConfigPath)) {
|
|
420
|
+
try {
|
|
421
|
+
const config = YAML.parse(fs.readFileSync(clefConfigPath, "utf-8"));
|
|
422
|
+
if (config?.age_key_file) {
|
|
423
|
+
const pubKey = extractAgePublicKey(config.age_key_file);
|
|
424
|
+
if (pubKey)
|
|
425
|
+
return pubKey;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
catch {
|
|
429
|
+
// ignore parse errors
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
// 4. Try default SOPS path
|
|
433
|
+
const defaultPath = path.join(process.env.HOME || process.env.USERPROFILE || "", ".config", "sops", "age", "keys.txt");
|
|
434
|
+
const pubKey = extractAgePublicKey(defaultPath);
|
|
435
|
+
if (pubKey)
|
|
436
|
+
return pubKey;
|
|
437
|
+
return undefined;
|
|
438
|
+
}
|
|
439
|
+
function extractAgePublicKey(keyFilePath) {
|
|
440
|
+
try {
|
|
441
|
+
if (!fs.existsSync(keyFilePath))
|
|
442
|
+
return undefined;
|
|
443
|
+
const content = fs.readFileSync(keyFilePath, "utf-8");
|
|
444
|
+
const match = content.match(/# public key: (age1[a-z0-9]+)/);
|
|
445
|
+
return match ? match[1] : undefined;
|
|
446
|
+
}
|
|
447
|
+
catch {
|
|
448
|
+
return undefined;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
/* istanbul ignore next -- only reachable if a namespace has a schema field, which init never sets */
|
|
452
|
+
async function scaffoldRandomValues(ns, manifest, schemaValidator, sopsClient, repoRoot, includeOptional, addCount) {
|
|
453
|
+
let schema;
|
|
454
|
+
try {
|
|
455
|
+
schema = schemaValidator.loadSchema(path.join(repoRoot, ns.schema));
|
|
456
|
+
}
|
|
457
|
+
catch {
|
|
458
|
+
formatter_1.formatter.warn(`Could not load schema for namespace '${ns.name}' — skipping random scaffolding.`);
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
461
|
+
const keysToScaffold = Object.entries(schema.keys).filter(([, def]) => includeOptional ? true : def.required);
|
|
462
|
+
if (keysToScaffold.length === 0)
|
|
463
|
+
return;
|
|
464
|
+
for (const env of manifest.environments) {
|
|
465
|
+
const filePath = path.join(repoRoot, manifest.file_pattern.replace("{namespace}", ns.name).replace("{environment}", env.name));
|
|
466
|
+
try {
|
|
467
|
+
const decrypted = await sopsClient.decrypt(filePath);
|
|
468
|
+
const pendingKeys = [];
|
|
469
|
+
for (const [keyName] of keysToScaffold) {
|
|
470
|
+
if (decrypted.values[keyName] === undefined) {
|
|
471
|
+
decrypted.values[keyName] = (0, core_1.generateRandomValue)();
|
|
472
|
+
pendingKeys.push(keyName);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
if (pendingKeys.length > 0) {
|
|
476
|
+
await sopsClient.encrypt(filePath, decrypted.values, manifest, env.name);
|
|
477
|
+
await (0, core_1.markPending)(filePath, pendingKeys, "clef init --random-values");
|
|
478
|
+
addCount(pendingKeys.length);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
catch (err) {
|
|
482
|
+
formatter_1.formatter.warn(`Could not scaffold random values for ${ns.name}/${env.name}: ${err.message}`);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
function promptWithDefault(message, defaultValue) {
|
|
487
|
+
const rl = readline.createInterface({
|
|
488
|
+
input: process.stdin,
|
|
489
|
+
output: process.stderr,
|
|
490
|
+
});
|
|
491
|
+
const prompt = defaultValue ? `${message} [${defaultValue}]: ` : `${message}: `;
|
|
492
|
+
return new Promise((resolve) => {
|
|
493
|
+
rl.question(prompt, (answer) => {
|
|
494
|
+
rl.close();
|
|
495
|
+
resolve(answer.trim() || defaultValue);
|
|
496
|
+
});
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqFA,kDA6DC;AA2QD,gDAYC;AAzaD,uCAAyB;AACzB,2CAA6B;AAC7B,mDAAqC;AACrC,2CAA6B;AAE7B,wCAiBuB;AACvB,mDAAgD;AAEhD,MAAM,QAAQ,GAAG,OAAO,CAAC;AACzB,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAE3C,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;CAmB1B,CAAC;AAEF,SAAS,iBAAiB;IACxB,OAAO,IAAI,CAAC,IAAI,CACd,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,EACjD,SAAS,EACT,MAAM,EACN,UAAU,CACX,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,OAAe;IAC/C,MAAM,EAAE,QAAQ,EAAE,GAAG,wDAAa,eAAe,GAAC,CAAC;IACnD,MAAM,EAAE,SAAS,EAAE,GAAG,wDAAa,MAAM,GAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC3F,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC,CAAC,sCAAsC;IACtD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IAClD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CACpC,mFAAmF,EACnF,WAAW,CACZ,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,MAAM,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACb,aAAa,MAAM,mGAAmG,CACvH,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAgB,mBAAmB,CAAC,OAAgB,EAAE,IAAkC;IACtF,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CACV,wFAAwF,CACzF;SACA,MAAM,CACL,uBAAuB,EACvB,sCAAsC,EACtC,wBAAwB,CACzB;SACA,MAAM,CAAC,2BAA2B,EAAE,oCAAoC,CAAC;SACzE,MAAM,CAAC,qBAAqB,EAAE,oDAAoD,EAAE,KAAK,CAAC;SAC1F,MAAM,CAAC,mBAAmB,EAAE,iDAAiD,CAAC;SAC9E,MAAM,CACL,iBAAiB,EACjB,sFAAsF,CACvF;SACA,MAAM,CAAC,oBAAoB,EAAE,6DAA6D,CAAC;SAC3F,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAI,OAAO,CAAC,IAAI,EAAE,CAAC,IAAe,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAClE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YACtD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;YAE3E,MAAM,cAAc,GAAG,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YACnD,MAAM,iBAAiB,GAAG,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YAExD,gDAAgD;YAChD,IAAI,cAAc,IAAI,iBAAiB,EAAE,CAAC;gBACxC,qBAAS,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;gBACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,kEAAkE;YAClE,IAAI,cAAc,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzC,MAAM,yBAAyB,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;gBACnE,OAAO;YACT,CAAC;YAED,sDAAsD;YACtD,0DAA0D;YAC1D,IAAI,CAAC;gBACH,MAAM,IAAA,iBAAU,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,uBAAgB,IAAI,GAAG,YAAY,uBAAgB,EAAE,CAAC;oBACvE,qBAAS,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;oBACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAChB,OAAO;gBACT,CAAC;gBACD,wFAAwF;gBACxF,MAAM,GAAG,CAAC;YACZ,CAAC;YAED,MAAM,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,qBAAS,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,QAAgB,EAChB,cAAsB,EACtB,OAAqC;IAErC,IAAI,OAAe,CAAC;IAEpB,IAAI,OAAO,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnD,wDAAwD;QACxD,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,iBAAiB,EAAE,CAAC;QAC/D,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,MAAM,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,MAAM,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,aAAa,OAAO,mGAAmG,CACxH,CAAC;IACJ,CAAC;IAED,+CAA+C;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,MAAM,GAAoB,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IAClE,qBAAS,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAE/C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAChD,qBAAS,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAChD,CAAC;IAED,qBAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACjC,qBAAS,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAC3D,qBAAS,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,QAAgB,EAChB,YAAoB,EACpB,cAAsB,EACtB,IAAkC,EAClC,OAOC;IAED,IAAI,YAAY,GAAa,CAAC,OAAO,CAAC,YAAY,IAAI,wBAAwB,CAAC;SAC5E,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,IAAI,UAAU,GAAa,OAAO,CAAC,UAAU;QAC3C,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5D,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,OAAO,GAAW,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;IAEjD,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,MAAM,iBAAiB,CACvC,gCAAgC,EAChC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CACvB,CAAC;QACF,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAEzD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC;YAC7E,IAAI,QAAQ,EAAE,CAAC;gBACb,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,qBAAS,CAAC,KAAK,CACb,gFAAgF,CACjF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAiB;QAC7B,OAAO,EAAE,CAAC;QACV,YAAY,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5C,IAAI;YACJ,WAAW,EACT,IAAI,KAAK,YAAY;gBACnB,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,IAAI,KAAK,SAAS;oBAClB,CAAC,CAAC,gBAAgB;oBAClB,CAAC,CAAC,mBAAmB;YAC3B,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC,CAAC;QACH,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACpC,IAAI;YACJ,WAAW,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB;SAC7E,CAAC,CAAC;QACH,IAAI,EAAE;YACJ,eAAe,EAAE,OAAkD;SACpE;QACD,YAAY,EAAE,oCAAoC;KACnD,CAAC;IAEF,wBAAwB;IACxB,MAAM,UAAU,GAAG,IAAI,qBAAc,EAAE,CAAC;IACxC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE9B,kBAAkB;IAClB,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IAClE,qBAAS,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAEvC,0DAA0D;IAC1D,IAAI,UAA8B,CAAC;IACnC,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACtB,qBAAqB;QACrB,IAAI,OAAe,CAAC;QACpB,IAAI,OAAO,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnD,OAAO,GAAG,iBAAiB,EAAE,CAAC;YAC9B,IAAI,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBACpD,MAAM,IAAI,KAAK,CACb,qBAAqB,OAAO,+DAA+D,CAC5F,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,MAAM,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,wBAAwB;QACxB,MAAM,QAAQ,GAAG,MAAM,IAAA,0BAAmB,GAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAA,uBAAgB,EAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;QAE7E,iBAAiB;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,qBAAS,CAAC,OAAO,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC;QACrD,UAAU,GAAG,OAAO,CAAC;QAErB,+CAA+C;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,MAAM,GAAoB,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;QAC1D,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;QAClE,qBAAS,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAE/C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAClC,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAChD,qBAAS,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QAChD,CAAC;QAED,+CAA+C;QAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzE,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;QACpE,qBAAS,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,qDAAqD;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAChE,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;QACpE,qBAAS,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC1C,CAAC;IAED,sBAAsB;IACtB,MAAM,UAAU,GAAG,IAAI,iBAAU,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,IAAI,oBAAa,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,aAAa,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE9D,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAC7D,eAAe,EAAE,CAAC;YACpB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,qBAAS,CAAC,IAAI,CACZ,sBAAsB,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,KAAM,GAAa,CAAC,OAAO,EAAE,CACtF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;QACxB,qBAAS,CAAC,OAAO,CAAC,cAAc,eAAe,oBAAoB,CAAC,CAAC;IACvE,CAAC;IAED,iEAAiE;IACjE,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,eAAe,GAAG,IAAI,sBAAe,EAAE,CAAC;QAC9C,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;gBACf,qBAAS,CAAC,IAAI,CACZ,GAAG,EAAE,CAAC,IAAI,kCAAkC;oBAC1C,oCAAoC,EAAE,CAAC,IAAI,+BAA+B,CAC7E,CAAC;gBACF,SAAS;YACX,CAAC;YAED,uIAAuI;YACvI,MAAM,oBAAoB,CACxB,EAAE,EACF,QAAQ,EACR,eAAe,EACf,UAAU,EACV,QAAQ,EACR,OAAO,CAAC,eAAe;YACvB,0BAA0B,CAAC,CAAC,KAAa,EAAE,EAAE;gBAC3C,YAAY,IAAI,KAAK,CAAC;YACxB,CAAC,CACF,CAAC;QACJ,CAAC;QAED,kGAAkG;QAClG,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,qBAAS,CAAC,OAAO,CACf,cAAc,YAAY,yEAAyE,CACpG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC1D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC;QAC9D,qBAAS,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,qBAAS,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,qCAAqC;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,qBAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,GAAG,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACzC,qBAAS,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAC/C,MAAM,GAAG,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACvC,qBAAS,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,qBAAS,CAAC,IAAI,CACZ,gFAAgF,CACjF,CAAC;IACJ,CAAC;IAED,qBAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACjC,qBAAS,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAChF,qBAAS,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IACzE,qBAAS,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACtD,qBAAS,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,QAAgB;IACjD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,qBAAc,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACvD,0DAA0D;IAC1D,IAAI,YAAgC,CAAC;IACrC,IAAI,QAAQ,CAAC,IAAI,CAAC,eAAe,KAAK,KAAK,EAAE,CAAC;QAC5C,YAAY,GAAG,gCAAgC,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACnE,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,aAAa,CACpB,QAAsB,EACtB,SAAiB,EACjB,YAAgC;IAEhC,MAAM,aAAa,GAA8B,EAAE,CAAC;IAEpD,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACrC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,gBAAgB,CAAC;YACzD,MAAM,IAAI,GAA4B,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;YAEhE,mFAAmF;YACnF,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC;YAEnE,QAAQ,OAAO,EAAE,CAAC;gBAChB,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,MAAM,aAAa,GAAG,IAAA,sCAA+B,EAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC1E,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC9C,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;wBAC3E,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC5B,CAAC;yBAAM,IAAI,YAAY,EAAE,CAAC;wBACxB,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC;oBAC1B,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,WAAW,IAAI,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;oBAC/D,IAAI,GAAG,EAAE,CAAC;wBACR,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;oBACjB,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,mBAAmB,IAAI,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC;oBACtF,IAAI,UAAU,EAAE,CAAC;wBACf,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC;oBAC5B,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,EAAE,eAAe,IAAI,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC;oBAC/E,IAAI,WAAW,EAAE,CAAC;wBAChB,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC;oBACzB,CAAC;oBACD,MAAM;gBACR,CAAC;YACH,CAAC;YAED,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,SAAS,gCAAgC,CAAC,QAAgB;IACxD,+BAA+B;IAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAClE,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;IAC5B,CAAC;IAED,oEAAoE;IACpE,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC9E,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,2BAA2B;IAC3B,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IAC3E,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAoB,CAAC;YACvF,IAAI,MAAM,EAAE,YAAY,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBACxD,IAAI,MAAM;oBAAE,OAAO,MAAM,CAAC;YAC5B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,EACjD,SAAS,EACT,MAAM,EACN,KAAK,EACL,UAAU,CACX,CAAC;IACF,MAAM,MAAM,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAChD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,mBAAmB,CAAC,WAAmB;IAC9C,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO,SAAS,CAAC;QAClD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,qGAAqG;AACrG,KAAK,UAAU,oBAAoB,CACjC,EAAqC,EACrC,QAAsB,EACtB,eAAgC,EAChC,UAAsB,EACtB,QAAgB,EAChB,eAAoC,EACpC,QAAiC;IAEjC,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAO,CAAC,CAAC,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,qBAAS,CAAC,IAAI,CACZ,wCAAwC,EAAE,CAAC,IAAI,kCAAkC,CAClF,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CACpE,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CACtC,CAAC;IAEF,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAExC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CACxB,QAAQ,EACR,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,IAAI,CAAC,CACzF,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACrD,MAAM,WAAW,GAAa,EAAE,CAAC;YAEjC,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,cAAc,EAAE,CAAC;gBACvC,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;oBAC5C,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAA,0BAAmB,GAAE,CAAC;oBAClD,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;YAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;gBACzE,MAAM,IAAA,kBAAW,EAAC,QAAQ,EAAE,WAAW,EAAE,2BAA2B,CAAC,CAAC;gBACtE,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,qBAAS,CAAC,IAAI,CACZ,wCAAwC,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CACzF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,YAAoB;IAC9D,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC;IAEhF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAc,EAAE,EAAE;YACrC,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,YAAY,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EASL,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAIvB,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CAiD9F"}
|