Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(@parcel/transformer-js): Rewrite __dirname/__filename to be relative to asset.filePath #7727

Merged
merged 50 commits into from Apr 11, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
2c3b500
initial
LekoArts Feb 17, 2022
c24fccb
revert some changes
LekoArts Feb 22, 2022
a7e7b3a
add path import
LekoArts Feb 22, 2022
eca555e
test wip
LekoArts Feb 22, 2022
f3a29cb
Merge branch 'v2' into dirname-relative-path
LekoArts Mar 14, 2022
b7b49e3
re-add example
LekoArts Mar 14, 2022
8d73fe0
update swc
LekoArts Mar 15, 2022
2a45008
update example
LekoArts Mar 18, 2022
08bd388
move logic to new replacer
LekoArts Mar 18, 2022
a2d6f12
edit packager
LekoArts Mar 18, 2022
fd1a569
Merge branch 'v2' into dirname-relative-path
LekoArts Mar 18, 2022
a231c46
delete example once more
LekoArts Mar 22, 2022
1646589
revert a change
LekoArts Mar 22, 2022
87df079
add js transformer test
LekoArts Mar 22, 2022
e8e9a4d
fix filename
LekoArts Mar 22, 2022
a634a00
revert typo
LekoArts Mar 22, 2022
9da76e9
apply first batch of review comments
LekoArts Mar 23, 2022
1d820d5
test changes
LekoArts Mar 23, 2022
84b9301
add comment
LekoArts Mar 23, 2022
6251b3d
Merge branch 'v2' into dirname-relative-path
LekoArts Mar 23, 2022
ef6cebf
trigger ci?
LekoArts Mar 23, 2022
e8c6f4d
test changes
LekoArts Mar 24, 2022
95c093f
correct pathing in all os?
LekoArts Mar 28, 2022
748eac3
Merge branch 'v2' into dirname-relative-path
mischnic Mar 28, 2022
1b186df
pray to the testing gods
LekoArts Mar 29, 2022
ee9faaf
Merge branch 'v2' into dirname-relative-path
LekoArts Mar 29, 2022
2c7a4c8
use path util
LekoArts Mar 29, 2022
e5d78e0
fix lint error
LekoArts Mar 29, 2022
b3a92ab
trigger ci
LekoArts Mar 29, 2022
ffac3ec
trigger ci
LekoArts Mar 29, 2022
1f0ebae
replace assets individually
LekoArts Mar 30, 2022
f5e8337
Merge branch 'v2' into dirname-relative-path
LekoArts Mar 30, 2022
3cba5c2
update rust code
LekoArts Mar 30, 2022
ad46e2e
trigger ci
LekoArts Mar 31, 2022
5286520
trigger ci
LekoArts Mar 31, 2022
d249b88
add asset.meta.has_node_replacements
LekoArts Mar 31, 2022
f351f21
flow is weird 🙈
LekoArts Mar 31, 2022
1d1b927
trigger ci
LekoArts Mar 31, 2022
8cabe10
Merge branch 'v2' into dirname-relative-path
LekoArts Mar 31, 2022
762b3c8
trigger ci
LekoArts Apr 1, 2022
256b7c2
Merge branch 'v2' into dirname-relative-path
LekoArts Apr 6, 2022
997e407
use filename OsStr instead of pathdiff in __filename
LekoArts Apr 7, 2022
151a54e
trigger ci
LekoArts Apr 7, 2022
0b45828
Merge branch 'v2' into dirname-relative-path
mischnic Apr 7, 2022
7d313ca
use simpler fold_with
LekoArts Apr 7, 2022
b415560
move replace call up in scopeHoistingPackager
LekoArts Apr 7, 2022
0d96930
trigger ci
LekoArts Apr 7, 2022
c7bc555
Merge branch 'v2' into dirname-relative-path
mischnic Apr 7, 2022
ae7ce09
Merge branch 'v2' into dirname-relative-path
devongovett Apr 11, 2022
43e16a9
Merge branch 'v2' into dirname-relative-path
mischnic Apr 11, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 11 additions & 0 deletions packages/core/core/src/resolveOptions.js
Expand Up @@ -50,13 +50,24 @@ export default async function resolveOptions(
}

let entryRoot = getRootDir(entries);
/*
let projectRootFile =
(await resolveConfig(
inputFS,
path.join(entryRoot, 'index'),
[...LOCK_FILE_NAMES, '.git', '.hg'],
path.parse(entryRoot).root,
)) || path.join(inputCwd, 'index'); // ? Should this just be rootDir
*/

let projectRootFile =
LekoArts marked this conversation as resolved.
Show resolved Hide resolved
path.join(inputCwd, 'index') ||
(await resolveConfig(
inputFS,
path.join(entryRoot, 'index'),
[...LOCK_FILE_NAMES, '.git', '.hg'],
path.parse(entryRoot).root,
)); // ? Should this just be rootDir

let projectRoot = path.dirname(projectRootFile);

Expand Down
23 changes: 23 additions & 0 deletions packages/examples/dirname/package.json
@@ -0,0 +1,23 @@
{
"name": "@parcel/dirname",
"version": "2.2.1",
"license": "MIT",
"private": true,
"scripts": {
"build": "PARCEL_WORKERS=0 parcel build src/index.ts --no-source-maps --no-cache --no-optimize",
"clean-demo": "rm -rf .parcel-cache dist"
},
"devDependencies": {
"@parcel/babel-register": "^2.2.1",
"@parcel/core": "^2.2.1"
},
"@parcel/transformer-js": {
"relativeContext": true
},
"main": "dist/index.js",
"dependencies": {
"lodash": "^4.17.11",
"react": "^17.0.2",
"react-dom": "^17.0.2"
}
}
21 changes: 21 additions & 0 deletions packages/examples/dirname/src/index.ts
@@ -0,0 +1,21 @@
type Config = {
plugins: {
resolve: string
options: {
[key: string]: string
}
}[]
}

