diff --git a/.changeset/swift-spoons-smile.md b/.changeset/swift-spoons-smile.md new file mode 100644 index 0000000000..7f3533fd9e --- /dev/null +++ b/.changeset/swift-spoons-smile.md @@ -0,0 +1,5 @@ +--- +"create-rspeedy": patch +--- + +move Vitest integration to create-rstack extraTools and merge the Vitest templates into a single incremental overlay diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fb5923671d..dd8a1b4507 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -200,7 +200,7 @@ jobs: pnpm run build --mode development pnpm run lint cd `mktemp -d` - npx --registry http://localhost:4873 create-rspeedy-canary@latest --template react-vitest-rltl --dir create-rspeedy-regression-vitest-rltl --tools eslint + npx --registry http://localhost:4873 create-rspeedy-canary@latest --template react --dir create-rspeedy-regression-vitest-rltl --tools eslint,vitest-rltl cd create-rspeedy-regression-vitest-rltl npx --registry http://localhost:4873 upgrade-rspeedy-canary@latest pnpm install --registry=http://localhost:4873 diff --git a/packages/rspeedy/create-rspeedy/src/index.ts b/packages/rspeedy/create-rspeedy/src/index.ts index e96f4d98c5..27f5798d56 100644 --- a/packages/rspeedy/create-rspeedy/src/index.ts +++ b/packages/rspeedy/create-rspeedy/src/index.ts @@ -8,7 +8,7 @@ import path from 'node:path' import { fileURLToPath } from 'node:url' import type { Argv } from 'create-rstack' -import { checkCancel, create, multiselect, select } from 'create-rstack' +import { checkCancel, copyFolder, create, select } from 'create-rstack' type LANG = 'js' | 'ts' @@ -24,26 +24,21 @@ const { devDependencies } = require('../package.json') as { interface Template { template: string lang: LANG - tools?: Record | undefined } const composeTemplateName = ({ template, - tools, lang, }: { template: string - tools?: Record | undefined lang: LANG }) => { - const toolsKeys = (tools ? Object.keys(tools) : []).sort() - const toolsStr = toolsKeys.length > 0 ? `-${toolsKeys.join('-')}` : '' - return `${template}${toolsStr}-${lang}` + return `${template}-${lang}` } const TEMPLATES: Template[] = [ - { template: 'react', tools: {}, lang: 'ts' }, - { template: 'react', tools: {}, lang: 'js' }, + { template: 'react', lang: 'ts' }, + { template: 'react', lang: 'js' }, ] as const async function getTemplateName({ template }: Argv) { @@ -51,6 +46,9 @@ async function getTemplateName({ template }: Argv) { const pair = template.split('-') const lang = pair[pair.length - 1] if (lang && ['js', 'ts'].includes(lang)) { + if (pair[0] === 'react') { + return `react-${lang}` + } return template } // default to ts @@ -67,46 +65,42 @@ async function getTemplateName({ template }: Argv) { }), ) - const tools = checkCancel( - await multiselect({ - message: - 'Select development tools (Use to select, to continue)', - required: false, - options: [ - { - value: 'vitest-rltl', - label: 'Add ReactLynx Testing Library for unit testing', - }, - ], - initialValues: [ - 'vitest-rltl', - ], - }), - ) - return composeTemplateName({ template: 'react', lang: language, - tools: Object.fromEntries( - tools.map((tool) => [tool, tool]), - ), }) } void create({ root: path.resolve(__dirname, '..'), name: 'rspeedy', - templates: TEMPLATES.map(({ template, tools, lang }) => - composeTemplateName({ template, lang, tools }) + templates: TEMPLATES.map(({ template, lang }) => + composeTemplateName({ template, lang }) ), version: devDependencies, getTemplateName, + extraTools: [ + { + value: 'vitest-rltl', + label: 'ReactLynx Testing Library - unit testing', + order: 'pre', + when: (templateName) => + templateName === 'react-js' || templateName === 'react-ts', + action: ({ distFolder, addAgentsMdSearchDirs }) => { + const from = path.resolve(__dirname, '..', 'template-react-vitest-rltl') + copyFolder({ + from, + to: distFolder, + isMergePackageJson: true, + }) + addAgentsMdSearchDirs(from) + }, + }, + ], mapESLintTemplate(templateName) { - const lang = TEMPLATES.find(({ template }) => - templateName.startsWith(template) - )?.lang + const lang = templateName.split('-').at(-1) - if (!lang) return null + if (lang !== 'js' && lang !== 'ts') return null switch (lang) { case 'js': diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/lynx.config.js b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/lynx.config.js deleted file mode 100644 index 17d2cecc5c..0000000000 --- a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/lynx.config.js +++ /dev/null @@ -1,19 +0,0 @@ -import { defineConfig } from '@lynx-js/rspeedy' - -import { pluginQRCode } from '@lynx-js/qrcode-rsbuild-plugin' -import { pluginReactLynx } from '@lynx-js/react-rsbuild-plugin' - -export default defineConfig({ - source: { - entry: './src/index.jsx', - }, - plugins: [ - pluginQRCode({ - schema(url) { - // We use `?fullscreen=true` to open the page in LynxExplorer in full screen mode - return `${url}?fullscreen=true` - }, - }), - pluginReactLynx(), - ], -}) diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/package.json b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/package.json deleted file mode 100644 index 85054b7263..0000000000 --- a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "rspeedy-react-js", - "version": "0.0.0", - "type": "module", - "scripts": { - "build": "rspeedy build", - "dev": "rspeedy dev", - "preview": "rspeedy preview", - "test": "vitest run" - }, - "dependencies": { - "@lynx-js/react": "workspace:*" - }, - "devDependencies": { - "@lynx-js/preact-devtools": "^5.0.1", - "@lynx-js/qrcode-rsbuild-plugin": "workspace:*", - "@lynx-js/react-rsbuild-plugin": "workspace:*", - "@lynx-js/rspeedy": "workspace:*", - "@testing-library/jest-dom": "^6.9.1", - "jsdom": "^27.4.0", - "vitest": "^3.2.4" - }, - "engines": { - "node": ">=18" - } -} diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/src/App.jsx b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/src/App.jsx deleted file mode 100644 index 3e7fb56435..0000000000 --- a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/src/App.jsx +++ /dev/null @@ -1,59 +0,0 @@ -import { useCallback, useEffect, useState } from '@lynx-js/react' - -import './App.css' -import arrow from './assets/arrow.png' -import lynxLogo from './assets/lynx-logo.png' -import reactLynxLogo from './assets/react-logo.png' -import { useFlappy } from './useFlappy.js' - -export function App(props) { - const [alterLogo, setAlterLogo] = useState(false) - const [logoY, jump] = useFlappy() - - useEffect(() => { - console.info('Hello, ReactLynx') - }, []) - props.onRender?.() - - const onTap = useCallback(() => { - 'background only' - setAlterLogo(prevAlterLogo => !prevAlterLogo) - }, []) - - return ( - - - - - - {alterLogo - ? - : } - - React - on Lynx - - - - Tap the logo and have fun! - - Edit - {' src/App.tsx '} - - to see updates! - - - - - - ) -} diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/src/__tests__/index.test.jsx b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/src/__tests__/index.test.jsx deleted file mode 100644 index 4694130ac0..0000000000 --- a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/src/__tests__/index.test.jsx +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2024 The Lynx Authors. All rights reserved. -// Licensed under the Apache License Version 2.0 that can be found in the -// LICENSE file in the root directory of this source tree. -import '@testing-library/jest-dom' -import { expect, test, vi } from 'vitest' -import { render, getQueriesForElement } from '@lynx-js/react/testing-library' - -import { App } from '../App.jsx' - -test('App', async () => { - const cb = vi.fn() - - render( - { - cb(`__MAIN_THREAD__: ${__MAIN_THREAD__}`) - }} - />, - ) - expect(cb).toBeCalledTimes(1) - expect(cb.mock.calls).toMatchInlineSnapshot(` - [ - [ - "__MAIN_THREAD__: false", - ], - ] - `) - expect(elementTree.root).toMatchInlineSnapshot(` - - - - - - - - - Tap the logo and have fun! - - - Edit - - src/App.tsx - - to see updates! - - - - - - - `) - const { - findByText, - } = getQueriesForElement(elementTree.root) - const element = await findByText('Tap the logo and have fun!') - expect(element).toBeInTheDocument() - expect(element).toMatchInlineSnapshot(` - - Tap the logo and have fun! - - `) -}) diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/src/index.jsx b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/src/index.jsx deleted file mode 100644 index 9f4a1c2c73..0000000000 --- a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/src/index.jsx +++ /dev/null @@ -1,11 +0,0 @@ -import '@lynx-js/preact-devtools' -import '@lynx-js/react/debug' -import { root } from '@lynx-js/react' - -import { App } from './App.jsx' - -root.render() - -if (import.meta.webpackHot) { - import.meta.webpackHot.accept() -} diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/src/lib/flappy.js b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/src/lib/flappy.js deleted file mode 100644 index 450e8178be..0000000000 --- a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/src/lib/flappy.js +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Framework-agnostic flappy-bird physics engine. - * - * Manages gravity, jump impulse, and a 60fps game loop. - * Wire it up to any UI framework by calling `jump()` on tap - * and reading `getY()` in the loop callback. - * - * @param {(y: number) => void} onUpdate - * @param {object} [options] - * @param {number} [options.gravity=0.6] - * @param {number} [options.jumpForce=-12] - * @param {number} [options.stackFactor=0.6] - * @param {number} [options.frameMs=16] - * @returns {{ jump: () => void, getY: () => number, destroy: () => void }} - */ -export function createFlappy(onUpdate, options = {}) { - const { - gravity = 0.6, - jumpForce = -12, - stackFactor = 0.6, - frameMs = 16, - } = options - - let y = 0 - let velocity = 0 - let timer = null - - function loop() { - velocity += gravity - y += velocity - if (y >= 0) { - y = 0 - velocity = 0 - timer = null - onUpdate(y) - return - } - onUpdate(y) - timer = setTimeout(loop, frameMs) - } - - function jump() { - // Stack impulse on rapid taps, clamped to one full jumpForce - velocity = Math.max(velocity + jumpForce * stackFactor, jumpForce) - if (!timer) { - loop() - } - } - - function destroy() { - if (timer) { - clearTimeout(timer) - timer = null - } - } - - return { jump, getY: () => y, destroy } -} diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/src/useFlappy.js b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/src/useFlappy.js deleted file mode 100644 index 3e2c297938..0000000000 --- a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/src/useFlappy.js +++ /dev/null @@ -1,37 +0,0 @@ -import { useCallback, useEffect, useRef, useState } from '@lynx-js/react' - -import { createFlappy } from './lib/flappy.js' - -/** - * React hook for flappy-bird physics. - * - * Returns `[y, jump]` — a state value and a stable callback. - * The game loop runs automatically; cleanup happens on unmount. - * Options are read once on mount and not reactive to later changes. - * - * @param {object} [options] - * @returns {[number, () => void]} - */ -export function useFlappy(options) { - const [y, setY] = useState(0) - const engineRef = useRef(null) - - if (engineRef.current == null) { - engineRef.current = createFlappy((newY) => { - setY(newY) - }, options) - } - - useEffect(() => { - return () => { - engineRef.current?.destroy() - } - }, []) - - const jump = useCallback(() => { - 'background only' - engineRef.current?.jump() - }, []) - - return [y, jump] -} diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/lynx.config.ts b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/lynx.config.ts deleted file mode 100644 index 057fa166d2..0000000000 --- a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/lynx.config.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { defineConfig } from '@lynx-js/rspeedy' - -import { pluginQRCode } from '@lynx-js/qrcode-rsbuild-plugin' -import { pluginReactLynx } from '@lynx-js/react-rsbuild-plugin' -import { pluginTypeCheck } from '@rsbuild/plugin-type-check' - -export default defineConfig({ - plugins: [ - pluginQRCode({ - schema(url) { - // We use `?fullscreen=true` to open the page in LynxExplorer in full screen mode - return `${url}?fullscreen=true` - }, - }), - pluginReactLynx(), - pluginTypeCheck(), - ], -}) diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/package.json b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/package.json deleted file mode 100644 index 22cfb7b739..0000000000 --- a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "rspeedy-react-ts", - "version": "0.0.0", - "type": "module", - "scripts": { - "build": "rspeedy build", - "dev": "rspeedy dev", - "preview": "rspeedy preview", - "test": "vitest run" - }, - "dependencies": { - "@lynx-js/react": "workspace:*" - }, - "devDependencies": { - "@lynx-js/preact-devtools": "^5.0.1", - "@lynx-js/qrcode-rsbuild-plugin": "workspace:*", - "@lynx-js/react-rsbuild-plugin": "workspace:*", - "@lynx-js/rspeedy": "workspace:*", - "@lynx-js/types": "3.7.0", - "@rsbuild/plugin-type-check": "1.3.4", - "@testing-library/jest-dom": "^6.9.1", - "@types/react": "^18.3.28", - "jsdom": "^27.4.0", - "typescript": "~5.9.3", - "vitest": "^3.2.4" - }, - "engines": { - "node": ">=18" - } -} diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/App.tsx b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/App.tsx deleted file mode 100644 index ad4a2af74c..0000000000 --- a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/App.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { useCallback, useEffect, useState } from '@lynx-js/react' - -import './App.css' -import arrow from './assets/arrow.png' -import lynxLogo from './assets/lynx-logo.png' -import reactLynxLogo from './assets/react-logo.png' -import { useFlappy } from './useFlappy.js' - -export function App(props: { - onRender?: () => void -}) { - const [alterLogo, setAlterLogo] = useState(false) - const [logoY, jump] = useFlappy() - - useEffect(() => { - console.info('Hello, ReactLynx') - }, []) - props.onRender?.() - - const onTap = useCallback(() => { - 'background only' - setAlterLogo(prevAlterLogo => !prevAlterLogo) - }, []) - - return ( - - - - - - {alterLogo - ? - : } - - React - on Lynx - - - - Tap the logo and have fun! - - Edit - {' src/App.tsx '} - - to see updates! - - - - - - ) -} diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/__tests__/index.test.tsx b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/__tests__/index.test.tsx deleted file mode 100644 index 31a1f1569d..0000000000 --- a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/__tests__/index.test.tsx +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2024 The Lynx Authors. All rights reserved. -// Licensed under the Apache License Version 2.0 that can be found in the -// LICENSE file in the root directory of this source tree. -import '@testing-library/jest-dom' -import { expect, test, vi } from 'vitest' -import { render, getQueriesForElement } from '@lynx-js/react/testing-library' - -import { App } from '../App.jsx' - -test('App', async () => { - const cb = vi.fn() - - render( - { - cb(`__MAIN_THREAD__: ${__MAIN_THREAD__}`) - }} - />, - ) - expect(cb).toBeCalledTimes(1) - expect(cb.mock.calls).toMatchInlineSnapshot(` - [ - [ - "__MAIN_THREAD__: false", - ], - ] - `) - expect(elementTree.root).toMatchInlineSnapshot(` - - - - - - - - - Tap the logo and have fun! - - - Edit - - src/App.tsx - - to see updates! - - - - - - - `) - const { - findByText, - } = getQueriesForElement(elementTree.root!) - const element = await findByText('Tap the logo and have fun!') - expect(element).toBeInTheDocument() - expect(element).toMatchInlineSnapshot(` - - Tap the logo and have fun! - - `) -}) diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/index.tsx b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/index.tsx deleted file mode 100644 index 9f4a1c2c73..0000000000 --- a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/index.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import '@lynx-js/preact-devtools' -import '@lynx-js/react/debug' -import { root } from '@lynx-js/react' - -import { App } from './App.jsx' - -root.render() - -if (import.meta.webpackHot) { - import.meta.webpackHot.accept() -} diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/lib/flappy.ts b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/lib/flappy.ts deleted file mode 100644 index 740598413a..0000000000 --- a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/lib/flappy.ts +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Framework-agnostic flappy-bird physics engine. - * - * Manages gravity, jump impulse, and a 60fps game loop. - * Wire it up to any UI framework by calling `jump()` on tap - * and reading `getY()` in the loop callback. - */ - -export interface FlappyOptions { - /** Downward acceleration per frame (default 0.6) */ - gravity?: number - /** Upward impulse per tap — negative value (default -12) */ - jumpForce?: number - /** Impulse stacking factor for rapid taps (default 0.6) */ - stackFactor?: number - /** Frame interval in ms (default 16 ≈ 60fps) */ - frameMs?: number -} - -export type OnUpdate = (y: number) => void - -export interface FlappyEngine { - /** Call on each tap to apply upward impulse. */ - jump(): void - /** Current Y offset (0 = ground, negative = airborne). */ - getY(): number - /** Stop the game loop and clean up. */ - destroy(): void -} - -export function createFlappy( - onUpdate: OnUpdate, - options: FlappyOptions = {}, -): FlappyEngine { - const { - gravity = 0.6, - jumpForce = -12, - stackFactor = 0.6, - frameMs = 16, - } = options - - let y = 0 - let velocity = 0 - let timer: ReturnType | null = null - - function loop() { - velocity += gravity - y += velocity - if (y >= 0) { - y = 0 - velocity = 0 - timer = null - onUpdate(y) - return - } - onUpdate(y) - timer = setTimeout(loop, frameMs) - } - - function jump() { - // Stack impulse on rapid taps, clamped to one full jumpForce - velocity = Math.max(velocity + jumpForce * stackFactor, jumpForce) - if (!timer) { - loop() - } - } - - function destroy() { - if (timer) { - clearTimeout(timer) - timer = null - } - } - - return { jump, getY: () => y, destroy } -} diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/rspeedy-env.d.ts b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/rspeedy-env.d.ts deleted file mode 100644 index 1c813a68b0..0000000000 --- a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/rspeedy-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/tsconfig.json b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/tsconfig.json deleted file mode 100644 index 2f3bce5ad5..0000000000 --- a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "composite": true, - - "jsx": "react-jsx", - "jsxImportSource": "@lynx-js/react", - - "module": "ESNext", - "moduleResolution": "Bundler", - - "noEmit": true, - }, - "include": ["./**/*.ts", "./**/*.tsx"], -} diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/useFlappy.ts b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/useFlappy.ts deleted file mode 100644 index 97ae14bcbe..0000000000 --- a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/src/useFlappy.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { useCallback, useEffect, useRef, useState } from '@lynx-js/react' - -import { createFlappy } from './lib/flappy.js' -import type { FlappyEngine, FlappyOptions } from './lib/flappy.js' - -/** - * React hook for flappy-bird physics. - * - * Returns `[y, jump]` — a state value and a stable callback. - * The game loop runs automatically; cleanup happens on unmount. - * Options are read once on mount and not reactive to later changes. - * - * @example - * ```tsx - * function Bird() { - * const [y, jump] = useFlappy() - * return ( - * - * Tap me! - * - * ) - * } - * ``` - */ -export function useFlappy( - options?: FlappyOptions, -): [number, () => void] { - const [y, setY] = useState(0) - const engineRef = useRef(null) - - if (engineRef.current == null) { - engineRef.current = createFlappy((newY) => { - setY(newY) - }, options) - } - - useEffect(() => { - return () => { - engineRef.current?.destroy() - } - }, []) - - const jump = useCallback(() => { - 'background only' - engineRef.current?.jump() - }, []) - - return [y, jump] -} diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/tsconfig.json b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/tsconfig.json deleted file mode 100644 index d9feaa5105..0000000000 --- a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "isolatedModules": true, - "verbatimModuleSyntax": true, - - "esModuleInterop": true, - "skipLibCheck": true, - - "noEmit": true, - }, - "references": [ - { "path": "./tsconfig.node.json" }, - { "path": "./src" }, - ], - "files": [], -} diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/tsconfig.node.json b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/tsconfig.node.json deleted file mode 100644 index 5f12d573e4..0000000000 --- a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/tsconfig.node.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "composite": true, - - // Rspeedy uses Node.js's module resolution - "module": "node16", - "moduleResolution": "node16", - "erasableSyntaxOnly": true, - - // Node.js 18+ - "lib": ["es2023"], - "target": "es2022", - - "noEmit": true, - }, - "include": [ - "./lynx.config.ts", - "./vitest.config.ts", - ], -} diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/vitest.config.ts b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/vitest.config.ts deleted file mode 100644 index 98425e53c0..0000000000 --- a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-ts/vitest.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { defineConfig, mergeConfig } from 'vitest/config' -import { createVitestConfig } from '@lynx-js/react/testing-library/vitest-config' - -const defaultConfig = await createVitestConfig() -const config = defineConfig({ - test: {}, -}) - -export default mergeConfig(defaultConfig, config) diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl/package.json b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl/package.json new file mode 100644 index 0000000000..efc5de3cea --- /dev/null +++ b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl/package.json @@ -0,0 +1,10 @@ +{ + "scripts": { + "test": "vitest run" + }, + "devDependencies": { + "@testing-library/jest-dom": "^6.9.1", + "jsdom": "^27.4.0", + "vitest": "^3.2.4" + } +} diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl/src/__tests__/index.test.jsx b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl/src/__tests__/index.test.jsx new file mode 100644 index 0000000000..5ea278ff56 --- /dev/null +++ b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl/src/__tests__/index.test.jsx @@ -0,0 +1,17 @@ +// Copyright 2024 The Lynx Authors. All rights reserved. +// Licensed under the Apache License Version 2.0 that can be found in the +// LICENSE file in the root directory of this source tree. +import '@testing-library/jest-dom' +import { expect, test } from 'vitest' +import { getQueriesForElement, render } from '@lynx-js/react/testing-library' + +import { App } from '../App' + +test('App', async () => { + render() + + const { findByText } = getQueriesForElement(elementTree.root) + const element = await findByText('Tap the logo and have fun!') + + expect(element).toBeInTheDocument() +}) diff --git a/packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/vitest.config.js b/packages/rspeedy/create-rspeedy/template-react-vitest-rltl/vitest.config.js similarity index 100% rename from packages/rspeedy/create-rspeedy/template-react-vitest-rltl-js/vitest.config.js rename to packages/rspeedy/create-rspeedy/template-react-vitest-rltl/vitest.config.js