ng-packagr 17.1.2 → 17.2.0-rc.0

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/README.md CHANGED
@@ -74,6 +74,7 @@ Create one `package.json` per npm package, run _ng-packagr_ for each!
74
74
  - [Change the Entry File of a Library](docs/entry-file.md)
75
75
  - [Change Configuration Locations](docs/configuration-locations.md)
76
76
  - [Override tsconfig](docs/override-tsconfig.md)
77
+ - [Use PostCSS](docs/postcss-config.md)
77
78
  - [Add Style Include Paths](docs/style-include-paths.md)
78
79
  - [Package Secondary Entrypoints (sub packages)](docs/secondary-entrypoints.md)
79
80
 
@@ -0,0 +1,18 @@
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 { Plugin } from 'esbuild';
9
+ import { CssUrl } from './stylesheet-processor';
10
+ /**
11
+ * Creates an esbuild {@link Plugin} that loads all CSS url token references using the
12
+ * built-in esbuild `file` loader. A plugin is used to allow for all file extensions
13
+ * and types to be supported without needing to manually specify all extensions
14
+ * within the build configuration.
15
+ *
16
+ * @returns An esbuild {@link Plugin} instance.
17
+ */
18
+ export declare function createCssResourcePlugin(url: CssUrl): Plugin;
@@ -0,0 +1,110 @@
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.createCssResourcePlugin = void 0;
11
+ const promises_1 = require("node:fs/promises");
12
+ const node_path_1 = require("node:path");
13
+ const stylesheet_processor_1 = require("./stylesheet-processor");
14
+ const CSS_RESOURCE_NAMESPACE = 'angular:css-resource';
15
+ /**
16
+ * Symbol marker used to indicate CSS resource resolution is being attempted.
17
+ * This is used to prevent an infinite loop within the plugin's resolve hook.
18
+ */
19
+ const CSS_RESOURCE_RESOLUTION = Symbol('CSS_RESOURCE_RESOLUTION');
20
+ /**
21
+ * Creates an esbuild {@link Plugin} that loads all CSS url token references using the
22
+ * built-in esbuild `file` loader. A plugin is used to allow for all file extensions
23
+ * and types to be supported without needing to manually specify all extensions
24
+ * within the build configuration.
25
+ *
26
+ * @returns An esbuild {@link Plugin} instance.
27
+ */
28
+ function createCssResourcePlugin(url) {
29
+ return {
30
+ name: 'angular-css-resource',
31
+ setup(build) {
32
+ build.onResolve({ filter: /.*/ }, async (args) => {
33
+ var _a, _b;
34
+ // Only attempt to resolve url tokens which only exist inside CSS.
35
+ // Also, skip this plugin if already attempting to resolve the url-token.
36
+ if (args.kind !== 'url-token' || ((_a = args.pluginData) === null || _a === void 0 ? void 0 : _a[CSS_RESOURCE_RESOLUTION])) {
37
+ return null;
38
+ }
39
+ // If root-relative, absolute or protocol relative url, mark as external to leave the
40
+ // path/URL in place.
41
+ if (url !== stylesheet_processor_1.CssUrl.inline || /^((?:\w+:)?\/\/|data:|chrome:|#|\/)/.test(args.path)) {
42
+ return {
43
+ path: args.path,
44
+ external: true,
45
+ };
46
+ }
47
+ const { importer, kind, resolveDir, namespace, pluginData = {} } = args;
48
+ pluginData[CSS_RESOURCE_RESOLUTION] = true;
49
+ const result = await build.resolve(args.path, {
50
+ importer,
51
+ kind,
52
+ namespace,
53
+ pluginData,
54
+ resolveDir,
55
+ });
56
+ if (result.errors.length) {
57
+ const error = result.errors[0];
58
+ if (args.path[0] === '~') {
59
+ error.notes = [
60
+ {
61
+ location: null,
62
+ text: 'You can remove the tilde and use a relative path to reference it, which should remove this error.',
63
+ },
64
+ ];
65
+ }
66
+ else if (args.path[0] === '^') {
67
+ error.notes = [
68
+ {
69
+ location: null,
70
+ text: 'You can remove the caret and add the path to the `externalDependencies` build option,' +
71
+ ' which should remove this error.',
72
+ },
73
+ ];
74
+ }
75
+ const extension = importer && (0, node_path_1.extname)(importer);
76
+ if (extension !== '.css') {
77
+ error.notes.push({
78
+ location: null,
79
+ text: 'Preprocessor stylesheets may not show the exact file location of the error.',
80
+ });
81
+ }
82
+ }
83
+ // Return results that are not files since these are most likely specific to another plugin
84
+ // and cannot be loaded by this plugin.
85
+ if (result.namespace !== 'file') {
86
+ return result;
87
+ }
88
+ // All file results are considered CSS resources and will be loaded via the file loader
89
+ return {
90
+ ...result,
91
+ // Use a relative path to prevent fully resolved paths in the metafile (JSON stats file).
92
+ // This is only necessary for custom namespaces. esbuild will handle the file namespace.
93
+ path: (0, node_path_1.relative)((_b = build.initialOptions.absWorkingDir) !== null && _b !== void 0 ? _b : '', result.path),
94
+ namespace: CSS_RESOURCE_NAMESPACE,
95
+ };
96
+ });
97
+ build.onLoad({ filter: /./, namespace: CSS_RESOURCE_NAMESPACE }, async (args) => {
98
+ var _a;
99
+ const resourcePath = (0, node_path_1.join)((_a = build.initialOptions.absWorkingDir) !== null && _a !== void 0 ? _a : '', args.path);
100
+ return {
101
+ contents: await (0, promises_1.readFile)(resourcePath),
102
+ loader: 'dataurl',
103
+ watchFiles: [resourcePath],
104
+ };
105
+ });
106
+ },
107
+ };
108
+ }
109
+ exports.createCssResourcePlugin = createCssResourcePlugin;
110
+ //# sourceMappingURL=css-resource-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css-resource-plugin.js","sourceRoot":"","sources":["../../../src/lib/styles/css-resource-plugin.ts"],"names":[],"mappings":"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","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\nimport type { Plugin, PluginBuild } from 'esbuild';\nimport { readFile } from 'node:fs/promises';\nimport { extname, join, relative } from 'node:path';\nimport { CssUrl } from './stylesheet-processor';\n\nconst CSS_RESOURCE_NAMESPACE = 'angular:css-resource';\n\n/**\n * Symbol marker used to indicate CSS resource resolution is being attempted.\n * This is used to prevent an infinite loop within the plugin's resolve hook.\n */\nconst CSS_RESOURCE_RESOLUTION = Symbol('CSS_RESOURCE_RESOLUTION');\n\n/**\n * Creates an esbuild {@link Plugin} that loads all CSS url token references using the\n * built-in esbuild `file` loader. A plugin is used to allow for all file extensions\n * and types to be supported without needing to manually specify all extensions\n * within the build configuration.\n *\n * @returns An esbuild {@link Plugin} instance.\n */\nexport function createCssResourcePlugin(url: CssUrl): Plugin {\n return {\n name: 'angular-css-resource',\n setup(build: PluginBuild): void {\n build.onResolve({ filter: /.*/ }, async args => {\n // Only attempt to resolve url tokens which only exist inside CSS.\n // Also, skip this plugin if already attempting to resolve the url-token.\n if (args.kind !== 'url-token' || args.pluginData?.[CSS_RESOURCE_RESOLUTION]) {\n return null;\n }\n\n // If root-relative, absolute or protocol relative url, mark as external to leave the\n // path/URL in place.\n if (url !== CssUrl.inline || /^((?:\\w+:)?\\/\\/|data:|chrome:|#|\\/)/.test(args.path)) {\n return {\n path: args.path,\n external: true,\n };\n }\n\n const { importer, kind, resolveDir, namespace, pluginData = {} } = args;\n pluginData[CSS_RESOURCE_RESOLUTION] = true;\n\n const result = await build.resolve(args.path, {\n importer,\n kind,\n namespace,\n pluginData,\n resolveDir,\n });\n\n if (result.errors.length) {\n const error = result.errors[0];\n if (args.path[0] === '~') {\n error.notes = [\n {\n location: null,\n text: 'You can remove the tilde and use a relative path to reference it, which should remove this error.',\n },\n ];\n } else if (args.path[0] === '^') {\n error.notes = [\n {\n location: null,\n text:\n 'You can remove the caret and add the path to the `externalDependencies` build option,' +\n ' which should remove this error.',\n },\n ];\n }\n\n const extension = importer && extname(importer);\n if (extension !== '.css') {\n error.notes.push({\n location: null,\n text: 'Preprocessor stylesheets may not show the exact file location of the error.',\n });\n }\n }\n\n // Return results that are not files since these are most likely specific to another plugin\n // and cannot be loaded by this plugin.\n if (result.namespace !== 'file') {\n return result;\n }\n\n // All file results are considered CSS resources and will be loaded via the file loader\n return {\n ...result,\n // Use a relative path to prevent fully resolved paths in the metafile (JSON stats file).\n // This is only necessary for custom namespaces. esbuild will handle the file namespace.\n path: relative(build.initialOptions.absWorkingDir ?? '', result.path),\n namespace: CSS_RESOURCE_NAMESPACE,\n };\n });\n\n build.onLoad({ filter: /./, namespace: CSS_RESOURCE_NAMESPACE }, async args => {\n const resourcePath = join(build.initialOptions.absWorkingDir ?? '', args.path);\n\n return {\n contents: await readFile(resourcePath),\n loader: 'dataurl',\n watchFiles: [resourcePath],\n };\n });\n },\n };\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export interface PostcssConfiguration {
2
+ plugins: [name: string, options?: object][];
3
+ }
4
+ export declare function loadPostcssConfiguration(projectRoot: string): Promise<PostcssConfiguration | undefined>;
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadPostcssConfiguration = void 0;
4
+ const promises_1 = require("node:fs/promises");
5
+ const node_path_1 = require("node:path");
6
+ const postcssConfigurationFiles = ['postcss.config.json', '.postcssrc.json'];
7
+ async function generateSearchDirectories(roots) {
8
+ return await Promise.all(roots.map(root => (0, promises_1.readdir)(root, { withFileTypes: true }).then(entries => ({
9
+ root,
10
+ files: new Set(entries.filter(entry => entry.isFile()).map(entry => entry.name)),
11
+ }))));
12
+ }
13
+ function findFile(searchDirectories, potentialFiles) {
14
+ for (const { root, files } of searchDirectories) {
15
+ for (const potential of potentialFiles) {
16
+ if (files.has(potential)) {
17
+ return (0, node_path_1.join)(root, potential);
18
+ }
19
+ }
20
+ }
21
+ return undefined;
22
+ }
23
+ async function readPostcssConfiguration(configurationFile) {
24
+ const data = await (0, promises_1.readFile)(configurationFile, 'utf-8');
25
+ const config = JSON.parse(data);
26
+ return config;
27
+ }
28
+ async function loadPostcssConfiguration(projectRoot) {
29
+ // A configuration file can exist in the project or workspace root
30
+ const searchDirectories = await generateSearchDirectories([projectRoot]);
31
+ const configPath = findFile(searchDirectories, postcssConfigurationFiles);
32
+ if (!configPath) {
33
+ return undefined;
34
+ }
35
+ const raw = await readPostcssConfiguration(configPath);
36
+ // If no plugins are defined, consider it equivalent to no configuration
37
+ if (!raw.plugins || typeof raw.plugins !== 'object') {
38
+ return undefined;
39
+ }
40
+ // Normalize plugin array form
41
+ if (Array.isArray(raw.plugins)) {
42
+ if (raw.plugins.length < 1) {
43
+ return undefined;
44
+ }
45
+ const config = { plugins: [] };
46
+ for (const element of raw.plugins) {
47
+ if (typeof element === 'string') {
48
+ config.plugins.push([element]);
49
+ }
50
+ else {
51
+ config.plugins.push(element);
52
+ }
53
+ }
54
+ return config;
55
+ }
56
+ // Normalize plugin object map form
57
+ const entries = Object.entries(raw.plugins);
58
+ if (entries.length < 1) {
59
+ return undefined;
60
+ }
61
+ const config = { plugins: [] };
62
+ for (const [name, options] of entries) {
63
+ if (!options || typeof options !== 'object') {
64
+ continue;
65
+ }
66
+ config.plugins.push([name, options]);
67
+ }
68
+ return config;
69
+ }
70
+ exports.loadPostcssConfiguration = loadPostcssConfiguration;
71
+ //# sourceMappingURL=postcss-configuration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postcss-configuration.js","sourceRoot":"","sources":["../../../src/lib/styles/postcss-configuration.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile, readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nexport interface PostcssConfiguration {\n plugins: [name: string, options?: object][];\n}\n\ninterface RawPostcssConfiguration {\n plugins?: Record<string, object | boolean> | (string | [string, object])[];\n}\n\nconst postcssConfigurationFiles: string[] = ['postcss.config.json', '.postcssrc.json'];\n\ninterface SearchDirectory {\n root: string;\n files: Set<string>;\n}\n\nasync function generateSearchDirectories(roots: string[]): Promise<SearchDirectory[]> {\n return await Promise.all(\n roots.map(root =>\n readdir(root, { withFileTypes: true }).then(entries => ({\n root,\n files: new Set(entries.filter(entry => entry.isFile()).map(entry => entry.name)),\n })),\n ),\n );\n}\n\nfunction findFile(searchDirectories: SearchDirectory[], potentialFiles: string[]): string | undefined {\n for (const { root, files } of searchDirectories) {\n for (const potential of potentialFiles) {\n if (files.has(potential)) {\n return join(root, potential);\n }\n }\n }\n\n return undefined;\n}\n\nasync function readPostcssConfiguration(configurationFile: string): Promise<RawPostcssConfiguration> {\n const data = await readFile(configurationFile, 'utf-8');\n const config = JSON.parse(data) as RawPostcssConfiguration;\n\n return config;\n}\n\nexport async function loadPostcssConfiguration(\n projectRoot: string,\n): Promise<PostcssConfiguration | undefined> {\n // A configuration file can exist in the project or workspace root\n const searchDirectories = await generateSearchDirectories([projectRoot]);\n\n const configPath = findFile(searchDirectories, postcssConfigurationFiles);\n if (!configPath) {\n return undefined;\n }\n\n const raw = await readPostcssConfiguration(configPath);\n\n // If no plugins are defined, consider it equivalent to no configuration\n if (!raw.plugins || typeof raw.plugins !== 'object') {\n return undefined;\n }\n\n // Normalize plugin array form\n if (Array.isArray(raw.plugins)) {\n if (raw.plugins.length < 1) {\n return undefined;\n }\n\n const config: PostcssConfiguration = { plugins: [] };\n for (const element of raw.plugins) {\n if (typeof element === 'string') {\n config.plugins.push([element]);\n } else {\n config.plugins.push(element);\n }\n }\n\n return config;\n }\n\n // Normalize plugin object map form\n const entries = Object.entries(raw.plugins);\n if (entries.length < 1) {\n return undefined;\n }\n\n const config: PostcssConfiguration = { plugins: [] };\n for (const [name, options] of entries) {\n if (!options || typeof options !== 'object') {\n continue;\n }\n\n config.plugins.push([name, options]);\n }\n\n return config;\n}\n"]}
@@ -33,8 +33,8 @@ const postcss_1 = __importDefault(require("postcss"));
33
33
  const esbuild_executor_1 = require("../esbuild/esbuild-executor");
