microsoft/vscode-react-native

Public

mirrored from https://github.com/microsoft/vscode-react-nativeAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
timeout-constant-configuration-file

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

src/extension/android/packageNameResolver.ts

98lines · modeblame

8953be57dlebu10 years ago1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT license. See LICENSE file in the project root for details.
3
4import * as path from "path";
09f6024fHeniker4 years ago5import { FileSystem } from "../../common/node/fileSystem";
8953be57dlebu10 years ago6
7export class PackageNameResolver {
2010d4e2dlebu10 years ago8private static PackageNameRegexp: RegExp = /package="(.+?)"/;
5ef47d7dHarshvardhan Joshi5 months ago9private static ApplicationIdRegexp: RegExp = /applicationId\s+(=)?\s*["'](.+?)["']/;
8953be57dlebu10 years ago10private static ManifestName = "AndroidManifest.xml";
5ef47d7dHarshvardhan Joshi5 months ago11private static GradleBuildName = "build.gradle";
8953be57dlebu10 years ago12private static DefaultPackagePrefix = "com.";
2010d4e2dlebu10 years ago13private static SourceRootRelPath: string[] = ["android", "app", "src", "main"];
34472878RedMickey5 years ago14private static DefaultManifestLocation: string[] = PackageNameResolver.SourceRootRelPath.concat(
15PackageNameResolver.ManifestName,
16);
5ef47d7dHarshvardhan Joshi5 months ago17private static DefaultGradleBuildLocation: string[] = [
18"android",
19"app",
20PackageNameResolver.GradleBuildName,
21];
2010d4e2dlebu10 years ago22private applicationName: string;
23
24constructor(applicationName: string) {
25this.applicationName = applicationName;
26}
8953be57dlebu10 years ago27
00eab8a8dlebu10 years ago28/**
29* Tries to find the package name in AndroidManifest.xml. If not found, it returns the default package name,
30* which is the application name prefixed with the default prefix.
31*/
5ef47d7dHarshvardhan Joshi5 months ago32public async resolvePackageName(projectRoot: string): Promise<string> {
33const expectedGradleBuildPath = path.join.apply(
34this,
35[projectRoot].concat(PackageNameResolver.DefaultGradleBuildLocation),
36);
37const gradlePackageName = await this.readApplicationId(expectedGradleBuildPath);
38if (gradlePackageName) {
39return gradlePackageName;
40}
41
09f6024fHeniker4 years ago42const expectedAndroidManifestPath = path.join.apply(
34472878RedMickey5 years ago43this,
44[projectRoot].concat(PackageNameResolver.DefaultManifestLocation),
45);
2010d4e2dlebu10 years ago46return this.readPackageName(expectedAndroidManifestPath);
8953be57dlebu10 years ago47}
48
5ef47d7dHarshvardhan Joshi5 months ago49private async readApplicationId(gradlePath: string): Promise<string | null> {
50if (gradlePath) {
51const fs = new FileSystem();
52if (await fs.exists(gradlePath)) {
53const content = await fs.readFile(gradlePath);
54const match = content.toString().match(PackageNameResolver.ApplicationIdRegexp);
55return match ? match[2] : null;
56}
57}
58return null;
59}
60
8953be57dlebu10 years ago61/**
62* Given a manifest file path, it parses the file and returns the package name.
63* If the package name cannot be parsed, the default packge name is returned.
64*/
0d77292aJiglioNero4 years ago65private async readPackageName(manifestPath: string): Promise<string> {
8953be57dlebu10 years ago66if (manifestPath) {
09f6024fHeniker4 years ago67const fs = new FileSystem();
0d77292aJiglioNero4 years ago68const exists = await fs.exists(manifestPath);
69if (exists) {
70const manifestContent = await fs.readFile(manifestPath);
71let packageName = this.parsePackageName(manifestContent.toString());
72if (!packageName) {
73packageName = this.getDefaultPackageName(this.applicationName);
8953be57dlebu10 years ago74}
0d77292aJiglioNero4 years ago75return packageName;
76}
77return this.getDefaultPackageName(this.applicationName);
8953be57dlebu10 years ago78}
09f6024fHeniker4 years ago79return this.getDefaultPackageName(this.applicationName);
8953be57dlebu10 years ago80}
81
00eab8a8dlebu10 years ago82/**
bc6696cbdigeff10 years ago83* Gets the default package name, based on the application name.
00eab8a8dlebu10 years ago84*/
8953be57dlebu10 years ago85private getDefaultPackageName(applicationName: string): string {
c7d7ba55digeff10 years ago86return (PackageNameResolver.DefaultPackagePrefix + applicationName).toLowerCase();
8953be57dlebu10 years ago87}
88
89/**
90* Parses the application package name from the contents of an Android manifest file.
91* If a match was found, it is returned. Otherwise null is returned.
92*/
93private parsePackageName(manifestContents: string) {
94// first we remove all the comments from the file
09f6024fHeniker4 years ago95const match = manifestContents.match(PackageNameResolver.PackageNameRegexp);
8953be57dlebu10 years ago96return match ? match[1] : null;
97}
34472878RedMickey5 years ago98}