UNPKG

payload

Version:

Node, React, Headless CMS and Application Framework built on Next.js

98 lines (96 loc) 3.63 kB
/* eslint-disable no-console */ import fs from 'fs/promises'; import process from 'node:process'; import { iterateConfig } from './iterateConfig.js'; import { addPayloadComponentToImportMap } from './utilities/addPayloadComponentToImportMap.js'; import { getImportMapToBaseDirPath } from './utilities/getImportMapToBaseDirPath.js'; import { resolveImportMapFilePath } from './utilities/resolveImportMapFilePath.js'; export async function generateImportMap(config, options) { const shouldLog = options?.log ?? true; if (shouldLog) { console.log('Generating import map'); } const importMap = {}; const imports = {}; // Determine the root directory of the project - usually the directory where the src or app folder is located const rootDir = process.env.ROOT_DIR ?? process.cwd(); const baseDir = config.admin.importMap.baseDir ?? process.cwd(); const importMapFilePath = resolveImportMapFilePath({ adminRoute: config.routes.admin, importMapFile: config?.admin?.importMap?.importMapFile, rootDir }); const importMapToBaseDirPath = getImportMapToBaseDirPath({ baseDir, importMapPath: importMapFilePath }); const addToImportMap = (payloadComponent)=>{ if (!payloadComponent) { return; } if (typeof payloadComponent !== 'object' && typeof payloadComponent !== 'string') { console.error(payloadComponent); throw new Error('addToImportMap > Payload component must be an object or a string'); } if (Array.isArray(payloadComponent)) { for (const component of payloadComponent){ addPayloadComponentToImportMap({ importMap, importMapToBaseDirPath, imports, payloadComponent: component }); } } else { addPayloadComponentToImportMap({ importMap, importMapToBaseDirPath, imports, payloadComponent }); } }; iterateConfig({ addToImportMap, baseDir: config.admin.importMap.baseDir, config, importMap, imports }); await writeImportMap({ componentMap: importMap, force: options?.force, importMap: imports, importMapFilePath, log: shouldLog }); } export async function writeImportMap({ componentMap, force, importMap, importMapFilePath, log }) { const imports = []; for (const [identifier, { path, specifier }] of Object.entries(importMap)){ imports.push(`import { ${specifier} as ${identifier} } from '${path}'`); } const mapKeys = []; for (const [userPath, identifier] of Object.entries(componentMap)){ mapKeys.push(` "${userPath}": ${identifier}`); } const importMapOutputFile = `${imports.join('\n')} export const importMap = { ${mapKeys.join(',\n')} } `; if (!force) { // Read current import map and check in the IMPORTS if there are any new imports. If not, don't write the file. const currentImportMap = await fs.readFile(importMapFilePath, 'utf-8'); if (currentImportMap?.trim() === importMapOutputFile?.trim()) { if (log) { console.log('No new imports found, skipping writing import map'); } return; } } if (log) { console.log('Writing import map to', importMapFilePath); } await fs.writeFile(importMapFilePath, importMapOutputFile); } //# sourceMappingURL=index.js.map