[FIX] Replace postcss Meteor package (#15929)

Co-authored-by: Diego Sampaio <chinello@gmail.com>
pull/17388/head
Tasso Evangelista 5 years ago committed by GitHub
parent f3e0999c83
commit 0b1b0c27bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      .meteor/packages
  2. 3
      .meteor/versions
  3. 2070
      package-lock.json
  4. 8
      package.json
  5. 1
      packages/rocketchat-postcss/.gitignore
  6. 172
      packages/rocketchat-postcss/build.js
  7. 18
      packages/rocketchat-postcss/package.js

@ -70,7 +70,6 @@ raix:ui-dropped-event
rocketchat:tap-i18n
underscore@1.0.10
juliancwirko:postcss
littledata:synced-cron
edgee:slingshot
@ -93,5 +92,6 @@ webapp@1.8.0
webapp-hashing@1.0.9
rocketchat:oauth2-server
rocketchat:i18n
rocketchat:postcss
dandv:caret-position
facts-base

@ -62,7 +62,6 @@ jparker:crypto-core@0.1.0
jparker:crypto-md5@0.1.1
jparker:gravatar@0.5.1
jquery@1.11.11
juliancwirko:postcss@2.0.3
kadira:blaze-layout@2.3.0
kadira:flow-router@2.12.1
keepnox:perfect-scrollbar@0.6.8
@ -126,6 +125,7 @@ rocketchat:i18n@0.0.1
rocketchat:livechat@0.0.1
rocketchat:mongo-config@0.0.1
rocketchat:oauth2-server@2.1.0
rocketchat:postcss@1.0.0
rocketchat:streamer@1.1.0
rocketchat:tap-i18n@1.9.1
rocketchat:version@1.0.0
@ -144,7 +144,6 @@ templating@1.3.2
templating-compiler@1.3.3
templating-runtime@1.3.2
templating-tools@1.1.2
tmeasday:check-npm-versions@0.3.2
tracker@1.2.0
twitter-oauth@1.2.0
typescript@3.7.5

2070
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -71,7 +71,7 @@
"@typescript-eslint/eslint-plugin": "^2.11.0",
"@typescript-eslint/parser": "^2.11.0",
"acorn": "^6.4.1",
"autoprefixer": "^9.6.1",
"autoprefixer": "^9.7.3",
"babel-eslint": "^10.0.3",
"babel-loader": "^8.0.6",
"babel-mocha-es6-compiler": "^0.1.0",
@ -95,17 +95,17 @@
"mongo-unit": "^1.4.4",
"node-sprite-generator": "^0.10.2",
"postcss": "^7.0.6",
"postcss-custom-properties": "^8.0.9",
"postcss-custom-properties": "^9.0.2",
"postcss-easy-import": "^3.0.0",
"postcss-import": "^12.0.1",
"postcss-load-config": "^2.0.0",
"postcss-media-minmax": "^4.0.0",
"postcss-nested": "^4.1.0",
"postcss-nested": "^4.2.1",
"postcss-selector-not": "^4.0.0",
"postcss-url": "^8.0.0",
"progress": "^2.0.2",
"proxyquire": "^2.1.0",
"simple-git": "^1.107.0",
"source-map": "^0.5.6",
"stylelint": "^9.9.0",
"stylelint-order": "^2.0.0",
"supertest": "^3.3.0",

@ -0,0 +1,172 @@
import { CssTools } from 'meteor/minifier-css';
import postcss from 'postcss';
import postcssrc from 'postcss-load-config';
import { SourceMapConsumer, SourceMapGenerator } from 'source-map';
let loaded = false;
let postcssConfigPlugins = [];
let postcssConfigParser = null;
let postcssConfigExcludedPackages = [];
const loadPostcssConfig = async () => {
if (loaded) {
return;
}
try {
const config = await postcssrc({ meteor: true });
postcssConfigPlugins = config.plugins || [];
postcssConfigParser = config.options.parser || null;
postcssConfigExcludedPackages = config.options.excludedPackages || [];
} catch (error) {
if (error.message.indexOf('No PostCSS Config found') < 0) {
throw error;
}
} finally {
loaded = true;
}
};
const isImportFile = ({ _source: { url } }) => /\.import\.css$/.test(url) || /(?:^|\/)imports\//.test(url);
const isInExcludedPackages = (pathInBundle) =>
postcssConfigExcludedPackages.some((packageName) =>
pathInBundle.indexOf(`packages/${ packageName.replace(':', '_') }/`) > -1);
const handleFileError = (file, error) => {
if (error.name === 'CssSyntaxError') {
file.error({
message: error.message,
line: error.line,
column: error.column,
});
return;
}
if (error.reason) {
file.error({
message: error.reason,
line: error.line,
column: error.column,
});
return;
}
file.error({ message: error.message });
};
const getAbstractSyntaxTree = async (file) => {
const filename = file.getPathInBundle();
if (isInExcludedPackages(filename)) {
return Object.assign(CssTools.parseCss(file.getContentsAsString(), {
source: filename,
position: true,
}), { filename });
}
try {
const postcssResult = await postcss(postcssConfigPlugins)
.process(file.getContentsAsString(), {
from: process.cwd() + file._source.url,
parser: postcssConfigParser,
});
postcssResult.warnings().forEach((warn) => {
process.stderr.write(warn.toString());
});
return Object.assign(CssTools.parseCss(postcssResult.css, {
source: filename,
position: true,
}), { filename });
} catch (error) {
if (error.name === 'CssSyntaxError') {
error.message = `${ error.message }\n\nCss Syntax Error.\n\n${ error.message }${ error.showSourceCode() }`;
}
handleFileError(file, error);
return {
type: 'stylesheet',
stylesheet: {
rules: [],
},
filename,
};
}
};
const mergeCssFiles = async (files) => {
const cssAsts = await Promise.all(files.map(getAbstractSyntaxTree));
const mergedCssAst = CssTools.mergeCssAsts(cssAsts, (filename, msg) => {
console.warn(`${ filename }: warn: ${ msg }`);
});
const { code, map } = CssTools.stringifyCss(mergedCssAst, {
sourcemap: true,
inputSourcemaps: false,
});
if (!code) {
return {
code: '',
};
}
const mapFilenameToFile = files.reduce((obj, file) => ({
...obj,
[file.getPathInBundle()]: file,
}), {});
map.sourcesContent = map.sources.map((filename) => mapFilenameToFile[filename].getContentsAsString());
// yes, this await is needed
const consumer = await new SourceMapConsumer(map);
const newMap = SourceMapGenerator.fromSourceMap(consumer);
consumer.destroy();
files.filter((file) => file.getSourceMap())
.forEach((file) => {
newMap.applySourceMap(new SourceMapConsumer(file.getSourceMap()), file.getPathInBundle());
});
return {
code,
sourceMap: newMap.toString(),
};
};
const processFilesForBundle = async (files = [], { minifyMode }) => {
if (!files.length) {
return;
}
await loadPostcssConfig();
const filesToMerge = files.filter((file) => !isImportFile(file));
const { code, sourceMap } = await mergeCssFiles(filesToMerge);
if (minifyMode === 'development') {
files[0].addStylesheet({
data: code,
sourceMap,
path: 'merged-stylesheets.css',
});
return;
}
const minifiedFiles = CssTools.minifyCss(code);
minifiedFiles.forEach((data) => {
files[0].addStylesheet({ data });
});
};
Plugin.registerMinifier({ extensions: ['css'] }, () => ({
processFilesForBundle,
}));

@ -0,0 +1,18 @@
Package.describe({
name: 'rocketchat:postcss',
version: '1.0.0',
summary: 'CSS post-processing with PostCSS',
});
Package.registerBuildPlugin({
name: 'postcss',
use: [
'ecmascript',
'minifier-css',
],
sources: ['build.js'],
});
Package.onUse((api) => {
api.use('isobuild:minifier-plugin@1.0.0');
});
Loading…
Cancel
Save