* test: resolve repository files without climbing directories
Twelve tests and helpers reached shared fixtures, package assets, and workers with ../.. paths from import.meta, which the import rule does not see. They now go through repoPath and testPath, a workspaceRoot() that finds the root by its lockfile, the core package's own root, or the #core alias through import.meta.resolve. The root finder derives its folder from import.meta.url, so Playwright specs running under Node can use the helpers too. open-pencil/no-deep-parent-relative-paths rejects climbing two levels in new URL(…, import.meta.url) and in path calls that start from import.meta.
* fix(lint): catch Windows separators and wrapped import.meta paths, and stop at template expressions
The path rule missed '..\..' and a base such as dirname(fileURLToPath(import.meta.url)), and read `../${folder}` followed by '..' as climbing two levels.
43 lines
1.3 KiB
TypeScript
43 lines
1.3 KiB
TypeScript
import { existsSync } from 'node:fs'
|
|
import { dirname, join } from 'node:path'
|
|
import { fileURLToPath } from 'node:url'
|
|
|
|
/** The workspace root, found by its lockfile rather than by counting directories. */
|
|
export function workspaceRoot(from = dirname(fileURLToPath(import.meta.url))): string {
|
|
for (let dir = from; ; dir = dirname(dir)) {
|
|
if (existsSync(join(dir, 'bun.lock'))) return dir
|
|
if (dirname(dir) === dir) throw new Error(`No workspace root above ${from}`)
|
|
}
|
|
}
|
|
|
|
const repoRoot = workspaceRoot()
|
|
|
|
export function repoPath(...segments: string[]): string {
|
|
return join(repoRoot, ...segments)
|
|
}
|
|
|
|
export function coreSourcePath(...segments: string[]): string {
|
|
return repoPath('packages/core/src', ...segments)
|
|
}
|
|
|
|
export function cliSourcePath(...segments: string[]): string {
|
|
return repoPath('packages/cli/src', ...segments)
|
|
}
|
|
|
|
export function testPath(...segments: string[]): string {
|
|
return repoPath('tests', ...segments)
|
|
}
|
|
|
|
export function publicPath(...segments: string[]): string {
|
|
return repoPath('public', ...segments)
|
|
}
|
|
|
|
export function requireBuiltWorkspacePackages(): void {
|
|
const coreDist = repoPath('packages/core/dist/index.js')
|
|
if (!existsSync(coreDist)) {
|
|
throw new Error(
|
|
'CLI integration tests require built workspace packages. Run `bun run check` or `bun run --filter @open-pencil/core build` first.'
|
|
)
|
|
}
|
|
}
|