Skip to content

Commit

Permalink
test(unpacker): add re-export case
Browse files Browse the repository at this point in the history
  • Loading branch information
pionxzh committed Apr 29, 2024
1 parent c4f7ae1 commit 4d33f4b
Show file tree
Hide file tree
Showing 10 changed files with 209 additions and 36 deletions.
58 changes: 48 additions & 10 deletions packages/unpacker/__tests__/__snapshots__/webpack5.spec.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,15 @@ export default /* binding */ m1;
}
}
class A_A {
constructor() {
this.label = "a_a";
}
}
/***/
export { /* binding */ A };
export { /* binding */ A_A };
",
"id": "./src/a.js",
"isEntry": false,
Expand Down Expand Up @@ -62,29 +69,60 @@ export { /* binding */ getC };
"id": "./src/c.js",
"isEntry": false,
},
{
"code": "/* harmony import */ var _a_js__WEBPACK_IMPORTED_MODULE_0__ = require(/*! ./a.js */ "./src/a.js");
// re-export
/***/
export const A = /* reexport safe */ _a_js__WEBPACK_IMPORTED_MODULE_0__.A;
export const A_A = /* reexport safe */ _a_js__WEBPACK_IMPORTED_MODULE_0__.A_A;
",
"id": "./src/d.js",
"isEntry": false,
},
{
"code": "/* harmony import */ var _a_js__WEBPACK_IMPORTED_MODULE_0__ = require(/*! ./a.js */ "./src/a.js");
// partial re-export
/***/
export const A = /* reexport safe */ _a_js__WEBPACK_IMPORTED_MODULE_0__.A;
",
"id": "./src/e.js",
"isEntry": false,
},
{
"code": "/*!**********************!*\\
!*** ./src/index.js ***!
\\**********************/
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _a_js__WEBPACK_IMPORTED_MODULE_0__ =
/* harmony import */ var _1_js__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(/*! ./1.js */ "./src/1.js");
/* harmony import */ var _a_js__WEBPACK_IMPORTED_MODULE_1__ =
__webpack_require__(/*! ./a.js */ "./src/a.js");
/* harmony import */ var _b_js__WEBPACK_IMPORTED_MODULE_1__ =
/* harmony import */ var _b_js__WEBPACK_IMPORTED_MODULE_2__ =
__webpack_require__(/*! ./b.js */ "./src/b.js");
/* harmony import */ var _c_js__WEBPACK_IMPORTED_MODULE_2__ =
/* harmony import */ var _c_js__WEBPACK_IMPORTED_MODULE_3__ =
__webpack_require__(/*! ./c.js */ "./src/c.js");
/* harmony import */ var _1_js__WEBPACK_IMPORTED_MODULE_3__ =
__webpack_require__(/*! ./1.js */ "./src/1.js");
/* harmony import */ var _d_js__WEBPACK_IMPORTED_MODULE_4__ =
__webpack_require__(/*! ./d.js */ "./src/d.js");
/* harmony import */ var _e_js__WEBPACK_IMPORTED_MODULE_5__ =
__webpack_require__(/*! ./e.js */ "./src/e.js");
const d = new _d_js__WEBPACK_IMPORTED_MODULE_4__.A();
const e = new _e_js__WEBPACK_IMPORTED_MODULE_5__.A();
console.log(
_b_js__WEBPACK_IMPORTED_MODULE_1__.version,
_a_js__WEBPACK_IMPORTED_MODULE_0__.A
_b_js__WEBPACK_IMPORTED_MODULE_2__.version,
_a_js__WEBPACK_IMPORTED_MODULE_1__.A,
d,
e
);
(0, _b_js__WEBPACK_IMPORTED_MODULE_1__["default"])();
(0, _c_js__WEBPACK_IMPORTED_MODULE_2__.getC)().then(console.log);
(0, _b_js__WEBPACK_IMPORTED_MODULE_2__["default"])();
(0, _c_js__WEBPACK_IMPORTED_MODULE_3__.getC)().then(console.log);
// const M1 = await import('./1.js')
(0, _1_js__WEBPACK_IMPORTED_MODULE_3__["default"])();
(0, _1_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
",
"id": "entry.js",
"isEntry": true,
Expand Down
2 changes: 1 addition & 1 deletion packages/unpacker/__tests__/webpack5.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ describe('Webpack 5', () => {

expect(result.moduleIdMapping).toMatchSnapshot()

expect(result.modules.length).toBe(5)
expect(result.modules.length).toBe(7)

const modules = result.modules.map(({ id, isEntry, code }) => ({ id, isEntry, code: format(code) }))
expect(modules).toMatchSnapshot()
Expand Down
12 changes: 8 additions & 4 deletions packages/unpacker/src/extractors/webpack/webpack5.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { getTopLevelStatements } from '@wakaru/ast-utils/program'
import { Module } from '../../Module'
import { convertRequireHelpersForWebpack5 } from './requireHelpers'
import type { ModuleMapping } from '@wakaru/ast-utils/types'
import type { ArrowFunctionExpression, Collection, FunctionExpression, JSCodeshift, ObjectProperty, Statement, StringLiteral, VariableDeclaration } from 'jscodeshift'
import type { ArrowFunctionExpression, CallExpression, Collection, ExpressionStatement, FunctionExpression, JSCodeshift, ObjectProperty, Statement, StringLiteral, UnaryExpression, VariableDeclaration } from 'jscodeshift'

/**
* Find the modules map in webpack 5 bootstrap.
Expand Down Expand Up @@ -46,11 +46,15 @@ export function getModulesForWebpack5(j: JSCodeshift, root: Collection):
const moduleIdMapping: ModuleMapping = {}

const statements = getTopLevelStatements(root)
const webpackBootstrap = statements.find(node => isStatementIIFE(j, node))
const webpackBootstrap = statements.find(node => isStatementIIFE(j, node)) as ExpressionStatement | undefined
if (!webpackBootstrap) return null

// @ts-expect-error - skip type check
const statementsInBootstrap: Statement[] = webpackBootstrap.expression.callee.body.body
const expression = webpackBootstrap.expression as CallExpression | UnaryExpression
const callExpression = (j.CallExpression.check(expression) ? expression : expression.argument) as CallExpression
const callee = callExpression.callee as FunctionExpression | ArrowFunctionExpression
if (!j.BlockStatement.check(callee.body)) return null

const statementsInBootstrap: Statement[] = callee.body.body
const webpackModules = statementsInBootstrap.find((node) => {
if (node.type !== 'VariableDeclaration') return false

Expand Down
69 changes: 60 additions & 9 deletions testcases/webpack5/dist/index.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion testcases/webpack5/dist/index.js.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 4d33f4b

Please sign in to comment.