feat(cli): implement a default "loader" for JavaScript files
Supports any of the `.js`, `.cjs` and `.mjs` file extensions
This commit is contained in:
parent
62bd5a45e5
commit
3b36b3de52
3 changed files with 55 additions and 3 deletions
5
.changeset/tame-fans-clap.md
Normal file
5
.changeset/tame-fans-clap.md
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
'@emigrate/cli': minor
|
||||||
|
---
|
||||||
|
|
||||||
|
Implement a default "loader" plugin for JavaScript files (supports `.js`, `.cjs` and `.mjs` file extensions)
|
||||||
44
packages/cli/src/plugin-loader-js.ts
Normal file
44
packages/cli/src/plugin-loader-js.ts
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
import { type LoaderPlugin } from '@emigrate/plugin-tools/types';
|
||||||
|
|
||||||
|
const loaderJs: LoaderPlugin = {
|
||||||
|
loadableExtensions: ['.js', '.cjs', '.mjs'],
|
||||||
|
async loadMigration(migration) {
|
||||||
|
const migrationModule: unknown = await import(migration.filePath);
|
||||||
|
|
||||||
|
if (typeof migrationModule === 'function') {
|
||||||
|
return async () => {
|
||||||
|
await migrationModule();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
migrationModule &&
|
||||||
|
typeof migrationModule === 'object' &&
|
||||||
|
'default' in migrationModule &&
|
||||||
|
typeof migrationModule.default === 'function'
|
||||||
|
) {
|
||||||
|
const migrationFunction = migrationModule.default;
|
||||||
|
return async () => {
|
||||||
|
await migrationFunction();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
migrationModule &&
|
||||||
|
typeof migrationModule === 'object' &&
|
||||||
|
'up' in migrationModule &&
|
||||||
|
typeof migrationModule.up === 'function'
|
||||||
|
) {
|
||||||
|
const migrationFunction = migrationModule.up;
|
||||||
|
return async () => {
|
||||||
|
await migrationFunction();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return async () => {
|
||||||
|
throw new Error(`Migration file does not export a function: ${migration.relativeFilePath}`);
|
||||||
|
};
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default loaderJs;
|
||||||
|
|
@ -4,6 +4,7 @@ import { type LoaderPlugin } from '@emigrate/plugin-tools/types';
|
||||||
import { ShowUsageError } from './show-usage-error.js';
|
import { ShowUsageError } from './show-usage-error.js';
|
||||||
import { type Config } from './types.js';
|
import { type Config } from './types.js';
|
||||||
import { stripLeadingPeriod } from './strip-leading-period.js';
|
import { stripLeadingPeriod } from './strip-leading-period.js';
|
||||||
|
import pluginLoaderJs from './plugin-loader-js.js';
|
||||||
|
|
||||||
type ExtraFlags = {
|
type ExtraFlags = {
|
||||||
dry?: boolean;
|
dry?: boolean;
|
||||||
|
|
@ -40,7 +41,7 @@ export default async function upCommand({ directory, dry, plugins = [] }: Config
|
||||||
}
|
}
|
||||||
|
|
||||||
const migrationFileExtensions = new Set(migrationFiles.map((file) => stripLeadingPeriod(path.extname(file))));
|
const migrationFileExtensions = new Set(migrationFiles.map((file) => stripLeadingPeriod(path.extname(file))));
|
||||||
const loaderPlugins = await getOrLoadPlugins('loader', plugins);
|
const loaderPlugins = await getOrLoadPlugins('loader', [...plugins, pluginLoaderJs]);
|
||||||
|
|
||||||
const loaderByExtension = new Map<string, LoaderPlugin | undefined>(
|
const loaderByExtension = new Map<string, LoaderPlugin | undefined>(
|
||||||
[...migrationFileExtensions].map(
|
[...migrationFileExtensions].map(
|
||||||
|
|
@ -91,10 +92,12 @@ export default async function upCommand({ directory, dry, plugins = [] }: Config
|
||||||
console.log(' -', name, '...');
|
console.log(' -', name, '...');
|
||||||
|
|
||||||
const extension = stripLeadingPeriod(path.extname(name));
|
const extension = stripLeadingPeriod(path.extname(name));
|
||||||
const filename = path.resolve(process.cwd(), directory, name);
|
const cwd = process.cwd();
|
||||||
|
const filePath = path.resolve(cwd, directory, name);
|
||||||
|
const relativeFilePath = path.relative(cwd, filePath);
|
||||||
const loader = loaderByExtension.get(extension)!;
|
const loader = loaderByExtension.get(extension)!;
|
||||||
|
|
||||||
const migration = await loader.loadMigration({ name, filename, extension });
|
const migration = await loader.loadMigration({ name, filePath, relativeFilePath, cwd, directory, extension });
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await migration();
|
await migration();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue