@react-native-windows/cli 0.78.4 → 0.79.0-preview.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib-commonjs/commands/autolinkWindows/autolinkWindows.d.ts +3 -3
- package/lib-commonjs/commands/autolinkWindows/autolinkWindows.js.map +1 -1
- package/lib-commonjs/commands/autolinkWindows/autolinkWindowsOptions.d.ts +1 -1
- package/lib-commonjs/commands/autolinkWindows/autolinkWindowsOptions.js.map +1 -1
- package/lib-commonjs/commands/codegenWindows/codegenWindows.d.ts +2 -2
- package/lib-commonjs/commands/codegenWindows/codegenWindows.js +4 -1
- package/lib-commonjs/commands/codegenWindows/codegenWindows.js.map +1 -1
- package/lib-commonjs/commands/codegenWindows/codegenWindowsOptions.d.ts +1 -1
- package/lib-commonjs/commands/codegenWindows/codegenWindowsOptions.js.map +1 -1
- package/lib-commonjs/commands/config/configUtils.js +4 -1
- package/lib-commonjs/commands/config/configUtils.js.map +1 -1
- package/lib-commonjs/commands/healthCheck/healthChecks.js +6 -3
- package/lib-commonjs/commands/healthCheck/healthChecks.js.map +1 -1
- package/lib-commonjs/commands/initWindows/initWindows.d.ts +2 -2
- package/lib-commonjs/commands/initWindows/initWindows.js.map +1 -1
- package/lib-commonjs/commands/initWindows/initWindowsOptions.d.ts +1 -1
- package/lib-commonjs/commands/initWindows/initWindowsOptions.js.map +1 -1
- package/lib-commonjs/commands/runWindows/runWindows.d.ts +1 -1
- package/lib-commonjs/commands/runWindows/runWindows.js.map +1 -1
- package/lib-commonjs/commands/runWindows/runWindowsOptions.d.ts +1 -1
- package/lib-commonjs/commands/runWindows/runWindowsOptions.js.map +1 -1
- package/lib-commonjs/e2etest/projectConfig.test.js +2 -1
- package/lib-commonjs/e2etest/projectConfig.test.js.map +1 -1
- package/lib-commonjs/generator-windows/index.js +2 -2
- package/lib-commonjs/generator-windows/index.js.map +1 -1
- package/lib-commonjs/utils/build.d.ts +2 -2
- package/lib-commonjs/utils/build.js.map +1 -1
- package/lib-commonjs/utils/deploy.d.ts +1 -1
- package/lib-commonjs/utils/deploy.js.map +1 -1
- package/lib-commonjs/utils/msbuildtools.js +3 -4
- package/lib-commonjs/utils/msbuildtools.js.map +1 -1
- package/lib-commonjs/utils/pathHelpers.d.ts +3 -0
- package/lib-commonjs/utils/pathHelpers.js +19 -1
- package/lib-commonjs/utils/pathHelpers.js.map +1 -1
- package/lib-commonjs/utils/telemetryHelpers.d.ts +1 -1
- package/lib-commonjs/utils/telemetryHelpers.js.map +1 -1
- package/package.json +11 -12
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
* @format
|
|
5
5
|
*/
|
|
6
6
|
import { Ora } from 'ora';
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
7
|
+
import { Command, Config, DependencyConfig, ProjectConfig } from '@react-native-community/cli-types';
|
|
8
|
+
import { AutoLinkOptions } from './autolinkWindowsOptions';
|
|
9
|
+
import { WindowsProjectConfig } from '../config/projectConfig';
|
|
10
10
|
export declare class AutoLinkWindows {
|
|
11
11
|
readonly projectConfig: ProjectConfig;
|
|
12
12
|
readonly dependenciesConfig: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autolinkWindows.js","sourceRoot":"","sources":["../../../src/commands/autolinkWindows/autolinkWindows.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\n// Types in this file are inaccurate compared to usage in terms of falsiness.\n// We should try to rewrite some of this to do automated schema validation to\n// guarantee correct types\n/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport fs from '@react-native-windows/fs';\nimport path from 'path';\nimport chalk from 'chalk';\nimport {performance} from 'perf_hooks';\nimport {XMLSerializer} from '@xmldom/xmldom';\nimport {Ora} from 'ora';\nconst formatter = require('xml-formatter');\n\nimport type {\n Command,\n Config,\n DependencyConfig,\n ProjectConfig,\n} from '@react-native-community/cli-types';\nimport {Telemetry, CodedError} from '@react-native-windows/telemetry';\nimport type {AutoLinkOptions} from './autolinkWindowsOptions';\nimport {autolinkOptions} from './autolinkWindowsOptions';\n\nimport {\n newSpinner,\n setExitProcessWithError,\n} from '../../utils/commandWithProgress';\nimport * as vstools from '../../utils/vstools';\nimport * as generatorCommon from '../../generator-common';\nimport * as configUtils from '../config/configUtils';\nimport * as pathHelpers from '../../utils/pathHelpers';\nimport {\n getDefaultOptions,\n startTelemetrySession,\n endTelemetrySession,\n} from '../../utils/telemetryHelpers';\nimport type {\n WindowsDependencyConfig,\n ProjectDependency,\n} from '../config/dependencyConfig';\nimport type {Project, WindowsProjectConfig} from '../config/projectConfig';\n\nexport class AutoLinkWindows {\n private changesNecessary: boolean;\n protected windowsAppConfig: WindowsProjectConfig;\n\n public areChangesNeeded() {\n return this.changesNecessary;\n }\n\n private getWindowsConfig() {\n return this.windowsAppConfig;\n }\n\n private getSolutionFile() {\n return path.join(\n this.getWindowsConfig().folder,\n this.getWindowsConfig().sourceDir,\n this.getWindowsConfig().solutionFile,\n );\n }\n\n constructor(\n readonly projectConfig: ProjectConfig,\n readonly dependenciesConfig: {[key: string]: DependencyConfig},\n readonly options: AutoLinkOptions,\n ) {\n this.changesNecessary = false;\n if (\n !('windows' in this.projectConfig) ||\n this.projectConfig.windows === null\n ) {\n throw new CodedError(\n 'NoWindowsConfig',\n 'Windows auto-link only supported on Windows app projects',\n );\n }\n this.windowsAppConfig = projectConfig.windows;\n }\n\n public async run(spinner: Ora) {\n const verbose = this.options.logging;\n\n verboseMessage('', verbose);\n verboseMessage('Parsing project...', verbose);\n\n const rnwRoot = resolveRnwRoot(this.windowsAppConfig);\n const templateRoot = resolveTemplateRoot(this.windowsAppConfig);\n\n this.fixUpForSlnOption();\n this.fixUpForProjOption();\n\n verboseMessage('Found Windows app project, config:', verbose);\n verboseMessage(this.windowsAppConfig, verbose);\n\n this.validateRequiredAppProperties();\n\n const solutionFile = this.getSolutionFile();\n\n const windowsAppProjectConfig = this.windowsAppConfig.project;\n\n this.validateRequiredProjectProperties();\n\n const projectFile = this.getProjectFile();\n\n const projectDir = path.dirname(projectFile);\n const projectLang = windowsAppProjectConfig.projectLang!;\n\n verboseMessage('Parsing dependencies...', verbose);\n\n this.changesNecessary =\n (await this.ensureXAMLDialect()) || this.changesNecessary;\n\n // Generating cs/cpp files for app code consumption\n if (projectLang === 'cs') {\n this.changesNecessary =\n (await this.generateCSAutolinking(templateRoot, projectDir)) ||\n this.changesNecessary;\n } else if (projectLang === 'cpp') {\n this.changesNecessary =\n (await this.generateCppAutolinking(templateRoot, projectDir)) ||\n this.changesNecessary;\n }\n\n // Generating props for app project consumption\n let propertiesForProps = '';\n let csModuleNames: string[] = [];\n\n if (projectLang === 'cpp') {\n csModuleNames = this.getCSModules();\n\n if (csModuleNames.length > 0) {\n propertiesForProps += `\n <!-- Set due to dependency on C# module(s): ${csModuleNames.join()} -->\n <ConsumeCSharpModules Condition=\"'$(ConsumeCSharpModules)'==''\">true</ConsumeCSharpModules>`;\n }\n }\n\n this.changesNecessary =\n (await this.generateAutolinkProps(\n templateRoot,\n projectDir,\n propertiesForProps,\n )) || this.changesNecessary;\n\n // Generating targets for app project consumption\n this.changesNecessary =\n (await this.generateAutolinkTargets(projectDir, templateRoot)) ||\n this.changesNecessary;\n\n // Generating project entries for solution\n this.changesNecessary =\n this.updateSolution(rnwRoot, solutionFile) || this.changesNecessary;\n\n spinner.succeed();\n }\n\n /**\n * Handles the --proj command-line option by consuming its value into the windowsAppConfig\n */\n public fixUpForProjOption() {\n if (this.options.proj) {\n const projFile = path.join(\n this.windowsAppConfig.folder,\n this.options.proj,\n );\n\n const projectContents = configUtils.readProjectFile(projFile);\n\n this.windowsAppConfig.project = {\n projectFile: path.relative(\n path.join(\n this.windowsAppConfig.folder,\n this.windowsAppConfig.sourceDir,\n ),\n projFile,\n ),\n projectName: configUtils.getProjectName(projFile, projectContents),\n projectLang: configUtils.getProjectLanguage(projFile),\n projectGuid: configUtils.getProjectGuid(projectContents),\n };\n }\n }\n\n /**\n * Handles the --sln command-line option by consuming its value into the windowsAppConfig\n */\n public fixUpForSlnOption() {\n if (this.options.sln) {\n const slnFile = path.join(this.windowsAppConfig.folder, this.options.sln);\n this.windowsAppConfig.solutionFile = path.relative(\n path.join(\n this.windowsAppConfig.folder,\n this.windowsAppConfig.sourceDir,\n ),\n slnFile,\n );\n }\n }\n\n /** Validates the all of the required app (solution) properties are present and valid */\n public validateRequiredAppProperties() {\n const alwaysRequired: Array<keyof WindowsProjectConfig> = [\n 'folder',\n 'sourceDir',\n 'solutionFile',\n 'project',\n ];\n\n alwaysRequired.forEach(item => {\n if (\n !(item in this.windowsAppConfig) ||\n this.windowsAppConfig[item] === null\n ) {\n throw new CodedError(\n 'IncompleteConfig',\n `${item} is required but not specified by @react-native-community/cli config`,\n {item: item},\n );\n } else if (\n typeof this.windowsAppConfig[item] === 'string' &&\n (this.windowsAppConfig[item] as string).startsWith('Error: ')\n ) {\n throw new CodedError(\n 'InvalidConfig',\n `${item} invalid. ${this.windowsAppConfig[item]}`,\n {item: item},\n );\n }\n });\n }\n\n /** @return the full path to the project file (.vcxproj or .csproj) */\n private getProjectFile() {\n const windowsAppConfig = this.getWindowsConfig();\n return path.join(\n windowsAppConfig.folder,\n windowsAppConfig.sourceDir,\n windowsAppConfig.project.projectFile,\n );\n }\n\n /** Validates that all of the required app _project_ properties are present and valid */\n public validateRequiredProjectProperties() {\n const windowsAppProjectConfig = this.windowsAppConfig.project;\n const projectRequired: Array<keyof Project> = [\n 'projectFile',\n 'projectName',\n 'projectLang',\n 'projectGuid',\n ];\n\n projectRequired.forEach(item => {\n if (\n !(item in windowsAppProjectConfig) ||\n windowsAppProjectConfig[item] === null\n ) {\n throw new CodedError(\n 'IncompleteConfig',\n `project.${item} is required but not specified by @react-native-community/cli config`,\n {item: item},\n );\n } else if (\n typeof windowsAppProjectConfig[item] === 'string' &&\n windowsAppProjectConfig[item]!.startsWith('Error: ')\n ) {\n throw new CodedError(\n 'InvalidConfig',\n `project.${item} invalid. ${windowsAppProjectConfig[item]}`,\n {item: item},\n );\n }\n });\n }\n\n private getAutolinkTemplateFile(\n templateRoot: string,\n targetFile: string,\n ): string {\n if (templateRoot.endsWith('\\\\template')) {\n // Old template split into different folders\n switch (path.extname(targetFile)) {\n case '.cpp':\n case '.h':\n templateRoot = path.join(templateRoot, 'cpp-app', 'src');\n break;\n case '.cs':\n templateRoot = path.join(templateRoot, 'cs-app', 'src');\n break;\n case '.props':\n case '.targets':\n default:\n templateRoot = path.join(templateRoot, 'shared-app', 'src');\n break;\n }\n } else {\n // New template with projected layout\n templateRoot = path.join(templateRoot, 'windows', 'MyApp');\n }\n\n return path.join(templateRoot, targetFile);\n }\n\n private async generateCppAutolinking(\n templateRoot: string,\n projectDir: string,\n ) {\n const {cppPackageProviders, cppIncludes} = this.getCppReplacements();\n\n const cppFileName = 'AutolinkedNativeModules.g.cpp';\n const headerFileName = 'AutolinkedNativeModules.g.h';\n\n const srcCppFile = this.getAutolinkTemplateFile(templateRoot, cppFileName);\n const srcHeaderFile = this.getAutolinkTemplateFile(\n templateRoot,\n headerFileName,\n );\n\n const destCppFile = path.join(projectDir, cppFileName);\n const destHeaderFile = path.join(projectDir, headerFileName);\n\n verboseMessage(\n `Calculating ${chalk.bold(path.basename(destCppFile))}...`,\n this.options.logging,\n );\n\n const cppContents = generatorCommon.resolveContents(srcCppFile, {\n useMustache: true,\n autolinkCppIncludes: cppIncludes,\n autolinkCppPackageProviders: cppPackageProviders,\n });\n\n const cppChanged = await this.updateFile(destCppFile, cppContents);\n\n verboseMessage(\n `Calculating ${chalk.bold(path.basename(destHeaderFile))}...`,\n this.options.logging,\n );\n\n const headerContents = generatorCommon.resolveContents(srcHeaderFile, {\n useMustache: true,\n autolinkCppIncludes: cppIncludes,\n autolinkCppPackageProviders: cppPackageProviders,\n });\n\n const headerChanged = await this.updateFile(destHeaderFile, headerContents);\n\n return cppChanged || headerChanged;\n }\n\n public getCppReplacements() {\n let cppIncludes = '';\n let cppPackageProviders = '';\n const windowsDependencies = this.getWindowsDependencies();\n\n for (const dependencyName of Object.keys(windowsDependencies)) {\n windowsDependencies[dependencyName].projects.forEach(project => {\n if (project.directDependency) {\n cppIncludes += `\\n\\n// Includes from ${dependencyName}`;\n project.cppHeaders.forEach(header => {\n cppIncludes += `\\n#include <${header}>`;\n });\n\n cppPackageProviders += `\\n // IReactPackageProviders from ${dependencyName}`;\n project.cppPackageProviders.forEach(packageProvider => {\n cppPackageProviders += `\\n packageProviders.Append(winrt::${packageProvider}());`;\n });\n }\n });\n }\n\n if (cppPackageProviders === '') {\n // There are no windows dependencies, this would result in warning. C4100: 'packageProviders': unreferenced formal parameter.\n // therefore add a usage.\n cppPackageProviders = '\\n UNREFERENCED_PARAMETER(packageProviders);'; // CODESYNC: @react-native-windows\\cli\\src\\generator-windows\\index.ts\n }\n return {cppPackageProviders, cppIncludes};\n }\n\n private async generateCSAutolinking(\n templateRoot: string,\n projectDir: string,\n ) {\n const {csUsingNamespaces, csReactPackageProviders} =\n this.getCsReplacements();\n\n const csFileName = 'AutolinkedNativeModules.g.cs';\n\n const srcCsFile = this.getAutolinkTemplateFile(templateRoot, csFileName);\n\n const destCsFile = path.join(projectDir, csFileName);\n\n verboseMessage(\n `Calculating ${chalk.bold(path.basename(destCsFile))}...`,\n this.options.logging,\n );\n\n const csContents = generatorCommon.resolveContents(srcCsFile, {\n useMustache: true,\n autolinkCsUsingNamespaces: csUsingNamespaces,\n autolinkCsReactPackageProviders: csReactPackageProviders,\n });\n\n return await this.updateFile(destCsFile, csContents);\n }\n\n public getCsReplacements() {\n let csUsingNamespaces = '';\n let csReactPackageProviders = '';\n\n const windowsDependencies = this.getWindowsDependencies();\n for (const dependencyName of Object.keys(windowsDependencies)) {\n windowsDependencies[dependencyName].projects.forEach(project => {\n if (project.directDependency) {\n csUsingNamespaces += `\\n\\n// Namespaces from ${dependencyName}`;\n project.csNamespaces.forEach(namespace => {\n csUsingNamespaces += `\\nusing ${namespace};`;\n });\n\n csReactPackageProviders += `\\n // IReactPackageProviders from ${dependencyName}`;\n project.csPackageProviders.forEach(packageProvider => {\n csReactPackageProviders += `\\n packageProviders.Add(new ${packageProvider}());`;\n });\n }\n });\n }\n return {csUsingNamespaces, csReactPackageProviders};\n }\n\n /** Cache of dependencies */\n private windowsDependencies:\n | Record<string, WindowsDependencyConfig>\n | undefined;\n\n private getWindowsDependencies() {\n if (!this.windowsDependencies) {\n this.windowsDependencies = {};\n for (const dependencyName of Object.keys(this.dependenciesConfig)) {\n const windowsDependency: WindowsDependencyConfig | undefined =\n this.dependenciesConfig[dependencyName].platforms.windows;\n\n if (windowsDependency) {\n verboseMessage(\n `${chalk.bold(dependencyName)} has Windows implementation, config:`,\n this.options.logging,\n );\n verboseMessage(windowsDependency, this.options.logging);\n\n let dependencyIsValid = false;\n\n const hasValidSourceDir =\n 'sourceDir' in windowsDependency &&\n windowsDependency.sourceDir !== undefined &&\n !windowsDependency.sourceDir.startsWith('Error: ');\n\n const hasProjectsInProjectsArray =\n 'projects' in windowsDependency &&\n Array.isArray(windowsDependency.projects) &&\n windowsDependency.projects.length > 0;\n\n if (hasValidSourceDir && hasProjectsInProjectsArray) {\n // Module is source-based and has projects\n dependencyIsValid = true;\n\n // Validate each source project\n windowsDependency.projects.forEach(project => {\n const itemsToCheck: Array<keyof ProjectDependency> = [\n 'projectFile',\n 'directDependency',\n ];\n itemsToCheck.forEach(item => {\n dependencyIsValid = !!(\n dependencyIsValid &&\n item in project &&\n project[item] !== '' &&\n !project[item]!.toString().startsWith('Error: ')\n );\n });\n });\n }\n\n if (dependencyIsValid) {\n verboseMessage(\n `Adding ${chalk.bold(dependencyName)}.`,\n this.options.logging,\n );\n this.windowsDependencies[dependencyName] = windowsDependency;\n } else {\n verboseMessage(\n `Invalid dependency configuration for dependency ${dependencyName}`,\n this.options.logging,\n );\n }\n }\n }\n }\n return this.windowsDependencies;\n }\n\n /**\n * Updates the target file with the expected contents if it's different.\n * @param filePath Path to the target file to update.\n * @param expectedContents The expected contents of the file.\n * @return Whether any changes were necessary.\n */\n protected async updateFile(filePath: string, expectedContents: string) {\n const fileName = chalk.bold(path.basename(filePath));\n verboseMessage(`Reading ${fileName}...`, this.options.logging);\n const actualContents = fs.existsSync(filePath)\n ? (await fs.readFile(filePath)).toString()\n : '';\n\n const contentsChanged = expectedContents !== actualContents;\n\n if (contentsChanged) {\n verboseMessage(\n chalk.yellow(`${fileName} needs to be updated.`),\n this.options.logging,\n );\n if (!this.options.check) {\n verboseMessage(`Writing ${fileName}...`, this.options.logging);\n await fs.writeFile(filePath, expectedContents, {\n encoding: 'utf8',\n flag: 'w',\n });\n }\n } else {\n verboseMessage(`No changes to ${fileName}.`, this.options.logging);\n }\n\n return contentsChanged;\n }\n\n private async generateAutolinkTargets(\n projectDir: string,\n templateRoot: string,\n ) {\n let projectReferencesForTargets = '';\n\n const windowsDependencies = this.getWindowsDependencies();\n for (const dependencyName of Object.keys(windowsDependencies)) {\n windowsDependencies[dependencyName].projects.forEach(project => {\n if (project.directDependency) {\n const dependencyProjectFile = path.join(\n windowsDependencies[dependencyName].folder,\n windowsDependencies[dependencyName].sourceDir!,\n project.projectFile,\n );\n\n const relDependencyProjectFile = path.relative(\n projectDir,\n dependencyProjectFile,\n );\n\n projectReferencesForTargets += `\n <!-- Projects from ${dependencyName} -->\n <ProjectReference Include=\"$(ProjectDir)${relDependencyProjectFile}\">\n <Project>${project.projectGuid}</Project>\n </ProjectReference>`;\n }\n });\n }\n\n const targetFileName = 'AutolinkedNativeModules.g.targets';\n\n const srcTargetFile = this.getAutolinkTemplateFile(\n templateRoot,\n targetFileName,\n );\n\n const destTargetFile = path.join(projectDir, targetFileName);\n\n verboseMessage(\n `Calculating ${chalk.bold(path.basename(destTargetFile))}...`,\n this.options.logging,\n );\n\n const targetContents = generatorCommon.resolveContents(srcTargetFile, {\n useMustache: true,\n autolinkProjectReferencesForTargets: projectReferencesForTargets,\n });\n\n return await this.updateFile(destTargetFile, targetContents);\n }\n\n private async generateAutolinkProps(\n templateRoot: string,\n projectDir: string,\n propertiesForProps: string,\n ) {\n const propsFileName = 'AutolinkedNativeModules.g.props';\n\n const srcPropsFile = this.getAutolinkTemplateFile(\n templateRoot,\n propsFileName,\n );\n\n const destPropsFile = path.join(projectDir, propsFileName);\n\n verboseMessage(\n `Calculating ${chalk.bold(path.basename(destPropsFile))}...`,\n this.options.logging,\n );\n\n const propsContents = generatorCommon.resolveContents(srcPropsFile, {\n useMustache: true,\n autolinkPropertiesForProps: propertiesForProps,\n });\n\n return await this.updateFile(destPropsFile, propsContents);\n }\n\n private getCSModules() {\n const csModuleNames: string[] = [];\n const windowsDependencies = this.getWindowsDependencies();\n for (const dependencyName of Object.keys(windowsDependencies)) {\n windowsDependencies[dependencyName].projects.forEach(project => {\n if (project.directDependency && project.projectLang === 'cs') {\n csModuleNames.push(project.projectName);\n }\n });\n }\n return csModuleNames;\n }\n\n private updateSolution(rnwRoot: string, solutionFile: string) {\n const projectsForSolution: Project[] = [];\n const windowsDependencies = this.getWindowsDependencies();\n\n for (const dependencyName of Object.keys(windowsDependencies)) {\n // Process dependency projects\n windowsDependencies[dependencyName].projects.forEach(project => {\n const dependencyProjectFile = path.join(\n windowsDependencies[dependencyName].folder,\n windowsDependencies[dependencyName].sourceDir!,\n project.projectFile,\n );\n\n projectsForSolution.push({\n projectFile: dependencyProjectFile,\n projectName: project.projectName,\n projectLang: project.projectLang,\n projectGuid: project.projectGuid,\n });\n });\n }\n\n const csModuleNames = this.getCSModules();\n if (csModuleNames.length > 0) {\n // Add managed projects\n projectsForSolution.push({\n projectFile: path.join(\n rnwRoot,\n 'Microsoft.ReactNative.Managed/Microsoft.ReactNative.Managed.csproj',\n ),\n projectName: 'Microsoft.ReactNative.Managed',\n projectLang: 'cs',\n projectGuid: '{F2824844-CE15-4242-9420-308923CD76C3}',\n });\n projectsForSolution.push({\n projectFile: path.join(\n rnwRoot,\n 'Microsoft.ReactNative.Managed.CodeGen//Microsoft.ReactNative.Managed.CodeGen.csproj',\n ),\n projectName: 'Microsoft.ReactNative.Managed.CodeGen',\n projectLang: 'cs',\n projectGuid: '{ADED4FBE-887D-4271-AF24-F0823BCE7961}',\n projectTypeGuid: vstools.dotNetCoreProjectTypeGuid,\n });\n }\n\n verboseMessage(\n `Calculating ${chalk.bold(path.basename(solutionFile))} changes...`,\n this.options.logging,\n );\n\n let changesNecessary = false;\n projectsForSolution.forEach(project => {\n const contentsChanged = vstools.addProjectToSolution(\n solutionFile,\n project,\n this.options.logging,\n this.options.check,\n );\n changesNecessary = changesNecessary || contentsChanged;\n });\n return changesNecessary;\n }\n\n protected getExperimentalFeaturesPropsXml() {\n const experimentalFeaturesProps = path.join(\n path.dirname(this.getSolutionFile()),\n 'ExperimentalFeatures.props',\n );\n if (fs.existsSync(experimentalFeaturesProps)) {\n const experimentalFeaturesContents = configUtils.readProjectFile(\n experimentalFeaturesProps,\n );\n return {\n path: experimentalFeaturesProps,\n content: experimentalFeaturesContents,\n };\n }\n return undefined;\n }\n\n public async ensureXAMLDialect() {\n let changesNeeded = false;\n const useWinUI3FromConfig = this.getWindowsConfig().useWinUI3;\n const experimentalFeatures = this.getExperimentalFeaturesPropsXml();\n if (experimentalFeatures) {\n const useWinUI3FromExperimentalFeatures =\n configUtils\n .tryFindPropertyValue(experimentalFeatures.content, 'UseWinUI3')\n ?.toLowerCase() === 'true';\n // Check if WinUI2xVersion is specified in experimental features\n const targetWinUI2xVersion = configUtils.tryFindPropertyValue(\n experimentalFeatures.content,\n 'WinUI2xVersion',\n );\n // Check if WinUI3Version is specified in experimental features\n const targetWinUI3xVersion = configUtils.tryFindPropertyValue(\n experimentalFeatures.content,\n 'WinUI3Version',\n );\n // Use the UseWinUI3 value in react-native.config.js, or if not present, the value from ExperimentalFeatures.props\n changesNeeded = await this.updatePackagesConfigXAMLDialect(\n useWinUI3FromConfig !== undefined\n ? useWinUI3FromConfig\n : useWinUI3FromExperimentalFeatures,\n targetWinUI2xVersion,\n targetWinUI3xVersion,\n );\n if (useWinUI3FromConfig !== undefined) {\n // Make sure ExperimentalFeatures.props matches the value that comes from react-native.config.js\n const node =\n experimentalFeatures.content.getElementsByTagName('UseWinUI3');\n const newValue = useWinUI3FromConfig ? 'true' : 'false';\n changesNeeded = node.item(0)?.textContent !== newValue || changesNeeded;\n if (!this.options.check && changesNeeded) {\n node.item(0)!.textContent = newValue;\n const experimentalFeaturesOutput =\n new XMLSerializer().serializeToString(experimentalFeatures.content);\n await this.updateFile(\n experimentalFeatures.path,\n experimentalFeaturesOutput,\n );\n }\n }\n }\n return changesNeeded;\n }\n\n protected getPackagesConfigXml() {\n const projectFile = this.getProjectFile();\n const packagesConfig = path.join(\n path.dirname(projectFile),\n 'packages.config',\n );\n\n if (fs.existsSync(packagesConfig)) {\n return {\n path: packagesConfig,\n content: configUtils.readProjectFile(packagesConfig),\n };\n }\n return undefined;\n }\n\n private async updatePackagesConfigXAMLDialect(\n useWinUI3: boolean,\n targetWinUI2xVersion: string | null,\n targetWinUI3xVersion: string | null,\n ) {\n let changed = false;\n const packagesConfig = this.getPackagesConfigXml();\n if (packagesConfig) {\n // if we don't have a packages.config, then this is a C# project, in which case we use <PackageReference> and dynamically pick the right XAML package.\n const project = this.getWindowsConfig();\n\n const winUIPropsPath = path.join(\n resolveRnwRoot(project),\n 'PropertySheets/WinUI.props',\n );\n const winuiPropsContents = configUtils.readProjectFile(winUIPropsPath);\n\n // Use the given WinUI2xVersion, otherwise fallback to WinUI.props\n const winui2xVersion =\n targetWinUI2xVersion ??\n configUtils.tryFindPropertyValue(winuiPropsContents, 'WinUI2xVersion');\n\n // Use the given WinUI3Version, otherwise fallback to WinUI.props\n const winui3Version =\n targetWinUI3xVersion ??\n configUtils.tryFindPropertyValue(winuiPropsContents, 'WinUI3Version');\n\n const dialects = [\n {id: 'Microsoft.WindowsAppSDK', version: winui3Version!},\n {id: 'Microsoft.UI.Xaml', version: winui2xVersion!},\n ];\n const keepPkg = useWinUI3 ? dialects[0] : dialects[1];\n const removePkg = useWinUI3 ? dialects[1] : dialects[0];\n\n changed = this.updatePackagesConfig(\n packagesConfig,\n [removePkg],\n [keepPkg],\n );\n\n if (!this.options.check && changed) {\n const serializer = new XMLSerializer();\n const output = serializer.serializeToString(packagesConfig.content);\n const formattedXml = formatter(output, {indentation: ' '});\n await this.updateFile(packagesConfig.path, formattedXml);\n }\n }\n return changed;\n }\n\n private updatePackagesConfig(\n packagesConfig: {path: string; content: Document},\n removePkgs: {id: string; version: string}[],\n keepPkgs: {id: string; version: string}[],\n ) {\n let changed = false;\n const packageElements =\n packagesConfig.content.documentElement.getElementsByTagName('package');\n\n const nodesToRemove: Element[] = [];\n\n for (let i = 0; i < packageElements.length; i++) {\n const packageElement = packageElements.item(i)!;\n const idAttr = packageElement!.getAttributeNode('id');\n const id = idAttr!.value;\n const keepPkg = keepPkgs.find(pkg => pkg.id === id);\n if (removePkgs.find(pkg => pkg.id === id)) {\n nodesToRemove.push(packageElement);\n changed = true;\n } else if (keepPkg) {\n changed =\n changed || keepPkg.version !== packageElement.getAttribute('version');\n packageElement.setAttribute('version', keepPkg.version!);\n keepPkgs = keepPkgs.filter(pkg => pkg.id !== keepPkg.id);\n }\n }\n\n nodesToRemove.forEach(pkg =>\n packagesConfig.content.documentElement.removeChild(pkg),\n );\n\n keepPkgs.forEach(keepPkg => {\n const newPkg = packagesConfig.content.createElement('package');\n\n Object.entries(keepPkg).forEach(([attr, value]) => {\n newPkg.setAttribute(attr, value as string);\n });\n newPkg.setAttribute('targetFramework', 'native');\n packagesConfig.content.documentElement.appendChild(newPkg);\n changed = true;\n });\n return changed;\n }\n\n /** @return The CLI command to invoke autolink-windows independently */\n public getAutolinkWindowsCommand() {\n const folder = this.windowsAppConfig.folder;\n\n const autolinkCommand = 'npx @react-native-community/cli autolink-windows';\n const autolinkArgs = `--sln \"${path.relative(\n folder,\n this.getSolutionFile(),\n )}\" --proj \"${path.relative(folder, this.getProjectFile())}\"`;\n return `${autolinkCommand} ${autolinkArgs}`;\n }\n}\n\n/**\n * Locates the react-native-windows directory\n * @param config project configuration\n */\nfunction resolveRnwRoot(projectConfig: WindowsProjectConfig) {\n return pathHelpers.resolveRnwRoot(projectConfig.folder);\n}\n\n/**\n * Locates the react-native-windows directory containing template files\n * @param config project configuration\n */\nfunction resolveTemplateRoot(projectConfig: WindowsProjectConfig) {\n const rnwPackage = resolveRnwRoot(projectConfig);\n const template = projectConfig.rnwConfig?.['init-windows']?.template as\n | string\n | undefined;\n\n // For new templates, return the template's root path\n if (template && !template.startsWith('old/')) {\n return path.join(rnwPackage, 'templates', template);\n }\n\n // For old (unknown templates) fall back to old behavior\n return path.join(rnwPackage, 'template');\n}\n\n/**\n * Logs the given message if verbose is True.\n * @param message The message to log.\n * @param verbose Whether or not verbose logging is enabled.\n */\nfunction verboseMessage(message: any, verbose?: boolean) {\n if (verbose) {\n console.log(message);\n }\n}\n\n/**\n * Sanitizes the given option for telemetry.\n * @param key The key of the option.\n * @param value The unsanitized value of the option.\n * @returns The sanitized value of the option.\n */\nfunction optionSanitizer(key: keyof AutoLinkOptions, value: any): any {\n // Do not add a default case here.\n // Strings risking PII should just return true if present, false otherwise.\n // All others should return the value (or false if undefined).\n switch (key) {\n case 'sln':\n case 'proj':\n return value === undefined ? false : true; // Strip PII\n case 'logging':\n case 'check':\n case 'telemetry':\n return value === undefined ? false : value; // Return value\n }\n}\n\n/**\n * Get the extra props to add to the `autolink-windows` telemetry event.\n * @returns The extra props.\n */\nasync function getExtraProps(): Promise<Record<string, any>> {\n const extraProps: Record<string, any> = {};\n return extraProps;\n}\n\n/**\n * The function run when calling `npx @react-native-community/cli autolink-windows`.\n * @param args Unprocessed args passed from react-native CLI.\n * @param config Config passed from react-native CLI.\n * @param options Options passed from react-native CLI.\n */\nasync function autolinkWindows(\n args: string[],\n config: Config,\n options: AutoLinkOptions,\n) {\n await startTelemetrySession(\n 'autolink-windows',\n config,\n options,\n getDefaultOptions(config, autolinkOptions),\n optionSanitizer,\n );\n\n let autolinkWindowsError: Error | undefined;\n try {\n await autolinkWindowsInternal(args, config, options);\n } catch (ex) {\n autolinkWindowsError =\n ex instanceof Error ? (ex as Error) : new Error(String(ex));\n Telemetry.trackException(autolinkWindowsError);\n }\n\n await endTelemetrySession(autolinkWindowsError, getExtraProps);\n setExitProcessWithError(options.logging, autolinkWindowsError);\n}\n\n/**\n * Performs auto-linking for RNW native modules and apps.\n * @param args Unprocessed args passed from react-native CLI.\n * @param config Config passed from react-native CLI.\n * @param options Options passed from react-native CLI.\n */\nexport async function autolinkWindowsInternal(\n args: string[],\n config: Config,\n options: AutoLinkOptions,\n) {\n const startTime = performance.now();\n const spinner = newSpinner(\n options.check ? 'Checking auto-linked files...' : 'Auto-linking...',\n );\n try {\n const autolink = new AutoLinkWindows(\n config.project,\n config.dependencies,\n options,\n );\n await autolink.run(spinner);\n const endTime = performance.now();\n\n if (!autolink.areChangesNeeded()) {\n console.log(\n `${chalk.green(\n 'Success:',\n )} No auto-linking changes necessary. (${Math.round(\n endTime - startTime,\n )}ms)`,\n );\n } else if (options.check) {\n const autolinkCommand = autolink.getAutolinkWindowsCommand();\n console.log(\n `${chalk.yellow(\n 'Warning:',\n )} Auto-linking changes were necessary but ${chalk.bold(\n '--check',\n )} specified. Run '${chalk.bold(\n `${autolinkCommand}`,\n )}' to apply the changes. (${Math.round(endTime - startTime)}ms)`,\n );\n throw new CodedError(\n 'NeedAutolinking',\n `Auto-linking changes were necessary but --check was specified. Run '${autolinkCommand}' to apply the changes`,\n );\n } else {\n console.log(\n `${chalk.green(\n 'Success:',\n )} Auto-linking changes completed. (${Math.round(\n endTime - startTime,\n )}ms)`,\n );\n }\n } catch (e) {\n spinner.fail();\n const endTime = performance.now();\n console.log(\n `${chalk.red('Error:')} ${(e as any).toString()}. (${Math.round(\n endTime - startTime,\n )}ms)`,\n );\n throw e;\n }\n}\n\n/**\n * Performs auto-linking for RNW native modules and apps.\n */\nexport const autolinkCommand: Command = {\n name: 'autolink-windows',\n description: 'Runs Windows-specific autolinking for your RNW project',\n func: autolinkWindows,\n options: autolinkOptions,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"autolinkWindows.js","sourceRoot":"","sources":["../../../src/commands/autolinkWindows/autolinkWindows.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\n// Types in this file are inaccurate compared to usage in terms of falsiness.\n// We should try to rewrite some of this to do automated schema validation to\n// guarantee correct types\n/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport fs from '@react-native-windows/fs';\nimport path from 'path';\nimport chalk from 'chalk';\nimport {performance} from 'perf_hooks';\nimport {XMLSerializer} from '@xmldom/xmldom';\nimport {Ora} from 'ora';\nconst formatter = require('xml-formatter');\n\nimport {\n Command,\n Config,\n DependencyConfig,\n ProjectConfig,\n} from '@react-native-community/cli-types';\nimport {Telemetry, CodedError} from '@react-native-windows/telemetry';\nimport {AutoLinkOptions, autolinkOptions} from './autolinkWindowsOptions';\n\nimport {\n newSpinner,\n setExitProcessWithError,\n} from '../../utils/commandWithProgress';\nimport * as vstools from '../../utils/vstools';\nimport * as generatorCommon from '../../generator-common';\nimport * as configUtils from '../config/configUtils';\nimport * as pathHelpers from '../../utils/pathHelpers';\nimport {\n getDefaultOptions,\n startTelemetrySession,\n endTelemetrySession,\n} from '../../utils/telemetryHelpers';\nimport {\n WindowsDependencyConfig,\n ProjectDependency,\n} from '../config/dependencyConfig';\nimport {Project, WindowsProjectConfig} from '../config/projectConfig';\n\nexport class AutoLinkWindows {\n private changesNecessary: boolean;\n protected windowsAppConfig: WindowsProjectConfig;\n\n public areChangesNeeded() {\n return this.changesNecessary;\n }\n\n private getWindowsConfig() {\n return this.windowsAppConfig;\n }\n\n private getSolutionFile() {\n return path.join(\n this.getWindowsConfig().folder,\n this.getWindowsConfig().sourceDir,\n this.getWindowsConfig().solutionFile,\n );\n }\n\n constructor(\n readonly projectConfig: ProjectConfig,\n readonly dependenciesConfig: {[key: string]: DependencyConfig},\n readonly options: AutoLinkOptions,\n ) {\n this.changesNecessary = false;\n if (\n !('windows' in this.projectConfig) ||\n this.projectConfig.windows === null\n ) {\n throw new CodedError(\n 'NoWindowsConfig',\n 'Windows auto-link only supported on Windows app projects',\n );\n }\n this.windowsAppConfig = projectConfig.windows;\n }\n\n public async run(spinner: Ora) {\n const verbose = this.options.logging;\n\n verboseMessage('', verbose);\n verboseMessage('Parsing project...', verbose);\n\n const rnwRoot = resolveRnwRoot(this.windowsAppConfig);\n const templateRoot = resolveTemplateRoot(this.windowsAppConfig);\n\n this.fixUpForSlnOption();\n this.fixUpForProjOption();\n\n verboseMessage('Found Windows app project, config:', verbose);\n verboseMessage(this.windowsAppConfig, verbose);\n\n this.validateRequiredAppProperties();\n\n const solutionFile = this.getSolutionFile();\n\n const windowsAppProjectConfig = this.windowsAppConfig.project;\n\n this.validateRequiredProjectProperties();\n\n const projectFile = this.getProjectFile();\n\n const projectDir = path.dirname(projectFile);\n const projectLang = windowsAppProjectConfig.projectLang!;\n\n verboseMessage('Parsing dependencies...', verbose);\n\n this.changesNecessary =\n (await this.ensureXAMLDialect()) || this.changesNecessary;\n\n // Generating cs/cpp files for app code consumption\n if (projectLang === 'cs') {\n this.changesNecessary =\n (await this.generateCSAutolinking(templateRoot, projectDir)) ||\n this.changesNecessary;\n } else if (projectLang === 'cpp') {\n this.changesNecessary =\n (await this.generateCppAutolinking(templateRoot, projectDir)) ||\n this.changesNecessary;\n }\n\n // Generating props for app project consumption\n let propertiesForProps = '';\n let csModuleNames: string[] = [];\n\n if (projectLang === 'cpp') {\n csModuleNames = this.getCSModules();\n\n if (csModuleNames.length > 0) {\n propertiesForProps += `\n <!-- Set due to dependency on C# module(s): ${csModuleNames.join()} -->\n <ConsumeCSharpModules Condition=\"'$(ConsumeCSharpModules)'==''\">true</ConsumeCSharpModules>`;\n }\n }\n\n this.changesNecessary =\n (await this.generateAutolinkProps(\n templateRoot,\n projectDir,\n propertiesForProps,\n )) || this.changesNecessary;\n\n // Generating targets for app project consumption\n this.changesNecessary =\n (await this.generateAutolinkTargets(projectDir, templateRoot)) ||\n this.changesNecessary;\n\n // Generating project entries for solution\n this.changesNecessary =\n this.updateSolution(rnwRoot, solutionFile) || this.changesNecessary;\n\n spinner.succeed();\n }\n\n /**\n * Handles the --proj command-line option by consuming its value into the windowsAppConfig\n */\n public fixUpForProjOption() {\n if (this.options.proj) {\n const projFile = path.join(\n this.windowsAppConfig.folder,\n this.options.proj,\n );\n\n const projectContents = configUtils.readProjectFile(projFile);\n\n this.windowsAppConfig.project = {\n projectFile: path.relative(\n path.join(\n this.windowsAppConfig.folder,\n this.windowsAppConfig.sourceDir,\n ),\n projFile,\n ),\n projectName: configUtils.getProjectName(projFile, projectContents),\n projectLang: configUtils.getProjectLanguage(projFile),\n projectGuid: configUtils.getProjectGuid(projectContents),\n };\n }\n }\n\n /**\n * Handles the --sln command-line option by consuming its value into the windowsAppConfig\n */\n public fixUpForSlnOption() {\n if (this.options.sln) {\n const slnFile = path.join(this.windowsAppConfig.folder, this.options.sln);\n this.windowsAppConfig.solutionFile = path.relative(\n path.join(\n this.windowsAppConfig.folder,\n this.windowsAppConfig.sourceDir,\n ),\n slnFile,\n );\n }\n }\n\n /** Validates the all of the required app (solution) properties are present and valid */\n public validateRequiredAppProperties() {\n const alwaysRequired: Array<keyof WindowsProjectConfig> = [\n 'folder',\n 'sourceDir',\n 'solutionFile',\n 'project',\n ];\n\n alwaysRequired.forEach(item => {\n if (\n !(item in this.windowsAppConfig) ||\n this.windowsAppConfig[item] === null\n ) {\n throw new CodedError(\n 'IncompleteConfig',\n `${item} is required but not specified by @react-native-community/cli config`,\n {item: item},\n );\n } else if (\n typeof this.windowsAppConfig[item] === 'string' &&\n (this.windowsAppConfig[item] as string).startsWith('Error: ')\n ) {\n throw new CodedError(\n 'InvalidConfig',\n `${item} invalid. ${this.windowsAppConfig[item]}`,\n {item: item},\n );\n }\n });\n }\n\n /** @return the full path to the project file (.vcxproj or .csproj) */\n private getProjectFile() {\n const windowsAppConfig = this.getWindowsConfig();\n return path.join(\n windowsAppConfig.folder,\n windowsAppConfig.sourceDir,\n windowsAppConfig.project.projectFile,\n );\n }\n\n /** Validates that all of the required app _project_ properties are present and valid */\n public validateRequiredProjectProperties() {\n const windowsAppProjectConfig = this.windowsAppConfig.project;\n const projectRequired: Array<keyof Project> = [\n 'projectFile',\n 'projectName',\n 'projectLang',\n 'projectGuid',\n ];\n\n projectRequired.forEach(item => {\n if (\n !(item in windowsAppProjectConfig) ||\n windowsAppProjectConfig[item] === null\n ) {\n throw new CodedError(\n 'IncompleteConfig',\n `project.${item} is required but not specified by @react-native-community/cli config`,\n {item: item},\n );\n } else if (\n typeof windowsAppProjectConfig[item] === 'string' &&\n windowsAppProjectConfig[item]!.startsWith('Error: ')\n ) {\n throw new CodedError(\n 'InvalidConfig',\n `project.${item} invalid. ${windowsAppProjectConfig[item]}`,\n {item: item},\n );\n }\n });\n }\n\n private getAutolinkTemplateFile(\n templateRoot: string,\n targetFile: string,\n ): string {\n if (templateRoot.endsWith('\\\\template')) {\n // Old template split into different folders\n switch (path.extname(targetFile)) {\n case '.cpp':\n case '.h':\n templateRoot = path.join(templateRoot, 'cpp-app', 'src');\n break;\n case '.cs':\n templateRoot = path.join(templateRoot, 'cs-app', 'src');\n break;\n case '.props':\n case '.targets':\n default:\n templateRoot = path.join(templateRoot, 'shared-app', 'src');\n break;\n }\n } else {\n // New template with projected layout\n templateRoot = path.join(templateRoot, 'windows', 'MyApp');\n }\n\n return path.join(templateRoot, targetFile);\n }\n\n private async generateCppAutolinking(\n templateRoot: string,\n projectDir: string,\n ) {\n const {cppPackageProviders, cppIncludes} = this.getCppReplacements();\n\n const cppFileName = 'AutolinkedNativeModules.g.cpp';\n const headerFileName = 'AutolinkedNativeModules.g.h';\n\n const srcCppFile = this.getAutolinkTemplateFile(templateRoot, cppFileName);\n const srcHeaderFile = this.getAutolinkTemplateFile(\n templateRoot,\n headerFileName,\n );\n\n const destCppFile = path.join(projectDir, cppFileName);\n const destHeaderFile = path.join(projectDir, headerFileName);\n\n verboseMessage(\n `Calculating ${chalk.bold(path.basename(destCppFile))}...`,\n this.options.logging,\n );\n\n const cppContents = generatorCommon.resolveContents(srcCppFile, {\n useMustache: true,\n autolinkCppIncludes: cppIncludes,\n autolinkCppPackageProviders: cppPackageProviders,\n });\n\n const cppChanged = await this.updateFile(destCppFile, cppContents);\n\n verboseMessage(\n `Calculating ${chalk.bold(path.basename(destHeaderFile))}...`,\n this.options.logging,\n );\n\n const headerContents = generatorCommon.resolveContents(srcHeaderFile, {\n useMustache: true,\n autolinkCppIncludes: cppIncludes,\n autolinkCppPackageProviders: cppPackageProviders,\n });\n\n const headerChanged = await this.updateFile(destHeaderFile, headerContents);\n\n return cppChanged || headerChanged;\n }\n\n public getCppReplacements() {\n let cppIncludes = '';\n let cppPackageProviders = '';\n const windowsDependencies = this.getWindowsDependencies();\n\n for (const dependencyName of Object.keys(windowsDependencies)) {\n windowsDependencies[dependencyName].projects.forEach(project => {\n if (project.directDependency) {\n cppIncludes += `\\n\\n// Includes from ${dependencyName}`;\n project.cppHeaders.forEach(header => {\n cppIncludes += `\\n#include <${header}>`;\n });\n\n cppPackageProviders += `\\n // IReactPackageProviders from ${dependencyName}`;\n project.cppPackageProviders.forEach(packageProvider => {\n cppPackageProviders += `\\n packageProviders.Append(winrt::${packageProvider}());`;\n });\n }\n });\n }\n\n if (cppPackageProviders === '') {\n // There are no windows dependencies, this would result in warning. C4100: 'packageProviders': unreferenced formal parameter.\n // therefore add a usage.\n cppPackageProviders = '\\n UNREFERENCED_PARAMETER(packageProviders);'; // CODESYNC: @react-native-windows\\cli\\src\\generator-windows\\index.ts\n }\n return {cppPackageProviders, cppIncludes};\n }\n\n private async generateCSAutolinking(\n templateRoot: string,\n projectDir: string,\n ) {\n const {csUsingNamespaces, csReactPackageProviders} =\n this.getCsReplacements();\n\n const csFileName = 'AutolinkedNativeModules.g.cs';\n\n const srcCsFile = this.getAutolinkTemplateFile(templateRoot, csFileName);\n\n const destCsFile = path.join(projectDir, csFileName);\n\n verboseMessage(\n `Calculating ${chalk.bold(path.basename(destCsFile))}...`,\n this.options.logging,\n );\n\n const csContents = generatorCommon.resolveContents(srcCsFile, {\n useMustache: true,\n autolinkCsUsingNamespaces: csUsingNamespaces,\n autolinkCsReactPackageProviders: csReactPackageProviders,\n });\n\n return await this.updateFile(destCsFile, csContents);\n }\n\n public getCsReplacements() {\n let csUsingNamespaces = '';\n let csReactPackageProviders = '';\n\n const windowsDependencies = this.getWindowsDependencies();\n for (const dependencyName of Object.keys(windowsDependencies)) {\n windowsDependencies[dependencyName].projects.forEach(project => {\n if (project.directDependency) {\n csUsingNamespaces += `\\n\\n// Namespaces from ${dependencyName}`;\n project.csNamespaces.forEach(namespace => {\n csUsingNamespaces += `\\nusing ${namespace};`;\n });\n\n csReactPackageProviders += `\\n // IReactPackageProviders from ${dependencyName}`;\n project.csPackageProviders.forEach(packageProvider => {\n csReactPackageProviders += `\\n packageProviders.Add(new ${packageProvider}());`;\n });\n }\n });\n }\n return {csUsingNamespaces, csReactPackageProviders};\n }\n\n /** Cache of dependencies */\n private windowsDependencies:\n | Record<string, WindowsDependencyConfig>\n | undefined;\n\n private getWindowsDependencies() {\n if (!this.windowsDependencies) {\n this.windowsDependencies = {};\n for (const dependencyName of Object.keys(this.dependenciesConfig)) {\n const windowsDependency: WindowsDependencyConfig | undefined =\n this.dependenciesConfig[dependencyName].platforms.windows;\n\n if (windowsDependency) {\n verboseMessage(\n `${chalk.bold(dependencyName)} has Windows implementation, config:`,\n this.options.logging,\n );\n verboseMessage(windowsDependency, this.options.logging);\n\n let dependencyIsValid = false;\n\n const hasValidSourceDir =\n 'sourceDir' in windowsDependency &&\n windowsDependency.sourceDir !== undefined &&\n !windowsDependency.sourceDir.startsWith('Error: ');\n\n const hasProjectsInProjectsArray =\n 'projects' in windowsDependency &&\n Array.isArray(windowsDependency.projects) &&\n windowsDependency.projects.length > 0;\n\n if (hasValidSourceDir && hasProjectsInProjectsArray) {\n // Module is source-based and has projects\n dependencyIsValid = true;\n\n // Validate each source project\n windowsDependency.projects.forEach(project => {\n const itemsToCheck: Array<keyof ProjectDependency> = [\n 'projectFile',\n 'directDependency',\n ];\n itemsToCheck.forEach(item => {\n dependencyIsValid = !!(\n dependencyIsValid &&\n item in project &&\n project[item] !== '' &&\n !project[item]!.toString().startsWith('Error: ')\n );\n });\n });\n }\n\n if (dependencyIsValid) {\n verboseMessage(\n `Adding ${chalk.bold(dependencyName)}.`,\n this.options.logging,\n );\n this.windowsDependencies[dependencyName] = windowsDependency;\n } else {\n verboseMessage(\n `Invalid dependency configuration for dependency ${dependencyName}`,\n this.options.logging,\n );\n }\n }\n }\n }\n return this.windowsDependencies;\n }\n\n /**\n * Updates the target file with the expected contents if it's different.\n * @param filePath Path to the target file to update.\n * @param expectedContents The expected contents of the file.\n * @return Whether any changes were necessary.\n */\n protected async updateFile(filePath: string, expectedContents: string) {\n const fileName = chalk.bold(path.basename(filePath));\n verboseMessage(`Reading ${fileName}...`, this.options.logging);\n const actualContents = fs.existsSync(filePath)\n ? (await fs.readFile(filePath)).toString()\n : '';\n\n const contentsChanged = expectedContents !== actualContents;\n\n if (contentsChanged) {\n verboseMessage(\n chalk.yellow(`${fileName} needs to be updated.`),\n this.options.logging,\n );\n if (!this.options.check) {\n verboseMessage(`Writing ${fileName}...`, this.options.logging);\n await fs.writeFile(filePath, expectedContents, {\n encoding: 'utf8',\n flag: 'w',\n });\n }\n } else {\n verboseMessage(`No changes to ${fileName}.`, this.options.logging);\n }\n\n return contentsChanged;\n }\n\n private async generateAutolinkTargets(\n projectDir: string,\n templateRoot: string,\n ) {\n let projectReferencesForTargets = '';\n\n const windowsDependencies = this.getWindowsDependencies();\n for (const dependencyName of Object.keys(windowsDependencies)) {\n windowsDependencies[dependencyName].projects.forEach(project => {\n if (project.directDependency) {\n const dependencyProjectFile = path.join(\n windowsDependencies[dependencyName].folder,\n windowsDependencies[dependencyName].sourceDir!,\n project.projectFile,\n );\n\n const relDependencyProjectFile = path.relative(\n projectDir,\n dependencyProjectFile,\n );\n\n projectReferencesForTargets += `\n <!-- Projects from ${dependencyName} -->\n <ProjectReference Include=\"$(ProjectDir)${relDependencyProjectFile}\">\n <Project>${project.projectGuid}</Project>\n </ProjectReference>`;\n }\n });\n }\n\n const targetFileName = 'AutolinkedNativeModules.g.targets';\n\n const srcTargetFile = this.getAutolinkTemplateFile(\n templateRoot,\n targetFileName,\n );\n\n const destTargetFile = path.join(projectDir, targetFileName);\n\n verboseMessage(\n `Calculating ${chalk.bold(path.basename(destTargetFile))}...`,\n this.options.logging,\n );\n\n const targetContents = generatorCommon.resolveContents(srcTargetFile, {\n useMustache: true,\n autolinkProjectReferencesForTargets: projectReferencesForTargets,\n });\n\n return await this.updateFile(destTargetFile, targetContents);\n }\n\n private async generateAutolinkProps(\n templateRoot: string,\n projectDir: string,\n propertiesForProps: string,\n ) {\n const propsFileName = 'AutolinkedNativeModules.g.props';\n\n const srcPropsFile = this.getAutolinkTemplateFile(\n templateRoot,\n propsFileName,\n );\n\n const destPropsFile = path.join(projectDir, propsFileName);\n\n verboseMessage(\n `Calculating ${chalk.bold(path.basename(destPropsFile))}...`,\n this.options.logging,\n );\n\n const propsContents = generatorCommon.resolveContents(srcPropsFile, {\n useMustache: true,\n autolinkPropertiesForProps: propertiesForProps,\n });\n\n return await this.updateFile(destPropsFile, propsContents);\n }\n\n private getCSModules() {\n const csModuleNames: string[] = [];\n const windowsDependencies = this.getWindowsDependencies();\n for (const dependencyName of Object.keys(windowsDependencies)) {\n windowsDependencies[dependencyName].projects.forEach(project => {\n if (project.directDependency && project.projectLang === 'cs') {\n csModuleNames.push(project.projectName);\n }\n });\n }\n return csModuleNames;\n }\n\n private updateSolution(rnwRoot: string, solutionFile: string) {\n const projectsForSolution: Project[] = [];\n const windowsDependencies = this.getWindowsDependencies();\n\n for (const dependencyName of Object.keys(windowsDependencies)) {\n // Process dependency projects\n windowsDependencies[dependencyName].projects.forEach(project => {\n const dependencyProjectFile = path.join(\n windowsDependencies[dependencyName].folder,\n windowsDependencies[dependencyName].sourceDir!,\n project.projectFile,\n );\n\n projectsForSolution.push({\n projectFile: dependencyProjectFile,\n projectName: project.projectName,\n projectLang: project.projectLang,\n projectGuid: project.projectGuid,\n });\n });\n }\n\n const csModuleNames = this.getCSModules();\n if (csModuleNames.length > 0) {\n // Add managed projects\n projectsForSolution.push({\n projectFile: path.join(\n rnwRoot,\n 'Microsoft.ReactNative.Managed/Microsoft.ReactNative.Managed.csproj',\n ),\n projectName: 'Microsoft.ReactNative.Managed',\n projectLang: 'cs',\n projectGuid: '{F2824844-CE15-4242-9420-308923CD76C3}',\n });\n projectsForSolution.push({\n projectFile: path.join(\n rnwRoot,\n 'Microsoft.ReactNative.Managed.CodeGen//Microsoft.ReactNative.Managed.CodeGen.csproj',\n ),\n projectName: 'Microsoft.ReactNative.Managed.CodeGen',\n projectLang: 'cs',\n projectGuid: '{ADED4FBE-887D-4271-AF24-F0823BCE7961}',\n projectTypeGuid: vstools.dotNetCoreProjectTypeGuid,\n });\n }\n\n verboseMessage(\n `Calculating ${chalk.bold(path.basename(solutionFile))} changes...`,\n this.options.logging,\n );\n\n let changesNecessary = false;\n projectsForSolution.forEach(project => {\n const contentsChanged = vstools.addProjectToSolution(\n solutionFile,\n project,\n this.options.logging,\n this.options.check,\n );\n changesNecessary = changesNecessary || contentsChanged;\n });\n return changesNecessary;\n }\n\n protected getExperimentalFeaturesPropsXml() {\n const experimentalFeaturesProps = path.join(\n path.dirname(this.getSolutionFile()),\n 'ExperimentalFeatures.props',\n );\n if (fs.existsSync(experimentalFeaturesProps)) {\n const experimentalFeaturesContents = configUtils.readProjectFile(\n experimentalFeaturesProps,\n );\n return {\n path: experimentalFeaturesProps,\n content: experimentalFeaturesContents,\n };\n }\n return undefined;\n }\n\n public async ensureXAMLDialect() {\n let changesNeeded = false;\n const useWinUI3FromConfig = this.getWindowsConfig().useWinUI3;\n const experimentalFeatures = this.getExperimentalFeaturesPropsXml();\n if (experimentalFeatures) {\n const useWinUI3FromExperimentalFeatures =\n configUtils\n .tryFindPropertyValue(experimentalFeatures.content, 'UseWinUI3')\n ?.toLowerCase() === 'true';\n // Check if WinUI2xVersion is specified in experimental features\n const targetWinUI2xVersion = configUtils.tryFindPropertyValue(\n experimentalFeatures.content,\n 'WinUI2xVersion',\n );\n // Check if WinUI3Version is specified in experimental features\n const targetWinUI3xVersion = configUtils.tryFindPropertyValue(\n experimentalFeatures.content,\n 'WinUI3Version',\n );\n // Use the UseWinUI3 value in react-native.config.js, or if not present, the value from ExperimentalFeatures.props\n changesNeeded = await this.updatePackagesConfigXAMLDialect(\n useWinUI3FromConfig !== undefined\n ? useWinUI3FromConfig\n : useWinUI3FromExperimentalFeatures,\n targetWinUI2xVersion,\n targetWinUI3xVersion,\n );\n if (useWinUI3FromConfig !== undefined) {\n // Make sure ExperimentalFeatures.props matches the value that comes from react-native.config.js\n const node =\n experimentalFeatures.content.getElementsByTagName('UseWinUI3');\n const newValue = useWinUI3FromConfig ? 'true' : 'false';\n changesNeeded = node.item(0)?.textContent !== newValue || changesNeeded;\n if (!this.options.check && changesNeeded) {\n node.item(0)!.textContent = newValue;\n const experimentalFeaturesOutput =\n new XMLSerializer().serializeToString(experimentalFeatures.content);\n await this.updateFile(\n experimentalFeatures.path,\n experimentalFeaturesOutput,\n );\n }\n }\n }\n return changesNeeded;\n }\n\n protected getPackagesConfigXml() {\n const projectFile = this.getProjectFile();\n const packagesConfig = path.join(\n path.dirname(projectFile),\n 'packages.config',\n );\n\n if (fs.existsSync(packagesConfig)) {\n return {\n path: packagesConfig,\n content: configUtils.readProjectFile(packagesConfig),\n };\n }\n return undefined;\n }\n\n private async updatePackagesConfigXAMLDialect(\n useWinUI3: boolean,\n targetWinUI2xVersion: string | null,\n targetWinUI3xVersion: string | null,\n ) {\n let changed = false;\n const packagesConfig = this.getPackagesConfigXml();\n if (packagesConfig) {\n // if we don't have a packages.config, then this is a C# project, in which case we use <PackageReference> and dynamically pick the right XAML package.\n const project = this.getWindowsConfig();\n\n const winUIPropsPath = path.join(\n resolveRnwRoot(project),\n 'PropertySheets/WinUI.props',\n );\n const winuiPropsContents = configUtils.readProjectFile(winUIPropsPath);\n\n // Use the given WinUI2xVersion, otherwise fallback to WinUI.props\n const winui2xVersion =\n targetWinUI2xVersion ??\n configUtils.tryFindPropertyValue(winuiPropsContents, 'WinUI2xVersion');\n\n // Use the given WinUI3Version, otherwise fallback to WinUI.props\n const winui3Version =\n targetWinUI3xVersion ??\n configUtils.tryFindPropertyValue(winuiPropsContents, 'WinUI3Version');\n\n const dialects = [\n {id: 'Microsoft.WindowsAppSDK', version: winui3Version!},\n {id: 'Microsoft.UI.Xaml', version: winui2xVersion!},\n ];\n const keepPkg = useWinUI3 ? dialects[0] : dialects[1];\n const removePkg = useWinUI3 ? dialects[1] : dialects[0];\n\n changed = this.updatePackagesConfig(\n packagesConfig,\n [removePkg],\n [keepPkg],\n );\n\n if (!this.options.check && changed) {\n const serializer = new XMLSerializer();\n const output = serializer.serializeToString(packagesConfig.content);\n const formattedXml = formatter(output, {indentation: ' '});\n await this.updateFile(packagesConfig.path, formattedXml);\n }\n }\n return changed;\n }\n\n private updatePackagesConfig(\n packagesConfig: {path: string; content: Document},\n removePkgs: {id: string; version: string}[],\n keepPkgs: {id: string; version: string}[],\n ) {\n let changed = false;\n const packageElements =\n packagesConfig.content.documentElement.getElementsByTagName('package');\n\n const nodesToRemove: Element[] = [];\n\n for (let i = 0; i < packageElements.length; i++) {\n const packageElement = packageElements.item(i)!;\n const idAttr = packageElement!.getAttributeNode('id');\n const id = idAttr!.value;\n const keepPkg = keepPkgs.find(pkg => pkg.id === id);\n if (removePkgs.find(pkg => pkg.id === id)) {\n nodesToRemove.push(packageElement);\n changed = true;\n } else if (keepPkg) {\n changed =\n changed || keepPkg.version !== packageElement.getAttribute('version');\n packageElement.setAttribute('version', keepPkg.version!);\n keepPkgs = keepPkgs.filter(pkg => pkg.id !== keepPkg.id);\n }\n }\n\n nodesToRemove.forEach(pkg =>\n packagesConfig.content.documentElement.removeChild(pkg),\n );\n\n keepPkgs.forEach(keepPkg => {\n const newPkg = packagesConfig.content.createElement('package');\n\n Object.entries(keepPkg).forEach(([attr, value]) => {\n newPkg.setAttribute(attr, value as string);\n });\n newPkg.setAttribute('targetFramework', 'native');\n packagesConfig.content.documentElement.appendChild(newPkg);\n changed = true;\n });\n return changed;\n }\n\n /** @return The CLI command to invoke autolink-windows independently */\n public getAutolinkWindowsCommand() {\n const folder = this.windowsAppConfig.folder;\n\n const autolinkCommand = 'npx @react-native-community/cli autolink-windows';\n const autolinkArgs = `--sln \"${path.relative(\n folder,\n this.getSolutionFile(),\n )}\" --proj \"${path.relative(folder, this.getProjectFile())}\"`;\n return `${autolinkCommand} ${autolinkArgs}`;\n }\n}\n\n/**\n * Locates the react-native-windows directory\n * @param config project configuration\n */\nfunction resolveRnwRoot(projectConfig: WindowsProjectConfig) {\n return pathHelpers.resolveRnwRoot(projectConfig.folder);\n}\n\n/**\n * Locates the react-native-windows directory containing template files\n * @param config project configuration\n */\nfunction resolveTemplateRoot(projectConfig: WindowsProjectConfig) {\n const rnwPackage = resolveRnwRoot(projectConfig);\n const template = projectConfig.rnwConfig?.['init-windows']?.template as\n | string\n | undefined;\n\n // For new templates, return the template's root path\n if (template && !template.startsWith('old/')) {\n return path.join(rnwPackage, 'templates', template);\n }\n\n // For old (unknown templates) fall back to old behavior\n return path.join(rnwPackage, 'template');\n}\n\n/**\n * Logs the given message if verbose is True.\n * @param message The message to log.\n * @param verbose Whether or not verbose logging is enabled.\n */\nfunction verboseMessage(message: any, verbose?: boolean) {\n if (verbose) {\n console.log(message);\n }\n}\n\n/**\n * Sanitizes the given option for telemetry.\n * @param key The key of the option.\n * @param value The unsanitized value of the option.\n * @returns The sanitized value of the option.\n */\nfunction optionSanitizer(key: keyof AutoLinkOptions, value: any): any {\n // Do not add a default case here.\n // Strings risking PII should just return true if present, false otherwise.\n // All others should return the value (or false if undefined).\n switch (key) {\n case 'sln':\n case 'proj':\n return value === undefined ? false : true; // Strip PII\n case 'logging':\n case 'check':\n case 'telemetry':\n return value === undefined ? false : value; // Return value\n }\n}\n\n/**\n * Get the extra props to add to the `autolink-windows` telemetry event.\n * @returns The extra props.\n */\nasync function getExtraProps(): Promise<Record<string, any>> {\n const extraProps: Record<string, any> = {};\n return extraProps;\n}\n\n/**\n * The function run when calling `npx @react-native-community/cli autolink-windows`.\n * @param args Unprocessed args passed from react-native CLI.\n * @param config Config passed from react-native CLI.\n * @param options Options passed from react-native CLI.\n */\nasync function autolinkWindows(\n args: string[],\n config: Config,\n options: AutoLinkOptions,\n) {\n await startTelemetrySession(\n 'autolink-windows',\n config,\n options,\n getDefaultOptions(config, autolinkOptions),\n optionSanitizer,\n );\n\n let autolinkWindowsError: Error | undefined;\n try {\n await autolinkWindowsInternal(args, config, options);\n } catch (ex) {\n autolinkWindowsError =\n ex instanceof Error ? (ex as Error) : new Error(String(ex));\n Telemetry.trackException(autolinkWindowsError);\n }\n\n await endTelemetrySession(autolinkWindowsError, getExtraProps);\n setExitProcessWithError(options.logging, autolinkWindowsError);\n}\n\n/**\n * Performs auto-linking for RNW native modules and apps.\n * @param args Unprocessed args passed from react-native CLI.\n * @param config Config passed from react-native CLI.\n * @param options Options passed from react-native CLI.\n */\nexport async function autolinkWindowsInternal(\n args: string[],\n config: Config,\n options: AutoLinkOptions,\n) {\n const startTime = performance.now();\n const spinner = newSpinner(\n options.check ? 'Checking auto-linked files...' : 'Auto-linking...',\n );\n try {\n const autolink = new AutoLinkWindows(\n config.project,\n config.dependencies,\n options,\n );\n await autolink.run(spinner);\n const endTime = performance.now();\n\n if (!autolink.areChangesNeeded()) {\n console.log(\n `${chalk.green(\n 'Success:',\n )} No auto-linking changes necessary. (${Math.round(\n endTime - startTime,\n )}ms)`,\n );\n } else if (options.check) {\n const autolinkCommand = autolink.getAutolinkWindowsCommand();\n console.log(\n `${chalk.yellow(\n 'Warning:',\n )} Auto-linking changes were necessary but ${chalk.bold(\n '--check',\n )} specified. Run '${chalk.bold(\n `${autolinkCommand}`,\n )}' to apply the changes. (${Math.round(endTime - startTime)}ms)`,\n );\n throw new CodedError(\n 'NeedAutolinking',\n `Auto-linking changes were necessary but --check was specified. Run '${autolinkCommand}' to apply the changes`,\n );\n } else {\n console.log(\n `${chalk.green(\n 'Success:',\n )} Auto-linking changes completed. (${Math.round(\n endTime - startTime,\n )}ms)`,\n );\n }\n } catch (e) {\n spinner.fail();\n const endTime = performance.now();\n console.log(\n `${chalk.red('Error:')} ${(e as any).toString()}. (${Math.round(\n endTime - startTime,\n )}ms)`,\n );\n throw e;\n }\n}\n\n/**\n * Performs auto-linking for RNW native modules and apps.\n */\nexport const autolinkCommand: Command = {\n name: 'autolink-windows',\n description: 'Runs Windows-specific autolinking for your RNW project',\n func: autolinkWindows,\n options: autolinkOptions,\n};\n"]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
* @format
|
|
5
5
|
*/
|
|
6
|
-
import
|
|
6
|
+
import { CommandOption } from '@react-native-community/cli-types';
|
|
7
7
|
export interface AutoLinkOptions {
|
|
8
8
|
logging?: boolean;
|
|
9
9
|
check?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autolinkWindowsOptions.js","sourceRoot":"","sources":["../../../src/commands/autolinkWindows/autolinkWindowsOptions.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAYU,QAAA,eAAe,GAAoB;IAC9C;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,wBAAwB;KACtC;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,wDAAwD;KACtE;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,gHAAgH;QAClH,OAAO,EAAE,SAAS;KACnB;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,0HAA0H;QAC5H,OAAO,EAAE,SAAS;KACnB;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,uGAAuG;KAC1G;CACF,CAAC","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\nimport
|
|
1
|
+
{"version":3,"file":"autolinkWindowsOptions.js","sourceRoot":"","sources":["../../../src/commands/autolinkWindows/autolinkWindowsOptions.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAYU,QAAA,eAAe,GAAoB;IAC9C;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,wBAAwB;KACtC;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,wDAAwD;KACtE;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,gHAAgH;QAClH,OAAO,EAAE,SAAS;KACnB;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,0HAA0H;QAC5H,OAAO,EAAE,SAAS;KACnB;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,uGAAuG;KAC1G;CACF,CAAC","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\nimport {CommandOption} from '@react-native-community/cli-types';\n\nexport interface AutoLinkOptions {\n logging?: boolean;\n check?: boolean;\n sln?: string;\n proj?: string;\n telemetry?: boolean;\n}\n\nexport const autolinkOptions: CommandOption[] = [\n {\n name: '--logging',\n description: 'Verbose output logging',\n },\n {\n name: '--check',\n description: 'Only check whether any autolinked files need to change',\n },\n {\n name: '--sln [string]',\n description:\n \"Override the app solution file determined by 'npx @react-native-community/cli config', i.e. windows\\\\myApp.sln\",\n default: undefined,\n },\n {\n name: '--proj [string]',\n description:\n \"Override the app project file determined by 'npx @react-native-community/cli config', i.e. windows\\\\myApp\\\\myApp.vcxproj\",\n default: undefined,\n },\n {\n name: '--no-telemetry',\n description:\n 'Disables sending telemetry that allows analysis of usage and failures of the react-native-windows CLI',\n },\n];\n"]}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* @format
|
|
5
5
|
*/
|
|
6
6
|
import { Ora } from 'ora';
|
|
7
|
-
import
|
|
8
|
-
import
|
|
7
|
+
import { Command, Config } from '@react-native-community/cli-types';
|
|
8
|
+
import { CodeGenOptions } from './codegenWindowsOptions';
|
|
9
9
|
export declare class CodeGenWindows {
|
|
10
10
|
readonly root: string;
|
|
11
11
|
readonly options: CodeGenOptions;
|
|
@@ -82,7 +82,10 @@ class CodeGenWindows {
|
|
|
82
82
|
const generators = (_b = pkgJson.codegenConfig.windows.generators) !== null && _b !== void 0 ? _b : [
|
|
83
83
|
'modulesWindows',
|
|
84
84
|
];
|
|
85
|
-
const jsRootPathRelative = path_1.default
|
|
85
|
+
const jsRootPathRelative = path_1.default
|
|
86
|
+
.relative(process.cwd(), jsRootDir)
|
|
87
|
+
.split(path_1.default.sep)
|
|
88
|
+
.join('/');
|
|
86
89
|
const options = {
|
|
87
90
|
files: [
|
|
88
91
|
`${jsRootPathRelative}${jsRootPathRelative ? '/' : ''}**/*Native*.[jt]s`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegenWindows.js","sourceRoot":"","sources":["../../../src/commands/codegenWindows/codegenWindows.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\nimport path from 'path';\nimport chalk from 'chalk';\nimport {performance} from 'perf_hooks';\nimport {Ora} from 'ora';\n\nimport type {Command, Config} from '@react-native-community/cli-types';\nimport {Telemetry, CodedError} from '@react-native-windows/telemetry';\nimport type {\n CodeGenOptions as RnwCodeGenOptions,\n CppStringTypes,\n} from '@react-native-windows/codegen';\nimport {runCodeGen} from '@react-native-windows/codegen';\n\nimport {\n newSpinner,\n setExitProcessWithError,\n} from '../../utils/commandWithProgress';\nimport {\n getDefaultOptions,\n startTelemetrySession,\n endTelemetrySession,\n} from '../../utils/telemetryHelpers';\nimport type {CodeGenOptions} from './codegenWindowsOptions';\nimport {codegenOptions} from './codegenWindowsOptions';\n\nexport class CodeGenWindows {\n private changesNecessary: boolean;\n\n public areChangesNeeded() {\n return this.changesNecessary;\n }\n\n constructor(readonly root: string, readonly options: CodeGenOptions) {\n this.changesNecessary = false;\n }\n\n public async run(spinner: Ora) {\n const verbose = this.options.logging;\n\n verboseMessage('', verbose);\n\n verboseMessage('Loading codegenConfig from package.json');\n const pkgJson = require(path.join(this.root, 'package.json'));\n\n if (!pkgJson.codegenConfig) {\n spinner.info(\n `No ${chalk.bold(\n 'codegenConfig',\n )} specified in package.json - ${chalk.yellow(\n 'Skipping codegen-windows',\n )}`,\n );\n return;\n }\n\n const codegenConfigType = pkgJson.codegenConfig.type;\n if (codegenConfigType !== 'modules' && codegenConfigType !== 'all') {\n spinner.info(\n `${chalk.bold(\n 'codegenConfig.type',\n )} in package.json is not ${chalk.bold('modules')} or ${chalk.bold(\n 'all',\n )} - ${chalk.yellow('Skipping codegen-windows')}`,\n );\n return;\n }\n\n if (!pkgJson.codegenConfig.windows) {\n spinner.info(\n `No ${chalk.bold(\n 'codegenConfig.windows',\n )} specified in package.json - ${chalk.yellow(\n 'Skipping codegen-windows',\n )}`,\n );\n return;\n }\n\n if (!pkgJson.codegenConfig.windows.namespace) {\n throw new CodedError(\n 'InvalidCodegenConfig',\n `Missing ${chalk.bold(\n 'codegenConfig.windows.namespace',\n )} value in package.json`,\n );\n }\n\n let cppStringType: CppStringTypes = 'std::string';\n if (pkgJson.codegenConfig.windows.cppStringType) {\n switch (pkgJson.codegenConfig.windows.cppStringType) {\n case 'std::string':\n case 'std::wstring':\n cppStringType = pkgJson.codegenConfig.windows.cppStringType;\n break;\n default:\n throw new CodedError(\n 'InvalidCodegenConfig',\n `Value of ${chalk.bold(\n 'codegenConfig.windows.cppStringType',\n )} in package.json should be either 'std::string' or 'std::wstring'`,\n );\n }\n }\n\n let separateDataTypes = false;\n if (pkgJson.codegenConfig.windows.separateDataTypes !== undefined) {\n switch (pkgJson.codegenConfig.windows.separateDataTypes) {\n case true:\n case false:\n separateDataTypes = pkgJson.codegenConfig.windows.separateDataTypes;\n break;\n default:\n throw new CodedError(\n 'InvalidCodegenConfig',\n `Value of ${chalk.bold(\n 'codegenConfig.windows.separateDataTypes',\n )} in package.json should be either true or false`,\n );\n }\n }\n\n if (!pkgJson.codegenConfig.name) {\n throw new CodedError(\n 'InvalidCodegenConfig',\n `Missing ${chalk.bold('codegenConfig.name')} value in package.json`,\n );\n }\n\n const projectName = pkgJson.codegenConfig.name.replace(/[^a-zA-Z]/g, '');\n const projectNamespace = pkgJson.codegenConfig.windows.namespace;\n const jsRootDir = pkgJson.codegenConfig.jsSrcsDir\n ? path.join(this.root, pkgJson.codegenConfig.jsSrcsDir)\n : this.root;\n const codegenOutputDir =\n pkgJson.codegenConfig.windows.outputDirectory ?? 'codegen';\n\n const generators = pkgJson.codegenConfig.windows.generators ?? [\n 'modulesWindows',\n ];\n\n const jsRootPathRelative = path.relative(process.cwd(), jsRootDir);\n const options: RnwCodeGenOptions = {\n files: [\n `${jsRootPathRelative}${\n jsRootPathRelative ? '/' : ''\n }**/*Native*.[jt]s`,\n ],\n componentsWindows: generators.indexOf('componentsWindows') !== -1,\n internalComponents: generators.indexOf('internalComponents') !== -1,\n cppStringType,\n separateDataTypes,\n libraryName: projectName,\n methodOnly: false,\n modulesCxx: generators.indexOf('modulesCxx') !== -1,\n modulesTypeScriptTypes:\n generators.indexOf('modulesTypeScriptTypes') !== -1,\n modulesWindows: generators.indexOf('modulesWindows') !== -1,\n namespace: projectNamespace,\n outputDirectory: path.join(this.root, codegenOutputDir),\n test: !!this.options.check,\n };\n\n verboseMessage(\n `Run codegen with options: \\n${JSON.stringify(options, null, 2)}`,\n verbose,\n );\n\n this.changesNecessary = runCodeGen(options);\n\n spinner.succeed();\n }\n}\n\n/**\n * Logs the given message if verbose is True.\n * @param message The message to log.\n * @param verbose Whether or not verbose logging is enabled.\n */\nfunction verboseMessage(message: any, verbose?: boolean) {\n if (verbose) {\n console.log(message);\n }\n}\n\n/**\n * Sanitizes the given option for telemetry.\n * @param key The key of the option.\n * @param value The unsanitized value of the option.\n * @returns The sanitized value of the option.\n */\nfunction optionSanitizer(key: keyof CodeGenOptions, value: any): any {\n // Do not add a default case here.\n // Strings risking PII should just return true if present, false otherwise.\n // All others should return the value (or false if undefined).\n switch (key) {\n case 'logging':\n case 'check':\n case 'telemetry':\n return value === undefined ? false : value; // Return value\n }\n}\n\n/**\n * Get the extra props to add to the `codegen-windows` telemetry event.\n * @returns The extra props.\n */\nasync function getExtraProps(): Promise<Record<string, any>> {\n const extraProps: Record<string, any> = {};\n return extraProps;\n}\n\n/**\n * The function run when calling `npx @react-native-community/cli codegen-windows`.\n * @param args Unprocessed args passed from react-native CLI.\n * @param config Config passed from react-native CLI.\n * @param options Options passed from react-native CLI.\n */\nasync function codegenWindows(\n args: string[],\n config: Config,\n options: CodeGenOptions,\n) {\n await startTelemetrySession(\n 'codegen-windows',\n config,\n options,\n getDefaultOptions(config, codegenOptions),\n optionSanitizer,\n );\n\n let codegenWindowsError: Error | undefined;\n try {\n await codegenWindowsInternal(args, config, options);\n } catch (ex) {\n codegenWindowsError =\n ex instanceof Error ? (ex as Error) : new Error(String(ex));\n Telemetry.trackException(codegenWindowsError);\n }\n\n await endTelemetrySession(codegenWindowsError, getExtraProps);\n setExitProcessWithError(options.logging, codegenWindowsError);\n}\n\n/**\n * Performs codegen for RNW native modules and apps.\n * @param args Unprocessed args passed from react-native CLI.\n * @param config Config passed from react-native CLI.\n * @param options Options passed from react-native CLI.\n */\nexport async function codegenWindowsInternal(\n args: string[],\n config: Config,\n options: CodeGenOptions,\n) {\n const startTime = performance.now();\n const spinner = newSpinner(\n options.check\n ? 'Checking codegen-windows files...'\n : 'Running codegen-windows...',\n );\n try {\n const codegen = new CodeGenWindows(config.root, options);\n await codegen.run(spinner);\n const endTime = performance.now();\n\n if (!codegen.areChangesNeeded()) {\n console.log(\n `${chalk.green(\n 'Success:',\n )} No codegen-windows changes necessary. (${Math.round(\n endTime - startTime,\n )}ms)`,\n );\n } else if (options.check) {\n const codegenCommand = 'npx @react-native-community/cli codegen-windows';\n console.log(\n `${chalk.yellow(\n 'Warning:',\n )} Codegen-windows changes were necessary but ${chalk.bold(\n '--check',\n )} specified. Run '${chalk.bold(\n `${codegenCommand}`,\n )}' to apply the changes. (${Math.round(endTime - startTime)}ms)`,\n );\n throw new CodedError(\n 'NeedCodegen',\n `Codegen-windows changes were necessary but --check was specified. Run '${codegenCommand}' to apply the changes`,\n );\n } else {\n console.log(\n `${chalk.green(\n 'Success:',\n )} Codegen-windows changes completed. (${Math.round(\n endTime - startTime,\n )}ms)`,\n );\n }\n } catch (e) {\n spinner.fail();\n const endTime = performance.now();\n console.log(\n `${chalk.red('Error:')} ${(e as any).toString()}. (${Math.round(\n endTime - startTime,\n )}ms)`,\n );\n throw e;\n }\n}\n\n/**\n * Performs codegen for RNW native modules.\n */\nexport const codegenCommand: Command = {\n name: 'codegen-windows',\n description: 'Runs Windows-specific codegen for native modules',\n func: codegenWindows,\n options: codegenOptions,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"codegenWindows.js","sourceRoot":"","sources":["../../../src/commands/codegenWindows/codegenWindows.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\nimport path from 'path';\nimport chalk from 'chalk';\nimport {performance} from 'perf_hooks';\nimport {Ora} from 'ora';\n\nimport {Command, Config} from '@react-native-community/cli-types';\nimport {Telemetry, CodedError} from '@react-native-windows/telemetry';\nimport {\n CodeGenOptions as RnwCodeGenOptions,\n CppStringTypes,\n runCodeGen,\n} from '@react-native-windows/codegen';\n\nimport {\n newSpinner,\n setExitProcessWithError,\n} from '../../utils/commandWithProgress';\nimport {\n getDefaultOptions,\n startTelemetrySession,\n endTelemetrySession,\n} from '../../utils/telemetryHelpers';\nimport {CodeGenOptions, codegenOptions} from './codegenWindowsOptions';\n\nexport class CodeGenWindows {\n private changesNecessary: boolean;\n\n public areChangesNeeded() {\n return this.changesNecessary;\n }\n\n constructor(readonly root: string, readonly options: CodeGenOptions) {\n this.changesNecessary = false;\n }\n\n public async run(spinner: Ora) {\n const verbose = this.options.logging;\n\n verboseMessage('', verbose);\n\n verboseMessage('Loading codegenConfig from package.json');\n const pkgJson = require(path.join(this.root, 'package.json'));\n\n if (!pkgJson.codegenConfig) {\n spinner.info(\n `No ${chalk.bold(\n 'codegenConfig',\n )} specified in package.json - ${chalk.yellow(\n 'Skipping codegen-windows',\n )}`,\n );\n return;\n }\n\n const codegenConfigType = pkgJson.codegenConfig.type;\n if (codegenConfigType !== 'modules' && codegenConfigType !== 'all') {\n spinner.info(\n `${chalk.bold(\n 'codegenConfig.type',\n )} in package.json is not ${chalk.bold('modules')} or ${chalk.bold(\n 'all',\n )} - ${chalk.yellow('Skipping codegen-windows')}`,\n );\n return;\n }\n\n if (!pkgJson.codegenConfig.windows) {\n spinner.info(\n `No ${chalk.bold(\n 'codegenConfig.windows',\n )} specified in package.json - ${chalk.yellow(\n 'Skipping codegen-windows',\n )}`,\n );\n return;\n }\n\n if (!pkgJson.codegenConfig.windows.namespace) {\n throw new CodedError(\n 'InvalidCodegenConfig',\n `Missing ${chalk.bold(\n 'codegenConfig.windows.namespace',\n )} value in package.json`,\n );\n }\n\n let cppStringType: CppStringTypes = 'std::string';\n if (pkgJson.codegenConfig.windows.cppStringType) {\n switch (pkgJson.codegenConfig.windows.cppStringType) {\n case 'std::string':\n case 'std::wstring':\n cppStringType = pkgJson.codegenConfig.windows.cppStringType;\n break;\n default:\n throw new CodedError(\n 'InvalidCodegenConfig',\n `Value of ${chalk.bold(\n 'codegenConfig.windows.cppStringType',\n )} in package.json should be either 'std::string' or 'std::wstring'`,\n );\n }\n }\n\n let separateDataTypes = false;\n if (pkgJson.codegenConfig.windows.separateDataTypes !== undefined) {\n switch (pkgJson.codegenConfig.windows.separateDataTypes) {\n case true:\n case false:\n separateDataTypes = pkgJson.codegenConfig.windows.separateDataTypes;\n break;\n default:\n throw new CodedError(\n 'InvalidCodegenConfig',\n `Value of ${chalk.bold(\n 'codegenConfig.windows.separateDataTypes',\n )} in package.json should be either true or false`,\n );\n }\n }\n\n if (!pkgJson.codegenConfig.name) {\n throw new CodedError(\n 'InvalidCodegenConfig',\n `Missing ${chalk.bold('codegenConfig.name')} value in package.json`,\n );\n }\n\n const projectName = pkgJson.codegenConfig.name.replace(/[^a-zA-Z]/g, '');\n const projectNamespace = pkgJson.codegenConfig.windows.namespace;\n const jsRootDir = pkgJson.codegenConfig.jsSrcsDir\n ? path.join(this.root, pkgJson.codegenConfig.jsSrcsDir)\n : this.root;\n const codegenOutputDir =\n pkgJson.codegenConfig.windows.outputDirectory ?? 'codegen';\n\n const generators = pkgJson.codegenConfig.windows.generators ?? [\n 'modulesWindows',\n ];\n\n const jsRootPathRelative = path\n .relative(process.cwd(), jsRootDir)\n .split(path.sep)\n .join('/');\n const options: RnwCodeGenOptions = {\n files: [\n `${jsRootPathRelative}${\n jsRootPathRelative ? '/' : ''\n }**/*Native*.[jt]s`,\n ],\n componentsWindows: generators.indexOf('componentsWindows') !== -1,\n internalComponents: generators.indexOf('internalComponents') !== -1,\n cppStringType,\n separateDataTypes,\n libraryName: projectName,\n methodOnly: false,\n modulesCxx: generators.indexOf('modulesCxx') !== -1,\n modulesTypeScriptTypes:\n generators.indexOf('modulesTypeScriptTypes') !== -1,\n modulesWindows: generators.indexOf('modulesWindows') !== -1,\n namespace: projectNamespace,\n outputDirectory: path.join(this.root, codegenOutputDir),\n test: !!this.options.check,\n };\n\n verboseMessage(\n `Run codegen with options: \\n${JSON.stringify(options, null, 2)}`,\n verbose,\n );\n\n this.changesNecessary = runCodeGen(options);\n\n spinner.succeed();\n }\n}\n\n/**\n * Logs the given message if verbose is True.\n * @param message The message to log.\n * @param verbose Whether or not verbose logging is enabled.\n */\nfunction verboseMessage(message: any, verbose?: boolean) {\n if (verbose) {\n console.log(message);\n }\n}\n\n/**\n * Sanitizes the given option for telemetry.\n * @param key The key of the option.\n * @param value The unsanitized value of the option.\n * @returns The sanitized value of the option.\n */\nfunction optionSanitizer(key: keyof CodeGenOptions, value: any): any {\n // Do not add a default case here.\n // Strings risking PII should just return true if present, false otherwise.\n // All others should return the value (or false if undefined).\n switch (key) {\n case 'logging':\n case 'check':\n case 'telemetry':\n return value === undefined ? false : value; // Return value\n }\n}\n\n/**\n * Get the extra props to add to the `codegen-windows` telemetry event.\n * @returns The extra props.\n */\nasync function getExtraProps(): Promise<Record<string, any>> {\n const extraProps: Record<string, any> = {};\n return extraProps;\n}\n\n/**\n * The function run when calling `npx @react-native-community/cli codegen-windows`.\n * @param args Unprocessed args passed from react-native CLI.\n * @param config Config passed from react-native CLI.\n * @param options Options passed from react-native CLI.\n */\nasync function codegenWindows(\n args: string[],\n config: Config,\n options: CodeGenOptions,\n) {\n await startTelemetrySession(\n 'codegen-windows',\n config,\n options,\n getDefaultOptions(config, codegenOptions),\n optionSanitizer,\n );\n\n let codegenWindowsError: Error | undefined;\n try {\n await codegenWindowsInternal(args, config, options);\n } catch (ex) {\n codegenWindowsError =\n ex instanceof Error ? (ex as Error) : new Error(String(ex));\n Telemetry.trackException(codegenWindowsError);\n }\n\n await endTelemetrySession(codegenWindowsError, getExtraProps);\n setExitProcessWithError(options.logging, codegenWindowsError);\n}\n\n/**\n * Performs codegen for RNW native modules and apps.\n * @param args Unprocessed args passed from react-native CLI.\n * @param config Config passed from react-native CLI.\n * @param options Options passed from react-native CLI.\n */\nexport async function codegenWindowsInternal(\n args: string[],\n config: Config,\n options: CodeGenOptions,\n) {\n const startTime = performance.now();\n const spinner = newSpinner(\n options.check\n ? 'Checking codegen-windows files...'\n : 'Running codegen-windows...',\n );\n try {\n const codegen = new CodeGenWindows(config.root, options);\n await codegen.run(spinner);\n const endTime = performance.now();\n\n if (!codegen.areChangesNeeded()) {\n console.log(\n `${chalk.green(\n 'Success:',\n )} No codegen-windows changes necessary. (${Math.round(\n endTime - startTime,\n )}ms)`,\n );\n } else if (options.check) {\n const codegenCommand = 'npx @react-native-community/cli codegen-windows';\n console.log(\n `${chalk.yellow(\n 'Warning:',\n )} Codegen-windows changes were necessary but ${chalk.bold(\n '--check',\n )} specified. Run '${chalk.bold(\n `${codegenCommand}`,\n )}' to apply the changes. (${Math.round(endTime - startTime)}ms)`,\n );\n throw new CodedError(\n 'NeedCodegen',\n `Codegen-windows changes were necessary but --check was specified. Run '${codegenCommand}' to apply the changes`,\n );\n } else {\n console.log(\n `${chalk.green(\n 'Success:',\n )} Codegen-windows changes completed. (${Math.round(\n endTime - startTime,\n )}ms)`,\n );\n }\n } catch (e) {\n spinner.fail();\n const endTime = performance.now();\n console.log(\n `${chalk.red('Error:')} ${(e as any).toString()}. (${Math.round(\n endTime - startTime,\n )}ms)`,\n );\n throw e;\n }\n}\n\n/**\n * Performs codegen for RNW native modules.\n */\nexport const codegenCommand: Command = {\n name: 'codegen-windows',\n description: 'Runs Windows-specific codegen for native modules',\n func: codegenWindows,\n options: codegenOptions,\n};\n"]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
* @format
|
|
5
5
|
*/
|
|
6
|
-
import
|
|
6
|
+
import { CommandOption } from '@react-native-community/cli-types';
|
|
7
7
|
export interface CodeGenOptions {
|
|
8
8
|
logging?: boolean;
|
|
9
9
|
check?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegenWindowsOptions.js","sourceRoot":"","sources":["../../../src/commands/codegenWindows/codegenWindowsOptions.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAUU,QAAA,cAAc,GAAoB;IAC7C;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,wBAAwB;KACtC;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,qDAAqD;KACnE;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,uGAAuG;KAC1G;CACF,CAAC","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\nimport
|
|
1
|
+
{"version":3,"file":"codegenWindowsOptions.js","sourceRoot":"","sources":["../../../src/commands/codegenWindows/codegenWindowsOptions.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAUU,QAAA,cAAc,GAAoB;IAC7C;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,wBAAwB;KACtC;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,qDAAqD;KACnE;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,uGAAuG;KAC1G;CACF,CAAC","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\nimport {CommandOption} from '@react-native-community/cli-types';\n\nexport interface CodeGenOptions {\n logging?: boolean;\n check?: boolean;\n telemetry?: boolean;\n}\n\nexport const codegenOptions: CommandOption[] = [\n {\n name: '--logging',\n description: 'Verbose output logging',\n },\n {\n name: '--check',\n description: 'Only check whether any codegen files need to change',\n },\n {\n name: '--no-telemetry',\n description:\n 'Disables sending telemetry that allows analysis of usage and failures of the react-native-windows CLI',\n },\n];\n"]}
|
|
@@ -404,7 +404,10 @@ function getExperimentalFeatures(solutionDir) {
|
|
|
404
404
|
exports.getExperimentalFeatures = getExperimentalFeatures;
|
|
405
405
|
function getRnwConfig(root, projectFile) {
|
|
406
406
|
var _a, _b;
|
|
407
|
-
const
|
|
407
|
+
const pkgPath = path_1.default.join(root, 'package.json');
|
|
408
|
+
const pkgJson = fs_1.default.existsSync(pkgPath)
|
|
409
|
+
? require(path_1.default.join(root, 'package.json'))
|
|
410
|
+
: {};
|
|
408
411
|
const config = (_a = pkgJson['react-native-windows']) !== null && _a !== void 0 ? _a : {};
|
|
409
412
|
// if init-windows is missing (most existing projects), try to auto-calculate it
|
|
410
413
|
(_b = config['init-windows']) !== null && _b !== void 0 ? _b : (config['init-windows'] = {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configUtils.js","sourceRoot":"","sources":["../../../src/commands/config/configUtils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\nimport fs from '@react-native-windows/fs';\nimport path from 'path';\nimport glob from 'glob';\n\nimport {DOMParser} from '@xmldom/xmldom';\nimport xpath from 'xpath';\nimport {CodedError} from '@react-native-windows/telemetry';\n\nconst msbuildSelect = xpath.useNamespaces({\n msbuild: 'http://schemas.microsoft.com/developer/msbuild/2003',\n});\n\n/**\n * Search for files matching the pattern under the target folder.\n * @param folder The absolute path to target folder.\n * @param filenamePattern The pattern to search for.\n * @return Return the array of relative file paths.\n */\nexport function findFiles(folder: string, filenamePattern: string): string[] {\n const files = glob.sync(path.join('**', filenamePattern), {\n cwd: folder,\n ignore: [\n 'node_modules/**',\n '**/Debug/**',\n '**/Release/**',\n '**/Generated Files/**',\n '**/packages/**',\n ],\n });\n\n return files;\n}\n\n/**\n * Search for the windows sub-folder under the target folder.\n * @param folder The absolute path to the target folder.\n * @return The absolute path to the windows folder, if it exists.\n */\nexport function findWindowsFolder(folder: string): string | null {\n const winDir = 'windows';\n const joinedDir = path.join(folder, winDir);\n if (fs.existsSync(joinedDir)) {\n return joinedDir;\n }\n\n return null;\n}\n\n/**\n * Checks if the target file path is a RNW solution file by checking if it contains the string \"ReactNative\".\n * @param filePath The absolute file path to check.\n * @return Whether the path is to a RNW solution file.\n */\nexport function isRnwSolution(filePath: string): boolean {\n return (\n fs\n .readFileSync(filePath)\n .toString()\n .search(/ReactNative/) > 0\n );\n}\n\n/**\n * Search for the RNW solution files under the target folder.\n * @param winFolder The absolute path to target folder.\n * @return Return the array of relative file paths.\n */\nexport function findSolutionFiles(winFolder: string): string[] {\n // First search for all potential solution files\n const allSolutions = findFiles(winFolder, '*.sln');\n\n if (allSolutions.length === 0) {\n // If there're no solution files, return 0\n return [];\n } else if (allSolutions.length === 1) {\n // If there is exactly one solution file, assume it's it\n return [allSolutions[0]];\n }\n\n const solutionFiles = [];\n\n // Try to find any solution file that appears to be a React Native solution\n for (const solutionFile of allSolutions) {\n if (isRnwSolution(path.join(winFolder, solutionFile))) {\n solutionFiles.push(path.normalize(solutionFile));\n }\n }\n\n return solutionFiles;\n}\n\nexport interface RawTemplateInfo {\n projectLang: 'cpp' | 'cs' | null;\n projectType: 'app' | 'lib' | null;\n projectArch: 'old' | 'new' | 'mixed' | null;\n}\n\n/**\n * Determines the RawTemplateInfo of the target project file.\n * @param filePath The absolute file path to check.\n * @return The RawTemplateInfo for the specific project.\n */\nexport function getRawTemplateInfo(filePath: string): RawTemplateInfo {\n const result: RawTemplateInfo = {\n projectLang: null,\n projectType: null,\n projectArch: null,\n };\n\n if (!fs.existsSync(filePath)) {\n return result;\n }\n\n result.projectLang = getProjectLanguage(filePath);\n\n const projectContents = readProjectFile(filePath);\n\n if (result.projectLang === 'cs') {\n if (\n importProjectExists(\n projectContents,\n 'Microsoft.ReactNative.Uwp.CSharpApp.targets',\n )\n ) {\n result.projectType = 'app';\n result.projectArch = 'old';\n } else if (\n importProjectExists(\n projectContents,\n 'Microsoft.ReactNative.Uwp.CSharpLib.targets',\n )\n ) {\n result.projectType = 'lib';\n result.projectArch = 'old';\n }\n } else if (result.projectLang === 'cpp') {\n if (\n importProjectExists(\n projectContents,\n 'Microsoft.ReactNative.Uwp.CppApp.targets',\n )\n ) {\n result.projectType = 'app';\n result.projectArch = 'old';\n } else if (\n importProjectExists(\n projectContents,\n 'Microsoft.ReactNative.Uwp.CppLib.targets',\n )\n ) {\n result.projectType = 'lib';\n result.projectArch = 'old';\n } else if (\n importProjectExists(\n projectContents,\n 'Microsoft.ReactNative.Composition.CppApp.targets',\n )\n ) {\n result.projectType = 'app';\n result.projectArch = 'new';\n } else if (\n importProjectExists(\n projectContents,\n 'Microsoft.ReactNative.Composition.CppLib.targets',\n )\n ) {\n result.projectType = 'lib';\n result.projectArch = 'new';\n } else if (\n importProjectExists(\n projectContents,\n 'Microsoft.ReactNative.CppLib.targets',\n )\n ) {\n result.projectType = 'lib';\n result.projectArch = 'mixed';\n }\n }\n\n return result;\n}\n\n/**\n * Checks if the target file path is a RNW lib project file.\n * @param filePath The absolute file path to check.\n * @return Whether the path is to a RNW lib project file.\n */\nexport function isRnwDependencyProject(filePath: string): boolean {\n const rawTemplateInfo = getRawTemplateInfo(filePath);\n return rawTemplateInfo.projectType === 'lib';\n}\n\n/**\n * Search for the RNW lib project files under the target folder.\n * @param winFolder The absolute path to target folder.\n * @return Return the array of relative file paths.\n */\nexport function findDependencyProjectFiles(winFolder: string): string[] {\n // First, search for all potential project files\n const allCppProj = findFiles(winFolder, '*.vcxproj');\n const allCsProj = findFiles(winFolder, '*.csproj');\n\n const allProjects = allCppProj.concat(allCsProj);\n\n if (allProjects.length === 0) {\n // If there're no project files, return 0\n return [];\n }\n\n const dependencyProjectFiles = [];\n\n // Try to find any project file that appears to be a dependency project\n for (const projectFile of allProjects) {\n // A project is marked as a RNW dependency iff either:\n // - If the project has the standard native module imports, or\n // - If we only have a single project (and it doesn't have the standard native module imports),\n // pick it and hope for the best. This enables autolinking for modules that were written\n // before the standard native module template existed.\n if (\n allProjects.length === 1 ||\n isRnwDependencyProject(path.join(winFolder, projectFile))\n ) {\n dependencyProjectFiles.push(path.normalize(projectFile));\n }\n }\n\n return dependencyProjectFiles;\n}\n\n/**\n * Checks if the target file path is a RNW app project file.\n * @param filePath The absolute file path to check.\n * @return Whether the path is to a RNW app project file.\n */\nexport function isRnwAppProject(filePath: string): boolean {\n const rawTemplateInfo = getRawTemplateInfo(filePath);\n return rawTemplateInfo.projectType === 'app';\n}\n\n/**\n * Search for the RNW app project files under the target folder.\n * @param winFolder The absolute path to target folder.\n * @return Return the array of relative file paths.\n */\nexport function findAppProjectFiles(winFolder: string): string[] {\n // First, search for all potential project files\n const allCppProj = findFiles(winFolder, '*.vcxproj');\n const allCsProj = findFiles(winFolder, '*.csproj');\n\n const allProjects = allCppProj.concat(allCsProj);\n\n if (allProjects.length === 0) {\n // If there're no project files, return 0\n return [];\n }\n\n const appProjectFiles = [];\n\n // Try to find any project file that appears to be an app project\n for (const projectFile of allProjects) {\n if (isRnwAppProject(path.join(winFolder, projectFile))) {\n appProjectFiles.push(path.normalize(projectFile));\n }\n }\n\n return appProjectFiles;\n}\n\n/**\n * Returns the programming language of the project file.\n * @param projectPath The project file path to check.\n * @return The language string: cpp, cs, or null if unknown.\n */\nexport function getProjectLanguage(projectPath: string): 'cpp' | 'cs' | null {\n if (projectPath.endsWith('.vcxproj')) {\n return 'cpp';\n } else if (projectPath.endsWith('.csproj')) {\n return 'cs';\n }\n\n return null;\n}\n\n/**\n * Reads in the contents of the target project file.\n * @param projectPath The target project file path.\n * @return The project file contents.\n */\nexport function readProjectFile(projectPath: string) {\n const projectContents = fs.readFileSync(projectPath, 'utf8').toString();\n return new DOMParser().parseFromString(projectContents, 'application/xml');\n}\n\n/**\n * Search for the given property in the project contents and return its value.\n * @param projectContents The XML project contents.\n * @param propertyName The property to look for.\n * @return The value of the tag if it exists.\n */\nexport function tryFindPropertyValue(\n projectContents: Node,\n propertyName: string,\n): string | null {\n const nodes = msbuildSelect(\n `//msbuild:PropertyGroup/msbuild:${propertyName}`,\n projectContents,\n );\n\n if (nodes.length > 0) {\n // Take the last one\n return (nodes[nodes.length - 1] as Node).textContent;\n } else {\n const noNamespaceNodes = xpath.select(\n `//PropertyGroup/${propertyName}`,\n projectContents,\n );\n if (noNamespaceNodes.length > 0) {\n return (noNamespaceNodes[noNamespaceNodes.length - 1] as Node)\n .textContent;\n }\n }\n\n return null;\n}\n\n/**\n * Search for the given property in the project contents and return its value.\n * @param projectContents The XML project contents.\n * @param propertyName The property to look for.\n * @return The value of the tag if it exists.\n */\nexport function tryFindPropertyValueAsBoolean(\n projectContents: Node,\n propertyName: string,\n): boolean | null {\n const rawValue = tryFindPropertyValue(projectContents, propertyName);\n\n switch (rawValue) {\n case 'true':\n return true;\n case 'false':\n return false;\n default:\n return null;\n }\n}\n\nexport function findPropertyValue(\n projectContents: Node,\n propertyName: string,\n filePath: string,\n): string {\n const res = tryFindPropertyValue(projectContents, propertyName);\n if (!res) {\n throw new CodedError(\n 'NoPropertyInProject',\n `Couldn't find property ${propertyName} from ${filePath}`,\n {propertyName: propertyName},\n );\n }\n return res;\n}\n\n/**\n * Search for the given import project in the project contents and return if it exists.\n * @param projectContents The XML project contents.\n * @param projectName The project to look for.\n * @return If the target exists.\n */\nexport function importProjectExists(\n projectContents: Node,\n projectName: string,\n): boolean {\n const nodes = msbuildSelect(\n `//msbuild:Import[contains(@Project,'${projectName}')]`,\n projectContents,\n );\n\n return nodes.length > 0;\n}\n\nexport type ConfigurationType =\n | 'application'\n | 'dynamiclibrary'\n | 'generic'\n | 'staticlibrary'\n | 'unknown';\n\n/**\n * Gets the configuration type of the project from the project contents.\n * @param projectContents The XML project contents.\n * @return The project configuration type.\n */\nexport function getConfigurationType(projectContents: Node): ConfigurationType {\n const configurationType = tryFindPropertyValue(\n projectContents,\n 'ConfigurationType',\n )?.toLowerCase();\n\n switch (configurationType) {\n case 'application':\n case 'dynamiclibrary':\n case 'generic':\n case 'staticlibrary':\n return configurationType;\n\n default:\n return 'unknown';\n }\n}\n\nexport type OutputType =\n | 'appcontainerexe'\n | 'exe'\n | 'library'\n | 'module'\n | 'unknown'\n | 'winexe'\n | 'winmdobj';\n\n/**\n * Gets the output type of the project from the project contents.\n * @param projectContents The XML project contents.\n * @return The project output type.\n */\nexport function getOutputType(projectContents: Node): OutputType {\n const outputType = tryFindPropertyValue(\n projectContents,\n 'OutputType',\n )?.toLowerCase();\n\n switch (outputType) {\n case 'appcontainerexe':\n case 'exe':\n case 'library':\n case 'module':\n case 'winexe':\n case 'winmdobj':\n return outputType;\n\n default:\n return 'unknown';\n }\n}\n\n/**\n * Gets the type of the project from the project contents.\n * @param projectPath The project file path to check.\n * @param projectContents The XML project contents.\n * @return The project type.\n */\nexport function getProjectType(\n projectPath: string,\n projectContents: Node,\n): ConfigurationType | OutputType {\n switch (getProjectLanguage(projectPath)) {\n case 'cpp':\n return getConfigurationType(projectContents);\n\n case 'cs':\n return getOutputType(projectContents);\n\n default:\n return 'unknown';\n }\n}\n\n/**\n * Gets the name of the project from the project contents.\n * @param projectPath The project file path to check.\n * @param projectContents The XML project contents.\n * @return The project name.\n */\nexport function getProjectName(\n projectPath: string,\n projectContents: Node,\n): string {\n const name =\n tryFindPropertyValue(projectContents, 'ProjectName') ||\n path.parse(projectPath).name ||\n '';\n\n return name;\n}\n\n/**\n * Gets the namespace of the project from the project contents.\n * @param projectContents The XML project contents.\n * @return The project namespace.\n */\nexport function getProjectNamespace(projectContents: Node): string | null {\n return tryFindPropertyValue(projectContents, 'RootNamespace');\n}\n\n/**\n * Gets the guid of the project from the project contents.\n * @param projectContents The XML project contents.\n * @return The project guid.\n */\nexport function getProjectGuid(projectContents: Node): string | null {\n return tryFindPropertyValue(projectContents, 'ProjectGuid');\n}\n\nexport function getExperimentalFeatures(\n solutionDir: string,\n): Record<string, string> | undefined {\n const propsFile = path.join(solutionDir, 'ExperimentalFeatures.props');\n\n if (!fs.existsSync(propsFile)) {\n return undefined;\n }\n\n const result: Record<string, any> = {};\n const propsContents = readProjectFile(propsFile);\n const nodes = msbuildSelect(\n `//msbuild:PropertyGroup/msbuild:*`,\n propsContents,\n );\n for (const node of nodes) {\n const propertyNode = node as Node;\n result[propertyNode.nodeName] = propertyNode.textContent;\n }\n return result;\n}\n\nexport function getRnwConfig(\n root: string,\n projectFile: string,\n): Record<string, any> | undefined {\n const pkgJson = require(path.join(root, 'package.json'));\n\n const config: Record<string, any> = pkgJson['react-native-windows'] ?? {};\n\n // if init-windows is missing (most existing projects), try to auto-calculate it\n config['init-windows'] ??= {};\n if (!config['init-windows'].template) {\n const info = getRawTemplateInfo(projectFile);\n if (info.projectArch && info.projectLang && info.projectType) {\n config['init-windows'].template = `${\n info.projectArch === 'old' ? 'old/uwp-' : ''\n }${info.projectLang}-${info.projectType}`;\n }\n }\n\n return config;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"configUtils.js","sourceRoot":"","sources":["../../../src/commands/config/configUtils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\nimport fs from '@react-native-windows/fs';\nimport path from 'path';\nimport glob from 'glob';\n\nimport {DOMParser} from '@xmldom/xmldom';\nimport xpath from 'xpath';\nimport {CodedError} from '@react-native-windows/telemetry';\n\nconst msbuildSelect = xpath.useNamespaces({\n msbuild: 'http://schemas.microsoft.com/developer/msbuild/2003',\n});\n\n/**\n * Search for files matching the pattern under the target folder.\n * @param folder The absolute path to target folder.\n * @param filenamePattern The pattern to search for.\n * @return Return the array of relative file paths.\n */\nexport function findFiles(folder: string, filenamePattern: string): string[] {\n const files = glob.sync(path.join('**', filenamePattern), {\n cwd: folder,\n ignore: [\n 'node_modules/**',\n '**/Debug/**',\n '**/Release/**',\n '**/Generated Files/**',\n '**/packages/**',\n ],\n });\n\n return files;\n}\n\n/**\n * Search for the windows sub-folder under the target folder.\n * @param folder The absolute path to the target folder.\n * @return The absolute path to the windows folder, if it exists.\n */\nexport function findWindowsFolder(folder: string): string | null {\n const winDir = 'windows';\n const joinedDir = path.join(folder, winDir);\n if (fs.existsSync(joinedDir)) {\n return joinedDir;\n }\n\n return null;\n}\n\n/**\n * Checks if the target file path is a RNW solution file by checking if it contains the string \"ReactNative\".\n * @param filePath The absolute file path to check.\n * @return Whether the path is to a RNW solution file.\n */\nexport function isRnwSolution(filePath: string): boolean {\n return (\n fs\n .readFileSync(filePath)\n .toString()\n .search(/ReactNative/) > 0\n );\n}\n\n/**\n * Search for the RNW solution files under the target folder.\n * @param winFolder The absolute path to target folder.\n * @return Return the array of relative file paths.\n */\nexport function findSolutionFiles(winFolder: string): string[] {\n // First search for all potential solution files\n const allSolutions = findFiles(winFolder, '*.sln');\n\n if (allSolutions.length === 0) {\n // If there're no solution files, return 0\n return [];\n } else if (allSolutions.length === 1) {\n // If there is exactly one solution file, assume it's it\n return [allSolutions[0]];\n }\n\n const solutionFiles = [];\n\n // Try to find any solution file that appears to be a React Native solution\n for (const solutionFile of allSolutions) {\n if (isRnwSolution(path.join(winFolder, solutionFile))) {\n solutionFiles.push(path.normalize(solutionFile));\n }\n }\n\n return solutionFiles;\n}\n\nexport interface RawTemplateInfo {\n projectLang: 'cpp' | 'cs' | null;\n projectType: 'app' | 'lib' | null;\n projectArch: 'old' | 'new' | 'mixed' | null;\n}\n\n/**\n * Determines the RawTemplateInfo of the target project file.\n * @param filePath The absolute file path to check.\n * @return The RawTemplateInfo for the specific project.\n */\nexport function getRawTemplateInfo(filePath: string): RawTemplateInfo {\n const result: RawTemplateInfo = {\n projectLang: null,\n projectType: null,\n projectArch: null,\n };\n\n if (!fs.existsSync(filePath)) {\n return result;\n }\n\n result.projectLang = getProjectLanguage(filePath);\n\n const projectContents = readProjectFile(filePath);\n\n if (result.projectLang === 'cs') {\n if (\n importProjectExists(\n projectContents,\n 'Microsoft.ReactNative.Uwp.CSharpApp.targets',\n )\n ) {\n result.projectType = 'app';\n result.projectArch = 'old';\n } else if (\n importProjectExists(\n projectContents,\n 'Microsoft.ReactNative.Uwp.CSharpLib.targets',\n )\n ) {\n result.projectType = 'lib';\n result.projectArch = 'old';\n }\n } else if (result.projectLang === 'cpp') {\n if (\n importProjectExists(\n projectContents,\n 'Microsoft.ReactNative.Uwp.CppApp.targets',\n )\n ) {\n result.projectType = 'app';\n result.projectArch = 'old';\n } else if (\n importProjectExists(\n projectContents,\n 'Microsoft.ReactNative.Uwp.CppLib.targets',\n )\n ) {\n result.projectType = 'lib';\n result.projectArch = 'old';\n } else if (\n importProjectExists(\n projectContents,\n 'Microsoft.ReactNative.Composition.CppApp.targets',\n )\n ) {\n result.projectType = 'app';\n result.projectArch = 'new';\n } else if (\n importProjectExists(\n projectContents,\n 'Microsoft.ReactNative.Composition.CppLib.targets',\n )\n ) {\n result.projectType = 'lib';\n result.projectArch = 'new';\n } else if (\n importProjectExists(\n projectContents,\n 'Microsoft.ReactNative.CppLib.targets',\n )\n ) {\n result.projectType = 'lib';\n result.projectArch = 'mixed';\n }\n }\n\n return result;\n}\n\n/**\n * Checks if the target file path is a RNW lib project file.\n * @param filePath The absolute file path to check.\n * @return Whether the path is to a RNW lib project file.\n */\nexport function isRnwDependencyProject(filePath: string): boolean {\n const rawTemplateInfo = getRawTemplateInfo(filePath);\n return rawTemplateInfo.projectType === 'lib';\n}\n\n/**\n * Search for the RNW lib project files under the target folder.\n * @param winFolder The absolute path to target folder.\n * @return Return the array of relative file paths.\n */\nexport function findDependencyProjectFiles(winFolder: string): string[] {\n // First, search for all potential project files\n const allCppProj = findFiles(winFolder, '*.vcxproj');\n const allCsProj = findFiles(winFolder, '*.csproj');\n\n const allProjects = allCppProj.concat(allCsProj);\n\n if (allProjects.length === 0) {\n // If there're no project files, return 0\n return [];\n }\n\n const dependencyProjectFiles = [];\n\n // Try to find any project file that appears to be a dependency project\n for (const projectFile of allProjects) {\n // A project is marked as a RNW dependency iff either:\n // - If the project has the standard native module imports, or\n // - If we only have a single project (and it doesn't have the standard native module imports),\n // pick it and hope for the best. This enables autolinking for modules that were written\n // before the standard native module template existed.\n if (\n allProjects.length === 1 ||\n isRnwDependencyProject(path.join(winFolder, projectFile))\n ) {\n dependencyProjectFiles.push(path.normalize(projectFile));\n }\n }\n\n return dependencyProjectFiles;\n}\n\n/**\n * Checks if the target file path is a RNW app project file.\n * @param filePath The absolute file path to check.\n * @return Whether the path is to a RNW app project file.\n */\nexport function isRnwAppProject(filePath: string): boolean {\n const rawTemplateInfo = getRawTemplateInfo(filePath);\n return rawTemplateInfo.projectType === 'app';\n}\n\n/**\n * Search for the RNW app project files under the target folder.\n * @param winFolder The absolute path to target folder.\n * @return Return the array of relative file paths.\n */\nexport function findAppProjectFiles(winFolder: string): string[] {\n // First, search for all potential project files\n const allCppProj = findFiles(winFolder, '*.vcxproj');\n const allCsProj = findFiles(winFolder, '*.csproj');\n\n const allProjects = allCppProj.concat(allCsProj);\n\n if (allProjects.length === 0) {\n // If there're no project files, return 0\n return [];\n }\n\n const appProjectFiles = [];\n\n // Try to find any project file that appears to be an app project\n for (const projectFile of allProjects) {\n if (isRnwAppProject(path.join(winFolder, projectFile))) {\n appProjectFiles.push(path.normalize(projectFile));\n }\n }\n\n return appProjectFiles;\n}\n\n/**\n * Returns the programming language of the project file.\n * @param projectPath The project file path to check.\n * @return The language string: cpp, cs, or null if unknown.\n */\nexport function getProjectLanguage(projectPath: string): 'cpp' | 'cs' | null {\n if (projectPath.endsWith('.vcxproj')) {\n return 'cpp';\n } else if (projectPath.endsWith('.csproj')) {\n return 'cs';\n }\n\n return null;\n}\n\n/**\n * Reads in the contents of the target project file.\n * @param projectPath The target project file path.\n * @return The project file contents.\n */\nexport function readProjectFile(projectPath: string) {\n const projectContents = fs.readFileSync(projectPath, 'utf8').toString();\n return new DOMParser().parseFromString(projectContents, 'application/xml');\n}\n\n/**\n * Search for the given property in the project contents and return its value.\n * @param projectContents The XML project contents.\n * @param propertyName The property to look for.\n * @return The value of the tag if it exists.\n */\nexport function tryFindPropertyValue(\n projectContents: Node,\n propertyName: string,\n): string | null {\n const nodes = msbuildSelect(\n `//msbuild:PropertyGroup/msbuild:${propertyName}`,\n projectContents,\n );\n\n if (nodes.length > 0) {\n // Take the last one\n return (nodes[nodes.length - 1] as Node).textContent;\n } else {\n const noNamespaceNodes = xpath.select(\n `//PropertyGroup/${propertyName}`,\n projectContents,\n );\n if (noNamespaceNodes.length > 0) {\n return (noNamespaceNodes[noNamespaceNodes.length - 1] as Node)\n .textContent;\n }\n }\n\n return null;\n}\n\n/**\n * Search for the given property in the project contents and return its value.\n * @param projectContents The XML project contents.\n * @param propertyName The property to look for.\n * @return The value of the tag if it exists.\n */\nexport function tryFindPropertyValueAsBoolean(\n projectContents: Node,\n propertyName: string,\n): boolean | null {\n const rawValue = tryFindPropertyValue(projectContents, propertyName);\n\n switch (rawValue) {\n case 'true':\n return true;\n case 'false':\n return false;\n default:\n return null;\n }\n}\n\nexport function findPropertyValue(\n projectContents: Node,\n propertyName: string,\n filePath: string,\n): string {\n const res = tryFindPropertyValue(projectContents, propertyName);\n if (!res) {\n throw new CodedError(\n 'NoPropertyInProject',\n `Couldn't find property ${propertyName} from ${filePath}`,\n {propertyName: propertyName},\n );\n }\n return res;\n}\n\n/**\n * Search for the given import project in the project contents and return if it exists.\n * @param projectContents The XML project contents.\n * @param projectName The project to look for.\n * @return If the target exists.\n */\nexport function importProjectExists(\n projectContents: Node,\n projectName: string,\n): boolean {\n const nodes = msbuildSelect(\n `//msbuild:Import[contains(@Project,'${projectName}')]`,\n projectContents,\n );\n\n return nodes.length > 0;\n}\n\nexport type ConfigurationType =\n | 'application'\n | 'dynamiclibrary'\n | 'generic'\n | 'staticlibrary'\n | 'unknown';\n\n/**\n * Gets the configuration type of the project from the project contents.\n * @param projectContents The XML project contents.\n * @return The project configuration type.\n */\nexport function getConfigurationType(projectContents: Node): ConfigurationType {\n const configurationType = tryFindPropertyValue(\n projectContents,\n 'ConfigurationType',\n )?.toLowerCase();\n\n switch (configurationType) {\n case 'application':\n case 'dynamiclibrary':\n case 'generic':\n case 'staticlibrary':\n return configurationType;\n\n default:\n return 'unknown';\n }\n}\n\nexport type OutputType =\n | 'appcontainerexe'\n | 'exe'\n | 'library'\n | 'module'\n | 'unknown'\n | 'winexe'\n | 'winmdobj';\n\n/**\n * Gets the output type of the project from the project contents.\n * @param projectContents The XML project contents.\n * @return The project output type.\n */\nexport function getOutputType(projectContents: Node): OutputType {\n const outputType = tryFindPropertyValue(\n projectContents,\n 'OutputType',\n )?.toLowerCase();\n\n switch (outputType) {\n case 'appcontainerexe':\n case 'exe':\n case 'library':\n case 'module':\n case 'winexe':\n case 'winmdobj':\n return outputType;\n\n default:\n return 'unknown';\n }\n}\n\n/**\n * Gets the type of the project from the project contents.\n * @param projectPath The project file path to check.\n * @param projectContents The XML project contents.\n * @return The project type.\n */\nexport function getProjectType(\n projectPath: string,\n projectContents: Node,\n): ConfigurationType | OutputType {\n switch (getProjectLanguage(projectPath)) {\n case 'cpp':\n return getConfigurationType(projectContents);\n\n case 'cs':\n return getOutputType(projectContents);\n\n default:\n return 'unknown';\n }\n}\n\n/**\n * Gets the name of the project from the project contents.\n * @param projectPath The project file path to check.\n * @param projectContents The XML project contents.\n * @return The project name.\n */\nexport function getProjectName(\n projectPath: string,\n projectContents: Node,\n): string {\n const name =\n tryFindPropertyValue(projectContents, 'ProjectName') ||\n path.parse(projectPath).name ||\n '';\n\n return name;\n}\n\n/**\n * Gets the namespace of the project from the project contents.\n * @param projectContents The XML project contents.\n * @return The project namespace.\n */\nexport function getProjectNamespace(projectContents: Node): string | null {\n return tryFindPropertyValue(projectContents, 'RootNamespace');\n}\n\n/**\n * Gets the guid of the project from the project contents.\n * @param projectContents The XML project contents.\n * @return The project guid.\n */\nexport function getProjectGuid(projectContents: Node): string | null {\n return tryFindPropertyValue(projectContents, 'ProjectGuid');\n}\n\nexport function getExperimentalFeatures(\n solutionDir: string,\n): Record<string, string> | undefined {\n const propsFile = path.join(solutionDir, 'ExperimentalFeatures.props');\n\n if (!fs.existsSync(propsFile)) {\n return undefined;\n }\n\n const result: Record<string, any> = {};\n const propsContents = readProjectFile(propsFile);\n const nodes = msbuildSelect(\n `//msbuild:PropertyGroup/msbuild:*`,\n propsContents,\n );\n for (const node of nodes) {\n const propertyNode = node as Node;\n result[propertyNode.nodeName] = propertyNode.textContent;\n }\n return result;\n}\n\nexport function getRnwConfig(\n root: string,\n projectFile: string,\n): Record<string, any> | undefined {\n const pkgPath = path.join(root, 'package.json');\n const pkgJson = fs.existsSync(pkgPath)\n ? require(path.join(root, 'package.json'))\n : {};\n\n const config: Record<string, any> = pkgJson['react-native-windows'] ?? {};\n\n // if init-windows is missing (most existing projects), try to auto-calculate it\n config['init-windows'] ??= {};\n if (!config['init-windows'].template) {\n const info = getRawTemplateInfo(projectFile);\n if (info.projectArch && info.projectLang && info.projectType) {\n config['init-windows'].template = `${\n info.projectArch === 'old' ? 'old/uwp-' : ''\n }${info.projectLang}-${info.projectType}`;\n }\n }\n\n return config;\n}\n"]}
|