UNPKG

@baseplate-dev/sync

Version:

Library for syncing Baseplate descriptions

82 lines 3.37 kB
import { readJsonWithSchema } from '@baseplate-dev/utils/node'; import { globby } from 'globby'; import fsAdapter from 'node:fs'; import path from 'node:path/posix'; import { extractorConfigSchema } from '../configs/extractor-config.schema.js'; import { extractorProvidersConfigSchema } from '../configs/providers-config.schema.js'; /** * Index all extractor.json and providers.json files in a package */ async function indexTemplateConfigsInPackage(packageName, packagePath) { const configFiles = await globby([ path.join(packagePath, '**/extractor.json'), path.join(packagePath, '**/providers.json'), ], { cwd: packagePath, absolute: true, onlyFiles: true, fs: fsAdapter, gitignore: true, }); const extractorEntries = []; const providerEntries = []; for (const configFile of configFiles) { if (configFile.endsWith('extractor.json')) { const config = await readJsonWithSchema(configFile, extractorConfigSchema); const generatorDirectory = path.dirname(configFile); const generatorName = `${packageName}#${config.name}`; extractorEntries.push({ config, generatorDirectory, packageName, packagePath, generatorName, }); } else if (configFile.endsWith('providers.json')) { const config = await readJsonWithSchema(configFile, extractorProvidersConfigSchema); const providerDirectory = path.dirname(configFile); for (const [fileName, providers] of Object.entries(config)) { for (const [providerName, providerConfig] of Object.entries(providers)) { const relativePath = path.join(path.relative(packagePath, providerDirectory), fileName); providerEntries.push({ config: providerConfig, packagePathSpecifier: `${packageName}:${relativePath}`, providerName, packageName, packagePath, }); } } } } return { extractorEntries, providerEntries }; } /** * Index all template config files (extractor.json and providers.json) across multiple packages */ export async function indexTemplateConfigs(packageMap) { const allExtractorEntries = []; const allProviderEntries = []; const errors = []; await Promise.all([...packageMap.entries()].map(async ([packageName, packagePath]) => { try { const { extractorEntries, providerEntries } = await indexTemplateConfigsInPackage(packageName, packagePath); allExtractorEntries.push(...extractorEntries); allProviderEntries.push(...providerEntries); } catch (error) { errors.push(error instanceof Error ? error : new Error(`Failed to index package ${packageName}: ${String(error)}`)); } })); if (errors.length > 0) { throw new Error(`Failed to index some packages: ${errors.map((e) => e.message).join(', ')}`); } return { extractorEntries: allExtractorEntries, providerEntries: allProviderEntries, }; } //# sourceMappingURL=index-template-configs.js.map