"use strict";
/**
 * @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
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateBudgetStats = generateBudgetStats;
const bundler_context_1 = require("./bundler-context");
const utils_1 = require("./utils");
/**
 * Generates a bundle budget calculator compatible stats object that provides
 * the necessary information for the Webpack-based bundle budget code to
 * interoperate with the esbuild-based builders.
 * @param metafile The esbuild metafile of a build to use.
 * @param initialFiles The records of all initial files of a build.
 * @returns A bundle budget compatible stats object.
 */
function generateBudgetStats(metafile, outputFiles, initialFiles) {
    const stats = {
        chunks: [],
        assets: [],
    };
    for (const { path: file, size, type } of outputFiles) {
        if (!file.endsWith('.js') && !file.endsWith('.css')) {
            continue;
        }
        // Exclude server bundles
        if (type === bundler_context_1.BuildOutputFileType.Server) {
            continue;
        }
        const initialRecord = initialFiles.get(file);
        const name = initialRecord?.name ?? (0, utils_1.getChunkNameFromMetafile)(metafile, file);
        stats.chunks.push({
            files: [file],
            initial: !!initialRecord,
            names: name ? [name] : undefined,
        });
        stats.assets.push({
            name: file,
            size,
        });
    }
    // Add component styles from metafile
    // TODO: Provide this information directly from the AOT compiler
    for (const [file, entry] of Object.entries(metafile.outputs)) {
        if (!file.endsWith('.css')) {
            continue;
        }
        // 'ng-component' is set by the angular plugin's component stylesheet bundler
        // eslint-disable-next-line @typescript-eslint/no-explicit-any
        const componentStyle = entry['ng-component'];
        if (!componentStyle) {
            continue;
        }
        stats.assets.push({
            // Component styles use the input file
            name: Object.keys(entry.inputs)[0],
            size: entry.bytes,
            componentStyle,
        });
    }
    return stats;
}
