ng-packagr 17.1.1 → 17.2.0-next.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.
@@ -75,7 +75,7 @@ const writePackageTransform = (options) => (0, transform_1.transformFromPromise)
75
75
  exports: generatePackageExports(ngEntryPoint, graph),
76
76
  // webpack v4+ specific flag to enable advanced optimizations and code splitting
77
77
  sideEffects: (_a = ngEntryPoint.packageJson.sideEffects) !== null && _a !== void 0 ? _a : false,
78
- }, compilationMode, spinner);
78
+ }, !!options.watch, compilationMode, spinner);
79
79
  }
80
80
  catch (error) {
81
81
  spinner.fail();
@@ -84,6 +84,18 @@ const writePackageTransform = (options) => (0, transform_1.transformFromPromise)
84
84
  spinner.succeed();
85
85
  }
86
86
  else if (ngEntryPoint.isSecondaryEntryPoint) {
87
+ if (options.watch) {
88
+ // Update the watch version of the primary entry point `package.json` file.
89
+ // this is needed because of Webpack's 5 `cachemanagedpaths`
90
+ // https://github.com/ng-packagr/ng-packagr/issues/2069
91
+ const primary = ngPackageNode.data.primary;
92
+ const packageJsonPath = path.join(primary.destinationPath, 'package.json');
93
+ if (await (0, fs_1.exists)(packageJsonPath)) {
94
+ const packageJson = JSON.parse(await (0, fs_1.readFile)(packageJsonPath, { encoding: 'utf8' }));
95
+ packageJson.version = generateWatchVersion();
96
+ await (0, fs_1.writeFile)(path.join(primary.destinationPath, 'package.json'), JSON.stringify(packageJson, undefined, 2));
97
+ }
98
+ }
87
99
  // Write a package.json in each secondary entry-point
88
100
  // This is need for esbuild to secondary entry-points in dist correctly.
89
101
  await (0, fs_1.writeFile)(path.join(ngEntryPoint.destinationPath, 'package.json'), JSON.stringify({ module: relativeUnixFromDestPath(destinationFiles.fesm2022) }, undefined, 2));
@@ -180,11 +192,20 @@ async function copyAssets(graph, entryPointNode, ngPackageNode) {
180
192
  * @param entryPoint An entry point of an Angular package / library
181
193
  * @param additionalProperties Additional properties, e.g. binary artefacts (bundle files), to merge into `package.json`
182
194
  */
183
- async function writePackageJson(entryPoint, pkg, additionalProperties, compilationMode, spinner) {
195
+ async function writePackageJson(entryPoint, pkg, additionalProperties, isWatchMode, compilationMode, spinner) {
184
196
  var _a, _b, _c;
185
197
  log.debug('Writing package.json');
186
198
  // set additional properties
187
199
  const packageJson = { ...entryPoint.packageJson, ...additionalProperties };
200
+ // read tslib version from `@angular/compiler` so that our tslib
201
+ // version at least matches that of angular if we use require('tslib').version
202
+ // it will get what installed and not the minimum version nor if it is a `~` or `^`
203
+ // this is only required for primary
204
+ if (isWatchMode) {
205
+ // Needed because of Webpack's 5 `cachemanagedpaths`
206
+ // https://github.com/angular/angular-cli/issues/20962
207
+ packageJson.version = generateWatchVersion();
208
+ }
188
209
  if (!((_a = packageJson.peerDependencies) === null || _a === void 0 ? void 0 : _a.tslib) && !((_b = packageJson.dependencies) === null || _b === void 0 ? void 0 : _b.tslib)) {
189
210
  const { peerDependencies: angularPeerDependencies = {}, dependencies: angularDependencies = {}, } = require('@angular/compiler/package.json');
190
211
  const tsLibVersion = angularPeerDependencies.tslib || angularDependencies.tslib;
@@ -306,4 +327,10 @@ function generatePackageExports({ destinationPath, packageJson }, graph) {
306
327
  }
307
328
  return exports;
308
329
  }
330
+ /**
331
+ * Generates a new version for the package `package.json` when runing in watch mode.
332
+ */
333
+ function generateWatchVersion() {
334
+ return `0.0.0-watch+${Date.now()}`;
335
+ }
309
336
  //# sourceMappingURL=write-package.transform.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"write-package.transform.js","sourceRoot":"","sources":["../../../../src/lib/ng-package/entry-point/write-package.transform.ts"],"names":[],"mappings":"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","sourcesContent":["import ora from 'ora';\nimport * as path from 'path';\nimport { AssetPattern } from '../../../ng-package.schema';\nimport { BuildGraph } from '../../graph/build-graph';\nimport { Node } from '../../graph/node';\nimport { transformFromPromise } from '../../graph/transform';\nimport { colors } from '../../utils/color';\nimport { copyFile, rmdir, stat, writeFile } from '../../utils/fs';\nimport { globFiles } from '../../utils/glob';\nimport * as log from '../../utils/log';\nimport { ensureUnixPath } from '../../utils/path';\nimport { EntryPointNode, PackageNode, fileUrl, isEntryPoint, isEntryPointInProgress, isPackage } from '../nodes';\nimport { NgPackagrOptions } from '../options.di';\nimport { NgPackage } from '../package';\nimport { NgEntryPoint } from './entry-point';\n\ntype CompilationMode = 'partial' | 'full' | undefined;\n\nexport const writePackageTransform = (options: NgPackagrOptions) =>\n transformFromPromise(async graph => {\n const spinner = ora({\n hideCursor: false,\n discardStdin: false,\n });\n const entryPoint: EntryPointNode = graph.find(isEntryPointInProgress());\n const ngEntryPoint: NgEntryPoint = entryPoint.data.entryPoint;\n const ngPackageNode: PackageNode = graph.find(isPackage);\n const ngPackage = ngPackageNode.data;\n const { destinationFiles } = entryPoint.data;\n\n if (!ngEntryPoint.isSecondaryEntryPoint) {\n spinner.start('Copying assets');\n try {\n await copyAssets(graph, entryPoint, ngPackageNode);\n } catch (error) {\n spinner.fail();\n throw error;\n }\n spinner.succeed();\n }\n\n // 6. WRITE PACKAGE.JSON\n const relativeUnixFromDestPath = (filePath: string) =>\n ensureUnixPath(path.relative(ngEntryPoint.destinationPath, filePath));\n\n if (!ngEntryPoint.isSecondaryEntryPoint) {\n try {\n spinner.start('Writing package manifest');\n if (!options.watch) {\n const primary = ngPackageNode.data.primary;\n await writeFile(\n path.join(primary.destinationPath, '.npmignore'),\n `# Nested package.json's are only needed for development.\\n**/package.json`,\n );\n }\n\n const { compilationMode } = entryPoint.data.tsConfig.options;\n\n await writePackageJson(\n ngEntryPoint,\n ngPackage,\n {\n module: relativeUnixFromDestPath(destinationFiles.fesm2022),\n typings: relativeUnixFromDestPath(destinationFiles.declarations),\n exports: generatePackageExports(ngEntryPoint, graph),\n // webpack v4+ specific flag to enable advanced optimizations and code splitting\n sideEffects: ngEntryPoint.packageJson.sideEffects ?? false,\n },\n compilationMode as CompilationMode,\n spinner,\n );\n } catch (error) {\n spinner.fail();\n throw error;\n }\n spinner.succeed();\n } else if (ngEntryPoint.isSecondaryEntryPoint) {\n // Write a package.json in each secondary entry-point\n // This is need for esbuild to secondary entry-points in dist correctly.\n await writeFile(\n path.join(ngEntryPoint.destinationPath, 'package.json'),\n JSON.stringify({ module: relativeUnixFromDestPath(destinationFiles.fesm2022) }, undefined, 2),\n );\n }\n\n spinner.succeed(`Built ${ngEntryPoint.moduleId}`);\n\n return graph;\n });\n\ntype AssetEntry = Exclude<AssetPattern, string>;\n\nasync function copyAssets(\n graph: BuildGraph,\n entryPointNode: EntryPointNode,\n ngPackageNode: PackageNode,\n): Promise<void> {\n const ngPackage = ngPackageNode.data;\n\n const globsForceIgnored: string[] = ['.gitkeep', '**/.DS_Store', '**/Thumbs.db', `${ngPackage.dest}/**`];\n const defaultAssets: AssetEntry[] = [\n { glob: 'LICENSE', input: '/', output: '/' },\n ...graph.filter(isEntryPoint).map(({ data }) => {\n const subpath = data.entryPoint.destinationFiles.directory || '/';\n\n return {\n glob: 'README.md',\n input: subpath,\n output: subpath,\n };\n }),\n ];\n\n const assets: AssetEntry[] = [];\n\n for (const assetPath of [...ngPackage.assets, ...defaultAssets]) {\n let asset: AssetEntry;\n if (typeof assetPath === 'object') {\n asset = { ...assetPath };\n } else {\n const [isDir, isFile] = await stat(path.join(ngPackage.src, assetPath))\n .then(stats => [stats.isDirectory(), stats.isFile()])\n .catch(() => [false, false]);\n if (isDir) {\n asset = { glob: '**/*', input: assetPath, output: assetPath };\n } else if (isFile) {\n // filenames are their own glob\n asset = {\n glob: path.basename(assetPath),\n input: path.dirname(assetPath),\n output: path.dirname(assetPath),\n };\n } else {\n asset = { glob: assetPath, input: '/', output: '/' };\n }\n }\n\n asset.input = path.join(ngPackage.src, asset.input);\n asset.output = path.join(ngPackage.dest, asset.output);\n\n const isAncestorPath = (target: string, datum: string) => path.relative(datum, target).startsWith('..');\n if (isAncestorPath(asset.input, ngPackage.src)) {\n throw new Error('Cannot read assets from a location outside of the project root.');\n }\n if (isAncestorPath(asset.output, ngPackage.dest)) {\n throw new Error('Cannot write assets to a location outside of the output path.');\n }\n\n assets.push(asset);\n }\n\n for (const asset of assets) {\n const filePaths = await globFiles(asset.glob, {\n cwd: asset.input,\n ignore: [...(asset.ignore ?? []), ...globsForceIgnored],\n dot: true,\n onlyFiles: true,\n followSymbolicLinks: asset.followSymlinks,\n });\n for (const filePath of filePaths) {\n const fileSrcFullPath = path.join(asset.input, filePath);\n const fileDestFullPath = path.join(asset.output, filePath);\n const nodeUri = fileUrl(ensureUnixPath(fileSrcFullPath));\n let node = graph.get(nodeUri);\n if (!node) {\n node = new Node(nodeUri);\n graph.put(node);\n }\n entryPointNode.dependsOn(node);\n await copyFile(fileSrcFullPath, fileDestFullPath);\n }\n }\n}\n\n/**\n * Creates and writes a `package.json` file of the entry point used by the `node_module`\n * resolution strategies.\n *\n * #### Example\n *\n * A consumer of the entry point depends on it by `import {..} from '@my/module/id';`.\n * The module id `@my/module/id` will be resolved to the `package.json` file that is written by\n * this build step.\n * The properties `main`, `module`, `typings` (and so on) in the `package.json` point to the\n * flattened JavaScript bundles, type definitions, (...).\n *\n * @param entryPoint An entry point of an Angular package / library\n * @param additionalProperties Additional properties, e.g. binary artefacts (bundle files), to merge into `package.json`\n */\nasync function writePackageJson(\n entryPoint: NgEntryPoint,\n pkg: NgPackage,\n additionalProperties: { [key: string]: string | boolean | string[] | ConditionalExport },\n compilationMode: CompilationMode,\n spinner: ora.Ora,\n): Promise<void> {\n log.debug('Writing package.json');\n\n // set additional properties\n const packageJson = { ...entryPoint.packageJson, ...additionalProperties };\n\n if (!packageJson.peerDependencies?.tslib && !packageJson.dependencies?.tslib) {\n const {\n peerDependencies: angularPeerDependencies = {},\n dependencies: angularDependencies = {},\n } = require('@angular/compiler/package.json');\n const tsLibVersion = angularPeerDependencies.tslib || angularDependencies.tslib;\n\n if (tsLibVersion) {\n packageJson.dependencies = {\n ...packageJson.dependencies,\n tslib: tsLibVersion,\n };\n }\n } else if (packageJson.peerDependencies?.tslib) {\n spinner.warn(\n colors.yellow(\n `'tslib' is no longer recommended to be used as a 'peerDependencies'. Moving it to 'dependencies'.`,\n ),\n );\n packageJson.dependencies = {\n ...(packageJson.dependencies || {}),\n tslib: packageJson.peerDependencies.tslib,\n };\n\n delete packageJson.peerDependencies.tslib;\n }\n\n // Verify non-peerDependencies as they can easily lead to duplicate installs or version conflicts\n // in the node_modules folder of an application\n const allowedList = pkg.allowedNonPeerDependencies.map(value => new RegExp(value));\n try {\n checkNonPeerDependencies(packageJson, 'dependencies', allowedList, spinner);\n } catch (e) {\n await rmdir(entryPoint.destinationPath, { recursive: true });\n throw e;\n }\n\n // Removes scripts from package.json after build\n if (packageJson.scripts) {\n if (pkg.keepLifecycleScripts !== true) {\n spinner.info(`Removing scripts section in package.json as it's considered a potential security vulnerability.`);\n delete packageJson.scripts;\n } else {\n spinner.warn(\n colors.yellow(\n `You enabled keepLifecycleScripts explicitly. The scripts section in package.json will be published to npm.`,\n ),\n );\n }\n }\n\n if (compilationMode !== 'partial') {\n const scripts = packageJson.scripts || (packageJson.scripts = {});\n scripts.prepublishOnly =\n 'node --eval \"console.error(\\'' +\n 'ERROR: Trying to publish a package that has been compiled by Ivy in full compilation mode. This is not allowed.\\\\n' +\n 'Please delete and rebuild the package with Ivy partial compilation mode, before attempting to publish.\\\\n' +\n '\\')\" ' +\n '&& exit 1';\n }\n\n // keep the dist package.json clean\n // this will not throw if ngPackage field does not exist\n delete packageJson.ngPackage;\n\n const packageJsonPropertiesToDelete = [\n 'stylelint',\n 'prettier',\n 'browserslist',\n 'devDependencies',\n 'jest',\n 'workspaces',\n 'husky',\n ];\n\n for (const prop of packageJsonPropertiesToDelete) {\n if (prop in packageJson) {\n delete packageJson[prop];\n spinner.info(`Removing ${prop} section in package.json.`);\n }\n }\n\n packageJson.name = entryPoint.moduleId;\n await writeFile(path.join(entryPoint.destinationPath, 'package.json'), JSON.stringify(packageJson, undefined, 2));\n}\n\nfunction checkNonPeerDependencies(\n packageJson: Record<string, unknown>,\n property: string,\n allowed: RegExp[],\n spinner: ora.Ora,\n) {\n if (!packageJson[property]) {\n return;\n }\n\n for (const dep of Object.keys(packageJson[property])) {\n if (allowed.some(regex => regex.test(dep))) {\n log.debug(`Dependency ${dep} is allowed in '${property}'`);\n } else {\n spinner.warn(\n colors.yellow(\n `Distributing npm packages with '${property}' is not recommended. Please consider adding ${dep} ` +\n `to 'peerDependencies' or remove it from '${property}'.`,\n ),\n );\n throw new Error(`Dependency ${dep} must be explicitly allowed using the \"allowedNonPeerDependencies\" option.`);\n }\n }\n}\n\ntype PackageExports = Record<string, ConditionalExport>;\n\n/**\n * Type describing the conditional exports descriptor for an entry-point.\n * https://nodejs.org/api/packages.html#packages_conditional_exports\n */\ntype ConditionalExport = {\n types?: string;\n esm2022?: string;\n esm?: string;\n default?: string;\n};\n\n/**\n * Generates the `package.json` package exports following APF v13.\n * This is supposed to match with: https://github.com/angular/angular/blob/e0667efa6eada64d1fb8b143840689090fc82e52/packages/bazel/src/ng_package/packager.ts#L415.\n */\nfunction generatePackageExports({ destinationPath, packageJson }: NgEntryPoint, graph: BuildGraph): PackageExports {\n const exports: PackageExports = packageJson.exports ? JSON.parse(JSON.stringify(packageJson.exports)) : {};\n\n const insertMappingOrError = (subpath: string, mapping: ConditionalExport) => {\n exports[subpath] ??= {};\n const subpathExport = exports[subpath];\n\n // Go through all conditions that should be inserted. If the condition is already\n // manually set of the subpath export, we throw an error. In general, we allow for\n // additional conditions to be set. These will always precede the generated ones.\n for (const conditionName of Object.keys(mapping)) {\n if (subpathExport[conditionName] !== undefined) {\n log.warn(\n `Found a conflicting export condition for \"${subpath}\". The \"${conditionName}\" ` +\n `condition would be overridden by ng-packagr. Please unset it.`,\n );\n }\n\n // **Note**: The order of the conditions is preserved even though we are setting\n // the conditions once at a time (the latest assignment will be at the end).\n subpathExport[conditionName] = mapping[conditionName];\n }\n };\n\n const relativeUnixFromDestPath = (filePath: string) =>\n './' + ensureUnixPath(path.relative(destinationPath, filePath));\n\n insertMappingOrError('./package.json', { default: './package.json' });\n\n const entryPoints = graph.filter(isEntryPoint);\n for (const entryPoint of entryPoints) {\n const { destinationFiles, isSecondaryEntryPoint } = entryPoint.data.entryPoint;\n const subpath = isSecondaryEntryPoint ? `./${destinationFiles.directory}` : '.';\n\n insertMappingOrError(subpath, {\n types: relativeUnixFromDestPath(destinationFiles.declarations),\n esm2022: relativeUnixFromDestPath(destinationFiles.esm2022),\n esm: relativeUnixFromDestPath(destinationFiles.esm2022),\n default: relativeUnixFromDestPath(destinationFiles.fesm2022),\n });\n }\n\n return exports;\n}\n"]}
1
+ {"version":3,"file":"write-package.transform.js","sourceRoot":"","sources":["../../../../src/lib/ng-package/entry-point/write-package.transform.ts"],"names":[],"mappings":"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","sourcesContent":["import ora from 'ora';\nimport * as path from 'path';\nimport { AssetPattern } from '../../../ng-package.schema';\nimport { BuildGraph } from '../../graph/build-graph';\nimport { Node } from '../../graph/node';\nimport { transformFromPromise } from '../../graph/transform';\nimport { colors } from '../../utils/color';\nimport { copyFile, exists, readFile, rmdir, stat, writeFile } from '../../utils/fs';\nimport { globFiles } from '../../utils/glob';\nimport * as log from '../../utils/log';\nimport { ensureUnixPath } from '../../utils/path';\nimport { EntryPointNode, PackageNode, fileUrl, isEntryPoint, isEntryPointInProgress, isPackage } from '../nodes';\nimport { NgPackagrOptions } from '../options.di';\nimport { NgPackage } from '../package';\nimport { NgEntryPoint } from './entry-point';\n\ntype CompilationMode = 'partial' | 'full' | undefined;\n\nexport const writePackageTransform = (options: NgPackagrOptions) =>\n transformFromPromise(async graph => {\n const spinner = ora({\n hideCursor: false,\n discardStdin: false,\n });\n const entryPoint: EntryPointNode = graph.find(isEntryPointInProgress());\n const ngEntryPoint: NgEntryPoint = entryPoint.data.entryPoint;\n const ngPackageNode: PackageNode = graph.find(isPackage);\n const ngPackage = ngPackageNode.data;\n const { destinationFiles } = entryPoint.data;\n\n if (!ngEntryPoint.isSecondaryEntryPoint) {\n spinner.start('Copying assets');\n try {\n await copyAssets(graph, entryPoint, ngPackageNode);\n } catch (error) {\n spinner.fail();\n throw error;\n }\n spinner.succeed();\n }\n\n // 6. WRITE PACKAGE.JSON\n const relativeUnixFromDestPath = (filePath: string) =>\n ensureUnixPath(path.relative(ngEntryPoint.destinationPath, filePath));\n\n if (!ngEntryPoint.isSecondaryEntryPoint) {\n try {\n spinner.start('Writing package manifest');\n if (!options.watch) {\n const primary = ngPackageNode.data.primary;\n await writeFile(\n path.join(primary.destinationPath, '.npmignore'),\n `# Nested package.json's are only needed for development.\\n**/package.json`,\n );\n }\n\n const { compilationMode } = entryPoint.data.tsConfig.options;\n\n await writePackageJson(\n ngEntryPoint,\n ngPackage,\n {\n module: relativeUnixFromDestPath(destinationFiles.fesm2022),\n typings: relativeUnixFromDestPath(destinationFiles.declarations),\n exports: generatePackageExports(ngEntryPoint, graph),\n // webpack v4+ specific flag to enable advanced optimizations and code splitting\n sideEffects: ngEntryPoint.packageJson.sideEffects ?? false,\n },\n !!options.watch,\n compilationMode as CompilationMode,\n spinner,\n );\n } catch (error) {\n spinner.fail();\n throw error;\n }\n spinner.succeed();\n } else if (ngEntryPoint.isSecondaryEntryPoint) {\n if (options.watch) {\n // Update the watch version of the primary entry point `package.json` file.\n // this is needed because of Webpack's 5 `cachemanagedpaths`\n // https://github.com/ng-packagr/ng-packagr/issues/2069\n const primary = ngPackageNode.data.primary;\n const packageJsonPath = path.join(primary.destinationPath, 'package.json');\n\n if (await exists(packageJsonPath)) {\n const packageJson = JSON.parse(await readFile(packageJsonPath, { encoding: 'utf8' }));\n packageJson.version = generateWatchVersion();\n await writeFile(\n path.join(primary.destinationPath, 'package.json'),\n JSON.stringify(packageJson, undefined, 2),\n );\n }\n }\n\n // Write a package.json in each secondary entry-point\n // This is need for esbuild to secondary entry-points in dist correctly.\n await writeFile(\n path.join(ngEntryPoint.destinationPath, 'package.json'),\n JSON.stringify({ module: relativeUnixFromDestPath(destinationFiles.fesm2022) }, undefined, 2),\n );\n }\n\n spinner.succeed(`Built ${ngEntryPoint.moduleId}`);\n\n return graph;\n });\n\ntype AssetEntry = Exclude<AssetPattern, string>;\n\nasync function copyAssets(\n graph: BuildGraph,\n entryPointNode: EntryPointNode,\n ngPackageNode: PackageNode,\n): Promise<void> {\n const ngPackage = ngPackageNode.data;\n\n const globsForceIgnored: string[] = ['.gitkeep', '**/.DS_Store', '**/Thumbs.db', `${ngPackage.dest}/**`];\n const defaultAssets: AssetEntry[] = [\n { glob: 'LICENSE', input: '/', output: '/' },\n ...graph.filter(isEntryPoint).map(({ data }) => {\n const subpath = data.entryPoint.destinationFiles.directory || '/';\n\n return {\n glob: 'README.md',\n input: subpath,\n output: subpath,\n };\n }),\n ];\n\n const assets: AssetEntry[] = [];\n\n for (const assetPath of [...ngPackage.assets, ...defaultAssets]) {\n let asset: AssetEntry;\n if (typeof assetPath === 'object') {\n asset = { ...assetPath };\n } else {\n const [isDir, isFile] = await stat(path.join(ngPackage.src, assetPath))\n .then(stats => [stats.isDirectory(), stats.isFile()])\n .catch(() => [false, false]);\n if (isDir) {\n asset = { glob: '**/*', input: assetPath, output: assetPath };\n } else if (isFile) {\n // filenames are their own glob\n asset = {\n glob: path.basename(assetPath),\n input: path.dirname(assetPath),\n output: path.dirname(assetPath),\n };\n } else {\n asset = { glob: assetPath, input: '/', output: '/' };\n }\n }\n\n asset.input = path.join(ngPackage.src, asset.input);\n asset.output = path.join(ngPackage.dest, asset.output);\n\n const isAncestorPath = (target: string, datum: string) => path.relative(datum, target).startsWith('..');\n if (isAncestorPath(asset.input, ngPackage.src)) {\n throw new Error('Cannot read assets from a location outside of the project root.');\n }\n if (isAncestorPath(asset.output, ngPackage.dest)) {\n throw new Error('Cannot write assets to a location outside of the output path.');\n }\n\n assets.push(asset);\n }\n\n for (const asset of assets) {\n const filePaths = await globFiles(asset.glob, {\n cwd: asset.input,\n ignore: [...(asset.ignore ?? []), ...globsForceIgnored],\n dot: true,\n onlyFiles: true,\n followSymbolicLinks: asset.followSymlinks,\n });\n for (const filePath of filePaths) {\n const fileSrcFullPath = path.join(asset.input, filePath);\n const fileDestFullPath = path.join(asset.output, filePath);\n const nodeUri = fileUrl(ensureUnixPath(fileSrcFullPath));\n let node = graph.get(nodeUri);\n if (!node) {\n node = new Node(nodeUri);\n graph.put(node);\n }\n entryPointNode.dependsOn(node);\n await copyFile(fileSrcFullPath, fileDestFullPath);\n }\n }\n}\n\n/**\n * Creates and writes a `package.json` file of the entry point used by the `node_module`\n * resolution strategies.\n *\n * #### Example\n *\n * A consumer of the entry point depends on it by `import {..} from '@my/module/id';`.\n * The module id `@my/module/id` will be resolved to the `package.json` file that is written by\n * this build step.\n * The properties `main`, `module`, `typings` (and so on) in the `package.json` point to the\n * flattened JavaScript bundles, type definitions, (...).\n *\n * @param entryPoint An entry point of an Angular package / library\n * @param additionalProperties Additional properties, e.g. binary artefacts (bundle files), to merge into `package.json`\n */\nasync function writePackageJson(\n entryPoint: NgEntryPoint,\n pkg: NgPackage,\n additionalProperties: { [key: string]: string | boolean | string[] | ConditionalExport },\n isWatchMode: boolean,\n compilationMode: CompilationMode,\n spinner: ora.Ora,\n): Promise<void> {\n log.debug('Writing package.json');\n\n // set additional properties\n const packageJson = { ...entryPoint.packageJson, ...additionalProperties };\n\n // read tslib version from `@angular/compiler` so that our tslib\n // version at least matches that of angular if we use require('tslib').version\n // it will get what installed and not the minimum version nor if it is a `~` or `^`\n // this is only required for primary\n if (isWatchMode) {\n // Needed because of Webpack's 5 `cachemanagedpaths`\n // https://github.com/angular/angular-cli/issues/20962\n packageJson.version = generateWatchVersion();\n }\n\n if (!packageJson.peerDependencies?.tslib && !packageJson.dependencies?.tslib) {\n const {\n peerDependencies: angularPeerDependencies = {},\n dependencies: angularDependencies = {},\n } = require('@angular/compiler/package.json');\n const tsLibVersion = angularPeerDependencies.tslib || angularDependencies.tslib;\n\n if (tsLibVersion) {\n packageJson.dependencies = {\n ...packageJson.dependencies,\n tslib: tsLibVersion,\n };\n }\n } else if (packageJson.peerDependencies?.tslib) {\n spinner.warn(\n colors.yellow(\n `'tslib' is no longer recommended to be used as a 'peerDependencies'. Moving it to 'dependencies'.`,\n ),\n );\n packageJson.dependencies = {\n ...(packageJson.dependencies || {}),\n tslib: packageJson.peerDependencies.tslib,\n };\n\n delete packageJson.peerDependencies.tslib;\n }\n\n // Verify non-peerDependencies as they can easily lead to duplicate installs or version conflicts\n // in the node_modules folder of an application\n const allowedList = pkg.allowedNonPeerDependencies.map(value => new RegExp(value));\n try {\n checkNonPeerDependencies(packageJson, 'dependencies', allowedList, spinner);\n } catch (e) {\n await rmdir(entryPoint.destinationPath, { recursive: true });\n throw e;\n }\n\n // Removes scripts from package.json after build\n if (packageJson.scripts) {\n if (pkg.keepLifecycleScripts !== true) {\n spinner.info(`Removing scripts section in package.json as it's considered a potential security vulnerability.`);\n delete packageJson.scripts;\n } else {\n spinner.warn(\n colors.yellow(\n `You enabled keepLifecycleScripts explicitly. The scripts section in package.json will be published to npm.`,\n ),\n );\n }\n }\n\n if (compilationMode !== 'partial') {\n const scripts = packageJson.scripts || (packageJson.scripts = {});\n scripts.prepublishOnly =\n 'node --eval \"console.error(\\'' +\n 'ERROR: Trying to publish a package that has been compiled by Ivy in full compilation mode. This is not allowed.\\\\n' +\n 'Please delete and rebuild the package with Ivy partial compilation mode, before attempting to publish.\\\\n' +\n '\\')\" ' +\n '&& exit 1';\n }\n\n // keep the dist package.json clean\n // this will not throw if ngPackage field does not exist\n delete packageJson.ngPackage;\n\n const packageJsonPropertiesToDelete = [\n 'stylelint',\n 'prettier',\n 'browserslist',\n 'devDependencies',\n 'jest',\n 'workspaces',\n 'husky',\n ];\n\n for (const prop of packageJsonPropertiesToDelete) {\n if (prop in packageJson) {\n delete packageJson[prop];\n spinner.info(`Removing ${prop} section in package.json.`);\n }\n }\n\n packageJson.name = entryPoint.moduleId;\n await writeFile(path.join(entryPoint.destinationPath, 'package.json'), JSON.stringify(packageJson, undefined, 2));\n}\n\nfunction checkNonPeerDependencies(\n packageJson: Record<string, unknown>,\n property: string,\n allowed: RegExp[],\n spinner: ora.Ora,\n) {\n if (!packageJson[property]) {\n return;\n }\n\n for (const dep of Object.keys(packageJson[property])) {\n if (allowed.some(regex => regex.test(dep))) {\n log.debug(`Dependency ${dep} is allowed in '${property}'`);\n } else {\n spinner.warn(\n colors.yellow(\n `Distributing npm packages with '${property}' is not recommended. Please consider adding ${dep} ` +\n `to 'peerDependencies' or remove it from '${property}'.`,\n ),\n );\n throw new Error(`Dependency ${dep} must be explicitly allowed using the \"allowedNonPeerDependencies\" option.`);\n }\n }\n}\n\ntype PackageExports = Record<string, ConditionalExport>;\n\n/**\n * Type describing the conditional exports descriptor for an entry-point.\n * https://nodejs.org/api/packages.html#packages_conditional_exports\n */\ntype ConditionalExport = {\n types?: string;\n esm2022?: string;\n esm?: string;\n default?: string;\n};\n\n/**\n * Generates the `package.json` package exports following APF v13.\n * This is supposed to match with: https://github.com/angular/angular/blob/e0667efa6eada64d1fb8b143840689090fc82e52/packages/bazel/src/ng_package/packager.ts#L415.\n */\nfunction generatePackageExports({ destinationPath, packageJson }: NgEntryPoint, graph: BuildGraph): PackageExports {\n const exports: PackageExports = packageJson.exports ? JSON.parse(JSON.stringify(packageJson.exports)) : {};\n\n const insertMappingOrError = (subpath: string, mapping: ConditionalExport) => {\n exports[subpath] ??= {};\n const subpathExport = exports[subpath];\n\n // Go through all conditions that should be inserted. If the condition is already\n // manually set of the subpath export, we throw an error. In general, we allow for\n // additional conditions to be set. These will always precede the generated ones.\n for (const conditionName of Object.keys(mapping)) {\n if (subpathExport[conditionName] !== undefined) {\n log.warn(\n `Found a conflicting export condition for \"${subpath}\". The \"${conditionName}\" ` +\n `condition would be overridden by ng-packagr. Please unset it.`,\n );\n }\n\n // **Note**: The order of the conditions is preserved even though we are setting\n // the conditions once at a time (the latest assignment will be at the end).\n subpathExport[conditionName] = mapping[conditionName];\n }\n };\n\n const relativeUnixFromDestPath = (filePath: string) =>\n './' + ensureUnixPath(path.relative(destinationPath, filePath));\n\n insertMappingOrError('./package.json', { default: './package.json' });\n\n const entryPoints = graph.filter(isEntryPoint);\n for (const entryPoint of entryPoints) {\n const { destinationFiles, isSecondaryEntryPoint } = entryPoint.data.entryPoint;\n const subpath = isSecondaryEntryPoint ? `./${destinationFiles.directory}` : '.';\n\n insertMappingOrError(subpath, {\n types: relativeUnixFromDestPath(destinationFiles.declarations),\n esm2022: relativeUnixFromDestPath(destinationFiles.esm2022),\n esm: relativeUnixFromDestPath(destinationFiles.esm2022),\n default: relativeUnixFromDestPath(destinationFiles.fesm2022),\n });\n }\n\n return exports;\n}\n\n/**\n * Generates a new version for the package `package.json` when runing in watch mode.\n */\nfunction generateWatchVersion() {\n return `0.0.0-watch+${Date.now()}`;\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"]}
@@ -34,7 +34,7 @@ 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
36
  const stylesheet_processor_1 = require("./stylesheet-processor");
37
- const { tailwindConfigPath, projectBasePath, browserslistData, targets, cssUrl, styleIncludePaths } = node_worker_threads_1.workerData;
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'),
@@ -88,7 +88,7 @@ async function render({ content, filePath }) {
88
88
  renderedCss = result.css;
89
89
  }
90
90
  const loader = cssUrl === stylesheet_processor_1.CssUrl.none ? 'empty' : 'dataurl';
91
- const { outputFiles, warnings: esBuildWarnings } = await esbuild.build({
91
+ const { outputFiles, warnings: esBuildWarnings, errors: esbuildErrors, } = await esbuild.build({
92
92
  stdin: {
93
93
  contents: renderedCss,
94
94
  loader: 'css',
@@ -117,6 +117,12 @@ async function render({ content, filePath }) {
117
117
  const code = outputFiles[0].text;
118
118
  if (esBuildWarnings.length > 0) {
119
119
  warnings.push(...(await esbuild.formatMessages(esBuildWarnings, { kind: 'warning' })));
120
+ warnings.forEach(msg => log.warn(msg));
121
+ }
122
+ if (esbuildErrors.length > 0) {
123
+ const errors = await esbuild.formatMessages(esBuildWarnings, { kind: 'error' });
124
+ errors.forEach(msg => log.error(msg));
125
+ throw new Error(`An error has occuried while processing ${filePath}.`);
120
126
  }
121
127
  if (cacheDirectory) {
122
128
  await (0, cache_1.saveCacheEntry)(cacheDirectory, key, JSON.stringify({
@@ -124,7 +130,6 @@ async function render({ content, filePath }) {
124
130
  warnings,
125
131
  }));
126
132
  }
127
- warnings.forEach(msg => log.warn(msg));
128
133
  return code;
129
134
  }
130
135
  async function renderCss(filePath, css) {
@@ -172,16 +177,27 @@ function getTailwindPlugin() {
172
177
  }
173
178
  }
174
179
  }
175
- let usesTailwind = false;
176
180
  async function initialize() {
177
181
  const postCssPlugins = [];
178
- const tailwinds = getTailwindPlugin();
179
- if (tailwinds) {
180
- usesTailwind = true;
181
- postCssPlugins.push(tailwinds);
182
- cacheDirectory = undefined;
182
+ if (postcssConfiguration) {
183
+ for (const [pluginName, pluginOptions] of postcssConfiguration.plugins) {
184
+ const { default: plugin } = await Promise.resolve(`${pluginName}`).then(s => __importStar(require(s)));
185
+ if (typeof plugin !== 'function' || plugin.postcss !== true) {
186
+ throw new Error(`Attempted to load invalid Postcss plugin: "${pluginName}"`);
187
+ }
188
+ postCssPlugins.push(plugin(pluginOptions));
189
+ }
190
+ }
191
+ else {
192
+ const tailwinds = getTailwindPlugin();
193
+ if (tailwinds) {
194
+ postCssPlugins.push(tailwinds);
195
+ cacheDirectory = undefined;
196
+ }
197
+ }
198
+ if (postCssPlugins.length) {
199
+ postCssProcessor = (0, postcss_1.default)(postCssPlugins);
183
200
  }
184
- postCssProcessor = (0, postcss_1.default)(postCssPlugins);
185
201
  esbuild = new esbuild_executor_1.EsbuildExecutor();
186
202
  // Return the render function for use
187
203
  return render;
@@ -191,9 +207,6 @@ async function initialize() {
191
207
  * within a stylesheet.
192
208
  */
193
209
  function hasTailwindKeywords(contents) {
194
- if (!usesTailwind) {
195
- return false;
196
- }
197
210
  // TODO: use better search algorithm for keywords
198
211
  return TAILWIND_KEYWORDS.some(keyword => contents.includes(keyword));
199
212
  }
@@ -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;AAEpC,iEAAgD;AAEhD,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,MAAM,GAAG,MAAM,KAAK,6BAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5D,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,MAAM,EAAE;YACN,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,MAAM;YACf,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,MAAM;YACf,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,MAAM;SACjB;QACD,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,IAAI;QACZ,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 { 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 loader = cssUrl === CssUrl.none ? 'empty' : 'dataurl';\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 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 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.1",
3
+ "version": "17.2.0-next.0",
4
4
  "description": "Compile and package Angular libraries in Angular Package Format (APF)",
5
5
  "keywords": [
6
6
  "apf",
@@ -43,7 +43,7 @@
43
43
  "commander": "^11.1.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": {