diff --git a/packages/playground/preserve-symlinks/__tests__/preload.spec.ts b/packages/playground/preserve-symlinks/__tests__/preload.spec.ts new file mode 100644 index 00000000000000..7e0b546d7dbdbb --- /dev/null +++ b/packages/playground/preserve-symlinks/__tests__/preload.spec.ts @@ -0,0 +1,9 @@ +test('should have no 404s', () => { + browserLogs.forEach((msg) => { + expect(msg).not.toMatch('404') + }) +}) + +test('not-preserve-symlinks', async () => { + expect(await page.textContent('#root')).toBe('hello vite') +}) diff --git a/packages/playground/preserve-symlinks/__tests__/serve.js b/packages/playground/preserve-symlinks/__tests__/serve.js new file mode 100644 index 00000000000000..94d19390dbd6c0 --- /dev/null +++ b/packages/playground/preserve-symlinks/__tests__/serve.js @@ -0,0 +1,108 @@ +// @ts-check +// this is automtically detected by scripts/jestPerTestSetup.ts and will replace +// the default e2e test serve behavior + +const path = require('path') +const http = require('http') +const sirv = require('sirv') +const fs = require('fs') + +const port = (exports.port = 9527) + +/** + * @param {string} root + * @param {boolean} isBuildTest + */ +exports.serve = async function serve(root, isBuildTest) { + const testDist = path.resolve(__dirname, '../moduleA/dist') + + if (fs.existsSync(testDist)) { + emptyDir(testDist) + } else { + fs.mkdirSync(testDist, { recursive: true }) + } + + fs.symlinkSync( + path.resolve(testDist, '../src/index.js'), + path.resolve(testDist, 'symlinks-moduleA.esm.js') + ) + + if (!isBuildTest) { + const { createServer } = require('vite') + process.env.VITE_INLINE = 'inline-serve' + let viteServer = await ( + await createServer({ + root: root, + logLevel: 'silent', + server: { + watch: { + usePolling: true, + interval: 100 + }, + host: true, + fs: { + strict: !isBuildTest + } + }, + build: { + target: 'esnext' + } + }) + ).listen() + // use resolved port/base from server + const base = viteServer.config.base === '/' ? '' : viteServer.config.base + const url = + (global.viteTestUrl = `http://localhost:${viteServer.config.server.port}${base}`) + await page.goto(url) + + return viteServer + } else { + const { build } = require('vite') + await build({ + root, + logLevel: 'silent', + configFile: path.resolve(__dirname, '../vite.config.js') + }) + + // start static file server + const serve = sirv(path.resolve(root, 'dist')) + const httpServer = http.createServer((req, res) => { + if (req.url === '/ping') { + res.statusCode = 200 + res.end('pong') + } else { + serve(req, res) + } + }) + + return new Promise((resolve, reject) => { + try { + const server = httpServer.listen(port, async () => { + await page.goto(`http://localhost:${port}`) + resolve({ + // for test teardown + async close() { + await new Promise((resolve) => { + server.close(resolve) + }) + } + }) + }) + } catch (e) { + reject(e) + } + }) + } +} + +function emptyDir(dir) { + for (const file of fs.readdirSync(dir)) { + const abs = path.resolve(dir, file) + if (fs.lstatSync(abs).isDirectory()) { + emptyDir(abs) + fs.rmdirSync(abs) + } else { + fs.unlinkSync(abs) + } + } +} diff --git a/packages/playground/preserve-symlinks/index.html b/packages/playground/preserve-symlinks/index.html new file mode 100644 index 00000000000000..07f82cb05c3eec --- /dev/null +++ b/packages/playground/preserve-symlinks/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite App + + +
+ + + diff --git a/packages/playground/preserve-symlinks/moduleA/package.json b/packages/playground/preserve-symlinks/moduleA/package.json new file mode 100644 index 00000000000000..cb535e54edeeeb --- /dev/null +++ b/packages/playground/preserve-symlinks/moduleA/package.json @@ -0,0 +1,17 @@ +{ + "name": "@symlinks/moduleA", + "version": "0.0.0", + "module": "dist/symlinks-moduleA.esm.js", + "main": "dist/symlinks-moduleA.cjs.js", + "preconstruct": { + "entrypoints": [ + "index.js" + ] + }, + "scripts": { + "dev": "preconstruct dev" + }, + "devDependencies": { + "@preconstruct/cli": "^2.0.6" + } +} diff --git a/packages/playground/preserve-symlinks/moduleA/src/data.js b/packages/playground/preserve-symlinks/moduleA/src/data.js new file mode 100644 index 00000000000000..e1bc98ec67da12 --- /dev/null +++ b/packages/playground/preserve-symlinks/moduleA/src/data.js @@ -0,0 +1,3 @@ +export const data = { + msg: 'hello vite' +} diff --git a/packages/playground/preserve-symlinks/moduleA/src/index.js b/packages/playground/preserve-symlinks/moduleA/src/index.js new file mode 100644 index 00000000000000..b564d013e6b5e8 --- /dev/null +++ b/packages/playground/preserve-symlinks/moduleA/src/index.js @@ -0,0 +1,5 @@ +import { data } from './data' + +export function sayHi() { + return data +} diff --git a/packages/playground/preserve-symlinks/package.json b/packages/playground/preserve-symlinks/package.json new file mode 100644 index 00000000000000..a751bf639f0d40 --- /dev/null +++ b/packages/playground/preserve-symlinks/package.json @@ -0,0 +1,13 @@ +{ + "name": "preserveSymlinks", + "version": "0.0.0", + "scripts": { + "dev": "vite --force", + "build": "vite build", + "serve": "vite preview" + }, + "workspaces": {}, + "dependencies": { + "@symlinks/moduleA": "link:./moduleA" + } +} diff --git a/packages/playground/preserve-symlinks/src/main.js b/packages/playground/preserve-symlinks/src/main.js new file mode 100644 index 00000000000000..7257c44f1ba83f --- /dev/null +++ b/packages/playground/preserve-symlinks/src/main.js @@ -0,0 +1,3 @@ +import { sayHi } from '@symlinks/moduleA' + +document.getElementById('root').innerText = sayHi().msg diff --git a/packages/playground/preserve-symlinks/vite.config.js b/packages/playground/preserve-symlinks/vite.config.js new file mode 100644 index 00000000000000..0c9322b79f6f27 --- /dev/null +++ b/packages/playground/preserve-symlinks/vite.config.js @@ -0,0 +1,6 @@ +// https://vitejs.dev/config/ +module.exports = { + resolve: { + preserveSymlinks: false + } +}