From a01cd04cfe2f1c9c1955aa22d6733e0d6eb33ef3 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Mon, 6 Feb 2017 15:01:17 -0500 Subject: [PATCH 001/195] Polyfill Meteor._localStorage on the server too. Although Meteor._localStorage has historically been used only in browsers, it can be helpful on the server for writing isomorphic code. --- packages/localstorage/localstorage.js | 58 +++++++++++---------------- packages/localstorage/package.js | 12 +++--- 2 files changed, 29 insertions(+), 41 deletions(-) diff --git a/packages/localstorage/localstorage.js b/packages/localstorage/localstorage.js index fb72c0bf59..4eb5719830 100644 --- a/packages/localstorage/localstorage.js +++ b/packages/localstorage/localstorage.js @@ -5,52 +5,42 @@ // trying to use it throws. // Accessing window.localStorage can also immediately throw an error in IE (#1291). +var hasOwn = Object.prototype.hasOwnProperty; +var storage = global.localStorage; var key = '_localstorage_test_' + Random.id(); var retrieved; + try { - if (window.localStorage) { - window.localStorage.setItem(key, key); - retrieved = window.localStorage.getItem(key); - window.localStorage.removeItem(key); + if (storage) { + storage.setItem(key, key); + retrieved = storage.getItem(key); + storage.removeItem(key); } -} catch (e) { - // ... ignore -} +} catch (ignored) {} + if (key === retrieved) { - Meteor._localStorage = { - getItem: function (key) { - return window.localStorage.getItem(key); - }, - setItem: function (key, value) { - window.localStorage.setItem(key, value); - }, - removeItem: function (key) { - window.localStorage.removeItem(key); - } - }; + Meteor._localStorage = storage; } -if (!Meteor._localStorage) { - Meteor._debug( - "You are running a browser with no localStorage or userData " - + "support. Logging in from one tab will not cause another " - + "tab to be logged in."); - - Meteor._localStorage = { - _data: {}, +if (! Meteor._localStorage) { + if (Meteor.isClient) { + Meteor._debug( + "You are running a browser with no localStorage or userData " + + "support. Logging in from one tab will not cause another " + + "tab to be logged in."); + } + Meteor._localStorage = Object.create({ setItem: function (key, val) { - this._data[key] = val; + this[key] = val; }, + removeItem: function (key) { - delete this._data[key]; + delete this[key]; }, + getItem: function (key) { - var value = this._data[key]; - if (value === undefined) - return null; - else - return value; + return hasOwn.call(this, key) ? this[key] : null; } - }; + }); } diff --git a/packages/localstorage/package.js b/packages/localstorage/package.js index 3b4cc80c50..744d9eee5f 100644 --- a/packages/localstorage/package.js +++ b/packages/localstorage/package.js @@ -1,17 +1,15 @@ Package.describe({ summary: "Simulates local storage on IE 6,7 using userData", - version: "1.0.12" + version: "1.1.0" }); Package.onUse(function (api) { - api.use('random', 'client'); - - api.addFiles('localstorage.js', 'client'); + api.use('random'); + api.addFiles('localstorage.js'); }); Package.onTest(function (api) { - api.use('localstorage', 'client'); + api.use('localstorage'); api.use('tinytest'); - - api.addFiles('localstorage_tests.js', 'client'); + api.addFiles('localstorage_tests.js'); }); From 960ad2266bfb1e34d17cd09154ed764acdf3e133 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Thu, 2 Feb 2017 18:10:58 -0500 Subject: [PATCH 002/195] Refactor modules-runtime into multiple files. --- packages/modules-runtime/client.js | 5 ++ packages/modules-runtime/modules-runtime.js | 86 --------------------- packages/modules-runtime/options.js | 10 +++ packages/modules-runtime/package.js | 5 +- packages/modules-runtime/server.js | 67 ++++++++++++++++ 5 files changed, 86 insertions(+), 87 deletions(-) create mode 100644 packages/modules-runtime/client.js delete mode 100644 packages/modules-runtime/modules-runtime.js create mode 100644 packages/modules-runtime/options.js create mode 100644 packages/modules-runtime/server.js diff --git a/packages/modules-runtime/client.js b/packages/modules-runtime/client.js new file mode 100644 index 0000000000..d902671864 --- /dev/null +++ b/packages/modules-runtime/client.js @@ -0,0 +1,5 @@ +// On the client, make package resolution prefer the "browser" field of +// package.json files to the "main" field. +makeInstallerOptions.browser = true; + +meteorInstall = makeInstaller(makeInstallerOptions); diff --git a/packages/modules-runtime/modules-runtime.js b/packages/modules-runtime/modules-runtime.js deleted file mode 100644 index da38e75648..0000000000 --- a/packages/modules-runtime/modules-runtime.js +++ /dev/null @@ -1,86 +0,0 @@ -var options = {}; -var hasOwn = options.hasOwnProperty; - -// RegExp matching strings that don't start with a `.` or a `/`. -var topLevelIdPattern = /^[^./]/; - -if (typeof Profile === "function" && - process.env.METEOR_PROFILE) { - options.wrapRequire = function (require) { - return Profile(function (id) { - return "require(" + JSON.stringify(id) + ")"; - }, require); - }; -} - -// On the client, make package resolution prefer the "browser" field of -// package.json files to the "main" field. -options.browser = Meteor.isClient; - -// This function will be called whenever a module identifier that hasn't -// been installed is required. For backwards compatibility, and so that we -// can require binary dependencies on the server, we implement the -// fallback in terms of Npm.require. -options.fallback = function (id, parentId, error) { - // For simplicity, we honor only top-level module identifiers here. - // We could try to honor relative and absolute module identifiers by - // somehow combining `id` with `dir`, but we'd have to be really careful - // that the resulting modules were located in a known directory (not - // some arbitrary location on the file system), and we only really need - // the fallback for dependencies installed in node_modules directories. - if (topLevelIdPattern.test(id)) { - if (typeof Npm === "object" && - typeof Npm.require === "function") { - return Npm.require(id); - } - } - - throw error; -}; - -options.fallback.resolve = function (id, parentId, error) { - if (Meteor.isServer && - topLevelIdPattern.test(id)) { - // Allow any top-level identifier to resolve to itself on the server, - // so that options.fallback can have a chance to handle it. - return id; - } - - throw error; -}; - -meteorInstall = makeInstaller(options); -var Mp = meteorInstall.Module.prototype; - -if (Meteor.isServer) { - Mp.useNode = function () { - if (typeof npmRequire !== "function") { - // Can't use Node if npmRequire is not defined. - return false; - } - - var parts = this.id.split("/"); - var start = 0; - if (parts[start] === "") ++start; - if (parts[start] === "node_modules" && - parts[start + 1] === "meteor") { - start += 2; - } - - if (parts.indexOf("node_modules", start) < 0) { - // Don't try to use Node for modules that aren't in node_modules - // directories. - return false; - } - - try { - npmRequire.resolve(this.id); - } catch (e) { - return false; - } - - this.exports = npmRequire(this.id); - - return true; - }; -} diff --git a/packages/modules-runtime/options.js b/packages/modules-runtime/options.js new file mode 100644 index 0000000000..200b878613 --- /dev/null +++ b/packages/modules-runtime/options.js @@ -0,0 +1,10 @@ +makeInstallerOptions = {}; + +if (typeof Profile === "function" && + process.env.METEOR_PROFILE) { + makeInstallerOptions.wrapRequire = function (require) { + return Profile(function (id) { + return "require(" + JSON.stringify(id) + ")"; + }, require); + }; +} diff --git a/packages/modules-runtime/package.js b/packages/modules-runtime/package.js index 5aff025d47..6d0735fcab 100644 --- a/packages/modules-runtime/package.js +++ b/packages/modules-runtime/package.js @@ -18,7 +18,10 @@ Package.onUse(function(api) { bare: true }); - api.addFiles("modules-runtime.js"); + api.addFiles("options.js"); + api.addFiles("client.js", "client"); + api.addFiles("server.js", "server"); + api.export("meteorInstall"); }); diff --git a/packages/modules-runtime/server.js b/packages/modules-runtime/server.js new file mode 100644 index 0000000000..367a60c769 --- /dev/null +++ b/packages/modules-runtime/server.js @@ -0,0 +1,67 @@ +// RegExp matching strings that don't start with a `.` or a `/`. +var topLevelIdPattern = /^[^./]/; + +// This function will be called whenever a module identifier that hasn't +// been installed is required. For backwards compatibility, and so that we +// can require binary dependencies on the server, we implement the +// fallback in terms of Npm.require. +makeInstallerOptions.fallback = function (id, parentId, error) { + // For simplicity, we honor only top-level module identifiers here. + // We could try to honor relative and absolute module identifiers by + // somehow combining `id` with `dir`, but we'd have to be really careful + // that the resulting modules were located in a known directory (not + // some arbitrary location on the file system), and we only really need + // the fallback for dependencies installed in node_modules directories. + if (topLevelIdPattern.test(id)) { + if (typeof Npm === "object" && + typeof Npm.require === "function") { + return Npm.require(id); + } + } + + throw error; +}; + +makeInstallerOptions.fallback.resolve = function (id, parentId, error) { + if (topLevelIdPattern.test(id)) { + // Allow any top-level identifier to resolve to itself on the server, + // so that makeInstallerOptions.fallback has a chance to handle it. + return id; + } + + throw error; +}; + +meteorInstall = makeInstaller(makeInstallerOptions); +var Module = meteorInstall.Module; + +Module.prototype.useNode = function () { + if (typeof npmRequire !== "function") { + // Can't use Node if npmRequire is not defined. + return false; + } + + var parts = this.id.split("/"); + var start = 0; + if (parts[start] === "") ++start; + if (parts[start] === "node_modules" && + parts[start + 1] === "meteor") { + start += 2; + } + + if (parts.indexOf("node_modules", start) < 0) { + // Don't try to use Node for modules that aren't in node_modules + // directories. + return false; + } + + try { + npmRequire.resolve(this.id); + } catch (e) { + return false; + } + + this.exports = npmRequire(this.id); + + return true; +}; From 38c1e5b88a63a8a752e2b7d6bdfadc593e62aea2 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Wed, 14 Dec 2016 16:38:24 -0500 Subject: [PATCH 003/195] Teach findImportedModuleIdentifiers to find dynamic imports. --- tools/isobuild/js-analyze.js | 94 +++++++++++++++++++++++++++--------- 1 file changed, 70 insertions(+), 24 deletions(-) diff --git a/tools/isobuild/js-analyze.js b/tools/isobuild/js-analyze.js index ae1b7507af..5a335ca308 100644 --- a/tools/isobuild/js-analyze.js +++ b/tools/isobuild/js-analyze.js @@ -35,7 +35,7 @@ function tryToParse(source, hash) { return ast; } -var dependencyKeywordPattern = /\b(require|import|export)\b/g; +var dependencyKeywordPattern = /\b(require|import|export|dynamicImport)\b/g; /** * The `findImportedModuleIdentifiers` function takes a string of module @@ -95,9 +95,14 @@ export function findImportedModuleIdentifiers(source, hash) { return addIdentifier(id, "require", requireIsBound); } - id = getImportedModuleId(node); - if (typeof id === "string") { - return addIdentifier(id, "import", requireIsBound); + const importInfo = getImportedModuleInfo(node); + if (importInfo) { + return addIdentifier( + importInfo.id, + "import", + requireIsBound, + importInfo.dynamic + ); } // Continue traversing the children of this node. @@ -117,10 +122,17 @@ export function findImportedModuleIdentifiers(source, hash) { } } - function addIdentifier(id, type, requireIsBound) { + function addIdentifier(id, type, requireIsBound, isDynamic) { const entry = hasOwn.call(identifiers, id) ? identifiers[id] - : identifiers[id] = { possiblySpurious: true }; + : identifiers[id] = { + possiblySpurious: true, + dynamic: !! isDynamic + }; + + if (! isDynamic) { + entry.dynamic = false; + } if (type === "require") { // If the identifier comes from a require call, but require is not a @@ -182,31 +194,65 @@ function isStringLiteral(node) { typeof node.value === "string")); } -function getImportedModuleId(node) { - if (node.type === "CallExpression" && - node.callee.type === "MemberExpression" && - isIdWithName(node.callee.object, "module") && - (isIdWithName(node.callee.property, "import") || - (isStringLiteral(node.callee.property) && - node.callee.property.value === "import"))) { - const args = node.arguments; - const argc = args.length; - if (argc > 0) { - const arg = args[0]; - if (isStringLiteral(arg)) { - return arg.value; +function getImportedModuleInfo(node) { + switch (node.type) { + case "CallExpression": + if (node.callee.type === "Import" || + isIdWithName(node.callee, "import")) { + const firstArg = node.arguments[0]; + if (isStringLiteral(firstArg)) { + return { + id: firstArg.value, + dynamic: true, + }; + } + + } else if (node.callee.type === "MemberExpression" && + isIdWithName(node.callee.object, "module")) { + const propertyName = + isPropertyWithName(node.callee.property, "import") || + isPropertyWithName(node.callee.property, "dynamicImport"); + + if (propertyName) { + const dynamic = propertyName === "dynamicImport"; + const args = node.arguments; + const argc = args.length; + + if (argc > 0) { + const arg = args[0]; + if (isStringLiteral(arg)) { + return { + id: arg.value, + dynamic, + }; + } + } } } - } - if (node.type === "ImportDeclaration" || - node.type === "ExportAllDeclaration" || - node.type === "ExportNamedDeclaration") { + return null; + + case "ImportDeclaration": + case "ExportAllDeclaration": + case "ExportNamedDeclaration": // The .source of an ImportDeclaration or Export{Named,All}Declaration // is always a string-valued Literal node, if not null. if (isNode(node.source)) { - return node.source.value; + return { + id: node.source.value, + dynamic: false, + }; } + + return null; + } +} + +function isPropertyWithName(node, name) { + if (isIdWithName(node, name) || + (isStringLiteral(node) && + node.value === name)) { + return name; } } From 0e210ef53cccae8810829e218d06c854dc21cef5 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Wed, 14 Dec 2016 16:51:09 -0500 Subject: [PATCH 004/195] Allow ImportScanner#getOutputFiles to return dynamic files. --- tools/isobuild/import-scanner.js | 174 ++++++++++++++++++++++--------- 1 file changed, 127 insertions(+), 47 deletions(-) diff --git a/tools/isobuild/import-scanner.js b/tools/isobuild/import-scanner.js index bd6262a699..7619b0c465 100644 --- a/tools/isobuild/import-scanner.js +++ b/tools/isobuild/import-scanner.js @@ -255,17 +255,10 @@ export default class ImportScanner { file.installPath = this._getInstallPath(absTargetPath); file.sourcePath = file.targetPath; - let relativeId = convertToPosixPath(pathRelative( - pathDirname(absSourcePath), - absTargetPath - )); - - // If the result of pathRelative does not already start with a "." - // or a "/", prepend a "./" to make it a valid relative identifier - // according to CommonJS syntax. - if ("./".indexOf(relativeId.charAt(0)) < 0) { - relativeId = "./" + relativeId; - } + const relativeId = this._getRelativeImportId( + absSourcePath, + absTargetPath, + ); // Set the contents of the source module to import the target // module(s). Note that module.exports will be set to the exports of @@ -336,7 +329,17 @@ export default class ImportScanner { oldFile.dataString = combinedDataString; oldFile.data = new Buffer(oldFile.dataString, "utf8"); oldFile.hash = sha1(oldFile.data); - oldFile.imported = oldFile.imported || newFile.imported; + + // If either oldFile or newFile has been imported non-dynamically, + // then oldFile.imported needs to be === true. Otherwise we simply set + // oldFile.imported = oldFile.imported || newFile.imported, which + // could be either false, "dynamic", or "fake" (see addNodeModules). + oldFile.imported = + oldFile.imported === true || + newFile.imported === true || + oldFile.imported || + newFile.imported; + oldFile.sourceMap = combinedSourceMap.toJSON(); if (! oldFile.sourceMap.mappings) { oldFile.sourceMap = null; @@ -346,7 +349,7 @@ export default class ImportScanner { scanImports() { this.outputFiles.forEach(file => { if (! file.lazy || file.imported) { - this._scanFile(file); + this._scanFile(file, file.imported === "dynamic"); } }); @@ -368,6 +371,11 @@ export default class ImportScanner { try { this._scanFile({ sourcePath: "fake.js", + // It's important that the fake.js file itself never gets + // scanned or bundled. See the _scanFile and getOutputFiles + // methods for logic that deals with file.imported values. + imported: "fake", + lazy: true, // By specifying the .deps property of this fake file ahead of // time, we can avoid calling findImportedModuleIdentifiers in the // _scanFile method. @@ -403,11 +411,14 @@ export default class ImportScanner { }; } - getOutputFiles(options) { + getOutputFiles() { // Return all installable output files that are either eager or - // imported by another module. + // imported (statically or dynamically). return this.outputFiles.filter(file => { - return file.installPath && (! file.lazy || file.imported); + return file.installPath && + (! file.lazy || + file.imported === true || + file.imported === "dynamic"); }); } @@ -467,23 +478,54 @@ export default class ImportScanner { return result; } - _resolve(id, absPath) { + _resolve(parentFile, id, forDynamicImport = false) { + const absPath = pathJoin(this.sourceRoot, parentFile.sourcePath); const resolved = this.resolver.resolve(id, absPath); if (resolved === "missing") { - return this._onMissing(id, absPath); + return this._onMissing(parentFile, id, forDynamicImport); } if (resolved && resolved.packageJsonMap) { + const info = parentFile.deps[id]; + info.helpers = info.helpers || {}; + each(resolved.packageJsonMap, (pkg, path) => { - this._addPkgJsonToOutput(path, pkg); + const packageJsonFile = + this._addPkgJsonToOutput(path, pkg, forDynamicImport); + + const relativeId = this._getRelativeImportId( + parentFile.installPath, + packageJsonFile.installPath + ); + + // Although not explicitly imported, any package.json modules + // involved in resolving this import should be recorded as + // implicit "helpers." + info.helpers[relativeId] = forDynamicImport; }); } return resolved; } - _scanFile(file) { + _getRelativeImportId(parentPath, childPath) { + const relativeId = convertToPosixPath(pathRelative( + pathDirname(parentPath), + childPath + )); + + // If the result of pathRelative does not already start with a "." or + // a "/", prepend a "./" to make it a valid relative identifier + // according to CommonJS syntax. + if ("./".indexOf(relativeId.charAt(0)) < 0) { + return "./" + relativeId; + } + + return relativeId; + } + + _scanFile(file, forDynamicImport = false) { const absPath = pathJoin(this.sourceRoot, file.sourcePath); try { @@ -501,7 +543,12 @@ export default class ImportScanner { } each(file.deps, (info, id) => { - const resolved = this._resolve(id, absPath); + // Asynchronous module fetching only really makes sense on the + // client (even though it works equally well on the server), so it's + // better if forDynamicImport never becomes true on the server. + const dynamic = this.isWeb() && (forDynamicImport || info.dynamic); + + const resolved = this._resolve(file, id, dynamic); if (! resolved) { return; } @@ -524,16 +571,30 @@ export default class ImportScanner { // as imported so we know to include them in the bundle if they // are lazy. Eager files and files that we have imported before do // not need to be scanned again. Lazy files that we have not - // imported before still need to be scanned, however. + // imported before still need to be scanned, however. Note that + // alreadyScanned will be "dynamic" (which is truthy) if the file + // has only been scanned because of a dynamic import(...). const alreadyScanned = ! depFile.lazy || depFile.imported; // Whether the file is eager or lazy, mark it as imported. For // lazy files, this makes the difference between being included in // or omitted from the bundle. For eager files, this just ensures - // we won't scan them again. - depFile.imported = true; + // we won't scan them again. If this scan began from a dynamic + // import(...), we set depFile.imported = "dynamic" unless it's + // already been set true. + depFile.imported = dynamic + ? depFile.imported || "dynamic" + : true; - if (! alreadyScanned) { + const needsToBeScanned = ! alreadyScanned || + // If the file has already been scanned, but only because of a + // dynamic import(...), then it needs to be scanned again, so that + // we mark it and its dependencies as non-dynamic. This will be + // cheaper than before because we've already computed depFile.deps. + (alreadyScanned === "dynamic" && + depFile.imported === true); + + if (needsToBeScanned) { if (depFile.error) { // Since this file is lazy, it might never have been imported, // so any errors reported to InputFile#error were saved but @@ -542,7 +603,7 @@ export default class ImportScanner { buildmessage.error(depFile.error.message, depFile.error.info); } else { - this._scanFile(depFile); + this._scanFile(depFile, dynamic); } } @@ -555,6 +616,8 @@ export default class ImportScanner { return; } + info.installPath = installPath; + // If the module is not readable, _readModule may return // null. Otherwise it will return an object with .data, .dataString, // and .hash properties. @@ -568,7 +631,7 @@ export default class ImportScanner { depFile.installPath = installPath; depFile.servePath = installPath; depFile.lazy = true; - depFile.imported = true; + depFile.imported = dynamic ? "dynamic" : true; // Append this file to the output array and record its index. this._addFile(absImportedPath, depFile); @@ -589,12 +652,12 @@ export default class ImportScanner { return; } - this._scanFile(depFile); + this._scanFile(depFile, dynamic); }); } isWeb() { - return archMatches(this.bundleArch, "web"); + return ! archMatches(this.bundleArch, "os"); } _readFile(absPath) { @@ -773,9 +836,12 @@ export default class ImportScanner { } // Called by this.resolver when a module identifier cannot be resolved. - _onMissing(id, absParentPath) { + _onMissing(parentFile, id, forDynamicImport = false) { const isApp = ! this.name; - const parentFile = this._getFile(absParentPath); + const absParentPath = pathJoin( + this.sourceRoot, + parentFile.sourcePath, + ); if (isApp && Resolver.isNative(id) && @@ -784,27 +850,33 @@ export default class ImportScanner { // a dependency on meteor-node-stubs/deps/.js. const stubId = Resolver.getNativeStubId(id); if (isString(stubId) && stubId !== id) { - if (parentFile && - parentFile.deps) { - parentFile.deps[stubId] = parentFile.deps[id]; - } - return this._resolve(stubId, absParentPath); + const info = parentFile.deps[id]; + + // Although not explicitly imported, any stubs associated with + // this native import should be recorded as implicit "helpers." + info.helpers = info.helpers || {}; + info.helpers[stubId] = forDynamicImport; + + return this._resolve(parentFile, stubId, forDynamicImport); } } - const possiblySpurious = - parentFile && - parentFile.deps && - has(parentFile.deps, id) && - parentFile.deps[id].possiblySpurious; - const info = { packageName: this.name, parentPath: absParentPath, bundleArch: this.bundleArch, - possiblySpurious, + possiblySpurious: false, + dynamic: false, }; + if (parentFile && + parentFile.deps && + has(parentFile.deps, id)) { + const importInfo = parentFile.deps[id]; + info.possiblySpurious = importInfo.possiblySpurious; + info.dynamic = importInfo.dynamic; + } + // If the imported identifier is neither absolute nor relative, but // top-level, then it might be satisfied by a package installed in // the top-level node_modules directory, and we should record the @@ -825,11 +897,17 @@ export default class ImportScanner { } } - _addPkgJsonToOutput(pkgJsonPath, pkg) { + _addPkgJsonToOutput(pkgJsonPath, pkg, forDynamicImport = false) { const file = this._getFile(pkgJsonPath); + if (file) { - // If the file already exists, don't modify or replace it. - return; + // If the file already exists, just update file.imported according + // to the forDynamicImport parameter. + file.imported = forDynamicImport + ? file.imported || "dynamic" + : true; + + return file; } const data = new Buffer(map(pkg, (value, key) => { @@ -847,7 +925,7 @@ export default class ImportScanner { servePath: relPkgJsonPath, hash: sha1(data), lazy: true, - imported: true, + imported: forDynamicImport ? "dynamic" : true, // Since _addPkgJsonToOutput is only ever called for package.json // files that are involved in resolving package directories, and pkg // is only a subset of the information in the actual package.json @@ -863,6 +941,8 @@ export default class ImportScanner { if (hash) { this.watchSet.addFile(pkgJsonPath, hash); } + + return pkgFile; } } From 4bff3220e86b7544dac0a627eaee3e43375bd90e Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Mon, 23 Jan 2017 13:30:03 -0500 Subject: [PATCH 005/195] Include .jsonData on files returned by ImportScanner#getOutputFiles. --- tools/isobuild/import-scanner.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/tools/isobuild/import-scanner.js b/tools/isobuild/import-scanner.js index 7619b0c465..bf90b66711 100644 --- a/tools/isobuild/import-scanner.js +++ b/tools/isobuild/import-scanner.js @@ -52,8 +52,10 @@ const defaultExtensionHandlers = { }, ".json"(dataString) { + const file = this; + file.jsonData = JSON.parse(dataString); return "module.exports = " + - JSON.stringify(JSON.parse(dataString), null, 2) + + JSON.stringify(file.jsonData, null, 2) + ";\n"; }, @@ -191,8 +193,11 @@ export default class ImportScanner { const dotExt = "." + file.type; const dataString = file.data.toString("utf8"); - file.dataString = defaultExtensionHandlers[dotExt]( - dataString, file.hash); + file.dataString = defaultExtensionHandlers[dotExt].call( + file, + dataString, + file.hash, + ); if (! (file.data instanceof Buffer) || file.dataString !== dataString) { @@ -714,7 +719,8 @@ export default class ImportScanner { } } - info.dataString = defaultExtensionHandlers[ext]( + info.dataString = defaultExtensionHandlers[ext].call( + info, info.dataString, info.hash, ); @@ -919,6 +925,7 @@ export default class ImportScanner { const pkgFile = { type: "js", // We represent the JSON module with JS. data, + jsonData: pkg, deps: {}, // Avoid accidentally re-scanning this file. sourcePath: relPkgJsonPath, installPath: this._getInstallPath(pkgJsonPath), From 352f545be236ab19727e8d1a791a8c17b2c7ef37 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Fri, 3 Feb 2017 12:57:24 -0500 Subject: [PATCH 006/195] Record complete module graph, including dynamic stubs, in meteorInstall. --- packages/modules-runtime/client.js | 2 +- packages/modules-runtime/meteor-install.js | 132 +++++++++++++++++++++ packages/modules-runtime/package.js | 1 + packages/modules-runtime/server.js | 4 +- 4 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 packages/modules-runtime/meteor-install.js diff --git a/packages/modules-runtime/client.js b/packages/modules-runtime/client.js index d902671864..570609ef60 100644 --- a/packages/modules-runtime/client.js +++ b/packages/modules-runtime/client.js @@ -2,4 +2,4 @@ // package.json files to the "main" field. makeInstallerOptions.browser = true; -meteorInstall = makeInstaller(makeInstallerOptions); +install = makeInstaller(makeInstallerOptions); diff --git a/packages/modules-runtime/meteor-install.js b/packages/modules-runtime/meteor-install.js new file mode 100644 index 0000000000..e03c82412b --- /dev/null +++ b/packages/modules-runtime/meteor-install.js @@ -0,0 +1,132 @@ +// The metaInstall function will be used to create a module graph that +// parallels the installed module graph. This parallel graph consists of +// metadata about all available modules, not only those already installed +// but also modules that can be fetched dynamically. +var metaInstall = makeInstaller({ + browser: makeInstallerOptions.browser +}); + +meteorInstall = function (tree, options) { + if (isObject(tree)) { + var meta = Object.create(null); + var modules = Object.create(null); + walk(options, tree, meta, modules); + metaInstall(meta, options); + return install(modules, options); + } + + return install(); +}; + +// Other packages (namely the dynamic-import package) call this function +// to retrieve module metadata from the metaInstall graph. +meteorInstall._requireMeta = metaInstall(); + +function isObject(value) { + return value && typeof value === "object"; +} + +function getOrSet(obj, name) { + return obj[name] = obj[name] || Object.create(null); +} + +function walk(options, input, meta, modules) { + Object.keys(input).forEach(function (name) { + var value = input[name]; + + if (tryChild(value, name, meta, modules, options)) { + // If the value was a leaf node that we were able to handle, then we + // don't need to (and can't) keep walking it. + return; + } + + if (isObject(value)) { + walk( + options, + value, + getOrSet(meta, name), + getOrSet(modules, name) + ); + } + }); + + return this; +} + +function tryChild(value, name, meta, modules, options) { + function tryFunc(value) { + if (typeof value === "function") { + meta[name] = makeMetaFunc({}, false, options); + modules[name] = value; + return true; + } + } + + if (Array.isArray(value)) { + return value.some(function (value) { + // Dynamic stub modules are represented by objects wrapped in array + // brackets. When we find one of these objects, we install it in the + // meta graph, but not in the installed modules graph. Later, this + // information may be used to fetch dynamic modules from the server, + // which will then be installed into the modules graph. + if (isObject(value)) { + meta[name] = makeMetaFunc(value, true, options); + return true; + } + + // Older versions of the install.js library supported wrapping a + // module function in an array that also contained the dependency + // identifier strings of that module. That style should no longer be + // used, but we might as well handle it gracefully, since it is not + // ambiguous with the [{...}] style. + return tryFunc(value); + }); + } + + // Installed (immediately importable) modules are represented by + // function expressions with the parameters (require, exports, module). + if (tryFunc(value)) { + return true; + } + + // The install.js library supports a notion of aliases, represented by + // module identifier strings. This functionality works the same way in + // both the meta graph and the modules graph. + if (typeof value === "string") { + meta[name] = value; + modules[name] = value; + return true; + } +} + +function makeMetaFunc(value, dynamic, options) { + return function (require, exports, module) { + Object.assign(exports, value); + + exports.module = module; + exports.dynamic = !! dynamic; + exports.options = options; + + // One of the purposes of the meta graph is to support traversing + // module dependencies without evaluating any actual module code. + // The eachChild function is essential to that traversal. + exports.eachChild = function (callback, idsToRequire) { + // By default, this function requires all value.deps dependencies + // before iterating over the resulting children, but the caller can + // provide a custom array of modules to require instead. + idsToRequire = idsToRequire || (value && value.deps); + + if (Array.isArray(idsToRequire)) { + idsToRequire.forEach(require); + } + + // After requiring any/all dependencies of this module, iterate over + // the children according to module.childrenById. Note that this + // includes all children ever imported by this module, including + // implicit modules such as package.json files. + Object.keys(module.childrenById).forEach(function (id) { + callback(module.childrenById[id]); + }); + }; + }; +} diff --git a/packages/modules-runtime/package.js b/packages/modules-runtime/package.js index 6d0735fcab..6480d94ca8 100644 --- a/packages/modules-runtime/package.js +++ b/packages/modules-runtime/package.js @@ -21,6 +21,7 @@ Package.onUse(function(api) { api.addFiles("options.js"); api.addFiles("client.js", "client"); api.addFiles("server.js", "server"); + api.addFiles("meteor-install.js"); api.export("meteorInstall"); }); diff --git a/packages/modules-runtime/server.js b/packages/modules-runtime/server.js index 367a60c769..1ce8ffb0be 100644 --- a/packages/modules-runtime/server.js +++ b/packages/modules-runtime/server.js @@ -32,8 +32,8 @@ makeInstallerOptions.fallback.resolve = function (id, parentId, error) { throw error; }; -meteorInstall = makeInstaller(makeInstallerOptions); -var Module = meteorInstall.Module; +install = makeInstaller(makeInstallerOptions); +var Module = install.Module; Module.prototype.useNode = function () { if (typeof npmRequire !== "function") { From a2e950dfd3b473598d6a279672f6d838b87f0a35 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Fri, 3 Feb 2017 11:03:13 -0500 Subject: [PATCH 007/195] Include dynamic stubs in linked meteorInstall bundles. --- tools/isobuild/linker.js | 156 +++++++++++++++++++++++++++------------ 1 file changed, 110 insertions(+), 46 deletions(-) diff --git a/tools/isobuild/linker.js b/tools/isobuild/linker.js index 276ec9e913..d1721d053b 100644 --- a/tools/isobuild/linker.js +++ b/tools/isobuild/linker.js @@ -162,13 +162,15 @@ _.extend(Module.prototype, { servePath: self.combinedServePath, }; + const results = [result]; + // An array of strings and SourceNode objects. let chunks = []; let fileCount = 0; // Emit each file if (self.meteorInstallOptions) { - const tree = self._buildModuleTree(); + const tree = self._buildModuleTree(results, sourceWidth); fileCount = self._chunkifyModuleTree(tree, chunks, sourceWidth); result.exportsName = self._chunkifyEagerRequires(chunks, fileCount, sourceWidth); @@ -216,19 +218,20 @@ _.extend(Module.prototype, { } ); - return [result]; + return results; }), // Builds a tree of nested objects where the properties are names of // files or directories, and the values are either nested objects // (representing directories) or File objects (representing modules). // Bare files and lazy files that are never imported are ignored. - _buildModuleTree() { + _buildModuleTree(results, sourceWidth) { assert.ok(this.meteorInstallOptions); + // Tree of File objects for all non-dynamic modules. const tree = {}; - _.each(this.files, function (file) { + _.each(this.files, file => { if (file.bare) { // Bare files will be added in between the synchronous require // calls in _chunkifyEagerRequires. @@ -242,22 +245,71 @@ _.extend(Module.prototype, { return; } - const parts = file.installPath.split("/"); - let t = tree; - _.each(parts, function (part, i) { - const isLastPart = i === parts.length - 1; - t = _.has(t, part) - ? t[part] - : t[part] = isLastPart ? file : {}; - }); + const dynamic = file.lazy && file.imported === "dynamic"; + + if (dynamic) { + const servePath = "dynamic/" + file.installPath; + const { code: source, map } = + file.getPrelinkedOutput({ + sourceWidth: sourceWidth, + noLineNumbers: this.noLineNumbers + }).toStringWithSourceMap({ + file: servePath, + }); + + results.push({ + source, + servePath, + sourceMap: map && map.toJSON(), + dynamic: true, + }); + + const entry = { + version: file.sourceHash, + }; + + if (! _.isEmpty(file.deps)) { + entry.deps = file.deps; + } + + if (file.installPath.endsWith("/package.json") && + file.jsonData) { + const main = file.jsonData.main; + if (_.isString(main)) { + entry.main = main; + } + + const browser = file.jsonData.browser; + if (_.isString(browser)) { + entry.browser = browser; + } + } + + this._addToTree([entry], file.installPath, tree); + + } else { + // If the file is not dynamic, then it should be included in the + // initial bundle, so we add it to the static tree. + this._addToTree(file, file.installPath, tree); + } }); return tree; }, - // Takes the tree generated by _buildModuleTree and populates the chunks + _addToTree(obj, path, tree) { + const parts = path.split("/"); + const lastIndex = parts.length - 1; + parts.forEach((part, i) => { + tree = _.has(tree, part) + ? tree[part] + : tree[part] = i < lastIndex ? {} : obj; + }); + }, + + // Take the tree generated in getPrelinkedFiles and populate the chunks // array with strings and SourceNode objects that can be combined into a - // single SourceNode object. Returns the count of modules in the tree. + // single SourceNode object. Return the count of modules in the tree. _chunkifyModuleTree(tree, chunks, sourceWidth) { const self = this; @@ -268,12 +320,18 @@ _.extend(Module.prototype, { let moduleCount = 0; function walk(t) { - if (t instanceof File) { + if (Array.isArray(t)) { ++moduleCount; + chunks.push(JSON.stringify(t, null, 2)); + + } else if (t instanceof File) { + ++moduleCount; + chunks.push(t.getPrelinkedOutput({ sourceWidth, noLineNumbers: self.noLineNumbers })); + } else if (_.isObject(t)) { chunks.push("{"); const keys = _.keys(t); @@ -424,20 +482,16 @@ var File = function (inputFile, module) { self.servePath = inputFile.servePath; // Module identifiers imported or required by this module, if any. - if (Array.isArray(inputFile.deps)) { - self.deps = inputFile.deps; - } else if (inputFile.deps && typeof inputFile.deps === "object") { - self.deps = Object.keys(inputFile.deps); - } else { - self.deps = []; - } + // Excludes dynamically imported dependencies, and may exclude + // dependencies already included in the non-dynamic initial bundle. + self.deps = getNonDynamicDeps(inputFile.deps); // True if the input file should not be evaluated eagerly. self.lazy = inputFile.lazy; // could be `true`, `false` or `undefined` - // True if the file is an eagerly evaluated entry point, or if some - // other file imports or requires it. - self.imported = !!inputFile.imported; + // True if the file is eagerly imported, "dynamic" if the file is + // dynamically imported. + self.imported = inputFile.imported; // Boolean indicating whether this file is the main entry point module // for its package. @@ -450,10 +504,28 @@ var File = function (inputFile, module) { // Is an Object, not a string. self.sourceMap = inputFile.sourceMap; + // If inputFile is a JSON file, its parsed data will be exposed via the + // .jsonData property. + self.jsonData = inputFile.jsonData || null; + // The Module containing this file. self.module = module; }; +function getNonDynamicDeps(inputFileDeps) { + const nonDynamicDeps = Object.create(null); + + if (! _.isEmpty(inputFileDeps)) { + _.each(inputFileDeps, (info, id) => { + if (! info.dynamic) { + nonDynamicDeps[id] = info; + } + }); + } + + return Object.keys(nonDynamicDeps); +} + _.extend(File.prototype, { // Return the globals in this file as an array of symbol names. For // example: if the code references 'Foo.bar.baz' and 'Quux', and @@ -513,19 +585,12 @@ _.extend(File.prototype, { _getClosureHeader() { if (this._useMeteorInstall()) { - var header = ""; - - if (this.deps.length > 0) { - header += "["; - _.each(this.deps, dep => { - header += JSON.stringify(dep) + ","; - }); - } - - const headerParts = [ - header, - "function(" - ]; + // The wrapper function is named "module" so that the UglifyJS + // minifier will parse it as a function declaration, because + // UglifyJS has trouble parsing single function expressions. If the + // module refers to `module`, however, it will be referring to the + // parameter of that name, rather than the function name. + const headerParts = ["function module("]; if (this.source.match(/\b__dirname\b/)) { headerParts.push("require,exports,module,__filename,__dirname"); @@ -548,14 +613,9 @@ _.extend(File.prototype, { }, _getClosureFooter() { - if (this._useMeteorInstall()) { - var footer = "}"; - if (this.deps.length > 0) { - footer += "]"; - } - return footer; - } - return "}).call(this);\n"; + return this._useMeteorInstall() + ? "}" + : "}).call(this);\n"; }, // Options: @@ -1057,6 +1117,10 @@ export var fullLink = Profile("linker.fullLink", function (inputFiles, { var headerContent = (new Array(headerLines + 1).join(';')); return _.map(prelinkedFiles, function (file) { + if (file.dynamic) { + return file; + } + if (file.sourceMap) { var sourceMap = file.sourceMap; sourceMap.mappings = headerContent + sourceMap.mappings; From ebff32f6266be8369fa857790a87cb7c0a722d50 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Fri, 3 Feb 2017 11:34:54 -0500 Subject: [PATCH 008/195] Write dynamic files separately in builder output directories. --- tools/isobuild/bundler.js | 92 +++++++++++++++++++++++++++++++-------- 1 file changed, 75 insertions(+), 17 deletions(-) diff --git a/tools/isobuild/bundler.js b/tools/isobuild/bundler.js index bc971e80c6..2520d44d53 100644 --- a/tools/isobuild/bundler.js +++ b/tools/isobuild/bundler.js @@ -677,7 +677,7 @@ class File { setTargetPathFromRelPath(relPath) { // XXX hack - if (relPath.match(/^packages\//) || relPath.match(/^assets\//)) { + if (relPath.match(/^(packages|assets|dynamic)\//)) { this.targetPath = relPath; } else { this.targetPath = files.pathJoin('app', relPath); @@ -1173,29 +1173,42 @@ class Target { // Minify the JS in this target minifyJs(minifierDef, minifyMode) { - const sources = _.map(this.js, function (file) { - return new JsFile(file, { - arch: this.arch - }); + const staticFiles = []; + const dynamicFiles = []; + + this.js.forEach(file => { + const jsf = new JsFile(file, { arch: this.arch }); + if (file.targetPath.startsWith("dynamic/")) { + dynamicFiles.push(jsf); + } else { + staticFiles.push(jsf); + } }); - var minifier = minifierDef.userPlugin.processFilesForBundle.bind( - minifierDef.userPlugin); + + var minifier = minifierDef.userPlugin.processFilesForBundle + .bind(minifierDef.userPlugin); buildmessage.enterJob('minifying app code', function () { try { var markedMinifier = buildmessage.markBoundary(minifier); - markedMinifier(sources, { minifyMode }); + markedMinifier(staticFiles, { minifyMode }); + dynamicFiles.forEach(file => { + markedMinifier([file], { minifyMode }); + }); } catch (e) { buildmessage.exception(e); } }); - this.js = _.flatten(sources.map((source) => { - return source._minifiedFiles.map((file) => { + const js = []; + + function handle(source, dynamic) { + const newFiles = source._minifiedFiles.map(file => { const newFile = new File({ info: 'minified js', - data: new Buffer(file.data, 'utf8') + data: new Buffer(file.data, 'utf8'), }); + if (file.sourceMap) { newFile.setSourceMap(file.sourceMap, '/'); } @@ -1203,13 +1216,24 @@ class Target { if (file.path) { newFile.setUrlFromRelPath(file.path); newFile.targetPath = file.path; + } else if (dynamic) { + const { targetPath } = source._source; + newFile.setUrlFromRelPath(targetPath); + newFile.targetPath = targetPath; } else { newFile.setUrlToHash('.js', '?meteor_js_resource=true'); } return newFile; }); - })); + + js.push(...newFiles); + } + + staticFiles.forEach(file => handle(file, false)); + dynamicFiles.forEach(file => handle(file, true)); + + this.js = js; } // For every source file we process, sets the domain name to @@ -1477,9 +1501,27 @@ class ClientTarget extends Target { manifestItem.size = file.size(); manifestItem.hash = file.hash(); - writeFile(file, builder); + writeFile(file, { + sourceMapUrl: manifestItem.sourceMapUrl, + }, builder); - manifest.push(manifestItem); + if (! file.targetPath.startsWith("dynamic/")) { + manifest.push(manifestItem); + } else if (file.sourceMap) { + // If the file is dynamic, we don't need/want the file itself to + // be served by the web server, but we do want its source map (if + // defined) to be accessible via HTTP, so that we can refer to it + // by URL rather than embedding it as a very long data URL comment + // in the file. + manifest.push({ + type: "json", + path: manifestItem.sourceMap, + url: manifestItem.sourceMapUrl, + where: manifestItem.where, + cacheable: manifestItem.cacheable, + hash: manifestItem.hash, + }); + } }); ['head', 'body'].forEach((type) => { @@ -1980,7 +2022,9 @@ class JsImage { }); } - load.push(loadItem); + if (! item.targetPath.startsWith("dynamic/")) { + load.push(loadItem); + } }); const rebuildDirs = Object.create(null); @@ -2324,7 +2368,7 @@ class ServerTarget extends JsImageTarget { ServerTarget.prototype[method] = Profile(`ServerTarget#${method}`, ServerTarget.prototype[method]); }); -var writeFile = Profile("bundler writeFile", function (file, builder) { +var writeFile = Profile("bundler writeFile", function (file, options, builder) { if (! file.targetPath) { throw new Error("No targetPath?"); } @@ -2336,7 +2380,21 @@ var writeFile = Profile("bundler writeFile", function (file, builder) { // to wait until the server is actually driven by the manifest // (rather than just serving all of the files in a certain // directories) - builder.write(file.targetPath, { data: file.contents(), hash: file.hash() }); + + let data = file.contents(); + const hash = file.hash(); + + if (options.sourceMapUrl) { + // TODO Remove any existing //# sourceMappingURL=, and maybe unify + // with similar logic in JsImage#write. + data = Buffer.concat([data, new Buffer([ + "", + "//# sourceMappingURL=" + options.sourceMapUrl, + "" + ].join("\n"), "utf8")]); + } + + builder.write(file.targetPath, { data, hash }); }); // Writes a target a path in 'programs' From 9845c2f484d436cd10e26ca778030278d5ba7da8 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Mon, 6 Feb 2017 09:50:47 -0500 Subject: [PATCH 009/195] Unify sourceMappingURL logic in tools/isobuild/bundler.js. --- tools/isobuild/bundler.js | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/tools/isobuild/bundler.js b/tools/isobuild/bundler.js index 2520d44d53..a41f9e8bc8 100644 --- a/tools/isobuild/bundler.js +++ b/tools/isobuild/bundler.js @@ -1981,11 +1981,11 @@ class JsImage { ); var sourceMapFileName = files.pathBasename(loadItem.sourceMap); + // Remove any existing sourceMappingURL line. (eg, if roundtripping // through JsImage.readFromDisk, don't end up with two!) - item.source = item.source.replace( - /\n\/\/# sourceMappingURL=.+\n?$/g, ''); - item.source += "\n//# sourceMappingURL=" + sourceMapFileName + "\n"; + item.source = addSourceMappingURL(item.source, sourceMapFileName); + if (item.sourceMapRoot) { loadItem.sourceMapRoot = item.sourceMapRoot; } @@ -2385,18 +2385,27 @@ var writeFile = Profile("bundler writeFile", function (file, options, builder) { const hash = file.hash(); if (options.sourceMapUrl) { - // TODO Remove any existing //# sourceMappingURL=, and maybe unify - // with similar logic in JsImage#write. - data = Buffer.concat([data, new Buffer([ - "", - "//# sourceMappingURL=" + options.sourceMapUrl, - "" - ].join("\n"), "utf8")]); + data = new Buffer( + addSourceMappingURL(data, options.sourceMapUrl), + "utf8" + ); } builder.write(file.targetPath, { data, hash }); }); +// The data argument may be either a Buffer or a string, but this function +// always returns a string. +function addSourceMappingURL(data, url) { + const dataString = data + // If data is a Buffer, convert it to a string. + .toString("utf8") + // Remove any existing source map comments. + .replace(/\/\/# sourceMappingURL=[^\n]+/g, '//'); + // Append the new source map comment to the end of the code. + return dataString + "\n//# sourceMappingURL=" + url + "\n"; +} + // Writes a target a path in 'programs' var writeTargetToPath = Profile( "bundler writeTargetToPath", From 22d1b3ddfe5cd3b11455611ff27427c9d4aa0692 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Wed, 14 Dec 2016 17:23:51 -0500 Subject: [PATCH 010/195] Make special arguments in boot.js more configurable. Currently this functionality is only used for exposing npmRequire and Profile to the packages/modules-runtime.js bundle, but I'm planning to use it for packages/dynamic-import.js soon. --- tools/static-assets/server/boot.js | 34 ++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/tools/static-assets/server/boot.js b/tools/static-assets/server/boot.js index 4abc6dc05f..1d867bd913 100644 --- a/tools/static-assets/server/boot.js +++ b/tools/static-assets/server/boot.js @@ -13,6 +13,8 @@ var Profile = require('./profile.js').Profile; // This code is duplicated in tools/main.js. var MIN_NODE_VERSION = 'v0.10.41'; +var hasOwn = Object.prototype.hasOwnProperty; + if (require('semver').lt(process.version, MIN_NODE_VERSION)) { process.stderr.write( 'Meteor requires Node ' + MIN_NODE_VERSION + ' or later.\n'); @@ -124,6 +126,15 @@ var startCheckForLiveParent = function (parentPid) { } }; +var specialArgPaths = { + "packages/modules-runtime.js": function () { + return { + npmRequire: npmRequire, + Profile: Profile + }; + } +}; + var loadServerBundles = Profile("Load server bundles", function () { _.each(serverJson.load, function (fileInfo) { var code = fs.readFileSync(path.resolve(serverDir, fileInfo.path)); @@ -269,13 +280,17 @@ var loadServerBundles = Profile("Load server bundles", function () { }, }; - var isModulesRuntime = - fileInfo.path === "packages/modules-runtime.js"; - var wrapParts = ["(function(Npm,Assets"]; - if (isModulesRuntime) { - wrapParts.push(",npmRequire,Profile"); - } + + var specialArgs = + hasOwn.call(specialArgPaths, fileInfo.path) && + specialArgPaths[fileInfo.path](fileInfo); + + var specialKeys = Object.keys(specialArgs || {}); + specialKeys.forEach(function (key) { + wrapParts.push("," + key); + }); + // \n is necessary in case final line is a //-comment wrapParts.push("){", code, "\n})"); var wrapped = wrapParts.join(""); @@ -296,9 +311,10 @@ var loadServerBundles = Profile("Load server bundles", function () { // what require() uses to generate its errors. var func = require('vm').runInThisContext(wrapped, scriptPath, true); var args = [Npm, Assets]; - if (isModulesRuntime) { - args.push(npmRequire, Profile); - } + + specialKeys.forEach(function (key) { + args.push(specialArgs[key]); + }); Profile(fileInfo.path, func).apply(global, args); }); From 158adc48e8cb97d8de48ffef9bbc041b59790e5d Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Wed, 14 Dec 2016 17:26:28 -0500 Subject: [PATCH 011/195] Expose manifest of dynamic modules to the dynamic-import package. --- tools/static-assets/server/boot.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tools/static-assets/server/boot.js b/tools/static-assets/server/boot.js index 1d867bd913..0f73a9bd9c 100644 --- a/tools/static-assets/server/boot.js +++ b/tools/static-assets/server/boot.js @@ -132,6 +132,25 @@ var specialArgPaths = { npmRequire: npmRequire, Profile: Profile }; + }, + + "packages/dynamic-import.js": function (file) { + var dynamicImportInfo = {}; + + Object.keys(configJson.clientPaths).map(function (key) { + var programJsonPath = path.resolve(configJson.clientPaths[key]); + var programJson = require(programJsonPath); + + dynamicImportInfo[key] = { + dynamicRoot: path.join(path.dirname(programJsonPath), "dynamic") + }; + }); + + dynamicImportInfo.server = { + dynamicRoot: path.join(serverDir, "dynamic") + }; + + return { dynamicImportInfo: dynamicImportInfo }; } }; From 6095204bb3be1e5e8679b163a66f38e2d9c21efb Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Sat, 4 Feb 2017 13:13:26 -0500 Subject: [PATCH 012/195] Implement Module.prototype.dynamicImport with a package. --- packages/dynamic-import/README.md | 24 +++++++++ packages/dynamic-import/client.js | 85 ++++++++++++++++++++++++++++++ packages/dynamic-import/package.js | 13 +++++ packages/dynamic-import/server.js | 69 ++++++++++++++++++++++++ 4 files changed, 191 insertions(+) create mode 100644 packages/dynamic-import/README.md create mode 100644 packages/dynamic-import/client.js create mode 100644 packages/dynamic-import/package.js create mode 100644 packages/dynamic-import/server.js diff --git a/packages/dynamic-import/README.md b/packages/dynamic-import/README.md new file mode 100644 index 0000000000..ea7b121df7 --- /dev/null +++ b/packages/dynamic-import/README.md @@ -0,0 +1,24 @@ +Remaining work: + +- [x] Future-proof `findImportedModuleIdentifiers` for real `import(...)` +- [x] Source maps in development +- [x] Debugger stops at reasonable points in dev tools +- [x] Open another WebSocket? NO +- [x] Make `import(...)` work on the server +- [x] Modules are minified but not merged in production + - [x] Wrap modules with function to enable better minification +- [ ] Babel transform from `import(...)` to `module.importAsync(...)` +- [ ] Bundle cachability story +- [x] Compact `previous` state representation +- [x] Improve dependency resolution in `packages/dynamic-import/server.js` +- [x] Report static import/syntax/etc. errors for async files +- [ ] What about old/new versions of code? +- [ ] What about package pseudo-globals (imports)? +- [x] What about dynamic stubs? +- [x] Avoid creating dynamic files on the server. +- [ ] `Mp.dynamicImport` could be implemented without the fallback on the + server if we were sure the server had no dynamic files. +- [ ] Batch multiple __dynamicImport method calls. +- [x] Make sure client-only reloads work (revisit _read caching). +- [x] Make sure path manipulation is Windows-safe. +- [ ] Tests! diff --git a/packages/dynamic-import/client.js b/packages/dynamic-import/client.js new file mode 100644 index 0000000000..755baad591 --- /dev/null +++ b/packages/dynamic-import/client.js @@ -0,0 +1,85 @@ +var Module = module.constructor; +var delayPromise = Promise.resolve(); +var requireMeta = meteorInstall._requireMeta; + +Module.prototype.dynamicImport = function (id) { + // The real (not meta) parent module. + var module = this; + + function get() { + return getNamespace(module, id); + } + + return delayPromise.then(get).catch(function (error) { + // Require the current module from the complete meta graph. + var meta = requireMeta(module.id); + var missingTree = Object.create(null); + + function walk(meta) { + if (meta.dynamic && ! meta.pending) { + meta.pending = true; + addToTree(missingTree, meta.module.id, 1); + meta.eachChild(walkChild); + } + } + + function walkChild(childModule) { + walk(childModule.exports); + } + + // The meta.eachChild iteration includes all child modules imported by + // meta.module, not just the child explicitly required here, so that + // implicit modules like package.json will be included too. See + // meteor/packages/modules-runtime/meteor-install.js for the + // definition of meta.eachChild. + meta.eachChild(walkChild, [id]); + + return new Promise(function (resolve, reject) { + Meteor.call( + "__dynamicImport", + missingTree, + function (error, resultsTree) { + error ? reject(error) : resolve(resultsTree); + } + ); + + }).then(function (resultsTree) { + function walk(tree) { + if (typeof tree === "string") { + return (0, eval)("(" + tree + ")"); + } + + Object.keys(tree).forEach(function (name) { + tree[name] = walk(tree[name]); + }); + + return tree; + } + + meteorInstall(walk(resultsTree)); // TODO Options! + }).then(get); + }); +}; + +function addToTree(tree, id, value) { + var parts = id.split("/"); + var lastIndex = parts.length - 1; + parts.forEach(function (part, i) { + if (part) { + tree = tree[part] = tree[part] || + (i < lastIndex ? Object.create(null) : value); + } + }); +} + +function getNamespace(module, id) { + var namespace = Object.create(null); + + module.import(id, { + "*": function (value, name) { + namespace[name] = value; + } + }); + + return namespace; +} diff --git a/packages/dynamic-import/package.js b/packages/dynamic-import/package.js new file mode 100644 index 0000000000..bb86dedac1 --- /dev/null +++ b/packages/dynamic-import/package.js @@ -0,0 +1,13 @@ +Package.describe({ + name: "dynamic-import", + version: "0.0.1", + summary: "Support for module.dynamicImport(id).then(namespace => ...)", + documentation: "README.md" +}); + +Package.onUse(function (api) { + api.use("modules"); + api.use("ecmascript", "server"); + api.mainModule("client.js", "client"); + api.mainModule("server.js", "server"); +}); diff --git a/packages/dynamic-import/server.js b/packages/dynamic-import/server.js new file mode 100644 index 0000000000..ef787d30cc --- /dev/null +++ b/packages/dynamic-import/server.js @@ -0,0 +1,69 @@ +import assert from "assert"; +import { readFileSync } from "fs"; +import { + join as pathJoin, + normalize as pathNormalize, +} from "path"; +import "./client.js"; + +const hasOwn = Object.prototype.hasOwnProperty; + +Object.keys(dynamicImportInfo).forEach(platform => { + const info = dynamicImportInfo[platform]; + if (info.dynamicRoot) { + info.dynamicRoot = pathNormalize(info.dynamicRoot); + } +}); + +Meteor.methods({ + __dynamicImport(tree) { + const platform = this.connection ? "web.browser" : "server"; + const pathParts = []; + + function walk(node) { + if (node && typeof node === "object") { + Object.keys(node).forEach(name => { + pathParts.push(name); + node[name] = walk(node[name]); + assert.strictEqual(pathParts.pop(), name); + }); + } else { + return read(pathParts, platform); + } + return node; + } + + return walk(tree); + } +}); + +function read(pathParts, platform) { + const { dynamicRoot } = dynamicImportInfo[platform]; + const absPath = pathNormalize(pathJoin(dynamicRoot, ...pathParts)); + + if (! absPath.startsWith(dynamicRoot)) { + throw new Meteor.Error("bad dynamic module path"); + } + + const cache = getCache(platform); + return hasOwn.call(cache, absPath) + ? cache[absPath] + : cache[absPath] = readFileSync(absPath, "utf8"); +} + +const cachesByPlatform = Object.create(null); +function getCache(platform) { + return hasOwn.call(cachesByPlatform, platform) + ? cachesByPlatform[platform] + : cachesByPlatform[platform] = Object.create(null); +} + +process.on("message", msg => { + // The cache for the "web.browser" platform needs to be discarded + // whenever a client-only refresh occurs, so that new client code does + // not receive stale module data from __dynamicImport. This code handles + // the same message listened for by the autoupdate package. + if (msg && msg.refresh === "client") { + delete cachesByPlatform["web.browser"]; + } +}); From c6e27dc44708f50aee181c05f50327bd35126662 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Sun, 5 Feb 2017 13:08:59 -0500 Subject: [PATCH 013/195] Install dynamic modules with correct meteorInstall options. --- packages/dynamic-import/README.md | 1 + packages/dynamic-import/client.js | 56 ++++++++++++++++++++++--------- 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/packages/dynamic-import/README.md b/packages/dynamic-import/README.md index ea7b121df7..e7fe7c85ee 100644 --- a/packages/dynamic-import/README.md +++ b/packages/dynamic-import/README.md @@ -21,4 +21,5 @@ Remaining work: - [ ] Batch multiple __dynamicImport method calls. - [x] Make sure client-only reloads work (revisit _read caching). - [x] Make sure path manipulation is Windows-safe. +- [x] Install dynamic modules with correct `meteorInstall` options. - [ ] Tests! diff --git a/packages/dynamic-import/client.js b/packages/dynamic-import/client.js index 755baad591..e1bb39a548 100644 --- a/packages/dynamic-import/client.js +++ b/packages/dynamic-import/client.js @@ -43,24 +43,50 @@ Module.prototype.dynamicImport = function (id) { } ); - }).then(function (resultsTree) { - function walk(tree) { - if (typeof tree === "string") { - return (0, eval)("(" + tree + ")"); - } - - Object.keys(tree).forEach(function (name) { - tree[name] = walk(tree[name]); - }); - - return tree; - } - - meteorInstall(walk(resultsTree)); // TODO Options! - }).then(get); + }).then(installResults).then(get); }); }; +function installResults(resultsTree) { + var parts = [""]; + var trees = []; + var options = []; + + function walk(tree) { + if (typeof tree === "string") { + var meta = requireMeta(parts.join("/")); + var optionsIndex = options.indexOf(meta.options); + if (optionsIndex < 0) { + options[optionsIndex = options.length] = meta.options; + trees.push(Object.create(null)); + } + + // The results tree is partitioned into separate trees according + // to the meta.options object that governs the tree. Usually the + // number of trees will be approximately one, because options + // are shared by entire bundles. + addToTree( + trees[optionsIndex], + meta.module.id, + (0, eval)("(" + tree + ")") + ); + + } else { + Object.keys(tree).forEach(function (name) { + parts.push(name); + walk(tree[name]); + parts.pop(name); + }); + } + } + + walk(resultsTree); + + trees.forEach(function (tree, i) { + meteorInstall(tree, options[i]); + }); +} + function addToTree(tree, id, value) { var parts = id.split("/"); var lastIndex = parts.length - 1; From 7c5f8789edb74a59a858ebd56cdce9c819471a03 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Mon, 6 Feb 2017 09:54:05 -0500 Subject: [PATCH 014/195] Enable immutable caching for dynamic modules. Even though localStorage is a synchronous API, I wrote this code in an asynchronous style so that we can easily switch to an async API when/if that becomes preferable. While localStorage has stricter size limits than IndexedDB, retrieving data from IndexedDB is unbelievably slow (~10ms for each cache.check call). When developing locally, that delay pretty much destroys any benefit from caching. --- packages/dynamic-import/README.md | 4 +- packages/dynamic-import/cache.js | 59 +++++++++++++++++++++ packages/dynamic-import/client.js | 82 +++++++++++++++++++++--------- packages/dynamic-import/package.js | 1 + 4 files changed, 121 insertions(+), 25 deletions(-) create mode 100644 packages/dynamic-import/cache.js diff --git a/packages/dynamic-import/README.md b/packages/dynamic-import/README.md index e7fe7c85ee..0a7dd84cef 100644 --- a/packages/dynamic-import/README.md +++ b/packages/dynamic-import/README.md @@ -8,11 +8,11 @@ Remaining work: - [x] Modules are minified but not merged in production - [x] Wrap modules with function to enable better minification - [ ] Babel transform from `import(...)` to `module.importAsync(...)` -- [ ] Bundle cachability story +- [x] Local module caching. - [x] Compact `previous` state representation - [x] Improve dependency resolution in `packages/dynamic-import/server.js` - [x] Report static import/syntax/etc. errors for async files -- [ ] What about old/new versions of code? +- [x] What about old/new versions of code? - [ ] What about package pseudo-globals (imports)? - [x] What about dynamic stubs? - [x] Avoid creating dynamic files on the server. diff --git a/packages/dynamic-import/cache.js b/packages/dynamic-import/cache.js new file mode 100644 index 0000000000..7174b78c7d --- /dev/null +++ b/packages/dynamic-import/cache.js @@ -0,0 +1,59 @@ +var PREFIX = "dynamic-import:"; +var ID_PREFIX = PREFIX + "id:"; +var VERSION_PREFIX = PREFIX + "version:"; +var MISSING_ERROR = new Error("version not found"); +var pendingClean = null; + +function getItem(key) { + var value = Meteor._localStorage.getItem(key); + return typeof value === "string" + ? Promise.resolve(value) + : Promise.reject(MISSING_ERROR); +} + +function setItem(key, value) { + Meteor._localStorage.setItem(key, value); +} + +function clean() { + clearTimeout(pendingClean); + pendingClean = null; + + var activeVersions = Object.create(null); + var allVersions = Object.create(null); + + Object.keys(Meteor._localStorage).forEach(function (key) { + if (key.startsWith(ID_PREFIX)) { + activeVersions[Meteor._localStorage.getItem(key)] = true; + } else if (key.startsWith(VERSION_PREFIX)) { + var version = key.slice(VERSION_PREFIX.length); + allVersions[version] = key; + } + }); + + Object.keys(allVersions).forEach(function (version) { + if (activeVersions[version] !== true) { + Meteor._localStorage.removeItem(allVersions[version]); + } + }); +} + +exports.check = function check(id, currentVersion) { + return getItem(ID_PREFIX + id).then(function (previousVersion) { + if (currentVersion === previousVersion) { + return getItem(VERSION_PREFIX + previousVersion); + } + throw MISSING_ERROR; + }); +}; + +exports.set = function set(id, version, value) { + if (! pendingClean) { + pendingClean = setTimeout(clean, 1000); + } + + return Promise.all([ + setItem(VERSION_PREFIX + version, value), + setItem(ID_PREFIX + id, version) + ]); +}; diff --git a/packages/dynamic-import/client.js b/packages/dynamic-import/client.js index e1bb39a548..215e6de197 100644 --- a/packages/dynamic-import/client.js +++ b/packages/dynamic-import/client.js @@ -1,6 +1,7 @@ var Module = module.constructor; var delayPromise = Promise.resolve(); var requireMeta = meteorInstall._requireMeta; +var cache = require("./cache.js"); Module.prototype.dynamicImport = function (id) { // The real (not meta) parent module. @@ -11,42 +12,74 @@ Module.prototype.dynamicImport = function (id) { } return delayPromise.then(get).catch(function (error) { + var message = error.message; + if (! (message && + message.startsWith("Cannot find module"))) { + throw error; + } + // Require the current module from the complete meta graph. var meta = requireMeta(module.id); - var missingTree = Object.create(null); + var missingTree; + var localTree; function walk(meta) { - if (meta.dynamic && ! meta.pending) { - meta.pending = true; - addToTree(missingTree, meta.module.id, 1); - meta.eachChild(walkChild); + if (meta.dynamic) { + return meta.pending || (meta.pending = add( + meta.module.id, + meta.version + ).then(function () { + return allChildren(meta, walkChild); + })); } } - function walkChild(childModule) { - walk(childModule.exports); + function add(id, version) { + return cache.check(id, version).then(function (code) { + addToTree(localTree = localTree || Object.create(null), id, code); + }, function (missing) { + addToTree(missingTree = missingTree || Object.create(null), id, 1); + }); } - // The meta.eachChild iteration includes all child modules imported by - // meta.module, not just the child explicitly required here, so that - // implicit modules like package.json will be included too. See - // meteor/packages/modules-runtime/meteor-install.js for the - // definition of meta.eachChild. - meta.eachChild(walkChild, [id]); + function walkChild(childModule) { + return walk(childModule.exports); + } - return new Promise(function (resolve, reject) { - Meteor.call( - "__dynamicImport", - missingTree, - function (error, resultsTree) { - error ? reject(error) : resolve(resultsTree); - } - ); - - }).then(installResults).then(get); + return allChildren(meta, walkChild, [id]).then(function () { + if (localTree) { + installResults(localTree); + } + return missingTree && fetchMissing(missingTree); + }).then(get); }); }; +// The allChildren iteration includes all child modules imported by +// meta.module, not just the child explicitly required here, so that +// implicit modules like package.json will be included too. +function allChildren(meta, callback, idsToRequire) { + var results = []; + // See meteor/packages/modules-runtime/meteor-install.js for the + // definition of meta.eachChild. + meta.eachChild(function (child) { + results.push(callback(child)); + }, idsToRequire); + return Promise.all(results); +} + +function fetchMissing(missingTree) { + return new Promise(function (resolve, reject) { + Meteor.call( + "__dynamicImport", + missingTree, + function (error, resultsTree) { + error ? reject(error) : resolve(resultsTree); + } + ); + }).then(installResults); +} + function installResults(resultsTree) { var parts = [""]; var trees = []; @@ -71,6 +104,9 @@ function installResults(resultsTree) { (0, eval)("(" + tree + ")") ); + // Intentionally do not delay resolution waiting for the cache. + cache.set(meta.module.id, meta.version, tree); + } else { Object.keys(tree).forEach(function (name) { parts.push(name); diff --git a/packages/dynamic-import/package.js b/packages/dynamic-import/package.js index bb86dedac1..5707f6e314 100644 --- a/packages/dynamic-import/package.js +++ b/packages/dynamic-import/package.js @@ -7,6 +7,7 @@ Package.describe({ Package.onUse(function (api) { api.use("modules"); + api.use("localstorage"); api.use("ecmascript", "server"); api.mainModule("client.js", "client"); api.mainModule("server.js", "server"); From 0c5f6ae7b1134d385cd78eaf80b54a3494f389c2 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Mon, 6 Feb 2017 18:16:28 -0500 Subject: [PATCH 015/195] Upgrade `reify` npm package to version 0.4.7. --- History.md | 2 ++ .../modules/.npm/package/npm-shrinkwrap.json | 28 +++++++++---------- packages/modules/package.js | 2 +- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/History.md b/History.md index 998df42b36..ce2269b861 100644 --- a/History.md +++ b/History.md @@ -17,6 +17,8 @@ fixing [#8021](https://github.com/meteor/meteor/issues/8021) and [#7662](https://github.com/meteor/meteor/issues/7662). +* The `reify` npm package has been upgraded to 0.4.7. + * Added support for frame-ancestors CSP option in browser-policy. [#7970](https://github.com/meteor/meteor/pull/7970) diff --git a/packages/modules/.npm/package/npm-shrinkwrap.json b/packages/modules/.npm/package/npm-shrinkwrap.json index eff3d98216..a83c8e4619 100644 --- a/packages/modules/.npm/package/npm-shrinkwrap.json +++ b/packages/modules/.npm/package/npm-shrinkwrap.json @@ -1,29 +1,29 @@ { "dependencies": { "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "from": "acorn@>=3.3.0 <3.4.0" + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.9.tgz", + "from": "acorn@>=4.0.5 <4.1.0" }, "acorn-es7-plugin": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/acorn-es7-plugin/-/acorn-es7-plugin-1.1.3.tgz", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/acorn-es7-plugin/-/acorn-es7-plugin-1.1.5.tgz", "from": "acorn-es7-plugin@>=1.1.0 <1.2.0" }, "ast-types": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.2.tgz", - "from": "ast-types@>=0.9.0 <0.10.0" + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.5.tgz", + "from": "ast-types@>=0.9.5 <0.10.0" }, "magic-string": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.16.0.tgz", - "from": "magic-string@>=0.16.0 <0.17.0" + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.19.0.tgz", + "from": "magic-string@>=0.19.0 <0.20.0" }, "reify": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/reify/-/reify-0.4.4.tgz", - "from": "reify@0.4.4" + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/reify/-/reify-0.4.7.tgz", + "from": "reify@0.4.7" }, "vlq": { "version": "0.2.1", diff --git a/packages/modules/package.js b/packages/modules/package.js index a50d1c5754..42975e262f 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -6,7 +6,7 @@ Package.describe({ }); Npm.depends({ - reify: "0.4.4" + reify: "0.4.7" }); Package.onUse(function(api) { From 7adac542244a5f9f8842c88d17f9a909a95ed019 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Mon, 6 Feb 2017 18:14:42 -0500 Subject: [PATCH 016/195] Upgrade the `meteor-babel` npm package to version 0.15.1. --- History.md | 2 +- .../.npm/package/npm-shrinkwrap.json | 390 +++++++++--------- packages/babel-compiler/package.js | 4 +- packages/dynamic-import/README.md | 2 +- scripts/dev-bundle-tool-package.js | 2 +- 5 files changed, 205 insertions(+), 195 deletions(-) diff --git a/History.md b/History.md index ce2269b861..88247f7ef6 100644 --- a/History.md +++ b/History.md @@ -13,7 +13,7 @@ [Issue #7715](https://github.com/meteor/meteor/issues/7715) [PR #7728](https://github.com/meteor/meteor/pull/7728) -* The `meteor-babel` npm package has been upgraded to version 0.14.3, +* The `meteor-babel` npm package has been upgraded to version 0.15.1, fixing [#8021](https://github.com/meteor/meteor/issues/8021) and [#7662](https://github.com/meteor/meteor/issues/7662). diff --git a/packages/babel-compiler/.npm/package/npm-shrinkwrap.json b/packages/babel-compiler/.npm/package/npm-shrinkwrap.json index 21ecc62663..61fb5960cc 100644 --- a/packages/babel-compiler/.npm/package/npm-shrinkwrap.json +++ b/packages/babel-compiler/.npm/package/npm-shrinkwrap.json @@ -1,18 +1,18 @@ { "dependencies": { "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "from": "acorn@>=3.3.0 <3.4.0" + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.9.tgz", + "from": "acorn@>=4.0.5 <4.1.0" }, "acorn-es7-plugin": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/acorn-es7-plugin/-/acorn-es7-plugin-1.1.3.tgz", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/acorn-es7-plugin/-/acorn-es7-plugin-1.1.5.tgz", "from": "acorn-es7-plugin@>=1.1.0 <1.2.0" }, "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "from": "ansi-regex@>=2.0.0 <3.0.0" }, "ansi-styles": { @@ -21,84 +21,84 @@ "from": "ansi-styles@>=2.2.1 <3.0.0" }, "ast-types": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.2.tgz", - "from": "ast-types@>=0.9.0 <0.10.0" + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.5.tgz", + "from": "ast-types@>=0.9.5 <0.10.0" }, "babel-code-frame": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.16.0.tgz", - "from": "babel-code-frame@>=6.16.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "from": "babel-code-frame@>=6.22.0 <7.0.0" }, "babel-core": { - "version": "6.18.2", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.18.2.tgz", - "from": "babel-core@>=6.18.2 <7.0.0" + "version": "6.22.1", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.22.1.tgz", + "from": "babel-core@>=6.22.1 <7.0.0" }, "babel-generator": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.19.0.tgz", - "from": "babel-generator@>=6.18.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.22.0.tgz", + "from": "babel-generator@>=6.22.0 <7.0.0" }, "babel-helper-builder-react-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.18.0.tgz", - "from": "babel-helper-builder-react-jsx@>=6.8.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.22.0.tgz", + "from": "babel-helper-builder-react-jsx@>=6.22.0 <7.0.0" }, "babel-helper-call-delegate": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.18.0.tgz", - "from": "babel-helper-call-delegate@>=6.18.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.22.0.tgz", + "from": "babel-helper-call-delegate@>=6.22.0 <7.0.0" }, "babel-helper-define-map": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz", - "from": "babel-helper-define-map@>=6.18.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.22.0.tgz", + "from": "babel-helper-define-map@>=6.22.0 <7.0.0" }, "babel-helper-function-name": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz", - "from": "babel-helper-function-name@>=6.18.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.22.0.tgz", + "from": "babel-helper-function-name@>=6.22.0 <7.0.0" }, "babel-helper-get-function-arity": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz", - "from": "babel-helper-get-function-arity@>=6.18.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.22.0.tgz", + "from": "babel-helper-get-function-arity@>=6.22.0 <7.0.0" }, "babel-helper-hoist-variables": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.18.0.tgz", - "from": "babel-helper-hoist-variables@>=6.18.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.22.0.tgz", + "from": "babel-helper-hoist-variables@>=6.22.0 <7.0.0" }, "babel-helper-optimise-call-expression": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz", - "from": "babel-helper-optimise-call-expression@>=6.18.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.22.0.tgz", + "from": "babel-helper-optimise-call-expression@>=6.22.0 <7.0.0" }, "babel-helper-regex": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.18.0.tgz", - "from": "babel-helper-regex@>=6.8.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.22.0.tgz", + "from": "babel-helper-regex@>=6.22.0 <7.0.0" }, "babel-helper-replace-supers": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz", - "from": "babel-helper-replace-supers@>=6.18.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.22.0.tgz", + "from": "babel-helper-replace-supers@>=6.22.0 <7.0.0" }, "babel-helpers": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.16.0.tgz", - "from": "babel-helpers@>=6.16.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.22.0.tgz", + "from": "babel-helpers@>=6.22.0 <7.0.0" }, "babel-messages": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.8.0.tgz", - "from": "babel-messages@>=6.8.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.22.0.tgz", + "from": "babel-messages@>=6.22.0 <7.0.0" }, "babel-plugin-check-es2015-constants": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.8.0.tgz", - "from": "babel-plugin-check-es2015-constants@>=6.8.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "from": "babel-plugin-check-es2015-constants@>=6.22.0 <7.0.0" }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", @@ -110,10 +110,15 @@ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", "from": "babel-plugin-syntax-async-generators@>=6.13.0 <7.0.0" }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "from": "babel-plugin-syntax-dynamic-import@>=6.18.0 <7.0.0" + }, "babel-plugin-syntax-flow": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "from": "babel-plugin-syntax-flow@>=6.13.0 <7.0.0" + "from": "babel-plugin-syntax-flow@>=6.18.0 <7.0.0" }, "babel-plugin-syntax-jsx": { "version": "6.18.0", @@ -126,184 +131,184 @@ "from": "babel-plugin-syntax-object-rest-spread@>=6.13.0 <7.0.0" }, "babel-plugin-syntax-trailing-function-commas": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.13.0.tgz", - "from": "babel-plugin-syntax-trailing-function-commas@>=6.13.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "from": "babel-plugin-syntax-trailing-function-commas@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz", - "from": "babel-plugin-transform-es2015-arrow-functions@>=6.8.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "from": "babel-plugin-transform-es2015-arrow-functions@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz", - "from": "babel-plugin-transform-es2015-block-scoped-functions@>=6.8.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "from": "babel-plugin-transform-es2015-block-scoped-functions@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-block-scoping": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.18.0.tgz", - "from": "babel-plugin-transform-es2015-block-scoping@>=6.15.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.22.0.tgz", + "from": "babel-plugin-transform-es2015-block-scoping@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-classes": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz", - "from": "babel-plugin-transform-es2015-classes@>=6.14.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.22.0.tgz", + "from": "babel-plugin-transform-es2015-classes@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-computed-properties": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz", - "from": "babel-plugin-transform-es2015-computed-properties@>=6.8.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.22.0.tgz", + "from": "babel-plugin-transform-es2015-computed-properties@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-destructuring": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.19.0.tgz", - "from": "babel-plugin-transform-es2015-destructuring@>=6.16.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.22.0.tgz", + "from": "babel-plugin-transform-es2015-destructuring@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-for-of": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.18.0.tgz", - "from": "babel-plugin-transform-es2015-for-of@>=6.8.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.22.0.tgz", + "from": "babel-plugin-transform-es2015-for-of@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-literals": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz", - "from": "babel-plugin-transform-es2015-literals@>=6.8.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "from": "babel-plugin-transform-es2015-literals@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.18.0.tgz", - "from": "babel-plugin-transform-es2015-modules-commonjs@>=6.18.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.22.0.tgz", + "from": "babel-plugin-transform-es2015-modules-commonjs@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-object-super": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz", - "from": "babel-plugin-transform-es2015-object-super@>=6.8.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.22.0.tgz", + "from": "babel-plugin-transform-es2015-object-super@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-parameters": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.18.0.tgz", - "from": "babel-plugin-transform-es2015-parameters@>=6.17.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.22.0.tgz", + "from": "babel-plugin-transform-es2015-parameters@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.18.0.tgz", - "from": "babel-plugin-transform-es2015-shorthand-properties@>=6.8.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.22.0.tgz", + "from": "babel-plugin-transform-es2015-shorthand-properties@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-spread": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.8.0.tgz", - "from": "babel-plugin-transform-es2015-spread@>=6.8.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "from": "babel-plugin-transform-es2015-spread@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.8.0.tgz", - "from": "babel-plugin-transform-es2015-sticky-regex@>=6.8.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.22.0.tgz", + "from": "babel-plugin-transform-es2015-sticky-regex@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-template-literals": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz", - "from": "babel-plugin-transform-es2015-template-literals@>=6.8.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "from": "babel-plugin-transform-es2015-template-literals@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.18.0.tgz", - "from": "babel-plugin-transform-es2015-typeof-symbol@>=6.8.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.22.0.tgz", + "from": "babel-plugin-transform-es2015-typeof-symbol@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.11.0.tgz", - "from": "babel-plugin-transform-es2015-unicode-regex@>=6.11.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.22.0.tgz", + "from": "babel-plugin-transform-es2015-unicode-regex@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es3-property-literals": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-property-literals/-/babel-plugin-transform-es3-property-literals-6.8.0.tgz", - "from": "babel-plugin-transform-es3-property-literals@>=6.8.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-property-literals/-/babel-plugin-transform-es3-property-literals-6.22.0.tgz", + "from": "babel-plugin-transform-es3-property-literals@>=6.22.0 <7.0.0" }, "babel-plugin-transform-flow-strip-types": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.18.0.tgz", - "from": "babel-plugin-transform-flow-strip-types@>=6.14.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "from": "babel-plugin-transform-flow-strip-types@>=6.22.0 <7.0.0" }, "babel-plugin-transform-object-rest-spread": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.19.0.tgz", - "from": "babel-plugin-transform-object-rest-spread@>=6.16.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.22.0.tgz", + "from": "babel-plugin-transform-object-rest-spread@>=6.22.0 <7.0.0" }, "babel-plugin-transform-react-display-name": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.8.0.tgz", - "from": "babel-plugin-transform-react-display-name@>=6.3.13 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.22.0.tgz", + "from": "babel-plugin-transform-react-display-name@>=6.22.0 <7.0.0" }, "babel-plugin-transform-react-jsx": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.8.0.tgz", - "from": "babel-plugin-transform-react-jsx@>=6.3.13 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.22.0.tgz", + "from": "babel-plugin-transform-react-jsx@>=6.22.0 <7.0.0" }, "babel-plugin-transform-react-jsx-self": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.11.0.tgz", - "from": "babel-plugin-transform-react-jsx-self@>=6.11.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", + "from": "babel-plugin-transform-react-jsx-self@>=6.22.0 <7.0.0" }, "babel-plugin-transform-react-jsx-source": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.9.0.tgz", - "from": "babel-plugin-transform-react-jsx-source@>=6.3.13 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "from": "babel-plugin-transform-react-jsx-source@>=6.22.0 <7.0.0" }, "babel-plugin-transform-regenerator": { - "version": "6.16.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.16.1.tgz", - "from": "babel-plugin-transform-regenerator@>=6.16.1 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.22.0.tgz", + "from": "babel-plugin-transform-regenerator@>=6.22.0 <7.0.0" }, "babel-plugin-transform-runtime": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.15.0.tgz", - "from": "babel-plugin-transform-runtime@>=6.15.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.22.0.tgz", + "from": "babel-plugin-transform-runtime@>=6.22.0 <7.0.0" }, "babel-plugin-transform-strict-mode": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.18.0.tgz", - "from": "babel-plugin-transform-strict-mode@>=6.18.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.22.0.tgz", + "from": "babel-plugin-transform-strict-mode@>=6.22.0 <7.0.0" }, "babel-preset-meteor": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/babel-preset-meteor/-/babel-preset-meteor-6.14.0.tgz", - "from": "babel-preset-meteor@6.14.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-preset-meteor/-/babel-preset-meteor-6.22.0.tgz", + "from": "babel-preset-meteor@6.22.0" }, "babel-preset-react": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.16.0.tgz", - "from": "babel-preset-react@>=6.16.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.22.0.tgz", + "from": "babel-preset-react@>=6.22.0 <7.0.0" }, "babel-register": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.18.0.tgz", - "from": "babel-register@>=6.18.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.22.0.tgz", + "from": "babel-register@>=6.22.0 <7.0.0" }, "babel-runtime": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.18.0.tgz", - "from": "babel-runtime@>=6.18.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.22.0.tgz", + "from": "babel-runtime@>=6.22.0 <7.0.0" }, "babel-template": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.16.0.tgz", - "from": "babel-template@>=6.16.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.22.0.tgz", + "from": "babel-template@>=6.22.0 <7.0.0" }, "babel-traverse": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.19.0.tgz", - "from": "babel-traverse@>=6.18.0 <7.0.0" + "version": "6.22.1", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.22.1.tgz", + "from": "babel-traverse@>=6.22.1 <7.0.0" }, "babel-types": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.19.0.tgz", - "from": "babel-types@>=6.18.0 <7.0.0" + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.22.0.tgz", + "from": "babel-types@>=6.22.0 <7.0.0" }, "babylon": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.14.1.tgz", - "from": "babylon@>=6.13.1 <7.0.0" + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.15.0.tgz", + "from": "babylon@>=6.15.0 <7.0.0" }, "balanced-match": { "version": "0.4.2", @@ -336,8 +341,8 @@ "from": "core-js@>=2.4.0 <3.0.0" }, "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.0.tgz", "from": "debug@>=2.1.1 <3.0.0" }, "detect-indent": { @@ -381,9 +386,9 @@ "from": "is-finite@>=1.0.0 <2.0.0" }, "js-tokens": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-2.0.0.tgz", - "from": "js-tokens@>=2.0.0 <3.0.0" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", + "from": "js-tokens@>=3.0.0 <4.0.0" }, "jsesc": { "version": "1.3.0", @@ -396,24 +401,24 @@ "from": "json5@>=0.5.0 <0.6.0" }, "lodash": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz", - "from": "lodash@>=4.16.4 <5.0.0" + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "from": "lodash@>=4.17.4 <5.0.0" }, "loose-envify": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.0.tgz", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", "from": "loose-envify@>=1.0.0 <2.0.0" }, "magic-string": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.16.0.tgz", - "from": "magic-string@>=0.16.0 <0.17.0" + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.19.0.tgz", + "from": "magic-string@>=0.19.0 <0.20.0" }, "meteor-babel": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/meteor-babel/-/meteor-babel-0.14.3.tgz", - "from": "meteor-babel@0.14.3" + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/meteor-babel/-/meteor-babel-0.15.1.tgz", + "from": "meteor-babel@0.15.1" }, "meteor-babel-helpers": { "version": "0.0.3", @@ -461,8 +466,8 @@ "from": "path-is-absolute@>=1.0.0 <2.0.0" }, "private": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.6.tgz", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", "from": "private@>=0.1.6 <0.2.0" }, "regenerate": { @@ -471,9 +476,14 @@ "from": "regenerate@>=1.2.1 <2.0.0" }, "regenerator-runtime": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz", - "from": "regenerator-runtime@>=0.9.5 <0.10.0" + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz", + "from": "regenerator-runtime@>=0.10.0 <0.11.0" + }, + "regenerator-transform": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.8.tgz", + "from": "regenerator-transform@0.9.8" }, "regexpu-core": { "version": "2.0.0", @@ -498,9 +508,9 @@ } }, "reify": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/reify/-/reify-0.4.4.tgz", - "from": "reify@>=0.4.0 <0.5.0" + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/reify/-/reify-0.4.7.tgz", + "from": "reify@>=0.4.7 <0.5.0" }, "repeating": { "version": "2.0.1", @@ -518,8 +528,8 @@ "from": "source-map@>=0.5.0 <0.6.0" }, "source-map-support": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.6.tgz", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.11.tgz", "from": "source-map-support@>=0.4.2 <0.5.0" }, "strip-ansi": { diff --git a/packages/babel-compiler/package.js b/packages/babel-compiler/package.js index 8555ad4923..617402d0a2 100644 --- a/packages/babel-compiler/package.js +++ b/packages/babel-compiler/package.js @@ -6,11 +6,11 @@ Package.describe({ // isn't possible because you can't publish a non-recommended // release with package versions that don't have a pre-release // identifier at the end (eg, -dev) - version: '6.14.0-rc.1' + version: '6.15.0' }); Npm.depends({ - 'meteor-babel': '0.14.3' + 'meteor-babel': '0.15.1' }); Package.onUse(function (api) { diff --git a/packages/dynamic-import/README.md b/packages/dynamic-import/README.md index 0a7dd84cef..b65c33903c 100644 --- a/packages/dynamic-import/README.md +++ b/packages/dynamic-import/README.md @@ -7,7 +7,7 @@ Remaining work: - [x] Make `import(...)` work on the server - [x] Modules are minified but not merged in production - [x] Wrap modules with function to enable better minification -- [ ] Babel transform from `import(...)` to `module.importAsync(...)` +- [x] Babel transform from `import(...)` to `module.importAsync(...)` - [x] Local module caching. - [x] Compact `previous` state representation - [x] Improve dependency resolution in `packages/dynamic-import/server.js` diff --git a/scripts/dev-bundle-tool-package.js b/scripts/dev-bundle-tool-package.js index e737c461bc..269de060c4 100644 --- a/scripts/dev-bundle-tool-package.js +++ b/scripts/dev-bundle-tool-package.js @@ -14,7 +14,7 @@ var packageJson = { npm: "4.1.2", "node-gyp": "3.4.0", "node-pre-gyp": "0.6.30", - "meteor-babel": "0.14.3", + "meteor-babel": "0.15.1", "meteor-promise": "0.8.0", fibers: "1.0.15", promise: "7.1.1", From 8e344a324a58c6529a7bb8dc9b1d358e549ad04d Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Mon, 6 Feb 2017 20:26:26 -0500 Subject: [PATCH 017/195] Bump LINKER_CACHE_SALT and compiler.BUILT_BY for good measure. --- tools/isobuild/compiler-plugin.js | 2 +- tools/isobuild/compiler.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/isobuild/compiler-plugin.js b/tools/isobuild/compiler-plugin.js index 164fca22c0..96a01c1d9b 100644 --- a/tools/isobuild/compiler-plugin.js +++ b/tools/isobuild/compiler-plugin.js @@ -62,7 +62,7 @@ import { isTestFilePath } from './test-files.js'; // Cache the (slightly post-processed) results of linker.fullLink. const CACHE_SIZE = process.env.METEOR_LINKER_CACHE_SIZE || 1024*1024*100; const CACHE_DEBUG = !! process.env.METEOR_TEST_PRINT_LINKER_CACHE_DEBUG; -const LINKER_CACHE_SALT = 13; // Increment this number to force relinking. +const LINKER_CACHE_SALT = 14; // Increment this number to force relinking. const LINKER_CACHE = new LRU({ max: CACHE_SIZE, // Cache is measured in bytes. We don't care about servePath. diff --git a/tools/isobuild/compiler.js b/tools/isobuild/compiler.js index bca69ccf4b..c00f588617 100644 --- a/tools/isobuild/compiler.js +++ b/tools/isobuild/compiler.js @@ -34,7 +34,7 @@ var compiler = exports; // dependencies. (At least for now, packages only used in target creation (eg // minifiers) don't require you to update BUILT_BY, though you will need to quit // and rerun "meteor run".) -compiler.BUILT_BY = 'meteor/26'; +compiler.BUILT_BY = 'meteor/27'; // This is a list of all possible architectures that a build can target. (Client // is expanded into 'web.browser' and 'web.cordova') From d26c554bce815046796a22421bc529cf535fee58 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Mon, 6 Feb 2017 20:00:08 -0500 Subject: [PATCH 018/195] Bump $BUNDLE_VERSION to 4.8.0 before rebuilding dev bundle. --- meteor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meteor b/meteor index 4c6f1a5d23..61dcd6d9b9 100755 --- a/meteor +++ b/meteor @@ -1,6 +1,6 @@ #!/usr/bin/env bash -BUNDLE_VERSION=4.7.8 +BUNDLE_VERSION=4.8.0 # OS Check. Put here because here is where we download the precompiled # bundles that are arch specific. From 5ff0f4f98702f059684d4fef04c234bbd62e2675 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Tue, 7 Feb 2017 18:54:40 -0500 Subject: [PATCH 019/195] Fix test failures by re-anonymizing module wrapper functions. --- tools/isobuild/bundler.js | 22 ++++++++++++++++++++++ tools/isobuild/linker.js | 7 +------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/tools/isobuild/bundler.js b/tools/isobuild/bundler.js index a41f9e8bc8..3c986f085b 100644 --- a/tools/isobuild/bundler.js +++ b/tools/isobuild/bundler.js @@ -1178,8 +1178,25 @@ class Target { this.js.forEach(file => { const jsf = new JsFile(file, { arch: this.arch }); + if (file.targetPath.startsWith("dynamic/")) { + // Make sure file._hash is cached. + file.hash(); + + // Dynamic files consist of a single anonymous function + // expression, which some minifiers (e.g. UglifyJS) either fail to + // parse or mistakenly eliminate as dead code. To avoid these + // problems, we temporarily name the function __minifyJs. + file._contents = new Buffer( + file.contents() + .toString("utf8") + .replace(/^\s*function\s*\(/, + "function __minifyJs("), + "utf8" + ); + dynamicFiles.push(jsf); + } else { staticFiles.push(jsf); } @@ -1204,6 +1221,11 @@ class Target { function handle(source, dynamic) { const newFiles = source._minifiedFiles.map(file => { + // Remove the function name __minifyJs that was added above. + file.data = file.data + .replace(/^\s*function\s+__minifyJs\s*\(/, + "function("); + const newFile = new File({ info: 'minified js', data: new Buffer(file.data, 'utf8'), diff --git a/tools/isobuild/linker.js b/tools/isobuild/linker.js index d1721d053b..84597aee8a 100644 --- a/tools/isobuild/linker.js +++ b/tools/isobuild/linker.js @@ -585,12 +585,7 @@ _.extend(File.prototype, { _getClosureHeader() { if (this._useMeteorInstall()) { - // The wrapper function is named "module" so that the UglifyJS - // minifier will parse it as a function declaration, because - // UglifyJS has trouble parsing single function expressions. If the - // module refers to `module`, however, it will be referring to the - // parameter of that name, rather than the function name. - const headerParts = ["function module("]; + const headerParts = ["function("]; if (this.source.match(/\b__dirname\b/)) { headerParts.push("require,exports,module,__filename,__dirname"); From c3f9ec403273f736bcb2b3b9b7a21aca29687125 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Tue, 7 Feb 2017 16:43:09 -0500 Subject: [PATCH 020/195] Bump package versions for 1.5-beta.0 release. --- packages/babel-compiler/package.js | 2 +- packages/dynamic-import/package.js | 2 +- packages/localstorage/package.js | 2 +- packages/meteor-tool/package.js | 2 +- packages/modules-runtime/package.js | 2 +- packages/modules/package.js | 2 +- scripts/admin/meteor-release-experimental.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/babel-compiler/package.js b/packages/babel-compiler/package.js index 617402d0a2..fdaf4bb914 100644 --- a/packages/babel-compiler/package.js +++ b/packages/babel-compiler/package.js @@ -6,7 +6,7 @@ Package.describe({ // isn't possible because you can't publish a non-recommended // release with package versions that don't have a pre-release // identifier at the end (eg, -dev) - version: '6.15.0' + version: '6.15.0-beta.0' }); Npm.depends({ diff --git a/packages/dynamic-import/package.js b/packages/dynamic-import/package.js index 5707f6e314..4b7d3fe938 100644 --- a/packages/dynamic-import/package.js +++ b/packages/dynamic-import/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "dynamic-import", - version: "0.0.1", + version: "0.1.0-beta.0", summary: "Support for module.dynamicImport(id).then(namespace => ...)", documentation: "README.md" }); diff --git a/packages/localstorage/package.js b/packages/localstorage/package.js index 744d9eee5f..921f0d1968 100644 --- a/packages/localstorage/package.js +++ b/packages/localstorage/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Simulates local storage on IE 6,7 using userData", - version: "1.1.0" + version: "1.1.0-beta.0" }); Package.onUse(function (api) { diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js index 9d0908b330..f98342660b 100644 --- a/packages/meteor-tool/package.js +++ b/packages/meteor-tool/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "The Meteor command-line tool", - version: '1.4.3-rc.1' + version: '1.5.0-beta.0' }); Package.includeTool(); diff --git a/packages/modules-runtime/package.js b/packages/modules-runtime/package.js index 6480d94ca8..7f76b2512e 100644 --- a/packages/modules-runtime/package.js +++ b/packages/modules-runtime/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules-runtime", - version: "0.7.9-rc.1", + version: "0.8.0-beta.0", summary: "CommonJS module system", git: "https://github.com/benjamn/install", documentation: "README.md" diff --git a/packages/modules/package.js b/packages/modules/package.js index 42975e262f..f289eb1cb9 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules", - version: "0.7.8-rc.1", + version: "0.8.0-beta.0", summary: "CommonJS module system", documentation: "README.md" }); diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json index f17a300954..4f6e7a5af1 100644 --- a/scripts/admin/meteor-release-experimental.json +++ b/scripts/admin/meteor-release-experimental.json @@ -1,6 +1,6 @@ { "track": "METEOR", - "version": "1.4.3-rc.1", + "version": "1.5-beta.0", "recommended": false, "official": false, "description": "Meteor" From 4baa5a44dc79ecf2ac0a66d7c6fbcc62d2a4ea34 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Tue, 7 Feb 2017 20:06:10 -0500 Subject: [PATCH 021/195] Allow file.data to be a Buffer in Target#minifyJs. --- tools/isobuild/bundler.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/isobuild/bundler.js b/tools/isobuild/bundler.js index 3c986f085b..e38644b395 100644 --- a/tools/isobuild/bundler.js +++ b/tools/isobuild/bundler.js @@ -1223,6 +1223,7 @@ class Target { const newFiles = source._minifiedFiles.map(file => { // Remove the function name __minifyJs that was added above. file.data = file.data + .toString("utf8") .replace(/^\s*function\s+__minifyJs\s*\(/, "function("); From 2f3aba96f37ff5787bdc3d24e72e9738d09a682a Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Tue, 7 Feb 2017 20:07:36 -0500 Subject: [PATCH 022/195] Bump package versions for 1.5-beta.1 release. --- packages/babel-compiler/package.js | 2 +- packages/dynamic-import/package.js | 2 +- packages/localstorage/package.js | 2 +- packages/meteor-tool/package.js | 2 +- packages/modules-runtime/package.js | 2 +- packages/modules/package.js | 2 +- scripts/admin/meteor-release-experimental.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/babel-compiler/package.js b/packages/babel-compiler/package.js index fdaf4bb914..27ccd2dc40 100644 --- a/packages/babel-compiler/package.js +++ b/packages/babel-compiler/package.js @@ -6,7 +6,7 @@ Package.describe({ // isn't possible because you can't publish a non-recommended // release with package versions that don't have a pre-release // identifier at the end (eg, -dev) - version: '6.15.0-beta.0' + version: '6.15.0-beta.1' }); Npm.depends({ diff --git a/packages/dynamic-import/package.js b/packages/dynamic-import/package.js index 4b7d3fe938..949c91b381 100644 --- a/packages/dynamic-import/package.js +++ b/packages/dynamic-import/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "dynamic-import", - version: "0.1.0-beta.0", + version: "0.1.0-beta.1", summary: "Support for module.dynamicImport(id).then(namespace => ...)", documentation: "README.md" }); diff --git a/packages/localstorage/package.js b/packages/localstorage/package.js index 921f0d1968..2e4fcfaa82 100644 --- a/packages/localstorage/package.js +++ b/packages/localstorage/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Simulates local storage on IE 6,7 using userData", - version: "1.1.0-beta.0" + version: "1.1.0-beta.1" }); Package.onUse(function (api) { diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js index f98342660b..eb8c5a09c2 100644 --- a/packages/meteor-tool/package.js +++ b/packages/meteor-tool/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "The Meteor command-line tool", - version: '1.5.0-beta.0' + version: '1.5.0-beta.1' }); Package.includeTool(); diff --git a/packages/modules-runtime/package.js b/packages/modules-runtime/package.js index 7f76b2512e..b1366f61ea 100644 --- a/packages/modules-runtime/package.js +++ b/packages/modules-runtime/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules-runtime", - version: "0.8.0-beta.0", + version: "0.8.0-beta.1", summary: "CommonJS module system", git: "https://github.com/benjamn/install", documentation: "README.md" diff --git a/packages/modules/package.js b/packages/modules/package.js index f289eb1cb9..72457822f8 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules", - version: "0.8.0-beta.0", + version: "0.8.0-beta.1", summary: "CommonJS module system", documentation: "README.md" }); diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json index 4f6e7a5af1..6e8c314880 100644 --- a/scripts/admin/meteor-release-experimental.json +++ b/scripts/admin/meteor-release-experimental.json @@ -1,6 +1,6 @@ { "track": "METEOR", - "version": "1.5-beta.0", + "version": "1.5-beta.1", "recommended": false, "official": false, "description": "Meteor" From 2537707cb39a8400f56452a08e367ee7ade5bbe2 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Tue, 7 Feb 2017 20:25:30 -0500 Subject: [PATCH 023/195] Disable optimistic caching for `meteor --get-ready` on Circle CI. We (@abernix and I) suspect the intermittent "died unexpectedly" failures of `meteor --get-ready` on Circle CI are due to hitting their (low) limit on the maximum number of open files. Although optimistic caching speeds up rebuilds considerably, it doesn't do much for initial builds, and it definitely keeps more files open. Disabling it here seems worth a try. --- circle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/circle.yml b/circle.yml index 393d52c371..e1f034758c 100644 --- a/circle.yml +++ b/circle.yml @@ -12,7 +12,7 @@ dependencies: - ".babel-cache" override: # shouldn't take longer than 10 minutes - - METEOR_PRETTY_OUTPUT=0 ./meteor --get-ready: + - METEOR_PRETTY_OUTPUT=0 METEOR_DISABLE_OPTIMISTIC_CACHING=1 ./meteor --get-ready: timeout: 600 test: From 79e5e7ef8dbf623cfb002375d07164acef10be8f Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Wed, 8 Feb 2017 12:39:01 -0500 Subject: [PATCH 024/195] Bump package versions for 1.5-beta.2 release. --- packages/babel-compiler/package.js | 2 +- packages/dynamic-import/package.js | 2 +- packages/ecmascript/package.js | 2 +- packages/localstorage/package.js | 2 +- packages/meteor-tool/package.js | 2 +- packages/modules-runtime/package.js | 2 +- packages/modules/package.js | 2 +- scripts/admin/meteor-release-experimental.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/babel-compiler/package.js b/packages/babel-compiler/package.js index 27ccd2dc40..aa4ab2aabf 100644 --- a/packages/babel-compiler/package.js +++ b/packages/babel-compiler/package.js @@ -6,7 +6,7 @@ Package.describe({ // isn't possible because you can't publish a non-recommended // release with package versions that don't have a pre-release // identifier at the end (eg, -dev) - version: '6.15.0-beta.1' + version: '6.15.0-beta.2' }); Npm.depends({ diff --git a/packages/dynamic-import/package.js b/packages/dynamic-import/package.js index 949c91b381..f73c48f559 100644 --- a/packages/dynamic-import/package.js +++ b/packages/dynamic-import/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "dynamic-import", - version: "0.1.0-beta.1", + version: "0.1.0-beta.2", summary: "Support for module.dynamicImport(id).then(namespace => ...)", documentation: "README.md" }); diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js index 37a041d709..3228bdbfcb 100644 --- a/packages/ecmascript/package.js +++ b/packages/ecmascript/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'ecmascript', - version: '0.6.2-rc.1', + version: '0.7.0-beta.2', summary: 'Compiler plugin that supports ES2015+ in all .js files', documentation: 'README.md' }); diff --git a/packages/localstorage/package.js b/packages/localstorage/package.js index 2e4fcfaa82..fde3497f03 100644 --- a/packages/localstorage/package.js +++ b/packages/localstorage/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Simulates local storage on IE 6,7 using userData", - version: "1.1.0-beta.1" + version: "1.1.0-beta.2" }); Package.onUse(function (api) { diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js index eb8c5a09c2..f9e3388d25 100644 --- a/packages/meteor-tool/package.js +++ b/packages/meteor-tool/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "The Meteor command-line tool", - version: '1.5.0-beta.1' + version: '1.5.0-beta.2' }); Package.includeTool(); diff --git a/packages/modules-runtime/package.js b/packages/modules-runtime/package.js index b1366f61ea..a720232ec4 100644 --- a/packages/modules-runtime/package.js +++ b/packages/modules-runtime/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules-runtime", - version: "0.8.0-beta.1", + version: "0.8.0-beta.2", summary: "CommonJS module system", git: "https://github.com/benjamn/install", documentation: "README.md" diff --git a/packages/modules/package.js b/packages/modules/package.js index 72457822f8..20ed0a418d 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules", - version: "0.8.0-beta.1", + version: "0.8.0-beta.2", summary: "CommonJS module system", documentation: "README.md" }); diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json index 6e8c314880..7999cac923 100644 --- a/scripts/admin/meteor-release-experimental.json +++ b/scripts/admin/meteor-release-experimental.json @@ -1,6 +1,6 @@ { "track": "METEOR", - "version": "1.5-beta.1", + "version": "1.5-beta.2", "recommended": false, "official": false, "description": "Meteor" From 9b016bd28d14ee762f1be87d6fb82948cf914c2e Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Wed, 8 Feb 2017 18:34:19 -0500 Subject: [PATCH 025/195] Rename `modules` to `real` in modules-runtime/meteor-install.js. I think `real` is a better antonym for `meta`, and I appreciate that `real` and `meta` are both four letters long. --- packages/modules-runtime/meteor-install.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/modules-runtime/meteor-install.js b/packages/modules-runtime/meteor-install.js index e03c82412b..5798590ac6 100644 --- a/packages/modules-runtime/meteor-install.js +++ b/packages/modules-runtime/meteor-install.js @@ -9,10 +9,10 @@ var metaInstall = makeInstaller({ meteorInstall = function (tree, options) { if (isObject(tree)) { var meta = Object.create(null); - var modules = Object.create(null); - walk(options, tree, meta, modules); + var real = Object.create(null); + walk(options, tree, meta, real); metaInstall(meta, options); - return install(modules, options); + return install(real, options); } return install(); @@ -30,11 +30,11 @@ function getOrSet(obj, name) { return obj[name] = obj[name] || Object.create(null); } -function walk(options, input, meta, modules) { +function walk(options, input, meta, real) { Object.keys(input).forEach(function (name) { var value = input[name]; - if (tryChild(value, name, meta, modules, options)) { + if (tryChild(value, name, meta, real, options)) { // If the value was a leaf node that we were able to handle, then we // don't need to (and can't) keep walking it. return; @@ -45,7 +45,7 @@ function walk(options, input, meta, modules) { options, value, getOrSet(meta, name), - getOrSet(modules, name) + getOrSet(real, name) ); } }); @@ -53,11 +53,11 @@ function walk(options, input, meta, modules) { return this; } -function tryChild(value, name, meta, modules, options) { +function tryChild(value, name, meta, real, options) { function tryFunc(value) { if (typeof value === "function") { meta[name] = makeMetaFunc({}, false, options); - modules[name] = value; + real[name] = value; return true; } } @@ -68,7 +68,7 @@ function tryChild(value, name, meta, modules, options) { // brackets. When we find one of these objects, we install it in the // meta graph, but not in the installed modules graph. Later, this // information may be used to fetch dynamic modules from the server, - // which will then be installed into the modules graph. + // which will then be installed into the real graph. if (isObject(value)) { meta[name] = makeMetaFunc(value, true, options); return true; @@ -91,10 +91,10 @@ function tryChild(value, name, meta, modules, options) { // The install.js library supports a notion of aliases, represented by // module identifier strings. This functionality works the same way in - // both the meta graph and the modules graph. + // both the meta graph and the real graph. if (typeof value === "string") { meta[name] = value; - modules[name] = value; + real[name] = value; return true; } } From cf3744f62427cb9735703ade75d34f849e47e536 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Wed, 8 Feb 2017 18:34:27 -0500 Subject: [PATCH 026/195] Copy "main" and "browser" from non-dynamic package.json files. Fixes the first problem reported by @klaussner in this comment: https://github.com/meteor/meteor/pull/8327#issuecomment-278491257 --- packages/modules-runtime/meteor-install.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/modules-runtime/meteor-install.js b/packages/modules-runtime/meteor-install.js index 5798590ac6..ae9f6ca33c 100644 --- a/packages/modules-runtime/meteor-install.js +++ b/packages/modules-runtime/meteor-install.js @@ -99,10 +99,27 @@ function tryChild(value, name, meta, real, options) { } } +var requireReal = install(); + function makeMetaFunc(value, dynamic, options) { return function (require, exports, module) { Object.assign(exports, value); + if (! dynamic && + module.id.endsWith("/package.json")) { + // If the package.json file is not dynamic, require it from the real + // graph to read its "main" and "browser" properties. + var pkg = requireReal(module.id); + + if (typeof pkg.main === "string") { + exports.main = pkg.main; + } + + if (typeof pkg.browser === "string") { + exports.browser = pkg.browser; + } + } + exports.module = module; exports.dynamic = !! dynamic; exports.options = options; From e469eeec0537bd1f019a0d3cf242013830379c84 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Wed, 8 Feb 2017 19:25:10 -0500 Subject: [PATCH 027/195] Fix tests by adding //# sourceMappingURL= only to dynamic files. Also, the regular expression for removing existing source map comments now matches only if the comment starts at the beginning of a line, following previous behavior more closely. To get this exactly right, we would need to tokenize the source to avoid matching comments in string literals, for example, but that's hard because this logic needs to work for multiple file types, not just JavaScript. --- tools/isobuild/bundler.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/tools/isobuild/bundler.js b/tools/isobuild/bundler.js index 50d1a81847..c98f506d5a 100644 --- a/tools/isobuild/bundler.js +++ b/tools/isobuild/bundler.js @@ -1530,13 +1530,15 @@ class ClientTarget extends Target { manifestItem.size = file.size(); manifestItem.hash = file.hash(); - writeFile(file, { - sourceMapUrl: manifestItem.sourceMapUrl, - }, builder); - if (! file.targetPath.startsWith("dynamic/")) { + writeFile(file, builder); manifest.push(manifestItem); - } else if (file.sourceMap) { + + } else if (manifestItem.sourceMapUrl) { + writeFile(file, builder, { + sourceMapUrl: manifestItem.sourceMapUrl, + }); + // If the file is dynamic, we don't need/want the file itself to // be served by the web server, but we do want its source map (if // defined) to be accessible via HTTP, so that we can refer to it @@ -2397,7 +2399,7 @@ class ServerTarget extends JsImageTarget { ServerTarget.prototype[method] = Profile(`ServerTarget#${method}`, ServerTarget.prototype[method]); }); -var writeFile = Profile("bundler writeFile", function (file, options, builder) { +var writeFile = Profile("bundler writeFile", function (file, builder, options) { if (! file.targetPath) { throw new Error("No targetPath?"); } @@ -2413,7 +2415,7 @@ var writeFile = Profile("bundler writeFile", function (file, options, builder) { let data = file.contents(); const hash = file.hash(); - if (options.sourceMapUrl) { + if (options && options.sourceMapUrl) { data = new Buffer( addSourceMappingURL(data, options.sourceMapUrl), "utf8" @@ -2430,7 +2432,7 @@ function addSourceMappingURL(data, url) { // If data is a Buffer, convert it to a string. .toString("utf8") // Remove any existing source map comments. - .replace(/\/\/# sourceMappingURL=[^\n]+/g, '//'); + .replace(/\n\/\/# sourceMappingURL=[^\n]+/g, ""); // Append the new source map comment to the end of the code. return dataString + "\n//# sourceMappingURL=" + url + "\n"; } From 1bbe7b677070554ce4085c1f8aca9b8cdd3569da Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Wed, 8 Feb 2017 19:44:23 -0500 Subject: [PATCH 028/195] Bump package versions for 1.5-beta.3 release. https://github.com/meteor/meteor/releases/tag/release%2FMETEOR%401.5-beta.3 --- packages/babel-compiler/package.js | 2 +- packages/dynamic-import/package.js | 2 +- packages/ecmascript/package.js | 2 +- packages/localstorage/package.js | 2 +- packages/meteor-tool/package.js | 2 +- packages/modules-runtime/package.js | 2 +- packages/modules/package.js | 2 +- scripts/admin/meteor-release-experimental.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/babel-compiler/package.js b/packages/babel-compiler/package.js index aa4ab2aabf..e20256dd05 100644 --- a/packages/babel-compiler/package.js +++ b/packages/babel-compiler/package.js @@ -6,7 +6,7 @@ Package.describe({ // isn't possible because you can't publish a non-recommended // release with package versions that don't have a pre-release // identifier at the end (eg, -dev) - version: '6.15.0-beta.2' + version: '6.15.0-beta.3' }); Npm.depends({ diff --git a/packages/dynamic-import/package.js b/packages/dynamic-import/package.js index f73c48f559..66e55b04c4 100644 --- a/packages/dynamic-import/package.js +++ b/packages/dynamic-import/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "dynamic-import", - version: "0.1.0-beta.2", + version: "0.1.0-beta.3", summary: "Support for module.dynamicImport(id).then(namespace => ...)", documentation: "README.md" }); diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js index 3228bdbfcb..10572f80d8 100644 --- a/packages/ecmascript/package.js +++ b/packages/ecmascript/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'ecmascript', - version: '0.7.0-beta.2', + version: '0.7.0-beta.3', summary: 'Compiler plugin that supports ES2015+ in all .js files', documentation: 'README.md' }); diff --git a/packages/localstorage/package.js b/packages/localstorage/package.js index fde3497f03..f7195b35f9 100644 --- a/packages/localstorage/package.js +++ b/packages/localstorage/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Simulates local storage on IE 6,7 using userData", - version: "1.1.0-beta.2" + version: "1.1.0-beta.3" }); Package.onUse(function (api) { diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js index f9e3388d25..667c8808fe 100644 --- a/packages/meteor-tool/package.js +++ b/packages/meteor-tool/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "The Meteor command-line tool", - version: '1.5.0-beta.2' + version: '1.5.0-beta.3' }); Package.includeTool(); diff --git a/packages/modules-runtime/package.js b/packages/modules-runtime/package.js index a720232ec4..b3a8e383d2 100644 --- a/packages/modules-runtime/package.js +++ b/packages/modules-runtime/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules-runtime", - version: "0.8.0-beta.2", + version: "0.8.0-beta.3", summary: "CommonJS module system", git: "https://github.com/benjamn/install", documentation: "README.md" diff --git a/packages/modules/package.js b/packages/modules/package.js index 20ed0a418d..7a33d75c4e 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules", - version: "0.8.0-beta.2", + version: "0.8.0-beta.3", summary: "CommonJS module system", documentation: "README.md" }); diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json index 7999cac923..41d34df469 100644 --- a/scripts/admin/meteor-release-experimental.json +++ b/scripts/admin/meteor-release-experimental.json @@ -1,6 +1,6 @@ { "track": "METEOR", - "version": "1.5-beta.2", + "version": "1.5-beta.3", "recommended": false, "official": false, "description": "Meteor" From 51c9f5e16cbb4b1a2597a8f7febcfb0447eed3fa Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Thu, 9 Feb 2017 10:19:02 -0500 Subject: [PATCH 029/195] Use Meteor._localStorage only in production mode. https://github.com/meteor/meteor/pull/8327#issuecomment-278660587 --- packages/dynamic-import/cache.js | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/packages/dynamic-import/cache.js b/packages/dynamic-import/cache.js index 7174b78c7d..e957998806 100644 --- a/packages/dynamic-import/cache.js +++ b/packages/dynamic-import/cache.js @@ -1,14 +1,18 @@ var PREFIX = "dynamic-import:"; var ID_PREFIX = PREFIX + "id:"; var VERSION_PREFIX = PREFIX + "version:"; +var RESOLVED = Promise.resolve(); var MISSING_ERROR = new Error("version not found"); +var MISSING = Promise.reject(MISSING_ERROR); +// Silence uncaught rejection warnings. +MISSING.catch(function(){}); var pendingClean = null; function getItem(key) { var value = Meteor._localStorage.getItem(key); return typeof value === "string" ? Promise.resolve(value) - : Promise.reject(MISSING_ERROR); + : MISSING; } function setItem(key, value) { @@ -39,15 +43,22 @@ function clean() { } exports.check = function check(id, currentVersion) { + if (! Meteor.isProduction) { + return MISSING; + } + return getItem(ID_PREFIX + id).then(function (previousVersion) { - if (currentVersion === previousVersion) { - return getItem(VERSION_PREFIX + previousVersion); - } - throw MISSING_ERROR; + return currentVersion === previousVersion + ? getItem(VERSION_PREFIX + previousVersion) + : MISSING; }); }; exports.set = function set(id, version, value) { + if (! Meteor.isProduction) { + return RESOLVED; + } + if (! pendingClean) { pendingClean = setTimeout(clean, 1000); } From f5ae115c10f99668282bf678f5288be37dbb33a0 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Thu, 9 Feb 2017 10:19:49 -0500 Subject: [PATCH 030/195] Don't forget to write dynamic files without source maps. --- tools/isobuild/bundler.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/isobuild/bundler.js b/tools/isobuild/bundler.js index c98f506d5a..405e6b8c4c 100644 --- a/tools/isobuild/bundler.js +++ b/tools/isobuild/bundler.js @@ -1552,6 +1552,9 @@ class ClientTarget extends Target { cacheable: manifestItem.cacheable, hash: manifestItem.hash, }); + + } else { + writeFile(file, builder); } }); From 696b8d4b3c26fc2f2995a90cc93e4e4cc86f9efc Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Thu, 9 Feb 2017 10:20:28 -0500 Subject: [PATCH 031/195] Fix Buffer conversion logic in writeFile. --- tools/isobuild/bundler.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tools/isobuild/bundler.js b/tools/isobuild/bundler.js index 405e6b8c4c..722d5073a6 100644 --- a/tools/isobuild/bundler.js +++ b/tools/isobuild/bundler.js @@ -2419,10 +2419,11 @@ var writeFile = Profile("bundler writeFile", function (file, builder, options) { const hash = file.hash(); if (options && options.sourceMapUrl) { - data = new Buffer( - addSourceMappingURL(data, options.sourceMapUrl), - "utf8" - ); + data = addSourceMappingURL(data, options.sourceMapUrl); + } + + if (! Buffer.isBuffer(data)) { + data = new Buffer(data, "utf8"); } builder.write(file.targetPath, { data, hash }); From 1b7ceab6d560c57b9c81bd2bd6167aed276ca940 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Thu, 9 Feb 2017 10:24:49 -0500 Subject: [PATCH 032/195] Bump package versions for 1.5-beta.4 release. --- packages/babel-compiler/package.js | 2 +- packages/dynamic-import/package.js | 2 +- packages/ecmascript/package.js | 2 +- packages/localstorage/package.js | 2 +- packages/meteor-tool/package.js | 2 +- packages/modules-runtime/package.js | 2 +- packages/modules/package.js | 2 +- scripts/admin/meteor-release-experimental.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/babel-compiler/package.js b/packages/babel-compiler/package.js index e20256dd05..0d1befc136 100644 --- a/packages/babel-compiler/package.js +++ b/packages/babel-compiler/package.js @@ -6,7 +6,7 @@ Package.describe({ // isn't possible because you can't publish a non-recommended // release with package versions that don't have a pre-release // identifier at the end (eg, -dev) - version: '6.15.0-beta.3' + version: '6.15.0-beta.4' }); Npm.depends({ diff --git a/packages/dynamic-import/package.js b/packages/dynamic-import/package.js index 66e55b04c4..853e9353b6 100644 --- a/packages/dynamic-import/package.js +++ b/packages/dynamic-import/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "dynamic-import", - version: "0.1.0-beta.3", + version: "0.1.0-beta.4", summary: "Support for module.dynamicImport(id).then(namespace => ...)", documentation: "README.md" }); diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js index 10572f80d8..24b8dd433d 100644 --- a/packages/ecmascript/package.js +++ b/packages/ecmascript/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'ecmascript', - version: '0.7.0-beta.3', + version: '0.7.0-beta.4', summary: 'Compiler plugin that supports ES2015+ in all .js files', documentation: 'README.md' }); diff --git a/packages/localstorage/package.js b/packages/localstorage/package.js index f7195b35f9..1f9b6b2c2a 100644 --- a/packages/localstorage/package.js +++ b/packages/localstorage/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Simulates local storage on IE 6,7 using userData", - version: "1.1.0-beta.3" + version: "1.1.0-beta.4" }); Package.onUse(function (api) { diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js index 667c8808fe..53e4ad42f1 100644 --- a/packages/meteor-tool/package.js +++ b/packages/meteor-tool/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "The Meteor command-line tool", - version: '1.5.0-beta.3' + version: '1.5.0-beta.4' }); Package.includeTool(); diff --git a/packages/modules-runtime/package.js b/packages/modules-runtime/package.js index b3a8e383d2..cb96b432a0 100644 --- a/packages/modules-runtime/package.js +++ b/packages/modules-runtime/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules-runtime", - version: "0.8.0-beta.3", + version: "0.8.0-beta.4", summary: "CommonJS module system", git: "https://github.com/benjamn/install", documentation: "README.md" diff --git a/packages/modules/package.js b/packages/modules/package.js index 7a33d75c4e..c0e9a131da 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules", - version: "0.8.0-beta.3", + version: "0.8.0-beta.4", summary: "CommonJS module system", documentation: "README.md" }); diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json index 41d34df469..c647a97bba 100644 --- a/scripts/admin/meteor-release-experimental.json +++ b/scripts/admin/meteor-release-experimental.json @@ -1,6 +1,6 @@ { "track": "METEOR", - "version": "1.5-beta.3", + "version": "1.5-beta.4", "recommended": false, "official": false, "description": "Meteor" From cf71259080df736ca9f54111145a8b0d7b252578 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Thu, 9 Feb 2017 11:55:42 -0500 Subject: [PATCH 033/195] Overwrite implicit modules only if they are package.json files. Implicit empty stub CSS modules added in addStylesheet in compiler-plugin.js were being overwritten with actual CSS module code, thanks to logic intended to support replacing package.json stubs with their actual contents. The meaning of "implicit" is somewhat overloaded: for package.json modules, it means the module is a minimal stub (just the "name", "version", and "main"/"browser" fields) that should be replaced if ever explicitly imported. For empty stub CSS modules, it means the module should yield to any actual modules added via addJavaScript. --- tools/isobuild/import-scanner.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/isobuild/import-scanner.js b/tools/isobuild/import-scanner.js index bf90b66711..168cefac74 100644 --- a/tools/isobuild/import-scanner.js +++ b/tools/isobuild/import-scanner.js @@ -562,9 +562,11 @@ export default class ImportScanner { let depFile = this._getFile(absImportedPath); if (depFile) { - // If the module was imported implicitly before, update to the + // If the module is an implicit package.json stub, update to the // explicit version now. - if (depFile.implicit === true) { + if (depFile.jsonData && + depFile.installPath.endsWith("/package.json") && + depFile.implicit === true) { const file = this._readModule(absImportedPath); if (file) { depFile.implicit = false; From 4784b77c9ed1567aa47a557960c24fb358d43f0a Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Thu, 9 Feb 2017 13:18:42 -0500 Subject: [PATCH 034/195] Make sure dynamic-import package has Promise polyfill. I might not have noticed this, except that PhantomJS still does not provide a native Promise constructor. --- packages/dynamic-import/package.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/dynamic-import/package.js b/packages/dynamic-import/package.js index 853e9353b6..e356459550 100644 --- a/packages/dynamic-import/package.js +++ b/packages/dynamic-import/package.js @@ -8,6 +8,7 @@ Package.describe({ Package.onUse(function (api) { api.use("modules"); api.use("localstorage"); + api.use("promise"); api.use("ecmascript", "server"); api.mainModule("client.js", "client"); api.mainModule("server.js", "server"); From d0aa53cef9c111899daf4b0c83ab61172930b68f Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Thu, 9 Feb 2017 13:19:47 -0500 Subject: [PATCH 035/195] Basic test harness for dynamic imports. --- tools/tests/apps/dynamic-import/.gitignore | 1 + .../.meteor/.finished-upgraders | 15 ++++ .../apps/dynamic-import/.meteor/.gitignore | 1 + tools/tests/apps/dynamic-import/.meteor/.id | 7 ++ .../apps/dynamic-import/.meteor/packages | 25 ++++++ .../apps/dynamic-import/.meteor/platforms | 2 + .../tests/apps/dynamic-import/.meteor/release | 1 + .../tests/apps/dynamic-import/imports/date.js | 2 + .../apps/dynamic-import/imports/mutual-a.js | 6 ++ .../apps/dynamic-import/imports/mutual-b.js | 6 ++ tools/tests/apps/dynamic-import/package.json | 17 +++++ tools/tests/apps/dynamic-import/tests.js | 76 +++++++++++++++++++ tools/tests/dynamic-import.js | 32 ++++++++ 13 files changed, 191 insertions(+) create mode 100644 tools/tests/apps/dynamic-import/.gitignore create mode 100644 tools/tests/apps/dynamic-import/.meteor/.finished-upgraders create mode 100644 tools/tests/apps/dynamic-import/.meteor/.gitignore create mode 100644 tools/tests/apps/dynamic-import/.meteor/.id create mode 100644 tools/tests/apps/dynamic-import/.meteor/packages create mode 100644 tools/tests/apps/dynamic-import/.meteor/platforms create mode 100644 tools/tests/apps/dynamic-import/.meteor/release create mode 100644 tools/tests/apps/dynamic-import/imports/date.js create mode 100644 tools/tests/apps/dynamic-import/imports/mutual-a.js create mode 100644 tools/tests/apps/dynamic-import/imports/mutual-b.js create mode 100644 tools/tests/apps/dynamic-import/package.json create mode 100644 tools/tests/apps/dynamic-import/tests.js create mode 100644 tools/tests/dynamic-import.js diff --git a/tools/tests/apps/dynamic-import/.gitignore b/tools/tests/apps/dynamic-import/.gitignore new file mode 100644 index 0000000000..3c3629e647 --- /dev/null +++ b/tools/tests/apps/dynamic-import/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/tools/tests/apps/dynamic-import/.meteor/.finished-upgraders b/tools/tests/apps/dynamic-import/.meteor/.finished-upgraders new file mode 100644 index 0000000000..aa607041da --- /dev/null +++ b/tools/tests/apps/dynamic-import/.meteor/.finished-upgraders @@ -0,0 +1,15 @@ +# This file contains information which helps Meteor properly upgrade your +# app when you run 'meteor update'. You should check it into version control +# with your project. + +notices-for-0.9.0 +notices-for-0.9.1 +0.9.4-platform-file +notices-for-facebook-graph-api-2 +1.2.0-standard-minifiers-package +1.2.0-meteor-platform-split +1.2.0-cordova-changes +1.2.0-breaking-changes +1.3.0-split-minifiers-package +1.4.0-remove-old-dev-bundle-link +1.4.1-add-shell-server-package diff --git a/tools/tests/apps/dynamic-import/.meteor/.gitignore b/tools/tests/apps/dynamic-import/.meteor/.gitignore new file mode 100644 index 0000000000..4083037423 --- /dev/null +++ b/tools/tests/apps/dynamic-import/.meteor/.gitignore @@ -0,0 +1 @@ +local diff --git a/tools/tests/apps/dynamic-import/.meteor/.id b/tools/tests/apps/dynamic-import/.meteor/.id new file mode 100644 index 0000000000..d7d6ade371 --- /dev/null +++ b/tools/tests/apps/dynamic-import/.meteor/.id @@ -0,0 +1,7 @@ +# This file contains a token that is unique to your project. +# Check it into your repository along with the rest of this directory. +# It can be used for purposes such as: +# - ensuring you don't accidentally deploy one app on top of another +# - providing package authors with aggregated statistics + +1ue5kcr1q6a4v2o7ro4 diff --git a/tools/tests/apps/dynamic-import/.meteor/packages b/tools/tests/apps/dynamic-import/.meteor/packages new file mode 100644 index 0000000000..0c9f41f8e4 --- /dev/null +++ b/tools/tests/apps/dynamic-import/.meteor/packages @@ -0,0 +1,25 @@ +# Meteor packages used by this project, one per line. +# Check this file (and the other files in this directory) into your repository. +# +# 'meteor add' and 'meteor remove' will edit this file for you, +# but you can also edit it by hand. + +meteor-base # Packages every Meteor app needs to have +mobile-experience # Packages for a great mobile UX +mongo # The database Meteor supports right now +blaze-html-templates@1.0.4 # Compile .html files into Meteor Blaze views +reactive-var # Reactive variable for tracker +jquery # Helpful client-side library +tracker # Meteor's client-side reactive programming library + +standard-minifier-css # CSS minifier run for production mode +standard-minifier-js # JS minifier run for production mode +es5-shim # ECMAScript 5 compatibility for older browsers. +ecmascript # Enable ECMAScript2015+ syntax in app code +shell-server # Server-side component of the `meteor shell` command + +autopublish # Publish all data to the clients (for prototyping) +insecure # Allow all DB writes from clients (for prototyping) +dynamic-import +dispatch:mocha-phantomjs +dispatch:mocha-browser diff --git a/tools/tests/apps/dynamic-import/.meteor/platforms b/tools/tests/apps/dynamic-import/.meteor/platforms new file mode 100644 index 0000000000..efeba1b50c --- /dev/null +++ b/tools/tests/apps/dynamic-import/.meteor/platforms @@ -0,0 +1,2 @@ +server +browser diff --git a/tools/tests/apps/dynamic-import/.meteor/release b/tools/tests/apps/dynamic-import/.meteor/release new file mode 100644 index 0000000000..621e94f0ec --- /dev/null +++ b/tools/tests/apps/dynamic-import/.meteor/release @@ -0,0 +1 @@ +none diff --git a/tools/tests/apps/dynamic-import/imports/date.js b/tools/tests/apps/dynamic-import/imports/date.js new file mode 100644 index 0000000000..c95bcb1446 --- /dev/null +++ b/tools/tests/apps/dynamic-import/imports/date.js @@ -0,0 +1,2 @@ +import moment from "moment"; +export { moment }; diff --git a/tools/tests/apps/dynamic-import/imports/mutual-a.js b/tools/tests/apps/dynamic-import/imports/mutual-a.js new file mode 100644 index 0000000000..8ea482c7e4 --- /dev/null +++ b/tools/tests/apps/dynamic-import/imports/mutual-a.js @@ -0,0 +1,6 @@ +import { strictEqual } from "assert"; +export const name = module.id; +export const promise = import("./mutual-b").then(b => { + strictEqual(b.name, "/imports/mutual-b.js"); + return b; +}); diff --git a/tools/tests/apps/dynamic-import/imports/mutual-b.js b/tools/tests/apps/dynamic-import/imports/mutual-b.js new file mode 100644 index 0000000000..d8d46bff10 --- /dev/null +++ b/tools/tests/apps/dynamic-import/imports/mutual-b.js @@ -0,0 +1,6 @@ +import { strictEqual } from "assert"; +export const name = module.id; +export const promise = import("./mutual-a").then(a => { + strictEqual(a.name, "/imports/mutual-a.js"); + return a; +}); diff --git a/tools/tests/apps/dynamic-import/package.json b/tools/tests/apps/dynamic-import/package.json new file mode 100644 index 0000000000..1a6a568e7c --- /dev/null +++ b/tools/tests/apps/dynamic-import/package.json @@ -0,0 +1,17 @@ +{ + "name": "dynamic-import", + "private": true, + "scripts": { + "start": "meteor run", + "test": "meteor test --full-app --driver-package dispatch:mocha-browser" + }, + "dependencies": { + "acorn": "^4.0.11", + "arson": "^0.2.3", + "babel-runtime": "^6.20.0", + "meteor-node-stubs": "~0.2.4", + "moment": "^2.17.1", + "private": "^0.1.7", + "react": "^15.4.2" + } +} diff --git a/tools/tests/apps/dynamic-import/tests.js b/tools/tests/apps/dynamic-import/tests.js new file mode 100644 index 0000000000..fbc0ff499d --- /dev/null +++ b/tools/tests/apps/dynamic-import/tests.js @@ -0,0 +1,76 @@ +import assert from "assert"; + +describe("dynamic import(...)", function () { + it("import same module both statically and dynamically", function () { + import moment from "moment"; + return import("./imports/date").then(date => { + assert.strictEqual(date.moment, moment); + }); + }); + + it("import builtin stub dynamically", function () { + const stubId = "console"; + let missing = false; + + try { + require(stubId); + } catch (e) { + missing = true; + } + + if (Meteor.isClient) { + assert.strictEqual(missing, true); + } + + return import("console").then(console => { + assert.deepEqual(console, require(stubId)); + assert.strictEqual(typeof console.log, "function"); + }); + }); + + it("static package.json, static package", function () { + import { name } from "acorn/package.json"; + import acorn from "acorn"; + assert.strictEqual(name, "acorn"); + assert.strictEqual(typeof acorn.parse, "function"); + }); + + it("static package.json, dynamic package", function () { + import { name } from "private/package.json"; + return import("private").then(priv => { + assert.strictEqual(name, "private"); + assert.strictEqual(typeof priv.makeAccessor, "function"); + assert.deepEqual(priv, require("pri" + "vate")); + }); + }); + + it("dynamic package.json, static package", function () { + import arson from "arson"; + return import("arson/package.json").then(({ name }) => { + assert.strictEqual(name, "arson"); + assert.strictEqual(typeof arson.encode, "function"); + assert.deepEqual(arson, require("ar" + "son")); + }); + }); + + it("dynamic package.json, dynamic package", function () { + return Promise.all([ + import("react/package.json"), + import("react") + ]).then(([{ name }, React]) => { + assert.strictEqual(name, "react"); + assert.strictEqual(typeof React.createClass, "function"); + assert.deepEqual(React, require("re" + "act")); + }); + }); + + it("mutual dynamic imports", function () { + return import("./imports/mutual-a").then(a => { + assert.strictEqual(a.name, "/imports/mutual-a.js"); + return a.promise; + }).then(b => { + assert.strictEqual(b.name, "/imports/mutual-b.js"); + return b.promise; + }); + }); +}); diff --git a/tools/tests/dynamic-import.js b/tools/tests/dynamic-import.js new file mode 100644 index 0000000000..1ea5552f73 --- /dev/null +++ b/tools/tests/dynamic-import.js @@ -0,0 +1,32 @@ +var selftest = require('../tool-testing/selftest.js'); +var Sandbox = selftest.Sandbox; + +selftest.define("dynamic import(...)", function () { + const s = new Sandbox(); + s.createApp("dynamic-import-test-app", "dynamic-import"); + s.cd("dynamic-import-test-app", function () { + run(s, false); + run(s, true); + }); +}); + +function run(sandbox, prod) { + const args = [ + "test", + "--once", + "--full-app", + "--driver-package", "dispatch:mocha-phantomjs" + ]; + + if (prod) { + args.push("--production"); + } + + const run = sandbox.run(...args); + + run.waitSecs(60); + run.match("App running at"); + run.match("SERVER FAILURES: 0"); + run.match("CLIENT FAILURES: 0"); + run.expectExit(0); +} From 844e2c34adb0460fbde272360ddccda982d37d3f Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Thu, 9 Feb 2017 15:58:21 -0500 Subject: [PATCH 036/195] Consider npm packages with {,pre,post}install scripts non-portable. Inspired by analysis from @danstiner: https://github.com/meteor/meteor/issues/8225#issuecomment-275044900 Fixes #8225, as well as the tests I added in 672c4f338a1a392f9dfe57d8e796ef6a51175f51. I changed the name of the .meteor-portable file to .meteor-portable-1.json in order to invalidate previous .meteor-portable files. This naming scheme will be more sustainable, because we can keep incrementing the version number whenever we change this logic. --- tools/isobuild/meteor-npm.js | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/tools/isobuild/meteor-npm.js b/tools/isobuild/meteor-npm.js index 90bd3ef028..a873c9a17e 100644 --- a/tools/isobuild/meteor-npm.js +++ b/tools/isobuild/meteor-npm.js @@ -434,6 +434,9 @@ function copyNpmPackageWithSymlinkedNodeModules(fromPkgDir, toPkgDir) { const portableCache = Object.create(null); +// Increment this version to trigger the full portability check again. +const portableVersion = 1; + const isPortable = Profile("meteorNpm.isPortable", dir => { const lstat = optimisticLStat(dir); if (! lstat.isDirectory()) { @@ -441,9 +444,11 @@ const isPortable = Profile("meteorNpm.isPortable", dir => { return ! dir.endsWith(".node"); } - const pkgJsonStat = optimisticStatOrNull(files.pathJoin(dir, "package.json")); + const pkgJsonPath = files.pathJoin(dir, "package.json"); + const pkgJsonStat = optimisticStatOrNull(pkgJsonPath); const canCache = pkgJsonStat && pkgJsonStat.isFile(); - const portableFile = files.pathJoin(dir, ".meteor-portable"); + const portableFile = files.pathJoin( + dir, ".meteor-portable-" + portableVersion + ".json"); if (canCache) { // Cache previous results by writing a boolean value to a hidden file @@ -470,10 +475,20 @@ const isPortable = Profile("meteorNpm.isPortable", dir => { fs.unlink(portableFile, error => {}); } - const result = optimisticReaddir(dir).every( - // Ignore files that start with a ".", such as .bin directories. - itemName => itemName.startsWith(".") || - isPortable(files.pathJoin(dir, itemName))); + const pkgJson = canCache && optimisticReadJsonOrNull(pkgJsonPath); + const hasBuildScript = + pkgJson && + pkgJson.scripts && + (pkgJson.scripts.preinstall || + pkgJson.scripts.install || + pkgJson.scripts.postinstall); + + const result = hasBuildScript + ? false // Build scripts may not be portable. + : optimisticReaddir(dir).every( + // Ignore files that start with a ".", such as .bin directories. + itemName => itemName.startsWith(".") || + isPortable(files.pathJoin(dir, itemName))); if (canCache) { // Write the .meteor-portable file asynchronously, and don't worry From d9184808cbe7bba552def7bf38dd252ca738286e Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Fri, 10 Feb 2017 14:33:14 -0500 Subject: [PATCH 037/195] Avoid calling ImportScanner#_getRelativeImportId with bad parentPath. Fixes #8336. --- tools/isobuild/import-scanner.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/isobuild/import-scanner.js b/tools/isobuild/import-scanner.js index 168cefac74..4e8fda1cb8 100644 --- a/tools/isobuild/import-scanner.js +++ b/tools/isobuild/import-scanner.js @@ -499,6 +499,13 @@ export default class ImportScanner { const packageJsonFile = this._addPkgJsonToOutput(path, pkg, forDynamicImport); + if (! parentFile.installPath) { + // If parentFile is not installable, then we won't return it + // from getOutputFiles, so we don't need to worry about + // recording any parentFile.deps[id].helpers. + return; + } + const relativeId = this._getRelativeImportId( parentFile.installPath, packageJsonFile.installPath @@ -518,7 +525,7 @@ export default class ImportScanner { const relativeId = convertToPosixPath(pathRelative( pathDirname(parentPath), childPath - )); + ), true); // If the result of pathRelative does not already start with a "." or // a "/", prepend a "./" to make it a valid relative identifier From b6e3a52b6373e34eac4ff26ea7b02ed4ec22bf54 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Fri, 10 Feb 2017 14:39:27 -0500 Subject: [PATCH 038/195] Bump package versions for 1.5-beta.5 release. --- packages/babel-compiler/package.js | 2 +- packages/dynamic-import/package.js | 2 +- packages/ecmascript/package.js | 2 +- packages/localstorage/package.js | 2 +- packages/meteor-tool/package.js | 2 +- packages/modules-runtime/package.js | 2 +- packages/modules/package.js | 2 +- scripts/admin/meteor-release-experimental.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/babel-compiler/package.js b/packages/babel-compiler/package.js index 0d1befc136..303b302322 100644 --- a/packages/babel-compiler/package.js +++ b/packages/babel-compiler/package.js @@ -6,7 +6,7 @@ Package.describe({ // isn't possible because you can't publish a non-recommended // release with package versions that don't have a pre-release // identifier at the end (eg, -dev) - version: '6.15.0-beta.4' + version: '6.15.0-beta.5' }); Npm.depends({ diff --git a/packages/dynamic-import/package.js b/packages/dynamic-import/package.js index e356459550..9cd9c50dc9 100644 --- a/packages/dynamic-import/package.js +++ b/packages/dynamic-import/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "dynamic-import", - version: "0.1.0-beta.4", + version: "0.1.0-beta.5", summary: "Support for module.dynamicImport(id).then(namespace => ...)", documentation: "README.md" }); diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js index 24b8dd433d..d0d2d20531 100644 --- a/packages/ecmascript/package.js +++ b/packages/ecmascript/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'ecmascript', - version: '0.7.0-beta.4', + version: '0.7.0-beta.5', summary: 'Compiler plugin that supports ES2015+ in all .js files', documentation: 'README.md' }); diff --git a/packages/localstorage/package.js b/packages/localstorage/package.js index 1f9b6b2c2a..8767eeb70c 100644 --- a/packages/localstorage/package.js +++ b/packages/localstorage/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Simulates local storage on IE 6,7 using userData", - version: "1.1.0-beta.4" + version: "1.1.0-beta.5" }); Package.onUse(function (api) { diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js index 53e4ad42f1..91c815427e 100644 --- a/packages/meteor-tool/package.js +++ b/packages/meteor-tool/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "The Meteor command-line tool", - version: '1.5.0-beta.4' + version: '1.5.0-beta.5' }); Package.includeTool(); diff --git a/packages/modules-runtime/package.js b/packages/modules-runtime/package.js index cb96b432a0..8e03d77823 100644 --- a/packages/modules-runtime/package.js +++ b/packages/modules-runtime/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules-runtime", - version: "0.8.0-beta.4", + version: "0.8.0-beta.5", summary: "CommonJS module system", git: "https://github.com/benjamn/install", documentation: "README.md" diff --git a/packages/modules/package.js b/packages/modules/package.js index c0e9a131da..e3c3afd649 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules", - version: "0.8.0-beta.4", + version: "0.8.0-beta.5", summary: "CommonJS module system", documentation: "README.md" }); diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json index c647a97bba..34cf200deb 100644 --- a/scripts/admin/meteor-release-experimental.json +++ b/scripts/admin/meteor-release-experimental.json @@ -1,6 +1,6 @@ { "track": "METEOR", - "version": "1.5-beta.4", + "version": "1.5-beta.5", "recommended": false, "official": false, "description": "Meteor" From c8f77a57b99e60feea2470e5d669ab0ef7776d98 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Fri, 10 Feb 2017 18:05:45 -0500 Subject: [PATCH 039/195] Automatically add dynamic-import package when updating to Meteor 1.5. --- tools/upgraders.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/upgraders.js b/tools/upgraders.js index 5605642d13..ddde9fc619 100644 --- a/tools/upgraders.js +++ b/tools/upgraders.js @@ -285,6 +285,12 @@ be removed if there is no need for the Blaze configuration interface.`, packagesFile.writeIfModified(); }, + "1.5-add-dynamic-import-package": function (projectContext) { + const packagesFile = projectContext.projectConstraintsFile; + packagesFile.addPackages(["dynamic-import"]); + packagesFile.writeIfModified(); + }, + //////////// // PLEASE. When adding new upgraders that print mesasges, follow the // examples for 0.9.0 and 0.9.1 above. Specifically, formatting From 95a7d110188d1654d26772d9ef4744c5917599e2 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Tue, 14 Feb 2017 12:31:40 -0500 Subject: [PATCH 040/195] Regenerate packages/babel-compiler/.npm/package/npm-shrinkwrap.json. --- .../.npm/package/npm-shrinkwrap.json | 160 ++++++++++-------- 1 file changed, 85 insertions(+), 75 deletions(-) diff --git a/packages/babel-compiler/.npm/package/npm-shrinkwrap.json b/packages/babel-compiler/.npm/package/npm-shrinkwrap.json index 61fb5960cc..0589d5e836 100644 --- a/packages/babel-compiler/.npm/package/npm-shrinkwrap.json +++ b/packages/babel-compiler/.npm/package/npm-shrinkwrap.json @@ -1,8 +1,8 @@ { "dependencies": { "acorn": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.9.tgz", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.11.tgz", "from": "acorn@>=4.0.5 <4.1.0" }, "acorn-es7-plugin": { @@ -31,19 +31,19 @@ "from": "babel-code-frame@>=6.22.0 <7.0.0" }, "babel-core": { - "version": "6.22.1", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.22.1.tgz", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.23.1.tgz", "from": "babel-core@>=6.22.1 <7.0.0" }, "babel-generator": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.22.0.tgz", - "from": "babel-generator@>=6.22.0 <7.0.0" + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.23.0.tgz", + "from": "babel-generator@>=6.23.0 <7.0.0" }, "babel-helper-builder-react-jsx": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.22.0.tgz", - "from": "babel-helper-builder-react-jsx@>=6.22.0 <7.0.0" + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.23.0.tgz", + "from": "babel-helper-builder-react-jsx@>=6.23.0 <7.0.0" }, "babel-helper-call-delegate": { "version": "6.22.0", @@ -51,14 +51,14 @@ "from": "babel-helper-call-delegate@>=6.22.0 <7.0.0" }, "babel-helper-define-map": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.22.0.tgz", - "from": "babel-helper-define-map@>=6.22.0 <7.0.0" + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.23.0.tgz", + "from": "babel-helper-define-map@>=6.23.0 <7.0.0" }, "babel-helper-function-name": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.22.0.tgz", - "from": "babel-helper-function-name@>=6.22.0 <7.0.0" + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.23.0.tgz", + "from": "babel-helper-function-name@>=6.23.0 <7.0.0" }, "babel-helper-get-function-arity": { "version": "6.22.0", @@ -71,9 +71,9 @@ "from": "babel-helper-hoist-variables@>=6.22.0 <7.0.0" }, "babel-helper-optimise-call-expression": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.22.0.tgz", - "from": "babel-helper-optimise-call-expression@>=6.22.0 <7.0.0" + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.23.0.tgz", + "from": "babel-helper-optimise-call-expression@>=6.23.0 <7.0.0" }, "babel-helper-regex": { "version": "6.22.0", @@ -81,19 +81,19 @@ "from": "babel-helper-regex@>=6.22.0 <7.0.0" }, "babel-helper-replace-supers": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.22.0.tgz", - "from": "babel-helper-replace-supers@>=6.22.0 <7.0.0" + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.23.0.tgz", + "from": "babel-helper-replace-supers@>=6.23.0 <7.0.0" }, "babel-helpers": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.22.0.tgz", - "from": "babel-helpers@>=6.22.0 <7.0.0" + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.23.0.tgz", + "from": "babel-helpers@>=6.23.0 <7.0.0" }, "babel-messages": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.22.0.tgz", - "from": "babel-messages@>=6.22.0 <7.0.0" + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "from": "babel-messages@>=6.23.0 <7.0.0" }, "babel-plugin-check-es2015-constants": { "version": "6.22.0", @@ -146,13 +146,13 @@ "from": "babel-plugin-transform-es2015-block-scoped-functions@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-block-scoping": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.22.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.23.0.tgz", "from": "babel-plugin-transform-es2015-block-scoping@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-classes": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.22.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.23.0.tgz", "from": "babel-plugin-transform-es2015-classes@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-computed-properties": { @@ -161,13 +161,13 @@ "from": "babel-plugin-transform-es2015-computed-properties@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-destructuring": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.22.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", "from": "babel-plugin-transform-es2015-destructuring@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-for-of": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.22.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", "from": "babel-plugin-transform-es2015-for-of@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-literals": { @@ -176,8 +176,8 @@ "from": "babel-plugin-transform-es2015-literals@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.22.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.23.0.tgz", "from": "babel-plugin-transform-es2015-modules-commonjs@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-object-super": { @@ -186,8 +186,8 @@ "from": "babel-plugin-transform-es2015-object-super@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-parameters": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.22.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.23.0.tgz", "from": "babel-plugin-transform-es2015-parameters@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -211,8 +211,8 @@ "from": "babel-plugin-transform-es2015-template-literals@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.22.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", "from": "babel-plugin-transform-es2015-typeof-symbol@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-unicode-regex": { @@ -231,19 +231,19 @@ "from": "babel-plugin-transform-flow-strip-types@>=6.22.0 <7.0.0" }, "babel-plugin-transform-object-rest-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.22.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz", "from": "babel-plugin-transform-object-rest-spread@>=6.22.0 <7.0.0" }, "babel-plugin-transform-react-display-name": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.22.0.tgz", - "from": "babel-plugin-transform-react-display-name@>=6.22.0 <7.0.0" + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.23.0.tgz", + "from": "babel-plugin-transform-react-display-name@>=6.23.0 <7.0.0" }, "babel-plugin-transform-react-jsx": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.22.0.tgz", - "from": "babel-plugin-transform-react-jsx@>=6.22.0 <7.0.0" + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.23.0.tgz", + "from": "babel-plugin-transform-react-jsx@>=6.23.0 <7.0.0" }, "babel-plugin-transform-react-jsx-self": { "version": "6.22.0", @@ -261,8 +261,8 @@ "from": "babel-plugin-transform-regenerator@>=6.22.0 <7.0.0" }, "babel-plugin-transform-runtime": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.22.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", "from": "babel-plugin-transform-runtime@>=6.22.0 <7.0.0" }, "babel-plugin-transform-strict-mode": { @@ -270,20 +270,25 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.22.0.tgz", "from": "babel-plugin-transform-strict-mode@>=6.22.0 <7.0.0" }, + "babel-preset-flow": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", + "from": "babel-preset-flow@>=6.23.0 <7.0.0" + }, "babel-preset-meteor": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-preset-meteor/-/babel-preset-meteor-6.22.0.tgz", "from": "babel-preset-meteor@6.22.0" }, "babel-preset-react": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.22.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.23.0.tgz", "from": "babel-preset-react@>=6.22.0 <7.0.0" }, "babel-register": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.22.0.tgz", - "from": "babel-register@>=6.22.0 <7.0.0" + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.23.0.tgz", + "from": "babel-register@>=6.23.0 <7.0.0" }, "babel-runtime": { "version": "6.22.0", @@ -291,18 +296,18 @@ "from": "babel-runtime@>=6.22.0 <7.0.0" }, "babel-template": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.22.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.23.0.tgz", "from": "babel-template@>=6.22.0 <7.0.0" }, "babel-traverse": { - "version": "6.22.1", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.22.1.tgz", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.23.1.tgz", "from": "babel-traverse@>=6.22.1 <7.0.0" }, "babel-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.22.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz", "from": "babel-types@>=6.22.0 <7.0.0" }, "babylon": { @@ -331,8 +336,8 @@ "from": "concat-map@0.0.1" }, "convert-source-map": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.3.0.tgz", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.4.0.tgz", "from": "convert-source-map@>=1.3.0 <2.0.0" }, "core-js": { @@ -341,8 +346,8 @@ "from": "core-js@>=2.4.0 <3.0.0" }, "debug": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.0.tgz", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz", "from": "debug@>=2.1.1 <3.0.0" }, "detect-indent": { @@ -361,8 +366,8 @@ "from": "esutils@>=2.0.2 <3.0.0" }, "globals": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.14.0.tgz", + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.15.0.tgz", "from": "globals@>=9.0.0 <10.0.0" }, "has-ansi": { @@ -416,9 +421,9 @@ "from": "magic-string@>=0.19.0 <0.20.0" }, "meteor-babel": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/meteor-babel/-/meteor-babel-0.15.1.tgz", - "from": "meteor-babel@0.15.1" + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/meteor-babel/-/meteor-babel-0.15.2.tgz", + "from": "meteor-babel@0.15.2" }, "meteor-babel-helpers": { "version": "0.0.3", @@ -508,9 +513,9 @@ } }, "reify": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/reify/-/reify-0.4.7.tgz", - "from": "reify@>=0.4.7 <0.5.0" + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/reify/-/reify-0.4.9.tgz", + "from": "reify@>=0.4.8 <0.5.0" }, "repeating": { "version": "2.0.1", @@ -547,6 +552,11 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", "from": "to-fast-properties@>=1.0.1 <2.0.0" }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "from": "trim-right@>=1.0.1 <2.0.0" + }, "vlq": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.1.tgz", From 92480b09a049af261f1caf3555cbd03a1f13337b Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Tue, 14 Feb 2017 12:31:54 -0500 Subject: [PATCH 041/195] Regenerate packages/modules/.npm/package/npm-shrinkwrap.json. --- packages/modules/.npm/package/npm-shrinkwrap.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/modules/.npm/package/npm-shrinkwrap.json b/packages/modules/.npm/package/npm-shrinkwrap.json index a83c8e4619..3e60433a36 100644 --- a/packages/modules/.npm/package/npm-shrinkwrap.json +++ b/packages/modules/.npm/package/npm-shrinkwrap.json @@ -1,8 +1,8 @@ { "dependencies": { "acorn": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.9.tgz", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.11.tgz", "from": "acorn@>=4.0.5 <4.1.0" }, "acorn-es7-plugin": { @@ -21,9 +21,9 @@ "from": "magic-string@>=0.19.0 <0.20.0" }, "reify": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/reify/-/reify-0.4.7.tgz", - "from": "reify@0.4.7" + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/reify/-/reify-0.4.9.tgz", + "from": "reify@0.4.9" }, "vlq": { "version": "0.2.1", From 44370f0ec86ee38fdb4f810e69cbeee964c2bad4 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Tue, 14 Feb 2017 12:32:52 -0500 Subject: [PATCH 042/195] Bump $BUNDLE_VERSION to 4.8.1 before rebuilding dev bundle. --- meteor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meteor b/meteor index 61dcd6d9b9..fada5a7677 100755 --- a/meteor +++ b/meteor @@ -1,6 +1,6 @@ #!/usr/bin/env bash -BUNDLE_VERSION=4.8.0 +BUNDLE_VERSION=4.8.1 # OS Check. Put here because here is where we download the precompiled # bundles that are arch specific. From 87d95ce60ffdffb0d4b2e90028bcbd103f190ae2 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Tue, 14 Feb 2017 12:38:36 -0500 Subject: [PATCH 043/195] Bump package versions for 1.5-beta.6 release. --- packages/babel-compiler/package.js | 2 +- packages/dynamic-import/package.js | 2 +- packages/ecmascript/package.js | 2 +- packages/localstorage/package.js | 2 +- packages/meteor-tool/package.js | 2 +- packages/modules-runtime/package.js | 2 +- packages/modules/package.js | 2 +- scripts/admin/meteor-release-experimental.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/babel-compiler/package.js b/packages/babel-compiler/package.js index d43fbe30d5..f1c081e037 100644 --- a/packages/babel-compiler/package.js +++ b/packages/babel-compiler/package.js @@ -6,7 +6,7 @@ Package.describe({ // isn't possible because you can't publish a non-recommended // release with package versions that don't have a pre-release // identifier at the end (eg, -dev) - version: '6.15.0-beta.5' + version: '6.15.0-beta.6' }); Npm.depends({ diff --git a/packages/dynamic-import/package.js b/packages/dynamic-import/package.js index 9cd9c50dc9..b97b4c9155 100644 --- a/packages/dynamic-import/package.js +++ b/packages/dynamic-import/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "dynamic-import", - version: "0.1.0-beta.5", + version: "0.1.0-beta.6", summary: "Support for module.dynamicImport(id).then(namespace => ...)", documentation: "README.md" }); diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js index d0d2d20531..fea630e3b8 100644 --- a/packages/ecmascript/package.js +++ b/packages/ecmascript/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'ecmascript', - version: '0.7.0-beta.5', + version: '0.7.0-beta.6', summary: 'Compiler plugin that supports ES2015+ in all .js files', documentation: 'README.md' }); diff --git a/packages/localstorage/package.js b/packages/localstorage/package.js index 8767eeb70c..74a6497bbd 100644 --- a/packages/localstorage/package.js +++ b/packages/localstorage/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Simulates local storage on IE 6,7 using userData", - version: "1.1.0-beta.5" + version: "1.1.0-beta.6" }); Package.onUse(function (api) { diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js index 91c815427e..7e409a8b3f 100644 --- a/packages/meteor-tool/package.js +++ b/packages/meteor-tool/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "The Meteor command-line tool", - version: '1.5.0-beta.5' + version: '1.5.0-beta.6' }); Package.includeTool(); diff --git a/packages/modules-runtime/package.js b/packages/modules-runtime/package.js index 8e03d77823..3221182dcb 100644 --- a/packages/modules-runtime/package.js +++ b/packages/modules-runtime/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules-runtime", - version: "0.8.0-beta.5", + version: "0.8.0-beta.6", summary: "CommonJS module system", git: "https://github.com/benjamn/install", documentation: "README.md" diff --git a/packages/modules/package.js b/packages/modules/package.js index c8664ffa0c..fd8bb0d316 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules", - version: "0.8.0-beta.5", + version: "0.8.0-beta.6", summary: "CommonJS module system", documentation: "README.md" }); diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json index 34cf200deb..dacd9a570c 100644 --- a/scripts/admin/meteor-release-experimental.json +++ b/scripts/admin/meteor-release-experimental.json @@ -1,6 +1,6 @@ { "track": "METEOR", - "version": "1.5-beta.5", + "version": "1.5-beta.6", "recommended": false, "official": false, "description": "Meteor" From 0b26890d97adebbf9406c7cc34f09107d94a0f57 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Wed, 15 Feb 2017 13:57:43 -0500 Subject: [PATCH 044/195] Protect against edge case when `resolved` is a string. In particular, if the "main" field of the package.json file cannot be resolved, then the `resolved` variable will be "missing", which is a truthy value that silently rejects property assignments. Ugh! --- tools/isobuild/resolver.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/isobuild/resolver.js b/tools/isobuild/resolver.js index 70e5f7703c..3737b60429 100644 --- a/tools/isobuild/resolver.js +++ b/tools/isobuild/resolver.js @@ -316,7 +316,7 @@ export default class Resolver { const resolved = this._joinAndStat(dirPath, main) || this._resolve(main, pkgJsonPath, _seenDirPaths); - if (resolved) { + if (resolved && typeof resolved === "object") { if (! resolved.packageJsonMap) { resolved.packageJsonMap = Object.create(null); } From eadd954115d52e546b6ff4647264989e5600b08d Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Thu, 16 Feb 2017 18:18:58 -0500 Subject: [PATCH 045/195] Use alias instead of stub module for meteor/package imports. Aliases are lighter weight than stub module functions, and easier for the dynamic import(...) dependency traversal logic to understand. --- packages/modules/install-packages.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/modules/install-packages.js b/packages/modules/install-packages.js index c663c100c2..8965383ac2 100644 --- a/packages/modules/install-packages.js +++ b/packages/modules/install-packages.js @@ -8,10 +8,10 @@ function install(name, mainModule) { // /node_modules/meteor//index.js, in the rare but possible event // that the package contains a file called index.js (#6590). - if (mainModule) { - meteorDir[name + ".js"] = [mainModule, function (require, e, module) { - module.exports = require(mainModule); - }]; + if (typeof mainModule === "string") { + // Set up an alias from /node_modules/meteor/.js to the main + // module, e.g. meteor//index.js. + meteorDir[name + ".js"] = mainModule; } else { // back compat with old Meteor packages meteorDir[name + ".js"] = function (r, e, module) { From edb4e0664c221d3094365f552fd02820e0f8e238 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Thu, 16 Feb 2017 16:38:11 -0500 Subject: [PATCH 046/195] Walk dynamic module graph synchronously. I made this code asynchronous at first to accommodate the asynchronous cache API, but walking the graph needs to happen synchronously so that near-simultaneous dynamic import(...)s do not interleave. --- packages/dynamic-import/client.js | 53 ++++++++++++------------------- 1 file changed, 21 insertions(+), 32 deletions(-) diff --git a/packages/dynamic-import/client.js b/packages/dynamic-import/client.js index 215e6de197..2d96067a2d 100644 --- a/packages/dynamic-import/client.js +++ b/packages/dynamic-import/client.js @@ -18,56 +18,45 @@ Module.prototype.dynamicImport = function (id) { throw error; } - // Require the current module from the complete meta graph. + // Require the parent module from the complete meta graph. var meta = requireMeta(module.id); - var missingTree; - var localTree; + var versions = Object.create(null); function walk(meta) { - if (meta.dynamic) { - return meta.pending || (meta.pending = add( - meta.module.id, - meta.version - ).then(function () { - return allChildren(meta, walkChild); - })); + if (meta.dynamic && ! meta.pending) { + meta.pending = true; + versions[meta.module.id] = meta.version; + meta.eachChild(walkChild); } } - function add(id, version) { - return cache.check(id, version).then(function (code) { - addToTree(localTree = localTree || Object.create(null), id, code); - }, function (missing) { - addToTree(missingTree = missingTree || Object.create(null), id, 1); - }); - } - function walkChild(childModule) { return walk(childModule.exports); } - return allChildren(meta, walkChild, [id]).then(function () { + meta.eachChild(walkChild, [id]); + + var localTree; + var missingTree; + + return Promise.all(Object.keys(versions).map(function (id) { + return cache.check(id, versions[id]).then(function (code) { + addToTree(localTree = localTree || Object.create(null), id, code); + }, function (missing) { + addToTree(missingTree = missingTree || Object.create(null), id, 1); + }); + + })).then(function () { if (localTree) { installResults(localTree); } + return missingTree && fetchMissing(missingTree); + }).then(get); }); }; -// The allChildren iteration includes all child modules imported by -// meta.module, not just the child explicitly required here, so that -// implicit modules like package.json will be included too. -function allChildren(meta, callback, idsToRequire) { - var results = []; - // See meteor/packages/modules-runtime/meteor-install.js for the - // definition of meta.eachChild. - meta.eachChild(function (child) { - results.push(callback(child)); - }, idsToRequire); - return Promise.all(results); -} - function fetchMissing(missingTree) { return new Promise(function (resolve, reject) { Meteor.call( From a1c4df3f579ce4625937959dd1c974184b0a5507 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Thu, 16 Feb 2017 16:40:28 -0500 Subject: [PATCH 047/195] Call api.use("ddp") in dynamic-import/package.js. Though I am still considering alternatives to DDP, the dynamic-import package should depend on the packages that it uses. --- packages/dynamic-import/package.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/dynamic-import/package.js b/packages/dynamic-import/package.js index b97b4c9155..0854fd61c7 100644 --- a/packages/dynamic-import/package.js +++ b/packages/dynamic-import/package.js @@ -9,6 +9,7 @@ Package.onUse(function (api) { api.use("modules"); api.use("localstorage"); api.use("promise"); + api.use("ddp"); api.use("ecmascript", "server"); api.mainModule("client.js", "client"); api.mainModule("server.js", "server"); From 15135a65df9483e483b74d9fd22ea864c810641b Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Thu, 16 Feb 2017 18:18:04 -0500 Subject: [PATCH 048/195] Test importing lazy packages and dynamic package modules. --- .../apps/dynamic-import/.meteor/packages | 1 + .../packages/lazy-test-package/dynamic.js | 1 + .../packages/lazy-test-package/main.js | 1 + .../packages/lazy-test-package/package.js | 14 +++++ tools/tests/apps/dynamic-import/tests.js | 51 +++++++++++++++++++ 5 files changed, 68 insertions(+) create mode 100644 tools/tests/apps/dynamic-import/packages/lazy-test-package/dynamic.js create mode 100644 tools/tests/apps/dynamic-import/packages/lazy-test-package/main.js create mode 100644 tools/tests/apps/dynamic-import/packages/lazy-test-package/package.js diff --git a/tools/tests/apps/dynamic-import/.meteor/packages b/tools/tests/apps/dynamic-import/.meteor/packages index 0c9f41f8e4..6732427412 100644 --- a/tools/tests/apps/dynamic-import/.meteor/packages +++ b/tools/tests/apps/dynamic-import/.meteor/packages @@ -23,3 +23,4 @@ insecure # Allow all DB writes from clients (for prototyping) dynamic-import dispatch:mocha-phantomjs dispatch:mocha-browser +lazy-test-package diff --git a/tools/tests/apps/dynamic-import/packages/lazy-test-package/dynamic.js b/tools/tests/apps/dynamic-import/packages/lazy-test-package/dynamic.js new file mode 100644 index 0000000000..f3e9aa9c6f --- /dev/null +++ b/tools/tests/apps/dynamic-import/packages/lazy-test-package/dynamic.js @@ -0,0 +1 @@ +export const name = module.id; diff --git a/tools/tests/apps/dynamic-import/packages/lazy-test-package/main.js b/tools/tests/apps/dynamic-import/packages/lazy-test-package/main.js new file mode 100644 index 0000000000..f3e9aa9c6f --- /dev/null +++ b/tools/tests/apps/dynamic-import/packages/lazy-test-package/main.js @@ -0,0 +1 @@ +export const name = module.id; diff --git a/tools/tests/apps/dynamic-import/packages/lazy-test-package/package.js b/tools/tests/apps/dynamic-import/packages/lazy-test-package/package.js new file mode 100644 index 0000000000..3f740f2ec8 --- /dev/null +++ b/tools/tests/apps/dynamic-import/packages/lazy-test-package/package.js @@ -0,0 +1,14 @@ +Package.describe({ + name: "lazy-test-package", + version: "0.0.1", +}); + +Package.onUse(function(api) { + api.use("ecmascript"); + api.mainModule("main.js", [ + "client", + "server" + ], { + lazy: true + }); +}); diff --git a/tools/tests/apps/dynamic-import/tests.js b/tools/tests/apps/dynamic-import/tests.js index fbc0ff499d..e04ef67f1a 100644 --- a/tools/tests/apps/dynamic-import/tests.js +++ b/tools/tests/apps/dynamic-import/tests.js @@ -73,4 +73,55 @@ describe("dynamic import(...)", function () { return b.promise; }); }); + + it("imports from lazy packages", function () { + let missing = false; + const dynamicId = [ + "meteor", "lazy-test-package", "dynamic" + ].join("/"); + + try { + // Synchronous dynamic requires should fail if the module has not + // been fetched dynamically yet. + require(dynamicId); + } catch (e) { + missing = true; + } + + if (Meteor.isClient) { + // Dynamic modules only exist on the client. On the server, modules + // imported via dynamic import(...) are treated the same as + // statically imported modules. + assert.strictEqual(missing, true); + } + + return Promise.all([ + import("meteor/lazy-test-package").then(lazy => { + const requiredName = require([ + "meteor", "lazy-test-package" + ].join("/")).name; + + assert.strictEqual( + lazy.name, + "/node_modules/meteor/lazy-test-package/main.js" + ); + + assert.strictEqual(lazy.name, requiredName); + }), + + import("meteor/lazy-test-package/dynamic").then(dynamic => { + assert.strictEqual( + dynamic.name, + "/node_modules/meteor/lazy-test-package/dynamic.js" + ); + + // Now the synchronous dynamic require succeeds because the module + // has been fetched dynamically. + assert.strictEqual( + require(dynamicId).name, + dynamic.name + ); + }) + ]); + }); }); From 2a32faf27a198c64c9b2fe492b255fedc784dbd6 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Thu, 16 Feb 2017 18:34:03 -0500 Subject: [PATCH 049/195] Bump package versions for 1.5-beta.7 release. --- packages/babel-compiler/package.js | 2 +- packages/dynamic-import/package.js | 2 +- packages/ecmascript/package.js | 2 +- packages/localstorage/package.js | 2 +- packages/meteor-tool/package.js | 2 +- packages/modules-runtime/package.js | 2 +- packages/modules/package.js | 2 +- scripts/admin/meteor-release-experimental.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/babel-compiler/package.js b/packages/babel-compiler/package.js index f1c081e037..3bed5d86ae 100644 --- a/packages/babel-compiler/package.js +++ b/packages/babel-compiler/package.js @@ -6,7 +6,7 @@ Package.describe({ // isn't possible because you can't publish a non-recommended // release with package versions that don't have a pre-release // identifier at the end (eg, -dev) - version: '6.15.0-beta.6' + version: '6.15.0-beta.7' }); Npm.depends({ diff --git a/packages/dynamic-import/package.js b/packages/dynamic-import/package.js index 0854fd61c7..947972e1e2 100644 --- a/packages/dynamic-import/package.js +++ b/packages/dynamic-import/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "dynamic-import", - version: "0.1.0-beta.6", + version: "0.1.0-beta.7", summary: "Support for module.dynamicImport(id).then(namespace => ...)", documentation: "README.md" }); diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js index fea630e3b8..b1c17ab104 100644 --- a/packages/ecmascript/package.js +++ b/packages/ecmascript/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'ecmascript', - version: '0.7.0-beta.6', + version: '0.7.0-beta.7', summary: 'Compiler plugin that supports ES2015+ in all .js files', documentation: 'README.md' }); diff --git a/packages/localstorage/package.js b/packages/localstorage/package.js index 74a6497bbd..aa9869d3d7 100644 --- a/packages/localstorage/package.js +++ b/packages/localstorage/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Simulates local storage on IE 6,7 using userData", - version: "1.1.0-beta.6" + version: "1.1.0-beta.7" }); Package.onUse(function (api) { diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js index 7e409a8b3f..3deb9dd87e 100644 --- a/packages/meteor-tool/package.js +++ b/packages/meteor-tool/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "The Meteor command-line tool", - version: '1.5.0-beta.6' + version: '1.5.0-beta.7' }); Package.includeTool(); diff --git a/packages/modules-runtime/package.js b/packages/modules-runtime/package.js index 3221182dcb..64e47589a4 100644 --- a/packages/modules-runtime/package.js +++ b/packages/modules-runtime/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules-runtime", - version: "0.8.0-beta.6", + version: "0.8.0-beta.7", summary: "CommonJS module system", git: "https://github.com/benjamn/install", documentation: "README.md" diff --git a/packages/modules/package.js b/packages/modules/package.js index fd8bb0d316..26a9a2e279 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules", - version: "0.8.0-beta.6", + version: "0.8.0-beta.7", summary: "CommonJS module system", documentation: "README.md" }); diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json index dacd9a570c..f6306e3280 100644 --- a/scripts/admin/meteor-release-experimental.json +++ b/scripts/admin/meteor-release-experimental.json @@ -1,6 +1,6 @@ { "track": "METEOR", - "version": "1.5-beta.6", + "version": "1.5-beta.7", "recommended": false, "official": false, "description": "Meteor" From 41e9ee857ebf7c3e693126e504d0a3faab39da80 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Tue, 21 Feb 2017 10:54:04 -0500 Subject: [PATCH 050/195] Evaluate dynamic module code in package scope. This should elegantly address the issues described in this comment: https://github.com/meteor/meteor/pull/8327#issuecomment-280881830 I toyed with the possibility of turning package variables (both imports from other packages and intercepted "global" variable assignments) into properties on a shared namespace object, but that would have been a major breaking change for existing package code, because it would have required automatically rewriting variable references in package modules. --- packages/dynamic-import/client.js | 16 ++++++- tools/isobuild/linker.js | 44 +++++++++++++++++-- .../apps/dynamic-import/.meteor/packages | 1 + .../packages/helper-package/dynamic/a.js | 3 ++ .../packages/helper-package/dynamic/b.coffee | 3 ++ .../packages/helper-package/helper-package.js | 15 +++++++ .../packages/helper-package/package.js | 12 +++++ .../packages/lazy-test-package/dynamic.js | 7 +++ .../packages/lazy-test-package/package.js | 2 + tools/tests/apps/dynamic-import/tests.js | 22 ++++++++++ 10 files changed, 120 insertions(+), 5 deletions(-) create mode 100644 tools/tests/apps/dynamic-import/packages/helper-package/dynamic/a.js create mode 100644 tools/tests/apps/dynamic-import/packages/helper-package/dynamic/b.coffee create mode 100644 tools/tests/apps/dynamic-import/packages/helper-package/helper-package.js create mode 100644 tools/tests/apps/dynamic-import/packages/helper-package/package.js diff --git a/packages/dynamic-import/client.js b/packages/dynamic-import/client.js index 2d96067a2d..325e16dae0 100644 --- a/packages/dynamic-import/client.js +++ b/packages/dynamic-import/client.js @@ -90,7 +90,21 @@ function installResults(resultsTree) { addToTree( trees[optionsIndex], meta.module.id, - (0, eval)("(" + tree + ")") + // By calling (meta.options.eval || eval) in a wrapper function, + // we delay the cost of parsing and evaluating the module code + // until the module is first imported. + function () { + // If an options.eval function was provided in the second + // argument to meteorInstall when this bundle was first + // installed, use that function to parse and evaluate the + // dynamic module code in the scope of the package. Otherwise + // fall back to indirect (global) eval. + return (meta.options.eval || eval)( + // Wrap the function(require,exports,module){...} expression + // in parentheses to force it to be parsed as an expression. + "(" + tree + ")" + ).apply(this, arguments); + } ); // Intentionally do not delay resolution waiting for the cache. diff --git a/tools/isobuild/linker.js b/tools/isobuild/linker.js index 84597aee8a..c00c1eaa66 100644 --- a/tools/isobuild/linker.js +++ b/tools/isobuild/linker.js @@ -245,9 +245,7 @@ _.extend(Module.prototype, { return; } - const dynamic = file.lazy && file.imported === "dynamic"; - - if (dynamic) { + if (file.isDynamic()) { const servePath = "dynamic/" + file.installPath; const { code: source, map } = file.getPrelinkedOutput({ @@ -352,7 +350,7 @@ _.extend(Module.prototype, { // allows us to call meteorInstall just once to install everything. chunks.push("var require = meteorInstall("); walk(tree); - chunks.push(",", JSON.stringify(self.meteorInstallOptions), ");"); + chunks.push(",", self._stringifyInstallOptions(), ");"); if (moduleCount === 0) { // If no files were actually added to the chunks array, roll back @@ -363,6 +361,40 @@ _.extend(Module.prototype, { return moduleCount; }, + _stringifyInstallOptions() { + let optionsString = + JSON.stringify(this.meteorInstallOptions, null, 2); + + if (this.useGlobalNamespace) { + return optionsString; + } + + if (! this.files.some(file => file.isDynamic())) { + // If the package contains no files that can be imported + // dynamically, then we don't need to provide an options.eval + // function for evaluating dynamic modules. + return optionsString; + } + + assert.ok(optionsString.endsWith("\n}")); + + // If this package is not using the global namespace, pass an + // options.eval method to meteorInstall, so that code added later can + // have access to the same shared package variables as other code in + // the package. + return optionsString.slice(0, optionsString.length - 2) + [ + ",", + " eval: function () {", + " return eval(arguments[0]);", + " }", + "}" + ].join("\n"); + }, + + _hasDynamicModules() { + return this.files.some(file => file.isDynamic()); + }, + // Adds require calls to the chunks array for all modules that should be // eagerly evaluated, and also includes bare files in the appropriate // order with respect to the require calls. Returns the name of the @@ -583,6 +615,10 @@ _.extend(File.prototype, { return this.module.meteorInstallOptions; }, + isDynamic() { + return this.lazy && this.imported === "dynamic"; + }, + _getClosureHeader() { if (this._useMeteorInstall()) { const headerParts = ["function("]; diff --git a/tools/tests/apps/dynamic-import/.meteor/packages b/tools/tests/apps/dynamic-import/.meteor/packages index 6732427412..bf003114fb 100644 --- a/tools/tests/apps/dynamic-import/.meteor/packages +++ b/tools/tests/apps/dynamic-import/.meteor/packages @@ -24,3 +24,4 @@ dynamic-import dispatch:mocha-phantomjs dispatch:mocha-browser lazy-test-package +helper-package diff --git a/tools/tests/apps/dynamic-import/packages/helper-package/dynamic/a.js b/tools/tests/apps/dynamic-import/packages/helper-package/dynamic/a.js new file mode 100644 index 0000000000..50d7cacfac --- /dev/null +++ b/tools/tests/apps/dynamic-import/packages/helper-package/dynamic/a.js @@ -0,0 +1,3 @@ +sharedWithinHelperPackage = sharedWithinHelperPackage || {}; +sharedWithinHelperPackage[module.id] = true; +export { sharedWithinHelperPackage as shared } diff --git a/tools/tests/apps/dynamic-import/packages/helper-package/dynamic/b.coffee b/tools/tests/apps/dynamic-import/packages/helper-package/dynamic/b.coffee new file mode 100644 index 0000000000..504ae3344a --- /dev/null +++ b/tools/tests/apps/dynamic-import/packages/helper-package/dynamic/b.coffee @@ -0,0 +1,3 @@ +localShared = require("./a.js").shared +localShared[module.id] = true +exports.shared = localShared diff --git a/tools/tests/apps/dynamic-import/packages/helper-package/helper-package.js b/tools/tests/apps/dynamic-import/packages/helper-package/helper-package.js new file mode 100644 index 0000000000..9f689d2b74 --- /dev/null +++ b/tools/tests/apps/dynamic-import/packages/helper-package/helper-package.js @@ -0,0 +1,15 @@ +import assert from "assert"; + +// Maks sure sharedWithinHelperPackage and __coffeescriptShare are +// declared as variables in the private scope of this package, but not +// defined globally. +assert.strictEqual(sharedWithinHelperPackage, void 0); +assert.strictEqual("sharedWithinHelperPackage" in global, false); +assert.strictEqual(__coffeescriptShare, void 0); +assert.strictEqual("__coffeescriptShare" in global, false); + +export const Helper = { + help() { + return "ok"; + } +}; diff --git a/tools/tests/apps/dynamic-import/packages/helper-package/package.js b/tools/tests/apps/dynamic-import/packages/helper-package/package.js new file mode 100644 index 0000000000..28e93af859 --- /dev/null +++ b/tools/tests/apps/dynamic-import/packages/helper-package/package.js @@ -0,0 +1,12 @@ +Package.describe({ + name: 'helper-package', + version: '0.0.1', +}); + +Package.onUse(function(api) { +// api.versionsFrom('1.4.2.7'); + api.use('ecmascript'); + api.use('coffeescript'); + api.mainModule('helper-package.js'); + api.export("Helper"); +}); diff --git a/tools/tests/apps/dynamic-import/packages/lazy-test-package/dynamic.js b/tools/tests/apps/dynamic-import/packages/lazy-test-package/dynamic.js index f3e9aa9c6f..038673028a 100644 --- a/tools/tests/apps/dynamic-import/packages/lazy-test-package/dynamic.js +++ b/tools/tests/apps/dynamic-import/packages/lazy-test-package/dynamic.js @@ -1 +1,8 @@ +import assert from "assert"; + export const name = module.id; + +export function checkHelper() { + assert.strictEqual(typeof Helper, "object"); + assert.strictEqual(Helper.help(), "ok"); +} diff --git a/tools/tests/apps/dynamic-import/packages/lazy-test-package/package.js b/tools/tests/apps/dynamic-import/packages/lazy-test-package/package.js index 3f740f2ec8..ec3a50664b 100644 --- a/tools/tests/apps/dynamic-import/packages/lazy-test-package/package.js +++ b/tools/tests/apps/dynamic-import/packages/lazy-test-package/package.js @@ -5,6 +5,8 @@ Package.describe({ Package.onUse(function(api) { api.use("ecmascript"); + api.use("helper-package"); + api.mainModule("main.js", [ "client", "server" diff --git a/tools/tests/apps/dynamic-import/tests.js b/tools/tests/apps/dynamic-import/tests.js index e04ef67f1a..0905ce7386 100644 --- a/tools/tests/apps/dynamic-import/tests.js +++ b/tools/tests/apps/dynamic-import/tests.js @@ -124,4 +124,26 @@ describe("dynamic import(...)", function () { }) ]); }); + + it("gives dynamic modules access to package variables", async function () { + const dynamic = await import("meteor/lazy-test-package/dynamic"); + dynamic.checkHelper(); + + const a = await import("meteor/helper-package/dynamic/a"); + const b = await import("meteor/helper-package/dynamic/b.coffee"); + + assert.strictEqual(a.shared, b.shared); + assert.deepEqual(a.shared, { + "/node_modules/meteor/helper-package/dynamic/a.js": true, + "/node_modules/meteor/helper-package/dynamic/b.coffee.js": true + }); + + assert.strictEqual( + (await import("meteor/helper-package")).Helper, + // Since these tests are defined in an application that uses the + // global scope for imported package variables, global.Helper should + // be identical to the Helper symbol exported by helper-package. + global.Helper + ); + }); }); From 7031ea1dd54d6ad91ccd5b8af7a51198573bf7e8 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Tue, 21 Feb 2017 13:24:59 -0500 Subject: [PATCH 051/195] Bump LINKER_CACHE_SALT for good measure. Recent changes to the way the linker works might not be reflected unless we invalidate .meteor/local/bundler-cache. --- tools/isobuild/compiler-plugin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/isobuild/compiler-plugin.js b/tools/isobuild/compiler-plugin.js index 96a01c1d9b..4c2925226e 100644 --- a/tools/isobuild/compiler-plugin.js +++ b/tools/isobuild/compiler-plugin.js @@ -62,7 +62,7 @@ import { isTestFilePath } from './test-files.js'; // Cache the (slightly post-processed) results of linker.fullLink. const CACHE_SIZE = process.env.METEOR_LINKER_CACHE_SIZE || 1024*1024*100; const CACHE_DEBUG = !! process.env.METEOR_TEST_PRINT_LINKER_CACHE_DEBUG; -const LINKER_CACHE_SALT = 14; // Increment this number to force relinking. +const LINKER_CACHE_SALT = 15; // Increment this number to force relinking. const LINKER_CACHE = new LRU({ max: CACHE_SIZE, // Cache is measured in bytes. We don't care about servePath. From a9ac309fb906240fccec0e919af942b54ba6843f Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Tue, 21 Feb 2017 13:26:01 -0500 Subject: [PATCH 052/195] Bump package versions for 1.5-beta.8 release. --- packages/babel-compiler/package.js | 2 +- packages/dynamic-import/package.js | 2 +- packages/ecmascript/package.js | 2 +- packages/localstorage/package.js | 2 +- packages/meteor-tool/package.js | 2 +- packages/modules-runtime/package.js | 2 +- packages/modules/package.js | 2 +- scripts/admin/meteor-release-experimental.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/babel-compiler/package.js b/packages/babel-compiler/package.js index 3bed5d86ae..6804dd2fd9 100644 --- a/packages/babel-compiler/package.js +++ b/packages/babel-compiler/package.js @@ -6,7 +6,7 @@ Package.describe({ // isn't possible because you can't publish a non-recommended // release with package versions that don't have a pre-release // identifier at the end (eg, -dev) - version: '6.15.0-beta.7' + version: '6.15.0-beta.8' }); Npm.depends({ diff --git a/packages/dynamic-import/package.js b/packages/dynamic-import/package.js index 947972e1e2..15ff01727b 100644 --- a/packages/dynamic-import/package.js +++ b/packages/dynamic-import/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "dynamic-import", - version: "0.1.0-beta.7", + version: "0.1.0-beta.8", summary: "Support for module.dynamicImport(id).then(namespace => ...)", documentation: "README.md" }); diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js index b1c17ab104..84a3c08654 100644 --- a/packages/ecmascript/package.js +++ b/packages/ecmascript/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'ecmascript', - version: '0.7.0-beta.7', + version: '0.7.0-beta.8', summary: 'Compiler plugin that supports ES2015+ in all .js files', documentation: 'README.md' }); diff --git a/packages/localstorage/package.js b/packages/localstorage/package.js index aa9869d3d7..25854e8b89 100644 --- a/packages/localstorage/package.js +++ b/packages/localstorage/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Simulates local storage on IE 6,7 using userData", - version: "1.1.0-beta.7" + version: "1.1.0-beta.8" }); Package.onUse(function (api) { diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js index 3deb9dd87e..bacd444772 100644 --- a/packages/meteor-tool/package.js +++ b/packages/meteor-tool/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "The Meteor command-line tool", - version: '1.5.0-beta.7' + version: '1.5.0-beta.8' }); Package.includeTool(); diff --git a/packages/modules-runtime/package.js b/packages/modules-runtime/package.js index 64e47589a4..2d053ebac7 100644 --- a/packages/modules-runtime/package.js +++ b/packages/modules-runtime/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules-runtime", - version: "0.8.0-beta.7", + version: "0.8.0-beta.8", summary: "CommonJS module system", git: "https://github.com/benjamn/install", documentation: "README.md" diff --git a/packages/modules/package.js b/packages/modules/package.js index 26a9a2e279..8e0304df68 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules", - version: "0.8.0-beta.7", + version: "0.8.0-beta.8", summary: "CommonJS module system", documentation: "README.md" }); diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json index f6306e3280..0b7cf43a28 100644 --- a/scripts/admin/meteor-release-experimental.json +++ b/scripts/admin/meteor-release-experimental.json @@ -1,6 +1,6 @@ { "track": "METEOR", - "version": "1.5-beta.7", + "version": "1.5-beta.8", "recommended": false, "official": false, "description": "Meteor" From cd62d4284ec0fdf534937cdf603415578e3790d7 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Wed, 22 Feb 2017 10:46:39 -0500 Subject: [PATCH 053/195] Enable eval if browser-policy-content is used. --- packages/dynamic-import/package.js | 2 ++ packages/dynamic-import/security.js | 20 ++++++++++++++++++++ packages/dynamic-import/server.js | 2 ++ 3 files changed, 24 insertions(+) create mode 100644 packages/dynamic-import/security.js diff --git a/packages/dynamic-import/package.js b/packages/dynamic-import/package.js index 15ff01727b..618dadebdd 100644 --- a/packages/dynamic-import/package.js +++ b/packages/dynamic-import/package.js @@ -6,6 +6,8 @@ Package.describe({ }); Package.onUse(function (api) { + api.use("browser-policy-content", { weak: true }); + api.use("modules"); api.use("localstorage"); api.use("promise"); diff --git a/packages/dynamic-import/security.js b/packages/dynamic-import/security.js new file mode 100644 index 0000000000..f8ccb576f2 --- /dev/null +++ b/packages/dynamic-import/security.js @@ -0,0 +1,20 @@ +const bpc = Package["browser-policy-content"]; +const BP = bpc && bpc.BrowserPolicy; +const BPc = BP && BP.content; +if (BPc) { + // The ability to evaluate new code is essential for loading dynamic + // modules. Without eval, we would be forced to load modules using + //