ng-packagr 12.2.3 → 12.2.7
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/ivy/styles/stylesheet-processor.d.ts +1 -0
- package/lib/ivy/styles/stylesheet-processor.js +42 -0
- package/lib/ivy/styles/stylesheet-processor.js.map +1 -1
- package/lib/styles/stylesheet-processor-worker.js +3 -1
- 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 +41 -0
- package/lib/styles/stylesheet-processor.js.map +1 -1
- package/package.json +3 -3
|
@@ -34,7 +34,20 @@ class StylesheetProcessor {
|
|
|
34
34
|
this.styleIncludePaths = styleIncludePaths;
|
|
35
35
|
this.esbuild = new esbuild_executor_1.EsbuildExecutor();
|
|
36
36
|
log.debug(`determine browserslist for ${this.basePath}`);
|
|
37
|
+
// By default, browserslist defaults are too inclusive
|
|
38
|
+
// https://github.com/browserslist/browserslist/blob/83764ea81ffaa39111c204b02c371afa44a4ff07/index.js#L516-L522
|
|
39
|
+
// We change the default query to browsers that Angular support.
|
|
40
|
+
// https://angular.io/guide/browser-support
|
|
41
|
+
browserslist.defaults = [
|
|
42
|
+
'last 1 Chrome version',
|
|
43
|
+
'last 1 Firefox version',
|
|
44
|
+
'last 2 Edge major versions',
|
|
45
|
+
'last 2 Safari major versions',
|
|
46
|
+
'last 2 iOS major versions',
|
|
47
|
+
'Firefox ESR',
|
|
48
|
+
];
|
|
37
49
|
this.browserslistData = browserslist(undefined, { path: this.basePath });
|
|
50
|
+
this.targets = transformSupportedBrowsersToTargets(this.browserslistData);
|
|
38
51
|
this.postCssProcessor = this.createPostCssPlugins();
|
|
39
52
|
}
|
|
40
53
|
async process(filePath) {
|
|
@@ -70,6 +83,7 @@ class StylesheetProcessor {
|
|
|
70
83
|
const { code, warnings: esBuildWarnings } = await this.esbuild.transform(result.css, {
|
|
71
84
|
loader: 'css',
|
|
72
85
|
minify: true,
|
|
86
|
+
target: this.targets,
|
|
73
87
|
sourcefile: filePath,
|
|
74
88
|
});
|
|
75
89
|
if (esBuildWarnings.length > 0) {
|
|
@@ -131,6 +145,7 @@ class StylesheetProcessor {
|
|
|
131
145
|
filename: filePath,
|
|
132
146
|
javascriptEnabled: true,
|
|
133
147
|
paths: this.styleIncludePaths,
|
|
148
|
+
math: 'always',
|
|
134
149
|
});
|
|
135
150
|
return content;
|
|
136
151
|
}
|
|
@@ -164,4 +179,31 @@ async function readCacheEntry(cachePath, key) {
|
|
|
164
179
|
}
|
|
165
180
|
return undefined;
|
|
166
181
|
}
|
|
182
|
+
function transformSupportedBrowsersToTargets(supportedBrowsers) {
|
|
183
|
+
const transformed = [];
|
|
184
|
+
// https://esbuild.github.io/api/#target
|
|
185
|
+
const esBuildSupportedBrowsers = new Set(['safari', 'firefox', 'edge', 'chrome', 'ios']);
|
|
186
|
+
for (const browser of supportedBrowsers) {
|
|
187
|
+
let [browserName, version] = browser.split(' ');
|
|
188
|
+
// browserslist uses the name `ios_saf` for iOS Safari whereas esbuild uses `ios`
|
|
189
|
+
if (browserName === 'ios_saf') {
|
|
190
|
+
browserName = 'ios';
|
|
191
|
+
}
|
|
192
|
+
// browserslist uses ranges `15.2-15.3` versions but only the lowest is required
|
|
193
|
+
// to perform minimum supported feature checks. esbuild also expects a single version.
|
|
194
|
+
[version] = version.split('-');
|
|
195
|
+
if (browserName === 'ie') {
|
|
196
|
+
transformed.push('edge12');
|
|
197
|
+
}
|
|
198
|
+
else if (esBuildSupportedBrowsers.has(browserName)) {
|
|
199
|
+
if (browserName === 'safari' && version === 'TP') {
|
|
200
|
+
// esbuild only supports numeric versions so `TP` is converted to a high number (999) since
|
|
201
|
+
// a Technology Preview (TP) of Safari is assumed to support all currently known features.
|
|
202
|
+
version = '999';
|
|
203
|
+
}
|
|
204
|
+
transformed.push(browserName + version);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return transformed.length ? transformed : undefined;
|
|
208
|
+
}
|
|
167
209
|
//# sourceMappingURL=stylesheet-processor.js.map
|
|
@@ -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 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"]}
|
|
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 targets: string[];\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\n // By default, browserslist defaults are too inclusive\n // https://github.com/browserslist/browserslist/blob/83764ea81ffaa39111c204b02c371afa44a4ff07/index.js#L516-L522\n\n // We change the default query to browsers that Angular support.\n // https://angular.io/guide/browser-support\n (browserslist.defaults as string[]) = [\n 'last 1 Chrome version',\n 'last 1 Firefox version',\n 'last 2 Edge major versions',\n 'last 2 Safari major versions',\n 'last 2 iOS major versions',\n 'Firefox ESR',\n ];\n\n this.browserslistData = browserslist(undefined, { path: this.basePath });\n this.targets = transformSupportedBrowsersToTargets(this.browserslistData);\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 target: this.targets,\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 math: 'always',\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\nfunction transformSupportedBrowsersToTargets(supportedBrowsers: string[]): string[] {\n const transformed: string[] = [];\n\n // https://esbuild.github.io/api/#target\n const esBuildSupportedBrowsers = new Set(['safari', 'firefox', 'edge', 'chrome', 'ios']);\n\n for (const browser of supportedBrowsers) {\n let [browserName, version] = browser.split(' ');\n\n // browserslist uses the name `ios_saf` for iOS Safari whereas esbuild uses `ios`\n if (browserName === 'ios_saf') {\n browserName = 'ios';\n }\n\n // browserslist uses ranges `15.2-15.3` versions but only the lowest is required\n // to perform minimum supported feature checks. esbuild also expects a single version.\n [version] = version.split('-');\n\n if (browserName === 'ie') {\n transformed.push('edge12');\n } else if (esBuildSupportedBrowsers.has(browserName)) {\n if (browserName === 'safari' && version === 'TP') {\n // esbuild only supports numeric versions so `TP` is converted to a high number (999) since\n // a Technology Preview (TP) of Safari is assumed to support all currently known features.\n version = '999';\n }\n\n transformed.push(browserName + version);\n }\n }\n\n return transformed.length ? transformed : undefined;\n}\n"]}
|
|
@@ -11,7 +11,7 @@ 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, alwaysUseWasm, }) {
|
|
14
|
+
async function processCss({ filePath, browserslistData, cssUrl, styleIncludePaths, basePath, cachePath, targets, alwaysUseWasm, }) {
|
|
15
15
|
const esbuild = new esbuild_executor_1.EsbuildExecutor(alwaysUseWasm);
|
|
16
16
|
const content = await fs_1.readFile(filePath, 'utf8');
|
|
17
17
|
let key;
|
|
@@ -40,6 +40,7 @@ async function processCss({ filePath, browserslistData, cssUrl, styleIncludePath
|
|
|
40
40
|
const { code, warnings: esBuildWarnings } = await esbuild.transform(result.css, {
|
|
41
41
|
loader: 'css',
|
|
42
42
|
minify: true,
|
|
43
|
+
target: targets,
|
|
43
44
|
sourcefile: filePath,
|
|
44
45
|
});
|
|
45
46
|
if (esBuildWarnings.length > 0) {
|
|
@@ -91,6 +92,7 @@ async function renderCss(filePath, css, basePath, styleIncludePaths) {
|
|
|
91
92
|
filename: filePath,
|
|
92
93
|
javascriptEnabled: true,
|
|
93
94
|
paths: styleIncludePaths,
|
|
95
|
+
math: 'always',
|
|
94
96
|
});
|
|
95
97
|
return content;
|
|
96
98
|
}
|
|
@@ -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 { 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"]}
|
|
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 targets,\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 target: targets,\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 math: 'always',\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"]}
|
|
@@ -5,6 +5,7 @@ export declare enum CssUrl {
|
|
|
5
5
|
export interface WorkerOptions {
|
|
6
6
|
filePath: string;
|
|
7
7
|
basePath: string;
|
|
8
|
+
targets: string[];
|
|
8
9
|
browserslistData: string[];
|
|
9
10
|
cssUrl?: CssUrl;
|
|
10
11
|
styleIncludePaths?: string[];
|
|
@@ -23,6 +24,7 @@ export declare class StylesheetProcessor {
|
|
|
23
24
|
private browserslistData;
|
|
24
25
|
private worker;
|
|
25
26
|
private readonly cachePath;
|
|
27
|
+
private targets;
|
|
26
28
|
private alwaysUseWasm;
|
|
27
29
|
constructor(basePath: string, cssUrl?: CssUrl, styleIncludePaths?: string[]);
|
|
28
30
|
process(filePath: string): any;
|
|
@@ -27,7 +27,20 @@ class StylesheetProcessor {
|
|
|
27
27
|
}
|
|
28
28
|
if (!this.browserslistData) {
|
|
29
29
|
log.debug(`determine browserslist for ${this.basePath}`);
|
|
30
|
+
// By default, browserslist defaults are too inclusive
|
|
31
|
+
// https://github.com/browserslist/browserslist/blob/83764ea81ffaa39111c204b02c371afa44a4ff07/index.js#L516-L522
|
|
32
|
+
// We change the default query to browsers that Angular support.
|
|
33
|
+
// https://angular.io/guide/browser-support
|
|
34
|
+
browserslist.defaults = [
|
|
35
|
+
'last 1 Chrome version',
|
|
36
|
+
'last 1 Firefox version',
|
|
37
|
+
'last 2 Edge major versions',
|
|
38
|
+
'last 2 Safari major versions',
|
|
39
|
+
'last 2 iOS major versions',
|
|
40
|
+
'Firefox ESR',
|
|
41
|
+
];
|
|
30
42
|
this.browserslistData = browserslist(undefined, { path: this.basePath });
|
|
43
|
+
this.targets = transformSupportedBrowsersToTargets(this.browserslistData);
|
|
31
44
|
}
|
|
32
45
|
const workerOptions = {
|
|
33
46
|
filePath,
|
|
@@ -36,6 +49,7 @@ class StylesheetProcessor {
|
|
|
36
49
|
styleIncludePaths: this.styleIncludePaths,
|
|
37
50
|
browserslistData: this.browserslistData,
|
|
38
51
|
cachePath: this.cachePath,
|
|
52
|
+
targets: this.targets,
|
|
39
53
|
alwaysUseWasm: this.alwaysUseWasm,
|
|
40
54
|
};
|
|
41
55
|
const ioChannel = new worker_threads_1.MessageChannel();
|
|
@@ -59,4 +73,31 @@ class StylesheetProcessor {
|
|
|
59
73
|
}
|
|
60
74
|
}
|
|
61
75
|
exports.StylesheetProcessor = StylesheetProcessor;
|
|
76
|
+
function transformSupportedBrowsersToTargets(supportedBrowsers) {
|
|
77
|
+
const transformed = [];
|
|
78
|
+
// https://esbuild.github.io/api/#target
|
|
79
|
+
const esBuildSupportedBrowsers = new Set(['safari', 'firefox', 'edge', 'chrome', 'ios']);
|
|
80
|
+
for (const browser of supportedBrowsers) {
|
|
81
|
+
let [browserName, version] = browser.split(' ');
|
|
82
|
+
// browserslist uses the name `ios_saf` for iOS Safari whereas esbuild uses `ios`
|
|
83
|
+
if (browserName === 'ios_saf') {
|
|
84
|
+
browserName = 'ios';
|
|
85
|
+
}
|
|
86
|
+
// browserslist uses ranges `15.2-15.3` versions but only the lowest is required
|
|
87
|
+
// to perform minimum supported feature checks. esbuild also expects a single version.
|
|
88
|
+
[version] = version.split('-');
|
|
89
|
+
if (browserName === 'ie') {
|
|
90
|
+
transformed.push('edge12');
|
|
91
|
+
}
|
|
92
|
+
else if (esBuildSupportedBrowsers.has(browserName)) {
|
|
93
|
+
if (browserName === 'safari' && version === 'TP') {
|
|
94
|
+
// esbuild only supports numeric versions so `TP` is converted to a high number (999) since
|
|
95
|
+
// a Technology Preview (TP) of Safari is assumed to support all currently known features.
|
|
96
|
+
version = '999';
|
|
97
|
+
}
|
|
98
|
+
transformed.push(browserName + version);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return transformed.length ? transformed : undefined;
|
|
102
|
+
}
|
|
62
103
|
//# sourceMappingURL=stylesheet-processor.js.map
|
|
@@ -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;AACpC,kEAA8D;AAE9D,IAAY,MAGX;AAHD,WAAY,MAAM;IAChB,2BAAiB,CAAA;IACjB,uBAAa,CAAA;AACf,CAAC,EAHW,MAAM,GAAN,cAAM,KAAN,cAAM,QAGjB;
|
|
1
|
+
{"version":3,"file":"stylesheet-processor.js","sourceRoot":"","sources":["../../../src/lib/styles/stylesheet-processor.ts"],"names":[],"mappings":"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","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 targets: 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 targets: 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 // By default, browserslist defaults are too inclusive\n // https://github.com/browserslist/browserslist/blob/83764ea81ffaa39111c204b02c371afa44a4ff07/index.js#L516-L522\n\n // We change the default query to browsers that Angular support.\n // https://angular.io/guide/browser-support\n (browserslist.defaults as string[]) = [\n 'last 1 Chrome version',\n 'last 1 Firefox version',\n 'last 2 Edge major versions',\n 'last 2 Safari major versions',\n 'last 2 iOS major versions',\n 'Firefox ESR',\n ];\n\n this.browserslistData = browserslist(undefined, { path: this.basePath });\n this.targets = transformSupportedBrowsersToTargets(this.browserslistData);\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 targets: this.targets,\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\nfunction transformSupportedBrowsersToTargets(supportedBrowsers: string[]): string[] {\n const transformed: string[] = [];\n\n // https://esbuild.github.io/api/#target\n const esBuildSupportedBrowsers = new Set(['safari', 'firefox', 'edge', 'chrome', 'ios']);\n\n for (const browser of supportedBrowsers) {\n let [browserName, version] = browser.split(' ');\n\n // browserslist uses the name `ios_saf` for iOS Safari whereas esbuild uses `ios`\n if (browserName === 'ios_saf') {\n browserName = 'ios';\n }\n\n // browserslist uses ranges `15.2-15.3` versions but only the lowest is required\n // to perform minimum supported feature checks. esbuild also expects a single version.\n [version] = version.split('-');\n\n if (browserName === 'ie') {\n transformed.push('edge12');\n } else if (esBuildSupportedBrowsers.has(browserName)) {\n if (browserName === 'safari' && version === 'TP') {\n // esbuild only supports numeric versions so `TP` is converted to a high number (999) since\n // a Technology Preview (TP) of Safari is assumed to support all currently known features.\n version = '999';\n }\n\n transformed.push(browserName + version);\n }\n }\n\n return transformed.length ? transformed : undefined;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ng-packagr",
|
|
3
|
-
"version": "12.2.
|
|
3
|
+
"version": "12.2.7",
|
|
4
4
|
"description": "Compile and package Angular libraries in Angular Package Format (APF)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"apf",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"chokidar": "^3.5.1",
|
|
40
40
|
"commander": "^8.0.0",
|
|
41
41
|
"dependency-graph": "^0.11.0",
|
|
42
|
-
"esbuild-wasm": "
|
|
42
|
+
"esbuild-wasm": "0.13.8",
|
|
43
43
|
"find-cache-dir": "^3.3.1",
|
|
44
44
|
"glob": "^7.1.6",
|
|
45
45
|
"injection-js": "^2.4.0",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"stylus": "^0.54.8"
|
|
58
58
|
},
|
|
59
59
|
"optionalDependencies": {
|
|
60
|
-
"esbuild": "
|
|
60
|
+
"esbuild": "0.13.8"
|
|
61
61
|
},
|
|
62
62
|
"peerDependencies": {
|
|
63
63
|
"@angular/compiler-cli": "^12.0.0 || ^12.2.0-next.0",
|