"use strict";
/*
  Copyright 2021 Google LLC

  Use of this source code is governed by an MIT-style
  license that can be found in the LICENSE file or at
  https://opensource.org/licenses/MIT.
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getFileManifestEntries = void 0;
const assert_1 = __importDefault(require("assert"));
const errors_1 = require("./errors");
const get_composite_details_1 = require("./get-composite-details");
const get_file_details_1 = require("./get-file-details");
const get_string_details_1 = require("./get-string-details");
const transform_manifest_1 = require("./transform-manifest");
async function getFileManifestEntries({ additionalManifestEntries, dontCacheBustURLsMatching, globDirectory, globFollow, globIgnores, globPatterns = [], manifestTransforms, maximumFileSizeToCacheInBytes, modifyURLPrefix, templatedURLs, }) {
    const warnings = [];
    const allFileDetails = new Map();
    try {
        for (const globPattern of globPatterns) {
            const { globbedFileDetails, warning } = (0, get_file_details_1.getFileDetails)({
                globDirectory,
                globFollow,
                globIgnores,
                globPattern,
            });
            if (warning) {
                warnings.push(warning);
            }
            for (const details of globbedFileDetails) {
                if (details && !allFileDetails.has(details.file)) {
                    allFileDetails.set(details.file, details);
                }
            }
        }
    }
    catch (error) {
        // If there's an exception thrown while globbing, then report
        // it back as a warning, and don't consider it fatal.
        if (error instanceof Error && error.message) {
            warnings.push(error.message);
        }
    }
    if (templatedURLs) {
        for (const url of Object.keys(templatedURLs)) {
            (0, assert_1.default)(!allFileDetails.has(url), errors_1.errors['templated-url-matches-glob']);
            const dependencies = templatedURLs[url];
            if (Array.isArray(dependencies)) {
                const details = dependencies.reduce((previous, globPattern) => {
                    try {
                        const { globbedFileDetails, warning } = (0, get_file_details_1.getFileDetails)({
                            globDirectory,
                            globFollow,
                            globIgnores,
                            globPattern,
                        });
                        if (warning) {
                            warnings.push(warning);
                        }
                        return previous.concat(globbedFileDetails);
                    }
                    catch (error) {
                        const debugObj = {};
                        debugObj[url] = dependencies;
                        throw new Error(`${errors_1.errors['bad-template-urls-asset']} ` +
                            `'${globPattern}' from '${JSON.stringify(debugObj)}':\n` +
                            `${error instanceof Error ? error.toString() : ''}`);
                    }
                }, []);
                if (details.length === 0) {
                    throw new Error(`${errors_1.errors['bad-template-urls-asset']} The glob ` +
                        `pattern '${dependencies.toString()}' did not match anything.`);
                }
                allFileDetails.set(url, (0, get_composite_details_1.getCompositeDetails)(url, details));
            }
            else if (typeof dependencies === 'string') {
                allFileDetails.set(url, (0, get_string_details_1.getStringDetails)(url, dependencies));
            }
        }
    }
    const transformedManifest = await (0, transform_manifest_1.transformManifest)({
        additionalManifestEntries,
        dontCacheBustURLsMatching,
        manifestTransforms,
        maximumFileSizeToCacheInBytes,
        modifyURLPrefix,
        fileDetails: Array.from(allFileDetails.values()),
    });
    transformedManifest.warnings.push(...warnings);
    return transformedManifest;
}
exports.getFileManifestEntries = getFileManifestEntries;
