@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.
Files changed (139) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +372 -0
  3. package/dist/cli/args.d.ts +54 -0
  4. package/dist/cli/args.d.ts.map +1 -0
  5. package/dist/cli/args.js +165 -0
  6. package/dist/cli/args.js.map +1 -0
  7. package/dist/cli/formats.d.ts +61 -0
  8. package/dist/cli/formats.d.ts.map +1 -0
  9. package/dist/cli/formats.js +153 -0
  10. package/dist/cli/formats.js.map +1 -0
  11. package/dist/cli/help.d.ts +3 -0
  12. package/dist/cli/help.d.ts.map +1 -0
  13. package/dist/cli/help.js +90 -0
  14. package/dist/cli/help.js.map +1 -0
  15. package/dist/cli/output-path.d.ts +57 -0
  16. package/dist/cli/output-path.d.ts.map +1 -0
  17. package/dist/cli/output-path.js +70 -0
  18. package/dist/cli/output-path.js.map +1 -0
  19. package/dist/commands/init.d.ts +20 -0
  20. package/dist/commands/init.d.ts.map +1 -0
  21. package/dist/commands/init.js +80 -0
  22. package/dist/commands/init.js.map +1 -0
  23. package/dist/commands/render.d.ts +15 -0
  24. package/dist/commands/render.d.ts.map +1 -0
  25. package/dist/commands/render.js +435 -0
  26. package/dist/commands/render.js.map +1 -0
  27. package/dist/commands/serve.d.ts +16 -0
  28. package/dist/commands/serve.d.ts.map +1 -0
  29. package/dist/commands/serve.js +287 -0
  30. package/dist/commands/serve.js.map +1 -0
  31. package/dist/convert/parse-json.d.ts +7 -0
  32. package/dist/convert/parse-json.d.ts.map +1 -0
  33. package/dist/convert/parse-json.js +34 -0
  34. package/dist/convert/parse-json.js.map +1 -0
  35. package/dist/convert/printer.d.ts +6 -0
  36. package/dist/convert/printer.d.ts.map +1 -0
  37. package/dist/convert/printer.js +334 -0
  38. package/dist/convert/printer.js.map +1 -0
  39. package/dist/convert/schema.d.ts +33 -0
  40. package/dist/convert/schema.d.ts.map +1 -0
  41. package/dist/convert/schema.js +77 -0
  42. package/dist/convert/schema.js.map +1 -0
  43. package/dist/core/parse.d.ts +24 -0
  44. package/dist/core/parse.d.ts.map +1 -0
  45. package/dist/core/parse.js +58 -0
  46. package/dist/core/parse.js.map +1 -0
  47. package/dist/diagnostics/adapt.d.ts +46 -0
  48. package/dist/diagnostics/adapt.d.ts.map +1 -0
  49. package/dist/diagnostics/adapt.js +109 -0
  50. package/dist/diagnostics/adapt.js.map +1 -0
  51. package/dist/diagnostics/format.d.ts +18 -0
  52. package/dist/diagnostics/format.d.ts.map +1 -0
  53. package/dist/diagnostics/format.js +41 -0
  54. package/dist/diagnostics/format.js.map +1 -0
  55. package/dist/diagnostics/index.d.ts +5 -0
  56. package/dist/diagnostics/index.d.ts.map +1 -0
  57. package/dist/diagnostics/index.js +5 -0
  58. package/dist/diagnostics/index.js.map +1 -0
  59. package/dist/diagnostics/json.d.ts +8 -0
  60. package/dist/diagnostics/json.d.ts.map +1 -0
  61. package/dist/diagnostics/json.js +24 -0
  62. package/dist/diagnostics/json.js.map +1 -0
  63. package/dist/diagnostics/model.d.ts +44 -0
  64. package/dist/diagnostics/model.d.ts.map +1 -0
  65. package/dist/diagnostics/model.js +2 -0
  66. package/dist/diagnostics/model.js.map +1 -0
  67. package/dist/diagnostics/text.d.ts +6 -0
  68. package/dist/diagnostics/text.d.ts.map +1 -0
  69. package/dist/diagnostics/text.js +43 -0
  70. package/dist/diagnostics/text.js.map +1 -0
  71. package/dist/generated/templates.d.ts +4 -0
  72. package/dist/generated/templates.d.ts.map +1 -0
  73. package/dist/generated/templates.js +9 -0
  74. package/dist/generated/templates.js.map +1 -0
  75. package/dist/generated/version.d.ts +11 -0
  76. package/dist/generated/version.d.ts.map +1 -0
  77. package/dist/generated/version.js +8 -0
  78. package/dist/generated/version.js.map +1 -0
  79. package/dist/i18n/locale.d.ts +56 -0
  80. package/dist/i18n/locale.d.ts.map +1 -0
  81. package/dist/i18n/locale.js +107 -0
  82. package/dist/i18n/locale.js.map +1 -0
  83. package/dist/index.d.ts +3 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +60 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/io/config.d.ts +2 -0
  88. package/dist/io/config.d.ts.map +1 -0
  89. package/dist/io/config.js +5 -0
  90. package/dist/io/config.js.map +1 -0
  91. package/dist/io/exit-codes.d.ts +12 -0
  92. package/dist/io/exit-codes.d.ts.map +1 -0
  93. package/dist/io/exit-codes.js +15 -0
  94. package/dist/io/exit-codes.js.map +1 -0
  95. package/dist/io/read.d.ts +13 -0
  96. package/dist/io/read.d.ts.map +1 -0
  97. package/dist/io/read.js +53 -0
  98. package/dist/io/read.js.map +1 -0
  99. package/dist/io/write.d.ts +32 -0
  100. package/dist/io/write.d.ts.map +1 -0
  101. package/dist/io/write.js +61 -0
  102. package/dist/io/write.js.map +1 -0
  103. package/dist/version.d.ts +13 -0
  104. package/dist/version.d.ts.map +1 -0
  105. package/dist/version.js +20 -0
  106. package/dist/version.js.map +1 -0
  107. package/man/fr/nowline.1 +424 -0
  108. package/man/fr/nowline.5 +1864 -0
  109. package/man/nowline.1 +517 -0
  110. package/man/nowline.5 +1784 -0
  111. package/package.json +66 -0
  112. package/scripts/bundle-templates.mjs +105 -0
  113. package/scripts/compile.mjs +131 -0
  114. package/src/cli/args.ts +252 -0
  115. package/src/cli/formats.ts +207 -0
  116. package/src/cli/help.ts +92 -0
  117. package/src/cli/output-path.ts +98 -0
  118. package/src/commands/init.ts +99 -0
  119. package/src/commands/render.ts +566 -0
  120. package/src/commands/serve.ts +322 -0
  121. package/src/convert/parse-json.ts +57 -0
  122. package/src/convert/printer.ts +376 -0
  123. package/src/convert/schema.ts +105 -0
  124. package/src/core/parse.ts +93 -0
  125. package/src/diagnostics/adapt.ts +148 -0
  126. package/src/diagnostics/format.ts +70 -0
  127. package/src/diagnostics/index.ts +4 -0
  128. package/src/diagnostics/json.ts +30 -0
  129. package/src/diagnostics/model.ts +48 -0
  130. package/src/diagnostics/text.ts +62 -0
  131. package/src/generated/templates.ts +12 -0
  132. package/src/generated/version.ts +18 -0
  133. package/src/i18n/locale.ts +133 -0
  134. package/src/index.ts +60 -0
  135. package/src/io/config.ts +11 -0
  136. package/src/io/exit-codes.ts +18 -0
  137. package/src/io/read.ts +70 -0
  138. package/src/io/write.ts +94 -0
  139. package/src/version.ts +21 -0
