express-zod-api 6.0.1 → 6.1.0-beta1

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/CHANGELOG.md CHANGED
@@ -2,6 +2,51 @@
2
2
 
3
3
  ## Version 6
4
4
 
5
+ ### v6.1.0-beta1
6
+
7
+ - This is a beta release of a new feature for public testing.
8
+ - Feature #403: API Client Generator.
9
+ - A new way of informing the frontend about the I/O types of endpoints is proposed.
10
+ - The new approach offers automatic generation of a client based on routing to a typescript file.
11
+ - The generated client is flexibly configured on the frontend using a provider function that directly makes a
12
+ request to the endpoint using the libraries and methods of your choice.
13
+ - The client asserts the type request and response.
14
+ - More details coming soon.
15
+
16
+ ```typescript
17
+ // example client-generator.ts
18
+ import fs from "fs";
19
+ import { Client } from "express-zod-api";
20
+
21
+ fs.writeFileSync("./frontend/client.ts", new Client(routing).print(), "utf-8");
22
+ ```
23
+
24
+ ```typescript
25
+ // example frontend using the most simple provider based on fetch
26
+ import { ExpressZodAPIClient } from "./client.ts";
27
+
28
+ const client = new ExpressZodAPIClient(async (method, path, params) => {
29
+ const urlParams =
30
+ method === "get" ? new URLSearchParams(params).toString() : "";
31
+ const response = await fetch(`https://example.com${path}?${urlParams}`, {
32
+ method,
33
+ body: method === "get" ? undefined : JSON.stringify(params),
34
+ });
35
+ return response.json();
36
+ });
37
+
38
+ client.provide("get", "/v1/user/retrieve", { id: "10" });
39
+ ```
40
+
41
+ ### v6.0.3
42
+
43
+ - `zod` version is 3.14.4.
44
+ - `winston` version is 3.7.2.
45
+
46
+ ### v6.0.2
47
+
48
+ - `zod` version is 3.14.3.
49
+
5
50
  ### v6.0.1
6
51
 
7
52
  - `zod` version is 3.14.2.
@@ -0,0 +1,21 @@
1
+ import ts from "typescript";
2
+ export declare const f: ts.NodeFactory;
3
+ export declare const exportModifier: ts.ModifierToken<ts.SyntaxKind.ExportKeyword>[];
4
+ export declare const protectedReadonlyModifier: (ts.ModifierToken<ts.SyntaxKind.ProtectedKeyword> | ts.ModifierToken<ts.SyntaxKind.ReadonlyKeyword>)[];
5
+ export declare const publicModifier: ts.ModifierToken<ts.SyntaxKind.PublicKeyword>[];
6
+ export declare const makeTemplate: (names: (ts.Identifier | string)[]) => ts.TemplateLiteralTypeNode;
7
+ export declare const parametricIndexNode: ts.TemplateLiteralTypeNode;
8
+ export declare const makeParam: (name: string, type: ts.TypeNode, mod?: ts.Modifier[] | undefined) => ts.ParameterDeclaration;
9
+ export declare const makeParams: (params: Record<string, ts.TypeNode>, mod?: ts.Modifier[] | undefined) => ts.ParameterDeclaration[];
10
+ export declare const makeRecord: (key: ts.Identifier, value: ts.KeywordTypeSyntaxKind) => ts.ExpressionWithTypeArguments;
11
+ export declare const makeEmptyConstructor: (params: ts.ParameterDeclaration[]) => ts.ConstructorDeclaration;
12
+ export declare const makeQuotedProp: (name: string, ref: string) => ts.PropertySignature;
13
+ export declare const makeConst: (name: string, value: ts.Expression) => ts.VariableDeclarationList;
14
+ export declare const makePublicLiteralType: (name: string, literals: string[]) => ts.TypeAliasDeclaration;
15
+ export declare const makePublicType: (name: string, value: ts.TypeNode) => ts.TypeAliasDeclaration;
16
+ export declare const makePublicProp: (name: string, value: ts.Expression) => ts.PropertyDeclaration;
17
+ export declare const makePublicClass: (name: string, constructor: ts.ConstructorDeclaration, props?: ts.PropertyDeclaration[]) => ts.ClassDeclaration;
18
+ export declare const makeIndexedPromise: (type: ts.Identifier, index: ts.TypeNode) => ts.TypeReferenceNode;
19
+ export declare const makePublicExtendedInterface: (name: string, extender: ts.HeritageClause[], props: ts.PropertySignature[]) => ts.InterfaceDeclaration;
20
+ export declare const makeTypeParams: (params: Record<string, ts.Identifier>) => ts.TypeParameterDeclaration[];
21
+ export declare const cleanId: (path: string, method: string, suffix: string) => string;
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.cleanId = exports.makeTypeParams = exports.makePublicExtendedInterface = exports.makeIndexedPromise = exports.makePublicClass = exports.makePublicProp = exports.makePublicType = exports.makePublicLiteralType = exports.makeConst = exports.makeQuotedProp = exports.makeEmptyConstructor = exports.makeRecord = exports.makeParams = exports.makeParam = exports.parametricIndexNode = exports.makeTemplate = exports.publicModifier = exports.protectedReadonlyModifier = exports.exportModifier = exports.f = void 0;
7
+ const typescript_1 = __importDefault(require("typescript"));
8
+ exports.f = typescript_1.default.factory;
9
+ exports.exportModifier = [exports.f.createModifier(typescript_1.default.SyntaxKind.ExportKeyword)];
10
+ exports.protectedReadonlyModifier = [
11
+ exports.f.createModifier(typescript_1.default.SyntaxKind.ProtectedKeyword),
12
+ exports.f.createModifier(typescript_1.default.SyntaxKind.ReadonlyKeyword),
13
+ ];
14
+ exports.publicModifier = [exports.f.createModifier(typescript_1.default.SyntaxKind.PublicKeyword)];
15
+ const emptyPrefix = exports.f.createTemplateHead("");
16
+ const emptyEnding = exports.f.createTemplateTail("");
17
+ const spacingSuffix = exports.f.createTemplateMiddle(" ");
18
+ const makeTemplate = (names) => exports.f.createTemplateLiteralType(emptyPrefix, names.map((name, index) => exports.f.createTemplateLiteralTypeSpan(exports.f.createTypeReferenceNode(name), index === names.length - 1 ? emptyEnding : spacingSuffix)));
19
+ exports.makeTemplate = makeTemplate;
20
+ exports.parametricIndexNode = (0, exports.makeTemplate)(["M", "P"]);
21
+ const makeParam = (name, type, mod) => exports.f.createParameterDeclaration(undefined, mod, undefined, name, undefined, type);
22
+ exports.makeParam = makeParam;
23
+ const makeParams = (params, mod) => Object.keys(params).reduce((acc, name) => acc.concat((0, exports.makeParam)(name, params[name], mod)), []);
24
+ exports.makeParams = makeParams;
25
+ const makeRecord = (key, value) => exports.f.createExpressionWithTypeArguments(exports.f.createIdentifier("Record"), [
26
+ exports.f.createTypeReferenceNode(key),
27
+ exports.f.createKeywordTypeNode(value),
28
+ ]);
29
+ exports.makeRecord = makeRecord;
30
+ const makeEmptyConstructor = (params) => exports.f.createConstructorDeclaration(undefined, undefined, params, exports.f.createBlock([]));
31
+ exports.makeEmptyConstructor = makeEmptyConstructor;
32
+ const makeQuotedProp = (name, ref) => exports.f.createPropertySignature(undefined, `"${name}"`, undefined, exports.f.createTypeReferenceNode(ref));
33
+ exports.makeQuotedProp = makeQuotedProp;
34
+ const makeConst = (name, value) => exports.f.createVariableDeclarationList([exports.f.createVariableDeclaration(name, undefined, undefined, value)], typescript_1.default.NodeFlags.Const);
35
+ exports.makeConst = makeConst;
36
+ const makePublicLiteralType = (name, literals) => exports.f.createTypeAliasDeclaration(undefined, exports.exportModifier, name, undefined, exports.f.createUnionTypeNode(literals.map((option) => exports.f.createLiteralTypeNode(exports.f.createStringLiteral(option)))));
37
+ exports.makePublicLiteralType = makePublicLiteralType;
38
+ const makePublicType = (name, value) => exports.f.createTypeAliasDeclaration(undefined, exports.exportModifier, name, undefined, value);
39
+ exports.makePublicType = makePublicType;
40
+ const makePublicProp = (name, value) => exports.f.createPropertyDeclaration(undefined, exports.publicModifier, name, undefined, undefined, value);
41
+ exports.makePublicProp = makePublicProp;
42
+ const makePublicClass = (name, constructor, props = []) => exports.f.createClassDeclaration(undefined, exports.exportModifier, name, undefined, undefined, [constructor, ...props]);
43
+ exports.makePublicClass = makePublicClass;
44
+ const makeIndexedPromise = (type, index) => exports.f.createTypeReferenceNode("Promise", [
45
+ exports.f.createIndexedAccessTypeNode(exports.f.createTypeReferenceNode(type), index),
46
+ ]);
47
+ exports.makeIndexedPromise = makeIndexedPromise;
48
+ const makePublicExtendedInterface = (name, extender, props) => exports.f.createInterfaceDeclaration(undefined, exports.exportModifier, name, undefined, extender, props);
49
+ exports.makePublicExtendedInterface = makePublicExtendedInterface;
50
+ const makeTypeParams = (params) => Object.keys(params).reduce((acc, name) => acc.concat(exports.f.createTypeParameterDeclaration(name, exports.f.createTypeReferenceNode(params[name]))), []);
51
+ exports.makeTypeParams = makeTypeParams;
52
+ const cleanId = (path, method, suffix) => {
53
+ return [method]
54
+ .concat(path.split("/"))
55
+ .concat(suffix)
56
+ .map((entry) => entry.replace(/[^A-Z0-9]/i, ""))
57
+ .map((entry) => entry.slice(0, 1).toUpperCase() + entry.slice(1).toLowerCase())
58
+ .join("");
59
+ };
60
+ exports.cleanId = cleanId;
61
+ //# sourceMappingURL=client-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-helpers.js","sourceRoot":"","sources":["../src/client-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import ts from "typescript";
2
+ import { Routing } from "./routing";
3
+ interface Registry {
4
+ [METHOD_PATH: string]: Record<"in" | "out", string> & {
5
+ isJson: boolean;
6
+ };
7
+ }
8
+ export declare class Client {
9
+ protected agg: ts.Node[];
10
+ protected registry: Registry;
11
+ protected paths: string[];
12
+ constructor(routing: Routing);
13
+ print(printerOptions?: ts.PrinterOptions): string;
14
+ }
15
+ export {};
package/dist/client.js ADDED
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Client = void 0;
7
+ const typescript_1 = __importDefault(require("typescript"));
8
+ const zod_to_ts_1 = require("zod-to-ts");
9
+ const client_helpers_1 = require("./client-helpers");
10
+ const method_1 = require("./method");
11
+ const mime_1 = require("./mime");
12
+ const routing_1 = require("./routing");
13
+ class Client {
14
+ constructor(routing) {
15
+ this.agg = [];
16
+ this.registry = {};
17
+ this.paths = [];
18
+ (0, routing_1.routingCycle)({
19
+ routing,
20
+ endpointCb: (endpoint, path, method) => {
21
+ const inputId = (0, client_helpers_1.cleanId)(path, method, "input");
22
+ const responseId = (0, client_helpers_1.cleanId)(path, method, "response");
23
+ const input = (0, zod_to_ts_1.zodToTs)(endpoint.getInputSchema(), inputId, {
24
+ resolveNativeEnums: true,
25
+ });
26
+ const response = (0, zod_to_ts_1.zodToTs)(endpoint
27
+ .getPositiveResponseSchema()
28
+ .or(endpoint.getNegativeResponseSchema()), responseId, { resolveNativeEnums: true });
29
+ const inputAlias = (0, zod_to_ts_1.createTypeAlias)(input.node, inputId);
30
+ const responseAlias = (0, zod_to_ts_1.createTypeAlias)(response.node, responseId);
31
+ this.agg.push(...input.store.nativeEnums, ...response.store.nativeEnums);
32
+ this.agg.push(inputAlias);
33
+ this.agg.push(responseAlias);
34
+ if (method !== "options") {
35
+ this.paths.push(path);
36
+ this.registry[`${method} ${path}`] = {
37
+ in: inputId,
38
+ out: responseId,
39
+ isJson: endpoint.getPositiveMimeTypes().includes(mime_1.mimeJson),
40
+ };
41
+ }
42
+ },
43
+ });
44
+ const pathNode = (0, client_helpers_1.makePublicLiteralType)("Path", this.paths);
45
+ const methodNode = (0, client_helpers_1.makePublicLiteralType)("Method", method_1.methods);
46
+ const methodPathNode = (0, client_helpers_1.makePublicType)("MethodPath", (0, client_helpers_1.makeTemplate)([methodNode.name, pathNode.name]));
47
+ const extenderClause = [
48
+ client_helpers_1.f.createHeritageClause(typescript_1.default.SyntaxKind.ExtendsKeyword, [
49
+ (0, client_helpers_1.makeRecord)(methodPathNode.name, typescript_1.default.SyntaxKind.AnyKeyword),
50
+ ]),
51
+ ];
52
+ const inputNode = (0, client_helpers_1.makePublicExtendedInterface)("Input", extenderClause, Object.keys(this.registry).map((methodPath) => (0, client_helpers_1.makeQuotedProp)(methodPath, this.registry[methodPath].in)));
53
+ const responseNode = (0, client_helpers_1.makePublicExtendedInterface)("Response", extenderClause, Object.keys(this.registry).map((methodPath) => (0, client_helpers_1.makeQuotedProp)(methodPath, this.registry[methodPath].out)));
54
+ const jsonEndpointsNode = client_helpers_1.f.createVariableStatement(client_helpers_1.exportModifier, (0, client_helpers_1.makeConst)("jsonEndpoints", client_helpers_1.f.createObjectLiteralExpression(Object.keys(this.registry)
55
+ .filter((methodPath) => this.registry[methodPath].isJson)
56
+ .map((methodPath) => client_helpers_1.f.createPropertyAssignment(`"${methodPath}"`, client_helpers_1.f.createTrue())))));
57
+ const providerNode = (0, client_helpers_1.makePublicType)("Provider", client_helpers_1.f.createFunctionTypeNode((0, client_helpers_1.makeTypeParams)({ M: methodNode.name, P: pathNode.name }), (0, client_helpers_1.makeParams)({
58
+ method: client_helpers_1.f.createTypeReferenceNode("M"),
59
+ path: client_helpers_1.f.createTypeReferenceNode("P"),
60
+ params: client_helpers_1.f.createIndexedAccessTypeNode(client_helpers_1.f.createTypeReferenceNode(inputNode.name), client_helpers_1.parametricIndexNode),
61
+ }), (0, client_helpers_1.makeIndexedPromise)(responseNode.name, client_helpers_1.parametricIndexNode)));
62
+ const clientNode = (0, client_helpers_1.makePublicClass)("ExpressZodAPIClient", (0, client_helpers_1.makeEmptyConstructor)([
63
+ (0, client_helpers_1.makeParam)("provider", client_helpers_1.f.createTypeReferenceNode(providerNode.name), client_helpers_1.protectedReadonlyModifier),
64
+ ]), [
65
+ (0, client_helpers_1.makePublicProp)("provide", client_helpers_1.f.createPropertyAccessExpression(client_helpers_1.f.createThis(), "provider")),
66
+ ]);
67
+ typescript_1.default.addSyntheticLeadingComment(clientNode, typescript_1.default.SyntaxKind.MultiLineCommentTrivia, "\n" +
68
+ "export const exampleProvider: Provider = async (method, path, params) => {\n" +
69
+ " const urlParams =\n" +
70
+ ' method === "get" ? new URLSearchParams(params).toString() : "";\n' +
71
+ " const response = await fetch(`https://example.com${path}?${urlParams}`, {\n" +
72
+ " method,\n" +
73
+ ' body: method === "get" ? undefined : JSON.stringify(params),\n' +
74
+ " });\n" +
75
+ " if (`${method} ${path}` in jsonEndpoints) {\n" +
76
+ " return response.json();\n" +
77
+ " }\n" +
78
+ " return response.text();\n" +
79
+ "};\n" +
80
+ "\n" +
81
+ `const client = new ${clientNode.name.text}(exampleProvider);\n` +
82
+ 'client.provide("get", "/v1/user/retrieve", { id: "10" });\n', true);
83
+ this.agg.push(pathNode, methodNode, methodPathNode, inputNode, responseNode, jsonEndpointsNode, providerNode, clientNode);
84
+ }
85
+ print(printerOptions) {
86
+ return this.agg.map((node) => (0, zod_to_ts_1.printNode)(node, printerOptions)).join("\n\n");
87
+ }
88
+ }
89
+ exports.Client = Client;
90
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.dateOut = exports.dateIn = exports.date = exports.upload = exports.file = void 0;
18
18
  const zod_1 = require("zod");
