ts-procedures 1.0.0 → 1.1.1

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.
Files changed (78) hide show
  1. package/README.md +13 -3
  2. package/build/errors.d.ts +16 -0
  3. package/build/errors.js +37 -0
  4. package/build/errors.js.map +1 -0
  5. package/build/exports.d.ts +6 -0
  6. package/build/exports.js +7 -0
  7. package/build/exports.js.map +1 -0
  8. package/build/implementations/http/client/index.d.ts +1 -0
  9. package/build/implementations/http/client/index.js +2 -0
  10. package/build/implementations/http/client/index.js.map +1 -0
  11. package/build/implementations/http/express/example/factories.d.ts +97 -0
  12. package/build/implementations/http/express/example/factories.js +4 -0
  13. package/build/implementations/http/express/example/factories.js.map +1 -0
  14. package/build/implementations/http/express/example/procedures/auth.d.ts +1 -0
  15. package/build/implementations/http/express/example/procedures/auth.js +22 -0
  16. package/build/implementations/http/express/example/procedures/auth.js.map +1 -0
  17. package/build/implementations/http/express/example/procedures/users.d.ts +1 -0
  18. package/build/implementations/http/express/example/procedures/users.js +30 -0
  19. package/build/implementations/http/express/example/procedures/users.js.map +1 -0
  20. package/build/implementations/http/express/example/server.d.ts +3 -0
  21. package/build/implementations/http/express/example/server.js +49 -0
  22. package/build/implementations/http/express/example/server.js.map +1 -0
  23. package/build/implementations/http/express/example/server.test.d.ts +1 -0
  24. package/build/implementations/http/express/example/server.test.js +110 -0
  25. package/build/implementations/http/express/example/server.test.js.map +1 -0
  26. package/build/implementations/http/express/index.d.ts +34 -0
  27. package/build/implementations/http/express/index.js +75 -0
  28. package/build/implementations/http/express/index.js.map +1 -0
  29. package/build/implementations/http/express/index.test.d.ts +1 -0
  30. package/build/implementations/http/express/index.test.js +329 -0
  31. package/build/implementations/http/express/index.test.js.map +1 -0
  32. package/build/index.d.ts +71 -0
  33. package/build/index.js +80 -0
  34. package/build/index.js.map +1 -0
  35. package/build/index.test.d.ts +1 -0
  36. package/build/index.test.js +249 -0
  37. package/build/index.test.js.map +1 -0
  38. package/build/schema/compute-schema.d.ts +23 -0
  39. package/build/schema/compute-schema.js +28 -0
  40. package/build/schema/compute-schema.js.map +1 -0
  41. package/build/schema/compute-schema.test.d.ts +1 -0
  42. package/build/schema/compute-schema.test.js +107 -0
  43. package/build/schema/compute-schema.test.js.map +1 -0
  44. package/build/schema/extract-json-schema.d.ts +2 -0
  45. package/build/schema/extract-json-schema.js +12 -0
  46. package/build/schema/extract-json-schema.js.map +1 -0
  47. package/build/schema/extract-json-schema.test.d.ts +1 -0
  48. package/build/schema/extract-json-schema.test.js +23 -0
  49. package/build/schema/extract-json-schema.test.js.map +1 -0
  50. package/build/schema/parser.d.ts +21 -0
  51. package/build/schema/parser.js +71 -0
  52. package/build/schema/parser.js.map +1 -0
  53. package/build/schema/parser.test.d.ts +1 -0
  54. package/build/schema/parser.test.js +102 -0
  55. package/build/schema/parser.test.js.map +1 -0
  56. package/build/schema/resolve-schema-lib.d.ts +12 -0
  57. package/build/schema/resolve-schema-lib.js +11 -0
  58. package/build/schema/resolve-schema-lib.js.map +1 -0
  59. package/build/schema/resolve-schema-lib.test.d.ts +1 -0
  60. package/build/schema/resolve-schema-lib.test.js +17 -0
  61. package/build/schema/resolve-schema-lib.test.js.map +1 -0
  62. package/build/schema/types.d.ts +7 -0
  63. package/build/schema/types.js +2 -0
  64. package/build/schema/types.js.map +1 -0
  65. package/package.json +22 -9
  66. package/src/implementations/http/client/index.ts +0 -0
  67. package/src/implementations/http/express/README.md +351 -0
  68. package/src/implementations/http/express/example/factories.ts +25 -0
  69. package/src/implementations/http/express/example/procedures/auth.ts +24 -0
  70. package/src/implementations/http/express/example/procedures/users.ts +32 -0
  71. package/src/implementations/http/express/example/server.test.ts +133 -0
  72. package/src/implementations/http/express/example/server.ts +67 -0
  73. package/src/implementations/http/express/index.test.ts +526 -0
  74. package/src/implementations/http/express/index.ts +108 -0
  75. package/src/index.test.ts +4 -2
  76. package/src/index.ts +9 -17
  77. package/src/schema/parser.ts +5 -4
  78. package/src/schema/types.ts +0 -1
