@stratal/testing 0.0.2 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +117 -0
- package/dist/auth/acting-as.d.ts +21 -0
- package/dist/auth/acting-as.d.ts.map +1 -0
- package/dist/auth/acting-as.js +68 -0
- package/dist/auth/acting-as.js.map +1 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/core/env/index.d.ts +2 -0
- package/dist/core/env/index.d.ts.map +1 -0
- package/dist/core/env/index.js +2 -0
- package/dist/core/env/index.js.map +1 -0
- package/dist/core/env/test-env.d.ts +9 -0
- package/dist/core/env/test-env.d.ts.map +1 -0
- package/dist/core/env/test-env.js +14 -0
- package/dist/core/env/test-env.js.map +1 -0
- package/dist/core/http/fetch-mock.d.ts +236 -0
- package/dist/core/http/fetch-mock.d.ts.map +1 -0
- package/dist/core/http/fetch-mock.js +290 -0
- package/dist/core/http/fetch-mock.js.map +1 -0
- package/dist/core/http/fetch-mock.types.d.ts +48 -0
- package/dist/core/http/fetch-mock.types.d.ts.map +1 -0
- package/dist/core/http/fetch-mock.types.js +2 -0
- package/dist/core/http/fetch-mock.types.js.map +1 -0
- package/dist/core/http/index.d.ts +6 -0
- package/dist/core/http/index.d.ts.map +1 -0
- package/dist/core/http/index.js +5 -0
- package/dist/core/http/index.js.map +1 -0
- package/dist/core/http/test-http-client.d.ts +54 -0
- package/dist/core/http/test-http-client.d.ts.map +1 -0
- package/dist/core/http/test-http-client.js +75 -0
- package/dist/core/http/test-http-client.js.map +1 -0
- package/dist/core/http/test-http-request.d.ts +60 -0
- package/dist/core/http/test-http-request.d.ts.map +1 -0
- package/dist/core/http/test-http-request.js +106 -0
- package/dist/core/http/test-http-request.js.map +1 -0
- package/dist/core/http/test-response.d.ts +161 -0
- package/dist/core/http/test-response.d.ts.map +1 -0
- package/dist/core/http/test-response.js +309 -0
- package/dist/core/http/test-response.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/override/index.d.ts +2 -0
- package/dist/core/override/index.d.ts.map +1 -0
- package/dist/core/override/index.js +2 -0
- package/dist/core/override/index.js.map +1 -0
- package/dist/core/override/provider-override-builder.d.ts +77 -0
- package/dist/core/override/provider-override-builder.d.ts.map +1 -0
- package/dist/core/override/provider-override-builder.js +94 -0
- package/dist/core/override/provider-override-builder.js.map +1 -0
- package/dist/core/test.d.ts +48 -0
- package/dist/core/test.d.ts.map +1 -0
- package/dist/core/test.js +53 -0
- package/dist/core/test.js.map +1 -0
- package/dist/core/testing-module-builder.d.ts +99 -0
- package/dist/core/testing-module-builder.d.ts.map +1 -0
- package/dist/core/testing-module-builder.js +156 -0
- package/dist/core/testing-module-builder.js.map +1 -0
- package/dist/core/testing-module.d.ts +101 -0
- package/dist/core/testing-module.d.ts.map +1 -0
- package/dist/core/testing-module.js +178 -0
- package/dist/core/testing-module.js.map +1 -0
- package/dist/errors/index.d.ts +3 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +3 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/setup-error.d.ts +9 -0
- package/dist/errors/setup-error.d.ts.map +1 -0
- package/dist/errors/setup-error.js +11 -0
- package/dist/errors/setup-error.js.map +1 -0
- package/dist/errors/test-error.d.ts +9 -0
- package/dist/errors/test-error.d.ts.map +1 -0
- package/dist/errors/test-error.js +15 -0
- package/dist/errors/test-error.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/mocks/index.d.ts +3 -0
- package/dist/mocks/index.d.ts.map +1 -0
- package/dist/mocks/index.js +3 -0
- package/dist/mocks/index.js.map +1 -0
- package/dist/mocks/nodemailer.d.ts +10 -0
- package/dist/mocks/nodemailer.d.ts.map +1 -0
- package/dist/mocks/nodemailer.js +9 -0
- package/dist/mocks/nodemailer.js.map +1 -0
- package/dist/mocks/zenstack-language.d.ts +46 -0
- package/dist/mocks/zenstack-language.d.ts.map +1 -0
- package/dist/mocks/zenstack-language.js +47 -0
- package/dist/mocks/zenstack-language.js.map +1 -0
- package/dist/storage/fake-storage.service.d.ts +114 -0
- package/dist/storage/fake-storage.service.d.ts.map +1 -0
- package/dist/storage/fake-storage.service.js +233 -0
- package/dist/storage/fake-storage.service.js.map +1 -0
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +2 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +27 -10
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { connectionSymbol } from '@stratal/framework/database';
|
|
2
|
+
import { DI_TOKENS } from 'stratal/di';
|
|
3
|
+
import { ROUTER_TOKENS } from 'stratal/router';
|
|
4
|
+
import { STORAGE_TOKENS } from 'stratal/storage';
|
|
5
|
+
import { TestHttpClient } from './http/test-http-client';
|
|
6
|
+
/**
|
|
7
|
+
* TestingModule
|
|
8
|
+
*
|
|
9
|
+
* Provides access to the test application, container, HTTP client, and utilities.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const module = await Test.createTestingModule({
|
|
14
|
+
* modules: [RegistrationModule],
|
|
15
|
+
* }).compile()
|
|
16
|
+
*
|
|
17
|
+
* // Make HTTP requests
|
|
18
|
+
* const response = await module.http
|
|
19
|
+
* .post('/api/v1/register')
|
|
20
|
+
* .withBody({ ... })
|
|
21
|
+
* .send()
|
|
22
|
+
*
|
|
23
|
+
* // Access services
|
|
24
|
+
* const service = module.get(REGISTRATION_TOKENS.RegistrationService)
|
|
25
|
+
*
|
|
26
|
+
* // Database utilities
|
|
27
|
+
* await module.truncateDb()
|
|
28
|
+
* await module.seed(new UserSeeder())
|
|
29
|
+
* await module.assertDatabaseHas('user', { email: 'test@example.com' })
|
|
30
|
+
*
|
|
31
|
+
* // Cleanup
|
|
32
|
+
* await module.close()
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export class TestingModule {
|
|
36
|
+
app;
|
|
37
|
+
env;
|
|
38
|
+
_http = null;
|
|
39
|
+
constructor(app, env) {
|
|
40
|
+
this.app = app;
|
|
41
|
+
this.env = env;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Resolve a service from the container
|
|
45
|
+
*/
|
|
46
|
+
get(token) {
|
|
47
|
+
return this.app.container.resolve(token);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get HTTP test client for making requests
|
|
51
|
+
*/
|
|
52
|
+
get http() {
|
|
53
|
+
this._http ??= new TestHttpClient(this);
|
|
54
|
+
return this._http;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get fake storage service for assertions
|
|
58
|
+
*/
|
|
59
|
+
get storage() {
|
|
60
|
+
return this.get(STORAGE_TOKENS.StorageService);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get Application instance
|
|
64
|
+
*/
|
|
65
|
+
get application() {
|
|
66
|
+
return this.app;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get DI Container
|
|
70
|
+
*/
|
|
71
|
+
get container() {
|
|
72
|
+
return this.app.container;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Execute an HTTP request through RouterService
|
|
76
|
+
*/
|
|
77
|
+
async fetch(request) {
|
|
78
|
+
const router = this.get(ROUTER_TOKENS.RouterService);
|
|
79
|
+
return router.fetch(request, this.env, this.app.ctx);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Run callback in request scope (for DB operations, service access)
|
|
83
|
+
*/
|
|
84
|
+
async runInRequestScope(callback) {
|
|
85
|
+
const mockContext = this.app.createMockRouterContext();
|
|
86
|
+
return this.app.container.runInRequestScope(mockContext, callback);
|
|
87
|
+
}
|
|
88
|
+
async getDb(name) {
|
|
89
|
+
return this.runInRequestScope(() => {
|
|
90
|
+
const token = name ? connectionSymbol(name) : DI_TOKENS.Database;
|
|
91
|
+
return this.get(token);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Truncate all non-prisma tables in the database
|
|
96
|
+
*/
|
|
97
|
+
async truncateDb(name) {
|
|
98
|
+
await this.runInRequestScope(async () => {
|
|
99
|
+
const token = name ? connectionSymbol(name) : DI_TOKENS.Database;
|
|
100
|
+
const db = this.get(token);
|
|
101
|
+
const tables = await db.$queryRaw `
|
|
102
|
+
SELECT tablename::text as tablename FROM pg_tables
|
|
103
|
+
WHERE schemaname = current_schema()
|
|
104
|
+
AND tablename NOT LIKE '_prisma%'
|
|
105
|
+
`;
|
|
106
|
+
if (tables.length === 0)
|
|
107
|
+
return;
|
|
108
|
+
const tableList = tables.map((t) => `"${t.tablename}"`).join(', ');
|
|
109
|
+
await db.$executeRawUnsafe(`TRUNCATE ${tableList} RESTART IDENTITY CASCADE`);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
async seed(...args) {
|
|
113
|
+
let name;
|
|
114
|
+
let seeders;
|
|
115
|
+
if (typeof args[0] === 'string') {
|
|
116
|
+
name = args[0];
|
|
117
|
+
seeders = args.slice(1);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
seeders = args;
|
|
121
|
+
}
|
|
122
|
+
await this.runInRequestScope(async () => {
|
|
123
|
+
const token = name ? connectionSymbol(name) : DI_TOKENS.Database;
|
|
124
|
+
const db = this.get(token);
|
|
125
|
+
await db.$transaction(async (tx) => {
|
|
126
|
+
for (const seeder of seeders) {
|
|
127
|
+
await seeder.run(tx);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Assert that a record exists in the database
|
|
134
|
+
*/
|
|
135
|
+
async assertDatabaseHas(table, data, name) {
|
|
136
|
+
const { expect } = await import('vitest');
|
|
137
|
+
await this.runInRequestScope(async () => {
|
|
138
|
+
const token = name ? connectionSymbol(name) : DI_TOKENS.Database;
|
|
139
|
+
const db = this.get(token);
|
|
140
|
+
const model = db[table];
|
|
141
|
+
const result = await model.findFirst({ where: data });
|
|
142
|
+
expect(result, `Expected ${table} with ${JSON.stringify(data)}`).not.toBeNull();
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Assert that a record does not exist in the database
|
|
147
|
+
*/
|
|
148
|
+
async assertDatabaseMissing(table, data, name) {
|
|
149
|
+
const { expect } = await import('vitest');
|
|
150
|
+
await this.runInRequestScope(async () => {
|
|
151
|
+
const token = name ? connectionSymbol(name) : DI_TOKENS.Database;
|
|
152
|
+
const db = this.get(token);
|
|
153
|
+
const model = db[table];
|
|
154
|
+
const result = await model.findFirst({ where: data });
|
|
155
|
+
expect(result, `Expected ${table} NOT to have ${JSON.stringify(data)}`).toBeNull();
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Assert the number of records in a table
|
|
160
|
+
*/
|
|
161
|
+
async assertDatabaseCount(table, expected, name) {
|
|
162
|
+
const { expect } = await import('vitest');
|
|
163
|
+
await this.runInRequestScope(async () => {
|
|
164
|
+
const token = name ? connectionSymbol(name) : DI_TOKENS.Database;
|
|
165
|
+
const db = this.get(token);
|
|
166
|
+
const model = db[table];
|
|
167
|
+
const actual = await model.count();
|
|
168
|
+
expect(actual, `Expected ${table} count ${expected}, got ${actual}`).toBe(expected);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Cleanup - call in afterAll
|
|
173
|
+
*/
|
|
174
|
+
async close() {
|
|
175
|
+
await this.app.shutdown();
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=testing-module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing-module.js","sourceRoot":"","sources":["../../src/core/testing-module.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { TestError } from './test-error';
|
|
2
|
+
/**
|
|
3
|
+
* Error thrown when test setup fails.
|
|
4
|
+
* Examples: schema creation failure, migration failure, application bootstrap failure.
|
|
5
|
+
*/
|
|
6
|
+
export declare class TestSetupError extends TestError {
|
|
7
|
+
constructor(message: string, cause?: Error);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=setup-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-error.d.ts","sourceRoot":"","sources":["../../src/errors/setup-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC;;;GAGG;AACH,qBAAa,cAAe,SAAQ,SAAS;gBAC/B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAG3C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TestError } from './test-error';
|
|
2
|
+
/**
|
|
3
|
+
* Error thrown when test setup fails.
|
|
4
|
+
* Examples: schema creation failure, migration failure, application bootstrap failure.
|
|
5
|
+
*/
|
|
6
|
+
export class TestSetupError extends TestError {
|
|
7
|
+
constructor(message, cause) {
|
|
8
|
+
super(`Test setup failed: ${message}`, cause);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=setup-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-error.js","sourceRoot":"","sources":["../../src/errors/setup-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,SAAS;IAC3C,YAAY,OAAe,EAAE,KAAa;QACxC,KAAK,CAAC,sBAAsB,OAAO,EAAE,EAAE,KAAK,CAAC,CAAA;IAC/C,CAAC;CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for all test framework errors.
|
|
3
|
+
* Extends from Error and allows easy identification via `instanceof`.
|
|
4
|
+
*/
|
|
5
|
+
export declare class TestError extends Error {
|
|
6
|
+
readonly cause?: Error | undefined;
|
|
7
|
+
constructor(message: string, cause?: Error | undefined);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=test-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-error.d.ts","sourceRoot":"","sources":["../../src/errors/test-error.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,SAAU,SAAQ,KAAK;aAGhB,KAAK,CAAC,EAAE,KAAK;gBAD7B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,KAAK,YAAA;CAQhC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for all test framework errors.
|
|
3
|
+
* Extends from Error and allows easy identification via `instanceof`.
|
|
4
|
+
*/
|
|
5
|
+
export class TestError extends Error {
|
|
6
|
+
cause;
|
|
7
|
+
constructor(message, cause) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.cause = cause;
|
|
10
|
+
this.name = 'TestError';
|
|
11
|
+
// Maintain proper stack trace
|
|
12
|
+
Error.captureStackTrace(this, this.constructor);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=test-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-error.js","sourceRoot":"","sources":["../../src/errors/test-error.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,SAAU,SAAQ,KAAK;IAGhB;IAFlB,YACE,OAAe,EACC,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,WAAW,CAAA;QAEvB,8BAA8B;QAC9B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;IACjD,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { ProviderOverrideBuilder, type ProviderOverrideConfig } from './core/override';
|
|
2
|
+
export { Test } from './core/test';
|
|
3
|
+
export { TestingModule } from './core/testing-module';
|
|
4
|
+
export { TestingModuleBuilder, type TestingModuleConfig } from './core/testing-module-builder';
|
|
5
|
+
export { createFetchMock, FetchMock } from './core/http/fetch-mock';
|
|
6
|
+
export type { MockErrorOptions, MockJsonOptions } from './core/http/fetch-mock.types';
|
|
7
|
+
export { TestHttpClient } from './core/http/test-http-client';
|
|
8
|
+
export { TestHttpRequest } from './core/http/test-http-request';
|
|
9
|
+
export { TestResponse } from './core/http/test-response';
|
|
10
|
+
export { ActingAs } from './auth';
|
|
11
|
+
export { FakeStorageService, type StoredFile } from './storage';
|
|
12
|
+
export { Seeder } from './types';
|
|
13
|
+
export { getTestEnv } from './core/env';
|
|
14
|
+
export { TestError, TestSetupError } from './errors';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,KAAK,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACtF,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AAG9F,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACnE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAGxD,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAGjC,OAAO,EAAE,kBAAkB,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAA;AAG/D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAGhC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAGvC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
|
-
import 'stratal/polyfills';
|
|
2
1
|
// Core Testing
|
|
2
|
+
export { ProviderOverrideBuilder } from './core/override';
|
|
3
3
|
export { Test } from './core/test';
|
|
4
4
|
export { TestingModule } from './core/testing-module';
|
|
5
5
|
export { TestingModuleBuilder } from './core/testing-module-builder';
|
|
6
|
-
export { ProviderOverrideBuilder } from './core/override';
|
|
7
6
|
// HTTP Testing
|
|
7
|
+
export { createFetchMock, FetchMock } from './core/http/fetch-mock';
|
|
8
8
|
export { TestHttpClient } from './core/http/test-http-client';
|
|
9
9
|
export { TestHttpRequest } from './core/http/test-http-request';
|
|
10
10
|
export { TestResponse } from './core/http/test-response';
|
|
11
|
-
|
|
11
|
+
// Auth
|
|
12
|
+
export { ActingAs } from './auth';
|
|
12
13
|
// Storage
|
|
13
14
|
export { FakeStorageService } from './storage';
|
|
15
|
+
// Types
|
|
16
|
+
export { Seeder } from './types';
|
|
14
17
|
// Environment utilities
|
|
15
18
|
export { getTestEnv } from './core/env';
|
|
16
19
|
// Errors
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,uBAAuB,EAA+B,MAAM,iBAAiB,CAAA;AACtF,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAA4B,MAAM,+BAA+B,CAAA;AAE9F,eAAe;AACf,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAEnE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,OAAO;AACP,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,UAAU;AACV,OAAO,EAAE,kBAAkB,EAAmB,MAAM,WAAW,CAAA;AAE/D,QAAQ;AACR,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEhC,wBAAwB;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,SAAS;AACT,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mocks/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mocks/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodemailer.d.ts","sourceRoot":"","sources":["../../src/mocks/nodemailer.ts"],"names":[],"mappings":";;;;;AAAA,wBAIC;AAED,eAAO,MAAM,eAAe;;CAE1B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodemailer.js","sourceRoot":"","sources":["../../src/mocks/nodemailer.ts"],"names":[],"mappings":"AAAA,eAAe;IACb,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;QACtB,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;KACpC,CAAC;CACH,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,CAAC;IACpC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;CACpC,CAAC,CAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock for @zenstackhq/language package
|
|
3
|
+
*
|
|
4
|
+
* The @zenstackhq/language package depends on vscode-languageserver which is
|
|
5
|
+
* incompatible with Cloudflare Workers runtime. These exports are only used
|
|
6
|
+
* for schema generation (CLI functionality), not runtime authentication.
|
|
7
|
+
*
|
|
8
|
+
* This mock provides stub implementations to allow tests to run in vitest-pool-workers.
|
|
9
|
+
*/
|
|
10
|
+
export declare const formatDocument: (content: string) => string;
|
|
11
|
+
export declare const loadDocument: (_path: string) => {
|
|
12
|
+
success: boolean;
|
|
13
|
+
errors: string[];
|
|
14
|
+
};
|
|
15
|
+
export declare class ZModelCodeGenerator {
|
|
16
|
+
generate(_model: unknown): string;
|
|
17
|
+
}
|
|
18
|
+
export declare const isDataModel: (_item: unknown) => boolean;
|
|
19
|
+
export declare const isAttribute: (_item: unknown) => boolean;
|
|
20
|
+
export declare const isAbstractDeclaration: (_item: unknown) => boolean;
|
|
21
|
+
export declare const isExpression: (_item: unknown) => boolean;
|
|
22
|
+
export declare const isLiteralExpr: (_item: unknown) => boolean;
|
|
23
|
+
export declare const isArrayExpr: (_item: unknown) => boolean;
|
|
24
|
+
export declare const isAttributeArg: (_item: unknown) => boolean;
|
|
25
|
+
export declare const isBinaryExpr: (_item: unknown) => boolean;
|
|
26
|
+
export declare const isBooleanLiteral: (_item: unknown) => boolean;
|
|
27
|
+
export declare const isConfigArrayExpr: (_item: unknown) => boolean;
|
|
28
|
+
export declare const isConfigField: (_item: unknown) => boolean;
|
|
29
|
+
export declare const isDataField: (_item: unknown) => boolean;
|
|
30
|
+
export declare const isDataFieldAttribute: (_item: unknown) => boolean;
|
|
31
|
+
export declare const isDataFieldType: (_item: unknown) => boolean;
|
|
32
|
+
export declare const isDataModelAttribute: (_item: unknown) => boolean;
|
|
33
|
+
export declare const hasAttribute: (_node: unknown, _name?: string) => boolean;
|
|
34
|
+
declare const _default: {
|
|
35
|
+
formatDocument: (content: string) => string;
|
|
36
|
+
loadDocument: (_path: string) => {
|
|
37
|
+
success: boolean;
|
|
38
|
+
errors: string[];
|
|
39
|
+
};
|
|
40
|
+
ZModelCodeGenerator: typeof ZModelCodeGenerator;
|
|
41
|
+
isDataModel: (_item: unknown) => boolean;
|
|
42
|
+
isAttribute: (_item: unknown) => boolean;
|
|
43
|
+
hasAttribute: (_node: unknown, _name?: string) => boolean;
|
|
44
|
+
};
|
|
45
|
+
export default _default;
|
|
46
|
+
//# sourceMappingURL=zenstack-language.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zenstack-language.d.ts","sourceRoot":"","sources":["../../src/mocks/zenstack-language.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,WAAY,CAAA;AAE1D,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM;;;CAGxC,CAAA;AAEF,qBAAa,mBAAmB;IAC/B,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM;CAGjC;AAGD,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAC7D,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAC7D,eAAO,MAAM,qBAAqB,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AACvE,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAC9D,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAC/D,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAC7D,eAAO,MAAM,cAAc,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAChE,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAC9D,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAClE,eAAO,MAAM,iBAAiB,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AACnE,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAC/D,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAC7D,eAAO,MAAM,oBAAoB,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AACtE,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AACjE,eAAO,MAAM,oBAAoB,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAGtE,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,EAAE,QAAQ,MAAM,KAAG,OAAgB,CAAA;;8BA/BtC,MAAM;0BAEV,MAAM;;;;;yBAYP,OAAO,KAAG,OAAO;yBACjB,OAAO,KAAG,OAAO;0BAgBhB,OAAO,UAAU,MAAM,KAAG,OAAO;;AAErE,wBAOC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock for @zenstackhq/language package
|
|
3
|
+
*
|
|
4
|
+
* The @zenstackhq/language package depends on vscode-languageserver which is
|
|
5
|
+
* incompatible with Cloudflare Workers runtime. These exports are only used
|
|
6
|
+
* for schema generation (CLI functionality), not runtime authentication.
|
|
7
|
+
*
|
|
8
|
+
* This mock provides stub implementations to allow tests to run in vitest-pool-workers.
|
|
9
|
+
*/
|
|
10
|
+
// Main exports from @zenstackhq/language
|
|
11
|
+
export const formatDocument = (content) => content;
|
|
12
|
+
export const loadDocument = (_path) => ({
|
|
13
|
+
success: false,
|
|
14
|
+
errors: ['Mock: loadDocument not available in test environment'],
|
|
15
|
+
});
|
|
16
|
+
export class ZModelCodeGenerator {
|
|
17
|
+
generate(_model) {
|
|
18
|
+
return '';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// AST exports from @zenstackhq/language/ast
|
|
22
|
+
export const isDataModel = (_item) => false;
|
|
23
|
+
export const isAttribute = (_item) => false;
|
|
24
|
+
export const isAbstractDeclaration = (_item) => false;
|
|
25
|
+
export const isExpression = (_item) => false;
|
|
26
|
+
export const isLiteralExpr = (_item) => false;
|
|
27
|
+
export const isArrayExpr = (_item) => false;
|
|
28
|
+
export const isAttributeArg = (_item) => false;
|
|
29
|
+
export const isBinaryExpr = (_item) => false;
|
|
30
|
+
export const isBooleanLiteral = (_item) => false;
|
|
31
|
+
export const isConfigArrayExpr = (_item) => false;
|
|
32
|
+
export const isConfigField = (_item) => false;
|
|
33
|
+
export const isDataField = (_item) => false;
|
|
34
|
+
export const isDataFieldAttribute = (_item) => false;
|
|
35
|
+
export const isDataFieldType = (_item) => false;
|
|
36
|
+
export const isDataModelAttribute = (_item) => false;
|
|
37
|
+
// Utils exports from @zenstackhq/language/utils
|
|
38
|
+
export const hasAttribute = (_node, _name) => false;
|
|
39
|
+
export default {
|
|
40
|
+
formatDocument,
|
|
41
|
+
loadDocument,
|
|
42
|
+
ZModelCodeGenerator,
|
|
43
|
+
isDataModel,
|
|
44
|
+
isAttribute,
|
|
45
|
+
hasAttribute,
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=zenstack-language.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zenstack-language.js","sourceRoot":"","sources":["../../src/mocks/zenstack-language.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,yCAAyC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAA;AAE1D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,CAAC,sDAAsD,CAAC;CAChE,CAAC,CAAA;AAEF,MAAM,OAAO,mBAAmB;IAC/B,QAAQ,CAAC,MAAe;QACvB,OAAO,EAAE,CAAA;IACV,CAAC;CACD;AAED,4CAA4C;AAC5C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAC7D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAC7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AACvE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAC9D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAC/D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAChE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAC9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAClE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AACnE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAC/D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAC7D,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AACtE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAEtE,gDAAgD;AAChD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAE,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAE9E,eAAe;IACd,cAAc;IACd,YAAY;IACZ,mBAAmB;IACnB,WAAW;IACX,WAAW;IACX,YAAY;CACZ,CAAA"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { StorageManagerService, StorageService, StreamingBlobPayloadInputTypes, type DownloadResult, type PresignedUrlResult, type StorageConfig, type UploadOptions, type UploadResult } from 'stratal/storage';
|
|
2
|
+
/**
|
|
3
|
+
* Stored file representation in memory
|
|
4
|
+
*/
|
|
5
|
+
export interface StoredFile {
|
|
6
|
+
content: Uint8Array;
|
|
7
|
+
mimeType: string;
|
|
8
|
+
size: number;
|
|
9
|
+
metadata?: Record<string, string>;
|
|
10
|
+
uploadedAt: Date;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* FakeStorageService
|
|
14
|
+
*
|
|
15
|
+
* In-memory storage implementation for testing.
|
|
16
|
+
* Registered by default in TestingModuleBuilder.
|
|
17
|
+
*
|
|
18
|
+
* Similar to Laravel's Storage::fake() - stores files in memory
|
|
19
|
+
* and provides assertion helpers for testing.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* // Access via TestingModule
|
|
24
|
+
* module.storage.assertExists('path/to/file.pdf')
|
|
25
|
+
* module.storage.assertMissing('deleted/file.pdf')
|
|
26
|
+
* module.storage.clear() // Reset between tests
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare class FakeStorageService extends StorageService {
|
|
30
|
+
protected readonly storageManager: StorageManagerService;
|
|
31
|
+
protected readonly options: StorageConfig;
|
|
32
|
+
private files;
|
|
33
|
+
constructor(storageManager: StorageManagerService, options: StorageConfig);
|
|
34
|
+
/**
|
|
35
|
+
* Upload content to fake storage
|
|
36
|
+
*/
|
|
37
|
+
upload(body: StreamingBlobPayloadInputTypes, relativePath: string, options: UploadOptions, disk?: string): Promise<UploadResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Download a file from fake storage
|
|
40
|
+
*/
|
|
41
|
+
download(path: string): Promise<DownloadResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Delete a file from fake storage
|
|
44
|
+
*/
|
|
45
|
+
delete(path: string): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Check if a file exists in fake storage
|
|
48
|
+
*/
|
|
49
|
+
exists(path: string): Promise<boolean>;
|
|
50
|
+
/**
|
|
51
|
+
* Generate a fake presigned download URL
|
|
52
|
+
*/
|
|
53
|
+
getPresignedDownloadUrl(path: string, expiresIn?: number): Promise<PresignedUrlResult>;
|
|
54
|
+
/**
|
|
55
|
+
* Generate a fake presigned upload URL
|
|
56
|
+
*/
|
|
57
|
+
getPresignedUploadUrl(path: string, expiresIn?: number): Promise<PresignedUrlResult>;
|
|
58
|
+
/**
|
|
59
|
+
* Generate a fake presigned delete URL
|
|
60
|
+
*/
|
|
61
|
+
getPresignedDeleteUrl(path: string, expiresIn?: number): Promise<PresignedUrlResult>;
|
|
62
|
+
/**
|
|
63
|
+
* Chunked upload (same as regular upload for fake)
|
|
64
|
+
*/
|
|
65
|
+
chunkedUpload(body: StreamingBlobPayloadInputTypes, path: string, options: Omit<UploadOptions, 'size'> & {
|
|
66
|
+
size?: number;
|
|
67
|
+
}, disk?: string): Promise<UploadResult>;
|
|
68
|
+
/**
|
|
69
|
+
* Assert that a file exists at the given path
|
|
70
|
+
*
|
|
71
|
+
* @param path - Path to check
|
|
72
|
+
* @throws AssertionError if file does not exist
|
|
73
|
+
*/
|
|
74
|
+
assertExists(path: string): void;
|
|
75
|
+
/**
|
|
76
|
+
* Assert that a file does NOT exist at the given path
|
|
77
|
+
*
|
|
78
|
+
* @param path - Path to check
|
|
79
|
+
* @throws AssertionError if file exists
|
|
80
|
+
*/
|
|
81
|
+
assertMissing(path: string): void;
|
|
82
|
+
/**
|
|
83
|
+
* Assert storage is empty
|
|
84
|
+
*
|
|
85
|
+
* @throws AssertionError if any files exist
|
|
86
|
+
*/
|
|
87
|
+
assertEmpty(): void;
|
|
88
|
+
/**
|
|
89
|
+
* Assert storage has exactly N files
|
|
90
|
+
*
|
|
91
|
+
* @param count - Expected number of files
|
|
92
|
+
* @throws AssertionError if count doesn't match
|
|
93
|
+
*/
|
|
94
|
+
assertCount(count: number): void;
|
|
95
|
+
/**
|
|
96
|
+
* Get all stored files (for inspection)
|
|
97
|
+
*/
|
|
98
|
+
getStoredFiles(): Map<string, StoredFile>;
|
|
99
|
+
/**
|
|
100
|
+
* Get all stored file paths
|
|
101
|
+
*/
|
|
102
|
+
getStoredPaths(): string[];
|
|
103
|
+
/**
|
|
104
|
+
* Get a specific file by path
|
|
105
|
+
*/
|
|
106
|
+
getFile(path: string): StoredFile | undefined;
|
|
107
|
+
/**
|
|
108
|
+
* Clear all stored files (call in beforeEach for test isolation)
|
|
109
|
+
*/
|
|
110
|
+
clear(): void;
|
|
111
|
+
private createPresignedUrl;
|
|
112
|
+
private bodyToUint8Array;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=fake-storage.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-storage.service.d.ts","sourceRoot":"","sources":["../../src/storage/fake-storage.service.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,qBAAqB,EACrB,cAAc,EACd,8BAA8B,EAC9B,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,iBAAiB,CAAA;AAGxB;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,UAAU,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,UAAU,EAAE,IAAI,CAAA;CACjB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBACa,kBAAmB,SAAQ,cAAc;IAKlD,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,qBAAqB;IAExD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,aAAa;IAN3C,OAAO,CAAC,KAAK,CAAgC;gBAIxB,cAAc,EAAE,qBAAqB,EAErC,OAAO,EAAE,aAAa;IAK3C;;OAEG;IACG,MAAM,CACV,IAAI,EAAE,8BAA8B,EACpC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,aAAa,EACtB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,YAAY,CAAC;IAsBxB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAsB/C;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnC;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAItC;;OAEG;IACH,uBAAuB,CACrB,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,CAAC;IAI9B;;OAEG;IACH,qBAAqB,CACnB,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,CAAC;IAI9B;;OAEG;IACH,qBAAqB,CACnB,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,CAAC;IAI9B;;OAEG;IACG,aAAa,CACjB,IAAI,EAAE,8BAA8B,EACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EACxD,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,YAAY,CAAC;IAWxB;;;;;OAKG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOhC;;;;;OAKG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOjC;;;;OAIG;IACH,WAAW,IAAI,IAAI;IAOnB;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAOhC;;OAEG;IACH,cAAc,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IAIzC;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE;IAI1B;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI7C;;OAEG;IACH,KAAK,IAAI,IAAI;IAQb,OAAO,CAAC,kBAAkB;YAeZ,gBAAgB;CAiC/B"}
|