19
+ const zod_to_ts_1 = require("zod-to-ts");
19
20
  const date_in_schema_1 = require("./date-in-schema");
20
21
  const date_out_schema_1 = require("./date-out-schema");
21
22
  const file_schema_1 = require("./file-schema");
@@ -28,6 +29,8 @@ exports.upload = upload_schema_1.ZodUpload.create;
28
29
  * @deprecated Please use z.dateIn() or z.dateOut() within IO schemas
29
30
  * */
30
31
  exports.date = zod_1.ZodDate.create;
31
- exports.dateIn = date_in_schema_1.ZodDateIn.create;
32
- exports.dateOut = date_out_schema_1.ZodDateOut.create;
32
+ const dateIn = (...params) => (0, zod_to_ts_1.withGetType)(date_in_schema_1.ZodDateIn.create(...params), (ts) => ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword));
33
+ exports.dateIn = dateIn;
34
+ const dateOut = (...params) => (0, zod_to_ts_1.withGetType)(date_out_schema_1.ZodDateOut.create(...params), (ts) => ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword));
35
+ exports.dateOut = dateOut;
33
36
  //# sourceMappingURL=extend-zod.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"extend-zod.js","sourceRoot":"","sources":["../src/extend-zod.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6BAA8B;AAC9B,qDAA6C;AAC7C,uDAA+C;AAC/C,+CAAwC;AACxC,mDAA4C;AAE5C,sCAAoB;AACP,QAAA,IAAI,GAAG,qBAAO,CAAC,MAAM,CAAC;AACtB,QAAA,MAAM,GAAG,yBAAS,CAAC,MAAM,CAAC;AAEvC;;;KAGK;AACQ,QAAA,IAAI,GAAG,aAAO,CAAC,MAAM,CAAC;AACtB,QAAA,MAAM,GAAG,0BAAS,CAAC,MAAM,CAAC;AAC1B,QAAA,OAAO,GAAG,4BAAU,CAAC,MAAM,CAAC"}
