hanzio 1.0.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.
Files changed (51) hide show
  1. package/README.md +510 -0
  2. package/dist/api-wrapper/index.d.ts +84 -0
  3. package/dist/api-wrapper/index.js +250 -0
  4. package/dist/array/index.d.ts +22 -0
  5. package/dist/cache/index.d.ts +19 -0
  6. package/dist/date/index.d.ts +11 -0
  7. package/dist/gzip/index.d.ts +2 -0
  8. package/dist/gzip/index.js +16 -0
  9. package/dist/index.d.ts +12 -0
  10. package/dist/index.js +1565 -0
  11. package/dist/jwt/index.d.ts +3 -0
  12. package/dist/jwt/index.js +19 -0
  13. package/dist/math/index.d.ts +2 -0
  14. package/dist/math/linearRegressionTrend.d.ts +5 -0
  15. package/dist/math/metricsSeriesColors.d.ts +42 -0
  16. package/dist/p-queue/index.d.ts +95 -0
  17. package/dist/p-queue/index.js +439 -0
  18. package/dist/promise/index.d.ts +21 -0
  19. package/dist/sitemap/index.d.ts +14 -0
  20. package/dist/sitemap/index.js +552 -0
  21. package/dist/state/index.d.ts +101 -0
  22. package/dist/string/index.d.ts +8 -0
  23. package/dist/typedswitch/index.d.ts +124 -0
  24. package/dist/url/index.d.ts +1 -0
  25. package/dist/zod/index.d.ts +8 -0
  26. package/dist/zod/index.js +210 -0
  27. package/dist/zod/jsonToZodSchemaMapper.d.ts +6 -0
  28. package/dist/zod/zodMinMaxFilter.d.ts +14 -0
  29. package/dist/zod/zodToTypeString.d.ts +9 -0
  30. package/package.json +102 -0
  31. package/src/api-wrapper/index.ts +492 -0
  32. package/src/array/index.ts +187 -0
  33. package/src/cache/index.ts +154 -0
  34. package/src/date/index.ts +54 -0
  35. package/src/gzip/index.ts +29 -0
  36. package/src/index.ts +12 -0
  37. package/src/jwt/index.ts +25 -0
  38. package/src/math/index.ts +11 -0
  39. package/src/math/linearRegressionTrend.ts +36 -0
  40. package/src/math/metricsSeriesColors.ts +208 -0
  41. package/src/p-queue/index.ts +690 -0
  42. package/src/promise/index.ts +73 -0
  43. package/src/sitemap/index.ts +195 -0
  44. package/src/state/index.ts +331 -0
  45. package/src/string/index.ts +86 -0
  46. package/src/typedswitch/index.ts +309 -0
  47. package/src/url/index.ts +5 -0
  48. package/src/zod/index.ts +29 -0
  49. package/src/zod/jsonToZodSchemaMapper.ts +44 -0
  50. package/src/zod/zodMinMaxFilter.ts +28 -0
  51. package/src/zod/zodToTypeString.ts +222 -0
