mirror of
https://github.com/swc-project/swc.git
synced 2024-12-25 06:36:08 +03:00
feat(es/modules): Support AMD triple slash directives (#5091)
This commit is contained in:
parent
04c4af8475
commit
ddb31d1fd7
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -3652,6 +3652,7 @@ dependencies = [
|
||||
"is-macro",
|
||||
"path-clean",
|
||||
"pathdiff",
|
||||
"regex",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"swc_atoms",
|
||||
|
@ -33,6 +33,7 @@ swc_ecma_parser = { version = "0.108.0", path = "../swc_ecma_parser" }
|
||||
swc_ecma_transforms_base = { version = "0.94.0", path = "../swc_ecma_transforms_base" }
|
||||
swc_ecma_utils = { version = "0.90.0", path = "../swc_ecma_utils" }
|
||||
swc_ecma_visit = { version = "0.67.0", path = "../swc_ecma_visit" }
|
||||
regex = "1"
|
||||
tracing = "0.1.32"
|
||||
|
||||
[dev-dependencies]
|
||||
|
@ -1,7 +1,12 @@
|
||||
use anyhow::Context;
|
||||
use regex::Regex;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use swc_atoms::{js_word, JsWord};
|
||||
use swc_common::{comments::Comments, util::take::Take, FileName, Mark, Span, DUMMY_SP};
|
||||
use swc_common::{
|
||||
comments::{CommentKind, Comments},
|
||||
util::take::Take,
|
||||
FileName, Mark, Span, Spanned, DUMMY_SP,
|
||||
};
|
||||
use swc_ecma_ast::*;
|
||||
use swc_ecma_transforms_base::{feature::FeatureFlag, helper_expr};
|
||||
use swc_ecma_utils::{
|
||||
@ -128,6 +133,12 @@ where
|
||||
noop_visit_mut_type!();
|
||||
|
||||
fn visit_mut_module_items(&mut self, n: &mut Vec<ModuleItem>) {
|
||||
if let Some(first) = n.first() {
|
||||
if self.module_id.is_none() {
|
||||
self.module_id = self.get_amd_module_id_from_comments(first.span());
|
||||
}
|
||||
}
|
||||
|
||||
let import_interop = self.config.import_interop();
|
||||
|
||||
let mut strip = ModuleDeclStrip::default();
|
||||
@ -463,6 +474,31 @@ where
|
||||
}
|
||||
span
|
||||
}
|
||||
|
||||
fn get_amd_module_id_from_comments(&self, span: Span) -> Option<String> {
|
||||
// https://github.com/microsoft/TypeScript/blob/1b9c8a15adc3c9a30e017a7048f98ef5acc0cada/src/compiler/parser.ts#L9648-L9658
|
||||
let amd_module_re = Regex::new(
|
||||
r##"(?i)^/\s*<amd-module.*?name\s*=\s*(?:(?:'([^']*)')|(?:"([^"]*)")).*?/>"##,
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
self.comments.as_ref().and_then(|comments| {
|
||||
comments
|
||||
.get_leading(span.lo)
|
||||
.iter()
|
||||
.flatten()
|
||||
.rev()
|
||||
.find_map(|cmt| {
|
||||
if cmt.kind != CommentKind::Line {
|
||||
return None;
|
||||
}
|
||||
amd_module_re
|
||||
.captures(&cmt.text)
|
||||
.and_then(|cap| cap.get(1).or_else(|| cap.get(2)))
|
||||
})
|
||||
.map(|m| m.as_str().to_string())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/// new Promise((resolve, reject) => require([arg], m => resolve(m), reject))
|
||||
|
@ -0,0 +1,8 @@
|
||||
///<amd-module name='NamedModule'/>
|
||||
class Foo {
|
||||
x: number;
|
||||
constructor() {
|
||||
this.x = 5;
|
||||
}
|
||||
}
|
||||
export = Foo;
|
@ -0,0 +1,13 @@
|
||||
define("NamedModule", [
|
||||
"require"
|
||||
], function(require) {
|
||||
"use strict";
|
||||
///<amd-module name='NamedModule'/>
|
||||
class Foo {
|
||||
x: number;
|
||||
constructor(){
|
||||
this.x = 5;
|
||||
}
|
||||
}
|
||||
return Foo;
|
||||
});
|
@ -0,0 +1,9 @@
|
||||
"use strict";
|
||||
///<amd-module name='NamedModule'/>
|
||||
class Foo {
|
||||
x: number;
|
||||
constructor(){
|
||||
this.x = 5;
|
||||
}
|
||||
}
|
||||
module.exports = Foo;
|
@ -0,0 +1,15 @@
|
||||
(function(global, factory) {
|
||||
if (typeof module === "object" && typeof module.exports === "object") module.exports = factory();
|
||||
else if (typeof define === "function" && define.amd) define([], factory);
|
||||
else if (global = typeof globalThis !== "undefined" ? globalThis : global || self) module.exports = factory();
|
||||
})(this, function() {
|
||||
"use strict";
|
||||
///<amd-module name='NamedModule'/>
|
||||
class Foo {
|
||||
x: number;
|
||||
constructor(){
|
||||
this.x = 5;
|
||||
}
|
||||
}
|
||||
return Foo;
|
||||
});
|
@ -0,0 +1,9 @@
|
||||
///<amd-module name='FirstModuleName'/>
|
||||
///<amd-module name='SecondModuleName'/>
|
||||
class Foo {
|
||||
x: number;
|
||||
constructor() {
|
||||
this.x = 5;
|
||||
}
|
||||
}
|
||||
export = Foo;
|
@ -0,0 +1,14 @@
|
||||
define("SecondModuleName", [
|
||||
"require"
|
||||
], function(require) {
|
||||
"use strict";
|
||||
///<amd-module name='FirstModuleName'/>
|
||||
///<amd-module name='SecondModuleName'/>
|
||||
class Foo {
|
||||
x: number;
|
||||
constructor(){
|
||||
this.x = 5;
|
||||
}
|
||||
}
|
||||
return Foo;
|
||||
});
|
@ -0,0 +1,10 @@
|
||||
"use strict";
|
||||
///<amd-module name='FirstModuleName'/>
|
||||
///<amd-module name='SecondModuleName'/>
|
||||
class Foo {
|
||||
x: number;
|
||||
constructor(){
|
||||
this.x = 5;
|
||||
}
|
||||
}
|
||||
module.exports = Foo;
|
@ -0,0 +1,16 @@
|
||||
(function(global, factory) {
|
||||
if (typeof module === "object" && typeof module.exports === "object") module.exports = factory();
|
||||
else if (typeof define === "function" && define.amd) define([], factory);
|
||||
else if (global = typeof globalThis !== "undefined" ? globalThis : global || self) module.exports = factory();
|
||||
})(this, function() {
|
||||
"use strict";
|
||||
///<amd-module name='FirstModuleName'/>
|
||||
///<amd-module name='SecondModuleName'/>
|
||||
class Foo {
|
||||
x: number;
|
||||
constructor(){
|
||||
this.x = 5;
|
||||
}
|
||||
}
|
||||
return Foo;
|
||||
});
|
@ -0,0 +1,8 @@
|
||||
///<AmD-moDulE nAme='NamedModule'/>
|
||||
class Foo {
|
||||
x: number;
|
||||
constructor() {
|
||||
this.x = 5;
|
||||
}
|
||||
}
|
||||
export = Foo;
|
@ -0,0 +1,13 @@
|
||||
define("NamedModule", [
|
||||
"require"
|
||||
], function(require) {
|
||||
"use strict";
|
||||
///<AmD-moDulE nAme='NamedModule'/>
|
||||
class Foo {
|
||||
x: number;
|
||||
constructor(){
|
||||
this.x = 5;
|
||||
}
|
||||
}
|
||||
return Foo;
|
||||
});
|
@ -0,0 +1,9 @@
|
||||
"use strict";
|
||||
///<AmD-moDulE nAme='NamedModule'/>
|
||||
class Foo {
|
||||
x: number;
|
||||
constructor(){
|
||||
this.x = 5;
|
||||
}
|
||||
}
|
||||
module.exports = Foo;
|
@ -0,0 +1,15 @@
|
||||
(function(global, factory) {
|
||||
if (typeof module === "object" && typeof module.exports === "object") module.exports = factory();
|
||||
else if (typeof define === "function" && define.amd) define([], factory);
|
||||
else if (global = typeof globalThis !== "undefined" ? globalThis : global || self) module.exports = factory();
|
||||
})(this, function() {
|
||||
"use strict";
|
||||
///<AmD-moDulE nAme='NamedModule'/>
|
||||
class Foo {
|
||||
x: number;
|
||||
constructor(){
|
||||
this.x = 5;
|
||||
}
|
||||
}
|
||||
return Foo;
|
||||
});
|
@ -0,0 +1,8 @@
|
||||
/*/<amd-module name='should-ignore'/> */
|
||||
class Foo {
|
||||
x: number;
|
||||
constructor() {
|
||||
this.x = 5;
|
||||
}
|
||||
}
|
||||
export = Foo;
|
@ -0,0 +1,12 @@
|
||||
define([
|
||||
"require"
|
||||
], function(require) {
|
||||
"use strict";
|
||||
/*/<amd-module name='should-ignore'/> */ class Foo {
|
||||
x: number;
|
||||
constructor(){
|
||||
this.x = 5;
|
||||
}
|
||||
}
|
||||
return Foo;
|
||||
});
|
@ -0,0 +1,8 @@
|
||||
"use strict";
|
||||
/*/<amd-module name='should-ignore'/> */ class Foo {
|
||||
x: number;
|
||||
constructor(){
|
||||
this.x = 5;
|
||||
}
|
||||
}
|
||||
module.exports = Foo;
|
@ -0,0 +1,14 @@
|
||||
(function(global, factory) {
|
||||
if (typeof module === "object" && typeof module.exports === "object") module.exports = factory();
|
||||
else if (typeof define === "function" && define.amd) define([], factory);
|
||||
else if (global = typeof globalThis !== "undefined" ? globalThis : global || self) module.exports = factory();
|
||||
})(this, function() {
|
||||
"use strict";
|
||||
/*/<amd-module name='should-ignore'/> */ class Foo {
|
||||
x: number;
|
||||
constructor(){
|
||||
this.x = 5;
|
||||
}
|
||||
}
|
||||
return Foo;
|
||||
});
|
Loading…
Reference in New Issue
Block a user