From 7b8a5f3ab837b47551d600cdbc271f19b3960b16 Mon Sep 17 00:00:00 2001 From: Geoffrey Booth Date: Fri, 28 Jul 2017 10:49:02 -0700 Subject: [PATCH 01/14] Bump CoffeeScript version --- .../.npm/plugin/compileCoffeescript/npm-shrinkwrap.json | 6 +++--- packages/non-core/coffeescript/package.js | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/non-core/coffeescript/.npm/plugin/compileCoffeescript/npm-shrinkwrap.json b/packages/non-core/coffeescript/.npm/plugin/compileCoffeescript/npm-shrinkwrap.json index a24f8dcdc1b..1f8aef812e0 100644 --- a/packages/non-core/coffeescript/.npm/plugin/compileCoffeescript/npm-shrinkwrap.json +++ b/packages/non-core/coffeescript/.npm/plugin/compileCoffeescript/npm-shrinkwrap.json @@ -1,9 +1,9 @@ { "dependencies": { "coffeescript": { - "version": "1.12.6", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.6.tgz", - "from": "coffeescript@1.12.6" + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", + "from": "coffeescript@1.12.7" }, "source-map": { "version": "0.5.6", diff --git a/packages/non-core/coffeescript/package.js b/packages/non-core/coffeescript/package.js index 5c7601eb1f5..298d1c8a51d 100644 --- a/packages/non-core/coffeescript/package.js +++ b/packages/non-core/coffeescript/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Javascript dialect with fewer braces and semicolons", - version: "1.12.6_1" + version: "1.12.7_1" }); Package.registerBuildPlugin({ @@ -8,7 +8,7 @@ Package.registerBuildPlugin({ use: ['caching-compiler', 'ecmascript'], sources: ['plugin/compile-coffeescript.js'], npmDependencies: { - "coffeescript": "1.12.6", + "coffeescript": "1.12.7", "source-map": "0.5.6" } }); From 0d65440fe08606a192fc51c1d137dd28f622b600 Mon Sep 17 00:00:00 2001 From: Geoffrey Booth Date: Tue, 25 Jul 2017 17:52:59 -0700 Subject: [PATCH 02/14] Instructions for how to test the coffeescript package --- packages/non-core/coffeescript/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/non-core/coffeescript/README.md b/packages/non-core/coffeescript/README.md index 711ff02abdc..fe0681a1aee 100644 --- a/packages/non-core/coffeescript/README.md +++ b/packages/non-core/coffeescript/README.md @@ -51,3 +51,13 @@ you'd like to see changed. ### Modules and CoffeeScript See [Modules » CoffeeScript Syntax](http://docs.meteor.com/packages/modules.html#CoffeeScript). + +### Testing This Package + +Follow the [instructions](https://github.com/meteor/meteor/blob/devel/Development.md#tests) +to check out the Meteor repo and run `test-packages`. +Once you can do that successfully, to test the `coffeescript` package run: + +```bash +./meteor test-packages packages/non-core/coffeescript +``` From e4c02401799b8c50242f5a731cb2f1212d02ea10 Mon Sep 17 00:00:00 2001 From: Geoffrey Booth Date: Fri, 28 Jul 2017 13:38:38 -0700 Subject: [PATCH 03/14] Split coffeescript package into coffeescript / coffeescript-compiler. --- .../non-core/coffeescript-compiler/.gitignore | 1 + .../.npm/package}/.gitignore | 0 .../.npm/package}/README | 0 .../.npm/package}/npm-shrinkwrap.json | 0 .../non-core/coffeescript-compiler/README.md | 17 ++ .../coffeescript-compiler.js | 214 +++++++++++++++ .../non-core/coffeescript-compiler/package.js | 21 ++ .../coffeescript-test-helper/.gitignore | 0 .../coffeescript-test-helper/README.md | 0 .../coffeescript-test-helper/exporting.coffee | 0 .../coffeescript-test-helper/package.js | 0 packages/non-core/coffeescript/.gitignore | 1 + packages/non-core/coffeescript/README.md | 6 +- .../coffeescript/compile-coffeescript.js | 48 ++++ packages/non-core/coffeescript/package.js | 22 +- .../plugin/compile-coffeescript.js | 252 ------------------ 16 files changed, 316 insertions(+), 266 deletions(-) create mode 100644 packages/non-core/coffeescript-compiler/.gitignore rename packages/non-core/{coffeescript/.npm/plugin/compileCoffeescript => coffeescript-compiler/.npm/package}/.gitignore (100%) rename packages/non-core/{coffeescript/.npm/plugin/compileCoffeescript => coffeescript-compiler/.npm/package}/README (100%) rename packages/non-core/{coffeescript/.npm/plugin/compileCoffeescript => coffeescript-compiler/.npm/package}/npm-shrinkwrap.json (100%) create mode 100644 packages/non-core/coffeescript-compiler/README.md create mode 100644 packages/non-core/coffeescript-compiler/coffeescript-compiler.js create mode 100644 packages/non-core/coffeescript-compiler/package.js rename packages/{ => non-core}/coffeescript-test-helper/.gitignore (100%) rename packages/{ => non-core}/coffeescript-test-helper/README.md (100%) rename packages/{ => non-core}/coffeescript-test-helper/exporting.coffee (100%) rename packages/{ => non-core}/coffeescript-test-helper/package.js (100%) create mode 100644 packages/non-core/coffeescript/compile-coffeescript.js delete mode 100644 packages/non-core/coffeescript/plugin/compile-coffeescript.js diff --git a/packages/non-core/coffeescript-compiler/.gitignore b/packages/non-core/coffeescript-compiler/.gitignore new file mode 100644 index 00000000000..918ef5d781a --- /dev/null +++ b/packages/non-core/coffeescript-compiler/.gitignore @@ -0,0 +1 @@ +.npm diff --git a/packages/non-core/coffeescript/.npm/plugin/compileCoffeescript/.gitignore b/packages/non-core/coffeescript-compiler/.npm/package/.gitignore similarity index 100% rename from packages/non-core/coffeescript/.npm/plugin/compileCoffeescript/.gitignore rename to packages/non-core/coffeescript-compiler/.npm/package/.gitignore diff --git a/packages/non-core/coffeescript/.npm/plugin/compileCoffeescript/README b/packages/non-core/coffeescript-compiler/.npm/package/README similarity index 100% rename from packages/non-core/coffeescript/.npm/plugin/compileCoffeescript/README rename to packages/non-core/coffeescript-compiler/.npm/package/README diff --git a/packages/non-core/coffeescript/.npm/plugin/compileCoffeescript/npm-shrinkwrap.json b/packages/non-core/coffeescript-compiler/.npm/package/npm-shrinkwrap.json similarity index 100% rename from packages/non-core/coffeescript/.npm/plugin/compileCoffeescript/npm-shrinkwrap.json rename to packages/non-core/coffeescript-compiler/.npm/package/npm-shrinkwrap.json diff --git a/packages/non-core/coffeescript-compiler/README.md b/packages/non-core/coffeescript-compiler/README.md new file mode 100644 index 00000000000..2a394f6f5bf --- /dev/null +++ b/packages/non-core/coffeescript-compiler/README.md @@ -0,0 +1,17 @@ +# coffeescript-compiler +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/coffeescript-compiler) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/coffeescript-compiler) +*** + +This package supports the [`coffeescript`](../coffeescript/README.md) package, +and any other packages that wish to compile CoffeeScript code into JavaScript. +Like the [`babel-compiler`](../babel-compiler/README.md) package, the actual +compilation is separated out from the build plugin so that packages besides +the official `coffeescript` package can compile CoffeeScript code. + +### Testing This Package + +Testing the `coffeescript` package also tests this one: + +```bash +./meteor test-packages coffeescript +``` diff --git a/packages/non-core/coffeescript-compiler/coffeescript-compiler.js b/packages/non-core/coffeescript-compiler/coffeescript-compiler.js new file mode 100644 index 00000000000..ed228594cc8 --- /dev/null +++ b/packages/non-core/coffeescript-compiler/coffeescript-compiler.js @@ -0,0 +1,214 @@ +import { BabelCompiler } from 'meteor/babel-compiler'; +import CoffeeScript from 'coffeescript'; +import { SourceMapConsumer, SourceMapGenerator } from 'source-map'; + + +// The CoffeeScript compiler overrides Error.prepareStackTrace, mostly for the +// use of coffee.run which we don't use. This conflicts with the tool's use of +// Error.prepareStackTrace to properly show error messages in linked code. +// Restore the tool's one after CoffeeScript clobbers it at import time. +if (Error.METEOR_prepareStackTrace) { + Error.prepareStackTrace = Error.METEOR_prepareStackTrace; +} + + +// The CompileResult for this CachingCompiler is a {source, sourceMap} object. +CoffeeScriptCompiler = class CoffeeScriptCompiler { + constructor() { + this.babelCompiler = new BabelCompiler({ + // Prevent Babel from importing helpers from babel-runtime, since + // the CoffeeScript plugin does not imply the modules package, which + // means require may not be defined. Note that this in no way + // prevents CoffeeScript projects from using the modules package and + // putting require or import statements within backticks; it just + // won't happen automatically because of Babel. + runtime: false + }); + } + + getCompileOptions(inputFile) { + return { + bare: true, + filename: inputFile.getPathInPackage(), + literate: inputFile.getExtension() !== 'coffee', + // Return a source map. + sourceMap: true, + // This becomes the `file` field of the source map. + generatedFile: '/' + this.outputFilePath(inputFile), + // This becomes the `sources` field of the source map. + sourceFiles: [inputFile.getDisplayPath()], + }; + } + + outputFilePath(inputFile) { + return inputFile.getPathInPackage() + '.js'; + } + + compileOneFile(inputFile) { + const source = inputFile.getContentsAsString(); + const compileOptions = this.getCompileOptions(inputFile); + + let output; + try { + output = CoffeeScript.compile(source, compileOptions); + } catch (e) { + inputFile.error({ + message: e.message, + line: e.location && (e.location.first_line + 1), + column: e.location && (e.location.first_column + 1) + }); + return null; + } + + let sourceMap = JSON.parse(output.v3SourceMap); + sourceMap.sourcesContent = [source]; + + output.js = this.stripExportedVars( + output.js, + inputFile.getDeclaredExports().map(e => e.name) + ); + + // CoffeeScript contains a handful of features that output as ES2015+, + // such as modules, generator functions, for…of, and tagged template + // literals. Because they’re too varied to detect, pass all CoffeeScript + // compiler output through the Babel compiler. + const doubleRoastedCoffee = + this.babelCompiler.processOneFileForTarget(inputFile, output.js); + + if (doubleRoastedCoffee != null && + doubleRoastedCoffee.data != null) { + output.js = doubleRoastedCoffee.data; + + const coffeeSourceMap = doubleRoastedCoffee.sourceMap; + + if (coffeeSourceMap) { + // Reference the compiled CoffeeScript file so that `applySourceMap` + // below can match it with the source map produced by the CoffeeScript + // compiler. + coffeeSourceMap.sources[0] = '/' + this.outputFilePath(inputFile); + + // Combine the original CoffeeScript source map with the one + // produced by this.babelCompiler.processOneFileForTarget. + const smg = SourceMapGenerator.fromSourceMap( + new SourceMapConsumer(coffeeSourceMap) + ); + smg.applySourceMap(new SourceMapConsumer(sourceMap)); + sourceMap = smg.toJSON(); + } else { + // If the .coffee file is contained by a node_modules directory, + // then BabelCompiler will not transpile it, and there will be + // no sourceMap, but that's fine because the original + // CoffeeScript sourceMap will still be valid. + } + } + + return this.addSharedHeader(output.js, sourceMap); + } + + stripExportedVars(source, exports) { + if (!exports || !exports.length) + return source; + const lines = source.split("\n"); + + // We make the following assumptions, based on the output of CoffeeScript + // 1.7.1. + // - The var declaration in question is not indented and is the first such + // var declaration. (CoffeeScript only produces one var line at each + // scope and there's only one top-level scope.) All relevant variables + // are actually on this line. + // - The user hasn't used a ###-comment containing a line that looks like + // a var line, to produce something like + // /* bla + // var foo; + // */ + // before an actual var line. (ie, we do NOT attempt to figure out if + // we're inside a /**/ comment, which is produced by ### comments.) + // - The var in question is not assigned to in the declaration, nor are any + // other vars on this line. (CoffeeScript does produce some assignments + // but only for internal helpers generated by CoffeeScript, and they end + // up on subsequent lines.) + // XXX relax these assumptions by doing actual JS parsing (eg with jsparse). + // I'd do this now, but there's no easy way to "unparse" a jsparse AST. + // Or alternatively, hack the compiler to allow us to specify unbound + // symbols directly. + + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + const match = /^var (.+)([,;])$/.exec(line); + if (!match) + continue; + + // If there's an assignment on this line, we assume that there are ONLY + // assignments and that the var we are looking for is not declared. (Part + // of our strong assumption about the layout of this code.) + if (match[1].indexOf('=') !== -1) + continue; + + // We want to replace the line with something no shorter, so that all + // records in the source map continue to point at valid + // characters. + function replaceLine(x) { + if (x.length >= lines[i].length) { + lines[i] = x; + } else { + lines[i] = x + new Array(1 + (lines[i].length - x.length)).join(' '); + } + } + + let vars = match[1].split(', ').filter(v => exports.indexOf(v) === -1); + if (vars.length) { + replaceLine('var ' + vars.join(', ') + match[2]); + } else { + // We got rid of all the vars on this line. Drop the whole line if this + // didn't continue to the next line, otherwise keep just the 'var '. + if (match[2] === ';') + replaceLine(''); + else + replaceLine('var'); + } + break; + } + + return lines.join('\n'); + } + + addSharedHeader(source, sourceMap) { + // We want the symbol "share" to be visible to all CoffeeScript files in the + // package (and shared between them), but not visible to JavaScript + // files. (That's because we don't want to introduce two competing ways to + // make package-local variables into JS ("share" vs assigning to non-var + // variables).) The following hack accomplishes that: "__coffeescriptShare" + // will be visible at the package level and "share" at the file level. This + // should work both in "package" mode where __coffeescriptShare will be added + // as a var in the package closure, and in "app" mode where it will end up as + // a global. + // + // This ends in a newline to make the source map easier to adjust. + const header = ("__coffeescriptShare = typeof __coffeescriptShare === 'object' " + + "? __coffeescriptShare : {}; " + + "var share = __coffeescriptShare;\n"); + + // If the file begins with "use strict", we need to keep that as the first + // statement. + const processedSource = source.replace(/^(?:((['"])use strict\2;)\n)?/, (match, useStrict) => { + if (match) { + // There's a "use strict"; we keep this as the first statement and insert + // our header at the end of the line that it's on. This doesn't change + // line numbers or the part of the line that previous may have been + // annotated, so we don't need to update the source map. + return useStrict + ' ' + header; + } else { + // There's no use strict, so we can just add the header at the very + // beginning. This adds a line to the file, so we update the source map to + // add a single un-annotated line to the beginning. + sourceMap.mappings = ';' + sourceMap.mappings; + return header; + } + }); + return { + source: processedSource, + sourceMap: sourceMap + }; + } + +} diff --git a/packages/non-core/coffeescript-compiler/package.js b/packages/non-core/coffeescript-compiler/package.js new file mode 100644 index 00000000000..fc394b77511 --- /dev/null +++ b/packages/non-core/coffeescript-compiler/package.js @@ -0,0 +1,21 @@ +Package.describe({ + name: 'coffeescript-compiler', + summary: 'Compiler for CoffeeScript code, supporting the coffeescript package', + version: '1.12.7_1' // Tracks version of NPM `coffeescript` module, with _1, _2 etc. +}); + +Npm.depends({ + 'coffeescript': '1.12.7', + 'source-map': '0.5.6' +}); + +Package.onUse(function (api) { + api.use('babel-compiler'); + api.use('ecmascript'); + + api.addFiles(['coffeescript-compiler.js'], 'server'); + + api.export('CoffeeScriptCompiler', 'server'); +}); + +// See `coffeescript` package for tests. diff --git a/packages/coffeescript-test-helper/.gitignore b/packages/non-core/coffeescript-test-helper/.gitignore similarity index 100% rename from packages/coffeescript-test-helper/.gitignore rename to packages/non-core/coffeescript-test-helper/.gitignore diff --git a/packages/coffeescript-test-helper/README.md b/packages/non-core/coffeescript-test-helper/README.md similarity index 100% rename from packages/coffeescript-test-helper/README.md rename to packages/non-core/coffeescript-test-helper/README.md diff --git a/packages/coffeescript-test-helper/exporting.coffee b/packages/non-core/coffeescript-test-helper/exporting.coffee similarity index 100% rename from packages/coffeescript-test-helper/exporting.coffee rename to packages/non-core/coffeescript-test-helper/exporting.coffee diff --git a/packages/coffeescript-test-helper/package.js b/packages/non-core/coffeescript-test-helper/package.js similarity index 100% rename from packages/coffeescript-test-helper/package.js rename to packages/non-core/coffeescript-test-helper/package.js diff --git a/packages/non-core/coffeescript/.gitignore b/packages/non-core/coffeescript/.gitignore index 677a6fc2637..c01644335c7 100644 --- a/packages/non-core/coffeescript/.gitignore +++ b/packages/non-core/coffeescript/.gitignore @@ -1 +1,2 @@ .build* +.npm diff --git a/packages/non-core/coffeescript/README.md b/packages/non-core/coffeescript/README.md index fe0681a1aee..b23b98c88d6 100644 --- a/packages/non-core/coffeescript/README.md +++ b/packages/non-core/coffeescript/README.md @@ -44,10 +44,6 @@ Here's how CoffeeScript works with Meteor's namespacing. for a value that is shared between all CoffeeScript code in a package, but doesn't escape that package. -Heavy CoffeeScript users, please let us know how this arrangement -works for you, whether `share` is helpful for you, and anything else -you'd like to see changed. - ### Modules and CoffeeScript See [Modules » CoffeeScript Syntax](http://docs.meteor.com/packages/modules.html#CoffeeScript). @@ -59,5 +55,5 @@ to check out the Meteor repo and run `test-packages`. Once you can do that successfully, to test the `coffeescript` package run: ```bash -./meteor test-packages packages/non-core/coffeescript +./meteor test-packages coffeescript ``` diff --git a/packages/non-core/coffeescript/compile-coffeescript.js b/packages/non-core/coffeescript/compile-coffeescript.js new file mode 100644 index 00000000000..c8c940b7705 --- /dev/null +++ b/packages/non-core/coffeescript/compile-coffeescript.js @@ -0,0 +1,48 @@ +Plugin.registerCompiler({ + extensions: ['coffee', 'litcoffee', 'coffee.md'] +}, () => new CachedCoffeeScriptCompiler()); + + +// The CompileResult for this CachingCompiler is a {source, sourceMap} object. +class CachedCoffeeScriptCompiler extends CachingCompiler { + constructor() { + super({ + compilerName: 'coffeescript', + defaultCacheSize: 1024*1024*10, + }); + + this.coffeeScriptCompiler = new CoffeeScriptCompiler(); + } + + getCacheKey(inputFile) { + return [ + inputFile.getSourceHash(), + inputFile.getDeclaredExports(), + this.coffeeScriptCompiler.getCompileOptions(inputFile), + ]; + } + + setDiskCacheDirectory(cacheDir) { + this.coffeeScriptCompiler.babelCompiler.setDiskCacheDirectory(cacheDir); + return super.setDiskCacheDirectory(cacheDir); + } + + compileOneFile(inputFile) { + return this.coffeeScriptCompiler.compileOneFile(inputFile); + } + + addCompileResult(inputFile, sourceWithMap) { + inputFile.addJavaScript({ + path: this.coffeeScriptCompiler.outputFilePath(inputFile), + sourcePath: inputFile.getPathInPackage(), + data: sourceWithMap.source, + sourceMap: sourceWithMap.sourceMap, + bare: inputFile.getFileOptions().bare + }); + } + + compileResultSize(sourceWithMap) { + return sourceWithMap.source.length + + this.sourceMapSize(sourceWithMap.sourceMap); + } +} diff --git a/packages/non-core/coffeescript/package.js b/packages/non-core/coffeescript/package.js index 298d1c8a51d..0634a957622 100644 --- a/packages/non-core/coffeescript/package.js +++ b/packages/non-core/coffeescript/package.js @@ -1,21 +1,25 @@ Package.describe({ - summary: "Javascript dialect with fewer braces and semicolons", - version: "1.12.7_1" + name: 'coffeescript', + summary: 'Javascript dialect with fewer braces and semicolons', + // This package version used to track the version of the NPM `coffeescript` + // module, but now the Meteor package `coffeescript-compiler` tracks that + // version; so in order for this to appear newer than the previous package + // version 1.12.6_1, we jump to 10+. + version: '10.0.1' }); Package.registerBuildPlugin({ - name: "compileCoffeescript", - use: ['caching-compiler', 'ecmascript'], - sources: ['plugin/compile-coffeescript.js'], + name: 'compile-coffeescript', + use: ['caching-compiler', 'coffeescript-compiler', 'ecmascript'], + sources: ['compile-coffeescript.js'], npmDependencies: { - "coffeescript": "1.12.7", - "source-map": "0.5.6" + 'coffeescript': '1.12.7', + 'source-map': '0.5.6' } }); Package.onUse(function (api) { api.use('isobuild:compiler-plugin@1.0.0'); - api.use('babel-compiler'); // Because the CoffeeScript plugin now calls // BabelCompiler.prototype.processOneFileForTarget for any ES2015+ @@ -23,7 +27,7 @@ Package.onUse(function (api) { // same runtime environment that the 'ecmascript' package provides. // The following api.imply calls should match those in ../ecmascript/package.js, // except that coffeescript does not api.imply('modules'). - api.imply('ecmascript-runtime'); + api.imply('ecmascript-runtime', 'server'); api.imply('babel-runtime'); api.imply('promise'); }); diff --git a/packages/non-core/coffeescript/plugin/compile-coffeescript.js b/packages/non-core/coffeescript/plugin/compile-coffeescript.js deleted file mode 100644 index 03abcbe8422..00000000000 --- a/packages/non-core/coffeescript/plugin/compile-coffeescript.js +++ /dev/null @@ -1,252 +0,0 @@ -import { - SourceMapConsumer, - SourceMapGenerator, -} from 'source-map'; -import coffee from 'coffeescript'; -import { BabelCompiler } from 'meteor/babel-compiler'; - -// The CoffeeScript compiler overrides Error.prepareStackTrace, mostly for the -// use of coffee.run which we don't use. This conflicts with the tool's use of -// Error.prepareStackTrace to properly show error messages in linked code. -// Restore the tool's one after CoffeeScript clobbers it at import time. -if (Error.METEOR_prepareStackTrace) { - Error.prepareStackTrace = Error.METEOR_prepareStackTrace; -} - -Plugin.registerCompiler({ - extensions: ['coffee', 'litcoffee', 'coffee.md'] -}, () => new CoffeeCompiler()); - -// The CompileResult for this CachingCompiler is a {source, sourceMap} object. - -export class CoffeeCompiler extends CachingCompiler { - constructor() { - super({ - compilerName: 'coffeescript', - defaultCacheSize: 1024*1024*10, - }); - - this.babelCompiler = new BabelCompiler({ - // Prevent Babel from importing helpers from babel-runtime, since - // the CoffeeScript plugin does not imply the modules package, which - // means require may not be defined. Note that this in no way - // prevents CoffeeScript projects from using the modules package and - // putting require or import statements within backticks; it just - // won't happen automatically because of Babel. - runtime: false - }); - } - - _getCompileOptions(inputFile) { - return { - bare: true, - filename: inputFile.getPathInPackage(), - literate: inputFile.getExtension() !== 'coffee', - // Return a source map. - sourceMap: true, - // This becomes the "file" field of the source map. - generatedFile: '/' + this._outputFilePath(inputFile), - // This becomes the "sources" field of the source map. - sourceFiles: [inputFile.getDisplayPath()], - }; - } - - _outputFilePath(inputFile) { - return inputFile.getPathInPackage() + '.js'; - } - - getCacheKey(inputFile) { - return [ - inputFile.getSourceHash(), - inputFile.getDeclaredExports(), - this._getCompileOptions(inputFile), - ]; - } - - setDiskCacheDirectory(cacheDir) { - this.babelCompiler.setDiskCacheDirectory(cacheDir); - return super.setDiskCacheDirectory(cacheDir); - } - - compileOneFile(inputFile) { - const source = inputFile.getContentsAsString(); - const compileOptions = this._getCompileOptions(inputFile); - - let output; - try { - output = coffee.compile(source, compileOptions); - } catch (e) { - inputFile.error({ - message: e.message, - line: e.location && (e.location.first_line + 1), - column: e.location && (e.location.first_column + 1) - }); - return null; - } - - let sourceMap = JSON.parse(output.v3SourceMap); - sourceMap.sourcesContent = [source]; - - output.js = stripExportedVars( - output.js, - inputFile.getDeclaredExports().map(e => e.name) - ); - - // CoffeeScript contains a handful of features that output as ES2015+, - // such as modules, generator functions, for…of, and tagged template - // literals. Because they’re too varied to detect, pass all CoffeeScript - // compiler output through the Babel compiler. - const doubleRoastedCoffee = - this.babelCompiler.processOneFileForTarget(inputFile, output.js); - - if (doubleRoastedCoffee != null && - doubleRoastedCoffee.data != null) { - output.js = doubleRoastedCoffee.data; - - const coffeeSourceMap = doubleRoastedCoffee.sourceMap; - - if (coffeeSourceMap) { - // Reference the compiled CoffeeScript file so that `applySourceMap` - // below can match it with the source map produced by the CoffeeScript - // compiler. - coffeeSourceMap.sources[0] = '/' + this._outputFilePath(inputFile); - - // Combine the original CoffeeScript source map with the one - // produced by this.babelCompiler.processOneFileForTarget. - const smg = SourceMapGenerator.fromSourceMap( - new SourceMapConsumer(coffeeSourceMap) - ); - smg.applySourceMap(new SourceMapConsumer(sourceMap)); - sourceMap = smg.toJSON(); - } else { - // If the .coffee file is contained by a node_modules directory, - // then BabelCompiler will not transpile it, and there will be - // no sourceMap, but that's fine because the original - // CoffeeScript sourceMap will still be valid. - } - } - - return addSharedHeader(output.js, sourceMap); - } - - addCompileResult(inputFile, sourceWithMap) { - inputFile.addJavaScript({ - path: this._outputFilePath(inputFile), - sourcePath: inputFile.getPathInPackage(), - data: sourceWithMap.source, - sourceMap: sourceWithMap.sourceMap, - bare: inputFile.getFileOptions().bare - }); - } - - compileResultSize(sourceWithMap) { - return sourceWithMap.source.length + - this.sourceMapSize(sourceWithMap.sourceMap); - } -} - -function stripExportedVars(source, exports) { - if (!exports || !exports.length) - return source; - const lines = source.split("\n"); - - // We make the following assumptions, based on the output of CoffeeScript - // 1.7.1. - // - The var declaration in question is not indented and is the first such - // var declaration. (CoffeeScript only produces one var line at each - // scope and there's only one top-level scope.) All relevant variables - // are actually on this line. - // - The user hasn't used a ###-comment containing a line that looks like - // a var line, to produce something like - // /* bla - // var foo; - // */ - // before an actual var line. (ie, we do NOT attempt to figure out if - // we're inside a /**/ comment, which is produced by ### comments.) - // - The var in question is not assigned to in the declaration, nor are any - // other vars on this line. (CoffeeScript does produce some assignments - // but only for internal helpers generated by CoffeeScript, and they end - // up on subsequent lines.) - // XXX relax these assumptions by doing actual JS parsing (eg with jsparse). - // I'd do this now, but there's no easy way to "unparse" a jsparse AST. - // Or alternatively, hack the compiler to allow us to specify unbound - // symbols directly. - - for (let i = 0; i < lines.length; i++) { - const line = lines[i]; - const match = /^var (.+)([,;])$/.exec(line); - if (!match) - continue; - - // If there's an assignment on this line, we assume that there are ONLY - // assignments and that the var we are looking for is not declared. (Part - // of our strong assumption about the layout of this code.) - if (match[1].indexOf('=') !== -1) - continue; - - // We want to replace the line with something no shorter, so that all - // records in the source map continue to point at valid - // characters. - function replaceLine(x) { - if (x.length >= lines[i].length) { - lines[i] = x; - } else { - lines[i] = x + new Array(1 + (lines[i].length - x.length)).join(' '); - } - } - - let vars = match[1].split(', ').filter(v => exports.indexOf(v) === -1); - if (vars.length) { - replaceLine('var ' + vars.join(', ') + match[2]); - } else { - // We got rid of all the vars on this line. Drop the whole line if this - // didn't continue to the next line, otherwise keep just the 'var '. - if (match[2] === ';') - replaceLine(''); - else - replaceLine('var'); - } - break; - } - - return lines.join('\n'); -} - -function addSharedHeader(source, sourceMap) { - // We want the symbol "share" to be visible to all CoffeeScript files in the - // package (and shared between them), but not visible to JavaScript - // files. (That's because we don't want to introduce two competing ways to - // make package-local variables into JS ("share" vs assigning to non-var - // variables).) The following hack accomplishes that: "__coffeescriptShare" - // will be visible at the package level and "share" at the file level. This - // should work both in "package" mode where __coffeescriptShare will be added - // as a var in the package closure, and in "app" mode where it will end up as - // a global. - // - // This ends in a newline to make the source map easier to adjust. - const header = ("__coffeescriptShare = typeof __coffeescriptShare === 'object' " + - "? __coffeescriptShare : {}; " + - "var share = __coffeescriptShare;\n"); - - // If the file begins with "use strict", we need to keep that as the first - // statement. - const processedSource = source.replace(/^(?:((['"])use strict\2;)\n)?/, (match, useStrict) => { - if (match) { - // There's a "use strict"; we keep this as the first statement and insert - // our header at the end of the line that it's on. This doesn't change - // line numbers or the part of the line that previous may have been - // annotated, so we don't need to update the source map. - return useStrict + ' ' + header; - } else { - // There's no use strict, so we can just add the header at the very - // beginning. This adds a line to the file, so we update the source map to - // add a single un-annotated line to the beginning. - sourceMap.mappings = ';' + sourceMap.mappings; - return header; - } - }); - return { - source: processedSource, - sourceMap: sourceMap - }; -} From 13fb390bc7e109a038d40bb68ad56094a7eb4083 Mon Sep 17 00:00:00 2001 From: Geoffrey Booth Date: Mon, 14 Aug 2017 22:07:04 +0000 Subject: [PATCH 04/14] Move coffeescript and coffeescript-test-helper packages back into core. (#8960) They depend on core packages like caching-compiler, but coffeescript-compiler can remain in non-core, so it can update more frequently as npm coffeescript gets updated. --- packages/{non-core => }/coffeescript-test-helper/.gitignore | 0 packages/{non-core => }/coffeescript-test-helper/README.md | 0 packages/{non-core => }/coffeescript-test-helper/exporting.coffee | 0 packages/{non-core => }/coffeescript-test-helper/package.js | 0 packages/{non-core => }/coffeescript/.gitignore | 0 packages/{non-core => }/coffeescript/README.md | 0 packages/{non-core => }/coffeescript/compile-coffeescript.js | 0 packages/{non-core => }/coffeescript/package.js | 0 packages/{non-core => }/coffeescript/tests/bare_test_setup.coffee | 0 packages/{non-core => }/coffeescript/tests/bare_tests.js | 0 .../{non-core => }/coffeescript/tests/coffeescript_module.coffee | 0 .../coffeescript/tests/coffeescript_strict_tests.coffee | 0 .../{non-core => }/coffeescript/tests/coffeescript_test_setup.js | 0 .../{non-core => }/coffeescript/tests/coffeescript_tests.coffee | 0 packages/{non-core => }/coffeescript/tests/coffeescript_tests.js | 0 packages/{non-core => }/coffeescript/tests/es2015_module.js | 0 .../coffeescript/tests/litcoffeescript_tests.coffee.md | 0 .../coffeescript/tests/litcoffeescript_tests.litcoffee | 0 18 files changed, 0 insertions(+), 0 deletions(-) rename packages/{non-core => }/coffeescript-test-helper/.gitignore (100%) rename packages/{non-core => }/coffeescript-test-helper/README.md (100%) rename packages/{non-core => }/coffeescript-test-helper/exporting.coffee (100%) rename packages/{non-core => }/coffeescript-test-helper/package.js (100%) rename packages/{non-core => }/coffeescript/.gitignore (100%) rename packages/{non-core => }/coffeescript/README.md (100%) rename packages/{non-core => }/coffeescript/compile-coffeescript.js (100%) rename packages/{non-core => }/coffeescript/package.js (100%) rename packages/{non-core => }/coffeescript/tests/bare_test_setup.coffee (100%) rename packages/{non-core => }/coffeescript/tests/bare_tests.js (100%) rename packages/{non-core => }/coffeescript/tests/coffeescript_module.coffee (100%) rename packages/{non-core => }/coffeescript/tests/coffeescript_strict_tests.coffee (100%) rename packages/{non-core => }/coffeescript/tests/coffeescript_test_setup.js (100%) rename packages/{non-core => }/coffeescript/tests/coffeescript_tests.coffee (100%) rename packages/{non-core => }/coffeescript/tests/coffeescript_tests.js (100%) rename packages/{non-core => }/coffeescript/tests/es2015_module.js (100%) rename packages/{non-core => }/coffeescript/tests/litcoffeescript_tests.coffee.md (100%) rename packages/{non-core => }/coffeescript/tests/litcoffeescript_tests.litcoffee (100%) diff --git a/packages/non-core/coffeescript-test-helper/.gitignore b/packages/coffeescript-test-helper/.gitignore similarity index 100% rename from packages/non-core/coffeescript-test-helper/.gitignore rename to packages/coffeescript-test-helper/.gitignore diff --git a/packages/non-core/coffeescript-test-helper/README.md b/packages/coffeescript-test-helper/README.md similarity index 100% rename from packages/non-core/coffeescript-test-helper/README.md rename to packages/coffeescript-test-helper/README.md diff --git a/packages/non-core/coffeescript-test-helper/exporting.coffee b/packages/coffeescript-test-helper/exporting.coffee similarity index 100% rename from packages/non-core/coffeescript-test-helper/exporting.coffee rename to packages/coffeescript-test-helper/exporting.coffee diff --git a/packages/non-core/coffeescript-test-helper/package.js b/packages/coffeescript-test-helper/package.js similarity index 100% rename from packages/non-core/coffeescript-test-helper/package.js rename to packages/coffeescript-test-helper/package.js diff --git a/packages/non-core/coffeescript/.gitignore b/packages/coffeescript/.gitignore similarity index 100% rename from packages/non-core/coffeescript/.gitignore rename to packages/coffeescript/.gitignore diff --git a/packages/non-core/coffeescript/README.md b/packages/coffeescript/README.md similarity index 100% rename from packages/non-core/coffeescript/README.md rename to packages/coffeescript/README.md diff --git a/packages/non-core/coffeescript/compile-coffeescript.js b/packages/coffeescript/compile-coffeescript.js similarity index 100% rename from packages/non-core/coffeescript/compile-coffeescript.js rename to packages/coffeescript/compile-coffeescript.js diff --git a/packages/non-core/coffeescript/package.js b/packages/coffeescript/package.js similarity index 100% rename from packages/non-core/coffeescript/package.js rename to packages/coffeescript/package.js diff --git a/packages/non-core/coffeescript/tests/bare_test_setup.coffee b/packages/coffeescript/tests/bare_test_setup.coffee similarity index 100% rename from packages/non-core/coffeescript/tests/bare_test_setup.coffee rename to packages/coffeescript/tests/bare_test_setup.coffee diff --git a/packages/non-core/coffeescript/tests/bare_tests.js b/packages/coffeescript/tests/bare_tests.js similarity index 100% rename from packages/non-core/coffeescript/tests/bare_tests.js rename to packages/coffeescript/tests/bare_tests.js diff --git a/packages/non-core/coffeescript/tests/coffeescript_module.coffee b/packages/coffeescript/tests/coffeescript_module.coffee similarity index 100% rename from packages/non-core/coffeescript/tests/coffeescript_module.coffee rename to packages/coffeescript/tests/coffeescript_module.coffee diff --git a/packages/non-core/coffeescript/tests/coffeescript_strict_tests.coffee b/packages/coffeescript/tests/coffeescript_strict_tests.coffee similarity index 100% rename from packages/non-core/coffeescript/tests/coffeescript_strict_tests.coffee rename to packages/coffeescript/tests/coffeescript_strict_tests.coffee diff --git a/packages/non-core/coffeescript/tests/coffeescript_test_setup.js b/packages/coffeescript/tests/coffeescript_test_setup.js similarity index 100% rename from packages/non-core/coffeescript/tests/coffeescript_test_setup.js rename to packages/coffeescript/tests/coffeescript_test_setup.js diff --git a/packages/non-core/coffeescript/tests/coffeescript_tests.coffee b/packages/coffeescript/tests/coffeescript_tests.coffee similarity index 100% rename from packages/non-core/coffeescript/tests/coffeescript_tests.coffee rename to packages/coffeescript/tests/coffeescript_tests.coffee diff --git a/packages/non-core/coffeescript/tests/coffeescript_tests.js b/packages/coffeescript/tests/coffeescript_tests.js similarity index 100% rename from packages/non-core/coffeescript/tests/coffeescript_tests.js rename to packages/coffeescript/tests/coffeescript_tests.js diff --git a/packages/non-core/coffeescript/tests/es2015_module.js b/packages/coffeescript/tests/es2015_module.js similarity index 100% rename from packages/non-core/coffeescript/tests/es2015_module.js rename to packages/coffeescript/tests/es2015_module.js diff --git a/packages/non-core/coffeescript/tests/litcoffeescript_tests.coffee.md b/packages/coffeescript/tests/litcoffeescript_tests.coffee.md similarity index 100% rename from packages/non-core/coffeescript/tests/litcoffeescript_tests.coffee.md rename to packages/coffeescript/tests/litcoffeescript_tests.coffee.md diff --git a/packages/non-core/coffeescript/tests/litcoffeescript_tests.litcoffee b/packages/coffeescript/tests/litcoffeescript_tests.litcoffee similarity index 100% rename from packages/non-core/coffeescript/tests/litcoffeescript_tests.litcoffee rename to packages/coffeescript/tests/litcoffeescript_tests.litcoffee From 3677e17a23af90dd05d64bcbddcb45967c7bc4e9 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Mon, 14 Aug 2017 18:33:23 -0400 Subject: [PATCH 05/14] Bump coffeescript package version to 1.13.0. This Meteor package version does not need to track the npm version of the coffeescript package, and probably should not change as often as the version of the packages/non-core/coffeescript-compiler package. --- packages/coffeescript/package.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/coffeescript/package.js b/packages/coffeescript/package.js index 0634a957622..9189fe8984c 100644 --- a/packages/coffeescript/package.js +++ b/packages/coffeescript/package.js @@ -5,7 +5,7 @@ Package.describe({ // module, but now the Meteor package `coffeescript-compiler` tracks that // version; so in order for this to appear newer than the previous package // version 1.12.6_1, we jump to 10+. - version: '10.0.1' + version: '1.13.0' }); Package.registerBuildPlugin({ From dd6a0f703bec962f0452efc7ee53d9066cf2862d Mon Sep 17 00:00:00 2001 From: Geoffrey Booth Date: Tue, 15 Aug 2017 10:23:54 +0000 Subject: [PATCH 06/14] Move all coffeescript* packages back into non-core --- packages/{ => non-core}/coffeescript-test-helper/.gitignore | 0 packages/{ => non-core}/coffeescript-test-helper/README.md | 0 packages/{ => non-core}/coffeescript-test-helper/exporting.coffee | 0 packages/{ => non-core}/coffeescript-test-helper/package.js | 0 packages/{ => non-core}/coffeescript/.gitignore | 0 packages/{ => non-core}/coffeescript/README.md | 0 packages/{ => non-core}/coffeescript/compile-coffeescript.js | 0 packages/{ => non-core}/coffeescript/package.js | 0 packages/{ => non-core}/coffeescript/tests/bare_test_setup.coffee | 0 packages/{ => non-core}/coffeescript/tests/bare_tests.js | 0 .../{ => non-core}/coffeescript/tests/coffeescript_module.coffee | 0 .../coffeescript/tests/coffeescript_strict_tests.coffee | 0 .../{ => non-core}/coffeescript/tests/coffeescript_test_setup.js | 0 .../{ => non-core}/coffeescript/tests/coffeescript_tests.coffee | 0 packages/{ => non-core}/coffeescript/tests/coffeescript_tests.js | 0 packages/{ => non-core}/coffeescript/tests/es2015_module.js | 0 .../coffeescript/tests/litcoffeescript_tests.coffee.md | 0 .../coffeescript/tests/litcoffeescript_tests.litcoffee | 0 18 files changed, 0 insertions(+), 0 deletions(-) rename packages/{ => non-core}/coffeescript-test-helper/.gitignore (100%) rename packages/{ => non-core}/coffeescript-test-helper/README.md (100%) rename packages/{ => non-core}/coffeescript-test-helper/exporting.coffee (100%) rename packages/{ => non-core}/coffeescript-test-helper/package.js (100%) rename packages/{ => non-core}/coffeescript/.gitignore (100%) rename packages/{ => non-core}/coffeescript/README.md (100%) rename packages/{ => non-core}/coffeescript/compile-coffeescript.js (100%) rename packages/{ => non-core}/coffeescript/package.js (100%) rename packages/{ => non-core}/coffeescript/tests/bare_test_setup.coffee (100%) rename packages/{ => non-core}/coffeescript/tests/bare_tests.js (100%) rename packages/{ => non-core}/coffeescript/tests/coffeescript_module.coffee (100%) rename packages/{ => non-core}/coffeescript/tests/coffeescript_strict_tests.coffee (100%) rename packages/{ => non-core}/coffeescript/tests/coffeescript_test_setup.js (100%) rename packages/{ => non-core}/coffeescript/tests/coffeescript_tests.coffee (100%) rename packages/{ => non-core}/coffeescript/tests/coffeescript_tests.js (100%) rename packages/{ => non-core}/coffeescript/tests/es2015_module.js (100%) rename packages/{ => non-core}/coffeescript/tests/litcoffeescript_tests.coffee.md (100%) rename packages/{ => non-core}/coffeescript/tests/litcoffeescript_tests.litcoffee (100%) diff --git a/packages/coffeescript-test-helper/.gitignore b/packages/non-core/coffeescript-test-helper/.gitignore similarity index 100% rename from packages/coffeescript-test-helper/.gitignore rename to packages/non-core/coffeescript-test-helper/.gitignore diff --git a/packages/coffeescript-test-helper/README.md b/packages/non-core/coffeescript-test-helper/README.md similarity index 100% rename from packages/coffeescript-test-helper/README.md rename to packages/non-core/coffeescript-test-helper/README.md diff --git a/packages/coffeescript-test-helper/exporting.coffee b/packages/non-core/coffeescript-test-helper/exporting.coffee similarity index 100% rename from packages/coffeescript-test-helper/exporting.coffee rename to packages/non-core/coffeescript-test-helper/exporting.coffee diff --git a/packages/coffeescript-test-helper/package.js b/packages/non-core/coffeescript-test-helper/package.js similarity index 100% rename from packages/coffeescript-test-helper/package.js rename to packages/non-core/coffeescript-test-helper/package.js diff --git a/packages/coffeescript/.gitignore b/packages/non-core/coffeescript/.gitignore similarity index 100% rename from packages/coffeescript/.gitignore rename to packages/non-core/coffeescript/.gitignore diff --git a/packages/coffeescript/README.md b/packages/non-core/coffeescript/README.md similarity index 100% rename from packages/coffeescript/README.md rename to packages/non-core/coffeescript/README.md diff --git a/packages/coffeescript/compile-coffeescript.js b/packages/non-core/coffeescript/compile-coffeescript.js similarity index 100% rename from packages/coffeescript/compile-coffeescript.js rename to packages/non-core/coffeescript/compile-coffeescript.js diff --git a/packages/coffeescript/package.js b/packages/non-core/coffeescript/package.js similarity index 100% rename from packages/coffeescript/package.js rename to packages/non-core/coffeescript/package.js diff --git a/packages/coffeescript/tests/bare_test_setup.coffee b/packages/non-core/coffeescript/tests/bare_test_setup.coffee similarity index 100% rename from packages/coffeescript/tests/bare_test_setup.coffee rename to packages/non-core/coffeescript/tests/bare_test_setup.coffee diff --git a/packages/coffeescript/tests/bare_tests.js b/packages/non-core/coffeescript/tests/bare_tests.js similarity index 100% rename from packages/coffeescript/tests/bare_tests.js rename to packages/non-core/coffeescript/tests/bare_tests.js diff --git a/packages/coffeescript/tests/coffeescript_module.coffee b/packages/non-core/coffeescript/tests/coffeescript_module.coffee similarity index 100% rename from packages/coffeescript/tests/coffeescript_module.coffee rename to packages/non-core/coffeescript/tests/coffeescript_module.coffee diff --git a/packages/coffeescript/tests/coffeescript_strict_tests.coffee b/packages/non-core/coffeescript/tests/coffeescript_strict_tests.coffee similarity index 100% rename from packages/coffeescript/tests/coffeescript_strict_tests.coffee rename to packages/non-core/coffeescript/tests/coffeescript_strict_tests.coffee diff --git a/packages/coffeescript/tests/coffeescript_test_setup.js b/packages/non-core/coffeescript/tests/coffeescript_test_setup.js similarity index 100% rename from packages/coffeescript/tests/coffeescript_test_setup.js rename to packages/non-core/coffeescript/tests/coffeescript_test_setup.js diff --git a/packages/coffeescript/tests/coffeescript_tests.coffee b/packages/non-core/coffeescript/tests/coffeescript_tests.coffee similarity index 100% rename from packages/coffeescript/tests/coffeescript_tests.coffee rename to packages/non-core/coffeescript/tests/coffeescript_tests.coffee diff --git a/packages/coffeescript/tests/coffeescript_tests.js b/packages/non-core/coffeescript/tests/coffeescript_tests.js similarity index 100% rename from packages/coffeescript/tests/coffeescript_tests.js rename to packages/non-core/coffeescript/tests/coffeescript_tests.js diff --git a/packages/coffeescript/tests/es2015_module.js b/packages/non-core/coffeescript/tests/es2015_module.js similarity index 100% rename from packages/coffeescript/tests/es2015_module.js rename to packages/non-core/coffeescript/tests/es2015_module.js diff --git a/packages/coffeescript/tests/litcoffeescript_tests.coffee.md b/packages/non-core/coffeescript/tests/litcoffeescript_tests.coffee.md similarity index 100% rename from packages/coffeescript/tests/litcoffeescript_tests.coffee.md rename to packages/non-core/coffeescript/tests/litcoffeescript_tests.coffee.md diff --git a/packages/coffeescript/tests/litcoffeescript_tests.litcoffee b/packages/non-core/coffeescript/tests/litcoffeescript_tests.litcoffee similarity index 100% rename from packages/coffeescript/tests/litcoffeescript_tests.litcoffee rename to packages/non-core/coffeescript/tests/litcoffeescript_tests.litcoffee From 89af934b54aeada8830393587256448c614abc1b Mon Sep 17 00:00:00 2001 From: Geoffrey Booth Date: Tue, 15 Aug 2017 16:40:27 +0000 Subject: [PATCH 07/14] Fix `coffeescript` package version to same as `coffeescript-compiler`; update documentation --- .../non-core/coffeescript-compiler/README.md | 2 +- packages/non-core/coffeescript/README.md | 2 +- packages/non-core/coffeescript/package.js | 18 +++++++----------- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/packages/non-core/coffeescript-compiler/README.md b/packages/non-core/coffeescript-compiler/README.md index 2a394f6f5bf..c561fe29e33 100644 --- a/packages/non-core/coffeescript-compiler/README.md +++ b/packages/non-core/coffeescript-compiler/README.md @@ -13,5 +13,5 @@ the official `coffeescript` package can compile CoffeeScript code. Testing the `coffeescript` package also tests this one: ```bash -./meteor test-packages coffeescript +./meteor test-packages packages/non-core/coffeescript ``` diff --git a/packages/non-core/coffeescript/README.md b/packages/non-core/coffeescript/README.md index b23b98c88d6..040656445d7 100644 --- a/packages/non-core/coffeescript/README.md +++ b/packages/non-core/coffeescript/README.md @@ -55,5 +55,5 @@ to check out the Meteor repo and run `test-packages`. Once you can do that successfully, to test the `coffeescript` package run: ```bash -./meteor test-packages coffeescript +./meteor test-packages packages/non-core/coffeescript ``` diff --git a/packages/non-core/coffeescript/package.js b/packages/non-core/coffeescript/package.js index 9189fe8984c..73a68abebb7 100644 --- a/packages/non-core/coffeescript/package.js +++ b/packages/non-core/coffeescript/package.js @@ -1,21 +1,17 @@ Package.describe({ name: 'coffeescript', summary: 'Javascript dialect with fewer braces and semicolons', - // This package version used to track the version of the NPM `coffeescript` - // module, but now the Meteor package `coffeescript-compiler` tracks that - // version; so in order for this to appear newer than the previous package - // version 1.12.6_1, we jump to 10+. - version: '1.13.0' + // This package version should track the version of the `coffeescript-compiler` + // package, because people will likely only have this one added to their apps; + // so bumping the version of this package will be how they get newer versions + // of `coffeescript-compiler`. + version: '1.12.7_1' }); Package.registerBuildPlugin({ name: 'compile-coffeescript', use: ['caching-compiler', 'coffeescript-compiler', 'ecmascript'], - sources: ['compile-coffeescript.js'], - npmDependencies: { - 'coffeescript': '1.12.7', - 'source-map': '0.5.6' - } + sources: ['compile-coffeescript.js'] }); Package.onUse(function (api) { @@ -25,7 +21,7 @@ Package.onUse(function (api) { // BabelCompiler.prototype.processOneFileForTarget for any ES2015+ // JavaScript or JavaScript enclosed by backticks, it must provide the // same runtime environment that the 'ecmascript' package provides. - // The following api.imply calls should match those in ../ecmascript/package.js, + // The following api.imply calls should match those in ../../ecmascript/package.js, // except that coffeescript does not api.imply('modules'). api.imply('ecmascript-runtime', 'server'); api.imply('babel-runtime'); From 27c6a52d3582d9629d05967d8bf7ef00c3b39879 Mon Sep 17 00:00:00 2001 From: Geoffrey Booth Date: Tue, 15 Aug 2017 16:52:40 +0000 Subject: [PATCH 08/14] Fix coffeescript / coffeescript-compiler dependency versions --- packages/non-core/coffeescript-compiler/package.js | 4 ++-- packages/non-core/coffeescript/package.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/non-core/coffeescript-compiler/package.js b/packages/non-core/coffeescript-compiler/package.js index fc394b77511..e6be0160807 100644 --- a/packages/non-core/coffeescript-compiler/package.js +++ b/packages/non-core/coffeescript-compiler/package.js @@ -10,8 +10,8 @@ Npm.depends({ }); Package.onUse(function (api) { - api.use('babel-compiler'); - api.use('ecmascript'); + api.use('babel-compiler@6.19.4'); + api.use('ecmascript@0.8.2'); api.addFiles(['coffeescript-compiler.js'], 'server'); diff --git a/packages/non-core/coffeescript/package.js b/packages/non-core/coffeescript/package.js index 73a68abebb7..10f73947c1b 100644 --- a/packages/non-core/coffeescript/package.js +++ b/packages/non-core/coffeescript/package.js @@ -10,7 +10,7 @@ Package.describe({ Package.registerBuildPlugin({ name: 'compile-coffeescript', - use: ['caching-compiler', 'coffeescript-compiler', 'ecmascript'], + use: ['caching-compiler@1.1.9', 'ecmascript@0.8.2', 'coffeescript-compiler@1.12.7_1'], sources: ['compile-coffeescript.js'] }); From 6a612f4213acd07e90e16d99127c742f09a88221 Mon Sep 17 00:00:00 2001 From: Geoffrey Booth Date: Tue, 15 Aug 2017 18:19:48 +0000 Subject: [PATCH 09/14] Fix coffeescript-compiler version; make more ecmascript-y --- .../non-core/coffeescript-compiler/coffeescript-compiler.js | 2 +- packages/non-core/coffeescript-compiler/package.js | 6 ++++-- packages/non-core/coffeescript/package.js | 5 +++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/non-core/coffeescript-compiler/coffeescript-compiler.js b/packages/non-core/coffeescript-compiler/coffeescript-compiler.js index ed228594cc8..52652d05180 100644 --- a/packages/non-core/coffeescript-compiler/coffeescript-compiler.js +++ b/packages/non-core/coffeescript-compiler/coffeescript-compiler.js @@ -13,7 +13,7 @@ if (Error.METEOR_prepareStackTrace) { // The CompileResult for this CachingCompiler is a {source, sourceMap} object. -CoffeeScriptCompiler = class CoffeeScriptCompiler { +export class CoffeeScriptCompiler { constructor() { this.babelCompiler = new BabelCompiler({ // Prevent Babel from importing helpers from babel-runtime, since diff --git a/packages/non-core/coffeescript-compiler/package.js b/packages/non-core/coffeescript-compiler/package.js index e6be0160807..74c02728a70 100644 --- a/packages/non-core/coffeescript-compiler/package.js +++ b/packages/non-core/coffeescript-compiler/package.js @@ -1,7 +1,9 @@ Package.describe({ name: 'coffeescript-compiler', summary: 'Compiler for CoffeeScript code, supporting the coffeescript package', - version: '1.12.7_1' // Tracks version of NPM `coffeescript` module, with _1, _2 etc. + // This version of NPM `coffeescript` module, with _1, _2 etc. + // If you change this, make sure to also update ../coffeescript/package.js to match. + version: '1.12.7_1' }); Npm.depends({ @@ -13,7 +15,7 @@ Package.onUse(function (api) { api.use('babel-compiler@6.19.4'); api.use('ecmascript@0.8.2'); - api.addFiles(['coffeescript-compiler.js'], 'server'); + api.mainModule(['coffeescript-compiler.js'], 'server'); api.export('CoffeeScriptCompiler', 'server'); }); diff --git a/packages/non-core/coffeescript/package.js b/packages/non-core/coffeescript/package.js index 10f73947c1b..c5bdc576bc9 100644 --- a/packages/non-core/coffeescript/package.js +++ b/packages/non-core/coffeescript/package.js @@ -4,13 +4,14 @@ Package.describe({ // This package version should track the version of the `coffeescript-compiler` // package, because people will likely only have this one added to their apps; // so bumping the version of this package will be how they get newer versions - // of `coffeescript-compiler`. + // of `coffeescript-compiler`. If you change this, make sure to also update + // ../coffeescript-compiler/package.js to match. version: '1.12.7_1' }); Package.registerBuildPlugin({ name: 'compile-coffeescript', - use: ['caching-compiler@1.1.9', 'ecmascript@0.8.2', 'coffeescript-compiler@1.12.7_1'], + use: ['caching-compiler@1.1.9', 'ecmascript@0.8.2', 'coffeescript-compiler@=1.12.7_1'], sources: ['compile-coffeescript.js'] }); From 4bd17e3f3075953d8dfb0304a1dc62f1b000e4fa Mon Sep 17 00:00:00 2001 From: Geoffrey Booth Date: Wed, 16 Aug 2017 12:37:31 -0700 Subject: [PATCH 10/14] Fix syntax of api.mainModule --- packages/non-core/coffeescript-compiler/package.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/non-core/coffeescript-compiler/package.js b/packages/non-core/coffeescript-compiler/package.js index 74c02728a70..0696cdfc620 100644 --- a/packages/non-core/coffeescript-compiler/package.js +++ b/packages/non-core/coffeescript-compiler/package.js @@ -15,7 +15,7 @@ Package.onUse(function (api) { api.use('babel-compiler@6.19.4'); api.use('ecmascript@0.8.2'); - api.mainModule(['coffeescript-compiler.js'], 'server'); + api.mainModule('coffeescript-compiler.js', 'server'); api.export('CoffeeScriptCompiler', 'server'); }); From 65c8b481e20d02aa06b994c75d83c7db79ce37df Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Thu, 17 Aug 2017 09:44:07 -0400 Subject: [PATCH 11/14] Specify a few more version constraints in coffeescript packages. Small follow-up to #9018. Note (especially @GeoffreyBooth): these version constraints do two things: (1) specify a minimum version, and (2) fix the major version. In other words, the coffeescript package should not need to be republished when we publish new minor versions of these core packages in Meteor 1.5.2 or 1.6. When/if we publish a new major version of these packages, the coffeescript package can simply bump its version constraints, but that probably won't happen any time soon. I think that's reasonable because a major version bump suggests there are some significant changes that need to be acknowledged by dependent packages. --- packages/non-core/coffeescript-test-helper/package.js | 4 ++-- packages/non-core/coffeescript/package.js | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/non-core/coffeescript-test-helper/package.js b/packages/non-core/coffeescript-test-helper/package.js index b79b10367e2..1789bee55a6 100644 --- a/packages/non-core/coffeescript-test-helper/package.js +++ b/packages/non-core/coffeescript-test-helper/package.js @@ -1,10 +1,10 @@ Package.describe({ summary: "Used by the coffeescript package's tests", - version: "1.0.8" + version: "1.0.9" }); Package.onUse(function (api) { - api.use('coffeescript', ['client', 'server']); + api.use('coffeescript@1.12.7', ['client', 'server']); api.export('COFFEESCRIPT_EXPORTED'); api.export('COFFEESCRIPT_EXPORTED_ONE_MORE'); api.export('COFFEESCRIPT_EXPORTED_WITH_BACKTICKS'); diff --git a/packages/non-core/coffeescript/package.js b/packages/non-core/coffeescript/package.js index c5bdc576bc9..a4b4511c767 100644 --- a/packages/non-core/coffeescript/package.js +++ b/packages/non-core/coffeescript/package.js @@ -24,9 +24,9 @@ Package.onUse(function (api) { // same runtime environment that the 'ecmascript' package provides. // The following api.imply calls should match those in ../../ecmascript/package.js, // except that coffeescript does not api.imply('modules'). - api.imply('ecmascript-runtime', 'server'); - api.imply('babel-runtime'); - api.imply('promise'); + api.imply('ecmascript-runtime@0.4.1', 'server'); + api.imply('babel-runtime@1.0.1'); + api.imply('promise@0.8.9'); }); Package.onTest(function (api) { From 5319b4800c55be79c3310a07368261cf4288cb4c Mon Sep 17 00:00:00 2001 From: Hugh Willson Date: Mon, 21 Aug 2017 16:26:14 -0400 Subject: [PATCH 12/14] Add the missing `meteor list --tree` History.md entry (#9025) --- History.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/History.md b/History.md index 66611a6eabc..8c974da9b5a 100644 --- a/History.md +++ b/History.md @@ -1,5 +1,11 @@ ## v.NEXT +* `meteor list --tree` can now be used to list all transitive package + dependencies (and versions) in an application. Weakly referenced dependencies + can also be listed by using the `--weak` option. For more information, run + `meteor help list`. + [PR #8936](https://github.com/meteor/meteor/pull/8936) + * The `star.json` manifest created within the root of a `meteor build` bundle will now contain `nodeVersion` and `npmVersion` which will specify the exact versions of Node.js and npm (respectively) which the Meteor release was From e027a46d71943682e1137712a782a7fae478935c Mon Sep 17 00:00:00 2001 From: Hugh Willson Date: Tue, 22 Aug 2017 15:57:43 -0400 Subject: [PATCH 13/14] Add missing CLI help for test/test-packages --driver-package (#9035) --- tools/cli/help.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tools/cli/help.txt b/tools/cli/help.txt index d397e731c7b..88dd7c735e2 100644 --- a/tools/cli/help.txt +++ b/tools/cli/help.txt @@ -584,6 +584,10 @@ Options: test app rebuild. --extra-packages Run with additional packages (comma separated, for example: --extra-packages "package-name1, package-name2@1.2.3") + --driver-package Name of the optional test driver package to use to run + tests and display results. For example: + --driver-package practicalmeteor:mocha + >>> test Test the application Usage: meteor test --driver-package [options] @@ -638,6 +642,9 @@ Options: --verbose Print all output from builds logs. --extra-packages Run with additional packages (comma separated, for example: --extra-packages "package-name1, package-name2@1.2.3") + --driver-package Name of the optional test driver package to use to run + tests and display results. For example: + --driver-package practicalmeteor:mocha >>> self-test Run tests of the 'meteor' tool. From cd5405437c3050fa05648723da7a05b2baf02699 Mon Sep 17 00:00:00 2001 From: Hugh Willson Date: Tue, 22 Aug 2017 20:52:30 -0400 Subject: [PATCH 14/14] Visually notify of uncaught exceptions breaking client tests (#9034) * Visually notify of uncaught exceptions breaking client tests These changes add a global `window.onerror` event handler to the `test-in-browser` package, to catch any previously uncaught exceptions. When uncaught exceptions are found, an alert box is displayed above the test results table. This should help notify developers of hidden uncaught exceptions that could be preventing client tests from running. Fixes #4979. * Bump the test-in-browser package version --- packages/test-in-browser/driver.css | 6 ++++- packages/test-in-browser/driver.html | 39 +++++++++++++++++++++++----- packages/test-in-browser/driver.js | 13 ++++++++++ packages/test-in-browser/package.js | 3 ++- 4 files changed, 52 insertions(+), 9 deletions(-) diff --git a/packages/test-in-browser/driver.css b/packages/test-in-browser/driver.css index 1530170097a..0251f37d4fb 100644 --- a/packages/test-in-browser/driver.css +++ b/packages/test-in-browser/driver.css @@ -151,4 +151,8 @@ body { #current-client-test { color: #ccc; margin-right: 15px; -} \ No newline at end of file +} + +.failedTests { + color: #900; /* red */ +} diff --git a/packages/test-in-browser/driver.html b/packages/test-in-browser/driver.html index 5e4b272e0c1..fbd3ec10e1d 100644 --- a/packages/test-in-browser/driver.html +++ b/packages/test-in-browser/driver.html @@ -1,6 +1,7 @@ + +