envprism 0.3.0-dev.50-9942530 → 0.3.0-dev.52-1a866db

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.
@@ -1,11 +1,13 @@
1
1
  #!/usr/bin/env bun
2
+ import { a as computeDiff, c as loadEnvprismConfig, o as formatDiffText, r as discoverEnvFiles, s as resolveBase, t as buildMatrix } from "../chunks/matrix-CG1Msljr.mjs";
2
3
  import { defineCommand, runMain } from "citty";
3
4
  import { spawn } from "node:child_process";
4
5
  import { writeFile } from "node:fs/promises";
5
6
  import consola from "consola";
6
- import { resolve, join } from "pathe";
7
- import { l as loadEnvprismConfig, e as discoverEnvFiles, r as resolveBase, b as buildMatrix, c as computeDiff, g as formatDiffText } from "../chunks/matrix-C1pErf9Z.mjs";
8
- const CONFIG_TEMPLATE = `/**
7
+ import { join, resolve } from "pathe";
8
+ //#region src/commands/config/init.ts
9
+ /** Scaffold template, shared with `config edit` for first-time creation. */
10
+ var CONFIG_TEMPLATE = `/**
9
11
  * envprism configuration.
10
12
  *
11
13
  * For type-safe authoring, install envprism and switch to:
@@ -49,273 +51,263 @@ export default {
49
51
  }
50
52
  };
51
53
  `;
52
- const initCommand = defineCommand({
53
- meta: {
54
- name: "init",
55
- description: "Scaffold an envprism.config.ts with documented defaults."
56
- },
57
- args: {
58
- out: {
59
- type: "positional",
60
- required: false,
61
- description: "Directory to write envprism.config.ts into (default: cwd)."
62
- },
63
- force: {
64
- type: "boolean",
65
- description: "Overwrite an existing config file."
66
- }
67
- },
68
- async run({ args }) {
69
- const dir = resolve(typeof args.out === "string" ? args.out : ".");
70
- const target = join(dir, "envprism.config.ts");
71
- try {
72
- await writeFile(target, CONFIG_TEMPLATE, {
73
- encoding: "utf8",
74
- flag: args.force ? "w" : "wx"
75
- });
76
- } catch (err) {
77
- if (err.code === "EEXIST") {
78
- consola.error(`${target} already exists. Use --force to overwrite.`);
79
- process.exitCode = 1;
80
- return;
81
- }
82
- throw err;
83
- }
84
- consola.success(`Wrote ${target}`);
85
- }
54
+ var initCommand = defineCommand({
55
+ meta: {
56
+ name: "init",
57
+ description: "Scaffold an envprism.config.ts with documented defaults."
58
+ },
59
+ args: {
60
+ out: {
61
+ type: "positional",
62
+ required: false,
63
+ description: "Directory to write envprism.config.ts into (default: cwd)."
64
+ },
65
+ force: {
66
+ type: "boolean",
67
+ description: "Overwrite an existing config file."
68
+ }
69
+ },
70
+ async run({ args }) {
71
+ const target = join(resolve(typeof args.out === "string" ? args.out : "."), "envprism.config.ts");
72
+ try {
73
+ await writeFile(target, CONFIG_TEMPLATE, {
74
+ encoding: "utf8",
75
+ flag: args.force ? "w" : "wx"
76
+ });
77
+ } catch (err) {
78
+ if (err.code === "EEXIST") {
79
+ consola.error(`${target} already exists. Use --force to overwrite.`);
80
+ process.exitCode = 1;
81
+ return;
82
+ }
83
+ throw err;
84
+ }
85
+ consola.success(`Wrote ${target}`);
86
+ }
86
87
  });
87
- const editCommand = defineCommand({
88
- meta: {
89
- name: "edit",
90
- description: "Open the config in $EDITOR (creates it in cwd if none exists)."
91
- },
92
- args: {
93
- config: {
94
- type: "string",
95
- description: "Path to an envprism.config file (default: walk up from cwd)."
96
- }
97
- },
98
- async run({ args }) {
99
- let { configFile } = await loadEnvprismConfig({ configFile: args.config });
100
- if (!configFile) {
101
- configFile = resolve("envprism.config.ts");
102
- try {
103
- await writeFile(configFile, CONFIG_TEMPLATE, {
104
- encoding: "utf8",
105
- flag: "wx"
106
- });
107
- consola.info(`Created ${configFile}`);
108
- } catch {
109
- }
110
- }
111
- const editor = process.env.VISUAL || process.env.EDITOR || "nano";
112
- await new Promise((res, rej) => {
113
- const child = spawn(editor, [configFile], { stdio: "inherit" });
114
- child.on("error", rej);
115
- child.on("exit", (code) => {
116
- if (code && code !== 0) {
117
- consola.warn(`${editor} exited with code ${code}.`);
118
- }
119
- res();
120
- });
121
- });
122
- }
123
- });
124
- const pathCommand = defineCommand({
125
- meta: {
126
- name: "path",
127
- description: "Print the resolved config file path (or note that defaults are used)."
128
- },
129
- args: {
130
- config: {
131
- type: "string",
132
- description: "Path to an envprism.config file (default: walk up from cwd)."
133
- }
134
- },
135
- async run({ args }) {
136
- const { configFile, cwd } = await loadEnvprismConfig({
137
- configFile: args.config
138
- });
139
- if (configFile) {
140
- process.stdout.write(configFile + "\n");
141
- } else {
142
- consola.info(
143
- `No envprism.config found (searched up from ${cwd}); using built-in defaults.`
144
- );
145
- }
146
- }
88
+ //#endregion
89
+ //#region src/commands/config/edit.ts
90
+ var editCommand = defineCommand({
91
+ meta: {
92
+ name: "edit",
93
+ description: "Open the config in $EDITOR (creates it in cwd if none exists)."
94
+ },
95
+ args: { config: {
96
+ type: "string",
97
+ description: "Path to an envprism.config file (default: walk up from cwd)."
98
+ } },
99
+ async run({ args }) {
100
+ let { configFile } = await loadEnvprismConfig({ configFile: args.config });
101
+ if (!configFile) {
102
+ configFile = resolve("envprism.config.ts");
103
+ try {
104
+ await writeFile(configFile, CONFIG_TEMPLATE, {
105
+ encoding: "utf8",
106
+ flag: "wx"
107
+ });
108
+ consola.info(`Created ${configFile}`);
109
+ } catch {}
110
+ }
111
+ const editor = process.env.VISUAL || process.env.EDITOR || "nano";
112
+ await new Promise((res, rej) => {
113
+ const child = spawn(editor, [configFile], { stdio: "inherit" });
114
+ child.on("error", rej);
115
+ child.on("exit", (code) => {
116
+ if (code && code !== 0) consola.warn(`${editor} exited with code ${code}.`);
117
+ res();
118
+ });
119
+ });
120
+ }
147
121
  });
148
- const showCommand = defineCommand({
149
- meta: {
150
- name: "show",
151
- description: "Print the effective (merged) config as JSON."
152
- },
153
- args: {
154
- config: {
155
- type: "string",
156
- description: "Path to an envprism.config file (default: walk up from cwd)."
157
- }
158
- },
159
- async run({ args }) {
160
- const { config } = await loadEnvprismConfig({ configFile: args.config });
161
- process.stdout.write(JSON.stringify(config, null, 2) + "\n");
162
- }
122
+ //#endregion
123
+ //#region src/commands/config/index.ts
124
+ var configCommand = defineCommand({
125
+ meta: {
126
+ name: "config",
127
+ description: "Inspect and manage the envprism config."
128
+ },
129
+ subCommands: {
130
+ init: initCommand,
131
+ path: defineCommand({
132
+ meta: {
133
+ name: "path",
134
+ description: "Print the resolved config file path (or note that defaults are used)."
135
+ },
136
+ args: { config: {
137
+ type: "string",
138
+ description: "Path to an envprism.config file (default: walk up from cwd)."
139
+ } },
140
+ async run({ args }) {
141
+ const { configFile, cwd } = await loadEnvprismConfig({ configFile: args.config });
142
+ if (configFile) process.stdout.write(configFile + "\n");
143
+ else consola.info(`No envprism.config found (searched up from ${cwd}); using built-in defaults.`);
144
+ }
145
+ }),
146
+ show: defineCommand({
147
+ meta: {
148
+ name: "show",
149
+ description: "Print the effective (merged) config as JSON."
150
+ },
151
+ args: { config: {
152
+ type: "string",
153
+ description: "Path to an envprism.config file (default: walk up from cwd)."
154
+ } },
155
+ async run({ args }) {
156
+ const { config } = await loadEnvprismConfig({ configFile: args.config });
157
+ process.stdout.write(JSON.stringify(config, null, 2) + "\n");
158
+ }
159
+ }),
160
+ edit: editCommand
161
+ }
163
162
  });
164
- const configCommand = defineCommand({
165
- meta: {
166
- name: "config",
167
- description: "Inspect and manage the envprism config."
168
- },
169
- subCommands: {
170
- init: initCommand,
171
- path: pathCommand,
172
- show: showCommand,
173
- edit: editCommand
174
- }
175
- });
176
- const diffCommand = defineCommand({
177
- meta: {
178
- name: "diff",
179
- description: "Print the drift between .env* files compared to a base."
180
- },
181
- args: {
182
- paths: {
183
- type: "positional",
184
- required: false,
185
- description: "Directory or files to scan (defaults to cwd)."
186
- },
187
- base: {
188
- type: "string",
189
- description: "Base file to diff against (defaults to .env.example)."
190
- },
191
- json: {
192
- type: "boolean",
193
- description: "Emit JSON instead of a text table."
194
- },
195
- check: {
196
- type: "boolean",
197
- description: "Suppress output and exit 1 when any file drifts from the base."
198
- },
199
- config: {
200
- type: "string",
201
- description: "Path to an envprism.config file (default: walk up from cwd)."
202
- }
203
- },
204
- async run({ args }) {
205
- const { config } = await loadEnvprismConfig({ configFile: args.config });
206
- const inputs = collectPaths$1(args.paths, config.discovery.paths);
207
- const files = await discoverEnvFiles(
208
- inputs.map((p) => resolve(p)),
209
- {
210
- skipSuffixes: config.discovery.skipSuffixes,
211
- exampleFirst: config.discovery.exampleFirst
212
- }
213
- );
214
- if (files.length === 0) {
215
- if (!args.check) consola.warn("No .env* files found.");
216
- process.exit(args.check ? 0 : 1);
217
- }
218
- const base = resolveBase(files, args.base, {
219
- name: config.base.name,
220
- priority: config.base.priority
221
- });
222
- if (!base) {
223
- consola.error("Could not resolve a base file.");
224
- process.exit(1);
225
- }
226
- const matrix = buildMatrix(files, base);
227
- const report = computeDiff(matrix);
228
- if (args.check) {
229
- process.exit(report.inSync ? 0 : config.diff.checkExitCode);
230
- }
231
- const json = args.json ?? config.diff.json;
232
- if (json) {
233
- process.stdout.write(JSON.stringify(report, null, 2) + "\n");
234
- return;
235
- }
236
- process.stdout.write(formatDiffText(report));
237
- }
163
+ //#endregion
164
+ //#region src/commands/diff.ts
165
+ var diffCommand = defineCommand({
166
+ meta: {
167
+ name: "diff",
168
+ description: "Print the drift between .env* files compared to a base."
169
+ },
170
+ args: {
171
+ paths: {
172
+ type: "positional",
173
+ required: false,
174
+ description: "Directory or files to scan (defaults to cwd)."
175
+ },
176
+ base: {
177
+ type: "string",
178
+ description: "Base file to diff against (defaults to .env.example)."
179
+ },
180
+ json: {
181
+ type: "boolean",
182
+ description: "Emit JSON instead of a text table."
183
+ },
184
+ check: {
185
+ type: "boolean",
186
+ description: "Suppress output and exit 1 when any file drifts from the base."
187
+ },
188
+ config: {
189
+ type: "string",
190
+ description: "Path to an envprism.config file (default: walk up from cwd)."
191
+ }
192
+ },
193
+ async run({ args }) {
194
+ const { config } = await loadEnvprismConfig({ configFile: args.config });
195
+ const files = await discoverEnvFiles(collectPaths$1(args.paths, config.discovery.paths).map((p) => resolve(p)), {
196
+ skipSuffixes: config.discovery.skipSuffixes,
197
+ exampleFirst: config.discovery.exampleFirst
198
+ });
199
+ if (files.length === 0) {
200
+ if (!args.check) consola.warn("No .env* files found.");
201
+ process.exit(args.check ? 0 : 1);
202
+ }
203
+ const base = resolveBase(files, args.base, {
204
+ name: config.base.name,
205
+ priority: config.base.priority
206
+ });
207
+ if (!base) {
208
+ consola.error("Could not resolve a base file.");
209
+ process.exit(1);
210
+ }
211
+ const report = computeDiff(buildMatrix(files, base));
212
+ if (args.check) process.exit(report.inSync ? 0 : config.diff.checkExitCode);
213
+ if (args.json ?? config.diff.json) {
214
+ process.stdout.write(JSON.stringify(report, null, 2) + "\n");
215
+ return;
216
+ }
217
+ process.stdout.write(formatDiffText(report));
218
+ }
238
219
  });
239
220
  function collectPaths$1(arg, fallback) {
240
- if (Array.isArray(arg)) return arg.map(String);
241
- if (typeof arg === "string" && arg.length > 0) return [arg];
242
- return fallback;
221
+ if (Array.isArray(arg)) return arg.map(String);
222
+ if (typeof arg === "string" && arg.length > 0) return [arg];
223
+ return fallback;
243
224
  }
225
+ //#endregion
226
+ //#region src/commands/tui.ts
227
+ /**
228
+ * Resolve the matrix and boot the TUI. Shared between the explicit `tui`
229
+ * subcommand and the default-no-subcommand path in `rootCommand`.
230
+ */
244
231
  async function runTui(args) {
245
- const { config } = await loadEnvprismConfig({ configFile: args.config });
246
- const inputs = collectPaths(args.paths, config.discovery.paths);
247
- const files = await discoverEnvFiles(
248
- inputs.map((p) => resolve(p)),
249
- {
250
- skipSuffixes: config.discovery.skipSuffixes,
251
- exampleFirst: config.discovery.exampleFirst
252
- }
253
- );
254
- if (files.length === 0) {
255
- consola.warn("No .env* files found.");
256
- process.exit(1);
257
- }
258
- const base = resolveBase(files, args.base, {
259
- name: config.base.name,
260
- priority: config.base.priority
261
- });
262
- if (!base) {
263
- consola.error("Could not resolve a base file.");
264
- process.exit(1);
265
- }
266
- const matrix = buildMatrix(files, base);
267
- const { runMatrixTui } = await import("../chunks/app-DgjyG_HE.mjs");
268
- await runMatrixTui(matrix, config);
232
+ const { config } = await loadEnvprismConfig({ configFile: args.config });
233
+ const files = await discoverEnvFiles(collectPaths(args.paths, config.discovery.paths).map((p) => resolve(p)), {
234
+ skipSuffixes: config.discovery.skipSuffixes,
235
+ exampleFirst: config.discovery.exampleFirst
236
+ });
237
+ if (files.length === 0) {
238
+ consola.warn("No .env* files found.");
239
+ process.exit(1);
240
+ }
241
+ const base = resolveBase(files, args.base, {
242
+ name: config.base.name,
243
+ priority: config.base.priority
244
+ });
245
+ if (!base) {
246
+ consola.error("Could not resolve a base file.");
247
+ process.exit(1);
248
+ }
249
+ const matrix = buildMatrix(files, base);
250
+ const { runMatrixTui } = await import("../chunks/app-sglsNVxB.mjs");
251
+ await runMatrixTui(matrix, config);
269
252
  }
