@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.
Files changed (106) hide show
  1. package/CHANGELOG.md +117 -0
  2. package/dist/auth/acting-as.d.ts +21 -0
  3. package/dist/auth/acting-as.d.ts.map +1 -0
  4. package/dist/auth/acting-as.js +68 -0
  5. package/dist/auth/acting-as.js.map +1 -0
  6. package/dist/auth/index.d.ts +2 -0
  7. package/dist/auth/index.d.ts.map +1 -0
  8. package/dist/auth/index.js +2 -0
  9. package/dist/auth/index.js.map +1 -0
  10. package/dist/core/env/index.d.ts +2 -0
  11. package/dist/core/env/index.d.ts.map +1 -0
  12. package/dist/core/env/index.js +2 -0
  13. package/dist/core/env/index.js.map +1 -0
  14. package/dist/core/env/test-env.d.ts +9 -0
  15. package/dist/core/env/test-env.d.ts.map +1 -0
  16. package/dist/core/env/test-env.js +14 -0
  17. package/dist/core/env/test-env.js.map +1 -0
  18. package/dist/core/http/fetch-mock.d.ts +236 -0
  19. package/dist/core/http/fetch-mock.d.ts.map +1 -0
  20. package/dist/core/http/fetch-mock.js +290 -0
  21. package/dist/core/http/fetch-mock.js.map +1 -0
  22. package/dist/core/http/fetch-mock.types.d.ts +48 -0
  23. package/dist/core/http/fetch-mock.types.d.ts.map +1 -0
  24. package/dist/core/http/fetch-mock.types.js +2 -0
  25. package/dist/core/http/fetch-mock.types.js.map +1 -0
  26. package/dist/core/http/index.d.ts +6 -0
  27. package/dist/core/http/index.d.ts.map +1 -0
  28. package/dist/core/http/index.js +5 -0
  29. package/dist/core/http/index.js.map +1 -0
  30. package/dist/core/http/test-http-client.d.ts +54 -0
  31. package/dist/core/http/test-http-client.d.ts.map +1 -0
  32. package/dist/core/http/test-http-client.js +75 -0
  33. package/dist/core/http/test-http-client.js.map +1 -0
  34. package/dist/core/http/test-http-request.d.ts +60 -0
  35. package/dist/core/http/test-http-request.d.ts.map +1 -0
  36. package/dist/core/http/test-http-request.js +106 -0
  37. package/dist/core/http/test-http-request.js.map +1 -0
  38. package/dist/core/http/test-response.d.ts +161 -0
  39. package/dist/core/http/test-response.d.ts.map +1 -0
  40. package/dist/core/http/test-response.js +309 -0
  41. package/dist/core/http/test-response.js.map +1 -0
  42. package/dist/core/index.d.ts +7 -0
  43. package/dist/core/index.d.ts.map +1 -0
  44. package/dist/core/index.js +7 -0
  45. package/dist/core/index.js.map +1 -0
  46. package/dist/core/override/index.d.ts +2 -0
  47. package/dist/core/override/index.d.ts.map +1 -0
  48. package/dist/core/override/index.js +2 -0
  49. package/dist/core/override/index.js.map +1 -0
  50. package/dist/core/override/provider-override-builder.d.ts +77 -0
  51. package/dist/core/override/provider-override-builder.d.ts.map +1 -0
  52. package/dist/core/override/provider-override-builder.js +94 -0
  53. package/dist/core/override/provider-override-builder.js.map +1 -0
  54. package/dist/core/test.d.ts +48 -0
  55. package/dist/core/test.d.ts.map +1 -0
  56. package/dist/core/test.js +53 -0
  57. package/dist/core/test.js.map +1 -0
  58. package/dist/core/testing-module-builder.d.ts +99 -0
  59. package/dist/core/testing-module-builder.d.ts.map +1 -0
  60. package/dist/core/testing-module-builder.js +156 -0
  61. package/dist/core/testing-module-builder.js.map +1 -0
  62. package/dist/core/testing-module.d.ts +101 -0
  63. package/dist/core/testing-module.d.ts.map +1 -0
  64. package/dist/core/testing-module.js +178 -0
  65. package/dist/core/testing-module.js.map +1 -0
  66. package/dist/errors/index.d.ts +3 -0
  67. package/dist/errors/index.d.ts.map +1 -0
  68. package/dist/errors/index.js +3 -0
  69. package/dist/errors/index.js.map +1 -0
  70. package/dist/errors/setup-error.d.ts +9 -0
  71. package/dist/errors/setup-error.d.ts.map +1 -0
  72. package/dist/errors/setup-error.js +11 -0
  73. package/dist/errors/setup-error.js.map +1 -0
  74. package/dist/errors/test-error.d.ts +9 -0
  75. package/dist/errors/test-error.d.ts.map +1 -0
  76. package/dist/errors/test-error.js +15 -0
  77. package/dist/errors/test-error.js.map +1 -0
  78. package/dist/index.d.ts +15 -0
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +6 -3
  81. package/dist/index.js.map +1 -1
  82. package/dist/mocks/index.d.ts +3 -0
  83. package/dist/mocks/index.d.ts.map +1 -0
  84. package/dist/mocks/index.js +3 -0
  85. package/dist/mocks/index.js.map +1 -0
  86. package/dist/mocks/nodemailer.d.ts +10 -0
  87. package/dist/mocks/nodemailer.d.ts.map +1 -0
  88. package/dist/mocks/nodemailer.js +9 -0
  89. package/dist/mocks/nodemailer.js.map +1 -0
  90. package/dist/mocks/zenstack-language.d.ts +46 -0
  91. package/dist/mocks/zenstack-language.d.ts.map +1 -0
  92. package/dist/mocks/zenstack-language.js +47 -0
  93. package/dist/mocks/zenstack-language.js.map +1 -0
  94. package/dist/storage/fake-storage.service.d.ts +114 -0
  95. package/dist/storage/fake-storage.service.d.ts.map +1 -0
  96. package/dist/storage/fake-storage.service.js +233 -0
  97. package/dist/storage/fake-storage.service.js.map +1 -0
  98. package/dist/storage/index.d.ts +2 -0
  99. package/dist/storage/index.d.ts.map +1 -0
  100. package/dist/storage/index.js +2 -0
  101. package/dist/storage/index.js.map +1 -0
  102. package/dist/types.d.ts +5 -0
  103. package/dist/types.d.ts.map +1 -0
  104. package/dist/types.js +3 -0
  105. package/dist/types.js.map +1 -0
  106. 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,3 @@