@@ -0,0 +1,249 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ import { describe, expect, test } from 'vitest';
3
+ import { Procedures } from './index.js';
4
+ import { v } from 'suretype';
5
+ import { Type } from 'typebox';
6
+ import { ProcedureError, ProcedureValidationError, } from './errors.js';
7
+ describe('Procedures', () => {
8
+ test('Procedures', () => {
9
+ const result = Procedures({
10
+ onCreate: () => {
11
+ return undefined;
12
+ },
13
+ });
14
+ expect(result).toHaveProperty('Create');
15
+ });
16
+ test('Procedures generic context & extended config', () => {
17
+ const { Create } = Procedures();
18
+ const { info } = Create('TestProcedure', {
19
+ // should not throw type errors
20
+ customProp: 'customProp',
21
+ }, async (ctx) => {
22
+ // should not throw type errors
23
+ return ctx.authToken;
24
+ });
25
+ expect(info.customProp).toEqual('customProp');
26
+ expect(info.optionalProp).toEqual(undefined);
27
+ });
28
+ test('Create Single Procedures', () => {
29
+ const { procedure: procedure1, info: info1 } = Procedures().Create('test1', {}, async () => {
30
+ return '1';
31
+ });
32
+ const { procedure: procedure2, info: info2 } = Procedures().Create('test2', {}, async () => {
33
+ return '2';
34
+ });
35
+ expect(procedure1).toBeDefined();
36
+ expect(info1).toBeDefined();
37
+ expect(procedure2).toBeDefined();
38
+ expect(info2).toBeDefined();
39
+ });
40
+ test('Procedures - Create call', () => new Promise((done) => {
41
+ let mockHttpCall;
42
+ const { Create } = Procedures({
43
+ onCreate: ({ handler }) => {
44
+ mockHttpCall = handler;
45
+ },
46
+ });
47
+ Create('Handler', {
48
+ schema: {
49
+ params: v.object({ name: v.string() }),
50
+ returnType: v.string(),
51
+ },
52
+ }, async (ctx, params) => {
53
+ expect(params).toEqual({ name: 'name' });
54
+ done();
55
+ return 'name';
56
+ });
57
+ mockHttpCall({}, { name: 'name' });
58
+ }));
59
+ test('Procedures - Create call w/ Typebox', () => new Promise((done) => {
60
+ let mockHttpCall;
61
+ const { Create } = Procedures({
62
+ onCreate: ({ handler, config, name }) => {
63
+ mockHttpCall = handler;
64
+ },
65
+ });
66
+ Create('Handler', {
67
+ schema: {
68
+ params: Type.Object({ name: Type.Optional(Type.String()) }),
69
+ returnType: Type.String(),
70
+ },
71
+ }, async (ctx, params) => {
72
+ expect(params).toEqual({ name: 'name' });
73
+ done();
74
+ return 'name';
75
+ });
76
+ mockHttpCall({}, { name: 'name' });
77
+ }));
78
+ test('Procedures - Create returns a handler to call/test the Procedure registration', async () => {
79
+ let ProcedureRegisteredCbHandler;
80
+ const { Create } = Procedures({
81
+ onCreate: (Procedure) => {
82
+ ProcedureRegisteredCbHandler = Procedure.handler;
83
+ },
84
+ });
85
+ const { NamedExportHandler, procedure, info } = Create('NamedExportHandler', {
86
+ description: 'Handler description',
87
+ schema: {
88
+ params: v.object({ number: v.number() }),
89
+ },
90
+ }, async (ctx, params) => {
91
+ return params.number;
92
+ });
93
+ expect(NamedExportHandler).toBeDefined();
94
+ expect(procedure).toBeDefined();
95
+ expect(ProcedureRegisteredCbHandler).toEqual(NamedExportHandler);
96
+ expect(ProcedureRegisteredCbHandler).toEqual(procedure);
97
+ const result = NamedExportHandler({}, { number: 1 });
98
+ expect(result).toBeDefined();
99
+ expect(result).toBeInstanceOf(Promise);
100
+ await expect(result).resolves.toEqual(1);
101
+ expect(info).toBeDefined();
102
+ expect(info).toBeInstanceOf(Object);
103
+ expect(info.schema).toHaveProperty('params');
104
+ expect(info.schema.params).toEqual({
105
+ type: 'object',
106
+ properties: { number: { type: 'number' } },
107
+ });
108
+ expect(info).toHaveProperty('description');
109
+ expect(info.description).toEqual('Handler description');
110
+ });
111
+ test('Procedures - Create params validation w/ no params provided', () => new Promise((done) => {
112
+ let mockHttpCall;
113
+ const { Create } = Procedures({
114
+ onCreate: ({ handler, config, name }) => {
115
+ mockHttpCall = (callParams) => {
116
+ if (config.validation?.params) {
117
+ const { errors } = config.validation.params(callParams);
118
+ if (errors && 'message' in errors[0]) {
119
+ expect(errors[0].message).toEqual('must be object');
120
+ done();
121
+ return;
122
+ }
123
+ }
124
+ handler(callParams, {});
125
+ };
126
+ },
127
+ });
128
+ Create('test', {
129
+ schema: {
130
+ params: v.object({}),
131
+ },
132
+ }, async () => {
133
+ done();
134
+ });
135
+ mockHttpCall();
136
+ }));
137
+ test('Procedures - Create params validation w/ missing params', async () => new Promise((done) => {
138
+ let mockHttpCall;
139
+ const { Create } = Procedures({
140
+ onCreate: async ({ handler, config, name }) => {
141
+ mockHttpCall = async (callParams) => {
142
+ if (config.validation?.params) {
143
+ const { errors } = config.validation.params(callParams);
144
+ expect(errors).toBeDefined();
145
+ expect(errors?.length).toEqual(2);
146
+ }
147
+ try {
148
+ await handler(callParams, {});
149
+ }
150
+ catch (e) {
151
+ expect(e).instanceof(ProcedureValidationError);
152
+ expect(e.errors.length).toEqual(2);
153
+ done();
154
+ }
155
+ };
156
+ },
157
+ });
158
+ Create('test', {
159
+ schema: {
160
+ params: v.object({
161
+ name: v.string().required(),
162
+ id: v.number().required(),
163
+ email: v.string(),
164
+ }),
165
+ },
166
+ }, async () => {
167
+ return;
168
+ });
169
+ mockHttpCall({});
170
+ }));
171
+ test('Procedures - Create call provides ctx to handler', () => new Promise((done) => {
172
+ let mockHttpCall;
173
+ const { Create } = Procedures({
174
+ onCreate: ({ handler }) => {
175
+ mockHttpCall = () => handler({ testCtx: 'testCtx' });
176
+ },
177
+ });
178
+ Create('test', {}, async (ctx, params) => {
179
+ expect(ctx.testCtx).toEqual('testCtx');
180
+ done();
181
+ });
182
+ mockHttpCall();
183
+ }));
184
+ test('Procedure handler can throw local ctx error and is caught', async () => {
185
+ const { Create } = Procedures();
186
+ const { TestProcedureHandlerError } = Create('TestProcedureHandlerError', {}, async (ctx) => {
187
+ throw ctx.error('Local context error');
188
+ });
189
+ try {
190
+ await TestProcedureHandlerError({}, {});
191
+ }
192
+ catch (e) {
193
+ expect(e).toBeInstanceOf(ProcedureError);
194
+ expect(e.message).toEqual('Local context error');
195
+ expect(e.procedureName).toEqual('TestProcedureHandlerError');
196
+ }
197
+ });
198
+ test('Procedures - getRegisteredProcedures', () => {
199
+ const { Create, getProcedures } = Procedures({
200
+ onCreate: () => {
201
+ return undefined;
202
+ },
203
+ });
204
+ Create('test-docs', {
205
+ schema: {
206
+ params: v.object({ name: v.string().required() }),
207
+ returnType: v.string(),
208
+ },
209
+ }, async () => {
210
+ return 'test-docs';
211
+ });
212
+ const procedures = getProcedures();
213
+ const testDocsProcedure = procedures.find(p => p.name === 'test-docs');
214
+ expect(testDocsProcedure).toBeDefined();
215
+ expect(testDocsProcedure?.config?.schema).toEqual({
216
+ params: {
217
+ type: 'object',
218
+ properties: {
219
+ name: {
220
+ type: 'string',
221
+ },
222
+ },
223
+ required: ['name'],
224
+ },
225
+ returnType: {
226
+ type: 'string',
227
+ },
228
+ });
229
+ });
230
+ test('Procedures - context() throws', async () => {
231
+ const { Create } = Procedures();
232
+ function validateAuthToken(token) {
233
+ return token === 'valid-token';
234
+ }
235
+ const { CheckIsAuthenticated } = Create('CheckIsAuthenticated', {
236
+ schema: {
237
+ returnType: v.string(),
238
+ },
239
+ }, async (ctx) => {
240
+ if (!validateAuthToken(ctx.authToken)) {
241
+ throw ctx.error('Invalid auth token');
242
+ }
243
+ return 'User authentication is valid';
244
+ });
245
+ await expect(CheckIsAuthenticated({ authToken: 'valid-token' }, {})).resolves.toEqual('User authentication is valid');
246
+ await expect(CheckIsAuthenticated({ authToken: 'not-valid-token' }, {})).rejects.toThrowError(ProcedureError);
247
+ });
248
+ });
249
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { TSchemaValidationError } from './parser.js';
2
+ import { TJSONSchema } from './types.js';
3
+ /**
4
+ * This function is used to compute the JSON schema and validation functions
5
+ * for a given schema.
6
+ *
7
+ * @param name The name of the procedure
8
+ * @param schema Procedure schema
9
+ */
10
+ export declare function computeSchema<TParamsSchemaType, TReturnTypeSchemaType>(name: string, schema?: {
11
+ params?: TParamsSchemaType;
12
+ returnType?: TReturnTypeSchemaType;
13
+ }): {
14
+ jsonSchema: {
15
+ params?: TJSONSchema;
16
+ returnType?: TJSONSchema;
17
+ };
18
+ validations: {
19
+ params?: (params?: any) => {
20
+ errors?: TSchemaValidationError[];
21
+ };
22
+ };
23
+ };
@@ -0,0 +1,28 @@
1
+ import { schemaParser } from './parser.js';
2
+ import { ProcedureRegistrationError } from '../errors.js';
3
+ /**
4
+ * This function is used to compute the JSON schema and validation functions
5
+ * for a given schema.
6
+ *
7
+ * @param name The name of the procedure
8
+ * @param schema Procedure schema
9
+ */
10
+ export function computeSchema(name, schema) {
11
+ const jsonSchema = {
12
+ params: undefined,
13
+ returnType: undefined,
14
+ };
15
+ const validations = {};
16
+ if (schema) {
17
+ const { jsonSchema: { params, returnType }, validation, } = schemaParser(schema, (errors) => {
18
+ throw new ProcedureRegistrationError(name, `Error parsing schema for ${name} - ${Object.entries(errors)
19
+ .map(([key, error]) => `${key}: ${error}`)
20
+ .join(', ')}`);
21
+ });
22
+ jsonSchema.params = params;
23
+ jsonSchema.returnType = returnType;
24
+ validations.params = validation.params;
25
+ }
26
+ return { jsonSchema, validations };
27
+ }
28
+ //# sourceMappingURL=compute-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-schema.js","sourceRoot":"","sources":["../../src/schema/compute-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA0B,MAAM,aAAa,CAAA;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AAGzD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,MAGC;IAUD,MAAM,UAAU,GAAuD;QACrE,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,SAAS;KACtB,CAAA;IAED,MAAM,WAAW,GAEb,EAAE,CAAA;IAEN,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,EACJ,UAAU,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAClC,UAAU,GACX,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;YAClC,MAAM,IAAI,0BAA0B,CAClC,IAAI,EACJ,4BAA4B,IAAI,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;iBACzD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,KAAK,EAAE,CAAC;iBACzC,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,UAAU,CAAC,MAAM,GAAG,MAAM,CAAA;QAC1B,UAAU,CAAC,UAAU,GAAG,UAAU,CAAA;QAClC,WAAW,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;IACxC,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAA;AACpC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,107 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { Type } from 'typebox';
3
+ import { v } from 'suretype';
4
+ import { computeSchema } from './compute-schema.js';
5
+ import { ProcedureRegistrationError } from '../errors.js';
6
+ describe('computeSchema', () => {
7
+ it('should return empty schema and validations when no schema provided', () => {
8
+ const result = computeSchema('test-procedure');
9
+ expect(result).toEqual({
10
+ jsonSchema: { params: undefined, returnType: undefined },
11
+ validations: {}
12
+ });
13
+ });
14
+ describe('with Typebox schema', () => {
15
+ it('should correctly process params schema', () => {
16
+ const schema = {
17
+ params: Type.Object({
18
+ name: Type.String(),
19
+ age: Type.Number()
20
+ })
21
+ };
22
+ const result = computeSchema('test-procedure', schema);
23
+ expect(result.jsonSchema.params).toBeDefined();
24
+ expect(result.validations.params).toBeDefined();
25
+ // Test validation function
26
+ const validInput = { name: 'John', age: 30 };
27
+ expect(result.validations.params?.(validInput).errors).toBeUndefined();
28
+ // Test invalid input
29
+ const invalidInput = { name: 123, age: 'invalid' };
30
+ expect(result.validations.params?.(invalidInput).errors).toBeDefined();
31
+ });
32
+ it('should correctly process returnType schema', () => {
33
+ const schema = {
34
+ returnType: Type.Object({
35
+ result: Type.Boolean()
36
+ })
37
+ };
38
+ const result = computeSchema('test-procedure', schema);
39
+ expect(result.jsonSchema.returnType).toBeDefined();
40
+ expect(result.validations.params).toBeUndefined();
41
+ });
42
+ });
43
+ describe('with Suretype schema', () => {
44
+ it('should correctly process params schema', () => {
45
+ const schema = {
46
+ params: v.object({
47
+ name: v.string(),
48
+ age: v.number()
49
+ })
50
+ };
51
+ const result = computeSchema('test-procedure', schema);
52
+ expect(result.jsonSchema.params).toBeDefined();
53
+ expect(result.validations.params).toBeDefined();
54
+ // Test validation function
55
+ const validInput = { name: 'John', age: 30 };
56
+ expect(result.validations.params?.(validInput).errors).toBeUndefined();
57
+ // Test invalid input
58
+ const invalidInput = { name: 123, age: 'invalid' };
59
+ expect(result.validations.params?.(invalidInput).errors).toBeDefined();
60
+ });
61
+ });
62
+ describe('error handling', () => {
63
+ it('should throw ProcedureRegistrationError for invalid schema', () => {
64
+ const invalidSchema = {
65
+ params: {
66
+ type: 'invalid-schema-type'
67
+ }
68
+ };
69
+ expect(() => computeSchema('test-procedure', invalidSchema))
70
+ .toThrow(ProcedureRegistrationError);
71
+ });
72
+ it('should include procedure name in error message', () => {
73
+ const invalidSchema = {
74
+ params: {
75
+ type: 'invalid-schema-type'
76
+ }
77
+ };
78
+ try {
79
+ computeSchema('test-procedure', invalidSchema);
80
+ }
81
+ catch (error) {
82
+ expect(error instanceof ProcedureRegistrationError).toBe(true);
83
+ expect(error.message).toContain('test-procedure');
84
+ }
85
+ });
86
+ });
87
+ describe('combined schemas', () => {
88
+ it('should handle both params and returnType schemas', () => {
89
+ const schema = {
90
+ params: Type.Object({
91
+ input: Type.String()
92
+ }),
93
+ returnType: Type.Object({
94
+ output: Type.Boolean()
95
+ })
96
+ };
97
+ const result = computeSchema('test-procedure', schema);
98
+ expect(result.jsonSchema.params).toBeDefined();
99
+ expect(result.jsonSchema.returnType).toBeDefined();
100
+ expect(result.validations.params).toBeDefined();
101
+ // Test params validation
102
+ const validInput = { input: 'test' };
103
+ expect(result.validations.params?.(validInput).errors).toBeUndefined();
104
+ });
105
+ });
106
+ });
107
+ //# sourceMappingURL=compute-schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-schema.test.js","sourceRoot":"","sources":["../../src/schema/compute-schema.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { TJSONSchema } from './types.js';
2
+ export declare function extractJsonSchema(libSchema: unknown): TJSONSchema | undefined;
@@ -0,0 +1,12 @@
1
+ import { extractSingleJsonSchema } from 'suretype';
2
+ import { isSuretypeSchema, isTypeboxSchema } from './resolve-schema-lib.js';
3
+ export function extractJsonSchema(libSchema) {
4
+ if (isTypeboxSchema(libSchema)) {
5
+ return libSchema;
6
+ }
7
+ if (isSuretypeSchema(libSchema)) {
8
+ return extractSingleJsonSchema(libSchema)?.schema;
9
+ }
10
+ return undefined;
11
+ }
12
+ //# sourceMappingURL=extract-json-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-json-schema.js","sourceRoot":"","sources":["../../src/schema/extract-json-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAG3E,MAAM,UAAU,iBAAiB,CAAC,SAAkB;IAClD,IAAI,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,uBAAuB,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IACnD,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ import { describe, expect, test } from 'vitest';
2
+ import { Type } from 'typebox';
3
+ import { v } from 'suretype';
4
+ import { extractJsonSchema } from './extract-json-schema.js';
5
+ describe('extractJsonSchema()', () => {
6
+ const typebox = Type.Object({ name: Type.String() });
7
+ const suretype = v.object({ name: v.string().required() });
8
+ test('it extracts TypeBox json-schema', async () => {
9
+ expect(extractJsonSchema(typebox)).toMatchObject({
10
+ type: 'object',
11
+ properties: { name: { type: 'string' } },
12
+ required: ['name'],
13
+ });
14
+ });
15
+ test('it extracts Suretype json-schema', async () => {
16
+ expect(extractJsonSchema(suretype)).toMatchObject({
17
+ type: 'object',
18
+ properties: { name: { type: 'string' } },
19
+ required: ['name'],
20
+ });
21
+ });
22
+ });
23
+ //# sourceMappingURL=extract-json-schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-json-schema.test.js","sourceRoot":"","sources":["../../src/schema/extract-json-schema.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAC9B,OAAO,EAAE,CAAC,EAAE,MAAM,UAAU,CAAA;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5D,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACpD,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IAE1D,IAAI,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;YAC/C,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YACxC,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC;YAChD,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YACxC,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,21 @@
1
+ import * as AJV from 'ajv';
2
+ import { TJSONSchema } from './types.js';
3
+ export type TSchemaParsed = {
4
+ jsonSchema: {
5
+ params?: TJSONSchema;
6
+ returnType?: TJSONSchema;
7
+ };
8
+ validation: {
9
+ params?: (params: any) => {
10
+ errors?: TSchemaValidationError[];
11
+ };
12
+ };
13
+ };
14
+ export type TSchemaValidationError = AJV.ErrorObject;
15
+ export declare function schemaParser(schema: {
16
+ params?: unknown;
17
+ returnType?: unknown;
18
+ }, onParseError: (errors: {
19
+ params?: string;
20
+ returnType?: string;
21
+ }) => void): TSchemaParsed;
@@ -0,0 +1,71 @@
1
+ import { default as addFormats } from 'ajv-formats';
2
+ import * as AJV from 'ajv';
3
+ import { extractJsonSchema } from './extract-json-schema.js';
4
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
5
+ // @ts-expect-error
6
+ const ajv = addFormats(new AJV.Ajv({
7
+ allErrors: true,
8
+ coerceTypes: true,
9
+ removeAdditional: true,
10
+ }));
11
+ export function schemaParser(schema, onParseError) {
12
+ const jsonSchema = {};
13
+ const validation = {};
14
+ if (schema.params) {
15
+ try {
16
+ const extracted = extractJsonSchema(schema.params);
17
+ if (extracted) {
18
+ jsonSchema.params = extracted;
19
+ }
20
+ }
21
+ catch (e) {
22
+ onParseError({
23
+ params: `Error extracting json schema schema.params - ${e.message}`,
24
+ });
25
+ }
26
+ if (!jsonSchema.params) {
27
+ onParseError({
28
+ params: `Error extracting json schema schema.params - schema.params might be empty or it is not a valid suretype or typebox type`,
29
+ });
30
+ }
31
+ else {
32
+ let paramsValidator;
33
+ try {
34
+ paramsValidator = ajv.compile(jsonSchema.params);
35
+ }
36
+ catch (e) {
37
+ onParseError({
38
+ params: `Error compiling schema.params for validator - ${e.message}`,
39
+ });
40
+ }
41
+ validation.params = (params) => {
42
+ const valid = paramsValidator(params);
43
+ if (!valid) {
44
+ const errors = paramsValidator.errors;
45
+ return {
46
+ errors: errors?.length ? errors : undefined,
47
+ };
48
+ }
49
+ return {};
50
+ };
51
+ }
52
+ }
53
+ if (schema.returnType) {
54
+ try {
55
+ const extracted = extractJsonSchema(schema.returnType);
56
+ jsonSchema.returnType = extracted;
57
+ }
58
+ catch (e) {
59
+ onParseError({
60
+ returnType: `Error extracting json schema schema.returnType - ${e.message}`,
61
+ });
62
+ }
63
+ if (!jsonSchema.returnType) {
64
+ onParseError({
65
+ returnType: `Error extracting json schema schema.returnType - schema.returnType might be empty or it is not a valid suretype or typebox type`,
66
+ });
67
+ }
68
+ }
69
+ return { jsonSchema, validation };
70
+ }
71
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/schema/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,KAAK,GAAG,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAU5D,6DAA6D;AAC7D,mBAAmB;AACnB,MAAM,GAAG,GAAG,UAAU,CACpB,IAAI,GAAG,CAAC,GAAG,CAAC;IACV,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,IAAI;IACjB,gBAAgB,EAAE,IAAI;CACvB,CAAC,CACH,CAAA;AAED,MAAM,UAAU,YAAY,CAC1B,MAAkD,EAClD,YAAwE;IAExE,MAAM,UAAU,GAAgC,EAAE,CAAA;IAClD,MAAM,UAAU,GAAgC,EAAE,CAAA;IAElD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,MAAqB,CAAC,CAAA;YAEjE,IAAI,SAAS,EAAE,CAAC;gBACd,UAAU,CAAC,MAAM,GAAG,SAAS,CAAA;YAC/B,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,YAAY,CAAC;gBACX,MAAM,EAAE,gDAAgD,CAAC,CAAC,OAAO,EAAE;aACpE,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACvB,YAAY,CAAC;gBACX,MAAM,EAAE,yHAAyH;aAClI,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,eAAqC,CAAA;YAEzC,IAAI,CAAC;gBACH,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,MAAqB,CAAC,CAAA;YACjE,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,YAAY,CAAC;oBACX,MAAM,EAAE,iDAAiD,CAAC,CAAC,OAAO,EAAE;iBACrE,CAAC,CAAA;YACJ,CAAC;YAED,UAAU,CAAC,MAAM,GAAG,CAAC,MAAW,EAAE,EAAE;gBAClC,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;gBAErC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAA;oBAErC,OAAO;wBACL,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;qBAC5C,CAAA;gBACH,CAAC;gBAED,OAAO,EAAE,CAAA;YACX,CAAC,CAAA;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,UAAyB,CAAC,CAAA;YAErE,UAAU,CAAC,UAAU,GAAG,SAAS,CAAA;QACnC,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,YAAY,CAAC;gBACX,UAAU,EAAE,oDAAoD,CAAC,CAAC,OAAO,EAAE;aAC5E,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YAC3B,YAAY,CAAC;gBACX,UAAU,EAAE,iIAAiI;aAC9I,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAA;AACnC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};