@@ -0,0 +1,124 @@
1
+ /**
2
+ * typedSwitch - A type-safe switch statement for discriminated unions
3
+ *
4
+ * Supports two input modes:
5
+ *
6
+ * 1. STRING INPUT - switch on a string/enum value directly:
7
+ *
8
+ * @example
9
+ * const status: 'success' | 'error' = 'success'
10
+ *
11
+ * // All cases required (no default)
12
+ * typedSwitch(status, {
13
+ * success: (val) => 'handled success',
14
+ * error: (val) => 'handled error',
15
+ * })
16
+ *
17
+ * // Partial cases with default handler
18
+ * typedSwitch(status, {
19
+ * success: (val) => 'handled success',
20
+ * }, (val) => 'default handler')
21
+ *
22
+ *
23
+ * 2. OBJECT INPUT - switch on a discriminated union with custom key:
24
+ *
25
+ * @example
26
+ * type Event =
27
+ * | { type: 'click'; x: number; y: number }
28
+ * | { type: 'scroll'; offset: number }
29
+ *
30
+ * // All cases required (no default)
31
+ * typedSwitch(event, 'type', {
32
+ * click: (e) => `Clicked at ${e.x}, ${e.y}`,
33
+ * scroll: (e) => `Scrolled ${e.offset}px`,
34
+ * })
35
+ *
36
+ * // Partial cases with default handler
37
+ * typedSwitch(event, 'type', {
38
+ * click: (e) => `Clicked at ${e.x}, ${e.y}`,
39
+ * }, (e) => 'unhandled event')
40
+ *
41
+ * // Works with any discriminant key (not just 'type')
42
+ * type Order = { status: 'pending' } | { status: 'completed' }
43
+ * typedSwitch(order, 'status', {
44
+ * pending: (o) => 'waiting...',
45
+ * completed: (o) => 'done!',
46
+ * })
47
+ *
48
+ *
49
+ * 3. WITH CONSTRAINT - use `typedSwitch<T>` to enforce return type:
50
+ *
51
+ * @example
52
+ * interface HasId { id: string }
53
+ *
54
+ * // All handlers must return something with { id: string }
55
+ * typedSwitch<HasId>(status, {
56
+ * success: () => ({ id: '123', name: 'John' }), // ✓ OK
57
+ * error: () => ({ id: '456' }), // ✓ OK
58
+ * })
59
+ *
60
+ * // Type error - missing 'id' property
61
+ * typedSwitch<HasId>(status, {
62
+ * success: () => ({ name: 'John' }), // ✗ Error!
63
+ * error: () => ({ id: '456' }),
64
+ * })
65
+ */
66
+ /** Extract raw return type from a handler function (preserves Promise) */
67
+ type RawHandlerReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
68
+ /** Get union of all raw return types from a cases object's values */
69
+ type RawCasesReturnType<Cases> = {
70
+ [K in keyof Cases]: Cases[K] extends undefined ? never : RawHandlerReturnType<Cases[K]>;
71
+ }[keyof Cases];
72
+ /** Cases for string input - all cases required */
73
+ export type StringSwitchCases<T extends string, R> = {
74
+ [K in T]: (value: K) => R | Promise<R>;
75
+ };
76
+ /** Partial cases for string input (when default is provided) */
77
+ export type PartialStringSwitchCases<T extends string, R> = {
78
+ [K in T]?: (value: K) => R | Promise<R>;
79
+ };
80
+ /** Cases for object input with custom key - all cases required */
81
+ export type ObjectSwitchCases<T, K extends keyof T, R> = T[K] extends string ? {
82
+ [V in T[K]]: (value: Extract<T, Record<K, V>>) => R | Promise<R>;
83
+ } : never;
84
+ /** Partial cases for object input with custom key (when default is provided) */
85
+ export type PartialObjectSwitchCases<T, K extends keyof T, R> = T[K] extends string ? {
86
+ [V in T[K]]?: (value: Extract<T, Record<K, V>>) => R | Promise<R>;
87
+ } : never;
88
+ export declare function typedSwitch<T extends string, Cases extends {
89
+ [K in T]: (value: K) => unknown;
90
+ }>(value: T, cases: Cases): RawCasesReturnType<Cases>;
91
+ export declare function typedSwitch<T extends string, Cases extends {
92
+ [K in T]?: (value: K) => unknown;
93
+ }, DefaultCase extends (value: T) => unknown>(value: T, cases: Cases, defaultCase: DefaultCase): RawCasesReturnType<Cases> | RawHandlerReturnType<DefaultCase>;
94
+ export declare function typedSwitch<T extends Record<string, unknown>, K extends keyof T, TKey extends T[K] & string, Cases extends {
95
+ [V in TKey]: (value: Extract<T, Record<K, V>>) => unknown;
96
+ }>(value: T, key: K, cases: Cases): RawCasesReturnType<Cases>;
97
+ export declare function typedSwitch<T extends Record<string, unknown>, K extends keyof T, TKey extends T[K] & string, Cases extends {
98
+ [V in TKey]?: (value: Extract<T, Record<K, V>>) => unknown;
99
+ }, DefaultCase extends (value: T) => unknown>(value: T, key: K, cases: Cases, defaultCase: DefaultCase): RawCasesReturnType<Cases> | RawHandlerReturnType<DefaultCase>;
100
+ export declare function typedSwitch<Constraint, T extends string = string>(value: T, cases: {
101
+ [K in T]: (value: K) => Constraint;
102
+ }): Constraint;
103
+ export declare function typedSwitch<Constraint, T extends string = string>(value: T, cases: {
104
+ [K in T]: (value: K) => Constraint | Promise<Constraint>;
105
+ }): Constraint | Promise<Constraint>;
106
+ export declare function typedSwitch<Constraint, T extends string = string>(value: T, cases: {
107
+ [K in T]?: (value: K) => Constraint;
108
+ }, defaultCase: (value: T) => Constraint): Constraint;
109
+ export declare function typedSwitch<Constraint, T extends string = string>(value: T, cases: {
110
+ [K in T]?: (value: K) => Constraint | Promise<Constraint>;
111
+ }, defaultCase: (value: T) => Constraint | Promise<Constraint>): Constraint | Promise<Constraint>;
112
+ export declare function typedSwitch<Constraint, T extends Record<string, unknown> = Record<string, unknown>, K extends keyof T = keyof T>(value: T, key: K, cases: {
113
+ [V in T[K] & string]: (value: Extract<T, Record<K, V>>) => Constraint;
114
+ }): Constraint;
115
+ export declare function typedSwitch<Constraint, T extends Record<string, unknown> = Record<string, unknown>, K extends keyof T = keyof T>(value: T, key: K, cases: {
116
+ [V in T[K] & string]: (value: Extract<T, Record<K, V>>) => Constraint | Promise<Constraint>;
117
+ }): Constraint | Promise<Constraint>;
118
+ export declare function typedSwitch<Constraint, T extends Record<string, unknown> = Record<string, unknown>, K extends keyof T = keyof T>(value: T, key: K, cases: {
119
+ [V in T[K] & string]?: (value: Extract<T, Record<K, V>>) => Constraint;
120
+ }, defaultCase: (value: T) => Constraint): Constraint;
121
+ export declare function typedSwitch<Constraint, T extends Record<string, unknown> = Record<string, unknown>, K extends keyof T = keyof T>(value: T, key: K, cases: {
122
+ [V in T[K] & string]?: (value: Extract<T, Record<K, V>>) => Constraint | Promise<Constraint>;
123
+ }, defaultCase: (value: T) => Constraint | Promise<Constraint>): Constraint | Promise<Constraint>;
124
+ export {};
@@ -0,0 +1 @@
1
+ export declare function getDomainFaviconUrl(domain: string, size?: number): string;
@@ -0,0 +1,8 @@
1
+ import { z } from 'zod';
2
+ export { jsonToZodSchemaMapper } from './jsonToZodSchemaMapper';
3
+ export { toGteLteFilter, type ZodMinMaxFilter, zodMinMaxFilter } from './zodMinMaxFilter';
4
+ export { zodToExample, zodToTypeString } from './zodToTypeString';
5
+ export type GenericId<TypeName extends string> = string & z.$brand<TypeName>;
6
+ export declare function createZId<TypeName extends string>(typeName: TypeName): PropertyKey extends TypeName ? z.ZodString : z.core.$ZodBranded<z.ZodString, TypeName, "out">;
7
+ export declare function zSingleOrArray<T extends z.ZodType>(schema: T): z.ZodUnion<readonly [z.ZodArray<T>, T]>;
8
+ export declare function normalizeSingleOrArray<T>(value: T | readonly T[] | null | undefined): T[];
@@ -0,0 +1,210 @@
1
+ // src/zod/index.ts
2
+ import { z as z3 } from "zod";
3
+
4
+ // src/zod/jsonToZodSchemaMapper.ts
5
+ import { z } from "zod";
6
+ function jsonToZodSchemaMapper(jsonObject, zodSchema, config) {
7
+ const result = {};
8
+ const shape = zodSchema instanceof z.ZodObject ? zodSchema.shape : {};
9
+ for (const key of Object.keys(shape)) {
10
+ const fieldConfig = config[key];
11
+ let value = jsonObject[key];
12
+ if (fieldConfig) {
13
+ value = fieldConfig(jsonObject);
14
+ }
15
+ if (shape[key] instanceof z.ZodObject && value && typeof value === "object") {
16
+ result[key] = jsonToZodSchemaMapper(value, shape[key], config[key] || {});
17
+ } else {
18
+ result[key] = value;
19
+ }
20
+ }
21
+ return zodSchema.parse(result);
22
+ }
23
+ // src/zod/zodMinMaxFilter.ts
24
+ import { z as z2 } from "zod";
25
+ var zodMinMaxFilter = z2.object({
26
+ min: z2.number().optional(),
27
+ max: z2.number().optional()
28
+ });
29
+ function toGteLteFilter(filter) {
30
+ if (!filter)
31
+ return;
32
+ const hasMin = filter.min !== undefined;
33
+ const hasMax = filter.max !== undefined;
34
+ if (!hasMin && !hasMax)
35
+ return;
36
+ return {
37
+ ...hasMin && { gte: filter.min },
38
+ ...hasMax && { lte: filter.max }
39
+ };
40
+ }
41
+ // src/zod/zodToTypeString.ts
42
+ function getDefProp(def, prop) {
43
+ return def?.[prop];
44
+ }
45
+ function zodToTypeString(schema, indent = 0) {
46
+ const pad = " ".repeat(indent);
47
+ const innerPad = " ".repeat(indent + 1);
48
+ const def = schema._zod?.def ?? schema._def;
49
+ if (!def)
50
+ return "unknown";
51
+ const schemaType = getDefProp(def, "type") ?? getDefProp(def, "typeName");
52
+ switch (schemaType) {
53
+ case "object": {
54
+ const shape = getDefProp(def, "shape");
55
+ if (!shape || Object.keys(shape).length === 0)
56
+ return "{}";
57
+ const fields = Object.entries(shape).map(([key, value]) => {
58
+ const valueType = getDefProp(value._zod?.def ?? value._def, "type");
59
+ const isOptional = valueType === "optional";
60
+ const innerSchema = isOptional ? getDefProp(value._zod?.def ?? value._def, "innerType") ?? value : value;
61
+ const typeStr = zodToTypeString(innerSchema, indent + 1);
62
+ return `${innerPad}${key}${isOptional ? "?" : ""}: ${typeStr}`;
63
+ });
64
+ return `{
65
+ ${fields.join(`
66
+ `)}
67
+ ${pad}}`;
68
+ }
69
+ case "array": {
70
+ const itemType = getDefProp(def, "element") ?? getDefProp(def, "type");
71
+ return itemType ? `${zodToTypeString(itemType, indent)}[]` : "unknown[]";
72
+ }
73
+ case "string":
74
+ return "string";
75
+ case "number":
76
+ return "number";
77
+ case "boolean":
78
+ return "boolean";
79
+ case "date":
80
+ return "Date";
81
+ case "null":
82
+ return "null";
83
+ case "undefined":
84
+ return "undefined";
85
+ case "any":
86
+ return "any";
87
+ case "unknown":
88
+ return "unknown";
89
+ case "record": {
90
+ const valueType = getDefProp(def, "valueType");
91
+ return valueType ? `Record<string, ${zodToTypeString(valueType, indent)}>` : "Record<string, unknown>";
92
+ }
93
+ case "enum": {
94
+ const values = getDefProp(def, "values");
95
+ return values ? values.map((v) => `"${v}"`).join(" | ") : "string";
96
+ }
97
+ case "literal": {
98
+ const value = getDefProp(def, "value");
99
+ return typeof value === "string" ? `"${value}"` : String(value);
100
+ }
101
+ case "union": {
102
+ const options = getDefProp(def, "options");
103
+ return options ? options.map((o) => zodToTypeString(o, indent)).join(" | ") : "unknown";
104
+ }
105
+ case "optional": {
106
+ const inner = getDefProp(def, "innerType");
107
+ return inner ? `${zodToTypeString(inner, indent)} | undefined` : "unknown";
108
+ }
109
+ case "nullable": {
110
+ const inner = getDefProp(def, "innerType");
111
+ return inner ? `${zodToTypeString(inner, indent)} | null` : "unknown";
112
+ }
113
+ case "default": {
114
+ const inner = getDefProp(def, "innerType");
115
+ return inner ? zodToTypeString(inner, indent) : "unknown";
116
+ }
117
+ case "ZodObject":
118
+ case "ZodArray":
119
+ case "ZodString":
120
+ case "ZodNumber":
121
+ case "ZodBoolean":
122
+ case "ZodDate":
123
+ case "ZodNull":
124
+ case "ZodUndefined":
125
+ case "ZodAny":
126
+ case "ZodUnknown":
127
+ case "ZodRecord":
128
+ case "ZodEnum":
129
+ case "ZodLiteral":
130
+ case "ZodUnion":
131
+ case "ZodOptional":
132
+ case "ZodNullable":
133
+ case "ZodDefault":
134
+ return zodToTypeString(schema, indent);
135
+ default:
136
+ return "unknown";
137
+ }
138
+ }
139
+ function zodToExample(schema) {
140
+ const def = schema._zod?.def ?? schema._def;
141
+ if (!def)
142
+ return null;
143
+ const schemaType = getDefProp(def, "type") ?? getDefProp(def, "typeName");
144
+ switch (schemaType) {
145
+ case "object": {
146
+ const shape = getDefProp(def, "shape");
147
+ if (!shape)
148
+ return {};
149
+ const result = {};
150
+ for (const [key, value] of Object.entries(shape)) {
151
+ const valueType = getDefProp(value._zod?.def ?? value._def, "type");
152
+ const isOptional = valueType === "optional";
153
+ if (!isOptional) {
154
+ result[key] = zodToExample(value);
155
+ }
156
+ }
157
+ return result;
158
+ }
159
+ case "array": {
160
+ const itemType = getDefProp(def, "element") ?? getDefProp(def, "type");
161
+ return itemType ? [zodToExample(itemType)] : [];
162
+ }
163
+ case "string":
164
+ return "";
165
+ case "number":
166
+ return 0;
167
+ case "boolean":
168
+ return false;
169
+ case "enum": {
170
+ const values = getDefProp(def, "values");
171
+ return values?.[0] ?? "";
172
+ }
173
+ case "literal":
174
+ return getDefProp(def, "value");
175
+ case "optional":
176
+ case "default": {
177
+ const inner = getDefProp(def, "innerType");
178
+ return inner ? zodToExample(inner) : null;
179
+ }
180
+ case "record":
181
+ return {};
182
+ default:
183
+ return null;
184
+ }
185
+ }
186
+
187
+ // src/zod/index.ts
188
+ function createZId(typeName) {
189
+ return z3.string().min(1, `${typeName} ID is required`).brand();
190
+ }
191
+ function zSingleOrArray(schema) {
192
+ return z3.union([z3.array(schema), schema]);
193
+ }
194
+ function normalizeSingleOrArray(value) {
195
+ if (value == null)
196
+ return [];
197
+ if (Array.isArray(value))
198
+ return [...value];
199
+ return [value];
200
+ }
201
+ export {
202
+ zodToTypeString,
203
+ zodToExample,
204
+ zodMinMaxFilter,
205
+ zSingleOrArray,
206
+ toGteLteFilter,
207
+ normalizeSingleOrArray,
208
+ jsonToZodSchemaMapper,
209
+ createZId
210
+ };
@@ -0,0 +1,6 @@
1
+ import { z } from 'zod';
2
+ type PropertyConfig<T, U> = {
3
+ [K in keyof T]?: (jsonObject: U) => T[K];
4
+ };
5
+ export declare function jsonToZodSchemaMapper<T extends z.ZodType, U extends Record<string, any>>(jsonObject: U, zodSchema: T, config: PropertyConfig<z.infer<T>, U>): z.infer<T>;
6
+ export {};
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod';
2
+ export declare const zodMinMaxFilter: z.ZodObject<{
3
+ min: z.ZodOptional<z.ZodNumber>;
4
+ max: z.ZodOptional<z.ZodNumber>;
5
+ }, z.core.$strip>;
6
+ export type ZodMinMaxFilter = z.infer<typeof zodMinMaxFilter>;
7
+ /**
8
+ * Maps a min/max filter to a generic `gte`/`lte` range object (e.g. ORM-friendly).
9
+ * Returns `undefined` if both bounds are undefined.
10
+ */
11
+ export declare function toGteLteFilter(filter: ZodMinMaxFilter | undefined): {
12
+ gte?: number;
13
+ lte?: number;
14
+ } | undefined;
@@ -0,0 +1,9 @@
1
+ import type { z } from 'zod';
2
+ /**
3
+ * Convert a Zod schema to a human-readable TypeScript-like interface string
4
+ */
5
+ export declare function zodToTypeString(schema: z.ZodType, indent?: number): string;
6
+ /**
7
+ * Generate example JSON from a Zod schema
8
+ */
9
+ export declare function zodToExample(schema: z.ZodType): unknown;
package/package.json ADDED
@@ -0,0 +1,102 @@
1
+ {
2
+ "name": "hanzio",
3
+ "version": "1.0.0",
4
+ "description": "A set of utility functions for TypeScript",
5
+ "type": "module",
6
+ "module": "./dist/index.js",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "license": "MIT",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/HansKristoffer/hanzio.git"
13
+ },
14
+ "author": "Kristoffer Hansen",
15
+ "keywords": [
16
+ "typescript",
17
+ "utility",
18
+ "functions",
19
+ "type-safe",
20
+ "exhaustive",
21
+ "union-types"
22
+ ],
23
+ "engines": {
24
+ "bun": ">=1.0.0"
25
+ },
26
+ "files": [
27
+ "src/**/*.ts",
28
+ "dist",
29
+ "!src/**/*.test.ts"
30
+ ],
31
+ "exports": {
32
+ ".": {
33
+ "types": "./dist/index.d.ts",
34
+ "bun": "./src/index.ts",
35
+ "import": "./dist/index.js",
36
+ "default": "./dist/index.js"
37
+ },
38
+ "./zod": {
39
+ "types": "./dist/zod/index.d.ts",
40
+ "bun": "./src/zod/index.ts",
41
+ "import": "./dist/zod/index.js",
42
+ "default": "./dist/zod/index.js"
43
+ },
44
+ "./api-wrapper": {
45
+ "types": "./dist/api-wrapper/index.d.ts",
46
+ "bun": "./src/api-wrapper/index.ts",
47
+ "import": "./dist/api-wrapper/index.js",
48
+ "default": "./dist/api-wrapper/index.js"
49
+ },
50
+ "./jwt": {
51
+ "types": "./dist/jwt/index.d.ts",
52
+ "bun": "./src/jwt/index.ts",
53
+ "import": "./dist/jwt/index.js",
54
+ "default": "./dist/jwt/index.js"
55
+ },
56
+ "./gzip": {
57
+ "types": "./dist/gzip/index.d.ts",
58
+ "bun": "./src/gzip/index.ts",
59
+ "import": "./dist/gzip/index.js",
60
+ "default": "./dist/gzip/index.js"
61
+ },
62
+ "./sitemap": {
63
+ "types": "./dist/sitemap/index.d.ts",
64
+ "bun": "./src/sitemap/index.ts",
65
+ "import": "./dist/sitemap/index.js",
66
+ "default": "./dist/sitemap/index.js"
67
+ },
68
+ "./p-queue": {
69
+ "types": "./dist/p-queue/index.d.ts",
70
+ "bun": "./src/p-queue/index.ts",
71
+ "import": "./dist/p-queue/index.js",
72
+ "default": "./dist/p-queue/index.js"
73
+ }
74
+ },
75
+ "scripts": {
76
+ "build": "bun run build:js && bun run build:types",
77
+ "build:js": "bun build ./src/index.ts ./src/zod/index.ts ./src/api-wrapper/index.ts ./src/jwt/index.ts ./src/gzip/index.ts ./src/sitemap/index.ts ./src/p-queue/index.ts --outdir ./dist --target node --packages external",
78
+ "build:types": "tsgo -p tsconfig.build.json",
79
+ "prepublishOnly": "bun run build",
80
+ "publish:patch": "npm version patch && npm publish",
81
+ "publish:minor": "npm version minor && npm publish",
82
+ "publish:major": "npm version major && npm publish",
83
+ "test": "bun test",
84
+ "lint": "bun run typecheck && bun biome check",
85
+ "lint:write": "bun run typecheck && bun biome check --write",
86
+ "typecheck": "tsgo --noEmit",
87
+ "prepare": "husky"
88
+ },
89
+ "devDependencies": {
90
+ "@biomejs/biome": "^2.4.6",
91
+ "@types/bun": "latest",
92
+ "@types/pako": "^2.0.4",
93
+ "@typescript/native-preview": "^7.0.0-dev.20260306.1",
94
+ "husky": "^9.1.7",
95
+ "typescript": "^5.7.0"
96
+ },
97
+ "dependencies": {
98
+ "jose": "^6.2.3",
99
+ "pako": "^2.1.0",
100
+ "zod": "^4.3.6"
101
+ }
102
+ }