diff --git a/packages/deprecated/stylus/.npm/plugin/compileStylusBatch/.gitignore b/packages/deprecated/stylus/.npm/plugin/compileStylusBatch/.gitignore
new file mode 100644
index 0000000000..3c3629e647
--- /dev/null
+++ b/packages/deprecated/stylus/.npm/plugin/compileStylusBatch/.gitignore
@@ -0,0 +1 @@
+node_modules
diff --git a/packages/deprecated/stylus/.npm/plugin/compileStylusBatch/README b/packages/deprecated/stylus/.npm/plugin/compileStylusBatch/README
new file mode 100644
index 0000000000..3d492553a4
--- /dev/null
+++ b/packages/deprecated/stylus/.npm/plugin/compileStylusBatch/README
@@ -0,0 +1,7 @@
+This directory and the files immediately inside it are automatically generated
+when you change this package's NPM dependencies. Commit the files in this
+directory (npm-shrinkwrap.json, .gitignore, and this README) to source control
+so that others run the same versions of sub-dependencies.
+
+You should NOT check in the node_modules directory that Meteor automatically
+creates; if you are using git, the .gitignore file tells git to ignore it.
diff --git a/packages/deprecated/stylus/.npm/plugin/compileStylusBatch/npm-shrinkwrap.json b/packages/deprecated/stylus/.npm/plugin/compileStylusBatch/npm-shrinkwrap.json
new file mode 100644
index 0000000000..91eda21624
--- /dev/null
+++ b/packages/deprecated/stylus/.npm/plugin/compileStylusBatch/npm-shrinkwrap.json
@@ -0,0 +1,176 @@
+{
+ "lockfileVersion": 1,
+ "dependencies": {
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
+ },
+ "autoprefixer": {
+ "version": "6.3.7",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.3.7.tgz",
+ "integrity": "sha1-jt8xZt2f1hFlM2Ysi7NqA8DvyHQ="
+ },
+ "autoprefixer-stylus": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/autoprefixer-stylus/-/autoprefixer-stylus-0.9.4.tgz",
+ "integrity": "sha1-dgkUaV3OMhyZgLSQ2BpDhcCNkU0="
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+ },
+ "brace-expansion": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
+ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI="
+ },
+ "browserslist": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.3.6.tgz",
+ "integrity": "sha1-lS/0jVZGPTtTj4XvL46t39KEsTM="
+ },
+ "caniuse-db": {
+ "version": "1.0.30000793",
+ "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000793.tgz",
+ "integrity": "sha1-PADGbkI6ehkHx92Wdpp4sq+opy4="
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ },
+ "css-parse": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz",
+ "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs="
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g=="
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "glob": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
+ "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo="
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk="
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
+ "js-base64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.1.tgz",
+ "integrity": "sha512-2h586r2I/CqU7z1aa1kBgWaVAXWAZK+zHnceGi/jFgn7+7VSluxYer/i3xOZVearCxxXvyDkLtTBo+OeJCA3kA=="
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA=="
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM="
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "multi-stage-sourcemap": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/multi-stage-sourcemap/-/multi-stage-sourcemap-0.2.1.tgz",
+ "integrity": "sha1-sJ/IWG6qF/gdV1xK0C4Pej9rEQU="
+ },
+ "nib": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/nib/-/nib-1.1.2.tgz",
+ "integrity": "sha1-amnt5AgblcDe+L4CSkyK4MLLtsc="
+ },
+ "normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI="
+ },
+ "num2fraction": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+ "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4="
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E="
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+ },
+ "postcss": {
+ "version": "5.0.21",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.0.21.tgz",
+ "integrity": "sha1-1M9vGXdGSMSSrFfCmPavs8BMrv4=",
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ }
+ }
+ },
+ "postcss-value-parser": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz",
+ "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU="
+ },
+ "sax": {
+ "version": "0.5.8",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz",
+ "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE="
+ },
+ "source-map": {
+ "version": "0.1.43",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
+ "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y="
+ },
+ "stylus": {
+ "version": "https://github.com/meteor/stylus/tarball/bb47a357d132ca843718c63998eb37b90013a449",
+ "integrity": "sha512-j6fvtoNfjx/TEIlIOZ53OqbP6uDdF5HsQidsRfvp0IfW0D5PCtV8IeHVQa4jjbhF9PbjOXX/rrt5lP4CGpgtfw=="
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY="
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ }
+ }
+}
diff --git a/packages/deprecated/stylus/.versions b/packages/deprecated/stylus/.versions
new file mode 100644
index 0000000000..14f3908784
--- /dev/null
+++ b/packages/deprecated/stylus/.versions
@@ -0,0 +1,35 @@
+babel-compiler@5.8.24_1
+babel-runtime@0.1.4
+base64@1.0.9
+binary-heap@1.0.9
+blaze@1.0.3
+caching-compiler@1.0.0
+callback-hook@1.0.9
+check@1.0.6
+ddp@1.1.0
+deps@1.0.12
+ecmascript@0.1.4
+ecmascript-collections@0.1.6
+ejson@1.0.12
+geojson-utils@1.0.4
+htmljs@1.0.11
+id-map@1.0.8
+jquery@1.0.2
+json@1.0.3
+local-test:stylus@2.513.5
+logging@1.0.12
+meteor@1.1.16
+minimongo@1.0.8
+mongo@1.1.0
+observe-sequence@1.0.6
+ordered-dict@1.0.8
+promise@0.4.8
+random@1.0.4
+retry@1.0.4
+stylus@2.513.5
+templating@1.0.4
+test-helpers@1.0.3
+tinytest@1.0.5
+tracker@1.0.15
+ui@1.0.0
+underscore@1.0.9
diff --git a/packages/deprecated/stylus/package.js b/packages/deprecated/stylus/package.js
index dbd30525c8..ecad05868e 100644
--- a/packages/deprecated/stylus/package.js
+++ b/packages/deprecated/stylus/package.js
@@ -1,8 +1,32 @@
Package.describe({
- summary: 'DEPRECATED - Expressive, dynamic, robust CSS',
- version: "2.999.0"
+ summary: 'Expressive, dynamic, robust CSS',
+ version: "2.513.13"
+});
+
+Package.registerBuildPlugin({
+ name: 'compileStylusBatch',
+ use: ['ecmascript', 'caching-compiler'],
+ sources: [
+ 'plugin/compile-stylus.js'
+ ],
+ npmDependencies: {
+ stylus: "https://github.com/meteor/stylus/tarball/bb47a357d132ca843718c63998eb37b90013a449", // fork of 0.54.5
+ nib: "1.1.2",
+ "autoprefixer-stylus": "0.9.4"
+ }
});
Package.onUse(function (api) {
- api.addFiles('deprecation_notice.js');
+ api.use('isobuild:compiler-plugin@1.0.0');
+ api.addFiles("deprecation_notice.js");
+});
+
+Package.onTest(function (api) {
+ api.use(['tinytest', 'stylus', 'test-helpers', 'templating']);
+ api.addFiles([
+ 'stylus_tests.html',
+ 'stylus_tests.styl',
+ 'stylus_tests.import.styl',
+ 'stylus_tests.js'
+ ],'client');
});
diff --git a/packages/deprecated/stylus/plugin/compile-stylus.js b/packages/deprecated/stylus/plugin/compile-stylus.js
new file mode 100644
index 0000000000..21de2eda24
--- /dev/null
+++ b/packages/deprecated/stylus/plugin/compile-stylus.js
@@ -0,0 +1,198 @@
+const stylus = Npm.require('stylus');
+const nib = Npm.require('nib');
+const autoprefixer = Npm.require('autoprefixer-stylus');
+const Future = Npm.require('fibers/future');
+const fs = Plugin.fs;
+const path = Plugin.path;
+
+Plugin.registerCompiler({
+ extensions: ['styl'],
+ archMatching: 'web'
+}, () => new StylusCompiler());
+
+// CompileResult is {css, sourceMap}.
+class StylusCompiler extends MultiFileCachingCompiler {
+ constructor() {
+ super({
+ compilerName: 'stylus',
+ defaultCacheSize: 1024*1024*10,
+ });
+ }
+
+ getCacheKey(inputFile) {
+ return [
+ inputFile.getSourceHash(),
+ inputFile.getFileOptions(),
+ ];
+ }
+
+ compileResultSize(compileResult) {
+ return compileResult.css.length +
+ this.sourceMapSize(compileResult.sourceMap);
+ }
+
+ // The heuristic is that a file is an import (ie, is not itself
+ // processed as a root) if it matches *.import.styl. This can be
+ // overridden in either direction via an explicit `isImport` file option
+ // in api.addFiles.
+ isRoot(inputFile) {
+ const fileOptions = inputFile.getFileOptions();
+ if (fileOptions.hasOwnProperty('isImport')) {
+ return !fileOptions.isImport;
+ }
+
+ const pathInPackage = inputFile.getPathInPackage();
+ return ! /\.import\.styl$/.test(pathInPackage);
+ }
+
+ compileOneFile(inputFile, allFiles) {
+ const referencedImportPaths = [];
+
+ function parseImportPath(filePath, importerDir) {
+ if (! filePath) {
+ throw new Error('filePath is undefined');
+ }
+ if (filePath === inputFile.getPathInPackage()) {
+ return {
+ packageName: inputFile.getPackageName() || '',
+ pathInPackage: inputFile.getPathInPackage()
+ };
+ }
+ if (! filePath.match(/^\{.*\}\//)) {
+ if (! importerDir) {
+ return { packageName: inputFile.getPackageName() || '',
+ pathInPackage: filePath };
+ }
+
+ // relative path in the same package
+ const parsedImporter = parseImportPath(importerDir, null);
+
+ // resolve path if it is absolute or relative
+ const importPath =
+ (filePath[0] === '/') ? filePath :
+ path.join(parsedImporter.pathInPackage, filePath);
+
+ return {
+ packageName: parsedImporter.packageName,
+ pathInPackage: importPath
+ };
+ }
+
+ const match = /^\{(.*)\}\/(.*)$/.exec(filePath);
+ if (! match) { return null; }
+
+ const [ignored, packageName, pathInPackage] = match;
+ return {packageName, pathInPackage};
+ }
+ function absoluteImportPath(parsed) {
+ return '{' + parsed.packageName + '}/' + parsed.pathInPackage;
+ }
+
+ const importer = {
+ find(importPath, paths) {
+ const parsed = parseImportPath(importPath, paths[paths.length - 1]);
+ if (! parsed) { return null; }
+
+ if (importPath[0] !== '{') {
+ // if it is not a custom syntax path, it could be a lookup in a folder
+ for (let i = paths.length - 1; i >= 0; i--) {
+ const joined = path.join(paths[i], importPath);
+ if (statOrNull(joined)) {
+ return [joined];
+ }
+ }
+ }
+
+ const absolutePath = absoluteImportPath(parsed);
+
+ if (! allFiles.has(absolutePath)) {
+ return null;
+ }
+
+ return [absolutePath];
+ },
+ readFile(filePath) {
+ const isAbsolute = filePath[0] === '/';
+ const isNib =
+ filePath.indexOf('/node_modules/nib/lib/nib/') !== -1;
+ const isStylusBuiltIn =
+ filePath.indexOf('/node_modules/stylus/lib/') !== -1;
+
+ if (isAbsolute || isNib || isStylusBuiltIn) {
+ // absolute path? let the default implementation handle this
+ return fs.readFileSync(filePath, 'utf8');
+ }
+
+ const parsed = parseImportPath(filePath);
+ const absolutePath = absoluteImportPath(parsed);
+
+ referencedImportPaths.push(absolutePath);
+
+ if (! allFiles.has(absolutePath)) {
+ throw new Error(
+ `Cannot read file ${absolutePath} for ${inputFile.getDisplayPath()}`
+ );
+ }
+
+ return allFiles.get(absolutePath).getContentsAsString();
+ }
+ };
+
+ function processSourcemap(sourcemap) {
+ delete sourcemap.file;
+ sourcemap.sourcesContent = sourcemap.sources.map(importer.readFile);
+ sourcemap.sources = sourcemap.sources.map((filePath) => {
+ const parsed = parseImportPath(filePath);
+ if (!parsed.packageName)
+ return parsed.pathInPackage;
+ return 'packages/' + parsed.packageName + '/' + parsed.pathInPackage;
+ });
+
+ return sourcemap;
+ }
+
+ const fileOptions = inputFile.getFileOptions();
+
+ const f = new Future;
+
+ let style = stylus(inputFile.getContentsAsString()).use(nib())
+
+ if (fileOptions.autoprefixer) {
+ style = style.use(autoprefixer(fileOptions.autoprefixer))
+ }
+
+ style = style.set('filename', inputFile.getPathInPackage())
+ .set('sourcemap', { inline: false, comment: false })
+ .set('cache', false)
+ .set('importer', importer);
+
+ style.render(f.resolver());
+ let css;
+ try {
+ css = f.wait();
+ } catch (e) {
+ inputFile.error({
+ message: 'Stylus compiler error: ' + e.message
+ });
+ return null;
+ }
+ const sourceMap = processSourcemap(style.sourcemap);
+ return {referencedImportPaths, compileResult: {css, sourceMap}};
+ }
+
+ addCompileResult(inputFile, {css, sourceMap}) {
+ inputFile.addStylesheet({
+ path: inputFile.getPathInPackage() + '.css',
+ data: css,
+ sourceMap: sourceMap
+ });
+ }
+}
+
+function statOrNull(path) {
+ try {
+ return fs.statSync(path);
+ } catch (e) {
+ return null;
+ }
+}
diff --git a/packages/deprecated/stylus/stylus_tests.html b/packages/deprecated/stylus/stylus_tests.html
new file mode 100644
index 0000000000..e845cc341b
--- /dev/null
+++ b/packages/deprecated/stylus/stylus_tests.html
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/packages/deprecated/stylus/stylus_tests.import.styl b/packages/deprecated/stylus/stylus_tests.import.styl
new file mode 100644
index 0000000000..d5e4779860
--- /dev/null
+++ b/packages/deprecated/stylus/stylus_tests.import.styl
@@ -0,0 +1,5 @@
+// Variable used in stylus_test.styl
+importDashy = dashed
+
+.stylus-overwrite-color
+ font-size: 20px !important
diff --git a/packages/deprecated/stylus/stylus_tests.js b/packages/deprecated/stylus/stylus_tests.js
new file mode 100644
index 0000000000..33af39cca0
--- /dev/null
+++ b/packages/deprecated/stylus/stylus_tests.js
@@ -0,0 +1,27 @@
+
+Tinytest.add("stylus - presence", function(test) {
+
+ var div = document.createElement('div');
+ Blaze.render(Template.stylus_test_presence, div);
+ div.style.display = 'block';
+ document.body.appendChild(div);
+
+ var p = div.querySelector('p');
+ var leftBorder = getStyleProperty(p, 'border-left-style');
+ test.equal(leftBorder, "dashed");
+
+ document.body.removeChild(div);
+});
+
+Tinytest.add("stylus - @import", function(test) {
+ var div = document.createElement('div');
+ Blaze.render(Template.stylus_test_import, div);
+ div.style.display = 'block';
+ document.body.appendChild(div);
+
+ var p = div.querySelector('p');
+ test.equal(getStyleProperty(p, 'font-size'), "20px");
+ test.equal(getStyleProperty(p, 'border-left-style'), "dashed");
+
+ document.body.removeChild(div);
+});
diff --git a/packages/deprecated/stylus/stylus_tests.styl b/packages/deprecated/stylus/stylus_tests.styl
new file mode 100644
index 0000000000..46687d5ae2
--- /dev/null
+++ b/packages/deprecated/stylus/stylus_tests.styl
@@ -0,0 +1,16 @@
+@import "stylus_tests.import.styl"
+
+#stylus-tests
+ zoom: 1
+
+dashy = dashed
+
+.stylus-dashy-left-border
+ border-left: 1px dashy black
+
+.stylus-overwrite-size
+ // This property is overwritten in stylus_test.import.styl
+ font-size: 10px
+
+.stylus-import-dashy-border
+ border-left: 1px importDashy black