1
+ {"version":3,"file":"extend-zod.js","sourceRoot":"","sources":["../src/extend-zod.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6BAA8B;AAC9B,yCAAwC;AACxC,qDAA6C;AAC7C,uDAA+C;AAC/C,+CAAwC;AACxC,mDAA4C;AAE5C,sCAAoB;AACP,QAAA,IAAI,GAAG,qBAAO,CAAC,MAAM,CAAC;AACtB,QAAA,MAAM,GAAG,yBAAS,CAAC,MAAM,CAAC;AAEvC;;;KAGK;AACQ,QAAA,IAAI,GAAG,aAAO,CAAC,MAAM,CAAC;AAC5B,MAAM,MAAM,GAAG,CAAC,GAAG,MAA2C,EAAE,EAAE,CACvE,IAAA,uBAAW,EAAC,0BAAS,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAC9C,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAC9D,CAAC;AAHS,QAAA,MAAM,UAGf;AACG,MAAM,OAAO,GAAG,CAAC,GAAG,MAA4C,EAAE,EAAE,CACzE,IAAA,uBAAW,EAAC,4BAAU,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAC/C,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAC9D,CAAC;AAHS,QAAA,OAAO,WAGhB"}
package/dist/index.d.ts CHANGED
@@ -15,6 +15,7 @@ export { OpenAPI } from "./open-api";
15
15
  export { OpenAPIError, DependsOnMethodError, RoutingError } from "./errors";
16
16
  export { withMeta } from "./metadata";
17
17
  export { testEndpoint } from "./mock";
18
+ export { Client } from "./client";
18
19
  import * as z from "./extend-zod";
19
20
  import createHttpError from "http-errors";
20
21
  export { createHttpError, z };
package/dist/index.js CHANGED
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.z = exports.createHttpError = exports.testEndpoint = exports.withMeta = exports.RoutingError = exports.DependsOnMethodError = exports.OpenAPIError = exports.OpenAPI = exports.attachRouting = exports.createServer = exports.ServeStatic = exports.DependsOnMethod = exports.defaultResultHandler = exports.createResultHandler = exports.createMiddleware = exports.createLogger = exports.createApiResponse = exports.markOutput = exports.defaultEndpointsFactory = exports.EndpointsFactory = exports.AbstractEndpoint = exports.createConfig = void 0;
29
+ exports.z = exports.createHttpError = exports.Client = exports.testEndpoint = exports.withMeta = exports.RoutingError = exports.DependsOnMethodError = exports.OpenAPIError = exports.OpenAPI = exports.attachRouting = exports.createServer = exports.ServeStatic = exports.DependsOnMethod = exports.defaultResultHandler = exports.createResultHandler = exports.createMiddleware = exports.createLogger = exports.createApiResponse = exports.markOutput = exports.defaultEndpointsFactory = exports.EndpointsFactory = exports.AbstractEndpoint = exports.createConfig = void 0;
30
30
  var config_type_1 = require("./config-type");
31
31
  Object.defineProperty(exports, "createConfig", { enumerable: true, get: function () { return config_type_1.createConfig; } });
32
32
  var endpoint_1 = require("./endpoint");
@@ -62,6 +62,8 @@ var metadata_1 = require("./metadata");
62
62
  Object.defineProperty(exports, "withMeta", { enumerable: true, get: function () { return metadata_1.withMeta; } });
63
63
  var mock_1 = require("./mock");
64
64
  Object.defineProperty(exports, "testEndpoint", { enumerable: true, get: function () { return mock_1.testEndpoint; } });
65
+ var client_1 = require("./client");
66
+ Object.defineProperty(exports, "Client", { enumerable: true, get: function () { return client_1.Client; } });
65
67
  const z = __importStar(require("./extend-zod"));
66
68
  exports.z = z;
67
69
  const http_errors_1 = __importDefault(require("http-errors"));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA2D;AAAlD,2GAAA,YAAY,OAAA;AACrB,uCAKoB;AAJlB,4GAAA,gBAAgB,OAAA;AAMlB,yDAAgF;AAAvE,qHAAA,gBAAgB,OAAA;AAAE,4HAAA,uBAAuB,OAAA;AAClD,mDAAoE;AAArC,4GAAA,UAAU,OAAA;AACzC,+CAAmD;AAA1C,iHAAA,iBAAiB,OAAA;AAC1B,mCAAwC;AAA/B,sGAAA,YAAY,OAAA;AACrB,2CAAgD;AAAvC,8GAAA,gBAAgB,OAAA;AACzB,mDAA6E;AAApE,qHAAA,mBAAmB,OAAA;AAAE,sHAAA,oBAAoB,OAAA;AAClD,yDAAsD;AAA7C,oHAAA,eAAe,OAAA;AACxB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AAEpB,mCAAuD;AAA9C,sGAAA,YAAY,OAAA;AAAE,uGAAA,aAAa,OAAA;AACpC,uCAAqC;AAA5B,mGAAA,OAAO,OAAA;AAChB,mCAA4E;AAAnE,sGAAA,YAAY,OAAA;AAAE,8GAAA,oBAAoB,OAAA;AAAE,sGAAA,YAAY,OAAA;AACzD,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,+BAAsC;AAA7B,oGAAA,YAAY,OAAA;AAErB,gDAAkC;AAGR,cAAC;AAF3B,8DAA0C;AAEjC,0BAFF,qBAAe,CAEE"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA2D;AAAlD,2GAAA,YAAY,OAAA;AACrB,uCAKoB;AAJlB,4GAAA,gBAAgB,OAAA;AAMlB,yDAAgF;AAAvE,qHAAA,gBAAgB,OAAA;AAAE,4HAAA,uBAAuB,OAAA;AAClD,mDAAoE;AAArC,4GAAA,UAAU,OAAA;AACzC,+CAAmD;AAA1C,iHAAA,iBAAiB,OAAA;AAC1B,mCAAwC;AAA/B,sGAAA,YAAY,OAAA;AACrB,2CAAgD;AAAvC,8GAAA,gBAAgB,OAAA;AACzB,mDAA6E;AAApE,qHAAA,mBAAmB,OAAA;AAAE,sHAAA,oBAAoB,OAAA;AAClD,yDAAsD;AAA7C,oHAAA,eAAe,OAAA;AACxB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AAEpB,mCAAuD;AAA9C,sGAAA,YAAY,OAAA;AAAE,uGAAA,aAAa,OAAA;AACpC,uCAAqC;AAA5B,mGAAA,OAAO,OAAA;AAChB,mCAA4E;AAAnE,sGAAA,YAAY,OAAA;AAAE,8GAAA,oBAAoB,OAAA;AAAE,sGAAA,YAAY,OAAA;AACzD,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,+BAAsC;AAA7B,oGAAA,YAAY,OAAA;AACrB,mCAAkC;AAAzB,gGAAA,MAAM,OAAA;AAEf,gDAAkC;AAGR,cAAC;AAF3B,8DAA0C;AAEjC,0BAFF,qBAAe,CAEE"}
