From 5dae012cc80561ca9c17c3bf0fc3923df2cf4a01 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sun, 14 Jun 2026 20:00:08 +0900 Subject: [PATCH 1/2] fix(lit-query): migrate to standard tsup build so 'build' output is cached by nx and 'test:build' passes --- .changeset/lit-query-standard-tsup-build.md | 5 + .gitignore | 1 - packages/lit-query/eslint.config.js | 5 +- packages/lit-query/package.json | 32 ++-- packages/lit-query/root.tsup.config.js | 1 + .../scripts/check-cjs-types-smoke.mjs | 137 ------------------ packages/lit-query/scripts/l3-stress.mjs | 2 +- packages/lit-query/scripts/measure-bundle.mjs | 2 +- .../lit-query/scripts/write-cjs-package.mjs | 73 ---------- packages/lit-query/tsconfig.build.cjs.json | 12 -- packages/lit-query/tsconfig.build.json | 15 -- packages/lit-query/tsconfig.json | 20 +-- packages/lit-query/tsconfig.prod.json | 10 ++ packages/lit-query/tsup.config.ts | 7 + 14 files changed, 44 insertions(+), 278 deletions(-) create mode 100644 .changeset/lit-query-standard-tsup-build.md create mode 120000 packages/lit-query/root.tsup.config.js delete mode 100644 packages/lit-query/scripts/check-cjs-types-smoke.mjs delete mode 100644 packages/lit-query/scripts/write-cjs-package.mjs delete mode 100644 packages/lit-query/tsconfig.build.cjs.json delete mode 100644 packages/lit-query/tsconfig.build.json create mode 100644 packages/lit-query/tsconfig.prod.json create mode 100644 packages/lit-query/tsup.config.ts diff --git a/.changeset/lit-query-standard-tsup-build.md b/.changeset/lit-query-standard-tsup-build.md new file mode 100644 index 00000000000..5f14eb349d9 --- /dev/null +++ b/.changeset/lit-query-standard-tsup-build.md @@ -0,0 +1,5 @@ +--- +'@tanstack/lit-query': patch +--- + +fix(lit-query): migrate to the standard tsup build so the `build` output is cached by nx and `test:build` passes diff --git a/.gitignore b/.gitignore index 638a5ac304f..6e71fdf278c 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,6 @@ yarn.lock build coverage dist -dist-cjs dist-ts # misc diff --git a/packages/lit-query/eslint.config.js b/packages/lit-query/eslint.config.js index c3642e60191..01d570d1aa4 100644 --- a/packages/lit-query/eslint.config.js +++ b/packages/lit-query/eslint.config.js @@ -8,13 +8,12 @@ import tseslint from 'typescript-eslint' export default tseslint.config( { ignores: [ - 'dist/**', + 'build/**', 'coverage/**', 'node_modules/**', '.claude/**', '.references/**', - '**/dist/**', - '**/dist-cjs/**', + '**/build/**', 'examples/**/output/**', '**/*.d.ts', ], diff --git a/packages/lit-query/package.json b/packages/lit-query/package.json index 635e5958e79..eb413dea08d 100644 --- a/packages/lit-query/package.json +++ b/packages/lit-query/package.json @@ -15,44 +15,40 @@ "url": "https://github.com/sponsors/tannerlinsley" }, "type": "module", - "main": "dist-cjs/index.js", - "module": "dist/index.js", - "types": "dist/index.d.ts", + "types": "build/legacy/index.d.ts", + "main": "build/legacy/index.cjs", + "module": "build/legacy/index.js", "sideEffects": false, "files": [ - "dist", - "dist-cjs", - "src/**/*.ts", - "!src/tests/**/*" + "build", + "src", + "!src/tests" ], "exports": { ".": { "@tanstack/custom-condition": "./src/index.ts", "import": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" + "types": "./build/modern/index.d.ts", + "default": "./build/modern/index.js" }, "require": { - "types": "./dist-cjs/index.d.cts", - "default": "./dist-cjs/index.js" - }, - "default": "./dist/index.js" + "types": "./build/modern/index.d.cts", + "default": "./build/modern/index.cjs" + } }, "./package.json": "./package.json" }, "scripts": { + "clean": "premove ./build ./coverage", "compile": "node ../../node_modules/typescript/lib/tsc.js --build", - "build:deps": "pnpm --dir ../query-core run build", - "build": "pnpm run build:deps && pnpm run build:esm && pnpm run build:cjs", - "build:esm": "node ../../node_modules/typescript/lib/tsc.js -p tsconfig.build.json", - "build:cjs": "node -e \"require('node:fs').rmSync('dist-cjs', { recursive: true, force: true })\" && node ../../node_modules/typescript/lib/tsc.js -p tsconfig.build.cjs.json && node scripts/write-cjs-package.mjs", + "build": "tsup --tsconfig tsconfig.prod.json", "test:types": "node ../../node_modules/typescript/lib/tsc.js --noEmit", "test:eslint": "eslint .", "lint:fix": "eslint . --fix", "test:lib": "vitest run", "test:lib:dev": "vitest", "test:watch": "pnpm run test:lib:dev", - "test:build": "publint --strict && attw --pack && node scripts/check-cjs-types-smoke.mjs", + "test:build": "publint --strict && attw --pack", "measure:bundle": "pnpm run build && node scripts/measure-bundle.mjs", "measure:bundle:raw": "node scripts/measure-bundle.mjs", "perf:l3": "pnpm run build && node scripts/l3-stress.mjs", diff --git a/packages/lit-query/root.tsup.config.js b/packages/lit-query/root.tsup.config.js new file mode 120000 index 00000000000..fb8e9add9a3 --- /dev/null +++ b/packages/lit-query/root.tsup.config.js @@ -0,0 +1 @@ +../../scripts/getTsupConfig.js \ No newline at end of file diff --git a/packages/lit-query/scripts/check-cjs-types-smoke.mjs b/packages/lit-query/scripts/check-cjs-types-smoke.mjs deleted file mode 100644 index a8c508d11d7..00000000000 --- a/packages/lit-query/scripts/check-cjs-types-smoke.mjs +++ /dev/null @@ -1,137 +0,0 @@ -import { execFile as execFileCallback } from 'node:child_process' -import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises' -import { tmpdir } from 'node:os' -import { dirname, join, resolve } from 'node:path' -import { fileURLToPath } from 'node:url' -import { promisify } from 'node:util' - -const execFile = promisify(execFileCallback) -const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm' -const pnpmCommand = process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm' -const projectDir = resolve(dirname(fileURLToPath(import.meta.url)), '..') -const workspaceRoot = resolve(projectDir, '..', '..') -const typeRootsDir = resolve(workspaceRoot, 'node_modules', '@types') -const tscEntrypoint = resolve( - workspaceRoot, - 'node_modules', - 'typescript', - 'lib', - 'tsc.js', -) - -const tempRoot = await mkdtemp(join(tmpdir(), 'tanstack-lit-query-cjs-smoke-')) -const packDir = resolve(tempRoot, 'pack') -const consumerDir = resolve(tempRoot, 'consumer') - -try { - const tarballPath = await packProject(packDir) - - await writeConsumerFixture(consumerDir) - await installConsumer(consumerDir, tarballPath) - await typecheckConsumer(consumerDir) - - console.log('CommonJS TypeScript smoke test passed.') -} finally { - await rm(tempRoot, { recursive: true, force: true }) -} - -async function packProject(destination) { - await mkdir(destination, { recursive: true }) - - const { stdout } = await execFile( - pnpmCommand, - ['pack', '--json', '--pack-destination', destination], - { - cwd: projectDir, - }, - ) - const packResult = JSON.parse(stdout) - const filename = Array.isArray(packResult) - ? packResult[0]?.filename - : packResult?.filename - - if (typeof filename !== 'string') { - throw new Error(`Unexpected pack output: ${stdout}`) - } - - return resolve(destination, filename) -} - -async function writeConsumerFixture(consumerDirectory) { - await rm(consumerDirectory, { recursive: true, force: true }) - await mkdir(consumerDirectory, { recursive: true }) - - await writeFile( - resolve(consumerDirectory, 'package.json'), - `${JSON.stringify( - { - private: true, - type: 'commonjs', - }, - null, - 2, - )}\n`, - 'utf8', - ) - - await writeFile( - resolve(consumerDirectory, 'index.cts'), - [ - "const pkg = require('@tanstack/lit-query')", - '', - "type CreateQueryOptions = import('@tanstack/lit-query').CreateQueryOptions", - '', - 'const options: CreateQueryOptions = {', - " queryKey: ['cjs-smoke'],", - " queryFn: async () => 'ok',", - '}', - '', - "if (typeof pkg.createQueryController !== 'function') {", - " throw new Error('createQueryController export is missing in CommonJS consumer.')", - '}', - '', - 'void pkg.queryOptions(options)', - '', - ].join('\n'), - 'utf8', - ) - - await writeFile( - resolve(consumerDirectory, 'tsconfig.json'), - `${JSON.stringify( - { - compilerOptions: { - module: 'Node16', - moduleResolution: 'Node16', - target: 'ES2022', - strict: true, - noEmit: true, - types: ['node'], - typeRoots: [typeRootsDir], - }, - include: ['index.cts'], - }, - null, - 2, - )}\n`, - 'utf8', - ) - - await writeFile( - resolve(consumerDirectory, '.npmrc'), - 'package-lock=false\n', - 'utf8', - ) -} - -async function installConsumer(consumerDirectory, tarballPath) { - await execFile(npmCommand, ['install', '--silent', tarballPath], { - cwd: consumerDirectory, - }) -} - -async function typecheckConsumer(consumerDirectory) { - await execFile(process.execPath, [tscEntrypoint, '-p', 'tsconfig.json'], { - cwd: consumerDirectory, - }) -} diff --git a/packages/lit-query/scripts/l3-stress.mjs b/packages/lit-query/scripts/l3-stress.mjs index 55f52a9a73f..0c41f0e9c4d 100644 --- a/packages/lit-query/scripts/l3-stress.mjs +++ b/packages/lit-query/scripts/l3-stress.mjs @@ -1,5 +1,5 @@ import { QueryClient } from '@tanstack/query-core' -import { createQueryController } from '../dist/index.js' +import { createQueryController } from '../build/modern/index.js' class TestControllerHost { controllers = new Set() diff --git a/packages/lit-query/scripts/measure-bundle.mjs b/packages/lit-query/scripts/measure-bundle.mjs index b8adec12b17..7b304dfed0e 100644 --- a/packages/lit-query/scripts/measure-bundle.mjs +++ b/packages/lit-query/scripts/measure-bundle.mjs @@ -5,7 +5,7 @@ import { fileURLToPath } from 'node:url' const scriptDir = path.dirname(fileURLToPath(import.meta.url)) const repoRoot = path.resolve(scriptDir, '..') -const distDir = path.join(repoRoot, 'dist') +const distDir = path.join(repoRoot, 'build', 'modern') const entryFile = path.join(distDir, 'index.js') async function getDirSizeBytes(dirPath) { diff --git a/packages/lit-query/scripts/write-cjs-package.mjs b/packages/lit-query/scripts/write-cjs-package.mjs deleted file mode 100644 index dcf076d7832..00000000000 --- a/packages/lit-query/scripts/write-cjs-package.mjs +++ /dev/null @@ -1,73 +0,0 @@ -import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises' -import { dirname, relative, resolve } from 'node:path' - -const projectDir = process.cwd() -const esmDir = resolve(projectDir, 'dist') -const outDir = resolve(process.cwd(), 'dist-cjs') -const esmOnlyPackages = new Set(['lit']) -const esmImportTypeRegex = /import type \{([^}]*)\} from (['"])([^'"]+)\2;/g -const esmValueImportRegex = /import \{([^}]*)\} from (['"])([^'"]+)\2;/g -const importTypeExpressionRegex = /import\((['"])([^'"]+)\1\)/g - -await mkdir(outDir, { recursive: true }) -await writeFile( - resolve(outDir, 'package.json'), - `${JSON.stringify({ type: 'commonjs' }, null, 2)}\n`, - 'utf8', -) - -for (const declarationFile of await findDeclarationFiles(esmDir)) { - const source = await readFile(declarationFile, 'utf8') - const relativePath = relative(esmDir, declarationFile) - const outputPath = resolve(outDir, relativePath.replace(/\.d\.ts$/, '.d.cts')) - - await mkdir(dirname(outputPath), { recursive: true }) - await writeFile(outputPath, rewriteDeclaration(source), 'utf8') -} - -async function findDeclarationFiles(rootDir) { - const entries = await readdir(rootDir, { withFileTypes: true }) - const files = [] - - for (const entry of entries) { - const entryPath = resolve(rootDir, entry.name) - - if (entry.isDirectory()) { - files.push(...(await findDeclarationFiles(entryPath))) - continue - } - - if (entry.isFile() && entry.name.endsWith('.d.ts')) { - files.push(entryPath) - } - } - - return files -} - -function rewriteDeclaration(source) { - return source - .replace(/^\/\/# sourceMappingURL=.*$\n?/gm, '') - .replace(/(['"])(\.\.?\/[^'"]+)\.js\1/g, '$1$2.cjs$1') - .replace(esmImportTypeRegex, (match, specifiers, quote, packageName) => { - if (!esmOnlyPackages.has(packageName)) { - return match - } - - return `import type {${specifiers}} from ${quote}${packageName}${quote} with { "resolution-mode": "import" };` - }) - .replace(esmValueImportRegex, (match, specifiers, quote, packageName) => { - if (!esmOnlyPackages.has(packageName)) { - return match - } - - return `import type {${specifiers}} from ${quote}${packageName}${quote} with { "resolution-mode": "import" };` - }) - .replace(importTypeExpressionRegex, (match, quote, packageName) => { - if (packageName !== 'lit-html') { - return match - } - - return `import(${quote}${packageName}${quote}, { with: { "resolution-mode": "import" } })` - }) -} diff --git a/packages/lit-query/tsconfig.build.cjs.json b/packages/lit-query/tsconfig.build.cjs.json deleted file mode 100644 index f6a332575d4..00000000000 --- a/packages/lit-query/tsconfig.build.cjs.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "./tsconfig.build.json", - "compilerOptions": { - "customConditions": null, - "module": "CommonJS", - "moduleResolution": "Node", - "outDir": "dist-cjs", - "declaration": false, - "declarationMap": false - }, - "exclude": ["src/tests/**/*.ts", "dist", "dist-cjs", "node_modules"] -} diff --git a/packages/lit-query/tsconfig.build.json b/packages/lit-query/tsconfig.build.json deleted file mode 100644 index 5a1dd43717c..00000000000 --- a/packages/lit-query/tsconfig.build.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "noEmit": false, - "incremental": false, - "composite": false, - "customConditions": [], - "module": "ESNext", - "moduleResolution": "Bundler", - "rootDir": "src", - "outDir": "dist" - }, - "include": ["src/**/*.ts"], - "exclude": ["src/tests/**/*.ts", "dist", "node_modules"] -} diff --git a/packages/lit-query/tsconfig.json b/packages/lit-query/tsconfig.json index 9608d648e8c..e143f207f38 100644 --- a/packages/lit-query/tsconfig.json +++ b/packages/lit-query/tsconfig.json @@ -1,24 +1,10 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "target": "ES2022", - "module": "NodeNext", - "moduleResolution": "NodeNext", - "lib": ["ES2022", "DOM"], - "strict": true, - "declaration": true, - "declarationMap": true, - "sourceMap": true, - "isolatedModules": true, - "esModuleInterop": true, - "skipLibCheck": true, - "noUncheckedIndexedAccess": true, - "forceConsistentCasingInFileNames": true, - "emitDeclarationOnly": false, + "outDir": "./dist-ts", "rootDir": ".", - "outDir": "dist-ts" + "lib": ["ES2022", "DOM"] }, - "include": ["src/**/*.ts", "*.config.*", "package.json"], - "exclude": ["dist", "node_modules"], + "include": ["src", "*.config.ts", "*.config.js", "package.json"], "references": [{ "path": "../query-core" }] } diff --git a/packages/lit-query/tsconfig.prod.json b/packages/lit-query/tsconfig.prod.json new file mode 100644 index 00000000000..7f6188e9609 --- /dev/null +++ b/packages/lit-query/tsconfig.prod.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "incremental": false, + "composite": false, + "rootDir": "../../" + }, + "include": ["src"], + "exclude": ["src/tests"] +} diff --git a/packages/lit-query/tsup.config.ts b/packages/lit-query/tsup.config.ts new file mode 100644 index 00000000000..f7568e3c58a --- /dev/null +++ b/packages/lit-query/tsup.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'tsup' +import { legacyConfig, modernConfig } from './root.tsup.config.js' + +export default defineConfig([ + modernConfig({ entry: ['src/index.ts'] }), + legacyConfig({ entry: ['src/index.ts'] }), +]) From f8f010c27973af359a48f05834e442f35e626556 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sun, 14 Jun 2026 21:49:07 +0900 Subject: [PATCH 2/2] chore(lit-query): align 'package.json' and rename 'vitest.config.ts' to 'vite.config.ts' to match react-query, drop obsolete knip 'src/tests' ignore --- knip.json | 3 -- packages/lit-query/package.json | 44 +++++++++---------- .../{vitest.config.ts => vite.config.ts} | 8 +++- 3 files changed, 29 insertions(+), 26 deletions(-) rename packages/lit-query/{vitest.config.ts => vite.config.ts} (73%) diff --git a/knip.json b/knip.json index cde2b9b3b5d..2d444d217cc 100644 --- a/knip.json +++ b/knip.json @@ -19,9 +19,6 @@ "entry": ["src/v4/**/*.cjs", "src/v5/**/*.cjs"], "ignore": ["**/__testfixtures__/**"] }, - "packages/lit-query": { - "ignore": ["src/tests/**"] - }, "packages/vue-query": { "ignoreDependencies": ["vue2", "vue2.7"] } diff --git a/packages/lit-query/package.json b/packages/lit-query/package.json index eb413dea08d..31652d2fea3 100644 --- a/packages/lit-query/package.json +++ b/packages/lit-query/package.json @@ -14,16 +14,26 @@ "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, + "scripts": { + "clean": "premove ./build ./coverage ./dist-ts", + "compile": "tsc --build", + "test:eslint": "eslint --concurrency=auto .", + "lint:fix": "eslint --concurrency=auto . --fix", + "test:types": "tsc --noEmit", + "test:lib": "vitest", + "test:lib:dev": "pnpm run test:lib --watch", + "test:watch": "pnpm run test:lib:dev", + "test:build": "publint --strict && attw --pack", + "build": "tsup --tsconfig tsconfig.prod.json", + "measure:bundle": "pnpm run build && node scripts/measure-bundle.mjs", + "measure:bundle:raw": "node scripts/measure-bundle.mjs", + "perf:l3": "pnpm run build && node scripts/l3-stress.mjs", + "perf:l3:raw": "node scripts/l3-stress.mjs" + }, "type": "module", "types": "build/legacy/index.d.ts", "main": "build/legacy/index.cjs", "module": "build/legacy/index.js", - "sideEffects": false, - "files": [ - "build", - "src", - "!src/tests" - ], "exports": { ".": { "@tanstack/custom-condition": "./src/index.ts", @@ -38,22 +48,12 @@ }, "./package.json": "./package.json" }, - "scripts": { - "clean": "premove ./build ./coverage", - "compile": "node ../../node_modules/typescript/lib/tsc.js --build", - "build": "tsup --tsconfig tsconfig.prod.json", - "test:types": "node ../../node_modules/typescript/lib/tsc.js --noEmit", - "test:eslint": "eslint .", - "lint:fix": "eslint . --fix", - "test:lib": "vitest run", - "test:lib:dev": "vitest", - "test:watch": "pnpm run test:lib:dev", - "test:build": "publint --strict && attw --pack", - "measure:bundle": "pnpm run build && node scripts/measure-bundle.mjs", - "measure:bundle:raw": "node scripts/measure-bundle.mjs", - "perf:l3": "pnpm run build && node scripts/l3-stress.mjs", - "perf:l3:raw": "node scripts/l3-stress.mjs" - }, + "sideEffects": false, + "files": [ + "build", + "src", + "!src/tests" + ], "dependencies": { "@lit/context": "^1.1.6", "@tanstack/query-core": "workspace:*", diff --git a/packages/lit-query/vitest.config.ts b/packages/lit-query/vite.config.ts similarity index 73% rename from packages/lit-query/vitest.config.ts rename to packages/lit-query/vite.config.ts index 0ab94757be4..363607106ef 100644 --- a/packages/lit-query/vitest.config.ts +++ b/packages/lit-query/vite.config.ts @@ -1,5 +1,7 @@ import { defineConfig } from 'vitest/config' +import packageJson from './package.json' + export default defineConfig({ // fix from https://github.com/vitest-dev/vitest/issues/6992#issuecomment-2509408660 resolve: { @@ -13,12 +15,16 @@ export default defineConfig({ }, }, test: { + name: packageJson.name, dir: './src', watch: false, environment: 'jsdom', include: ['tests/**/*.test.ts'], coverage: { - enabled: false, + enabled: !!process.env.CI, + provider: 'istanbul', + include: ['src/**/*'], + exclude: ['src/tests/**'], }, typecheck: { enabled: true }, restoreMocks: true,