UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

1 lines 11.1 kB
{"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"]}