@nowline/browser 0.7.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,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;AAEvB;;;;;;;;;GASG;AACH,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,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;AAED,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"}
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"}
@@ -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 === 2 ? 'warning' : 'error',
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;AAsBvB,MAAM,UAAU,qBAAqB,CAAC,IAA2B,EAAE,IAAY;IAC3E,OAAO;QACH,QAAQ,EAAE,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;QACnD,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"}
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
@@ -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,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,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,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,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"}
@@ -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;
@@ -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,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"}
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 = warnMessages.map((m) => fromRenderWarning(m, filePath, strict ? 'error' : 'warning'));
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
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.7.0",
3
+ "version": "0.8.1",
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.7.0",
43
- "@nowline/layout": "0.7.0",
44
- "@nowline/renderer": "0.7.0"
42
+ "@nowline/core": "0.8.1",
43
+ "@nowline/layout": "0.8.1",
44
+ "@nowline/renderer": "0.8.1"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@types/node": "^25.9.1",
@@ -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 === 2 ? 'warning' : 'error',
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 = warnMessages.map((m) =>
277
- fromRenderWarning(m, filePath, strict ? 'error' : 'warning'),
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
  }