@cedarjs/testing 5.0.4-next.167 → 5.0.4
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/config/jest/api/apiBabelConfig.d.ts.map +1 -1
- package/config/jest/api/apiBabelConfig.js +3 -1
- package/config/jest/api/jest-preset.d.ts.map +1 -1
- package/config/jest/api/jest-preset.js +3 -38
- package/config/jest/babelPlugins/babel-plugin-redwood-cell.d.ts.map +1 -1
- package/config/jest/babelPlugins/babel-plugin-redwood-cell.js +1 -2
- package/config/jest/web/RedwoodWebJestEnv.d.ts +2 -2
- package/config/jest/web/RedwoodWebJestEnv.d.ts.map +1 -1
- package/config/jest/web/RedwoodWebJestEnv.js +7 -12
- package/config/jest/web/jest-preset.d.ts.map +1 -1
- package/config/jest/web/jest-preset.js +30 -135
- package/config/jest/web/jest.setup.d.ts +1 -0
- package/config/jest/web/jest.setup.d.ts.map +1 -1
- package/config/jest/web/jest.setup.js +1 -0
- package/dist/api/vitest/CedarApiVitestEnv.js +1 -1
- package/dist/api/vitest/vite-plugin-cedar-vitest-api-config.js +7 -7
- package/dist/api/vitest/vitest-api.setup.js +4 -4
- package/dist/cjs/api/vitest/CedarApiVitestEnv.js +1 -1
- package/dist/cjs/api/vitest/vite-plugin-cedar-vitest-api-config.js +7 -7
- package/dist/cjs/api/vitest/vitest-api.setup.js +4 -4
- package/dist/cjs/config/jest/api/apiBabelConfig.d.ts.map +1 -1
- package/dist/cjs/config/jest/api/apiBabelConfig.js +3 -1
- package/dist/cjs/config/jest/api/jest-preset.d.ts.map +1 -1
- package/dist/cjs/config/jest/api/jest-preset.js +3 -38
- package/dist/cjs/config/jest/babelPlugins/babel-plugin-redwood-cell.d.ts.map +1 -1
- package/dist/cjs/config/jest/babelPlugins/babel-plugin-redwood-cell.js +1 -2
- package/dist/cjs/config/jest/web/RedwoodWebJestEnv.d.ts +2 -2
- package/dist/cjs/config/jest/web/RedwoodWebJestEnv.d.ts.map +1 -1
- package/dist/cjs/config/jest/web/RedwoodWebJestEnv.js +7 -12
- package/dist/cjs/config/jest/web/jest-preset.d.ts.map +1 -1
- package/dist/cjs/config/jest/web/jest-preset.js +30 -135
- package/dist/cjs/config/jest/web/jest.setup.d.ts +1 -0
- package/dist/cjs/config/jest/web/jest.setup.d.ts.map +1 -1
- package/dist/cjs/config/jest/web/jest.setup.js +1 -0
- package/dist/cjs/web/MockProviders.js +3 -9
- package/dist/cjs/web/mockRequests.d.ts +18 -60
- package/dist/cjs/web/mockRequests.d.ts.map +1 -1
- package/dist/cjs/web/mockRequests.js +36 -107
- package/dist/cjs/web/vitest/index.d.ts +4 -0
- package/dist/cjs/web/vitest/index.d.ts.map +1 -0
- package/dist/cjs/web/vitest/index.js +0 -3
- package/dist/cjs/web/vitest/vite-plugin-auto-import.d.ts +2 -0
- package/dist/cjs/web/vitest/vite-plugin-auto-import.d.ts.map +1 -0
- package/dist/cjs/web/vitest/vite-plugin-cedarjs-router-import-transform.d.ts +7 -0
- package/dist/cjs/web/vitest/vite-plugin-cedarjs-router-import-transform.d.ts.map +1 -0
- package/dist/cjs/web/vitest/vite-plugin-create-auth-import-transform.d.ts +3 -0
- package/dist/cjs/web/vitest/vite-plugin-create-auth-import-transform.d.ts.map +1 -0
- package/dist/config/jest/api/apiBabelConfig.d.ts.map +1 -1
- package/dist/config/jest/api/apiBabelConfig.js +3 -1
- package/dist/config/jest/api/index.js +1 -5
- package/dist/config/jest/api/jest-preset.d.ts.map +1 -1
- package/dist/config/jest/api/jest-preset.js +3 -38
- package/dist/config/jest/babelPlugins/babel-plugin-redwood-cell.d.ts.map +1 -1
- package/dist/config/jest/babelPlugins/babel-plugin-redwood-cell.js +1 -2
- package/dist/config/jest/jest-serial-runner.js +1 -5
- package/dist/config/jest/web/RedwoodWebJestEnv.d.ts +2 -2
- package/dist/config/jest/web/RedwoodWebJestEnv.d.ts.map +1 -1
- package/dist/config/jest/web/RedwoodWebJestEnv.js +7 -2
- package/dist/config/jest/web/index.js +1 -5
- package/dist/config/jest/web/jest-preset.d.ts.map +1 -1
- package/dist/config/jest/web/jest-preset.js +30 -135
- package/dist/config/jest/web/jest.setup.d.ts +1 -0
- package/dist/config/jest/web/jest.setup.d.ts.map +1 -1
- package/dist/config/jest/web/jest.setup.js +1 -0
- package/dist/config/jest/web/resolver.js +1 -5
- package/dist/web/MockProviders.js +3 -9
- package/dist/web/mockRequests.d.ts +18 -60
- package/dist/web/mockRequests.d.ts.map +1 -1
- package/dist/web/mockRequests.js +37 -108
- package/dist/web/vitest/index.d.ts +0 -1
- package/dist/web/vitest/index.d.ts.map +1 -1
- package/dist/web/vitest/index.js +0 -2
- package/package.json +21 -23
- package/config/jest/web/jest-fixed-jsdom.d.js +0 -1
- package/dist/cjs/config/jest/web/jest-fixed-jsdom.d.js +0 -1
- package/dist/cjs/web/vitest/vite-plugin-cedar-vitest-web-config.js +0 -51
- package/dist/cjs/web/vitest/vitest-web.setup.js +0 -19
- package/dist/config/jest/web/jest-fixed-jsdom.d.js +0 -0
- package/dist/web/vitest/vite-plugin-cedar-vitest-web-config.d.ts +0 -12
- package/dist/web/vitest/vite-plugin-cedar-vitest-web-config.d.ts.map +0 -1
- package/dist/web/vitest/vite-plugin-cedar-vitest-web-config.js +0 -16
- package/dist/web/vitest/vitest-web.setup.d.ts +0 -2
- package/dist/web/vitest/vitest-web.setup.d.ts.map +0 -1
- package/dist/web/vitest/vitest-web.setup.js +0 -18
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PluginOption } from 'vite';
|
|
2
|
+
/**
|
|
3
|
+
* Replace `@cedarjs/router` imports with imports of
|
|
4
|
+
* `@cedarjs/testing/web/MockRouter.js` instead
|
|
5
|
+
*/
|
|
6
|
+
export declare function cedarJsRouterImportTransformPlugin(): PluginOption;
|
|
7
|
+
//# sourceMappingURL=vite-plugin-cedarjs-router-import-transform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-plugin-cedarjs-router-import-transform.d.ts","sourceRoot":"","sources":["../../../../src/web/vitest/vite-plugin-cedarjs-router-import-transform.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAA;AAExC;;;GAGG;AACH,wBAAgB,kCAAkC,IAAI,YAAY,CAejE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-plugin-create-auth-import-transform.d.ts","sourceRoot":"","sources":["../../../../src/web/vitest/vite-plugin-create-auth-import-transform.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAA;AAExC,wBAAgB,+BAA+B,IAAI,YAAY,CAuB9D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiBabelConfig.d.ts","sourceRoot":"","sources":["../../../../src/config/jest/api/apiBabelConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,EAG7B,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"apiBabelConfig.d.ts","sourceRoot":"","sources":["../../../../src/config/jest/api/apiBabelConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,EAG7B,MAAM,uBAAuB,CAAA;AAS9B,KAAK,UAAU,GAAG,IAAI,CACpB,UAAU,CAAC,OAAO,4BAA4B,CAAC,EAC/C,SAAS,CACV,CAAA;AAED,QAAA,MAAM,MAAM,EAAE,UAMb,CAAA;AAED,eAAe,MAAM,CAAA"}
|
|
@@ -3,7 +3,9 @@ import {
|
|
|
3
3
|
getApiSideBabelPresets,
|
|
4
4
|
getApiSideBabelPlugins
|
|
5
5
|
} from "@cedarjs/babel-config";
|
|
6
|
-
const { babelrc: _b, ...defaultBabelConfig } = getApiSideDefaultBabelConfig(
|
|
6
|
+
const { babelrc: _b, ...defaultBabelConfig } = getApiSideDefaultBabelConfig({
|
|
7
|
+
forJest: true
|
|
8
|
+
});
|
|
7
9
|
const config = {
|
|
8
10
|
...defaultBabelConfig,
|
|
9
11
|
plugins: getApiSideBabelPlugins(),
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
2
2
|
var __commonJS = (cb, mod) => function __require() {
|
|
3
|
-
|
|
4
|
-
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
5
|
-
} catch (e) {
|
|
6
|
-
throw mod = 0, e;
|
|
7
|
-
}
|
|
3
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
8
4
|
};
|
|
9
5
|
import * as jestPreset from "./jest-preset.js";
|
|
10
6
|
var require_api = __commonJS({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jest-preset.d.ts","sourceRoot":"","sources":["../../../../src/config/jest/api/jest-preset.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"jest-preset.d.ts","sourceRoot":"","sources":["../../../../src/config/jest/api/jest-preset.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AASlC,QAAA,MAAM,MAAM,EAAE,MA0Db,CAAA;AAED,eAAe,MAAM,CAAA"}
|
|
@@ -2,17 +2,8 @@ import path from "node:path";
|
|
|
2
2
|
import { getApiSideDefaultBabelConfig } from "@cedarjs/babel-config";
|
|
3
3
|
import { getPaths } from "@cedarjs/project-config";
|
|
4
4
|
const rwjsPaths = getPaths();
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
try {
|
|
8
|
-
return require.resolve(specifier, {
|
|
9
|
-
paths: [rwjsPaths.api.base, rwjsPaths.base]
|
|
10
|
-
});
|
|
11
|
-
} catch {
|
|
12
|
-
return void 0;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
const testingApiPath = resolveSubpath("@cedarjs/testing/api");
|
|
5
|
+
const NODE_MODULES_PATH = path.join(rwjsPaths.base, "node_modules");
|
|
6
|
+
const { babelrc } = getApiSideDefaultBabelConfig({ forJest: true });
|
|
16
7
|
const config = {
|
|
17
8
|
// To make sure other config option which depends on rootDir use
|
|
18
9
|
// correct path, for example, coverageDirectory
|
|
@@ -53,34 +44,11 @@ const config = {
|
|
|
53
44
|
"^src/(.*)$": path.join(rwjsPaths.api.src, "$1"),
|
|
54
45
|
// @NOTE: Import @cedarjs/testing in api tests, and it automatically remaps to the api side only
|
|
55
46
|
// This is to prevent web stuff leaking into api, and vice versa
|
|
56
|
-
|
|
47
|
+
"^@cedarjs/testing$": path.join(NODE_MODULES_PATH, "@cedarjs/testing/api"),
|
|
57
48
|
// Support for importing files with extensions (like you'd do in ESM projects)
|
|
58
49
|
"^(\\.{1,2}/.*)\\.js$": "$1"
|
|
59
50
|
},
|
|
60
51
|
transform: {
|
|
61
|
-
// `@cedarjs/context`, `@cedarjs/api`, `@cedarjs/graphql-server`, and
|
|
62
|
-
// `@cedarjs/storage` are ESM-only. Two things pull them in at the top
|
|
63
|
-
// level of a generated project's api-side test run: @cedarjs/testing's
|
|
64
|
-
// own api entry point (which virtually every test imports, for
|
|
65
|
-
// scenario/mock helpers — pulls in `@cedarjs/context` and
|
|
66
|
-
// `@cedarjs/graphql-server` via `directive.ts`, and
|
|
67
|
-
// `@cedarjs/api/webhooks` via `apiFunction.ts`), and the *user's own*
|
|
68
|
-
// generated code — the `cedar setup uploads` template imports
|
|
69
|
-
// `@cedarjs/storage`. Jest's CJS runtime can't parse the real ESM these
|
|
70
|
-
// now emit, so they need the same babel-jest carve-out the web preset
|
|
71
|
-
// already uses for ESM-only node_modules packages (see jest-preset.ts
|
|
72
|
-
// on the web side for the fuller explanation of why this is
|
|
73
|
-
// necessary).
|
|
74
|
-
"[/\\\\]node_modules[/\\\\]@cedarjs[/\\\\](context|api|graphql-server|storage)[/\\\\].+\\.js$": [
|
|
75
|
-
"babel-jest",
|
|
76
|
-
{
|
|
77
|
-
babelrc: false,
|
|
78
|
-
configFile: false,
|
|
79
|
-
presets: [
|
|
80
|
-
[require.resolve("@babel/preset-env"), { targets: { node: "20" } }]
|
|
81
|
-
]
|
|
82
|
-
}
|
|
83
|
-
],
|
|
84
52
|
"\\.[cm]?[jt]sx?$": [
|
|
85
53
|
"babel-jest",
|
|
86
54
|
// When jest runs tests in parallel, it serializes the config before passing down options to babel
|
|
@@ -94,9 +62,6 @@ const config = {
|
|
|
94
62
|
}
|
|
95
63
|
]
|
|
96
64
|
},
|
|
97
|
-
transformIgnorePatterns: [
|
|
98
|
-
"[/\\\\]node_modules[/\\\\](?!@cedarjs[/\\\\]context[/\\\\])(?!@cedarjs[/\\\\]api[/\\\\])(?!@cedarjs[/\\\\]graphql-server[/\\\\])(?!@cedarjs[/\\\\]storage[/\\\\])"
|
|
99
|
-
],
|
|
100
65
|
testPathIgnorePatterns: [".scenarios.[jt]s$"]
|
|
101
66
|
};
|
|
102
67
|
var jest_preset_default = config;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"babel-plugin-redwood-cell.d.ts","sourceRoot":"","sources":["../../../../src/config/jest/babelPlugins/babel-plugin-redwood-cell.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,KAAK,KAAK,CAAC,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"babel-plugin-redwood-cell.d.ts","sourceRoot":"","sources":["../../../../src/config/jest/babelPlugins/babel-plugin-redwood-cell.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,KAAK,KAAK,CAAC,MAAM,cAAc,CAAA;AAqCtC,UAAU,WAAY,SAAQ,UAAU;IAKtC,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,gBAAgB,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,CAAC,OAAO,WAAW,EACvB,KAAK,GACN,EAAE;IACD,KAAK,EAAE,OAAO,CAAC,CAAA;CAChB,GAAG,SAAS,CAAC,WAAW,CAAC,CAkHzB"}
|
|
@@ -2,7 +2,6 @@ import { parse } from "node:path";
|
|
|
2
2
|
const EXPECTED_EXPORTS_FROM_CELL = [
|
|
3
3
|
"beforeQuery",
|
|
4
4
|
"QUERY",
|
|
5
|
-
"FRAGMENT",
|
|
6
5
|
"data",
|
|
7
6
|
"isEmpty",
|
|
8
7
|
"afterQuery",
|
|
@@ -48,7 +47,7 @@ function babel_plugin_redwood_cell_default({
|
|
|
48
47
|
state.hasDefaultExport = false;
|
|
49
48
|
},
|
|
50
49
|
exit(path, state) {
|
|
51
|
-
const hasQueryOrDataExport = state.exportNames.includes("QUERY") || state.exportNames.includes("
|
|
50
|
+
const hasQueryOrDataExport = state.exportNames.includes("QUERY") || state.exportNames.includes("data");
|
|
52
51
|
if (state.hasDefaultExport || !hasQueryOrDataExport) {
|
|
53
52
|
return;
|
|
54
53
|
}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
2
2
|
var __commonJS = (cb, mod) => function __require() {
|
|
3
|
-
|
|
4
|
-
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
5
|
-
} catch (e) {
|
|
6
|
-
throw mod = 0, e;
|
|
7
|
-
}
|
|
3
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
8
4
|
};
|
|
9
5
|
import jestRunner from "jest-runner";
|
|
10
6
|
var require_jest_serial_runner = __commonJS({
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
declare class RedwoodWebJestEnvironment extends
|
|
1
|
+
import { TestEnvironment } from 'jest-environment-jsdom';
|
|
2
|
+
declare class RedwoodWebJestEnvironment extends TestEnvironment {
|
|
3
3
|
setup(): Promise<void>;
|
|
4
4
|
}
|
|
5
5
|
export default RedwoodWebJestEnvironment;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RedwoodWebJestEnv.d.ts","sourceRoot":"","sources":["../../../../src/config/jest/web/RedwoodWebJestEnv.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RedwoodWebJestEnv.d.ts","sourceRoot":"","sources":["../../../../src/config/jest/web/RedwoodWebJestEnv.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAIxD,cAAM,yBAA0B,SAAQ,eAAe;IAC/C,KAAK;CAaZ;AAED,eAAe,yBAAyB,CAAA"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
1
|
+
import { TextEncoder, TextDecoder } from "node:util";
|
|
2
|
+
import { TestEnvironment } from "jest-environment-jsdom";
|
|
3
|
+
class RedwoodWebJestEnvironment extends TestEnvironment {
|
|
3
4
|
async setup() {
|
|
4
5
|
await super.setup();
|
|
6
|
+
if (typeof this.global.TextEncoder === "undefined") {
|
|
7
|
+
this.global.TextEncoder = TextEncoder;
|
|
8
|
+
this.global.TextDecoder = TextDecoder;
|
|
9
|
+
}
|
|
5
10
|
if (typeof this.global.crypto.subtle === "undefined") {
|
|
6
11
|
this.global.crypto.subtle = {};
|
|
7
12
|
}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
2
2
|
var __commonJS = (cb, mod) => function __require() {
|
|
3
|
-
|
|
4
|
-
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
5
|
-
} catch (e) {
|
|
6
|
-
throw mod = 0, e;
|
|
7
|
-
}
|
|
3
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
8
4
|
};
|
|
9
5
|
import * as jestPreset from "./jest-preset.js";
|
|
10
6
|
var require_web = __commonJS({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jest-preset.d.ts","sourceRoot":"","sources":["../../../../src/config/jest/web/jest-preset.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jest-preset.d.ts","sourceRoot":"","sources":["../../../../src/config/jest/web/jest-preset.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAOlC,QAAA,MAAM,MAAM,EAAE,MAkFb,CAAA;AAED,eAAe,MAAM,CAAA"}
|
|
@@ -1,65 +1,12 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
1
|
import path from "node:path";
|
|
3
2
|
import { getPaths } from "@cedarjs/project-config";
|
|
4
3
|
const cedarPaths = getPaths();
|
|
5
|
-
const
|
|
6
|
-
function resolvePackageDir(packageName, resolveFrom = RESOLVE_FROM) {
|
|
7
|
-
try {
|
|
8
|
-
return path.dirname(
|
|
9
|
-
require.resolve(`${packageName}/package.json`, { paths: resolveFrom })
|
|
10
|
-
);
|
|
11
|
-
} catch {
|
|
12
|
-
}
|
|
13
|
-
try {
|
|
14
|
-
let dir = path.dirname(require.resolve(packageName, { paths: resolveFrom }));
|
|
15
|
-
for (; ; ) {
|
|
16
|
-
const manifestPath = path.join(dir, "package.json");
|
|
17
|
-
if (fs.existsSync(manifestPath)) {
|
|
18
|
-
const manifest = JSON.parse(
|
|
19
|
-
fs.readFileSync(manifestPath, "utf-8")
|
|
20
|
-
);
|
|
21
|
-
if (manifest && typeof manifest === "object" && "name" in manifest && manifest.name === packageName) {
|
|
22
|
-
return dir;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
const parent = path.dirname(dir);
|
|
26
|
-
if (parent === dir) {
|
|
27
|
-
return void 0;
|
|
28
|
-
}
|
|
29
|
-
dir = parent;
|
|
30
|
-
}
|
|
31
|
-
} catch {
|
|
32
|
-
return void 0;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
function packagePath(packageName, relativePath = "", resolveFrom = RESOLVE_FROM) {
|
|
36
|
-
const packageDir = resolvePackageDir(packageName, resolveFrom);
|
|
37
|
-
return packageDir && path.join(packageDir, relativePath);
|
|
38
|
-
}
|
|
39
|
-
function resolveSubpath(specifier, resolveFrom = RESOLVE_FROM) {
|
|
40
|
-
try {
|
|
41
|
-
return require.resolve(specifier, { paths: resolveFrom });
|
|
42
|
-
} catch {
|
|
43
|
-
return void 0;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
const cedarWebDir = resolvePackageDir("@cedarjs/web");
|
|
47
|
-
const cedarWebResolveFrom = cedarWebDir ? [cedarWebDir, ...RESOLVE_FROM] : RESOLVE_FROM;
|
|
48
|
-
function definedEntries(mappings) {
|
|
49
|
-
return Object.fromEntries(
|
|
50
|
-
Object.entries(mappings).filter(
|
|
51
|
-
(entry) => entry[1] !== void 0
|
|
52
|
-
)
|
|
53
|
-
);
|
|
54
|
-
}
|
|
4
|
+
const NODE_MODULES_PATH = path.join(cedarPaths.base, "node_modules");
|
|
55
5
|
const config = {
|
|
56
6
|
// To make sure other config option which depends on rootDir always
|
|
57
7
|
// use correct path, for example, coverageDirectory
|
|
58
8
|
rootDir: cedarPaths.base,
|
|
59
9
|
roots: [path.join(cedarPaths.web.src)],
|
|
60
|
-
// Opting out of jsdom's browser-style export condition resolution (needed to
|
|
61
|
-
// resolve `msw/node`) is handled by the environment itself, via
|
|
62
|
-
// jest-fixed-jsdom
|
|
63
10
|
testEnvironment: path.join(__dirname, "./RedwoodWebJestEnv.js"),
|
|
64
11
|
displayName: {
|
|
65
12
|
color: "blueBright",
|
|
@@ -89,78 +36,41 @@ const config = {
|
|
|
89
36
|
],
|
|
90
37
|
setupFilesAfterEnv: [path.resolve(__dirname, "./jest.setup.js")],
|
|
91
38
|
moduleNameMapper: {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
"
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
// @NOTE: Import @cedarjs/testing in web tests, and it automatically remaps to the web side only
|
|
118
|
-
// This is to prevent web stuff leaking into api, and vice versa
|
|
119
|
-
"^@cedarjs/testing$": resolveSubpath("@cedarjs/testing/web"),
|
|
120
|
-
/**
|
|
121
|
-
* Mock out files that aren't particularly useful in tests. See fileMock.js for more info.
|
|
122
|
-
*/
|
|
123
|
-
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga|css)$": resolveSubpath("@cedarjs/testing/dist/cjs/web/fileMock.js")
|
|
124
|
-
}),
|
|
39
|
+
/**
|
|
40
|
+
* Make sure modules that require different versions of these
|
|
41
|
+
* dependencies end up using the same one.
|
|
42
|
+
*/
|
|
43
|
+
"^react$": path.join(NODE_MODULES_PATH, "react"),
|
|
44
|
+
"^react-dom$": path.join(NODE_MODULES_PATH, "react-dom"),
|
|
45
|
+
"^@apollo/client/react$": path.join(
|
|
46
|
+
NODE_MODULES_PATH,
|
|
47
|
+
"@apollo/client/react"
|
|
48
|
+
),
|
|
49
|
+
// We replace imports to "@cedarjs/router" with our own "mock" implementation.
|
|
50
|
+
"^@cedarjs/router$": path.join(
|
|
51
|
+
NODE_MODULES_PATH,
|
|
52
|
+
"@cedarjs/testing/dist/cjs/web/MockRouter.js"
|
|
53
|
+
),
|
|
54
|
+
"^@cedarjs/web$": path.join(NODE_MODULES_PATH, "@cedarjs/web/dist/cjs"),
|
|
55
|
+
// This allows us to mock `createAuthentication` which is used by auth
|
|
56
|
+
// clients, which in turn lets us mock `useAuth` in tests
|
|
57
|
+
"^@cedarjs/auth$": path.join(
|
|
58
|
+
NODE_MODULES_PATH,
|
|
59
|
+
"@cedarjs/testing/dist/cjs/web/mockAuth.js"
|
|
60
|
+
),
|
|
61
|
+
// @NOTE: Import @cedarjs/testing in web tests, and it automatically remaps to the web side only
|
|
62
|
+
// This is to prevent web stuff leaking into api, and vice versa
|
|
63
|
+
"^@cedarjs/testing$": path.join(NODE_MODULES_PATH, "@cedarjs/testing/web"),
|
|
125
64
|
"~__CEDAR__USER_ROUTES_FOR_MOCK": cedarPaths.web.routes,
|
|
126
65
|
"~__CEDAR__USER_AUTH_FOR_MOCK": path.join(cedarPaths.web.src, "auth"),
|
|
66
|
+
/**
|
|
67
|
+
* Mock out files that aren't particularly useful in tests. See fileMock.js for more info.
|
|
68
|
+
*/
|
|
69
|
+
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga|css)$": "@cedarjs/testing/dist/cjs/web/fileMock.js",
|
|
127
70
|
// Support for importing files with extensions (like you'd do in ESM projects)
|
|
128
71
|
"^(\\.{1,2}/.*)\\.js$": "$1"
|
|
129
72
|
},
|
|
130
73
|
transform: {
|
|
131
|
-
// MSW's CommonJS build `require`s ESM-only packages (`rettime`,
|
|
132
|
-
// `@open-draft/deferred-promise` and `until-async`, which ships ESM in
|
|
133
|
-
// plain `.js` files). Node supports require(esm), but Jest's runtime
|
|
134
|
-
// doesn't, so compile any `.mjs` file that gets pulled in from
|
|
135
|
-
// node_modules (plus until-async) to CommonJS. This needs its own
|
|
136
|
-
// transform entry (with the config inlined) because the web babel config
|
|
137
|
-
// ignores node_modules
|
|
138
|
-
//
|
|
139
|
-
// The `@cedarjs/auth-*-web` packages are ESM-only too, and (like
|
|
140
|
-
// until-async) ship plain `.js` files rather than `.mjs` since their
|
|
141
|
-
// package.json already declares `"type": "module"`. A generated
|
|
142
|
-
// project's `web/src/auth.ts` imports one of these, so they need the
|
|
143
|
-
// same carve-out. `@cedarjs/forms` is ESM-only for the same reason, and
|
|
144
|
-
// gets pulled into virtually every generated project's web-side tests
|
|
145
|
-
// via `web/src/pages/**` scaffolds and dbAuth login/signup forms.
|
|
146
|
-
// `@cedarjs/web`, `@cedarjs/auth`, and `@cedarjs/router` are ESM-only
|
|
147
|
-
// too. `web` and `router` are imported directly by virtually every
|
|
148
|
-
// generated project's web-side test (`Routes.tsx`, page/component
|
|
149
|
-
// scaffolds), and `auth` gets pulled in transitively through `web`.
|
|
150
|
-
// Jest's own module loader re-applies this carve-out to every file it
|
|
151
|
-
// loads, including ones reached transitively through an
|
|
152
|
-
// already-transformed require() call, so all of them need to be listed
|
|
153
|
-
// even though only `web`/`router` are usually imported directly.
|
|
154
|
-
"[/\\\\]node_modules[/\\\\](?:.+\\.mjs|(?:until-async|@cedarjs[/\\\\](?:auth-[a-z-]+-web|forms|web|auth|router))[/\\\\].+\\.js)$": [
|
|
155
|
-
"babel-jest",
|
|
156
|
-
{
|
|
157
|
-
babelrc: false,
|
|
158
|
-
configFile: false,
|
|
159
|
-
presets: [
|
|
160
|
-
[require.resolve("@babel/preset-env"), { targets: { node: "20" } }]
|
|
161
|
-
]
|
|
162
|
-
}
|
|
163
|
-
],
|
|
164
74
|
"\\.[jt]sx?$": [
|
|
165
75
|
"babel-jest",
|
|
166
76
|
// When jest runs tests in parallel, it serializes the config before passing down options to babel
|
|
@@ -170,21 +80,6 @@ const config = {
|
|
|
170
80
|
}
|
|
171
81
|
]
|
|
172
82
|
},
|
|
173
|
-
// Jest's default is to not transform anything in node_modules, but `.mjs`
|
|
174
|
-
// files (and until-async, @cedarjs/auth-*-web, @cedarjs/forms,
|
|
175
|
-
// @cedarjs/web, @cedarjs/auth, and @cedarjs/router) have to be compiled to
|
|
176
|
-
// CommonJS (see the transform above).
|
|
177
|
-
// The `.pnpm` lookahead is what makes this work with pnpm: its virtual store
|
|
178
|
-
// puts packages at `node_modules/.pnpm/<pkg>@<version>/node_modules/<pkg>`,
|
|
179
|
-
// so without it the pattern matches (and thereby ignores) at the *first*
|
|
180
|
-
// `node_modules` segment, where the following path starts with `.pnpm/`
|
|
181
|
-
// instead of `until-async/` and the exception never gets a chance to apply.
|
|
182
|
-
// Skipping that segment forces the match onto the inner `node_modules`,
|
|
183
|
-
// which looks the same as a hoisted npm/yarn layout
|
|
184
|
-
transformIgnorePatterns: [
|
|
185
|
-
"[/\\\\]node_modules[/\\\\](?!\\.pnpm[/\\\\])(?!.*\\.mjs$)(?!until-async[/\\\\])(?!@cedarjs[/\\\\]auth-[a-z-]+-web[/\\\\])(?!@cedarjs[/\\\\]forms[/\\\\])(?!@cedarjs[/\\\\]web[/\\\\])(?!@cedarjs[/\\\\]auth[/\\\\])(?!@cedarjs[/\\\\]router[/\\\\])",
|
|
186
|
-
"\\.pnp\\.[^\\\\/]+$"
|
|
187
|
-
],
|
|
188
83
|
resolver: path.resolve(__dirname, "./resolver.js"),
|
|
189
84
|
testPathIgnorePatterns: [".(stories|mock).[jt]sx?$"]
|
|
190
85
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jest.setup.d.ts","sourceRoot":"","sources":["../../../../src/config/jest/web/jest.setup.ts"],"names":[],"mappings":"AAEA,OAAO,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"jest.setup.d.ts","sourceRoot":"","sources":["../../../../src/config/jest/web/jest.setup.ts"],"names":[],"mappings":"AAEA,OAAO,2BAA2B,CAAA;AAClC,OAAO,cAAc,CAAA;AAGrB,OAAO,EAML,eAAe,IAAI,gBAAgB,EACpC,MAAM,8BAA8B,CAAA;AAErC,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,mBAAmB,EAAE,MAAM,CAAA;IAE/B,IAAI,eAAe,EAAE,OAAO,gBAAgB,CAAA;CAC7C"}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
2
2
|
var __commonJS = (cb, mod) => function __require() {
|
|
3
|
-
|
|
4
|
-
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
5
|
-
} catch (e) {
|
|
6
|
-
throw mod = 0, e;
|
|
7
|
-
}
|
|
3
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
8
4
|
};
|
|
9
5
|
var require_resolver = __commonJS({
|
|
10
6
|
"src/config/jest/web/resolver.ts"(exports, module) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { LocationProvider } from "@cedarjs/router";
|
|
3
3
|
import { RedwoodProvider } from "@cedarjs/web";
|
|
4
|
-
import {
|
|
4
|
+
import { RedwoodApolloProvider } from "@cedarjs/web/apollo";
|
|
5
5
|
import { UserRoutes as VitestUserRoutes } from "./globRoutesImporter.js";
|
|
6
6
|
import { useAuth } from "./mockAuth.js";
|
|
7
7
|
import { MockParamsProvider } from "./MockParamsProvider.js";
|
|
@@ -16,16 +16,10 @@ try {
|
|
|
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(
|
|
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))));
|
|
20
20
|
};
|
|
21
21
|
function isModuleNotFoundError(error, module) {
|
|
22
|
-
|
|
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}"`));
|
|
22
|
+
return !!error && typeof error === "object" && "code" in error && error.code === "MODULE_NOT_FOUND" && "moduleName" in error && error.moduleName === module;
|
|
29
23
|
}
|
|
30
24
|
export {
|
|
31
25
|
MockProviders
|
|
@@ -1,67 +1,25 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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>;
|
|
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>;
|
|
16
10
|
export declare const setupRequestHandlers: () => void;
|
|
17
11
|
export declare const closeServer: () => void;
|
|
18
12
|
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
|
-
}
|
|
60
13
|
export type DataFunction<Query extends Record<string, unknown> = Record<string, unknown>, QueryVariables = Record<string, any>> = (variables: QueryVariables, { req, ctx, }: {
|
|
61
|
-
req:
|
|
62
|
-
ctx:
|
|
63
|
-
}) => Query | void
|
|
64
|
-
type
|
|
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;
|
|
65
23
|
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>>;
|
|
66
24
|
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>>;
|
|
67
25
|
export declare const mockedUserMeta: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mockRequests.d.ts","sourceRoot":"","sources":["../../src/web/mockRequests.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
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"}
|