270
- const tuiCommand = defineCommand({
271
- meta: {
272
- name: "tui",
273
- description: "Open the interactive matrix view (default command)."
274
- },
275
- args: {
276
- paths: {
277
- type: "positional",
278
- required: false,
279
- description: "Directory or files to scan (defaults to cwd)."
280
- },
281
- base: {
282
- type: "string",
283
- description: "Base file to diff against (defaults to .env.example)."
284
- },
285
- config: {
286
- type: "string",
287
- description: "Path to an envprism.config file (default: walk up from cwd)."
288
- }
289
- },
290
- async run({ args }) {
291
- await runTui({ paths: args.paths, base: args.base, config: args.config });
292
- }
253
+ var tuiCommand = defineCommand({
254
+ meta: {
255
+ name: "tui",
256
+ description: "Open the interactive matrix view (default command)."
257
+ },
258
+ args: {
259
+ paths: {
260
+ type: "positional",
261
+ required: false,
262
+ description: "Directory or files to scan (defaults to cwd)."
263
+ },
264
+ base: {
265
+ type: "string",
266
+ description: "Base file to diff against (defaults to .env.example)."
267
+ },
268
+ config: {
269
+ type: "string",
270
+ description: "Path to an envprism.config file (default: walk up from cwd)."
271
+ }
272
+ },
273
+ async run({ args }) {
274
+ await runTui({
275
+ paths: args.paths,
276
+ base: args.base,
277
+ config: args.config
278
+ });
279
+ }
293
280
  });
294
281
  function collectPaths(arg, fallback) {
295
- if (Array.isArray(arg)) return arg.map(String);
296
- if (typeof arg === "string" && arg.length > 0) return [arg];
297
- return fallback;
282
+ if (Array.isArray(arg)) return arg.map(String);
283
+ if (typeof arg === "string" && arg.length > 0) return [arg];
284
+ return fallback;
298
285
  }
299
- const SUBCOMMANDS = /* @__PURE__ */ new Set(["tui", "diff", "config"]);
300
- const rootCommand = defineCommand({
301
- meta: {
302
- name: "envprism",
303
- description: "TUI-based env file manager — refract one set of variables into many environment views."
304
- },
305
- subCommands: {
306
- tui: tuiCommand,
307
- diff: diffCommand,
308
- config: configCommand
309
- },
310
- // citty 0.1.6 invokes the root `run` after a matched subcommand returns,
311
- // so guard against double-execution by bailing when the first positional
312
- // arg names a known subcommand. With no args at all we launch the TUI in
313
- // the cwd, which is the documented default.
314
- async run({ rawArgs }) {
315
- const firstPositional = rawArgs.find((a) => !a.startsWith("-"));
316
- if (firstPositional && SUBCOMMANDS.has(firstPositional)) return;
317
- await runTui({});
318
- }
319
- });
320
- runMain(rootCommand);
321
- //# sourceMappingURL=envprism.mjs.map
286
+ //#endregion
287
+ //#region src/cli.ts
288
+ var SUBCOMMANDS = /* @__PURE__ */ new Set([
289
+ "tui",
290
+ "diff",
291
+ "config"
292
+ ]);
293
+ //#endregion
294
+ //#region src/bin/envprism.ts
295
+ runMain(defineCommand({
296
+ meta: {
297
+ name: "envprism",
298
+ description: "TUI-based env file manager refract one set of variables into many environment views."
299
+ },
300
+ subCommands: {
301
+ tui: tuiCommand,
302
+ diff: diffCommand,
303
+ config: configCommand
304
+ },
305
+ async run({ rawArgs }) {
306
+ const firstPositional = rawArgs.find((a) => !a.startsWith("-"));
307
+ if (firstPositional && SUBCOMMANDS.has(firstPositional)) return;
308
+ await runTui({});
309
+ }
310
+ }));
311
+ //#endregion
312
+
313
+ //# sourceMappingURL=envprism.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"envprism.mjs","sources":["../../src/commands/config/init.ts","../../src/commands/config/edit.ts","../../src/commands/config/path.ts","../../src/commands/config/show.ts","../../src/commands/config/index.ts","../../src/commands/diff.ts","../../src/commands/tui.ts","../../src/cli.ts","../../src/bin/envprism.ts"],"sourcesContent":["import { writeFile } from 'node:fs/promises';\nimport { defineCommand } from 'citty';\nimport consola from 'consola';\nimport { join, resolve } from 'pathe';\n\n/** Scaffold template, shared with `config edit` for first-time creation. */\nexport const CONFIG_TEMPLATE = `/**\n * envprism configuration.\n *\n * For type-safe authoring, install envprism and switch to:\n * import { defineEnvprismConfig } from 'envprism/config';\n * export default defineEnvprismConfig({ ... });\n *\n * @type {import('envprism/config').EnvprismUserConfig}\n */\nexport default {\n discovery: {\n // paths: ['.'],\n // skipSuffixesExtra: ['.tmp'],\n // exampleFirst: true\n },\n base: {\n name: '.env.example'\n // priority: ['.env.shared']\n },\n heuristics: {\n // secretTokensExtra: ['JWT'],\n // placeholdersExtra: ['set[_-]?me'],\n grouping: 'auto'\n },\n diff: {\n json: false,\n checkExitCode: 1\n },\n tui: {\n theme: {\n // fgBase: '#82aaff'\n },\n layout: {\n keyColWidth: 22,\n valueColMin: 18,\n sidebarWidth: 30,\n rowGap: 0,\n cellPadX: 1\n },\n undoLimit: 50,\n maskSecrets: true\n }\n};\n`;\n\nexport const initCommand = defineCommand({\n meta: {\n name: 'init',\n description: 'Scaffold an envprism.config.ts with documented defaults.'\n },\n args: {\n out: {\n type: 'positional',\n required: false,\n description: 'Directory to write envprism.config.ts into (default: cwd).'\n },\n force: {\n type: 'boolean',\n description: 'Overwrite an existing config file.'\n }\n },\n async run({ args }) {\n const dir = resolve(typeof args.out === 'string' ? args.out : '.');\n const target = join(dir, 'envprism.config.ts');\n try {\n await writeFile(target, CONFIG_TEMPLATE, {\n encoding: 'utf8',\n flag: args.force ? 'w' : 'wx'\n });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'EEXIST') {\n consola.error(`${target} already exists. Use --force to overwrite.`);\n process.exitCode = 1;\n return;\n }\n throw err;\n }\n consola.success(`Wrote ${target}`);\n }\n});\n","import { spawn } from 'node:child_process';\nimport { writeFile } from 'node:fs/promises';\nimport { defineCommand } from 'citty';\nimport consola from 'consola';\nimport { resolve } from 'pathe';\nimport { CONFIG_TEMPLATE } from '@/commands/config/init.ts';\nimport { loadEnvprismConfig } from '@/config/load.ts';\n\nexport const editCommand = defineCommand({\n meta: {\n name: 'edit',\n description:\n 'Open the config in $EDITOR (creates it in cwd if none exists).'\n },\n args: {\n config: {\n type: 'string',\n description:\n 'Path to an envprism.config file (default: walk up from cwd).'\n }\n },\n async run({ args }) {\n let { configFile } = await loadEnvprismConfig({ configFile: args.config });\n\n if (!configFile) {\n configFile = resolve('envprism.config.ts');\n try {\n await writeFile(configFile, CONFIG_TEMPLATE, {\n encoding: 'utf8',\n flag: 'wx'\n });\n consola.info(`Created ${configFile}`);\n } catch {\n // Created concurrently or already present — open whatever is there.\n }\n }\n\n const editor = process.env.VISUAL || process.env.EDITOR || 'nano';\n await new Promise<void>((res, rej) => {\n const child = spawn(editor, [configFile!], { stdio: 'inherit' });\n child.on('error', rej);\n child.on('exit', (code) => {\n if (code && code !== 0) {\n consola.warn(`${editor} exited with code ${code}.`);\n }\n res();\n });\n });\n }\n});\n","import { defineCommand } from 'citty';\nimport consola from 'consola';\nimport { loadEnvprismConfig } from '@/config/load.ts';\n\nexport const pathCommand = defineCommand({\n meta: {\n name: 'path',\n description:\n 'Print the resolved config file path (or note that defaults are used).'\n },\n args: {\n config: {\n type: 'string',\n description:\n 'Path to an envprism.config file (default: walk up from cwd).'\n }\n },\n async run({ args }) {\n const { configFile, cwd } = await loadEnvprismConfig({\n configFile: args.config\n });\n if (configFile) {\n // Path goes to stdout so it can be piped; the not-found note is on stderr.\n process.stdout.write(configFile + '\\n');\n } else {\n consola.info(\n `No envprism.config found (searched up from ${cwd}); using built-in defaults.`\n );\n }\n }\n});\n","import { defineCommand } from 'citty';\nimport { loadEnvprismConfig } from '@/config/load.ts';\n\nexport const showCommand = defineCommand({\n meta: {\n name: 'show',\n description: 'Print the effective (merged) config as JSON.'\n },\n args: {\n config: {\n type: 'string',\n description:\n 'Path to an envprism.config file (default: walk up from cwd).'\n }\n },\n async run({ args }) {\n const { config } = await loadEnvprismConfig({ configFile: args.config });\n process.stdout.write(JSON.stringify(config, null, 2) + '\\n');\n }\n});\n","import { defineCommand } from 'citty';\nimport { editCommand } from '@/commands/config/edit.ts';\nimport { initCommand } from '@/commands/config/init.ts';\nimport { pathCommand } from '@/commands/config/path.ts';\nimport { showCommand } from '@/commands/config/show.ts';\n\nexport const configCommand = defineCommand({\n meta: {\n name: 'config',\n description: 'Inspect and manage the envprism config.'\n },\n subCommands: {\n init: initCommand,\n path: pathCommand,\n show: showCommand,\n edit: editCommand\n }\n});\n","import { defineCommand } from 'citty';\nimport consola from 'consola';\nimport { resolve } from 'pathe';\nimport { loadEnvprismConfig } from '@/config/load.ts';\nimport { resolveBase } from '@/core/base.ts';\nimport { computeDiff, formatDiffText } from '@/core/diff.ts';\nimport { discoverEnvFiles } from '@/core/discover.ts';\nimport { buildMatrix } from '@/core/matrix.ts';\n\nexport const diffCommand = defineCommand({\n meta: {\n name: 'diff',\n description: 'Print the drift between .env* files compared to a base.'\n },\n args: {\n paths: {\n type: 'positional',\n required: false,\n description: 'Directory or files to scan (defaults to cwd).'\n },\n base: {\n type: 'string',\n description: 'Base file to diff against (defaults to .env.example).'\n },\n json: {\n type: 'boolean',\n description: 'Emit JSON instead of a text table.'\n },\n check: {\n type: 'boolean',\n description:\n 'Suppress output and exit 1 when any file drifts from the base.'\n },\n config: {\n type: 'string',\n description:\n 'Path to an envprism.config file (default: walk up from cwd).'\n }\n },\n async run({ args }) {\n const { config } = await loadEnvprismConfig({ configFile: args.config });\n const inputs = collectPaths(args.paths, config.discovery.paths);\n const files = await discoverEnvFiles(\n inputs.map((p) => resolve(p)),\n {\n skipSuffixes: config.discovery.skipSuffixes,\n exampleFirst: config.discovery.exampleFirst\n }\n );\n\n if (files.length === 0) {\n if (!args.check) consola.warn('No .env* files found.');\n process.exit(args.check ? 0 : 1);\n }\n\n const base = resolveBase(files, args.base, {\n name: config.base.name,\n priority: config.base.priority\n });\n if (!base) {\n consola.error('Could not resolve a base file.');\n process.exit(1);\n }\n\n const matrix = buildMatrix(files, base);\n const report = computeDiff(matrix);\n\n if (args.check) {\n process.exit(report.inSync ? 0 : config.diff.checkExitCode);\n }\n\n const json = args.json ?? config.diff.json;\n if (json) {\n process.stdout.write(JSON.stringify(report, null, 2) + '\\n');\n return;\n }\n\n process.stdout.write(formatDiffText(report));\n }\n});\n\nfunction collectPaths(arg: unknown, fallback: string[]): string[] {\n if (Array.isArray(arg)) return arg.map(String);\n if (typeof arg === 'string' && arg.length > 0) return [arg];\n return fallback;\n}\n","import { defineCommand } from 'citty';\nimport consola from 'consola';\nimport { resolve } from 'pathe';\nimport { loadEnvprismConfig } from '@/config/load.ts';\nimport { resolveBase } from '@/core/base.ts';\nimport { discoverEnvFiles } from '@/core/discover.ts';\nimport { buildMatrix } from '@/core/matrix.ts';\n\ninterface TuiInvocation {\n paths?: string | string[];\n base?: string;\n config?: string;\n}\n\n/**\n * Resolve the matrix and boot the TUI. Shared between the explicit `tui`\n * subcommand and the default-no-subcommand path in `rootCommand`.\n */\nexport async function runTui(args: TuiInvocation): Promise<void> {\n const { config } = await loadEnvprismConfig({ configFile: args.config });\n const inputs = collectPaths(args.paths, config.discovery.paths);\n const files = await discoverEnvFiles(\n inputs.map((p) => resolve(p)),\n {\n skipSuffixes: config.discovery.skipSuffixes,\n exampleFirst: config.discovery.exampleFirst\n }\n );\n\n if (files.length === 0) {\n consola.warn('No .env* files found.');\n process.exit(1);\n }\n\n const base = resolveBase(files, args.base, {\n name: config.base.name,\n priority: config.base.priority\n });\n if (!base) {\n consola.error('Could not resolve a base file.');\n process.exit(1);\n }\n\n const matrix = buildMatrix(files, base);\n\n // Dynamic import keeps @opentui/core out of the bundle path used by the\n // `diff` subcommand, so users running diff on Node never hit Bun-only code.\n const { runMatrixTui } = await import('../tui/app.ts');\n await runMatrixTui(matrix, config);\n}\n\nexport const tuiCommand = defineCommand({\n meta: {\n name: 'tui',\n description: 'Open the interactive matrix view (default command).'\n },\n args: {\n paths: {\n type: 'positional',\n required: false,\n description: 'Directory or files to scan (defaults to cwd).'\n },\n base: {\n type: 'string',\n description: 'Base file to diff against (defaults to .env.example).'\n },\n config: {\n type: 'string',\n description:\n 'Path to an envprism.config file (default: walk up from cwd).'\n }\n },\n async run({ args }) {\n await runTui({ paths: args.paths, base: args.base, config: args.config });\n }\n});\n\nfunction collectPaths(arg: unknown, fallback: string[]): string[] {\n if (Array.isArray(arg)) return arg.map(String);\n if (typeof arg === 'string' && arg.length > 0) return [arg];\n return fallback;\n}\n","import { defineCommand } from 'citty';\nimport { configCommand } from '@/commands/config/index.ts';\nimport { diffCommand } from '@/commands/diff.ts';\nimport { runTui, tuiCommand } from '@/commands/tui.ts';\n\nconst SUBCOMMANDS = new Set(['tui', 'diff', 'config']);\n\nexport const rootCommand = defineCommand({\n meta: {\n name: 'envprism',\n description:\n 'TUI-based env file manager — refract one set of variables into many environment views.'\n },\n subCommands: {\n tui: tuiCommand,\n diff: diffCommand,\n config: configCommand\n },\n // citty 0.1.6 invokes the root `run` after a matched subcommand returns,\n // so guard against double-execution by bailing when the first positional\n // arg names a known subcommand. With no args at all we launch the TUI in\n // the cwd, which is the documented default.\n async run({ rawArgs }) {\n const firstPositional = rawArgs.find((a) => !a.startsWith('-'));\n if (firstPositional && SUBCOMMANDS.has(firstPositional)) return;\n await runTui({});\n }\n});\n","import { runMain } from 'citty';\nimport { rootCommand } from '@/cli.ts';\n\nrunMain(rootCommand);\n"],"names":["collectPaths"],"mappings":"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"}
1
+ {"version":3,"file":"envprism.mjs","names":[],"sources":["../../src/commands/config/init.ts","../../src/commands/config/edit.ts","../../src/commands/config/path.ts","../../src/commands/config/show.ts","../../src/commands/config/index.ts","../../src/commands/diff.ts","../../src/commands/tui.ts","../../src/cli.ts","../../src/bin/envprism.ts"],"sourcesContent":["import { writeFile } from 'node:fs/promises';\nimport { defineCommand } from 'citty';\nimport consola from 'consola';\nimport { join, resolve } from 'pathe';\n\n/** Scaffold template, shared with `config edit` for first-time creation. */\nexport const CONFIG_TEMPLATE = `/**\n * envprism configuration.\n *\n * For type-safe authoring, install envprism and switch to:\n * import { defineEnvprismConfig } from 'envprism/config';\n * export default defineEnvprismConfig({ ... });\n *\n * @type {import('envprism/config').EnvprismUserConfig}\n */\nexport default {\n discovery: {\n // paths: ['.'],\n // skipSuffixesExtra: ['.tmp'],\n // exampleFirst: true\n },\n base: {\n name: '.env.example'\n // priority: ['.env.shared']\n },\n heuristics: {\n // secretTokensExtra: ['JWT'],\n // placeholdersExtra: ['set[_-]?me'],\n grouping: 'auto'\n },\n diff: {\n json: false,\n checkExitCode: 1\n },\n tui: {\n theme: {\n // fgBase: '#82aaff'\n },\n layout: {\n keyColWidth: 22,\n valueColMin: 18,\n sidebarWidth: 30,\n rowGap: 0,\n cellPadX: 1\n },\n undoLimit: 50,\n maskSecrets: true\n }\n};\n`;\n\nexport const initCommand = defineCommand({\n meta: {\n name: 'init',\n description: 'Scaffold an envprism.config.ts with documented defaults.'\n },\n args: {\n out: {\n type: 'positional',\n required: false,\n description: 'Directory to write envprism.config.ts into (default: cwd).'\n },\n force: {\n type: 'boolean',\n description: 'Overwrite an existing config file.'\n }\n },\n async run({ args }) {\n const dir = resolve(typeof args.out === 'string' ? args.out : '.');\n const target = join(dir, 'envprism.config.ts');\n try {\n await writeFile(target, CONFIG_TEMPLATE, {\n encoding: 'utf8',\n flag: args.force ? 'w' : 'wx'\n });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'EEXIST') {\n consola.error(`${target} already exists. Use --force to overwrite.`);\n process.exitCode = 1;\n return;\n }\n throw err;\n }\n consola.success(`Wrote ${target}`);\n }\n});\n","import { spawn } from 'node:child_process';\nimport { writeFile } from 'node:fs/promises';\nimport { defineCommand } from 'citty';\nimport consola from 'consola';\nimport { resolve } from 'pathe';\nimport { CONFIG_TEMPLATE } from '@/commands/config/init.ts';\nimport { loadEnvprismConfig } from '@/config/load.ts';\n\nexport const editCommand = defineCommand({\n meta: {\n name: 'edit',\n description:\n 'Open the config in $EDITOR (creates it in cwd if none exists).'\n },\n args: {\n config: {\n type: 'string',\n description:\n 'Path to an envprism.config file (default: walk up from cwd).'\n }\n },\n async run({ args }) {\n let { configFile } = await loadEnvprismConfig({ configFile: args.config });\n\n if (!configFile) {\n configFile = resolve('envprism.config.ts');\n try {\n await writeFile(configFile, CONFIG_TEMPLATE, {\n encoding: 'utf8',\n flag: 'wx'\n });\n consola.info(`Created ${configFile}`);\n } catch {\n // Created concurrently or already present — open whatever is there.\n }\n }\n\n const editor = process.env.VISUAL || process.env.EDITOR || 'nano';\n await new Promise<void>((res, rej) => {\n const child = spawn(editor, [configFile!], { stdio: 'inherit' });\n child.on('error', rej);\n child.on('exit', (code) => {\n if (code && code !== 0) {\n consola.warn(`${editor} exited with code ${code}.`);\n }\n res();\n });\n });\n }\n});\n","import { defineCommand } from 'citty';\nimport consola from 'consola';\nimport { loadEnvprismConfig } from '@/config/load.ts';\n\nexport const pathCommand = defineCommand({\n meta: {\n name: 'path',\n description:\n 'Print the resolved config file path (or note that defaults are used).'\n },\n args: {\n config: {\n type: 'string',\n description:\n 'Path to an envprism.config file (default: walk up from cwd).'\n }\n },\n async run({ args }) {\n const { configFile, cwd } = await loadEnvprismConfig({\n configFile: args.config\n });\n if (configFile) {\n // Path goes to stdout so it can be piped; the not-found note is on stderr.\n process.stdout.write(configFile + '\\n');\n } else {\n consola.info(\n `No envprism.config found (searched up from ${cwd}); using built-in defaults.`\n );\n }\n }\n});\n","import { defineCommand } from 'citty';\nimport { loadEnvprismConfig } from '@/config/load.ts';\n\nexport const showCommand = defineCommand({\n meta: {\n name: 'show',\n description: 'Print the effective (merged) config as JSON.'\n },\n args: {\n config: {\n type: 'string',\n description:\n 'Path to an envprism.config file (default: walk up from cwd).'\n }\n },\n async run({ args }) {\n const { config } = await loadEnvprismConfig({ configFile: args.config });\n process.stdout.write(JSON.stringify(config, null, 2) + '\\n');\n }\n});\n","import { defineCommand } from 'citty';\nimport { editCommand } from '@/commands/config/edit.ts';\nimport { initCommand } from '@/commands/config/init.ts';\nimport { pathCommand } from '@/commands/config/path.ts';\nimport { showCommand } from '@/commands/config/show.ts';\n\nexport const configCommand = defineCommand({\n meta: {\n name: 'config',\n description: 'Inspect and manage the envprism config.'\n },\n subCommands: {\n init: initCommand,\n path: pathCommand,\n show: showCommand,\n edit: editCommand\n }\n});\n","import { defineCommand } from 'citty';\nimport consola from 'consola';\nimport { resolve } from 'pathe';\nimport { loadEnvprismConfig } from '@/config/load.ts';\nimport { resolveBase } from '@/core/base.ts';\nimport { computeDiff, formatDiffText } from '@/core/diff.ts';\nimport { discoverEnvFiles } from '@/core/discover.ts';\nimport { buildMatrix } from '@/core/matrix.ts';\n\nexport const diffCommand = defineCommand({\n meta: {\n name: 'diff',\n description: 'Print the drift between .env* files compared to a base.'\n },\n args: {\n paths: {\n type: 'positional',\n required: false,\n description: 'Directory or files to scan (defaults to cwd).'\n },\n base: {\n type: 'string',\n description: 'Base file to diff against (defaults to .env.example).'\n },\n json: {\n type: 'boolean',\n description: 'Emit JSON instead of a text table.'\n },\n check: {\n type: 'boolean',\n description:\n 'Suppress output and exit 1 when any file drifts from the base.'\n },\n config: {\n type: 'string',\n description:\n 'Path to an envprism.config file (default: walk up from cwd).'\n }\n },\n async run({ args }) {\n const { config } = await loadEnvprismConfig({ configFile: args.config });\n const inputs = collectPaths(args.paths, config.discovery.paths);\n const files = await discoverEnvFiles(\n inputs.map((p) => resolve(p)),\n {\n skipSuffixes: config.discovery.skipSuffixes,\n exampleFirst: config.discovery.exampleFirst\n }\n );\n\n if (files.length === 0) {\n if (!args.check) consola.warn('No .env* files found.');\n process.exit(args.check ? 0 : 1);\n }\n\n const base = resolveBase(files, args.base, {\n name: config.base.name,\n priority: config.base.priority\n });\n if (!base) {\n consola.error('Could not resolve a base file.');\n process.exit(1);\n }\n\n const matrix = buildMatrix(files, base);\n const report = computeDiff(matrix);\n\n if (args.check) {\n process.exit(report.inSync ? 0 : config.diff.checkExitCode);\n }\n\n const json = args.json ?? config.diff.json;\n if (json) {\n process.stdout.write(JSON.stringify(report, null, 2) + '\\n');\n return;\n }\n\n process.stdout.write(formatDiffText(report));\n }\n});\n\nfunction collectPaths(arg: unknown, fallback: string[]): string[] {\n if (Array.isArray(arg)) return arg.map(String);\n if (typeof arg === 'string' && arg.length > 0) return [arg];\n return fallback;\n}\n","import { defineCommand } from 'citty';\nimport consola from 'consola';\nimport { resolve } from 'pathe';\nimport { loadEnvprismConfig } from '@/config/load.ts';\nimport { resolveBase } from '@/core/base.ts';\nimport { discoverEnvFiles } from '@/core/discover.ts';\nimport { buildMatrix } from '@/core/matrix.ts';\n\ninterface TuiInvocation {\n paths?: string | string[];\n base?: string;\n config?: string;\n}\n\n/**\n * Resolve the matrix and boot the TUI. Shared between the explicit `tui`\n * subcommand and the default-no-subcommand path in `rootCommand`.\n */\nexport async function runTui(args: TuiInvocation): Promise<void> {\n const { config } = await loadEnvprismConfig({ configFile: args.config });\n const inputs = collectPaths(args.paths, config.discovery.paths);\n const files = await discoverEnvFiles(\n inputs.map((p) => resolve(p)),\n {\n skipSuffixes: config.discovery.skipSuffixes,\n exampleFirst: config.discovery.exampleFirst\n }\n );\n\n if (files.length === 0) {\n consola.warn('No .env* files found.');\n process.exit(1);\n }\n\n const base = resolveBase(files, args.base, {\n name: config.base.name,\n priority: config.base.priority\n });\n if (!base) {\n consola.error('Could not resolve a base file.');\n process.exit(1);\n }\n\n const matrix = buildMatrix(files, base);\n\n // Dynamic import keeps @opentui/core out of the bundle path used by the\n // `diff` subcommand, so users running diff on Node never hit Bun-only code.\n const { runMatrixTui } = await import('../tui/app.ts');\n await runMatrixTui(matrix, config);\n}\n\nexport const tuiCommand = defineCommand({\n meta: {\n name: 'tui',\n description: 'Open the interactive matrix view (default command).'\n },\n args: {\n paths: {\n type: 'positional',\n required: false,\n description: 'Directory or files to scan (defaults to cwd).'\n },\n base: {\n type: 'string',\n description: 'Base file to diff against (defaults to .env.example).'\n },\n config: {\n type: 'string',\n description:\n 'Path to an envprism.config file (default: walk up from cwd).'\n }\n },\n async run({ args }) {\n await runTui({ paths: args.paths, base: args.base, config: args.config });\n }\n});\n\nfunction collectPaths(arg: unknown, fallback: string[]): string[] {\n if (Array.isArray(arg)) return arg.map(String);\n if (typeof arg === 'string' && arg.length > 0) return [arg];\n return fallback;\n}\n","import { defineCommand } from 'citty';\nimport { configCommand } from '@/commands/config/index.ts';\nimport { diffCommand } from '@/commands/diff.ts';\nimport { runTui, tuiCommand } from '@/commands/tui.ts';\n\nconst SUBCOMMANDS = new Set(['tui', 'diff', 'config']);\n\nexport const rootCommand = defineCommand({\n meta: {\n name: 'envprism',\n description:\n 'TUI-based env file manager — refract one set of variables into many environment views.'\n },\n subCommands: {\n tui: tuiCommand,\n diff: diffCommand,\n config: configCommand\n },\n // citty 0.1.6 invokes the root `run` after a matched subcommand returns,\n // so guard against double-execution by bailing when the first positional\n // arg names a known subcommand. With no args at all we launch the TUI in\n // the cwd, which is the documented default.\n async run({ rawArgs }) {\n const firstPositional = rawArgs.find((a) => !a.startsWith('-'));\n if (firstPositional && SUBCOMMANDS.has(firstPositional)) return;\n await runTui({});\n }\n});\n","import { runMain } from 'citty';\nimport { rootCommand } from '@/cli.ts';\n\nrunMain(rootCommand);\n"],"mappings":"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"}