34
34
  const cache_1 = require("../utils/cache");
35
35
  const log = __importStar(require("../utils/log"));
36
- const stylesheet_processor_1 = require("./stylesheet-processor");
37
- const { tailwindConfigPath, projectBasePath, browserslistData, targets, cssUrl, styleIncludePaths } = node_worker_threads_1.workerData;
36
+ const css_resource_plugin_1 = require("./css-resource-plugin");
37
+ const { tailwindConfigPath, projectBasePath, browserslistData, targets, cssUrl, styleIncludePaths, postcssConfiguration, } = node_worker_threads_1.workerData;
38
38
  let cacheDirectory = node_worker_threads_1.workerData.cacheDirectory;
39
39
  let postCssProcessor;
40
40
  let esbuild;
@@ -79,7 +79,7 @@ async function render({ content, filePath }) {
79
79
  }
80
80
  }
81
81
  const warnings = [];
82
- if (hasTailwindKeywords(renderedCss)) {
82
+ if (postCssProcessor && (postcssConfiguration || (tailwindConfigPath && hasTailwindKeywords(renderedCss)))) {
83
83
  const result = await postCssProcessor.process(renderedCss, {
84
84
  from: filePath,
85
85
  to: filePath.replace((0, node_path_1.extname)(filePath), '.css'),
@@ -87,36 +87,29 @@ async function render({ content, filePath }) {
87
87
  warnings.push(...result.warnings().map(w => w.toString()));
88
88
  renderedCss = result.css;
89
89
  }
90
- const loader = cssUrl === stylesheet_processor_1.CssUrl.none ? 'empty' : 'dataurl';
91
- const { outputFiles, warnings: esBuildWarnings } = await esbuild.build({
90
+ const { outputFiles, warnings: esBuildWarnings, errors: esbuildErrors, } = await esbuild.build({
92
91
  stdin: {
93
92
  contents: renderedCss,
94
93
  loader: 'css',
95
94
  resolveDir: (0, node_path_1.dirname)(filePath),
96
95
  },
97
- loader: {
98
- '.svg': loader,
99
- '.jpg': loader,
100
- '.jpeg': loader,
101
- '.png': loader,
102
- '.apng': loader,
103
- '.webp': loader,
104
- '.avif': loader,
105
- '.gif': loader,
106
- '.otf': loader,
107
- '.ttf': loader,
108
- '.woff': loader,
109
- '.woff2': loader,
110
- },
96
+ plugins: [(0, css_resource_plugin_1.createCssResourcePlugin)(cssUrl)],
111
97
  write: false,
112
98
  sourcemap: false,
113
99
  minify: true,
114
100
  bundle: true,
101
+ absWorkingDir: projectBasePath,
115
102
  target: targets,
116
103
  });
117
104
  const code = outputFiles[0].text;
118
105
  if (esBuildWarnings.length > 0) {
119
106
  warnings.push(...(await esbuild.formatMessages(esBuildWarnings, { kind: 'warning' })));
107
+ warnings.forEach(msg => log.warn(msg));
108
+ }
109
+ if (esbuildErrors.length > 0) {
110
+ const errors = await esbuild.formatMessages(esBuildWarnings, { kind: 'error' });
111
+ errors.forEach(msg => log.error(msg));
112
+ throw new Error(`An error has occuried while processing ${filePath}.`);
120
113
  }
121
114
  if (cacheDirectory) {
122
115
  await (0, cache_1.saveCacheEntry)(cacheDirectory, key, JSON.stringify({
@@ -124,7 +117,6 @@ async function render({ content, filePath }) {
124
117
  warnings,
125
118
  }));
126
119
  }
127
- warnings.forEach(msg => log.warn(msg));
128
120
  return code;
129
121
  }
130
122
  async function renderCss(filePath, css) {
@@ -172,16 +164,27 @@ function getTailwindPlugin() {
172
164
  }
173
165
  }
174
166
  }
175
- let usesTailwind = false;
176
167
  async function initialize() {
177
168
  const postCssPlugins = [];
178
- const tailwinds = getTailwindPlugin();
179
- if (tailwinds) {
180
- usesTailwind = true;
181
- postCssPlugins.push(tailwinds);
182
- cacheDirectory = undefined;
169
+ if (postcssConfiguration) {
170
+ for (const [pluginName, pluginOptions] of postcssConfiguration.plugins) {
171
+ const { default: plugin } = await Promise.resolve(`${pluginName}`).then(s => __importStar(require(s)));
172
+ if (typeof plugin !== 'function' || plugin.postcss !== true) {
173
+ throw new Error(`Attempted to load invalid Postcss plugin: "${pluginName}"`);
174
+ }
175
+ postCssPlugins.push(plugin(pluginOptions));
176
+ }
177
+ }
178
+ else {
179
+ const tailwinds = getTailwindPlugin();
180
+ if (tailwinds) {
181
+ postCssPlugins.push(tailwinds);
182
+ cacheDirectory = undefined;
183
+ }
184
+ }
185
+ if (postCssPlugins.length) {
186
+ postCssProcessor = (0, postcss_1.default)(postCssPlugins);
183
187
  }
184
- postCssProcessor = (0, postcss_1.default)(postCssPlugins);
185
188
  esbuild = new esbuild_executor_1.EsbuildExecutor();
186
189
  // Return the render function for use
187
190
  return render;
@@ -191,9 +194,6 @@ async function initialize() {
191
194
  * within a stylesheet.
192
195
  */
193
196
  function hasTailwindKeywords(contents) {
194
- if (!usesTailwind) {
195
- return false;
196
- }
197
197
  // TODO: use better search algorithm for keywords
198
198
  return TAILWIND_KEYWORDS.some(keyword => contents.includes(keyword));
199
199
  }
@@ -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 { dirname, extname, relative } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { workerData } from 'node:worker_threads';\nimport postcss from 'postcss';\nimport { EsbuildExecutor } from '../esbuild/esbuild-executor';\nimport { generateKey, readCacheEntry, saveCacheEntry } from '../utils/cache';\nimport * as log from '../utils/log';\nimport { CssUrl } from './stylesheet-processor';\n\nconst { tailwindConfigPath, projectBasePath, browserslistData, targets, cssUrl, styleIncludePaths } = workerData as {\n tailwindConfigPath: string | undefined;\n browserslistData: string;\n targets: string[];\n projectBasePath: string;\n cssUrl: CssUrl;\n styleIncludePaths: string[];\n cacheDirectory: string | undefined;\n};\n\nlet cacheDirectory = workerData.cacheDirectory;\nlet postCssProcessor: ReturnType<typeof postcss>;\nlet esbuild: EsbuildExecutor;\n\ninterface RenderRequest {\n content: string;\n filePath: string;\n}\n\nconst CACHE_KEY_VALUES = [...browserslistData, ...styleIncludePaths, cssUrl].join(':');\n\n/**\n * An array of keywords that indicate Tailwind CSS processing is required for a stylesheet.\n *\n * Based on https://tailwindcss.com/docs/functions-and-directives\n */\nconst TAILWIND_KEYWORDS = [\n '@tailwind',\n '@layer',\n '@apply',\n '@config',\n 'theme(',\n 'screen(',\n '@screen', // Undocumented in version 3, see: https://github.com/tailwindlabs/tailwindcss/discussions/7516.\n];\n\nasync function render({ content, filePath }: RenderRequest): Promise<string> {\n let key: string | undefined;\n if (cacheDirectory && !content.includes('@import') && !content.includes('@use')) {\n // No transitive deps, we can cache more aggressively.\n key = await generateKey(content, CACHE_KEY_VALUES);\n const result = await readCacheEntry(cacheDirectory, key);\n if (result) {\n result.warnings.forEach(msg => log.warn(msg));\n\n return result.css;\n }\n }\n\n // Render pre-processor language (sass, styl, less)\n let renderedCss = await 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 = await generateKey(renderedCss, CACHE_KEY_VALUES);\n }\n\n if (cacheDirectory) {\n const cachedResult = await readCacheEntry(cacheDirectory, key);\n if (cachedResult) {\n cachedResult.warnings.forEach(msg => log.warn(msg));\n\n return cachedResult.css;\n }\n }\n\n const warnings: string[] = [];\n if (hasTailwindKeywords(renderedCss)) {\n const result = await postCssProcessor.process(renderedCss, {\n from: filePath,\n to: filePath.replace(extname(filePath), '.css'),\n });\n\n warnings.push(...result.warnings().map(w => w.toString()));\n renderedCss = result.css;\n }\n\n const loader = cssUrl === CssUrl.none ? 'empty' : 'dataurl';\n\n const { outputFiles, warnings: esBuildWarnings } = await esbuild.build({\n stdin: {\n contents: renderedCss,\n loader: 'css',\n resolveDir: dirname(filePath),\n },\n loader: {\n '.svg': loader,\n '.jpg': loader,\n '.jpeg': loader,\n '.png': loader,\n '.apng': loader,\n '.webp': loader,\n '.avif': loader,\n '.gif': loader,\n '.otf': loader,\n '.ttf': loader,\n '.woff': loader,\n '.woff2': loader,\n },\n write: false,\n sourcemap: false,\n minify: true,\n bundle: true,\n target: targets,\n });\n\n const code = outputFiles[0].text;\n if (esBuildWarnings.length > 0) {\n warnings.push(...(await esbuild.formatMessages(esBuildWarnings, { kind: 'warning' })));\n }\n\n if (cacheDirectory) {\n await saveCacheEntry(\n cacheDirectory,\n key,\n JSON.stringify({\n css: code,\n warnings,\n }),\n );\n }\n\n warnings.forEach(msg => log.warn(msg));\n\n return code;\n}\n\nasync function renderCss(filePath: string, css: string): Promise<string> {\n const ext = extname(filePath);\n\n switch (ext) {\n case '.sass':\n case '.scss': {\n return (await import('sass')).compileString(css, {\n url: pathToFileURL(filePath),\n syntax: '.sass' === ext ? 'indented' : 'scss',\n loadPaths: styleIncludePaths,\n }).css;\n }\n case '.less': {\n const { css: content } = await (\n await import('less')\n ).default.render(css, {\n filename: filePath,\n javascriptEnabled: true,\n paths: styleIncludePaths,\n });\n\n return content;\n }\n\n case '.css':\n default:\n return css;\n }\n}\n\nfunction getTailwindPlugin() {\n // Attempt to setup Tailwind CSS\n // Only load Tailwind CSS plugin if configuration file was found.\n // This acts as a guard to ensure the project actually wants to use Tailwind CSS.\n // The package may be unknowningly present due to a third-party transitive package dependency.\n if (tailwindConfigPath) {\n let tailwindPackagePath;\n try {\n tailwindPackagePath = require.resolve('tailwindcss', { paths: [projectBasePath] });\n } catch {\n const relativeTailwindConfigPath = relative(projectBasePath, tailwindConfigPath);\n log.warn(\n `Tailwind CSS configuration file found (${relativeTailwindConfigPath})` +\n ` but the 'tailwindcss' package is not installed.` +\n ` To enable Tailwind CSS, please install the 'tailwindcss' package.`,\n );\n }\n\n if (tailwindPackagePath) {\n return require(tailwindPackagePath)({ config: tailwindConfigPath });\n }\n }\n}\n\nlet usesTailwind = false;\nasync function initialize() {\n const postCssPlugins = [];\n const tailwinds = getTailwindPlugin();\n if (tailwinds) {\n usesTailwind = true;\n postCssPlugins.push(tailwinds);\n cacheDirectory = undefined;\n }\n\n postCssProcessor = postcss(postCssPlugins);\n\n esbuild = new EsbuildExecutor();\n\n // Return the render function for use\n return render;\n}\n\n/**\n * Searches the provided contents for keywords that indicate Tailwind is used\n * within a stylesheet.\n */\nfunction hasTailwindKeywords(contents: string): boolean {\n if (!usesTailwind) {\n return false;\n }\n\n // TODO: use better search algorithm for keywords\n return TAILWIND_KEYWORDS.some(keyword => contents.includes(keyword));\n}\n\n/**\n * The default export will be the promise returned by the initialize function.\n * This is awaited by piscina prior to using the Worker.\n */\nexport default initialize();\n"]}
1
+ {"version":3,"file":"stylesheet-processor-worker.js","sourceRoot":"","sources":["../../../src/lib/styles/stylesheet-processor-worker.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAAuD;AACvD,uCAAyC;AACzC,6DAAiD;AACjD,sDAA8B;AAC9B,kEAA8D;AAC9D,0CAA6E;AAC7E,kDAAoC;AACpC,+DAA8D;AAI9D,MAAM,EACJ,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,OAAO,EACP,MAAM,EACN,iBAAiB,EACjB,oBAAoB,GACrB,GAAG,gCASH,CAAC;AAEF,IAAI,cAAc,GAAG,gCAAU,CAAC,cAAc,CAAC;AAC/C,IAAI,gBAAwD,CAAC;AAC7D,IAAI,OAAwB,CAAC;AAO7B,MAAM,gBAAgB,GAAG,CAAC,GAAG,gBAAgB,EAAE,GAAG,iBAAiB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEvF;;;;GAIG;AACH,MAAM,iBAAiB,GAAG;IACxB,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,SAAS,EAAE,gGAAgG;CAC5G,CAAC;AAEF,KAAK,UAAU,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAiB;IACxD,IAAI,GAAuB,CAAC;IAC5B,IAAI,cAAc,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAChF,sDAAsD;QACtD,GAAG,GAAG,MAAM,IAAA,mBAAW,EAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAc,EAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QACzD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAE9C,OAAO,MAAM,CAAC,GAAG,CAAC;QACpB,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,IAAI,WAAW,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAErD,uHAAuH;IACvH,gDAAgD;IAChD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,GAAG,MAAM,IAAA,mBAAW,EAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,YAAY,GAAG,MAAM,IAAA,sBAAc,EAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAC/D,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAEpD,OAAO,YAAY,CAAC,GAAG,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,gBAAgB,IAAI,CAAC,oBAAoB,IAAI,CAAC,kBAAkB,IAAI,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3G,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE;YACzD,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAA,mBAAO,EAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;SAChD,CAAC,CAAC;QAEH,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC3D,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC;IAC3B,CAAC;IAED,MAAM,EACJ,WAAW,EACX,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,aAAa,GACtB,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC;QACtB,KAAK,EAAE;YACL,QAAQ,EAAE,WAAW;YACrB,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,IAAA,mBAAO,EAAC,QAAQ,CAAC;SAC9B;QACD,OAAO,EAAE,CAAC,IAAA,6CAAuB,EAAC,MAAM,CAAC,CAAC;QAC1C,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,IAAI;QACZ,aAAa,EAAE,eAAe;QAC9B,MAAM,EAAE,OAAO;KAChB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjC,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,cAAc,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;QACvF,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAChF,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAEtC,MAAM,IAAI,KAAK,CAAC,0CAA0C,QAAQ,GAAG,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,IAAA,sBAAc,EAClB,cAAc,EACd,GAAG,EACH,IAAI,CAAC,SAAS,CAAC;YACb,GAAG,EAAE,IAAI;YACT,QAAQ;SACT,CAAC,CACH,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,GAAW;IACpD,MAAM,GAAG,GAAG,IAAA,mBAAO,EAAC,QAAQ,CAAC,CAAC;IAE9B,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,OAAO,CAAC,wDAAa,MAAM,GAAC,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE;gBAC/C,GAAG,EAAE,IAAA,wBAAa,EAAC,QAAQ,CAAC;gBAC5B,MAAM,EAAE,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;gBAC7C,SAAS,EAAE,iBAAiB;aAC7B,CAAC,CAAC,GAAG,CAAC;QACT,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,MAAM,CAC7B,wDAAa,MAAM,GAAC,CACrB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;gBACpB,QAAQ,EAAE,QAAQ;gBAClB,iBAAiB,EAAE,IAAI;gBACvB,KAAK,EAAE,iBAAiB;aACzB,CAAC,CAAC;YAEH,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,KAAK,MAAM,CAAC;QACZ;YACE,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB;IACxB,gCAAgC;IAChC,iEAAiE;IACjE,iFAAiF;IACjF,8FAA8F;IAC9F,IAAI,kBAAkB,EAAE,CAAC;QACvB,IAAI,mBAAmB,CAAC;QACxB,IAAI,CAAC;YACH,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACrF,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,0BAA0B,GAAG,IAAA,oBAAQ,EAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;YACjF,GAAG,CAAC,IAAI,CACN,0CAA0C,0BAA0B,GAAG;gBACrE,kDAAkD;gBAClD,oEAAoE,CACvE,CAAC;QACJ,CAAC;QAED,IAAI,mBAAmB,EAAE,CAAC;YACxB,OAAO,OAAO,CAAC,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,MAAM,cAAc,GAAG,EAAE,CAAC;IAC1B,IAAI,oBAAoB,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,IAAI,oBAAoB,CAAC,OAAO,EAAE,CAAC;YACvE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,yBAAa,UAAU,uCAAC,CAAC;YAErD,IAAI,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC5D,MAAM,IAAI,KAAK,CAAC,8CAA8C,UAAU,GAAG,CAAC,CAAC;YAC/E,CAAC;YAED,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;QACtC,IAAI,SAAS,EAAE,CAAC;YACd,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/B,cAAc,GAAG,SAAS,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;QAC1B,gBAAgB,GAAG,IAAA,iBAAO,EAAC,cAAc,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,GAAG,IAAI,kCAAe,EAAE,CAAC;IAEhC,qCAAqC;IACrC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,iDAAiD;IACjD,OAAO,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACvE,CAAC;AAED;;;GAGG;AACH,kBAAe,UAAU,EAAE,CAAC","sourcesContent":["import { dirname, extname, relative } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { workerData } from 'node:worker_threads';\nimport postcss from 'postcss';\nimport { EsbuildExecutor } from '../esbuild/esbuild-executor';\nimport { generateKey, readCacheEntry, saveCacheEntry } from '../utils/cache';\nimport * as log from '../utils/log';\nimport {createCssResourcePlugin} from './css-resource-plugin';\nimport { PostcssConfiguration } from './postcss-configuration';\nimport { CssUrl } from './stylesheet-processor';\n\nconst {\n tailwindConfigPath,\n projectBasePath,\n browserslistData,\n targets,\n cssUrl,\n styleIncludePaths,\n postcssConfiguration,\n} = workerData as {\n tailwindConfigPath: string | undefined;\n postcssConfiguration: PostcssConfiguration | undefined;\n browserslistData: string;\n targets: string[];\n projectBasePath: string;\n cssUrl: CssUrl;\n styleIncludePaths: string[];\n cacheDirectory: string | undefined;\n};\n\nlet cacheDirectory = workerData.cacheDirectory;\nlet postCssProcessor: ReturnType<typeof postcss> | undefined;\nlet esbuild: EsbuildExecutor;\n\ninterface RenderRequest {\n content: string;\n filePath: string;\n}\n\nconst CACHE_KEY_VALUES = [...browserslistData, ...styleIncludePaths, cssUrl].join(':');\n\n/**\n * An array of keywords that indicate Tailwind CSS processing is required for a stylesheet.\n *\n * Based on https://tailwindcss.com/docs/functions-and-directives\n */\nconst TAILWIND_KEYWORDS = [\n '@tailwind',\n '@layer',\n '@apply',\n '@config',\n 'theme(',\n 'screen(',\n '@screen', // Undocumented in version 3, see: https://github.com/tailwindlabs/tailwindcss/discussions/7516.\n];\n\nasync function render({ content, filePath }: RenderRequest): Promise<string> {\n let key: string | undefined;\n if (cacheDirectory && !content.includes('@import') && !content.includes('@use')) {\n // No transitive deps, we can cache more aggressively.\n key = await generateKey(content, CACHE_KEY_VALUES);\n const result = await readCacheEntry(cacheDirectory, key);\n if (result) {\n result.warnings.forEach(msg => log.warn(msg));\n\n return result.css;\n }\n }\n\n // Render pre-processor language (sass, styl, less)\n let renderedCss = await 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 = await generateKey(renderedCss, CACHE_KEY_VALUES);\n }\n\n if (cacheDirectory) {\n const cachedResult = await readCacheEntry(cacheDirectory, key);\n if (cachedResult) {\n cachedResult.warnings.forEach(msg => log.warn(msg));\n\n return cachedResult.css;\n }\n }\n\n const warnings: string[] = [];\n if (postCssProcessor && (postcssConfiguration || (tailwindConfigPath && hasTailwindKeywords(renderedCss)))) {\n const result = await postCssProcessor.process(renderedCss, {\n from: filePath,\n to: filePath.replace(extname(filePath), '.css'),\n });\n\n warnings.push(...result.warnings().map(w => w.toString()));\n renderedCss = result.css;\n }\n\n const {\n outputFiles,\n warnings: esBuildWarnings,\n errors: esbuildErrors,\n } = await esbuild.build({\n stdin: {\n contents: renderedCss,\n loader: 'css',\n resolveDir: dirname(filePath),\n },\n plugins: [createCssResourcePlugin(cssUrl)],\n write: false,\n sourcemap: false,\n minify: true,\n bundle: true,\n absWorkingDir: projectBasePath,\n target: targets,\n });\n\n const code = outputFiles[0].text;\n if (esBuildWarnings.length > 0) {\n warnings.push(...(await esbuild.formatMessages(esBuildWarnings, { kind: 'warning' })));\n warnings.forEach(msg => log.warn(msg));\n }\n\n if (esbuildErrors.length > 0) {\n const errors = await esbuild.formatMessages(esBuildWarnings, { kind: 'error' });\n errors.forEach(msg => log.error(msg));\n\n throw new Error(`An error has occuried while processing ${filePath}.`);\n }\n\n if (cacheDirectory) {\n await saveCacheEntry(\n cacheDirectory,\n key,\n JSON.stringify({\n css: code,\n warnings,\n }),\n );\n }\n\n return code;\n}\n\nasync function renderCss(filePath: string, css: string): Promise<string> {\n const ext = extname(filePath);\n\n switch (ext) {\n case '.sass':\n case '.scss': {\n return (await import('sass')).compileString(css, {\n url: pathToFileURL(filePath),\n syntax: '.sass' === ext ? 'indented' : 'scss',\n loadPaths: styleIncludePaths,\n }).css;\n }\n case '.less': {\n const { css: content } = await (\n await import('less')\n ).default.render(css, {\n filename: filePath,\n javascriptEnabled: true,\n paths: styleIncludePaths,\n });\n\n return content;\n }\n\n case '.css':\n default:\n return css;\n }\n}\n\nfunction getTailwindPlugin() {\n // Attempt to setup Tailwind CSS\n // Only load Tailwind CSS plugin if configuration file was found.\n // This acts as a guard to ensure the project actually wants to use Tailwind CSS.\n // The package may be unknowningly present due to a third-party transitive package dependency.\n if (tailwindConfigPath) {\n let tailwindPackagePath;\n try {\n tailwindPackagePath = require.resolve('tailwindcss', { paths: [projectBasePath] });\n } catch {\n const relativeTailwindConfigPath = relative(projectBasePath, tailwindConfigPath);\n log.warn(\n `Tailwind CSS configuration file found (${relativeTailwindConfigPath})` +\n ` but the 'tailwindcss' package is not installed.` +\n ` To enable Tailwind CSS, please install the 'tailwindcss' package.`,\n );\n }\n\n if (tailwindPackagePath) {\n return require(tailwindPackagePath)({ config: tailwindConfigPath });\n }\n }\n}\n\nasync function initialize() {\n const postCssPlugins = [];\n if (postcssConfiguration) {\n for (const [pluginName, pluginOptions] of postcssConfiguration.plugins) {\n const { default: plugin } = await import(pluginName);\n\n if (typeof plugin !== 'function' || plugin.postcss !== true) {\n throw new Error(`Attempted to load invalid Postcss plugin: \"${pluginName}\"`);\n }\n\n postCssPlugins.push(plugin(pluginOptions));\n }\n } else {\n const tailwinds = getTailwindPlugin();\n if (tailwinds) {\n postCssPlugins.push(tailwinds);\n cacheDirectory = undefined;\n }\n }\n\n if (postCssPlugins.length) {\n postCssProcessor = postcss(postCssPlugins);\n }\n\n esbuild = new EsbuildExecutor();\n\n // Return the render function for use\n return render;\n}\n\n/**\n * Searches the provided contents for keywords that indicate Tailwind is used\n * within a stylesheet.\n */\nfunction hasTailwindKeywords(contents: string): boolean {\n // TODO: use better search algorithm for keywords\n return TAILWIND_KEYWORDS.some(keyword => contents.includes(keyword));\n}\n\n/**\n * The default export will be the promise returned by the initialize function.\n * This is awaited by piscina prior to using the Worker.\n */\nexport default initialize();\n"]}
@@ -9,6 +9,7 @@ const fs_1 = require("fs");
9
9
  const path_1 = require("path");
10
10
  const piscina_1 = __importDefault(require("piscina"));
11
11
  const color_1 = require("../utils/color");
12
+ const postcss_configuration_1 = require("./postcss-configuration");
12
13
  const maxWorkersVariable = process.env['NG_BUILD_MAX_WORKERS'];
13
14
  const maxThreads = typeof maxWorkersVariable === 'string' && maxWorkersVariable !== '' ? +maxWorkersVariable : 4;
14
15
  var CssUrl;
@@ -37,7 +38,7 @@ class StylesheetProcessor {
37
38
  ];
38
39
  }
39
40
  async process({ filePath, content }) {
40
- this.createRenderWorker();
41
+ await this.createRenderWorker();
41
42
  return this.renderWorker.run({ content, filePath });
42
43
  }
43
44
  /** Destory workers in pool. */
@@ -45,7 +46,7 @@ class StylesheetProcessor {
45
46
  var _a;
46
47
  void ((_a = this.renderWorker) === null || _a === void 0 ? void 0 : _a.destroy());
47
48
  }
48
- createRenderWorker() {
49
+ async createRenderWorker() {
49
50
  if (this.renderWorker) {
50
51
  return;
51
52
  }
@@ -69,6 +70,7 @@ class StylesheetProcessor {
69
70
  FORCE_COLOR: '' + color_1.colors.enabled,
70
71
  },
71
72
  workerData: {
73
+ postcssConfiguration: await (0, postcss_configuration_1.loadPostcssConfiguration)(this.projectBasePath),
72
74
  tailwindConfigPath: getTailwindConfigPath(this.projectBasePath),
73
75
  projectBasePath: this.projectBasePath,
74
76
  browserslistData,
@@ -1 +1 @@
1
- {"version":3,"file":"stylesheet-processor.js","sourceRoot":"","sources":["../../../src/lib/styles/stylesheet-processor.ts"],"names":[],"mappings":"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","sourcesContent":["import browserslist from 'browserslist';\nimport { existsSync } from 'fs';\nimport { dirname, join } from 'path';\nimport Piscina from 'piscina';\nimport { colors } from '../utils/color';\n\nconst maxWorkersVariable = process.env['NG_BUILD_MAX_WORKERS'];\nconst maxThreads = typeof maxWorkersVariable === 'string' && maxWorkersVariable !== '' ? +maxWorkersVariable : 4;\n\nexport enum CssUrl {\n inline = 'inline',\n none = 'none',\n}\n\nexport class StylesheetProcessor {\n private renderWorker: Piscina | undefined;\n\n constructor(\n private readonly projectBasePath: string,\n private readonly basePath: string,\n private readonly cssUrl?: CssUrl,\n private readonly includePaths?: string[],\n private readonly cacheDirectory?: string | false,\n ) {\n // By default, browserslist defaults are too inclusive\n // https://github.com/browserslist/browserslist/blob/83764ea81ffaa39111c204b02c371afa44a4ff07/index.js#L516-L522\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 2 Chrome versions',\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\n async process({ filePath, content }: { filePath: string; content: string }): Promise<string> {\n this.createRenderWorker();\n\n return this.renderWorker.run({ content, filePath });\n }\n\n /** Destory workers in pool. */\n destroy(): void {\n void this.renderWorker?.destroy();\n }\n\n private createRenderWorker(): void {\n if (this.renderWorker) {\n return;\n }\n\n const styleIncludePaths = [...this.includePaths];\n let prevDir = null;\n let currentDir = this.basePath;\n\n while (currentDir !== prevDir) {\n const p = join(currentDir, 'node_modules');\n if (existsSync(p)) {\n styleIncludePaths.push(p);\n }\n\n prevDir = currentDir;\n currentDir = dirname(prevDir);\n }\n\n const browserslistData = browserslist(undefined, { path: this.basePath });\n\n this.renderWorker = new Piscina({\n filename: require.resolve('./stylesheet-processor-worker'),\n maxThreads,\n env: {\n ...process.env,\n FORCE_COLOR: '' + colors.enabled,\n },\n workerData: {\n tailwindConfigPath: getTailwindConfigPath(this.projectBasePath),\n projectBasePath: this.projectBasePath,\n browserslistData,\n targets: transformSupportedBrowsersToTargets(browserslistData),\n cacheDirectory: this.cacheDirectory,\n cssUrl: this.cssUrl,\n styleIncludePaths,\n },\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 (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\n/** The list of valid config files can be found https://github.com/tailwindlabs/tailwindcss/blob/ba5454543e74a6d702ce11b410d27672c2ee4b3f/src/util/resolveConfigPath.js#L4-L9*/\nconst tailwindConfigFiles = [\n './tailwind.config.js',\n './tailwind.config.cjs',\n './tailwind.config.mjs',\n './tailwind.config.ts',\n];\n\nfunction getTailwindConfigPath(projectRoot: string): string | undefined {\n // A configuration file can exist in the project or workspace root\n for (const configFile of tailwindConfigFiles) {\n // Irrespective of the name project level configuration should always take precedence.\n const fullPath = join(projectRoot, configFile);\n if (existsSync(fullPath)) {\n return fullPath;\n }\n }\n\n return undefined;\n}\n"]}
1
+ {"version":3,"file":"stylesheet-processor.js","sourceRoot":"","sources":["../../../src/lib/styles/stylesheet-processor.ts"],"names":[],"mappings":"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","sourcesContent":["import browserslist from 'browserslist';\nimport { existsSync } from 'fs';\nimport { dirname, join } from 'path';\nimport Piscina from 'piscina';\nimport { colors } from '../utils/color';\nimport { loadPostcssConfiguration } from './postcss-configuration';\n\nconst maxWorkersVariable = process.env['NG_BUILD_MAX_WORKERS'];\nconst maxThreads = typeof maxWorkersVariable === 'string' && maxWorkersVariable !== '' ? +maxWorkersVariable : 4;\n\nexport enum CssUrl {\n inline = 'inline',\n none = 'none',\n}\n\nexport class StylesheetProcessor {\n private renderWorker: Piscina | undefined;\n\n constructor(\n private readonly projectBasePath: string,\n private readonly basePath: string,\n private readonly cssUrl?: CssUrl,\n private readonly includePaths?: string[],\n private readonly cacheDirectory?: string | false,\n ) {\n // By default, browserslist defaults are too inclusive\n // https://github.com/browserslist/browserslist/blob/83764ea81ffaa39111c204b02c371afa44a4ff07/index.js#L516-L522\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 2 Chrome versions',\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\n async process({ filePath, content }: { filePath: string; content: string }): Promise<string> {\n await this.createRenderWorker();\n\n return this.renderWorker.run({ content, filePath });\n }\n\n /** Destory workers in pool. */\n destroy(): void {\n void this.renderWorker?.destroy();\n }\n\n private async createRenderWorker(): Promise<void> {\n if (this.renderWorker) {\n return;\n }\n\n const styleIncludePaths = [...this.includePaths];\n let prevDir = null;\n let currentDir = this.basePath;\n\n while (currentDir !== prevDir) {\n const p = join(currentDir, 'node_modules');\n if (existsSync(p)) {\n styleIncludePaths.push(p);\n }\n\n prevDir = currentDir;\n currentDir = dirname(prevDir);\n }\n\n const browserslistData = browserslist(undefined, { path: this.basePath });\n\n this.renderWorker = new Piscina({\n filename: require.resolve('./stylesheet-processor-worker'),\n maxThreads,\n env: {\n ...process.env,\n FORCE_COLOR: '' + colors.enabled,\n },\n workerData: {\n postcssConfiguration: await loadPostcssConfiguration(this.projectBasePath),\n tailwindConfigPath: getTailwindConfigPath(this.projectBasePath),\n projectBasePath: this.projectBasePath,\n browserslistData,\n targets: transformSupportedBrowsersToTargets(browserslistData),\n cacheDirectory: this.cacheDirectory,\n cssUrl: this.cssUrl,\n styleIncludePaths,\n },\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 (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\n/** The list of valid config files can be found https://github.com/tailwindlabs/tailwindcss/blob/ba5454543e74a6d702ce11b410d27672c2ee4b3f/src/util/resolveConfigPath.js#L4-L9*/\nconst tailwindConfigFiles = [\n './tailwind.config.js',\n './tailwind.config.cjs',\n './tailwind.config.mjs',\n './tailwind.config.ts',\n];\n\nfunction getTailwindConfigPath(projectRoot: string): string | undefined {\n // A configuration file can exist in the project or workspace root\n for (const configFile of tailwindConfigFiles) {\n // Irrespective of the name project level configuration should always take precedence.\n const fullPath = join(projectRoot, configFile);\n if (existsSync(fullPath)) {\n return fullPath;\n }\n }\n\n return undefined;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ng-packagr",
3
- "version": "17.1.2",
3
+ "version": "17.2.0-rc.0",
4
4
  "description": "Compile and package Angular libraries in Angular Package Format (APF)",
5
5
  "keywords": [
6
6
  "apf",
@@ -40,10 +40,10 @@
40
40
  "browserslist": "^4.22.1",
41
41
  "cacache": "^18.0.0",
42
42
  "chokidar": "^3.5.3",
43
- "commander": "^11.1.0",
43
+ "commander": "^12.0.0",
44
44
  "convert-source-map": "^2.0.0",
45
45
  "dependency-graph": "^1.0.0",
46
- "esbuild-wasm": "^0.19.5",
46
+ "esbuild-wasm": "^0.20.0",
47
47
  "fast-glob": "^3.3.1",
48
48
  "find-cache-dir": "^3.3.2",
49
49
  "injection-js": "^2.4.0",
@@ -56,7 +56,7 @@
56
56
  "sass": "^1.69.5"
57
57
  },
58
58
  "optionalDependencies": {
59
- "esbuild": "^0.19.0",
59
+ "esbuild": "^0.20.0",
60
60
  "rollup": "^4.5.0"
61
61
  },
62
62
  "peerDependencies": {