@ricsam/isolate-console 0.0.1 → 0.1.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
@@ -1,45 +1,69 @@
1
1
  # @ricsam/isolate-console
2
2
 
3
- ## ⚠️ IMPORTANT NOTICE ⚠️
4
-
5
- **This package is created solely for the purpose of setting up OIDC (OpenID Connect) trusted publishing with npm.**
6
-
7
- This is **NOT** a functional package and contains **NO** code or functionality beyond the OIDC setup configuration.
8
-
9
- ## Purpose
10
-
11
- This package exists to:
12
- 1. Configure OIDC trusted publishing for the package name `@ricsam/isolate-console`
13
- 2. Enable secure, token-less publishing from CI/CD workflows
14
- 3. Establish provenance for packages published under this name
15
-
16
- ## What is OIDC Trusted Publishing?
17
-
18
- OIDC trusted publishing allows package maintainers to publish packages directly from their CI/CD workflows without needing to manage npm access tokens. Instead, it uses OpenID Connect to establish trust between the CI/CD provider (like GitHub Actions) and npm.
19
-
20
- ## Setup Instructions
21
-
22
- To properly configure OIDC trusted publishing for this package:
23
-
24
- 1. Go to [npmjs.com](https://www.npmjs.com/) and navigate to your package settings
25
- 2. Configure the trusted publisher (e.g., GitHub Actions)
26
- 3. Specify the repository and workflow that should be allowed to publish
27
- 4. Use the configured workflow to publish your actual package
28
-
29
- ## DO NOT USE THIS PACKAGE
30
-
31
- This package is a placeholder for OIDC configuration only. It:
32
- - Contains no executable code
33
- - Provides no functionality
34
- - Should not be installed as a dependency
35
- - Exists only for administrative purposes
36
-
37
- ## More Information
38
-
39
- For more details about npm's trusted publishing feature, see:
40
- - [npm Trusted Publishing Documentation](https://docs.npmjs.com/generating-provenance-statements)
41
- - [GitHub Actions OIDC Documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
42
-
43
- ---
44
-
45
- **Maintained for OIDC setup purposes only**
3
+ Console API with logging, timing, counting, and grouping.
4
+
5
+ ```typescript
6
+ import { setupConsole } from "@ricsam/isolate-console";
7
+
8
+ const handle = await setupConsole(context, {
9
+ onLog: (level, ...args) => {
10
+ console.log(`[${level}]`, ...args);
11
+ },
12
+ onTime: (label, duration) => {
13
+ console.log(`${label}: ${duration}ms`);
14
+ },
15
+ onCount: (label, count) => {
16
+ console.log(`${label}: ${count}`);
17
+ },
18
+ });
19
+ ```
20
+
21
+ **Injected Globals:**
22
+ - `console.log`, `console.warn`, `console.error`, `console.debug`, `console.info`
23
+ - `console.trace`, `console.dir`, `console.table`
24
+ - `console.time`, `console.timeEnd`, `console.timeLog`
25
+ - `console.count`, `console.countReset`
26
+ - `console.group`, `console.groupCollapsed`, `console.groupEnd`
27
+ - `console.assert`, `console.clear`
28
+
29
+ **Usage in Isolate:**
30
+
31
+ ```javascript
32
+ // Basic logging
33
+ console.log("Hello", { name: "World" });
34
+ console.warn("Warning message");
35
+ console.error("Error occurred");
36
+
37
+ // Timing
38
+ console.time("operation");
39
+ // ... do work ...
40
+ console.timeLog("operation", "checkpoint");
41
+ // ... more work ...
42
+ console.timeEnd("operation"); // Logs: "operation: 123ms"
43
+
44
+ // Counting
45
+ console.count("clicks"); // clicks: 1
46
+ console.count("clicks"); // clicks: 2
47
+ console.countReset("clicks");
48
+ console.count("clicks"); // clicks: 1
49
+
50
+ // Grouping
51
+ console.group("User Info");
52
+ console.log("Name: John");
53
+ console.log("Age: 30");
54
+ console.groupEnd();
55
+ ```
56
+
57
+ **Event Handlers:**
58
+
59
+ | Handler | Description |
60
+ |---------|-------------|
61
+ | `onLog` | Called for log, warn, error, debug, info, trace, dir, table |
62
+ | `onTime` | Called when `console.timeEnd` completes a timer |
63
+ | `onTimeLog` | Called when `console.timeLog` logs without ending |
64
+ | `onCount` | Called when `console.count` increments |
65
+ | `onCountReset` | Called when `console.countReset` resets a counter |
66
+ | `onGroup` | Called when `console.group` or `groupCollapsed` is invoked |
67
+ | `onGroupEnd` | Called when `console.groupEnd` is invoked |
68
+ | `onAssert` | Called when `console.assert` fails |
69
+ | `onClear` | Called when `console.clear` is invoked |
@@ -0,0 +1,173 @@
1
+ // @bun @bun-cjs
2
+ (function(exports, require, module, __filename, __dirname) {var __create = Object.create;
3
+ var __getProtoOf = Object.getPrototypeOf;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __toESM = (mod, isNodeMode, target) => {
9
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
10
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
11
+ for (let key of __getOwnPropNames(mod))
12
+ if (!__hasOwnProp.call(to, key))
13
+ __defProp(to, key, {
14
+ get: () => mod[key],
15
+ enumerable: true
16
+ });
17
+ return to;
18
+ };
19
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
20
+ var __toCommonJS = (from) => {
21
+ var entry = __moduleCache.get(from), desc;
22
+ if (entry)
23
+ return entry;
24
+ entry = __defProp({}, "__esModule", { value: true });
25
+ if (from && typeof from === "object" || typeof from === "function")
26
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
27
+ get: () => from[key],
28
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
29
+ }));
30
+ __moduleCache.set(from, entry);
31
+ return entry;
32
+ };
33
+ var __export = (target, all) => {
34
+ for (var name in all)
35
+ __defProp(target, name, {
36
+ get: all[name],
37
+ enumerable: true,
38
+ configurable: true,
39
+ set: (newValue) => all[name] = () => newValue
40
+ });
41
+ };
42
+
43
+ // packages/console/src/index.ts
44
+ var exports_src = {};
45
+ __export(exports_src, {
46
+ setupConsole: () => setupConsole
47
+ });
48
+ module.exports = __toCommonJS(exports_src);
49
+ var import_isolated_vm = __toESM(require("isolated-vm"));
50
+ async function setupConsole(context, options) {
51
+ const opts = options ?? {};
52
+ const timers = new Map;
53
+ const counters = new Map;
54
+ let groupDepth = 0;
55
+ const global = context.global;
56
+ const logLevels = [
57
+ "log",
58
+ "warn",
59
+ "error",
60
+ "debug",
61
+ "info",
62
+ "trace",
63
+ "dir",
64
+ "table"
65
+ ];
66
+ for (const level of logLevels) {
67
+ global.setSync(`__console_${level}`, new import_isolated_vm.default.Callback((...args) => {
68
+ opts.onLog?.(level, ...args);
69
+ }));
70
+ }
71
+ global.setSync("__console_time", new import_isolated_vm.default.Callback((label) => {
72
+ const l = label ?? "default";
73
+ timers.set(l, performance.now());
74
+ }));
75
+ global.setSync("__console_timeEnd", new import_isolated_vm.default.Callback((label) => {
76
+ const l = label ?? "default";
77
+ const start = timers.get(l);
78
+ if (start !== undefined) {
79
+ const duration = performance.now() - start;
80
+ timers.delete(l);
81
+ opts.onTime?.(l, duration);
82
+ }
83
+ }));
84
+ global.setSync("__console_timeLog", new import_isolated_vm.default.Callback((label, ...args) => {
85
+ const l = label ?? "default";
86
+ const start = timers.get(l);
87
+ if (start !== undefined) {
88
+ const duration = performance.now() - start;
89
+ opts.onTimeLog?.(l, duration, ...args);
90
+ }
91
+ }));
92
+ global.setSync("__console_count", new import_isolated_vm.default.Callback((label) => {
93
+ const l = label ?? "default";
94
+ const count = (counters.get(l) ?? 0) + 1;
95
+ counters.set(l, count);
96
+ opts.onCount?.(l, count);
97
+ }));
98
+ global.setSync("__console_countReset", new import_isolated_vm.default.Callback((label) => {
99
+ const l = label ?? "default";
100
+ counters.delete(l);
101
+ opts.onCountReset?.(l);
102
+ }));
103
+ global.setSync("__console_group", new import_isolated_vm.default.Callback((label) => {
104
+ const l = label ?? "default";
105
+ groupDepth++;
106
+ opts.onGroup?.(l, false);
107
+ }));
108
+ global.setSync("__console_groupCollapsed", new import_isolated_vm.default.Callback((label) => {
109
+ const l = label ?? "default";
110
+ groupDepth++;
111
+ opts.onGroup?.(l, true);
112
+ }));
113
+ global.setSync("__console_groupEnd", new import_isolated_vm.default.Callback(() => {
114
+ if (groupDepth > 0) {
115
+ groupDepth--;
116
+ }
117
+ opts.onGroupEnd?.();
118
+ }));
119
+ global.setSync("__console_clear", new import_isolated_vm.default.Callback(() => {
120
+ opts.onClear?.();
121
+ }));
122
+ global.setSync("__console_assert", new import_isolated_vm.default.Callback((condition, ...args) => {
123
+ if (!condition) {
124
+ opts.onAssert?.(condition, ...args);
125
+ }
126
+ }));
127
+ context.evalSync(`
128
+ globalThis.console = {
129
+ log: __console_log,
130
+ warn: __console_warn,
131
+ error: __console_error,
132
+ debug: __console_debug,
133
+ info: __console_info,
134
+ trace: __console_trace,
135
+ dir: __console_dir,
136
+ table: __console_table,
137
+ time: __console_time,
138
+ timeEnd: __console_timeEnd,
139
+ timeLog: __console_timeLog,
140
+ count: __console_count,
141
+ countReset: __console_countReset,
142
+ group: __console_group,
143
+ groupCollapsed: __console_groupCollapsed,
144
+ groupEnd: __console_groupEnd,
145
+ clear: __console_clear,
146
+ assert: __console_assert,
147
+ };
148
+ `);
149
+ return {
150
+ dispose() {
151
+ timers.clear();
152
+ counters.clear();
153
+ groupDepth = 0;
154
+ },
155
+ reset() {
156
+ timers.clear();
157
+ counters.clear();
158
+ groupDepth = 0;
159
+ },
160
+ getTimers() {
161
+ return new Map(timers);
162
+ },
163
+ getCounters() {
164
+ return new Map(counters);
165
+ },
166
+ getGroupDepth() {
167
+ return groupDepth;
168
+ }
169
+ };
170
+ }
171
+ })
172
+
173
+ //# debugId=4D8B064A0F23B8BC64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/index.ts"],
4
+ "sourcesContent": [
5
+ "import ivm from \"isolated-vm\";\n\nexport interface ConsoleOptions {\n onLog?: (level: string, ...args: unknown[]) => void;\n onTime?: (label: string, duration: number) => void;\n onTimeLog?: (label: string, duration: number, ...args: unknown[]) => void;\n onCount?: (label: string, count: number) => void;\n onCountReset?: (label: string) => void;\n onGroup?: (label: string, collapsed: boolean) => void;\n onGroupEnd?: () => void;\n onClear?: () => void;\n onAssert?: (condition: boolean, ...args: unknown[]) => void;\n}\n\nexport interface ConsoleHandle {\n dispose(): void;\n reset(): void;\n getTimers(): Map<string, number>;\n getCounters(): Map<string, number>;\n getGroupDepth(): number;\n}\n\n/**\n * Setup console API in an isolated-vm context\n *\n * Injects console.log, console.warn, console.error, console.info, console.debug,\n * console.trace, console.dir, console.table, console.time, console.timeEnd,\n * console.timeLog, console.count, console.countReset, console.group,\n * console.groupCollapsed, console.groupEnd, console.clear, console.assert\n *\n * @example\n * const handle = await setupConsole(context, {\n * onLog: (level, ...args) => console.log(`[${level}]`, ...args)\n * });\n */\nexport async function setupConsole(\n context: ivm.Context,\n options?: ConsoleOptions\n): Promise<ConsoleHandle> {\n const opts = options ?? {};\n\n // State management\n const timers = new Map<string, number>();\n const counters = new Map<string, number>();\n let groupDepth = 0;\n\n const global = context.global;\n\n // Log-level methods\n const logLevels = [\n \"log\",\n \"warn\",\n \"error\",\n \"debug\",\n \"info\",\n \"trace\",\n \"dir\",\n \"table\",\n ];\n\n for (const level of logLevels) {\n global.setSync(\n `__console_${level}`,\n new ivm.Callback((...args: unknown[]) => {\n opts.onLog?.(level, ...args);\n })\n );\n }\n\n // Timing methods\n global.setSync(\n \"__console_time\",\n new ivm.Callback((label?: string) => {\n const l = label ?? \"default\";\n timers.set(l, performance.now());\n })\n );\n\n global.setSync(\n \"__console_timeEnd\",\n new ivm.Callback((label?: string) => {\n const l = label ?? \"default\";\n const start = timers.get(l);\n if (start !== undefined) {\n const duration = performance.now() - start;\n timers.delete(l);\n opts.onTime?.(l, duration);\n }\n })\n );\n\n global.setSync(\n \"__console_timeLog\",\n new ivm.Callback((label?: string, ...args: unknown[]) => {\n const l = label ?? \"default\";\n const start = timers.get(l);\n if (start !== undefined) {\n const duration = performance.now() - start;\n opts.onTimeLog?.(l, duration, ...args);\n }\n })\n );\n\n // Counting methods\n global.setSync(\n \"__console_count\",\n new ivm.Callback((label?: string) => {\n const l = label ?? \"default\";\n const count = (counters.get(l) ?? 0) + 1;\n counters.set(l, count);\n opts.onCount?.(l, count);\n })\n );\n\n global.setSync(\n \"__console_countReset\",\n new ivm.Callback((label?: string) => {\n const l = label ?? \"default\";\n counters.delete(l);\n opts.onCountReset?.(l);\n })\n );\n\n // Grouping methods\n global.setSync(\n \"__console_group\",\n new ivm.Callback((label?: string) => {\n const l = label ?? \"default\";\n groupDepth++;\n opts.onGroup?.(l, false);\n })\n );\n\n global.setSync(\n \"__console_groupCollapsed\",\n new ivm.Callback((label?: string) => {\n const l = label ?? \"default\";\n groupDepth++;\n opts.onGroup?.(l, true);\n })\n );\n\n global.setSync(\n \"__console_groupEnd\",\n new ivm.Callback(() => {\n if (groupDepth > 0) {\n groupDepth--;\n }\n opts.onGroupEnd?.();\n })\n );\n\n // Other methods\n global.setSync(\n \"__console_clear\",\n new ivm.Callback(() => {\n opts.onClear?.();\n })\n );\n\n global.setSync(\n \"__console_assert\",\n new ivm.Callback((condition: boolean, ...args: unknown[]) => {\n if (!condition) {\n opts.onAssert?.(condition, ...args);\n }\n })\n );\n\n // Inject console object\n context.evalSync(`\n globalThis.console = {\n log: __console_log,\n warn: __console_warn,\n error: __console_error,\n debug: __console_debug,\n info: __console_info,\n trace: __console_trace,\n dir: __console_dir,\n table: __console_table,\n time: __console_time,\n timeEnd: __console_timeEnd,\n timeLog: __console_timeLog,\n count: __console_count,\n countReset: __console_countReset,\n group: __console_group,\n groupCollapsed: __console_groupCollapsed,\n groupEnd: __console_groupEnd,\n clear: __console_clear,\n assert: __console_assert,\n };\n `);\n\n return {\n dispose() {\n timers.clear();\n counters.clear();\n groupDepth = 0;\n },\n reset() {\n timers.clear();\n counters.clear();\n groupDepth = 0;\n },\n getTimers() {\n return new Map(timers);\n },\n getCounters() {\n return new Map(counters);\n },\n getGroupDepth() {\n return groupDepth;\n },\n };\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "4D8B064A0F23B8BC64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "@ricsam/isolate-console",
3
+ "version": "0.1.2",
4
+ "type": "commonjs"
5
+ }
@@ -0,0 +1,129 @@
1
+ // @bun
2
+ // packages/console/src/index.ts
3
+ import ivm from "isolated-vm";
4
+ async function setupConsole(context, options) {
5
+ const opts = options ?? {};
6
+ const timers = new Map;
7
+ const counters = new Map;
8
+ let groupDepth = 0;
9
+ const global = context.global;
10
+ const logLevels = [
11
+ "log",
12
+ "warn",
13
+ "error",
14
+ "debug",
15
+ "info",
16
+ "trace",
17
+ "dir",
18
+ "table"
19
+ ];
20
+ for (const level of logLevels) {
21
+ global.setSync(`__console_${level}`, new ivm.Callback((...args) => {
22
+ opts.onLog?.(level, ...args);
23
+ }));
24
+ }
25
+ global.setSync("__console_time", new ivm.Callback((label) => {
26
+ const l = label ?? "default";
27
+ timers.set(l, performance.now());
28
+ }));
29
+ global.setSync("__console_timeEnd", new ivm.Callback((label) => {
30
+ const l = label ?? "default";
31
+ const start = timers.get(l);
32
+ if (start !== undefined) {
33
+ const duration = performance.now() - start;
34
+ timers.delete(l);
35
+ opts.onTime?.(l, duration);
36
+ }
37
+ }));
38
+ global.setSync("__console_timeLog", new ivm.Callback((label, ...args) => {
39
+ const l = label ?? "default";
40
+ const start = timers.get(l);
41
+ if (start !== undefined) {
42
+ const duration = performance.now() - start;
43
+ opts.onTimeLog?.(l, duration, ...args);
44
+ }
45
+ }));
46
+ global.setSync("__console_count", new ivm.Callback((label) => {
47
+ const l = label ?? "default";
48
+ const count = (counters.get(l) ?? 0) + 1;
49
+ counters.set(l, count);
50
+ opts.onCount?.(l, count);
51
+ }));
52
+ global.setSync("__console_countReset", new ivm.Callback((label) => {
53
+ const l = label ?? "default";
54
+ counters.delete(l);
55
+ opts.onCountReset?.(l);
56
+ }));
57
+ global.setSync("__console_group", new ivm.Callback((label) => {
58
+ const l = label ?? "default";
59
+ groupDepth++;
60
+ opts.onGroup?.(l, false);
61
+ }));
62
+ global.setSync("__console_groupCollapsed", new ivm.Callback((label) => {
63
+ const l = label ?? "default";
64
+ groupDepth++;
65
+ opts.onGroup?.(l, true);
66
+ }));
67
+ global.setSync("__console_groupEnd", new ivm.Callback(() => {
68
+ if (groupDepth > 0) {
69
+ groupDepth--;
70
+ }
71
+ opts.onGroupEnd?.();
72
+ }));
73
+ global.setSync("__console_clear", new ivm.Callback(() => {
74
+ opts.onClear?.();
75
+ }));
76
+ global.setSync("__console_assert", new ivm.Callback((condition, ...args) => {
77
+ if (!condition) {
78
+ opts.onAssert?.(condition, ...args);
79
+ }
80
+ }));
81
+ context.evalSync(`
82
+ globalThis.console = {
83
+ log: __console_log,
84
+ warn: __console_warn,
85
+ error: __console_error,
86
+ debug: __console_debug,
87
+ info: __console_info,
88
+ trace: __console_trace,
89
+ dir: __console_dir,
90
+ table: __console_table,
91
+ time: __console_time,
92
+ timeEnd: __console_timeEnd,
93
+ timeLog: __console_timeLog,
94
+ count: __console_count,
95
+ countReset: __console_countReset,
96
+ group: __console_group,
97
+ groupCollapsed: __console_groupCollapsed,
98
+ groupEnd: __console_groupEnd,
99
+ clear: __console_clear,
100
+ assert: __console_assert,
101
+ };
102
+ `);
103
+ return {
104
+ dispose() {
105
+ timers.clear();
106
+ counters.clear();
107
+ groupDepth = 0;
108
+ },
109
+ reset() {
110
+ timers.clear();
111
+ counters.clear();
112
+ groupDepth = 0;
113
+ },
114
+ getTimers() {
115
+ return new Map(timers);
116
+ },
117
+ getCounters() {
118
+ return new Map(counters);
119
+ },
120
+ getGroupDepth() {
121
+ return groupDepth;
122
+ }
123
+ };
124
+ }
125
+ export {
126
+ setupConsole
127
+ };
128
+
129
+ //# debugId=5ED37B6ACE7B494E64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/index.ts"],
4
+ "sourcesContent": [
5
+ "import ivm from \"isolated-vm\";\n\nexport interface ConsoleOptions {\n onLog?: (level: string, ...args: unknown[]) => void;\n onTime?: (label: string, duration: number) => void;\n onTimeLog?: (label: string, duration: number, ...args: unknown[]) => void;\n onCount?: (label: string, count: number) => void;\n onCountReset?: (label: string) => void;\n onGroup?: (label: string, collapsed: boolean) => void;\n onGroupEnd?: () => void;\n onClear?: () => void;\n onAssert?: (condition: boolean, ...args: unknown[]) => void;\n}\n\nexport interface ConsoleHandle {\n dispose(): void;\n reset(): void;\n getTimers(): Map<string, number>;\n getCounters(): Map<string, number>;\n getGroupDepth(): number;\n}\n\n/**\n * Setup console API in an isolated-vm context\n *\n * Injects console.log, console.warn, console.error, console.info, console.debug,\n * console.trace, console.dir, console.table, console.time, console.timeEnd,\n * console.timeLog, console.count, console.countReset, console.group,\n * console.groupCollapsed, console.groupEnd, console.clear, console.assert\n *\n * @example\n * const handle = await setupConsole(context, {\n * onLog: (level, ...args) => console.log(`[${level}]`, ...args)\n * });\n */\nexport async function setupConsole(\n context: ivm.Context,\n options?: ConsoleOptions\n): Promise<ConsoleHandle> {\n const opts = options ?? {};\n\n // State management\n const timers = new Map<string, number>();\n const counters = new Map<string, number>();\n let groupDepth = 0;\n\n const global = context.global;\n\n // Log-level methods\n const logLevels = [\n \"log\",\n \"warn\",\n \"error\",\n \"debug\",\n \"info\",\n \"trace\",\n \"dir\",\n \"table\",\n ];\n\n for (const level of logLevels) {\n global.setSync(\n `__console_${level}`,\n new ivm.Callback((...args: unknown[]) => {\n opts.onLog?.(level, ...args);\n })\n );\n }\n\n // Timing methods\n global.setSync(\n \"__console_time\",\n new ivm.Callback((label?: string) => {\n const l = label ?? \"default\";\n timers.set(l, performance.now());\n })\n );\n\n global.setSync(\n \"__console_timeEnd\",\n new ivm.Callback((label?: string) => {\n const l = label ?? \"default\";\n const start = timers.get(l);\n if (start !== undefined) {\n const duration = performance.now() - start;\n timers.delete(l);\n opts.onTime?.(l, duration);\n }\n })\n );\n\n global.setSync(\n \"__console_timeLog\",\n new ivm.Callback((label?: string, ...args: unknown[]) => {\n const l = label ?? \"default\";\n const start = timers.get(l);\n if (start !== undefined) {\n const duration = performance.now() - start;\n opts.onTimeLog?.(l, duration, ...args);\n }\n })\n );\n\n // Counting methods\n global.setSync(\n \"__console_count\",\n new ivm.Callback((label?: string) => {\n const l = label ?? \"default\";\n const count = (counters.get(l) ?? 0) + 1;\n counters.set(l, count);\n opts.onCount?.(l, count);\n })\n );\n\n global.setSync(\n \"__console_countReset\",\n new ivm.Callback((label?: string) => {\n const l = label ?? \"default\";\n counters.delete(l);\n opts.onCountReset?.(l);\n })\n );\n\n // Grouping methods\n global.setSync(\n \"__console_group\",\n new ivm.Callback((label?: string) => {\n const l = label ?? \"default\";\n groupDepth++;\n opts.onGroup?.(l, false);\n })\n );\n\n global.setSync(\n \"__console_groupCollapsed\",\n new ivm.Callback((label?: string) => {\n const l = label ?? \"default\";\n groupDepth++;\n opts.onGroup?.(l, true);\n })\n );\n\n global.setSync(\n \"__console_groupEnd\",\n new ivm.Callback(() => {\n if (groupDepth > 0) {\n groupDepth--;\n }\n opts.onGroupEnd?.();\n })\n );\n\n // Other methods\n global.setSync(\n \"__console_clear\",\n new ivm.Callback(() => {\n opts.onClear?.();\n })\n );\n\n global.setSync(\n \"__console_assert\",\n new ivm.Callback((condition: boolean, ...args: unknown[]) => {\n if (!condition) {\n opts.onAssert?.(condition, ...args);\n }\n })\n );\n\n // Inject console object\n context.evalSync(`\n globalThis.console = {\n log: __console_log,\n warn: __console_warn,\n error: __console_error,\n debug: __console_debug,\n info: __console_info,\n trace: __console_trace,\n dir: __console_dir,\n table: __console_table,\n time: __console_time,\n timeEnd: __console_timeEnd,\n timeLog: __console_timeLog,\n count: __console_count,\n countReset: __console_countReset,\n group: __console_group,\n groupCollapsed: __console_groupCollapsed,\n groupEnd: __console_groupEnd,\n clear: __console_clear,\n assert: __console_assert,\n };\n `);\n\n return {\n dispose() {\n timers.clear();\n counters.clear();\n groupDepth = 0;\n },\n reset() {\n timers.clear();\n counters.clear();\n groupDepth = 0;\n },\n getTimers() {\n return new Map(timers);\n },\n getCounters() {\n return new Map(counters);\n },\n getGroupDepth() {\n return groupDepth;\n },\n };\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "5ED37B6ACE7B494E64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "@ricsam/isolate-console",
3
+ "version": "0.1.2",
4
+ "type": "module"
5
+ }
@@ -0,0 +1,33 @@
1
+ import ivm from "isolated-vm";
2
+ export interface ConsoleOptions {
3
+ onLog?: (level: string, ...args: unknown[]) => void;
4
+ onTime?: (label: string, duration: number) => void;
5
+ onTimeLog?: (label: string, duration: number, ...args: unknown[]) => void;
6
+ onCount?: (label: string, count: number) => void;
7
+ onCountReset?: (label: string) => void;
8
+ onGroup?: (label: string, collapsed: boolean) => void;
9
+ onGroupEnd?: () => void;
10
+ onClear?: () => void;
11
+ onAssert?: (condition: boolean, ...args: unknown[]) => void;
12
+ }
13
+ export interface ConsoleHandle {
14
+ dispose(): void;
15
+ reset(): void;
16
+ getTimers(): Map<string, number>;
17
+ getCounters(): Map<string, number>;
18
+ getGroupDepth(): number;
19
+ }
20
+ /**
21
+ * Setup console API in an isolated-vm context
22
+ *
23
+ * Injects console.log, console.warn, console.error, console.info, console.debug,
24
+ * console.trace, console.dir, console.table, console.time, console.timeEnd,
25
+ * console.timeLog, console.count, console.countReset, console.group,
26
+ * console.groupCollapsed, console.groupEnd, console.clear, console.assert
27
+ *
28
+ * @example
29
+ * const handle = await setupConsole(context, {
30
+ * onLog: (level, ...args) => console.log(`[${level}]`, ...args)
31
+ * });
32
+ */
33
+ export declare function setupConsole(context: ivm.Context, options?: ConsoleOptions): Promise<ConsoleHandle>;
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Global Type Definitions for @ricsam/isolate-console
3
+ *
4
+ * These types define the globals injected by setupConsole() into an isolated-vm context.
5
+ * Use these types to typecheck user code that will run inside the V8 isolate.
6
+ */
7
+
8
+ export {};
9
+
10
+ declare global {
11
+ /**
12
+ * Console interface for logging and debugging.
13
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/Console
14
+ */
15
+ interface Console {
16
+ /**
17
+ * Log a message to the console.
18
+ * @param data - Values to log
19
+ */
20
+ log(...data: unknown[]): void;
21
+
22
+ /**
23
+ * Log a warning message.
24
+ * @param data - Values to log
25
+ */
26
+ warn(...data: unknown[]): void;
27
+
28
+ /**
29
+ * Log an error message.
30
+ * @param data - Values to log
31
+ */
32
+ error(...data: unknown[]): void;
33
+
34
+ /**
35
+ * Log a debug message.
36
+ * @param data - Values to log
37
+ */
38
+ debug(...data: unknown[]): void;
39
+
40
+ /**
41
+ * Log an info message.
42
+ * @param data - Values to log
43
+ */
44
+ info(...data: unknown[]): void;
45
+
46
+ /**
47
+ * Log a stack trace.
48
+ * @param data - Values to log with the trace
49
+ */
50
+ trace(...data: unknown[]): void;
51
+
52
+ /**
53
+ * Display an object in a formatted way.
54
+ * @param item - Object to display
55
+ * @param options - Display options
56
+ */
57
+ dir(item: unknown, options?: object): void;
58
+
59
+ /**
60
+ * Display tabular data.
61
+ * @param tabularData - Data to display as a table
62
+ * @param properties - Optional array of property names to include
63
+ */
64
+ table(tabularData: unknown, properties?: string[]): void;
65
+
66
+ /**
67
+ * Start a timer.
68
+ * @param label - Timer label (default: "default")
69
+ */
70
+ time(label?: string): void;
71
+
72
+ /**
73
+ * End a timer and log the elapsed time.
74
+ * @param label - Timer label (default: "default")
75
+ */
76
+ timeEnd(label?: string): void;
77
+
78
+ /**
79
+ * Log the elapsed time of a timer without ending it.
80
+ * @param label - Timer label (default: "default")
81
+ * @param data - Additional values to log
82
+ */
83
+ timeLog(label?: string, ...data: unknown[]): void;
84
+
85
+ /**
86
+ * Log an error if the assertion is false.
87
+ * @param condition - Condition to test
88
+ * @param data - Values to log if assertion fails
89
+ */
90
+ assert(condition?: boolean, ...data: unknown[]): void;
91
+
92
+ /**
93
+ * Increment and log a counter.
94
+ * @param label - Counter label (default: "default")
95
+ */
96
+ count(label?: string): void;
97
+
98
+ /**
99
+ * Reset a counter.
100
+ * @param label - Counter label (default: "default")
101
+ */
102
+ countReset(label?: string): void;
103
+
104
+ /**
105
+ * Clear the console.
106
+ */
107
+ clear(): void;
108
+
109
+ /**
110
+ * Start an inline group.
111
+ * @param data - Group label
112
+ */
113
+ group(...data: unknown[]): void;
114
+
115
+ /**
116
+ * Start a collapsed inline group.
117
+ * @param data - Group label
118
+ */
119
+ groupCollapsed(...data: unknown[]): void;
120
+
121
+ /**
122
+ * End the current inline group.
123
+ */
124
+ groupEnd(): void;
125
+ }
126
+
127
+ /**
128
+ * Console object for logging and debugging.
129
+ */
130
+ const console: Console;
131
+ }
package/package.json CHANGED
@@ -1,10 +1,58 @@
1
1
  {
2
2
  "name": "@ricsam/isolate-console",
3
- "version": "0.0.1",
4
- "description": "OIDC trusted publishing setup package for @ricsam/isolate-console",
3
+ "version": "0.1.2",
4
+ "main": "./dist/cjs/index.cjs",
5
+ "types": "./dist/types/index.d.ts",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/types/index.d.ts",
9
+ "require": "./dist/cjs/index.cjs",
10
+ "import": "./dist/mjs/index.mjs"
11
+ },
12
+ "./isolate": {
13
+ "types": "./dist/types/isolate.d.ts"
14
+ }
15
+ },
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "test": "node --test --experimental-strip-types 'src/**/*.test.ts'",
19
+ "typecheck": "tsc --noEmit"
20
+ },
21
+ "dependencies": {
22
+ "@ricsam/isolate-core": "*",
23
+ "isolated-vm": "^6"
24
+ },
25
+ "peerDependencies": {
26
+ "isolated-vm": "^6"
27
+ },
28
+ "author": "Richard Samuelsson",
29
+ "license": "MIT",
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/ricsam/isolate.git"
33
+ },
34
+ "bugs": {
35
+ "url": "https://github.com/ricsam/isolate/issues"
36
+ },
37
+ "homepage": "https://github.com/ricsam/isolate#readme",
5
38
  "keywords": [
6
- "oidc",
7
- "trusted-publishing",
8
- "setup"
39
+ "isolated-vm",
40
+ "sandbox",
41
+ "javascript",
42
+ "runtime",
43
+ "fetch",
44
+ "filesystem",
45
+ "streams",
46
+ "v8",
47
+ "isolate"
48
+ ],
49
+ "description": "Console API implementation for isolated-vm V8 sandbox",
50
+ "module": "./dist/mjs/index.mjs",
51
+ "publishConfig": {
52
+ "access": "public"
53
+ },
54
+ "files": [
55
+ "dist",
56
+ "README.md"
9
57
  ]
10
- }
58
+ }