@scalar/mock-server 0.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.
@@ -0,0 +1,220 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import { describe, expect, it } from 'vitest';
38
+ import { createMockServer } from './createMockServer';
39
+ describe('openapi.{json|yaml}', function () {
40
+ it('GET /openapi.json (object)', function () { return __awaiter(void 0, void 0, void 0, function () {
41
+ var openapi, server, response, _a;
42
+ return __generator(this, function (_b) {
43
+ switch (_b.label) {
44
+ case 0:
45
+ openapi = {
46
+ openapi: '3.1.0',
47
+ info: {
48
+ title: 'Hello World',
49
+ version: '1.0.0',
50
+ },
51
+ paths: {},
52
+ };
53
+ return [4 /*yield*/, createMockServer({
54
+ openapi: openapi,
55
+ })];
56
+ case 1:
57
+ server = _b.sent();
58
+ return [4 /*yield*/, server.request('/openapi.json')];
59
+ case 2:
60
+ response = _b.sent();
61
+ expect(response.status).toBe(200);
62
+ _a = expect;
63
+ return [4 /*yield*/, response.json()];
64
+ case 3:
65
+ _a.apply(void 0, [_b.sent()]).toMatchObject(openapi);
66
+ return [2 /*return*/];
67
+ }
68
+ });
69
+ }); });
70
+ it('GET /openapi.json (JSON string)', function () { return __awaiter(void 0, void 0, void 0, function () {
71
+ var openapi, server, response, _a;
72
+ return __generator(this, function (_b) {
73
+ switch (_b.label) {
74
+ case 0:
75
+ openapi = {
76
+ openapi: '3.1.0',
77
+ info: {
78
+ title: 'Hello World',
79
+ version: '1.0.0',
80
+ },
81
+ paths: {},
82
+ };
83
+ return [4 /*yield*/, createMockServer({
84
+ openapi: openapi,
85
+ })];
86
+ case 1:
87
+ server = _b.sent();
88
+ return [4 /*yield*/, server.request('/openapi.json')];
89
+ case 2:
90
+ response = _b.sent();
91
+ expect(response.status).toBe(200);
92
+ _a = expect;
93
+ return [4 /*yield*/, response.json()];
94
+ case 3:
95
+ _a.apply(void 0, [_b.sent()]).toMatchObject(openapi);
96
+ return [2 /*return*/];
97
+ }
98
+ });
99
+ }); });
100
+ it.skip('GET /openapi.json (YAML string)', function () { return __awaiter(void 0, void 0, void 0, function () {
101
+ var openapi, server, response, _a;
102
+ return __generator(this, function (_b) {
103
+ switch (_b.label) {
104
+ case 0:
105
+ openapi = {
106
+ openapi: '3.1.0',
107
+ info: {
108
+ title: 'Hello World',
109
+ version: '1.0.0',
110
+ },
111
+ paths: {},
112
+ };
113
+ return [4 /*yield*/, createMockServer({
114
+ openapi: openapi,
115
+ })];
116
+ case 1:
117
+ server = _b.sent();
118
+ return [4 /*yield*/, server.request('/openapi.json')];
119
+ case 2:
120
+ response = _b.sent();
121
+ expect(response.status).toBe(200);
122
+ _a = expect;
123
+ return [4 /*yield*/, response.json()];
124
+ case 3:
125
+ _a.apply(void 0, [_b.sent()]).toMatchObject(openapi);
126
+ return [2 /*return*/];
127
+ }
128
+ });
129
+ }); });
130
+ it.skip('GET /openapi.yaml (object)', function () { return __awaiter(void 0, void 0, void 0, function () {
131
+ var openapi, server, response, _a;
132
+ return __generator(this, function (_b) {
133
+ switch (_b.label) {
134
+ case 0:
135
+ openapi = {
136
+ openapi: '3.1.0',
137
+ info: {
138
+ title: 'Hello World',
139
+ version: '1.0.0',
140
+ },
141
+ paths: {},
142
+ };
143
+ return [4 /*yield*/, createMockServer({
144
+ openapi: openapi,
145
+ })];
146
+ case 1:
147
+ server = _b.sent();
148
+ return [4 /*yield*/, server.request('/openapi.yaml')];
149
+ case 2:
150
+ response = _b.sent();
151
+ expect(response.status).toBe(200);
152
+ _a = expect;
153
+ return [4 /*yield*/, response.json()];
154
+ case 3:
155
+ _a.apply(void 0, [_b.sent()]).toMatchObject(openapi);
156
+ return [2 /*return*/];
157
+ }
158
+ });
159
+ }); });
160
+ it.skip('GET /openapi.yaml (YAML string)', function () { return __awaiter(void 0, void 0, void 0, function () {
161
+ var openapi, server, response, _a;
162
+ return __generator(this, function (_b) {
163
+ switch (_b.label) {
164
+ case 0:
165
+ openapi = {
166
+ openapi: '3.1.0',
167
+ info: {
168
+ title: 'Hello World',
169
+ version: '1.0.0',
170
+ },
171
+ paths: {},
172
+ };
173
+ return [4 /*yield*/, createMockServer({
174
+ openapi: openapi,
175
+ })];
176
+ case 1:
177
+ server = _b.sent();
178
+ return [4 /*yield*/, server.request('/openapi.yaml')];
179
+ case 2:
180
+ response = _b.sent();
181
+ expect(response.status).toBe(200);
182
+ _a = expect;
183
+ return [4 /*yield*/, response.json()];
184
+ case 3:
185
+ _a.apply(void 0, [_b.sent()]).toMatchObject(openapi);
186
+ return [2 /*return*/];
187
+ }
188
+ });
189
+ }); });
190
+ it.skip('GET /openapi.yaml (JSON string)', function () { return __awaiter(void 0, void 0, void 0, function () {
191
+ var openapi, server, response, _a;
192
+ return __generator(this, function (_b) {
193
+ switch (_b.label) {
194
+ case 0:
195
+ openapi = {
196
+ openapi: '3.1.0',
197
+ info: {
198
+ title: 'Hello World',
199
+ version: '1.0.0',
200
+ },
201
+ paths: {},
202
+ };
203
+ return [4 /*yield*/, createMockServer({
204
+ openapi: openapi,
205
+ })];
206
+ case 1:
207
+ server = _b.sent();
208
+ return [4 /*yield*/, server.request('/openapi.yaml')];
209
+ case 2:
210
+ response = _b.sent();
211
+ expect(response.status).toBe(200);
212
+ _a = expect;
213
+ return [4 /*yield*/, response.json()];
214
+ case 3:
215
+ _a.apply(void 0, [_b.sent()]).toMatchObject(openapi);
216
+ return [2 /*return*/];
217
+ }
218
+ });
219
+ }); });
220
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,299 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import { describe, expect, it } from 'vitest';
38
+ import { createMockServer } from './createMockServer';
39
+ describe('createMockServer', function () {
40
+ it('GET /foobar -> example JSON', function () { return __awaiter(void 0, void 0, void 0, function () {
41
+ var openapi, server, response, _a;
42
+ return __generator(this, function (_b) {
43
+ switch (_b.label) {
44
+ case 0:
45
+ openapi = {
46
+ openapi: '3.1.0',
47
+ info: {
48
+ title: 'Hello World',
49
+ version: '1.0.0',
50
+ },
51
+ paths: {
52
+ '/foobar': {
53
+ get: {
54
+ responses: {
55
+ '200': {
56
+ description: 'OK',
57
+ content: {
58
+ 'application/json': {
59
+ example: {
60
+ foo: 'bar',
61
+ },
62
+ },
63
+ },
64
+ },
65
+ },
66
+ },
67
+ },
68
+ },
69
+ };
70
+ return [4 /*yield*/, createMockServer({
71
+ openapi: openapi,
72
+ })];
73
+ case 1:
74
+ server = _b.sent();
75
+ return [4 /*yield*/, server.request('/foobar')];
76
+ case 2:
77
+ response = _b.sent();
78
+ expect(response.status).toBe(200);
79
+ _a = expect;
80
+ return [4 /*yield*/, response.json()];
81
+ case 3:
82
+ _a.apply(void 0, [_b.sent()]).toMatchObject({
83
+ foo: 'bar',
84
+ });
85
+ return [2 /*return*/];
86
+ }
87
+ });
88
+ }); });
89
+ it('POST /foobar -> example JSON', function () { return __awaiter(void 0, void 0, void 0, function () {
90
+ var openapi, server, response, _a;
91
+ return __generator(this, function (_b) {
92
+ switch (_b.label) {
93
+ case 0:
94
+ openapi = {
95
+ openapi: '3.1.0',
96
+ info: {
97
+ title: 'Hello World',
98
+ version: '1.0.0',
99
+ },
100
+ paths: {
101
+ '/foobar': {
102
+ post: {
103
+ responses: {
104
+ '200': {
105
+ description: 'OK',
106
+ content: {
107
+ 'application/json': {
108
+ example: {
109
+ foo: 'bar',
110
+ },
111
+ },
112
+ },
113
+ },
114
+ },
115
+ },
116
+ },
117
+ },
118
+ };
119
+ return [4 /*yield*/, createMockServer({
120
+ openapi: openapi,
121
+ })];
122
+ case 1:
123
+ server = _b.sent();
124
+ return [4 /*yield*/, server.request('/foobar', {
125
+ method: 'POST',
126
+ })];
127
+ case 2:
128
+ response = _b.sent();
129
+ expect(response.status).toBe(200);
130
+ _a = expect;
131
+ return [4 /*yield*/, response.json()];
132
+ case 3:
133
+ _a.apply(void 0, [_b.sent()]).toMatchObject({
134
+ foo: 'bar',
135
+ });
136
+ return [2 /*return*/];
137
+ }
138
+ });
139
+ }); });
140
+ it('POST /foobar/{id} -> example JSON', function () { return __awaiter(void 0, void 0, void 0, function () {
141
+ var openapi, server, response, _a;
142
+ return __generator(this, function (_b) {
143
+ switch (_b.label) {
144
+ case 0:
145
+ openapi = {
146
+ openapi: '3.1.0',
147
+ info: {
148
+ title: 'Hello World',
149
+ version: '1.0.0',
150
+ },
151
+ paths: {
152
+ '/foobar/{id}': {
153
+ get: {
154
+ responses: {
155
+ '200': {
156
+ description: 'OK',
157
+ content: {
158
+ 'application/json': {
159
+ example: {
160
+ foo: 'bar',
161
+ },
162
+ },
163
+ },
164
+ },
165
+ },
166
+ },
167
+ },
168
+ },
169
+ };
170
+ return [4 /*yield*/, createMockServer({
171
+ openapi: openapi,
172
+ })];
173
+ case 1:
174
+ server = _b.sent();
175
+ return [4 /*yield*/, server.request('/foobar/123')];
176
+ case 2:
177
+ response = _b.sent();
178
+ expect(response.status).toBe(200);
179
+ _a = expect;
180
+ return [4 /*yield*/, response.json()];
181
+ case 3:
182
+ _a.apply(void 0, [_b.sent()]).toMatchObject({
183
+ foo: 'bar',
184
+ });
185
+ return [2 /*return*/];
186
+ }
187
+ });
188
+ }); });
189
+ it('GET /foobar -> example from schema', function () { return __awaiter(void 0, void 0, void 0, function () {
190
+ var openapi, server, response, _a;
191
+ return __generator(this, function (_b) {
192
+ switch (_b.label) {
193
+ case 0:
194
+ openapi = {
195
+ openapi: '3.1.0',
196
+ info: {
197
+ title: 'Hello World',
198
+ version: '1.0.0',
199
+ },
200
+ paths: {
201
+ '/foobar': {
202
+ get: {
203
+ responses: {
204
+ '200': {
205
+ description: 'OK',
206
+ content: {
207
+ 'application/json': {
208
+ schema: {
209
+ type: 'object',
210
+ properties: {
211
+ foo: {
212
+ type: 'string',
213
+ example: 'bar',
214
+ },
215
+ },
216
+ },
217
+ },
218
+ },
219
+ },
220
+ },
221
+ },
222
+ },
223
+ },
224
+ };
225
+ return [4 /*yield*/, createMockServer({
226
+ openapi: openapi,
227
+ })];
228
+ case 1:
229
+ server = _b.sent();
230
+ return [4 /*yield*/, server.request('/foobar')];
231
+ case 2:
232
+ response = _b.sent();
233
+ expect(response.status).toBe(200);
234
+ _a = expect;
235
+ return [4 /*yield*/, response.json()];
236
+ case 3:
237
+ _a.apply(void 0, [_b.sent()]).toMatchObject({
238
+ foo: 'bar',
239
+ });
240
+ return [2 /*return*/];
241
+ }
242
+ });
243
+ }); });
244
+ it('GET /foobar/{id} -> example from schema', function () { return __awaiter(void 0, void 0, void 0, function () {
245
+ var openapi, server, response, _a;
246
+ return __generator(this, function (_b) {
247
+ switch (_b.label) {
248
+ case 0:
249
+ openapi = {
250
+ openapi: '3.1.0',
251
+ info: {
252
+ title: 'Hello World',
253
+ version: '1.0.0',
254
+ },
255
+ paths: {
256
+ '/foobar/{id}': {
257
+ get: {
258
+ responses: {
259
+ '200': {
260
+ description: 'OK',
261
+ content: {
262
+ 'application/json': {
263
+ schema: {
264
+ type: 'object',
265
+ properties: {
266
+ foo: {
267
+ type: 'string',
268
+ example: 'bar',
269
+ },
270
+ },
271
+ },
272
+ },
273
+ },
274
+ },
275
+ },
276
+ },
277
+ },
278
+ },
279
+ };
280
+ return [4 /*yield*/, createMockServer({
281
+ openapi: openapi,
282
+ })];
283
+ case 1:
284
+ server = _b.sent();
285
+ return [4 /*yield*/, server.request('/foobar/123')];
286
+ case 2:
287
+ response = _b.sent();
288
+ expect(response.status).toBe(200);
289
+ _a = expect;
290
+ return [4 /*yield*/, response.json()];
291
+ case 3:
292
+ _a.apply(void 0, [_b.sent()]).toMatchObject({
293
+ foo: 'bar',
294
+ });
295
+ return [2 /*return*/];
296
+ }
297
+ });
298
+ }); });
299
+ });
@@ -0,0 +1 @@
1
+ export * from './createMockServer';
@@ -0,0 +1 @@
1
+ export * from './createMockServer';
@@ -0,0 +1,2 @@
1
+ export * from './normalize';
2
+ export * from './routeFromPath';
@@ -0,0 +1,2 @@
1
+ export * from './normalize';
2
+ export * from './routeFromPath';
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Normalize OpenAPI JSON string, YAML string … to object
3
+ */
4
+ export declare function normalize(openapi: string | Record<string, any>): string | Record<string, any>;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Normalize OpenAPI JSON string, YAML string … to object
3
+ */
4
+ export function normalize(openapi) {
5
+ if (typeof openapi === 'string') {
6
+ openapi = JSON.parse(openapi);
7
+ }
8
+ return openapi;
9
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { normalize } from './normalize';
3
+ describe('normalize', function () {
4
+ it('returns object when given an object', function () {
5
+ expect(normalize({ foo: 'bar ' })).toMatchObject({ foo: 'bar ' });
6
+ });
7
+ it('returns object when given a string', function () {
8
+ expect(normalize(JSON.stringify({ foo: 'bar ' }))).toMatchObject({
9
+ foo: 'bar ',
10
+ });
11
+ });
12
+ });
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Convert path to route
3
+ * Example: /posts/{id} -> /posts/:id
4
+ */
5
+ export declare function routeFromPath(path: string): string;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Convert path to route
3
+ * Example: /posts/{id} -> /posts/:id
4
+ */
5
+ export function routeFromPath(path) {
6
+ return path.replace(/{/g, ':').replace(/}/g, '');
7
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { routeFromPath } from './routeFromPath';
3
+ describe('routeFromPath', function () {
4
+ it('returns correct route for a simple path', function () {
5
+ expect(routeFromPath('/foobar')).toBe('/foobar');
6
+ });
7
+ it('returns correct route for a path with an ID', function () {
8
+ expect(routeFromPath('/foobar/{id}')).toBe('/foobar/:id');
9
+ });
10
+ });