@openaddresses/batch-schema 10.0.0 → 10.0.2

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
@@ -10,6 +10,14 @@
10
10
 
11
11
  ## Version History
12
12
 
13
+ ### v10.0.2
14
+
15
+ - :bug: Differentiate `main` and `types` in package.json
16
+
17
+ ### v10.0.1
18
+
19
+ - :bug: Include dist files in npm bundle
20
+
13
21
  ### v10.0.0
14
22
 
15
23
  - :rocket: Very rough support for Typescript based routes
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ import Schema from './lib/schema.js';
2
+ export default Schema;
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,iBAAiB,CAAC;AAErC,eAAe,MAAM,CAAC"}
@@ -0,0 +1,46 @@
1
+ import Err from '@openaddresses/batch-error';
2
+ import { OpenAPIV3 as Doc } from 'openapi-types';
3
+ import { Type } from '@sinclair/typebox';
4
+ export default async function router(schema) {
5
+ await schema.get('/schema', {
6
+ query: Type.Object({
7
+ method: Type.Optional(Type.Uppercase(Type.Enum(Doc.HttpMethods))),
8
+ url: Type.Optional(Type.String())
9
+ }),
10
+ res: Type.Object({}),
11
+ description: `
12
+ List all JSON Schemas in use
13
+ With no parameters this API will return a list of all the endpoints that have a form of schema validation
14
+ If the url/method params are used, the schemas themselves are returned
15
+
16
+ Note: If url or method params are used, they must be used together
17
+ `
18
+ }, async (req, res) => {
19
+ try {
20
+ if (req.query.url && req.query.method) {
21
+ res.json(schema.query(req.query.method, req.query.url));
22
+ }
23
+ else if (req.query.url || req.query.method) {
24
+ throw new Err(400, null, 'url & method params must be used together');
25
+ }
26
+ else {
27
+ return res.json(schema.list());
28
+ }
29
+ }
30
+ catch (err) {
31
+ return Err.respond(err, res);
32
+ }
33
+ });
34
+ await schema.get('/openapi', {
35
+ description: 'Return a OpenAPI Schema for the API',
36
+ res: Type.Object({})
37
+ }, async (req, res) => {
38
+ try {
39
+ return res.json(schema.docs.base);
40
+ }
41
+ catch (err) {
42
+ return Err.respond(err, res);
43
+ }
44
+ });
45
+ }
46
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,4BAA4B,CAAC;AAE7C,OAAO,EAAE,SAAS,IAAI,GAAG,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAExC,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,MAAM,CAAC,MAAc;IAC/C,MAAM,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE;QACxB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;YACf,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;YACjE,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;SACpC,CAAC;QACF,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACpB,WAAW,EAAE;;;;;;SAMZ;KACJ,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAClB,IAAI,CAAC;YACD,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACpC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5D,CAAC;iBAAM,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC3C,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,2CAA2C,CAAC,CAAC;YAC1E,CAAC;iBAAM,CAAC;gBACJ,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACnC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE;QACzB,WAAW,EAAE,qCAAqC;QAClD,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;KACvB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAClB,IAAI,CAAC;YACD,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * @class
3
+ */
4
+ export default class Docs {
5
+ base;
6
+ constructor(info) {
7
+ this.base = {
8
+ openapi: '3.0.3',
9
+ info: info || {
10
+ title: 'OpenAPI Schema',
11
+ version: '1.0.0'
12
+ },
13
+ paths: {}
14
+ };
15
+ }
16
+ push(parsed, schemas) {
17
+ const path = [];
18
+ for (let sec of parsed.path.split('/')) {
19
+ for (const lit of ['.', '-']) { // These chars are used literally and can't be part of a param name
20
+ const mini = [];
21
+ for (const s of sec.split(lit)) {
22
+ if (s[0] === ':')
23
+ mini.push(`{${s}}`);
24
+ else
25
+ mini.push(s);
26
+ }
27
+ sec = mini.join(lit);
28
+ }
29
+ path.push(sec);
30
+ }
31
+ const pathstr = path.join('/');
32
+ // @ts-ignore
33
+ if (this.base.paths[pathstr] && this.base.paths[pathstr][parsed.method])
34
+ throw new Error(`Duplicate Path: ${parsed.method}: ${parsed.path}`);
35
+ if (!schemas.private) {
36
+ if (!this.base.paths[pathstr])
37
+ this.base.paths[pathstr] = {};
38
+ const document = {
39
+ summary: schemas.description || 'No Description',
40
+ parameters: [],
41
+ tags: [schemas.group || 'Default'],
42
+ responses: {}
43
+ };
44
+ for (const key in schemas) {
45
+ if (key[0] === ':') {
46
+ if (!document.parameters)
47
+ document.parameters = [];
48
+ document.parameters.push({
49
+ in: 'path',
50
+ name: key,
51
+ schema: {
52
+ type: schemas[key]
53
+ },
54
+ required: true
55
+ });
56
+ }
57
+ }
58
+ if (schemas.query && schemas.query.type === 'object') {
59
+ for (const name in (schemas.query.properties || {})) {
60
+ const query = schemas.query.properties[name];
61
+ if (!document.parameters)
62
+ document.parameters = [];
63
+ document.parameters.push({
64
+ in: 'query',
65
+ name,
66
+ schema: query,
67
+ required: query.required || (schemas.query.required || []).includes(name),
68
+ description: query.description || 'No Description'
69
+ });
70
+ }
71
+ }
72
+ if (schemas.res) {
73
+ const response = {
74
+ description: 'Successful Response',
75
+ content: {
76
+ 'application/json': {
77
+ schema: schemas.res
78
+ }
79
+ }
80
+ };
81
+ document.responses['200'] = response;
82
+ }
83
+ else {
84
+ const response = {
85
+ description: 'Successful Response'
86
+ };
87
+ document.responses['200'] = response;
88
+ }
89
+ if (schemas.body) {
90
+ document.requestBody = {
91
+ required: true,
92
+ content: {
93
+ 'application/json': {
94
+ schema: schemas.body
95
+ }
96
+ }
97
+ };
98
+ }
99
+ // @ts-ignore
100
+ this.base.paths[pathstr][parsed.method] = document;
101
+ }
102
+ }
103
+ }
104
+ //# sourceMappingURL=openapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../lib/openapi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,237 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import morgan from 'morgan';
4
+ import bodyparser from 'body-parser';
5
+ import Err from '@openaddresses/batch-error';
6
+ import { OpenAPIV3 as Doc } from 'openapi-types';
7
+ import { TypeCompiler } from '@sinclair/typebox/compiler';
8
+ import SchemaAPI from './api.js';
9
+ import Docs from './openapi.js';
10
+ /**
11
+ * @class
12
+ *
13
+ * @param {Object} router Express Router Object
14
+ * @param {Object} opts Options Object
15
+ * @param {boolean|string} [opts.morgan=true] disable logging with false
16
+ * @param {number} [opts.limit=50] body size limit in mb
17
+ *
18
+ * @param {URL} [opts.apidoc] apidoc file location
19
+ */
20
+ export default class Schemas {
21
+ router;
22
+ docs;
23
+ schemas;
24
+ constructor(router, opts = {}) {
25
+ if (!router)
26
+ throw new Error('Router Param Required');
27
+ this.router = router;
28
+ if (opts.logging !== false)
29
+ this.router.use(morgan('combined'));
30
+ this.router.use(bodyparser.urlencoded({ extended: true }));
31
+ this.router.use(bodyparser.json({ limit: `${opts.limit || 50}mb` }));
32
+ this.docs = new Docs();
33
+ this.schemas = new Map();
34
+ }
35
+ async api() {
36
+ await SchemaAPI(this);
37
+ }
38
+ /**
39
+ * Load routes directory. All .js files in the given directory will be loaded (ES Module)
40
+ * and the default method run
41
+ *
42
+ * @param {String} dirpath Directory to load
43
+ * @param {object} config Config Object
44
+ * @param {Object} opts Options Object
45
+ * @param {boolean} opts.silent Squelch StdOut
46
+ */
47
+ async load(dirpath, config, opts = {
48
+ silent: false
49
+ }) {
50
+ if (dirpath instanceof URL)
51
+ dirpath = dirpath.pathname;
52
+ else
53
+ dirpath = String(dirpath);
54
+ const routes = [];
55
+ // Load dynamic routes directory
56
+ for (const r of fs.readdirSync(dirpath)) {
57
+ if (!opts.silent)
58
+ console.log(`ok - loaded routes/${r}`);
59
+ if (!['.ts', '.js'].includes(path.parse(r).ext))
60
+ continue;
61
+ routes.push((await import(path.resolve(dirpath, r))).default(this, config));
62
+ }
63
+ await Promise.all(routes);
64
+ this.not_found();
65
+ }
66
+ /**
67
+ * Load a blueprint into the router
68
+ *
69
+ * @param {Object} bp_class Blueprint Class with blueprint() fn
70
+ * @param {object} config Config Object
71
+ * @param {Object} opts Options Object
72
+ * @param {boolean} opts.silent Squelch StdOut
73
+ */
74
+ async blueprint(bp_class, config, opts = { silent: false }) {
75
+ if (!opts.silent)
76
+ console.log(`ok - loaded ${bp_class.name}`);
77
+ await bp_class.blueprint(this, config);
78
+ }
79
+ async get(path, opts = {}, handler) {
80
+ try {
81
+ this.docs.push({ method: Doc.HttpMethods.GET, path: path }, opts);
82
+ this.schemas.set(`GET ${path}`, opts);
83
+ const paramsValidation = opts.params && TypeCompiler.Compile(opts.params);
84
+ const queryValidation = opts.query && TypeCompiler.Compile(opts.query);
85
+ if (opts.body)
86
+ throw new Error(`Body not allowed`);
87
+ const _handler = (req, res, next) => {
88
+ const errors = [];
89
+ if (paramsValidation && !paramsValidation.Check(req.params))
90
+ errors.push({ type: 'Params', errors: Array.from(paramsValidation.Errors(req.params)) });
91
+ if (queryValidation && !queryValidation.Check(req.query))
92
+ errors.push({ type: 'Query', errors: Array.from(queryValidation.Errors(req.query)) });
93
+ if (errors.length)
94
+ return Err.respond(new Err(400, null, 'Validation Error'), res, errors);
95
+ return handler(req, res, next);
96
+ };
97
+ this.router.get(path, _handler);
98
+ }
99
+ catch (err) {
100
+ throw new Error(`Get: ${path}: ` + err);
101
+ }
102
+ }
103
+ async delete(path, opts = {}, handler) {
104
+ try {
105
+ this.docs.push({ method: Doc.HttpMethods.DELETE, path: path }, opts);
106
+ this.schemas.set(`DELETE ${path}`, opts);
107
+ const paramsValidation = opts.params && TypeCompiler.Compile(opts.params);
108
+ const queryValidation = opts.query && TypeCompiler.Compile(opts.query);
109
+ if (opts.body)
110
+ throw new Error(`Body not allowed`);
111
+ const _handler = (req, res, next) => {
112
+ const errors = [];
113
+ if (paramsValidation && !paramsValidation.Check(req.params))
114
+ errors.push({ type: 'Params', errors: Array.from(paramsValidation.Errors(req.params)) });
115
+ if (queryValidation && !queryValidation.Check(req.query))
116
+ errors.push({ type: 'Query', errors: Array.from(queryValidation.Errors(req.query)) });
117
+ if (errors.length)
118
+ return Err.respond(new Err(400, null, 'Validation Error'), res, errors);
119
+ return handler(req, res, next);
120
+ };
121
+ this.router.get(path, _handler);
122
+ }
123
+ catch (err) {
124
+ throw new Error(`Delete: ${path}: ` + String(err));
125
+ }
126
+ }
127
+ async post(path, opts = {}, handler) {
128
+ try {
129
+ this.docs.push({ method: Doc.HttpMethods.POST, path: path }, opts);
130
+ this.schemas.set(`POST ${path}`, opts);
131
+ const paramsValidation = opts.params && TypeCompiler.Compile(opts.params);
132
+ const queryValidation = opts.query && TypeCompiler.Compile(opts.query);
133
+ const bodyValidation = opts.body && TypeCompiler.Compile(opts.body);
134
+ const _handler = (req, res, next) => {
135
+ const errors = [];
136
+ if (paramsValidation && !paramsValidation.Check(req.params))
137
+ errors.push({ type: 'Params', errors: Array.from(paramsValidation.Errors(req.params)) });
138
+ if (queryValidation && !queryValidation.Check(req.query))
139
+ errors.push({ type: 'Query', errors: Array.from(queryValidation.Errors(req.query)) });
140
+ if (bodyValidation && !bodyValidation.Check(req.body))
141
+ errors.push({ type: 'Body', errors: Array.from(bodyValidation.Errors(req.body)) });
142
+ if (errors.length)
143
+ return Err.respond(new Err(400, null, 'Validation Error'), res, errors);
144
+ return handler(req, res, next);
145
+ };
146
+ this.router.get(path, _handler);
147
+ }
148
+ catch (err) {
149
+ throw new Error(`Post: ${path}: ` + String(err));
150
+ }
151
+ }
152
+ async patch(path, opts = {}, handler) {
153
+ try {
154
+ this.docs.push({ method: Doc.HttpMethods.PATCH, path: path }, opts);
155
+ this.schemas.set(`PATCH ${path}`, opts);
156
+ const paramsValidation = opts.params && TypeCompiler.Compile(opts.params);
157
+ const queryValidation = opts.query && TypeCompiler.Compile(opts.query);
158
+ const bodyValidation = opts.body && TypeCompiler.Compile(opts.body);
159
+ const _handler = (req, res, next) => {
160
+ const errors = [];
161
+ if (paramsValidation && !paramsValidation.Check(req.params))
162
+ errors.push({ type: 'Params', errors: Array.from(paramsValidation.Errors(req.params)) });
163
+ if (queryValidation && !queryValidation.Check(req.query))
164
+ errors.push({ type: 'Query', errors: Array.from(queryValidation.Errors(req.query)) });
165
+ if (bodyValidation && !bodyValidation.Check(req.body))
166
+ errors.push({ type: 'Body', errors: Array.from(bodyValidation.Errors(req.body)) });
167
+ if (errors.length)
168
+ return Err.respond(new Err(400, null, 'Validation Error'), res, errors);
169
+ return handler(req, res, next);
170
+ };
171
+ this.router.get(path, _handler);
172
+ }
173
+ catch (err) {
174
+ throw new Error(`Patch: ${path}: ` + String(err));
175
+ }
176
+ }
177
+ async put(path, opts = {}, handler) {
178
+ try {
179
+ this.docs.push({ method: Doc.HttpMethods.PUT, path: path }, opts);
180
+ this.schemas.set(`PUT ${path}`, opts);
181
+ const paramsValidation = opts.params && TypeCompiler.Compile(opts.params);
182
+ const queryValidation = opts.query && TypeCompiler.Compile(opts.query);
183
+ const bodyValidation = opts.body && TypeCompiler.Compile(opts.body);
184
+ const _handler = (req, res, next) => {
185
+ const errors = [];
186
+ if (paramsValidation && !paramsValidation.Check(req.params))
187
+ errors.push({ type: 'Params', errors: Array.from(paramsValidation.Errors(req.params)) });
188
+ if (queryValidation && !queryValidation.Check(req.query))
189
+ errors.push({ type: 'Query', errors: Array.from(queryValidation.Errors(req.query)) });
190
+ if (bodyValidation && !bodyValidation.Check(req.body))
191
+ errors.push({ type: 'Body', errors: Array.from(bodyValidation.Errors(req.body)) });
192
+ if (errors.length)
193
+ return Err.respond(new Err(400, null, 'Validation Error'), res, errors);
194
+ return handler(req, res, next);
195
+ };
196
+ this.router.get(path, _handler);
197
+ }
198
+ catch (err) {
199
+ throw new Error(`Put: ${path}: ` + String(err));
200
+ }
201
+ }
202
+ not_found() {
203
+ this.router.all('*', (req, res) => {
204
+ return res.status(404).json({
205
+ status: 404,
206
+ message: 'API endpoint does not exist!',
207
+ messages: []
208
+ });
209
+ });
210
+ }
211
+ query(method, url) {
212
+ if (!this.schemas.has(`${method} ${url}`)) {
213
+ return {};
214
+ }
215
+ const schema = JSON.parse(JSON.stringify(this.schemas.get(`${method} ${url}`)));
216
+ return {
217
+ query: schema.query,
218
+ body: schema.body,
219
+ res: schema.res
220
+ };
221
+ }
222
+ list() {
223
+ const lite = {};
224
+ for (const key of this.schemas.keys()) {
225
+ const schema = this.schemas.get(key);
226
+ if (!schema)
227
+ continue;
228
+ lite[key] = {
229
+ body: !!schema.body,
230
+ query: !!schema.query,
231
+ res: !!schema.res
232
+ };
233
+ }
234
+ return lite;
235
+ }
236
+ }
237
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../lib/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../lib/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,98 @@
1
+ import test from 'tape';
2
+ import express from 'express';
3
+ import Schema from '../index.js';
4
+ const app = express();
5
+ const schema = new Schema(express.Router());
6
+ app.use('/api', schema.router);
7
+ let server;
8
+ test('start', (t) => {
9
+ server = app.listen(2000, async () => {
10
+ await schema.api();
11
+ t.end();
12
+ });
13
+ });
14
+ test('GET: api/schema', async (t) => {
15
+ try {
16
+ const res = await fetch('http://localhost:2000/api/schema');
17
+ const body = await res.json();
18
+ t.deepEquals(body, {
19
+ 'GET /schema': {
20
+ body: false,
21
+ query: true,
22
+ res: true
23
+ },
24
+ 'GET /openapi': {
25
+ body: false,
26
+ query: false,
27
+ res: true
28
+ }
29
+ });
30
+ }
31
+ catch (err) {
32
+ t.error(err, 'no error');
33
+ }
34
+ t.end();
35
+ });
36
+ test('GET: api/schema?method=FAKE', async (t) => {
37
+ try {
38
+ const res = await fetch('http://localhost:2000/api/schema?method=fake');
39
+ t.notOk(res.ok);
40
+ t.deepEquals(await res.json(), {
41
+ status: 400,
42
+ message: 'Validation Error',
43
+ messages: [
44
+ { "type": "Query", "errors": [{ "type": 62, "schema": { "anyOf": [{ "const": "GET", "type": "string" }, { "const": "PUT", "type": "string" }, { "const": "POST", "type": "string" }, { "const": "DELETE", "type": "string" }, { "const": "OPTIONS", "type": "string" }, { "const": "HEAD", "type": "string" }, { "const": "PATCH", "type": "string" }, { "const": "TRACE", "type": "string" }] }, "path": "/method", "value": "fake", "message": "Expected union value" }] }
45
+ ]
46
+ });
47
+ }
48
+ catch (err) {
49
+ t.error(err);
50
+ }
51
+ t.end();
52
+ });
53
+ test('GET: api/schema?method=GET', async (t) => {
54
+ try {
55
+ const res = await fetch('http://localhost:2000/api/schema?method=GET');
56
+ t.notOk(res.ok);
57
+ t.deepEquals(await res.json(), {
58
+ status: 400,
59
+ message: 'url & method params must be used together',
60
+ messages: []
61
+ });
62
+ }
63
+ catch (err) {
64
+ t.error(err);
65
+ }
66
+ t.end();
67
+ });
68
+ test('GET: api/schema?url=123', async (t) => {
69
+ try {
70
+ const res = await fetch('http://localhost:2000/api/schema?url=123');
71
+ t.notOk(res.ok);
72
+ t.deepEquals(await res.json(), {
73
+ status: 400,
74
+ message: 'url & method params must be used together',
75
+ messages: []
76
+ });
77
+ }
78
+ catch (err) {
79
+ t.error(err);
80
+ }
81
+ t.end();
82
+ });
83
+ test('GET: api/schema?method=GET&url=/schema', async (t) => {
84
+ try {
85
+ const res = await fetch('http://localhost:2000/api/schema?method=GET&url=/schema');
86
+ t.equals(res.status, 200, 'http: 200');
87
+ t.deepEquals(Object.keys(await res.json()).sort(), ['query', 'res'].sort());
88
+ }
89
+ catch (err) {
90
+ t.error(err, 'no error');
91
+ }
92
+ t.end();
93
+ });
94
+ test('End', async (t) => {
95
+ await server.close();
96
+ t.end();
97
+ });
98
+ //# sourceMappingURL=schema.srv.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.srv.test.js","sourceRoot":"","sources":["../../test/schema.srv.test.ts"],"names":[],"mappings":"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"}