{"version":3,"sources":["../../../packages/tools/wac-cli/src/upgrade/package-updater.ts"],"names":[],"mappings":"AAKA,qBAAa,cAAc;IACvB;;;;;;;OAOG;IACU,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAkF5G,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,iBAAiB;CAyB5B","file":"package-updater.d.ts","sourcesContent":["import { exec } from 'child_process';\r\nimport fs from 'fs';\r\nimport fse from 'fs-extra';\r\nimport { Common } from '../common';\r\n\r\nexport class PackageUpdater {\r\n    /**\r\n     * Updates package.json file with new package versions\r\n     * @param {string} rootPath Root path of the target repository\r\n     * @param {boolean} internal Flag indicating if upgrade is running for an internal WAC repository\r\n     * @param {boolean} audit Flag indicating if upgrade is running it audit mode\r\n     * @param {string[]} updateSource Array used to emit logs to file\r\n     * @returns {Promise<boolean>} Empty promise indicating function completion\r\n     */\r\n    public async updatePackages(audit: boolean, updateSource: string[], experimental: boolean): Promise<boolean> {\r\n        if (!audit) {\r\n            console.log('Beginning package update.');\r\n        } else {\r\n            console.log('Beginning package update audit.');\r\n        }\r\n\r\n        const packageFile = Common.rootPath + '\\\\package.json';\r\n        const templatePackageFile = Common.cliRootPath + 'templates\\\\wac-template\\\\package.json';\r\n        const removeListFile = Common.cliRootPath + 'src\\\\config\\\\package-remove-list.json';\r\n\r\n        const templatePackages = Common.readFileJSON(templatePackageFile);\r\n        const templatePeerDependencies = templatePackages.peerDependencies;\r\n        const templateDevDependencies = templatePackages.devDependencies;\r\n        const templateScripts = templatePackages.scripts;\r\n\r\n        // Use equality operator instead of strict equality operator to check for null or undefined\r\n        if (templatePeerDependencies == null || templateDevDependencies == null) {\r\n            throw new Error(`An unexpected error occurred, template package file is malformed. Please verify file at path ${templatePackageFile} has both \"peerDependencies\" and \"devDependencies\" defined.`);\r\n        }\r\n\r\n        if (experimental) {\r\n            templatePeerDependencies['@microsoft/windows-admin-center-sdk'] = 'experimental';\r\n            templateDevDependencies['@microsoft/windows-admin-center-sdk'] = 'experimental';\r\n        }\r\n\r\n        const removeList = Common.readFileJSON(removeListFile).packages;\r\n\r\n        const packages = Common.readFileJSON(packageFile);\r\n        if (packages === null) {\r\n            console.log(`No existing package file exists, creating new package file at path ${packageFile}.`);\r\n            fs.copyFileSync(templatePackageFile, packageFile);\r\n        }\r\n\r\n        if (packages.peerDependencies == null) {\r\n            packages.peerDependencies = {};\r\n        }\r\n\r\n        if (packages.devDependencies == null) {\r\n            packages.devDependencies = {};\r\n        }\r\n\r\n        packages.scripts = templateScripts;\r\n\r\n        const peerDependencies = packages.peerDependencies;\r\n        const devDependencies = packages.devDependencies;\r\n\r\n        const internal = peerDependencies['@microsoft/windows-admin-center-sdk'] || devDependencies['@microsoft/windows-admin-center-sdk']\r\n            ? false : true;\r\n\r\n        if (internal) {\r\n            await this.getMsftSmeVersion([templatePeerDependencies, templateDevDependencies]);\r\n        }\r\n\r\n        this.updatePackageObject(templatePeerDependencies, peerDependencies, removeList, internal, updateSource);\r\n        this.updatePackageObject(templateDevDependencies, devDependencies, removeList, internal, updateSource);\r\n\r\n        updateSource.push('\\n');\r\n\r\n        if (!audit) {\r\n            console.log('Finished updating packages, writing to file.');\r\n            fse.writeJSONSync(packageFile, packages, { spaces: 2 });\r\n\r\n            console.log('Running npm install, please wait...');\r\n            return new Promise((resolve) => exec('npm install', (error, stdout, stderr) => {\r\n                if (error !== null) {\r\n                    console.log('Error during npm install: ' + error);\r\n                }\r\n                if (stderr !== null) {\r\n                    console.log('Error during npm install: ' + stderr);\r\n                }\r\n                console.log(stdout + '\\n');\r\n\r\n                resolve(internal);\r\n            }));\r\n        } else {\r\n            console.log('Finished audit of package update.');\r\n\r\n            return new Promise(resolve => resolve(internal));\r\n        }\r\n    }\r\n\r\n    private updatePackageObject(\r\n        sourceObject: any,\r\n        targetObject: any,\r\n        removeList: string[],\r\n        internal: boolean,\r\n        updateSource: string[]): void {\r\n        this.checkPackageRemoveList(removeList, targetObject, updateSource);\r\n\r\n        for (const pack in sourceObject) {\r\n            if ((internal && pack === '@microsoft/windows-admin-center-sdk') ||\r\n                (!internal && (pack.startsWith('@msft-sme') || pack === '@microsoft/windows-admin-center-sdk/tools'))) {\r\n                continue;\r\n            }\r\n\r\n            const message = `Package '${pack}' will go to version ${sourceObject[pack]}`;\r\n            console.log(message);\r\n            updateSource.push(message + '\\n');\r\n\r\n            targetObject[pack] = sourceObject[pack];\r\n        }\r\n    }\r\n\r\n    private checkPackageRemoveList(removeList: string[], targetObject: any, updateSource: string[]): void {\r\n        for (const pack of removeList) {\r\n            if (Object.prototype.hasOwnProperty.call(targetObject, pack)) {\r\n                const message = `Package '${pack}' will be removed`;\r\n                console.log(message);\r\n                updateSource.push(message + '\\n');\r\n\r\n                delete targetObject[pack];\r\n            }\r\n        }\r\n    }\r\n\r\n    private getMsftSmeVersion(targets: any[]): Promise<void> {\r\n        return new Promise((resolve) => {\r\n            exec('npm show \"@microsoft/windows-admin-center-sdk/tools@2\" version --json', (error, stdout, stderr) => {\r\n                if (error || stderr) {\r\n                    console.log('Failed to retrieve latest @msft-sme package version, falling back to pre-set values.');\r\n                    resolve(null);\r\n                }\r\n\r\n                const shellPackageFile = Common.cliRootPath + 'src\\\\config\\\\shell-package-list.json';\r\n                const shellPackages = Common.readFileJSON(shellPackageFile).packages;\r\n\r\n                const versionList = <string[]>JSON.parse(stdout);\r\n                const version = versionList[versionList.length - 1];\r\n                targets.forEach((target) => {\r\n                    for (const pack of shellPackages) {\r\n                        if (target[pack] != null) {\r\n                            target[pack] = version;\r\n                        }\r\n                    }\r\n                });\r\n\r\n                resolve();\r\n            });\r\n        });\r\n    }\r\n}\r\n"]}