Skip to content

Commit 507d533

Browse files
committed
[INTERNAL] introduce clean css
WIP
1 parent baa0f63 commit 507d533

File tree

5 files changed

+79
-40
lines changed

5 files changed

+79
-40
lines changed

lib/processors/cssOptimizer.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
const CleanCSS = require("clean-css");
2+
const log = require("@ui5/logger").getLogger("builder:processors:cssOptimizer");
3+
4+
/**
5+
* Optimizes the supplied resources.
6+
*
7+
* @public
8+
* @alias module:@ui5/builder.processors.cssOptimizer
9+
* @param {Object} parameters Parameters
10+
* @param {module:@ui5/fs.Resource[]} parameters.resources List of resources to be processed
11+
* @returns {Promise<module:@ui5/fs.Resource[]>} Promise resolving with optimized resources
12+
*/
13+
module.exports = function({resources}) {
14+
return Promise.all(resources.map((resource) => {
15+
return resource.getString().then((css) => {
16+
const options = {
17+
compatibility: {
18+
properties: {
19+
colors: false
20+
}
21+
},
22+
returnPromise: true
23+
};
24+
return new CleanCSS(options).minify(css).then((result) => {
25+
if (Array.isArray(result.warnings) && result.warnings.length > 0) {
26+
log.warn(`Warnings occurred: ${result.warnings.join(", ")}`);
27+
}
28+
resource.setString(result.styles);
29+
return resource;
30+
}, (error) => {
31+
throw new Error(`Errors occurred: ${error.join(", ")}`);
32+
});
33+
});
34+
}));
35+
};

lib/tasks/buildThemes.js

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const themeBuilder = require("../processors/themeBuilder");
2+
const cssOptimizer = require("../processors/cssOptimizer");
23
const ReaderCollectionPrioritized = require("@ui5/fs").ReaderCollectionPrioritized;
34
const fsInterface = require("@ui5/fs").fsInterface;
45

