@lynx-js/react 0.118.0 → 0.119.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.
Files changed (54) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/package.json +25 -3
  3. package/refresh/.turbo/turbo-build.log +1 -1
  4. package/runtime/lib/alog/elementPAPICall.js +1 -0
  5. package/runtime/lib/alog/elementPAPICall.js.map +1 -1
  6. package/runtime/lib/debug/component-stack.d.ts +0 -6
  7. package/runtime/lib/debug/component-stack.js.map +1 -1
  8. package/runtime/lib/gesture/processGesture.js +103 -11
  9. package/runtime/lib/gesture/processGesture.js.map +1 -1
  10. package/runtime/lib/hooks/mainThread.d.ts +17 -0
  11. package/runtime/lib/hooks/mainThread.js +152 -0
  12. package/runtime/lib/hooks/mainThread.js.map +1 -0
  13. package/runtime/lib/hooks/react.d.ts +1 -2
  14. package/runtime/lib/hooks/react.js +8 -14
  15. package/runtime/lib/hooks/react.js.map +1 -1
  16. package/runtime/lib/lifecycle/event/jsReady.js +3 -1
  17. package/runtime/lib/lifecycle/event/jsReady.js.map +1 -1
  18. package/runtime/lib/lifecycle/render.js +0 -6
  19. package/runtime/lib/lifecycle/render.js.map +1 -1
  20. package/runtime/lib/renderToOpcodes/constants.d.ts +1 -0
  21. package/runtime/lib/renderToOpcodes/constants.js +1 -0
  22. package/runtime/lib/renderToOpcodes/constants.js.map +1 -1
  23. package/runtime/lib/renderToOpcodes/index.js +3 -1
  24. package/runtime/lib/renderToOpcodes/index.js.map +1 -1
  25. package/runtime/lib/tsconfig.tsbuildinfo +1 -1
  26. package/testing-library/README.md +48 -9
  27. package/testing-library/dist/0~123.js +43 -0
  28. package/testing-library/dist/881.js +1 -0
  29. package/testing-library/dist/entry.d.ts +1 -0
  30. package/testing-library/dist/env/index.d.ts +2 -0
  31. package/testing-library/dist/env/index.js +661 -0
  32. package/testing-library/dist/env/rstest.d.ts +1 -0
  33. package/testing-library/dist/env/rstest.js +6 -0
  34. package/testing-library/dist/env/vitest.d.ts +3 -0
  35. package/testing-library/dist/env/vitest.js +8 -662
  36. package/testing-library/dist/fire-event.d.ts +111 -0
  37. package/testing-library/dist/index.d.ts +18 -6
  38. package/testing-library/dist/plugins/index.d.ts +2 -0
  39. package/testing-library/dist/plugins/index.js +282 -0
  40. package/testing-library/dist/plugins/vitest.d.ts +26 -0
  41. package/testing-library/dist/pure.js +2 -2
  42. package/testing-library/dist/rstest-config.d.ts +25 -0
  43. package/testing-library/dist/rstest-config.js +61 -0
  44. package/testing-library/dist/setupFiles/common/bootstrap.js +2 -0
  45. package/testing-library/dist/{vitest-global-setup.js → setupFiles/common/runtime-setup.js} +25 -39
  46. package/testing-library/dist/setupFiles/inner/rstest.js +7 -0
  47. package/testing-library/dist/setupFiles/inner/vitest.js +11 -0
  48. package/testing-library/dist/setupFiles/rstest.js +21 -0
  49. package/testing-library/dist/setupFiles/vitest.js +20 -0
  50. package/testing-library/dist/vitest.config.d.ts +6 -0
  51. package/testing-library/dist/vitest.config.js +4 -257
  52. package/transform/dist/wasm.cjs +1 -1
  53. package/transform/index.d.ts +10 -0
  54. package/testing-library/types/vitest-config.d.ts +0 -20
@@ -1,35 +1,18 @@
1
1
  import { options } from "preact";
