@expo/config-plugins 4.1.1 → 4.1.4

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.
Files changed (56) hide show
  1. package/build/android/BuildProperties.d.ts +28 -0
  2. package/build/android/BuildProperties.js +96 -0
  3. package/build/android/BuildProperties.js.map +1 -0
  4. package/build/android/Manifest.d.ts +7 -0
  5. package/build/android/Manifest.js +36 -0
  6. package/build/android/Manifest.js.map +1 -1
  7. package/build/android/Package.js +1 -1
  8. package/build/android/Package.js.map +1 -1
  9. package/build/android/Permissions.d.ts +3 -1
  10. package/build/android/Permissions.js +42 -28
  11. package/build/android/Permissions.js.map +1 -1
  12. package/build/android/codeMod.js +1 -1
  13. package/build/android/codeMod.js.map +1 -1
  14. package/build/android/index.d.ts +2 -2
  15. package/build/android/index.js +18 -18
  16. package/build/android/index.js.map +1 -1
  17. package/build/ios/BuildProperties.d.ts +27 -0
  18. package/build/ios/BuildProperties.js +83 -0
  19. package/build/ios/BuildProperties.js.map +1 -0
  20. package/build/ios/BuildScheme.js +6 -3
  21. package/build/ios/BuildScheme.js.map +1 -1
  22. package/build/ios/Entitlements.d.ts +5 -1
  23. package/build/ios/Entitlements.js +57 -58
  24. package/build/ios/Entitlements.js.map +1 -1
  25. package/build/ios/Locales.js +1 -1
  26. package/build/ios/Locales.js.map +1 -1
  27. package/build/ios/Paths.d.ts +1 -3
  28. package/build/ios/Paths.js +12 -16
  29. package/build/ios/Paths.js.map +1 -1
  30. package/build/ios/Target.d.ts +1 -0
  31. package/build/ios/Target.js +11 -1
  32. package/build/ios/Target.js.map +1 -1
  33. package/build/ios/index.d.ts +2 -2
  34. package/build/ios/index.js +19 -19
  35. package/build/ios/index.js.map +1 -1
  36. package/build/ios/utils/Xcodeproj.d.ts +2 -1
  37. package/build/ios/utils/Xcodeproj.js +4 -1
  38. package/build/ios/utils/Xcodeproj.js.map +1 -1
  39. package/build/plugins/ios-plugins.d.ts +2 -2
  40. package/build/plugins/ios-plugins.js.map +1 -1
  41. package/build/plugins/withIosBaseMods.js +27 -7
  42. package/build/plugins/withIosBaseMods.js.map +1 -1
  43. package/build/utils/BuildProperties.types.d.ts +25 -0
  44. package/build/utils/BuildProperties.types.js +2 -0
  45. package/build/utils/BuildProperties.types.js.map +1 -0
  46. package/build/utils/modules.js +1 -1
  47. package/build/utils/modules.js.map +1 -1
  48. package/build/utils/versions.js +2 -2
  49. package/build/utils/versions.js.map +1 -1
  50. package/package.json +3 -3
  51. package/build/android/JsEngine.d.ts +0 -8
  52. package/build/android/JsEngine.js +0 -59
  53. package/build/android/JsEngine.js.map +0 -1
  54. package/build/ios/JsEngine.d.ts +0 -8
  55. package/build/ios/JsEngine.js +0 -47
  56. package/build/ios/JsEngine.js.map +0 -1
@@ -0,0 +1,28 @@
1
+ import type { ExpoConfig } from '@expo/config-types';
2
+ import type { ConfigPlugin } from '../Plugin.types';
3
+ import { BuildPropertiesConfig, ConfigToPropertyRuleType } from '../utils/BuildProperties.types';
4
+ import type { PropertiesItem } from './Properties';
5
+ /**
6
+ * Creates a `withGradleProperties` config-plugin based on given config to property mapping rules.
7
+ *
8
+ * The factory supports two modes from generic type inference
9
+ * ```ts
10
+ * // config-plugin without `props`, it will implicitly use the expo config as source config.
11
+ * createBuildGradlePropsConfigPlugin<ExpoConfig>(): ConfigPlugin<void>;
12
+ *
13
+ * // config-plugin with a parameter `props: CustomType`, it will use the `props` as source config.
14
+ * createBuildGradlePropsConfigPlugin<CustomType>(): ConfigPlugin<CustomType>;
15
+ * ```
16
+ *
17
+ * @param configToPropertyRules config to property mapping rules
18
+ * @param name the config plugin name
19
+ */
20
+ export declare function createBuildGradlePropsConfigPlugin<SourceConfigType extends BuildPropertiesConfig>(configToPropertyRules: ConfigToPropertyRuleType<SourceConfigType>[], name?: string): ConfigPlugin<SourceConfigType extends ExpoConfig ? void : SourceConfigType>;
21
+ /**
22
+ * A config-plugin to update `android/gradle.properties` from the `jsEngine` in expo config
23
+ */
24
+ export declare const withJsEngineGradleProps: ConfigPlugin<void>;
25
+ export declare function updateAndroidBuildPropertiesFromConfig<SourceConfigType extends BuildPropertiesConfig>(config: SourceConfigType, gradleProperties: PropertiesItem[], configToPropertyRules: ConfigToPropertyRuleType<SourceConfigType>[]): PropertiesItem[];
26
+ export declare function updateAndroidBuildProperty(gradleProperties: PropertiesItem[], name: string, value: string | null | undefined, options?: {
27
+ removePropWhenValueIsNull?: boolean;
28
+ }): PropertiesItem[];
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createBuildGradlePropsConfigPlugin = createBuildGradlePropsConfigPlugin;
7
+ exports.updateAndroidBuildPropertiesFromConfig = updateAndroidBuildPropertiesFromConfig;
8
+ exports.updateAndroidBuildProperty = updateAndroidBuildProperty;
9
+ exports.withJsEngineGradleProps = void 0;
10
+
11
+ function _androidPlugins() {
12
+ const data = require("../plugins/android-plugins");
13
+
14
+ _androidPlugins = function () {
15
+ return data;
16
+ };
17
+
18
+ return data;
19
+ }
20
+
21
+ /**
22
+ * Creates a `withGradleProperties` config-plugin based on given config to property mapping rules.
23
+ *
24
+ * The factory supports two modes from generic type inference
25
+ * ```ts
26
+ * // config-plugin without `props`, it will implicitly use the expo config as source config.
27
+ * createBuildGradlePropsConfigPlugin<ExpoConfig>(): ConfigPlugin<void>;
28
+ *
29
+ * // config-plugin with a parameter `props: CustomType`, it will use the `props` as source config.
30
+ * createBuildGradlePropsConfigPlugin<CustomType>(): ConfigPlugin<CustomType>;
31
+ * ```
32
+ *
33
+ * @param configToPropertyRules config to property mapping rules
34
+ * @param name the config plugin name
35
+ */
36
+ function createBuildGradlePropsConfigPlugin(configToPropertyRules, name) {
37
+ const withUnknown = (config, sourceConfig) => (0, _androidPlugins().withGradleProperties)(config, config => {
38
+ config.modResults = updateAndroidBuildPropertiesFromConfig(sourceConfig !== null && sourceConfig !== void 0 ? sourceConfig : config, config.modResults, configToPropertyRules);
39
+ return config;
40
+ });
41
+
42
+ if (name) {
43
+ Object.defineProperty(withUnknown, 'name', {
44
+ value: name
45
+ });
46
+ }
47
+
48
+ return withUnknown;
49
+ }
50
+ /**
51
+ * A config-plugin to update `android/gradle.properties` from the `jsEngine` in expo config
52
+ */
53
+
54
+
55
+ const withJsEngineGradleProps = createBuildGradlePropsConfigPlugin([{
56
+ propName: 'expo.jsEngine',
57
+ propValueGetter: config => {
58
+ var _ref, _config$android$jsEng, _config$android;
59
+
60
+ return (_ref = (_config$android$jsEng = (_config$android = config.android) === null || _config$android === void 0 ? void 0 : _config$android.jsEngine) !== null && _config$android$jsEng !== void 0 ? _config$android$jsEng : config.jsEngine) !== null && _ref !== void 0 ? _ref : 'jsc';
61
+ }
62
+ }], 'withJsEngineGradleProps');
63
+ exports.withJsEngineGradleProps = withJsEngineGradleProps;
64
+
65
+ function updateAndroidBuildPropertiesFromConfig(config, gradleProperties, configToPropertyRules) {
66
+ for (const configToProperty of configToPropertyRules) {
67
+ const value = configToProperty.propValueGetter(config);
68
+ updateAndroidBuildProperty(gradleProperties, configToProperty.propName, value);
69
+ }
70
+
71
+ return gradleProperties;
72
+ }
73
+
74
+ function updateAndroidBuildProperty(gradleProperties, name, value, options) {
75
+ const oldPropIndex = gradleProperties.findIndex(prop => prop.type === 'property' && prop.key === name);
76
+
77
+ if (value) {
78
+ // found the matched value, add or merge new property
79
+ const newProp = {
80
+ type: 'property',
81
+ key: name,
82
+ value
83
+ };
84
+
85
+ if (oldPropIndex >= 0) {
86
+ gradleProperties[oldPropIndex] = newProp;
87
+ } else {
88
+ gradleProperties.push(newProp);
89
+ }
90
+ } else if (options !== null && options !== void 0 && options.removePropWhenValueIsNull && oldPropIndex >= 0) {
91
+ gradleProperties.splice(oldPropIndex, 1);
92
+ }
93
+
94
+ return gradleProperties;
95
+ }
96
+ //# sourceMappingURL=BuildProperties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/android/BuildProperties.ts"],"names":["createBuildGradlePropsConfigPlugin","configToPropertyRules","name","withUnknown","config","sourceConfig","modResults","updateAndroidBuildPropertiesFromConfig","Object","defineProperty","value","withJsEngineGradleProps","propName","propValueGetter","android","jsEngine","gradleProperties","configToProperty","updateAndroidBuildProperty","options","oldPropIndex","findIndex","prop","type","key","newProp","push","removePropWhenValueIsNull","splice"],"mappings":";;;;;;;;;;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,kCAAT,CACLC,qBADK,EAELC,IAFK,EAGL;AACA,QAAMC,WAAwF,GAAG,CAC/FC,MAD+F,EAE/FC,YAF+F,KAI/F,4CAAqBD,MAArB,EAA6BA,MAAM,IAAI;AACrCA,IAAAA,MAAM,CAACE,UAAP,GAAoBC,sCAAsC,CACvDF,YADuD,aACvDA,YADuD,cACvDA,YADuD,GACvCD,MADuC,EAExDA,MAAM,CAACE,UAFiD,EAGxDL,qBAHwD,CAA1D;AAKA,WAAOG,MAAP;AACD,GAPD,CAJF;;AAYA,MAAIF,IAAJ,EAAU;AACRM,IAAAA,MAAM,CAACC,cAAP,CAAsBN,WAAtB,EAAmC,MAAnC,EAA2C;AACzCO,MAAAA,KAAK,EAAER;AADkC,KAA3C;AAGD;;AACD,SAAOC,WAAP;AACD;AAED;AACA;AACA;;;AACO,MAAMQ,uBAAuB,GAAGX,kCAAkC,CACvE,CACE;AACEY,EAAAA,QAAQ,EAAE,eADZ;AAEEC,EAAAA,eAAe,EAAET,MAAM;AAAA;;AAAA,+DAAIA,MAAM,CAACU,OAAX,oDAAI,gBAAgBC,QAApB,yEAAgCX,MAAM,CAACW,QAAvC,uCAAmD,KAAnD;AAAA;AAFzB,CADF,CADuE,EAOvE,yBAPuE,CAAlE;;;AAUA,SAASR,sCAAT,CAGLH,MAHK,EAILY,gBAJK,EAKLf,qBALK,EAML;AACA,OAAK,MAAMgB,gBAAX,IAA+BhB,qBAA/B,EAAsD;AACpD,UAAMS,KAAK,GAAGO,gBAAgB,CAACJ,eAAjB,CAAiCT,MAAjC,CAAd;AACAc,IAAAA,0BAA0B,CAACF,gBAAD,EAAmBC,gBAAgB,CAACL,QAApC,EAA8CF,KAA9C,CAA1B;AACD;;AAED,SAAOM,gBAAP;AACD;;AAEM,SAASE,0BAAT,CACLF,gBADK,EAELd,IAFK,EAGLQ,KAHK,EAILS,OAJK,EAKL;AACA,QAAMC,YAAY,GAAGJ,gBAAgB,CAACK,SAAjB,CACnBC,IAAI,IAAIA,IAAI,CAACC,IAAL,KAAc,UAAd,IAA4BD,IAAI,CAACE,GAAL,KAAatB,IAD9B,CAArB;;AAIA,MAAIQ,KAAJ,EAAW;AACT;AACA,UAAMe,OAAuB,GAAG;AAC9BF,MAAAA,IAAI,EAAE,UADwB;AAE9BC,MAAAA,GAAG,EAAEtB,IAFyB;AAG9BQ,MAAAA;AAH8B,KAAhC;;AAMA,QAAIU,YAAY,IAAI,CAApB,EAAuB;AACrBJ,MAAAA,gBAAgB,CAACI,YAAD,CAAhB,GAAiCK,OAAjC;AACD,KAFD,MAEO;AACLT,MAAAA,gBAAgB,CAACU,IAAjB,CAAsBD,OAAtB;AACD;AACF,GAbD,MAaO,IAAIN,OAAO,SAAP,IAAAA,OAAO,WAAP,IAAAA,OAAO,CAAEQ,yBAAT,IAAsCP,YAAY,IAAI,CAA1D,EAA6D;AAClEJ,IAAAA,gBAAgB,CAACY,MAAjB,CAAwBR,YAAxB,EAAsC,CAAtC;AACD;;AAED,SAAOJ,gBAAP;AACD","sourcesContent":["import type { ExpoConfig } from '@expo/config-types';\n\nimport type { ConfigPlugin } from '../Plugin.types';\nimport { withGradleProperties } from '../plugins/android-plugins';\nimport { BuildPropertiesConfig, ConfigToPropertyRuleType } from '../utils/BuildProperties.types';\nimport type { PropertiesItem } from './Properties';\n\n/**\n * Creates a `withGradleProperties` config-plugin based on given config to property mapping rules.\n *\n * The factory supports two modes from generic type inference\n * ```ts\n * // config-plugin without `props`, it will implicitly use the expo config as source config.\n * createBuildGradlePropsConfigPlugin<ExpoConfig>(): ConfigPlugin<void>;\n *\n * // config-plugin with a parameter `props: CustomType`, it will use the `props` as source config.\n * createBuildGradlePropsConfigPlugin<CustomType>(): ConfigPlugin<CustomType>;\n * ```\n *\n * @param configToPropertyRules config to property mapping rules\n * @param name the config plugin name\n */\nexport function createBuildGradlePropsConfigPlugin<SourceConfigType extends BuildPropertiesConfig>(\n configToPropertyRules: ConfigToPropertyRuleType<SourceConfigType>[],\n name?: string\n) {\n const withUnknown: ConfigPlugin<SourceConfigType extends ExpoConfig ? void : SourceConfigType> = (\n config,\n sourceConfig\n ) =>\n withGradleProperties(config, config => {\n config.modResults = updateAndroidBuildPropertiesFromConfig(\n (sourceConfig ?? config) as SourceConfigType,\n config.modResults,\n configToPropertyRules\n );\n return config;\n });\n if (name) {\n Object.defineProperty(withUnknown, 'name', {\n value: name,\n });\n }\n return withUnknown;\n}\n\n/**\n * A config-plugin to update `android/gradle.properties` from the `jsEngine` in expo config\n */\nexport const withJsEngineGradleProps = createBuildGradlePropsConfigPlugin<ExpoConfig>(\n [\n {\n propName: 'expo.jsEngine',\n propValueGetter: config => config.android?.jsEngine ?? config.jsEngine ?? 'jsc',\n },\n ],\n 'withJsEngineGradleProps'\n);\n\nexport function updateAndroidBuildPropertiesFromConfig<\n SourceConfigType extends BuildPropertiesConfig\n>(\n config: SourceConfigType,\n gradleProperties: PropertiesItem[],\n configToPropertyRules: ConfigToPropertyRuleType<SourceConfigType>[]\n) {\n for (const configToProperty of configToPropertyRules) {\n const value = configToProperty.propValueGetter(config);\n updateAndroidBuildProperty(gradleProperties, configToProperty.propName, value);\n }\n\n return gradleProperties;\n}\n\nexport function updateAndroidBuildProperty(\n gradleProperties: PropertiesItem[],\n name: string,\n value: string | null | undefined,\n options?: { removePropWhenValueIsNull?: boolean }\n) {\n const oldPropIndex = gradleProperties.findIndex(\n prop => prop.type === 'property' && prop.key === name\n );\n\n if (value) {\n // found the matched value, add or merge new property\n const newProp: PropertiesItem = {\n type: 'property',\n key: name,\n value,\n };\n\n if (oldPropIndex >= 0) {\n gradleProperties[oldPropIndex] = newProp;\n } else {\n gradleProperties.push(newProp);\n }\n } else if (options?.removePropWhenValueIsNull && oldPropIndex >= 0) {\n gradleProperties.splice(oldPropIndex, 1);\n }\n\n return gradleProperties;\n}\n"],"file":"BuildProperties.js"}
@@ -130,4 +130,11 @@ export declare function addUsesLibraryItemToMainApplication(mainApplication: Man
130
130
  }): ManifestApplication;
