UNPKG

@pnp/cli-microsoft365

Version:

Manage Microsoft 365 and SharePoint Framework projects on any platform

1,077 lines • 38.8 kB
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _SpfxDoctorCommand_instances, _SpfxDoctorCommand_initTelemetry, _SpfxDoctorCommand_initOptions, _SpfxDoctorCommand_initValidators; import child_process from 'child_process'; import { satisfies } from 'semver'; import { CheckStatus, formatting } from '../../../utils/formatting.js'; import commands from '../commands.js'; import { BaseProjectCommand } from './project/base-project-command.js'; /** * Where to search for the particular npm package: only in the current project, * in global packages or both */ var PackageSearchMode; (function (PackageSearchMode) { PackageSearchMode[PackageSearchMode["LocalOnly"] = 0] = "LocalOnly"; PackageSearchMode[PackageSearchMode["GlobalOnly"] = 1] = "GlobalOnly"; PackageSearchMode[PackageSearchMode["LocalAndGlobal"] = 2] = "LocalAndGlobal"; })(PackageSearchMode || (PackageSearchMode = {})); /** * Should the method continue or fail on a rejected Promise */ var HandlePromise; (function (HandlePromise) { HandlePromise[HandlePromise["Fail"] = 0] = "Fail"; HandlePromise[HandlePromise["Continue"] = 1] = "Continue"; })(HandlePromise || (HandlePromise = {})); /** * Versions of SharePoint that support SharePoint Framework */ var SharePointVersion; (function (SharePointVersion) { SharePointVersion[SharePointVersion["SP2016"] = 1] = "SP2016"; SharePointVersion[SharePointVersion["SP2019"] = 2] = "SP2019"; SharePointVersion[SharePointVersion["SPO"] = 4] = "SPO"; SharePointVersion[SharePointVersion["All"] = 7] = "All"; })(SharePointVersion || (SharePointVersion = {})); class SpfxDoctorCommand extends BaseProjectCommand { get allowedOutputs() { return ['text', 'json']; } get name() { return commands.DOCTOR; } get description() { return 'Verifies environment configuration for using the specific version of the SharePoint Framework'; } constructor() { super(); _SpfxDoctorCommand_instances.add(this); this.versions = { '1.0.0': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^6', fix: 'Install Node.js v6' }, sp: SharePointVersion.All, yo: { range: '^3', fix: 'npm i -g yo@3' } }, '1.1.0': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^6', fix: 'Install Node.js v6' }, sp: SharePointVersion.All, yo: { range: '^3', fix: 'npm i -g yo@3' } }, '1.2.0': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^6', fix: 'Install Node.js v6' }, sp: SharePointVersion.SP2019 | SharePointVersion.SPO, yo: { range: '^3', fix: 'npm i -g yo@3' } }, '1.4.0': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^6', fix: 'Install Node.js v6' }, sp: SharePointVersion.SP2019 | SharePointVersion.SPO, yo: { range: '^3', fix: 'npm i -g yo@3' } }, '1.4.1': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^6 || ^8', fix: 'Install Node.js v8' }, sp: SharePointVersion.SP2019 | SharePointVersion.SPO, yo: { range: '^3', fix: 'npm i -g yo@3' } }, '1.5.0': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^6 || ^8', fix: 'Install Node.js v8' }, sp: SharePointVersion.SPO, yo: { range: '^3', fix: 'npm i -g yo@3' } }, '1.5.1': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^6 || ^8', fix: 'Install Node.js v8' }, sp: SharePointVersion.SPO, yo: { range: '^3', fix: 'npm i -g yo@3' } }, '1.6.0': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^6 || ^8', fix: 'Install Node.js v8' }, sp: SharePointVersion.SPO, yo: { range: '^3', fix: 'npm i -g yo@3' } }, '1.7.0': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^8', fix: 'Install Node.js v8' }, sp: SharePointVersion.SPO, yo: { range: '^3', fix: 'npm i -g yo@3' } }, '1.7.1': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^8', fix: 'Install Node.js v8' }, sp: SharePointVersion.SPO, yo: { range: '^3', fix: 'npm i -g yo@3' } }, '1.8.0': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^8', fix: 'Install Node.js v8' }, sp: SharePointVersion.SPO, yo: { range: '^3', fix: 'npm i -g yo@3' } }, '1.8.1': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^8', fix: 'Install Node.js v8' }, sp: SharePointVersion.SPO, yo: { range: '^3', fix: 'npm i -g yo@3' } }, '1.8.2': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^8 || ^10', fix: 'Install Node.js v10' }, sp: SharePointVersion.SPO, yo: { range: '^3', fix: 'npm i -g yo@3' } }, '1.9.0': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^8 || ^10', fix: 'Install Node.js v10' }, sp: SharePointVersion.SPO, yo: { range: '^3', fix: 'npm i -g yo@3' } }, '1.9.1': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^10', fix: 'Install Node.js v10' }, sp: SharePointVersion.SPO, yo: { range: '^3', fix: 'npm i -g yo@3' } }, '1.10.0': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^10', fix: 'Install Node.js v10' }, sp: SharePointVersion.SPO, yo: { range: '^3', fix: 'npm i -g yo@3' } }, '1.11.0': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^10', fix: 'Install Node.js v10' }, sp: SharePointVersion.SPO, yo: { range: '^3', fix: 'npm i -g yo@3' } }, '1.12.0': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^12', fix: 'Install Node.js v12' }, sp: SharePointVersion.SPO, yo: { range: '^3', fix: 'npm i -g yo@3' } }, '1.12.1': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^12 || ^14', fix: 'Install Node.js v12 or v14' }, sp: SharePointVersion.SPO, yo: { range: '^3', fix: 'npm i -g yo@3' } }, '1.13.0': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^12 || ^14', fix: 'Install Node.js v12 or v14' }, sp: SharePointVersion.SPO, yo: { range: '^4', fix: 'npm i -g yo@4' } }, '1.13.1': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^12 || ^14', fix: 'Install Node.js v12 or v14' }, sp: SharePointVersion.SPO, yo: { range: '^4', fix: 'npm i -g yo@4' } }, '1.14.0': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^12 || ^14', fix: 'Install Node.js v12 or v14' }, sp: SharePointVersion.SPO, yo: { range: '^4', fix: 'npm i -g yo@4' } }, '1.15.0': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^12.13 || ^14.15 || ^16.13', fix: 'Install Node.js v12.13, v14.15, v16.13 or higher' }, sp: SharePointVersion.SPO, yo: { range: '^4', fix: 'npm i -g yo@4' } }, '1.15.2': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '^12.13 || ^14.15 || ^16.13', fix: 'Install Node.js v12.13, v14.15, v16.13 or higher' }, sp: SharePointVersion.SPO, yo: { range: '^4', fix: 'npm i -g yo@4' } }, '1.16.0': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '>=16.13.0 <17.0.0', fix: 'Install Node.js >=16.13.0 <17.0.0' }, sp: SharePointVersion.SPO, yo: { range: '^4', fix: 'npm i -g yo@4' } }, '1.16.1': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '>=16.13.0 <17.0.0', fix: 'Install Node.js >=16.13.0 <17.0.0' }, sp: SharePointVersion.SPO, yo: { range: '^4', fix: 'npm i -g yo@4' } }, '1.17.0': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '>=16.13.0 <17.0.0', fix: 'Install Node.js >=16.13.0 <17.0.0' }, sp: SharePointVersion.SPO, yo: { range: '^4', fix: 'npm i -g yo@4' } }, '1.17.1': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '>=16.13.0 <17.0.0', fix: 'Install Node.js >=16.13.0 <17.0.0' }, sp: SharePointVersion.SPO, yo: { range: '^4', fix: 'npm i -g yo@4' } }, '1.17.2': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '>=16.13.0 <17.0.0', fix: 'Install Node.js >=16.13.0 <17.0.0' }, sp: SharePointVersion.SPO, yo: { range: '^4', fix: 'npm i -g yo@4' } }, '1.17.3': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '>=16.13.0 <17.0.0', fix: 'Install Node.js >=16.13.0 <17.0.0' }, sp: SharePointVersion.SPO, yo: { range: '^4', fix: 'npm i -g yo@4' } }, '1.17.4': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '>=16.13.0 <17.0.0', fix: 'Install Node.js >=16.13.0 <17.0.0' }, sp: SharePointVersion.SPO, yo: { range: '^4', fix: 'npm i -g yo@4' } }, '1.18.0': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '>=16.13.0 <17.0.0 || >=18.17.1 <19.0.0', fix: 'Install Node.js >=16.13.0 <17.0.0 || >=18.17.1 <19.0.0' }, sp: SharePointVersion.SPO, yo: { range: '^4', fix: 'npm i -g yo@4' } }, '1.18.1': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '>=16.13.0 <17.0.0 || >=18.17.1 <19.0.0', fix: 'Install Node.js >=16.13.0 <17.0.0 || >=18.17.1 <19.0.0' }, sp: SharePointVersion.SPO, yo: { range: '^4', fix: 'npm i -g yo@4' } }, '1.18.2': { gulpCli: { range: '^1 || ^2', fix: 'npm i -g gulp-cli@2' }, node: { range: '>=16.13.0 <17.0.0 || >=18.17.1 <19.0.0', fix: 'Install Node.js >=16.13.0 <17.0.0 || >=18.17.1 <19.0.0' }, sp: SharePointVersion.SPO, yo: { range: '^4 || ^5', fix: 'npm i -g yo@5' } }, '1.19.0': { gulpCli: { range: '^1 || ^2 || ^3', fix: 'npm i -g gulp-cli@3' }, node: { range: '>=18.17.1 <19.0.0', fix: 'Install Node.js >=18.17.1 <19.0.0' }, sp: SharePointVersion.SPO, yo: { range: '^4 || ^5', fix: 'npm i -g yo@5' } }, '1.20.0': { gulpCli: { range: '^1 || ^2 || ^3', fix: 'npm i -g gulp-cli@3' }, node: { range: '>=18.17.1 <19.0.0', fix: 'Install Node.js >=18.17.1 <19.0.0' }, sp: SharePointVersion.SPO, yo: { range: '^4 || ^5', fix: 'npm i -g yo@5' } }, '1.21.0': { gulpCli: { range: '^1 || ^2 || ^3', fix: 'npm i -g gulp-cli@3' }, node: { range: '>=22.14.0 < 23.0.0', fix: 'Install Node.js >=22.14.0 < 23.0.0' }, sp: SharePointVersion.SPO, yo: { range: '^4 || ^5', fix: 'npm i -g yo@5' } }, '1.21.1': { gulpCli: { range: '^1 || ^2 || ^3', fix: 'npm i -g gulp-cli@3' }, node: { range: '>=22.14.0 < 23.0.0', fix: 'Install Node.js >=22.14.0 < 23.0.0' }, sp: SharePointVersion.SPO, yo: { range: '^4 || ^5', fix: 'npm i -g yo@5' } }, '1.22.0': { heft: { range: '^1', fix: 'npm i -g @rushstack/heft@1' }, node: { range: '>=22.14.0 < 23.0.0', fix: 'Install Node.js >=22.14.0 < 23.0.0' }, sp: SharePointVersion.SPO, yo: { range: '^4 || ^5 || ^6', fix: 'npm i -g yo@6' } }, '1.22.1': { heft: { range: '^1', fix: 'npm i -g @rushstack/heft@1' }, node: { range: '>=22.14.0 < 23.0.0', fix: 'Install Node.js >=22.14.0 < 23.0.0' }, sp: SharePointVersion.SPO, yo: { range: '^4 || ^5 || ^6', fix: 'npm i -g yo@6' } } }; this.output = ''; this.resultsObject = []; __classPrivateFieldGet(this, _SpfxDoctorCommand_instances, "m", _SpfxDoctorCommand_initTelemetry).call(this); __classPrivateFieldGet(this, _SpfxDoctorCommand_instances, "m", _SpfxDoctorCommand_initOptions).call(this); __classPrivateFieldGet(this, _SpfxDoctorCommand_instances, "m", _SpfxDoctorCommand_initValidators).call(this); } async commandAction(logger, args) { if (!args.options.output) { args.options.output = 'text'; } this.output = args.options.output; this.projectRootPath = this.getProjectRoot(process.cwd()); this.logger = logger; await this.logMessage(' '); await this.logMessage('CLI for Microsoft 365 SharePoint Framework doctor'); await this.logMessage('Verifying configuration of your system for working with the SharePoint Framework'); await this.logMessage(' '); let spfxVersion = ''; let prerequisites; try { spfxVersion = args.options.spfxVersion ?? await this.getSharePointFrameworkVersion(); if (!spfxVersion) { await this.logMessage(formatting.getStatus(CheckStatus.Failure, `SharePoint Framework`)); this.resultsObject.push({ check: 'SharePoint Framework', passed: false, message: `SharePoint Framework not found` }); throw `SharePoint Framework not found`; } prerequisites = this.versions[spfxVersion]; if (!prerequisites) { const message = `spfx doctor doesn't support SPFx v${spfxVersion} at this moment`; this.resultsObject.push({ check: 'SharePoint Framework', passed: true, version: spfxVersion, message: message }); await this.logMessage(formatting.getStatus(CheckStatus.Failure, `SharePoint Framework v${spfxVersion}`)); throw message; } else { this.resultsObject.push({ check: 'SharePoint Framework', passed: true, version: spfxVersion, message: `SharePoint Framework v${spfxVersion} valid.` }); } if (args.options.spfxVersion) { await this.checkSharePointFrameworkVersion(args.options.spfxVersion); } else { // spfx was detected and if we are here, it means that we support it const message = `SharePoint Framework v${spfxVersion}`; this.resultsObject.push({ check: 'SharePoint Framework', passed: true, version: spfxVersion, message: message }); await this.logMessage(formatting.getStatus(CheckStatus.Success, message)); } await this.checkSharePointCompatibility(spfxVersion, prerequisites, args); await this.checkNodeVersion(prerequisites); await this.checkYo(prerequisites); await this.checkGulp(); await this.checkGulpCli(prerequisites); await this.checkHeft(prerequisites); await this.checkTypeScript(); if (this.resultsObject.some(y => y.fix !== undefined)) { await this.logMessage('Recommended fixes:'); await this.logMessage(' '); for (const f of this.resultsObject.filter(y => y.fix !== undefined)) { await this.logMessage(`- ${f.fix}`); } await this.logMessage(' '); } } catch (err) { await this.logMessage(' '); if (this.resultsObject.some(y => y.fix !== undefined)) { await this.logMessage('Recommended fixes:'); await this.logMessage(' '); for (const f of this.resultsObject.filter(y => y.fix !== undefined)) { await this.logMessage(`- ${f.fix}`); } await this.logMessage(' '); } if (this.output === 'text') { this.handleRejectedPromise(err); } } finally { if (args.options.output === 'json' && this.resultsObject.length > 0) { await logger.log(this.resultsObject); } } } async logMessage(message) { if (this.output === 'json') { await this.logger.logToStderr(message); } else { await this.logger.log(message); } } async checkSharePointCompatibility(spfxVersion, prerequisites, args) { if (args.options.env) { const sp = this.spVersionStringToEnum(args.options.env); if ((prerequisites.sp & sp) === sp) { const message = `Supported in ${SharePointVersion[sp]}`; this.resultsObject.push({ check: 'env', passed: true, message: message, version: args.options.env }); await this.logMessage(formatting.getStatus(CheckStatus.Success, message)); return; } const fix = `Use SharePoint Framework v${(sp === SharePointVersion.SP2016 ? '1.1' : '1.4.1')}`; const message = `Not supported in ${SharePointVersion[sp]}`; this.resultsObject.push({ check: 'env', passed: false, fix: fix, message: message, version: args.options.env }); await this.logMessage(formatting.getStatus(CheckStatus.Failure, message)); throw `SharePoint Framework v${spfxVersion} is not supported in ${SharePointVersion[sp]}`; } } async checkNodeVersion(prerequisites) { const nodeVersion = this.getNodeVersion(); await this.checkStatus('Node', nodeVersion, prerequisites.node); } async checkSharePointFrameworkVersion(spfxVersionRequested) { let spfxVersionDetected = await this.getSPFxVersionFromYoRcFile(); if (!spfxVersionDetected) { spfxVersionDetected = await this.getPackageVersion('@microsoft/generator-sharepoint', PackageSearchMode.GlobalOnly, HandlePromise.Continue); } const versionCheck = { range: spfxVersionRequested, fix: `npm i -g @microsoft/generator-sharepoint@${spfxVersionRequested}` }; if (spfxVersionDetected) { await this.checkStatus(`SharePoint Framework`, spfxVersionDetected, versionCheck); } else { const message = `SharePoint Framework v${spfxVersionRequested} not found`; this.resultsObject.push({ check: 'SharePoint Framework', passed: false, version: spfxVersionRequested, message: message, fix: versionCheck.fix }); await this.logMessage(formatting.getStatus(CheckStatus.Failure, message)); } } async checkYo(prerequisites) { const yoVersion = await this.getPackageVersion('yo', PackageSearchMode.GlobalOnly, HandlePromise.Continue); if (yoVersion) { await this.checkStatus('yo', yoVersion, prerequisites.yo); } else { const message = 'yo not found'; this.resultsObject.push({ check: 'yo', passed: false, message: message, fix: prerequisites.yo.fix }); await this.logMessage(formatting.getStatus(CheckStatus.Failure, message)); } } async checkGulpCli(prerequisites) { if (!prerequisites.gulpCli) { // gulp-cli is not required for this version of SPFx return; } const gulpCliVersion = await this.getPackageVersion('gulp-cli', PackageSearchMode.GlobalOnly, HandlePromise.Continue); if (gulpCliVersion) { await this.checkStatus('gulp-cli', gulpCliVersion, prerequisites.gulpCli); } else { const message = 'gulp-cli not found'; this.resultsObject.push({ check: 'gulp-cli', passed: false, message: message, fix: prerequisites.gulpCli.fix }); await this.logMessage(formatting.getStatus(CheckStatus.Failure, message)); } } async checkHeft(prerequisites) { if (!prerequisites.heft) { // heft is not required for this version of SPFx return; } const heftVersion = await this.getPackageVersion('@rushstack/heft', PackageSearchMode.GlobalOnly, HandlePromise.Continue); if (heftVersion) { await this.checkStatus('@rushstack/heft', heftVersion, prerequisites.heft); } else { const message = '@rushstack/heft not found'; this.resultsObject.push({ check: '@rushstack/heft', passed: false, message: message, fix: prerequisites.heft.fix }); await this.logMessage(formatting.getStatus(CheckStatus.Failure, message)); } } async checkGulp() { const gulpVersion = await this.getPackageVersion('gulp', PackageSearchMode.GlobalOnly, HandlePromise.Continue); if (gulpVersion) { const message = 'gulp should be removed'; const fix = 'npm un -g gulp'; this.resultsObject.push({ check: 'gulp', passed: false, version: gulpVersion, message: message, fix: fix }); await this.logMessage(formatting.getStatus(CheckStatus.Failure, message)); } } async checkTypeScript() { const typeScriptVersion = await this.getPackageVersion('typescript', PackageSearchMode.LocalOnly, HandlePromise.Continue); if (typeScriptVersion) { const fix = 'npm un typescript'; const message = `typescript v${typeScriptVersion} installed in the project`; this.resultsObject.push({ check: 'typescript', passed: false, message: message, fix: fix }); await this.logMessage(formatting.getStatus(CheckStatus.Failure, message)); } else { const message = 'bundled typescript used'; this.resultsObject.push({ check: 'typescript', passed: true, message: message }); await this.logMessage(formatting.getStatus(CheckStatus.Success, message)); } } spVersionStringToEnum(sp) { return SharePointVersion[sp.toUpperCase()]; } async getSPFxVersionFromYoRcFile() { if (this.projectRootPath !== null) { const spfxVersion = this.getProjectVersion(); if (spfxVersion) { if (this.debug) { await this.logger.logToStderr(`SPFx version retrieved from .yo-rc.json file. Retrieved version: ${spfxVersion}`); } return spfxVersion; } } return undefined; } async getSharePointFrameworkVersion() { let spfxVersion = await this.getSPFxVersionFromYoRcFile(); if (spfxVersion) { return spfxVersion; } try { spfxVersion = await this.getPackageVersion('@microsoft/sp-core-library', PackageSearchMode.LocalOnly, HandlePromise.Fail); if (this.debug) { await this.logger.logToStderr(`Found @microsoft/sp-core-library@${spfxVersion}`); } return spfxVersion; } catch { if (this.debug) { await this.logger.logToStderr(`@microsoft/sp-core-library not found. Search for @microsoft/generator-sharepoint local or global...`); } try { return await this.getPackageVersion('@microsoft/generator-sharepoint', PackageSearchMode.LocalAndGlobal, HandlePromise.Fail); } catch (error) { if (this.debug) { await this.logger.logToStderr('@microsoft/generator-sharepoint not found'); } if (error && error.indexOf('ENOENT') > -1) { throw 'npm not found'; } else { return ''; } } } } async getPackageVersion(packageName, searchMode, handlePromise) { const args = ['ls', packageName, '--depth=0', '--json']; if (searchMode === PackageSearchMode.GlobalOnly) { args.push('-g'); } let version; try { version = await this.getPackageVersionFromNpm(args); } catch { if (searchMode === PackageSearchMode.LocalAndGlobal) { args.push('-g'); version = await this.getPackageVersionFromNpm(args); } else { version = ''; } } if (version) { return version; } else { if (handlePromise === HandlePromise.Continue) { return ''; } else { throw new Error(); } } } async getPackageVersionFromNpm(args) { if (this.debug) { await this.logger.logToStderr(`Executing npm: ${args.join(' ')}...`); } return new Promise((resolve, reject) => { const packageName = args[1]; child_process.exec(`npm ${args.join(' ')}`, (err, stdout) => { if (err) { reject(err.message); } const responseString = stdout; try { const packageInfo = JSON.parse(responseString); if (packageInfo.dependencies && packageInfo.dependencies[packageName]) { resolve(packageInfo.dependencies[packageName].version); } else { reject('Package not found'); } } catch (ex) { return reject(ex); } }); }); } getNodeVersion() { return process.version.substring(1); } async checkStatus(what, versionFound, versionCheck) { if (versionFound) { if (satisfies(versionFound, versionCheck.range)) { const message = `${what} v${versionFound}`; this.resultsObject.push({ check: what, passed: true, message: message, version: versionFound }); await this.logMessage(formatting.getStatus(CheckStatus.Success, message)); } else { const message = `${what} v${versionFound} found, v${versionCheck.range} required`; this.resultsObject.push({ check: what, passed: false, version: versionFound, message: message, fix: versionCheck.fix }); await this.logMessage(formatting.getStatus(CheckStatus.Failure, message)); } } } } _SpfxDoctorCommand_instances = new WeakSet(), _SpfxDoctorCommand_initTelemetry = function _SpfxDoctorCommand_initTelemetry() { this.telemetry.push((args) => { Object.assign(this.telemetryProperties, { env: args.options.env, spfxVersion: args.options.spfxVersion }); }); }, _SpfxDoctorCommand_initOptions = function _SpfxDoctorCommand_initOptions() { this.options.unshift({ option: '-e, --env [env]', autocomplete: ['sp2016', 'sp2019', 'spo'] }, { option: '-v, --spfxVersion [spfxVersion]', autocomplete: Object.keys(this.versions) }); }, _SpfxDoctorCommand_initValidators = function _SpfxDoctorCommand_initValidators() { this.validators.push(async (args) => { if (args.options.env) { const sp = this.spVersionStringToEnum(args.options.env); if (!sp) { return `${args.options.env} is not a valid SharePoint version. Valid versions are sp2016, sp2019 or spo`; } } if (args.options.spfxVersion) { if (!this.versions[args.options.spfxVersion]) { return `${args.options.spfxVersion} is not a supported SharePoint Framework version. Supported versions are ${Object.keys(this.versions).join(', ')}`; } } return true; }); }; export default new SpfxDoctorCommand(); //# sourceMappingURL=spfx-doctor.js.map