2
- import { expect } from "vitest";
3
- import { clearCommitTaskId, replaceCommitHook } from "../../runtime/lib/lifecycle/patch/commit.js";
4
- import { deinitGlobalSnapshotPatch } from "../../runtime/lib/lifecycle/patch/snapshotPatch.js";
5
- import { injectUpdateMainThread } from "../../runtime/lib/lifecycle/patch/updateMainThread.js";
6
- import { injectUpdateMTRefInitValue } from "../../runtime/lib/worklet/ref/updateInitValue.js";
7
- import { injectCalledByNative } from "../../runtime/lib/lynx/calledByNative.js";
8
- import { flushDelayedLifecycleEvents, injectTt } from "../../runtime/lib/lynx/tt.js";
9
- import { initElementPAPICallAlog } from "../../runtime/lib/alog/elementPAPICall.js";
10
- import { addCtxNotFoundEventListener } from "../../runtime/lib/lifecycle/patch/error.js";
11
- import { setRoot } from "../../runtime/lib/root.js";
12
- import { BackgroundSnapshotInstance, SnapshotInstance, backgroundSnapshotInstanceManager, snapshotInstanceManager } from "../../runtime/lib/snapshot/index.js";
13
- import { destroyWorklet } from "../../runtime/lib/worklet/destroy.js";
14
- import { initApiEnv } from "../../runtime/lib/worklet-runtime/api/lynxApi.js";
15
- import { initEventListeners } from "../../runtime/lib/worklet-runtime/listeners.js";
16
- import { initWorklet } from "../../runtime/lib/worklet-runtime/workletRuntime.js";
17
- expect.addSnapshotSerializer({
18
- test (val) {
19
- return Boolean(val && 'object' == typeof val && Array.isArray(val.refAttr) && Object.prototype.hasOwnProperty.call(val, 'task') && 'function' == typeof val.exec);
20
- },
21
- print (val, serialize) {
22
- const printed = serialize({
23
- refAttr: Array.isArray(val.refAttr) ? [
24
- ...val.refAttr
25
- ] : val.refAttr,
26
- task: val.task
27
- });
28
- if (printed.startsWith('Object')) return printed.replace(/^Object/, 'RefProxy');
29
- if (printed.startsWith('{')) return `RefProxy ${printed}`;
30
- return printed;
31
- }
32
- });
2
+ import { clearCommitTaskId, replaceCommitHook } from "../../../../runtime/lib/lifecycle/patch/commit.js";
3
+ import { deinitGlobalSnapshotPatch } from "../../../../runtime/lib/lifecycle/patch/snapshotPatch.js";
4
+ import { injectUpdateMainThread } from "../../../../runtime/lib/lifecycle/patch/updateMainThread.js";
5
+ import { injectUpdateMTRefInitValue } from "../../../../runtime/lib/worklet/ref/updateInitValue.js";
6
+ import { injectCalledByNative } from "../../../../runtime/lib/lynx/calledByNative.js";
7
+ import { flushDelayedLifecycleEvents, injectTt } from "../../../../runtime/lib/lynx/tt.js";
8
+ import { initElementPAPICallAlog } from "../../../../runtime/lib/alog/elementPAPICall.js";
9
+ import { addCtxNotFoundEventListener } from "../../../../runtime/lib/lifecycle/patch/error.js";
10
+ import { setRoot } from "../../../../runtime/lib/root.js";
11
+ import { BackgroundSnapshotInstance, SnapshotInstance, backgroundSnapshotInstanceManager, snapshotInstanceManager } from "../../../../runtime/lib/snapshot/index.js";
12
+ import { destroyWorklet } from "../../../../runtime/lib/worklet/destroy.js";
13
+ import { initApiEnv } from "../../../../runtime/lib/worklet-runtime/api/lynxApi.js";
14
+ import { initEventListeners } from "../../../../runtime/lib/worklet-runtime/listeners.js";
15
+ import { initWorklet } from "../../../../runtime/lib/worklet-runtime/workletRuntime.js";
33
16
  const { onInjectMainThreadGlobals, onInjectBackgroundThreadGlobals, onResetLynxTestingEnv, onSwitchedToMainThread, onSwitchedToBackgroundThread, onInitWorkletRuntime } = globalThis;