package/dist/method.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export declare type Method = "get" | "post" | "put" | "delete" | "patch";
2
+ export declare const methods: Method[];
2
3
  export declare type AuxMethod = "options";
3
4
  export declare type MethodsDefinition<M extends Method> = {
4
5
  methods: M[];
package/dist/method.js CHANGED
@@ -1,3 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.methods = void 0;
4
+ exports.methods = ["get", "post", "put", "delete", "patch"];
3
5
  //# sourceMappingURL=method.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"method.js","sourceRoot":"","sources":["../src/method.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"method.js","sourceRoot":"","sources":["../src/method.ts"],"names":[],"mappings":";;;AACa,QAAA,OAAO,GAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC"}
@@ -0,0 +1,40 @@
1
+ import ts from "typescript";
2
+ export const f = ts.factory;
3
+ export const exportModifier = [f.createModifier(ts.SyntaxKind.ExportKeyword)];
4
+ export const protectedReadonlyModifier = [
5
+ f.createModifier(ts.SyntaxKind.ProtectedKeyword),
6
+ f.createModifier(ts.SyntaxKind.ReadonlyKeyword),
7
+ ];
8
+ export const publicModifier = [f.createModifier(ts.SyntaxKind.PublicKeyword)];
9
+ const emptyPrefix = f.createTemplateHead("");
10
+ const emptyEnding = f.createTemplateTail("");
11
+ const spacingSuffix = f.createTemplateMiddle(" ");
12
+ export const makeTemplate = (names) => f.createTemplateLiteralType(emptyPrefix, names.map((name, index) => f.createTemplateLiteralTypeSpan(f.createTypeReferenceNode(name), index === names.length - 1 ? emptyEnding : spacingSuffix)));
13
+ export const parametricIndexNode = makeTemplate(["M", "P"]);
14
+ export const makeParam = (name, type, mod) => f.createParameterDeclaration(undefined, mod, undefined, name, undefined, type);
15
+ export const makeParams = (params, mod) => Object.keys(params).reduce((acc, name) => acc.concat(makeParam(name, params[name], mod)), []);
16
+ export const makeRecord = (key, value) => f.createExpressionWithTypeArguments(f.createIdentifier("Record"), [
17
+ f.createTypeReferenceNode(key),
18
+ f.createKeywordTypeNode(value),
19
+ ]);
20
+ export const makeEmptyConstructor = (params) => f.createConstructorDeclaration(undefined, undefined, params, f.createBlock([]));
21
+ export const makeQuotedProp = (name, ref) => f.createPropertySignature(undefined, `"${name}"`, undefined, f.createTypeReferenceNode(ref));
22
+ export const makeConst = (name, value) => f.createVariableDeclarationList([f.createVariableDeclaration(name, undefined, undefined, value)], ts.NodeFlags.Const);
23
+ export const makePublicLiteralType = (name, literals) => f.createTypeAliasDeclaration(undefined, exportModifier, name, undefined, f.createUnionTypeNode(literals.map((option) => f.createLiteralTypeNode(f.createStringLiteral(option)))));
24
+ export const makePublicType = (name, value) => f.createTypeAliasDeclaration(undefined, exportModifier, name, undefined, value);
25
+ export const makePublicProp = (name, value) => f.createPropertyDeclaration(undefined, publicModifier, name, undefined, undefined, value);
26
+ export const makePublicClass = (name, constructor, props = []) => f.createClassDeclaration(undefined, exportModifier, name, undefined, undefined, [constructor, ...props]);
27
+ export const makeIndexedPromise = (type, index) => f.createTypeReferenceNode("Promise", [
28
+ f.createIndexedAccessTypeNode(f.createTypeReferenceNode(type), index),
29
+ ]);
30
+ export const makePublicExtendedInterface = (name, extender, props) => f.createInterfaceDeclaration(undefined, exportModifier, name, undefined, extender, props);
31
+ export const makeTypeParams = (params) => Object.keys(params).reduce((acc, name) => acc.concat(f.createTypeParameterDeclaration(name, f.createTypeReferenceNode(params[name]))), []);
32
+ export const cleanId = (path, method, suffix) => {
33
+ return [method]
34
+ .concat(path.split("/"))
35
+ .concat(suffix)
36
+ .map((entry) => entry.replace(/[^A-Z0-9]/i, ""))
37
+ .map((entry) => entry.slice(0, 1).toUpperCase() + entry.slice(1).toLowerCase())
38
+ .join("");
39
+ };
40
+ //# sourceMappingURL=client-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-helpers.js","sourceRoot":"","sources":["../src/client-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;AAE5B,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;AAE9E,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC;IAChD,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC;CAChD,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;AAE9E,MAAM,WAAW,GAAG,CAAC,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;AAE7C,MAAM,WAAW,GAAG,CAAC,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;AAE7C,MAAM,aAAa,GAAG,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAElD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAiC,EAAE,EAAE,CAChE,CAAC,CAAC,yBAAyB,CACzB,WAAW,EACX,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACxB,CAAC,CAAC,6BAA6B,CAC7B,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAC/B,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CACzD,CACF,CACF,CAAC;AAEJ,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAE5D,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,IAAY,EACZ,IAAiB,EACjB,GAAmB,EACnB,EAAE,CACF,CAAC,CAAC,0BAA0B,CAC1B,SAAS,EACT,GAAG,EACH,SAAS,EACT,IAAI,EACJ,SAAS,EACT,IAAI,CACL,CAAC;AAEJ,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,MAAmC,EACnC,GAAmB,EACnB,EAAE,CACF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CACxB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EAC7D,EAA+B,CAChC,CAAC;AAEJ,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,GAAkB,EAClB,KAA+B,EAC/B,EAAE,CACF,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE;IAChE,CAAC,CAAC,uBAAuB,CAAC,GAAG,CAAC;IAC9B,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC;CAC/B,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAiC,EAAE,EAAE,CACxE,CAAC,CAAC,4BAA4B,CAC5B,SAAS,EACT,SAAS,EACT,MAAM,EACN,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAClB,CAAC;AAEJ,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,GAAW,EAAE,EAAE,CAC1D,CAAC,CAAC,uBAAuB,CACvB,SAAS,EACT,IAAI,IAAI,GAAG,EACX,SAAS,EACT,CAAC,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAC/B,CAAC;AAEJ,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,KAAoB,EAAE,EAAE,CAC9D,CAAC,CAAC,6BAA6B,CAC7B,CAAC,CAAC,CAAC,yBAAyB,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,EAChE,EAAE,CAAC,SAAS,CAAC,KAAK,CACnB,CAAC;AAEJ,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAAY,EAAE,QAAkB,EAAE,EAAE,CACxE,CAAC,CAAC,0BAA0B,CAC1B,SAAS,EACT,cAAc,EACd,IAAI,EACJ,SAAS,EACT,CAAC,CAAC,mBAAmB,CACnB,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACtB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CACvD,CACF,CACF,CAAC;AAEJ,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,KAAkB,EAAE,EAAE,CACjE,CAAC,CAAC,0BAA0B,CAC1B,SAAS,EACT,cAAc,EACd,IAAI,EACJ,SAAS,EACT,KAAK,CACN,CAAC;AAEJ,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,KAAoB,EAAE,EAAE,CACnE,CAAC,CAAC,yBAAyB,CACzB,SAAS,EACT,cAAc,EACd,IAAI,EACJ,SAAS,EACT,SAAS,EACT,KAAK,CACN,CAAC;AAEJ,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,IAAY,EACZ,WAAsC,EACtC,QAAkC,EAAE,EACpC,EAAE,CACF,CAAC,CAAC,sBAAsB,CACtB,SAAS,EACT,cAAc,EACd,IAAI,EACJ,SAAS,EACT,SAAS,EACT,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,CACxB,CAAC;AAEJ,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAmB,EAAE,KAAkB,EAAE,EAAE,CAC5E,CAAC,CAAC,uBAAuB,CAAC,SAAS,EAAE;IACnC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;CACtE,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,IAAY,EACZ,QAA6B,EAC7B,KAA6B,EAC7B,EAAE,CACF,CAAC,CAAC,0BAA0B,CAC1B,SAAS,EACT,cAAc,EACd,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,KAAK,CACN,CAAC;AAEJ,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAqC,EAAE,EAAE,CACtE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CACxB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CACZ,GAAG,CAAC,MAAM,CACR,CAAC,CAAC,8BAA8B,CAC9B,IAAI,EACJ,CAAC,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CACxC,CACF,EACH,EAAmC,CACpC,CAAC;AAEJ,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,MAAc,EAAE,MAAc,EAAE,EAAE;IACtE,OAAO,CAAC,MAAM,CAAC;SACZ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACvB,MAAM,CAAC,MAAM,CAAC;SACd,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;SAC/C,GAAG,CACF,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAC1E;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC,CAAC"}
@@ -0,0 +1,83 @@
1
+ import ts from "typescript";
2
+ import { createTypeAlias, printNode, zodToTs } from "zod-to-ts";
3
+ import { cleanId, exportModifier, f, makeConst, makeEmptyConstructor, makeIndexedPromise, makeParam, makeParams, makePublicClass, makePublicExtendedInterface, makePublicLiteralType, makePublicProp, makePublicType, makeQuotedProp, makeRecord, makeTemplate, makeTypeParams, parametricIndexNode, protectedReadonlyModifier, } from "./client-helpers.js";
4
+ import { methods } from "./method.js";
5
+ import { mimeJson } from "./mime.js";
6
+ import { routingCycle } from "./routing.js";
7
+ export class Client {
8
+ constructor(routing) {
9
+ this.agg = [];
10
+ this.registry = {};
11
+ this.paths = [];
12
+ routingCycle({
13
+ routing,
14
+ endpointCb: (endpoint, path, method) => {
15
+ const inputId = cleanId(path, method, "input");
16
+ const responseId = cleanId(path, method, "response");
17
+ const input = zodToTs(endpoint.getInputSchema(), inputId, {
18
+ resolveNativeEnums: true,
19
+ });
20
+ const response = zodToTs(endpoint
21
+ .getPositiveResponseSchema()
22
+ .or(endpoint.getNegativeResponseSchema()), responseId, { resolveNativeEnums: true });
23
+ const inputAlias = createTypeAlias(input.node, inputId);
24
+ const responseAlias = createTypeAlias(response.node, responseId);
25
+ this.agg.push(...input.store.nativeEnums, ...response.store.nativeEnums);
26
+ this.agg.push(inputAlias);
27
+ this.agg.push(responseAlias);
28
+ if (method !== "options") {
29
+ this.paths.push(path);
30
+ this.registry[`${method} ${path}`] = {
31
+ in: inputId,
32
+ out: responseId,
33
+ isJson: endpoint.getPositiveMimeTypes().includes(mimeJson),
34
+ };
35
+ }
36
+ },
37
+ });
38
+ const pathNode = makePublicLiteralType("Path", this.paths);
39
+ const methodNode = makePublicLiteralType("Method", methods);
40
+ const methodPathNode = makePublicType("MethodPath", makeTemplate([methodNode.name, pathNode.name]));
41
+ const extenderClause = [
42
+ f.createHeritageClause(ts.SyntaxKind.ExtendsKeyword, [
43
+ makeRecord(methodPathNode.name, ts.SyntaxKind.AnyKeyword),
44
+ ]),
45
+ ];
46
+ const inputNode = makePublicExtendedInterface("Input", extenderClause, Object.keys(this.registry).map((methodPath) => makeQuotedProp(methodPath, this.registry[methodPath].in)));
47
+ const responseNode = makePublicExtendedInterface("Response", extenderClause, Object.keys(this.registry).map((methodPath) => makeQuotedProp(methodPath, this.registry[methodPath].out)));
48
+ const jsonEndpointsNode = f.createVariableStatement(exportModifier, makeConst("jsonEndpoints", f.createObjectLiteralExpression(Object.keys(this.registry)
49
+ .filter((methodPath) => this.registry[methodPath].isJson)
50
+ .map((methodPath) => f.createPropertyAssignment(`"${methodPath}"`, f.createTrue())))));
51
+ const providerNode = makePublicType("Provider", f.createFunctionTypeNode(makeTypeParams({ M: methodNode.name, P: pathNode.name }), makeParams({
52
+ method: f.createTypeReferenceNode("M"),
53
+ path: f.createTypeReferenceNode("P"),
54
+ params: f.createIndexedAccessTypeNode(f.createTypeReferenceNode(inputNode.name), parametricIndexNode),
55
+ }), makeIndexedPromise(responseNode.name, parametricIndexNode)));
56
+ const clientNode = makePublicClass("ExpressZodAPIClient", makeEmptyConstructor([
57
+ makeParam("provider", f.createTypeReferenceNode(providerNode.name), protectedReadonlyModifier),
58
+ ]), [
59
+ makePublicProp("provide", f.createPropertyAccessExpression(f.createThis(), "provider")),
60
+ ]);
61
+ ts.addSyntheticLeadingComment(clientNode, ts.SyntaxKind.MultiLineCommentTrivia, "\n" +
62
+ "export const exampleProvider: Provider = async (method, path, params) => {\n" +
63
+ " const urlParams =\n" +
64
+ ' method === "get" ? new URLSearchParams(params).toString() : "";\n' +
65
+ " const response = await fetch(`https://example.com${path}?${urlParams}`, {\n" +
66
+ " method,\n" +
67
+ ' body: method === "get" ? undefined : JSON.stringify(params),\n' +
68
+ " });\n" +
69
+ " if (`${method} ${path}` in jsonEndpoints) {\n" +
70
+ " return response.json();\n" +
71
+ " }\n" +
72
+ " return response.text();\n" +
73
+ "};\n" +
74
+ "\n" +
75
+ `const client = new ${clientNode.name.text}(exampleProvider);\n` +
76
+ 'client.provide("get", "/v1/user/retrieve", { id: "10" });\n', true);
77
+ this.agg.push(pathNode, methodNode, methodPathNode, inputNode, responseNode, jsonEndpointsNode, providerNode, clientNode);
78
+ }
79
+ print(printerOptions) {
80
+ return this.agg.map((node) => printNode(node, printerOptions)).join("\n\n");
81
+ }
82
+ }
83
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { ZodDate } from "zod";
2
+ import { withGetType } from "zod-to-ts";
2
3
  import { ZodDateIn } from "./date-in-schema.js";
3
4
  import { ZodDateOut } from "./date-out-schema.js";
4
5
  import { ZodFile } from "./file-schema.js";
@@ -11,6 +12,6 @@ export const upload = ZodUpload.create;
11
12
  * @deprecated Please use z.dateIn() or z.dateOut() within IO schemas
12
13
  * */
13
14
  export const date = ZodDate.create;
14
- export const dateIn = ZodDateIn.create;
15
- export const dateOut = ZodDateOut.create;
15
+ export const dateIn = (...params) => withGetType(ZodDateIn.create(...params), (ts) => ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword));
16
+ export const dateOut = (...params) => withGetType(ZodDateOut.create(...params), (ts) => ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword));
16
17
  //# sourceMappingURL=extend-zod.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"extend-zod.js","sourceRoot":"","sources":["../src/extend-zod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,cAAc,KAAK,CAAC;AACpB,MAAM,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;AACnC,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;AAEvC;;;KAGK;AACL,MAAM,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;AACnC,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;AACvC,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC"}