@@ -0,0 +1,20 @@
1
+ import type { ParsedArgs } from '../cli/args.js';
2
+ export interface InitHandlerOptions {
3
+ args: ParsedArgs;
4
+ /** Test seam: cwd override. Defaults to `process.cwd()`. */
5
+ cwd?: string;
6
+ }
7
+ /**
8
+ * `--init` mode handler. Scaffolds a starter `.nowline` file in cwd.
9
+ *
10
+ * Positional argument is the project *name*, not a file path:
11
+ * - No extension → append `.nowline`.
12
+ * - `.nowline` → use literal.
13
+ * - Other extension → exit 2.
14
+ * - Missing positional → default name "roadmap".
15
+ *
16
+ * `-o` overrides the resolved path. Existing files are silently overwritten.
17
+ */
18
+ export declare function initHandler(options: InitHandlerOptions): Promise<void>;
19
+ export declare function applyName(template: string, name: string | undefined): string;
20
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAMjD,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B5E;AA6BD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAU5E"}
@@ -0,0 +1,80 @@
1
+ import { defaultInitOutputPath, initNameHasIncompatibleExtension } from '../cli/output-path.js';
2
+ import { TEMPLATE_NAMES, TEMPLATES } from '../generated/templates.js';
3
+ import { CliError, ExitCode } from '../io/exit-codes.js';
4
+ import { writeOutput } from '../io/write.js';
5
+ /**
6
+ * `--init` mode handler. Scaffolds a starter `.nowline` file in cwd.
7
+ *
8
+ * Positional argument is the project *name*, not a file path:
9
+ * - No extension → append `.nowline`.
10
+ * - `.nowline` → use literal.
11
+ * - Other extension → exit 2.
12
+ * - Missing positional → default name "roadmap".
13
+ *
14
+ * `-o` overrides the resolved path. Existing files are silently overwritten.
15
+ */
16
+ export async function initHandler(options) {
17
+ const { args } = options;
18
+ const cwd = options.cwd ?? process.cwd();
19
+ const template = parseTemplateName(args.template);
20
+ const positional = args.positional;
21
+ if (positional !== undefined &&
22
+ positional !== '' &&
23
+ initNameHasIncompatibleExtension(positional)) {
24
+ throw new CliError(ExitCode.InputError, `nowline: --init only scaffolds .nowline files; got "${positional}".`);
25
+ }
26
+ const projectName = projectNameFor(positional);
27
+ const titleName = titleFor(positional);
28
+ const templateText = TEMPLATES[template];
29
+ const rendered = applyName(templateText, titleName);
30
+ const outputPath = args.output ?? defaultInitOutputPath({ name: projectName, cwd });
31
+ await writeOutput(outputPath, rendered, 'text', { cwd });
32
+ if (args.logLevel === 'verbose') {
33
+ process.stderr.write(`nowline: wrote ${outputPath}\n`);
34
+ }
35
+ }
36
+ function parseTemplateName(raw) {
37
+ const value = (raw ?? '').toLowerCase();
38
+ if (value === '')
39
+ return 'minimal';
40
+ if (TEMPLATE_NAMES.includes(value)) {
41
+ return value;
42
+ }
43
+ throw new CliError(ExitCode.InputError, `nowline: unknown --template "${raw}". Choose one of: ${TEMPLATE_NAMES.join(', ')}.`);
44
+ }
45
+ function projectNameFor(positional) {
46
+ if (!positional)
47
+ return undefined;
48
+ return positional;
49
+ }
50
+ /**
51
+ * Returns the title to substitute into the roadmap declaration. When the user
52
+ * passes a positional we use it as-is; trailing `.nowline` is stripped so the
53
+ * title isn't `My Plan.nowline`.
54
+ */
55
+ function titleFor(positional) {
56
+ if (!positional)
57
+ return undefined;
58
+ return positional.endsWith('.nowline') ? positional.slice(0, -'.nowline'.length) : positional;
59
+ }
60
+ export function applyName(template, name) {
61
+ if (!name)
62
+ return template;
63
+ const lines = template.split('\n');
64
+ for (let i = 0; i < lines.length; i++) {
65
+ const line = lines[i];
66
+ if (!/^\s*roadmap\b/.test(line))
67
+ continue;
68
+ lines[i] = rewriteRoadmapTitle(line, name);
69
+ break;
70
+ }
71
+ return lines.join('\n');
72
+ }
73
+ function rewriteRoadmapTitle(line, name) {
74
+ const match = line.match(/^(\s*roadmap\s+[A-Za-z_][A-Za-z0-9_-]*)(\s+"[^"]*")?(.*)$/);
75
+ if (!match)
76
+ return line;
77
+ const [, head, , tail] = match;
78
+ return `${head} ${JSON.stringify(name)}${tail}`;
79
+ }
80
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type AssetResolver } from '@nowline/renderer';
2
+ import type { ParsedArgs } from '../cli/args.js';
3
+ export interface RenderHandlerOptions {
4
+ args: ParsedArgs;
5
+ /** Test seam: cwd override. Defaults to `process.cwd()`. */
6
+ cwd?: string;
7
+ }
8
+ /**
9
+ * Default render handler. Produces output in the resolved format and writes
10
+ * it to the resolved path (file or stdout). Honors `--dry-run` (skip write
11
+ * step), `--input-format`, and `.json` AST input.
12
+ */
13
+ export declare function renderHandler(options: RenderHandlerOptions): Promise<void>;
14
+ export declare function createAssetResolver(assetRoot: string): AssetResolver;
15
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/commands/render.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,aAAa,EAAa,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAwBjD,MAAM,WAAW,oBAAoB;IACjC,IAAI,EAAE,UAAU,CAAC;IACjB,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4FhF;AA4ZD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAWpE"}
@@ -0,0 +1,435 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { resolveIncludes } from '@nowline/core';
4
+ import { lengthToPoints, parseLength } from '@nowline/export-core';
5
+ import { layoutRoadmap } from '@nowline/layout';
6
+ import { renderSvg } from '@nowline/renderer';
7
+ import { FormatResolutionError, isInputFormat, resolveFormat, } from '../cli/formats.js';
8
+ import { resolveRenderOutputPath } from '../cli/output-path.js';
9
+ import { parseNowlineJson } from '../convert/parse-json.js';
10
+ import { printNowlineFile } from '../convert/printer.js';
11
+ import { serializeToJson } from '../convert/schema.js';
12
+ import { getServices, parseSource } from '../core/parse.js';
13
+ import { formatDiagnostics } from '../diagnostics/index.js';
14
+ import { describeContentLocaleSource, operatorLocale, readDirectiveLocale, resolveLocaleOverride, } from '../i18n/locale.js';
15
+ import { loadConfig } from '../io/config.js';
16
+ import { CliError, ExitCode } from '../io/exit-codes.js';
17
+ import { readInput } from '../io/read.js';
18
+ import { writeOutput } from '../io/write.js';
19
+ /**
20
+ * Default render handler. Produces output in the resolved format and writes
21
+ * it to the resolved path (file or stdout). Honors `--dry-run` (skip write
22
+ * step), `--input-format`, and `.json` AST input.
23
+ */
24
+ export async function renderHandler(options) {
25
+ const { args } = options;
26
+ const cwd = options.cwd ?? process.cwd();
27
+ if (!args.positional) {
28
+ throw new CliError(ExitCode.InputError, 'nowline: missing input file. Pass a path, "-" for stdin, or run `nowline --help`.');
29
+ }
30
+ const isStdoutOutput = args.output === '-';
31
+ const config = await loadConfigFor(args.positional, cwd);
32
+ const format = resolveFormatOrThrow({
33
+ flag: args.format,
34
+ outputPath: args.output,
35
+ configFormat: typeof config?.defaultFormat === 'string' ? config.defaultFormat : undefined,
36
+ isStdout: isStdoutOutput,
37
+ });
38
+ if (args.logLevel === 'verbose') {
39
+ process.stderr.write(`nowline: format=${format} (resolved)\n`);
40
+ }
41
+ const resolvedOutput = resolveRenderOutputPath({
42
+ outputArg: args.output,
43
+ isStdout: isStdoutOutput,
44
+ inputArg: args.positional,
45
+ isStdin: args.positional === '-',
46
+ format,
47
+ cwd,
48
+ });
49
+ const inputFormat = resolveInputFormat(args.positional, args.inputFormat);
50
+ const input = await readInput(args.positional, { cwd });
51
+ const resolved = resolveLocaleOverride({
52
+ flag: args.locale,
53
+ env: process.env,
54
+ rc: stringFromConfig(config, 'locale'),
55
+ });
56
+ const locale = resolved.tag;
57
+ const opLocale = operatorLocale(resolved);
58
+ const { rendered, isBinary } = await produce({
59
+ format,
60
+ inputFormat,
61
+ contents: input.contents,
62
+ displayPath: input.displayPath,
63
+ absInputPath: input.isStdin ? path.resolve(cwd, 'stdin.nowline') : input.path,
64
+ isStdin: input.isStdin,
65
+ theme: parseTheme(args.theme),
66
+ today: resolveNowArg(args),
67
+ width: parseWidthArg(args.width),
68
+ noLinks: args.noLinks,
69
+ strict: args.strict,
70
+ assetRoot: args.assetRoot,
71
+ // m2c format-specific options. Strings get parsed inside the format
72
+ // dispatch; the CLI just passes them through.
73
+ pageSize: args.pageSize ?? stringFromConfig(config, 'pdfPageSize'),
74
+ orientation: args.orientation ?? stringFromConfig(config, 'pdfOrientation'),
75
+ margin: args.margin ?? stringFromConfig(config, 'pdfMargin'),
76
+ fontSans: args.fontSans ?? stringFromConfig(config, 'fontSans'),
77
+ fontMono: args.fontMono ?? stringFromConfig(config, 'fontMono'),
78
+ headless: args.headless || boolFromConfig(config, 'headlessFonts'),
79
+ scale: args.scale,
80
+ start: args.start,
81
+ locale,
82
+ operatorLocale: opLocale,
83
+ resolvedLocale: resolved,
84
+ verbose: args.logLevel === 'verbose',
85
+ });
86
+ if (args.dryRun) {
87
+ if (args.logLevel === 'verbose') {
88
+ process.stderr.write('nowline: --dry-run; skipping write\n');
89
+ }
90
+ return;
91
+ }
92
+ await writeOutput(resolvedOutput.isStdout ? '-' : resolvedOutput.path, rendered, isBinary ? 'binary' : 'text', { cwd });
93
+ if (args.logLevel === 'verbose' && !resolvedOutput.isStdout) {
94
+ process.stderr.write(`nowline: wrote ${resolvedOutput.path}\n`);
95
+ }
96
+ }
97
+ function resolveFormatOrThrow(inputs) {
98
+ try {
99
+ return resolveFormat({
100
+ flagFormat: inputs.flag,
101
+ outputPath: inputs.outputPath,
102
+ configFormat: inputs.configFormat,
103
+ isStdout: inputs.isStdout,
104
+ }).format;
105
+ }
106
+ catch (err) {
107
+ if (err instanceof FormatResolutionError) {
108
+ throw new CliError(ExitCode.InputError, `nowline: ${err.message}`);
109
+ }
110
+ throw err;
111
+ }
112
+ }
113
+ function resolveInputFormat(inputArg, override) {
114
+ if (override) {
115
+ const lower = override.toLowerCase();
116
+ if (!isInputFormat(lower)) {
117
+ throw new CliError(ExitCode.InputError, `nowline: invalid --input-format "${override}". Expected nowline or json.`);
118
+ }
119
+ return lower;
120
+ }
121
+ if (inputArg === '-')
122
+ return 'nowline';
123
+ const ext = path.extname(inputArg).toLowerCase();
124
+ if (ext === '.json')
125
+ return 'json';
126
+ return 'nowline';
127
+ }
128
+ async function produce(args) {
129
+ if (args.format === 'json') {
130
+ return { rendered: await produceJson(args), isBinary: false };
131
+ }
132
+ if (args.format === 'nowline') {
133
+ return { rendered: await produceCanonicalNowline(args), isBinary: false };
134
+ }
135
+ // The remaining formats all start from a positioned model + (sometimes) an
136
+ // SVG. Build them once and dispatch to the format-specific exporter via
137
+ // dynamic import — keeps each exporter's heavy deps off cold paths and
138
+ // leaves room to re-extract a package later if a future build profile
139
+ // wants to slim down.
140
+ const stage = await stageRoadmap(args);
141
+ if (args.format === 'svg') {
142
+ return { rendered: stage.svg, isBinary: false };
143
+ }
144
+ try {
145
+ if (args.format === 'html') {
146
+ const mod = await import('@nowline/export-html');
147
+ const html = await mod.exportHtml(stage.exportInputs, stage.svg);
148
+ return { rendered: html, isBinary: false };
149
+ }
150
+ if (args.format === 'mermaid') {
151
+ const mod = await import('@nowline/export-mermaid');
152
+ const md = mod.exportMermaid(stage.exportInputs);
153
+ return { rendered: md, isBinary: false };
154
+ }
155
+ if (args.format === 'msproj') {
156
+ const mod = await import('@nowline/export-msproj');
157
+ const xml = mod.exportMsProjXml(stage.exportInputs, {
158
+ startDate: args.start,
159
+ });
160
+ return { rendered: xml, isBinary: false };
161
+ }
162
+ if (args.format === 'png') {
163
+ const fonts = await stage.fontPair();
164
+ const mod = await import('@nowline/export-png');
165
+ const png = await mod.exportPng(stage.exportInputs, stage.svg, {
166
+ scale: parseScale(args.scale),
167
+ fonts,
168
+ });
169
+ return { rendered: png, isBinary: true };
170
+ }
171
+ if (args.format === 'pdf') {
172
+ const fonts = await stage.fontPair();
173
+ const mod = await import('@nowline/export-pdf');
174
+ const pdf = await mod.exportPdf(stage.exportInputs, stage.svg, {
175
+ pageSize: args.pageSize,
176
+ orientation: parseOrientation(args.orientation),
177
+ marginPt: parseMargin(args.margin),
178
+ fonts,
179
+ });
180
+ return { rendered: pdf, isBinary: true };
181
+ }
182
+ if (args.format === 'xlsx') {
183
+ const mod = await import('@nowline/export-xlsx');
184
+ const xlsx = await mod.exportXlsx(stage.exportInputs, {
185
+ generated: args.today,
186
+ });
187
+ return { rendered: xlsx, isBinary: true };
188
+ }
189
+ }
190
+ catch (err) {
191
+ if (err instanceof CliError)
192
+ throw err;
193
+ const message = err instanceof Error ? err.message : String(err);
194
+ throw new CliError(ExitCode.OutputError, `nowline: ${args.format} export failed: ${message}`);
195
+ }
196
+ throw new CliError(ExitCode.InputError, `nowline: unsupported format "${args.format}".`);
197
+ }
198
+ async function produceJson(args) {
199
+ if (args.inputFormat === 'json') {
200
+ // Re-parse JSON → DSL → JSON to canonicalize through @nowline/core.
201
+ const { ast } = parseNowlineJson(args.contents, args.displayPath);
202
+ const text = printNowlineFile(ast);
203
+ const parsed = await parseAndValidate(text, args);
204
+ return JSON.stringify(serializeToJson(parsed.document, text), null, 2);
205
+ }
206
+ const parsed = await parseAndValidate(args.contents, args);
207
+ return JSON.stringify(serializeToJson(parsed.document, args.contents), null, 2);
208
+ }
209
+ async function produceCanonicalNowline(args) {
210
+ if (args.inputFormat === 'json') {
211
+ const { ast } = parseNowlineJson(args.contents, args.displayPath);
212
+ return printNowlineFile(ast);
213
+ }
214
+ const parsed = await parseAndValidate(args.contents, args);
215
+ const doc = serializeToJson(parsed.document, args.contents);
216
+ return printNowlineFile(doc.ast);
217
+ }
218
+ async function stageRoadmap(args) {
219
+ const parsed = await parseAndValidate(args.inputFormat === 'json'
220
+ ? jsonToNowlineText(args.contents, args.displayPath)
221
+ : args.contents, args);
222
+ const resolved = await resolveIncludes(parsed.ast, args.absInputPath, {
223
+ services: getServices().Nowline,
224
+ });
225
+ for (const diag of resolved.diagnostics) {
226
+ if (diag.severity === 'error') {
227
+ process.stderr.write(`${diag.sourcePath}: ${diag.message}\n`);
228
+ }
229
+ }
230
+ if (resolved.diagnostics.some((d) => d.severity === 'error')) {
231
+ throw new CliError(ExitCode.ValidationError, '');
232
+ }
233
+ const model = layoutRoadmap(parsed.ast, resolved, {
234
+ theme: args.theme,
235
+ today: args.today,
236
+ width: args.width,
237
+ locale: args.locale,
238
+ });
239
+ const assetRoot = args.assetRoot
240
+ ? path.resolve(args.assetRoot)
241
+ : path.dirname(args.absInputPath);
242
+ const resolver = createAssetResolver(assetRoot);
243
+ const warnings = [];
244
+ const svg = await renderSvg(model, {
245
+ assetResolver: resolver,
246
+ noLinks: args.noLinks,
247
+ strict: args.strict,
248
+ warn: (msg) => warnings.push(msg),
249
+ });
250
+ for (const w of warnings) {
251
+ process.stderr.write(`warning: ${w}\n`);
252
+ }
253
+ let cachedFonts;
254
+ const fontPair = async () => {
255
+ if (cachedFonts)
256
+ return cachedFonts;
257
+ const mod = await import('@nowline/export-core');
258
+ const result = await mod.resolveFonts({
259
+ fontSans: args.fontSans,
260
+ fontMono: args.fontMono,
261
+ headless: args.headless,
262
+ });
263
+ if (args.strict) {
264
+ if (result.sansFellBackToBundled) {
265
+ process.stderr.write('warning: sans font fell back to bundled DejaVu (no platform font found)\n');
266
+ }
267
+ if (result.monoFellBackToBundled) {
268
+ process.stderr.write('warning: mono font fell back to bundled DejaVu (no platform font found)\n');
269
+ }
270
+ }
271
+ cachedFonts = { sans: result.sans, mono: result.mono };
272
+ return cachedFonts;
273
+ };
274
+ return {
275
+ svg,
276
+ exportInputs: {
277
+ ast: parsed.ast,
278
+ resolved,
279
+ model,
280
+ sourcePath: args.displayPath,
281
+ today: args.today,
282
+ },
283
+ fontPair,
284
+ };
285
+ }
286
+ function jsonToNowlineText(contents, displayPath) {
287
+ const { ast } = parseNowlineJson(contents, displayPath);
288
+ return printNowlineFile(ast);
289
+ }
290
+ async function parseAndValidate(contents, args) {
291
+ const result = await parseSource(contents, args.displayPath, { validate: true });
292
+ if (result.hasErrors) {
293
+ emitDiagnostics(result.diagnostics, result.source, args.displayPath, args.operatorLocale);
294
+ throw new CliError(ExitCode.ValidationError, '');
295
+ }
296
+ if (args.verbose) {
297
+ const directive = readDirectiveLocale(result.ast);
298
+ const { tag, source } = describeContentLocaleSource(directive, args.resolvedLocale);
299
+ process.stderr.write(`nowline: locale=${tag} (${source})\n`);
300
+ }
301
+ return result;
302
+ }
303
+ async function loadConfigFor(inputArg, cwd) {
304
+ try {
305
+ if (inputArg === '-') {
306
+ const { config } = await loadConfig(cwd);
307
+ return config;
308
+ }
309
+ const abs = path.resolve(cwd, inputArg);
310
+ const dir = path.dirname(abs);
311
+ const { config } = await loadConfig(dir);
312
+ return config;
313
+ }
314
+ catch {
315
+ return null;
316
+ }
317
+ }
318
+ function parseTheme(raw) {
319
+ if (!raw)
320
+ return 'light';
321
+ const lower = raw.toLowerCase();
322
+ if (lower !== 'light' && lower !== 'dark') {
323
+ throw new CliError(ExitCode.InputError, `nowline: invalid --theme "${raw}". Expected light or dark.`);
324
+ }
325
+ return lower;
326
+ }
327
+ // Resolve the now-line date from the CLI flag.
328
+ //
329
+ // Precedence:
330
+ // 1. `--now -` → undefined (suppresses the now-line)
331
+ // 2. `--now <YYYY-MM-DD>` → that date
332
+ // 3. flag omitted → today (UTC calendar date)
333
+ //
334
+ // The "default to today" behavior matches what the tool's name promises —
335
+ // you should see a "now" line by default. Use `--now -` to opt out (Unix
336
+ // `-` sentinel, mirroring `-o -` for stdout), or `--now <date>` for
337
+ // deterministic snapshots / planning a hypothetical date.
338
+ function resolveNowArg(args) {
339
+ if (args.now === '-')
340
+ return undefined;
341
+ if (args.now) {
342
+ const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(args.now);
343
+ if (!m) {
344
+ throw new CliError(ExitCode.InputError, `nowline: invalid --now "${args.now}". Expected YYYY-MM-DD or "-".`);
345
+ }
346
+ return new Date(Date.UTC(parseInt(m[1], 10), parseInt(m[2], 10) - 1, parseInt(m[3], 10)));
347
+ }
348
+ const today = new Date();
349
+ return new Date(Date.UTC(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate()));
350
+ }
351
+ function parseScale(raw) {
352
+ if (!raw)
353
+ return undefined;
354
+ const value = Number(raw);
355
+ if (!Number.isFinite(value) || value <= 0) {
356
+ throw new CliError(ExitCode.InputError, `nowline: invalid --scale "${raw}". Must be a positive number.`);
357
+ }
358
+ return value;
359
+ }
360
+ function parseOrientation(raw) {
361
+ if (!raw)
362
+ return undefined;
363
+ const lower = raw.toLowerCase();
364
+ if (lower === 'portrait' || lower === 'landscape' || lower === 'auto')
365
+ return lower;
366
+ throw new CliError(ExitCode.InputError, `nowline: invalid --orientation "${raw}". Expected portrait, landscape, or auto.`);
367
+ }
368
+ function parseMargin(raw) {
369
+ if (!raw)
370
+ return undefined;
371
+ if (/^\d+(?:\.\d+)?$/.test(raw))
372
+ return Number(raw); // bare number → points
373
+ try {
374
+ return lengthToPoints(parseLength(raw));
375
+ }
376
+ catch (err) {
377
+ const message = err instanceof Error ? err.message : String(err);
378
+ throw new CliError(ExitCode.InputError, `nowline: invalid --margin "${raw}": ${message}`);
379
+ }
380
+ }
381
+ function stringFromConfig(config, key) {
382
+ if (!config)
383
+ return undefined;
384
+ const value = config[key];
385
+ return typeof value === 'string' ? value : undefined;
386
+ }
387
+ function boolFromConfig(config, key) {
388
+ if (!config)
389
+ return false;
390
+ const value = config[key];
391
+ return value === true;
392
+ }
393
+ function parseWidthArg(raw) {
394
+ if (!raw)
395
+ return undefined;
396
+ const value = parseInt(raw, 10);
397
+ if (!Number.isFinite(value) || value < 320) {
398
+ throw new CliError(ExitCode.InputError, `nowline: invalid --width "${raw}". Must be an integer ≥ 320.`);
399
+ }
400
+ return value;
401
+ }
402
+ function emitDiagnostics(diagnostics, source, displayPath, operatorLocale) {
403
+ const sources = new Map([[displayPath, source]]);
404
+ const rendered = formatDiagnostics(diagnostics, 'text', sources, {
405
+ color: process.stderr.isTTY === true,
406
+ operatorLocale,
407
+ });
408
+ if (rendered)
409
+ process.stderr.write(`${rendered}\n`);
410
+ }
411
+ export function createAssetResolver(assetRoot) {
412
+ const root = path.resolve(assetRoot);
413
+ return async (ref) => {
414
+ const absPath = path.resolve(root, ref);
415
+ if (!absPath.startsWith(root + path.sep) && absPath !== root) {
416
+ throw new Error(`Asset ${ref} escapes asset-root ${assetRoot}`);
417
+ }
418
+ const bytes = await fs.readFile(absPath);
419
+ const mime = guessMime(absPath);
420
+ return { bytes: new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength), mime };
421
+ };
422
+ }
423
+ function guessMime(p) {
424
+ const ext = path.extname(p).toLowerCase();
425
+ if (ext === '.svg')
426
+ return 'image/svg+xml';
427
+ if (ext === '.png')
428
+ return 'image/png';
429
+ if (ext === '.jpg' || ext === '.jpeg')
430
+ return 'image/jpeg';
431
+ if (ext === '.webp')
432
+ return 'image/webp';
433
+ return 'application/octet-stream';
434
+ }
435
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/commands/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ParsedArgs } from '../cli/args.js';
2
+ export interface ServeHandlerOptions {
3
+ args: ParsedArgs;
4
+ /** Test seam: cwd override. Defaults to `process.cwd()`. */
5
+ cwd?: string;
6
+ }
7
+ /**
8
+ * `--serve` mode handler. Starts a local HTTP server that watches the input
9
+ * file and live-reloads the rendered SVG via Server-Sent Events.
10
+ *
11
+ * If `-o <path>` is provided, also writes the rendered SVG to that path on
12
+ * each successful rebuild. `-o -` (stdout) is rejected with exit 2 — serving
13
+ * to stdout is meaningless in this mode.
14
+ */
15
+ export declare function serveHandler(options: ServeHandlerOptions): Promise<void>;
16
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAYjD,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,UAAU,CAAC;IACjB,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0K9E"}