34
17
  injectCalledByNative();
35
18
  injectUpdateMainThread();
@@ -72,7 +55,10 @@ globalThis.onInjectMainThreadGlobals = (target)=>{
72
55
  }
73
56
  target._document = setupDocument({});
74
57
  target.globalPipelineOptions = void 0;
75
- if ("u" > typeof __ALOG_ELEMENT_API__ && __ALOG_ELEMENT_API__) initElementPAPICallAlog(target);
58
+ if (void 0 !== target.__ALOG_ELEMENT_API__ && target.__ALOG_ELEMENT_API__ && !target.__initElementPAPICallAlogInjected) {
59
+ initElementPAPICallAlog(target);
60
+ target.__initElementPAPICallAlogInjected = true;
61
+ }
76
62
  };
77
63
  globalThis.onInjectBackgroundThreadGlobals = (target)=>{
78
64
  if (onInjectBackgroundThreadGlobals) onInjectBackgroundThreadGlobals(target);
@@ -100,13 +86,13 @@ globalThis.onInjectBackgroundThreadGlobals = (target)=>{
100
86
  }
101
87
  target._document = setupBackgroundDocument({});
102
88
  target.globalPipelineOptions = void 0;
103
- target.lynx.requireModuleAsync = async (url, callback)=>{
104
- try {
105
- callback(null, await __vite_ssr_dynamic_import__(url));
106
- } catch (err) {
107
- callback(err, null);
108
- }
109
- };
89
+ const oldLynxCoreInject = globalThis.lynxCoreInject;
90
+ globalThis.lynxCoreInject = target.lynxCoreInject;
91
+ try {
92
+ injectTt();
93
+ } finally{
94
+ globalThis.lynxCoreInject = oldLynxCoreInject;
95
+ }
110
96
  deinitGlobalSnapshotPatch();
111
97
  clearCommitTaskId();
112
98
  };
@@ -0,0 +1,7 @@
1
+ const { onInjectBackgroundThreadGlobals } = globalThis;
2
+ globalThis.onInjectBackgroundThreadGlobals = (target)=>{
3
+ if (onInjectBackgroundThreadGlobals) onInjectBackgroundThreadGlobals(target);
4
+ target.lynx.requireModuleAsync = async (url, _callback)=>{
5
+ throw new Error('lynx.requireModuleAsync not implemented for rstest');
6
+ };
7
+ };
@@ -0,0 +1,11 @@
1
+ const { onInjectBackgroundThreadGlobals } = globalThis;
2
+ globalThis.onInjectBackgroundThreadGlobals = (target)=>{
3
+ if (onInjectBackgroundThreadGlobals) onInjectBackgroundThreadGlobals(target);
4
+ target.lynx.requireModuleAsync = async (url, callback)=>{
5
+ try {
6
+ callback(null, await __vite_ssr_dynamic_import__(url));
7
+ } catch (err) {
8
+ callback(err, null);
9
+ }
10
+ };
11
+ };
@@ -0,0 +1,21 @@
1
+ import "../env/rstest.js";
2
+ import "./common/runtime-setup.js";
3
+ import "./inner/rstest.js";
4
+ import "./common/bootstrap.js";
5
+ import { expect } from "@rstest/core";
6
+ expect.addSnapshotSerializer({
7
+ test (val) {
8
+ return Boolean(val && 'object' == typeof val && Array.isArray(val.refAttr) && Object.prototype.hasOwnProperty.call(val, 'task') && 'function' == typeof val.exec);
9
+ },
10
+ print (val, serialize) {
11
+ const printed = serialize({
12
+ refAttr: Array.isArray(val.refAttr) ? [
13
+ ...val.refAttr
14
+ ] : val.refAttr,
15
+ task: val.task
16
+ });
17
+ if (printed.startsWith('Object')) return printed.replace(/^Object/, 'RefProxy');
18
+ if (printed.startsWith('{')) return `RefProxy ${printed}`;
19
+ return printed;
20
+ }
21
+ });
@@ -0,0 +1,20 @@
1
+ import "./common/runtime-setup.js";
2
+ import "./inner/vitest.js";
3
+ import "./common/bootstrap.js";
4
+ import { expect } from "vitest";
5
+ expect.addSnapshotSerializer({
6
+ test (val) {
7
+ return Boolean(val && 'object' == typeof val && Array.isArray(val.refAttr) && Object.prototype.hasOwnProperty.call(val, 'task') && 'function' == typeof val.exec);
8
+ },
9
+ print (val, serialize) {
10
+ const printed = serialize({
11
+ refAttr: Array.isArray(val.refAttr) ? [
12
+ ...val.refAttr
13
+ ] : val.refAttr,
14
+ task: val.task
15
+ });
16
+ if (printed.startsWith('Object')) return printed.replace(/^Object/, 'RefProxy');
17
+ if (printed.startsWith('{')) return `RefProxy ${printed}`;
18
+ return printed;
19
+ }
20
+ });
@@ -0,0 +1,6 @@
1
+ import { type ViteUserConfig } from 'vitest/config';
2
+ import type { TestingLibraryOptions } from './plugins/index.js';
3
+ /**
4
+ * @deprecated Use `vitestTestingLibraryPlugin` from `@lynx-js/react/testing-library/plugins` instead.
5
+ */
6
+ export declare function createVitestConfig(options?: TestingLibraryOptions): ViteUserConfig;
@@ -1,263 +1,10 @@
1
1
  import { defineConfig } from "vitest/config";
