payload
Version:
Node, React, Headless CMS and Application Framework built on Next.js
60 lines (59 loc) • 2.37 kB
JavaScript
import fs from 'fs';
import path from 'path';
import { pathToFileURL } from 'url';
/**
* Get predefined migration 'up', 'down' and 'imports'
*/ export const getPredefinedMigration = async ({ dirname, file, migrationName: migrationNameArg, payload })=>{
// Check for predefined migration.
// Either passed in via --file or prefixed with '@payloadcms/db-mongodb/' for example
const importPath = file ?? migrationNameArg;
if (importPath?.startsWith('@payloadcms/db-')) {
// removes the package name from the migrationName.
const migrationName = importPath.split('/').slice(2).join('/');
let cleanPath = path.join(dirname, `./predefinedMigrations/${migrationName}`);
if (fs.existsSync(`${cleanPath}.mjs`)) {
cleanPath = `${cleanPath}.mjs`;
} else if (fs.existsSync(`${cleanPath}.js`)) {
cleanPath = `${cleanPath}.js`;
} else {
payload.logger.error({
msg: `Canned migration ${migrationName} not found.`
});
process.exit(1);
}
cleanPath = cleanPath.replaceAll('\\', '/');
const moduleURL = pathToFileURL(cleanPath);
try {
const { downSQL, imports, upSQL } = await eval(`import('${moduleURL.href}')`);
return {
downSQL,
imports,
upSQL
};
} catch (err) {
payload.logger.error({
err,
msg: `Error loading predefined migration ${migrationName}`
});
process.exit(1);
}
} else if (importPath) {
try {
const { downSQL, imports, upSQL } = await eval(`import('${importPath}')`);
return {
downSQL,
imports,
upSQL
};
} catch (_err) {
if (importPath?.includes('/')) {
// We can assume that the intent was to import a file, thus we throw an error.
throw new Error(`Error importing migration file from ${importPath}`);
}
// Silently fail. If the migration cannot be imported, it will be created as a blank migration and the import path will be used as the migration name.
return {};
}
}
return {};
};
//# sourceMappingURL=getPredefinedMigration.js.map