Skip to content

Commit

Permalink
fix: canonicalize is not supported on wasi target (#124)
Browse files Browse the repository at this point in the history
  • Loading branch information
Brooooooklyn committed Apr 10, 2024
1 parent 42fc05f commit a299111
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 3 deletions.
4 changes: 4 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,10 @@ jobs:
- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Install fixtures dependencies
working-directory: fixtures/pnpm8
run: pnpm install --frozen-lockfile

- name: Build
run: |
rustup target add wasm32-wasi-preview1-threads
Expand Down
32 changes: 30 additions & 2 deletions napi/__test__/resolver.spec.mjs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { join, sep } from 'node:path'
import { join } from 'node:path'
import { fileURLToPath } from 'node:url'

import test from 'ava'
Expand Down Expand Up @@ -217,7 +217,7 @@ for (const [title, context, request, expected] of [
'handle fragment escaping',
enhancedResolveRoot,
'./no\0#fragment/\0#/\0##fragment',
join(enhancedResolveRoot, 'no#fragment','#', '#.js#fragment'),
join(enhancedResolveRoot, 'no#fragment', '#', '#.js#fragment'),
],
]) {
test(title, (t) => {
Expand All @@ -229,3 +229,31 @@ for (const [title, context, request, expected] of [
t.is(resolver.sync(context, request).path, expected)
})
}

test('resolve pnpm package', (t) => {
const pnpmProjectPath = join(currentDir, '..', '..', 'fixtures', 'pnpm8')
const resolver = new ResolverFactory({
aliasFields: ['browser'],
})
t.deepEqual(resolver.sync(pnpmProjectPath, 'styled-components'), {
path: join(
pnpmProjectPath,
'node_modules/.pnpm/styled-components@6.1.1_react-dom@18.2.0_react@18.2.0/node_modules/styled-components/dist/styled-components.browser.cjs.js'
),
})
t.deepEqual(
resolver.sync(
join(
pnpmProjectPath,
'node_modules/.pnpm/styled-components@6.1.1_react-dom@18.2.0_react@18.2.0/node_modules/styled-components'
),
'react'
),
{
path: join(
pnpmProjectPath,
'node_modules/.pnpm/react@18.2.0/node_modules/react/index.js'
),
}
)
})
29 changes: 28 additions & 1 deletion src/file_system.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,33 @@ impl FileSystem for FileSystemOs {
}

fn canonicalize(&self, path: &Path) -> io::Result<PathBuf> {
dunce::canonicalize(path)
#[cfg(not(target_os = "wasi"))]
{
dunce::canonicalize(path)
}
#[cfg(target_os = "wasi")]
{
let meta = fs::symlink_metadata(path)?;
if meta.file_type().is_symlink() {
let link = fs::read_link(path)?;
let mut path_buf = path.to_path_buf();
path_buf.pop();
for segment in link.iter() {
match segment.to_str() {
Some("..") => {
path_buf.pop();
}
Some(".") | None => {}
Some(seg) => {
// Need to trim the extra \0 introduces by rust std rust-lang/rust#123727
path_buf.push(seg.trim_end_matches('\0'));
}
}
}
Ok(path_buf)
} else {
Ok(path.to_path_buf())
}
}
}
}

0 comments on commit a299111

Please sign in to comment.