2
- import { VitestPackageInstaller } from "vitest/node";
3
- import path from "path";
4
- import { fileURLToPath } from "url";
5
- import { createRequire } from "module";
6
- const vitest_config_filename = fileURLToPath(import.meta.url);
7
- const vitest_config_dirname = path.dirname(vitest_config_filename);
8
- const vitest_config_require = createRequire(import.meta.url);
9
- async function ensurePackagesInstalled() {
10
- const installer = new VitestPackageInstaller();
11
- const installed = await installer.ensureInstalled('jsdom', process.cwd());
12
- if (!installed) {
13
- console.log('ReactLynx Testing Library requires jsdom to be installed.');
14
- process.exit(1);
15
- }
16
- }
17
- const createVitestConfig = async (options)=>{
18
- await ensurePackagesInstalled();
19
- const runtimeOSSPkgName = '@lynx-js/react';
20
- const runtimePkgName = options?.runtimePkgName ?? runtimeOSSPkgName;
21
- const runtimeDir = path.dirname(vitest_config_require.resolve(`${runtimePkgName}/package.json`));
22
- const runtimeOSSDir = path.dirname(vitest_config_require.resolve(`${runtimeOSSPkgName}/package.json`, {
23
- paths: [
24
- runtimeDir,
25
- vitest_config_dirname
26
- ]
27
- }));
28
- const preactDir = path.dirname(vitest_config_require.resolve('preact/package.json', {
29
- paths: [
30
- runtimeOSSDir
31
- ]
32
- }));
33
- const generateAlias = (pkgName, pkgDir, resolveDir)=>{
34
- const pkgExports = vitest_config_require(path.join(pkgDir, 'package.json')).exports;
35
- const pkgAlias = [];
36
- Object.keys(pkgExports).forEach((key)=>{
37
- const name = path.posix.join(pkgName, key);
38
- pkgAlias.push({
39
- find: new RegExp('^' + name + '$'),
40
- replacement: vitest_config_require.resolve(name, {
41
- paths: [
42
- resolveDir,
43
- vitest_config_dirname
44
- ]
45
- })
46
- });
47
- });
48
- return pkgAlias;
49
- };
50
- const runtimeOSSAlias = generateAlias(runtimeOSSPkgName, runtimeOSSDir, runtimeDir);
51
- let runtimeAlias = [];
52
- if (runtimePkgName !== runtimeOSSPkgName) runtimeAlias = generateAlias(runtimePkgName, runtimeDir, vitest_config_dirname);
53
- const preactAlias = generateAlias('preact', preactDir, runtimeOSSDir);
54
- preactAlias.forEach((alias)=>{
55
- alias.replacement = alias.replacement.replace(/\.js$/, '.mjs');
56
- });
57
- const reactAlias = [
58
- {
59
- find: /^react$/,
60
- replacement: vitest_config_require.resolve(runtimeOSSPkgName, {
61
- paths: [
62
- runtimeDir,
63
- vitest_config_dirname
64
- ]
65
- })
66
- },
67
- {
68
- find: /^react\/jsx-runtime$/,
69
- replacement: vitest_config_require.resolve(path.posix.join(runtimeOSSPkgName, 'jsx-runtime'), {
70
- paths: [
71
- runtimeDir,
72
- vitest_config_dirname
73
- ]
74
- })
75
- },
76
- {
77
- find: /^react\/jsx-dev-runtime$/,
78
- replacement: vitest_config_require.resolve(path.posix.join(runtimeOSSPkgName, 'jsx-dev-runtime'), {
79
- paths: [
80
- runtimeDir,
81
- vitest_config_dirname
82
- ]
83
- })
84
- }
85
- ];
86
- function transformReactCompilerPlugin() {
87
- let rootContext, compilerDeps, babel;
88
- function resolveCompilerDeps(rootContext) {
89
- const missingBabelPackages = [];
90
- const [babelPath, babelPluginReactCompilerPath, babelPluginSyntaxJsxPath, babelPluginSyntaxTypescriptPath] = [
91
- '@babel/core',
92
- 'babel-plugin-react-compiler',
93
- '@babel/plugin-syntax-jsx',
94
- "@babel/plugin-syntax-typescript"
95
- ].map((name)=>{
96
- try {
97
- return vitest_config_require.resolve(name, {
98
- paths: [
99
- rootContext
100
- ]
101
- });
102
- } catch {
103
- missingBabelPackages.push(name);
104
- }
105
- return '';
106
- });
107
- if (missingBabelPackages.length > 0) throw new Error(`With \`experimental_enableReactCompiler\` enabled, you need to install \`${missingBabelPackages.join('`, `')}\` in your project root to use React Compiler.`);
108
- return {
109
- babelPath,
110
- babelPluginReactCompilerPath,
111
- babelPluginSyntaxJsxPath,
112
- babelPluginSyntaxTypescriptPath
113
- };
114
- }
115
- return {
116
- name: 'transformReactCompilerPlugin',
117
- enforce: 'pre',
118
- config (config) {
119
- rootContext = config.root;
120
- const reactCompilerRuntimeAlias = [];
121
- try {
122
- reactCompilerRuntimeAlias.push({
123
- find: /^react-compiler-runtime$/,
124
- replacement: path.join(path.dirname(vitest_config_require.resolve('react-compiler-runtime/package.json', {
125
- paths: [
126
- rootContext
127
- ]
128
- })), 'src', 'index.ts')
129
- });
130
- } catch (e) {}
131
- config.test.alias.push(...reactCompilerRuntimeAlias);
132
- compilerDeps = resolveCompilerDeps(rootContext);
133
- const { babelPath } = compilerDeps;
134
- babel = vitest_config_require(babelPath);
135
- },
136
- async transform (sourceText, sourcePath) {
137
- if (/\.(?:jsx|tsx)$/.test(sourcePath)) {
138
- const { babelPluginReactCompilerPath, babelPluginSyntaxJsxPath, babelPluginSyntaxTypescriptPath } = compilerDeps;
139
- const isTSX = sourcePath.endsWith('.tsx');
140
- try {
141
- const result = babel.transformSync(sourceText, {
142
- plugins: [
143
- [
144
- babelPluginReactCompilerPath,
145
- {
146
- target: '17'
147
- }
148
- ],
149
- babelPluginSyntaxJsxPath,
150
- isTSX ? [
151
- babelPluginSyntaxTypescriptPath,
152
- {
153
- isTSX: true
154
- }
155
- ] : null
156
- ].filter(Boolean),
157
- filename: sourcePath,
158
- ast: false,
159
- sourceMaps: true
160
- });
161
- if (result?.code != null && result?.map != null) return {
162
- code: result.code,
163
- map: result.map
164
- };
165
- this.error(`babel-plugin-react-compiler transform failed for ${sourcePath}: ${result ? 'missing code or map' : 'no result'}`);
166
- } catch (e) {
167
- this.error(e);
168
- }
169
- }
170
- return null;
171
- }
172
- };
173
- }
174
- function transformReactLynxPlugin() {
175
- return {
176
- name: 'transformReactLynxPlugin',
177
- enforce: 'pre',
178
- transform (sourceText, sourcePath) {
179
- const id = sourcePath;
180
- const regex = /\.(?:js|jsx|mjs|cjs|ts|tsx|mts|cts)(\?.*)?$/;
181
- if (!regex.test(id)) return null;
182
- const { transformReactLynxSync } = vitest_config_require('@lynx-js/react/transform');
183
- const relativePath = normalizeSlashes(path.relative(vitest_config_dirname, sourcePath));
184
- const basename = path.basename(sourcePath);
185
- const result = transformReactLynxSync(sourceText, {
186
- mode: 'test',
187
- pluginName: '',
188
- filename: basename,
189
- sourcemap: true,
190
- snapshot: {
191
- preserveJsx: false,
192
- runtimePkg: `${runtimePkgName}/internal`,
193
- jsxImportSource: runtimePkgName,
194
- filename: relativePath,
195
- target: 'MIXED'
196
- },
197
- engineVersion: options?.engineVersion ?? '',
198
- dynamicImport: {
199
- injectLazyBundle: false,
200
- layer: 'test',
201
- runtimePkg: `${runtimePkgName}/internal`
202
- },
203
- directiveDCE: false,
204
- defineDCE: false,
205
- shake: false,
206
- compat: false,
207
- worklet: {
208
- filename: relativePath,
209
- runtimePkg: `${runtimePkgName}/internal`,
210
- target: 'MIXED'
211
- },
212
- refresh: false,
213
- cssScope: false
214
- });
215
- if (result.errors.length > 0) result.errors.forEach((error)=>{
216
- this.error(error.text, error.location);
217
- });
218
- if (result.warnings.length > 0) result.warnings.forEach((warning)=>{
219
- this.warn(warning.text, warning.location);
220
- });
221
- return {
222
- code: result.code,
223
- map: result.map
224
- };
225
- }
226
- };
227
- }
2
+ import { vitestTestingLibraryPlugin } from "./plugins/index.js";
3
+ function createVitestConfig(options) {
228
4
  return defineConfig({
229
- server: {
230
- fs: {
231
- allow: [
232
- path.join(vitest_config_dirname, '..')
233
- ]
234
- }
235
- },
236
5
  plugins: [
237
- ...options?.experimental_enableReactCompiler ? [
238
- transformReactCompilerPlugin()
239
- ] : [],
240
- transformReactLynxPlugin()
241
- ],
242
- test: {
243
- environment: vitest_config_require.resolve('./env/vitest'),
244
- globals: true,
245
- setupFiles: [
246
- path.join(vitest_config_dirname, 'vitest-global-setup')
247
- ],
248
- alias: [
249
- ...runtimeOSSAlias,
250
- ...runtimeAlias,
251
- ...preactAlias,
252
- ...reactAlias
253
- ],
254
- include: options?.include ?? [
255
- 'src/**/*.test.{js,jsx,ts,tsx}'
256
- ]
257
- }
6
+ vitestTestingLibraryPlugin(options)
7
+ ]
258
8
  });
259
- };
260
- function normalizeSlashes(file) {
261
- return file.replaceAll(path.win32.sep, '/');
262
9
  }
263
10
  export { createVitestConfig };