import * as plugins from './mod.plugins.js'; import * as paths from '../paths.js'; import * as gulpFunction from '@push.rocks/gulp-function'; import { Project } from '../classes.project.js'; /** * Migrates npmextra.json from old namespace keys to new package-scoped keys */ const migrateNamespaceKeys = (npmextraJson: any): boolean => { let migrated = false; const migrations = [ { oldKey: 'gitzone', newKey: '@git.zone/cli' }, { oldKey: 'tsdoc', newKey: '@git.zone/tsdoc' }, { oldKey: 'npmdocker', newKey: '@git.zone/tsdocker' }, { oldKey: 'npmci', newKey: '@ship.zone/szci' }, { oldKey: 'szci', newKey: '@ship.zone/szci' }, ]; for (const { oldKey, newKey } of migrations) { if (npmextraJson[oldKey] && !npmextraJson[newKey]) { npmextraJson[newKey] = npmextraJson[oldKey]; delete npmextraJson[oldKey]; migrated = true; console.log(`Migrated npmextra.json: ${oldKey} -> ${newKey}`); } } return migrated; }; /** * runs the npmextra file checking */ export const run = async (projectArg: Project) => { const formatSmartstream = new plugins.smartstream.StreamWrapper([ plugins.smartgulp.src([`npmextra.json`]), gulpFunction.forEach(async (fileArg: plugins.smartfile.SmartFile) => { const fileString = fileArg.contents.toString(); const npmextraJson = JSON.parse(fileString); // Migrate old namespace keys to new package-scoped keys migrateNamespaceKeys(npmextraJson); if (!npmextraJson['@git.zone/cli']) { npmextraJson['@git.zone/cli'] = {}; } const expectedRepoInformation: string[] = [ 'projectType', 'module.githost', 'module.gitscope', 'module.gitrepo', 'module.description', 'module.npmPackagename', 'module.license', ]; const interactInstance = new plugins.smartinteract.SmartInteract(); for (const expectedRepoInformationItem of expectedRepoInformation) { if ( !plugins.smartobject.smartGet( npmextraJson['@git.zone/cli'], expectedRepoInformationItem, ) ) { interactInstance.addQuestions([ { message: `What is the value of ${expectedRepoInformationItem}`, name: expectedRepoInformationItem, type: 'input', default: 'undefined variable', }, ]); } } const answerbucket = await interactInstance.runQueue(); for (const expectedRepoInformationItem of expectedRepoInformation) { const cliProvidedValue = answerbucket.getAnswerFor( expectedRepoInformationItem, ); if (cliProvidedValue) { plugins.smartobject.smartAdd( npmextraJson['@git.zone/cli'], expectedRepoInformationItem, cliProvidedValue, ); } } // delete obsolete // tbd if (!npmextraJson['@ship.zone/szci']) { npmextraJson['@ship.zone/szci'] = {}; } fileArg.setContentsFromString(JSON.stringify(npmextraJson, null, 2)); }), plugins.smartgulp.replace(), ]); await formatSmartstream.run().catch((error) => { console.log(error); }); };