1
+ export { TestError } from './test-error';
2
+ export { TestSetupError } from './setup-error';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export { TestError } from './test-error';
2
+ export { TestSetupError } from './setup-error';
3
+ //# sourceMappingURL=index.js.map
@@ -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"}
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,CAAA;AAG1B,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;AAC9F,OAAO,EAAE,uBAAuB,EAAE,KAAK,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAGtF,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;AACxD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACnE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAGrF,OAAO,EAAE,kBAAkB,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAA;AAG/D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAGvC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA"}
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
- export { FetchMock, createFetchMock } from './core/http/fetch-mock';
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,mBAAmB,CAAA;AAE1B,eAAe;AACf,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAA4B,MAAM,+BAA+B,CAAA;AAC9F,OAAO,EAAE,uBAAuB,EAA+B,MAAM,iBAAiB,CAAA;AAEtF,eAAe;AACf,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;AACxD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAGnE,UAAU;AACV,OAAO,EAAE,kBAAkB,EAAmB,MAAM,WAAW,CAAA;AAE/D,wBAAwB;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,SAAS;AACT,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA"}
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,3 @@
1
+ export { createMock } from '@golevelup/ts-vitest';
2
+ export type { DeepMocked, PartialFuncReturn } from '@golevelup/ts-vitest';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ // Deep mocking utilities from @golevelup/ts-vitest
2
+ export { createMock } from '@golevelup/ts-vitest';
3
+ //# sourceMappingURL=index.js.map
@@ -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,10 @@
1
+ declare const _default: {
2
+ createTransport: () => {
3
+ sendMail: () => Promise<{}>;
4
+ };
5
+ };
6
+ export default _default;
7
+ export declare const createTransport: () => {
8
+ sendMail: () => Promise<{}>;
9
+ };
10
+ //# sourceMappingURL=nodemailer.d.ts.map
@@ -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,9 @@
1
+ export default {
2
+ createTransport: () => ({
3
+ sendMail: () => Promise.resolve({}),
4
+ }),
5
+ };
6
+ export const createTransport = () => ({
7
+ sendMail: () => Promise.resolve({}),
8
+ });
9
+ //# sourceMappingURL=nodemailer.js.map
@@ -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"}