@fias/plugin-dev-harness 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bridge/live-handler.d.ts +27 -0
- package/dist/bridge/live-handler.d.ts.map +1 -0
- package/dist/bridge/live-handler.js +47 -0
- package/dist/bridge/live-handler.js.map +1 -0
- package/dist/bridge/live-handler.test.d.ts +2 -0
- package/dist/bridge/live-handler.test.d.ts.map +1 -0
- package/dist/bridge/live-handler.test.js +182 -0
- package/dist/bridge/live-handler.test.js.map +1 -0
- package/dist/bridge/mock-handler.d.ts +25 -0
- package/dist/bridge/mock-handler.d.ts.map +1 -0
- package/dist/bridge/mock-handler.js +81 -0
- package/dist/bridge/mock-handler.js.map +1 -0
- package/dist/bridge/mock-handler.test.d.ts +2 -0
- package/dist/bridge/mock-handler.test.d.ts.map +1 -0
- package/dist/bridge/mock-handler.test.js +322 -0
- package/dist/bridge/mock-handler.test.js.map +1 -0
- package/dist/bridge/types.d.ts +18 -0
- package/dist/bridge/types.d.ts.map +1 -0
- package/dist/bridge/types.js +8 -0
- package/dist/bridge/types.js.map +1 -0
- package/dist/cli/dev.d.ts +15 -0
- package/dist/cli/dev.d.ts.map +1 -0
- package/dist/cli/dev.js +64 -0
- package/dist/cli/dev.js.map +1 -0
- package/dist/cli/dev.test.d.ts +2 -0
- package/dist/cli/dev.test.d.ts.map +1 -0
- package/dist/cli/dev.test.js +114 -0
- package/dist/cli/dev.test.js.map +1 -0
- package/dist/cli/entities.d.ts +9 -0
- package/dist/cli/entities.d.ts.map +1 -0
- package/dist/cli/entities.js +71 -0
- package/dist/cli/entities.js.map +1 -0
- package/dist/cli/entities.test.d.ts +2 -0
- package/dist/cli/entities.test.d.ts.map +1 -0
- package/dist/cli/entities.test.js +179 -0
- package/dist/cli/entities.test.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +29 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/index.test.d.ts +2 -0
- package/dist/cli/index.test.d.ts.map +1 -0
- package/dist/cli/index.test.js +55 -0
- package/dist/cli/index.test.js.map +1 -0
- package/dist/cli/login.d.ts +9 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/login.js +80 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/login.test.d.ts +2 -0
- package/dist/cli/login.test.d.ts.map +1 -0
- package/dist/cli/login.test.js +53 -0
- package/dist/cli/login.test.js.map +1 -0
- package/dist/cli/submit.d.ts +9 -0
- package/dist/cli/submit.d.ts.map +1 -0
- package/dist/cli/submit.js +250 -0
- package/dist/cli/submit.js.map +1 -0
- package/dist/cli/submit.test.d.ts +2 -0
- package/dist/cli/submit.test.d.ts.map +1 -0
- package/dist/cli/submit.test.js +381 -0
- package/dist/cli/submit.test.js.map +1 -0
- package/dist/cli/validate.d.ts +9 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +154 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/cli/validate.test.d.ts +2 -0
- package/dist/cli/validate.test.d.ts.map +1 -0
- package/dist/cli/validate.test.js +275 -0
- package/dist/cli/validate.test.js.map +1 -0
- package/dist/config/config-loader.d.ts +25 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +78 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-loader.test.d.ts +2 -0
- package/dist/config/config-loader.test.d.ts.map +1 -0
- package/dist/config/config-loader.test.js +163 -0
- package/dist/config/config-loader.test.js.map +1 -0
- package/dist/config/credentials.d.ts +11 -0
- package/dist/config/credentials.d.ts.map +1 -0
- package/dist/config/credentials.js +71 -0
- package/dist/config/credentials.js.map +1 -0
- package/dist/config/credentials.test.d.ts +2 -0
- package/dist/config/credentials.test.d.ts.map +1 -0
- package/dist/config/credentials.test.js +115 -0
- package/dist/config/credentials.test.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/mocks/entity-responses.d.ts +15 -0
- package/dist/mocks/entity-responses.d.ts.map +1 -0
- package/dist/mocks/entity-responses.js +21 -0
- package/dist/mocks/entity-responses.js.map +1 -0
- package/dist/mocks/entity-responses.test.d.ts +2 -0
- package/dist/mocks/entity-responses.test.d.ts.map +1 -0
- package/dist/mocks/entity-responses.test.js +53 -0
- package/dist/mocks/entity-responses.test.js.map +1 -0
- package/dist/mocks/theme.d.ts +22 -0
- package/dist/mocks/theme.d.ts.map +1 -0
- package/dist/mocks/theme.js +37 -0
- package/dist/mocks/theme.js.map +1 -0
- package/dist/mocks/theme.test.d.ts +2 -0
- package/dist/mocks/theme.test.d.ts.map +1 -0
- package/dist/mocks/theme.test.js +66 -0
- package/dist/mocks/theme.test.js.map +1 -0
- package/dist/mocks/user.d.ts +12 -0
- package/dist/mocks/user.d.ts.map +1 -0
- package/dist/mocks/user.js +14 -0
- package/dist/mocks/user.js.map +1 -0
- package/dist/mocks/user.test.d.ts +2 -0
- package/dist/mocks/user.test.d.ts.map +1 -0
- package/dist/mocks/user.test.js +23 -0
- package/dist/mocks/user.test.js.map +1 -0
- package/dist/server/harness-server.d.ts +24 -0
- package/dist/server/harness-server.d.ts.map +1 -0
- package/dist/server/harness-server.js +433 -0
- package/dist/server/harness-server.js.map +1 -0
- package/dist/server/harness-server.test.d.ts +2 -0
- package/dist/server/harness-server.test.d.ts.map +1 -0
- package/dist/server/harness-server.test.js +178 -0
- package/dist/server/harness-server.test.js.map +1 -0
- package/dist/server/static/harness.css +160 -0
- package/dist/server/static/harness.html +35 -0
- package/dist/server/static/harness.js +345 -0
- package/package.json +43 -0
- package/templates/fias-dev.config.json +12 -0
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const mock_handler_1 = require("./mock-handler");
|
|
4
|
+
const theme_1 = require("../mocks/theme");
|
|
5
|
+
describe('bridge/MockBridgeHandler', () => {
|
|
6
|
+
const defaultOptions = {
|
|
7
|
+
mockUser: {
|
|
8
|
+
userId: 'test_user_001',
|
|
9
|
+
displayName: 'Test User',
|
|
10
|
+
avatar: null,
|
|
11
|
+
},
|
|
12
|
+
mockTheme: 'dark',
|
|
13
|
+
};
|
|
14
|
+
let handler;
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
jest.useFakeTimers();
|
|
17
|
+
handler = new mock_handler_1.MockBridgeHandler({ ...defaultOptions });
|
|
18
|
+
});
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
jest.useRealTimers();
|
|
21
|
+
});
|
|
22
|
+
describe('get_user', () => {
|
|
23
|
+
it('returns the configured mock user', async () => {
|
|
24
|
+
const result = await handler.handle({ type: 'get_user', payload: {} });
|
|
25
|
+
expect(result).toEqual({
|
|
26
|
+
userId: 'test_user_001',
|
|
27
|
+
displayName: 'Test User',
|
|
28
|
+
avatar: null,
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
it('returns mock user with custom avatar', async () => {
|
|
32
|
+
const customHandler = new mock_handler_1.MockBridgeHandler({
|
|
33
|
+
...defaultOptions,
|
|
34
|
+
mockUser: {
|
|
35
|
+
userId: 'user_2',
|
|
36
|
+
displayName: 'Another User',
|
|
37
|
+
avatar: 'https://example.com/avatar.png',
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
const result = await customHandler.handle({ type: 'get_user', payload: {} });
|
|
41
|
+
expect(result).toEqual({
|
|
42
|
+
userId: 'user_2',
|
|
43
|
+
displayName: 'Another User',
|
|
44
|
+
avatar: 'https://example.com/avatar.png',
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('get_theme', () => {
|
|
49
|
+
it('returns dark theme when mockTheme is dark', async () => {
|
|
50
|
+
const result = await handler.handle({ type: 'get_theme', payload: {} });
|
|
51
|
+
expect(result).toEqual(theme_1.DARK_THEME);
|
|
52
|
+
});
|
|
53
|
+
it('returns light theme when mockTheme is light', async () => {
|
|
54
|
+
const lightHandler = new mock_handler_1.MockBridgeHandler({
|
|
55
|
+
...defaultOptions,
|
|
56
|
+
mockTheme: 'light',
|
|
57
|
+
});
|
|
58
|
+
const result = await lightHandler.handle({ type: 'get_theme', payload: {} });
|
|
59
|
+
expect(result).toEqual(theme_1.LIGHT_THEME);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe('entity_invoke', () => {
|
|
63
|
+
it('returns mock response with default delay', async () => {
|
|
64
|
+
const promise = handler.handle({
|
|
65
|
+
type: 'entity_invoke',
|
|
66
|
+
payload: { entityId: 'entity_test', input: 'hello world' },
|
|
67
|
+
});
|
|
68
|
+
// Advance past the default 1000ms delay
|
|
69
|
+
jest.advanceTimersByTime(1000);
|
|
70
|
+
const result = (await promise);
|
|
71
|
+
expect(result.output).toContain('[Mock]');
|
|
72
|
+
expect(result.output).toContain('entity_test');
|
|
73
|
+
expect(result.output).toContain('hello world');
|
|
74
|
+
expect(result.metadata).toEqual({
|
|
75
|
+
entityId: 'entity_test',
|
|
76
|
+
tokensUsed: 0,
|
|
77
|
+
cost: 0,
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
it('throws when entityId is missing', async () => {
|
|
81
|
+
await expect(handler.handle({
|
|
82
|
+
type: 'entity_invoke',
|
|
83
|
+
payload: { input: 'hello' },
|
|
84
|
+
})).rejects.toThrow('entityId and input are required');
|
|
85
|
+
});
|
|
86
|
+
it('throws when input is missing', async () => {
|
|
87
|
+
await expect(handler.handle({
|
|
88
|
+
type: 'entity_invoke',
|
|
89
|
+
payload: { entityId: 'entity_test' },
|
|
90
|
+
})).rejects.toThrow('entityId and input are required');
|
|
91
|
+
});
|
|
92
|
+
it('throws when both entityId and input are missing', async () => {
|
|
93
|
+
await expect(handler.handle({
|
|
94
|
+
type: 'entity_invoke',
|
|
95
|
+
payload: {},
|
|
96
|
+
})).rejects.toThrow('entityId and input are required');
|
|
97
|
+
});
|
|
98
|
+
it('uses custom mock entity response when configured', async () => {
|
|
99
|
+
const customHandler = new mock_handler_1.MockBridgeHandler({
|
|
100
|
+
...defaultOptions,
|
|
101
|
+
mockEntities: {
|
|
102
|
+
entity_summarize: {
|
|
103
|
+
response: 'Custom summary result',
|
|
104
|
+
delay: 500,
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
const promise = customHandler.handle({
|
|
109
|
+
type: 'entity_invoke',
|
|
110
|
+
payload: { entityId: 'entity_summarize', input: 'some text' },
|
|
111
|
+
});
|
|
112
|
+
jest.advanceTimersByTime(500);
|
|
113
|
+
const result = (await promise);
|
|
114
|
+
expect(result.output).toBe('Custom summary result');
|
|
115
|
+
expect(result.metadata.entityId).toBe('entity_summarize');
|
|
116
|
+
});
|
|
117
|
+
it('uses default delay of 1000 when custom mock has no delay specified', async () => {
|
|
118
|
+
const customHandler = new mock_handler_1.MockBridgeHandler({
|
|
119
|
+
...defaultOptions,
|
|
120
|
+
mockEntities: {
|
|
121
|
+
entity_no_delay: {
|
|
122
|
+
response: 'Response without delay config',
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
const promise = customHandler.handle({
|
|
127
|
+
type: 'entity_invoke',
|
|
128
|
+
payload: { entityId: 'entity_no_delay', input: 'test' },
|
|
129
|
+
});
|
|
130
|
+
// Should not resolve before 1000ms
|
|
131
|
+
jest.advanceTimersByTime(999);
|
|
132
|
+
// The promise should still be pending
|
|
133
|
+
jest.advanceTimersByTime(1);
|
|
134
|
+
const result = (await promise);
|
|
135
|
+
expect(result.output).toBe('Response without delay config');
|
|
136
|
+
});
|
|
137
|
+
it('falls back to default mock when entityId not in custom mocks', async () => {
|
|
138
|
+
const customHandler = new mock_handler_1.MockBridgeHandler({
|
|
139
|
+
...defaultOptions,
|
|
140
|
+
mockEntities: {
|
|
141
|
+
entity_summarize: { response: 'Summary' },
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
const promise = customHandler.handle({
|
|
145
|
+
type: 'entity_invoke',
|
|
146
|
+
payload: { entityId: 'entity_other', input: 'hello' },
|
|
147
|
+
});
|
|
148
|
+
jest.advanceTimersByTime(1000);
|
|
149
|
+
const result = (await promise);
|
|
150
|
+
expect(result.output).toContain('[Mock]');
|
|
151
|
+
expect(result.output).toContain('entity_other');
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
describe('storage_write and storage_read', () => {
|
|
155
|
+
it('writes and reads back content', async () => {
|
|
156
|
+
await handler.handle({
|
|
157
|
+
type: 'storage_write',
|
|
158
|
+
payload: { path: 'test.txt', content: 'Hello World' },
|
|
159
|
+
});
|
|
160
|
+
const result = (await handler.handle({
|
|
161
|
+
type: 'storage_read',
|
|
162
|
+
payload: { path: 'test.txt' },
|
|
163
|
+
}));
|
|
164
|
+
expect(result.exists).toBe(true);
|
|
165
|
+
expect(result.content).toBe('Hello World');
|
|
166
|
+
expect(result.sizeBytes).toBe(Buffer.byteLength('Hello World'));
|
|
167
|
+
});
|
|
168
|
+
it('returns success and s3Key on write', async () => {
|
|
169
|
+
const result = (await handler.handle({
|
|
170
|
+
type: 'storage_write',
|
|
171
|
+
payload: { path: 'data/file.json', content: '{"key":"value"}' },
|
|
172
|
+
}));
|
|
173
|
+
expect(result.success).toBe(true);
|
|
174
|
+
expect(result.s3Key).toBe('mock/data/file.json');
|
|
175
|
+
});
|
|
176
|
+
it('throws when path is missing on write', async () => {
|
|
177
|
+
await expect(handler.handle({
|
|
178
|
+
type: 'storage_write',
|
|
179
|
+
payload: { content: 'data' },
|
|
180
|
+
})).rejects.toThrow('path is required');
|
|
181
|
+
});
|
|
182
|
+
it('throws when content is missing on write (undefined)', async () => {
|
|
183
|
+
await expect(handler.handle({
|
|
184
|
+
type: 'storage_write',
|
|
185
|
+
payload: { path: 'test.txt' },
|
|
186
|
+
})).rejects.toThrow('content is required');
|
|
187
|
+
});
|
|
188
|
+
it('allows writing empty string as content', async () => {
|
|
189
|
+
const writeResult = (await handler.handle({
|
|
190
|
+
type: 'storage_write',
|
|
191
|
+
payload: { path: 'empty.txt', content: '' },
|
|
192
|
+
}));
|
|
193
|
+
expect(writeResult.success).toBe(true);
|
|
194
|
+
const readResult = (await handler.handle({
|
|
195
|
+
type: 'storage_read',
|
|
196
|
+
payload: { path: 'empty.txt' },
|
|
197
|
+
}));
|
|
198
|
+
expect(readResult.exists).toBe(true);
|
|
199
|
+
expect(readResult.content).toBe('');
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
describe('storage_read', () => {
|
|
203
|
+
it('returns content: null and exists: false for nonexistent file', async () => {
|
|
204
|
+
const result = (await handler.handle({
|
|
205
|
+
type: 'storage_read',
|
|
206
|
+
payload: { path: 'nonexistent.txt' },
|
|
207
|
+
}));
|
|
208
|
+
expect(result.content).toBeNull();
|
|
209
|
+
expect(result.exists).toBe(false);
|
|
210
|
+
});
|
|
211
|
+
it('throws when path is missing', async () => {
|
|
212
|
+
await expect(handler.handle({
|
|
213
|
+
type: 'storage_read',
|
|
214
|
+
payload: {},
|
|
215
|
+
})).rejects.toThrow('path is required');
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
describe('storage_list', () => {
|
|
219
|
+
it('returns all stored keys when no prefix given', async () => {
|
|
220
|
+
await handler.handle({
|
|
221
|
+
type: 'storage_write',
|
|
222
|
+
payload: { path: 'a.txt', content: 'a' },
|
|
223
|
+
});
|
|
224
|
+
await handler.handle({
|
|
225
|
+
type: 'storage_write',
|
|
226
|
+
payload: { path: 'b.txt', content: 'b' },
|
|
227
|
+
});
|
|
228
|
+
await handler.handle({
|
|
229
|
+
type: 'storage_write',
|
|
230
|
+
payload: { path: 'dir/c.txt', content: 'c' },
|
|
231
|
+
});
|
|
232
|
+
const result = (await handler.handle({
|
|
233
|
+
type: 'storage_list',
|
|
234
|
+
payload: {},
|
|
235
|
+
}));
|
|
236
|
+
expect(result.files).toHaveLength(3);
|
|
237
|
+
expect(result.files).toContain('a.txt');
|
|
238
|
+
expect(result.files).toContain('b.txt');
|
|
239
|
+
expect(result.files).toContain('dir/c.txt');
|
|
240
|
+
});
|
|
241
|
+
it('filters by prefix', async () => {
|
|
242
|
+
await handler.handle({
|
|
243
|
+
type: 'storage_write',
|
|
244
|
+
payload: { path: 'images/photo.png', content: 'img1' },
|
|
245
|
+
});
|
|
246
|
+
await handler.handle({
|
|
247
|
+
type: 'storage_write',
|
|
248
|
+
payload: { path: 'images/avatar.png', content: 'img2' },
|
|
249
|
+
});
|
|
250
|
+
await handler.handle({
|
|
251
|
+
type: 'storage_write',
|
|
252
|
+
payload: { path: 'docs/readme.md', content: 'doc' },
|
|
253
|
+
});
|
|
254
|
+
const result = (await handler.handle({
|
|
255
|
+
type: 'storage_list',
|
|
256
|
+
payload: { prefix: 'images/' },
|
|
257
|
+
}));
|
|
258
|
+
expect(result.files).toHaveLength(2);
|
|
259
|
+
expect(result.files).toContain('images/photo.png');
|
|
260
|
+
expect(result.files).toContain('images/avatar.png');
|
|
261
|
+
});
|
|
262
|
+
it('returns empty array when no files match prefix', async () => {
|
|
263
|
+
await handler.handle({
|
|
264
|
+
type: 'storage_write',
|
|
265
|
+
payload: { path: 'data.txt', content: 'data' },
|
|
266
|
+
});
|
|
267
|
+
const result = (await handler.handle({
|
|
268
|
+
type: 'storage_list',
|
|
269
|
+
payload: { prefix: 'nope/' },
|
|
270
|
+
}));
|
|
271
|
+
expect(result.files).toHaveLength(0);
|
|
272
|
+
});
|
|
273
|
+
it('returns empty array when storage is empty', async () => {
|
|
274
|
+
const result = (await handler.handle({
|
|
275
|
+
type: 'storage_list',
|
|
276
|
+
payload: {},
|
|
277
|
+
}));
|
|
278
|
+
expect(result.files).toHaveLength(0);
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
describe('storage_delete', () => {
|
|
282
|
+
it('removes a stored file', async () => {
|
|
283
|
+
await handler.handle({
|
|
284
|
+
type: 'storage_write',
|
|
285
|
+
payload: { path: 'to-delete.txt', content: 'bye' },
|
|
286
|
+
});
|
|
287
|
+
const deleteResult = (await handler.handle({
|
|
288
|
+
type: 'storage_delete',
|
|
289
|
+
payload: { path: 'to-delete.txt' },
|
|
290
|
+
}));
|
|
291
|
+
expect(deleteResult.success).toBe(true);
|
|
292
|
+
const readResult = (await handler.handle({
|
|
293
|
+
type: 'storage_read',
|
|
294
|
+
payload: { path: 'to-delete.txt' },
|
|
295
|
+
}));
|
|
296
|
+
expect(readResult.exists).toBe(false);
|
|
297
|
+
expect(readResult.content).toBeNull();
|
|
298
|
+
});
|
|
299
|
+
it('succeeds even if file does not exist (no-op delete)', async () => {
|
|
300
|
+
const result = (await handler.handle({
|
|
301
|
+
type: 'storage_delete',
|
|
302
|
+
payload: { path: 'nonexistent.txt' },
|
|
303
|
+
}));
|
|
304
|
+
expect(result.success).toBe(true);
|
|
305
|
+
});
|
|
306
|
+
it('throws when path is missing', async () => {
|
|
307
|
+
await expect(handler.handle({
|
|
308
|
+
type: 'storage_delete',
|
|
309
|
+
payload: {},
|
|
310
|
+
})).rejects.toThrow('path is required');
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
describe('unknown type', () => {
|
|
314
|
+
it('throws error for unknown bridge call type', async () => {
|
|
315
|
+
await expect(handler.handle({
|
|
316
|
+
type: 'unknown_operation',
|
|
317
|
+
payload: {},
|
|
318
|
+
})).rejects.toThrow('Unknown bridge call type: unknown_operation');
|
|
319
|
+
});
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
//# sourceMappingURL=mock-handler.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-handler.test.js","sourceRoot":"","sources":["../../src/bridge/mock-handler.test.ts"],"names":[],"mappings":";;AAAA,iDAAmD;AAEnD,0CAAyD;AAEzD,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,MAAM,cAAc,GAAuB;QACzC,QAAQ,EAAE;YACR,MAAM,EAAE,eAAe;YACvB,WAAW,EAAE,WAAW;YACxB,MAAM,EAAE,IAAI;SACb;QACD,SAAS,EAAE,MAAM;KAClB,CAAC;IAEF,IAAI,OAA0B,CAAC;IAE/B,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,GAAG,IAAI,gCAAiB,CAAC,EAAE,GAAG,cAAc,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YAEvE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,MAAM,EAAE,eAAe;gBACvB,WAAW,EAAE,WAAW;gBACxB,MAAM,EAAE,IAAI;aACb,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,aAAa,GAAG,IAAI,gCAAiB,CAAC;gBAC1C,GAAG,cAAc;gBACjB,QAAQ,EAAE;oBACR,MAAM,EAAE,QAAQ;oBAChB,WAAW,EAAE,cAAc;oBAC3B,MAAM,EAAE,gCAAgC;iBACzC;aACF,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YAE7E,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,MAAM,EAAE,QAAQ;gBAChB,WAAW,EAAE,cAAc;gBAC3B,MAAM,EAAE,gCAAgC;aACzC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YAExE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,kBAAU,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,YAAY,GAAG,IAAI,gCAAiB,CAAC;gBACzC,GAAG,cAAc;gBACjB,SAAS,EAAE,OAAO;aACnB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YAE7E,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,mBAAW,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;gBAC7B,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;aAC3D,CAAC,CAAC;YAEH,wCAAwC;YACxC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAE/B,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAG5B,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;gBAC9B,QAAQ,EAAE,aAAa;gBACvB,UAAU,EAAE,CAAC;gBACb,IAAI,EAAE,CAAC;aACR,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,MAAM,CACV,OAAO,CAAC,MAAM,CAAC;gBACb,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;aAC5B,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,MAAM,CACV,OAAO,CAAC,MAAM,CAAC;gBACb,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE;aACrC,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,MAAM,CACV,OAAO,CAAC,MAAM,CAAC;gBACb,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE;aACZ,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,aAAa,GAAG,IAAI,gCAAiB,CAAC;gBAC1C,GAAG,cAAc;gBACjB,YAAY,EAAE;oBACZ,gBAAgB,EAAE;wBAChB,QAAQ,EAAE,uBAAuB;wBACjC,KAAK,EAAE,GAAG;qBACX;iBACF;aACF,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC;gBACnC,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,EAAE;aAC9D,CAAC,CAAC;YAEH,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAE9B,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAG5B,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;YAClF,MAAM,aAAa,GAAG,IAAI,gCAAiB,CAAC;gBAC1C,GAAG,cAAc;gBACjB,YAAY,EAAE;oBACZ,eAAe,EAAE;wBACf,QAAQ,EAAE,+BAA+B;qBAC1C;iBACF;aACF,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC;gBACnC,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE;aACxD,CAAC,CAAC;YAEH,mCAAmC;YACnC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAC9B,sCAAsC;YAEtC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;YAE5B,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAuB,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;YAC5E,MAAM,aAAa,GAAG,IAAI,gCAAiB,CAAC;gBAC1C,GAAG,cAAc;gBACjB,YAAY,EAAE;oBACZ,gBAAgB,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;iBAC1C;aACF,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC;gBACnC,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE;aACtD,CAAC,CAAC;YAEH,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAE/B,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAuB,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC9C,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,OAAO,CAAC,MAAM,CAAC;gBACnB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE;aACtD,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC;gBACnC,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;aAC9B,CAAC,CAA4D,CAAC;YAE/D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC;gBACnC,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,EAAE;aAChE,CAAC,CAAwC,CAAC;YAE3C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,MAAM,CACV,OAAO,CAAC,MAAM,CAAC;gBACb,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;aAC7B,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,MAAM,CACV,OAAO,CAAC,MAAM,CAAC;gBACb,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;aAC9B,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,WAAW,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC;gBACxC,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE;aAC5C,CAAC,CAAyB,CAAC;YAE5B,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEvC,MAAM,UAAU,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC;gBACvC,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;aAC/B,CAAC,CAAyC,CAAC;YAE5C,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;YAC5E,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC;gBACnC,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;aACrC,CAAC,CAAuC,CAAC;YAE1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,MAAM,CACV,OAAO,CAAC,MAAM,CAAC;gBACb,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,EAAE;aACZ,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,OAAO,CAAC,MAAM,CAAC;gBACnB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE;aACzC,CAAC,CAAC;YACH,MAAM,OAAO,CAAC,MAAM,CAAC;gBACnB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE;aACzC,CAAC,CAAC;YACH,MAAM,OAAO,CAAC,MAAM,CAAC;gBACnB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE;aAC7C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC;gBACnC,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,EAAE;aACZ,CAAC,CAAwB,CAAC;YAE3B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;YACjC,MAAM,OAAO,CAAC,MAAM,CAAC;gBACnB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,EAAE;aACvD,CAAC,CAAC;YACH,MAAM,OAAO,CAAC,MAAM,CAAC;gBACnB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAAE;aACxD,CAAC,CAAC;YACH,MAAM,OAAO,CAAC,MAAM,CAAC;gBACnB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE;aACpD,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC;gBACnC,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;aAC/B,CAAC,CAAwB,CAAC;YAE3B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,OAAO,CAAC,MAAM,CAAC;gBACnB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE;aAC/C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC;gBACnC,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;aAC7B,CAAC,CAAwB,CAAC;YAE3B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC;gBACnC,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,EAAE;aACZ,CAAC,CAAwB,CAAC;YAE3B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;YACrC,MAAM,OAAO,CAAC,MAAM,CAAC;gBACnB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE;aACnD,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC;gBACzC,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE;aACnC,CAAC,CAAyB,CAAC;YAE5B,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAExC,MAAM,UAAU,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC;gBACvC,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE;aACnC,CAAC,CAAuC,CAAC;YAE1C,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC;gBACnC,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;aACrC,CAAC,CAAyB,CAAC;YAE5B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,MAAM,CACV,OAAO,CAAC,MAAM,CAAC;gBACb,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,EAAE;aACZ,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,MAAM,CACV,OAAO,CAAC,MAAM,CAAC;gBACb,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,EAAE;aACZ,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge Handler Types
|
|
3
|
+
*
|
|
4
|
+
* Shared interface for mock and live bridge handlers.
|
|
5
|
+
*/
|
|
6
|
+
export interface BridgeRequest {
|
|
7
|
+
type: string;
|
|
8
|
+
payload: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
export interface BridgeResponse {
|
|
11
|
+
success: boolean;
|
|
12
|
+
data?: unknown;
|
|
13
|
+
error?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface BridgeHandler {
|
|
16
|
+
handle(request: BridgeRequest): Promise<unknown>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/bridge/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAClD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/bridge/types.ts"],"names":[],"mappings":";AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `fias-dev` Command — Start the dev harness server
|
|
3
|
+
*
|
|
4
|
+
* Launches an Express server that serves the harness host page,
|
|
5
|
+
* which embeds the plugin iframe and handles bridge communication.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* npx fias-dev # Mock mode (default)
|
|
9
|
+
* npx fias-dev --live # Live mode (real AI, costs credits)
|
|
10
|
+
* npx fias-dev --port 3200 # Custom port
|
|
11
|
+
* npx fias-dev --plugin-url http://localhost:3100
|
|
12
|
+
*/
|
|
13
|
+
import { Command } from 'commander';
|
|
14
|
+
export declare function registerDevCommand(program: Command): void;
|
|
15
|
+
//# sourceMappingURL=dev.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/cli/dev.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkDzD"}
|
package/dist/cli/dev.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `fias-dev` Command — Start the dev harness server
|
|
4
|
+
*
|
|
5
|
+
* Launches an Express server that serves the harness host page,
|
|
6
|
+
* which embeds the plugin iframe and handles bridge communication.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* npx fias-dev # Mock mode (default)
|
|
10
|
+
* npx fias-dev --live # Live mode (real AI, costs credits)
|
|
11
|
+
* npx fias-dev --port 3200 # Custom port
|
|
12
|
+
* npx fias-dev --plugin-url http://localhost:3100
|
|
13
|
+
*/
|
|
14
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.registerDevCommand = registerDevCommand;
|
|
19
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
20
|
+
const config_loader_1 = require("../config/config-loader");
|
|
21
|
+
const credentials_1 = require("../config/credentials");
|
|
22
|
+
const harness_server_1 = require("../server/harness-server");
|
|
23
|
+
function registerDevCommand(program) {
|
|
24
|
+
program
|
|
25
|
+
.command('dev', { isDefault: true })
|
|
26
|
+
.description('Start the dev harness server')
|
|
27
|
+
.option('--live', 'Enable live mode (real AI, costs credits)', false)
|
|
28
|
+
.option('--port <port>', 'Harness server port', '3200')
|
|
29
|
+
.option('--plugin-url <url>', 'Plugin dev server URL')
|
|
30
|
+
.action(async (options) => {
|
|
31
|
+
const config = (0, config_loader_1.loadConfig)();
|
|
32
|
+
const port = parseInt(options.port, 10) || config.port;
|
|
33
|
+
const pluginUrl = options.pluginUrl || config.pluginUrl;
|
|
34
|
+
const isLive = options.live;
|
|
35
|
+
if (isLive) {
|
|
36
|
+
const credentials = (0, credentials_1.loadCredentials)();
|
|
37
|
+
if (!credentials.apiKey) {
|
|
38
|
+
console.error(chalk_1.default.red('No API key found. Run `fias-dev login` first to save your API key.'));
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const credentials = isLive ? (0, credentials_1.loadCredentials)() : { apiKey: '' };
|
|
43
|
+
console.log(chalk_1.default.bold('\n FIAS Plugin Dev Harness\n'));
|
|
44
|
+
console.log(` Mode: ${isLive ? chalk_1.default.yellow('LIVE (credits will be used)') : chalk_1.default.green('MOCK (free, offline)')}`);
|
|
45
|
+
console.log(` Plugin: ${chalk_1.default.cyan(pluginUrl)}`);
|
|
46
|
+
console.log(` Harness: ${chalk_1.default.cyan(`http://localhost:${port}`)}`);
|
|
47
|
+
if (isLive) {
|
|
48
|
+
console.log(` API: ${chalk_1.default.dim(config.apiUrl)}`);
|
|
49
|
+
}
|
|
50
|
+
console.log('');
|
|
51
|
+
await (0, harness_server_1.startHarnessServer)({
|
|
52
|
+
port,
|
|
53
|
+
pluginUrl,
|
|
54
|
+
isLive,
|
|
55
|
+
apiKey: credentials.apiKey,
|
|
56
|
+
apiUrl: config.apiUrl,
|
|
57
|
+
permissions: config.permissions,
|
|
58
|
+
mockUser: config.mockUser,
|
|
59
|
+
mockTheme: config.mockTheme,
|
|
60
|
+
mockEntities: config.mockEntities,
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=dev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/cli/dev.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;;;AAQH,gDAkDC;AAvDD,kDAA0B;AAC1B,2DAAqD;AACrD,uDAAwD;AACxD,6DAA8D;AAE9D,SAAgB,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SACnC,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,QAAQ,EAAE,2CAA2C,EAAE,KAAK,CAAC;SACpE,MAAM,CAAC,eAAe,EAAE,qBAAqB,EAAE,MAAM,CAAC;SACtD,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC;SACrD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,IAAA,0BAAU,GAAE,CAAC;QAE5B,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC;QACvD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;QACxD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;QAE5B,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,WAAW,GAAG,IAAA,6BAAe,GAAE,CAAC;YACtC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;gBACxB,OAAO,CAAC,KAAK,CACX,eAAK,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAChF,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,IAAA,6BAAe,GAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAEhE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CACT,iBAAiB,MAAM,CAAC,CAAC,CAAC,eAAK,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAC9G,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,iBAAiB,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,iBAAiB,eAAK,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAEvE,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,iBAAiB,eAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,MAAM,IAAA,mCAAkB,EAAC;YACvB,IAAI;YACJ,SAAS;YACT,MAAM;YACN,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.test.d.ts","sourceRoot":"","sources":["../../src/cli/dev.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
jest.mock('../config/config-loader', () => ({
|
|
4
|
+
loadConfig: jest.fn(),
|
|
5
|
+
}));
|
|
6
|
+
jest.mock('../config/credentials', () => ({
|
|
7
|
+
loadCredentials: jest.fn(),
|
|
8
|
+
}));
|
|
9
|
+
jest.mock('../server/harness-server', () => ({
|
|
10
|
+
startHarnessServer: jest.fn(),
|
|
11
|
+
}));
|
|
12
|
+
const commander_1 = require("commander");
|
|
13
|
+
const dev_1 = require("./dev");
|
|
14
|
+
const config_loader_1 = require("../config/config-loader");
|
|
15
|
+
const credentials_1 = require("../config/credentials");
|
|
16
|
+
const harness_server_1 = require("../server/harness-server");
|
|
17
|
+
const mockedLoadConfig = jest.mocked(config_loader_1.loadConfig);
|
|
18
|
+
const mockedLoadCredentials = jest.mocked(credentials_1.loadCredentials);
|
|
19
|
+
const mockedStartHarnessServer = jest.mocked(harness_server_1.startHarnessServer);
|
|
20
|
+
describe('cli/dev', () => {
|
|
21
|
+
let program;
|
|
22
|
+
let mockExit;
|
|
23
|
+
let consoleSpy;
|
|
24
|
+
let consoleErrorSpy;
|
|
25
|
+
const defaultConfig = {
|
|
26
|
+
pluginUrl: 'http://localhost:3100',
|
|
27
|
+
port: 3200,
|
|
28
|
+
permissions: ['theme:read', 'entities:invoke'],
|
|
29
|
+
mockUser: { userId: 'dev_user_001', displayName: 'Dev User', avatar: null },
|
|
30
|
+
mockTheme: 'light',
|
|
31
|
+
apiUrl: 'https://api.fias.app/v1',
|
|
32
|
+
};
|
|
33
|
+
beforeEach(() => {
|
|
34
|
+
jest.clearAllMocks();
|
|
35
|
+
program = new commander_1.Command();
|
|
36
|
+
program.exitOverride();
|
|
37
|
+
(0, dev_1.registerDevCommand)(program);
|
|
38
|
+
mockExit = jest.spyOn(process, 'exit').mockImplementation(((code) => {
|
|
39
|
+
throw new Error(`process.exit(${code})`);
|
|
40
|
+
}));
|
|
41
|
+
consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => { });
|
|
42
|
+
consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => { });
|
|
43
|
+
mockedLoadConfig.mockReturnValue({ ...defaultConfig });
|
|
44
|
+
mockedLoadCredentials.mockReturnValue({ apiKey: '' });
|
|
45
|
+
mockedStartHarnessServer.mockResolvedValue();
|
|
46
|
+
});
|
|
47
|
+
afterEach(() => {
|
|
48
|
+
mockExit.mockRestore();
|
|
49
|
+
consoleSpy.mockRestore();
|
|
50
|
+
consoleErrorSpy.mockRestore();
|
|
51
|
+
});
|
|
52
|
+
it('starts harness server in mock mode by default', async () => {
|
|
53
|
+
await program.parseAsync(['dev'], { from: 'user' });
|
|
54
|
+
expect(mockedStartHarnessServer).toHaveBeenCalledWith(expect.objectContaining({
|
|
55
|
+
port: 3200,
|
|
56
|
+
pluginUrl: 'http://localhost:3100',
|
|
57
|
+
isLive: false,
|
|
58
|
+
apiKey: '',
|
|
59
|
+
}));
|
|
60
|
+
});
|
|
61
|
+
it('starts harness server with custom port', async () => {
|
|
62
|
+
await program.parseAsync(['dev', '--port', '4000'], { from: 'user' });
|
|
63
|
+
expect(mockedStartHarnessServer).toHaveBeenCalledWith(expect.objectContaining({
|
|
64
|
+
port: 4000,
|
|
65
|
+
}));
|
|
66
|
+
});
|
|
67
|
+
it('starts harness server with custom plugin URL', async () => {
|
|
68
|
+
await program.parseAsync(['dev', '--plugin-url', 'http://localhost:5555'], {
|
|
69
|
+
from: 'user',
|
|
70
|
+
});
|
|
71
|
+
expect(mockedStartHarnessServer).toHaveBeenCalledWith(expect.objectContaining({
|
|
72
|
+
pluginUrl: 'http://localhost:5555',
|
|
73
|
+
}));
|
|
74
|
+
});
|
|
75
|
+
it('exits with error in live mode when no API key is saved', async () => {
|
|
76
|
+
mockedLoadCredentials.mockReturnValue({ apiKey: '' });
|
|
77
|
+
await expect(program.parseAsync(['dev', '--live'], { from: 'user' })).rejects.toThrow('process.exit(1)');
|
|
78
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('No API key found'));
|
|
79
|
+
expect(mockedStartHarnessServer).not.toHaveBeenCalled();
|
|
80
|
+
});
|
|
81
|
+
it('starts harness server in live mode with API key', async () => {
|
|
82
|
+
mockedLoadCredentials.mockReturnValue({ apiKey: 'fias_sk_live_key' });
|
|
83
|
+
await program.parseAsync(['dev', '--live'], { from: 'user' });
|
|
84
|
+
expect(mockedStartHarnessServer).toHaveBeenCalledWith(expect.objectContaining({
|
|
85
|
+
isLive: true,
|
|
86
|
+
apiKey: 'fias_sk_live_key',
|
|
87
|
+
}));
|
|
88
|
+
});
|
|
89
|
+
it('logs live mode info', async () => {
|
|
90
|
+
mockedLoadCredentials.mockReturnValue({ apiKey: 'fias_sk_live_key' });
|
|
91
|
+
await program.parseAsync(['dev', '--live'], { from: 'user' });
|
|
92
|
+
const allLogs = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
|
|
93
|
+
expect(allLogs).toContain('LIVE');
|
|
94
|
+
});
|
|
95
|
+
it('passes config properties to harness server', async () => {
|
|
96
|
+
mockedLoadConfig.mockReturnValue({
|
|
97
|
+
...defaultConfig,
|
|
98
|
+
permissions: ['theme:read', 'storage:sandbox'],
|
|
99
|
+
mockTheme: 'dark',
|
|
100
|
+
mockEntities: {
|
|
101
|
+
entity_custom: { response: 'Custom', delay: 100 },
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
await program.parseAsync(['dev'], { from: 'user' });
|
|
105
|
+
expect(mockedStartHarnessServer).toHaveBeenCalledWith(expect.objectContaining({
|
|
106
|
+
permissions: ['theme:read', 'storage:sandbox'],
|
|
107
|
+
mockTheme: 'dark',
|
|
108
|
+
mockEntities: {
|
|
109
|
+
entity_custom: { response: 'Custom', delay: 100 },
|
|
110
|
+
},
|
|
111
|
+
}));
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
//# sourceMappingURL=dev.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.test.js","sourceRoot":"","sources":["../../src/cli/dev.test.ts"],"names":[],"mappings":";;AAAA,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1C,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE;CACtB,CAAC,CAAC,CAAC;AACJ,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,eAAe,EAAE,IAAI,CAAC,EAAE,EAAE;CAC3B,CAAC,CAAC,CAAC;AACJ,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3C,kBAAkB,EAAE,IAAI,CAAC,EAAE,EAAE;CAC9B,CAAC,CAAC,CAAC;AAEJ,yCAAoC;AACpC,+BAA2C;AAC3C,2DAAqD;AACrD,uDAAwD;AACxD,6DAA8D;AAE9D,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,0BAAU,CAAC,CAAC;AACjD,MAAM,qBAAqB,GAAG,IAAI,CAAC,MAAM,CAAC,6BAAe,CAAC,CAAC;AAC3D,MAAM,wBAAwB,GAAG,IAAI,CAAC,MAAM,CAAC,mCAAkB,CAAC,CAAC;AAEjE,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,IAAI,OAAgB,CAAC;IACrB,IAAI,QAAiD,CAAC;IACtD,IAAI,UAAkD,CAAC;IACvD,IAAI,eAAyD,CAAC;IAE9D,MAAM,aAAa,GAAG;QACpB,SAAS,EAAE,uBAAuB;QAClC,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,CAAC,YAAY,EAAE,iBAAiB,CAAC;QAC9C,QAAQ,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE;QAC3E,SAAS,EAAE,OAAgB;QAC3B,MAAM,EAAE,yBAAyB;KAClC,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;QACxB,OAAO,CAAC,YAAY,EAAE,CAAC;QACvB,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;QAE5B,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAa,EAAE,EAAE;YAC3E,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,GAAG,CAAC,CAAC;QAC3C,CAAC,CAAQ,CAAC,CAAC;QACX,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrE,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE5E,gBAAgB,CAAC,eAAe,CAAC,EAAE,GAAG,aAAa,EAAE,CAAC,CAAC;QACvD,qBAAqB,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QACtD,wBAAwB,CAAC,iBAAiB,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,WAAW,EAAE,CAAC;QACvB,UAAU,CAAC,WAAW,EAAE,CAAC;QACzB,eAAe,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAEpD,MAAM,CAAC,wBAAwB,CAAC,CAAC,oBAAoB,CACnD,MAAM,CAAC,gBAAgB,CAAC;YACtB,IAAI,EAAE,IAAI;YACV,SAAS,EAAE,uBAAuB;YAClC,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,EAAE;SACX,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAEtE,MAAM,CAAC,wBAAwB,CAAC,CAAC,oBAAoB,CACnD,MAAM,CAAC,gBAAgB,CAAC;YACtB,IAAI,EAAE,IAAI;SACX,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,uBAAuB,CAAC,EAAE;YACzE,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;QAEH,MAAM,CAAC,wBAAwB,CAAC,CAAC,oBAAoB,CACnD,MAAM,CAAC,gBAAgB,CAAC;YACtB,SAAS,EAAE,uBAAuB;SACnC,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,qBAAqB,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAEtD,MAAM,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACnF,iBAAiB,CAClB,CAAC;QAEF,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC1F,MAAM,CAAC,wBAAwB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,qBAAqB,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAEtE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAE9D,MAAM,CAAC,wBAAwB,CAAC,CAAC,oBAAoB,CACnD,MAAM,CAAC,gBAAgB,CAAC;YACtB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,kBAAkB;SAC3B,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,qBAAqB,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAEtE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,gBAAgB,CAAC,eAAe,CAAC;YAC/B,GAAG,aAAa;YAChB,WAAW,EAAE,CAAC,YAAY,EAAE,iBAAiB,CAAC;YAC9C,SAAS,EAAE,MAAM;YACjB,YAAY,EAAE;gBACZ,aAAa,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;aAClD;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAEpD,MAAM,CAAC,wBAAwB,CAAC,CAAC,oBAAoB,CACnD,MAAM,CAAC,gBAAgB,CAAC;YACtB,WAAW,EAAE,CAAC,YAAY,EAAE,iBAAiB,CAAC;YAC9C,SAAS,EAAE,MAAM;YACjB,YAAY,EAAE;gBACZ,aAAa,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;aAClD;SACF,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `fias-dev entities` Command — Browse available entities
|
|
3
|
+
*
|
|
4
|
+
* Lists entities available for invocation from plugins,
|
|
5
|
+
* fetched from the FIAS production API.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
export declare function registerEntitiesCommand(program: Command): void;
|
|
9
|
+
//# sourceMappingURL=entities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../src/cli/entities.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuE9D"}
|