node-version: 18
cache: 'pnpm'
- - run: PUPPETEER_SKIP_DOWNLOAD=1 pnpm install
+ - name: Skip Puppeteer download
+ run: echo "PUPPETEER_SKIP_DOWNLOAD=1" >> $GITHUB_ENV
+
+ - run: pnpm install
- name: Run unit tests
run: pnpm run test-unit
+ unit-test-windows:
+ runs-on: windows-latest
+ if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
+ steps:
+ - uses: actions/checkout@v3
+
+ - name: Install pnpm
+ uses: pnpm/action-setup@v2
+
+ - name: Set node version to 18
+ uses: actions/setup-node@v3
+ with:
+ node-version: 18
+ cache: 'pnpm'
+
+ - name: Skip Puppeteer download
+ run: echo "PUPPETEER_SKIP_DOWNLOAD=1" >> $env:GITHUB_ENV
+
+ - run: pnpm install
+
+ - name: Run compiler unit tests
+ run: pnpm run test-unit compiler
+
+ - name: Run ssr unit tests
+ run: pnpm run test-unit server-renderer
+
e2e-test:
runs-on: ubuntu-latest
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
node-version: 18
cache: 'pnpm'
- - run: PUPPETEER_SKIP_DOWNLOAD=1 pnpm install
+ - name: Skip Puppeteer download
+ run: echo "PUPPETEER_SKIP_DOWNLOAD=1" >> $GITHUB_ENV
+
+ - run: pnpm install
- name: Run eslint
run: pnpm run lint
createGetCanonicalFileName,
getId,
getImportedName,
- normalizePath
+ normalizePath,
+ joinPaths
} from './utils'
import { ScriptCompileContext, resolveParserPlugins } from './context'
import { ImportBinding, SFCScriptCompileOptions } from '../compileScript'
import { parse } from '../parse'
import { createCache } from '../cache'
import type TS from 'typescript'
-import path from 'path'
+import { extname, dirname } from 'path'
/**
* TypeResolveContext is compatible with ScriptCompileContext
let resolved
if (source.startsWith('.')) {
// relative import - fast path
- const filename = normalizePath(path.join(scope.filename, '..', source))
+ const filename = joinPaths(scope.filename, '..', source)
resolved = resolveExt(filename, fs)
} else {
// module or aliased import - use full TS resolution, only supported in Node
resolved = resolveWithTS(scope.filename, source, fs)
}
if (resolved) {
+ resolved = normalizePath(resolved)
// (hmr) register dependency file on ctx
;(ctx.deps || (ctx.deps = new Set())).add(resolved)
- return fileToScope(ctx, normalizePath(resolved))
+ return fileToScope(ctx, resolved)
} else {
return ctx.error(
`Failed to resolve import source ${JSON.stringify(source)}.`,
tryResolve(filename) ||
tryResolve(filename + `.ts`) ||
tryResolve(filename + `.d.ts`) ||
- tryResolve(filename + `/index.ts`) ||
- tryResolve(filename + `/index.d.ts`)
+ tryResolve(joinPaths(filename, `index.ts`)) ||
+ tryResolve(joinPaths(filename, `index.d.ts`))
)
}
const parsed = ts.parseJsonConfigFileContent(
ts.readConfigFile(configPath, fs.readFile).config,
parseConfigHost,
- path.dirname(configPath),
+ dirname(configPath),
undefined,
configPath
)
content: string,
parserPlugins?: SFCScriptCompileOptions['babelParserPlugins']
): Statement[] {
- const ext = path.extname(filename)
+ const ext = extname(filename)
if (ext === '.ts' || ext === '.tsx') {
return babelParse(content, {
plugins: resolveParserPlugins(ext.slice(1), parserPlugins),
return useCaseSensitiveFileNames ? identity : toFileNameLowerCase
}
+// in the browser build, the polyfill doesn't expose posix, but defaults to
+// posix behavior.
+const normalize = (path.posix || path).normalize
const windowsSlashRE = /\\/g
export function normalizePath(p: string) {
- // in the browser build, the polyfill doesn't expose posix, but defaults to
- // posix behavior.
- return (path.posix || path).normalize(p.replace(windowsSlashRE, '/'))
+ return normalize(p.replace(windowsSlashRE, '/'))
}
+
+export const joinPaths = (path.posix || path).join