@nowline/browser 0.7.0 → 0.8.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/diagnostic-row.d.ts +4 -1
- package/dist/diagnostic-row.d.ts.map +1 -1
- package/dist/diagnostic-row.js +19 -1
- package/dist/diagnostic-row.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/pipeline.d.ts +7 -0
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +25 -3
- package/dist/pipeline.js.map +1 -1
- package/package.json +4 -4
- package/src/diagnostic-row.ts +21 -2
- package/src/index.ts +3 -0
- package/src/pipeline.ts +39 -3
package/dist/diagnostic-row.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type LangiumLikeDiagnostic, type LexerErrorLike, type ParserErrorLike, type ResolveDiagnostic } from '@nowline/core';
|
|
2
|
+
import type { LayoutInsight } from '@nowline/layout';
|
|
2
3
|
/**
|
|
3
4
|
* JSON-friendly diagnostic shape consumed by browser preview surfaces.
|
|
4
5
|
*
|
|
@@ -10,7 +11,7 @@ import { type LangiumLikeDiagnostic, type LexerErrorLike, type ParserErrorLike,
|
|
|
10
11
|
* embed-side path) so callers can map back to a source location.
|
|
11
12
|
*/
|
|
12
13
|
export interface DiagnosticRow {
|
|
13
|
-
severity: 'error' | 'warning';
|
|
14
|
+
severity: 'error' | 'warning' | 'info';
|
|
14
15
|
code: string;
|
|
15
16
|
message: string;
|
|
16
17
|
suggestion?: string;
|
|
@@ -36,4 +37,6 @@ export declare function fromResolveDiagnostic(diag: ResolveDiagnostic): Diagnost
|
|
|
36
37
|
* severity to `error` before passing the result on.
|
|
37
38
|
*/
|
|
38
39
|
export declare function fromRenderWarning(message: string, file: string, severity?: DiagnosticRow['severity']): DiagnosticRow;
|
|
40
|
+
/** Adapt a layout insight from `@nowline/layout` into a preview diagnostic row. */
|
|
41
|
+
export declare function fromLayoutInsight(insight: LayoutInsight, file: string): DiagnosticRow;
|
|
39
42
|
//# sourceMappingURL=diagnostic-row.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostic-row.d.ts","sourceRoot":"","sources":["../src/diagnostic-row.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAEzB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"diagnostic-row.d.ts","sourceRoot":"","sources":["../src/diagnostic-row.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAEzB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD;;;;;;;;;GASG;AACH,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAClB;AAQD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAa9F;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CASjF;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAS/E;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAS5E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,aAAa,CAAC,UAAU,CAAa,GAChD,aAAa,CASf;AAED,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CASrF"}
|
package/dist/diagnostic-row.js
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import { extractSuggestion, resolveDiagnosticCode, } from '@nowline/core';
|
|
2
|
+
function mapLangiumSeverity(severity) {
|
|
3
|
+
if (severity === 2)
|
|
4
|
+
return 'warning';
|
|
5
|
+
if (severity === 3)
|
|
6
|
+
return 'info';
|
|
7
|
+
return 'error';
|
|
8
|
+
}
|
|
2
9
|
export function fromLangiumDiagnostic(diag, file) {
|
|
3
10
|
return {
|
|
4
|
-
severity: diag.severity
|
|
11
|
+
severity: mapLangiumSeverity(diag.severity),
|
|
5
12
|
// resolveDiagnosticCode prefers the stable validator code (NL.Exxxx)
|
|
6
13
|
// carried in `data` so the preview table matches the CLI / Problems
|
|
7
14
|
// panel, then falls back to Langium's `code`, then a message heuristic.
|
|
@@ -66,4 +73,15 @@ export function fromRenderWarning(message, file, severity = 'warning') {
|
|
|
66
73
|
column: 1,
|
|
67
74
|
};
|
|
68
75
|
}
|
|
76
|
+
/** Adapt a layout insight from `@nowline/layout` into a preview diagnostic row. */
|
|
77
|
+
export function fromLayoutInsight(insight, file) {
|
|
78
|
+
return {
|
|
79
|
+
severity: insight.severity,
|
|
80
|
+
code: insight.code,
|
|
81
|
+
message: insight.message,
|
|
82
|
+
file,
|
|
83
|
+
line: 1,
|
|
84
|
+
column: 1,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
69
87
|
//# sourceMappingURL=diagnostic-row.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostic-row.js","sourceRoot":"","sources":["../src/diagnostic-row.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EAKjB,qBAAqB,GACxB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"diagnostic-row.js","sourceRoot":"","sources":["../src/diagnostic-row.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EAKjB,qBAAqB,GACxB,MAAM,eAAe,CAAC;AAuBvB,SAAS,kBAAkB,CAAC,QAA4B;IACpD,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAClC,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAA2B,EAAE,IAAY;IAC3E,OAAO;QACH,QAAQ,EAAE,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC3C,qEAAqE;QACrE,oEAAoE;QACpE,wEAAwE;QACxE,IAAI,EAAE,qBAAqB,CAAC,IAAI,CAAC;QACjC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;QAC3C,IAAI;QACJ,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC;QACvC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC;KACjD,CAAC;AACN,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAoB,EAAE,IAAY;IAC9D,OAAO;QACH,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,IAAI;QACJ,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC;QAC/B,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC;KACtC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAmB,EAAE,IAAY;IAC5D,OAAO;QACH,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,IAAI;QACJ,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;QACnB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC;KAC1B,CAAC;AACN,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAuB;IACzD,OAAO;QACH,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,UAAU;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,EAAE,CAAC;KACZ,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC7B,OAAe,EACf,IAAY,EACZ,WAAsC,SAAS;IAE/C,OAAO;QACH,QAAQ;QACR,IAAI,EAAE,gBAAgB;QACtB,OAAO;QACP,IAAI;QACJ,IAAI,EAAE,CAAC;QACP,MAAM,EAAE,CAAC;KACZ,CAAC;AACN,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,iBAAiB,CAAC,OAAsB,EAAE,IAAY;IAClE,OAAO;QACH,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI;QACJ,IAAI,EAAE,CAAC;QACP,MAAM,EAAE,CAAC;KACZ,CAAC;AACN,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export type { LangiumLikeDiagnostic } from '@nowline/core';
|
|
2
2
|
export { civilDateInZone, type NormalizedZone, normalizeZone, type ResolveTodayOptions, resolveToday, TimezoneError, } from '@nowline/layout';
|
|
3
|
-
export { type DiagnosticRow, fromLangiumDiagnostic, fromLexerError, fromParserError, fromRenderWarning, fromResolveDiagnostic, } from './diagnostic-row.js';
|
|
3
|
+
export { type DiagnosticRow, fromLangiumDiagnostic, fromLayoutInsight, fromLexerError, fromParserError, fromRenderWarning, fromResolveDiagnostic, } from './diagnostic-row.js';
|
|
4
4
|
export { showcaseSource } from './generated/showcase.js';
|
|
5
5
|
export { isNoOpIncludeDiagnosticMessage, NOWLINE_BROWSER_NOOP_INCLUDE_TAG, noOpIncludeReadFile, type SkippedInclude, } from './no-op-include-resolver.js';
|
|
6
|
-
export { __resetBrowserPipelineForTests, DEFAULT_SYNTHETIC_PATH, type ParseOptions, type ParseResult, parseSource, type RenderOptions, type RenderResult, renderSource, } from './pipeline.js';
|
|
6
|
+
export { __resetBrowserPipelineForTests, DEFAULT_SYNTHETIC_PATH, type DiagnosticLevel, type ParseOptions, type ParseResult, parseSource, type RenderOptions, type RenderResult, renderSource, severityMeetsDiagnosticLevel, } from './pipeline.js';
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
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,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,
|
|
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,iBAAiB,EACjB,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,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,YAAY,EACZ,4BAA4B,GAC/B,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,11 +7,11 @@
|
|
|
7
7
|
// auto-scan, postMessage transport, save/copy commands) belong in the
|
|
8
8
|
// consumer; this package stays a pure data transform.
|
|
9
9
|
export { civilDateInZone, normalizeZone, resolveToday, TimezoneError, } from '@nowline/layout';
|
|
10
|
-
export { fromLangiumDiagnostic, fromLexerError, fromParserError, fromRenderWarning, fromResolveDiagnostic, } from './diagnostic-row.js';
|
|
10
|
+
export { fromLangiumDiagnostic, fromLayoutInsight, fromLexerError, fromParserError, fromRenderWarning, fromResolveDiagnostic, } from './diagnostic-row.js';
|
|
11
11
|
// Showcase source string is generated from `examples/showcase.nowline`
|
|
12
12
|
// by `scripts/bundle-showcase.mjs` (m4.7 slice F) and re-exported here
|
|
13
13
|
// for empty-state content in browser SPAs.
|
|
14
14
|
export { showcaseSource } from './generated/showcase.js';
|
|
15
15
|
export { isNoOpIncludeDiagnosticMessage, NOWLINE_BROWSER_NOOP_INCLUDE_TAG, noOpIncludeReadFile, } from './no-op-include-resolver.js';
|
|
16
|
-
export { __resetBrowserPipelineForTests, DEFAULT_SYNTHETIC_PATH, parseSource, renderSource, } from './pipeline.js';
|
|
16
|
+
export { __resetBrowserPipelineForTests, DEFAULT_SYNTHETIC_PATH, parseSource, renderSource, severityMeetsDiagnosticLevel, } from './pipeline.js';
|
|
17
17
|
//# sourceMappingURL=index.js.map
|
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,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,
|
|
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,iBAAiB,EACjB,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,EAItB,WAAW,EAGX,YAAY,EACZ,4BAA4B,GAC/B,MAAM,eAAe,CAAC"}
|
package/dist/pipeline.d.ts
CHANGED
|
@@ -9,6 +9,8 @@ import { type SkippedInclude } from './no-op-include-resolver.js';
|
|
|
9
9
|
* a more user-meaningful label by setting `filePath`.
|
|
10
10
|
*/
|
|
11
11
|
export declare const DEFAULT_SYNTHETIC_PATH = "/browser-source.nowline";
|
|
12
|
+
export type DiagnosticLevel = 'error' | 'warning' | 'info';
|
|
13
|
+
export declare function severityMeetsDiagnosticLevel(severity: DiagnosticRow['severity'], level: DiagnosticLevel): boolean;
|
|
12
14
|
export interface ParseOptions {
|
|
13
15
|
/**
|
|
14
16
|
* Absolute path (or synthetic path) used to seed include resolution
|
|
@@ -30,6 +32,11 @@ export interface ParseOptions {
|
|
|
30
32
|
* the pipeline to `console.warn`.
|
|
31
33
|
*/
|
|
32
34
|
onSkippedInclude?: (info: SkippedInclude) => void;
|
|
35
|
+
/**
|
|
36
|
+
* Minimum diagnostic severity to surface from layout insights on a
|
|
37
|
+
* successful render. Defaults to `error` (layout insights hidden).
|
|
38
|
+
*/
|
|
39
|
+
diagnosticLevel?: DiagnosticLevel;
|
|
33
40
|
}
|
|
34
41
|
export interface ParseResult {
|
|
35
42
|
ast: NowlineFile;
|
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,EAMH,KAAK,SAAS,EAEjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAa,MAAM,mBAAmB,CAAC;AAErF,OAAO,EACH,KAAK,aAAa,EAOrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGH,KAAK,cAAc,EACtB,MAAM,6BAA6B,CAAC;AAErC;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,4BAA4B,CAAC;AAEhE,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAc3D,wBAAgB,4BAA4B,CACxC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,EACnC,KAAK,EAAE,eAAe,GACvB,OAAO,CAET;AAED,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;IAClD;;;OAGG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;CACrC;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,CA6FvB;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,IAAI,IAAI,CAGrD"}
|
package/dist/pipeline.js
CHANGED
|
@@ -17,10 +17,10 @@
|
|
|
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, normalizeZone, resolveToday, TimezoneError, } from '@nowline/layout';
|
|
20
|
+
import { collectLayoutInsights, layoutRoadmap, normalizeZone, resolveToday, TimezoneError, } from '@nowline/layout';
|
|
21
21
|
import { renderSvg } from '@nowline/renderer';
|
|
22
22
|
import { URI } from 'langium';
|
|
23
|
-
import { fromLangiumDiagnostic, fromLexerError, fromParserError, fromRenderWarning, fromResolveDiagnostic, } from './diagnostic-row.js';
|
|
23
|
+
import { fromLangiumDiagnostic, fromLayoutInsight, fromLexerError, fromParserError, fromRenderWarning, fromResolveDiagnostic, } from './diagnostic-row.js';
|
|
24
24
|
import { isNoOpIncludeDiagnosticMessage, noOpIncludeReadFile, } from './no-op-include-resolver.js';
|
|
25
25
|
/**
|
|
26
26
|
* Synthetic path stamped on diagnostics that have no real source file
|
|
@@ -28,6 +28,19 @@ import { isNoOpIncludeDiagnosticMessage, noOpIncludeReadFile, } from './no-op-in
|
|
|
28
28
|
* a more user-meaningful label by setting `filePath`.
|
|
29
29
|
*/
|
|
30
30
|
export const DEFAULT_SYNTHETIC_PATH = '/browser-source.nowline';
|
|
31
|
+
const SEVERITY_RANK = {
|
|
32
|
+
error: 3,
|
|
33
|
+
warning: 2,
|
|
34
|
+
info: 1,
|
|
35
|
+
};
|
|
36
|
+
const LEVEL_RANK = {
|
|
37
|
+
error: 3,
|
|
38
|
+
warning: 2,
|
|
39
|
+
info: 1,
|
|
40
|
+
};
|
|
41
|
+
export function severityMeetsDiagnosticLevel(severity, level) {
|
|
42
|
+
return SEVERITY_RANK[severity] >= LEVEL_RANK[level];
|
|
43
|
+
}
|
|
31
44
|
let cachedServices;
|
|
32
45
|
let docCounter = 0;
|
|
33
46
|
function getServices() {
|
|
@@ -136,6 +149,12 @@ export async function renderSource(source, options = {}) {
|
|
|
136
149
|
locale: options.locale,
|
|
137
150
|
width: options.width,
|
|
138
151
|
});
|
|
152
|
+
const diagnosticLevel = options.diagnosticLevel ?? 'error';
|
|
153
|
+
// Filtered once below as part of the combined `warnings` array.
|
|
154
|
+
const layoutInsightRows = collectLayoutInsights(model, {
|
|
155
|
+
today: today ?? undefined,
|
|
156
|
+
locale: options.locale ?? 'en-US',
|
|
157
|
+
}).map((insight) => fromLayoutInsight(insight, filePath));
|
|
139
158
|
const showLinks = options.showLinks !== false;
|
|
140
159
|
const strict = options.strict === true;
|
|
141
160
|
const warnMessages = [];
|
|
@@ -147,7 +166,10 @@ export async function renderSource(source, options = {}) {
|
|
|
147
166
|
warn: (msg) => warnMessages.push(msg),
|
|
148
167
|
fontFamilies: options.fontFamilies,
|
|
149
168
|
});
|
|
150
|
-
const warnings =
|
|
169
|
+
const warnings = [
|
|
170
|
+
...layoutInsightRows,
|
|
171
|
+
...warnMessages.map((m) => fromRenderWarning(m, filePath, strict ? 'error' : 'warning')),
|
|
172
|
+
].filter((row) => severityMeetsDiagnosticLevel(row.severity, diagnosticLevel));
|
|
151
173
|
if (strict && warnings.length > 0) {
|
|
152
174
|
return { kind: 'diagnostics', diagnostics: [...rows, ...warnings] };
|
|
153
175
|
}
|
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,EACH,aAAa,EAEb,aAAa,EACb,YAAY,EAEZ,aAAa,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAyC,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAEH,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,qBAAqB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACH,8BAA8B,EAC9B,mBAAmB,GAEtB,MAAM,6BAA6B,CAAC;AAErC;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,yBAAyB,CAAC;
|
|
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.8.0",
|
|
4
4
|
"description": "Runs the whole Nowline pipeline — parse, validate, resolve includes, lay out, and render — in the browser, with pluggable I/O hooks. Powers @nowline/embed and the VS Code preview.",
|
|
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/core": "0.
|
|
43
|
-
"@nowline/layout": "0.
|
|
44
|
-
"@nowline/renderer": "0.
|
|
42
|
+
"@nowline/core": "0.8.0",
|
|
43
|
+
"@nowline/layout": "0.8.0",
|
|
44
|
+
"@nowline/renderer": "0.8.0"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@types/node": "^25.9.1",
|
package/src/diagnostic-row.ts
CHANGED
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
type ResolveDiagnostic,
|
|
7
7
|
resolveDiagnosticCode,
|
|
8
8
|
} from '@nowline/core';
|
|
9
|
+
import type { LayoutInsight } from '@nowline/layout';
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* JSON-friendly diagnostic shape consumed by browser preview surfaces.
|
|
@@ -18,7 +19,7 @@ import {
|
|
|
18
19
|
* embed-side path) so callers can map back to a source location.
|
|
19
20
|
*/
|
|
20
21
|
export interface DiagnosticRow {
|
|
21
|
-
severity: 'error' | 'warning';
|
|
22
|
+
severity: 'error' | 'warning' | 'info';
|
|
22
23
|
code: string;
|
|
23
24
|
message: string;
|
|
24
25
|
suggestion?: string;
|
|
@@ -27,9 +28,15 @@ export interface DiagnosticRow {
|
|
|
27
28
|
column: number;
|
|
28
29
|
}
|
|
29
30
|
|
|
31
|
+
function mapLangiumSeverity(severity: number | undefined): DiagnosticRow['severity'] {
|
|
32
|
+
if (severity === 2) return 'warning';
|
|
33
|
+
if (severity === 3) return 'info';
|
|
34
|
+
return 'error';
|
|
35
|
+
}
|
|
36
|
+
|
|
30
37
|
export function fromLangiumDiagnostic(diag: LangiumLikeDiagnostic, file: string): DiagnosticRow {
|
|
31
38
|
return {
|
|
32
|
-
severity: diag.severity
|
|
39
|
+
severity: mapLangiumSeverity(diag.severity),
|
|
33
40
|
// resolveDiagnosticCode prefers the stable validator code (NL.Exxxx)
|
|
34
41
|
// carried in `data` so the preview table matches the CLI / Problems
|
|
35
42
|
// panel, then falls back to Langium's `code`, then a message heuristic.
|
|
@@ -102,3 +109,15 @@ export function fromRenderWarning(
|
|
|
102
109
|
column: 1,
|
|
103
110
|
};
|
|
104
111
|
}
|
|
112
|
+
|
|
113
|
+
/** Adapt a layout insight from `@nowline/layout` into a preview diagnostic row. */
|
|
114
|
+
export function fromLayoutInsight(insight: LayoutInsight, file: string): DiagnosticRow {
|
|
115
|
+
return {
|
|
116
|
+
severity: insight.severity,
|
|
117
|
+
code: insight.code,
|
|
118
|
+
message: insight.message,
|
|
119
|
+
file,
|
|
120
|
+
line: 1,
|
|
121
|
+
column: 1,
|
|
122
|
+
};
|
|
123
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -22,6 +22,7 @@ export {
|
|
|
22
22
|
export {
|
|
23
23
|
type DiagnosticRow,
|
|
24
24
|
fromLangiumDiagnostic,
|
|
25
|
+
fromLayoutInsight,
|
|
25
26
|
fromLexerError,
|
|
26
27
|
fromParserError,
|
|
27
28
|
fromRenderWarning,
|
|
@@ -40,10 +41,12 @@ export {
|
|
|
40
41
|
export {
|
|
41
42
|
__resetBrowserPipelineForTests,
|
|
42
43
|
DEFAULT_SYNTHETIC_PATH,
|
|
44
|
+
type DiagnosticLevel,
|
|
43
45
|
type ParseOptions,
|
|
44
46
|
type ParseResult,
|
|
45
47
|
parseSource,
|
|
46
48
|
type RenderOptions,
|
|
47
49
|
type RenderResult,
|
|
48
50
|
renderSource,
|
|
51
|
+
severityMeetsDiagnosticLevel,
|
|
49
52
|
} from './pipeline.js';
|
package/src/pipeline.ts
CHANGED
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
resolveIncludes,
|
|
26
26
|
} from '@nowline/core';
|
|
27
27
|
import {
|
|
28
|
+
collectLayoutInsights,
|
|
28
29
|
layoutRoadmap,
|
|
29
30
|
type NormalizedZone,
|
|
30
31
|
normalizeZone,
|
|
@@ -37,6 +38,7 @@ import { URI } from 'langium';
|
|
|
37
38
|
import {
|
|
38
39
|
type DiagnosticRow,
|
|
39
40
|
fromLangiumDiagnostic,
|
|
41
|
+
fromLayoutInsight,
|
|
40
42
|
fromLexerError,
|
|
41
43
|
fromParserError,
|
|
42
44
|
fromRenderWarning,
|
|
@@ -55,6 +57,27 @@ import {
|
|
|
55
57
|
*/
|
|
56
58
|
export const DEFAULT_SYNTHETIC_PATH = '/browser-source.nowline';
|
|
57
59
|
|
|
60
|
+
export type DiagnosticLevel = 'error' | 'warning' | 'info';
|
|
61
|
+
|
|
62
|
+
const SEVERITY_RANK: Record<DiagnosticRow['severity'], number> = {
|
|
63
|
+
error: 3,
|
|
64
|
+
warning: 2,
|
|
65
|
+
info: 1,
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const LEVEL_RANK: Record<DiagnosticLevel, number> = {
|
|
69
|
+
error: 3,
|
|
70
|
+
warning: 2,
|
|
71
|
+
info: 1,
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export function severityMeetsDiagnosticLevel(
|
|
75
|
+
severity: DiagnosticRow['severity'],
|
|
76
|
+
level: DiagnosticLevel,
|
|
77
|
+
): boolean {
|
|
78
|
+
return SEVERITY_RANK[severity] >= LEVEL_RANK[level];
|
|
79
|
+
}
|
|
80
|
+
|
|
58
81
|
export interface ParseOptions {
|
|
59
82
|
/**
|
|
60
83
|
* Absolute path (or synthetic path) used to seed include resolution
|
|
@@ -76,6 +99,11 @@ export interface ParseOptions {
|
|
|
76
99
|
* the pipeline to `console.warn`.
|
|
77
100
|
*/
|
|
78
101
|
onSkippedInclude?: (info: SkippedInclude) => void;
|
|
102
|
+
/**
|
|
103
|
+
* Minimum diagnostic severity to surface from layout insights on a
|
|
104
|
+
* successful render. Defaults to `error` (layout insights hidden).
|
|
105
|
+
*/
|
|
106
|
+
diagnosticLevel?: DiagnosticLevel;
|
|
79
107
|
}
|
|
80
108
|
|
|
81
109
|
export interface ParseResult {
|
|
@@ -260,6 +288,13 @@ export async function renderSource(
|
|
|
260
288
|
width: options.width,
|
|
261
289
|
});
|
|
262
290
|
|
|
291
|
+
const diagnosticLevel = options.diagnosticLevel ?? 'error';
|
|
292
|
+
// Filtered once below as part of the combined `warnings` array.
|
|
293
|
+
const layoutInsightRows = collectLayoutInsights(model, {
|
|
294
|
+
today: today ?? undefined,
|
|
295
|
+
locale: options.locale ?? 'en-US',
|
|
296
|
+
}).map((insight) => fromLayoutInsight(insight, filePath));
|
|
297
|
+
|
|
263
298
|
const showLinks = options.showLinks !== false;
|
|
264
299
|
const strict = options.strict === true;
|
|
265
300
|
const warnMessages: string[] = [];
|
|
@@ -273,9 +308,10 @@ export async function renderSource(
|
|
|
273
308
|
fontFamilies: options.fontFamilies,
|
|
274
309
|
});
|
|
275
310
|
|
|
276
|
-
const warnings =
|
|
277
|
-
|
|
278
|
-
|
|
311
|
+
const warnings = [
|
|
312
|
+
...layoutInsightRows,
|
|
313
|
+
...warnMessages.map((m) => fromRenderWarning(m, filePath, strict ? 'error' : 'warning')),
|
|
314
|
+
].filter((row) => severityMeetsDiagnosticLevel(row.severity, diagnosticLevel));
|
|
279
315
|
if (strict && warnings.length > 0) {
|
|
280
316
|
return { kind: 'diagnostics', diagnostics: [...rows, ...warnings] };
|
|
281
317
|
}
|