@@ -12,9 +13,10 @@ const fsInterface = require("@ui5/fs").fsInterface;
1213
* @param {module:@ui5/fs.AbstractReader} parameters.dependencies Reader or Collection to read dependency files
1314
* @param {Object} parameters.options Options
1415
* @param {string} parameters.options.pattern Pattern to locate the files to be processed
16+
* @param {boolean} [parameters.options.compress=true] Whether or not to optimize the files
1517
* @returns {Promise<undefined>} Promise resolving with <code>undefined</code> once data has been written
1618
*/
17-
module.exports = function({workspace, dependencies, options}) {
19+
module.exports = async function({workspace, dependencies, options}) {
1820
const combo = new ReaderCollectionPrioritized({
1921
name: `theme - prioritize workspace over dependencies: ${options.projectName}`,
2022
readers: [workspace, dependencies]
@@ -27,11 +29,13 @@ module.exports = function({workspace, dependencies, options}) {
2729
promises.push(combo.byGlob(options.librariesPattern));
2830
}
2931

30-
return Promise.all(promises).then(([allResources, availableLibraries]) => {
31-
if (!availableLibraries || availableLibraries.length === 0) {
32-
// Try to build all themes
33-
return allResources;
34-
}
32+
const [allResources, availableLibraries] = await Promise.all(promises);
33+
34+
let resources;
35+
if (!availableLibraries || availableLibraries.length === 0) {
36+
// Try to build all themes
37+
resources = allResources;
38+
} else {
3539
/* Don't try to build themes for libraries that are not available
3640
(maybe replace this with something more aware of which dependencies are optional and therefore
3741
legitimately missing and which not (fault case))
@@ -49,18 +53,21 @@ module.exports = function({workspace, dependencies, options}) {
4953
return false;
5054
};
5155

52-
return allResources.filter(isAvailable);
53-
}).then((resources) => {
54-
return themeBuilder({
55-
resources,
56-
fs: fsInterface(combo),
57-
options: {
58-
compress: true
59-
}
60-
});
61-
}).then((processedResources) => {
62-
return Promise.all(processedResources.map((resource) => {
63-
return workspace.write(resource);
64-
}));
56+
resources = await allResources.filter(isAvailable);
57+
}
58+
const processedResources = await themeBuilder({
59+
resources,
60+
fs: fsInterface(combo)
6561
});
62+
const compress = options.compress !== false;
63+
if (compress) {
64+
const cssResources = processedResources.filter((resource) => {
65+
return resource.getPath().endsWith(".css");
66+
});
67+
await cssOptimizer({resources: cssResources,
68+
fs: fsInterface(combo)});
69+
}
70+
return Promise.all(processedResources.map((resource) => {
71+
return workspace.write(resource);
72+
}));
6673
};

package-lock.json

Lines changed: 13 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
"@ui5/fs": "^1.1.2",
101101
"@ui5/logger": "^1.0.2",
102102
"cheerio": "^0.22.0",
103+
"clean-css": "^4.2.1",
103104
"escape-unicode": "^0.2.0",
104105
"escodegen": "^1.12.0",
105106
"escope": "^3.6.0",

test/lib/tasks/buildThemes.js

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,9 @@ test("integration: simple", (t) => {
2525
padding: 1px 2px 3px 4px;
2626
}`;
2727
const cssExpected =
28-
`.fluffyHammer{color:#123456;padding:1px 2px 3px 4px}
29-
/* Inline theming parameters */
30-
#sap-ui-theme-super\\.duper\\.looper{background-image:url('data:text/plain;utf-8,%7B%22deepSea%22%3A%22%23123456%22%7D')}
31-
`;
28+
`.fluffyHammer{color:#123456;padding:1px 2px 3px 4px}#sap-ui-theme-super\\.duper\\.looper{background-image:url(data:text/plain;utf-8,%7B%22deepSea%22%3A%22%23123456%22%7D)}`;
3229
const cssRtlExpected =
33-
`.fluffyHammer{color:#123456;padding:1px 4px 3px 2px}
34-
/* Inline theming parameters */
35-
#sap-ui-theme-super\\.duper\\.looper{background-image:url('data:text/plain;utf-8,%7B%22deepSea%22%3A%22%23123456%22%7D')}
36-
`;
30+
`.fluffyHammer{color:#123456;padding:1px 4px 3px 2px}#sap-ui-theme-super\\.duper\\.looper{background-image:url(data:text/plain;utf-8,%7B%22deepSea%22%3A%22%23123456%22%7D)}`;
3731
const parametersExpected =
3832
`{"deepSea":"#123456"}`;
3933
const lessPath = "/resources/super/duper/looper/themes/brightlight/library.source.less";
@@ -96,15 +90,9 @@ test("integration: imports", (t) => {
9690
const lessVariablesContent =
9791
"@deepSea: #123456;";
9892
const cssExpected =
99-
`.fluffyHammer{color:#123456;padding:1px 2px 3px 4px}
100-
/* Inline theming parameters */
101-
#sap-ui-theme-super\\.duper\\.looper{background-image:url('data:text/plain;utf-8,%7B%22deepSea%22%3A%22%23123456%22%7D')}
102-
`;
93+
`.fluffyHammer{color:#123456;padding:1px 2px 3px 4px}#sap-ui-theme-super\\.duper\\.looper{background-image:url(data:text/plain;utf-8,%7B%22deepSea%22%3A%22%23123456%22%7D)}`;
10394
const cssRtlExpected =
104-
`.fluffyHammer{color:#123456;padding:1px 4px 3px 2px}
105-
/* Inline theming parameters */
106-
#sap-ui-theme-super\\.duper\\.looper{background-image:url('data:text/plain;utf-8,%7B%22deepSea%22%3A%22%23123456%22%7D')}
107-
`;
95+
`.fluffyHammer{color:#123456;padding:1px 4px 3px 2px}#sap-ui-theme-super\\.duper\\.looper{background-image:url(data:text/plain;utf-8,%7B%22deepSea%22%3A%22%23123456%22%7D)}`;
10896
const parametersExpected =
10997
`{"deepSea":"#123456"}`;
11098
const lessPath = "/resources/super/duper/looper/themes/brightlight/library.source.less";

0 commit comments

Comments
 (0)