@kontract/adonis 0.1.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.
- package/README.md +507 -0
- package/dist/adapters/controller-registrar.d.ts +313 -0
- package/dist/adapters/controller-registrar.d.ts.map +1 -0
- package/dist/adapters/controller-registrar.js +324 -0
- package/dist/adapters/controller-registrar.js.map +1 -0
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +2 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/route-registrar.d.ts +53 -0
- package/dist/adapters/route-registrar.d.ts.map +1 -0
- package/dist/adapters/route-registrar.js +139 -0
- package/dist/adapters/route-registrar.js.map +1 -0
- package/dist/adapters/router.d.ts +37 -0
- package/dist/adapters/router.d.ts.map +1 -0
- package/dist/adapters/router.js +129 -0
- package/dist/adapters/router.js.map +1 -0
- package/dist/builder/index.d.ts +2 -0
- package/dist/builder/index.d.ts.map +1 -0
- package/dist/builder/index.js +3 -0
- package/dist/builder/index.js.map +1 -0
- package/dist/builder/openapi-builder.d.ts +100 -0
- package/dist/builder/openapi-builder.d.ts.map +1 -0
- package/dist/builder/openapi-builder.js +388 -0
- package/dist/builder/openapi-builder.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/serializers/index.d.ts +2 -0
- package/dist/serializers/index.d.ts.map +1 -0
- package/dist/serializers/index.js +2 -0
- package/dist/serializers/index.js.map +1 -0
- package/dist/serializers/lucid.d.ts +100 -0
- package/dist/serializers/lucid.d.ts.map +1 -0
- package/dist/serializers/lucid.js +114 -0
- package/dist/serializers/lucid.js.map +1 -0
- package/dist/validation/ajv.d.ts +42 -0
- package/dist/validation/ajv.d.ts.map +1 -0
- package/dist/validation/ajv.js +170 -0
- package/dist/validation/ajv.js.map +1 -0
- package/dist/validation/index.d.ts +2 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +3 -0
- package/dist/validation/index.js.map +1 -0
- package/package.json +96 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/* cspell:words paginators */
|
|
2
|
+
/**
|
|
3
|
+
* Check if a value is a Lucid model (has serialize method).
|
|
4
|
+
*/
|
|
5
|
+
export function isLucidModel(value) {
|
|
6
|
+
return (value !== null
|
|
7
|
+
&& typeof value === 'object'
|
|
8
|
+
&& 'serialize' in value
|
|
9
|
+
&& typeof value.serialize === 'function');
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Check if a value is a TypedModel (has toResponse method).
|
|
13
|
+
*/
|
|
14
|
+
export function isTypedModel(value) {
|
|
15
|
+
return (value !== null
|
|
16
|
+
&& typeof value === 'object'
|
|
17
|
+
&& 'toResponse' in value
|
|
18
|
+
&& typeof value.toResponse === 'function');
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Check if a value is a Lucid paginator.
|
|
22
|
+
*/
|
|
23
|
+
export function isPaginator(value) {
|
|
24
|
+
return (value !== null
|
|
25
|
+
&& typeof value === 'object'
|
|
26
|
+
&& 'total' in value
|
|
27
|
+
&& 'currentPage' in value
|
|
28
|
+
&& 'perPage' in value
|
|
29
|
+
&& 'all' in value
|
|
30
|
+
&& typeof value.all === 'function');
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Serializer for TypedModel instances.
|
|
34
|
+
* Calls toResponse() to get the API response format.
|
|
35
|
+
*/
|
|
36
|
+
export function serializeTypedModel(model) {
|
|
37
|
+
return model.toResponse();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Serializer for generic Lucid models.
|
|
41
|
+
* Calls serialize() to get the model data.
|
|
42
|
+
*/
|
|
43
|
+
export function serializeLucidModel(model) {
|
|
44
|
+
return model.serialize();
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Serializer for Lucid paginators.
|
|
48
|
+
* Converts to standard paginated response format.
|
|
49
|
+
*/
|
|
50
|
+
export function serializePaginator(paginator) {
|
|
51
|
+
const items = paginator.all();
|
|
52
|
+
const data = items.map((model) => {
|
|
53
|
+
if (isTypedModel(model)) {
|
|
54
|
+
return model.toResponse();
|
|
55
|
+
}
|
|
56
|
+
if (isLucidModel(model)) {
|
|
57
|
+
return model.serialize();
|
|
58
|
+
}
|
|
59
|
+
return model;
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
data,
|
|
63
|
+
meta: {
|
|
64
|
+
total: paginator.total,
|
|
65
|
+
perPage: paginator.perPage,
|
|
66
|
+
currentPage: paginator.currentPage,
|
|
67
|
+
lastPage: paginator.lastPage,
|
|
68
|
+
firstPage: paginator.firstPage,
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Check if a value has a serialize() method (like VersionRecord).
|
|
74
|
+
*/
|
|
75
|
+
export function hasSerialize(value) {
|
|
76
|
+
return (value !== null
|
|
77
|
+
&& typeof value === 'object'
|
|
78
|
+
&& 'serialize' in value
|
|
79
|
+
&& typeof value.serialize === 'function');
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Serializer registration objects for use with defineConfig().
|
|
83
|
+
*/
|
|
84
|
+
export const typedModelSerializer = {
|
|
85
|
+
check: isTypedModel,
|
|
86
|
+
serialize: serializeTypedModel,
|
|
87
|
+
priority: 100,
|
|
88
|
+
};
|
|
89
|
+
export const lucidModelSerializer = {
|
|
90
|
+
check: isLucidModel,
|
|
91
|
+
serialize: serializeLucidModel,
|
|
92
|
+
priority: 50,
|
|
93
|
+
};
|
|
94
|
+
export const paginatorSerializer = {
|
|
95
|
+
check: isPaginator,
|
|
96
|
+
serialize: serializePaginator,
|
|
97
|
+
priority: 150,
|
|
98
|
+
};
|
|
99
|
+
export const serializableSerializer = {
|
|
100
|
+
check: hasSerialize,
|
|
101
|
+
serialize: (obj) => obj.serialize(),
|
|
102
|
+
priority: 25,
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* All Lucid-related serializers.
|
|
106
|
+
* Register these with defineConfig() to enable automatic model serialization.
|
|
107
|
+
*/
|
|
108
|
+
export const lucidSerializers = [
|
|
109
|
+
paginatorSerializer,
|
|
110
|
+
typedModelSerializer,
|
|
111
|
+
lucidModelSerializer,
|
|
112
|
+
serializableSerializer,
|
|
113
|
+
];
|
|
114
|
+
//# sourceMappingURL=lucid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lucid.js","sourceRoot":"","sources":["../../src/serializers/lucid.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { TSchema, Static } from '@sinclair/typebox';
|
|
2
|
+
import { type Validator, type ValidatorOptions, type ValidationErrorDetail } from 'kontract';
|
|
3
|
+
/**
|
|
4
|
+
* Options for creating the AJV validator.
|
|
5
|
+
*/
|
|
6
|
+
export interface AjvValidatorOptions extends ValidatorOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Additional AJV options.
|
|
9
|
+
*/
|
|
10
|
+
ajvOptions?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Create an AJV-based validator.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createAjvValidator(options?: AjvValidatorOptions): Validator;
|
|
16
|
+
export declare function validate<T extends TSchema>(schema: T, data: unknown): Static<T>;
|
|
17
|
+
/**
|
|
18
|
+
* Validation error class for AJV errors.
|
|
19
|
+
*/
|
|
20
|
+
export declare class AjvValidationError extends Error {
|
|
21
|
+
readonly errors: ValidationErrorDetail[];
|
|
22
|
+
readonly status = 422;
|
|
23
|
+
readonly code = "E_VALIDATION_ERROR";
|
|
24
|
+
constructor(errors: ValidationErrorDetail[]);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Strip $id from nested schemas to prevent AJV conflicts.
|
|
28
|
+
*
|
|
29
|
+
* When a schema with $id is used multiple times in a parent schema,
|
|
30
|
+
* AJV sees each instance as a separate schema definition with the
|
|
31
|
+
* same $id, causing conflicts.
|
|
32
|
+
*/
|
|
33
|
+
export declare function stripNestedIds<T extends TSchema>(schema: T, isRoot?: boolean): T;
|
|
34
|
+
/**
|
|
35
|
+
* Get the default AJV instance for advanced use cases.
|
|
36
|
+
*/
|
|
37
|
+
export declare function getDefaultValidator(): Validator;
|
|
38
|
+
/**
|
|
39
|
+
* Reset the default validator (useful for testing).
|
|
40
|
+
*/
|
|
41
|
+
export declare function resetDefaultValidator(): void;
|
|
42
|
+
//# sourceMappingURL=ajv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ajv.d.ts","sourceRoot":"","sources":["../../src/validation/ajv.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAE3B,MAAM,0BAA0B,CAAA;AAgBjC;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC3D;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,SAAS,CAoG/E;AAQD,wBAAgB,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAW/E;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,SAAgB,MAAM,EAAE,qBAAqB,EAAE,CAAA;IAC/C,SAAgB,MAAM,OAAM;IAC5B,SAAgB,IAAI,wBAAuB;gBAE/B,MAAM,EAAE,qBAAqB,EAAE;CAK5C;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,UAAO,GAAG,CAAC,CAyB7E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,SAAS,CAK/C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import Ajv from 'ajv';
|
|
2
|
+
import addFormats from 'ajv-formats';
|
|
3
|
+
import { RequestValidationError, } from '@blog/openapi-decorators';
|
|
4
|
+
// Handle ESM/CJS compatibility for Ajv and ajv-formats
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
6
|
+
const AjvClass = Ajv.default ?? Ajv;
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
|
+
const addFormatsFunc = addFormats.default ?? addFormats;
|
|
9
|
+
/**
|
|
10
|
+
* Create an AJV-based validator.
|
|
11
|
+
*/
|
|
12
|
+
export function createAjvValidator(options = {}) {
|
|
13
|
+
const ajv = new AjvClass({
|
|
14
|
+
allErrors: true,
|
|
15
|
+
coerceTypes: options.coerceTypes ?? true,
|
|
16
|
+
removeAdditional: options.removeAdditional ?? true,
|
|
17
|
+
useDefaults: options.useDefaults ?? true,
|
|
18
|
+
strict: false, // Disable strict mode for TypeBox compatibility
|
|
19
|
+
...options.ajvOptions,
|
|
20
|
+
});
|
|
21
|
+
// Add format validators
|
|
22
|
+
addFormatsFunc(ajv);
|
|
23
|
+
// Register custom formats
|
|
24
|
+
if (options.formats) {
|
|
25
|
+
for (const [name, fn] of Object.entries(options.formats)) {
|
|
26
|
+
ajv.addFormat(name, fn);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Cache for compiled validators
|
|
30
|
+
const validatorCache = new Map();
|
|
31
|
+
/**
|
|
32
|
+
* Get or create a compiled validator for a schema.
|
|
33
|
+
*/
|
|
34
|
+
function getCompiledValidator(schema) {
|
|
35
|
+
let validator = validatorCache.get(schema);
|
|
36
|
+
if (!validator) {
|
|
37
|
+
const schemaId = schema.$id;
|
|
38
|
+
// Check if schema is already registered with AJV
|
|
39
|
+
if (schemaId) {
|
|
40
|
+
const existing = ajv.getSchema(schemaId);
|
|
41
|
+
if (existing) {
|
|
42
|
+
validatorCache.set(schema, existing);
|
|
43
|
+
return existing;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Strip nested $id fields to prevent AJV conflicts
|
|
47
|
+
const cleanedSchema = stripNestedIds(schema);
|
|
48
|
+
validator = ajv.compile(cleanedSchema);
|
|
49
|
+
validatorCache.set(schema, validator);
|
|
50
|
+
}
|
|
51
|
+
return validator;
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
validate(schema, data) {
|
|
55
|
+
const validator = getCompiledValidator(schema);
|
|
56
|
+
const valid = validator(data);
|
|
57
|
+
if (!valid && validator.errors) {
|
|
58
|
+
return validator.errors.map((err) => ({
|
|
59
|
+
field: err.instancePath.replace(/^\//, '').replace(/\//g, '.')
|
|
60
|
+
|| err.params.missingProperty
|
|
61
|
+
|| 'unknown',
|
|
62
|
+
message: err.message || 'Validation failed',
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
return [];
|
|
66
|
+
},
|
|
67
|
+
validateOrThrow(schema, data) {
|
|
68
|
+
const errors = this.validate(schema, data);
|
|
69
|
+
if (errors.length > 0) {
|
|
70
|
+
throw new RequestValidationError(schema, data, errors, 'body');
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
compile(schema) {
|
|
74
|
+
const compiled = getCompiledValidator(schema);
|
|
75
|
+
return {
|
|
76
|
+
validate(data) {
|
|
77
|
+
const valid = compiled(data);
|
|
78
|
+
if (!valid && compiled.errors) {
|
|
79
|
+
return compiled.errors.map((err) => ({
|
|
80
|
+
field: err.instancePath.replace(/^\//, '').replace(/\//g, '.')
|
|
81
|
+
|| err.params.missingProperty
|
|
82
|
+
|| 'unknown',
|
|
83
|
+
message: err.message || 'Validation failed',
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
return [];
|
|
87
|
+
},
|
|
88
|
+
validateOrThrow(data) {
|
|
89
|
+
const errors = this.validate(data);
|
|
90
|
+
if (errors.length > 0) {
|
|
91
|
+
throw new RequestValidationError(schema, data, errors, 'body');
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Simple validate function that creates a validator on demand.
|
|
100
|
+
* For better performance, use createAjvValidator() and reuse the instance.
|
|
101
|
+
*/
|
|
102
|
+
let defaultValidator = null;
|
|
103
|
+
export function validate(schema, data) {
|
|
104
|
+
if (!defaultValidator) {
|
|
105
|
+
defaultValidator = createAjvValidator();
|
|
106
|
+
}
|
|
107
|
+
const errors = defaultValidator.validate(schema, data);
|
|
108
|
+
if (errors.length > 0) {
|
|
109
|
+
throw new AjvValidationError(errors);
|
|
110
|
+
}
|
|
111
|
+
return data;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Validation error class for AJV errors.
|
|
115
|
+
*/
|
|
116
|
+
export class AjvValidationError extends Error {
|
|
117
|
+
errors;
|
|
118
|
+
status = 422;
|
|
119
|
+
code = 'E_VALIDATION_ERROR';
|
|
120
|
+
constructor(errors) {
|
|
121
|
+
super('Validation failed');
|
|
122
|
+
this.name = 'AjvValidationError';
|
|
123
|
+
this.errors = errors;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Strip $id from nested schemas to prevent AJV conflicts.
|
|
128
|
+
*
|
|
129
|
+
* When a schema with $id is used multiple times in a parent schema,
|
|
130
|
+
* AJV sees each instance as a separate schema definition with the
|
|
131
|
+
* same $id, causing conflicts.
|
|
132
|
+
*/
|
|
133
|
+
export function stripNestedIds(schema, isRoot = true) {
|
|
134
|
+
if (typeof schema !== 'object' || schema === null) {
|
|
135
|
+
return schema;
|
|
136
|
+
}
|
|
137
|
+
if (Array.isArray(schema)) {
|
|
138
|
+
return schema.map((item) => stripNestedIds(item, false));
|
|
139
|
+
}
|
|
140
|
+
const result = {};
|
|
141
|
+
for (const [key, value] of Object.entries(schema)) {
|
|
142
|
+
// Strip $id from non-root schemas
|
|
143
|
+
if (key === '$id' && !isRoot) {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (typeof value === 'object' && value !== null) {
|
|
147
|
+
result[key] = stripNestedIds(value, false);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
result[key] = value;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get the default AJV instance for advanced use cases.
|
|
157
|
+
*/
|
|
158
|
+
export function getDefaultValidator() {
|
|
159
|
+
if (!defaultValidator) {
|
|
160
|
+
defaultValidator = createAjvValidator();
|
|
161
|
+
}
|
|
162
|
+
return defaultValidator;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Reset the default validator (useful for testing).
|
|
166
|
+
*/
|
|
167
|
+
export function resetDefaultValidator() {
|
|
168
|
+
defaultValidator = null;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=ajv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ajv.js","sourceRoot":"","sources":["../../src/validation/ajv.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { createAjvValidator, validate, stripNestedIds, getDefaultValidator, resetDefaultValidator, AjvValidationError, type AjvValidatorOptions, type Validator, type CompiledValidator, type ValidatorOptions, type ValidationErrorDetail, } from '@kontract/ajv';
|
|
2
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,GAC3B,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,OAAO,EACL,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,GAMnB,MAAM,eAAe,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kontract/adonis",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "AdonisJS adapter for kontract",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./adapters": {
|
|
14
|
+
"types": "./dist/adapters/index.d.ts",
|
|
15
|
+
"import": "./dist/adapters/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./validation": {
|
|
18
|
+
"types": "./dist/validation/index.d.ts",
|
|
19
|
+
"import": "./dist/validation/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./builder": {
|
|
22
|
+
"types": "./dist/builder/index.d.ts",
|
|
23
|
+
"import": "./dist/builder/index.js"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist",
|
|
28
|
+
"README.md"
|
|
29
|
+
],
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc",
|
|
32
|
+
"dev": "tsc --watch",
|
|
33
|
+
"typecheck": "tsc --noEmit",
|
|
34
|
+
"lint": "eslint src/",
|
|
35
|
+
"lint:fix": "eslint src/ --fix",
|
|
36
|
+
"clean": "rm -rf dist",
|
|
37
|
+
"test": "TSX_TSCONFIG_PATH=tsconfig.test.json node --import=tsx bin/test.ts",
|
|
38
|
+
"demo": "node --import=tsx demo/bin/server.ts",
|
|
39
|
+
"demo:watch": "node --watch --import=tsx demo/bin/server.ts"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@kontract/ajv": "*",
|
|
43
|
+
"kontract": "*"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@adonisjs/core": "^6.18.0",
|
|
47
|
+
"@adonisjs/lucid": "^21.6.0",
|
|
48
|
+
"@japa/api-client": "^3.0.0",
|
|
49
|
+
"@japa/assert": "^4.2.0",
|
|
50
|
+
"@japa/runner": "^4.4.0",
|
|
51
|
+
"@sinclair/typebox": "^0.34.33",
|
|
52
|
+
"@types/node": "^22.15.21",
|
|
53
|
+
"ajv": "^8.17.1",
|
|
54
|
+
"ajv-formats": "^3.0.1",
|
|
55
|
+
"tsx": "^4.19.0",
|
|
56
|
+
"typescript": "^5.8.3"
|
|
57
|
+
},
|
|
58
|
+
"peerDependencies": {
|
|
59
|
+
"@adonisjs/core": "^6.0.0",
|
|
60
|
+
"@adonisjs/lucid": "^21.0.0",
|
|
61
|
+
"@sinclair/typebox": ">=0.32.0",
|
|
62
|
+
"ajv": "^8.0.0"
|
|
63
|
+
},
|
|
64
|
+
"peerDependenciesMeta": {
|
|
65
|
+
"@adonisjs/lucid": {
|
|
66
|
+
"optional": true
|
|
67
|
+
},
|
|
68
|
+
"ajv": {
|
|
69
|
+
"optional": true
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
"engines": {
|
|
73
|
+
"node": ">=20.0.0"
|
|
74
|
+
},
|
|
75
|
+
"keywords": [
|
|
76
|
+
"adonisjs",
|
|
77
|
+
"openapi",
|
|
78
|
+
"swagger",
|
|
79
|
+
"decorators",
|
|
80
|
+
"typescript"
|
|
81
|
+
],
|
|
82
|
+
"author": "Drew Daniels",
|
|
83
|
+
"license": "MIT",
|
|
84
|
+
"repository": {
|
|
85
|
+
"type": "git",
|
|
86
|
+
"url": "https://github.com/Drew-Daniels/kontract.git",
|
|
87
|
+
"directory": "packages/kontract-adonis"
|
|
88
|
+
},
|
|
89
|
+
"homepage": "https://github.com/Drew-Daniels/kontract#readme",
|
|
90
|
+
"bugs": {
|
|
91
|
+
"url": "https://github.com/Drew-Daniels/kontract/issues"
|
|
92
|
+
},
|
|
93
|
+
"publishConfig": {
|
|
94
|
+
"access": "public"
|
|
95
|
+
}
|
|
96
|
+
}
|