131
131
  export declare function removeUsesLibraryItemFromMainApplication(mainApplication: ManifestApplication, itemName: string): ManifestApplication;
132
132
  export declare function prefixAndroidKeys<T extends Record<string, any> = Record<string, string>>(head: T): Record<string, any>;
133
+ /**
134
+ * Ensure the `tools:*` namespace is available in the manifest.
135
+ *
136
+ * @param manifest AndroidManifest.xml
137
+ * @returns manifest with the `tools:*` namespace available
138
+ */
139
+ export declare function ensureToolsAvailable(manifest: AndroidManifest): AndroidManifest;
133
140
  export {};
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.addMetaDataItemToMainApplication = addMetaDataItemToMainApplication;
7
7
  exports.addUsesLibraryItemToMainApplication = addUsesLibraryItemToMainApplication;
8
+ exports.ensureToolsAvailable = ensureToolsAvailable;
8
9
  exports.findMetaDataItem = findMetaDataItem;
9
10
  exports.findUsesLibraryItem = findUsesLibraryItem;
10
11
  exports.getMainActivity = getMainActivity;
@@ -250,4 +251,39 @@ function prefixAndroidKeys(head) {
250
251
  [`android:${key}`]: curr
251
252
  }), {});
252
253
  }
254
+ /**
255
+ * Ensure the `tools:*` namespace is available in the manifest.
256
+ *
257
+ * @param manifest AndroidManifest.xml
258
+ * @returns manifest with the `tools:*` namespace available
259
+ */
260
+
261
+
262
+ function ensureToolsAvailable(manifest) {
263
+ return ensureManifestHasNamespace(manifest, {
264
+ namespace: 'xmlns:tools',
265
+ url: 'http://schemas.android.com/tools'
266
+ });
267
+ }
268
+ /**
269
+ * Ensure a particular namespace is available in the manifest.
270
+ *
271
+ * @param manifest `AndroidManifest.xml`
272
+ * @returns manifest with the provided namespace available
273
+ */
274
+
275
+
276
+ function ensureManifestHasNamespace(manifest, {
277
+ namespace,
278
+ url
279
+ }) {
280
+ var _manifest$manifest, _manifest$manifest$$;
281
+
282
+ if (manifest !== null && manifest !== void 0 && (_manifest$manifest = manifest.manifest) !== null && _manifest$manifest !== void 0 && (_manifest$manifest$$ = _manifest$manifest.$) !== null && _manifest$manifest$$ !== void 0 && _manifest$manifest$$[namespace]) {
283
+ return manifest;
284
+ }
285
+
286
+ manifest.manifest.$[namespace] = url;
287
+ return manifest;
288
+ }
253
289
  //# sourceMappingURL=Manifest.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/android/Manifest.ts"],"names":["writeAndroidManifestAsync","manifestPath","androidManifest","manifestXml","XML","format","fs","promises","mkdir","path","dirname","recursive","writeFile","readAndroidManifestAsync","xml","readXMLAsync","isManifest","Error","manifest","getMainApplication","application","filter","e","$","endsWith","getMainApplicationOrThrow","mainApplication","getMainActivityOrThrow","mainActivity","getMainActivity","getRunnableActivity","enabledActivities","activity","Array","isArray","intentFilter","action","find","category","addMetaDataItemToMainApplication","itemName","itemValue","itemType","existingMetaDataItem","newItem","prefixAndroidKeys","name","length","push","removeMetaDataItemFromMainApplication","index","findMetaDataItem","splice","findApplicationSubItem","parent","findIndex","findUsesLibraryItem","getMainApplicationMetaDataValue","hasOwnProperty","item","addUsesLibraryItemToMainApplication","removeUsesLibraryItemFromMainApplication","head","Object","entries","reduce","prev","key","curr"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;AAoJO,eAAeA,yBAAf,CACLC,YADK,EAELC,eAFK,EAGU;AACf,QAAMC,WAAW,GAAGC,GAAG,GAACC,MAAJ,CAAWH,eAAX,CAApB;AACA,QAAMI,cAAGC,QAAH,CAAYC,KAAZ,CAAkBC,gBAAKC,OAAL,CAAaT,YAAb,CAAlB,EAA8C;AAAEU,IAAAA,SAAS,EAAE;AAAb,GAA9C,CAAN;AACA,QAAML,cAAGC,QAAH,CAAYK,SAAZ,CAAsBX,YAAtB,EAAoCE,WAApC,CAAN;AACD;;AAEM,eAAeU,wBAAf,CAAwCZ,YAAxC,EAAwF;AAC7F,QAAMa,GAAG,GAAG,MAAMV,GAAG,GAACW,YAAJ,CAAiB;AAAEN,IAAAA,IAAI,EAAER;AAAR,GAAjB,CAAlB;;AACA,MAAI,CAACe,UAAU,CAACF,GAAD,CAAf,EAAsB;AACpB,UAAM,IAAIG,KAAJ,CAAU,gCAAgChB,YAA1C,CAAN;AACD;;AACD,SAAOa,GAAP;AACD;;AAED,SAASE,UAAT,CAAoBF,GAApB,EAAgE;AAC9D;AACA,SAAO,CAAC,CAACA,GAAG,CAACI,QAAb;AACD;AAED;;;AACO,SAASC,kBAAT,CAA4BjB,eAA5B,EAA0F;AAAA;;AAC/F,kCACEA,eADF,aACEA,eADF,iDACEA,eAAe,CAAEgB,QADnB,qFACE,uBAA2BE,WAD7B,2DACE,uBAAwCC,MAAxC,CAA+CC,CAAC;AAAA;;AAAA,WAC9CA,CAD8C,aAC9CA,CAD8C,+BAC9CA,CAAC,CAAEC,CAD2C,yCAC9C,KAAO,cAAP,EAAuBC,QAAvB,CAAgC,kBAAhC,CAD8C;AAAA,GAAhD,EAEE,CAFF,CADF,yEAGU,IAHV;AAKD;;AAEM,SAASC,yBAAT,CAAmCvB,eAAnC,EAA0F;AAC/F,QAAMwB,eAAe,GAAGP,kBAAkB,CAACjB,eAAD,CAA1C;AACA,yBAAOwB,eAAP,EAAwB,qEAAxB;AACA,SAAOA,eAAP;AACD;;AAEM,SAASC,sBAAT,CAAgCzB,eAAhC,EAAoF;AACzF,QAAM0B,YAAY,GAAGC,eAAe,CAAC3B,eAAD,CAApC;AACA,yBAAO0B,YAAP,EAAqB,kEAArB;AACA,SAAOA,YAAP;AACD;;AAEM,SAASE,mBAAT,CAA6B5B,eAA7B,EAAwF;AAAA;;AAC7F;AACA,QAAM6B,iBAAiB,GAAG7B,eAAH,aAAGA,eAAH,iDAAGA,eAAe,CAAEgB,QAApB,qFAAG,uBAA2BE,WAA9B,qFAAG,uBAAyC,CAAzC,CAAH,qFAAG,uBAA6CY,QAAhD,qFAAG,uBAAuDX,MAA1D,2DAAG,oDACvBC,CAAD,IAAYA,CAAC,CAACC,CAAF,CAAI,iBAAJ,MAA2B,OAA3B,IAAsCD,CAAC,CAACC,CAAF,CAAI,iBAAJ,MAA2B,KADrD,CAA1B;;AAIA,MAAI,CAACQ,iBAAL,EAAwB;AACtB,WAAO,IAAP;AACD,GAR4F,CAU7F;;;AACA,OAAK,MAAMC,QAAX,IAAuBD,iBAAvB,EAA0C;AACxC,QAAIE,KAAK,CAACC,OAAN,CAAcF,QAAQ,CAAC,eAAD,CAAtB,CAAJ,EAA8C;AAC5C,WAAK,MAAMG,YAAX,IAA2BH,QAAQ,CAAC,eAAD,CAAnC,EAAsD;AAAA;;AACpD,YACE,wBAAAG,YAAY,CAACC,MAAb,sEAAqBC,IAArB,CACED,MAAM,IAAIA,MAAM,CAACb,CAAP,CAAS,cAAT,MAA6B,4BADzC,8BAGAY,YAAY,CAACG,QAHb,kDAGA,sBAAuBD,IAAvB,CACEC,QAAQ,IAAIA,QAAQ,CAACf,CAAT,CAAW,cAAX,MAA+B,kCAD7C,CAJF,EAOE;AACA,iBAAOS,QAAP;AACD;AACF;AACF;AACF;;AAED,SAAO,IAAP;AACD;;AAEM,SAASH,eAAT,CAAyB3B,eAAzB,EAAoF;AAAA;;AACzF,QAAM0B,YAAY,GAAG1B,eAAH,aAAGA,eAAH,iDAAGA,eAAe,CAAEgB,QAApB,sFAAG,uBAA2BE,WAA9B,uFAAG,wBAAyC,CAAzC,CAAH,uFAAG,wBAA6CY,QAAhD,uFAAG,wBAAuDX,MAA1D,4DAAG,sDAClBC,CAAD,IAAYA,CAAC,CAACC,CAAF,CAAI,cAAJ,MAAwB,eADjB,CAArB;AAGA,2BAAOK,YAAP,aAAOA,YAAP,uBAAOA,YAAY,CAAG,CAAH,CAAnB,2DAA4B,IAA5B;AACD;;AAEM,SAASW,gCAAT,CACLb,eADK,EAELc,QAFK,EAGLC,SAHK,EAILC,QAA8B,GAAG,OAJ5B,EAKgB;AACrB,MAAIC,oBAAJ;AACA,QAAMC,OAAO,GAAG;AACdrB,IAAAA,CAAC,EAAEsB,iBAAiB,CAAC;AAAEC,MAAAA,IAAI,EAAEN,QAAR;AAAkB,OAACE,QAAD,GAAYD;AAA9B,KAAD;AADN,GAAhB;;AAGA,MAAIf,eAAe,CAAC,WAAD,CAAnB,EAAkC;AAChCiB,IAAAA,oBAAoB,GAAGjB,eAAe,CAAC,WAAD,CAAf,CAA6BL,MAA7B,CACpBC,CAAD,IAAYA,CAAC,CAACC,CAAF,CAAI,cAAJ,MAAwBiB,QADf,CAAvB;;AAGA,QAAIG,oBAAoB,CAACI,MAAzB,EAAiC;AAC/BJ,MAAAA,oBAAoB,CAAC,CAAD,CAApB,CAAwBpB,CAAxB,CACG,WAAUmB,QAAS,EADtB,IAEID,SAFJ;AAGD,KAJD,MAIO;AACLf,MAAAA,eAAe,CAAC,WAAD,CAAf,CAA6BsB,IAA7B,CAAkCJ,OAAlC;AACD;AACF,GAXD,MAWO;AACLlB,IAAAA,eAAe,CAAC,WAAD,CAAf,GAA+B,CAACkB,OAAD,CAA/B;AACD;;AACD,SAAOlB,eAAP;AACD;;AAEM,SAASuB,qCAAT,CAA+CvB,eAA/C,EAAqEc,QAArE,EAAuF;AAC5F,QAAMU,KAAK,GAAGC,gBAAgB,CAACzB,eAAD,EAAkBc,QAAlB,CAA9B;;AACA,MAAId,eAAe,SAAf,IAAAA,eAAe,WAAf,IAAAA,eAAe,CAAG,WAAH,CAAf,IAAkCwB,KAAK,GAAG,CAAC,CAA/C,EAAkD;AAChDxB,IAAAA,eAAe,CAAC,WAAD,CAAf,CAA6B0B,MAA7B,CAAoCF,KAApC,EAA2C,CAA3C;AACD;;AACD,SAAOxB,eAAP;AACD;;AAED,SAAS2B,sBAAT,CACE3B,eADF,EAEEY,QAFF,EAGEE,QAHF,EAIU;AACR,QAAMc,MAAM,GAAG5B,eAAe,CAACY,QAAD,CAA9B;;AACA,MAAIL,KAAK,CAACC,OAAN,CAAcoB,MAAd,CAAJ,EAA2B;AACzB,UAAMJ,KAAK,GAAGI,MAAM,CAACC,SAAP,CAAkBjC,CAAD,IAAYA,CAAC,CAACC,CAAF,CAAI,cAAJ,MAAwBiB,QAArD,CAAd;AAEA,WAAOU,KAAP;AACD;;AACD,SAAO,CAAC,CAAR;AACD;;AAEM,SAASC,gBAAT,CAA0BzB,eAA1B,EAAgDc,QAAhD,EAA0E;AAC/E,SAAOa,sBAAsB,CAAC3B,eAAD,EAAkB,WAAlB,EAA+Bc,QAA/B,CAA7B;AACD;;AAEM,SAASgB,mBAAT,CAA6B9B,eAA7B,EAAmDc,QAAnD,EAA6E;AAClF,SAAOa,sBAAsB,CAAC3B,eAAD,EAAkB,cAAlB,EAAkCc,QAAlC,CAA7B;AACD;;AAEM,SAASiB,+BAAT,CACLvD,eADK,EAEL4C,IAFK,EAGU;AACf,QAAMpB,eAAe,GAAGP,kBAAkB,CAACjB,eAAD,CAA1C;;AAEA,MAAIwB,eAAJ,aAAIA,eAAJ,eAAIA,eAAe,CAAEgC,cAAjB,CAAgC,WAAhC,CAAJ,EAAkD;AAAA;;AAChD,UAAMC,IAAI,GAAGjC,eAAH,aAAGA,eAAH,gDAAGA,eAAe,CAAG,WAAH,CAAlB,0DAAG,sBAAgCW,IAAhC,CAAsCf,CAAD,IAAYA,CAAC,CAACC,CAAF,CAAI,cAAJ,MAAwBuB,IAAzE,CAAb;AACA,mCAAOa,IAAP,aAAOA,IAAP,uBAAOA,IAAI,CAAEpC,CAAN,CAAQ,eAAR,CAAP,uEAAmC,IAAnC;AACD;;AAED,SAAO,IAAP;AACD;;AAEM,SAASqC,mCAAT,CACLlC,eADK,EAELiC,IAFK,EAGgB;AACrB,MAAIhB,oBAAJ;AACA,QAAMC,OAAO,GAAG;AACdrB,IAAAA,CAAC,EAAEsB,iBAAiB,CAACc,IAAD;AADN,GAAhB;;AAIA,MAAIjC,eAAe,CAAC,cAAD,CAAnB,EAAqC;AACnCiB,IAAAA,oBAAoB,GAAGjB,eAAe,CAAC,cAAD,CAAf,CAAgCL,MAAhC,CACrBC,CAAC,IAAIA,CAAC,CAACC,CAAF,CAAI,cAAJ,MAAwBoC,IAAI,CAACb,IADb,CAAvB;;AAGA,QAAIH,oBAAoB,CAACI,MAAzB,EAAiC;AAC/BJ,MAAAA,oBAAoB,CAAC,CAAD,CAApB,CAAwBpB,CAAxB,GAA4BqB,OAAO,CAACrB,CAApC;AACD,KAFD,MAEO;AACLG,MAAAA,eAAe,CAAC,cAAD,CAAf,CAAgCsB,IAAhC,CAAqCJ,OAArC;AACD;AACF,GATD,MASO;AACLlB,IAAAA,eAAe,CAAC,cAAD,CAAf,GAAkC,CAACkB,OAAD,CAAlC;AACD;;AACD,SAAOlB,eAAP;AACD;;AAEM,SAASmC,wCAAT,CACLnC,eADK,EAELc,QAFK,EAGL;AACA,QAAMU,KAAK,GAAGM,mBAAmB,CAAC9B,eAAD,EAAkBc,QAAlB,CAAjC;;AACA,MAAId,eAAe,SAAf,IAAAA,eAAe,WAAf,IAAAA,eAAe,CAAG,cAAH,CAAf,IAAqCwB,KAAK,GAAG,CAAC,CAAlD,EAAqD;AACnDxB,IAAAA,eAAe,CAAC,cAAD,CAAf,CAAgC0B,MAAhC,CAAuCF,KAAvC,EAA8C,CAA9C;AACD;;AACD,SAAOxB,eAAP;AACD;;AAEM,SAASmB,iBAAT,CACLiB,IADK,EAEgB;AACrB;AACA,SAAOC,MAAM,CAACC,OAAP,CAAeF,IAAf,EAAqBG,MAArB,CACL,CAACC,IAAD,EAAO,CAACC,GAAD,EAAMC,IAAN,CAAP,MAAwB,EAAE,GAAGF,IAAL;AAAW,KAAE,WAAUC,GAAI,EAAhB,GAAoBC;AAA/B,GAAxB,CADK,EAEL,EAFK,CAAP;AAID","sourcesContent":["import assert from 'assert';\nimport fs from 'fs';\nimport path from 'path';\n\nimport * as XML from '../utils/XML';\n\nexport type StringBoolean = 'true' | 'false';\n\ntype ManifestMetaDataAttributes = AndroidManifestAttributes & {\n 'android:value'?: string;\n 'android:resource'?: string;\n};\n\ntype AndroidManifestAttributes = {\n 'android:name': string | 'android.intent.action.VIEW';\n 'tools:node'?: string | 'remove';\n};\n\ntype ManifestAction = {\n $: AndroidManifestAttributes;\n};\n\ntype ManifestCategory = {\n $: AndroidManifestAttributes;\n};\n\ntype ManifestData = {\n $: {\n [key: string]: string | undefined;\n 'android:host'?: string;\n 'android:pathPrefix'?: string;\n 'android:scheme'?: string;\n };\n};\n\ntype ManifestReceiver = {\n $: AndroidManifestAttributes & {\n 'android:exported'?: StringBoolean;\n 'android:enabled'?: StringBoolean;\n };\n 'intent-filter'?: ManifestIntentFilter[];\n};\n\nexport type ManifestIntentFilter = {\n $?: {\n 'android:autoVerify'?: StringBoolean;\n 'data-generated'?: StringBoolean;\n };\n action?: ManifestAction[];\n data?: ManifestData[];\n category?: ManifestCategory[];\n};\n\nexport type ManifestMetaData = {\n $: ManifestMetaDataAttributes;\n};\n\ntype ManifestServiceAttributes = AndroidManifestAttributes & {\n 'android:enabled'?: StringBoolean;\n 'android:exported'?: StringBoolean;\n 'android:permission'?: string;\n // ...\n};\n\ntype ManifestService = {\n $: ManifestServiceAttributes;\n 'intent-filter'?: ManifestIntentFilter[];\n};\n\ntype ManifestApplicationAttributes = {\n 'android:name': string | '.MainApplication';\n 'android:icon'?: string;\n 'android:label'?: string;\n 'android:allowBackup'?: StringBoolean;\n 'android:largeHeap'?: StringBoolean;\n 'android:requestLegacyExternalStorage'?: StringBoolean;\n 'android:usesCleartextTraffic'?: StringBoolean;\n [key: string]: string | undefined;\n};\n\nexport type ManifestActivity = {\n $: ManifestApplicationAttributes & {\n 'android:exported'?: StringBoolean;\n 'android:launchMode'?: string;\n 'android:theme'?: string;\n 'android:windowSoftInputMode'?:\n | string\n | 'stateUnspecified'\n | 'stateUnchanged'\n | 'stateHidden'\n | 'stateAlwaysHidden'\n | 'stateVisible'\n | 'stateAlwaysVisible'\n | 'adjustUnspecified'\n | 'adjustResize'\n | 'adjustPan';\n [key: string]: string | undefined;\n };\n 'intent-filter'?: ManifestIntentFilter[];\n // ...\n};\n\nexport type ManifestUsesLibrary = {\n $: AndroidManifestAttributes & {\n 'android:required'?: StringBoolean;\n };\n};\n\nexport type ManifestApplication = {\n $: ManifestApplicationAttributes;\n activity?: ManifestActivity[];\n service?: ManifestService[];\n receiver?: ManifestReceiver[];\n 'meta-data'?: ManifestMetaData[];\n 'uses-library'?: ManifestUsesLibrary[];\n // ...\n};\n\ntype ManifestPermission = {\n $: AndroidManifestAttributes & {\n 'android:protectionLevel'?: string | 'signature';\n };\n};\n\nexport type ManifestUsesPermission = {\n $: AndroidManifestAttributes;\n};\n\ntype ManifestUsesFeature = {\n $: AndroidManifestAttributes & {\n 'android:glEsVersion'?: string;\n 'android:required': StringBoolean;\n };\n};\n\nexport type AndroidManifest = {\n manifest: {\n // Probably more, but this is currently all we'd need for most cases in Expo.\n $: {\n 'xmlns:android': string;\n 'xmlns:tools'?: string;\n package?: string;\n [key: string]: string | undefined;\n };\n permission?: ManifestPermission[];\n 'uses-permission'?: ManifestUsesPermission[];\n 'uses-permission-sdk-23'?: ManifestUsesPermission[];\n 'uses-feature'?: ManifestUsesFeature[];\n application?: ManifestApplication[];\n };\n};\n\nexport async function writeAndroidManifestAsync(\n manifestPath: string,\n androidManifest: AndroidManifest\n): Promise<void> {\n const manifestXml = XML.format(androidManifest);\n await fs.promises.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.promises.writeFile(manifestPath, manifestXml);\n}\n\nexport async function readAndroidManifestAsync(manifestPath: string): Promise<AndroidManifest> {\n const xml = await XML.readXMLAsync({ path: manifestPath });\n if (!isManifest(xml)) {\n throw new Error('Invalid manifest found at: ' + manifestPath);\n }\n return xml;\n}\n\nfunction isManifest(xml: XML.XMLObject): xml is AndroidManifest {\n // TODO: Maybe more validation\n return !!xml.manifest;\n}\n\n/** Returns the `manifest.application` tag ending in `.MainApplication` */\nexport function getMainApplication(androidManifest: AndroidManifest): ManifestApplication | null {\n return (\n androidManifest?.manifest?.application?.filter(e =>\n e?.$?.['android:name'].endsWith('.MainApplication')\n )[0] ?? null\n );\n}\n\nexport function getMainApplicationOrThrow(androidManifest: AndroidManifest): ManifestApplication {\n const mainApplication = getMainApplication(androidManifest);\n assert(mainApplication, 'AndroidManifest.xml is missing the required MainApplication element');\n return mainApplication;\n}\n\nexport function getMainActivityOrThrow(androidManifest: AndroidManifest): ManifestActivity {\n const mainActivity = getMainActivity(androidManifest);\n assert(mainActivity, 'AndroidManifest.xml is missing the required MainActivity element');\n return mainActivity;\n}\n\nexport function getRunnableActivity(androidManifest: AndroidManifest): ManifestActivity | null {\n // Get enabled activities\n const enabledActivities = androidManifest?.manifest?.application?.[0]?.activity?.filter?.(\n (e: any) => e.$['android:enabled'] !== 'false' && e.$['android:enabled'] !== false\n );\n\n if (!enabledActivities) {\n return null;\n }\n\n // Get the activity that has a runnable intent-filter\n for (const activity of enabledActivities) {\n if (Array.isArray(activity['intent-filter'])) {\n for (const intentFilter of activity['intent-filter']) {\n if (\n intentFilter.action?.find(\n action => action.$['android:name'] === 'android.intent.action.MAIN'\n ) &&\n intentFilter.category?.find(\n category => category.$['android:name'] === 'android.intent.category.LAUNCHER'\n )\n ) {\n return activity;\n }\n }\n }\n }\n\n return null;\n}\n\nexport function getMainActivity(androidManifest: AndroidManifest): ManifestActivity | null {\n const mainActivity = androidManifest?.manifest?.application?.[0]?.activity?.filter?.(\n (e: any) => e.$['android:name'] === '.MainActivity'\n );\n return mainActivity?.[0] ?? null;\n}\n\nexport function addMetaDataItemToMainApplication(\n mainApplication: ManifestApplication,\n itemName: string,\n itemValue: string,\n itemType: 'resource' | 'value' = 'value'\n): ManifestApplication {\n let existingMetaDataItem;\n const newItem = {\n $: prefixAndroidKeys({ name: itemName, [itemType]: itemValue }),\n } as ManifestMetaData;\n if (mainApplication['meta-data']) {\n existingMetaDataItem = mainApplication['meta-data'].filter(\n (e: any) => e.$['android:name'] === itemName\n );\n if (existingMetaDataItem.length) {\n existingMetaDataItem[0].$[\n `android:${itemType}` as keyof ManifestMetaDataAttributes\n ] = itemValue;\n } else {\n mainApplication['meta-data'].push(newItem);\n }\n } else {\n mainApplication['meta-data'] = [newItem];\n }\n return mainApplication;\n}\n\nexport function removeMetaDataItemFromMainApplication(mainApplication: any, itemName: string) {\n const index = findMetaDataItem(mainApplication, itemName);\n if (mainApplication?.['meta-data'] && index > -1) {\n mainApplication['meta-data'].splice(index, 1);\n }\n return mainApplication;\n}\n\nfunction findApplicationSubItem(\n mainApplication: ManifestApplication,\n category: keyof ManifestApplication,\n itemName: string\n): number {\n const parent = mainApplication[category];\n if (Array.isArray(parent)) {\n const index = parent.findIndex((e: any) => e.$['android:name'] === itemName);\n\n return index;\n }\n return -1;\n}\n\nexport function findMetaDataItem(mainApplication: any, itemName: string): number {\n return findApplicationSubItem(mainApplication, 'meta-data', itemName);\n}\n\nexport function findUsesLibraryItem(mainApplication: any, itemName: string): number {\n return findApplicationSubItem(mainApplication, 'uses-library', itemName);\n}\n\nexport function getMainApplicationMetaDataValue(\n androidManifest: AndroidManifest,\n name: string\n): string | null {\n const mainApplication = getMainApplication(androidManifest);\n\n if (mainApplication?.hasOwnProperty('meta-data')) {\n const item = mainApplication?.['meta-data']?.find((e: any) => e.$['android:name'] === name);\n return item?.$['android:value'] ?? null;\n }\n\n return null;\n}\n\nexport function addUsesLibraryItemToMainApplication(\n mainApplication: ManifestApplication,\n item: { name: string; required?: boolean }\n): ManifestApplication {\n let existingMetaDataItem;\n const newItem = {\n $: prefixAndroidKeys(item),\n } as ManifestUsesLibrary;\n\n if (mainApplication['uses-library']) {\n existingMetaDataItem = mainApplication['uses-library'].filter(\n e => e.$['android:name'] === item.name\n );\n if (existingMetaDataItem.length) {\n existingMetaDataItem[0].$ = newItem.$;\n } else {\n mainApplication['uses-library'].push(newItem);\n }\n } else {\n mainApplication['uses-library'] = [newItem];\n }\n return mainApplication;\n}\n\nexport function removeUsesLibraryItemFromMainApplication(\n mainApplication: ManifestApplication,\n itemName: string\n) {\n const index = findUsesLibraryItem(mainApplication, itemName);\n if (mainApplication?.['uses-library'] && index > -1) {\n mainApplication['uses-library'].splice(index, 1);\n }\n return mainApplication;\n}\n\nexport function prefixAndroidKeys<T extends Record<string, any> = Record<string, string>>(\n head: T\n): Record<string, any> {\n // prefix all keys with `android:`\n return Object.entries(head).reduce(\n (prev, [key, curr]) => ({ ...prev, [`android:${key}`]: curr }),\n {} as T\n );\n}\n"],"file":"Manifest.js"}
