@owlmeans/viable-log 0.1.18-rc.0 → 0.1.18-rc.2

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/README.md CHANGED
@@ -6,7 +6,7 @@ This package ships embedded agent skills under `agent-meta/`. After installing y
6
6
  your project's skill store (`.agents/skills/`):
7
7
 
8
8
  ```sh
9
- npx @owlmeans/agent-skills@^0.1.18-rc.47
9
+ npx @owlmeans/agent-skills@^0.1.18-rc.49
10
10
  ```
11
11
 
12
12
  The embedded files are version-matched to this package release. Do not edit them
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
3
  "package": "@owlmeans/viable-log",
4
- "version": "0.1.18-rc.0",
5
- "generatedAt": "2026-10-03T20:03:44.509Z",
4
+ "version": "0.1.18-rc.2",
5
+ "generatedAt": "2026-10-05T21:03:06.378Z",
6
6
  "canonicalRepo": "https://github.com/owlmeans/common",
7
7
  "entries": [
8
8
  {
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: viable-log
3
- description: How to use @owlmeans/viable-log — a generated (target) application's link to the OwlMeans Viable platform, as two @owlmeans/log plugins. viablePreviewPlugin sends the target web's analytics events to the manager frame through the preview reporter's channel; viableSlotPlugin writes the target backend's error records and analytics events as marked JSON stdout lines for the publisher to relay. Also the shared contract the platform reads them with (TARGET_EVENT_MARKER, parseTargetEventLine, PREVIEW_REPORTER_FLAG). Auto-invoked when wiring the platform link into a generated app's web or backend, importing viablePreviewPlugin, viableSlotPlugin or parseTargetEventLine, or changing how the preview reporter or the publisher takes events from a target.
3
+ description: How to use @owlmeans/viable-log — a generated (target) application's link to the OwlMeans Viable platform, as two @owlmeans/log plugins. viablePreviewPlugin sends the target web's analytics events to the manager frame through the preview reporter's channel; viableSlotPlugin writes the target backend's error records and analytics events as marked JSON stdout lines for the publisher to relay. Also the shared contract the platform reads them with (TARGET_EVENT_MARKER, targetEventHelper.parseTargetEventLine, PREVIEW_REPORTER_FLAG). Auto-invoked when wiring the platform link into a generated app's web or backend, importing viablePreviewPlugin, viableSlotPlugin or targetEventHelper, or changing how the preview reporter or the publisher takes events from a target.
4
4
  user-invocable: false
5
5
  ---
6
6
  <!-- AUTO-GENERATED — do not edit. Regenerate via sync-agent-meta. -->
@@ -8,7 +8,7 @@ user-invocable: false
8
8
  # @owlmeans/viable-log
9
9
 
10
10
  **Layer:** Domain (depends on `@owlmeans/log` only)
11
- **Install:** `"@owlmeans/viable-log": "^0.1.18-rc.0"` in `dependencies`
11
+ **Install:** `"@owlmeans/viable-log": "^0.1.18-rc.2"` in `dependencies`
12
12
 
13
13
  The platform is "just one of the plugins" of a target's logging: a generated app logs through
14
14
  `@owlmeans/log`, and registers these two plugins so what it says reaches Viable. Both are inert
@@ -32,10 +32,10 @@ Errors in the **browser** need no plugin: a record carrying an `Error` reaches t
32
32
 
33
33
  ## The contract
34
34
 
35
- `parseTargetEventLine(line)` is how the platform's publisher reads a stdout line — **the input is
35
+ `targetEventHelper.parseTargetEventLine(line)` is how the platform's publisher reads a stdout line — **the input is
36
36
  untrusted, written by generated code**: the marker, JSON, version
37
37
  (`TARGET_EVENT_VERSION`), kind and level are checked, every text field is clipped, unknown fields are
38
- dropped. `targetEventLine(event)` writes one, cutting a stack and then data to stay under
38
+ dropped. `targetEventHelper.targetEventLine(event)` writes one, cutting a stack and then data to stay under
39
39
  `TARGET_EVENT_MAX`. Change a field's shape only with a new `TARGET_EVENT_VERSION`. An application writes events only
40
40
  through `@owlmeans/log` (`log.error(…)`, or a call with an `analytics` option) — never by building a
41
41
  marked line or posting a preview message itself.
@@ -0,0 +1,2 @@
1
+ export declare const LEVELS: string[];
2
+ //# sourceMappingURL=consts.local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consts.local.d.ts","sourceRoot":"","sources":["../src/consts.local.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM,UAAqC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export const LEVELS = ['debug', 'info', 'warn', 'error'];
2
+ //# sourceMappingURL=consts.local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consts.local.js","sourceRoot":"","sources":["../src/consts.local.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA"}
@@ -0,0 +1,13 @@
1
+ import type { TargetEvent } from '../types.js';
2
+ /** The stdout line protocol a target's backend speaks to the platform's publisher. */
3
+ export interface TargetEventHelper {
4
+ /** The stdout line of an event. Over-long ones lose their stack, then their data — never their head. */
5
+ targetEventLine: (event: TargetEvent) => string;
6
+ /**
7
+ * The event a stdout line carries, or `undefined` when the line is not one — absent marker, broken
8
+ * JSON, unknown version, or a shape the platform does not accept. The input is untrusted: it is
9
+ * written by generated code, and nothing outside this function may read fields of it unchecked.
10
+ */
11
+ parseTargetEventLine: (line: string) => TargetEvent | undefined;
12
+ }
13
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/event/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,sFAAsF;AACtF,MAAM,WAAW,iBAAiB;IAChC,wGAAwG;IACxG,eAAe,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,MAAM,CAAA;IAC/C;;;;OAIG;IACH,oBAAoB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,WAAW,GAAG,SAAS,CAAA;CAChE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/event/types.ts"],"names":[],"mappings":""}
package/build/event.d.ts CHANGED
@@ -1,10 +1,9 @@
1
1
  import type { TargetEvent } from './types.js';
2
- /** The stdout line of an event. Over-long ones lose their stack, then their data — never their head. */
2
+ import type { TargetEventHelper } from './event/types.js';
3
+ export declare const createTargetEventHelper: () => TargetEventHelper;
4
+ export declare const targetEventHelper: TargetEventHelper;
5
+ /** @deprecated compat:factory-refactor — use `targetEventHelper.targetEventLine(…)` */
3
6
  export declare const targetEventLine: (event: TargetEvent) => string;
4
- /**
5
- * The event a stdout line carries, or `undefined` when the line is not one — absent marker, broken
6
- * JSON, unknown version, or a shape the platform does not accept. The input is untrusted: it is
7
- * written by generated code, and nothing outside this function may read fields of it unchecked.
8
- */
7
+ /** @deprecated compat:factory-refactor — use `targetEventHelper.parseTargetEventLine(…)` */
9
8
  export declare const parseTargetEventLine: (line: string) => TargetEvent | undefined;
10
9
  //# sourceMappingURL=event.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAI7C,wGAAwG;AACxG,eAAO,MAAM,eAAe,UAAW,WAAW,KAAG,MASpD,CAAA;AAKD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,SAAU,MAAM,KAAG,WAAW,GAAG,SAqCjE,CAAA"}
1
+ {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAMzD,eAAO,MAAM,uBAAuB,QAAO,iBAoD1C,CAAA;AAED,eAAO,MAAM,iBAAiB,mBAA4B,CAAA;AAE1D,uFAAuF;AACvF,eAAO,MAAM,eAAe,UAAW,WAAW,KAAG,MAAkD,CAAA;AAEvG,4FAA4F;AAC5F,eAAO,MAAM,oBAAoB,SAAU,MAAM,KAAG,WAAW,GAAG,SACpB,CAAA"}
package/build/event.js CHANGED
@@ -1,58 +1,60 @@
1
1
  import { TARGET_EVENT_MARKER, TARGET_EVENT_MAX, TARGET_EVENT_VERSION } from './consts.js';
2
- const LEVELS = ['debug', 'info', 'warn', 'error'];
3
- /** The stdout line of an event. Over-long ones lose their stack, then their data — never their head. */
4
- export const targetEventLine = (event) => {
5
- let line = TARGET_EVENT_MARKER + JSON.stringify(event);
6
- if (line.length > TARGET_EVENT_MAX && event.error?.stack != null) {
7
- line = TARGET_EVENT_MARKER + JSON.stringify({ ...event, error: { ...event.error, stack: undefined } });
8
- }
9
- if (line.length > TARGET_EVENT_MAX) {
10
- line = TARGET_EVENT_MARKER + JSON.stringify({ ...event, data: undefined });
11
- }
12
- return line.length > TARGET_EVENT_MAX ? line.slice(0, TARGET_EVENT_MAX) : line;
13
- };
2
+ import { LEVELS } from './consts.local.js';
14
3
  const text = (value, max) => typeof value === 'string' ? value.slice(0, max) : undefined;
15
- /**
16
- * The event a stdout line carries, or `undefined` when the line is not one — absent marker, broken
17
- * JSON, unknown version, or a shape the platform does not accept. The input is untrusted: it is
18
- * written by generated code, and nothing outside this function may read fields of it unchecked.
19
- */
20
- export const parseTargetEventLine = (line) => {
21
- const at = line.indexOf(TARGET_EVENT_MARKER);
22
- if (at < 0 || line.length > TARGET_EVENT_MAX + 64) {
23
- return undefined;
24
- }
25
- let raw;
26
- try {
27
- raw = JSON.parse(line.slice(at + TARGET_EVENT_MARKER.length));
28
- }
29
- catch {
30
- return undefined;
31
- }
32
- if (raw == null || typeof raw !== 'object') {
33
- return undefined;
34
- }
35
- const event = raw;
36
- if (event.v !== TARGET_EVENT_VERSION || (event.kind !== 'error' && event.kind !== 'analytics')
37
- || typeof event.ts !== 'number' || !LEVELS.includes(event.level)) {
38
- return undefined;
39
- }
40
- const error = event.error != null && typeof event.error === 'object' ? event.error : undefined;
41
- return {
42
- v: TARGET_EVENT_VERSION,
43
- kind: event.kind,
44
- ts: event.ts,
45
- level: event.level,
46
- scope: text(event.scope, 200) ?? 'target',
47
- message: text(event.message, 2000) ?? '',
48
- event: text(event.event, 200),
49
- data: event.data,
50
- error: error != null
51
- ? {
52
- name: text(error.name, 200) ?? 'Error', message: text(error.message, 2000) ?? '',
53
- stack: text(error.stack, 8000), incidentId: text(error.incidentId, 100),
54
- }
55
- : undefined,
4
+ export const createTargetEventHelper = () => {
5
+ const targetEventLine = (event) => {
6
+ let line = TARGET_EVENT_MARKER + JSON.stringify(event);
7
+ if (line.length > TARGET_EVENT_MAX && event.error?.stack != null) {
8
+ line = TARGET_EVENT_MARKER + JSON.stringify({ ...event, error: { ...event.error, stack: undefined } });
9
+ }
10
+ if (line.length > TARGET_EVENT_MAX) {
11
+ line = TARGET_EVENT_MARKER + JSON.stringify({ ...event, data: undefined });
12
+ }
13
+ return line.length > TARGET_EVENT_MAX ? line.slice(0, TARGET_EVENT_MAX) : line;
14
+ };
15
+ const parseTargetEventLine = (line) => {
16
+ const at = line.indexOf(TARGET_EVENT_MARKER);
17
+ if (at < 0 || line.length > TARGET_EVENT_MAX + 64) {
18
+ return undefined;
19
+ }
20
+ let raw;
21
+ try {
22
+ raw = JSON.parse(line.slice(at + TARGET_EVENT_MARKER.length));
23
+ }
24
+ catch {
25
+ return undefined;
26
+ }
27
+ if (raw == null || typeof raw !== 'object') {
28
+ return undefined;
29
+ }
30
+ const event = raw;
31
+ if (event.v !== TARGET_EVENT_VERSION || (event.kind !== 'error' && event.kind !== 'analytics')
32
+ || typeof event.ts !== 'number' || !LEVELS.includes(event.level)) {
33
+ return undefined;
34
+ }
35
+ const error = event.error != null && typeof event.error === 'object' ? event.error : undefined;
36
+ return {
37
+ v: TARGET_EVENT_VERSION,
38
+ kind: event.kind,
39
+ ts: event.ts,
40
+ level: event.level,
41
+ scope: text(event.scope, 200) ?? 'target',
42
+ message: text(event.message, 2000) ?? '',
43
+ event: text(event.event, 200),
44
+ data: event.data,
45
+ error: error != null
46
+ ? {
47
+ name: text(error.name, 200) ?? 'Error', message: text(error.message, 2000) ?? '',
48
+ stack: text(error.stack, 8000), incidentId: text(error.incidentId, 100),
49
+ }
50
+ : undefined,
51
+ };
56
52
  };
53
+ return { targetEventLine, parseTargetEventLine };
57
54
  };
55
+ export const targetEventHelper = createTargetEventHelper();
56
+ /** @deprecated compat:factory-refactor — use `targetEventHelper.targetEventLine(…)` */
57
+ export const targetEventLine = (event) => targetEventHelper.targetEventLine(event);
58
+ /** @deprecated compat:factory-refactor — use `targetEventHelper.parseTargetEventLine(…)` */
59
+ export const parseTargetEventLine = (line) => targetEventHelper.parseTargetEventLine(line);
58
60
  //# sourceMappingURL=event.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"event.js","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"event.js","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"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"}
package/build/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export type * from './types.js';
2
+ export type * from './event/types.js';
2
3
  export * from './consts.js';
3
4
  export * from './event.js';
4
5
  export * from './plugins.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,mBAAmB,YAAY,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,mBAAmB,YAAY,CAAA;AAC/B,mBAAmB,kBAAkB,CAAA;AACrC,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,eAAe,CAAA;AAGzD,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,YAAY,CAAA;AAE7D,+FAA+F;AAC/F,eAAO,MAAM,cAAc,QAAO,cAAc,GAAG,SAOlD,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,QAAO,SAKrC,CAAA;AAsBF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,QAAO,SAyBnC,CAAA"}
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,eAAe,CAAA;AAGzD,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,YAAY,CAAA;AAG7D,+FAA+F;AAC/F,eAAO,MAAM,cAAc,QAAO,cAAc,GAAG,SAOlD,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,QAAO,SAKrC,CAAA;AAoBF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,QAAO,SAyBnC,CAAA"}
package/build/plugins.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { PREVIEW_ANALYTICS_TYPE, PREVIEW_REPORTER_FLAG, SLOT_EVENTS_ENV, TARGET_EVENT_VERSION } from './consts.js';
2
- import { targetEventLine } from './event.js';
2
+ import { targetEventHelper } from './event.js';
3
3
  /** The reporter's channel of the current document, or `undefined` outside a framed preview. */
4
4
  export const previewChannel = () => {
5
5
  if (typeof window === 'undefined') {
@@ -47,7 +47,7 @@ export const viableSlotPlugin = () => {
47
47
  const emit = (event) => {
48
48
  const out = stdout();
49
49
  if (out != null && slotEventsEnabled()) {
50
- out.write(`${targetEventLine(event)}\n`);
50
+ out.write(`${targetEventHelper.targetEventLine(event)}\n`);
51
51
  }
52
52
  };
53
53
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"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"}
package/build/types.d.ts CHANGED
@@ -30,5 +30,6 @@ export interface TargetEvent {
30
30
  };
31
31
  }
32
32
  /** The payload of a preview `Analytics` message (browser → manager). */
33
- export type PreviewAnalyticsPayload = AnalyticsEvent;
33
+ export interface PreviewAnalyticsPayload extends AnalyticsEvent {
34
+ }
34
35
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEnD,iGAAiG;AACjG,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,MAAM,CAAA;IACT,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CAC/C;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,WAAW,CAAA;AAEnD;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAA;IACT,IAAI,EAAE,eAAe,CAAA;IACrB,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;IAC1C,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC/E;AAED,wEAAwE;AACxE,MAAM,MAAM,uBAAuB,GAAG,cAAc,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEnD,iGAAiG;AACjG,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,MAAM,CAAA;IACT,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CAC/C;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,WAAW,CAAA;AAEnD;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAA;IACT,IAAI,EAAE,eAAe,CAAA;IACrB,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;IAC1C,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC/E;AAED,wEAAwE;AACxE,MAAM,WAAW,uBAAwB,SAAQ,cAAc;CAAG"}
@@ -0,0 +1,4 @@
1
+ export interface Stdout {
2
+ write: (chunk: string) => unknown;
3
+ }
4
+ //# sourceMappingURL=types.local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.local.d.ts","sourceRoot":"","sources":["../src/types.local.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IAAG,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;CAAE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.local.js","sourceRoot":"","sources":["../src/types.local.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owlmeans/viable-log",
3
- "version": "0.1.18-rc.0",
3
+ "version": "0.1.18-rc.2",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -22,11 +22,11 @@
22
22
  }
23
23
  },
24
24
  "dependencies": {
25
- "@owlmeans/log": "^0.1.18-rc.0"
25
+ "@owlmeans/log": "^0.1.18-rc.2"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@owlmeans/dep-config": "workspace:*",
29
- "@types/bun": "^1.4.0",
29
+ "@types/bun": "^1.4.2",
30
30
  "nodemon": "^3.1.14",
31
31
  "typescript": "^7.0.2"
32
32
  },
@@ -0,0 +1 @@
1
+ export const LEVELS = ['debug', 'info', 'warn', 'error']
@@ -0,0 +1,13 @@
1
+ import type { TargetEvent } from '../types.js'
2
+
3
+ /** The stdout line protocol a target's backend speaks to the platform's publisher. */
4
+ export interface TargetEventHelper {
5
+ /** The stdout line of an event. Over-long ones lose their stack, then their data — never their head. */
6
+ targetEventLine: (event: TargetEvent) => string
7
+ /**
8
+ * The event a stdout line carries, or `undefined` when the line is not one — absent marker, broken
9
+ * JSON, unknown version, or a shape the platform does not accept. The input is untrusted: it is
10
+ * written by generated code, and nothing outside this function may read fields of it unchecked.
11
+ */
12
+ parseTargetEventLine: (line: string) => TargetEvent | undefined
13
+ }
package/src/event.ts CHANGED
@@ -1,63 +1,70 @@
1
1
  import { TARGET_EVENT_MARKER, TARGET_EVENT_MAX, TARGET_EVENT_VERSION } from './consts.js'
2
2
  import type { TargetEvent } from './types.js'
3
-
4
- const LEVELS = ['debug', 'info', 'warn', 'error']
5
-
6
- /** The stdout line of an event. Over-long ones lose their stack, then their data — never their head. */
7
- export const targetEventLine = (event: TargetEvent): string => {
8
- let line = TARGET_EVENT_MARKER + JSON.stringify(event)
9
- if (line.length > TARGET_EVENT_MAX && event.error?.stack != null) {
10
- line = TARGET_EVENT_MARKER + JSON.stringify({ ...event, error: { ...event.error, stack: undefined } })
11
- }
12
- if (line.length > TARGET_EVENT_MAX) {
13
- line = TARGET_EVENT_MARKER + JSON.stringify({ ...event, data: undefined })
14
- }
15
- return line.length > TARGET_EVENT_MAX ? line.slice(0, TARGET_EVENT_MAX) : line
16
- }
3
+ import type { TargetEventHelper } from './event/types.js'
4
+ import { LEVELS } from './consts.local.js'
17
5
 
18
6
  const text = (value: unknown, max: number): string | undefined =>
19
7
  typeof value === 'string' ? value.slice(0, max) : undefined
20
8
 
21
- /**
22
- * The event a stdout line carries, or `undefined` when the line is not one — absent marker, broken
23
- * JSON, unknown version, or a shape the platform does not accept. The input is untrusted: it is
24
- * written by generated code, and nothing outside this function may read fields of it unchecked.
25
- */
26
- export const parseTargetEventLine = (line: string): TargetEvent | undefined => {
27
- const at = line.indexOf(TARGET_EVENT_MARKER)
28
- if (at < 0 || line.length > TARGET_EVENT_MAX + 64) {
29
- return undefined
30
- }
31
- let raw: unknown
32
- try {
33
- raw = JSON.parse(line.slice(at + TARGET_EVENT_MARKER.length))
34
- } catch {
35
- return undefined
36
- }
37
- if (raw == null || typeof raw !== 'object') {
38
- return undefined
9
+ export const createTargetEventHelper = (): TargetEventHelper => {
10
+ const targetEventLine = (event: TargetEvent): string => {
11
+ let line = TARGET_EVENT_MARKER + JSON.stringify(event)
12
+ if (line.length > TARGET_EVENT_MAX && event.error?.stack != null) {
13
+ line = TARGET_EVENT_MARKER + JSON.stringify({ ...event, error: { ...event.error, stack: undefined } })
14
+ }
15
+ if (line.length > TARGET_EVENT_MAX) {
16
+ line = TARGET_EVENT_MARKER + JSON.stringify({ ...event, data: undefined })
17
+ }
18
+ return line.length > TARGET_EVENT_MAX ? line.slice(0, TARGET_EVENT_MAX) : line
39
19
  }
40
- const event = raw as Record<string, unknown>
41
- if (event.v !== TARGET_EVENT_VERSION || (event.kind !== 'error' && event.kind !== 'analytics')
42
- || typeof event.ts !== 'number' || !LEVELS.includes(event.level as string)) {
43
- return undefined
44
- }
45
- const error = event.error != null && typeof event.error === 'object' ? event.error as Record<string, unknown> : undefined
46
-
47
- return {
48
- v: TARGET_EVENT_VERSION,
49
- kind: event.kind,
50
- ts: event.ts,
51
- level: event.level as TargetEvent['level'],
52
- scope: text(event.scope, 200) ?? 'target',
53
- message: text(event.message, 2000) ?? '',
54
- event: text(event.event, 200),
55
- data: event.data,
56
- error: error != null
57
- ? {
58
- name: text(error.name, 200) ?? 'Error', message: text(error.message, 2000) ?? '',
59
- stack: text(error.stack, 8000), incidentId: text(error.incidentId, 100),
60
- }
61
- : undefined,
20
+
21
+ const parseTargetEventLine = (line: string): TargetEvent | undefined => {
22
+ const at = line.indexOf(TARGET_EVENT_MARKER)
23
+ if (at < 0 || line.length > TARGET_EVENT_MAX + 64) {
24
+ return undefined
25
+ }
26
+ let raw: unknown
27
+ try {
28
+ raw = JSON.parse(line.slice(at + TARGET_EVENT_MARKER.length))
29
+ } catch {
30
+ return undefined
31
+ }
32
+ if (raw == null || typeof raw !== 'object') {
33
+ return undefined
34
+ }
35
+ const event = raw as Record<string, unknown>
36
+ if (event.v !== TARGET_EVENT_VERSION || (event.kind !== 'error' && event.kind !== 'analytics')
37
+ || typeof event.ts !== 'number' || !LEVELS.includes(event.level as string)) {
38
+ return undefined
39
+ }
40
+ const error = event.error != null && typeof event.error === 'object' ? event.error as Record<string, unknown> : undefined
41
+
42
+ return {
43
+ v: TARGET_EVENT_VERSION,
44
+ kind: event.kind,
45
+ ts: event.ts,
46
+ level: event.level as TargetEvent['level'],
47
+ scope: text(event.scope, 200) ?? 'target',
48
+ message: text(event.message, 2000) ?? '',
49
+ event: text(event.event, 200),
50
+ data: event.data,
51
+ error: error != null
52
+ ? {
53
+ name: text(error.name, 200) ?? 'Error', message: text(error.message, 2000) ?? '',
54
+ stack: text(error.stack, 8000), incidentId: text(error.incidentId, 100),
55
+ }
56
+ : undefined,
57
+ }
62
58
  }
59
+
60
+ return { targetEventLine, parseTargetEventLine }
63
61
  }
62
+
63
+ export const targetEventHelper = createTargetEventHelper()
64
+
65
+ /** @deprecated compat:factory-refactor — use `targetEventHelper.targetEventLine(…)` */
66
+ export const targetEventLine = (event: TargetEvent): string => targetEventHelper.targetEventLine(event)
67
+
68
+ /** @deprecated compat:factory-refactor — use `targetEventHelper.parseTargetEventLine(…)` */
69
+ export const parseTargetEventLine = (line: string): TargetEvent | undefined =>
70
+ targetEventHelper.parseTargetEventLine(line)
package/src/index.ts CHANGED
@@ -1,5 +1,6 @@
1
1
 
2
2
  export type * from './types.js'
3
+ export type * from './event/types.js'
3
4
  export * from './consts.js'
4
5
  export * from './event.js'
5
6
  export * from './plugins.js'
package/src/plugins.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import type { LogPlugin, LogRecord } from '@owlmeans/log'
2
2
  import { PREVIEW_ANALYTICS_TYPE, PREVIEW_REPORTER_FLAG, SLOT_EVENTS_ENV, TARGET_EVENT_VERSION } from './consts.js'
3
- import { targetEventLine } from './event.js'
3
+ import { targetEventHelper } from './event.js'
4
4
  import type { PreviewChannel, TargetEvent } from './types.js'
5
+ import type { Stdout } from './types.local.js'
5
6
 
6
7
  /** The reporter's channel of the current document, or `undefined` outside a framed preview. */
7
8
  export const previewChannel = (): PreviewChannel | undefined => {
@@ -29,8 +30,6 @@ export const viablePreviewPlugin = (): LogPlugin => ({
29
30
  },
30
31
  })
31
32
 
32
- interface Stdout { write: (chunk: string) => unknown }
33
-
34
33
  const stdout = (): Stdout | undefined =>
35
34
  (globalThis as { process?: { stdout?: Stdout } }).process?.stdout
36
35
 
@@ -59,7 +58,7 @@ export const viableSlotPlugin = (): LogPlugin => {
59
58
  const emit = (event: TargetEvent): void => {
60
59
  const out = stdout()
61
60
  if (out != null && slotEventsEnabled()) {
62
- out.write(`${targetEventLine(event)}\n`)
61
+ out.write(`${targetEventHelper.targetEventLine(event)}\n`)
63
62
  }
64
63
  }
65
64
  return {
@@ -0,0 +1 @@
1
+ export interface Stdout { write: (chunk: string) => unknown }
package/src/types.ts CHANGED
@@ -29,4 +29,4 @@ export interface TargetEvent {
29
29
  }
30
30
 
31
31
  /** The payload of a preview `Analytics` message (browser → manager). */
32
- export type PreviewAnalyticsPayload = AnalyticsEvent
32
+ export interface PreviewAnalyticsPayload extends AnalyticsEvent {}
@@ -1,8 +1,8 @@
1
1
  import { afterEach, beforeEach, describe, expect, test } from 'bun:test'
2
- import { addLogPlugin, logger, nativeConsole, resetLog } from '@owlmeans/log'
2
+ import { addLogPlugin, logger, resetLog, logStateHelper } from '@owlmeans/log'
3
3
  import {
4
4
  PREVIEW_ANALYTICS_TYPE, PREVIEW_REPORTER_FLAG, SLOT_EVENTS_ENV, TARGET_EVENT_MARKER, TARGET_EVENT_MAX,
5
- parseTargetEventLine, targetEventLine, viablePreviewPlugin, viableSlotPlugin,
5
+ targetEventHelper, viablePreviewPlugin, viableSlotPlugin,
6
6
  } from '@owlmeans/viable-log'
7
7
  import type { TargetEvent } from '@owlmeans/viable-log'
8
8
 
@@ -13,37 +13,37 @@ const sample = (patch: Partial<TargetEvent> = {}): TargetEvent => ({
13
13
  describe('target event line', () => {
14
14
  test('round-trips through targetEventLine and parseTargetEventLine', () => {
15
15
  const event = sample({ data: { id: 1 }, error: { name: 'Error', message: 'x', stack: 's', incidentId: 'i' }, event: 'e' })
16
- expect(parseTargetEventLine(targetEventLine(event))).toEqual(event)
16
+ expect(targetEventHelper.parseTargetEventLine(targetEventHelper.targetEventLine(event))).toEqual(event)
17
17
  })
18
18
 
19
19
  test('finds the marker anywhere in a line (prefixed stdout)', () => {
20
- expect(parseTargetEventLine(`12:00 ${targetEventLine(sample())}`)?.message).toBe('boom')
20
+ expect(targetEventHelper.parseTargetEventLine(`12:00 ${targetEventHelper.targetEventLine(sample())}`)?.message).toBe('boom')
21
21
  })
22
22
 
23
23
  test('rejects a line without a marker, broken JSON, a wrong version or kind, a bad level', () => {
24
- expect(parseTargetEventLine('plain')).toBeUndefined()
25
- expect(parseTargetEventLine(`${TARGET_EVENT_MARKER}{nope`)).toBeUndefined()
26
- expect(parseTargetEventLine(`${TARGET_EVENT_MARKER}${JSON.stringify({ ...sample(), v: 2 })}`)).toBeUndefined()
27
- expect(parseTargetEventLine(`${TARGET_EVENT_MARKER}${JSON.stringify({ ...sample(), kind: 'x' })}`)).toBeUndefined()
28
- expect(parseTargetEventLine(`${TARGET_EVENT_MARKER}${JSON.stringify({ ...sample(), level: 'fatal' })}`)).toBeUndefined()
29
- expect(parseTargetEventLine(`${TARGET_EVENT_MARKER}null`)).toBeUndefined()
24
+ expect(targetEventHelper.parseTargetEventLine('plain')).toBeUndefined()
25
+ expect(targetEventHelper.parseTargetEventLine(`${TARGET_EVENT_MARKER}{nope`)).toBeUndefined()
26
+ expect(targetEventHelper.parseTargetEventLine(`${TARGET_EVENT_MARKER}${JSON.stringify({ ...sample(), v: 2 })}`)).toBeUndefined()
27
+ expect(targetEventHelper.parseTargetEventLine(`${TARGET_EVENT_MARKER}${JSON.stringify({ ...sample(), kind: 'x' })}`)).toBeUndefined()
28
+ expect(targetEventHelper.parseTargetEventLine(`${TARGET_EVENT_MARKER}${JSON.stringify({ ...sample(), level: 'fatal' })}`)).toBeUndefined()
29
+ expect(targetEventHelper.parseTargetEventLine(`${TARGET_EVENT_MARKER}null`)).toBeUndefined()
30
30
  })
31
31
 
32
32
  test('clips untrusted text fields and ignores unknown fields', () => {
33
33
  const line = `${TARGET_EVENT_MARKER}${JSON.stringify({ ...sample(), message: 'm'.repeat(5000), extra: 'x', scope: 7 })}`
34
- const parsed = parseTargetEventLine(line)!
34
+ const parsed = targetEventHelper.parseTargetEventLine(line)!
35
35
  expect(parsed.message.length).toBe(2000)
36
36
  expect(parsed.scope).toBe('target')
37
37
  expect('extra' in parsed).toBe(false)
38
38
  })
39
39
 
40
40
  test('an over-long event loses its stack first, then its data, and stays under the cap', () => {
41
- const stackless = targetEventLine(sample({ error: { name: 'E', message: 'm', stack: 's'.repeat(TARGET_EVENT_MAX * 2) } }))
41
+ const stackless = targetEventHelper.targetEventLine(sample({ error: { name: 'E', message: 'm', stack: 's'.repeat(TARGET_EVENT_MAX * 2) } }))
42
42
  expect(stackless.length).toBeLessThanOrEqual(TARGET_EVENT_MAX)
43
- expect(parseTargetEventLine(stackless)?.error?.message).toBe('m')
44
- const dataless = targetEventLine(sample({ data: 'd'.repeat(TARGET_EVENT_MAX * 2) }))
43
+ expect(targetEventHelper.parseTargetEventLine(stackless)?.error?.message).toBe('m')
44
+ const dataless = targetEventHelper.targetEventLine(sample({ data: 'd'.repeat(TARGET_EVENT_MAX * 2) }))
45
45
  expect(dataless.length).toBeLessThanOrEqual(TARGET_EVENT_MAX)
46
- expect(parseTargetEventLine(dataless)?.message).toBe('boom')
46
+ expect(targetEventHelper.parseTargetEventLine(dataless)?.message).toBe('boom')
47
47
  })
48
48
  })
49
49
 
@@ -74,18 +74,18 @@ describe('viableSlotPlugin', () => {
74
74
  const written: string[] = []
75
75
  const proc = globalThis.process
76
76
  const realWrite = proc.stdout.write.bind(proc.stdout)
77
- let saved: ReturnType<typeof nativeConsole>
77
+ let saved: ReturnType<typeof logStateHelper.nativeConsole>
78
78
 
79
79
  beforeEach(() => {
80
80
  resetLog()
81
81
  written.length = 0
82
- saved = { ...nativeConsole() }
83
- for (const key of Object.keys(nativeConsole()) as (keyof ReturnType<typeof nativeConsole>)[]) nativeConsole()[key] = () => undefined
82
+ saved = { ...logStateHelper.nativeConsole() }
83
+ for (const key of Object.keys(logStateHelper.nativeConsole()) as (keyof ReturnType<typeof logStateHelper.nativeConsole>)[]) logStateHelper.nativeConsole()[key] = () => undefined
84
84
  ;(proc.stdout as { write: unknown }).write = (chunk: string) => { written.push(String(chunk)); return true }
85
85
  })
86
86
  afterEach(() => {
87
87
  ;(proc.stdout as { write: unknown }).write = realWrite
88
- Object.assign(nativeConsole(), saved)
88
+ Object.assign(logStateHelper.nativeConsole(), saved)
89
89
  delete proc.env[SLOT_EVENTS_ENV]
90
90
  resetLog()
91
91
  })
@@ -104,7 +104,7 @@ describe('viableSlotPlugin', () => {
104
104
  logger('api').info('Signed up', { plan: 'free' }, { analytics: 'signup' })
105
105
  logger('api').info('plain info')
106
106
  logger('api').warn('plain warn')
107
- const events = written.map(line => parseTargetEventLine(line)!)
107
+ const events = written.map(line => targetEventHelper.parseTargetEventLine(line)!)
108
108
  expect(events.map(e => [e.kind, e.event ?? e.message])).toEqual([['error', 'Request failed'], ['analytics', 'signup']])
109
109
  expect(events[0].error).toMatchObject({ name: 'Error', message: 'db down', incidentId: 'inc-1' })
110
110
  expect(events[1].data).toEqual({ plan: 'free' })