/
githubmirror
/
angular-cli
Обзор
Документация
Войти
/
githubmirror
/
angular-cli
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
packages/angular_devkit/build_angular/src/utils/normalize-asset-patterns.ts
87 строк
3 KB
Alan Agius
fix(@angular/build): assert that asset input paths are within workspace root
21 май 2026, 16:57
21 май 2026, 16:57
163a032
Код
Авторство
О чём код?
/** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.dev/license */ import assert from 'node:assert'; import { statSync } from 'node:fs'; import * as path from 'node:path'; import { AssetPattern, AssetPatternClass } from '../builders/browser/schema'; export class MissingAssetSourceRootException extends Error { constructor(path: string) { super(`The ${path} asset path must start with the project source root.`); } } export function normalizeAssetPatterns( assetPatterns: AssetPattern[], workspaceRoot: string, projectRoot: string, projectSourceRoot: string | undefined, ): (AssetPatternClass & { output: string })[] { if (assetPatterns.length === 0) { return []; } // When sourceRoot is not available, we default to ${projectRoot}/src. const sourceRoot = projectSourceRoot || path.join(projectRoot, 'src'); const resolvedSourceRoot = path.resolve(workspaceRoot, sourceRoot); return assetPatterns.map((assetPattern) => { // Normalize string asset patterns to objects. if (typeof assetPattern === 'string') { const assetPath = path.normalize(assetPattern); const resolvedAssetPath = path.resolve(workspaceRoot, assetPath); // Check if the string asset is within sourceRoot. if (!resolvedAssetPath.startsWith(resolvedSourceRoot)) { throw new MissingAssetSourceRootException(assetPattern); } let glob: string, input: string; let isDirectory: boolean; try { isDirectory = statSync(resolvedAssetPath).isDirectory(); } catch { isDirectory = true; } if (isDirectory) { // Folders get a recursive star glob. glob = '**/*'; // Input directory is their original path. input = assetPath; } else { // Files are their own glob. glob = path.basename(assetPath); // Input directory is their original dirname. input = path.dirname(assetPath); } // Output directory for both is the relative path from source root to input. const output = path.relative(resolvedSourceRoot, path.resolve(workspaceRoot, input)); assetPattern = { glob, input, output }; } else { const resolvedInput = path.resolve(workspaceRoot, assetPattern.input); if (!resolvedInput.startsWith(workspaceRoot)) { throw new Error(`The ${assetPattern.input} asset path must be within the workspace root.`); } assetPattern.output = path.join('.', assetPattern.output ?? ''); } assert(assetPattern.output !== undefined); if (assetPattern.output.startsWith('..')) { throw new Error('An asset cannot be written to a location outside of the output path.'); } return assetPattern as AssetPatternClass & { output: string }; }); }