UNPKG

@graphql-mesh/migrate-config-cli

Version:
137 lines (136 loc) 5.37 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createDefaultPluginResolver = exports.migrateLegacyConfig = void 0; exports.run = run; // eslint-disable-next-line import/no-nodejs-modules const node_fs_1 = require("node:fs"); // eslint-disable-next-line import/no-nodejs-modules const node_path_1 = require("node:path"); const prettier_1 = require("prettier"); const cli_1 = require("@graphql-mesh/cli"); const config_1 = require("@graphql-mesh/config"); const utils_1 = require("@graphql-mesh/utils"); const migrate_js_1 = require("./migrate.js"); var migrate_js_2 = require("./migrate.js"); Object.defineProperty(exports, "migrateLegacyConfig", { enumerable: true, get: function () { return migrate_js_2.migrateLegacyConfig; } }); function pluginFactoryName(pluginName) { const cleaned = pluginName.replace(/^@/, '').replace(/[^a-zA-Z0-9]+/g, '_'); return camelCase(`use_${cleaned}`); } function camelCase(value) { return value.replace(/[-_]+(\w)/g, (_, char) => char.toUpperCase()); } const createDefaultPluginResolver = (cwd) => async ({ name }) => { try { const { resolved: possiblePluginFactory, moduleName } = await (0, config_1.getPackage)({ name, type: 'plugin', importFn: utils_1.defaultImportFn, cwd, additionalPrefixes: ['@envelop/', '@graphql-yoga/plugin-', '@escape.tech/graphql-armor-'], }); if (typeof possiblePluginFactory === 'function') { const fnName = pluginFactoryName(name); return { moduleName, importName: `default as ${fnName}`, factoryName: fnName, }; } const importName = Object.keys(possiblePluginFactory || {}).find(iName => (iName.toString().startsWith('use') || iName.toString().endsWith('Plugin')) && typeof possiblePluginFactory[iName] === 'function'); if (!importName) { return undefined; } return { moduleName, importName: importName.toString(), factoryName: importName.toString(), }; } catch (error) { console.warn(`Plugin "${name}" could not be loaded: ${error instanceof Error ? error.message : String(error)}`); return undefined; } }; exports.createDefaultPluginResolver = createDefaultPluginResolver; async function run(argv = process.argv) { const args = argv.slice(2).filter(arg => arg !== '--'); const dryRun = args.includes('--dry-run'); const force = args.includes('--force'); const positional = args.filter(arg => !arg.startsWith('--')); const cwd = positional[0] || process.cwd(); const { config: legacyConfig, filepath, isEmpty, } = await (0, cli_1.findConfig)({ initialLoggerPrefix: 'Mesh Config Migrate', dir: cwd, }); const log = (...parts) => { (dryRun ? console.error : console.log)(...parts); }; if (isEmpty || !legacyConfig) { console.error('No config file found'); process.exitCode = 1; return { code: '', addedPackages: [], removedPackages: [], messages: [{ level: 'error', message: 'No config file found' }], fatal: true, }; } log(`Found config at ${filepath}`); const result = await (0, migrate_js_1.migrateLegacyConfig)(legacyConfig, { cwd, resolvePlugin: (0, exports.createDefaultPluginResolver)(cwd), }); try { result.code = await (0, prettier_1.format)(result.code, { parser: 'typescript' }); } catch (error) { console.warn(`Could not format the generated config: ${error instanceof Error ? error.message : String(error)}`); } for (const message of result.messages) { if (message.level === 'error') { console.error(message.message); } else { console.warn(message.message); } } if (result.fatal) { console.error('Migration did not write mesh.config.ts because of the errors above.'); process.exitCode = 1; return result; } const newConfigPath = (0, node_path_1.join)(cwd, 'mesh.config.ts'); if (!dryRun) { if ((0, node_fs_1.existsSync)(newConfigPath) && !force) { console.error(`${newConfigPath} already exists. Pass --force to overwrite, or --dry-run to print the result.`); process.exitCode = 1; return result; } (0, node_fs_1.writeFileSync)(newConfigPath, result.code); } else { process.stdout.write(result.code); } log('Migration successful!'); log(' '); if (!dryRun) { log(`New config file created at ${newConfigPath}`); log(' '); } log('Please make sure to install the following packages in package.json:'); for (const packageName of result.addedPackages) { log(`- ${packageName}`); } log(' '); log('Please make sure to remove the following packages in package.json:'); for (const packageName of result.removedPackages) { log(`- ${packageName}`); } log(' '); log(`Then run "npx mesh-compose -o supergraph.graphql" to generate the supergraph schema!`); log(`Finally, run "npx hive-gateway supergraph" to start the gateway server!`); return result; }