1
+ {"version":3,"file":"extend-zod.js","sourceRoot":"","sources":["../src/extend-zod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,cAAc,KAAK,CAAC;AACpB,MAAM,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;AACnC,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;AAEvC;;;KAGK;AACL,MAAM,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;AACnC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,GAAG,MAA2C,EAAE,EAAE,CACvE,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAC9C,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAC9D,CAAC;AACJ,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAG,MAA4C,EAAE,EAAE,CACzE,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAC/C,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAC9D,CAAC"}
package/dist-esm/index.js CHANGED
@@ -13,6 +13,7 @@ export { OpenAPI } from "./open-api.js";
13
13
  export { OpenAPIError, DependsOnMethodError, RoutingError } from "./errors.js";
14
14
  export { withMeta } from "./metadata.js";
15
15
  export { testEndpoint } from "./mock.js";
16
+ export { Client } from "./client.js";
16
17
  import * as z from "./extend-zod.js";
17
18
  import createHttpError from "http-errors";
18
19
  export { createHttpError, z };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAgB,MAAM,eAAe,CAAC;AAC3D,OAAO,EACL,gBAAgB,GAIjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAwB,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,eAAe,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAgB,MAAM,eAAe,CAAC;AAC3D,OAAO,EACL,gBAAgB,GAIjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAwB,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,eAAe,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC"}
@@ -1,2 +1,2 @@
1
- export {};
1
+ export const methods = ["get", "post", "put", "delete", "patch"];
2
2
  //# sourceMappingURL=method.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"method.js","sourceRoot":"","sources":["../src/method.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"method.js","sourceRoot":"","sources":["../src/method.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,OAAO,GAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"type":"module","version":"6.0.1"}
1
+ {"type":"module","version":"6.1.0-beta1"}
package/package.json CHANGED
@@ -1,15 +1,16 @@
1
1
  {
2
2
  "name": "express-zod-api",
3
- "version": "6.0.1",
3
+ "version": "6.1.0-beta1",
4
4
  "description": "A Typescript library to help you get an API server up and running with I/O schema validation and custom middlewares in minutes.",
5
5
  "license": "MIT",
6
6
  "scripts": {
7
7
  "start": "ts-node example/index.ts",
8
- "build": "yarn build:cleanup && yarn build:compile && yarn build:esm && yarn build:swagger && yarn build:license",
9
- "build:cleanup": "rm -rf ./dist ./dist-esm example/example.swagger.yaml ./LICENSE",
8
+ "build": "yarn build:cleanup && yarn build:compile && yarn build:esm && yarn build:swagger && yarn build:client && yarn build:license",
9
+ "build:cleanup": "rm -rf ./dist ./dist-esm example/example.swagger.yaml example/example.client.ts ./LICENSE",
10
10
  "build:compile": "tsc --build tsconfig.build.json",
11
11
  "build:esm": "tsc --build tsconfig.esm.json && ts-node tools/esm-package.ts && ts-node tools/esm-extensions.ts",
12
12
  "build:swagger": "ts-node example/generate-open-api-schema.ts > example/example.swagger.yaml",
13
+ "build:client": "ts-node example/generate-client.ts > example/example.client.ts && yarn prettier example/example.client.ts --write",
13
14
  "build:license": "ts-node tools/license.ts > ./LICENSE",
14
15
  "build:intTest": "ts-node tools/integration-test.ts && yarn install --cwd ./tests/integration",
15
16
  "build:esmTest": "ts-node tools/esm-test.ts && yarn install --cwd ./tests/esm && ts-node tools/esm-test-package.ts",
@@ -21,7 +22,7 @@
21
22
  "test:badge": "yarn make-coverage-badge --output-path ./coverage.svg",
22
23
  "lint": "yarn eslint ./src ./example ./tests && yarn prettier *.md --check",
23
24
  "mdfix": "yarn prettier *.md --write",
24
- "precommit": "yarn lint && yarn test && yarn build && git add example/example.swagger.yaml ./LICENSE ./coverage.svg",
25
+ "precommit": "yarn lint && yarn test && yarn build && git add example/example.swagger.yaml example/example.client.ts ./LICENSE ./coverage.svg",
25
26
  "prepublishOnly": "yarn lint && yarn test && yarn build",
26
27
  "postversion": "git push && git push --tags",
27
28
  "install_hooks": "husky install"
@@ -47,12 +48,14 @@
47
48
  "openapi3-ts": "2.0.2",
48
49
  "ramda": "0.28.0",
49
50
  "triple-beam": "1.3.0",
50
- "winston": "3.6.0",
51
- "zod": "3.14.2"
51
+ "winston": "3.7.2",
52
+ "zod": "3.14.4",
53
+ "zod-to-ts": "0.2.2"
52
54
  },
53
55
  "peerDependencies": {
54
56
  "@types/jest": "*",
55
- "jest": ">=25 <28"
57
+ "jest": ">=25 <28",
58
+ "typescript": "^4.1"
56
59
  },
57
60
  "peerDependenciesMeta": {
58
61
  "jest": {
@@ -60,6 +63,9 @@
60
63
  },
61
64
  "@types/jest": {
62
65
  "optional": true
66
+ },
67
+ "typescript": {
68
+ "optional": true
63
69
  }
64
70
  },
65
71
  "devDependencies": {
@@ -75,7 +81,7 @@
75
81
  "cors": "^2.8.5",
76
82
  "eslint": "^8.2.0",
77
83
  "eslint-config-airbnb-base": "^15.0.0",
78
- "eslint-config-airbnb-typescript": "^16.0.0",
84
+ "eslint-config-airbnb-typescript": "^17.0.0",
79
85
  "eslint-config-prettier": "^8.3.0",
80
86
  "eslint-plugin-import": "^2.25.3",
81
87
  "eslint-plugin-prettier": "^4.0.0",
@@ -84,11 +90,11 @@
84
90
  "jest": "^27.3.1",
85
91
  "make-coverage-badge": "^1.2.0",
86
92
  "node-fetch": "^2.6.5",
87
- "prettier": "2.6.0",
93
+ "prettier": "2.6.2",
88
94
  "ts-jest": "^27.0.7",
89
95
  "ts-node": "^10.4.0",
90
- "tsd": "^0.19.0",
91
- "typescript": "^4.5.2",
96
+ "tsd": "^0.20.0",
97
+ "typescript": "^4.6.3",
92
98
  "winston-transport": "^4.4.0"
93
99
  },
94
100
  "engines": {