@infinitetoken/lumber-kit 0.1.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/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # @infinitetoken/lumber-kit
2
+
3
+ Shared TypeScript types, wire format contract, and query interfaces for the [Lumber](https://github.com/infinitetoken/Lumber) cloud logging suite.
4
+
5
+ ## Install
6
+
7
+ ```
8
+ npm install @infinitetoken/lumber-kit
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```typescript
14
+ import { LogLevel, LogRecord, EncryptedPayload, LogQuery } from '@infinitetoken/lumber-kit'
15
+ ```
16
+
17
+ ## Exports
18
+
19
+ | Export | Kind | Purpose |
20
+ |--------|------|---------|
21
+ | `LogLevel` | `const enum` | Log severity: Debug=0 Info=1 Warn=2 Error=3 Fatal=4 |
22
+ | `SubscriptionLevel` | `const enum` | User tier: Hobby=0 Dev=1 Pro=2 |
23
+ | `LogPayload` | interface | Plaintext fields before encryption |
24
+ | `EncryptedPayload` | interface | Wire format: `{ payload: string, v: number }` |
25
+ | `LogRecord` | interface | API response shape for a stored log |
26
+ | `AppRecord` | interface | API response shape for an app (no encryption_key) |
27
+ | `AppCreatedRecord` | interface | POST /apps 201 response only (includes encryption_key once) |
28
+ | `UserRecord` | interface | API response shape for a user (no password_digest) |
29
+ | `LogQuery` | interface | GET /logs filter params |
30
+ | `AppQuery` | interface | GET /apps filter params |
31
+
32
+ ## Wire Format
33
+
34
+ `EncryptedPayload.payload` is `base64(IV[12 bytes] + AuthTag[16 bytes] + ciphertext)`.
35
+
36
+ The `v` field is always `1` for the current wire format. Changes to this format are semver major.
37
+
38
+ ## const enum and Babel Consumers
39
+
40
+ `LogLevel` is a TypeScript `const enum`. TypeScript consumers have values inlined at compile time (zero runtime overhead).
41
+
42
+ If your project uses Babel, esbuild, or `isolatedModules: true`, the runtime enum object is available because Lumber-Kit is compiled with `preserveConstEnums: true`. No special configuration is needed in your project.
43
+
44
+ ## Local Development (yalc)
45
+
46
+ Do NOT use `npm link` — it creates symlinks that break Metro in the Expo client.
47
+
48
+ ```bash
49
+ # In Lumber-Kit:
50
+ npm run build
51
+ yalc publish
52
+
53
+ # In a consumer repo (Lumber-API, Lumber-Node, Lumber Expo client):
54
+ yalc add @infinitetoken/lumber-kit
55
+ npm install
56
+
57
+ # After updating Lumber-Kit:
58
+ npm run build
59
+ yalc push # propagates to all linked consumers
60
+ ```
@@ -0,0 +1,15 @@
1
+ /** Log severity level. Numeric values match the existing Lumber-API level field. */
2
+ export declare const enum LogLevel {
3
+ Debug = 0,
4
+ Info = 1,
5
+ Warn = 2,
6
+ Error = 3,
7
+ Fatal = 4
8
+ }
9
+ /** User subscription tier. Mirrors User.subscription_level in Lumber-API. */
10
+ export declare const enum SubscriptionLevel {
11
+ Hobby = 0,
12
+ Dev = 1,
13
+ Pro = 2
14
+ }
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/constants/index.ts"],"names":[],"mappings":"AAEA,oFAAoF;AACpF,0BAAkB,QAAQ;IACxB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;IACT,KAAK,IAAI;CACV;AAED,6EAA6E;AAC7E,0BAAkB,iBAAiB;IACjC,KAAK,IAAI;IACT,GAAG,IAAI;IACP,GAAG,IAAI;CACR"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ // Source: D-01, D-02 (locked decisions — do not change numeric values without a semver major bump)
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.SubscriptionLevel = exports.LogLevel = void 0;
5
+ /** Log severity level. Numeric values match the existing Lumber-API level field. */
6
+ var LogLevel;
7
+ (function (LogLevel) {
8
+ LogLevel[LogLevel["Debug"] = 0] = "Debug";
9
+ LogLevel[LogLevel["Info"] = 1] = "Info";
10
+ LogLevel[LogLevel["Warn"] = 2] = "Warn";
11
+ LogLevel[LogLevel["Error"] = 3] = "Error";
12
+ LogLevel[LogLevel["Fatal"] = 4] = "Fatal";
13
+ })(LogLevel || (exports.LogLevel = LogLevel = {}));
14
+ /** User subscription tier. Mirrors User.subscription_level in Lumber-API. */
15
+ var SubscriptionLevel;
16
+ (function (SubscriptionLevel) {
17
+ SubscriptionLevel[SubscriptionLevel["Hobby"] = 0] = "Hobby";
18
+ SubscriptionLevel[SubscriptionLevel["Dev"] = 1] = "Dev";
19
+ SubscriptionLevel[SubscriptionLevel["Pro"] = 2] = "Pro";
20
+ })(SubscriptionLevel || (exports.SubscriptionLevel = SubscriptionLevel = {}));
@@ -0,0 +1,3 @@
1
+ export * from './constants';
2
+ export * from './types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./constants"), exports);
18
+ __exportStar(require("./types"), exports);
@@ -0,0 +1,93 @@
1
+ import { LogLevel, SubscriptionLevel } from '../constants';
2
+ /**
3
+ * Plaintext log fields before encryption.
4
+ * Lumber-Node and Lumber-Python serialize this object, then encrypt it
5
+ * into EncryptedPayload.payload using AES-256-GCM.
6
+ */
7
+ export interface LogPayload {
8
+ message?: string;
9
+ code?: string;
10
+ line?: number;
11
+ column?: number;
12
+ method?: string;
13
+ note?: string;
14
+ }
15
+ /**
16
+ * Encrypted wire format.
17
+ * payload = base64(IV[12 bytes] + AuthTag[16 bytes] + ciphertext)
18
+ * v = wire format version — always 1 in v1. Changes here are semver major.
19
+ */
20
+ export interface EncryptedPayload {
21
+ payload: string;
22
+ v: number;
23
+ }
24
+ /**
25
+ * API response shape for a stored log.
26
+ * payload is the ciphertext — level and flagged are stored unencrypted for server-side filtering.
27
+ * Source: D-06, ENCRYPT-05, ENCRYPT-06
28
+ */
29
+ export interface LogRecord {
30
+ id: string;
31
+ app_id: string;
32
+ level: LogLevel;
33
+ flagged: boolean;
34
+ payload: string;
35
+ created_at: string;
36
+ updated_at: string;
37
+ }
38
+ /**
39
+ * API response shape for a listed or fetched app.
40
+ * encryption_key is intentionally absent — it is returned once (in AppCreatedRecord) and never again.
41
+ * Source: D-06, ENCRYPT-02, ENCRYPT-03
42
+ */
43
+ export interface AppRecord {
44
+ id: string;
45
+ user_id: string;
46
+ name: string;
47
+ token: string;
48
+ created_at: string;
49
+ updated_at: string;
50
+ }
51
+ /**
52
+ * App creation response only (POST /apps 201).
53
+ * Includes encryption_key once; subsequent GET /apps and GET /apps/:id responses use AppRecord.
54
+ * Source: D-06, ENCRYPT-02
55
+ */
56
+ export interface AppCreatedRecord extends AppRecord {
57
+ encryption_key: string;
58
+ }
59
+ /**
60
+ * API response shape for an authenticated user.
61
+ * password_digest is intentionally absent.
62
+ */
63
+ export interface UserRecord {
64
+ id: string;
65
+ email: string;
66
+ subscription_level: SubscriptionLevel;
67
+ agreed_to_terms: boolean;
68
+ created_at: string;
69
+ updated_at: string;
70
+ }
71
+ /**
72
+ * Filter params for GET /logs.
73
+ * Source: D-06
74
+ */
75
+ export interface LogQuery {
76
+ level?: LogLevel;
77
+ flagged?: boolean;
78
+ limit?: number;
79
+ offset?: number;
80
+ sort?: string;
81
+ from?: string;
82
+ to?: string;
83
+ }
84
+ /**
85
+ * Filter params for GET /apps.
86
+ * Source: D-06
87
+ */
88
+ export interface AppQuery {
89
+ limit?: number;
90
+ offset?: number;
91
+ sort?: string;
92
+ }
93
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAE1D;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,CAAC,EAAE,MAAM,CAAA;CACV;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,QAAQ,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,cAAc,EAAE,MAAM,CAAA;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,kBAAkB,EAAE,iBAAiB,CAAA;IACrC,eAAe,EAAE,OAAO,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CACd"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,15 @@
1
+ /** Log severity level. Numeric values match the existing Lumber-API level field. */
2
+ export declare const enum LogLevel {
3
+ Debug = 0,
4
+ Info = 1,
5
+ Warn = 2,
6
+ Error = 3,
7
+ Fatal = 4
8
+ }
9
+ /** User subscription tier. Mirrors User.subscription_level in Lumber-API. */
10
+ export declare const enum SubscriptionLevel {
11
+ Hobby = 0,
12
+ Dev = 1,
13
+ Pro = 2
14
+ }
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/constants/index.ts"],"names":[],"mappings":"AAEA,oFAAoF;AACpF,0BAAkB,QAAQ;IACxB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;IACT,KAAK,IAAI;CACV;AAED,6EAA6E;AAC7E,0BAAkB,iBAAiB;IACjC,KAAK,IAAI;IACT,GAAG,IAAI;IACP,GAAG,IAAI;CACR"}
@@ -0,0 +1,17 @@
1
+ // Source: D-01, D-02 (locked decisions — do not change numeric values without a semver major bump)
2
+ /** Log severity level. Numeric values match the existing Lumber-API level field. */
3
+ export var LogLevel;
4
+ (function (LogLevel) {
5
+ LogLevel[LogLevel["Debug"] = 0] = "Debug";
6
+ LogLevel[LogLevel["Info"] = 1] = "Info";
7
+ LogLevel[LogLevel["Warn"] = 2] = "Warn";
8
+ LogLevel[LogLevel["Error"] = 3] = "Error";
9
+ LogLevel[LogLevel["Fatal"] = 4] = "Fatal";
10
+ })(LogLevel || (LogLevel = {}));
11
+ /** User subscription tier. Mirrors User.subscription_level in Lumber-API. */
12
+ export var SubscriptionLevel;
13
+ (function (SubscriptionLevel) {
14
+ SubscriptionLevel[SubscriptionLevel["Hobby"] = 0] = "Hobby";
15
+ SubscriptionLevel[SubscriptionLevel["Dev"] = 1] = "Dev";
16
+ SubscriptionLevel[SubscriptionLevel["Pro"] = 2] = "Pro";
17
+ })(SubscriptionLevel || (SubscriptionLevel = {}));
@@ -0,0 +1,3 @@
1
+ export * from './constants';
2
+ export * from './types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './constants';
2
+ export * from './types';
@@ -0,0 +1 @@
1
+ {"type": "module"}
@@ -0,0 +1,93 @@
1
+ import { LogLevel, SubscriptionLevel } from '../constants';
2
+ /**
3
+ * Plaintext log fields before encryption.
4
+ * Lumber-Node and Lumber-Python serialize this object, then encrypt it
5
+ * into EncryptedPayload.payload using AES-256-GCM.
6
+ */
7
+ export interface LogPayload {
8
+ message?: string;
9
+ code?: string;
10
+ line?: number;
11
+ column?: number;
12
+ method?: string;
13
+ note?: string;
14
+ }
15
+ /**
16
+ * Encrypted wire format.
17
+ * payload = base64(IV[12 bytes] + AuthTag[16 bytes] + ciphertext)
18
+ * v = wire format version — always 1 in v1. Changes here are semver major.
19
+ */
20
+ export interface EncryptedPayload {
21
+ payload: string;
22
+ v: number;
23
+ }
24
+ /**
25
+ * API response shape for a stored log.
26
+ * payload is the ciphertext — level and flagged are stored unencrypted for server-side filtering.
27
+ * Source: D-06, ENCRYPT-05, ENCRYPT-06
28
+ */
29
+ export interface LogRecord {
30
+ id: string;
31
+ app_id: string;
32
+ level: LogLevel;
33
+ flagged: boolean;
34
+ payload: string;
35
+ created_at: string;
36
+ updated_at: string;
37
+ }
38
+ /**
39
+ * API response shape for a listed or fetched app.
40
+ * encryption_key is intentionally absent — it is returned once (in AppCreatedRecord) and never again.
41
+ * Source: D-06, ENCRYPT-02, ENCRYPT-03
42
+ */
43
+ export interface AppRecord {
44
+ id: string;
45
+ user_id: string;
46
+ name: string;
47
+ token: string;
48
+ created_at: string;
49
+ updated_at: string;
50
+ }
51
+ /**
52
+ * App creation response only (POST /apps 201).
53
+ * Includes encryption_key once; subsequent GET /apps and GET /apps/:id responses use AppRecord.
54
+ * Source: D-06, ENCRYPT-02
55
+ */
56
+ export interface AppCreatedRecord extends AppRecord {
57
+ encryption_key: string;
58
+ }
59
+ /**
60
+ * API response shape for an authenticated user.
61
+ * password_digest is intentionally absent.
62
+ */
63
+ export interface UserRecord {
64
+ id: string;
65
+ email: string;
66
+ subscription_level: SubscriptionLevel;
67
+ agreed_to_terms: boolean;
68
+ created_at: string;
69
+ updated_at: string;
70
+ }
71
+ /**
72
+ * Filter params for GET /logs.
73
+ * Source: D-06
74
+ */
75
+ export interface LogQuery {
76
+ level?: LogLevel;
77
+ flagged?: boolean;
78
+ limit?: number;
79
+ offset?: number;
80
+ sort?: string;
81
+ from?: string;
82
+ to?: string;
83
+ }
84
+ /**
85
+ * Filter params for GET /apps.
86
+ * Source: D-06
87
+ */
88
+ export interface AppQuery {
89
+ limit?: number;
90
+ offset?: number;
91
+ sort?: string;
92
+ }
93
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAE1D;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,CAAC,EAAE,MAAM,CAAA;CACV;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,QAAQ,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,cAAc,EAAE,MAAM,CAAA;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,kBAAkB,EAAE,iBAAiB,CAAA;IACrC,eAAe,EAAE,OAAO,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CACd"}
@@ -0,0 +1 @@
1
+ export {};
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@infinitetoken/lumber-kit",
3
+ "version": "0.1.0",
4
+ "description": "Shared TypeScript types and wire format contracts for the Lumber cloud logging suite",
5
+ "main": "./dist/cjs/index.js",
6
+ "module": "./dist/esm/index.js",
7
+ "types": "./dist/cjs/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/cjs/index.d.ts",
11
+ "import": "./dist/esm/index.js",
12
+ "require": "./dist/cjs/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "npm run build:cjs && npm run build:esm",
21
+ "build:cjs": "tsc -p tsconfig.cjs.json",
22
+ "build:esm": "tsc -p tsconfig.esm.json && echo '{\"type\": \"module\"}' > dist/esm/package.json",
23
+ "clean": "rm -rf dist coverage",
24
+ "test": "jest",
25
+ "lint": "eslint .",
26
+ "fix": "eslint . --fix",
27
+ "prepublishOnly": "npm run build"
28
+ },
29
+ "devDependencies": {
30
+ "@types/jest": "^30.0.0",
31
+ "@types/node": "^25.0.0",
32
+ "@typescript-eslint/eslint-plugin": "^8.59.1",
33
+ "@typescript-eslint/parser": "^8.59.1",
34
+ "eslint": "^10.2.1",
35
+ "eslint-config-prettier": "^10.0.0",
36
+ "eslint-plugin-prettier": "^5.0.0",
37
+ "eslint-plugin-simple-import-sort": "^13.0.0",
38
+ "jest": "^30.3.0",
39
+ "prettier": "^3.8.3",
40
+ "ts-jest": "^29.4.9",
41
+ "typescript": "^6.0.3"
42
+ }
43
+ }