@kamaalio/hono-standard-openapi 0.0.6 → 0.0.8
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/README.md +4 -2
- package/dist/app.d.ts +5 -5
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +3 -22
- package/dist/app.js.map +1 -1
- package/dist/index.d.ts +2 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -8
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
- package/dist/validator.d.ts +0 -32
- package/dist/validator.d.ts.map +0 -1
- package/dist/validator.js +0 -31
- package/dist/validator.js.map +0 -1
package/README.md
CHANGED
|
@@ -111,8 +111,10 @@ The generated document puts it at
|
|
|
111
111
|
|
|
112
112
|
## Handle validation errors
|
|
113
113
|
|
|
114
|
-
Requests
|
|
115
|
-
|
|
114
|
+
Requests use [`@hono/standard-validator`](https://www.npmjs.com/package/@hono/standard-validator).
|
|
115
|
+
Failures return its standard `400` JSON body with `success: false`, the raw `data`, and an `error`
|
|
116
|
+
array. Header schema property names must be lowercase because Hono normalizes request headers. Set
|
|
117
|
+
`defaultHook` on the app to return your own error shape consistently across routes:
|
|
116
118
|
|
|
117
119
|
```ts
|
|
118
120
|
const app = new StandardOpenAPIHono({
|
package/dist/app.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type Hook } from '@hono/standard-validator';
|
|
1
2
|
import { type Env, Hono, type Schema } from 'hono';
|
|
2
3
|
import type { OpenAPIObject } from 'openapi3-ts/oas31';
|
|
3
4
|
import { type DocumentConfig, type GeneratorOptions } from './generator.ts';
|
|
@@ -5,15 +6,14 @@ import { OpenAPIRegistry } from './registry.ts';
|
|
|
5
6
|
import type { RouteConfig } from './route.ts';
|
|
6
7
|
import type { RouteHandler } from './type-inference.ts';
|
|
7
8
|
import { PARAMETER_SOURCES } from './types.ts';
|
|
8
|
-
import { type Hook } from './validator.ts';
|
|
9
9
|
export interface StandardOpenAPIHonoOptions<E extends Env> {
|
|
10
10
|
/** Runs for every validation on this app, and on apps mounted under it that define none. */
|
|
11
|
-
readonly defaultHook?: Hook<unknown, E, string
|
|
11
|
+
readonly defaultHook?: Hook<unknown, E, string>;
|
|
12
12
|
}
|
|
13
13
|
type HonoInit<E extends Env> = ConstructorParameters<typeof Hono>[0] & StandardOpenAPIHonoOptions<E>;
|
|
14
14
|
/** Any app, whatever it was parameterized with — used where apps are handled as peers. */
|
|
15
15
|
type StandardOpenAPIHonoParent<E extends Env> = {
|
|
16
|
-
getDefaultHook(visited?: Set<StandardOpenAPIHonoParent<E>>): Hook<unknown, E, string
|
|
16
|
+
getDefaultHook(visited?: Set<StandardOpenAPIHonoParent<E>>): Hook<unknown, E, string> | undefined;
|
|
17
17
|
};
|
|
18
18
|
/**
|
|
19
19
|
* A Hono app that documents itself.
|
|
@@ -27,7 +27,7 @@ export declare class StandardOpenAPIHono<E extends Env = Env, S extends Schema =
|
|
|
27
27
|
readonly defaultHook: StandardOpenAPIHonoOptions<E>['defaultHook'];
|
|
28
28
|
constructor(init?: HonoInit<E>);
|
|
29
29
|
/** Registers a route: mounts it, validates its request, and records it in the document. */
|
|
30
|
-
openapi<R extends RouteConfig<E>>(route: R, handler: RouteHandler<R, E>, hook?: Hook<unknown, E, string
|
|
30
|
+
openapi<R extends RouteConfig<E>>(route: R, handler: RouteHandler<R, E>, hook?: Hook<unknown, E, string>): this;
|
|
31
31
|
/** Mounts another app, taking its documented routes along with its handlers. */
|
|
32
32
|
route<SubPath extends string, SubEnv extends Env, SubSchema extends Schema, SubBasePath extends string>(path: SubPath, app: Hono<SubEnv, SubSchema, SubBasePath>): this;
|
|
33
33
|
/** Builds the document for everything registered so far. */
|
|
@@ -35,7 +35,7 @@ export declare class StandardOpenAPIHono<E extends Env = Env, S extends Schema =
|
|
|
35
35
|
/** Serves the document as JSON at `path`. */
|
|
36
36
|
doc(path: string, config: DocumentConfig, generatorConfig?: GeneratorOptions): this;
|
|
37
37
|
/** The nearest hook, preferring this app's own and falling back to the app it is mounted under. */
|
|
38
|
-
getDefaultHook(visited?: Set<StandardOpenAPIHonoParent<E>>): Hook<unknown, E, string
|
|
38
|
+
getDefaultHook(visited?: Set<StandardOpenAPIHonoParent<E>>): Hook<unknown, E, string> | undefined;
|
|
39
39
|
}
|
|
40
40
|
/**
|
|
41
41
|
* The documenting app type behind a plain Hono type.
|
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,IAAI,EAA0B,KAAK,MAAM,EAA0B,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/app.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
+
import { sValidator } from '@hono/standard-validator';
|
|
1
2
|
import { Hono } from 'hono';
|
|
2
3
|
import { mergePath } from 'hono/utils/url';
|
|
3
4
|
import { OpenAPIGenerator } from './generator.js';
|
|
4
|
-
import { ComponentCollector, convertSchema } from './json-schema.js';
|
|
5
5
|
import { OpenAPIRegistry } from './registry.js';
|
|
6
6
|
import { isStandardJSONSchema } from './standard-schema.js';
|
|
7
7
|
import { PARAMETER_SOURCES } from './types.js';
|
|
8
|
-
import { standardValidator } from './validator.js';
|
|
9
8
|
const JSON_CONTENT_TYPE = /^application\/([a-z\-.]+\+)?json/;
|
|
10
9
|
const FORM_CONTENT_TYPES = ['multipart/form-data', 'application/x-www-form-urlencoded'];
|
|
11
10
|
/**
|
|
@@ -77,7 +76,7 @@ export class StandardOpenAPIHono extends Hono {
|
|
|
77
76
|
const schema = request[key];
|
|
78
77
|
if (schema == null)
|
|
79
78
|
continue;
|
|
80
|
-
validators.push(
|
|
79
|
+
validators.push(sValidator(target, schema, hook));
|
|
81
80
|
}
|
|
82
81
|
const body = request.body;
|
|
83
82
|
if (body != null)
|
|
@@ -104,7 +103,7 @@ function buildBodyValidators(content, required, hook) {
|
|
|
104
103
|
: undefined;
|
|
105
104
|
if (target == null)
|
|
106
105
|
continue;
|
|
107
|
-
const validator =
|
|
106
|
+
const validator = sValidator(target, schema, hook);
|
|
108
107
|
validators.push(required ? validator : skipWhenBodyAbsent(validator, mediaType, target));
|
|
109
108
|
}
|
|
110
109
|
return validators;
|
|
@@ -126,24 +125,6 @@ function skipWhenBodyAbsent(validator, mediaType, target) {
|
|
|
126
125
|
return undefined;
|
|
127
126
|
};
|
|
128
127
|
}
|
|
129
|
-
/** The property names a schema describes, used to match header names case-insensitively. */
|
|
130
|
-
function propertyNamesOf(schema) {
|
|
131
|
-
try {
|
|
132
|
-
const converted = convertSchema(schema, {
|
|
133
|
-
components: new ComponentCollector(),
|
|
134
|
-
hoistRoot: false,
|
|
135
|
-
io: 'input',
|
|
136
|
-
target: 'draft-2020-12',
|
|
137
|
-
});
|
|
138
|
-
const properties = converted.properties;
|
|
139
|
-
if (typeof properties !== 'object' || properties == null)
|
|
140
|
-
return [];
|
|
141
|
-
return Object.keys(properties);
|
|
142
|
-
}
|
|
143
|
-
catch {
|
|
144
|
-
return [];
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
128
|
function normalizeMiddleware(middleware) {
|
|
148
129
|
if (middleware == null)
|
|
149
130
|
return [];
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,IAAI,EAA+D,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAY,IAAI,EAA+D,MAAM,MAAM,CAAC;AAEnG,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,OAAO,EAA8C,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EAAsB,iBAAiB,EAAqB,MAAM,YAAY,CAAC;AActF,MAAM,iBAAiB,GAAG,kCAAkC,CAAC;AAE7D,MAAM,kBAAkB,GAAG,CAAC,qBAAqB,EAAE,mCAAmC,CAAC,CAAC;AAExF;;;;;GAKG;AACH,MAAM,OAAO,mBAIX,SAAQ,IAAoB;IACnB,eAAe,CAAkB;IACjC,WAAW,CAA+C;IACnE,UAAU,CAA4C;IAEtD,YAAY,IAAkB;QAC5B,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC7C,IAAI,CAAC,WAAW,GAAG,IAAI,EAAE,WAAW,CAAC;IACvC,CAAC;IAED,2FAA2F;IAC3F,OAAO,CAA2B,KAAQ,EAAE,OAA2B,EAAE,IAA+B;QACtG,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,GAAG,KAAK,CAAC;QAClD,IAAI,IAAI,KAAK,IAAI;YAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAEjE,MAAM,aAAa,GAA6B,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5D,MAAM,QAAQ,GAAG,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAE/C,OAAO,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1C,KAAK,MAAM,iBAAiB,IAAI,mBAAmB,CAAI,UAAU,CAAC;YAAE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;QAC/G,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC;YAAE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAChH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAEjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gFAAgF;IAChF,KAAK,CACH,IAAa,EACb,GAAyC;QAEzC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAEvB,IAAI,GAAG,YAAY,mBAAmB,EAAE,CAAC;YACvC,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC;YACxB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACpD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;QAC9F,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4DAA4D;IAC5D,kBAAkB,CAAC,MAAsB,EAAE,eAAe,GAAqB,EAAE;QAC/E,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC9F,CAAC;IAED,6CAA6C;IAC7C,GAAG,CAAC,IAAY,EAAE,MAAsB,EAAE,eAAe,GAAqB,EAAE;QAC9E,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;QAE9E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mGAAmG;IACnG,cAAc,CAAC,OAAO,GAAsC,IAAI,GAAG,EAAE;QACnE,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC;QACtD,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QAExC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,gBAAgB,CAAC,OAAiC,EAAE,IAA8B;QAChF,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO,EAAE,CAAC;QAE/B,MAAM,UAAU,GAAyB,EAAE,CAAC;QAC5C,KAAK,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,MAAM,IAAI,IAAI;gBAAE,SAAS;YAE7B,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,IAAI,IAAI,IAAI,IAAI;YAAE,UAAU,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAEtG,OAAO,UAAU,CAAC;IACpB,CAAC;CACF;AAED,MAAM,eAAe,GAAG;IACtB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;IACjC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;IAClC,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE;IACpC,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE;CACsD,CAAC;AAE7F,SAAS,mBAAmB,CAC1B,OAAsB,EACtB,QAAiB,EACjB,IAA8B;IAE9B,MAAM,UAAU,GAAyB,EAAE,CAAC;IAE5C,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACzD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;YAAE,SAAS;QAE5C,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC;YAC9C,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACnE,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,SAAS,CAAC;QAChB,IAAI,MAAM,IAAI,IAAI;YAAE,SAAS;QAE7B,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACnD,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CACzB,SAA6B,EAC7B,SAAiB,EACjB,MAAuB;IAEvB,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACjD,IAAI,WAAW,IAAI,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;YAChF,OAAO,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAEnC,MAAM,IAAI,EAAE,CAAC;QAEb,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAgB,UAAwC;IAClF,IAAI,UAAU,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAClC,IAAI,OAAO,UAAU,KAAK,UAAU;QAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAE1D,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC;AAWD,yEAAyE;AACzE,MAAM,UAAU,CAAC,CACf,GAAyB;IAEzB,IAAI,CAAC,CAAC,GAAG,YAAY,mBAAmB,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,SAAS,CAAC,kEAAkE,CAAC,CAAC;IAC1F,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
export { $,
|
|
2
|
-
export {
|
|
3
|
-
export { type DocumentConfig, type GeneratorOptions, OpenAPIGenerator, type OpenAPIVersion } from './generator.ts';
|
|
4
|
-
export { ComponentCollector, type ConvertOptions, type JSONSchemaTarget, type NormalizationOptions, convertSchema, } from './json-schema.ts';
|
|
5
|
-
export { type ComponentType, type OpenAPIDefinition, OpenAPIRegistry } from './registry.ts';
|
|
6
|
-
export { type RouteConfig, createRoute, toRoutingPath } from './route.ts';
|
|
7
|
-
export { type JSONSchema, type SchemaIO, type StandardSchema, isStandardJSONSchema, isStandardSchema, } from './standard-schema.ts';
|
|
8
|
-
export { type ComputeInput, type ConvertPathType, type RouteConfigToTypedResponse, type RouteHandler, type RouteHandlerResponse, } from './type-inference.ts';
|
|
9
|
-
export type { ContentObject, MediaTypeObject, ParameterLocation, ReferenceObject, RequestBody, ResponseConfig, RouteConfigBase, RouteMethod, RouteRequest, SchemaObject, SchemaOrReference, } from './types.ts';
|
|
10
|
-
export { type Hook, type ValidationResult, standardValidator } from './validator.ts';
|
|
1
|
+
export { $, StandardOpenAPIHono } from './app.ts';
|
|
2
|
+
export { createRoute } from './route.ts';
|
|
11
3
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,3 @@
|
|
|
1
1
|
export { $, StandardOpenAPIHono } from './app.js';
|
|
2
|
-
export {
|
|
3
|
-
export { OpenAPIGenerator } from './generator.js';
|
|
4
|
-
export { ComponentCollector, convertSchema, } from './json-schema.js';
|
|
5
|
-
export { OpenAPIRegistry } from './registry.js';
|
|
6
|
-
export { createRoute, toRoutingPath } from './route.js';
|
|
7
|
-
export { isStandardJSONSchema, isStandardSchema, } from './standard-schema.js';
|
|
8
|
-
export {} from './type-inference.js';
|
|
9
|
-
export { standardValidator } from './validator.js';
|
|
2
|
+
export { createRoute } from './route.js';
|
|
10
3
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kamaalio/hono-standard-openapi",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.8",
|
|
4
4
|
"description": "Generate OpenAPI documents from any Standard Schema library, for Hono.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"hono",
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
"type-check": "tsc --noEmit"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
+
"@hono/standard-validator": "^0.4.0",
|
|
46
47
|
"openapi3-ts": "^4.5.0"
|
|
47
48
|
},
|
|
48
49
|
"devDependencies": {
|
package/dist/validator.d.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
2
|
-
import type { Context, Env, MiddlewareHandler, ValidationTargets } from 'hono';
|
|
3
|
-
/** What a validation attempt produced, handed to a hook before the handler runs. */
|
|
4
|
-
export type ValidationResult<T> = {
|
|
5
|
-
readonly target: keyof ValidationTargets;
|
|
6
|
-
readonly success: true;
|
|
7
|
-
readonly data: T;
|
|
8
|
-
} | {
|
|
9
|
-
readonly target: keyof ValidationTargets;
|
|
10
|
-
readonly success: false;
|
|
11
|
-
readonly data: unknown;
|
|
12
|
-
readonly error: {
|
|
13
|
-
readonly issues: readonly StandardSchemaV1.Issue[];
|
|
14
|
-
};
|
|
15
|
-
};
|
|
16
|
-
/**
|
|
17
|
-
* Runs before the handler, once per validated part of the request.
|
|
18
|
-
*
|
|
19
|
-
* Returning a `Response` (or throwing) takes over the request; returning nothing lets it continue,
|
|
20
|
-
* which is how a hook can log a failure without changing the outcome.
|
|
21
|
-
*/
|
|
22
|
-
export type Hook<T, E extends Env, P extends string, R> = {
|
|
23
|
-
bivarianceHack(result: ValidationResult<T>, c: Context<E, P>): R | undefined;
|
|
24
|
-
}['bivarianceHack'];
|
|
25
|
-
/**
|
|
26
|
-
* Validates one part of a request against a Standard Schema.
|
|
27
|
-
*
|
|
28
|
-
* Header names are matched case-insensitively against the schema's own property names, because HTTP
|
|
29
|
-
* header casing is not something a caller should have to get right.
|
|
30
|
-
*/
|
|
31
|
-
export declare function standardValidator<E extends Env, P extends string>(target: keyof ValidationTargets, schema: StandardSchemaV1, propertyNames: readonly string[], hook?: Hook<unknown, E, P, unknown>): MiddlewareHandler<E, P>;
|
|
32
|
-
//# sourceMappingURL=validator.d.ts.map
|
package/dist/validator.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAG/E,oFAAoF;AACpF,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAC1B;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,iBAAiB,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GACtF;IACE,QAAQ,CAAC,MAAM,EAAE,MAAM,iBAAiB,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,gBAAgB,CAAC,KAAK,EAAE,CAAA;KAAE,CAAC;CACxE,CAAC;AAEN;;;;;GAKG;AACH,MAAM,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI;IACxD,cAAc,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;CAC9E,CAAC,gBAAgB,CAAC,CAAC;AAEpB;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,MAAM,EAC/D,MAAM,EAAE,MAAM,iBAAiB,EAC/B,MAAM,EAAE,gBAAgB,EACxB,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,GAClC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAkBzB"}
|
package/dist/validator.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { validator } from 'hono/validator';
|
|
2
|
-
/**
|
|
3
|
-
* Validates one part of a request against a Standard Schema.
|
|
4
|
-
*
|
|
5
|
-
* Header names are matched case-insensitively against the schema's own property names, because HTTP
|
|
6
|
-
* header casing is not something a caller should have to get right.
|
|
7
|
-
*/
|
|
8
|
-
export function standardValidator(target, schema, propertyNames, hook) {
|
|
9
|
-
return validator(target, async (value, c) => {
|
|
10
|
-
const candidate = target === 'header' ? withSchemaCasing(value, propertyNames) : value;
|
|
11
|
-
const result = await schema['~standard'].validate(candidate);
|
|
12
|
-
if (result.issues == null) {
|
|
13
|
-
const hooked = hook?.({ data: result.value, success: true, target }, c);
|
|
14
|
-
if (hooked instanceof Response)
|
|
15
|
-
return hooked;
|
|
16
|
-
return result.value;
|
|
17
|
-
}
|
|
18
|
-
const failure = { data: candidate, error: { issues: result.issues }, success: false, target };
|
|
19
|
-
const hooked = hook?.(failure, c);
|
|
20
|
-
if (hooked instanceof Response)
|
|
21
|
-
return hooked;
|
|
22
|
-
return c.json({ error: { issues: result.issues }, success: false }, 400);
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
function withSchemaCasing(value, propertyNames) {
|
|
26
|
-
if (typeof value !== 'object' || value == null || propertyNames.length === 0)
|
|
27
|
-
return value;
|
|
28
|
-
const casingByLowercased = new Map(propertyNames.map(name => [name.toLowerCase(), name]));
|
|
29
|
-
return Object.fromEntries(Object.entries(value).map(([key, entry]) => [casingByLowercased.get(key.toLowerCase()) ?? key, entry]));
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=validator.js.map
|
package/dist/validator.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAsB3C;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAA+B,EAC/B,MAAwB,EACxB,aAAgC,EAChC,IAAmC;IAEnC,OAAO,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1C,MAAM,SAAS,GAAG,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACvF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAE7D,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;YACxE,IAAI,MAAM,YAAY,QAAQ;gBAAE,OAAO,MAAM,CAAC;YAE9C,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC;QAED,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAW,CAAC;QACvG,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAClC,IAAI,MAAM,YAAY,QAAQ;YAAE,OAAO,MAAM,CAAC;QAE9C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc,EAAE,aAAgC;IACxE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,IAAI,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAE3F,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAE1F,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC,CACvG,CAAC;AACJ,CAAC"}
|