{"version":3,"sources":["../../../packages/tools/wac-cli/src/create/main.ts"],"names":[],"mappings":"AAMA,qBAAa,gBAAgB;IAUb,OAAO,CAAC,IAAI;IATxB;;;;;;;;MAQE;gBACkB,IAAI,EAAE,GAAG;IAEtB,MAAM,IAAI,IAAI;IAyBrB,OAAO,CAAC,YAAY;IAgDpB,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,WAAW;IA+EnB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,cAAc;CAGzB","file":"main.d.ts","sourcesContent":["import fse from 'fs-extra';\r\nimport { Guid } from 'guid-typescript';\r\nimport pathExists from 'path-exists';\r\nimport { Common } from '../common';\r\nimport { cleanFile, updateShellReferences } from '../angular15/utils/update-shell-references';\r\n\r\nexport class ExtensionCreator {\r\n    /**\r\n     * Arguments:\r\n     *\t--company - name of the company or person making the extension.\r\n     *\t--tool - name of the tool / extension that is being built.\r\n     *  --solution - name of the solution / extension that is being built.\r\n     *\t--version - tag of the version to use.\r\n     *  --internal - instead of referring to SDK, references point to internal shell library\r\n     * @param {any} argv Object containing command arguments\r\n    */\r\n    constructor(private argv: any) { }\r\n\r\n    public create(): void {\r\n        const normalizedCompany = this.normalizeString(this.argv.company ? this.argv.company : '');\r\n        const normalizedTool = this.normalizeString(this.argv.tool ? this.argv.tool : '');\r\n\r\n        const version = this.argv.version ? this.argv.version.toLowerCase() : '';\r\n        const extensionType = this.argv.solution ? 'solution' : 'tool';\r\n        const normalizedSolution = this.argv.solution ? this.normalizeString(this.argv.solution) : '';\r\n        const internal = this.argv.internal;\r\n\r\n        if (this.argv.length === 0 || !this.isValidVersion(version) || !normalizedCompany || !normalizedTool) {\r\n            console.error('Usage: wac create --company <company-name> --name <tool-name> --version <version-tag> [--verbose]');\r\n            console.log('or');\r\n            console.log('wac create --company <company-name> --solution <solution-name> --tool <tool-name> --type <tool-type> --version <version-tag> [--verbose]');\r\n            console.log('Valid version tags: \\'latest\\', \\'insider\\', \\'next\\', \\'experimental\\'');\r\n            console.log('More information can be found here:');\r\n            process.exit(1);\r\n        }\r\n\r\n        if (normalizedSolution === '') {\r\n            this.createHelper(extensionType, normalizedCompany, normalizedTool, '', version, internal);\r\n        } else {\r\n            this.createHelper(extensionType, normalizedCompany, normalizedSolution, normalizedTool, version, internal);\r\n        }\r\n    }\r\n\r\n    private createHelper(\r\n        type: string,\r\n        company: string,\r\n        primaryDisplayName: string,\r\n        secondaryDisplayName: string,\r\n        version: string,\r\n        internal: boolean\r\n    ): void {\r\n        const ignoresPath = Common.cliRootPath + 'templates\\\\ignores';\r\n        const internalPath = Common.cliRootPath + 'templates\\\\internal';\r\n        const solutionPath = Common.cliRootPath + 'templates\\\\solution';\r\n        const templatePath = Common.cliRootPath + 'templates\\\\wac-template';\r\n        const gulpPath = Common.moduleTemplatePath;\r\n\r\n        if (pathExists.sync(primaryDisplayName)) {\r\n            console.error('This tool definition already exists.  No changes have been made.');\r\n        } else {\r\n            const productPath = './' + primaryDisplayName;\r\n            fse.mkdirSync(primaryDisplayName);\r\n            console.log('Created ' + productPath);\r\n\r\n            fse.copySync(templatePath, productPath);\r\n            fse.copySync(gulpPath + '\\\\gulpfile.ts', productPath + '\\\\gulpfile.ts');\r\n            fse.copySync(gulpPath + '\\\\build', productPath + '\\\\build');\r\n            fse.copyFileSync(gulpPath + '\\\\.eslintrc.json', productPath + '\\\\.eslintrc.json');\r\n            fse.copyFileSync(templatePath + '\\\\gulpfile.ts\\\\config-data.ts', productPath + '\\\\gulpfile.ts\\\\config-data.ts');\r\n            fse.copyFileSync(ignoresPath + '\\\\git.txt', productPath + '\\\\.gitignore');\r\n            fse.copyFileSync(ignoresPath + '\\\\npm.txt', productPath + '\\\\.npmignore');\r\n            fse.copyFileSync(ignoresPath + '\\\\browserslistrc.txt', productPath + '\\\\.browserslistrc');\r\n\r\n            // For solution extensions, overwrite manifest and strings file\r\n            if (type === 'solution') {\r\n                fse.copyFileSync(solutionPath + '\\\\manifest.json', productPath + '\\\\src\\\\manifest.json');\r\n                fse.copyFileSync(solutionPath + '\\\\strings.resjson', productPath + '\\\\src\\\\resources\\\\strings\\\\strings.resjson');\r\n            }\r\n\r\n            // For internal developers, overwrite package.json and add .npmrc\r\n            if (internal) {\r\n                fse.copyFileSync(internalPath + '\\\\package.json', productPath + '\\\\package.json');\r\n                fse.copyFileSync(internalPath + '\\\\npmrc.txt', productPath + '\\\\.npmrc');\r\n            }\r\n\r\n            this.updateShellReferences(primaryDisplayName, internal);\r\n            this.updateFiles(company, primaryDisplayName, secondaryDisplayName, version, internal);\r\n            this.printOutro(primaryDisplayName);\r\n        }\r\n    }\r\n\r\n    private updateShellReferences(primaryDisplayName: string, internal: boolean): void {\r\n        updateShellReferences(primaryDisplayName, internal);\r\n    }\r\n\r\n    private updateFiles(\r\n        company: string,\r\n        primaryDisplayName: string,\r\n        secondaryDisplayName: string,\r\n        version: string,\r\n        internal: boolean\r\n    ): void {\r\n        /*\r\n        / files that need updating:\r\n        /\troot package.json\r\n        /\tsrc/manifest.json\r\n        /\tsrc/resources/strings/strings.resjson\r\n        /\tsrc/main.ts\r\n        /\tin Experimental: gulpfile.js\r\n        */\r\n        const cleanDirectory = {};\r\n        const rootPackagePath = './' + primaryDisplayName + '/package.json';\r\n        const manifestFilePath = './' + primaryDisplayName + '/src/manifest.json';\r\n        const mainFilePath = './' + primaryDisplayName + '/src/main.ts';\r\n        const stringsFilePath = './' + primaryDisplayName + '/src/resources/strings/strings.resjson';\r\n        const gulpFilePath = './' + primaryDisplayName + '/gulpfile.ts/config-data.ts';\r\n\r\n        const packageName = '@' + company.toLowerCase() + '/' + primaryDisplayName.toLowerCase();\r\n        const manifestName = company.toLowerCase() + '.' + primaryDisplayName.toLowerCase();\r\n        const stringsProduct = primaryDisplayName.split('-').join(''); // Strings file cannot handle dashes.\r\n        const stringsCompany = company.split('-').join('');\r\n        const companyPackageIdentifier = company.split('-').join('') + primaryDisplayName.split('-').join('');\r\n\r\n        /*\r\n        / Default version is 'latest' in wac-template/package.json\r\n        */\r\n        if (version === 'next' || version === 'insider' || version === 'experimental') {\r\n            const existingVersion = '\"@microsoft/windows-admin-center-sdk\": \"latest\",';\r\n            cleanDirectory[rootPackagePath] = {\r\n                '@{!company-name}/{!product-name}': packageName,\r\n                '\"@microsoft/windows-admin-center-sdk\": \"latest\",': existingVersion.replace('latest', version)\r\n            };\r\n        } else {\r\n            cleanDirectory[rootPackagePath] = { '@{!company-name}/{!product-name}': packageName };\r\n        }\r\n\r\n        if (!internal) {\r\n            this.cleanInternalPackages(rootPackagePath);\r\n        }\r\n\r\n        cleanDirectory[gulpFilePath] = {\r\n            '{!company-name}.{!module-name}': manifestName,\r\n            '{!CompanyName}{!ProductName}': stringsCompany + stringsProduct,\r\n            '{!guid}': Guid.create(),\r\n            '{!company-package-id}': companyPackageIdentifier\r\n        };\r\n\r\n        cleanDirectory[manifestFilePath] = {\r\n            '{!company-name}.{!module-name}': manifestName,\r\n            '{!company-name}.{!product-name}': manifestName,\r\n            '{!primary-display-name}': primaryDisplayName,\r\n            '{!primary-url-name}': primaryDisplayName.toLowerCase(),\r\n            '{!secondary-display-name}': secondaryDisplayName,\r\n            '{!secondary-url-name}': secondaryDisplayName.toLowerCase()\r\n        };\r\n\r\n        cleanDirectory[stringsFilePath] = {\r\n            '{!product-display-name}': stringsProduct,\r\n            '{!product-title}': stringsProduct,\r\n            '{!primary-display-name}': primaryDisplayName,\r\n            '{!secondary-display-name}': secondaryDisplayName,\r\n            '{!ProductName}': stringsProduct,\r\n            '{!CompanyName}': stringsCompany\r\n        };\r\n\r\n        cleanDirectory[mainFilePath] = { '{!company-name}.{!product-name}': manifestName };\r\n\r\n        for (const key in cleanDirectory) {\r\n            if (Object.prototype.hasOwnProperty.call(cleanDirectory, key)) {\r\n                this.cleanFile(key, cleanDirectory[key]);\r\n            }\r\n        }\r\n    }\r\n\r\n    private cleanFile(key: string, values: any): void {\r\n        cleanFile(key, values);\r\n    }\r\n\r\n    private cleanInternalPackages(packagesFilePath: string): void {\r\n        const packages = Common.readFileJSON(packagesFilePath);\r\n        const dependencies = [packages.peerDependencies, packages.devDependencies];\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        dependencies.forEach((target) => {\r\n            for (const pack of shellPackages) {\r\n                delete target[pack];\r\n            }\r\n        });\r\n\r\n        fse.writeJSONSync(packagesFilePath, packages, { spaces: 2 });\r\n    }\r\n\r\n    private printOutro(product: string): void {\r\n        console.log('');\r\n        console.log('Thank you for using the Windows Admin Center CLI.');\r\n        console.log('');\r\n        console.log('Next steps:');\r\n        console.log('cd into your new directory (cd ' + product + ') and then run \\'npm install\\' -> \\'gulp build\\' to build your new extension');\r\n        console.log('After that, \\'gulp serve --port 4200\\' to serve your new extension on port 4200');\r\n        console.log('Additional information can be found here: https://aka.ms/wacsdkdocs');\r\n    }\r\n\r\n    private normalizeString(input: string): string {\r\n        return input.split(' ').join('-');\r\n    }\r\n\r\n    private isValidVersion(version: string): boolean {\r\n        return version === 'latest' || version === 'next' || version === 'insider' || version === 'release' || version === '' || version === 'experimental';\r\n    }\r\n}\r\n"]}