Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions napi/parser/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,14 @@ export interface Comment {
}

export interface EcmaScriptModule {
/**
* Has ESM syntax.
*
* i.e. `import` and `export` statements, and `import.meta`.
*
* Dynamic imports `import('foo')` are ignored since they can be used in non-ESM files.
*/
hasModuleSyntax: boolean
/** Import Statements. */
staticImports: Array<StaticImport>
/** Export Statements. */
Expand Down
2 changes: 1 addition & 1 deletion napi/parser/src/convert.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ impl From<&ModuleRecord<'_>> for EcmaScriptModule {
.collect::<Vec<_>>();
static_exports.sort_unstable_by_key(|e| e.start);

Self { static_imports, static_exports }
Self { has_module_syntax: record.has_module_syntax, static_imports, static_exports }
}
}

Expand Down
6 changes: 6 additions & 0 deletions napi/parser/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,12 @@ pub struct Comment {

#[napi(object)]
pub struct EcmaScriptModule {
/// Has ESM syntax.
///
/// i.e. `import` and `export` statements, and `import.meta`.
///
/// Dynamic imports `import('foo')` are ignored since they can be used in non-ESM files.
pub has_module_syntax: bool,
/// Import Statements.
pub static_imports: Vec<StaticImport>,
/// Export Statements.
Expand Down
35 changes: 35 additions & 0 deletions napi/parser/test/__snapshots__/esm.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

exports[`esm > export * as name1 from "module-name"; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -37,6 +38,7 @@ exports[`esm > export * as name1 from "module-name"; 1`] = `

exports[`esm > export * from "module-name"; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -69,6 +71,7 @@ exports[`esm > export * from "module-name"; 1`] = `

exports[`esm > export { default as name1 } from "module-name"; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -107,6 +110,7 @@ exports[`esm > export { default as name1 } from "module-name"; 1`] = `

exports[`esm > export { default, /* …, */ } from "module-name"; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -145,6 +149,7 @@ exports[`esm > export { default, /* …, */ } from "module-name"; 1`] = `

exports[`esm > export { import1 as name1, import2 as name2, /* …, */ nameN } from "module-name"; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -231,6 +236,7 @@ exports[`esm > export { import1 as name1, import2 as name2, /* …, */ nameN } f

exports[`esm > export { name1 as default /*, … */ }; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -264,6 +270,7 @@ exports[`esm > export { name1 as default /*, … */ }; 1`] = `

exports[`esm > export { name1, /* …, */ nameN } from "module-name"; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -326,6 +333,7 @@ exports[`esm > export { name1, /* …, */ nameN } from "module-name"; 1`] = `

exports[`esm > export { name1, /* …, */ nameN }; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -378,6 +386,7 @@ exports[`esm > export { name1, /* …, */ nameN }; 1`] = `

exports[`esm > export { variable1 as "string name" }; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -411,6 +420,7 @@ exports[`esm > export { variable1 as "string name" }; 1`] = `

exports[`esm > export { variable1 as name1, variable2 as name2, /* …, */ nameN }; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -482,6 +492,7 @@ exports[`esm > export { variable1 as name1, variable2 as name2, /* …, */ nameN

exports[`esm > export class ClassName { /* … */ } 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -515,6 +526,7 @@ exports[`esm > export class ClassName { /* … */ } 1`] = `

exports[`esm > export const [ name1, name2 ] = array; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -567,6 +579,7 @@ exports[`esm > export const [ name1, name2 ] = array; 1`] = `

exports[`esm > export const { name1, name2: bar } = o; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -619,6 +632,7 @@ exports[`esm > export const { name1, name2: bar } = o; 1`] = `

exports[`esm > export const name1 = 1, name2 = 2/*, … */; // also var, let 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -671,6 +685,7 @@ exports[`esm > export const name1 = 1, name2 = 2/*, … */; // also var, let 1`]

exports[`esm > export default class { /* … */ } 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -700,6 +715,7 @@ exports[`esm > export default class { /* … */ } 1`] = `

exports[`esm > export default class ClassName { /* … */ } 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -732,6 +748,7 @@ exports[`esm > export default class ClassName { /* … */ } 1`] = `

exports[`esm > export default expression; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -764,6 +781,7 @@ exports[`esm > export default expression; 1`] = `

exports[`esm > export default function () { /* … */ } 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -793,6 +811,7 @@ exports[`esm > export default function () { /* … */ } 1`] = `

exports[`esm > export default function functionName() { /* … */ } 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -825,6 +844,7 @@ exports[`esm > export default function functionName() { /* … */ } 1`] = `

exports[`esm > export default function* () { /* … */ } 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -854,6 +874,7 @@ exports[`esm > export default function* () { /* … */ } 1`] = `

exports[`esm > export default function* generatorFunctionName() { /* … */ } 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -886,6 +907,7 @@ exports[`esm > export default function* generatorFunctionName() { /* … */ } 1`

exports[`esm > export function functionName() { /* … */ } 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -919,6 +941,7 @@ exports[`esm > export function functionName() { /* … */ } 1`] = `

exports[`esm > export function* generatorFunctionName() { /* … */ } 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -952,6 +975,7 @@ exports[`esm > export function* generatorFunctionName() { /* … */ } 1`] = `

exports[`esm > export let name1, name2/*, … */; // also var 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [],
"staticExports": [
{
Expand Down Expand Up @@ -1004,6 +1028,7 @@ exports[`esm > export let name1, name2/*, … */; // also var 1`] = `

exports[`esm > import "module-name"; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [
{
"start": 0,
Expand All @@ -1022,6 +1047,7 @@ exports[`esm > import "module-name"; 1`] = `

exports[`esm > import * as name from "module-name"; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [
{
"start": 0,
Expand Down Expand Up @@ -1052,6 +1078,7 @@ exports[`esm > import * as name from "module-name"; 1`] = `

exports[`esm > import { "string name" as alias } from "module-name"; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [
{
"start": 0,
Expand Down Expand Up @@ -1085,6 +1112,7 @@ exports[`esm > import { "string name" as alias } from "module-name"; 1`] = `

exports[`esm > import { default as alias } from "module-name"; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [
{
"start": 0,
Expand Down Expand Up @@ -1118,6 +1146,7 @@ exports[`esm > import { default as alias } from "module-name"; 1`] = `

exports[`esm > import { export1 } from "module-name"; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [
{
"start": 0,
Expand Down Expand Up @@ -1151,6 +1180,7 @@ exports[`esm > import { export1 } from "module-name"; 1`] = `

exports[`esm > import { export1 as alias1 } from "module-name"; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [
{
"start": 0,
Expand Down Expand Up @@ -1184,6 +1214,7 @@ exports[`esm > import { export1 as alias1 } from "module-name"; 1`] = `

exports[`esm > import { export1, export2 } from "module-name"; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [
{
"start": 0,
Expand Down Expand Up @@ -1231,6 +1262,7 @@ exports[`esm > import { export1, export2 } from "module-name"; 1`] = `

exports[`esm > import { export1, export2 as alias2, /* … */ } from "module-name"; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [
{
"start": 0,
Expand Down Expand Up @@ -1278,6 +1310,7 @@ exports[`esm > import { export1, export2 as alias2, /* … */ } from "module-nam

exports[`esm > import defaultExport from "module-name"; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [
{
"start": 0,
Expand Down Expand Up @@ -1310,6 +1343,7 @@ exports[`esm > import defaultExport from "module-name"; 1`] = `

exports[`esm > import defaultExport, * as name from "module-name"; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [
{
"start": 0,
Expand Down Expand Up @@ -1353,6 +1387,7 @@ exports[`esm > import defaultExport, * as name from "module-name"; 1`] = `

exports[`esm > import defaultExport, { export1, /* … */ } from "module-name"; 1`] = `
"{
"hasModuleSyntax": true,
"staticImports": [
{
"start": 0,
Expand Down
18 changes: 18 additions & 0 deletions napi/parser/test/esm.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ export { default as name1 } from "module-name";
expect(ret.program.body.length).toBeGreaterThan(0);
expect(ret.errors.length).toBe(0);
expect(JSON.stringify(ret.module, null, 2)).toMatchSnapshot();
expect(ret.module.hasModuleSyntax).toBe(true);
if (s.startsWith('import')) {
expect(ret.module.staticImports.length).toBe(1);
expect(ret.module.staticExports.length).toBe(0);
Expand All @@ -62,3 +63,20 @@ export { default as name1 } from "module-name";
}
});
});

describe('hasModuleSyntax', () => {
test('import.meta', () => {
const ret = parseSync('test.js', 'import.meta.foo');
expect(ret.module.hasModuleSyntax).toBe(true);
});

test('import expression', () => {
const ret = parseSync('test.js', "import('foo')");
expect(ret.module.hasModuleSyntax).toBe(false);
});

test('script', () => {
const ret = parseSync('test.js', "require('foo')");
expect(ret.module.hasModuleSyntax).toBe(false);
});
});