@multiplatform.one/test-utils 9.2.0 → 9.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/frames.native.js.map +1 -1
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/mocks.native.js.map +1 -1
- package/dist/cjs/nativeTamagui.cjs +174 -0
- package/dist/cjs/nativeTamagui.native.js +222 -0
- package/dist/cjs/nativeTamagui.native.js.map +1 -0
- package/dist/cjs/network.native.js.map +1 -1
- package/dist/cjs/setup.native.js.map +1 -1
- package/dist/cjs/timeouts.native.js.map +1 -1
- package/dist/esm/nativeTamagui.mjs +137 -0
- package/dist/esm/nativeTamagui.mjs.map +1 -0
- package/dist/esm/nativeTamagui.native.js +182 -0
- package/dist/esm/nativeTamagui.native.js.map +1 -0
- package/package.json +8 -1
- package/src/nativeTamagui.ts +165 -0
- package/types/nativeTamagui.d.ts +21 -0
- package/types/nativeTamagui.d.ts.map +1 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@multiplatform.one/test-utils",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.4.0",
|
|
4
4
|
"description": "Shared testing utilities for multiplatform.one packages",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"multiplatform.one",
|
|
@@ -68,6 +68,13 @@
|
|
|
68
68
|
"import": "./dist/esm/mocks.mjs",
|
|
69
69
|
"require": "./dist/cjs/mocks.cjs",
|
|
70
70
|
"default": "./dist/esm/mocks.mjs"
|
|
71
|
+
},
|
|
72
|
+
"./native-tamagui": {
|
|
73
|
+
"source": "./src/nativeTamagui.ts",
|
|
74
|
+
"types": "./types/nativeTamagui.d.ts",
|
|
75
|
+
"import": "./dist/esm/nativeTamagui.mjs",
|
|
76
|
+
"require": "./dist/cjs/nativeTamagui.cjs",
|
|
77
|
+
"default": "./dist/esm/nativeTamagui.mjs"
|
|
71
78
|
}
|
|
72
79
|
},
|
|
73
80
|
"publishConfig": {
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loads tamagui's NATIVE build (the `dist/cjs/*.native.js` files Metro ships)
|
|
3
|
+
* into a vitest worker, with `react-native` replaced by recording host
|
|
4
|
+
* components. The web build that vitest normally resolves compiles the
|
|
5
|
+
* native-only prop filtering out, so a native prop-forwarding bug cannot be
|
|
6
|
+
* reproduced against it (MPO-368).
|
|
7
|
+
*
|
|
8
|
+
* Only requires issued while loading, or BY a `.native.js` file, are
|
|
9
|
+
* redirected, so the rest of the worker keeps its normal module graph.
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
12
|
+
import Module, { createRequire } from "node:module";
|
|
13
|
+
import { createElement, forwardRef, Fragment, useImperativeHandle, type ReactNode } from "react";
|
|
14
|
+
|
|
15
|
+
type HostProps = Record<string, unknown> & { children?: ReactNode };
|
|
16
|
+
|
|
17
|
+
export interface HostInstance {
|
|
18
|
+
host: string;
|
|
19
|
+
getNativeScrollRef(): HostInstance;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface NativeTamaguiRuntime {
|
|
23
|
+
core: typeof import("tamagui");
|
|
24
|
+
RawScrollView: typeof import("tamagui").ScrollView;
|
|
25
|
+
reactNative: Record<string, unknown>;
|
|
26
|
+
skipProps: Record<string, unknown>;
|
|
27
|
+
lastHostProps(name: string): HostProps | undefined;
|
|
28
|
+
allHostProps(name: string): HostProps[];
|
|
29
|
+
hostInstance(name: string): HostInstance;
|
|
30
|
+
resetHosts(): void;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const reactNativeId = "\0mpo-native-tamagui:react-native";
|
|
34
|
+
const nativeCjs = /[\\/]dist[\\/]cjs[\\/].*\.native\.js$/;
|
|
35
|
+
const tamaguiPackage = /[\\/]node_modules[\\/](?:@tamagui[\\/][^\\/]+|tamagui)[\\/]/;
|
|
36
|
+
|
|
37
|
+
type ModuleInternals = typeof Module & {
|
|
38
|
+
_resolveFilename(
|
|
39
|
+
request: string,
|
|
40
|
+
parent: { filename?: string } | undefined,
|
|
41
|
+
...rest: unknown[]
|
|
42
|
+
): string;
|
|
43
|
+
_extensions: Record<string, (module: NodeModule, filename: string) => void>;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export function loadNativeTamagui(): NativeTamaguiRuntime {
|
|
47
|
+
const seen = new Map<string, HostProps[]>();
|
|
48
|
+
const instances = new Map<string, HostInstance>();
|
|
49
|
+
|
|
50
|
+
const hostInstance = (name: string): HostInstance => {
|
|
51
|
+
let instance = instances.get(name);
|
|
52
|
+
if (!instance) {
|
|
53
|
+
instance = { host: name, getNativeScrollRef: () => instance! };
|
|
54
|
+
instances.set(name, instance);
|
|
55
|
+
}
|
|
56
|
+
return instance;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const host = (name: string) => {
|
|
60
|
+
const Host = forwardRef<HostInstance, HostProps>(function Host(props, ref) {
|
|
61
|
+
useImperativeHandle(ref, () => hostInstance(name), []);
|
|
62
|
+
const calls = seen.get(name) ?? [];
|
|
63
|
+
calls.push(props);
|
|
64
|
+
seen.set(name, calls);
|
|
65
|
+
return createElement(Fragment, null, props.children as ReactNode);
|
|
66
|
+
});
|
|
67
|
+
Host.displayName = name;
|
|
68
|
+
return Host;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const window = { width: 390, height: 844, scale: 3, fontScale: 1 };
|
|
72
|
+
const subscription = { remove() {} };
|
|
73
|
+
const reactNative: Record<string, unknown> = new Proxy(
|
|
74
|
+
{
|
|
75
|
+
__esModule: true,
|
|
76
|
+
Platform: {
|
|
77
|
+
OS: "ios",
|
|
78
|
+
select: (spec: Record<string, unknown>) => spec.ios ?? spec.native ?? spec.default,
|
|
79
|
+
},
|
|
80
|
+
StyleSheet: {
|
|
81
|
+
create: <T>(styles: T) => styles,
|
|
82
|
+
flatten: <T>(style: T) => style,
|
|
83
|
+
hairlineWidth: 1,
|
|
84
|
+
absoluteFillObject: {},
|
|
85
|
+
},
|
|
86
|
+
Dimensions: { get: () => window, addEventListener: () => subscription },
|
|
87
|
+
Appearance: { getColorScheme: () => "light", addChangeListener: () => subscription },
|
|
88
|
+
useColorScheme: () => "light",
|
|
89
|
+
useWindowDimensions: () => window,
|
|
90
|
+
PixelRatio: { get: () => 3 },
|
|
91
|
+
I18nManager: { isRTL: false },
|
|
92
|
+
Keyboard: { addListener: () => subscription, dismiss() {}, isVisible: () => false },
|
|
93
|
+
AccessibilityInfo: {
|
|
94
|
+
addEventListener: () => subscription,
|
|
95
|
+
isReduceMotionEnabled: async () => false,
|
|
96
|
+
},
|
|
97
|
+
} as Record<string | symbol, unknown>,
|
|
98
|
+
{
|
|
99
|
+
get(target, key) {
|
|
100
|
+
if (key in target) return target[key];
|
|
101
|
+
if (typeof key !== "string" || !/^[A-Z]/.test(key)) return;
|
|
102
|
+
return (target[key] = host(key));
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
let loading = true;
|
|
108
|
+
const internals = Module as ModuleInternals;
|
|
109
|
+
const resolve = internals._resolveFilename;
|
|
110
|
+
internals._resolveFilename = function (request, parent, ...rest) {
|
|
111
|
+
const fromNative = Boolean(parent?.filename && nativeCjs.test(parent.filename));
|
|
112
|
+
if (fromNative && (request === "react-native" || request.startsWith("react-native/"))) {
|
|
113
|
+
return reactNativeId;
|
|
114
|
+
}
|
|
115
|
+
const resolved = resolve.call(this, request, parent, ...rest);
|
|
116
|
+
if ((loading || fromNative) && tamaguiPackage.test(resolved) && resolved.endsWith(".cjs")) {
|
|
117
|
+
const native = resolved.replace(/\.cjs$/, ".native.js");
|
|
118
|
+
if (existsSync(native)) return native;
|
|
119
|
+
}
|
|
120
|
+
return resolved;
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
// `dist/cjs/*.native.js` is CommonJS inside `"type": "module"` packages;
|
|
124
|
+
// Node would otherwise load it as ESM and fail on `module.exports`.
|
|
125
|
+
const loadJs = internals._extensions[".js"]!;
|
|
126
|
+
internals._extensions[".js"] = function (module, filename) {
|
|
127
|
+
if (nativeCjs.test(filename)) {
|
|
128
|
+
(
|
|
129
|
+
module as NodeModule & { _compile(code: string, file: string, format?: string): void }
|
|
130
|
+
)._compile(readFileSync(filename, "utf8"), filename, "commonjs");
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
loadJs.call(this, module, filename);
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
const require = createRequire(import.meta.url);
|
|
137
|
+
require.cache[reactNativeId] = {
|
|
138
|
+
id: reactNativeId,
|
|
139
|
+
filename: reactNativeId,
|
|
140
|
+
loaded: true,
|
|
141
|
+
exports: reactNative,
|
|
142
|
+
} as NodeModule;
|
|
143
|
+
|
|
144
|
+
const tamaguiRequire = createRequire(require.resolve("tamagui"));
|
|
145
|
+
const core = tamaguiRequire("@tamagui/core") as NativeTamaguiRuntime["core"];
|
|
146
|
+
const { ScrollView: RawScrollView } = tamaguiRequire("@tamagui/scroll-view") as {
|
|
147
|
+
ScrollView: NativeTamaguiRuntime["RawScrollView"];
|
|
148
|
+
};
|
|
149
|
+
const webRequire = createRequire(tamaguiRequire.resolve("@tamagui/core"));
|
|
150
|
+
const { skipProps } = webRequire(
|
|
151
|
+
webRequire.resolve("@tamagui/web").replace(/index\.native\.js$/, "helpers/skipProps.native.js"),
|
|
152
|
+
) as { skipProps: Record<string, unknown> };
|
|
153
|
+
loading = false;
|
|
154
|
+
|
|
155
|
+
return {
|
|
156
|
+
core,
|
|
157
|
+
RawScrollView,
|
|
158
|
+
reactNative,
|
|
159
|
+
skipProps,
|
|
160
|
+
lastHostProps: (name) => seen.get(name)?.at(-1),
|
|
161
|
+
allHostProps: (name) => seen.get(name) ?? [],
|
|
162
|
+
hostInstance,
|
|
163
|
+
resetHosts: () => seen.clear(),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
type HostProps = Record<string, unknown> & {
|
|
3
|
+
children?: ReactNode;
|
|
4
|
+
};
|
|
5
|
+
export interface HostInstance {
|
|
6
|
+
host: string;
|
|
7
|
+
getNativeScrollRef(): HostInstance;
|
|
8
|
+
}
|
|
9
|
+
export interface NativeTamaguiRuntime {
|
|
10
|
+
core: typeof import("tamagui");
|
|
11
|
+
RawScrollView: typeof import("tamagui").ScrollView;
|
|
12
|
+
reactNative: Record<string, unknown>;
|
|
13
|
+
skipProps: Record<string, unknown>;
|
|
14
|
+
lastHostProps(name: string): HostProps | undefined;
|
|
15
|
+
allHostProps(name: string): HostProps[];
|
|
16
|
+
hostInstance(name: string): HostInstance;
|
|
17
|
+
resetHosts(): void;
|
|
18
|
+
}
|
|
19
|
+
export declare function loadNativeTamagui(): NativeTamaguiRuntime;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=nativeTamagui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nativeTamagui.d.ts","sourceRoot":"","sources":["../src/nativeTamagui.ts"],"names":[],"mappings":"AAYA,OAAO,EAA4D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjG,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,IAAI,YAAY,CAAC;CACpC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,cAAc,SAAS,CAAC,CAAC;IAC/B,aAAa,EAAE,cAAc,SAAS,EAAE,UAAU,CAAC;IACnD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACnD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC;IACxC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC;IACzC,UAAU,IAAI,IAAI,CAAC;CACpB;AAeD,wBAAgB,iBAAiB,IAAI,oBAAoB,CAuHxD"}
|