builder/lib/processors/jsdoc/apiIndexGenerator.js

const resourceFactory = require("@ui5/fs").resourceFactory;
const createIndex = require("./lib/createIndexFiles");

/**
 * Compiles API index resources from all <code>api.json</code> resources available in the given test resources directory
 * as created by the [sdkTransformer]{@link module:@ui5/builder.processors.sdkTransformer} processor.
 * The resulting index resources (e.g. <code>api-index.json</code>,  <code>api-index-deprecated.json</code>,
 * <code>api-index-experimental.json</code> and <code>api-index-since.json</code>) are mainly to be used in the SDK.
 *
 * @public
 * @alias module:@ui5/builder.processors.apiIndexGenerator
 * @param {object} parameters Parameters
 * @param {string} parameters.versionInfoPath Path to <code>sap-ui-version.json</code> resource
 * @param {string} parameters.testResourcesRootPath Path to <code>/test-resources</code> root directory in the
 *														given fs
 * @param {string} parameters.targetApiIndexPath Path to create the generated API index JSON resource for
 * @param {string} parameters.targetApiIndexDeprecatedPath Path to create the generated API index "deprecated" JSON
 *															resource for
 * @param {string} parameters.targetApiIndexExperimentalPath Path to create the generated API index "experimental" JSON
 *																resource for
 * @param {string} parameters.targetApiIndexSincePath Path to create the generated API index "since" JSON resource for
 * @param {fs|module:@ui5/fs.fsInterface} parameters.fs Node fs or
 * 				custom [fs interface]{@link module:resources/module:@ui5/fs.fsInterface} to use
 * @returns {Promise<module:@ui5/fs.Resource[]>} Promise resolving with created resources <code>api-index.json</code>,
 * <code>api-index-deprecated.json</code>, <code>api-index-experimental.json</code> and
 * <code>api-index-since.json</code> (names depend on the supplied paths)
 */
const apiIndexGenerator = async function({
	versionInfoPath, testResourcesRootPath, targetApiIndexPath, targetApiIndexDeprecatedPath,
	targetApiIndexExperimentalPath, targetApiIndexSincePath, fs
} = {}) {
	if (!versionInfoPath || !testResourcesRootPath || !targetApiIndexPath || !targetApiIndexDeprecatedPath ||
			!targetApiIndexExperimentalPath || !targetApiIndexSincePath || !fs) {
		throw new Error("[apiIndexGenerator]: One or more mandatory parameters not provided");
	}

	const resourceMap = await createIndex(versionInfoPath, testResourcesRootPath, targetApiIndexPath,
		targetApiIndexDeprecatedPath, targetApiIndexExperimentalPath, targetApiIndexSincePath, {
			fs,
			returnOutputFiles: true
		});

	return Object.keys(resourceMap).map((resPath) => {
		return resourceFactory.createResource({
			path: resPath,
			string: resourceMap[resPath]
		});
	});
};

module.exports = apiIndexGenerator;