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"] } }, });