@nowline/browser 0.5.1 → 0.6.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/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/pipeline.d.ts +24 -6
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +31 -2
- package/dist/pipeline.js.map +1 -1
- package/package.json +4 -4
- package/src/index.ts +8 -0
- package/src/pipeline.ts +61 -8
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export type { LangiumLikeDiagnostic } from '@nowline/core';
|
|
2
|
+
export { civilDateInZone, type NormalizedZone, normalizeZone, type ResolveTodayOptions, resolveToday, TimezoneError, } from '@nowline/layout';
|
|
2
3
|
export { type DiagnosticRow, fromLangiumDiagnostic, fromLexerError, fromParserError, fromRenderWarning, fromResolveDiagnostic, } from './diagnostic-row.js';
|
|
3
4
|
export { showcaseSource } from './generated/showcase.js';
|
|
4
5
|
export { isNoOpIncludeDiagnosticMessage, NOWLINE_BROWSER_NOOP_INCLUDE_TAG, noOpIncludeReadFile, type SkippedInclude, } from './no-op-include-resolver.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAYA,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EACH,KAAK,aAAa,EAClB,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,qBAAqB,GACxB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACH,8BAA8B,EAC9B,gCAAgC,EAChC,mBAAmB,EACnB,KAAK,cAAc,GACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACH,8BAA8B,EAC9B,sBAAsB,EACtB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,YAAY,GACf,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAYA,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EACH,eAAe,EACf,KAAK,cAAc,EACnB,aAAa,EACb,KAAK,mBAAmB,EACxB,YAAY,EACZ,aAAa,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACH,KAAK,aAAa,EAClB,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,qBAAqB,GACxB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACH,8BAA8B,EAC9B,gCAAgC,EAChC,mBAAmB,EACnB,KAAK,cAAc,GACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACH,8BAA8B,EAC9B,sBAAsB,EACtB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,YAAY,GACf,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
// behaviour cannot drift between them. Surface-specific concerns (DOM
|
|
7
7
|
// auto-scan, postMessage transport, save/copy commands) belong in the
|
|
8
8
|
// consumer; this package stays a pure data transform.
|
|
9
|
+
export { civilDateInZone, normalizeZone, resolveToday, TimezoneError, } from '@nowline/layout';
|
|
9
10
|
export { fromLangiumDiagnostic, fromLexerError, fromParserError, fromRenderWarning, fromResolveDiagnostic, } from './diagnostic-row.js';
|
|
10
11
|
// Showcase source string is generated from `examples/showcase.nowline`
|
|
11
12
|
// by `scripts/bundle-showcase.mjs` (m4.7 slice F) and re-exported here
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,EAAE;AACF,qEAAqE;AACrE,qEAAqE;AACrE,uEAAuE;AACvE,sEAAsE;AACtE,sEAAsE;AACtE,sDAAsD;AAMtD,OAAO,EAEH,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,qBAAqB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,uEAAuE;AACvE,uEAAuE;AACvE,2CAA2C;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACH,8BAA8B,EAC9B,gCAAgC,EAChC,mBAAmB,GAEtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACH,8BAA8B,EAC9B,sBAAsB,EAGtB,WAAW,EAGX,YAAY,GACf,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,EAAE;AACF,qEAAqE;AACrE,qEAAqE;AACrE,uEAAuE;AACvE,sEAAsE;AACtE,sEAAsE;AACtE,sDAAsD;AAMtD,OAAO,EACH,eAAe,EAEf,aAAa,EAEb,YAAY,EACZ,aAAa,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEH,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,qBAAqB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,uEAAuE;AACvE,uEAAuE;AACvE,2CAA2C;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACH,8BAA8B,EAC9B,gCAAgC,EAChC,mBAAmB,GAEtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACH,8BAA8B,EAC9B,sBAAsB,EAGtB,WAAW,EAGX,YAAY,GACf,MAAM,eAAe,CAAC"}
|
package/dist/pipeline.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type NowlineFile } from '@nowline/core';
|
|
2
2
|
import { type ThemeName } from '@nowline/layout';
|
|
3
|
-
import { type AssetResolver } from '@nowline/renderer';
|
|
3
|
+
import { type AssetResolver, type FontFamilies } from '@nowline/renderer';
|
|
4
4
|
import { type DiagnosticRow } from './diagnostic-row.js';
|
|
5
5
|
import { type SkippedInclude } from './no-op-include-resolver.js';
|
|
6
6
|
/**
|
|
@@ -38,12 +38,24 @@ export interface ParseResult {
|
|
|
38
38
|
export interface RenderOptions extends ParseOptions {
|
|
39
39
|
theme?: ThemeName;
|
|
40
40
|
/**
|
|
41
|
-
* "Today" override threaded into the layout engine.
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
41
|
+
* "Today" override threaded into the layout engine.
|
|
42
|
+
*
|
|
43
|
+
* - `Date` — explicit UTC-midnight date; drawn as-is.
|
|
44
|
+
* - `string` — raw `--now` string (YYYY-MM-DD or ISO 8601 instant);
|
|
45
|
+
* resolved via `resolveToday`. An embedded Z or ±offset wins
|
|
46
|
+
* over `timezone`.
|
|
47
|
+
* - `null` — suppress the now-line entirely (mirrors `--now -`).
|
|
48
|
+
* - `undefined` — default to the local civil date (or `timezone` if set).
|
|
45
49
|
*/
|
|
46
|
-
today?: Date | null;
|
|
50
|
+
today?: Date | string | null;
|
|
51
|
+
/**
|
|
52
|
+
* Timezone for the clock-based "today" default. Only consulted when
|
|
53
|
+
* `today` is `undefined`. Accepts `"local"` (default), `"UTC"`, ISO 8601
|
|
54
|
+
* offsets (`"Z"`, `"+05:30"`), or IANA names (`"America/Los_Angeles"`).
|
|
55
|
+
* Ignored when `today` carries an explicit date or embedded ISO offset.
|
|
56
|
+
* Throws `TimezoneError` for unrecognised values.
|
|
57
|
+
*/
|
|
58
|
+
timezone?: string;
|
|
47
59
|
/** BCP-47 locale forwarded to the layout engine for axis labels. */
|
|
48
60
|
locale?: string;
|
|
49
61
|
/** Total canvas width in px. Layout's default is 1280. */
|
|
@@ -64,6 +76,12 @@ export interface RenderOptions extends ParseOptions {
|
|
|
64
76
|
* silently dropped — match the embed's "no filesystem" posture.
|
|
65
77
|
*/
|
|
66
78
|
assetResolver?: AssetResolver;
|
|
79
|
+
/**
|
|
80
|
+
* Override per-role `font-family` strings. Defaults to the portable
|
|
81
|
+
* `FONT_STACK`. The VS Code preview passes a pinned bundled family
|
|
82
|
+
* (paired with an injected `@font-face`) so preview == raster export.
|
|
83
|
+
*/
|
|
84
|
+
fontFamilies?: FontFamilies;
|
|
67
85
|
}
|
|
68
86
|
export type RenderResult = {
|
|
69
87
|
kind: 'svg';
|
package/dist/pipeline.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAmBA,OAAO,EAGH,KAAK,WAAW,EAGnB,MAAM,eAAe,CAAC;AACvB,OAAO,
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAmBA,OAAO,EAGH,KAAK,WAAW,EAGnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAKH,KAAK,SAAS,EAEjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAa,MAAM,mBAAmB,CAAC;AAErF,OAAO,EACH,KAAK,aAAa,EAMrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGH,KAAK,cAAc,EACtB,MAAM,6BAA6B,CAAC;AAErC;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,4BAA4B,CAAC;AAEhE,MAAM,WAAW,YAAY;IACzB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,WAAW;IACxB,GAAG,EAAE,WAAW,CAAC;IACjB,WAAW,EAAE,aAAa,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,aAAc,SAAQ,YAAY;IAC/C,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;;;;;;OASG;IACH,KAAK,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;IAC7B;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mEAAmE;IACnE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;OAIG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;CAC/B;AAED,MAAM,MAAM,YAAY,GAClB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,aAAa,EAAE,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,WAAW,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC;AAqB5D;;;;;GAKG;AACH,wBAAsB,WAAW,CAC7B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,YAAiB,GAC3B,OAAO,CAAC,WAAW,CAAC,CAqBtB;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,aAAkB,GAC5B,OAAO,CAAC,YAAY,CAAC,CAqFvB;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,IAAI,IAAI,CAGrD"}
|
package/dist/pipeline.js
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
// The package itself imports zero `node:*` modules so the embed esbuild
|
|
18
18
|
// bundle stays free of any Node literal even before tree-shaking.
|
|
19
19
|
import { collectDocumentDiagnostics, createNowlineServices, resolveIncludes, } from '@nowline/core';
|
|
20
|
-
import { layoutRoadmap } from '@nowline/layout';
|
|
20
|
+
import { layoutRoadmap, normalizeZone, resolveToday, TimezoneError, } from '@nowline/layout';
|
|
21
21
|
import { renderSvg } from '@nowline/renderer';
|
|
22
22
|
import { URI } from 'langium';
|
|
23
23
|
import { fromLangiumDiagnostic, fromLexerError, fromParserError, fromRenderWarning, fromResolveDiagnostic, } from './diagnostic-row.js';
|
|
@@ -101,7 +101,35 @@ export async function renderSource(source, options = {}) {
|
|
|
101
101
|
if (rows.some((r) => r.severity === 'error')) {
|
|
102
102
|
return { kind: 'diagnostics', diagnostics: rows };
|
|
103
103
|
}
|
|
104
|
-
|
|
104
|
+
let zone;
|
|
105
|
+
if (options.timezone) {
|
|
106
|
+
try {
|
|
107
|
+
zone = normalizeZone(options.timezone);
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
if (err instanceof TimezoneError) {
|
|
111
|
+
// Surface timezone errors as a diagnostic row rather than throwing
|
|
112
|
+
// so the caller gets a structured result instead of an uncaught error.
|
|
113
|
+
return {
|
|
114
|
+
kind: 'diagnostics',
|
|
115
|
+
diagnostics: [
|
|
116
|
+
{
|
|
117
|
+
severity: 'error',
|
|
118
|
+
code: 'invalid-timezone',
|
|
119
|
+
message: err.message,
|
|
120
|
+
file: filePath,
|
|
121
|
+
line: 1,
|
|
122
|
+
column: 1,
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
throw err;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Pass today as-is: null suppresses the now-line, undefined defaults to
|
|
131
|
+
// local today (or zone), a string is parsed, a Date is used directly.
|
|
132
|
+
const today = resolveToday({ now: options.today, zone });
|
|
105
133
|
const model = layoutRoadmap(parsed.ast, resolved, {
|
|
106
134
|
theme: options.theme,
|
|
107
135
|
today,
|
|
@@ -117,6 +145,7 @@ export async function renderSource(source, options = {}) {
|
|
|
117
145
|
noLinks: !showLinks,
|
|
118
146
|
strict,
|
|
119
147
|
warn: (msg) => warnMessages.push(msg),
|
|
148
|
+
fontFamilies: options.fontFamilies,
|
|
120
149
|
});
|
|
121
150
|
const warnings = warnMessages.map((m) => fromRenderWarning(m, filePath, strict ? 'error' : 'warning'));
|
|
122
151
|
if (strict && warnings.length > 0) {
|
package/dist/pipeline.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,mEAAmE;AACnE,mBAAmB;AACnB,EAAE;AACF,uEAAuE;AACvE,wEAAwE;AACxE,sEAAsE;AACtE,yEAAyE;AACzE,yDAAyD;AACzD,EAAE;AACF,mEAAmE;AACnE,kEAAkE;AAClE,yEAAyE;AACzE,kEAAkE;AAClE,wEAAwE;AACxE,EAAE;AACF,wEAAwE;AACxE,kEAAkE;AAElE,OAAO,EACH,0BAA0B,EAC1B,qBAAqB,EAGrB,eAAe,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nowline/browser",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Browser-safe Nowline pipeline: parse + validate + resolve includes + layout + render with pluggable I/O hooks. Consumed by @nowline/embed, the VS Code preview, and any third-party browser tool.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"engines": {
|
|
@@ -39,9 +39,9 @@
|
|
|
39
39
|
],
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"langium": "~4.2.4",
|
|
42
|
-
"@nowline/
|
|
43
|
-
"@nowline/core": "0.
|
|
44
|
-
"@nowline/
|
|
42
|
+
"@nowline/renderer": "0.6.0",
|
|
43
|
+
"@nowline/core": "0.6.0",
|
|
44
|
+
"@nowline/layout": "0.6.0"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@types/node": "^25.9.1",
|
package/src/index.ts
CHANGED
|
@@ -11,6 +11,14 @@
|
|
|
11
11
|
// re-exported here so existing @nowline/browser consumers keep importing it
|
|
12
12
|
// from the same place.
|
|
13
13
|
export type { LangiumLikeDiagnostic } from '@nowline/core';
|
|
14
|
+
export {
|
|
15
|
+
civilDateInZone,
|
|
16
|
+
type NormalizedZone,
|
|
17
|
+
normalizeZone,
|
|
18
|
+
type ResolveTodayOptions,
|
|
19
|
+
resolveToday,
|
|
20
|
+
TimezoneError,
|
|
21
|
+
} from '@nowline/layout';
|
|
14
22
|
export {
|
|
15
23
|
type DiagnosticRow,
|
|
16
24
|
fromLangiumDiagnostic,
|
package/src/pipeline.ts
CHANGED
|
@@ -24,8 +24,15 @@ import {
|
|
|
24
24
|
type NowlineServices,
|
|
25
25
|
resolveIncludes,
|
|
26
26
|
} from '@nowline/core';
|
|
27
|
-
import {
|
|
28
|
-
|
|
27
|
+
import {
|
|
28
|
+
layoutRoadmap,
|
|
29
|
+
type NormalizedZone,
|
|
30
|
+
normalizeZone,
|
|
31
|
+
resolveToday,
|
|
32
|
+
type ThemeName,
|
|
33
|
+
TimezoneError,
|
|
34
|
+
} from '@nowline/layout';
|
|
35
|
+
import { type AssetResolver, type FontFamilies, renderSvg } from '@nowline/renderer';
|
|
29
36
|
import { URI } from 'langium';
|
|
30
37
|
import {
|
|
31
38
|
type DiagnosticRow,
|
|
@@ -79,12 +86,24 @@ export interface ParseResult {
|
|
|
79
86
|
export interface RenderOptions extends ParseOptions {
|
|
80
87
|
theme?: ThemeName;
|
|
81
88
|
/**
|
|
82
|
-
* "Today" override threaded into the layout engine.
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
89
|
+
* "Today" override threaded into the layout engine.
|
|
90
|
+
*
|
|
91
|
+
* - `Date` — explicit UTC-midnight date; drawn as-is.
|
|
92
|
+
* - `string` — raw `--now` string (YYYY-MM-DD or ISO 8601 instant);
|
|
93
|
+
* resolved via `resolveToday`. An embedded Z or ±offset wins
|
|
94
|
+
* over `timezone`.
|
|
95
|
+
* - `null` — suppress the now-line entirely (mirrors `--now -`).
|
|
96
|
+
* - `undefined` — default to the local civil date (or `timezone` if set).
|
|
97
|
+
*/
|
|
98
|
+
today?: Date | string | null;
|
|
99
|
+
/**
|
|
100
|
+
* Timezone for the clock-based "today" default. Only consulted when
|
|
101
|
+
* `today` is `undefined`. Accepts `"local"` (default), `"UTC"`, ISO 8601
|
|
102
|
+
* offsets (`"Z"`, `"+05:30"`), or IANA names (`"America/Los_Angeles"`).
|
|
103
|
+
* Ignored when `today` carries an explicit date or embedded ISO offset.
|
|
104
|
+
* Throws `TimezoneError` for unrecognised values.
|
|
86
105
|
*/
|
|
87
|
-
|
|
106
|
+
timezone?: string;
|
|
88
107
|
/** BCP-47 locale forwarded to the layout engine for axis labels. */
|
|
89
108
|
locale?: string;
|
|
90
109
|
/** Total canvas width in px. Layout's default is 1280. */
|
|
@@ -105,6 +124,12 @@ export interface RenderOptions extends ParseOptions {
|
|
|
105
124
|
* silently dropped — match the embed's "no filesystem" posture.
|
|
106
125
|
*/
|
|
107
126
|
assetResolver?: AssetResolver;
|
|
127
|
+
/**
|
|
128
|
+
* Override per-role `font-family` strings. Defaults to the portable
|
|
129
|
+
* `FONT_STACK`. The VS Code preview passes a pinned bundled family
|
|
130
|
+
* (paired with an injected `@font-face`) so preview == raster export.
|
|
131
|
+
*/
|
|
132
|
+
fontFamilies?: FontFamilies;
|
|
108
133
|
}
|
|
109
134
|
|
|
110
135
|
export type RenderResult =
|
|
@@ -200,7 +225,34 @@ export async function renderSource(
|
|
|
200
225
|
return { kind: 'diagnostics', diagnostics: rows };
|
|
201
226
|
}
|
|
202
227
|
|
|
203
|
-
|
|
228
|
+
let zone: NormalizedZone | undefined;
|
|
229
|
+
if (options.timezone) {
|
|
230
|
+
try {
|
|
231
|
+
zone = normalizeZone(options.timezone);
|
|
232
|
+
} catch (err) {
|
|
233
|
+
if (err instanceof TimezoneError) {
|
|
234
|
+
// Surface timezone errors as a diagnostic row rather than throwing
|
|
235
|
+
// so the caller gets a structured result instead of an uncaught error.
|
|
236
|
+
return {
|
|
237
|
+
kind: 'diagnostics',
|
|
238
|
+
diagnostics: [
|
|
239
|
+
{
|
|
240
|
+
severity: 'error' as const,
|
|
241
|
+
code: 'invalid-timezone',
|
|
242
|
+
message: err.message,
|
|
243
|
+
file: filePath,
|
|
244
|
+
line: 1,
|
|
245
|
+
column: 1,
|
|
246
|
+
},
|
|
247
|
+
],
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
throw err;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// Pass today as-is: null suppresses the now-line, undefined defaults to
|
|
254
|
+
// local today (or zone), a string is parsed, a Date is used directly.
|
|
255
|
+
const today = resolveToday({ now: options.today, zone });
|
|
204
256
|
const model = layoutRoadmap(parsed.ast, resolved, {
|
|
205
257
|
theme: options.theme,
|
|
206
258
|
today,
|
|
@@ -218,6 +270,7 @@ export async function renderSource(
|
|
|
218
270
|
noLinks: !showLinks,
|
|
219
271
|
strict,
|
|
220
272
|
warn: (msg) => warnMessages.push(msg),
|
|
273
|
+
fontFamilies: options.fontFamilies,
|
|
221
274
|
});
|
|
222
275
|
|
|
223
276
|
const warnings = warnMessages.map((m) =>
|