1
+ {"version":3,"sources":["../../src/android/Manifest.ts"],"names":["writeAndroidManifestAsync","manifestPath","androidManifest","manifestXml","XML","format","fs","promises","mkdir","path","dirname","recursive","writeFile","readAndroidManifestAsync","xml","readXMLAsync","isManifest","Error","manifest","getMainApplication","application","filter","e","$","endsWith","getMainApplicationOrThrow","mainApplication","getMainActivityOrThrow","mainActivity","getMainActivity","getRunnableActivity","enabledActivities","activity","Array","isArray","intentFilter","action","find","category","addMetaDataItemToMainApplication","itemName","itemValue","itemType","existingMetaDataItem","newItem","prefixAndroidKeys","name","length","push","removeMetaDataItemFromMainApplication","index","findMetaDataItem","splice","findApplicationSubItem","parent","findIndex","findUsesLibraryItem","getMainApplicationMetaDataValue","hasOwnProperty","item","addUsesLibraryItemToMainApplication","removeUsesLibraryItemFromMainApplication","head","Object","entries","reduce","prev","key","curr","ensureToolsAvailable","ensureManifestHasNamespace","namespace","url"],"mappings":"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","sourcesContent":["import assert from 'assert';\nimport fs from 'fs';\nimport path from 'path';\n\nimport * as XML from '../utils/XML';\n\nexport type StringBoolean = 'true' | 'false';\n\ntype ManifestMetaDataAttributes = AndroidManifestAttributes & {\n 'android:value'?: string;\n 'android:resource'?: string;\n};\n\ntype AndroidManifestAttributes = {\n 'android:name': string | 'android.intent.action.VIEW';\n 'tools:node'?: string | 'remove';\n};\n\ntype ManifestAction = {\n $: AndroidManifestAttributes;\n};\n\ntype ManifestCategory = {\n $: AndroidManifestAttributes;\n};\n\ntype ManifestData = {\n $: {\n [key: string]: string | undefined;\n 'android:host'?: string;\n 'android:pathPrefix'?: string;\n 'android:scheme'?: string;\n };\n};\n\ntype ManifestReceiver = {\n $: AndroidManifestAttributes & {\n 'android:exported'?: StringBoolean;\n 'android:enabled'?: StringBoolean;\n };\n 'intent-filter'?: ManifestIntentFilter[];\n};\n\nexport type ManifestIntentFilter = {\n $?: {\n 'android:autoVerify'?: StringBoolean;\n 'data-generated'?: StringBoolean;\n };\n action?: ManifestAction[];\n data?: ManifestData[];\n category?: ManifestCategory[];\n};\n\nexport type ManifestMetaData = {\n $: ManifestMetaDataAttributes;\n};\n\ntype ManifestServiceAttributes = AndroidManifestAttributes & {\n 'android:enabled'?: StringBoolean;\n 'android:exported'?: StringBoolean;\n 'android:permission'?: string;\n // ...\n};\n\ntype ManifestService = {\n $: ManifestServiceAttributes;\n 'intent-filter'?: ManifestIntentFilter[];\n};\n\ntype ManifestApplicationAttributes = {\n 'android:name': string | '.MainApplication';\n 'android:icon'?: string;\n 'android:label'?: string;\n 'android:allowBackup'?: StringBoolean;\n 'android:largeHeap'?: StringBoolean;\n 'android:requestLegacyExternalStorage'?: StringBoolean;\n 'android:usesCleartextTraffic'?: StringBoolean;\n [key: string]: string | undefined;\n};\n\nexport type ManifestActivity = {\n $: ManifestApplicationAttributes & {\n 'android:exported'?: StringBoolean;\n 'android:launchMode'?: string;\n 'android:theme'?: string;\n 'android:windowSoftInputMode'?:\n | string\n | 'stateUnspecified'\n | 'stateUnchanged'\n | 'stateHidden'\n | 'stateAlwaysHidden'\n | 'stateVisible'\n | 'stateAlwaysVisible'\n | 'adjustUnspecified'\n | 'adjustResize'\n | 'adjustPan';\n [key: string]: string | undefined;\n };\n 'intent-filter'?: ManifestIntentFilter[];\n // ...\n};\n\nexport type ManifestUsesLibrary = {\n $: AndroidManifestAttributes & {\n 'android:required'?: StringBoolean;\n };\n};\n\nexport type ManifestApplication = {\n $: ManifestApplicationAttributes;\n activity?: ManifestActivity[];\n service?: ManifestService[];\n receiver?: ManifestReceiver[];\n 'meta-data'?: ManifestMetaData[];\n 'uses-library'?: ManifestUsesLibrary[];\n // ...\n};\n\ntype ManifestPermission = {\n $: AndroidManifestAttributes & {\n 'android:protectionLevel'?: string | 'signature';\n };\n};\n\nexport type ManifestUsesPermission = {\n $: AndroidManifestAttributes;\n};\n\ntype ManifestUsesFeature = {\n $: AndroidManifestAttributes & {\n 'android:glEsVersion'?: string;\n 'android:required': StringBoolean;\n };\n};\n\nexport type AndroidManifest = {\n manifest: {\n // Probably more, but this is currently all we'd need for most cases in Expo.\n $: {\n 'xmlns:android': string;\n 'xmlns:tools'?: string;\n package?: string;\n [key: string]: string | undefined;\n };\n permission?: ManifestPermission[];\n 'uses-permission'?: ManifestUsesPermission[];\n 'uses-permission-sdk-23'?: ManifestUsesPermission[];\n 'uses-feature'?: ManifestUsesFeature[];\n application?: ManifestApplication[];\n };\n};\n\nexport async function writeAndroidManifestAsync(\n manifestPath: string,\n androidManifest: AndroidManifest\n): Promise<void> {\n const manifestXml = XML.format(androidManifest);\n await fs.promises.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.promises.writeFile(manifestPath, manifestXml);\n}\n\nexport async function readAndroidManifestAsync(manifestPath: string): Promise<AndroidManifest> {\n const xml = await XML.readXMLAsync({ path: manifestPath });\n if (!isManifest(xml)) {\n throw new Error('Invalid manifest found at: ' + manifestPath);\n }\n return xml;\n}\n\nfunction isManifest(xml: XML.XMLObject): xml is AndroidManifest {\n // TODO: Maybe more validation\n return !!xml.manifest;\n}\n\n/** Returns the `manifest.application` tag ending in `.MainApplication` */\nexport function getMainApplication(androidManifest: AndroidManifest): ManifestApplication | null {\n return (\n androidManifest?.manifest?.application?.filter(e =>\n e?.$?.['android:name'].endsWith('.MainApplication')\n )[0] ?? null\n );\n}\n\nexport function getMainApplicationOrThrow(androidManifest: AndroidManifest): ManifestApplication {\n const mainApplication = getMainApplication(androidManifest);\n assert(mainApplication, 'AndroidManifest.xml is missing the required MainApplication element');\n return mainApplication;\n}\n\nexport function getMainActivityOrThrow(androidManifest: AndroidManifest): ManifestActivity {\n const mainActivity = getMainActivity(androidManifest);\n assert(mainActivity, 'AndroidManifest.xml is missing the required MainActivity element');\n return mainActivity;\n}\n\nexport function getRunnableActivity(androidManifest: AndroidManifest): ManifestActivity | null {\n // Get enabled activities\n const enabledActivities = androidManifest?.manifest?.application?.[0]?.activity?.filter?.(\n (e: any) => e.$['android:enabled'] !== 'false' && e.$['android:enabled'] !== false\n );\n\n if (!enabledActivities) {\n return null;\n }\n\n // Get the activity that has a runnable intent-filter\n for (const activity of enabledActivities) {\n if (Array.isArray(activity['intent-filter'])) {\n for (const intentFilter of activity['intent-filter']) {\n if (\n intentFilter.action?.find(\n action => action.$['android:name'] === 'android.intent.action.MAIN'\n ) &&\n intentFilter.category?.find(\n category => category.$['android:name'] === 'android.intent.category.LAUNCHER'\n )\n ) {\n return activity;\n }\n }\n }\n }\n\n return null;\n}\n\nexport function getMainActivity(androidManifest: AndroidManifest): ManifestActivity | null {\n const mainActivity = androidManifest?.manifest?.application?.[0]?.activity?.filter?.(\n (e: any) => e.$['android:name'] === '.MainActivity'\n );\n return mainActivity?.[0] ?? null;\n}\n\nexport function addMetaDataItemToMainApplication(\n mainApplication: ManifestApplication,\n itemName: string,\n itemValue: string,\n itemType: 'resource' | 'value' = 'value'\n): ManifestApplication {\n let existingMetaDataItem;\n const newItem = {\n $: prefixAndroidKeys({ name: itemName, [itemType]: itemValue }),\n } as ManifestMetaData;\n if (mainApplication['meta-data']) {\n existingMetaDataItem = mainApplication['meta-data'].filter(\n (e: any) => e.$['android:name'] === itemName\n );\n if (existingMetaDataItem.length) {\n existingMetaDataItem[0].$[\n `android:${itemType}` as keyof ManifestMetaDataAttributes\n ] = itemValue;\n } else {\n mainApplication['meta-data'].push(newItem);\n }\n } else {\n mainApplication['meta-data'] = [newItem];\n }\n return mainApplication;\n}\n\nexport function removeMetaDataItemFromMainApplication(mainApplication: any, itemName: string) {\n const index = findMetaDataItem(mainApplication, itemName);\n if (mainApplication?.['meta-data'] && index > -1) {\n mainApplication['meta-data'].splice(index, 1);\n }\n return mainApplication;\n}\n\nfunction findApplicationSubItem(\n mainApplication: ManifestApplication,\n category: keyof ManifestApplication,\n itemName: string\n): number {\n const parent = mainApplication[category];\n if (Array.isArray(parent)) {\n const index = parent.findIndex((e: any) => e.$['android:name'] === itemName);\n\n return index;\n }\n return -1;\n}\n\nexport function findMetaDataItem(mainApplication: any, itemName: string): number {\n return findApplicationSubItem(mainApplication, 'meta-data', itemName);\n}\n\nexport function findUsesLibraryItem(mainApplication: any, itemName: string): number {\n return findApplicationSubItem(mainApplication, 'uses-library', itemName);\n}\n\nexport function getMainApplicationMetaDataValue(\n androidManifest: AndroidManifest,\n name: string\n): string | null {\n const mainApplication = getMainApplication(androidManifest);\n\n if (mainApplication?.hasOwnProperty('meta-data')) {\n const item = mainApplication?.['meta-data']?.find((e: any) => e.$['android:name'] === name);\n return item?.$['android:value'] ?? null;\n }\n\n return null;\n}\n\nexport function addUsesLibraryItemToMainApplication(\n mainApplication: ManifestApplication,\n item: { name: string; required?: boolean }\n): ManifestApplication {\n let existingMetaDataItem;\n const newItem = {\n $: prefixAndroidKeys(item),\n } as ManifestUsesLibrary;\n\n if (mainApplication['uses-library']) {\n existingMetaDataItem = mainApplication['uses-library'].filter(\n e => e.$['android:name'] === item.name\n );\n if (existingMetaDataItem.length) {\n existingMetaDataItem[0].$ = newItem.$;\n } else {\n mainApplication['uses-library'].push(newItem);\n }\n } else {\n mainApplication['uses-library'] = [newItem];\n }\n return mainApplication;\n}\n\nexport function removeUsesLibraryItemFromMainApplication(\n mainApplication: ManifestApplication,\n itemName: string\n) {\n const index = findUsesLibraryItem(mainApplication, itemName);\n if (mainApplication?.['uses-library'] && index > -1) {\n mainApplication['uses-library'].splice(index, 1);\n }\n return mainApplication;\n}\n\nexport function prefixAndroidKeys<T extends Record<string, any> = Record<string, string>>(\n head: T\n): Record<string, any> {\n // prefix all keys with `android:`\n return Object.entries(head).reduce(\n (prev, [key, curr]) => ({ ...prev, [`android:${key}`]: curr }),\n {} as T\n );\n}\n\n/**\n * Ensure the `tools:*` namespace is available in the manifest.\n *\n * @param manifest AndroidManifest.xml\n * @returns manifest with the `tools:*` namespace available\n */\nexport function ensureToolsAvailable(manifest: AndroidManifest) {\n return ensureManifestHasNamespace(manifest, {\n namespace: 'xmlns:tools',\n url: 'http://schemas.android.com/tools',\n });\n}\n\n/**\n * Ensure a particular namespace is available in the manifest.\n *\n * @param manifest `AndroidManifest.xml`\n * @returns manifest with the provided namespace available\n */\nfunction ensureManifestHasNamespace(\n manifest: AndroidManifest,\n { namespace, url }: { namespace: string; url: string }\n) {\n if (manifest?.manifest?.$?.[namespace]) {\n return manifest;\n }\n manifest.manifest.$[namespace] = url;\n return manifest;\n}\n"],"file":"Manifest.js"}
@@ -278,7 +278,7 @@ async function renamePackageOnDiskForType({
278
278
 
279
279
  _fs().default.writeFileSync(filepath, contents);
280
280
  }
281
- } catch (e) {
281
+ } catch {
282
282
  debug(`Error updating "${filepath}" for type "${type}"`);
283
283
  }
