@hardkas/core 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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Javier Rodriguez
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,359 @@
1
+ import { z } from 'zod';
2
+
3
+ /**
4
+ * Lightweight branded/nominal types for domain-critical strings/numbers.
5
+ *
6
+ * These types prevent accidental misuse of raw primitives across the monorepo.
7
+ * Branded types remain plain strings/numbers at runtime.
8
+ */
9
+ /**
10
+ * A Brand type that adds a unique property to a primitive type.
11
+ */
12
+ type Brand<T, Name extends string> = T & {
13
+ readonly __brand: Name;
14
+ };
15
+ /**
16
+ * A canonical 32-byte hash (64 characters hex) representing a Kaspa Transaction.
17
+ */
18
+ type TxId = Brand<string, "TxId">;
19
+ /**
20
+ * A unique identifier for a HardKAS Artifact.
21
+ */
22
+ type ArtifactId = Brand<string, "ArtifactId">;
23
+ /**
24
+ * A SHA-256 or similar content hash.
25
+ */
26
+ type ContentHash = Brand<string, "ContentHash">;
27
+ /**
28
+ * A correlation ID for tracking lineage across operations.
29
+ */
30
+ type LineageId = Brand<string, "LineageId">;
31
+ /**
32
+ * A unique identifier for a Workflow execution.
33
+ */
34
+ type WorkflowId = Brand<string, "WorkflowId">;
35
+ /**
36
+ * A unique identifier for an Event.
37
+ */
38
+ type EventId = Brand<string, "EventId">;
39
+ /**
40
+ * A correlation ID that spans across multiple services/operations.
41
+ */
42
+ type CorrelationId = Brand<string, "CorrelationId">;
43
+ /**
44
+ * A Kaspa Address (e.g. kaspa:..., kaspatest:...).
45
+ */
46
+ type KaspaAddress = Brand<string, "KaspaAddress">;
47
+ /**
48
+ * A unique identifier for an RPC endpoint.
49
+ */
50
+ type RpcEndpointId = Brand<string, "RpcEndpointId">;
51
+ /**
52
+ * A Kaspa Network Identifier (e.g. mainnet, testnet-11).
53
+ */
54
+ type NetworkId$1 = Brand<string, "NetworkId">;
55
+ /**
56
+ * A unique sequence number for an event within a stream or store.
57
+ */
58
+ type EventSequence = Brand<number, "EventSequence">;
59
+ /**
60
+ * A Difficulty Adjustment Algorithm (DAA) score.
61
+ * Support both number and bigint for compatibility.
62
+ */
63
+ type DaaScore = Brand<number | bigint, "DaaScore">;
64
+ declare const asTxId: (id: string) => TxId;
65
+ declare const asArtifactId: (id: string) => ArtifactId;
66
+ declare const asContentHash: (hash: string) => ContentHash;
67
+ declare const asLineageId: (id: string) => LineageId;
68
+ declare const asWorkflowId: (id: string) => WorkflowId;
69
+ declare const asEventId: (id: string) => EventId;
70
+ declare const asCorrelationId: (id: string) => CorrelationId;
71
+ declare const asKaspaAddress: (addr: string) => KaspaAddress;
72
+ declare const asRpcEndpointId: (id: string) => RpcEndpointId;
73
+ declare const asNetworkId: (id: string) => NetworkId$1;
74
+ declare const asEventSequence: (seq: number) => EventSequence;
75
+ declare const asDaaScore: (score: number | bigint) => DaaScore;
76
+
77
+ /**
78
+ * HardKAS Core Event Domains.
79
+ */
80
+ type EventDomain = "workflow" | "integrity" | "rpc" | "dag" | "replay" | "localnet" | "l2";
81
+ /**
82
+ * HardKAS Core Event Kinds.
83
+ */
84
+ type EventKind = "workflow.plan.created" | "workflow.signed" | "workflow.submitted" | "workflow.receipt" | "workflow.started" | "workflow.completed" | "workflow.failed" | "integrity.hash_mismatch" | "integrity.schema_violation" | "integrity.lineage_break" | "integrity.violation" | "dag.conflict" | "dag.displacement" | "dag.sink_moved" | "rpc.health" | "rpc.error" | "rpc.stale" | "replay.divergence" | "replay.verified" | "localnet.started" | "localnet.stopped" | "l2.deposit.planned" | "l2.withdrawal.planned";
85
+ /**
86
+ * Payload mapping for each event kind.
87
+ */
88
+ interface EventPayloadByKind {
89
+ "workflow.plan.created": {
90
+ planId: ArtifactId;
91
+ network: NetworkId$1;
92
+ amountSompi: bigint;
93
+ };
94
+ "workflow.signed": {
95
+ signedId: ArtifactId;
96
+ planId: ArtifactId;
97
+ txId?: TxId;
98
+ };
99
+ "workflow.submitted": {
100
+ txId: TxId;
101
+ rpcUrl: string;
102
+ };
103
+ "workflow.receipt": {
104
+ txId: TxId;
105
+ status: "accepted" | "finalized" | "failed";
106
+ daaScore?: DaaScore;
107
+ };
108
+ "workflow.started": {
109
+ workflowId: WorkflowId;
110
+ network: NetworkId$1;
111
+ };
112
+ "workflow.completed": {
113
+ workflowId: WorkflowId;
114
+ };
115
+ "workflow.failed": {
116
+ workflowId: WorkflowId;
117
+ error: string;
118
+ };
119
+ "integrity.hash_mismatch": {
120
+ artifactId: ArtifactId;
121
+ expected: string;
122
+ actual: string;
123
+ };
124
+ "integrity.schema_violation": {
125
+ artifactId: ArtifactId;
126
+ details: string;
127
+ };
128
+ "integrity.lineage_break": {
129
+ lineageId: LineageId;
130
+ artifactId: ArtifactId;
131
+ };
132
+ "integrity.violation": {
133
+ violationCode: string;
134
+ severity: string;
135
+ message: string;
136
+ metadata?: Record<string, unknown> | undefined;
137
+ sourceEventId?: string | undefined;
138
+ };
139
+ "dag.conflict": {
140
+ outpoint: string;
141
+ winner: TxId;
142
+ losers: TxId[];
143
+ };
144
+ "dag.displacement": {
145
+ txId: TxId;
146
+ displacedBy: TxId;
147
+ };
148
+ "dag.sink_moved": {
149
+ oldSink: string;
150
+ newSink: string;
151
+ daaScore: DaaScore;
152
+ };
153
+ "rpc.health": {
154
+ endpoint: RpcEndpointId;
155
+ state: string;
156
+ latencyMs: number;
157
+ };
158
+ "rpc.error": {
159
+ endpoint: RpcEndpointId;
160
+ error: string;
161
+ retriable: boolean;
162
+ };
163
+ "rpc.stale": {
164
+ endpoint: RpcEndpointId;
165
+ lastDaaScore: DaaScore;
166
+ currentDaaScore: DaaScore;
167
+ };
168
+ "replay.divergence": {
169
+ txId: TxId;
170
+ field: string;
171
+ expected: string;
172
+ actual: string;
173
+ };
174
+ "replay.verified": {
175
+ txId: TxId;
176
+ lineageId: LineageId;
177
+ };
178
+ "localnet.started": {
179
+ mode: string;
180
+ networkId: NetworkId$1;
181
+ };
182
+ "localnet.stopped": {
183
+ reason: string;
184
+ };
185
+ "l2.deposit.planned": {
186
+ asset: string;
187
+ amount: bigint;
188
+ to: string;
189
+ };
190
+ "l2.withdrawal.planned": {
191
+ asset: string;
192
+ amount: bigint;
193
+ from: string;
194
+ };
195
+ }
196
+ /**
197
+ * Formal Event Envelope (v1).
198
+ *
199
+ * Standardizes how events are captured and tracked across the system.
200
+ */
201
+ interface EventEnvelope<K extends EventKind = EventKind> {
202
+ schema: "hardkas.event";
203
+ version: "1.0.0";
204
+ eventId: EventId;
205
+ domain: EventDomain;
206
+ kind: K;
207
+ timestamp: string;
208
+ sequence?: EventSequence | undefined;
209
+ workflowId: WorkflowId;
210
+ correlationId: CorrelationId;
211
+ causationId?: EventId;
212
+ artifactId?: ArtifactId;
213
+ txId?: TxId;
214
+ networkId: NetworkId$1;
215
+ payload: EventPayloadByKind[K];
216
+ }
217
+ /**
218
+ * Compatibility type for listeners.
219
+ */
220
+ type CoreEvent = EventEnvelope;
221
+ /**
222
+ * Legacy compatibility type for stamped events.
223
+ * TODO: Deprecate once all consumers migrate to EventEnvelope.
224
+ */
225
+ type StampedEvent = EventEnvelope;
226
+ type CoreEventListener = (event: EventEnvelope) => void;
227
+ /**
228
+ * Lightweight in-memory Event Bus.
229
+ */
230
+ declare class CoreEventBus {
231
+ private listeners;
232
+ on(listener: CoreEventListener): () => void;
233
+ /**
234
+ * Emits a formal event envelope.
235
+ */
236
+ emit<K extends EventKind>(envelope: EventEnvelope<K>): void;
237
+ /**
238
+ * Normalizes and emits an event.
239
+ * Useful for incremental migration from raw events.
240
+ */
241
+ normalizeAndEmit(event: any): void;
242
+ removeAll(): void;
243
+ }
244
+ declare const coreEvents: CoreEventBus;
245
+ /**
246
+ * Creates a formal event envelope with required metadata.
247
+ */
248
+ declare function createEventEnvelope<K extends EventKind>(params: {
249
+ kind: K;
250
+ domain: EventDomain;
251
+ workflowId: WorkflowId;
252
+ correlationId: CorrelationId;
253
+ networkId: NetworkId$1;
254
+ payload: EventPayloadByKind[K];
255
+ causationId?: EventId;
256
+ artifactId?: ArtifactId;
257
+ txId?: TxId;
258
+ eventId?: EventId;
259
+ sequence?: EventSequence;
260
+ }): EventEnvelope<K>;
261
+ /**
262
+ * Lightweight runtime validation for event envelopes.
263
+ */
264
+ declare function validateEventEnvelope(event: any): boolean;
265
+ /**
266
+ * Represents an unknown event payload for safety.
267
+ */
268
+ type UnknownEventPayload = {
269
+ readonly type: "unknown";
270
+ readonly data: Record<string, unknown>;
271
+ };
272
+
273
+ /**
274
+ * @deprecated Use Brand from domain-types.js instead.
275
+ * Note: generic parameters are swapped in the new Brand type.
276
+ */
277
+ type Branded<K, T> = Brand<T, K extends string ? K : string>;
278
+
279
+ declare const SOMPI_PER_KAS = 100000000n;
280
+ declare const kaspaNetworkIdSchema: z.ZodEnum<["mainnet", "testnet-10", "testnet-11", "testnet-12", "simnet", "simnet-1", "devnet"]>;
281
+ type NetworkId = Brand<z.infer<typeof kaspaNetworkIdSchema>, "NetworkId">;
282
+ declare const executionModeSchema: z.ZodEnum<["simulated", "real", "readonly"]>;
283
+ type ExecutionMode = z.infer<typeof executionModeSchema>;
284
+ declare const artifactTypeSchema: z.ZodEnum<["txPlan", "signedTx", "txReceipt", "txTrace", "snapshot"]>;
285
+ type ArtifactType = z.infer<typeof artifactTypeSchema>;
286
+ declare const NetworkIdSchema: z.ZodEnum<["mainnet", "testnet-10", "testnet-11", "testnet-12", "simnet", "simnet-1", "devnet"]>;
287
+ declare const ExecutionModeSchema: z.ZodEnum<["simulated", "real", "readonly"]>;
288
+ declare const ArtifactTypeSchema: z.ZodEnum<["txPlan", "signedTx", "txReceipt", "txTrace", "snapshot"]>;
289
+ declare const hardkasConfigSchema: z.ZodObject<{
290
+ project: z.ZodObject<{
291
+ name: z.ZodString;
292
+ root: z.ZodString;
293
+ }, "strip", z.ZodTypeAny, {
294
+ name: string;
295
+ root: string;
296
+ }, {
297
+ name: string;
298
+ root: string;
299
+ }>;
300
+ network: z.ZodObject<{
301
+ id: z.ZodEnum<["mainnet", "testnet-10", "testnet-11", "testnet-12", "simnet", "simnet-1", "devnet"]>;
302
+ rpcUrl: z.ZodOptional<z.ZodString>;
303
+ }, "strip", z.ZodTypeAny, {
304
+ id: "mainnet" | "testnet-10" | "testnet-11" | "testnet-12" | "simnet" | "simnet-1" | "devnet";
305
+ rpcUrl?: string | undefined;
306
+ }, {
307
+ id: "mainnet" | "testnet-10" | "testnet-11" | "testnet-12" | "simnet" | "simnet-1" | "devnet";
308
+ rpcUrl?: string | undefined;
309
+ }>;
310
+ localnet: z.ZodDefault<z.ZodObject<{
311
+ mode: z.ZodDefault<z.ZodEnum<["simulated", "local-node"]>>;
312
+ dataDir: z.ZodOptional<z.ZodString>;
313
+ }, "strip", z.ZodTypeAny, {
314
+ mode: "simulated" | "local-node";
315
+ dataDir?: string | undefined;
316
+ }, {
317
+ mode?: "simulated" | "local-node" | undefined;
318
+ dataDir?: string | undefined;
319
+ }>>;
320
+ }, "strip", z.ZodTypeAny, {
321
+ project: {
322
+ name: string;
323
+ root: string;
324
+ };
325
+ network: {
326
+ id: "mainnet" | "testnet-10" | "testnet-11" | "testnet-12" | "simnet" | "simnet-1" | "devnet";
327
+ rpcUrl?: string | undefined;
328
+ };
329
+ localnet: {
330
+ mode: "simulated" | "local-node";
331
+ dataDir?: string | undefined;
332
+ };
333
+ }, {
334
+ project: {
335
+ name: string;
336
+ root: string;
337
+ };
338
+ network: {
339
+ id: "mainnet" | "testnet-10" | "testnet-11" | "testnet-12" | "simnet" | "simnet-1" | "devnet";
340
+ rpcUrl?: string | undefined;
341
+ };
342
+ localnet?: {
343
+ mode?: "simulated" | "local-node" | undefined;
344
+ dataDir?: string | undefined;
345
+ } | undefined;
346
+ }>;
347
+ type HardkasConfig = z.infer<typeof hardkasConfigSchema>;
348
+ declare class HardkasError extends Error {
349
+ readonly code: string;
350
+ readonly cause?: unknown;
351
+ constructor(code: string, message: string, options?: {
352
+ cause?: unknown;
353
+ });
354
+ }
355
+ declare function parseHardkasConfig(input: unknown): HardkasConfig;
356
+ declare function parseKasToSompi(input: string): bigint;
357
+ declare function formatSompi(amountSompi: bigint): string;
358
+
359
+ export { type ArtifactId, type ArtifactType, ArtifactTypeSchema, type Brand, type Branded, type ContentHash, type CoreEvent, type CoreEventListener, type CorrelationId, type DaaScore, type EventDomain, type EventEnvelope, type EventId, type EventKind, type EventPayloadByKind, type EventSequence, type ExecutionMode, ExecutionModeSchema, type HardkasConfig, HardkasError, type KaspaAddress, type LineageId, type NetworkId, NetworkIdSchema, type RpcEndpointId, SOMPI_PER_KAS, type StampedEvent, type TxId, type UnknownEventPayload, type WorkflowId, artifactTypeSchema, asArtifactId, asContentHash, asCorrelationId, asDaaScore, asEventId, asEventSequence, asKaspaAddress, asLineageId, asNetworkId, asRpcEndpointId, asTxId, asWorkflowId, coreEvents, createEventEnvelope, executionModeSchema, formatSompi, hardkasConfigSchema, kaspaNetworkIdSchema, parseHardkasConfig, parseKasToSompi, validateEventEnvelope };
package/dist/index.js ADDED
@@ -0,0 +1,187 @@
1
+ // src/index.ts
2
+ import { z } from "zod";
3
+
4
+ // src/events.ts
5
+ var CoreEventBus = class {
6
+ listeners = [];
7
+ on(listener) {
8
+ this.listeners.push(listener);
9
+ return () => {
10
+ this.listeners = this.listeners.filter((l) => l !== listener);
11
+ };
12
+ }
13
+ /**
14
+ * Emits a formal event envelope.
15
+ */
16
+ emit(envelope) {
17
+ for (const listener of this.listeners) {
18
+ try {
19
+ listener(envelope);
20
+ } catch {
21
+ }
22
+ }
23
+ }
24
+ /**
25
+ * Normalizes and emits an event.
26
+ * Useful for incremental migration from raw events.
27
+ */
28
+ normalizeAndEmit(event) {
29
+ if (validateEventEnvelope(event)) {
30
+ this.emit(event);
31
+ } else {
32
+ }
33
+ }
34
+ removeAll() {
35
+ this.listeners = [];
36
+ }
37
+ };
38
+ var coreEvents = new CoreEventBus();
39
+ function createEventEnvelope(params) {
40
+ return {
41
+ schema: "hardkas.event",
42
+ version: "1.0.0",
43
+ eventId: params.eventId || crypto.randomUUID(),
44
+ domain: params.domain,
45
+ kind: params.kind,
46
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
47
+ workflowId: params.workflowId,
48
+ correlationId: params.correlationId,
49
+ causationId: params.causationId,
50
+ artifactId: params.artifactId,
51
+ txId: params.txId,
52
+ networkId: params.networkId,
53
+ payload: params.payload,
54
+ ...params.sequence !== void 0 ? { sequence: params.sequence } : {}
55
+ };
56
+ }
57
+ function validateEventEnvelope(event) {
58
+ if (!event || typeof event !== "object") return false;
59
+ if (event.schema !== "hardkas.event") return false;
60
+ if (!event.eventId || !event.domain || !event.kind) return false;
61
+ if (!event.workflowId || !event.correlationId || !event.networkId) return false;
62
+ if (typeof event.payload !== "object") return false;
63
+ return true;
64
+ }
65
+
66
+ // src/domain-types.ts
67
+ var asTxId = (id) => id;
68
+ var asArtifactId = (id) => id;
69
+ var asContentHash = (hash) => hash;
70
+ var asLineageId = (id) => id;
71
+ var asWorkflowId = (id) => id;
72
+ var asEventId = (id) => id;
73
+ var asCorrelationId = (id) => id;
74
+ var asKaspaAddress = (addr) => addr;
75
+ var asRpcEndpointId = (id) => id;
76
+ var asNetworkId = (id) => id;
77
+ var asEventSequence = (seq) => seq;
78
+ var asDaaScore = (score) => score;
79
+
80
+ // src/index.ts
81
+ var SOMPI_PER_KAS = 100000000n;
82
+ var kaspaNetworkIdSchema = z.enum([
83
+ "mainnet",
84
+ "testnet-10",
85
+ "testnet-11",
86
+ "testnet-12",
87
+ "simnet",
88
+ "simnet-1",
89
+ "devnet"
90
+ ]);
91
+ var executionModeSchema = z.enum([
92
+ "simulated",
93
+ "real",
94
+ "readonly"
95
+ ]);
96
+ var artifactTypeSchema = z.enum([
97
+ "txPlan",
98
+ "signedTx",
99
+ "txReceipt",
100
+ "txTrace",
101
+ "snapshot"
102
+ ]);
103
+ var NetworkIdSchema = kaspaNetworkIdSchema;
104
+ var ExecutionModeSchema = executionModeSchema;
105
+ var ArtifactTypeSchema = artifactTypeSchema;
106
+ var hardkasConfigSchema = z.object({
107
+ project: z.object({
108
+ name: z.string().min(1),
109
+ root: z.string().min(1)
110
+ }),
111
+ network: z.object({
112
+ id: kaspaNetworkIdSchema,
113
+ rpcUrl: z.string().url().optional()
114
+ }),
115
+ localnet: z.object({
116
+ mode: z.enum(["simulated", "local-node"]).default("simulated"),
117
+ dataDir: z.string().optional()
118
+ }).default({ mode: "simulated" })
119
+ });
120
+ var HardkasError = class extends Error {
121
+ code;
122
+ cause;
123
+ constructor(code, message, options) {
124
+ super(message);
125
+ this.name = "HardkasError";
126
+ this.code = code;
127
+ this.cause = options?.cause;
128
+ }
129
+ };
130
+ function parseHardkasConfig(input) {
131
+ const result = hardkasConfigSchema.safeParse(input);
132
+ if (!result.success) {
133
+ throw new HardkasError(
134
+ "CONFIG_INVALID",
135
+ result.error.issues.map((issue) => issue.message).join("; "),
136
+ { cause: result.error }
137
+ );
138
+ }
139
+ return result.data;
140
+ }
141
+ function parseKasToSompi(input) {
142
+ const trimmed = input.trim();
143
+ if (!/^\d+(\.\d{1,8})?$/.test(trimmed)) {
144
+ throw new HardkasError("AMOUNT_INVALID", `Invalid KAS amount: ${input}`);
145
+ }
146
+ const [whole, fractional = ""] = trimmed.split(".");
147
+ if (whole === void 0) {
148
+ throw new HardkasError("AMOUNT_INVALID", `Invalid KAS amount: ${input}`);
149
+ }
150
+ return BigInt(whole) * SOMPI_PER_KAS + BigInt(fractional.padEnd(8, "0"));
151
+ }
152
+ function formatSompi(amountSompi) {
153
+ const sign = amountSompi < 0n ? "-" : "";
154
+ const absolute = amountSompi < 0n ? -amountSompi : amountSompi;
155
+ const whole = absolute / SOMPI_PER_KAS;
156
+ const fractional = absolute % SOMPI_PER_KAS;
157
+ return `${sign}${whole}.${fractional.toString().padStart(8, "0")} KAS`;
158
+ }
159
+ export {
160
+ ArtifactTypeSchema,
161
+ ExecutionModeSchema,
162
+ HardkasError,
163
+ NetworkIdSchema,
164
+ SOMPI_PER_KAS,
165
+ artifactTypeSchema,
166
+ asArtifactId,
167
+ asContentHash,
168
+ asCorrelationId,
169
+ asDaaScore,
170
+ asEventId,
171
+ asEventSequence,
172
+ asKaspaAddress,
173
+ asLineageId,
174
+ asNetworkId,
175
+ asRpcEndpointId,
176
+ asTxId,
177
+ asWorkflowId,
178
+ coreEvents,
179
+ createEventEnvelope,
180
+ executionModeSchema,
181
+ formatSompi,
182
+ hardkasConfigSchema,
183
+ kaspaNetworkIdSchema,
184
+ parseHardkasConfig,
185
+ parseKasToSompi,
186
+ validateEventEnvelope
187
+ };
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@hardkas/core",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": "./dist/index.js"
9
+ },
10
+ "dependencies": {
11
+ "pino": "^9.5.0",
12
+ "zod": "^3.24.1"
13
+ },
14
+ "devDependencies": {
15
+ "tsup": "^8.3.5",
16
+ "typescript": "^5.7.2",
17
+ "vitest": "^2.1.8"
18
+ },
19
+ "license": "MIT",
20
+ "author": "Javier Rodriguez",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/jrodrg92/Hardkas.git",
24
+ "directory": "packages/core"
25
+ },
26
+ "bugs": {
27
+ "url": "https://github.com/jrodrg92/Hardkas/issues"
28
+ },
29
+ "homepage": "https://github.com/jrodrg92/Hardkas/tree/main/packages/core#readme",
30
+ "files": [
31
+ "dist",
32
+ "LICENSE",
33
+ "README.md"
34
+ ],
35
+ "scripts": {
36
+ "build": "tsup src/index.ts --format esm --dts --clean",
37
+ "test": "vitest run",
38
+ "typecheck": "tsc --noEmit",
39
+ "lint": "eslint ."
40
+ }
41
+ }