@cedarjs/testing 9.0.0-canary.1784 → 9.0.0-canary.3124

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 (244) hide show
  1. package/dist/api/checkTestDatabase.d.ts +23 -0
  2. package/dist/api/checkTestDatabase.d.ts.map +1 -0
  3. package/dist/api/checkTestDatabase.js +44 -0
  4. package/dist/api/index.d.ts +0 -1
  5. package/dist/api/index.d.ts.map +1 -1
  6. package/dist/api/index.js +0 -1
  7. package/dist/api/vitest/CedarApiVitestEnv.d.ts.map +1 -1
  8. package/dist/api/vitest/CedarApiVitestEnv.js +22 -17
  9. package/dist/api/vitest/teardown.d.ts +18 -0
  10. package/dist/api/vitest/teardown.d.ts.map +1 -0
  11. package/dist/api/vitest/teardown.js +43 -0
  12. package/dist/api/vitest/vite-plugin-cedar-vitest-api-config.d.ts.map +1 -1
  13. package/dist/api/vitest/vite-plugin-cedar-vitest-api-config.js +13 -8
  14. package/dist/api/vitest/vitest-api.setup.d.ts.map +1 -1
  15. package/dist/api/vitest/vitest-api.setup.js +18 -33
  16. package/dist/cache/index.js +1 -1
  17. package/dist/web/MockParamsProvider.d.ts.map +1 -1
  18. package/dist/web/MockParamsProvider.js +10 -1
  19. package/dist/web/MockProviders.js +12 -6
  20. package/dist/web/MockRouter.d.ts.map +1 -1
  21. package/dist/web/mockRequests.d.ts +74 -18
  22. package/dist/web/mockRequests.d.ts.map +1 -1
  23. package/dist/web/mockRequests.js +118 -39
  24. package/dist/web/vitest/index.d.ts +1 -0
  25. package/dist/web/vitest/index.d.ts.map +1 -1
  26. package/dist/web/vitest/index.js +2 -0
  27. package/dist/web/vitest/vite-plugin-cedar-vitest-web-config.d.ts +12 -0
  28. package/dist/web/vitest/vite-plugin-cedar-vitest-web-config.d.ts.map +1 -0
  29. package/dist/web/vitest/vite-plugin-cedar-vitest-web-config.js +16 -0
  30. package/dist/web/vitest/vite-plugin-cedarjs-router-import-transform.d.ts.map +1 -1
  31. package/dist/web/vitest/vite-plugin-create-auth-import-transform.d.ts.map +1 -1
  32. package/dist/web/vitest/vitest-web.setup.d.ts +2 -0
  33. package/dist/web/vitest/vitest-web.setup.d.ts.map +1 -0
  34. package/dist/web/vitest/vitest-web.setup.js +18 -0
  35. package/package.json +41 -106
  36. package/LICENSE +0 -21
  37. package/config/jest/api/RedwoodApiJestEnv.d.ts +0 -11
  38. package/config/jest/api/RedwoodApiJestEnv.d.ts.map +0 -1
  39. package/config/jest/api/RedwoodApiJestEnv.js +0 -48
  40. package/config/jest/api/apiBabelConfig.d.ts +0 -5
  41. package/config/jest/api/apiBabelConfig.d.ts.map +0 -1
  42. package/config/jest/api/apiBabelConfig.js +0 -34
  43. package/config/jest/api/globalSetup.d.ts +0 -3
  44. package/config/jest/api/globalSetup.d.ts.map +0 -1
  45. package/config/jest/api/globalSetup.js +0 -63
  46. package/config/jest/api/index.d.ts +0 -3
  47. package/config/jest/api/index.d.ts.map +0 -1
  48. package/config/jest/api/index.js +0 -25
  49. package/config/jest/api/jest-preset.d.ts +0 -4
  50. package/config/jest/api/jest-preset.d.ts.map +0 -1
  51. package/config/jest/api/jest-preset.js +0 -99
  52. package/config/jest/api/jest.setup.d.ts +0 -2
  53. package/config/jest/api/jest.setup.d.ts.map +0 -1
  54. package/config/jest/api/jest.setup.js +0 -271
  55. package/config/jest/api/package.json +0 -8
  56. package/config/jest/babelPlugins/babel-plugin-redwood-cell.d.ts +0 -11
  57. package/config/jest/babelPlugins/babel-plugin-redwood-cell.d.ts.map +0 -1
  58. package/config/jest/babelPlugins/babel-plugin-redwood-cell.js +0 -121
  59. package/config/jest/jest-serial-runner.d.ts +0 -8
  60. package/config/jest/jest-serial-runner.d.ts.map +0 -1
  61. package/config/jest/jest-serial-runner.js +0 -37
  62. package/config/jest/web/RedwoodWebJestEnv.d.ts +0 -6
  63. package/config/jest/web/RedwoodWebJestEnv.d.ts.map +0 -1
  64. package/config/jest/web/RedwoodWebJestEnv.js +0 -38
  65. package/config/jest/web/index.d.ts +0 -3
  66. package/config/jest/web/index.d.ts.map +0 -1
  67. package/config/jest/web/index.js +0 -25
  68. package/config/jest/web/jest-preset.d.ts +0 -4
  69. package/config/jest/web/jest-preset.d.ts.map +0 -1
  70. package/config/jest/web/jest-preset.js +0 -119
  71. package/config/jest/web/jest.setup.d.ts +0 -8
  72. package/config/jest/web/jest.setup.d.ts.map +0 -1
  73. package/config/jest/web/jest.setup.js +0 -22
  74. package/config/jest/web/package.json +0 -8
  75. package/config/jest/web/resolver.d.ts +0 -4
  76. package/config/jest/web/resolver.d.ts.map +0 -1
  77. package/config/jest/web/resolver.js +0 -30
  78. package/config/jest/web/webBabelConfig.d.ts +0 -10
  79. package/config/jest/web/webBabelConfig.d.ts.map +0 -1
  80. package/config/jest/web/webBabelConfig.js +0 -48
  81. package/config/package.json +0 -1
  82. package/dist/api/directUrlHelpers.d.ts +0 -3
  83. package/dist/api/directUrlHelpers.d.ts.map +0 -1
  84. package/dist/api/directUrlHelpers.js +0 -25
  85. package/dist/cjs/api/apiFunction.d.ts +0 -37
  86. package/dist/cjs/api/apiFunction.d.ts.map +0 -1
  87. package/dist/cjs/api/apiFunction.js +0 -89
  88. package/dist/cjs/api/directUrlHelpers.d.ts +0 -3
  89. package/dist/cjs/api/directUrlHelpers.d.ts.map +0 -1
  90. package/dist/cjs/api/directUrlHelpers.js +0 -60
  91. package/dist/cjs/api/directive.d.ts +0 -51
  92. package/dist/cjs/api/directive.d.ts.map +0 -1
  93. package/dist/cjs/api/directive.js +0 -77
  94. package/dist/cjs/api/index.d.ts +0 -5
  95. package/dist/cjs/api/index.d.ts.map +0 -1
  96. package/dist/cjs/api/index.js +0 -28
  97. package/dist/cjs/api/mockContext.d.ts +0 -5
  98. package/dist/cjs/api/mockContext.d.ts.map +0 -1
  99. package/dist/cjs/api/mockContext.js +0 -58
  100. package/dist/cjs/api/scenario.d.ts +0 -108
  101. package/dist/cjs/api/scenario.d.ts.map +0 -1
  102. package/dist/cjs/api/scenario.js +0 -30
  103. package/dist/cjs/api/vitest/CedarApiVitestEnv.js +0 -73
  104. package/dist/cjs/api/vitest/index.js +0 -34
  105. package/dist/cjs/api/vitest/vite-plugin-auto-import.js +0 -71
  106. package/dist/cjs/api/vitest/vite-plugin-cedar-vitest-api-config.js +0 -69
  107. package/dist/cjs/api/vitest/vite-plugin-track-db-imports.js +0 -47
  108. package/dist/cjs/api/vitest/vitest-api.setup.js +0 -272
  109. package/dist/cjs/cache/index.d.ts +0 -50
  110. package/dist/cjs/cache/index.d.ts.map +0 -1
  111. package/dist/cjs/cache/index.js +0 -104
  112. package/dist/cjs/config/jest/api/RedwoodApiJestEnv.d.ts +0 -11
  113. package/dist/cjs/config/jest/api/RedwoodApiJestEnv.d.ts.map +0 -1
  114. package/dist/cjs/config/jest/api/RedwoodApiJestEnv.js +0 -48
  115. package/dist/cjs/config/jest/api/apiBabelConfig.d.ts +0 -5
  116. package/dist/cjs/config/jest/api/apiBabelConfig.d.ts.map +0 -1
  117. package/dist/cjs/config/jest/api/apiBabelConfig.js +0 -34
  118. package/dist/cjs/config/jest/api/globalSetup.d.ts +0 -3
  119. package/dist/cjs/config/jest/api/globalSetup.d.ts.map +0 -1
  120. package/dist/cjs/config/jest/api/globalSetup.js +0 -63
  121. package/dist/cjs/config/jest/api/index.d.ts +0 -3
  122. package/dist/cjs/config/jest/api/index.d.ts.map +0 -1
  123. package/dist/cjs/config/jest/api/index.js +0 -25
  124. package/dist/cjs/config/jest/api/jest-preset.d.ts +0 -4
  125. package/dist/cjs/config/jest/api/jest-preset.d.ts.map +0 -1
  126. package/dist/cjs/config/jest/api/jest-preset.js +0 -99
  127. package/dist/cjs/config/jest/api/jest.setup.d.ts +0 -2
  128. package/dist/cjs/config/jest/api/jest.setup.d.ts.map +0 -1
  129. package/dist/cjs/config/jest/api/jest.setup.js +0 -271
  130. package/dist/cjs/config/jest/babelPlugins/babel-plugin-redwood-cell.d.ts +0 -11
  131. package/dist/cjs/config/jest/babelPlugins/babel-plugin-redwood-cell.d.ts.map +0 -1
  132. package/dist/cjs/config/jest/babelPlugins/babel-plugin-redwood-cell.js +0 -121
  133. package/dist/cjs/config/jest/jest-serial-runner.d.ts +0 -8
  134. package/dist/cjs/config/jest/jest-serial-runner.d.ts.map +0 -1
  135. package/dist/cjs/config/jest/jest-serial-runner.js +0 -37
  136. package/dist/cjs/config/jest/web/RedwoodWebJestEnv.d.ts +0 -6
  137. package/dist/cjs/config/jest/web/RedwoodWebJestEnv.d.ts.map +0 -1
  138. package/dist/cjs/config/jest/web/RedwoodWebJestEnv.js +0 -38
  139. package/dist/cjs/config/jest/web/index.d.ts +0 -3
  140. package/dist/cjs/config/jest/web/index.d.ts.map +0 -1
  141. package/dist/cjs/config/jest/web/index.js +0 -25
  142. package/dist/cjs/config/jest/web/jest-preset.d.ts +0 -4
  143. package/dist/cjs/config/jest/web/jest-preset.d.ts.map +0 -1
  144. package/dist/cjs/config/jest/web/jest-preset.js +0 -119
  145. package/dist/cjs/config/jest/web/jest.setup.d.ts +0 -8
  146. package/dist/cjs/config/jest/web/jest.setup.d.ts.map +0 -1
  147. package/dist/cjs/config/jest/web/jest.setup.js +0 -22
  148. package/dist/cjs/config/jest/web/resolver.d.ts +0 -4
  149. package/dist/cjs/config/jest/web/resolver.d.ts.map +0 -1
  150. package/dist/cjs/config/jest/web/resolver.js +0 -30
  151. package/dist/cjs/config/jest/web/webBabelConfig.d.ts +0 -10
  152. package/dist/cjs/config/jest/web/webBabelConfig.d.ts.map +0 -1
  153. package/dist/cjs/config/jest/web/webBabelConfig.js +0 -48
  154. package/dist/cjs/package.json +0 -1
  155. package/dist/cjs/web/MockParamsProvider.d.ts +0 -7
  156. package/dist/cjs/web/MockParamsProvider.d.ts.map +0 -1
  157. package/dist/cjs/web/MockParamsProvider.js +0 -44
  158. package/dist/cjs/web/MockProviders.d.ts +0 -5
  159. package/dist/cjs/web/MockProviders.d.ts.map +0 -1
  160. package/dist/cjs/web/MockProviders.js +0 -60
  161. package/dist/cjs/web/MockRouter.d.ts +0 -11
  162. package/dist/cjs/web/MockRouter.d.ts.map +0 -1
  163. package/dist/cjs/web/MockRouter.js +0 -48
  164. package/dist/cjs/web/customRender.d.ts +0 -6
  165. package/dist/cjs/web/customRender.d.ts.map +0 -1
  166. package/dist/cjs/web/customRender.js +0 -54
  167. package/dist/cjs/web/fileMock.d.ts +0 -9
  168. package/dist/cjs/web/fileMock.d.ts.map +0 -1
  169. package/dist/cjs/web/fileMock.js +0 -24
  170. package/dist/cjs/web/findCellMocks.d.ts +0 -2
  171. package/dist/cjs/web/findCellMocks.d.ts.map +0 -1
  172. package/dist/cjs/web/findCellMocks.js +0 -45
  173. package/dist/cjs/web/globRoutesImporter.d.ts +0 -13
  174. package/dist/cjs/web/globRoutesImporter.d.ts.map +0 -1
  175. package/dist/cjs/web/globRoutesImporter.js +0 -46
  176. package/dist/cjs/web/global.d.ts +0 -6
  177. package/dist/cjs/web/global.d.ts.map +0 -1
  178. package/dist/cjs/web/global.js +0 -1
  179. package/dist/cjs/web/index.d.ts +0 -6
  180. package/dist/cjs/web/index.d.ts.map +0 -1
  181. package/dist/cjs/web/index.js +0 -41
  182. package/dist/cjs/web/mockAuth.d.ts +0 -29
  183. package/dist/cjs/web/mockAuth.d.ts.map +0 -1
  184. package/dist/cjs/web/mockAuth.js +0 -89
  185. package/dist/cjs/web/mockRequests.d.ts +0 -30
  186. package/dist/cjs/web/mockRequests.d.ts.map +0 -1
  187. package/dist/cjs/web/mockRequests.js +0 -139
  188. package/dist/cjs/web/vitest/index.d.ts +0 -4
  189. package/dist/cjs/web/vitest/index.d.ts.map +0 -1
  190. package/dist/cjs/web/vitest/index.js +0 -34
  191. package/dist/cjs/web/vitest/vite-plugin-auto-import.d.ts +0 -2
  192. package/dist/cjs/web/vitest/vite-plugin-auto-import.d.ts.map +0 -1
  193. package/dist/cjs/web/vitest/vite-plugin-auto-import.js +0 -60
  194. package/dist/cjs/web/vitest/vite-plugin-cedarjs-router-import-transform.d.ts +0 -7
  195. package/dist/cjs/web/vitest/vite-plugin-cedarjs-router-import-transform.d.ts.map +0 -1
  196. package/dist/cjs/web/vitest/vite-plugin-cedarjs-router-import-transform.js +0 -42
  197. package/dist/cjs/web/vitest/vite-plugin-create-auth-import-transform.d.ts +0 -3
  198. package/dist/cjs/web/vitest/vite-plugin-create-auth-import-transform.d.ts.map +0 -1
  199. package/dist/cjs/web/vitest/vite-plugin-create-auth-import-transform.js +0 -43
  200. package/dist/config/jest/api/RedwoodApiJestEnv.d.ts +0 -11
  201. package/dist/config/jest/api/RedwoodApiJestEnv.d.ts.map +0 -1
  202. package/dist/config/jest/api/RedwoodApiJestEnv.js +0 -28
  203. package/dist/config/jest/api/apiBabelConfig.d.ts +0 -5
  204. package/dist/config/jest/api/apiBabelConfig.d.ts.map +0 -1
  205. package/dist/config/jest/api/apiBabelConfig.js +0 -18
  206. package/dist/config/jest/api/globalSetup.d.ts +0 -3
  207. package/dist/config/jest/api/globalSetup.d.ts.map +0 -1
  208. package/dist/config/jest/api/globalSetup.js +0 -36
  209. package/dist/config/jest/api/index.d.ts +0 -3
  210. package/dist/config/jest/api/index.d.ts.map +0 -1
  211. package/dist/config/jest/api/index.js +0 -11
  212. package/dist/config/jest/api/jest-preset.d.ts +0 -4
  213. package/dist/config/jest/api/jest-preset.d.ts.map +0 -1
  214. package/dist/config/jest/api/jest-preset.js +0 -69
  215. package/dist/config/jest/api/jest.setup.d.ts +0 -2
  216. package/dist/config/jest/api/jest.setup.d.ts.map +0 -1
  217. package/dist/config/jest/api/jest.setup.js +0 -248
  218. package/dist/config/jest/babelPlugins/babel-plugin-redwood-cell.d.ts +0 -11
  219. package/dist/config/jest/babelPlugins/babel-plugin-redwood-cell.d.ts.map +0 -1
  220. package/dist/config/jest/babelPlugins/babel-plugin-redwood-cell.js +0 -101
  221. package/dist/config/jest/jest-serial-runner.d.ts +0 -8
  222. package/dist/config/jest/jest-serial-runner.d.ts.map +0 -1
  223. package/dist/config/jest/jest-serial-runner.js +0 -23
  224. package/dist/config/jest/web/RedwoodWebJestEnv.d.ts +0 -6
  225. package/dist/config/jest/web/RedwoodWebJestEnv.d.ts.map +0 -1
  226. package/dist/config/jest/web/RedwoodWebJestEnv.js +0 -18
  227. package/dist/config/jest/web/index.d.ts +0 -3
  228. package/dist/config/jest/web/index.d.ts.map +0 -1
  229. package/dist/config/jest/web/index.js +0 -11
  230. package/dist/config/jest/web/jest-preset.d.ts +0 -4
  231. package/dist/config/jest/web/jest-preset.d.ts.map +0 -1
  232. package/dist/config/jest/web/jest-preset.js +0 -89
  233. package/dist/config/jest/web/jest.setup.d.ts +0 -8
  234. package/dist/config/jest/web/jest.setup.d.ts.map +0 -1
  235. package/dist/config/jest/web/jest.setup.js +0 -28
  236. package/dist/config/jest/web/resolver.d.ts +0 -4
  237. package/dist/config/jest/web/resolver.d.ts.map +0 -1
  238. package/dist/config/jest/web/resolver.js +0 -38
  239. package/dist/config/jest/web/webBabelConfig.d.ts +0 -10
  240. package/dist/config/jest/web/webBabelConfig.d.ts.map +0 -1
  241. package/dist/config/jest/web/webBabelConfig.js +0 -18
  242. package/dist/web/fileMock.d.ts +0 -9
  243. package/dist/web/fileMock.d.ts.map +0 -1
  244. package/dist/web/fileMock.js +0 -4
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Redacts credentials from a database connection string so it's safe to
3
+ * print. Handles both URI-style authority credentials, e.g.
4
+ * `postgres://user:pass@host/db` -> `postgres://user:***@host/db`, and
5
+ * semicolon-delimited key/value credentials used by SQL Server connection
6
+ * strings, e.g. `Server=host;Password=secret;` -> `Server=host;Password=***;`.
7
+ */
8
+ export declare function redactDatabaseUrl(url: string): string;
9
+ /**
10
+ * Checks that the `DATABASE_URL` about to be used for tests matches the
11
+ * datasource provider configured in `schema.prisma`, and throws an
12
+ * actionable error if they don't match.
13
+ *
14
+ * Without this check, running `prisma db push`/`migrate reset` against a
15
+ * mismatched provider/URL combination (e.g. a leftover sqlite fallback URL
16
+ * with a `postgresql` schema) can hang indefinitely with no output, instead
17
+ * of failing fast. See https://github.com/cedarjs/cedar/issues/2284.
18
+ *
19
+ * If the provider can't be determined (e.g. `schema.prisma` doesn't exist
20
+ * yet), this is a no-op — Prisma itself will surface the problem.
21
+ */
22
+ export declare function checkTestDatabaseUrlMatchesProvider(databaseUrl: string, usedFallback: boolean): Promise<void>;
23
+ //# sourceMappingURL=checkTestDatabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkTestDatabase.d.ts","sourceRoot":"","sources":["../../src/api/checkTestDatabase.ts"],"names":[],"mappings":"AAkBA;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIrD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mCAAmC,CACvD,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,OAAO,iBAmCtB"}
@@ -0,0 +1,44 @@
1
+ import { getPrismaDatasourceProvider } from "@cedarjs/project-config";
2
+ const PROVIDER_URL_SCHEMES = {
3
+ sqlite: ["file:"],
4
+ postgresql: ["postgres:", "postgresql:"],
5
+ postgres: ["postgres:", "postgresql:"],
6
+ cockroachdb: ["postgres:", "postgresql:"],
7
+ mysql: ["mysql:"],
8
+ sqlserver: ["sqlserver:"],
9
+ mongodb: ["mongodb:", "mongodb+srv:"]
10
+ };
11
+ function getUrlScheme(url) {
12
+ const match = url.match(/^([a-z][a-z0-9+.-]*:)/i);
13
+ return match?.[1]?.toLowerCase();
14
+ }
15
+ function redactDatabaseUrl(url) {
16
+ return url.replace(/:\/\/([^:/?#]+):([^@/?#]+)@/, "://$1:***@").replace(/((?:^|;)\s*password\s*=)[^;]*/gi, "$1***");
17
+ }
18
+ async function checkTestDatabaseUrlMatchesProvider(databaseUrl, usedFallback) {
19
+ let provider;
20
+ try {
21
+ provider = await getPrismaDatasourceProvider();
22
+ } catch {
23
+ return;
24
+ }
25
+ const expectedSchemes = PROVIDER_URL_SCHEMES[provider];
26
+ if (!expectedSchemes) {
27
+ return;
28
+ }
29
+ const actualScheme = getUrlScheme(databaseUrl);
30
+ if (actualScheme && expectedSchemes.includes(actualScheme)) {
31
+ return;
32
+ }
33
+ const redactedUrl = redactDatabaseUrl(databaseUrl);
34
+ const reason = usedFallback ? `TEST_DATABASE_URL is not set, so the default sqlite test database was used (${redactedUrl}), but your schema.prisma is configured for "${provider}". Set TEST_DATABASE_URL to a "${provider}" connection string to run tests.` : `TEST_DATABASE_URL (${redactedUrl}) does not match the "${provider}" provider configured in schema.prisma. Update TEST_DATABASE_URL to a "${provider}" connection string.`;
35
+ throw new Error(
36
+ `Test database URL does not match your Prisma schema's provider.
37
+
38
+ ${reason}`
39
+ );
40
+ }
41
+ export {
42
+ checkTestDatabaseUrlMatchesProvider,
43
+ redactDatabaseUrl
44
+ };
@@ -1,5 +1,4 @@
1
1
  export * from './apiFunction.js';
2
2
  export * from './scenario.js';
3
3
  export * from './directive.js';
4
- export * from './directUrlHelpers.js';
5
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA"}
package/dist/api/index.js CHANGED
@@ -1,4 +1,3 @@
1
1
  export * from "./apiFunction.js";
2
2
  export * from "./scenario.js";
3
3
  export * from "./directive.js";
4
- export * from "./directUrlHelpers.js";
@@ -1 +1 @@
1
- {"version":3,"file":"CedarApiVitestEnv.d.ts","sourceRoot":"","sources":["../../../src/api/vitest/CedarApiVitestEnv.ts"],"names":[],"mappings":"AACA,OAAO,2BAA2B,CAAA;AAElC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAQtD,QAAA,MAAM,yBAAyB,EAAE,WAkDhC,CAAA;AAED,eAAe,yBAAyB,CAAA"}
1
+ {"version":3,"file":"CedarApiVitestEnv.d.ts","sourceRoot":"","sources":["../../../src/api/vitest/CedarApiVitestEnv.ts"],"names":[],"mappings":"AAEA,OAAO,2BAA2B,CAAA;AAElC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAUtD,QAAA,MAAM,yBAAyB,EAAE,WAgDhC,CAAA;AAED,eAAe,yBAAyB,CAAA"}
@@ -1,12 +1,15 @@
1
- import prismaInternals from "@prisma/internals";
1
+ import path from "node:path";
2
2
  import "dotenv-defaults/config.js";
3
3
  import execa from "execa";
4
- import { getPaths, getSchemaPath } from "@cedarjs/project-config";
5
- import { getDefaultDb, checkAndReplaceDirectUrl } from "../directUrlHelpers.js";
6
- const { getSchemaWithPath } = prismaInternals;
4
+ import { getPaths } from "@cedarjs/project-config";
5
+ import { getPackageManager } from "@cedarjs/project-config/packageManager";
6
+ import {
7
+ checkTestDatabaseUrlMatchesProvider,
8
+ redactDatabaseUrl
9
+ } from "../checkTestDatabase.js";
7
10
  const CedarApiVitestEnvironment = {
8
11
  name: "cedar-api",
9
- transformMode: "ssr",
12
+ viteEnvironment: "ssr",
10
13
  async setup() {
11
14
  if (process.env.SKIP_DB_PUSH === "1") {
12
15
  return {
@@ -15,21 +18,23 @@ const CedarApiVitestEnvironment = {
15
18
  };
16
19
  }
17
20
  const cedarPaths = getPaths();
18
- const defaultDb = getDefaultDb(cedarPaths.base);
21
+ const defaultDb = `file:${path.join(cedarPaths.generated.base, "test.db")}`;
22
+ const usedFallback = !process.env.TEST_DATABASE_URL;
19
23
  process.env.DATABASE_URL = process.env.TEST_DATABASE_URL || defaultDb;
20
- const schemaPath = await getSchemaPath(cedarPaths.api.prismaConfig);
21
- const result = await getSchemaWithPath(schemaPath);
22
- const prismaSchema = result.schemas.map(([, content]) => content).join("\n");
23
- const directUrlEnvVar = checkAndReplaceDirectUrl(prismaSchema, defaultDb);
24
- const command = process.env.TEST_DATABASE_STRATEGY === "reset" ? ["prisma", "migrate", "reset", "--force", "--skip-seed"] : ["prisma", "db", "push", "--force-reset", "--accept-data-loss"];
25
- const directUrlDefinition = directUrlEnvVar ? { [directUrlEnvVar]: process.env[directUrlEnvVar] } : {};
26
- execa.sync("yarn", ["cedar", ...command], {
24
+ await checkTestDatabaseUrlMatchesProvider(
25
+ process.env.DATABASE_URL,
26
+ usedFallback
27
+ );
28
+ console.log(
29
+ `Setting up test database: ${redactDatabaseUrl(process.env.DATABASE_URL)}`
30
+ );
31
+ const command = process.env.TEST_DATABASE_STRATEGY === "reset" ? ["prisma", "migrate", "reset", "--force"] : ["prisma", "db", "push", "--force-reset", "--accept-data-loss"];
32
+ const pm = getPackageManager();
33
+ const pmExec = pm === "pnpm" ? pm : "npx";
34
+ execa.sync(pmExec, ["cedar", ...command], {
27
35
  cwd: cedarPaths.api.base,
28
36
  stdio: "inherit",
29
- env: {
30
- DATABASE_URL: process.env.DATABASE_URL,
31
- ...directUrlDefinition
32
- }
37
+ env: process.env
33
38
  });
34
39
  return {
35
40
  teardown() {
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Whether `e` is a constraint violation that scenario teardown recovers from
3
+ * by emptying the table later, rather than an error worth raising.
4
+ */
5
+ export declare function isHandledTeardownError(e: unknown): boolean;
6
+ /**
7
+ * Empties every table in `order`, deferring a table to the end of the order
8
+ * when a foreign key says another table has to be emptied first, and
9
+ * returning the order that worked so the next run can start with it.
10
+ *
11
+ * A table that cannot be emptied in any order (a trigger that aborts the
12
+ * delete, or a foreign key no ordering satisfies) would otherwise be deferred
13
+ * forever, since deferring appends to the order being walked. Deferring every
14
+ * table still waiting without emptying one means no order works, so the
15
+ * driver's error is raised instead.
16
+ */
17
+ export declare function emptyTablesInWorkingOrder(order: string[], emptyTable: (modelName: string) => Promise<unknown>): Promise<string[]>;
18
+ //# sourceMappingURL=teardown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teardown.d.ts","sourceRoot":"","sources":["../../../src/api/vitest/teardown.ts"],"names":[],"mappings":"AA0BA;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAQ1D;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAClD,OAAO,CAAC,MAAM,EAAE,CAAC,CA+BnB"}
@@ -0,0 +1,43 @@
1
+ const RETRYABLE_ERROR_KINDS = [
2
+ "ForeignKeyConstraintViolation",
3
+ "RestrictViolation"
4
+ ];
5
+ function property(value, key) {
6
+ return typeof value === "object" && value !== null ? value[key] : void 0;
7
+ }
8
+ function isHandledTeardownError(e) {
9
+ const cause = property(
10
+ property(property(e, "meta"), "driverAdapterError"),
11
+ "cause"
12
+ );
13
+ const kind = property(cause, "kind");
14
+ return typeof kind === "string" && RETRYABLE_ERROR_KINDS.includes(kind);
15
+ }
16
+ async function emptyTablesInWorkingOrder(order, emptyTable) {
17
+ const remaining = [...order];
18
+ let pendingCount = remaining.length;
19
+ let deferralsSinceLastEmptied = 0;
20
+ for (const modelName of remaining) {
21
+ if (modelName === null) {
22
+ continue;
23
+ }
24
+ try {
25
+ await emptyTable(modelName);
26
+ pendingCount--;
27
+ deferralsSinceLastEmptied = 0;
28
+ } catch (e) {
29
+ console.error("teardown error\n", e);
30
+ if (!isHandledTeardownError(e) || deferralsSinceLastEmptied >= pendingCount) {
31
+ throw e;
32
+ }
33
+ deferralsSinceLastEmptied++;
34
+ remaining[remaining.indexOf(modelName)] = null;
35
+ remaining.push(modelName);
36
+ }
37
+ }
38
+ return remaining.filter((name) => name !== null);
39
+ }
40
+ export {
41
+ emptyTablesInWorkingOrder,
42
+ isHandledTeardownError
43
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin-cedar-vitest-api-config.d.ts","sourceRoot":"","sources":["../../../src/api/vitest/vite-plugin-cedar-vitest-api-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAIlC,wBAAgB,0BAA0B,IAAI,MAAM,CA4BnD"}
1
+ {"version":3,"file":"vite-plugin-cedar-vitest-api-config.d.ts","sourceRoot":"","sources":["../../../src/api/vitest/vite-plugin-cedar-vitest-api-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAIlC,wBAAgB,0BAA0B,IAAI,MAAM,CAiCnD"}
@@ -7,7 +7,12 @@ function cedarVitestApiConfigPlugin() {
7
7
  return {
8
8
  define: getEnvVarDefinitions(),
9
9
  ssr: {
10
- noExternal: ["@cedarjs/testing"]
10
+ // `@cedarjs/tenancy` reads and writes the request context, which
11
+ // the api test setup replaces with a mock. The mock only reaches
12
+ // code Vite processes, so the tenancy runtime has to be bundled
13
+ // rather than loaded as an external dependency, or a service under
14
+ // test and its Prisma extension would see different contexts.
15
+ noExternal: ["@cedarjs/testing", "@cedarjs/tenancy"]
11
16
  },
12
17
  resolve: {
13
18
  alias: {
@@ -16,13 +21,13 @@ function cedarVitestApiConfigPlugin() {
16
21
  },
17
22
  test: {
18
23
  environment: path.join(import.meta.dirname, "CedarApiVitestEnv.js"),
19
- // fileParallelism: false,
20
- // fileParallelism doesn't work with vitest projects (which is what
21
- // we're using in the root vitest.config.ts). As a workaround we set
22
- // poolOptions instead, which also shouldn't work, but was suggested
23
- // by Vitest team member AriPerkkio (Hiroshi's answer didn't work).
24
- // https://github.com/vitest-dev/vitest/discussions/7416
25
- poolOptions: { forks: { singleFork: true } },
24
+ // All api test files share a single test database, so they can't
25
+ // run in parallel. In Vitest 3 project-level fileParallelism didn't
26
+ // work (https://github.com/vitest-dev/vitest/discussions/7416) and
27
+ // we used the now-removed `poolOptions: { forks: { singleFork:
28
+ // true } }` as a workaround. Vitest 4 removed `poolOptions` and
29
+ // supports `fileParallelism` in project configs.
30
+ fileParallelism: false,
26
31
  setupFiles: [path.join(import.meta.dirname, "vitest-api.setup.js")]
27
32
  }
28
33
  };
@@ -1 +1 @@
1
- {"version":3,"file":"vitest-api.setup.d.ts","sourceRoot":"","sources":["../../../src/api/vitest/vitest-api.setup.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AA0C1D,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,eAAe,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,KAAK,IAAI,CAAA;CAC3E;AAUD,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,cAAc,EAAE,cAAc,CAAA;IAElC,IAAI,uBAAuB,EAAE,OAAO,CAAA;CACrC"}
1
+ {"version":3,"file":"vitest-api.setup.d.ts","sourceRoot":"","sources":["../../../src/api/vitest/vitest-api.setup.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AA4C1D,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,eAAe,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,KAAK,IAAI,CAAA;CAC3E;AAUD,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,cAAc,EAAE,cAAc,CAAA;IAElC,IAAI,uBAAuB,EAAE,OAAO,CAAA;CACrC"}
@@ -1,8 +1,9 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import { afterAll, beforeEach, it, describe, vi, beforeAll } from "vitest";
4
- import { getPaths, getSchemaPath } from "@cedarjs/project-config";
4
+ import { getPaths, getPrismaSchemas } from "@cedarjs/project-config";
5
5
  import { defineScenario } from "@cedarjs/testing/api";
6
+ import { emptyTablesInWorkingOrder } from "./teardown.js";
6
7
  const mockContextStore = vi.hoisted(() => /* @__PURE__ */ new Map());
7
8
  const mockContext = vi.hoisted(
8
9
  () => new Proxy(
@@ -38,7 +39,6 @@ globalThis.mockCurrentUser = (currentUser) => {
38
39
  };
39
40
  globalThis.defineScenario = defineScenario;
40
41
  const cedarPaths = getPaths();
41
- const FOREIGN_KEY_ERRORS = [1451, 1811, 23503];
42
42
  const TEARDOWN_CACHE_PATH = path.join(
43
43
  cedarPaths.generated.base,
44
44
  "scenarioTeardown.json"
@@ -60,8 +60,8 @@ function buildScenario(itFunc) {
60
60
  } else {
61
61
  throw new Error("scenario() requires 2 or 3 arguments");
62
62
  }
63
- return itFunc(testName, async (ctx) => {
64
- const testPath = ctx.task.file.filepath;
63
+ return itFunc(testName, async ({ task }) => {
64
+ const testPath = task.file.filepath;
65
65
  const { scenario } = await loadScenarios(testPath, scenarioName);
66
66
  const scenarioData = await seedScenario(scenario);
67
67
  try {
@@ -89,8 +89,8 @@ function buildDescribeScenario(describeFunc) {
89
89
  }
90
90
  return describeFunc(describeBlockName, () => {
91
91
  let scenarioData;
92
- beforeAll(async (ctx) => {
93
- const testPath = ctx.file.filepath;
92
+ beforeAll(async ({}, suite) => {
93
+ const testPath = suite.file.filepath;
94
94
  const { scenario } = await loadScenarios(testPath, scenarioName);
95
95
  scenarioData = await seedScenario(scenario);
96
96
  });
@@ -106,9 +106,8 @@ async function configureTeardown() {
106
106
  if (!wasDbImported()) {
107
107
  return;
108
108
  }
109
- const { getDMMF, getSchemaWithPath } = await import("@prisma/internals");
110
- const schemaPath = await getSchemaPath(cedarPaths.api.prismaConfig);
111
- const result = await getSchemaWithPath(schemaPath);
109
+ const { getDMMF } = await import("@prisma/internals");
110
+ const result = await getPrismaSchemas();
112
111
  const schema = await getDMMF({ datamodel: result.schemas });
113
112
  const schemaModels = schema.datamodel.models.map((m) => {
114
113
  return m.dbName || m.name;
@@ -133,23 +132,12 @@ async function teardown() {
133
132
  }
134
133
  const quoteStyle2 = await getQuoteStyle();
135
134
  const projectDb = await getProjectDb();
136
- for (const modelName of teardownOrder) {
137
- try {
138
- const query = `DELETE FROM ${quoteStyle2}${modelName}${quoteStyle2}`;
139
- await projectDb.$executeRawUnsafe(query);
140
- } catch (e) {
141
- console.error("teardown error\n", e);
142
- const match = isErrorWithMessage(e) && e.message.match(/Code: `(\d+)`/);
143
- if (match && FOREIGN_KEY_ERRORS.includes(parseInt(match[1]))) {
144
- const index = teardownOrder.indexOf(modelName);
145
- teardownOrder[index] = null;
146
- teardownOrder.push(modelName);
147
- } else {
148
- throw e;
149
- }
150
- }
151
- }
152
- teardownOrder = teardownOrder.filter((val) => val);
135
+ teardownOrder = await emptyTablesInWorkingOrder(
136
+ teardownOrder,
137
+ (modelName) => projectDb.$executeRawUnsafe(
138
+ `DELETE FROM ${quoteStyle2}${modelName}${quoteStyle2}`
139
+ )
140
+ );
153
141
  if (!isIdenticalArray(teardownOrder, originalTeardownOrder)) {
154
142
  originalTeardownOrder = deepCopy(teardownOrder);
155
143
  fs.writeFileSync(TEARDOWN_CACHE_PATH, JSON.stringify(teardownOrder));
@@ -210,9 +198,8 @@ const wasDbImported = () => {
210
198
  };
211
199
  let quoteStyle;
212
200
  async function getQuoteStyle() {
213
- const { getConfig: getPrismaConfig, getSchemaWithPath } = await import("@prisma/internals");
214
- const schemaPath = await getSchemaPath(cedarPaths.api.prismaConfig);
215
- const result = await getSchemaWithPath(schemaPath);
201
+ const { getConfig: getPrismaConfig } = await import("@prisma/internals");
202
+ const result = await getPrismaSchemas();
216
203
  if (!quoteStyle) {
217
204
  const config = await getPrismaConfig({
218
205
  datamodel: result.schemas
@@ -229,7 +216,8 @@ async function getQuoteStyle() {
229
216
  }
230
217
  async function getProjectDb() {
231
218
  const libDb = await import(`${cedarPaths.api.lib}/db`);
232
- return libDb.db;
219
+ const db = libDb.db;
220
+ return typeof db?.$withoutTenant === "function" ? db.$withoutTenant() : db;
233
221
  }
234
222
  function isIdenticalArray(a, b) {
235
223
  return JSON.stringify(a) === JSON.stringify(b);
@@ -237,9 +225,6 @@ function isIdenticalArray(a, b) {
237
225
  function deepCopy(obj) {
238
226
  return JSON.parse(JSON.stringify(obj));
239
227
  }
240
- function isErrorWithMessage(e) {
241
- return !!e && typeof e === "object" && "message" in e && typeof e.message === "string";
242
- }
243
228
  function isErrorWithCode(e) {
244
229
  return !!e && typeof e === "object" && "code" in e && typeof e.code === "string";
245
230
  }
@@ -57,7 +57,7 @@ const _isKVPair = (keyOrCachedValue, cachedValue) => {
57
57
  const _checkValueForKey = (cacheClient, cacheKey, expectedValue) => {
58
58
  try {
59
59
  const cachedStringValue = cacheClient.storage[cacheKey]?.value;
60
- const expectedValueOrMatcher = expectedValue?.$$typeof === Symbol.for("jest.asymmetricMatcher") ? expectedValue : JSON.parse(JSON.stringify(expectedValue));
60
+ const expectedValueOrMatcher = expectedValue?.$$typeof === /* @__PURE__ */ Symbol.for("jest.asymmetricMatcher") ? expectedValue : JSON.parse(JSON.stringify(expectedValue));
61
61
  expect(
62
62
  cachedStringValue ? JSON.parse(cachedStringValue) : void 0
63
63
  ).toEqual(expectedValueOrMatcher);
@@ -1 +1 @@
1
- {"version":3,"file":"MockParamsProvider.d.ts","sourceRoot":"","sources":["../../src/web/MockParamsProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,UAAU,KAAK;IACb,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAS9C,CAAA"}
1
+ {"version":3,"file":"MockParamsProvider.d.ts","sourceRoot":"","sources":["../../src/web/MockParamsProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAMzB,UAAU,KAAK;IACb,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAgB9C,CAAA"}
@@ -1,9 +1,18 @@
1
1
  import React from "react";
2
2
  import { useLocation, ParamsContext, parseSearch } from "@cedarjs/router";
3
+ import { mockedRouteParamsMeta } from "./mockRequests.js";
3
4
  const MockParamsProvider = ({ children }) => {
4
5
  const location = useLocation();
5
6
  const searchParams = parseSearch(location.search);
6
- return /* @__PURE__ */ React.createElement(ParamsContext.Provider, { value: { params: { ...searchParams } } }, children);
7
+ return /* @__PURE__ */ React.createElement(
8
+ ParamsContext.Provider,
9
+ {
10
+ value: {
11
+ params: { ...searchParams, ...mockedRouteParamsMeta.params }
12
+ }
13
+ },
14
+ children
15
+ );
7
16
  };
8
17
  export {
9
18
  MockParamsProvider
@@ -1,25 +1,31 @@
1
1
  import React from "react";
2
2
  import { LocationProvider } from "@cedarjs/router";
3
- import { RedwoodProvider } from "@cedarjs/web";
4
- import { RedwoodApolloProvider } from "@cedarjs/web/apollo";
3
+ import { CedarProvider } from "@cedarjs/web";
4
+ import { CedarApolloProvider } from "@cedarjs/web/apollo/CedarApolloProvider";
5
5
  import { UserRoutes as VitestUserRoutes } from "./globRoutesImporter.js";
6
6
  import { useAuth } from "./mockAuth.js";
7
7
  import { MockParamsProvider } from "./MockParamsProvider.js";
8
8
  let UserRoutes;
9
9
  try {
10
- const userRoutesModule = require("~__REDWOOD__USER_ROUTES_FOR_MOCK");
10
+ const userRoutesModule = require("~__CEDAR__USER_ROUTES_FOR_MOCK");
11
11
  UserRoutes = userRoutesModule.default;
12
12
  } catch (error) {
13
- if (!isModuleNotFoundError(error, "~__REDWOOD__USER_ROUTES_FOR_MOCK")) {
13
+ if (!isModuleNotFoundError(error, "~__CEDAR__USER_ROUTES_FOR_MOCK")) {
14
14
  console.warn(error);
15
15
  }
16
16
  UserRoutes = () => /* @__PURE__ */ React.createElement(React.Fragment, null);
17
17
  }
18
18
  const MockProviders = ({ children }) => {
19
- return /* @__PURE__ */ React.createElement(RedwoodProvider, { titleTemplate: "%PageTitle | %AppTitle" }, /* @__PURE__ */ React.createElement(RedwoodApolloProvider, { useAuth }, /* @__PURE__ */ React.createElement(UserRoutes, null), /* @__PURE__ */ React.createElement(VitestUserRoutes, null), /* @__PURE__ */ React.createElement(LocationProvider, null, /* @__PURE__ */ React.createElement(MockParamsProvider, null, children))));
19
+ return /* @__PURE__ */ React.createElement(CedarProvider, { titleTemplate: "%PageTitle | %AppTitle" }, /* @__PURE__ */ React.createElement(CedarApolloProvider, { useAuth }, /* @__PURE__ */ React.createElement(UserRoutes, null), /* @__PURE__ */ React.createElement(VitestUserRoutes, null), /* @__PURE__ */ React.createElement(LocationProvider, null, /* @__PURE__ */ React.createElement(MockParamsProvider, null, children))));
20
20
  };
21
21
  function isModuleNotFoundError(error, module) {
22
- return !!error && typeof error === "object" && "code" in error && error.code === "MODULE_NOT_FOUND" && "moduleName" in error && error.moduleName === module;
22
+ if (!error || typeof error !== "object" || !("code" in error) || error.code !== "MODULE_NOT_FOUND") {
23
+ return false;
24
+ }
25
+ if ("moduleName" in error) {
26
+ return error.moduleName === module;
27
+ }
28
+ return "message" in error && typeof error.message === "string" && (error.message.includes(`'${module}'`) || error.message.includes(`"${module}"`));
23
29
  }
24
30
  export {
25
31
  MockProviders
@@ -1 +1 @@
1
- {"version":3,"file":"MockRouter.d.ts","sourceRoot":"","sources":["../../src/web/MockRouter.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAO9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAG9D,cAAc,4BAA4B,CAAA;AAE1C,eAAO,MAAM,MAAM,EAAE;IAAE,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,MAAM,CAAA;CAAO,CAAA;AAE/D;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAcxC,CAAA"}
1
+ {"version":3,"file":"MockRouter.d.ts","sourceRoot":"","sources":["../../src/web/MockRouter.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAM9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAG9D,cAAc,4BAA4B,CAAA;AAE1C,eAAO,MAAM,MAAM,EAAE;IAAE,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,MAAM,CAAA;CAAO,CAAA;AAE/D;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAcxC,CAAA"}
@@ -1,30 +1,86 @@
1
- import type { StartOptions as StartMSWWorkerOptions, SharedOptions as SharedMSWOptions, MockedResponse, DefaultBodyType, RequestHandler, GraphQLContext, GraphQLRequest, ResponseTransformer } from 'msw';
2
- /**
3
- * Plugs fetch for the correct target in order to capture requests.
4
- *
5
- * Request handlers can be registered lazily (via `mockGraphQL<Query|Mutation>`),
6
- * the queue will be drained and used.
7
- */
8
- type StartOptions<Target> = Target extends 'browsers' ? StartMSWWorkerOptions : SharedMSWOptions;
9
- export declare const startMSW: <Target extends "node" | "browsers">(target: Target, options?: StartOptions<Target>) => Promise<any>;
1
+ import type { RequestHandler, SharedOptions } from 'msw';
2
+ import type { StartOptions as StartMSWWorkerOptions } from 'msw/browser';
3
+ interface MockServerCommonApi {
4
+ use(...handlers: any[]): void;
5
+ resetHandlers(): void;
6
+ }
7
+ type MockWorkerInstance = MockServerCommonApi & {
8
+ stop(): void;
9
+ };
10
+ type MockServerInstance = MockServerCommonApi & {
11
+ listen(options?: Partial<SharedOptions>): void;
12
+ close(): void;
13
+ };
14
+ type StartOptions<Target> = Target extends 'browsers' ? StartMSWWorkerOptions : Partial<SharedOptions>;
15
+ export declare const startMSW: <Target extends "node" | "browsers">(target: Target, options?: StartOptions<Target>) => Promise<MockWorkerInstance | MockServerInstance>;
10
16
  export declare const setupRequestHandlers: () => void;
11
17
  export declare const closeServer: () => void;
12
18
  export declare const registerHandler: (handler: RequestHandler) => void;
19
+ /**
20
+ * The `ctx` object passed to mock-data functions. It mirrors the API of MSW
21
+ * v1's GraphQL context so that existing Cedar mocks keep working with MSW v2,
22
+ * where the `(req, res, ctx)` resolver signature no longer exists.
23
+ */
24
+ export interface MockGraphQLContext {
25
+ /** Set the http response status code (and optionally status text) */
26
+ status(code: number, text?: string): void;
27
+ /** Delay the response by the given number of milliseconds */
28
+ delay(durationMs: number): void;
29
+ /** Return GraphQL errors in the response */
30
+ errors(errorList: Record<string, unknown>[]): void;
31
+ /** Set a response header. Accepts a name/value pair or an object */
32
+ set(name: string | Record<string, string>, value?: string): void;
33
+ /** Set a response cookie */
34
+ cookie(name: string, value: string): void;
35
+ /** Set the `extensions` field of the GraphQL response */
36
+ extensions(extensions: Record<string, unknown>): void;
37
+ /** Set an arbitrary field on the GraphQL response body */
38
+ field(fieldName: string, value: unknown): void;
39
+ /** Set the `data` field of the response. Overrides the returned mock-data */
40
+ data(data: Record<string, unknown>): void;
41
+ /** Perform a request that bypasses any mock handlers */
42
+ fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
43
+ }
44
+ /**
45
+ * Information about the intercepted GraphQL request, passed to mock-data
46
+ * functions as `req`
47
+ */
48
+ export interface MockGraphQLRequest {
49
+ /** The intercepted Fetch API `Request` */
50
+ request: Request;
51
+ /** The GraphQL query document string */
52
+ query: string;
53
+ operationName: string;
54
+ variables: Record<string, any>;
55
+ cookies: Record<string, string>;
56
+ url: URL;
57
+ headers: Headers;
58
+ method: string;
59
+ }
13
60
  export type DataFunction<Query extends Record<string, unknown> = Record<string, unknown>, QueryVariables = Record<string, any>> = (variables: QueryVariables, { req, ctx, }: {
14
- req: GraphQLRequest<any>;
15
- ctx: GraphQLContext<Record<string, any>>;
16
- }) => Query | void;
17
- type ResponseFunction<BodyType extends DefaultBodyType = any> = (...transformers: ResponseTransformer<BodyType>[]) => MockedResponse<BodyType>;
18
- type ResponseEnhancers = {
19
- once: ResponseFunction<any>;
20
- networkError: (message: string) => void;
21
- };
22
- type ResponseEnhancer = keyof ResponseEnhancers;
61
+ req: MockGraphQLRequest;
62
+ ctx: MockGraphQLContext;
63
+ }) => Query | void | Promise<Query | void>;
64
+ type ResponseEnhancer = 'once' | 'networkError';
23
65
  export declare const mockGraphQLQuery: <Query extends Record<string, unknown> = Record<string, unknown>, QueryVariables = Record<string, any>>(operation: string, data: DataFunction<Query, QueryVariables> | Query, responseEnhancer?: ResponseEnhancer) => Record<string, any> | DataFunction<Record<string, unknown>, Record<string, any>>;
24
66
  export declare const mockGraphQLMutation: <Query extends Record<string, unknown> = Record<string, unknown>, QueryVariables = Record<string, any>>(operation: string, data: DataFunction<Query, QueryVariables> | Query, responseEnhancer?: ResponseEnhancer) => Record<string, any> | DataFunction<Record<string, unknown>, Record<string, any>>;
25
67
  export declare const mockedUserMeta: {
26
68
  currentUser: Record<string, unknown> | null;
27
69
  };
28
70
  export declare const mockCurrentUser: (user: Record<string, unknown> | null) => void;
71
+ export declare const mockedRouteParamsMeta: {
72
+ params: Record<string, string>;
73
+ };
74
+ /**
75
+ * Sets the route params `useParams()` (and generated `routes.*()` calls, via
76
+ * `MockRouter`) see in a rendered-in-isolation test -- a cell test, for
77
+ * example, has no matched route to read `{orgSlug}` or similar path params
78
+ * from. Mirrors `mockCurrentUser`'s effect on `useAuth().currentUser`.
79
+ *
80
+ * ```ts
81
+ * mockRouteParams({ orgSlug: 'acme' })
82
+ * ```
83
+ */
84
+ export declare const mockRouteParams: (params: Record<string, string>) => void;
29
85
  export {};
30
86
  //# sourceMappingURL=mockRequests.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mockRequests.d.ts","sourceRoot":"","sources":["../../src/web/mockRequests.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,IAAI,qBAAqB,EACrC,aAAa,IAAI,gBAAgB,EACjC,cAAc,EACd,eAAe,EACf,cAAc,EACd,cAAc,EACd,cAAc,EACd,mBAAmB,EAGpB,MAAM,KAAK,CAAA;AAQZ;;;;;GAKG;AAEH,KAAK,YAAY,CAAC,MAAM,IAAI,MAAM,SAAS,UAAU,GACjD,qBAAqB,GACrB,gBAAgB,CAAA;AACpB,eAAO,MAAM,QAAQ,GAAU,MAAM,SAAS,MAAM,GAAG,UAAU,EAC/D,QAAQ,MAAM,EACd,UAAU,YAAY,CAAC,MAAM,CAAC,iBAgB/B,CAAA;AAED,eAAO,MAAM,oBAAoB,YAMhC,CAAA;AAED,eAAO,MAAM,WAAW,YAEvB,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,SAAS,cAAc,SAQtD,CAAA;AAED,MAAM,MAAM,YAAY,CACtB,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/D,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAClC,CACF,SAAS,EAAE,cAAc,EACzB,EACE,GAAG,EACH,GAAG,GACJ,EAAE;IACD,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC,CAAA;IACxB,GAAG,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;CACzC,KACE,KAAK,GAAG,IAAI,CAAA;AAGjB,KAAK,gBAAgB,CAAC,QAAQ,SAAS,eAAe,GAAG,GAAG,IAAI,CAC9D,GAAG,YAAY,EAAE,mBAAmB,CAAC,QAAQ,CAAC,EAAE,KAC7C,cAAc,CAAC,QAAQ,CAAC,CAAA;AAE7B,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAA;IAC3B,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACxC,CAAA;AACD,KAAK,gBAAgB,GAAG,MAAM,iBAAiB,CAAA;AAuD/C,eAAO,MAAM,gBAAgB,GAC3B,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/D,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAEpC,WAAW,MAAM,EACjB,MAAM,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,GAAG,KAAK,EACjD,mBAAmB,gBAAgB,qFAGpC,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC9B,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/D,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAEpC,WAAW,MAAM,EACjB,MAAM,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,GAAG,KAAK,EACjD,mBAAmB,gBAAgB,qFAGpC,CAAA;AAED,eAAO,MAAM,cAAc,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CAEzE,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,SASnE,CAAA"}
1
+ {"version":3,"file":"mockRequests.d.ts","sourceRoot":"","sources":["../../src/web/mockRequests.ts"],"names":[],"mappings":"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"}