@zimic/interceptor 0.14.0-canary.25 → 0.14.0-canary.26
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/LICENSE.md +1 -1
- package/README.md +218 -171
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +1 -1
- package/dist/cli.mjs.map +1 -1
- package/dist/http.d.ts +2 -2
- package/package.json +3 -4
- package/src/http/interceptor/types/options.ts +1 -1
- package/src/http/interceptor/types/schema.ts +1 -1
package/LICENSE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2023
|
|
3
|
+
Copyright (c) 2023-Present Zimic Team
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
|
6
6
|
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
|
package/README.md
CHANGED
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<h1 align="center">
|
|
6
|
-
|
|
6
|
+
@zimic/interceptor
|
|
7
7
|
</h1>
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
|
-
TypeScript-first HTTP
|
|
10
|
+
TypeScript-first HTTP intercepting and mocking
|
|
11
11
|
</p>
|
|
12
12
|
|
|
13
13
|
<p align="center">
|
|
14
|
-
<a href="https://www.npmjs.com/package/
|
|
14
|
+
<a href="https://www.npmjs.com/package/@zimic/interceptor">npm</a>
|
|
15
15
|
<span> • </span>
|
|
16
16
|
<a href="https://github.com/zimicjs/zimic/wiki">Docs</a>
|
|
17
17
|
<span> • </span>
|
|
@@ -26,196 +26,243 @@
|
|
|
26
26
|
|
|
27
27
|
[](https://github.com/zimicjs/zimic/actions/workflows/ci.yaml)
|
|
28
28
|
[](https://github.com/zimicjs/zimic/actions)
|
|
29
|
-
[](https://github.com/zimicjs/zimic/blob/canary/LICENSE.md)
|
|
30
|
-
[](https://github.com/zimicjs/zimic/blob/canary/LICENSE.md)
|
|
30
|
+
[](https://github.com/zimicjs/zimic)
|
|
31
|
+
|
|
32
|
+
[](https://www.npmjs.com/package/@zimic/interceptor)
|
|
33
|
+
[](https://bundlephobia.com/package/@zimic/interceptor)
|
|
32
34
|
|
|
33
35
|
</div>
|
|
34
36
|
|
|
35
37
|
---
|
|
36
38
|
|
|
37
|
-
|
|
38
|
-
[
|
|
39
|
+
- [Features](#features)
|
|
40
|
+
- [Getting started](#getting-started)
|
|
41
|
+
- [Installation](#installation)
|
|
42
|
+
- [Basic usage](#basic-usage)
|
|
43
|
+
- [Documentation](#documentation)
|
|
44
|
+
- [Examples](#examples)
|
|
45
|
+
- [Changelog](#changelog)
|
|
46
|
+
- [Contributing](#contributing)
|
|
39
47
|
|
|
40
|
-
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
`@zimic/interceptor` provides a flexible and type-safe way to intercept and mock HTTP requests.
|
|
51
|
+
|
|
52
|
+
> [!NOTE]
|
|
53
|
+
>
|
|
54
|
+
> :seedling: This library is in **beta**.
|
|
41
55
|
|
|
42
|
-
|
|
56
|
+
## Features
|
|
43
57
|
|
|
44
|
-
- :
|
|
45
|
-
[
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
58
|
+
- :globe_with_meridians: **HTTP interceptors**: Intercept HTTP requests and return mock responses. Use
|
|
59
|
+
[local](https://github.com/zimicjs/zimic/wiki/getting‐started#local-http-interceptors) or
|
|
60
|
+
[remote](https://github.com/zimicjs/zimic/wiki/getting‐started#remote-http-interceptors) interceptors to adapt your
|
|
61
|
+
mocks to your development and testing workflow.
|
|
62
|
+
- :zap: **Fully typed mocks**: Use your
|
|
63
|
+
[`@zimic/http` schema](https://github.com/zimicjs/zimic/wiki/api‐zimic‐http‐schemas) and create type-safe mocks for
|
|
64
|
+
your HTTP requests.
|
|
65
|
+
- :link: **Network-level interceptor**: `@zimic/interceptor` combines [MSW](https://github.com/mswjs/msw) and
|
|
66
|
+
[interceptor servers](https://github.com/zimicjs/zimic/wiki/cli‐zimic‐server) to handle real HTTP requests. From you
|
|
51
67
|
application's point of view, the mocked responses are indistinguishable from the real ones.
|
|
52
68
|
- :wrench: **Flexibility**: Mock external services and reliably test how your application behaves. Simulate success,
|
|
53
69
|
loading, and error states with ease using [standard web APIs](https://developer.mozilla.org/docs/Web/API).
|
|
54
|
-
- :bulb: **Simplicity**:
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
70
|
+
- :bulb: **Simplicity**: `@zimic/interceptor` was designed to encourage clarity, simplicity, and robustness in your
|
|
71
|
+
mocks.
|
|
72
|
+
|
|
73
|
+
## Getting started
|
|
74
|
+
|
|
75
|
+
Check our [getting started guide](https://github.com/zimicjs/zimic/wiki/getting‐started‐interceptor).
|
|
76
|
+
|
|
77
|
+
### Installation
|
|
78
|
+
|
|
79
|
+
| Manager | Command |
|
|
80
|
+
| :-----: | ------------------------------------------------------- |
|
|
81
|
+
| npm | `npm install @zimic/http @zimic/interceptor --save-dev` |
|
|
82
|
+
| yarn | `yarn add @zimic/http @zimic/interceptor --dev` |
|
|
83
|
+
| pnpm | `pnpm add @zimic/http @zimic/interceptor --dev` |
|
|
84
|
+
|
|
85
|
+
## Basic usage
|
|
86
|
+
|
|
87
|
+
1. Declare your HTTP schema using [`@zimic/http`](https://github.com/zimicjs/zimic/wiki/api‐zimic‐http):
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
import { type HttpSchema } from '@zimic/http';
|
|
91
|
+
|
|
92
|
+
interface User {
|
|
93
|
+
username: string;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
interface RequestError {
|
|
97
|
+
code: string;
|
|
98
|
+
message: string;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
type Schema = HttpSchema<{
|
|
102
|
+
'/users': {
|
|
103
|
+
POST: {
|
|
104
|
+
request: { body: User };
|
|
105
|
+
response: {
|
|
106
|
+
201: { body: User };
|
|
107
|
+
400: { body: RequestError };
|
|
108
|
+
409: { body: RequestError };
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
GET: {
|
|
113
|
+
request: {
|
|
114
|
+
headers: { authorization: string };
|
|
115
|
+
searchParams: { query?: string; limit?: `${number}` };
|
|
116
|
+
};
|
|
117
|
+
response: {
|
|
118
|
+
200: { body: User[] };
|
|
119
|
+
400: { body: RequestError };
|
|
120
|
+
401: { body: RequestError };
|
|
121
|
+
};
|
|
90
122
|
};
|
|
91
123
|
};
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
body: Partial<User>;
|
|
105
|
-
};
|
|
106
|
-
response: {
|
|
107
|
-
204: {};
|
|
108
|
-
400: { body: RequestError };
|
|
124
|
+
|
|
125
|
+
'/users/:userId': {
|
|
126
|
+
PATCH: {
|
|
127
|
+
request: {
|
|
128
|
+
headers: { authorization: string };
|
|
129
|
+
body: Partial<User>;
|
|
130
|
+
};
|
|
131
|
+
response: {
|
|
132
|
+
204: {};
|
|
133
|
+
400: { body: RequestError };
|
|
134
|
+
};
|
|
135
|
+
};
|
|
109
136
|
};
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
}>;
|
|
113
|
-
|
|
114
|
-
// 3. Create your interceptor:
|
|
115
|
-
// https://bit.ly/zimic-interceptor-http#httpinterceptorcreateoptions
|
|
116
|
-
const myInterceptor = httpInterceptor.create<MySchema>({
|
|
117
|
-
type: 'local',
|
|
118
|
-
baseURL: 'http://localhost:3000',
|
|
119
|
-
saveRequests: true, // Allow access to `handler.requests()`
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
// 4. Manage your interceptor lifecycle:
|
|
123
|
-
// https://bit.ly/zimic-guides-testing
|
|
124
|
-
beforeAll(async () => {
|
|
125
|
-
// 4.1. Start intercepting requests:
|
|
126
|
-
// https://bit.ly/zimic-interceptor-http#http-interceptorstart
|
|
127
|
-
await myInterceptor.start();
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
beforeEach(() => {
|
|
131
|
-
// 4.2. Clear interceptors so that no tests affect each other:
|
|
132
|
-
// https://bit.ly/zimic-interceptor-http#http-interceptorclear
|
|
133
|
-
myInterceptor.clear();
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
afterEach(() => {
|
|
137
|
-
// 4.3. Check that all expected requests were made:
|
|
138
|
-
// https://bit.ly/zimic-interceptor-http#http-interceptorchecktimes
|
|
139
|
-
myInterceptor.checkTimes();
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
afterAll(async () => {
|
|
143
|
-
// 4.4. Stop intercepting requests:
|
|
144
|
-
// https://bit.ly/zimic-interceptor-http#http-interceptorstop
|
|
145
|
-
await myInterceptor.stop();
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
// Enjoy mocking!
|
|
149
|
-
test('example', async () => {
|
|
150
|
-
const users: User[] = [{ username: 'my-user' }];
|
|
151
|
-
|
|
152
|
-
// 5. Declare your mocks:
|
|
153
|
-
// https://bit.ly/zimic-interceptor-http#http-interceptormethodpath
|
|
154
|
-
const myHandler = myInterceptor
|
|
155
|
-
.get('/users')
|
|
156
|
-
// 5.1. Use restrictions to make declarative assertions and narrow down your mocks:
|
|
157
|
-
// https://bit.ly/zimic-interceptor-http#http-handlerwithrestriction
|
|
158
|
-
.with({
|
|
159
|
-
headers: { authorization: 'Bearer my-token' },
|
|
160
|
-
searchParams: { username: 'my' },
|
|
161
|
-
})
|
|
162
|
-
// 5.2. Respond with your mock data:
|
|
163
|
-
// https://bit.ly/zimic-interceptor-http#http-handlerresponddeclaration
|
|
164
|
-
.respond({
|
|
165
|
-
status: 200,
|
|
166
|
-
body: users,
|
|
167
|
-
})
|
|
168
|
-
// 5.3. Define how many requests you expect your application to make:
|
|
169
|
-
// https://bit.ly/zimic-interceptor-http#http-handlertimes
|
|
170
|
-
.times(1);
|
|
171
|
-
|
|
172
|
-
// 6. Run your application and make requests:
|
|
173
|
-
// ...
|
|
174
|
-
|
|
175
|
-
// 7. Check the requests you expect:
|
|
176
|
-
// https://bit.ly/zimic-interceptor-http#http-handlerrequests
|
|
177
|
-
//
|
|
178
|
-
// NOTE: The code below checks the requests manually. This is optional in this
|
|
179
|
-
// example because the `with` and `times` calls act as a declarative validation,
|
|
180
|
-
// meaning that exactly one request is expected with specific data. If fewer or
|
|
181
|
-
// more requests are received, the test will fail when `myInterceptor.checkTimes()`
|
|
182
|
-
// is called in the `afterEach` hook.
|
|
183
|
-
const requests = myHandler.requests();
|
|
184
|
-
expect(requests).toHaveLength(1);
|
|
185
|
-
|
|
186
|
-
expect(requests[0].headers.get('authorization')).toBe('Bearer my-token');
|
|
187
|
-
|
|
188
|
-
expect(requests[0].searchParams.size).toBe(1);
|
|
189
|
-
expect(requests[0].searchParams.get('username')).toBe('my');
|
|
190
|
-
|
|
191
|
-
expect(requests[0].body).toBe(null);
|
|
192
|
-
});
|
|
193
|
-
```
|
|
137
|
+
}>;
|
|
138
|
+
```
|
|
194
139
|
|
|
195
|
-
|
|
140
|
+
You can also use [`zimic-http typegen`](https://github.com/zimicjs/zimic/wiki/cli‐zimic‐typegen) to automatically
|
|
141
|
+
generate types for your HTTP schema.
|
|
196
142
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
143
|
+
2. Create your
|
|
144
|
+
[interceptor](https://github.com/zimicjs/zimic/wiki/api‐zimic‐interceptor‐http#httpinterceptorcreateoptions):
|
|
145
|
+
|
|
146
|
+
```ts
|
|
147
|
+
import { httpInterceptor } from '@zimic/interceptor/http';
|
|
148
|
+
|
|
149
|
+
const interceptor = httpInterceptor.create<Schema>({
|
|
150
|
+
type: 'local',
|
|
151
|
+
baseURL: 'http://localhost:3000',
|
|
152
|
+
saveRequests: true, // Allow access to `handler.requests()`
|
|
153
|
+
});
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
3. Manage your [interceptor lifecycle](https://github.com/zimicjs/zimic/wiki/guides‐testing‐interceptor):
|
|
157
|
+
|
|
158
|
+
4.1.
|
|
159
|
+
[Start intercepting requests](https://github.com/zimicjs/zimic/wiki/api‐zimic‐interceptor‐http#http-interceptorstart):
|
|
160
|
+
|
|
161
|
+
```ts
|
|
162
|
+
beforeAll(async () => {
|
|
163
|
+
await interceptor.start();
|
|
164
|
+
});
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
4.2.
|
|
168
|
+
[Clear your interceptors](https://github.com/zimicjs/zimic/wiki/api‐zimic‐interceptor‐http#http-interceptorclear) so
|
|
169
|
+
that no tests affect each other:
|
|
170
|
+
|
|
171
|
+
```ts
|
|
172
|
+
beforeEach(() => {
|
|
173
|
+
interceptor.clear();
|
|
174
|
+
});
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
4.3.
|
|
178
|
+
[Check that all expected requests were made](https://github.com/zimicjs/zimic/wiki/api‐zimic‐interceptor‐http#http-interceptorchecktimes):
|
|
179
|
+
|
|
180
|
+
```ts
|
|
181
|
+
afterEach(() => {
|
|
182
|
+
interceptor.checkTimes();
|
|
183
|
+
});
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
4.4.
|
|
187
|
+
[Stop intercepting requests](https://github.com/zimicjs/zimic/wiki/api‐zimic‐interceptor‐http#http-interceptorstop):
|
|
188
|
+
|
|
189
|
+
```ts
|
|
190
|
+
afterAll(async () => {
|
|
191
|
+
await interceptor.stop();
|
|
192
|
+
});
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
4. Enjoy mocking!
|
|
196
|
+
|
|
197
|
+
5.1. Mock a response:
|
|
198
|
+
|
|
199
|
+
```ts
|
|
200
|
+
test('example', async () => {
|
|
201
|
+
const users: User[] = [{ username: 'me' }];
|
|
202
|
+
|
|
203
|
+
const handler = interceptor
|
|
204
|
+
.get('/users')
|
|
205
|
+
.with({
|
|
206
|
+
headers: { authorization: 'Bearer my-token' },
|
|
207
|
+
searchParams: { query: 'u' },
|
|
208
|
+
})
|
|
209
|
+
.respond({
|
|
210
|
+
status: 200,
|
|
211
|
+
body: users,
|
|
212
|
+
})
|
|
213
|
+
.times(1);
|
|
214
|
+
|
|
215
|
+
/// ...
|
|
216
|
+
});
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
Learn more about
|
|
220
|
+
[`with(restrictions)`](https://github.com/zimicjs/zimic/wiki/api‐zimic‐interceptor‐http#http-handlerwithrestriction),
|
|
221
|
+
[`respond(declaration)`](https://github.com/zimicjs/zimic/wiki/api‐zimic‐interceptor‐http#http-handlerresponddeclaration),
|
|
222
|
+
and [`times(times)`](https://github.com/zimicjs/zimic/wiki/api‐zimic‐interceptor‐http#http-handlertimes).
|
|
223
|
+
|
|
224
|
+
5.2. After your application made requests, check if they are as you expect:
|
|
225
|
+
|
|
226
|
+
```ts
|
|
227
|
+
test('example', async () => {
|
|
228
|
+
// Your application makes requests...
|
|
229
|
+
|
|
230
|
+
const requests = handler.requests();
|
|
231
|
+
expect(requests).toHaveLength(1);
|
|
232
|
+
|
|
233
|
+
expect(requests[0].headers.get('authorization')).toBe('Bearer my-token');
|
|
234
|
+
|
|
235
|
+
expect(requests[0].searchParams.size).toBe(1);
|
|
236
|
+
expect(requests[0].searchParams.get('username')).toBe('my');
|
|
237
|
+
|
|
238
|
+
expect(requests[0].body).toBe(null);
|
|
239
|
+
});
|
|
240
|
+
```
|
|
203
241
|
|
|
204
242
|
> [!NOTE]
|
|
205
243
|
>
|
|
206
|
-
>
|
|
207
|
-
>
|
|
208
|
-
>
|
|
209
|
-
>
|
|
210
|
-
>
|
|
211
|
-
>
|
|
212
|
-
>
|
|
213
|
-
|
|
214
|
-
|
|
244
|
+
> The 5.2 checks the application requests manually. This is optional in this example because the
|
|
245
|
+
> [`with`](https://github.com/zimicjs/zimic/wiki/api‐zimic‐interceptor‐http#http-handlerwithrestriction) and
|
|
246
|
+
> [`times`](https://github.com/zimicjs/zimic/wiki/api‐zimic‐interceptor‐http#http-handlertimes) calls (step 5.1) already
|
|
247
|
+
> act as a declarative validation, expressing that exactly one request is expected with specific data. If fewer or more
|
|
248
|
+
> requests are received, the test will fail when
|
|
249
|
+
> [`interceptor.checkTimes()`](https://github.com/zimicjs/zimic/wiki/api‐zimic‐interceptor‐http#http-interceptorchecktimes)
|
|
250
|
+
> is called in the `afterEach` hook.
|
|
251
|
+
|
|
252
|
+
## Documentation
|
|
253
|
+
|
|
254
|
+
- [Getting started](https://github.com/zimicjs/zimic/wiki/getting‐started‐interceptor)
|
|
255
|
+
- [API reference](https://github.com/zimicjs/zimic/wiki/api‐zimic‐interceptor‐http)
|
|
256
|
+
- CLI reference
|
|
257
|
+
- [Browser](https://github.com/zimicjs/zimic/wiki/cli‐zimic‐interceptor‐browser)
|
|
258
|
+
- [Server](https://github.com/zimicjs/zimic/wiki/cli‐zimic‐interceptor‐server)
|
|
259
|
+
- Guides
|
|
260
|
+
- [Testing](https://github.com/zimicjs/zimic/wiki/guides‐testing‐interceptor)
|
|
215
261
|
|
|
216
262
|
## Examples
|
|
217
263
|
|
|
218
|
-
Visit our [examples](../../examples/README.md) to see how to use Zimic with popular frameworks, libraries, and use
|
|
264
|
+
Visit our [examples](../../examples/README.md) to see how to use Zimic with popular frameworks, libraries, and use
|
|
265
|
+
cases.
|
|
219
266
|
|
|
220
267
|
## Changelog
|
|
221
268
|
|
package/dist/cli.js
CHANGED
|
@@ -17,7 +17,7 @@ var filesystem__default = /*#__PURE__*/_interopDefault(filesystem);
|
|
|
17
17
|
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
18
18
|
|
|
19
19
|
// package.json
|
|
20
|
-
var version = "0.14.0-canary.
|
|
20
|
+
var version = "0.14.0-canary.26";
|
|
21
21
|
|
|
22
22
|
// src/cli/browser/shared/constants.ts
|
|
23
23
|
var SERVICE_WORKER_FILE_NAME = "mockServiceWorker.js";
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/cli/browser/shared/constants.ts","../src/cli/browser/init.ts","../src/utils/processes.ts","../src/cli/server/start.ts","../src/cli/cli.ts","../src/cli/index.ts"],"names":["path","__require","filesystem","logWithPrefix","chalk","__name","createCachedDynamicImport_default","interceptorServer","exitEvent","yargs","hideBin"],"mappings":";;;;;;;;;;;;;;;;;;;AAgBE,IAAW,OAAA,GAAA,kBAAA;;;AChBN,IAAM,wBAA2B,GAAA,sBAAA;;;ACQxC,IAAM,aAAA,GAAgBA,sBAAK,IAAK,CAAAC,0BAAA,CAAQ,QAAQ,KAAK,CAAA,EAAG,IAAM,EAAA,IAAA,EAAM,IAAI,CAAA;AACjE,IAAM,wBAA2B,GAAAD,qBAAA,CAAK,IAAK,CAAA,aAAA,EAAe,OAAO,wBAAwB,CAAA;AAMhG,eAAe,8BAAA,CAA+B,EAAE,eAAA,EAAoD,EAAA;AAClG,EAAM,MAAA,uBAAA,GAA0BA,qBAAK,CAAA,OAAA,CAAQ,eAAe,CAAA;AAC5D,EAAA,MAAME,4BAAW,KAAM,CAAA,uBAAA,EAAyB,EAAE,SAAA,EAAW,MAAM,CAAA;AAEnE,EAAA,MAAM,eAAkB,GAAAF,qBAAA,CAAK,IAAK,CAAA,uBAAA,EAAyB,wBAAwB,CAAA;AACnF,EAAM,MAAAE,2BAAA,CAAW,QAAS,CAAA,wBAAA,EAA0B,eAAe,CAAA;AAEnE,EAAAC,8BAAA,CAAc,CAAkC,+BAAA,EAAAC,sBAAA,CAAM,KAAM,CAAA,eAAe,CAAC,CAAG,CAAA,CAAA,CAAA;AAC/E,EAAAD,8BAAA,CAAc,uCAAuC,CAAA;AACvD;AATeE,uBAAA,CAAA,8BAAA,EAAA,gCAAA,CAAA;AAWf,IAAO,YAAQ,GAAA,8BAAA;;;ACxBR,IAAM,mBAAA,GAAsB,OAAO,MAAO,CAAA;AAAA,EAC/C,YAAA;AAAA,EACA,0BAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAU,CAAA;AAKH,IAAM,+BAAsE,GAAA;AAAA,EACjF,UAAY,EAAA,MAAA;AAAA,EACZ,wBAA0B,EAAA,MAAA;AAAA,EAC1B,MAAQ,EAAA,GAAA;AAAA,EACR,OAAS,EAAA,GAAA;AAAA,EACT,MAAQ,EAAA,GAAA;AAAA,EACR,QAAU,EAAA;AACZ,CAAA;AAEO,IAAM,WAAc,GAAAC,kDAAA,CAA0B,MAAM,OAAO,OAAO,CAAC,CAAA;AASnE,IAAM,YAAA,GAAN,MAAM,aAAA,SAAqB,KAAM,CAAA;AAAA,EAhCxC;AAgCwC,IAAAD,uBAAA,CAAA,IAAA,EAAA,cAAA,CAAA;AAAA;AAAA,EACtC,OAAgB,iBAAoB,GAAA,CAAA;AAAA,EAE3B,OAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EAET,WAAA,CAAY,YAAoB,OAA8B,EAAA;AAC5D,IAAA,MAAM,OAAU,GAAA,aAAA,CAAa,aAAc,CAAA,UAAA,EAAY,OAAO,CAAA;AAC9D,IAAA,KAAA,CAAM,OAAO,CAAA;AAEb,IAAA,IAAA,CAAK,IAAO,GAAA,cAAA;AACZ,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA,CAAQ,OAAW,IAAA,CAAC,UAAU,CAAA;AAC7C,IAAK,IAAA,CAAA,QAAA,GAAW,IAAK,CAAA,WAAA,CAAY,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,SAAS,OAAQ,CAAA,MAAA;AAAA;AACxB,EAEQ,YAAY,OAAsC,EAAA;AACxD,IAAA,MAAM,mBAAmB,OAAQ,CAAA,QAAA;AACjC,IAAA,MAAM,6BACJ,OAAQ,CAAA,MAAA,KAAW,SAAY,MAAY,GAAA,+BAAA,CAAgC,QAAQ,MAAM,CAAA;AAE3F,IAAO,OAAA,gBAAA,IAAoB,8BAA8B,aAAa,CAAA,iBAAA;AAAA;AACxE,EAEA,OAAe,aAAc,CAAA,OAAA,EAAiB,OAA8B,EAAA;AAC1E,IAAA,MAAM,SAAS,OAAQ,CAAA,eAAA,GAAkB,CAAK,EAAA,EAAA,OAAA,CAAQ,eAAe,CAAK,CAAA,GAAA,EAAA;AAE1E,IAAA,IAAI,OAAQ,CAAA,QAAA,KAAa,MAAa,IAAA,OAAA,CAAQ,WAAW,MAAW,EAAA;AAClE,MAAO,OAAA,CAAA,SAAA,EAAY,OAAO,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA;AAAA;AAG7C,IAAM,MAAA,MAAA,GAAS,YAAY,OAAO,CAAA,SAAA,CAAA;AAClC,IAAM,MAAA,KAAA,GAAQ,OAAQ,CAAA,QAAA,KAAa,MAAY,GAAA,CAAA,aAAA,EAAgB,QAAQ,MAAM,CAAA,CAAA,GAAK,CAAa,UAAA,EAAA,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAE/G,IAAA,OAAO,CAAG,EAAA,MAAM,CAAG,EAAA,KAAK,GAAG,MAAM,CAAA,CAAA;AAAA;AAErC,CAAA;AAEA,eAAsB,UAAA,CAAW,SAAiB,gBAA4B,EAAA;AAC5E,EAAA,MAAM,EAAE,KAAO,EAAA,CAAA,EAAG,UAAW,EAAA,GAAI,MAAM,WAAY,EAAA;AAEnD,EAAI,IAAA;AACF,IAAA,MAAM,EAAE,OAAS,EAAA,gBAAA,EAAkB,EAAE,KAAA,EAAO,WAAW,CAAA;AAAA,WAChD,KAAO,EAAA;AAGd,IAAI,IAAA,EAAE,iBAAiB,UAAa,CAAA,EAAA;AAClC,MAAM,MAAA,KAAA;AAAA;AAGR,IAAM,MAAA,YAAA,GAAe,IAAI,YAAA,CAAa,OAAS,EAAA;AAAA,MAC7C,OAAS,EAAA,CAAC,OAAS,EAAA,GAAG,gBAAgB,CAAA;AAAA,MACtC,UAAU,KAAM,CAAA,QAAA;AAAA,MAChB,QAAQ,KAAM,CAAA,MAAA;AAAA,MACd,iBAAiB,KAAM,CAAA;AAAA,KACxB,CAAA;AAED,IAAM,MAAA,YAAA;AAAA;AAEV;AArBsBA,uBAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AClDtB,eAAe,sBAAuB,CAAA;AAAA,EACpC,QAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAkC,EAAA;AAChC,EAAM,MAAA,MAAA,GAASE,mCAAkB,MAAO,CAAA;AAAA,IACtC,QAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,eAAe,gBAAgB,SAAyC,EAAA;AACtE,IAAA,MAAM,OAAO,IAAK,EAAA;AAGlB,IAAA,KAAA,MAAW,EAAE,SAAA,EAAAC,UAAW,EAAA,WAAA,MAAiB,iBAAmB,EAAA;AAC1D,MAAQ,OAAA,CAAA,GAAA,CAAIA,YAAW,WAAW,CAAA;AAAA;AAGpC,IAAA,MAAM,QAAW,GAAA,SAAA,GAAY,+BAAgC,CAAA,SAAS,CAAI,GAAA,MAAA;AAC1E,IAAA,IAAI,aAAa,MAAW,EAAA;AAC1B,MAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA;AACvB;AAXa,EAAAH,uBAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAcf,EAAA,MAAM,iBAAoB,GAAA,mBAAA,CAAoB,GAAI,CAAA,CAAC,SAAe,MAAA;AAAA,IAChE,SAAA;AAAA,IACA,WAAa,EAAA,eAAA,CAAgB,IAAK,CAAA,IAAA,EAAM,SAAS;AAAA,GACjD,CAAA,CAAA;AAEF,EAAA,KAAA,MAAW,EAAE,SAAA,EAAW,WAAY,EAAA,IAAK,iBAAmB,EAAA;AAC1D,IAAQ,OAAA,CAAA,EAAA,CAAG,WAAW,WAAW,CAAA;AAAA;AAKnC,EAAA,MAAM,OAAO,KAAM,EAAA;AAEnB,EAAcF,8BAAA,CAAA,CAAA,EAAG,YAAY,aAAgB,GAAA,GAAG,uBAAuB,MAAO,CAAA,OAAA,EAAS,CAAE,CAAA,CAAA;AAEzF,EAAA,IAAI,OAAS,EAAA;AACX,IAAI,IAAA;AACF,MAAA,MAAM,UAAW,CAAA,OAAA,CAAQ,OAAS,EAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,aAC5C,KAAO,EAAA;AACd,MAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAInB,MAAI,IAAA,EAAE,iBAAiB,YAAe,CAAA,EAAA;AACpC,QAAM,MAAA,KAAA;AAAA;AAGR,MAAQ,OAAA,CAAA,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA;AAC7B;AAGF,EAAA,IAAI,SAAW,EAAA;AACb,IAAA,MAAM,gBAAgB,MAAS,CAAA;AAC/B,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA;AAElB;AA9DeE,uBAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;AAgEf,IAAO,aAAQ,GAAA,sBAAA;;;AC7Ef,eAAe,MAAS,GAAA;AACtB,EAAA,MAAMI,uBAAMC,eAAQ,CAAA,OAAA,CAAQ,IAAI,CAAC,EAC9B,UAAW,CAAA,mBAAmB,CAC9B,CAAA,OAAA,CAAQ,OAAO,CACf,CAAA,cAAA,CAAe,KAAK,CAAA,CACpB,QAEA,CAAA,OAAA;AAAA,IAAQ,SAAA;AAAA,IAAW,wCAAA;AAAA,IAA0C,CAACD,MAAAA,KAC7DA,MAAM,CAAA,aAAA,EAAgB,CAAA,OAAA;AAAA,MACpB,wBAAA;AAAA,MACA,sDAAA;AAAA,MACA,CAACA,MAAAA,KACCA,MAAM,CAAA,UAAA,CAAW,iBAAmB,EAAA;AAAA,QAClC,IAAM,EAAA,QAAA;AAAA,QACN,WAAa,EAAA,uDAAA;AAAA,QACb,YAAc,EAAA;AAAA,OACf,CAAA;AAAA,MACH,OAAO,YAAiB,KAAA;AACtB,QAAA,MAAM,YAA+B,CAAA;AAAA,UACnC,iBAAiB,YAAa,CAAA;AAAA,SAC/B,CAAA;AAAA;AACH;AACF,GAGD,CAAA,OAAA;AAAA,IAAQ,QAAA;AAAA,IAAU,4BAAA;AAAA,IAA8B,CAACA,MAAAA,KAChDA,MAAM,CAAA,aAAA,EAAgB,CAAA,OAAA;AAAA,MACpB,oBAAA;AAAA,MACA,8BAAA;AAAA,MACA,CAACA,MAAAA,KACCA,MACG,CAAA,UAAA,CAAW,SAAW,EAAA;AAAA,QACrB,WAAa,EAAA,kEAAA;AAAA,QACb,IAAM,EAAA;AAAA,OACP,CACA,CAAA,MAAA,CAAO,UAAY,EAAA;AAAA,QAClB,IAAM,EAAA,QAAA;AAAA,QACN,WAAa,EAAA,sCAAA;AAAA,QACb,KAAO,EAAA,GAAA;AAAA,QACP,OAAS,EAAA;AAAA,OACV,CACA,CAAA,MAAA,CAAO,MAAQ,EAAA;AAAA,QACd,IAAM,EAAA,QAAA;AAAA,QACN,WAAa,EAAA,kCAAA;AAAA,QACb,KAAO,EAAA;AAAA,OACR,CACA,CAAA,MAAA,CAAO,WAAa,EAAA;AAAA,QACnB,IAAM,EAAA,SAAA;AAAA,QACN,WACE,EAAA,8LAAA;AAAA,QAGF,KAAO,EAAA,GAAA;AAAA,QACP,OAAS,EAAA;AAAA,OACV,CACA,CAAA,MAAA,CAAO,wBAA0B,EAAA;AAAA,QAChC,IAAM,EAAA,SAAA;AAAA,QACN,WACE,EAAA,wMAAA;AAAA,QAGF,KAAO,EAAA;AAAA,OACR,CAAA;AAAA,MACL,OAAO,YAAiB,KAAA;AACtB,QAAA,MAAM,iBAAiB,YAAa,CAAA,CAAA,CAAE,EAAG,CAAA,CAAC,GAAG,QAAS,EAAA;AACtD,QAAM,MAAA,uBAAA,GAA0B,YAAa,CAAA,CAAA,CAAE,KAAM,CAAA,CAAC,CAAE,CAAA,GAAA,CAAI,CAAC,QAAA,KAAa,QAAS,CAAA,QAAA,EAAU,CAAA;AAE7F,QAAA,MAAM,aAAuB,CAAA;AAAA,UAC3B,UAAU,YAAa,CAAA,QAAA;AAAA,UACvB,MAAM,YAAa,CAAA,IAAA;AAAA,UACnB,WAAW,YAAa,CAAA,SAAA;AAAA,UACxB,sBAAsB,YAAa,CAAA,oBAAA;AAAA,UACnC,SAAS,cACL,GAAA;AAAA,YACE,OAAA,EAAS,eAAe,QAAS,EAAA;AAAA,YACjC,SAAW,EAAA;AAAA,WAEb,GAAA;AAAA,SACL,CAAA;AAAA;AACH;AACF,IAGD,KAAM,EAAA;AACX;AApFeJ,uBAAA,CAAA,MAAA,EAAA,QAAA,CAAA;AAsFf,IAAO,WAAQ,GAAA,MAAA;;;AC3Ff,KAAK,WAAO,EAAA","file":"cli.js","sourcesContent":["{\n \"name\": \"@zimic/interceptor\",\n \"description\": \"TypeScript-first HTTP request mocking and interceptor\",\n \"keywords\": [\n \"zimic\",\n \"typescript\",\n \"types\",\n \"typegen\",\n \"validation\",\n \"inference\",\n \"http\",\n \"interceptor\",\n \"mock\",\n \"api\",\n \"static\"\n ],\n \"version\": \"0.14.0-canary.25\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/zimicjs/zimic.git\",\n \"directory\": \"packages/zimic-interceptor\"\n },\n \"author\": {\n \"name\": \"Diego Aquino\",\n \"url\": \"https://github.com/diego-aquino\"\n },\n \"private\": false,\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n },\n \"engines\": {\n \"node\": \">=18.13.0\"\n },\n \"license\": \"MIT\",\n \"files\": [\n \"package.json\",\n \"README.md\",\n \"LICENSE.md\",\n \"src\",\n \"!src/**/tests\",\n \"!src/**/__tests__\",\n \"!src/**/*.test.ts\",\n \"dist\",\n \"index.d.ts\",\n \"http.d.ts\",\n \"server.d.ts\"\n ],\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"index.d.ts\",\n \"bin\": {\n \"zimic-interceptor\": \"./dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n },\n \"./http\": {\n \"types\": \"./http.d.ts\",\n \"import\": \"./dist/http.mjs\",\n \"require\": \"./dist/http.js\",\n \"default\": \"./dist/http.js\"\n },\n \"./server\": {\n \"types\": \"./server.d.ts\",\n \"import\": \"./dist/server.mjs\",\n \"require\": \"./dist/server.js\",\n \"default\": \"./dist/server.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"cli\": \"node ./dist/cli.js\",\n \"build\": \"tsup\",\n \"lint\": \"eslint --cache --no-error-on-unmatched-pattern --no-warn-ignored --fix\",\n \"lint:turbo\": \"pnpm lint . --max-warnings 0\",\n \"style\": \"prettier --log-level warn --ignore-unknown --no-error-on-unmatched-pattern --cache\",\n \"style:check\": \"pnpm style --check\",\n \"style:format\": \"pnpm style --write\",\n \"test\": \"dotenv -v NODE_ENV=test -- vitest\",\n \"test:turbo\": \"dotenv -v CI=true -- pnpm run test run --coverage\",\n \"types:check\": \"tsc --noEmit\",\n \"deps:install-playwright\": \"playwright install chromium\",\n \"deps:init-msw\": \"msw init ./public --no-save\",\n \"deps:init\": \"pnpm deps:install-playwright && pnpm deps:init-msw\",\n \"postinstall\": \"node -e \\\"try{require('./dist/scripts/postinstall')}catch(error){console.error(error)}\\\"\",\n \"prepublish:patch-relative-paths\": \"sed -E -i 's/\\\\]\\\\(\\\\.\\\\/([^\\\\)]+)\\\\)/](..\\\\/..\\\\/\\\\1)/g;s/\\\"\\\\.\\\\/([^\\\"]+)\\\"/\\\"..\\\\/..\\\\/\\\\1\\\"/g'\",\n \"prepublishOnly\": \"cp ../../README.md ../../LICENSE.md . && pnpm prepublish:patch-relative-paths README.md\"\n },\n \"dependencies\": {\n \"@whatwg-node/server\": \"0.9.70\",\n \"chalk\": \"4.1.2\",\n \"execa\": \"9.5.2\",\n \"isomorphic-ws\": \"5.0.0\",\n \"msw\": \"2.7.3\",\n \"ws\": \"8.18.1\",\n \"yargs\": \"17.7.2\"\n },\n \"optionalDependencies\": {\n \"bufferutil\": \"4.0.9\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.13.8\",\n \"@types/ws\": \"^8.5.14\",\n \"@types/yargs\": \"^17.0.33\",\n \"@vitest/browser\": \"^3.0.7\",\n \"@vitest/coverage-istanbul\": \"^3.0.7\",\n \"@zimic/eslint-config-node\": \"workspace:*\",\n \"@zimic/lint-staged-config\": \"workspace:*\",\n \"@zimic/tsconfig\": \"workspace:*\",\n \"@zimic/utils\": \"workspace:*\",\n \"dotenv-cli\": \"^8.0.0\",\n \"eslint\": \"^9.21.0\",\n \"playwright\": \"^1.50.1\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.8.2\",\n \"vitest\": \"^3.0.7\"\n },\n \"peerDependencies\": {\n \"@zimic/http\": \"^0.1.0 || ^0.1.0-canary.0\",\n \"typescript\": \">=4.8.0\"\n },\n \"peerDependenciesMeta\": {\n \"typescript\": {\n \"optional\": true\n }\n }\n}\n","export const SERVICE_WORKER_FILE_NAME = 'mockServiceWorker.js';\n","import chalk from 'chalk';\nimport filesystem from 'fs/promises';\nimport path from 'path';\n\nimport { logWithPrefix } from '@/utils/console';\n\nimport { SERVICE_WORKER_FILE_NAME } from './shared/constants';\n\nconst MSW_ROOT_PATH = path.join(require.resolve('msw'), '..', '..', '..');\nexport const MOCK_SERVICE_WORKER_PATH = path.join(MSW_ROOT_PATH, 'lib', SERVICE_WORKER_FILE_NAME);\n\ninterface BrowserServiceWorkerInitOptions {\n publicDirectory: string;\n}\n\nasync function initializeBrowserServiceWorker({ publicDirectory }: BrowserServiceWorkerInitOptions) {\n const absolutePublicDirectory = path.resolve(publicDirectory);\n await filesystem.mkdir(absolutePublicDirectory, { recursive: true });\n\n const destinationPath = path.join(absolutePublicDirectory, SERVICE_WORKER_FILE_NAME);\n await filesystem.copyFile(MOCK_SERVICE_WORKER_PATH, destinationPath);\n\n logWithPrefix(`Service worker script saved to ${chalk.green(destinationPath)}!`);\n logWithPrefix('You can now use browser interceptors!');\n}\n\nexport default initializeBrowserServiceWorker;\n","import createCachedDynamicImport from '@zimic/utils/import/createCachedDynamicImport';\n\nexport const PROCESS_EXIT_EVENTS = Object.freeze([\n 'beforeExit',\n 'uncaughtExceptionMonitor',\n 'SIGINT',\n 'SIGTERM',\n 'SIGHUP',\n 'SIGBREAK',\n] as const);\n\nexport type ProcessExitEvent = (typeof PROCESS_EXIT_EVENTS)[number];\n\n// Having an undefined exit code means that the process will already exit with the default exit code.\nexport const PROCESS_EXIT_CODE_BY_EXIT_EVENT: Record<string, number | undefined> = {\n beforeExit: undefined,\n uncaughtExceptionMonitor: undefined,\n SIGINT: 130,\n SIGTERM: 143,\n SIGHUP: 129,\n SIGBREAK: 131,\n} satisfies Record<ProcessExitEvent, number | undefined>;\n\nexport const importExeca = createCachedDynamicImport(() => import('execa'));\n\ninterface CommandErrorOptions {\n command?: string[];\n exitCode?: number;\n signal?: NodeJS.Signals;\n originalMessage?: string;\n}\n\nexport class CommandError extends Error {\n static readonly DEFAULT_EXIT_CODE = 1;\n\n readonly command: string[];\n readonly exitCode: number;\n readonly signal?: NodeJS.Signals;\n\n constructor(executable: string, options: CommandErrorOptions) {\n const message = CommandError.createMessage(executable, options);\n super(message);\n\n this.name = 'CommandError';\n this.command = options.command ?? [executable];\n this.exitCode = this.getExitCode(options);\n this.signal = options.signal;\n }\n\n private getExitCode(options: CommandErrorOptions): number {\n const existingExitCode = options.exitCode;\n const exitCodeInferredFromSignal =\n options.signal === undefined ? undefined : PROCESS_EXIT_CODE_BY_EXIT_EVENT[options.signal];\n\n return existingExitCode ?? exitCodeInferredFromSignal ?? CommandError.DEFAULT_EXIT_CODE;\n }\n\n private static createMessage(command: string, options: CommandErrorOptions) {\n const suffix = options.originalMessage ? `: ${options.originalMessage}` : '';\n\n if (options.exitCode === undefined && options.signal === undefined) {\n return `Command '${command}' failed${suffix}`;\n }\n\n const prefix = `Command '${command}' exited `;\n const infix = options.exitCode === undefined ? `after signal ${options.signal}` : `with code ${options.exitCode}`;\n\n return `${prefix}${infix}${suffix}`;\n }\n}\n\nexport async function runCommand(command: string, commandArguments: string[]) {\n const { execa: $, ExecaError } = await importExeca();\n\n try {\n await $(command, commandArguments, { stdio: 'inherit' });\n } catch (error) {\n /* istanbul ignore if -- @preserve\n * This is a safeguard if the error is not an ExecaError. It is not expected to run. */\n if (!(error instanceof ExecaError)) {\n throw error;\n }\n\n const commandError = new CommandError(command, {\n command: [command, ...commandArguments],\n exitCode: error.exitCode,\n signal: error.signal,\n originalMessage: error.originalMessage,\n });\n\n throw commandError;\n }\n}\n","import { InterceptorServer, interceptorServer } from '@/server';\nimport { InterceptorServerOptions } from '@/server/types/options';\nimport { logWithPrefix } from '@/utils/console';\nimport {\n CommandError,\n PROCESS_EXIT_CODE_BY_EXIT_EVENT,\n PROCESS_EXIT_EVENTS,\n ProcessExitEvent,\n runCommand,\n} from '@/utils/processes';\n\ninterface InterceptorServerStartOptions extends InterceptorServerOptions {\n ephemeral: boolean;\n onReady?: {\n command: string;\n arguments: string[];\n };\n}\n\nexport let serverSingleton: InterceptorServer | undefined;\n\nasync function startInterceptorServer({\n hostname,\n port,\n ephemeral,\n logUnhandledRequests,\n onReady,\n}: InterceptorServerStartOptions) {\n const server = interceptorServer.create({\n hostname,\n port,\n logUnhandledRequests,\n });\n\n async function handleExitEvent(exitEvent: ProcessExitEvent | undefined) {\n await server.stop();\n\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n for (const { exitEvent, exitHandler } of exitHandlerGroups) {\n process.off(exitEvent, exitHandler);\n }\n\n const exitCode = exitEvent ? PROCESS_EXIT_CODE_BY_EXIT_EVENT[exitEvent] : undefined;\n if (exitCode !== undefined) {\n process.exit(exitCode);\n }\n }\n\n const exitHandlerGroups = PROCESS_EXIT_EVENTS.map((exitEvent) => ({\n exitEvent,\n exitHandler: handleExitEvent.bind(null, exitEvent),\n }));\n\n for (const { exitEvent, exitHandler } of exitHandlerGroups) {\n process.on(exitEvent, exitHandler);\n }\n\n serverSingleton = server;\n\n await server.start();\n\n logWithPrefix(`${ephemeral ? 'Ephemeral s' : 'S'}erver is running on ${server.httpURL()}`);\n\n if (onReady) {\n try {\n await runCommand(onReady.command, onReady.arguments);\n } catch (error) {\n console.error(error);\n\n /* istanbul ignore if -- @preserve\n * A CommandError is always expected here. */\n if (!(error instanceof CommandError)) {\n throw error;\n }\n\n process.exit(error.exitCode);\n }\n }\n\n if (ephemeral) {\n await handleExitEvent(undefined);\n process.exit(0);\n }\n}\n\nexport default startInterceptorServer;\n","import yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\nimport { version } from '@@/package.json';\n\nimport initializeBrowserServiceWorker from './browser/init';\nimport startInterceptorServer from './server/start';\n\nasync function runCLI() {\n await yargs(hideBin(process.argv))\n .scriptName('zimic-interceptor')\n .version(version)\n .showHelpOnFail(false)\n .strict()\n\n .command('browser', 'Manage your browser mock configuration', (yargs) =>\n yargs.demandCommand().command(\n 'init <publicDirectory>',\n 'Initialize the browser service worker configuration.',\n (yargs) =>\n yargs.positional('publicDirectory', {\n type: 'string',\n description: 'The path to the public directory of your application.',\n demandOption: true,\n }),\n async (cliArguments) => {\n await initializeBrowserServiceWorker({\n publicDirectory: cliArguments.publicDirectory,\n });\n },\n ),\n )\n\n .command('server', 'Manage interceptor servers', (yargs) =>\n yargs.demandCommand().command(\n 'start [-- onReady]',\n 'Start an interceptor server.',\n (yargs) =>\n yargs\n .positional('onReady', {\n description: 'A command to run when the server is ready to accept connections.',\n type: 'string',\n })\n .option('hostname', {\n type: 'string',\n description: 'The hostname to start the server on.',\n alias: 'h',\n default: 'localhost',\n })\n .option('port', {\n type: 'number',\n description: 'The port to start the server on.',\n alias: 'p',\n })\n .option('ephemeral', {\n type: 'boolean',\n description:\n 'Whether the server should stop automatically after the on-ready command finishes. ' +\n 'If no on-ready command is provided and ephemeral is true, the server will stop immediately after ' +\n 'starting.',\n alias: 'e',\n default: false,\n })\n .option('log-unhandled-requests', {\n type: 'boolean',\n description:\n 'Whether to log a warning when no interceptors were found for the base URL of a request. ' +\n 'If an interceptor was matched, the logging behavior for that base URL is configured in the ' +\n 'interceptor itself.',\n alias: 'l',\n }),\n async (cliArguments) => {\n const onReadyCommand = cliArguments._.at(2)?.toString();\n const onReadyCommandArguments = cliArguments._.slice(3).map((argument) => argument.toString());\n\n await startInterceptorServer({\n hostname: cliArguments.hostname,\n port: cliArguments.port,\n ephemeral: cliArguments.ephemeral,\n logUnhandledRequests: cliArguments.logUnhandledRequests,\n onReady: onReadyCommand\n ? {\n command: onReadyCommand.toString(),\n arguments: onReadyCommandArguments,\n }\n : undefined,\n });\n },\n ),\n )\n\n .parse();\n}\n\nexport default runCLI;\n","#!/usr/bin/env node\nimport runCLI from './cli';\n\nvoid runCLI();\n"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/cli/browser/shared/constants.ts","../src/cli/browser/init.ts","../src/utils/processes.ts","../src/cli/server/start.ts","../src/cli/cli.ts","../src/cli/index.ts"],"names":["path","__require","filesystem","logWithPrefix","chalk","__name","createCachedDynamicImport_default","interceptorServer","exitEvent","yargs","hideBin"],"mappings":"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","file":"cli.js","sourcesContent":["{\n \"name\": \"@zimic/interceptor\",\n \"description\": \"TypeScript-first HTTP intercepting and mocking\",\n \"keywords\": [\n \"zimic\",\n \"typescript\",\n \"types\",\n \"typegen\",\n \"validation\",\n \"inference\",\n \"http\",\n \"interceptor\",\n \"mock\",\n \"api\",\n \"static\"\n ],\n \"version\": \"0.14.0-canary.26\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/zimicjs/zimic.git\",\n \"directory\": \"packages/zimic-interceptor\"\n },\n \"author\": {\n \"name\": \"Diego Aquino\",\n \"url\": \"https://github.com/diego-aquino\"\n },\n \"private\": false,\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n },\n \"engines\": {\n \"node\": \">=18.13.0\"\n },\n \"license\": \"MIT\",\n \"files\": [\n \"package.json\",\n \"README.md\",\n \"LICENSE.md\",\n \"src\",\n \"!src/**/tests\",\n \"!src/**/__tests__\",\n \"!src/**/*.test.ts\",\n \"dist\",\n \"index.d.ts\",\n \"http.d.ts\",\n \"server.d.ts\"\n ],\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"index.d.ts\",\n \"bin\": {\n \"zimic-interceptor\": \"./dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n },\n \"./http\": {\n \"types\": \"./http.d.ts\",\n \"import\": \"./dist/http.mjs\",\n \"require\": \"./dist/http.js\",\n \"default\": \"./dist/http.js\"\n },\n \"./server\": {\n \"types\": \"./server.d.ts\",\n \"import\": \"./dist/server.mjs\",\n \"require\": \"./dist/server.js\",\n \"default\": \"./dist/server.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"cli\": \"node ./dist/cli.js\",\n \"build\": \"tsup\",\n \"lint\": \"eslint --cache --no-error-on-unmatched-pattern --no-warn-ignored --fix\",\n \"lint:turbo\": \"pnpm lint . --max-warnings 0\",\n \"style\": \"prettier --log-level warn --ignore-unknown --no-error-on-unmatched-pattern --cache\",\n \"style:check\": \"pnpm style --check\",\n \"style:format\": \"pnpm style --write\",\n \"test\": \"dotenv -v NODE_ENV=test -- vitest\",\n \"test:turbo\": \"dotenv -v CI=true -- pnpm run test run --coverage\",\n \"types:check\": \"tsc --noEmit\",\n \"deps:install-playwright\": \"playwright install chromium\",\n \"deps:init-msw\": \"msw init ./public --no-save\",\n \"deps:init\": \"pnpm deps:install-playwright && pnpm deps:init-msw\",\n \"postinstall\": \"node -e \\\"try{require('./dist/scripts/postinstall')}catch(error){console.error(error)}\\\"\"\n },\n \"dependencies\": {\n \"@whatwg-node/server\": \"0.9.70\",\n \"chalk\": \"4.1.2\",\n \"execa\": \"9.5.2\",\n \"isomorphic-ws\": \"5.0.0\",\n \"msw\": \"2.7.3\",\n \"ws\": \"8.18.1\",\n \"yargs\": \"17.7.2\"\n },\n \"optionalDependencies\": {\n \"bufferutil\": \"4.0.9\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.13.8\",\n \"@types/ws\": \"^8.5.14\",\n \"@types/yargs\": \"^17.0.33\",\n \"@vitest/browser\": \"^3.0.7\",\n \"@vitest/coverage-istanbul\": \"^3.0.7\",\n \"@zimic/eslint-config-node\": \"workspace:*\",\n \"@zimic/lint-staged-config\": \"workspace:*\",\n \"@zimic/tsconfig\": \"workspace:*\",\n \"@zimic/utils\": \"workspace:*\",\n \"dotenv-cli\": \"^8.0.0\",\n \"eslint\": \"^9.21.0\",\n \"playwright\": \"^1.50.1\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.8.2\",\n \"vitest\": \"^3.0.7\"\n },\n \"peerDependencies\": {\n \"@zimic/http\": \"^0.1.0 || ^0.1.0-canary.0\",\n \"typescript\": \">=4.8.0\"\n },\n \"peerDependenciesMeta\": {\n \"typescript\": {\n \"optional\": true\n }\n }\n}\n","export const SERVICE_WORKER_FILE_NAME = 'mockServiceWorker.js';\n","import chalk from 'chalk';\nimport filesystem from 'fs/promises';\nimport path from 'path';\n\nimport { logWithPrefix } from '@/utils/console';\n\nimport { SERVICE_WORKER_FILE_NAME } from './shared/constants';\n\nconst MSW_ROOT_PATH = path.join(require.resolve('msw'), '..', '..', '..');\nexport const MOCK_SERVICE_WORKER_PATH = path.join(MSW_ROOT_PATH, 'lib', SERVICE_WORKER_FILE_NAME);\n\ninterface BrowserServiceWorkerInitOptions {\n publicDirectory: string;\n}\n\nasync function initializeBrowserServiceWorker({ publicDirectory }: BrowserServiceWorkerInitOptions) {\n const absolutePublicDirectory = path.resolve(publicDirectory);\n await filesystem.mkdir(absolutePublicDirectory, { recursive: true });\n\n const destinationPath = path.join(absolutePublicDirectory, SERVICE_WORKER_FILE_NAME);\n await filesystem.copyFile(MOCK_SERVICE_WORKER_PATH, destinationPath);\n\n logWithPrefix(`Service worker script saved to ${chalk.green(destinationPath)}!`);\n logWithPrefix('You can now use browser interceptors!');\n}\n\nexport default initializeBrowserServiceWorker;\n","import createCachedDynamicImport from '@zimic/utils/import/createCachedDynamicImport';\n\nexport const PROCESS_EXIT_EVENTS = Object.freeze([\n 'beforeExit',\n 'uncaughtExceptionMonitor',\n 'SIGINT',\n 'SIGTERM',\n 'SIGHUP',\n 'SIGBREAK',\n] as const);\n\nexport type ProcessExitEvent = (typeof PROCESS_EXIT_EVENTS)[number];\n\n// Having an undefined exit code means that the process will already exit with the default exit code.\nexport const PROCESS_EXIT_CODE_BY_EXIT_EVENT: Record<string, number | undefined> = {\n beforeExit: undefined,\n uncaughtExceptionMonitor: undefined,\n SIGINT: 130,\n SIGTERM: 143,\n SIGHUP: 129,\n SIGBREAK: 131,\n} satisfies Record<ProcessExitEvent, number | undefined>;\n\nexport const importExeca = createCachedDynamicImport(() => import('execa'));\n\ninterface CommandErrorOptions {\n command?: string[];\n exitCode?: number;\n signal?: NodeJS.Signals;\n originalMessage?: string;\n}\n\nexport class CommandError extends Error {\n static readonly DEFAULT_EXIT_CODE = 1;\n\n readonly command: string[];\n readonly exitCode: number;\n readonly signal?: NodeJS.Signals;\n\n constructor(executable: string, options: CommandErrorOptions) {\n const message = CommandError.createMessage(executable, options);\n super(message);\n\n this.name = 'CommandError';\n this.command = options.command ?? [executable];\n this.exitCode = this.getExitCode(options);\n this.signal = options.signal;\n }\n\n private getExitCode(options: CommandErrorOptions): number {\n const existingExitCode = options.exitCode;\n const exitCodeInferredFromSignal =\n options.signal === undefined ? undefined : PROCESS_EXIT_CODE_BY_EXIT_EVENT[options.signal];\n\n return existingExitCode ?? exitCodeInferredFromSignal ?? CommandError.DEFAULT_EXIT_CODE;\n }\n\n private static createMessage(command: string, options: CommandErrorOptions) {\n const suffix = options.originalMessage ? `: ${options.originalMessage}` : '';\n\n if (options.exitCode === undefined && options.signal === undefined) {\n return `Command '${command}' failed${suffix}`;\n }\n\n const prefix = `Command '${command}' exited `;\n const infix = options.exitCode === undefined ? `after signal ${options.signal}` : `with code ${options.exitCode}`;\n\n return `${prefix}${infix}${suffix}`;\n }\n}\n\nexport async function runCommand(command: string, commandArguments: string[]) {\n const { execa: $, ExecaError } = await importExeca();\n\n try {\n await $(command, commandArguments, { stdio: 'inherit' });\n } catch (error) {\n /* istanbul ignore if -- @preserve\n * This is a safeguard if the error is not an ExecaError. It is not expected to run. */\n if (!(error instanceof ExecaError)) {\n throw error;\n }\n\n const commandError = new CommandError(command, {\n command: [command, ...commandArguments],\n exitCode: error.exitCode,\n signal: error.signal,\n originalMessage: error.originalMessage,\n });\n\n throw commandError;\n }\n}\n","import { InterceptorServer, interceptorServer } from '@/server';\nimport { InterceptorServerOptions } from '@/server/types/options';\nimport { logWithPrefix } from '@/utils/console';\nimport {\n CommandError,\n PROCESS_EXIT_CODE_BY_EXIT_EVENT,\n PROCESS_EXIT_EVENTS,\n ProcessExitEvent,\n runCommand,\n} from '@/utils/processes';\n\ninterface InterceptorServerStartOptions extends InterceptorServerOptions {\n ephemeral: boolean;\n onReady?: {\n command: string;\n arguments: string[];\n };\n}\n\nexport let serverSingleton: InterceptorServer | undefined;\n\nasync function startInterceptorServer({\n hostname,\n port,\n ephemeral,\n logUnhandledRequests,\n onReady,\n}: InterceptorServerStartOptions) {\n const server = interceptorServer.create({\n hostname,\n port,\n logUnhandledRequests,\n });\n\n async function handleExitEvent(exitEvent: ProcessExitEvent | undefined) {\n await server.stop();\n\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n for (const { exitEvent, exitHandler } of exitHandlerGroups) {\n process.off(exitEvent, exitHandler);\n }\n\n const exitCode = exitEvent ? PROCESS_EXIT_CODE_BY_EXIT_EVENT[exitEvent] : undefined;\n if (exitCode !== undefined) {\n process.exit(exitCode);\n }\n }\n\n const exitHandlerGroups = PROCESS_EXIT_EVENTS.map((exitEvent) => ({\n exitEvent,\n exitHandler: handleExitEvent.bind(null, exitEvent),\n }));\n\n for (const { exitEvent, exitHandler } of exitHandlerGroups) {\n process.on(exitEvent, exitHandler);\n }\n\n serverSingleton = server;\n\n await server.start();\n\n logWithPrefix(`${ephemeral ? 'Ephemeral s' : 'S'}erver is running on ${server.httpURL()}`);\n\n if (onReady) {\n try {\n await runCommand(onReady.command, onReady.arguments);\n } catch (error) {\n console.error(error);\n\n /* istanbul ignore if -- @preserve\n * A CommandError is always expected here. */\n if (!(error instanceof CommandError)) {\n throw error;\n }\n\n process.exit(error.exitCode);\n }\n }\n\n if (ephemeral) {\n await handleExitEvent(undefined);\n process.exit(0);\n }\n}\n\nexport default startInterceptorServer;\n","import yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\nimport { version } from '@@/package.json';\n\nimport initializeBrowserServiceWorker from './browser/init';\nimport startInterceptorServer from './server/start';\n\nasync function runCLI() {\n await yargs(hideBin(process.argv))\n .scriptName('zimic-interceptor')\n .version(version)\n .showHelpOnFail(false)\n .strict()\n\n .command('browser', 'Manage your browser mock configuration', (yargs) =>\n yargs.demandCommand().command(\n 'init <publicDirectory>',\n 'Initialize the browser service worker configuration.',\n (yargs) =>\n yargs.positional('publicDirectory', {\n type: 'string',\n description: 'The path to the public directory of your application.',\n demandOption: true,\n }),\n async (cliArguments) => {\n await initializeBrowserServiceWorker({\n publicDirectory: cliArguments.publicDirectory,\n });\n },\n ),\n )\n\n .command('server', 'Manage interceptor servers', (yargs) =>\n yargs.demandCommand().command(\n 'start [-- onReady]',\n 'Start an interceptor server.',\n (yargs) =>\n yargs\n .positional('onReady', {\n description: 'A command to run when the server is ready to accept connections.',\n type: 'string',\n })\n .option('hostname', {\n type: 'string',\n description: 'The hostname to start the server on.',\n alias: 'h',\n default: 'localhost',\n })\n .option('port', {\n type: 'number',\n description: 'The port to start the server on.',\n alias: 'p',\n })\n .option('ephemeral', {\n type: 'boolean',\n description:\n 'Whether the server should stop automatically after the on-ready command finishes. ' +\n 'If no on-ready command is provided and ephemeral is true, the server will stop immediately after ' +\n 'starting.',\n alias: 'e',\n default: false,\n })\n .option('log-unhandled-requests', {\n type: 'boolean',\n description:\n 'Whether to log a warning when no interceptors were found for the base URL of a request. ' +\n 'If an interceptor was matched, the logging behavior for that base URL is configured in the ' +\n 'interceptor itself.',\n alias: 'l',\n }),\n async (cliArguments) => {\n const onReadyCommand = cliArguments._.at(2)?.toString();\n const onReadyCommandArguments = cliArguments._.slice(3).map((argument) => argument.toString());\n\n await startInterceptorServer({\n hostname: cliArguments.hostname,\n port: cliArguments.port,\n ephemeral: cliArguments.ephemeral,\n logUnhandledRequests: cliArguments.logUnhandledRequests,\n onReady: onReadyCommand\n ? {\n command: onReadyCommand.toString(),\n arguments: onReadyCommandArguments,\n }\n : undefined,\n });\n },\n ),\n )\n\n .parse();\n}\n\nexport default runCLI;\n","#!/usr/bin/env node\nimport runCLI from './cli';\n\nvoid runCLI();\n"]}
|
package/dist/cli.mjs
CHANGED
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/cli/browser/shared/constants.ts","../src/cli/browser/init.ts","../src/utils/processes.ts","../src/cli/server/start.ts","../src/cli/cli.ts","../src/cli/index.ts"],"names":["exitEvent","yargs"],"mappings":"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","file":"cli.mjs","sourcesContent":["{\n \"name\": \"@zimic/interceptor\",\n \"description\": \"TypeScript-first HTTP request mocking and interceptor\",\n \"keywords\": [\n \"zimic\",\n \"typescript\",\n \"types\",\n \"typegen\",\n \"validation\",\n \"inference\",\n \"http\",\n \"interceptor\",\n \"mock\",\n \"api\",\n \"static\"\n ],\n \"version\": \"0.14.0-canary.25\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/zimicjs/zimic.git\",\n \"directory\": \"packages/zimic-interceptor\"\n },\n \"author\": {\n \"name\": \"Diego Aquino\",\n \"url\": \"https://github.com/diego-aquino\"\n },\n \"private\": false,\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n },\n \"engines\": {\n \"node\": \">=18.13.0\"\n },\n \"license\": \"MIT\",\n \"files\": [\n \"package.json\",\n \"README.md\",\n \"LICENSE.md\",\n \"src\",\n \"!src/**/tests\",\n \"!src/**/__tests__\",\n \"!src/**/*.test.ts\",\n \"dist\",\n \"index.d.ts\",\n \"http.d.ts\",\n \"server.d.ts\"\n ],\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"index.d.ts\",\n \"bin\": {\n \"zimic-interceptor\": \"./dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n },\n \"./http\": {\n \"types\": \"./http.d.ts\",\n \"import\": \"./dist/http.mjs\",\n \"require\": \"./dist/http.js\",\n \"default\": \"./dist/http.js\"\n },\n \"./server\": {\n \"types\": \"./server.d.ts\",\n \"import\": \"./dist/server.mjs\",\n \"require\": \"./dist/server.js\",\n \"default\": \"./dist/server.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"cli\": \"node ./dist/cli.js\",\n \"build\": \"tsup\",\n \"lint\": \"eslint --cache --no-error-on-unmatched-pattern --no-warn-ignored --fix\",\n \"lint:turbo\": \"pnpm lint . --max-warnings 0\",\n \"style\": \"prettier --log-level warn --ignore-unknown --no-error-on-unmatched-pattern --cache\",\n \"style:check\": \"pnpm style --check\",\n \"style:format\": \"pnpm style --write\",\n \"test\": \"dotenv -v NODE_ENV=test -- vitest\",\n \"test:turbo\": \"dotenv -v CI=true -- pnpm run test run --coverage\",\n \"types:check\": \"tsc --noEmit\",\n \"deps:install-playwright\": \"playwright install chromium\",\n \"deps:init-msw\": \"msw init ./public --no-save\",\n \"deps:init\": \"pnpm deps:install-playwright && pnpm deps:init-msw\",\n \"postinstall\": \"node -e \\\"try{require('./dist/scripts/postinstall')}catch(error){console.error(error)}\\\"\",\n \"prepublish:patch-relative-paths\": \"sed -E -i 's/\\\\]\\\\(\\\\.\\\\/([^\\\\)]+)\\\\)/](..\\\\/..\\\\/\\\\1)/g;s/\\\"\\\\.\\\\/([^\\\"]+)\\\"/\\\"..\\\\/..\\\\/\\\\1\\\"/g'\",\n \"prepublishOnly\": \"cp ../../README.md ../../LICENSE.md . && pnpm prepublish:patch-relative-paths README.md\"\n },\n \"dependencies\": {\n \"@whatwg-node/server\": \"0.9.70\",\n \"chalk\": \"4.1.2\",\n \"execa\": \"9.5.2\",\n \"isomorphic-ws\": \"5.0.0\",\n \"msw\": \"2.7.3\",\n \"ws\": \"8.18.1\",\n \"yargs\": \"17.7.2\"\n },\n \"optionalDependencies\": {\n \"bufferutil\": \"4.0.9\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.13.8\",\n \"@types/ws\": \"^8.5.14\",\n \"@types/yargs\": \"^17.0.33\",\n \"@vitest/browser\": \"^3.0.7\",\n \"@vitest/coverage-istanbul\": \"^3.0.7\",\n \"@zimic/eslint-config-node\": \"workspace:*\",\n \"@zimic/lint-staged-config\": \"workspace:*\",\n \"@zimic/tsconfig\": \"workspace:*\",\n \"@zimic/utils\": \"workspace:*\",\n \"dotenv-cli\": \"^8.0.0\",\n \"eslint\": \"^9.21.0\",\n \"playwright\": \"^1.50.1\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.8.2\",\n \"vitest\": \"^3.0.7\"\n },\n \"peerDependencies\": {\n \"@zimic/http\": \"^0.1.0 || ^0.1.0-canary.0\",\n \"typescript\": \">=4.8.0\"\n },\n \"peerDependenciesMeta\": {\n \"typescript\": {\n \"optional\": true\n }\n }\n}\n","export const SERVICE_WORKER_FILE_NAME = 'mockServiceWorker.js';\n","import chalk from 'chalk';\nimport filesystem from 'fs/promises';\nimport path from 'path';\n\nimport { logWithPrefix } from '@/utils/console';\n\nimport { SERVICE_WORKER_FILE_NAME } from './shared/constants';\n\nconst MSW_ROOT_PATH = path.join(require.resolve('msw'), '..', '..', '..');\nexport const MOCK_SERVICE_WORKER_PATH = path.join(MSW_ROOT_PATH, 'lib', SERVICE_WORKER_FILE_NAME);\n\ninterface BrowserServiceWorkerInitOptions {\n publicDirectory: string;\n}\n\nasync function initializeBrowserServiceWorker({ publicDirectory }: BrowserServiceWorkerInitOptions) {\n const absolutePublicDirectory = path.resolve(publicDirectory);\n await filesystem.mkdir(absolutePublicDirectory, { recursive: true });\n\n const destinationPath = path.join(absolutePublicDirectory, SERVICE_WORKER_FILE_NAME);\n await filesystem.copyFile(MOCK_SERVICE_WORKER_PATH, destinationPath);\n\n logWithPrefix(`Service worker script saved to ${chalk.green(destinationPath)}!`);\n logWithPrefix('You can now use browser interceptors!');\n}\n\nexport default initializeBrowserServiceWorker;\n","import createCachedDynamicImport from '@zimic/utils/import/createCachedDynamicImport';\n\nexport const PROCESS_EXIT_EVENTS = Object.freeze([\n 'beforeExit',\n 'uncaughtExceptionMonitor',\n 'SIGINT',\n 'SIGTERM',\n 'SIGHUP',\n 'SIGBREAK',\n] as const);\n\nexport type ProcessExitEvent = (typeof PROCESS_EXIT_EVENTS)[number];\n\n// Having an undefined exit code means that the process will already exit with the default exit code.\nexport const PROCESS_EXIT_CODE_BY_EXIT_EVENT: Record<string, number | undefined> = {\n beforeExit: undefined,\n uncaughtExceptionMonitor: undefined,\n SIGINT: 130,\n SIGTERM: 143,\n SIGHUP: 129,\n SIGBREAK: 131,\n} satisfies Record<ProcessExitEvent, number | undefined>;\n\nexport const importExeca = createCachedDynamicImport(() => import('execa'));\n\ninterface CommandErrorOptions {\n command?: string[];\n exitCode?: number;\n signal?: NodeJS.Signals;\n originalMessage?: string;\n}\n\nexport class CommandError extends Error {\n static readonly DEFAULT_EXIT_CODE = 1;\n\n readonly command: string[];\n readonly exitCode: number;\n readonly signal?: NodeJS.Signals;\n\n constructor(executable: string, options: CommandErrorOptions) {\n const message = CommandError.createMessage(executable, options);\n super(message);\n\n this.name = 'CommandError';\n this.command = options.command ?? [executable];\n this.exitCode = this.getExitCode(options);\n this.signal = options.signal;\n }\n\n private getExitCode(options: CommandErrorOptions): number {\n const existingExitCode = options.exitCode;\n const exitCodeInferredFromSignal =\n options.signal === undefined ? undefined : PROCESS_EXIT_CODE_BY_EXIT_EVENT[options.signal];\n\n return existingExitCode ?? exitCodeInferredFromSignal ?? CommandError.DEFAULT_EXIT_CODE;\n }\n\n private static createMessage(command: string, options: CommandErrorOptions) {\n const suffix = options.originalMessage ? `: ${options.originalMessage}` : '';\n\n if (options.exitCode === undefined && options.signal === undefined) {\n return `Command '${command}' failed${suffix}`;\n }\n\n const prefix = `Command '${command}' exited `;\n const infix = options.exitCode === undefined ? `after signal ${options.signal}` : `with code ${options.exitCode}`;\n\n return `${prefix}${infix}${suffix}`;\n }\n}\n\nexport async function runCommand(command: string, commandArguments: string[]) {\n const { execa: $, ExecaError } = await importExeca();\n\n try {\n await $(command, commandArguments, { stdio: 'inherit' });\n } catch (error) {\n /* istanbul ignore if -- @preserve\n * This is a safeguard if the error is not an ExecaError. It is not expected to run. */\n if (!(error instanceof ExecaError)) {\n throw error;\n }\n\n const commandError = new CommandError(command, {\n command: [command, ...commandArguments],\n exitCode: error.exitCode,\n signal: error.signal,\n originalMessage: error.originalMessage,\n });\n\n throw commandError;\n }\n}\n","import { InterceptorServer, interceptorServer } from '@/server';\nimport { InterceptorServerOptions } from '@/server/types/options';\nimport { logWithPrefix } from '@/utils/console';\nimport {\n CommandError,\n PROCESS_EXIT_CODE_BY_EXIT_EVENT,\n PROCESS_EXIT_EVENTS,\n ProcessExitEvent,\n runCommand,\n} from '@/utils/processes';\n\ninterface InterceptorServerStartOptions extends InterceptorServerOptions {\n ephemeral: boolean;\n onReady?: {\n command: string;\n arguments: string[];\n };\n}\n\nexport let serverSingleton: InterceptorServer | undefined;\n\nasync function startInterceptorServer({\n hostname,\n port,\n ephemeral,\n logUnhandledRequests,\n onReady,\n}: InterceptorServerStartOptions) {\n const server = interceptorServer.create({\n hostname,\n port,\n logUnhandledRequests,\n });\n\n async function handleExitEvent(exitEvent: ProcessExitEvent | undefined) {\n await server.stop();\n\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n for (const { exitEvent, exitHandler } of exitHandlerGroups) {\n process.off(exitEvent, exitHandler);\n }\n\n const exitCode = exitEvent ? PROCESS_EXIT_CODE_BY_EXIT_EVENT[exitEvent] : undefined;\n if (exitCode !== undefined) {\n process.exit(exitCode);\n }\n }\n\n const exitHandlerGroups = PROCESS_EXIT_EVENTS.map((exitEvent) => ({\n exitEvent,\n exitHandler: handleExitEvent.bind(null, exitEvent),\n }));\n\n for (const { exitEvent, exitHandler } of exitHandlerGroups) {\n process.on(exitEvent, exitHandler);\n }\n\n serverSingleton = server;\n\n await server.start();\n\n logWithPrefix(`${ephemeral ? 'Ephemeral s' : 'S'}erver is running on ${server.httpURL()}`);\n\n if (onReady) {\n try {\n await runCommand(onReady.command, onReady.arguments);\n } catch (error) {\n console.error(error);\n\n /* istanbul ignore if -- @preserve\n * A CommandError is always expected here. */\n if (!(error instanceof CommandError)) {\n throw error;\n }\n\n process.exit(error.exitCode);\n }\n }\n\n if (ephemeral) {\n await handleExitEvent(undefined);\n process.exit(0);\n }\n}\n\nexport default startInterceptorServer;\n","import yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\nimport { version } from '@@/package.json';\n\nimport initializeBrowserServiceWorker from './browser/init';\nimport startInterceptorServer from './server/start';\n\nasync function runCLI() {\n await yargs(hideBin(process.argv))\n .scriptName('zimic-interceptor')\n .version(version)\n .showHelpOnFail(false)\n .strict()\n\n .command('browser', 'Manage your browser mock configuration', (yargs) =>\n yargs.demandCommand().command(\n 'init <publicDirectory>',\n 'Initialize the browser service worker configuration.',\n (yargs) =>\n yargs.positional('publicDirectory', {\n type: 'string',\n description: 'The path to the public directory of your application.',\n demandOption: true,\n }),\n async (cliArguments) => {\n await initializeBrowserServiceWorker({\n publicDirectory: cliArguments.publicDirectory,\n });\n },\n ),\n )\n\n .command('server', 'Manage interceptor servers', (yargs) =>\n yargs.demandCommand().command(\n 'start [-- onReady]',\n 'Start an interceptor server.',\n (yargs) =>\n yargs\n .positional('onReady', {\n description: 'A command to run when the server is ready to accept connections.',\n type: 'string',\n })\n .option('hostname', {\n type: 'string',\n description: 'The hostname to start the server on.',\n alias: 'h',\n default: 'localhost',\n })\n .option('port', {\n type: 'number',\n description: 'The port to start the server on.',\n alias: 'p',\n })\n .option('ephemeral', {\n type: 'boolean',\n description:\n 'Whether the server should stop automatically after the on-ready command finishes. ' +\n 'If no on-ready command is provided and ephemeral is true, the server will stop immediately after ' +\n 'starting.',\n alias: 'e',\n default: false,\n })\n .option('log-unhandled-requests', {\n type: 'boolean',\n description:\n 'Whether to log a warning when no interceptors were found for the base URL of a request. ' +\n 'If an interceptor was matched, the logging behavior for that base URL is configured in the ' +\n 'interceptor itself.',\n alias: 'l',\n }),\n async (cliArguments) => {\n const onReadyCommand = cliArguments._.at(2)?.toString();\n const onReadyCommandArguments = cliArguments._.slice(3).map((argument) => argument.toString());\n\n await startInterceptorServer({\n hostname: cliArguments.hostname,\n port: cliArguments.port,\n ephemeral: cliArguments.ephemeral,\n logUnhandledRequests: cliArguments.logUnhandledRequests,\n onReady: onReadyCommand\n ? {\n command: onReadyCommand.toString(),\n arguments: onReadyCommandArguments,\n }\n : undefined,\n });\n },\n ),\n )\n\n .parse();\n}\n\nexport default runCLI;\n","#!/usr/bin/env node\nimport runCLI from './cli';\n\nvoid runCLI();\n"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/cli/browser/shared/constants.ts","../src/cli/browser/init.ts","../src/utils/processes.ts","../src/cli/server/start.ts","../src/cli/cli.ts","../src/cli/index.ts"],"names":["exitEvent","yargs"],"mappings":";;;;;;;;;;AAgBE,IAAW,OAAA,GAAA,kBAAA;;;AChBN,IAAM,wBAA2B,GAAA,sBAAA;;;ACQxC,IAAM,aAAA,GAAgB,KAAK,IAAK,CAAA,SAAA,CAAQ,QAAQ,KAAK,CAAA,EAAG,IAAM,EAAA,IAAA,EAAM,IAAI,CAAA;AACjE,IAAM,wBAA2B,GAAA,IAAA,CAAK,IAAK,CAAA,aAAA,EAAe,OAAO,wBAAwB,CAAA;AAMhG,eAAe,8BAAA,CAA+B,EAAE,eAAA,EAAoD,EAAA;AAClG,EAAM,MAAA,uBAAA,GAA0B,IAAK,CAAA,OAAA,CAAQ,eAAe,CAAA;AAC5D,EAAA,MAAM,WAAW,KAAM,CAAA,uBAAA,EAAyB,EAAE,SAAA,EAAW,MAAM,CAAA;AAEnE,EAAA,MAAM,eAAkB,GAAA,IAAA,CAAK,IAAK,CAAA,uBAAA,EAAyB,wBAAwB,CAAA;AACnF,EAAM,MAAA,UAAA,CAAW,QAAS,CAAA,wBAAA,EAA0B,eAAe,CAAA;AAEnE,EAAA,aAAA,CAAc,CAAkC,+BAAA,EAAA,KAAA,CAAM,KAAM,CAAA,eAAe,CAAC,CAAG,CAAA,CAAA,CAAA;AAC/E,EAAA,aAAA,CAAc,uCAAuC,CAAA;AACvD;AATe,MAAA,CAAA,8BAAA,EAAA,gCAAA,CAAA;AAWf,IAAO,YAAQ,GAAA,8BAAA;;;ACxBR,IAAM,mBAAA,GAAsB,OAAO,MAAO,CAAA;AAAA,EAC/C,YAAA;AAAA,EACA,0BAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAU,CAAA;AAKH,IAAM,+BAAsE,GAAA;AAAA,EACjF,UAAY,EAAA,MAAA;AAAA,EACZ,wBAA0B,EAAA,MAAA;AAAA,EAC1B,MAAQ,EAAA,GAAA;AAAA,EACR,OAAS,EAAA,GAAA;AAAA,EACT,MAAQ,EAAA,GAAA;AAAA,EACR,QAAU,EAAA;AACZ,CAAA;AAEO,IAAM,WAAc,GAAA,iCAAA,CAA0B,MAAM,OAAO,OAAO,CAAC,CAAA;AASnE,IAAM,YAAA,GAAN,MAAM,aAAA,SAAqB,KAAM,CAAA;AAAA,EAhCxC;AAgCwC,IAAA,MAAA,CAAA,IAAA,EAAA,cAAA,CAAA;AAAA;AAAA,EACtC,OAAgB,iBAAoB,GAAA,CAAA;AAAA,EAE3B,OAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EAET,WAAA,CAAY,YAAoB,OAA8B,EAAA;AAC5D,IAAA,MAAM,OAAU,GAAA,aAAA,CAAa,aAAc,CAAA,UAAA,EAAY,OAAO,CAAA;AAC9D,IAAA,KAAA,CAAM,OAAO,CAAA;AAEb,IAAA,IAAA,CAAK,IAAO,GAAA,cAAA;AACZ,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA,CAAQ,OAAW,IAAA,CAAC,UAAU,CAAA;AAC7C,IAAK,IAAA,CAAA,QAAA,GAAW,IAAK,CAAA,WAAA,CAAY,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,SAAS,OAAQ,CAAA,MAAA;AAAA;AACxB,EAEQ,YAAY,OAAsC,EAAA;AACxD,IAAA,MAAM,mBAAmB,OAAQ,CAAA,QAAA;AACjC,IAAA,MAAM,6BACJ,OAAQ,CAAA,MAAA,KAAW,SAAY,MAAY,GAAA,+BAAA,CAAgC,QAAQ,MAAM,CAAA;AAE3F,IAAO,OAAA,gBAAA,IAAoB,8BAA8B,aAAa,CAAA,iBAAA;AAAA;AACxE,EAEA,OAAe,aAAc,CAAA,OAAA,EAAiB,OAA8B,EAAA;AAC1E,IAAA,MAAM,SAAS,OAAQ,CAAA,eAAA,GAAkB,CAAK,EAAA,EAAA,OAAA,CAAQ,eAAe,CAAK,CAAA,GAAA,EAAA;AAE1E,IAAA,IAAI,OAAQ,CAAA,QAAA,KAAa,MAAa,IAAA,OAAA,CAAQ,WAAW,MAAW,EAAA;AAClE,MAAO,OAAA,CAAA,SAAA,EAAY,OAAO,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA;AAAA;AAG7C,IAAM,MAAA,MAAA,GAAS,YAAY,OAAO,CAAA,SAAA,CAAA;AAClC,IAAM,MAAA,KAAA,GAAQ,OAAQ,CAAA,QAAA,KAAa,MAAY,GAAA,CAAA,aAAA,EAAgB,QAAQ,MAAM,CAAA,CAAA,GAAK,CAAa,UAAA,EAAA,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAE/G,IAAA,OAAO,CAAG,EAAA,MAAM,CAAG,EAAA,KAAK,GAAG,MAAM,CAAA,CAAA;AAAA;AAErC,CAAA;AAEA,eAAsB,UAAA,CAAW,SAAiB,gBAA4B,EAAA;AAC5E,EAAA,MAAM,EAAE,KAAO,EAAA,CAAA,EAAG,UAAW,EAAA,GAAI,MAAM,WAAY,EAAA;AAEnD,EAAI,IAAA;AACF,IAAA,MAAM,EAAE,OAAS,EAAA,gBAAA,EAAkB,EAAE,KAAA,EAAO,WAAW,CAAA;AAAA,WAChD,KAAO,EAAA;AAGd,IAAI,IAAA,EAAE,iBAAiB,UAAa,CAAA,EAAA;AAClC,MAAM,MAAA,KAAA;AAAA;AAGR,IAAM,MAAA,YAAA,GAAe,IAAI,YAAA,CAAa,OAAS,EAAA;AAAA,MAC7C,OAAS,EAAA,CAAC,OAAS,EAAA,GAAG,gBAAgB,CAAA;AAAA,MACtC,UAAU,KAAM,CAAA,QAAA;AAAA,MAChB,QAAQ,KAAM,CAAA,MAAA;AAAA,MACd,iBAAiB,KAAM,CAAA;AAAA,KACxB,CAAA;AAED,IAAM,MAAA,YAAA;AAAA;AAEV;AArBsB,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AClDtB,eAAe,sBAAuB,CAAA;AAAA,EACpC,QAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAkC,EAAA;AAChC,EAAM,MAAA,MAAA,GAAS,kBAAkB,MAAO,CAAA;AAAA,IACtC,QAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,eAAe,gBAAgB,SAAyC,EAAA;AACtE,IAAA,MAAM,OAAO,IAAK,EAAA;AAGlB,IAAA,KAAA,MAAW,EAAE,SAAA,EAAAA,UAAW,EAAA,WAAA,MAAiB,iBAAmB,EAAA;AAC1D,MAAQ,OAAA,CAAA,GAAA,CAAIA,YAAW,WAAW,CAAA;AAAA;AAGpC,IAAA,MAAM,QAAW,GAAA,SAAA,GAAY,+BAAgC,CAAA,SAAS,CAAI,GAAA,MAAA;AAC1E,IAAA,IAAI,aAAa,MAAW,EAAA;AAC1B,MAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA;AACvB;AAXa,EAAA,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAcf,EAAA,MAAM,iBAAoB,GAAA,mBAAA,CAAoB,GAAI,CAAA,CAAC,SAAe,MAAA;AAAA,IAChE,SAAA;AAAA,IACA,WAAa,EAAA,eAAA,CAAgB,IAAK,CAAA,IAAA,EAAM,SAAS;AAAA,GACjD,CAAA,CAAA;AAEF,EAAA,KAAA,MAAW,EAAE,SAAA,EAAW,WAAY,EAAA,IAAK,iBAAmB,EAAA;AAC1D,IAAQ,OAAA,CAAA,EAAA,CAAG,WAAW,WAAW,CAAA;AAAA;AAKnC,EAAA,MAAM,OAAO,KAAM,EAAA;AAEnB,EAAc,aAAA,CAAA,CAAA,EAAG,YAAY,aAAgB,GAAA,GAAG,uBAAuB,MAAO,CAAA,OAAA,EAAS,CAAE,CAAA,CAAA;AAEzF,EAAA,IAAI,OAAS,EAAA;AACX,IAAI,IAAA;AACF,MAAA,MAAM,UAAW,CAAA,OAAA,CAAQ,OAAS,EAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,aAC5C,KAAO,EAAA;AACd,MAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAInB,MAAI,IAAA,EAAE,iBAAiB,YAAe,CAAA,EAAA;AACpC,QAAM,MAAA,KAAA;AAAA;AAGR,MAAQ,OAAA,CAAA,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA;AAC7B;AAGF,EAAA,IAAI,SAAW,EAAA;AACb,IAAA,MAAM,gBAAgB,MAAS,CAAA;AAC/B,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA;AAElB;AA9De,MAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;AAgEf,IAAO,aAAQ,GAAA,sBAAA;;;AC7Ef,eAAe,MAAS,GAAA;AACtB,EAAA,MAAM,MAAM,OAAQ,CAAA,OAAA,CAAQ,IAAI,CAAC,EAC9B,UAAW,CAAA,mBAAmB,CAC9B,CAAA,OAAA,CAAQ,OAAO,CACf,CAAA,cAAA,CAAe,KAAK,CAAA,CACpB,QAEA,CAAA,OAAA;AAAA,IAAQ,SAAA;AAAA,IAAW,wCAAA;AAAA,IAA0C,CAACC,MAAAA,KAC7DA,MAAM,CAAA,aAAA,EAAgB,CAAA,OAAA;AAAA,MACpB,wBAAA;AAAA,MACA,sDAAA;AAAA,MACA,CAACA,MAAAA,KACCA,MAAM,CAAA,UAAA,CAAW,iBAAmB,EAAA;AAAA,QAClC,IAAM,EAAA,QAAA;AAAA,QACN,WAAa,EAAA,uDAAA;AAAA,QACb,YAAc,EAAA;AAAA,OACf,CAAA;AAAA,MACH,OAAO,YAAiB,KAAA;AACtB,QAAA,MAAM,YAA+B,CAAA;AAAA,UACnC,iBAAiB,YAAa,CAAA;AAAA,SAC/B,CAAA;AAAA;AACH;AACF,GAGD,CAAA,OAAA;AAAA,IAAQ,QAAA;AAAA,IAAU,4BAAA;AAAA,IAA8B,CAACA,MAAAA,KAChDA,MAAM,CAAA,aAAA,EAAgB,CAAA,OAAA;AAAA,MACpB,oBAAA;AAAA,MACA,8BAAA;AAAA,MACA,CAACA,MAAAA,KACCA,MACG,CAAA,UAAA,CAAW,SAAW,EAAA;AAAA,QACrB,WAAa,EAAA,kEAAA;AAAA,QACb,IAAM,EAAA;AAAA,OACP,CACA,CAAA,MAAA,CAAO,UAAY,EAAA;AAAA,QAClB,IAAM,EAAA,QAAA;AAAA,QACN,WAAa,EAAA,sCAAA;AAAA,QACb,KAAO,EAAA,GAAA;AAAA,QACP,OAAS,EAAA;AAAA,OACV,CACA,CAAA,MAAA,CAAO,MAAQ,EAAA;AAAA,QACd,IAAM,EAAA,QAAA;AAAA,QACN,WAAa,EAAA,kCAAA;AAAA,QACb,KAAO,EAAA;AAAA,OACR,CACA,CAAA,MAAA,CAAO,WAAa,EAAA;AAAA,QACnB,IAAM,EAAA,SAAA;AAAA,QACN,WACE,EAAA,8LAAA;AAAA,QAGF,KAAO,EAAA,GAAA;AAAA,QACP,OAAS,EAAA;AAAA,OACV,CACA,CAAA,MAAA,CAAO,wBAA0B,EAAA;AAAA,QAChC,IAAM,EAAA,SAAA;AAAA,QACN,WACE,EAAA,wMAAA;AAAA,QAGF,KAAO,EAAA;AAAA,OACR,CAAA;AAAA,MACL,OAAO,YAAiB,KAAA;AACtB,QAAA,MAAM,iBAAiB,YAAa,CAAA,CAAA,CAAE,EAAG,CAAA,CAAC,GAAG,QAAS,EAAA;AACtD,QAAM,MAAA,uBAAA,GAA0B,YAAa,CAAA,CAAA,CAAE,KAAM,CAAA,CAAC,CAAE,CAAA,GAAA,CAAI,CAAC,QAAA,KAAa,QAAS,CAAA,QAAA,EAAU,CAAA;AAE7F,QAAA,MAAM,aAAuB,CAAA;AAAA,UAC3B,UAAU,YAAa,CAAA,QAAA;AAAA,UACvB,MAAM,YAAa,CAAA,IAAA;AAAA,UACnB,WAAW,YAAa,CAAA,SAAA;AAAA,UACxB,sBAAsB,YAAa,CAAA,oBAAA;AAAA,UACnC,SAAS,cACL,GAAA;AAAA,YACE,OAAA,EAAS,eAAe,QAAS,EAAA;AAAA,YACjC,SAAW,EAAA;AAAA,WAEb,GAAA;AAAA,SACL,CAAA;AAAA;AACH;AACF,IAGD,KAAM,EAAA;AACX;AApFe,MAAA,CAAA,MAAA,EAAA,QAAA,CAAA;AAsFf,IAAO,WAAQ,GAAA,MAAA;;;AC3Ff,KAAK,WAAO,EAAA","file":"cli.mjs","sourcesContent":["{\n \"name\": \"@zimic/interceptor\",\n \"description\": \"TypeScript-first HTTP intercepting and mocking\",\n \"keywords\": [\n \"zimic\",\n \"typescript\",\n \"types\",\n \"typegen\",\n \"validation\",\n \"inference\",\n \"http\",\n \"interceptor\",\n \"mock\",\n \"api\",\n \"static\"\n ],\n \"version\": \"0.14.0-canary.26\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/zimicjs/zimic.git\",\n \"directory\": \"packages/zimic-interceptor\"\n },\n \"author\": {\n \"name\": \"Diego Aquino\",\n \"url\": \"https://github.com/diego-aquino\"\n },\n \"private\": false,\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n },\n \"engines\": {\n \"node\": \">=18.13.0\"\n },\n \"license\": \"MIT\",\n \"files\": [\n \"package.json\",\n \"README.md\",\n \"LICENSE.md\",\n \"src\",\n \"!src/**/tests\",\n \"!src/**/__tests__\",\n \"!src/**/*.test.ts\",\n \"dist\",\n \"index.d.ts\",\n \"http.d.ts\",\n \"server.d.ts\"\n ],\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"index.d.ts\",\n \"bin\": {\n \"zimic-interceptor\": \"./dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n },\n \"./http\": {\n \"types\": \"./http.d.ts\",\n \"import\": \"./dist/http.mjs\",\n \"require\": \"./dist/http.js\",\n \"default\": \"./dist/http.js\"\n },\n \"./server\": {\n \"types\": \"./server.d.ts\",\n \"import\": \"./dist/server.mjs\",\n \"require\": \"./dist/server.js\",\n \"default\": \"./dist/server.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"cli\": \"node ./dist/cli.js\",\n \"build\": \"tsup\",\n \"lint\": \"eslint --cache --no-error-on-unmatched-pattern --no-warn-ignored --fix\",\n \"lint:turbo\": \"pnpm lint . --max-warnings 0\",\n \"style\": \"prettier --log-level warn --ignore-unknown --no-error-on-unmatched-pattern --cache\",\n \"style:check\": \"pnpm style --check\",\n \"style:format\": \"pnpm style --write\",\n \"test\": \"dotenv -v NODE_ENV=test -- vitest\",\n \"test:turbo\": \"dotenv -v CI=true -- pnpm run test run --coverage\",\n \"types:check\": \"tsc --noEmit\",\n \"deps:install-playwright\": \"playwright install chromium\",\n \"deps:init-msw\": \"msw init ./public --no-save\",\n \"deps:init\": \"pnpm deps:install-playwright && pnpm deps:init-msw\",\n \"postinstall\": \"node -e \\\"try{require('./dist/scripts/postinstall')}catch(error){console.error(error)}\\\"\"\n },\n \"dependencies\": {\n \"@whatwg-node/server\": \"0.9.70\",\n \"chalk\": \"4.1.2\",\n \"execa\": \"9.5.2\",\n \"isomorphic-ws\": \"5.0.0\",\n \"msw\": \"2.7.3\",\n \"ws\": \"8.18.1\",\n \"yargs\": \"17.7.2\"\n },\n \"optionalDependencies\": {\n \"bufferutil\": \"4.0.9\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.13.8\",\n \"@types/ws\": \"^8.5.14\",\n \"@types/yargs\": \"^17.0.33\",\n \"@vitest/browser\": \"^3.0.7\",\n \"@vitest/coverage-istanbul\": \"^3.0.7\",\n \"@zimic/eslint-config-node\": \"workspace:*\",\n \"@zimic/lint-staged-config\": \"workspace:*\",\n \"@zimic/tsconfig\": \"workspace:*\",\n \"@zimic/utils\": \"workspace:*\",\n \"dotenv-cli\": \"^8.0.0\",\n \"eslint\": \"^9.21.0\",\n \"playwright\": \"^1.50.1\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.8.2\",\n \"vitest\": \"^3.0.7\"\n },\n \"peerDependencies\": {\n \"@zimic/http\": \"^0.1.0 || ^0.1.0-canary.0\",\n \"typescript\": \">=4.8.0\"\n },\n \"peerDependenciesMeta\": {\n \"typescript\": {\n \"optional\": true\n }\n }\n}\n","export const SERVICE_WORKER_FILE_NAME = 'mockServiceWorker.js';\n","import chalk from 'chalk';\nimport filesystem from 'fs/promises';\nimport path from 'path';\n\nimport { logWithPrefix } from '@/utils/console';\n\nimport { SERVICE_WORKER_FILE_NAME } from './shared/constants';\n\nconst MSW_ROOT_PATH = path.join(require.resolve('msw'), '..', '..', '..');\nexport const MOCK_SERVICE_WORKER_PATH = path.join(MSW_ROOT_PATH, 'lib', SERVICE_WORKER_FILE_NAME);\n\ninterface BrowserServiceWorkerInitOptions {\n publicDirectory: string;\n}\n\nasync function initializeBrowserServiceWorker({ publicDirectory }: BrowserServiceWorkerInitOptions) {\n const absolutePublicDirectory = path.resolve(publicDirectory);\n await filesystem.mkdir(absolutePublicDirectory, { recursive: true });\n\n const destinationPath = path.join(absolutePublicDirectory, SERVICE_WORKER_FILE_NAME);\n await filesystem.copyFile(MOCK_SERVICE_WORKER_PATH, destinationPath);\n\n logWithPrefix(`Service worker script saved to ${chalk.green(destinationPath)}!`);\n logWithPrefix('You can now use browser interceptors!');\n}\n\nexport default initializeBrowserServiceWorker;\n","import createCachedDynamicImport from '@zimic/utils/import/createCachedDynamicImport';\n\nexport const PROCESS_EXIT_EVENTS = Object.freeze([\n 'beforeExit',\n 'uncaughtExceptionMonitor',\n 'SIGINT',\n 'SIGTERM',\n 'SIGHUP',\n 'SIGBREAK',\n] as const);\n\nexport type ProcessExitEvent = (typeof PROCESS_EXIT_EVENTS)[number];\n\n// Having an undefined exit code means that the process will already exit with the default exit code.\nexport const PROCESS_EXIT_CODE_BY_EXIT_EVENT: Record<string, number | undefined> = {\n beforeExit: undefined,\n uncaughtExceptionMonitor: undefined,\n SIGINT: 130,\n SIGTERM: 143,\n SIGHUP: 129,\n SIGBREAK: 131,\n} satisfies Record<ProcessExitEvent, number | undefined>;\n\nexport const importExeca = createCachedDynamicImport(() => import('execa'));\n\ninterface CommandErrorOptions {\n command?: string[];\n exitCode?: number;\n signal?: NodeJS.Signals;\n originalMessage?: string;\n}\n\nexport class CommandError extends Error {\n static readonly DEFAULT_EXIT_CODE = 1;\n\n readonly command: string[];\n readonly exitCode: number;\n readonly signal?: NodeJS.Signals;\n\n constructor(executable: string, options: CommandErrorOptions) {\n const message = CommandError.createMessage(executable, options);\n super(message);\n\n this.name = 'CommandError';\n this.command = options.command ?? [executable];\n this.exitCode = this.getExitCode(options);\n this.signal = options.signal;\n }\n\n private getExitCode(options: CommandErrorOptions): number {\n const existingExitCode = options.exitCode;\n const exitCodeInferredFromSignal =\n options.signal === undefined ? undefined : PROCESS_EXIT_CODE_BY_EXIT_EVENT[options.signal];\n\n return existingExitCode ?? exitCodeInferredFromSignal ?? CommandError.DEFAULT_EXIT_CODE;\n }\n\n private static createMessage(command: string, options: CommandErrorOptions) {\n const suffix = options.originalMessage ? `: ${options.originalMessage}` : '';\n\n if (options.exitCode === undefined && options.signal === undefined) {\n return `Command '${command}' failed${suffix}`;\n }\n\n const prefix = `Command '${command}' exited `;\n const infix = options.exitCode === undefined ? `after signal ${options.signal}` : `with code ${options.exitCode}`;\n\n return `${prefix}${infix}${suffix}`;\n }\n}\n\nexport async function runCommand(command: string, commandArguments: string[]) {\n const { execa: $, ExecaError } = await importExeca();\n\n try {\n await $(command, commandArguments, { stdio: 'inherit' });\n } catch (error) {\n /* istanbul ignore if -- @preserve\n * This is a safeguard if the error is not an ExecaError. It is not expected to run. */\n if (!(error instanceof ExecaError)) {\n throw error;\n }\n\n const commandError = new CommandError(command, {\n command: [command, ...commandArguments],\n exitCode: error.exitCode,\n signal: error.signal,\n originalMessage: error.originalMessage,\n });\n\n throw commandError;\n }\n}\n","import { InterceptorServer, interceptorServer } from '@/server';\nimport { InterceptorServerOptions } from '@/server/types/options';\nimport { logWithPrefix } from '@/utils/console';\nimport {\n CommandError,\n PROCESS_EXIT_CODE_BY_EXIT_EVENT,\n PROCESS_EXIT_EVENTS,\n ProcessExitEvent,\n runCommand,\n} from '@/utils/processes';\n\ninterface InterceptorServerStartOptions extends InterceptorServerOptions {\n ephemeral: boolean;\n onReady?: {\n command: string;\n arguments: string[];\n };\n}\n\nexport let serverSingleton: InterceptorServer | undefined;\n\nasync function startInterceptorServer({\n hostname,\n port,\n ephemeral,\n logUnhandledRequests,\n onReady,\n}: InterceptorServerStartOptions) {\n const server = interceptorServer.create({\n hostname,\n port,\n logUnhandledRequests,\n });\n\n async function handleExitEvent(exitEvent: ProcessExitEvent | undefined) {\n await server.stop();\n\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n for (const { exitEvent, exitHandler } of exitHandlerGroups) {\n process.off(exitEvent, exitHandler);\n }\n\n const exitCode = exitEvent ? PROCESS_EXIT_CODE_BY_EXIT_EVENT[exitEvent] : undefined;\n if (exitCode !== undefined) {\n process.exit(exitCode);\n }\n }\n\n const exitHandlerGroups = PROCESS_EXIT_EVENTS.map((exitEvent) => ({\n exitEvent,\n exitHandler: handleExitEvent.bind(null, exitEvent),\n }));\n\n for (const { exitEvent, exitHandler } of exitHandlerGroups) {\n process.on(exitEvent, exitHandler);\n }\n\n serverSingleton = server;\n\n await server.start();\n\n logWithPrefix(`${ephemeral ? 'Ephemeral s' : 'S'}erver is running on ${server.httpURL()}`);\n\n if (onReady) {\n try {\n await runCommand(onReady.command, onReady.arguments);\n } catch (error) {\n console.error(error);\n\n /* istanbul ignore if -- @preserve\n * A CommandError is always expected here. */\n if (!(error instanceof CommandError)) {\n throw error;\n }\n\n process.exit(error.exitCode);\n }\n }\n\n if (ephemeral) {\n await handleExitEvent(undefined);\n process.exit(0);\n }\n}\n\nexport default startInterceptorServer;\n","import yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\nimport { version } from '@@/package.json';\n\nimport initializeBrowserServiceWorker from './browser/init';\nimport startInterceptorServer from './server/start';\n\nasync function runCLI() {\n await yargs(hideBin(process.argv))\n .scriptName('zimic-interceptor')\n .version(version)\n .showHelpOnFail(false)\n .strict()\n\n .command('browser', 'Manage your browser mock configuration', (yargs) =>\n yargs.demandCommand().command(\n 'init <publicDirectory>',\n 'Initialize the browser service worker configuration.',\n (yargs) =>\n yargs.positional('publicDirectory', {\n type: 'string',\n description: 'The path to the public directory of your application.',\n demandOption: true,\n }),\n async (cliArguments) => {\n await initializeBrowserServiceWorker({\n publicDirectory: cliArguments.publicDirectory,\n });\n },\n ),\n )\n\n .command('server', 'Manage interceptor servers', (yargs) =>\n yargs.demandCommand().command(\n 'start [-- onReady]',\n 'Start an interceptor server.',\n (yargs) =>\n yargs\n .positional('onReady', {\n description: 'A command to run when the server is ready to accept connections.',\n type: 'string',\n })\n .option('hostname', {\n type: 'string',\n description: 'The hostname to start the server on.',\n alias: 'h',\n default: 'localhost',\n })\n .option('port', {\n type: 'number',\n description: 'The port to start the server on.',\n alias: 'p',\n })\n .option('ephemeral', {\n type: 'boolean',\n description:\n 'Whether the server should stop automatically after the on-ready command finishes. ' +\n 'If no on-ready command is provided and ephemeral is true, the server will stop immediately after ' +\n 'starting.',\n alias: 'e',\n default: false,\n })\n .option('log-unhandled-requests', {\n type: 'boolean',\n description:\n 'Whether to log a warning when no interceptors were found for the base URL of a request. ' +\n 'If an interceptor was matched, the logging behavior for that base URL is configured in the ' +\n 'interceptor itself.',\n alias: 'l',\n }),\n async (cliArguments) => {\n const onReadyCommand = cliArguments._.at(2)?.toString();\n const onReadyCommandArguments = cliArguments._.slice(3).map((argument) => argument.toString());\n\n await startInterceptorServer({\n hostname: cliArguments.hostname,\n port: cliArguments.port,\n ephemeral: cliArguments.ephemeral,\n logUnhandledRequests: cliArguments.logUnhandledRequests,\n onReady: onReadyCommand\n ? {\n command: onReadyCommand.toString(),\n arguments: onReadyCommandArguments,\n }\n : undefined,\n });\n },\n ),\n )\n\n .parse();\n}\n\nexport default runCLI;\n","#!/usr/bin/env node\nimport runCLI from './cli';\n\nvoid runCLI();\n"]}
|
package/dist/http.d.ts
CHANGED
|
@@ -200,7 +200,7 @@ interface SharedHttpInterceptorOptions {
|
|
|
200
200
|
*
|
|
201
201
|
* @default false
|
|
202
202
|
* @see {@link https://github.com/zimicjs/zimic/wiki/api‐zimic‐interceptor‐http#saving-requests Saving intercepted requests}
|
|
203
|
-
* @see {@link https://github.com/zimicjs/zimic/wiki/guides‐testing Testing}
|
|
203
|
+
* @see {@link https://github.com/zimicjs/zimic/wiki/guides‐testing‐interceptor Testing}
|
|
204
204
|
*/
|
|
205
205
|
saveRequests?: boolean;
|
|
206
206
|
}
|
|
@@ -1280,7 +1280,7 @@ declare class TimesCheckError extends TypeError {
|
|
|
1280
1280
|
* // };
|
|
1281
1281
|
* // }
|
|
1282
1282
|
*
|
|
1283
|
-
* @see {@link https://github.com/zimicjs/zimic/wiki/api‐zimic‐
|
|
1283
|
+
* @see {@link https://github.com/zimicjs/zimic/wiki/api‐zimic‐http‐schemas Declaring service schemas}
|
|
1284
1284
|
*/
|
|
1285
1285
|
type InferHttpInterceptorSchema<Interceptor> = Interceptor extends LocalHttpInterceptor<infer Schema> ? Schema : Interceptor extends RemoteHttpInterceptor<infer Schema> ? Schema : never;
|
|
1286
1286
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zimic/interceptor",
|
|
3
|
-
"description": "TypeScript-first HTTP
|
|
3
|
+
"description": "TypeScript-first HTTP intercepting and mocking",
|
|
4
4
|
"keywords": [
|
|
5
5
|
"zimic",
|
|
6
6
|
"typescript",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"api",
|
|
15
15
|
"static"
|
|
16
16
|
],
|
|
17
|
-
"version": "0.14.0-canary.
|
|
17
|
+
"version": "0.14.0-canary.26",
|
|
18
18
|
"repository": {
|
|
19
19
|
"type": "git",
|
|
20
20
|
"url": "https://github.com/zimicjs/zimic.git",
|
|
@@ -126,7 +126,6 @@
|
|
|
126
126
|
"deps:install-playwright": "playwright install chromium",
|
|
127
127
|
"deps:init-msw": "msw init ./public --no-save",
|
|
128
128
|
"deps:init": "pnpm deps:install-playwright && pnpm deps:init-msw",
|
|
129
|
-
"postinstall": "node -e \"try{require('./dist/scripts/postinstall')}catch(error){console.error(error)}\""
|
|
130
|
-
"prepublish:patch-relative-paths": "sed -E -i 's/\\]\\(\\.\\/([^\\)]+)\\)/](..\\/..\\/\\1)/g;s/\"\\.\\/([^\"]+)\"/\"..\\/..\\/\\1\"/g'"
|
|
129
|
+
"postinstall": "node -e \"try{require('./dist/scripts/postinstall')}catch(error){console.error(error)}\""
|
|
131
130
|
}
|
|
132
131
|
}
|
|
@@ -132,7 +132,7 @@ export interface SharedHttpInterceptorOptions {
|
|
|
132
132
|
*
|
|
133
133
|
* @default false
|
|
134
134
|
* @see {@link https://github.com/zimicjs/zimic/wiki/api‐zimic‐interceptor‐http#saving-requests Saving intercepted requests}
|
|
135
|
-
* @see {@link https://github.com/zimicjs/zimic/wiki/guides‐testing Testing}
|
|
135
|
+
* @see {@link https://github.com/zimicjs/zimic/wiki/guides‐testing‐interceptor Testing}
|
|
136
136
|
*/
|
|
137
137
|
saveRequests?: boolean;
|
|
138
138
|
}
|
|
@@ -27,7 +27,7 @@ import { LocalHttpInterceptor, RemoteHttpInterceptor } from './public';
|
|
|
27
27
|
* // };
|
|
28
28
|
* // }
|
|
29
29
|
*
|
|
30
|
-
* @see {@link https://github.com/zimicjs/zimic/wiki/api‐zimic‐
|
|
30
|
+
* @see {@link https://github.com/zimicjs/zimic/wiki/api‐zimic‐http‐schemas Declaring service schemas}
|
|
31
31
|
*/
|
|
32
32
|
export type InferHttpInterceptorSchema<Interceptor> =
|
|
33
33
|
Interceptor extends LocalHttpInterceptor<infer Schema>
|