Parse the ESM dependencies of code snippets based on acorn
npm install parse-es-importInspired by parse-static-imports,
and have the same return result as it, and can run both on browser/node sides because it is based on acron.
Will properly parse:
- Default import. e.g. import utils from 'utils';
- Star imports. e.g. import * as utils from 'utils';
- Named imports. e.g. import { Foo as MyFoo } from 'utils';
- Side effect only imports, e.g. import './App.css';
- Multi-line imports, like
``jsx`
import React, { useState, useCallback, useEffect } from 'react';
`sh`
npm install --save parse-es-import
`js
import fs from 'fs';
import parse from 'parse-es-import';
const file = fs.readFileSync('./path/to/file.js', 'utf8');
const results = parse(file);
console.log(JSON.stringify(results, null, 2));
`
- content: String - Contents of code to parse.options
- : Object - Receive all parameters of acorn.parse. Its default value is { ecmaVersion: 2021, sourceType: 'module' }.
`json`
{
"imports": {},
"exports": {}
}
#### imports
| Attribute | Type | Default Value | Description |
| -------------- | ---------- | ------------- | ----------------------------------------------------------------------- |
| moduleName | String | '' | The name of the module imported or a relative path (e.g. 'react-dom') |String
| starImport | | '' | The name of the star imported module object, if present |Object[]
| namedImports | | [] | List of named imports as a list of objects |String
| defaultImport | | '' | The name of the default import, if present |Boolean
| sideEffectOnly | | false | If the import was side-effect only (e.g. import './App.css';) |Number
| startIndex | | 0 | Index of the starting character of the import statement |Number
| endIndex | | 0 | Index of the ending character + 1 of the import statement |
Named import objects have the form:
| Attribute | Type | Default Value | Description |
| --------- | -------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| name | String | '' | The name of the named import (e.g. { useState }) |String
| alias | | name | Will be the alias of a named import if aliased, otherwise defaults to the named import (e.g. import { foo / the named import / as bar / the alias / } from 'module-name';) |
#### exports
| Attribute | Type | Default Value | Description |
| ---------- |-----------------------|---------------|----------------------------------------------------------------------|
| moduleName | String | '' | The name of the module exported |String
| type | | '' | The type of module exported |String
| value | | '' | The value of module exported or a relative path (e.g. '../add.js') |Number
| startIndex | | 0 | Index of the starting character of the export statement |Number
| endIndex | | 0 | Index of the ending character + 1 of the export statement |String
| identifierList | | null | The identifiers exported by this file |Record
| identifierTree | | null | The identifier tree exported by this file |
Content to parse:
`jsx
import React from 'react';
import antd, { Button as AntButton, Alert } from 'antd';
import * as Hello from 'hello';
import 'xx.less';
export function Demo () {
return
// this identifier is exported by obj
const A = 'A';
export const obj = { A: A };
`
The parse result will be:
`json``
{
"imports": [
{
"moduleName": "react",
"starImport": "",
"defaultImport": "React",
"namedImports": [],
"sideEffectOnly": false,
"startIndex": 1,
"endIndex": 27
},
{
"moduleName": "antd",
"starImport": "",
"defaultImport": "antd",
"namedImports": [
{
"name": "Button",
"alias": "AntButton"
},
{
"name": "Alert",
"alias": "Alert"
}
],
"sideEffectOnly": false,
"startIndex": 28,
"endIndex": 84
},
{
"moduleName": "hello",
"starImport": "Hello",
"defaultImport": "",
"namedImports": [],
"sideEffectOnly": false,
"startIndex": 85,
"endIndex": 116
},
{
"moduleName": "xx.less",
"starImport": "",
"defaultImport": "",
"namedImports": [],
"sideEffectOnly": true,
"startIndex": 118,
"endIndex": 135
}
],
"exports": [
{
"type": "FunctionDeclaration",
"moduleName": "Demo",
"value": "function Demo () {\n return Hello World...;\n}",
"startIndex": 137,
"endIndex": 200
},
{
"type": "VariableDeclaration",
"moduleName": "obj",
"value": "{ A: A }",
"identifierList": [
"A"
],
"identifierTree": {
"A": "A"
},
"startIndex": 256,
"endIndex": 284
}
]
}