@nowline/cli 0.2.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/LICENSE +190 -0
- package/README.md +372 -0
- package/dist/cli/args.d.ts +54 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +165 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/formats.d.ts +61 -0
- package/dist/cli/formats.d.ts.map +1 -0
- package/dist/cli/formats.js +153 -0
- package/dist/cli/formats.js.map +1 -0
- package/dist/cli/help.d.ts +3 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +90 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/output-path.d.ts +57 -0
- package/dist/cli/output-path.d.ts.map +1 -0
- package/dist/cli/output-path.js +70 -0
- package/dist/cli/output-path.js.map +1 -0
- package/dist/commands/init.d.ts +20 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +80 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/render.d.ts +15 -0
- package/dist/commands/render.d.ts.map +1 -0
- package/dist/commands/render.js +435 -0
- package/dist/commands/render.js.map +1 -0
- package/dist/commands/serve.d.ts +16 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +287 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/convert/parse-json.d.ts +7 -0
- package/dist/convert/parse-json.d.ts.map +1 -0
- package/dist/convert/parse-json.js +34 -0
- package/dist/convert/parse-json.js.map +1 -0
- package/dist/convert/printer.d.ts +6 -0
- package/dist/convert/printer.d.ts.map +1 -0
- package/dist/convert/printer.js +334 -0
- package/dist/convert/printer.js.map +1 -0
- package/dist/convert/schema.d.ts +33 -0
- package/dist/convert/schema.d.ts.map +1 -0
- package/dist/convert/schema.js +77 -0
- package/dist/convert/schema.js.map +1 -0
- package/dist/core/parse.d.ts +24 -0
- package/dist/core/parse.d.ts.map +1 -0
- package/dist/core/parse.js +58 -0
- package/dist/core/parse.js.map +1 -0
- package/dist/diagnostics/adapt.d.ts +46 -0
- package/dist/diagnostics/adapt.d.ts.map +1 -0
- package/dist/diagnostics/adapt.js +109 -0
- package/dist/diagnostics/adapt.js.map +1 -0
- package/dist/diagnostics/format.d.ts +18 -0
- package/dist/diagnostics/format.d.ts.map +1 -0
- package/dist/diagnostics/format.js +41 -0
- package/dist/diagnostics/format.js.map +1 -0
- package/dist/diagnostics/index.d.ts +5 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +5 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/diagnostics/json.d.ts +8 -0
- package/dist/diagnostics/json.d.ts.map +1 -0
- package/dist/diagnostics/json.js +24 -0
- package/dist/diagnostics/json.js.map +1 -0
- package/dist/diagnostics/model.d.ts +44 -0
- package/dist/diagnostics/model.d.ts.map +1 -0
- package/dist/diagnostics/model.js +2 -0
- package/dist/diagnostics/model.js.map +1 -0
- package/dist/diagnostics/text.d.ts +6 -0
- package/dist/diagnostics/text.d.ts.map +1 -0
- package/dist/diagnostics/text.js +43 -0
- package/dist/diagnostics/text.js.map +1 -0
- package/dist/generated/templates.d.ts +4 -0
- package/dist/generated/templates.d.ts.map +1 -0
- package/dist/generated/templates.js +9 -0
- package/dist/generated/templates.js.map +1 -0
- package/dist/generated/version.d.ts +11 -0
- package/dist/generated/version.d.ts.map +1 -0
- package/dist/generated/version.js +8 -0
- package/dist/generated/version.js.map +1 -0
- package/dist/i18n/locale.d.ts +56 -0
- package/dist/i18n/locale.d.ts.map +1 -0
- package/dist/i18n/locale.js +107 -0
- package/dist/i18n/locale.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/io/config.d.ts +2 -0
- package/dist/io/config.d.ts.map +1 -0
- package/dist/io/config.js +5 -0
- package/dist/io/config.js.map +1 -0
- package/dist/io/exit-codes.d.ts +12 -0
- package/dist/io/exit-codes.d.ts.map +1 -0
- package/dist/io/exit-codes.js +15 -0
- package/dist/io/exit-codes.js.map +1 -0
- package/dist/io/read.d.ts +13 -0
- package/dist/io/read.d.ts.map +1 -0
- package/dist/io/read.js +53 -0
- package/dist/io/read.js.map +1 -0
- package/dist/io/write.d.ts +32 -0
- package/dist/io/write.d.ts.map +1 -0
- package/dist/io/write.js +61 -0
- package/dist/io/write.js.map +1 -0
- package/dist/version.d.ts +13 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +20 -0
- package/dist/version.js.map +1 -0
- package/man/fr/nowline.1 +424 -0
- package/man/fr/nowline.5 +1864 -0
- package/man/nowline.1 +517 -0
- package/man/nowline.5 +1784 -0
- package/package.json +66 -0
- package/scripts/bundle-templates.mjs +105 -0
- package/scripts/compile.mjs +131 -0
- package/src/cli/args.ts +252 -0
- package/src/cli/formats.ts +207 -0
- package/src/cli/help.ts +92 -0
- package/src/cli/output-path.ts +98 -0
- package/src/commands/init.ts +99 -0
- package/src/commands/render.ts +566 -0
- package/src/commands/serve.ts +322 -0
- package/src/convert/parse-json.ts +57 -0
- package/src/convert/printer.ts +376 -0
- package/src/convert/schema.ts +105 -0
- package/src/core/parse.ts +93 -0
- package/src/diagnostics/adapt.ts +148 -0
- package/src/diagnostics/format.ts +70 -0
- package/src/diagnostics/index.ts +4 -0
- package/src/diagnostics/json.ts +30 -0
- package/src/diagnostics/model.ts +48 -0
- package/src/diagnostics/text.ts +62 -0
- package/src/generated/templates.ts +12 -0
- package/src/generated/version.ts +18 -0
- package/src/i18n/locale.ts +133 -0
- package/src/index.ts +60 -0
- package/src/io/config.ts +11 -0
- package/src/io/exit-codes.ts +18 -0
- package/src/io/read.ts +70 -0
- package/src/io/write.ts +94 -0
- package/src/version.ts +21 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { parseArgv } from './cli/args.js';
|
|
3
|
+
import { renderHelp, renderVersion } from './cli/help.js';
|
|
4
|
+
import { initHandler } from './commands/init.js';
|
|
5
|
+
import { renderHandler } from './commands/render.js';
|
|
6
|
+
import { serveHandler } from './commands/serve.js';
|
|
7
|
+
import { CliError, ExitCode } from './io/exit-codes.js';
|
|
8
|
+
async function run() {
|
|
9
|
+
const argv = process.argv.slice(2);
|
|
10
|
+
let parsed;
|
|
11
|
+
try {
|
|
12
|
+
parsed = parseArgv(argv);
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
return handleError(err);
|
|
16
|
+
}
|
|
17
|
+
if (parsed.mode === 'help') {
|
|
18
|
+
process.stdout.write(renderHelp());
|
|
19
|
+
return ExitCode.Success;
|
|
20
|
+
}
|
|
21
|
+
if (parsed.mode === 'version') {
|
|
22
|
+
process.stdout.write(renderVersion());
|
|
23
|
+
return ExitCode.Success;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
if (parsed.mode === 'init') {
|
|
27
|
+
await initHandler({ args: parsed });
|
|
28
|
+
}
|
|
29
|
+
else if (parsed.mode === 'serve') {
|
|
30
|
+
await serveHandler({ args: parsed });
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
await renderHandler({ args: parsed });
|
|
34
|
+
}
|
|
35
|
+
return ExitCode.Success;
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
return handleError(err);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function handleError(err) {
|
|
42
|
+
if (err instanceof CliError) {
|
|
43
|
+
if (err.message)
|
|
44
|
+
process.stderr.write(`${err.message}\n`);
|
|
45
|
+
return err.exitCode;
|
|
46
|
+
}
|
|
47
|
+
const message = err instanceof Error ? (err.stack ?? err.message) : String(err);
|
|
48
|
+
process.stderr.write(`${message}\n`);
|
|
49
|
+
return ExitCode.ValidationError;
|
|
50
|
+
}
|
|
51
|
+
run()
|
|
52
|
+
.then((code) => {
|
|
53
|
+
process.exit(code);
|
|
54
|
+
})
|
|
55
|
+
.catch((err) => {
|
|
56
|
+
const message = err instanceof Error ? (err.stack ?? err.message) : String(err);
|
|
57
|
+
process.stderr.write(`${message}\n`);
|
|
58
|
+
process.exit(ExitCode.ValidationError);
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/io/config.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,UAAU,EACV,WAAW,EACX,KAAK,SAAS,EACd,WAAW,GACd,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Thin re-export of the shared `.nowlinerc` loader. The implementation
|
|
2
|
+
// lives in `@nowline/config` so the VS Code/Cursor extension can read the
|
|
3
|
+
// same files without depending on the CLI's heavier export-format graph.
|
|
4
|
+
export { loadConfig, mergeConfig, parseConfig, } from '@nowline/config';
|
|
5
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/io/config.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,0EAA0E;AAC1E,yEAAyE;AACzE,OAAO,EAGH,UAAU,EACV,WAAW,EAEX,WAAW,GACd,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const ExitCode: {
|
|
2
|
+
readonly Success: 0;
|
|
3
|
+
readonly ValidationError: 1;
|
|
4
|
+
readonly InputError: 2;
|
|
5
|
+
readonly OutputError: 3;
|
|
6
|
+
};
|
|
7
|
+
export type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];
|
|
8
|
+
export declare class CliError extends Error {
|
|
9
|
+
readonly exitCode: ExitCode;
|
|
10
|
+
constructor(exitCode: ExitCode, message: string);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=exit-codes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exit-codes.d.ts","sourceRoot":"","sources":["../../src/io/exit-codes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ;;;;;CAKX,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC;AAEhE,qBAAa,QAAS,SAAQ,KAAK;aAEX,QAAQ,EAAE,QAAQ;gBAAlB,QAAQ,EAAE,QAAQ,EAClC,OAAO,EAAE,MAAM;CAKtB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const ExitCode = {
|
|
2
|
+
Success: 0,
|
|
3
|
+
ValidationError: 1,
|
|
4
|
+
InputError: 2,
|
|
5
|
+
OutputError: 3,
|
|
6
|
+
};
|
|
7
|
+
export class CliError extends Error {
|
|
8
|
+
exitCode;
|
|
9
|
+
constructor(exitCode, message) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.exitCode = exitCode;
|
|
12
|
+
this.name = 'CliError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=exit-codes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exit-codes.js","sourceRoot":"","sources":["../../src/io/exit-codes.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG;IACpB,OAAO,EAAE,CAAC;IACV,eAAe,EAAE,CAAC;IAClB,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,CAAC;CACR,CAAC;AAIX,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEX;IADpB,YACoB,QAAkB,EAClC,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,aAAQ,GAAR,QAAQ,CAAU;QAIlC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IAC3B,CAAC;CACJ"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface ReadInputResult {
|
|
2
|
+
contents: string;
|
|
3
|
+
path: string;
|
|
4
|
+
displayPath: string;
|
|
5
|
+
isStdin: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface ReadInputOptions {
|
|
8
|
+
readFile?: (absPath: string) => Promise<string>;
|
|
9
|
+
readStdin?: () => Promise<string>;
|
|
10
|
+
cwd?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function readInput(inputArg: string, options?: ReadInputOptions): Promise<ReadInputResult>;
|
|
13
|
+
//# sourceMappingURL=read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/io/read.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,SAAS,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,gBAAqB,GAC/B,OAAO,CAAC,eAAe,CAAC,CA0B1B"}
|
package/dist/io/read.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { CliError, ExitCode } from './exit-codes.js';
|
|
4
|
+
export async function readInput(inputArg, options = {}) {
|
|
5
|
+
const readFile = options.readFile ?? ((p) => fs.readFile(p, 'utf-8'));
|
|
6
|
+
const readStdin = options.readStdin ?? defaultReadStdin;
|
|
7
|
+
const cwd = options.cwd ?? process.cwd();
|
|
8
|
+
if (inputArg === '-') {
|
|
9
|
+
return {
|
|
10
|
+
contents: await readStdin(),
|
|
11
|
+
path: '<stdin>',
|
|
12
|
+
displayPath: '<stdin>',
|
|
13
|
+
isStdin: true,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const absPath = path.resolve(cwd, inputArg);
|
|
17
|
+
try {
|
|
18
|
+
const contents = await readFile(absPath);
|
|
19
|
+
return {
|
|
20
|
+
contents,
|
|
21
|
+
path: absPath,
|
|
22
|
+
displayPath: inputArg,
|
|
23
|
+
isStdin: false,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
throw new CliError(ExitCode.InputError, formatReadError(inputArg, err));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function formatReadError(inputArg, err) {
|
|
31
|
+
if (isNodeError(err)) {
|
|
32
|
+
if (err.code === 'ENOENT')
|
|
33
|
+
return `File not found: ${inputArg}`;
|
|
34
|
+
if (err.code === 'EACCES')
|
|
35
|
+
return `Permission denied: ${inputArg}`;
|
|
36
|
+
if (err.code === 'EISDIR')
|
|
37
|
+
return `Not a file: ${inputArg}`;
|
|
38
|
+
}
|
|
39
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
40
|
+
return `Could not read ${inputArg}: ${message}`;
|
|
41
|
+
}
|
|
42
|
+
function isNodeError(err) {
|
|
43
|
+
return err instanceof Error && typeof err.code === 'string';
|
|
44
|
+
}
|
|
45
|
+
async function defaultReadStdin() {
|
|
46
|
+
let data = '';
|
|
47
|
+
process.stdin.setEncoding('utf-8');
|
|
48
|
+
for await (const chunk of process.stdin) {
|
|
49
|
+
data += chunk;
|
|
50
|
+
}
|
|
51
|
+
return data;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/io/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAerD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC3B,QAAgB,EAChB,UAA4B,EAAE;IAE9B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,gBAAgB,CAAC;IACxD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEzC,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO;YACH,QAAQ,EAAE,MAAM,SAAS,EAAE;YAC3B,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,SAAS;YACtB,OAAO,EAAE,IAAI;SAChB,CAAC;IACN,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzC,OAAO;YACH,QAAQ;YACR,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,QAAQ;YACrB,OAAO,EAAE,KAAK;SACjB,CAAC;IACN,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5E,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB,EAAE,GAAY;IACnD,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,mBAAmB,QAAQ,EAAE,CAAC;QAChE,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,sBAAsB,QAAQ,EAAE,CAAC;QACnE,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,eAAe,QAAQ,EAAE,CAAC;IAChE,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,kBAAkB,QAAQ,KAAK,OAAO,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,WAAW,CAAC,GAAY;IAC7B,OAAO,GAAG,YAAY,KAAK,IAAI,OAAQ,GAA0B,CAAC,IAAI,KAAK,QAAQ,CAAC;AACxF,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC3B,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACtC,IAAI,IAAI,KAAK,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface WriteOutputOptions {
|
|
2
|
+
/**
|
|
3
|
+
* Current working directory used to resolve relative output paths. Defaults
|
|
4
|
+
* to `process.cwd()`.
|
|
5
|
+
*/
|
|
6
|
+
cwd?: string;
|
|
7
|
+
/**
|
|
8
|
+
* Test seam: writes the output bytes to `absPath`. Defaults to
|
|
9
|
+
* `fs.writeFile`.
|
|
10
|
+
*/
|
|
11
|
+
writeFile?: (absPath: string, data: string | Uint8Array) => Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Test seam: stdout writer. Defaults to `process.stdout.write`.
|
|
14
|
+
*/
|
|
15
|
+
stdoutWrite?: (data: string | Uint8Array) => boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Test seam: stdout-is-a-TTY override. Defaults to `process.stdout.isTTY`.
|
|
18
|
+
*/
|
|
19
|
+
stdoutIsTTY?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export type OutputFormat = 'text' | 'binary';
|
|
22
|
+
/**
|
|
23
|
+
* Writes `data` to either a file (`outputArg` is a path) or stdout (`outputArg`
|
|
24
|
+
* is `-` or `undefined` — though `undefined` is no longer the default; mode
|
|
25
|
+
* dispatch always resolves a concrete path now).
|
|
26
|
+
*
|
|
27
|
+
* Existing files are silently overwritten. m2b.5 removed the `--force` gate;
|
|
28
|
+
* matches POSIX redirection (`> file`) and every peer drawing CLI (mmdc, d2,
|
|
29
|
+
* prettier, tsc, pandoc).
|
|
30
|
+
*/
|
|
31
|
+
export declare function writeOutput(outputArg: string | undefined, data: string | Uint8Array, format: OutputFormat, options?: WriteOutputOptions): Promise<void>;
|
|
32
|
+
//# sourceMappingURL=write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/io/write.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IAC/B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,KAAK,OAAO,CAAC;IACrD;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE7C;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC7B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,IAAI,EAAE,MAAM,GAAG,UAAU,EACzB,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,kBAAuB,GACjC,OAAO,CAAC,IAAI,CAAC,CAkBf"}
|
package/dist/io/write.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { CliError, ExitCode } from './exit-codes.js';
|
|
4
|
+
/**
|
|
5
|
+
* Writes `data` to either a file (`outputArg` is a path) or stdout (`outputArg`
|
|
6
|
+
* is `-` or `undefined` — though `undefined` is no longer the default; mode
|
|
7
|
+
* dispatch always resolves a concrete path now).
|
|
8
|
+
*
|
|
9
|
+
* Existing files are silently overwritten. m2b.5 removed the `--force` gate;
|
|
10
|
+
* matches POSIX redirection (`> file`) and every peer drawing CLI (mmdc, d2,
|
|
11
|
+
* prettier, tsc, pandoc).
|
|
12
|
+
*/
|
|
13
|
+
export async function writeOutput(outputArg, data, format, options = {}) {
|
|
14
|
+
if (outputArg === undefined || outputArg === '-') {
|
|
15
|
+
guardBinaryStdout(format, options);
|
|
16
|
+
const write = options.stdoutWrite ?? ((chunk) => process.stdout.write(chunk));
|
|
17
|
+
const payload = ensureTrailingNewline(data, format);
|
|
18
|
+
write(payload);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const cwd = options.cwd ?? process.cwd();
|
|
22
|
+
const absPath = path.resolve(cwd, outputArg);
|
|
23
|
+
const writeFile = options.writeFile ?? ((p, d) => fs.writeFile(p, d));
|
|
24
|
+
try {
|
|
25
|
+
await writeFile(absPath, data);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
throw new CliError(ExitCode.OutputError, formatWriteError(outputArg, err));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function guardBinaryStdout(format, options) {
|
|
32
|
+
if (format !== 'binary')
|
|
33
|
+
return;
|
|
34
|
+
const isTTY = options.stdoutIsTTY ?? process.stdout.isTTY === true;
|
|
35
|
+
if (isTTY) {
|
|
36
|
+
throw new CliError(ExitCode.InputError, 'nowline: binary output to terminal refused; use -o <path> or pipe to a file.');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function ensureTrailingNewline(data, format) {
|
|
40
|
+
if (format !== 'text')
|
|
41
|
+
return data;
|
|
42
|
+
if (typeof data !== 'string')
|
|
43
|
+
return data;
|
|
44
|
+
return data.endsWith('\n') ? data : `${data}\n`;
|
|
45
|
+
}
|
|
46
|
+
function formatWriteError(outputArg, err) {
|
|
47
|
+
if (isNodeError(err)) {
|
|
48
|
+
if (err.code === 'EACCES')
|
|
49
|
+
return `Permission denied: ${outputArg}`;
|
|
50
|
+
if (err.code === 'ENOENT')
|
|
51
|
+
return `Output directory does not exist: ${outputArg}`;
|
|
52
|
+
if (err.code === 'EISDIR')
|
|
53
|
+
return `Output path is a directory: ${outputArg}`;
|
|
54
|
+
}
|
|
55
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
56
|
+
return `Could not write ${outputArg}: ${message}`;
|
|
57
|
+
}
|
|
58
|
+
function isNodeError(err) {
|
|
59
|
+
return err instanceof Error && typeof err.code === 'string';
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/io/write.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { CLI_BUILD, CLI_VERSION, type CliBuild } from './generated/version.js';
|
|
2
|
+
/**
|
|
3
|
+
* Compose the user-visible version string per SemVer build-metadata
|
|
4
|
+
* rules. Released builds print just the SemVer (`0.1.0`); dev builds
|
|
5
|
+
* append the short SHA (and `.dirty` if the working tree had local
|
|
6
|
+
* edits when the binary was built):
|
|
7
|
+
*
|
|
8
|
+
* release -> 0.1.0
|
|
9
|
+
* dev (clean) -> 0.1.0+abc1234
|
|
10
|
+
* dev (dirty) -> 0.1.0+abc1234.dirty
|
|
11
|
+
*/
|
|
12
|
+
export declare function fullVersionString(): string;
|
|
13
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAI/E;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export { CLI_BUILD, CLI_VERSION } from './generated/version.js';
|
|
2
|
+
import { CLI_BUILD, CLI_VERSION } from './generated/version.js';
|
|
3
|
+
/**
|
|
4
|
+
* Compose the user-visible version string per SemVer build-metadata
|
|
5
|
+
* rules. Released builds print just the SemVer (`0.1.0`); dev builds
|
|
6
|
+
* append the short SHA (and `.dirty` if the working tree had local
|
|
7
|
+
* edits when the binary was built):
|
|
8
|
+
*
|
|
9
|
+
* release -> 0.1.0
|
|
10
|
+
* dev (clean) -> 0.1.0+abc1234
|
|
11
|
+
* dev (dirty) -> 0.1.0+abc1234.dirty
|
|
12
|
+
*/
|
|
13
|
+
export function fullVersionString() {
|
|
14
|
+
if (CLI_BUILD.isRelease || CLI_BUILD.sha === '') {
|
|
15
|
+
return CLI_VERSION;
|
|
16
|
+
}
|
|
17
|
+
const dirty = CLI_BUILD.isDirty ? '.dirty' : '';
|
|
18
|
+
return `${CLI_VERSION}+${CLI_BUILD.sha}${dirty}`;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAiB,MAAM,wBAAwB,CAAC;AAE/E,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEhE;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB;IAC7B,IAAI,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC;QAC9C,OAAO,WAAW,CAAC;IACvB,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,OAAO,GAAG,WAAW,IAAI,SAAS,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC;AACrD,CAAC"}
|