const config: Config = {
plugins: [
{
resolve: `name`,
options: {
path: `${__dirname}/data`
}
}
]
}

export default config
61 changes: 48 additions & 13 deletions packages/transformers/js/core/src/global_replacer.rs
Expand Up @@ -20,6 +20,7 @@ pub struct GlobalReplacer<'a> {
pub decls: &'a mut HashSet<(JsWord, SyntaxContext)>,
pub global_mark: swc_common::Mark,
pub scope_hoist: bool,
pub relative_context: bool,
}

impl<'a> Fold for GlobalReplacer<'a> {
Expand Down Expand Up @@ -136,27 +137,61 @@ impl<'a> Fold for GlobalReplacer<'a> {
}
"__dirname" => {
let dirname = if let Some(dirname) = self.filename.parent() {
if let Some(relative) = pathdiff::diff_paths(dirname, self.project_root) {
relative.to_slash_lossy()
if self.relative_context {
if let Some(relative) = pathdiff::diff_paths(self.project_root, dirname) {
relative.to_slash_lossy()
} else {
String::from("/")
}
} else {
String::from("/")
if let Some(relative) = pathdiff::diff_paths(dirname, self.project_root) {
relative.to_slash_lossy()
} else {
String::from("/")
}
}
} else {
String::from("/")
};

let ce = ast::CallExpr {
span: DUMMY_SP,
type_args: None,
args: vec![
ast::ExprOrSpread {
spread: None,
expr: Box::new(ast::Expr::Ident(ast::Ident {
optional: false,
span: DUMMY_SP,
sym: swc_atoms::JsWord::from("__dirname"),
})),
},
ast::ExprOrSpread {
spread: None,
expr: Box::new(ast::Expr::Lit(ast::Lit::Str(ast::Str {
has_escape: false,
span: DUMMY_SP,
kind: ast::StrKind::Synthesized,
value: swc_atoms::JsWord::from(dirname),
}))),
},
],
callee: ast::ExprOrSuper::Expr(Box::new(ast::Expr::Member(ast::MemberExpr {
span: DUMMY_SP,
computed: false,
obj: ast::ExprOrSuper::Expr(Box::new(ast::Expr::Ident(ast::Ident::new(
"path".into(),
DUMMY_SP,
)))),
prop: Box::new(ast::Expr::Ident(ast::Ident::new("join".into(), DUMMY_SP))),
}))),
};

let pathjoin = ast::Expr::Call(ce);

self.globals.insert(
id.sym.clone(),
create_decl_stmt(
id.sym.clone(),
self.global_mark,
ast::Expr::Lit(ast::Lit::Str(ast::Str {
span: DUMMY_SP,
value: swc_atoms::JsWord::from(dirname),
has_escape: false,
kind: ast::StrKind::Synthesized,
})),
),
create_decl_stmt(id.sym.clone(), self.global_mark, pathjoin),
);

self.decls.insert(id.to_id());
Expand Down
4 changes: 3 additions & 1 deletion packages/transformers/js/core/src/lib.rs
Expand Up @@ -66,6 +66,7 @@ pub struct Config {
env: HashMap<swc_atoms::JsWord, swc_atoms::JsWord>,
inline_fs: bool,
insert_node_globals: bool,
relative_context: bool,
is_browser: bool,
is_worker: bool,
is_type_script: bool,
Expand Down Expand Up @@ -367,7 +368,8 @@ pub fn transform(config: Config) -> Result<TransformResult, std::io::Error> {
filename: Path::new(&config.filename),
decls: &mut decls,
global_mark,
scope_hoist: config.scope_hoist
scope_hoist: config.scope_hoist,
relative_context: config.relative_context
},
config.insert_node_globals && config.source_type != SourceType::Script
),
Expand Down
8 changes: 8 additions & 0 deletions packages/transformers/js/src/JSTransformer.js
Expand Up @@ -85,6 +85,9 @@ const CONFIG_SCHEMA: SchemaEntity = {
inlineFS: {
type: 'boolean',
},
relativeContext: {
type: 'boolean',
},
inlineEnvironment: {
oneOf: [
{
Expand All @@ -106,6 +109,7 @@ type PackageJSONConfig = {|
'@parcel/transformer-js'?: {|
inlineFS?: boolean,
inlineEnvironment?: boolean | Array<string>,
relativeContext?: boolean,
|},
|};

Expand Down Expand Up @@ -248,6 +252,8 @@ export default (new Transformer({
let rootPkg = result?.contents;

let inlineEnvironment = config.isSource;
const relativeContext =
LekoArts marked this conversation as resolved.
Show resolved Hide resolved
pkg['@parcel/transformer-js']?.relativeContext ?? false;
let inlineFS = !ignoreFS;
if (result && rootPkg?.['@parcel/transformer-js']) {
validateSchema.diagnostic(
Expand Down Expand Up @@ -280,6 +286,7 @@ export default (new Transformer({
inlineFS,
reactRefresh,
decorators,
relativeContext,
};
},
async transform({asset, config, options, logger}) {
Expand Down Expand Up @@ -392,6 +399,7 @@ export default (new Transformer({
replace_env: !asset.env.isNode(),
inline_fs: Boolean(config?.inlineFS) && !asset.env.isNode(),
insert_node_globals: !asset.env.isNode(),
relative_context: Boolean(config?.relativeContext),
LekoArts marked this conversation as resolved.
Show resolved Hide resolved
is_browser: asset.env.isBrowser(),
is_worker: asset.env.isWorker(),
env,
Expand Down