Skip to content

Commit

Permalink
feat: Add TLA Support (#129)
Browse files Browse the repository at this point in the history
Co-authored-by: Steven <[email protected]>
  • Loading branch information
guybedford and styfle authored Apr 27, 2021
1 parent 3a644be commit f25168d
Show file tree
Hide file tree
Showing 5 changed files with 321 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/asset-relocator.js
Original file line number Diff line number Diff line change
Expand Up @@ -528,7 +528,7 @@ module.exports = async function (content, map) {
catch (e) {}
if (!ast) {
try {
ast = acorn.parse(code, { sourceType: 'module', ecmaVersion: 2020 });
ast = acorn.parse(code, { sourceType: 'module', ecmaVersion: 2020, allowAwaitOutsideFunction: true });
isESM = true;
}
catch (e) {
Expand Down
1 change: 1 addition & 0 deletions test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ for (const unitTest of fs.readdirSync(`${__dirname}/unit`)) {

const mfs = new MemoryFS();
const compiler = webpack({
experiments: { topLevelAwait: true },
entry,
optimization: { nodeEnv: false, minimize: false },
mode: "production",
Expand Down
3 changes: 3 additions & 0 deletions test/unit/tla/input.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default 5;
await test();

158 changes: 158 additions & 0 deletions test/unit/tla/output-coverage.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
/******/ (() => { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({

/***/ 430:
/***/ ((module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.a(module, async (__webpack_handle_async_dependencies__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (5);
await test();


__webpack_handle_async_dependencies__();
}, 1);

/***/ })

/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/async module */
/******/ (() => {
/******/ var webpackThen = typeof Symbol === "function" ? Symbol("webpack then") : "__webpack_then__";
/******/ var webpackExports = typeof Symbol === "function" ? Symbol("webpack exports") : "__webpack_exports__";
/******/ var completeQueue = (queue) => {
/******/ if(queue) {
/******/ queue.forEach((fn) => (fn.r--));
/******/ queue.forEach((fn) => (fn.r-- ? fn.r++ : fn()));
/******/ }
/******/ }
/******/ var completeFunction = (fn) => (!--fn.r && fn());
/******/ var queueFunction = (queue, fn) => (queue ? queue.push(fn) : completeFunction(fn));
/******/ var wrapDeps = (deps) => (deps.map((dep) => {
/******/ if(dep !== null && typeof dep === "object") {
/******/ if(dep[webpackThen]) return dep;
/******/ if(dep.then) {
/******/ var queue = [];
/******/ dep.then((r) => {
/******/ obj[webpackExports] = r;
/******/ completeQueue(queue);
/******/ queue = 0;
/******/ });
/******/ var obj = { [webpackThen]: (fn, reject) => (queueFunction(queue, fn), dep.catch(reject)) };
/******/ return obj;
/******/ }
/******/ }
/******/ return { [webpackThen]: (fn) => (completeFunction(fn)), [webpackExports]: dep };
/******/ }));
/******/ __webpack_require__.a = (module, body, hasAwait) => {
/******/ var queue = hasAwait && [];
/******/ var exports = module.exports;
/******/ var currentDeps;
/******/ var outerResolve;
/******/ var reject;
/******/ var isEvaluating = true;
/******/ var nested = false;
/******/ var whenAll = (deps, onResolve, onReject) => {
/******/ if (nested) return;
/******/ nested = true;
/******/ onResolve.r += deps.length;
/******/ deps.map((dep, i) => (dep[webpackThen](onResolve, onReject)));
/******/ nested = false;
/******/ };
/******/ var promise = new Promise((resolve, rej) => {
/******/ reject = rej;
/******/ outerResolve = () => (resolve(exports), completeQueue(queue), queue = 0);
/******/ });
/******/ promise[webpackExports] = exports;
/******/ promise[webpackThen] = (fn, rejectFn) => {
/******/ if (isEvaluating) { return completeFunction(fn); }
/******/ if (currentDeps) whenAll(currentDeps, fn, rejectFn);
/******/ queueFunction(queue, fn);
/******/ promise.catch(rejectFn);
/******/ };
/******/ module.exports = promise;
/******/ body((deps) => {
/******/ if(!deps) return outerResolve();
/******/ currentDeps = wrapDeps(deps);
/******/ var fn, result;
/******/ var promise = new Promise((resolve, reject) => {
/******/ fn = () => (resolve(result = currentDeps.map((d) => (d[webpackExports]))));
/******/ fn.r = 0;
/******/ whenAll(currentDeps, fn, reject);
/******/ });
/******/ return fn.r ? promise : result;
/******/ }).then(outerResolve, reject);
/******/ isEvaluating = false;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/compat */
/******/
/******/ if (typeof __webpack_require__ !== 'undefined') __webpack_require__.ab = __dirname + "/";/************************************************************************/
/******/
/******/ // startup
/******/ // Load entry module and return exports
/******/ // This entry module used 'module' so it can't be inlined
/******/ var __webpack_exports__ = __webpack_require__(430);
/******/ module.exports = __webpack_exports__;
/******/
/******/ })()
;
158 changes: 158 additions & 0 deletions test/unit/tla/output.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
/******/ (() => { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({

/***/ 34:
/***/ ((module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.a(module, async (__webpack_handle_async_dependencies__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (5);
await test();


__webpack_handle_async_dependencies__();
}, 1);

/***/ })

/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/async module */
/******/ (() => {
/******/ var webpackThen = typeof Symbol === "function" ? Symbol("webpack then") : "__webpack_then__";
/******/ var webpackExports = typeof Symbol === "function" ? Symbol("webpack exports") : "__webpack_exports__";
/******/ var completeQueue = (queue) => {
/******/ if(queue) {
/******/ queue.forEach((fn) => (fn.r--));
/******/ queue.forEach((fn) => (fn.r-- ? fn.r++ : fn()));
/******/ }
/******/ }
/******/ var completeFunction = (fn) => (!--fn.r && fn());
/******/ var queueFunction = (queue, fn) => (queue ? queue.push(fn) : completeFunction(fn));
/******/ var wrapDeps = (deps) => (deps.map((dep) => {
/******/ if(dep !== null && typeof dep === "object") {
/******/ if(dep[webpackThen]) return dep;
/******/ if(dep.then) {
/******/ var queue = [];
/******/ dep.then((r) => {
/******/ obj[webpackExports] = r;
/******/ completeQueue(queue);
/******/ queue = 0;
/******/ });
/******/ var obj = { [webpackThen]: (fn, reject) => (queueFunction(queue, fn), dep.catch(reject)) };
/******/ return obj;
/******/ }
/******/ }
/******/ return { [webpackThen]: (fn) => (completeFunction(fn)), [webpackExports]: dep };
/******/ }));
/******/ __webpack_require__.a = (module, body, hasAwait) => {
/******/ var queue = hasAwait && [];
/******/ var exports = module.exports;
/******/ var currentDeps;
/******/ var outerResolve;
/******/ var reject;
/******/ var isEvaluating = true;
/******/ var nested = false;
/******/ var whenAll = (deps, onResolve, onReject) => {
/******/ if (nested) return;
/******/ nested = true;
/******/ onResolve.r += deps.length;
/******/ deps.map((dep, i) => (dep[webpackThen](onResolve, onReject)));
/******/ nested = false;
/******/ };
/******/ var promise = new Promise((resolve, rej) => {
/******/ reject = rej;
/******/ outerResolve = () => (resolve(exports), completeQueue(queue), queue = 0);
/******/ });
/******/ promise[webpackExports] = exports;
/******/ promise[webpackThen] = (fn, rejectFn) => {
/******/ if (isEvaluating) { return completeFunction(fn); }
/******/ if (currentDeps) whenAll(currentDeps, fn, rejectFn);
/******/ queueFunction(queue, fn);
/******/ promise.catch(rejectFn);
/******/ };
/******/ module.exports = promise;
/******/ body((deps) => {
/******/ if(!deps) return outerResolve();
/******/ currentDeps = wrapDeps(deps);
/******/ var fn, result;
/******/ var promise = new Promise((resolve, reject) => {
/******/ fn = () => (resolve(result = currentDeps.map((d) => (d[webpackExports]))));
/******/ fn.r = 0;
/******/ whenAll(currentDeps, fn, reject);
/******/ });
/******/ return fn.r ? promise : result;
/******/ }).then(outerResolve, reject);
/******/ isEvaluating = false;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/compat */
/******/
/******/ if (typeof __webpack_require__ !== 'undefined') __webpack_require__.ab = __dirname + "/";/************************************************************************/
/******/
/******/ // startup
/******/ // Load entry module and return exports
/******/ // This entry module used 'module' so it can't be inlined
/******/ var __webpack_exports__ = __webpack_require__(34);
/******/ module.exports = __webpack_exports__;
/******/
/******/ })()
;

0 comments on commit f25168d

Please sign in to comment.