284
284
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/android/Package.ts"],"names":["debug","withPackageManifest","setPackageInAndroidManifest","withPackageGradle","config","modResults","language","contents","setPackageInBuildGradle","withPackageRefactor","renamePackageOnDisk","modRequest","projectRoot","getPackage","android","package","getPackageRoot","type","path","join","getCurrentPackageName","packageRoot","mainApplication","packagePath","dirname","packagePathParts","relative","split","sep","filter","Boolean","getCurrentPackageForProjectFile","fileName","filePath","getCurrentPackageNameForType","newPackageName","renamePackageOnDiskForType","packageName","currentPackageName","currentPackagePath","newPackagePath","fs","mkdirSync","recursive","cwd","forEach","relativePath","filepath","lstatSync","isFile","moveFileSync","oldPathParts","length","pathToCheck","files","readdirSync","rmdirSync","pop","filesToUpdate","absolute","push","readFileSync","toString","replace","RegExp","writeFileSync","e","src","dest","renameSync","buildGradle","pattern","androidManifest","manifest","$","getApplicationIdAsync","buildGradlePath","existsSync","promises","readFile","matchResult","match"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport Debug from 'debug';\nimport fs from 'fs';\nimport { sync as globSync } from 'glob';\nimport path from 'path';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { createAndroidManifestPlugin, withAppBuildGradle } from '../plugins/android-plugins';\nimport { withDangerousMod } from '../plugins/withDangerousMod';\nimport { directoryExistsAsync } from '../utils/modules';\nimport { addWarningAndroid } from '../utils/warnings';\nimport { AndroidManifest } from './Manifest';\nimport { getAppBuildGradleFilePath, getProjectFilePath } from './Paths';\n\nconst debug = Debug('expo:config-plugins:android:package');\n\nexport const withPackageManifest = createAndroidManifestPlugin(\n setPackageInAndroidManifest,\n 'withPackageManifest'\n);\n\nexport const withPackageGradle: ConfigPlugin = config => {\n return withAppBuildGradle(config, config => {\n if (config.modResults.language === 'groovy') {\n config.modResults.contents = setPackageInBuildGradle(config, config.modResults.contents);\n } else {\n addWarningAndroid(\n 'android.package',\n `Cannot automatically configure app build.gradle if it's not groovy`\n );\n }\n return config;\n });\n};\n\nexport const withPackageRefactor: ConfigPlugin = config => {\n return withDangerousMod(config, [\n 'android',\n async config => {\n await renamePackageOnDisk(config, config.modRequest.projectRoot);\n return config;\n },\n ]);\n};\n\nexport function getPackage(config: Pick<ExpoConfig, 'android'>) {\n return config.android?.package ?? null;\n}\n\nfunction getPackageRoot(projectRoot: string, type: 'main' | 'debug') {\n return path.join(projectRoot, 'android', 'app', 'src', type, 'java');\n}\n\nfunction getCurrentPackageName(projectRoot: string, packageRoot: string) {\n const mainApplication = getProjectFilePath(projectRoot, 'MainApplication');\n const packagePath = path.dirname(mainApplication);\n const packagePathParts = path.relative(packageRoot, packagePath).split(path.sep).filter(Boolean);\n\n return packagePathParts.join('.');\n}\n\nfunction getCurrentPackageForProjectFile(\n projectRoot: string,\n packageRoot: string,\n fileName: string,\n type: string\n) {\n const filePath = globSync(\n path.join(projectRoot, `android/app/src/${type}/java/**/${fileName}.@(java|kt)`)\n )[0];\n\n if (!filePath) {\n return null;\n }\n\n const packagePath = path.dirname(filePath);\n const packagePathParts = path.relative(packageRoot, packagePath).split(path.sep).filter(Boolean);\n\n return packagePathParts.join('.');\n}\n\nfunction getCurrentPackageNameForType(projectRoot: string, type: string): string | null {\n const packageRoot = getPackageRoot(projectRoot, type as any);\n\n if (type === 'main') {\n return getCurrentPackageName(projectRoot, packageRoot);\n }\n // debug, etc..\n return getCurrentPackageForProjectFile(projectRoot, packageRoot, '*', type);\n}\n\n// NOTE(brentvatne): this assumes that our MainApplication.java file is in the root of the package\n// this makes sense for standard react-native projects but may not apply in customized projects, so if\n// we want this to be runnable in any app we need to handle other possibilities\nexport async function renamePackageOnDisk(\n config: Pick<ExpoConfig, 'android'>,\n projectRoot: string\n) {\n const newPackageName = getPackage(config);\n if (newPackageName === null) {\n return;\n }\n\n for (const type of ['main', 'debug']) {\n await renamePackageOnDiskForType({ projectRoot, type, packageName: newPackageName });\n }\n}\n\nexport async function renamePackageOnDiskForType({\n projectRoot,\n type,\n packageName,\n}: {\n projectRoot: string;\n type: string;\n packageName: string;\n}) {\n if (!packageName) {\n return;\n }\n\n const currentPackageName = getCurrentPackageNameForType(projectRoot, type);\n debug(`Found package \"${currentPackageName}\" for type \"${type}\"`);\n if (!currentPackageName || currentPackageName === packageName) {\n return;\n }\n debug(`Refactor \"${currentPackageName}\" to \"${packageName}\" for type \"${type}\"`);\n const packageRoot = getPackageRoot(projectRoot, type as any);\n // Set up our paths\n if (!(await directoryExistsAsync(packageRoot))) {\n debug(`- skipping refactor of missing directory: ${packageRoot}`);\n return;\n }\n\n const currentPackagePath = path.join(packageRoot, ...currentPackageName.split('.'));\n const newPackagePath = path.join(packageRoot, ...packageName.split('.'));\n\n // Create the new directory\n fs.mkdirSync(newPackagePath, { recursive: true });\n\n // Move everything from the old directory over\n globSync('**/*', { cwd: currentPackagePath }).forEach(relativePath => {\n const filepath = path.join(currentPackagePath, relativePath);\n if (fs.lstatSync(filepath).isFile()) {\n moveFileSync(filepath, path.join(newPackagePath, relativePath));\n } else {\n fs.mkdirSync(filepath, { recursive: true });\n }\n });\n\n // Remove the old directory recursively from com/old/package to com/old and com,\n // as long as the directories are empty\n const oldPathParts = currentPackageName.split('.');\n while (oldPathParts.length) {\n const pathToCheck = path.join(packageRoot, ...oldPathParts);\n try {\n const files = fs.readdirSync(pathToCheck);\n if (files.length === 0) {\n fs.rmdirSync(pathToCheck);\n }\n } finally {\n oldPathParts.pop();\n }\n }\n\n const filesToUpdate = [...globSync('**/*', { cwd: newPackagePath, absolute: true })];\n // Only update the BUCK file to match the main package name\n if (type === 'main') {\n filesToUpdate.push(path.join(projectRoot, 'android', 'app', 'BUCK'));\n }\n // Replace all occurrences of the path in the project\n filesToUpdate.forEach((filepath: string) => {\n try {\n if (fs.lstatSync(filepath).isFile()) {\n let contents = fs.readFileSync(filepath).toString();\n contents = contents.replace(new RegExp(currentPackageName!, 'g'), packageName);\n fs.writeFileSync(filepath, contents);\n }\n } catch (e) {\n debug(`Error updating \"${filepath}\" for type \"${type}\"`);\n }\n });\n}\n\nfunction moveFileSync(src: string, dest: string) {\n fs.mkdirSync(path.dirname(dest), { recursive: true });\n fs.renameSync(src, dest);\n}\n\nexport function setPackageInBuildGradle(config: Pick<ExpoConfig, 'android'>, buildGradle: string) {\n const packageName = getPackage(config);\n if (packageName === null) {\n return buildGradle;\n }\n\n const pattern = new RegExp(`applicationId ['\"].*['\"]`);\n return buildGradle.replace(pattern, `applicationId '${packageName}'`);\n}\n\nexport function setPackageInAndroidManifest(\n config: Pick<ExpoConfig, 'android'>,\n androidManifest: AndroidManifest\n) {\n const packageName = getPackage(config);\n\n if (packageName) {\n androidManifest.manifest.$.package = packageName;\n } else {\n delete androidManifest.manifest.$.package;\n }\n\n return androidManifest;\n}\n\nexport async function getApplicationIdAsync(projectRoot: string): Promise<string | null> {\n const buildGradlePath = getAppBuildGradleFilePath(projectRoot);\n if (!fs.existsSync(buildGradlePath)) {\n return null;\n }\n const buildGradle = await fs.promises.readFile(buildGradlePath, 'utf8');\n const matchResult = buildGradle.match(/applicationId ['\"](.*)['\"]/);\n // TODO add fallback for legacy cases to read from AndroidManifest.xml\n return matchResult?.[1] ?? null;\n}\n"],"file":"Package.js"}
1
+ {"version":3,"sources":["../../src/android/Package.ts"],"names":["debug","withPackageManifest","setPackageInAndroidManifest","withPackageGradle","config","modResults","language","contents","setPackageInBuildGradle","withPackageRefactor","renamePackageOnDisk","modRequest","projectRoot","getPackage","android","package","getPackageRoot","type","path","join","getCurrentPackageName","packageRoot","mainApplication","packagePath","dirname","packagePathParts","relative","split","sep","filter","Boolean","getCurrentPackageForProjectFile","fileName","filePath","getCurrentPackageNameForType","newPackageName","renamePackageOnDiskForType","packageName","currentPackageName","currentPackagePath","newPackagePath","fs","mkdirSync","recursive","cwd","forEach","relativePath","filepath","lstatSync","isFile","moveFileSync","oldPathParts","length","pathToCheck","files","readdirSync","rmdirSync","pop","filesToUpdate","absolute","push","readFileSync","toString","replace","RegExp","writeFileSync","src","dest","renameSync","buildGradle","pattern","androidManifest","manifest","$","getApplicationIdAsync","buildGradlePath","existsSync","promises","readFile","matchResult","match"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport Debug from 'debug';\nimport fs from 'fs';\nimport { sync as globSync } from 'glob';\nimport path from 'path';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { createAndroidManifestPlugin, withAppBuildGradle } from '../plugins/android-plugins';\nimport { withDangerousMod } from '../plugins/withDangerousMod';\nimport { directoryExistsAsync } from '../utils/modules';\nimport { addWarningAndroid } from '../utils/warnings';\nimport { AndroidManifest } from './Manifest';\nimport { getAppBuildGradleFilePath, getProjectFilePath } from './Paths';\n\nconst debug = Debug('expo:config-plugins:android:package');\n\nexport const withPackageManifest = createAndroidManifestPlugin(\n setPackageInAndroidManifest,\n 'withPackageManifest'\n);\n\nexport const withPackageGradle: ConfigPlugin = config => {\n return withAppBuildGradle(config, config => {\n if (config.modResults.language === 'groovy') {\n config.modResults.contents = setPackageInBuildGradle(config, config.modResults.contents);\n } else {\n addWarningAndroid(\n 'android.package',\n `Cannot automatically configure app build.gradle if it's not groovy`\n );\n }\n return config;\n });\n};\n\nexport const withPackageRefactor: ConfigPlugin = config => {\n return withDangerousMod(config, [\n 'android',\n async config => {\n await renamePackageOnDisk(config, config.modRequest.projectRoot);\n return config;\n },\n ]);\n};\n\nexport function getPackage(config: Pick<ExpoConfig, 'android'>) {\n return config.android?.package ?? null;\n}\n\nfunction getPackageRoot(projectRoot: string, type: 'main' | 'debug') {\n return path.join(projectRoot, 'android', 'app', 'src', type, 'java');\n}\n\nfunction getCurrentPackageName(projectRoot: string, packageRoot: string) {\n const mainApplication = getProjectFilePath(projectRoot, 'MainApplication');\n const packagePath = path.dirname(mainApplication);\n const packagePathParts = path.relative(packageRoot, packagePath).split(path.sep).filter(Boolean);\n\n return packagePathParts.join('.');\n}\n\nfunction getCurrentPackageForProjectFile(\n projectRoot: string,\n packageRoot: string,\n fileName: string,\n type: string\n) {\n const filePath = globSync(\n path.join(projectRoot, `android/app/src/${type}/java/**/${fileName}.@(java|kt)`)\n )[0];\n\n if (!filePath) {\n return null;\n }\n\n const packagePath = path.dirname(filePath);\n const packagePathParts = path.relative(packageRoot, packagePath).split(path.sep).filter(Boolean);\n\n return packagePathParts.join('.');\n}\n\nfunction getCurrentPackageNameForType(projectRoot: string, type: string): string | null {\n const packageRoot = getPackageRoot(projectRoot, type as any);\n\n if (type === 'main') {\n return getCurrentPackageName(projectRoot, packageRoot);\n }\n // debug, etc..\n return getCurrentPackageForProjectFile(projectRoot, packageRoot, '*', type);\n}\n\n// NOTE(brentvatne): this assumes that our MainApplication.java file is in the root of the package\n// this makes sense for standard react-native projects but may not apply in customized projects, so if\n// we want this to be runnable in any app we need to handle other possibilities\nexport async function renamePackageOnDisk(\n config: Pick<ExpoConfig, 'android'>,\n projectRoot: string\n) {\n const newPackageName = getPackage(config);\n if (newPackageName === null) {\n return;\n }\n\n for (const type of ['main', 'debug']) {\n await renamePackageOnDiskForType({ projectRoot, type, packageName: newPackageName });\n }\n}\n\nexport async function renamePackageOnDiskForType({\n projectRoot,\n type,\n packageName,\n}: {\n projectRoot: string;\n type: string;\n packageName: string;\n}) {\n if (!packageName) {\n return;\n }\n\n const currentPackageName = getCurrentPackageNameForType(projectRoot, type);\n debug(`Found package \"${currentPackageName}\" for type \"${type}\"`);\n if (!currentPackageName || currentPackageName === packageName) {\n return;\n }\n debug(`Refactor \"${currentPackageName}\" to \"${packageName}\" for type \"${type}\"`);\n const packageRoot = getPackageRoot(projectRoot, type as any);\n // Set up our paths\n if (!(await directoryExistsAsync(packageRoot))) {\n debug(`- skipping refactor of missing directory: ${packageRoot}`);\n return;\n }\n\n const currentPackagePath = path.join(packageRoot, ...currentPackageName.split('.'));\n const newPackagePath = path.join(packageRoot, ...packageName.split('.'));\n\n // Create the new directory\n fs.mkdirSync(newPackagePath, { recursive: true });\n\n // Move everything from the old directory over\n globSync('**/*', { cwd: currentPackagePath }).forEach(relativePath => {\n const filepath = path.join(currentPackagePath, relativePath);\n if (fs.lstatSync(filepath).isFile()) {\n moveFileSync(filepath, path.join(newPackagePath, relativePath));\n } else {\n fs.mkdirSync(filepath, { recursive: true });\n }\n });\n\n // Remove the old directory recursively from com/old/package to com/old and com,\n // as long as the directories are empty\n const oldPathParts = currentPackageName.split('.');\n while (oldPathParts.length) {\n const pathToCheck = path.join(packageRoot, ...oldPathParts);\n try {\n const files = fs.readdirSync(pathToCheck);\n if (files.length === 0) {\n fs.rmdirSync(pathToCheck);\n }\n } finally {\n oldPathParts.pop();\n }\n }\n\n const filesToUpdate = [...globSync('**/*', { cwd: newPackagePath, absolute: true })];\n // Only update the BUCK file to match the main package name\n if (type === 'main') {\n filesToUpdate.push(path.join(projectRoot, 'android', 'app', 'BUCK'));\n }\n // Replace all occurrences of the path in the project\n filesToUpdate.forEach((filepath: string) => {\n try {\n if (fs.lstatSync(filepath).isFile()) {\n let contents = fs.readFileSync(filepath).toString();\n contents = contents.replace(new RegExp(currentPackageName!, 'g'), packageName);\n fs.writeFileSync(filepath, contents);\n }\n } catch {\n debug(`Error updating \"${filepath}\" for type \"${type}\"`);\n }\n });\n}\n\nfunction moveFileSync(src: string, dest: string) {\n fs.mkdirSync(path.dirname(dest), { recursive: true });\n fs.renameSync(src, dest);\n}\n\nexport function setPackageInBuildGradle(config: Pick<ExpoConfig, 'android'>, buildGradle: string) {\n const packageName = getPackage(config);\n if (packageName === null) {\n return buildGradle;\n }\n\n const pattern = new RegExp(`applicationId ['\"].*['\"]`);\n return buildGradle.replace(pattern, `applicationId '${packageName}'`);\n}\n\nexport function setPackageInAndroidManifest(\n config: Pick<ExpoConfig, 'android'>,\n androidManifest: AndroidManifest\n) {\n const packageName = getPackage(config);\n\n if (packageName) {\n androidManifest.manifest.$.package = packageName;\n } else {\n delete androidManifest.manifest.$.package;\n }\n\n return androidManifest;\n}\n\nexport async function getApplicationIdAsync(projectRoot: string): Promise<string | null> {\n const buildGradlePath = getAppBuildGradleFilePath(projectRoot);\n if (!fs.existsSync(buildGradlePath)) {\n return null;\n }\n const buildGradle = await fs.promises.readFile(buildGradlePath, 'utf8');\n const matchResult = buildGradle.match(/applicationId ['\"](.*)['\"]/);\n // TODO add fallback for legacy cases to read from AndroidManifest.xml\n return matchResult?.[1] ?? null;\n}\n"],"file":"Package.js"}
@@ -2,7 +2,9 @@ import { ExpoConfig } from '@expo/config-types';
2
2
  import { ConfigPlugin } from '../Plugin.types';
3
3
  import { AndroidManifest, ManifestUsesPermission } from './Manifest';
4
4
  export declare const withPermissions: ConfigPlugin<string[] | void>;
5
- export declare const withBlockedPermissions: ConfigPlugin<string[]>;
5
+ /** Given a permission or list of permissions, block permissions in the final `AndroidManifest.xml` to ensure no installed library or plugin can add them. */
6
+ export declare const withBlockedPermissions: ConfigPlugin<string[] | string>;
7
+ export declare const withInternalBlockedPermissions: ConfigPlugin;
6
8
  export declare function addBlockedPermissions(androidManifest: AndroidManifest, permissions: string[]): AndroidManifest;
7
9
  export declare function getAndroidPermissions(config: Pick<ExpoConfig, 'android'>): string[];
8
10
  export declare function setAndroidPermissions(config: Pick<ExpoConfig, 'android'>, androidManifest: AndroidManifest): AndroidManifest;
@@ -14,29 +14,41 @@ exports.getPermissions = getPermissions;
14
14
  exports.isPermissionAlreadyRequested = isPermissionAlreadyRequested;
15
15
  exports.removePermissions = removePermissions;
16
16
  exports.setAndroidPermissions = setAndroidPermissions;
17
- exports.withPermissions = exports.withBlockedPermissions = void 0;
17
+ exports.withPermissions = exports.withInternalBlockedPermissions = exports.withBlockedPermissions = void 0;
18
18
 
19
- function _assert() {
20
- const data = _interopRequireDefault(require("assert"));
19
+ function _androidPlugins() {
20
+ const data = require("../plugins/android-plugins");
21
21
 
22
- _assert = function () {
22
+ _androidPlugins = function () {
23
23
  return data;
24
24
  };
25
25
 
26
26
  return data;
27
27
  }
28
28
 
29
- function _androidPlugins() {
30
- const data = require("../plugins/android-plugins");
29
+ function WarningAggregator() {
30
+ const data = _interopRequireWildcard(require("../utils/warnings"));
31
31
 
32
- _androidPlugins = function () {
32
+ WarningAggregator = function () {
33
+ return data;
34
+ };
35
+
36
+ return data;
37
+ }
38
+
39
+ function _Manifest() {
40
+ const data = require("./Manifest");
41
+
42
+ _Manifest = function () {
33
43
  return data;
34
44
  };
35
45
 
36
46
  return data;
37
47
  }
38
48
 
39
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
49
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
50
+
51
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
40
52
 
41
53
  const USES_PERMISSION = 'uses-permission';
42
54
 
@@ -54,45 +66,47 @@ const withPermissions = (config, permissions) => {
54
66
  return config;
55
67
  });
56
68
  };
69
+ /** Given a permission or list of permissions, block permissions in the final `AndroidManifest.xml` to ensure no installed library or plugin can add them. */
70
+
57
71
 
58
72
  exports.withPermissions = withPermissions;
59
73
 
60
74
  const withBlockedPermissions = (config, permissions) => {
61
75
  var _config$android;
62
76
 
63
- (0, _assert().default)(Array.isArray(permissions), 'permissions prop must be an array');
77
+ const resolvedPermissions = (Array.isArray(permissions) ? permissions : [permissions]).filter(Boolean);
78
+
79
+ if (!resolvedPermissions.length) {
80
+ WarningAggregator().addWarningAndroid('block-permissions', 'No permissions provided');
81
+ }
64
82
 
65
83
  if (config !== null && config !== void 0 && (_config$android = config.android) !== null && _config$android !== void 0 && _config$android.permissions && Array.isArray(config.android.permissions)) {
66
84
  // Remove any static config permissions
67
- config.android.permissions = config.android.permissions.filter(permission => !permissions.includes(permission));
85
+ config.android.permissions = config.android.permissions.filter(permission => !resolvedPermissions.includes(permission));
68
86
  }
69
87
 
70
88
  return (0, _androidPlugins().withAndroidManifest)(config, async config => {
71
- config.modResults = ensureToolsAvailable(config.modResults);
72
- config.modResults = addBlockedPermissions(config.modResults, permissions);
89
+ config.modResults = (0, _Manifest().ensureToolsAvailable)(config.modResults);
90
+ config.modResults = addBlockedPermissions(config.modResults, resolvedPermissions);
73
91
  return config;
74
92
  });
75
93
  };
76
- /**
77
- * Ensure the `tools:*` namespace is available in the manifest.
78
- *
79
- * @param manifest AndroidManifest.xml
80
- * @returns manifest with the `tools:*` namespace available
81
- */
82
-
83
94
 
84
95
  exports.withBlockedPermissions = withBlockedPermissions;
85
96
 
86
- function ensureToolsAvailable(manifest) {
87
- var _manifest$manifest, _manifest$manifest$$;
97
+ const withInternalBlockedPermissions = config => {
98
+ var _config$android2, _config$android2$bloc;
88
99
 
89
- if (manifest !== null && manifest !== void 0 && (_manifest$manifest = manifest.manifest) !== null && _manifest$manifest !== void 0 && (_manifest$manifest$$ = _manifest$manifest.$) !== null && _manifest$manifest$$ !== void 0 && _manifest$manifest$$['xmlns:tools']) {
90
- return manifest;
100
+ // Only add permissions if the user defined the property and added some values
101
+ // this ensures we don't add the `tools:*` namespace extraneously.
102
+ if ((_config$android2 = config.android) !== null && _config$android2 !== void 0 && (_config$android2$bloc = _config$android2.blockedPermissions) !== null && _config$android2$bloc !== void 0 && _config$android2$bloc.length) {
103
+ return withBlockedPermissions(config, config.android.blockedPermissions);
91
104
  }
92
105
 
93
- manifest.manifest.$['xmlns:tools'] = 'http://schemas.android.com/tools';
94
- return manifest;
95
- }
106
+ return config;
107
+ };
108
+
109
+ exports.withInternalBlockedPermissions = withInternalBlockedPermissions;
96
110
 
97
111
  function addBlockedPermissions(androidManifest, permissions) {
98
112
  if (!Array.isArray(androidManifest.manifest['uses-permission'])) {
@@ -140,9 +154,9 @@ function prefixAndroidPermissionsIfNecessary(permissions) {
140
154
  }
141
155
 
142
156
  function getAndroidPermissions(config) {
143
- var _config$android$permi, _config$android2;
157
+ var _config$android$permi, _config$android3;
144
158
 
145
- return (_config$android$permi = (_config$android2 = config.android) === null || _config$android2 === void 0 ? void 0 : _config$android2.permissions) !== null && _config$android$permi !== void 0 ? _config$android$permi : [];
159
+ return (_config$android$permi = (_config$android3 = config.android) === null || _config$android3 === void 0 ? void 0 : _config$android3.permissions) !== null && _config$android$permi !== void 0 ? _config$android$permi : [];
146
160
  }
147
161
 
148
162
  function setAndroidPermissions(config, androidManifest) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/android/Permissions.ts"],"names":["USES_PERMISSION","withPermissions","config","permissions","Array","isArray","filter","Boolean","android","Set","concat","modResults","setAndroidPermissions","withBlockedPermissions","permission","includes","ensureToolsAvailable","addBlockedPermissions","manifest","$","androidManifest","ensureBlockedPermission","manifestPermissions","e","push","prefixAndroidPermissionsIfNecessary","map","getAndroidPermissions","providedPermissions","permissionsToAdd","hasOwnProperty","forEach","isPermissionAlreadyRequested","addPermissionToManifest","some","removePermissions","permissionNames","targetNames","ensurePermissionNameFormat","nextPermissions","attribute","value","name","addPermission","permissionName","usesPermissions","ensurePermissions","getPermissions","results","targetName","ensurePermission","com","split","pop","toUpperCase","join","permissionObject"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport assert from 'assert';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { withAndroidManifest } from '../plugins/android-plugins';\nimport { AndroidManifest, ManifestUsesPermission } from './Manifest';\n\nconst USES_PERMISSION = 'uses-permission';\n\nexport const withPermissions: ConfigPlugin<string[] | void> = (config, permissions) => {\n if (Array.isArray(permissions)) {\n permissions = permissions.filter(Boolean);\n if (!config.android) config.android = {};\n if (!config.android.permissions) config.android.permissions = [];\n config.android.permissions = [\n // @ts-ignore\n ...new Set(config.android.permissions.concat(permissions)),\n ];\n }\n return withAndroidManifest(config, async config => {\n config.modResults = await setAndroidPermissions(config, config.modResults);\n return config;\n });\n};\n\nexport const withBlockedPermissions: ConfigPlugin<string[]> = (config, permissions) => {\n assert(Array.isArray(permissions), 'permissions prop must be an array');\n\n if (config?.android?.permissions && Array.isArray(config.android.permissions)) {\n // Remove any static config permissions\n config.android.permissions = config.android.permissions.filter(\n permission => !permissions.includes(permission)\n );\n }\n\n return withAndroidManifest(config, async config => {\n config.modResults = ensureToolsAvailable(config.modResults);\n config.modResults = addBlockedPermissions(config.modResults, permissions);\n\n return config;\n });\n};\n\n/**\n * Ensure the `tools:*` namespace is available in the manifest.\n *\n * @param manifest AndroidManifest.xml\n * @returns manifest with the `tools:*` namespace available\n */\nfunction ensureToolsAvailable(manifest: AndroidManifest) {\n if (manifest?.manifest?.$?.['xmlns:tools']) {\n return manifest;\n }\n manifest.manifest.$['xmlns:tools'] = 'http://schemas.android.com/tools';\n return manifest;\n}\n\nexport function addBlockedPermissions(androidManifest: AndroidManifest, permissions: string[]) {\n if (!Array.isArray(androidManifest.manifest['uses-permission'])) {\n androidManifest.manifest['uses-permission'] = [];\n }\n\n for (const permission of permissions) {\n androidManifest.manifest['uses-permission'] = ensureBlockedPermission(\n androidManifest.manifest['uses-permission'],\n permission\n );\n }\n\n return androidManifest;\n}\n\n/**\n * Filter any existing permissions matching the provided permission name, then add a\n * restricted permission to overwrite any extra permissions that may be added in a\n * third-party package's AndroidManifest.xml.\n *\n * @param manifestPermissions manifest `uses-permissions` array.\n * @param permission `android:name` of the permission to restrict\n * @returns\n */\nfunction ensureBlockedPermission(\n manifestPermissions: ManifestUsesPermission[],\n permission: string\n) {\n // Remove permission if it currently exists\n manifestPermissions = manifestPermissions.filter(e => e.$['android:name'] !== permission);\n\n // Add a permission with tools:node to overwrite any existing permission and ensure it's removed upon building.\n manifestPermissions.push({\n $: { 'android:name': permission, 'tools:node': 'remove' },\n });\n return manifestPermissions;\n}\n\nfunction prefixAndroidPermissionsIfNecessary(permissions: string[]): string[] {\n return permissions.map(permission => {\n if (!permission.includes('.')) {\n return `android.permission.${permission}`;\n }\n return permission;\n });\n}\n\nexport function getAndroidPermissions(config: Pick<ExpoConfig, 'android'>): string[] {\n return config.android?.permissions ?? [];\n}\n\nexport function setAndroidPermissions(\n config: Pick<ExpoConfig, 'android'>,\n androidManifest: AndroidManifest\n) {\n const permissions = getAndroidPermissions(config);\n const providedPermissions = prefixAndroidPermissionsIfNecessary(permissions);\n const permissionsToAdd = [...providedPermissions];\n\n if (!androidManifest.manifest.hasOwnProperty('uses-permission')) {\n androidManifest.manifest['uses-permission'] = [];\n }\n // manifest.manifest['uses-permission'] = [];\n\n const manifestPermissions = androidManifest.manifest['uses-permission'] ?? [];\n\n permissionsToAdd.forEach(permission => {\n if (!isPermissionAlreadyRequested(permission, manifestPermissions)) {\n addPermissionToManifest(permission, manifestPermissions);\n }\n });\n\n return androidManifest;\n}\n\nexport function isPermissionAlreadyRequested(\n permission: string,\n manifestPermissions: ManifestUsesPermission[]\n): boolean {\n return manifestPermissions.some(e => e.$['android:name'] === permission);\n}\n\nexport function addPermissionToManifest(\n permission: string,\n manifestPermissions: ManifestUsesPermission[]\n) {\n manifestPermissions.push({ $: { 'android:name': permission } });\n return manifestPermissions;\n}\n\nexport function removePermissions(androidManifest: AndroidManifest, permissionNames?: string[]) {\n const targetNames = permissionNames ? permissionNames.map(ensurePermissionNameFormat) : null;\n const permissions = androidManifest.manifest[USES_PERMISSION] || [];\n const nextPermissions = [];\n for (const attribute of permissions) {\n if (targetNames) {\n // @ts-ignore: name isn't part of the type\n const value = attribute.$['android:name'] || attribute.$.name;\n if (!targetNames.includes(value)) {\n nextPermissions.push(attribute);\n }\n }\n }\n\n androidManifest.manifest[USES_PERMISSION] = nextPermissions;\n}\n\nexport function addPermission(androidManifest: AndroidManifest, permissionName: string): void {\n const usesPermissions: ManifestUsesPermission[] = androidManifest.manifest[USES_PERMISSION] || [];\n usesPermissions.push({\n $: { 'android:name': permissionName },\n });\n androidManifest.manifest[USES_PERMISSION] = usesPermissions;\n}\n\nexport function ensurePermissions(\n androidManifest: AndroidManifest,\n permissionNames: string[]\n): { [permission: string]: boolean } {\n const permissions = getPermissions(androidManifest);\n\n const results: { [permission: string]: boolean } = {};\n for (const permissionName of permissionNames) {\n const targetName = ensurePermissionNameFormat(permissionName);\n if (!permissions.includes(targetName)) {\n addPermission(androidManifest, targetName);\n results[permissionName] = true;\n } else {\n results[permissionName] = false;\n }\n }\n return results;\n}\n\nexport function ensurePermission(\n androidManifest: AndroidManifest,\n permissionName: string\n): boolean {\n const permissions = getPermissions(androidManifest);\n const targetName = ensurePermissionNameFormat(permissionName);\n\n if (!permissions.includes(targetName)) {\n addPermission(androidManifest, targetName);\n return true;\n }\n return false;\n}\n\nexport function ensurePermissionNameFormat(permissionName: string): string {\n if (permissionName.includes('.')) {\n const com = permissionName.split('.');\n const name = com.pop() as string;\n return [...com, name.toUpperCase()].join('.');\n } else {\n // If shorthand form like `WRITE_CONTACTS` is provided, expand it to `android.permission.WRITE_CONTACTS`.\n return ensurePermissionNameFormat(`android.permission.${permissionName}`);\n }\n}\n\nexport function getPermissions(androidManifest: AndroidManifest): string[] {\n const usesPermissions: { [key: string]: any }[] = androidManifest.manifest[USES_PERMISSION] || [];\n const permissions = usesPermissions.map(permissionObject => {\n return permissionObject.$['android:name'] || permissionObject.$.name;\n });\n return permissions;\n}\n"],"file":"Permissions.js"}
1
+ {"version":3,"sources":["../../src/android/Permissions.ts"],"names":["USES_PERMISSION","withPermissions","config","permissions","Array","isArray","filter","Boolean","android","Set","concat","modResults","setAndroidPermissions","withBlockedPermissions","resolvedPermissions","length","WarningAggregator","addWarningAndroid","permission","includes","addBlockedPermissions","withInternalBlockedPermissions","blockedPermissions","androidManifest","manifest","ensureBlockedPermission","manifestPermissions","e","$","push","prefixAndroidPermissionsIfNecessary","map","getAndroidPermissions","providedPermissions","permissionsToAdd","hasOwnProperty","forEach","isPermissionAlreadyRequested","addPermissionToManifest","some","removePermissions","permissionNames","targetNames","ensurePermissionNameFormat","nextPermissions","attribute","value","name","addPermission","permissionName","usesPermissions","ensurePermissions","getPermissions","results","targetName","ensurePermission","com","split","pop","toUpperCase","join","permissionObject"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { withAndroidManifest } from '../plugins/android-plugins';\nimport * as WarningAggregator from '../utils/warnings';\nimport { AndroidManifest, ensureToolsAvailable, ManifestUsesPermission } from './Manifest';\n\nconst USES_PERMISSION = 'uses-permission';\n\nexport const withPermissions: ConfigPlugin<string[] | void> = (config, permissions) => {\n if (Array.isArray(permissions)) {\n permissions = permissions.filter(Boolean);\n if (!config.android) config.android = {};\n if (!config.android.permissions) config.android.permissions = [];\n config.android.permissions = [\n // @ts-ignore\n ...new Set(config.android.permissions.concat(permissions)),\n ];\n }\n return withAndroidManifest(config, async config => {\n config.modResults = await setAndroidPermissions(config, config.modResults);\n return config;\n });\n};\n\n/** Given a permission or list of permissions, block permissions in the final `AndroidManifest.xml` to ensure no installed library or plugin can add them. */\nexport const withBlockedPermissions: ConfigPlugin<string[] | string> = (config, permissions) => {\n const resolvedPermissions = (Array.isArray(permissions) ? permissions : [permissions]).filter(\n Boolean\n );\n\n if (!resolvedPermissions.length) {\n WarningAggregator.addWarningAndroid('block-permissions', 'No permissions provided');\n }\n\n if (config?.android?.permissions && Array.isArray(config.android.permissions)) {\n // Remove any static config permissions\n config.android.permissions = config.android.permissions.filter(\n permission => !resolvedPermissions.includes(permission)\n );\n }\n\n return withAndroidManifest(config, async config => {\n config.modResults = ensureToolsAvailable(config.modResults);\n config.modResults = addBlockedPermissions(config.modResults, resolvedPermissions);\n return config;\n });\n};\n\nexport const withInternalBlockedPermissions: ConfigPlugin = config => {\n // Only add permissions if the user defined the property and added some values\n // this ensures we don't add the `tools:*` namespace extraneously.\n if (config.android?.blockedPermissions?.length) {\n return withBlockedPermissions(config, config.android.blockedPermissions);\n }\n\n return config;\n};\n\nexport function addBlockedPermissions(androidManifest: AndroidManifest, permissions: string[]) {\n if (!Array.isArray(androidManifest.manifest['uses-permission'])) {\n androidManifest.manifest['uses-permission'] = [];\n }\n\n for (const permission of permissions) {\n androidManifest.manifest['uses-permission'] = ensureBlockedPermission(\n androidManifest.manifest['uses-permission'],\n permission\n );\n }\n\n return androidManifest;\n}\n\n/**\n * Filter any existing permissions matching the provided permission name, then add a\n * restricted permission to overwrite any extra permissions that may be added in a\n * third-party package's AndroidManifest.xml.\n *\n * @param manifestPermissions manifest `uses-permissions` array.\n * @param permission `android:name` of the permission to restrict\n * @returns\n */\nfunction ensureBlockedPermission(\n manifestPermissions: ManifestUsesPermission[],\n permission: string\n) {\n // Remove permission if it currently exists\n manifestPermissions = manifestPermissions.filter(e => e.$['android:name'] !== permission);\n\n // Add a permission with tools:node to overwrite any existing permission and ensure it's removed upon building.\n manifestPermissions.push({\n $: { 'android:name': permission, 'tools:node': 'remove' },\n });\n return manifestPermissions;\n}\n\nfunction prefixAndroidPermissionsIfNecessary(permissions: string[]): string[] {\n return permissions.map(permission => {\n if (!permission.includes('.')) {\n return `android.permission.${permission}`;\n }\n return permission;\n });\n}\n\nexport function getAndroidPermissions(config: Pick<ExpoConfig, 'android'>): string[] {\n return config.android?.permissions ?? [];\n}\n\nexport function setAndroidPermissions(\n config: Pick<ExpoConfig, 'android'>,\n androidManifest: AndroidManifest\n) {\n const permissions = getAndroidPermissions(config);\n const providedPermissions = prefixAndroidPermissionsIfNecessary(permissions);\n const permissionsToAdd = [...providedPermissions];\n\n if (!androidManifest.manifest.hasOwnProperty('uses-permission')) {\n androidManifest.manifest['uses-permission'] = [];\n }\n // manifest.manifest['uses-permission'] = [];\n\n const manifestPermissions = androidManifest.manifest['uses-permission'] ?? [];\n\n permissionsToAdd.forEach(permission => {\n if (!isPermissionAlreadyRequested(permission, manifestPermissions)) {\n addPermissionToManifest(permission, manifestPermissions);\n }\n });\n\n return androidManifest;\n}\n\nexport function isPermissionAlreadyRequested(\n permission: string,\n manifestPermissions: ManifestUsesPermission[]\n): boolean {\n return manifestPermissions.some(e => e.$['android:name'] === permission);\n}\n\nexport function addPermissionToManifest(\n permission: string,\n manifestPermissions: ManifestUsesPermission[]\n) {\n manifestPermissions.push({ $: { 'android:name': permission } });\n return manifestPermissions;\n}\n\nexport function removePermissions(androidManifest: AndroidManifest, permissionNames?: string[]) {\n const targetNames = permissionNames ? permissionNames.map(ensurePermissionNameFormat) : null;\n const permissions = androidManifest.manifest[USES_PERMISSION] || [];\n const nextPermissions = [];\n for (const attribute of permissions) {\n if (targetNames) {\n // @ts-ignore: name isn't part of the type\n const value = attribute.$['android:name'] || attribute.$.name;\n if (!targetNames.includes(value)) {\n nextPermissions.push(attribute);\n }\n }\n }\n\n androidManifest.manifest[USES_PERMISSION] = nextPermissions;\n}\n\nexport function addPermission(androidManifest: AndroidManifest, permissionName: string): void {\n const usesPermissions: ManifestUsesPermission[] = androidManifest.manifest[USES_PERMISSION] || [];\n usesPermissions.push({\n $: { 'android:name': permissionName },\n });\n androidManifest.manifest[USES_PERMISSION] = usesPermissions;\n}\n\nexport function ensurePermissions(\n androidManifest: AndroidManifest,\n permissionNames: string[]\n): { [permission: string]: boolean } {\n const permissions = getPermissions(androidManifest);\n\n const results: { [permission: string]: boolean } = {};\n for (const permissionName of permissionNames) {\n const targetName = ensurePermissionNameFormat(permissionName);\n if (!permissions.includes(targetName)) {\n addPermission(androidManifest, targetName);\n results[permissionName] = true;\n } else {\n results[permissionName] = false;\n }\n }\n return results;\n}\n\nexport function ensurePermission(\n androidManifest: AndroidManifest,\n permissionName: string\n): boolean {\n const permissions = getPermissions(androidManifest);\n const targetName = ensurePermissionNameFormat(permissionName);\n\n if (!permissions.includes(targetName)) {\n addPermission(androidManifest, targetName);\n return true;\n }\n return false;\n}\n\nexport function ensurePermissionNameFormat(permissionName: string): string {\n if (permissionName.includes('.')) {\n const com = permissionName.split('.');\n const name = com.pop() as string;\n return [...com, name.toUpperCase()].join('.');\n } else {\n // If shorthand form like `WRITE_CONTACTS` is provided, expand it to `android.permission.WRITE_CONTACTS`.\n return ensurePermissionNameFormat(`android.permission.${permissionName}`);\n }\n}\n\nexport function getPermissions(androidManifest: AndroidManifest): string[] {\n const usesPermissions: { [key: string]: any }[] = androidManifest.manifest[USES_PERMISSION] || [];\n const permissions = usesPermissions.map(permissionObject => {\n return permissionObject.$['android:name'] || permissionObject.$.name;\n });\n return permissions;\n}\n"],"file":"Permissions.js"}
@@ -60,7 +60,7 @@ function findNewInstanceCodeBlock(contents, classDeclaration, language) {
60
60
  // ```
61
61
 
62
62
  const nextBrace = contents.indexOf('{', end + 1);
63
- const isAnonymousClass = nextBrace >= end && !!contents.substring(end + 1, nextBrace).match(/^\s*$/m);
63
+ const isAnonymousClass = nextBrace >= end && !!contents.substring(end + 1, nextBrace).match(/^\s*$/);
64
64
 
65
65
  if (isAnonymousClass) {
66
66
  end = (0, _matchBrackets().findMatchingBracketPosition)(contents, '{', end);