Skip to content

Commit

Permalink
fix(loader): experimentalLoader with node@18
Browse files Browse the repository at this point in the history
There is currently a bug when running `node@18.14.2` when running with experimentalLoader

```
TypeError: The URL must be of scheme file
  at new NodeError (node:internal/errors:399:5)
  at Object.fileURLToPath (node:internal/url:1492:11)
  at resolve (./node_modules/@playwright/test/lib/experimentalLoader.js:39:48)
  at nextResolve (node:internal/modules/esm/loader:163:22)
  at ESMLoader.resolve (node:internal/modules/esm/loader:838:24)
  at ESMLoader.getModuleJob (node:internal/modules/esm/loader:424:7)
  at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:79:21)
```

This came from my test `vrt.spec.ts` which had a non package import inside of it

```ts
import fs from "node:fs/promises"
```

The test run failed due to node imports not returning fileUrls when resolved.
  • Loading branch information
Nowell Strite committed Feb 22, 2023
1 parent 135e9f8 commit 7ab2468
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 1 deletion.
3 changes: 2 additions & 1 deletion packages/playwright-test/src/experimentalLoader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,9 @@ async function resolve(specifier: string, context: { parentURL?: string }, defau
specifier = url.pathToFileURL(resolved).toString();
}
const result = await defaultResolve(specifier, context, defaultResolve);
if (result?.url)
if (result?.url && result.url.startsWith('file://'))
currentFileDepsCollector()?.add(url.fileURLToPath(result.url));

return result;
}

Expand Down
26 changes: 26 additions & 0 deletions tests/playwright-test/loader.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -612,3 +612,29 @@ test('should import export assignment from ts', async ({ runInlineTest }) => {
expect(result.passed).toBe(1);
expect(result.exitCode).toBe(0);
});

test('should support node imports', async ({ runInlineTest }) => {
const result = await runInlineTest({
'package.json': JSON.stringify({
type: 'module'
}),
'test.json': 'test data',
'utils.mjs': `
import fs from "node:fs/promises";
export async function utilityModuleThatImportsNodeModule() {
return await fs.readFile('test.json', 'utf8');
}
`,
'a.test.ts': `
import { test, expect } from '@playwright/test';
import { utilityModuleThatImportsNodeModule } from './utils.mjs';
test('pass', async () => {
expect(await utilityModuleThatImportsNodeModule()).toBe('test data');
});
`
});
expect(result.passed).toBe(1);
expect(result.exitCode).toBe(0);
});

0 comments on commit 7ab2468

Please sign in to comment.