ng-packagr 12.1.2 → 12.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/esbuild/esbuild-executor.d.ts +46 -0
- package/lib/esbuild/esbuild-executor.js +108 -0
- package/lib/esbuild/esbuild-executor.js.map +1 -0
- package/lib/ivy/styles/stylesheet-processor.d.ts +1 -0
- package/lib/ivy/styles/stylesheet-processor.js +13 -16
- package/lib/ivy/styles/stylesheet-processor.js.map +1 -1
- package/lib/styles/stylesheet-processor-worker.js +14 -17
- package/lib/styles/stylesheet-processor-worker.js.map +1 -1
- package/lib/styles/stylesheet-processor.d.ts +2 -0
- package/lib/styles/stylesheet-processor.js +3 -0
- package/lib/styles/stylesheet-processor.js.map +1 -1
- package/package.json +7 -4
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google LLC All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.io/license
|
|
7
|
+
*/
|
|
8
|
+
import type { FormatMessagesOptions, PartialMessage, TransformOptions, TransformResult } from 'esbuild';
|
|
9
|
+
/**
|
|
10
|
+
* Provides the ability to execute esbuild regardless of the current platform's support
|
|
11
|
+
* for using the native variant of esbuild. The native variant will be preferred (assuming
|
|
12
|
+
* the `alwaysUseWasm` constructor option is `false) due to its inherent performance advantages.
|
|
13
|
+
* At first use of esbuild, a supportability test will be automatically performed and the
|
|
14
|
+
* WASM-variant will be used if needed by the platform.
|
|
15
|
+
*/
|
|
16
|
+
export declare class EsbuildExecutor implements Pick<typeof import('esbuild'), 'transform' | 'formatMessages'> {
|
|
17
|
+
private alwaysUseWasm;
|
|
18
|
+
private esbuildTransform;
|
|
19
|
+
private esbuildFormatMessages;
|
|
20
|
+
private initialized;
|
|
21
|
+
/**
|
|
22
|
+
* Constructs an instance of the `EsbuildExecutor` class.
|
|
23
|
+
*
|
|
24
|
+
* @param alwaysUseWasm If true, the WASM-variant will be preferred and no support test will be
|
|
25
|
+
* performed; if false (default), the native variant will be preferred.
|
|
26
|
+
*/
|
|
27
|
+
constructor(alwaysUseWasm?: boolean);
|
|
28
|
+
/**
|
|
29
|
+
* Determines whether the native variant of esbuild can be used on the current platform.
|
|
30
|
+
*
|
|
31
|
+
* @returns True, if the native variant of esbuild is support; False, if the WASM variant is required.
|
|
32
|
+
*/
|
|
33
|
+
static hasNativeSupport(): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Initializes the esbuild transform and format messages functions.
|
|
36
|
+
*
|
|
37
|
+
* @returns A promise that fulfills when esbuild has been loaded and available for use.
|
|
38
|
+
*/
|
|
39
|
+
private ensureEsbuild;
|
|
40
|
+
/**
|
|
41
|
+
* Transitions an executor instance to use the WASM-variant of esbuild.
|
|
42
|
+
*/
|
|
43
|
+
private useWasm;
|
|
44
|
+
transform(input: string, options?: TransformOptions): Promise<TransformResult>;
|
|
45
|
+
formatMessages(messages: PartialMessage[], options: FormatMessagesOptions): Promise<string[]>;
|
|
46
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright Google LLC All Rights Reserved.
|
|
5
|
+
*
|
|
6
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
7
|
+
* found in the LICENSE file at https://angular.io/license
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.EsbuildExecutor = void 0;
|
|
11
|
+
const child_process_1 = require("child_process");
|
|
12
|
+
const path = require("path");
|
|
13
|
+
/**
|
|
14
|
+
* Provides the ability to execute esbuild regardless of the current platform's support
|
|
15
|
+
* for using the native variant of esbuild. The native variant will be preferred (assuming
|
|
16
|
+
* the `alwaysUseWasm` constructor option is `false) due to its inherent performance advantages.
|
|
17
|
+
* At first use of esbuild, a supportability test will be automatically performed and the
|
|
18
|
+
* WASM-variant will be used if needed by the platform.
|
|
19
|
+
*/
|
|
20
|
+
class EsbuildExecutor {
|
|
21
|
+
/**
|
|
22
|
+
* Constructs an instance of the `EsbuildExecutor` class.
|
|
23
|
+
*
|
|
24
|
+
* @param alwaysUseWasm If true, the WASM-variant will be preferred and no support test will be
|
|
25
|
+
* performed; if false (default), the native variant will be preferred.
|
|
26
|
+
*/
|
|
27
|
+
constructor(alwaysUseWasm = false) {
|
|
28
|
+
this.alwaysUseWasm = alwaysUseWasm;
|
|
29
|
+
this.initialized = false;
|
|
30
|
+
this.esbuildTransform = this.esbuildFormatMessages = () => {
|
|
31
|
+
throw new Error('esbuild implementation missing');
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Determines whether the native variant of esbuild can be used on the current platform.
|
|
36
|
+
*
|
|
37
|
+
* @returns True, if the native variant of esbuild is support; False, if the WASM variant is required.
|
|
38
|
+
*/
|
|
39
|
+
static hasNativeSupport() {
|
|
40
|
+
// Try to use native variant to ensure it is functional for the platform.
|
|
41
|
+
// Spawning a separate esbuild check process is used to determine if the native
|
|
42
|
+
// variant is viable. If check fails, the WASM variant is initialized instead.
|
|
43
|
+
// Attempting to call one of the native esbuild functions is not a viable test
|
|
44
|
+
// currently since esbuild spawn errors are currently not propagated through the
|
|
45
|
+
// call stack for the esbuild function. If this limitation is removed in the future
|
|
46
|
+
// then the separate process spawn check can be removed in favor of a direct function
|
|
47
|
+
// call check.
|
|
48
|
+
try {
|
|
49
|
+
const { status, error } = child_process_1.spawnSync(process.execPath, [
|
|
50
|
+
path.join(__dirname, './esbuild-check.js'),
|
|
51
|
+
]);
|
|
52
|
+
return status === 0 && error === undefined;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Initializes the esbuild transform and format messages functions.
|
|
60
|
+
*
|
|
61
|
+
* @returns A promise that fulfills when esbuild has been loaded and available for use.
|
|
62
|
+
*/
|
|
63
|
+
async ensureEsbuild() {
|
|
64
|
+
if (this.initialized) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// If the WASM variant was preferred at class construction or native is not supported, use WASM
|
|
68
|
+
if (this.alwaysUseWasm || !EsbuildExecutor.hasNativeSupport()) {
|
|
69
|
+
await this.useWasm();
|
|
70
|
+
this.initialized = true;
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
// Use the faster native variant if available.
|
|
75
|
+
const { transform, formatMessages } = await Promise.resolve().then(() => require('esbuild'));
|
|
76
|
+
this.esbuildTransform = transform;
|
|
77
|
+
this.esbuildFormatMessages = formatMessages;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// If the native variant is not installed then use the WASM-based variant
|
|
81
|
+
await this.useWasm();
|
|
82
|
+
}
|
|
83
|
+
this.initialized = true;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Transitions an executor instance to use the WASM-variant of esbuild.
|
|
87
|
+
*/
|
|
88
|
+
async useWasm() {
|
|
89
|
+
const { transform, formatMessages } = await Promise.resolve().then(() => require('esbuild-wasm'));
|
|
90
|
+
this.esbuildTransform = transform;
|
|
91
|
+
this.esbuildFormatMessages = formatMessages;
|
|
92
|
+
// The ESBUILD_BINARY_PATH environment variable cannot exist when attempting to use the
|
|
93
|
+
// WASM variant. If it is then the binary located at the specified path will be used instead
|
|
94
|
+
// of the WASM variant.
|
|
95
|
+
delete process.env.ESBUILD_BINARY_PATH;
|
|
96
|
+
this.alwaysUseWasm = true;
|
|
97
|
+
}
|
|
98
|
+
async transform(input, options) {
|
|
99
|
+
await this.ensureEsbuild();
|
|
100
|
+
return this.esbuildTransform(input, options);
|
|
101
|
+
}
|
|
102
|
+
async formatMessages(messages, options) {
|
|
103
|
+
await this.ensureEsbuild();
|
|
104
|
+
return this.esbuildFormatMessages(messages, options);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.EsbuildExecutor = EsbuildExecutor;
|
|
108
|
+
//# sourceMappingURL=esbuild-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"esbuild-executor.js","sourceRoot":"","sources":["../../../src/lib/esbuild/esbuild-executor.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEF,iDAA0C;AAO1C,6BAA6B;AAE7B;;;;;;GAMG;AACH,MAAa,eAAe;IAO1B;;;;;OAKG;IACH,YAAoB,gBAAgB,KAAK;QAArB,kBAAa,GAAb,aAAa,CAAQ;QARjC,gBAAW,GAAG,KAAK,CAAC;QAS1B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,GAAG,GAAG,EAAE;YACxD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,gBAAgB;QACrB,yEAAyE;QACzE,+EAA+E;QAC/E,8EAA8E;QAC9E,8EAA8E;QAC9E,gFAAgF;QAChF,mFAAmF;QACnF,qFAAqF;QACrF,cAAc;QACd,IAAI;YACF,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,yBAAS,CAAC,OAAO,CAAC,QAAQ,EAAE;gBACpD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC;aAC3C,CAAC,CAAC;YAEH,OAAO,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,SAAS,CAAC;SAC5C;QAAC,MAAM;YACN,OAAO,KAAK,CAAC;SACd;IACH,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,aAAa;QACzB,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,OAAO;SACR;QAED,+FAA+F;QAC/F,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,EAAE;YAC7D,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YAExB,OAAO;SACR;QAED,IAAI;YACF,8CAA8C;YAC9C,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,2CAAa,SAAS,EAAC,CAAC;YAE9D,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;YAClC,IAAI,CAAC,qBAAqB,GAAG,cAAc,CAAC;SAC7C;QAAC,MAAM;YACN,yEAAyE;YACzE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;SACtB;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,OAAO;QACnB,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,2CAAa,cAAc,EAAC,CAAC;QACnE,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QAClC,IAAI,CAAC,qBAAqB,GAAG,cAAc,CAAC;QAE5C,uFAAuF;QACvF,4FAA4F;QAC5F,uBAAuB;QACvB,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAEvC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,OAA0B;QACvD,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAE3B,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,QAA0B,EAC1B,OAA8B;QAE9B,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAE3B,OAAO,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;CACF;AA1GD,0CA0GC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n import { spawnSync } from 'child_process';\n import type {\n FormatMessagesOptions,\n PartialMessage,\n TransformOptions,\n TransformResult,\n } from 'esbuild';\n import * as path from 'path';\n \n /**\n * Provides the ability to execute esbuild regardless of the current platform's support\n * for using the native variant of esbuild. The native variant will be preferred (assuming\n * the `alwaysUseWasm` constructor option is `false) due to its inherent performance advantages.\n * At first use of esbuild, a supportability test will be automatically performed and the\n * WASM-variant will be used if needed by the platform.\n */\n export class EsbuildExecutor\n implements Pick<typeof import('esbuild'), 'transform' | 'formatMessages'>\n {\n private esbuildTransform: this['transform'];\n private esbuildFormatMessages: this['formatMessages'];\n private initialized = false;\n \n /**\n * Constructs an instance of the `EsbuildExecutor` class.\n *\n * @param alwaysUseWasm If true, the WASM-variant will be preferred and no support test will be\n * performed; if false (default), the native variant will be preferred.\n */\n constructor(private alwaysUseWasm = false) {\n this.esbuildTransform = this.esbuildFormatMessages = () => {\n throw new Error('esbuild implementation missing');\n };\n }\n \n /**\n * Determines whether the native variant of esbuild can be used on the current platform.\n *\n * @returns True, if the native variant of esbuild is support; False, if the WASM variant is required.\n */\n static hasNativeSupport(): boolean {\n // Try to use native variant to ensure it is functional for the platform.\n // Spawning a separate esbuild check process is used to determine if the native\n // variant is viable. If check fails, the WASM variant is initialized instead.\n // Attempting to call one of the native esbuild functions is not a viable test\n // currently since esbuild spawn errors are currently not propagated through the\n // call stack for the esbuild function. If this limitation is removed in the future\n // then the separate process spawn check can be removed in favor of a direct function\n // call check.\n try {\n const { status, error } = spawnSync(process.execPath, [\n path.join(__dirname, './esbuild-check.js'),\n ]);\n \n return status === 0 && error === undefined;\n } catch {\n return false;\n }\n }\n \n /**\n * Initializes the esbuild transform and format messages functions.\n *\n * @returns A promise that fulfills when esbuild has been loaded and available for use.\n */\n private async ensureEsbuild(): Promise<void> {\n if (this.initialized) {\n return;\n }\n \n // If the WASM variant was preferred at class construction or native is not supported, use WASM\n if (this.alwaysUseWasm || !EsbuildExecutor.hasNativeSupport()) {\n await this.useWasm();\n this.initialized = true;\n \n return;\n }\n \n try {\n // Use the faster native variant if available.\n const { transform, formatMessages } = await import('esbuild');\n \n this.esbuildTransform = transform;\n this.esbuildFormatMessages = formatMessages;\n } catch {\n // If the native variant is not installed then use the WASM-based variant\n await this.useWasm();\n }\n \n this.initialized = true;\n }\n \n /**\n * Transitions an executor instance to use the WASM-variant of esbuild.\n */\n private async useWasm(): Promise<void> {\n const { transform, formatMessages } = await import('esbuild-wasm');\n this.esbuildTransform = transform;\n this.esbuildFormatMessages = formatMessages;\n \n // The ESBUILD_BINARY_PATH environment variable cannot exist when attempting to use the\n // WASM variant. If it is then the binary located at the specified path will be used instead\n // of the WASM variant.\n delete process.env.ESBUILD_BINARY_PATH;\n \n this.alwaysUseWasm = true;\n }\n \n async transform(input: string, options?: TransformOptions): Promise<TransformResult> {\n await this.ensureEsbuild();\n \n return this.esbuildTransform(input, options);\n }\n \n async formatMessages(\n messages: PartialMessage[],\n options: FormatMessagesOptions,\n ): Promise<string[]> {\n await this.ensureEsbuild();\n \n return this.esbuildFormatMessages(messages, options);\n }\n }"]}
|
|
@@ -13,6 +13,7 @@ export declare class StylesheetProcessor {
|
|
|
13
13
|
private readonly styleIncludePaths?;
|
|
14
14
|
private browserslistData;
|
|
15
15
|
private postCssProcessor;
|
|
16
|
+
private esbuild;
|
|
16
17
|
constructor(basePath: string, cssUrl?: CssUrl, styleIncludePaths?: string[]);
|
|
17
18
|
process(filePath: string): Promise<string>;
|
|
18
19
|
private createPostCssPlugins;
|
|
@@ -7,12 +7,12 @@ const os_1 = require("os");
|
|
|
7
7
|
const cacache = require("cacache");
|
|
8
8
|
const postcss_1 = require("postcss");
|
|
9
9
|
const postcssUrl = require("postcss-url");
|
|
10
|
-
const cssnano = require("cssnano");
|
|
11
10
|
const postcssPresetEnv = require("postcss-preset-env");
|
|
12
11
|
const log = require("../../utils/log");
|
|
13
12
|
const fs_1 = require("../../utils/fs");
|
|
14
13
|
const crypto_1 = require("crypto");
|
|
15
14
|
const path_1 = require("path");
|
|
15
|
+
const esbuild_executor_1 = require("../../esbuild/esbuild-executor");
|
|
16
16
|
var CssUrl;
|
|
17
17
|
(function (CssUrl) {
|
|
18
18
|
CssUrl["inline"] = "inline";
|
|
@@ -32,6 +32,7 @@ class StylesheetProcessor {
|
|
|
32
32
|
this.basePath = basePath;
|
|
33
33
|
this.cssUrl = cssUrl;
|
|
34
34
|
this.styleIncludePaths = styleIncludePaths;
|
|
35
|
+
this.esbuild = new esbuild_executor_1.EsbuildExecutor();
|
|
35
36
|
log.debug(`determine browserslist for ${this.basePath}`);
|
|
36
37
|
this.browserslistData = browserslist(undefined, { path: this.basePath });
|
|
37
38
|
this.postCssProcessor = this.createPostCssPlugins();
|
|
@@ -66,13 +67,21 @@ class StylesheetProcessor {
|
|
|
66
67
|
to: filePath.replace(path_1.extname(filePath), '.css'),
|
|
67
68
|
});
|
|
68
69
|
const warnings = result.warnings().map(w => w.toString());
|
|
70
|
+
const { code, warnings: esBuildWarnings } = await this.esbuild.transform(result.css, {
|
|
71
|
+
loader: 'css',
|
|
72
|
+
minify: true,
|
|
73
|
+
sourcefile: filePath,
|
|
74
|
+
});
|
|
75
|
+
if (esBuildWarnings.length > 0) {
|
|
76
|
+
warnings.push(...(await this.esbuild.formatMessages(esBuildWarnings, { kind: 'warning' })));
|
|
77
|
+
}
|
|
69
78
|
// Add to cache
|
|
70
79
|
await cacache.put(cachePath, key, JSON.stringify({
|
|
71
|
-
css:
|
|
80
|
+
css: code,
|
|
72
81
|
warnings,
|
|
73
82
|
}));
|
|
74
83
|
warnings.forEach(msg => log.warn(msg));
|
|
75
|
-
return
|
|
84
|
+
return code;
|
|
76
85
|
}
|
|
77
86
|
createPostCssPlugins() {
|
|
78
87
|
const postCssPlugins = [];
|
|
@@ -83,18 +92,6 @@ class StylesheetProcessor {
|
|
|
83
92
|
browsers: this.browserslistData,
|
|
84
93
|
autoprefixer: true,
|
|
85
94
|
stage: 3,
|
|
86
|
-
}), cssnano({
|
|
87
|
-
preset: [
|
|
88
|
-
'default',
|
|
89
|
-
{
|
|
90
|
-
// Disable SVG optimizations, as this can cause optimizations which are not compatible in all browsers.
|
|
91
|
-
svgo: false,
|
|
92
|
-
// Disable `calc` optimizations, due to several issues. #16910, #16875, #17890
|
|
93
|
-
calc: false,
|
|
94
|
-
// Disable CSS rules sorted due to several issues #20693, https://github.com/ionic-team/ionic-framework/issues/23266 and https://github.com/cssnano/cssnano/issues/1054
|
|
95
|
-
cssDeclarationSorter: false,
|
|
96
|
-
},
|
|
97
|
-
],
|
|
98
95
|
}));
|
|
99
96
|
return postcss_1.default(postCssPlugins);
|
|
100
97
|
}
|
|
@@ -158,7 +155,7 @@ class StylesheetProcessor {
|
|
|
158
155
|
}
|
|
159
156
|
exports.StylesheetProcessor = StylesheetProcessor;
|
|
160
157
|
function generateKey(content, browserslistData) {
|
|
161
|
-
return crypto_1.createHash('sha1').update(ngPackagrVersion).update(content).update(browserslistData.join('')).digest('
|
|
158
|
+
return crypto_1.createHash('sha1').update(ngPackagrVersion).update(content).update(browserslistData.join('')).digest('hex');
|
|
162
159
|
}
|
|
163
160
|
async function readCacheEntry(cachePath, key) {
|
|
164
161
|
const entry = await cacache.get.info(cachePath, key);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stylesheet-processor.js","sourceRoot":"","sources":["../../../../src/lib/ivy/styles/stylesheet-processor.ts"],"names":[],"mappings":"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","sourcesContent":["import * as browserslist from 'browserslist';\nimport * as findCacheDirectory from 'find-cache-dir';\nimport { tmpdir } from 'os';\nimport * as cacache from 'cacache';\nimport postcss from 'postcss';\nimport * as postcssUrl from 'postcss-url';\nimport * as cssnano from 'cssnano';\nimport * as postcssPresetEnv from 'postcss-preset-env';\nimport * as log from '../../utils/log';\nimport { readFile } from '../../utils/fs';\nimport { createHash } from 'crypto';\nimport { extname } from 'path';\n\nexport enum CssUrl {\n inline = 'inline',\n none = 'none',\n}\n\nexport interface Result {\n css: string;\n warnings: string[];\n error?: string;\n}\n\nconst cachePath = findCacheDirectory({ name: 'ng-packagr-styles' }) || tmpdir();\nlet ngPackagrVersion: string | undefined;\ntry {\n ngPackagrVersion = require('../../../package.json').version;\n} catch {\n // dev path\n ngPackagrVersion = require('../../../../package.json').version;\n}\n\nexport class StylesheetProcessor {\n private browserslistData: string[];\n private postCssProcessor: ReturnType<typeof postcss>;\n\n constructor(\n private readonly basePath: string,\n private readonly cssUrl?: CssUrl,\n private readonly styleIncludePaths?: string[],\n ) {\n log.debug(`determine browserslist for ${this.basePath}`);\n this.browserslistData = browserslist(undefined, { path: this.basePath });\n this.postCssProcessor = this.createPostCssPlugins();\n }\n\n async process(filePath: string): Promise<string> {\n const content = await readFile(filePath, 'utf8');\n let key: string | undefined;\n\n if (!content.includes('@import') && !content.includes('@use')) {\n // No transitive deps, we can cache more aggressively.\n key = generateKey(content, this.browserslistData);\n const result = await readCacheEntry(cachePath, key);\n if (result) {\n result.warnings.forEach(msg => log.warn(msg));\n return result.css;\n }\n }\n\n // Render pre-processor language (sass, styl, less)\n const renderedCss = await this.renderCss(filePath, content);\n\n // We cannot cache CSS re-rendering phase, because a transitive dependency via (@import) can case different CSS output.\n // Example a change in a mixin or SCSS variable.\n if (!key) {\n key = generateKey(renderedCss, this.browserslistData);\n }\n\n const cachedResult = await readCacheEntry(cachePath, key);\n if (cachedResult) {\n cachedResult.warnings.forEach(msg => log.warn(msg));\n return cachedResult.css;\n }\n\n // Render postcss (autoprefixing and friends)\n const result = await this.postCssProcessor.process(renderedCss, {\n from: filePath,\n to: filePath.replace(extname(filePath), '.css'),\n });\n\n const warnings = result.warnings().map(w => w.toString());\n // Add to cache\n await cacache.put(\n cachePath,\n key,\n JSON.stringify({\n css: result.css,\n warnings,\n }),\n );\n\n warnings.forEach(msg => log.warn(msg));\n return result.css;\n }\n\n private createPostCssPlugins(): ReturnType<typeof postcss> {\n const postCssPlugins = [];\n if (this.cssUrl !== CssUrl.none) {\n postCssPlugins.push(postcssUrl({ url: this.cssUrl }));\n }\n\n postCssPlugins.push(\n postcssPresetEnv({\n browsers: this.browserslistData,\n autoprefixer: true,\n stage: 3,\n }),\n cssnano({\n preset: [\n 'default',\n {\n // Disable SVG optimizations, as this can cause optimizations which are not compatible in all browsers.\n svgo: false,\n // Disable `calc` optimizations, due to several issues. #16910, #16875, #17890\n calc: false,\n // Disable CSS rules sorted due to several issues #20693, https://github.com/ionic-team/ionic-framework/issues/23266 and https://github.com/cssnano/cssnano/issues/1054\n cssDeclarationSorter: false,\n },\n ],\n }),\n );\n\n return postcss(postCssPlugins);\n }\n\n private async renderCss(filePath: string, css: string): Promise<string> {\n const ext = extname(filePath);\n\n switch (ext) {\n case '.sass':\n case '.scss': {\n /*\n * Please be aware of the few differences in behaviour https://github.com/sass/dart-sass/blob/master/README.md#behavioral-differences-from-ruby-sass\n * By default `npm install` will install sass.\n * To use node-sass you need to use:\n * Npm:\n * `npm install node-sass --save-dev`\n * Yarn:\n * `yarn add node-sass --dev`\n */\n let sassCompiler: any | undefined;\n try {\n sassCompiler = require('node-sass'); // Check if node-sass is explicitly included.\n } catch {\n sassCompiler = await import('sass');\n }\n\n return sassCompiler\n .renderSync({\n file: filePath,\n data: css,\n indentedSyntax: '.sass' === ext,\n importer: await import('node-sass-tilde-importer'),\n includePaths: this.styleIncludePaths,\n })\n .css.toString();\n }\n case '.less': {\n const { css: content } = await (\n await import('less')\n ).render(css, {\n filename: filePath,\n javascriptEnabled: true,\n paths: this.styleIncludePaths,\n });\n\n return content;\n }\n case '.styl':\n case '.stylus': {\n const stylus = await import('stylus');\n\n return (\n stylus(css)\n // add paths for resolve\n .set('paths', [this.basePath, '.', ...this.styleIncludePaths, 'node_modules'])\n // add support for resolving plugins from node_modules\n .set('filename', filePath)\n // turn on url resolver in stylus, same as flag --resolve-url\n .set('resolve url', true)\n .define('url', stylus.resolver(undefined))\n .render()\n );\n }\n case '.css':\n default:\n return css;\n }\n }\n}\n\nfunction generateKey(content: string, browserslistData: string[]): string {\n return createHash('sha1').update(ngPackagrVersion).update(content).update(browserslistData.join('')).digest('base64');\n}\n\nasync function readCacheEntry(cachePath: string, key: string): Promise<Result | undefined> {\n const entry = await cacache.get.info(cachePath, key);\n if (entry) {\n return JSON.parse(await readFile(entry.path, 'utf8'));\n }\n\n return undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"stylesheet-processor.js","sourceRoot":"","sources":["../../../../src/lib/ivy/styles/stylesheet-processor.ts"],"names":[],"mappings":"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","sourcesContent":["import * as browserslist from 'browserslist';\nimport * as findCacheDirectory from 'find-cache-dir';\nimport { tmpdir } from 'os';\nimport * as cacache from 'cacache';\nimport postcss from 'postcss';\nimport * as postcssUrl from 'postcss-url';\nimport * as postcssPresetEnv from 'postcss-preset-env';\nimport * as log from '../../utils/log';\nimport { readFile } from '../../utils/fs';\nimport { createHash } from 'crypto';\nimport { extname } from 'path';\nimport { EsbuildExecutor } from '../../esbuild/esbuild-executor';\n\nexport enum CssUrl {\n inline = 'inline',\n none = 'none',\n}\n\nexport interface Result {\n css: string;\n warnings: string[];\n error?: string;\n}\n\nconst cachePath = findCacheDirectory({ name: 'ng-packagr-styles' }) || tmpdir();\nlet ngPackagrVersion: string | undefined;\ntry {\n ngPackagrVersion = require('../../../package.json').version;\n} catch {\n // dev path\n ngPackagrVersion = require('../../../../package.json').version;\n}\nexport class StylesheetProcessor {\n private browserslistData: string[];\n private postCssProcessor: ReturnType<typeof postcss>;\n private esbuild = new EsbuildExecutor();\n\n constructor(\n private readonly basePath: string,\n private readonly cssUrl?: CssUrl,\n private readonly styleIncludePaths?: string[],\n ) {\n log.debug(`determine browserslist for ${this.basePath}`);\n this.browserslistData = browserslist(undefined, { path: this.basePath });\n this.postCssProcessor = this.createPostCssPlugins();\n }\n\n async process(filePath: string): Promise<string> {\n const content = await readFile(filePath, 'utf8');\n let key: string | undefined;\n\n if (!content.includes('@import') && !content.includes('@use')) {\n // No transitive deps, we can cache more aggressively.\n key = generateKey(content, this.browserslistData);\n const result = await readCacheEntry(cachePath, key);\n if (result) {\n result.warnings.forEach(msg => log.warn(msg));\n return result.css;\n }\n }\n\n // Render pre-processor language (sass, styl, less)\n const renderedCss = await this.renderCss(filePath, content);\n\n // We cannot cache CSS re-rendering phase, because a transitive dependency via (@import) can case different CSS output.\n // Example a change in a mixin or SCSS variable.\n if (!key) {\n key = generateKey(renderedCss, this.browserslistData);\n }\n\n const cachedResult = await readCacheEntry(cachePath, key);\n if (cachedResult) {\n cachedResult.warnings.forEach(msg => log.warn(msg));\n return cachedResult.css;\n }\n\n // Render postcss (autoprefixing and friends)\n const result = await this.postCssProcessor.process(renderedCss, {\n from: filePath,\n to: filePath.replace(extname(filePath), '.css'),\n });\n\n const warnings = result.warnings().map(w => w.toString());\n const { code, warnings: esBuildWarnings } = await this.esbuild.transform(result.css, {\n loader: 'css',\n minify: true,\n sourcefile: filePath,\n });\n\n if (esBuildWarnings.length > 0) {\n warnings.push(...(await this.esbuild.formatMessages(esBuildWarnings, { kind: 'warning' })));\n }\n\n // Add to cache\n await cacache.put(\n cachePath,\n key,\n JSON.stringify({\n css: code,\n warnings,\n }),\n );\n\n warnings.forEach(msg => log.warn(msg));\n\n return code;\n }\n\n private createPostCssPlugins(): ReturnType<typeof postcss> {\n const postCssPlugins = [];\n if (this.cssUrl !== CssUrl.none) {\n postCssPlugins.push(postcssUrl({ url: this.cssUrl }));\n }\n\n postCssPlugins.push(\n postcssPresetEnv({\n browsers: this.browserslistData,\n autoprefixer: true,\n stage: 3,\n }),\n );\n\n return postcss(postCssPlugins);\n }\n\n private async renderCss(filePath: string, css: string): Promise<string> {\n const ext = extname(filePath);\n\n switch (ext) {\n case '.sass':\n case '.scss': {\n /*\n * Please be aware of the few differences in behaviour https://github.com/sass/dart-sass/blob/master/README.md#behavioral-differences-from-ruby-sass\n * By default `npm install` will install sass.\n * To use node-sass you need to use:\n * Npm:\n * `npm install node-sass --save-dev`\n * Yarn:\n * `yarn add node-sass --dev`\n */\n let sassCompiler: any | undefined;\n try {\n sassCompiler = require('node-sass'); // Check if node-sass is explicitly included.\n } catch {\n sassCompiler = await import('sass');\n }\n\n return sassCompiler\n .renderSync({\n file: filePath,\n data: css,\n indentedSyntax: '.sass' === ext,\n importer: await import('node-sass-tilde-importer'),\n includePaths: this.styleIncludePaths,\n })\n .css.toString();\n }\n case '.less': {\n const { css: content } = await (\n await import('less')\n ).render(css, {\n filename: filePath,\n javascriptEnabled: true,\n paths: this.styleIncludePaths,\n });\n\n return content;\n }\n case '.styl':\n case '.stylus': {\n const stylus = await import('stylus');\n\n return (\n stylus(css)\n // add paths for resolve\n .set('paths', [this.basePath, '.', ...this.styleIncludePaths, 'node_modules'])\n // add support for resolving plugins from node_modules\n .set('filename', filePath)\n // turn on url resolver in stylus, same as flag --resolve-url\n .set('resolve url', true)\n .define('url', stylus.resolver(undefined))\n .render()\n );\n }\n case '.css':\n default:\n return css;\n }\n }\n}\n\nfunction generateKey(content: string, browserslistData: string[]): string {\n return createHash('sha1').update(ngPackagrVersion).update(content).update(browserslistData.join('')).digest('hex');\n}\n\nasync function readCacheEntry(cachePath: string, key: string): Promise<Result | undefined> {\n const entry = await cacache.get.info(cachePath, key);\n if (entry) {\n return JSON.parse(await readFile(entry.path, 'utf8'));\n }\n\n return undefined;\n}\n"]}
|
|
@@ -5,13 +5,14 @@ const crypto_1 = require("crypto");
|
|
|
5
5
|
const path = require("path");
|
|
6
6
|
const postcss_1 = require("postcss");
|
|
7
7
|
const postcssUrl = require("postcss-url");
|
|
8
|
-
const cssnano = require("cssnano");
|
|
9
8
|
const worker_threads_1 = require("worker_threads");
|
|
10
9
|
const postcssPresetEnv = require("postcss-preset-env");
|
|
10
|
+
const esbuild_executor_1 = require("../esbuild/esbuild-executor");
|
|
11
11
|
const stylesheet_processor_1 = require("./stylesheet-processor");
|
|
12
12
|
const fs_1 = require("../utils/fs");
|
|
13
13
|
const ngPackagrVersion = require('../../package.json').version;
|
|
14
|
-
async function processCss({ filePath, browserslistData, cssUrl, styleIncludePaths, basePath, cachePath, }) {
|
|
14
|
+
async function processCss({ filePath, browserslistData, cssUrl, styleIncludePaths, basePath, cachePath, alwaysUseWasm, }) {
|
|
15
|
+
const esbuild = new esbuild_executor_1.EsbuildExecutor(alwaysUseWasm);
|
|
15
16
|
const content = await fs_1.readFile(filePath, 'utf8');
|
|
16
17
|
let key;
|
|
17
18
|
if (!content.includes('@import') && !content.includes('@use')) {
|
|
@@ -36,13 +37,21 @@ async function processCss({ filePath, browserslistData, cssUrl, styleIncludePath
|
|
|
36
37
|
// Render postcss (autoprefixing and friends)
|
|
37
38
|
const result = await optimizeCss(filePath, renderedCss, browserslistData, cssUrl);
|
|
38
39
|
const warnings = result.warnings().map(w => w.toString());
|
|
40
|
+
const { code, warnings: esBuildWarnings } = await esbuild.transform(result.css, {
|
|
41
|
+
loader: 'css',
|
|
42
|
+
minify: true,
|
|
43
|
+
sourcefile: filePath,
|
|
44
|
+
});
|
|
45
|
+
if (esBuildWarnings.length > 0) {
|
|
46
|
+
warnings.push(...(await esbuild.formatMessages(esBuildWarnings, { kind: 'warning' })));
|
|
47
|
+
}
|
|
39
48
|
// Add to cache
|
|
40
49
|
await cacache.put(cachePath, key, JSON.stringify({
|
|
41
|
-
css:
|
|
50
|
+
css: code,
|
|
42
51
|
warnings,
|
|
43
52
|
}));
|
|
44
53
|
return {
|
|
45
|
-
css:
|
|
54
|
+
css: code,
|
|
46
55
|
warnings,
|
|
47
56
|
};
|
|
48
57
|
}
|
|
@@ -112,18 +121,6 @@ function optimizeCss(filePath, css, browsers, cssUrl) {
|
|
|
112
121
|
browsers,
|
|
113
122
|
autoprefixer: true,
|
|
114
123
|
stage: 3,
|
|
115
|
-
}), cssnano({
|
|
116
|
-
preset: [
|
|
117
|
-
'default',
|
|
118
|
-
{
|
|
119
|
-
// Disable SVG optimizations, as this can cause optimizations which are not compatible in all browsers.
|
|
120
|
-
svgo: false,
|
|
121
|
-
// Disable `calc` optimizations, due to several issues. #16910, #16875, #17890
|
|
122
|
-
calc: false,
|
|
123
|
-
// Disable CSS rules sorted due to several issues #20693, https://github.com/ionic-team/ionic-framework/issues/23266 and https://github.com/cssnano/cssnano/issues/1054
|
|
124
|
-
cssDeclarationSorter: false,
|
|
125
|
-
},
|
|
126
|
-
],
|
|
127
124
|
}));
|
|
128
125
|
return postcss_1.default(postCssPlugins).process(css, {
|
|
129
126
|
from: filePath,
|
|
@@ -131,7 +128,7 @@ function optimizeCss(filePath, css, browsers, cssUrl) {
|
|
|
131
128
|
});
|
|
132
129
|
}
|
|
133
130
|
function generateKey(content, browserslistData) {
|
|
134
|
-
return crypto_1.createHash('sha1').update(ngPackagrVersion).update(content).update(browserslistData.join('')).digest('
|
|
131
|
+
return crypto_1.createHash('sha1').update(ngPackagrVersion).update(content).update(browserslistData.join('')).digest('hex');
|
|
135
132
|
}
|
|
136
133
|
async function readCacheEntry(cachePath, key) {
|
|
137
134
|
const entry = await cacache.get.info(cachePath, key);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stylesheet-processor-worker.js","sourceRoot":"","sources":["../../../src/lib/styles/stylesheet-processor-worker.ts"],"names":[],"mappings":"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","sourcesContent":["import * as cacache from 'cacache';\nimport { createHash } from 'crypto';\nimport * as path from 'path';\nimport postcss, { LazyResult } from 'postcss';\nimport * as postcssUrl from 'postcss-url';\nimport * as cssnano from 'cssnano';\nimport { parentPort } from 'worker_threads';\nimport * as postcssPresetEnv from 'postcss-preset-env';\n\nimport { CssUrl, WorkerOptions, WorkerResult } from './stylesheet-processor';\nimport { readFile } from '../utils/fs';\n\nconst ngPackagrVersion = require('../../package.json').version;\n\nasync function processCss({\n filePath,\n browserslistData,\n cssUrl,\n styleIncludePaths,\n basePath,\n cachePath,\n}: WorkerOptions): Promise<WorkerResult> {\n const content = await readFile(filePath, 'utf8');\n let key: string | undefined;\n\n if (!content.includes('@import') && !content.includes('@use')) {\n // No transitive deps, we can cache more aggressively.\n key = generateKey(content, browserslistData);\n const result = await readCacheEntry(cachePath, key);\n if (result) {\n return result;\n }\n }\n\n // Render pre-processor language (sass, styl, less)\n const renderedCss = await renderCss(filePath, content, basePath, styleIncludePaths);\n\n // We cannot cache CSS re-rendering phase, because a transitive dependency via (@import) can case different CSS output.\n // Example a change in a mixin or SCSS variable.\n if (!key) {\n key = generateKey(renderedCss, browserslistData);\n\n const cachedResult = await readCacheEntry(cachePath, key);\n if (cachedResult) {\n return cachedResult;\n }\n }\n\n // Render postcss (autoprefixing and friends)\n const result = await optimizeCss(filePath, renderedCss, browserslistData, cssUrl);\n const warnings = result.warnings().map(w => w.toString());\n\n // Add to cache\n await cacache.put(\n cachePath,\n key,\n JSON.stringify({\n css: result.css,\n warnings,\n }),\n );\n\n return {\n css: result.css,\n warnings,\n };\n}\n\nasync function renderCss(\n filePath: string,\n css: string,\n basePath: string,\n styleIncludePaths?: string[],\n): Promise<string> {\n const ext = path.extname(filePath);\n\n switch (ext) {\n case '.sass':\n case '.scss': {\n /*\n * Please be aware of the few differences in behaviour https://github.com/sass/dart-sass/blob/master/README.md#behavioral-differences-from-ruby-sass\n * By default `npm install` will install sass.\n * To use node-sass you need to use:\n * Npm:\n * `npm install node-sass --save-dev`\n * Yarn:\n * `yarn add node-sass --dev`\n */\n let sassCompiler: any | undefined;\n try {\n sassCompiler = require('node-sass'); // Check if node-sass is explicitly included.\n } catch {\n sassCompiler = await import('sass');\n }\n\n return sassCompiler\n .renderSync({\n file: filePath,\n data: css,\n indentedSyntax: '.sass' === ext,\n importer: await import('node-sass-tilde-importer'),\n includePaths: styleIncludePaths,\n })\n .css.toString();\n }\n case '.less': {\n const { css: content } = await (\n await import('less')\n ).render(css, {\n filename: filePath,\n javascriptEnabled: true,\n paths: styleIncludePaths,\n });\n\n return content;\n }\n case '.styl':\n case '.stylus': {\n const stylus = await import('stylus');\n\n return (\n stylus(css)\n // add paths for resolve\n .set('paths', [basePath, '.', ...styleIncludePaths, 'node_modules'])\n // add support for resolving plugins from node_modules\n .set('filename', filePath)\n // turn on url resolver in stylus, same as flag --resolve-url\n .set('resolve url', true)\n .define('url', stylus.resolver(undefined))\n .render()\n );\n }\n case '.css':\n default:\n return css;\n }\n}\n\nfunction optimizeCss(filePath: string, css: string, browsers: string[], cssUrl?: CssUrl): LazyResult {\n const postCssPlugins = [];\n\n if (cssUrl !== CssUrl.none) {\n postCssPlugins.push(postcssUrl({ url: cssUrl }));\n }\n\n postCssPlugins.push(\n postcssPresetEnv({\n browsers,\n autoprefixer: true,\n stage: 3,\n }),\n cssnano({\n preset: [\n 'default',\n {\n // Disable SVG optimizations, as this can cause optimizations which are not compatible in all browsers.\n svgo: false,\n // Disable `calc` optimizations, due to several issues. #16910, #16875, #17890\n calc: false,\n // Disable CSS rules sorted due to several issues #20693, https://github.com/ionic-team/ionic-framework/issues/23266 and https://github.com/cssnano/cssnano/issues/1054\n cssDeclarationSorter: false,\n },\n ],\n }),\n );\n\n return postcss(postCssPlugins).process(css, {\n from: filePath,\n to: filePath.replace(path.extname(filePath), '.css'),\n });\n}\n\nfunction generateKey(content: string, browserslistData: string[]): string {\n return createHash('sha1').update(ngPackagrVersion).update(content).update(browserslistData.join('')).digest('base64');\n}\n\nasync function readCacheEntry(cachePath: string, key: string): Promise<WorkerResult | undefined> {\n const entry = await cacache.get.info(cachePath, key);\n if (entry) {\n return JSON.parse(await readFile(entry.path, 'utf8'));\n }\n\n return undefined;\n}\n\nparentPort.on('message', async ({ signal, port, workerOptions }) => {\n try {\n const result = await processCss(workerOptions);\n port.postMessage({ ...result });\n } catch (error) {\n port.postMessage({ error: error.message });\n } finally {\n // Change the value of signal[0] to 1\n Atomics.add(signal, 0, 1);\n // Unlock the main thread\n Atomics.notify(signal, 0);\n port.close();\n }\n});\n"]}
|
|
1
|
+
{"version":3,"file":"stylesheet-processor-worker.js","sourceRoot":"","sources":["../../../src/lib/styles/stylesheet-processor-worker.ts"],"names":[],"mappings":"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","sourcesContent":["import * as cacache from 'cacache';\nimport { createHash } from 'crypto';\nimport * as path from 'path';\nimport postcss, { LazyResult } from 'postcss';\nimport * as postcssUrl from 'postcss-url';\nimport { parentPort } from 'worker_threads';\nimport * as postcssPresetEnv from 'postcss-preset-env';\nimport { EsbuildExecutor } from '../esbuild/esbuild-executor';\n\nimport { CssUrl, WorkerOptions, WorkerResult } from './stylesheet-processor';\nimport { readFile } from '../utils/fs';\n\nconst ngPackagrVersion = require('../../package.json').version;\n\nasync function processCss({\n filePath,\n browserslistData,\n cssUrl,\n styleIncludePaths,\n basePath,\n cachePath,\n alwaysUseWasm,\n}: WorkerOptions): Promise<WorkerResult> {\n const esbuild = new EsbuildExecutor(alwaysUseWasm);\n const content = await readFile(filePath, 'utf8');\n let key: string | undefined;\n\n if (!content.includes('@import') && !content.includes('@use')) {\n // No transitive deps, we can cache more aggressively.\n key = generateKey(content, browserslistData);\n const result = await readCacheEntry(cachePath, key);\n if (result) {\n return result;\n }\n }\n\n // Render pre-processor language (sass, styl, less)\n const renderedCss = await renderCss(filePath, content, basePath, styleIncludePaths);\n\n // We cannot cache CSS re-rendering phase, because a transitive dependency via (@import) can case different CSS output.\n // Example a change in a mixin or SCSS variable.\n if (!key) {\n key = generateKey(renderedCss, browserslistData);\n\n const cachedResult = await readCacheEntry(cachePath, key);\n if (cachedResult) {\n return cachedResult;\n }\n }\n\n // Render postcss (autoprefixing and friends)\n const result = await optimizeCss(filePath, renderedCss, browserslistData, cssUrl);\n const warnings = result.warnings().map(w => w.toString());\n\n const { code, warnings: esBuildWarnings } = await esbuild.transform(result.css, {\n loader: 'css',\n minify: true,\n sourcefile: filePath,\n });\n\n if (esBuildWarnings.length > 0) {\n warnings.push(...(await esbuild.formatMessages(esBuildWarnings, { kind: 'warning' })));\n }\n\n // Add to cache\n await cacache.put(\n cachePath,\n key,\n JSON.stringify({\n css: code,\n warnings,\n }),\n );\n\n return {\n css: code,\n warnings,\n };\n}\n\nasync function renderCss(\n filePath: string,\n css: string,\n basePath: string,\n styleIncludePaths?: string[],\n): Promise<string> {\n const ext = path.extname(filePath);\n\n switch (ext) {\n case '.sass':\n case '.scss': {\n /*\n * Please be aware of the few differences in behaviour https://github.com/sass/dart-sass/blob/master/README.md#behavioral-differences-from-ruby-sass\n * By default `npm install` will install sass.\n * To use node-sass you need to use:\n * Npm:\n * `npm install node-sass --save-dev`\n * Yarn:\n * `yarn add node-sass --dev`\n */\n let sassCompiler: any | undefined;\n try {\n sassCompiler = require('node-sass'); // Check if node-sass is explicitly included.\n } catch {\n sassCompiler = await import('sass');\n }\n\n return sassCompiler\n .renderSync({\n file: filePath,\n data: css,\n indentedSyntax: '.sass' === ext,\n importer: await import('node-sass-tilde-importer'),\n includePaths: styleIncludePaths,\n })\n .css.toString();\n }\n case '.less': {\n const { css: content } = await (\n await import('less')\n ).render(css, {\n filename: filePath,\n javascriptEnabled: true,\n paths: styleIncludePaths,\n });\n\n return content;\n }\n case '.styl':\n case '.stylus': {\n const stylus = await import('stylus');\n\n return (\n stylus(css)\n // add paths for resolve\n .set('paths', [basePath, '.', ...styleIncludePaths, 'node_modules'])\n // add support for resolving plugins from node_modules\n .set('filename', filePath)\n // turn on url resolver in stylus, same as flag --resolve-url\n .set('resolve url', true)\n .define('url', stylus.resolver(undefined))\n .render()\n );\n }\n case '.css':\n default:\n return css;\n }\n}\n\nfunction optimizeCss(filePath: string, css: string, browsers: string[], cssUrl?: CssUrl): LazyResult {\n const postCssPlugins = [];\n\n if (cssUrl !== CssUrl.none) {\n postCssPlugins.push(postcssUrl({ url: cssUrl }));\n }\n\n postCssPlugins.push(\n postcssPresetEnv({\n browsers,\n autoprefixer: true,\n stage: 3,\n }),\n );\n\n return postcss(postCssPlugins).process(css, {\n from: filePath,\n to: filePath.replace(path.extname(filePath), '.css'),\n });\n}\n\nfunction generateKey(content: string, browserslistData: string[]): string {\n return createHash('sha1').update(ngPackagrVersion).update(content).update(browserslistData.join('')).digest('hex');\n}\n\nasync function readCacheEntry(cachePath: string, key: string): Promise<WorkerResult | undefined> {\n const entry = await cacache.get.info(cachePath, key);\n if (entry) {\n return JSON.parse(await readFile(entry.path, 'utf8'));\n }\n\n return undefined;\n}\n\nparentPort.on('message', async ({ signal, port, workerOptions }) => {\n try {\n const result = await processCss(workerOptions);\n port.postMessage({ ...result });\n } catch (error) {\n port.postMessage({ error: error.message });\n } finally {\n // Change the value of signal[0] to 1\n Atomics.add(signal, 0, 1);\n // Unlock the main thread\n Atomics.notify(signal, 0);\n port.close();\n }\n});\n"]}
|
|
@@ -9,6 +9,7 @@ export interface WorkerOptions {
|
|
|
9
9
|
cssUrl?: CssUrl;
|
|
10
10
|
styleIncludePaths?: string[];
|
|
11
11
|
cachePath: string;
|
|
12
|
+
alwaysUseWasm: boolean;
|
|
12
13
|
}
|
|
13
14
|
export interface WorkerResult {
|
|
14
15
|
css: string;
|
|
@@ -22,6 +23,7 @@ export declare class StylesheetProcessor {
|
|
|
22
23
|
private browserslistData;
|
|
23
24
|
private worker;
|
|
24
25
|
private readonly cachePath;
|
|
26
|
+
private alwaysUseWasm;
|
|
25
27
|
constructor(basePath: string, cssUrl?: CssUrl, styleIncludePaths?: string[]);
|
|
26
28
|
process(filePath: string): any;
|
|
27
29
|
}
|
|
@@ -7,6 +7,7 @@ const findCacheDirectory = require("find-cache-dir");
|
|
|
7
7
|
const os_1 = require("os");
|
|
8
8
|
const worker_threads_1 = require("worker_threads");
|
|
9
9
|
const log = require("../utils/log");
|
|
10
|
+
const esbuild_executor_1 = require("../esbuild/esbuild-executor");
|
|
10
11
|
var CssUrl;
|
|
11
12
|
(function (CssUrl) {
|
|
12
13
|
CssUrl["inline"] = "inline";
|
|
@@ -17,6 +18,7 @@ class StylesheetProcessor {
|
|
|
17
18
|
this.basePath = basePath;
|
|
18
19
|
this.cssUrl = cssUrl;
|
|
19
20
|
this.styleIncludePaths = styleIncludePaths;
|
|
21
|
+
this.alwaysUseWasm = !esbuild_executor_1.EsbuildExecutor.hasNativeSupport();
|
|
20
22
|
this.cachePath = findCacheDirectory({ name: 'ng-packagr-styles' }) || os_1.tmpdir();
|
|
21
23
|
}
|
|
22
24
|
process(filePath) {
|
|
@@ -34,6 +36,7 @@ class StylesheetProcessor {
|
|
|
34
36
|
styleIncludePaths: this.styleIncludePaths,
|
|
35
37
|
browserslistData: this.browserslistData,
|
|
36
38
|
cachePath: this.cachePath,
|
|
39
|
+
alwaysUseWasm: this.alwaysUseWasm,
|
|
37
40
|
};
|
|
38
41
|
const ioChannel = new worker_threads_1.MessageChannel();
|
|
39
42
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stylesheet-processor.js","sourceRoot":"","sources":["../../../src/lib/styles/stylesheet-processor.ts"],"names":[],"mappings":";;;AAAA,6CAA6C;AAC7C,+BAA4B;AAC5B,qDAAqD;AACrD,2BAA4B;AAC5B,mDAA8E;AAE9E,oCAAoC;
|
|
1
|
+
{"version":3,"file":"stylesheet-processor.js","sourceRoot":"","sources":["../../../src/lib/styles/stylesheet-processor.ts"],"names":[],"mappings":";;;AAAA,6CAA6C;AAC7C,+BAA4B;AAC5B,qDAAqD;AACrD,2BAA4B;AAC5B,mDAA8E;AAE9E,oCAAoC;AACpC,kEAA8D;AAE9D,IAAY,MAGX;AAHD,WAAY,MAAM;IAChB,2BAAiB,CAAA;IACjB,uBAAa,CAAA;AACf,CAAC,EAHW,MAAM,GAAN,cAAM,KAAN,cAAM,QAGjB;AAiBD,MAAa,mBAAmB;IAM9B,YACmB,QAAgB,EAChB,MAAe,EACf,iBAA4B;QAF5B,aAAQ,GAAR,QAAQ,CAAQ;QAChB,WAAM,GAAN,MAAM,CAAS;QACf,sBAAiB,GAAjB,iBAAiB,CAAW;QALvC,kBAAa,GAAG,CAAC,kCAAe,CAAC,gBAAgB,EAAE,CAAC;QAO1D,IAAI,CAAC,SAAS,GAAG,kBAAkB,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,IAAI,WAAM,EAAE,CAAC;IACjF,CAAC;IAED,OAAO,CAAC,QAAgB;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,IAAI,CAAC,MAAM,GAAG,IAAI,uBAAM,CAAC,WAAI,CAAC,SAAS,EAAE,kCAAkC,CAAC,CAAC,CAAC;SAC/E;QAED,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC1B,GAAG,CAAC,KAAK,CAAC,8BAA8B,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;SAC1E;QAED,MAAM,aAAa,GAAkB;YACnC,QAAQ;YACR,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,+BAAc,EAAE,CAAC;QAEvC,IAAI;YACF,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YAE7F,6BAA6B;YAC7B,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAE3B,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,qCAAoB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;YAC/E,IAAI,KAAK,EAAE;gBACT,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;aACxB;YAED,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACvC,OAAO,GAAG,CAAC;SACZ;gBAAS;YACR,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;SACrB;IACH,CAAC;CACF;AAxDD,kDAwDC","sourcesContent":["import * as browserslist from 'browserslist';\nimport { join } from 'path';\nimport * as findCacheDirectory from 'find-cache-dir';\nimport { tmpdir } from 'os';\nimport { MessageChannel, receiveMessageOnPort, Worker } from 'worker_threads';\n\nimport * as log from '../utils/log';\nimport { EsbuildExecutor } from '../esbuild/esbuild-executor';\n\nexport enum CssUrl {\n inline = 'inline',\n none = 'none',\n}\nexport interface WorkerOptions {\n filePath: string;\n basePath: string;\n browserslistData: string[];\n cssUrl?: CssUrl;\n styleIncludePaths?: string[];\n cachePath: string;\n alwaysUseWasm: boolean;\n}\n\nexport interface WorkerResult {\n css: string;\n warnings: string[];\n error?: string;\n}\n\nexport class StylesheetProcessor {\n private browserslistData: string[] | undefined;\n private worker: Worker | undefined;\n private readonly cachePath: string;\n private alwaysUseWasm = !EsbuildExecutor.hasNativeSupport();\n\n constructor(\n private readonly basePath: string,\n private readonly cssUrl?: CssUrl,\n private readonly styleIncludePaths?: string[],\n ) {\n this.cachePath = findCacheDirectory({ name: 'ng-packagr-styles' }) || tmpdir();\n }\n\n process(filePath: string) {\n if (!this.worker) {\n this.worker = new Worker(join(__dirname, './stylesheet-processor-worker.js'));\n }\n\n if (!this.browserslistData) {\n log.debug(`determine browserslist for ${this.basePath}`);\n this.browserslistData = browserslist(undefined, { path: this.basePath });\n }\n\n const workerOptions: WorkerOptions = {\n filePath,\n basePath: this.basePath,\n cssUrl: this.cssUrl,\n styleIncludePaths: this.styleIncludePaths,\n browserslistData: this.browserslistData,\n cachePath: this.cachePath,\n alwaysUseWasm: this.alwaysUseWasm,\n };\n\n const ioChannel = new MessageChannel();\n\n try {\n const signal = new Int32Array(new SharedArrayBuffer(4));\n this.worker.postMessage({ signal, port: ioChannel.port1, workerOptions }, [ioChannel.port1]);\n\n // Sleep until signal[0] is 0\n Atomics.wait(signal, 0, 0);\n\n const { css, warnings, error } = receiveMessageOnPort(ioChannel.port2).message;\n if (error) {\n throw new Error(error);\n }\n\n warnings.forEach(msg => log.warn(msg));\n return css;\n } finally {\n ioChannel.port1.close();\n ioChannel.port2.close();\n this.worker.unref();\n }\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ng-packagr",
|
|
3
|
-
"version": "12.
|
|
3
|
+
"version": "12.2.2",
|
|
4
4
|
"description": "Compile and package Angular libraries in Angular Package Format (APF)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"apf",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"main": "./public_api.js",
|
|
30
30
|
"typings": "./public_api.d.ts",
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@rollup/plugin-commonjs": "^
|
|
32
|
+
"@rollup/plugin-commonjs": "^20.0.0",
|
|
33
33
|
"@rollup/plugin-json": "^4.1.0",
|
|
34
34
|
"@rollup/plugin-node-resolve": "^13.0.0",
|
|
35
35
|
"ajv": "^8.0.0",
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
"cacache": "^15.0.6",
|
|
39
39
|
"chokidar": "^3.5.1",
|
|
40
40
|
"commander": "^8.0.0",
|
|
41
|
-
"cssnano": "^5.0.0",
|
|
42
41
|
"dependency-graph": "^0.11.0",
|
|
42
|
+
"esbuild-wasm": "^0.12.15",
|
|
43
43
|
"find-cache-dir": "^3.3.1",
|
|
44
44
|
"glob": "^7.1.6",
|
|
45
45
|
"injection-js": "^2.4.0",
|
|
@@ -56,8 +56,11 @@
|
|
|
56
56
|
"sass": "^1.32.8",
|
|
57
57
|
"stylus": "^0.54.8"
|
|
58
58
|
},
|
|
59
|
+
"optionalDependencies": {
|
|
60
|
+
"esbuild": "^0.12.15"
|
|
61
|
+
},
|
|
59
62
|
"peerDependencies": {
|
|
60
|
-
"@angular/compiler-cli": "^12.0.0 || ^12.
|
|
63
|
+
"@angular/compiler-cli": "^12.0.0 || ^12.2.0-next.0",
|
|
61
64
|
"tslib": "^2.1.0",
|
|
62
65
|
"typescript": "~4.2.3 || ~4.3.2"
|
|
63
66
|
}
|