diff --git a/demo/index.html b/demo/index.html
new file mode 100644
index 0000000..0137f82
--- /dev/null
+++ b/demo/index.html
@@ -0,0 +1,27 @@
+
+
+
+
+ Zodex Demo
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demo/index.mjs b/demo/index.mjs
new file mode 100644
index 0000000..554b308
--- /dev/null
+++ b/demo/index.mjs
@@ -0,0 +1,66 @@
+import {z} from 'zod';
+import {zerialize, dezerialize} from '../dist/esm/index.js';
+
+const $ = (sel) => {
+ return document.querySelector(sel);
+};
+
+$('#dezerialize').addEventListener('click', () => {
+ let js;
+ try {
+ js = eval(`(${$('#js').value})`);
+ } catch (err) {
+ alert('Error evaluating JavaScript');
+ return;
+ }
+
+ let json;
+ try {
+ json = JSON.parse($('#zodexJSON').value);
+ } catch (err) {
+ alert('Error evaluating JSON');
+ return;
+ }
+
+ let dez;
+ try {
+ dez = dezerialize(json);
+ } catch (err) {
+ alert('Error dezerializing JSON');
+ return;
+ }
+
+ let parseObj;
+ try {
+ parseObj = dez.safeParse(js);
+ } catch (err) {
+ alert('Error parsing JavaScript');
+ return;
+ }
+
+ alert(JSON.stringify(parseObj, null, 2));
+});
+
+$('#zerialize').addEventListener('click', () => {
+ let zod;
+ try {
+ zod = eval(`(${$('#zod').value})`);
+ } catch (err) {
+ alert('Error evaluating Zod');
+ return;
+ }
+ let zer;
+ try {
+ zer = zerialize(zod);
+ } catch (err) {
+ alert('Error zerializing Zod');
+ return;
+ }
+
+ try {
+ $('#zodexJSON').value = JSON.stringify(zer, null, 2);
+ } catch (err) {
+ alert('Error stringifying Zod JSON object');
+ return;
+ }
+});
diff --git a/demo/react.mjs b/demo/react.mjs
new file mode 100644
index 0000000..ff8b4c5
--- /dev/null
+++ b/demo/react.mjs
@@ -0,0 +1 @@
+export default {};
diff --git a/package.json b/package.json
index adb2b07..c3f8e6e 100644
--- a/package.json
+++ b/package.json
@@ -2,6 +2,7 @@
"name": "zodex",
"version": "0.0.0-dev",
"description": "Type-safe (de)serialization for Zod",
+ "type": "commonjs",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"keywords": [
@@ -13,11 +14,12 @@
"author": "Gregor Weber",
"license": "MIT",
"scripts": {
+ "start": "static",
"prepare": "husky install",
"check-style": "prettier --check src",
"lint": "eslint src/**",
"test": "vitest --coverage --silent=false",
- "build": "rm -rf dist && pnpm tsc",
+ "build": "rm -rf dist && pnpm tsc --module esnext --moduleResolution bundler --outDir dist/esm && pnpm tsc",
"prepublish": "pnpm run build"
},
"peerDependencies": {
@@ -31,6 +33,7 @@
"zod": "^3.23.8"
},
"devDependencies": {
+ "@brettz9/node-static": "^0.1.1",
"@commitlint/cli": "19.3.0",
"@commitlint/config-conventional": "19.2.2",
"@types/react": "18.3.3",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 57eac5a..163b6f0 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -18,6 +18,9 @@ importers:
specifier: ^3.23.8
version: 3.23.8
devDependencies:
+ '@brettz9/node-static':
+ specifier: ^0.1.1
+ version: 0.1.1
'@commitlint/cli':
specifier: 19.3.0
version: 19.3.0(@types/node@18.15.11)(typescript@5.3.3)
@@ -99,6 +102,11 @@ packages:
'@bcoe/v8-coverage@0.2.3':
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
+ '@brettz9/node-static@0.1.1':
+ resolution: {integrity: sha512-HHD3JKDCTxudQ7btLDykPlzLBFl+RM70vC6Zsvey1cr9m67UBOmwiP0f2Bk7IjjU3G1c4vAJCjysVxPkmHs7Ew==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+
'@commitlint/cli@19.3.0':
resolution: {integrity: sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==}
engines: {node: '>=v18'}
@@ -594,6 +602,10 @@ packages:
resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==}
engines: {node: '>=14.16'}
+ ansi-regex@2.1.1:
+ resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
+ engines: {node: '>=0.10.0'}
+
ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
@@ -699,6 +711,10 @@ packages:
colorette@2.0.20:
resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+ colors@1.4.0:
+ resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==}
+ engines: {node: '>=0.1.90'}
+
commander@12.1.0:
resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==}
engines: {node: '>=18'}
@@ -1197,6 +1213,11 @@ packages:
resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
engines: {node: '>=8.6'}
+ mime@2.6.0:
+ resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==}
+ engines: {node: '>=4.0.0'}
+ hasBin: true
+
mimic-fn@2.1.0:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
@@ -1229,6 +1250,9 @@ packages:
natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+ neodoc@2.0.2:
+ resolution: {integrity: sha512-NAppJ0YecKWdhSXFYCHbo6RutiX8vOt/Jo3l46mUg6pQlpJNaqc5cGxdrW2jITQm5JIYySbFVPDl3RrREXNyPw==}
+
npm-run-path@5.1.0:
resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -1696,6 +1720,13 @@ snapshots:
'@bcoe/v8-coverage@0.2.3': {}
+ '@brettz9/node-static@0.1.1':
+ dependencies:
+ colors: 1.4.0
+ mime: 2.6.0
+ minimatch: 3.1.2
+ neodoc: 2.0.2
+
'@commitlint/cli@19.3.0(@types/node@18.15.11)(typescript@5.3.3)':
dependencies:
'@commitlint/format': 19.3.0
@@ -2189,6 +2220,8 @@ snapshots:
ansi-escapes@6.2.1: {}
+ ansi-regex@2.1.1: {}
+
ansi-regex@5.0.1: {}
ansi-regex@6.0.1: {}
@@ -2288,6 +2321,8 @@ snapshots:
colorette@2.0.20: {}
+ colors@1.4.0: {}
+
commander@12.1.0: {}
compare-func@2.0.0:
@@ -2807,6 +2842,8 @@ snapshots:
braces: 3.0.3
picomatch: 2.3.1
+ mime@2.6.0: {}
+
mimic-fn@2.1.0: {}
mimic-fn@4.0.0: {}
@@ -2834,6 +2871,10 @@ snapshots:
natural-compare@1.4.0: {}
+ neodoc@2.0.2:
+ dependencies:
+ ansi-regex: 2.1.1
+
npm-run-path@5.1.0:
dependencies:
path-key: 4.0.0
diff --git a/src/dezerialize.ts b/src/dezerialize.ts
index 3194294..f0b6ddc 100644
--- a/src/dezerialize.ts
+++ b/src/dezerialize.ts
@@ -32,8 +32,8 @@ import {
SzUndefined,
SzUnknown,
SzVoid,
-} from "./types";
-import { ZodTypes } from "./zod-types";
+} from "./types.js";
+import { ZodTypes } from "./zod-types.js";
type DezerializerOptions =
| {
diff --git a/src/index.test.ts b/src/index.test.ts
index d6bc5e6..ebcab37 100644
--- a/src/index.test.ts
+++ b/src/index.test.ts
@@ -1,7 +1,7 @@
import { expect, test } from "vitest";
import { z } from "zod";
-import { dezerialize, SzType, zerialize, Zerialize } from "./index";
+import { dezerialize, SzType, zerialize, Zerialize } from "./index.js";
const p = <
Schema extends z.ZodFirstPartySchemaTypes,
diff --git a/src/index.ts b/src/index.ts
index 8fff7fb..6aaf64b 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,10 +1,10 @@
-import { SzType } from "./types";
+import { SzType } from "./types.js";
-export * from "./dezerialize";
-export * from "./zerialize";
+export * from "./dezerialize.js";
+export * from "./zerialize.js";
-export * from "./types";
-export { mapTypesToViews } from "./ui";
+export * from "./types.js";
+export { mapTypesToViews } from "./ui.js";
type KeysOfUnion = T extends T ? keyof T : never;
export type SzPropertyKeysOf = KeysOfUnion<
diff --git a/src/infer.ts b/src/infer.ts
index f2dbc92..4e57fbb 100644
--- a/src/infer.ts
+++ b/src/infer.ts
@@ -16,7 +16,7 @@ import {
SzFunction,
SzEnum,
SzPromise,
-} from "./types";
+} from "./types.js";
type PrimitiveTypes = {
string: string;
diff --git a/src/ui.ts b/src/ui.ts
index 33bea07..9f34e35 100644
--- a/src/ui.ts
+++ b/src/ui.ts
@@ -1,7 +1,7 @@
import React from "react";
-import { SzInfer } from "./infer";
-import { SzType } from "./types";
+import { SzInfer } from "./infer.js";
+import { SzType } from "./types.js";
type ShapeValueProps = {
value: Value;
diff --git a/src/zerialize.ts b/src/zerialize.ts
index 6d27770..94fdb35 100644
--- a/src/zerialize.ts
+++ b/src/zerialize.ts
@@ -23,8 +23,8 @@ import {
SzType,
SzUnknown,
STRING_KINDS,
-} from "./types";
-import { ZodTypes, ZTypeName } from "./zod-types";
+} from "./types.js";
+import { ZodTypes, ZTypeName } from "./zod-types.js";
export const PRIMITIVES = {
ZodString: "string",
diff --git a/vite.config.mts b/vite.config.mts
index d916ba5..216bb53 100644
--- a/vite.config.mts
+++ b/vite.config.mts
@@ -3,7 +3,7 @@ import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
coverage: {
- exclude: ["*.js", "node_modules"]
+ exclude: ["*.js", "demo", "node_modules"]
}
},
});