@expo/config-plugins 5.0.3 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/Plugin.types.d.ts +7 -7
- package/build/Plugin.types.js +0 -9
- package/build/Plugin.types.js.map +1 -1
- package/build/android/AllowBackup.js +0 -15
- package/build/android/AllowBackup.js.map +1 -1
- package/build/android/BuildProperties.js +2 -16
- package/build/android/BuildProperties.js.map +1 -1
- package/build/android/Colors.js +3 -25
- package/build/android/Colors.js.map +1 -1
- package/build/android/EasBuild.js +2 -22
- package/build/android/EasBuild.js.map +1 -1
- package/build/android/EasBuildGradleScript.js.map +1 -1
- package/build/android/GoogleMapsApiKey.js +0 -12
- package/build/android/GoogleMapsApiKey.js.map +1 -1
- package/build/android/GoogleServices.js +10 -48
- package/build/android/GoogleServices.js.map +1 -1
- package/build/android/IntentFilters.d.ts +1 -1
- package/build/android/IntentFilters.js +8 -24
- package/build/android/IntentFilters.js.map +1 -1
- package/build/android/Manifest.d.ts +19 -19
- package/build/android/Manifest.js +7 -66
- package/build/android/Manifest.js.map +1 -1
- package/build/android/Name.js +6 -27
- package/build/android/Name.js.map +1 -1
- package/build/android/Orientation.js +2 -12
- package/build/android/Orientation.js.map +1 -1
- package/build/android/Package.js +26 -111
- package/build/android/Package.js.map +1 -1
- package/build/android/Paths.d.ts +2 -2
- package/build/android/Paths.js +0 -47
- package/build/android/Paths.js.map +1 -1
- package/build/android/Permissions.js +8 -52
- package/build/android/Permissions.js.map +1 -1
- package/build/android/PrimaryColor.js +0 -18
- package/build/android/PrimaryColor.js.map +1 -1
- package/build/android/Properties.d.ts +1 -1
- package/build/android/Properties.js +0 -9
- package/build/android/Properties.js.map +1 -1
- package/build/android/Resources.d.ts +4 -4
- package/build/android/Resources.js +9 -29
- package/build/android/Resources.js.map +1 -1
- package/build/android/Scheme.d.ts +1 -1
- package/build/android/Scheme.js +13 -66
- package/build/android/Scheme.js.map +1 -1
- package/build/android/StatusBar.js +5 -33
- package/build/android/StatusBar.js.map +1 -1
- package/build/android/Strings.js +0 -14
- package/build/android/Strings.js.map +1 -1
- package/build/android/Styles.js +7 -34
- package/build/android/Styles.js.map +1 -1
- package/build/android/Updates.d.ts +2 -0
- package/build/android/Updates.js +50 -47
- package/build/android/Updates.js.map +1 -1
- package/build/android/Version.js +3 -29
- package/build/android/Version.js.map +1 -1
- package/build/android/WindowSoftInputMode.js +0 -14
- package/build/android/WindowSoftInputMode.js.map +1 -1
- package/build/android/codeMod.js +6 -22
- package/build/android/codeMod.js.map +1 -1
- package/build/android/index.js +0 -94
- package/build/android/index.js.map +1 -1
- package/build/index.js +2 -65
- package/build/index.js.map +1 -1
- package/build/ios/Bitcode.d.ts +1 -1
- package/build/ios/Bitcode.js +8 -28
- package/build/ios/Bitcode.js.map +1 -1
- package/build/ios/BuildProperties.js +2 -14
- package/build/ios/BuildProperties.js.map +1 -1
- package/build/ios/BuildScheme.js +2 -34
- package/build/ios/BuildScheme.js.map +1 -1
- package/build/ios/BundleIdentifier.js +13 -72
- package/build/ios/BundleIdentifier.js.map +1 -1
- package/build/ios/DeviceFamily.js +6 -24
- package/build/ios/DeviceFamily.js.map +1 -1
- package/build/ios/Entitlements.js +4 -45
- package/build/ios/Entitlements.js.map +1 -1
- package/build/ios/Google.d.ts +2 -2
- package/build/ios/Google.js +11 -66
- package/build/ios/Google.js.map +1 -1
- package/build/ios/IosConfig.types.d.ts +6 -11
- package/build/ios/IosConfig.types.js.map +1 -1
- package/build/ios/Locales.d.ts +3 -3
- package/build/ios/Locales.js +12 -43
- package/build/ios/Locales.js.map +1 -1
- package/build/ios/Maps.js +15 -53
- package/build/ios/Maps.js.map +1 -1
- package/build/ios/Name.js +7 -31
- package/build/ios/Name.js.map +1 -1
- package/build/ios/Orientation.js +2 -10
- package/build/ios/Orientation.js.map +1 -1
- package/build/ios/Paths.d.ts +2 -2
- package/build/ios/Paths.js +8 -73
- package/build/ios/Paths.js.map +1 -1
- package/build/ios/Permissions.js +1 -16
- package/build/ios/Permissions.js.map +1 -1
- package/build/ios/ProvisioningProfile.d.ts +1 -1
- package/build/ios/ProvisioningProfile.js +0 -18
- package/build/ios/ProvisioningProfile.js.map +1 -1
- package/build/ios/RequiresFullScreen.js +19 -31
- package/build/ios/RequiresFullScreen.js.map +1 -1
- package/build/ios/Scheme.js +12 -34
- package/build/ios/Scheme.js.map +1 -1
- package/build/ios/Swift.js +16 -50
- package/build/ios/Swift.js.map +1 -1
- package/build/ios/Target.js +0 -30
- package/build/ios/Target.js.map +1 -1
- package/build/ios/Updates.js +10 -49
- package/build/ios/Updates.js.map +1 -1
- package/build/ios/UsesNonExemptEncryption.js +4 -10
- package/build/ios/UsesNonExemptEncryption.js.map +1 -1
- package/build/ios/Version.js +4 -11
- package/build/ios/Version.js.map +1 -1
- package/build/ios/XcodeProjectFile.js +5 -23
- package/build/ios/XcodeProjectFile.js.map +1 -1
- package/build/ios/codeMod.js +19 -60
- package/build/ios/codeMod.js.map +1 -1
- package/build/ios/index.js +0 -97
- package/build/ios/index.js.map +1 -1
- package/build/ios/utils/Xcodeproj.d.ts +6 -6
- package/build/ios/utils/Xcodeproj.js +15 -101
- package/build/ios/utils/Xcodeproj.js.map +1 -1
- package/build/ios/utils/getInfoPlistPath.js +2 -15
- package/build/ios/utils/getInfoPlistPath.js.map +1 -1
- package/build/ios/utils/string.js +0 -1
- package/build/ios/utils/string.js.map +1 -1
- package/build/plugins/android-plugins.d.ts +2 -2
- package/build/plugins/android-plugins.js +11 -42
- package/build/plugins/android-plugins.js.map +1 -1
- package/build/plugins/createBaseMod.d.ts +3 -3
- package/build/plugins/createBaseMod.js +8 -25
- package/build/plugins/createBaseMod.js.map +1 -1
- package/build/plugins/ios-plugins.d.ts +2 -2
- package/build/plugins/ios-plugins.js +8 -48
- package/build/plugins/ios-plugins.js.map +1 -1
- package/build/plugins/mod-compiler.js +21 -72
- package/build/plugins/mod-compiler.js.map +1 -1
- package/build/plugins/withAndroidBaseMods.d.ts +1 -1
- package/build/plugins/withAndroidBaseMods.js +4 -89
- package/build/plugins/withAndroidBaseMods.js.map +1 -1
- package/build/plugins/withDangerousMod.js +0 -5
- package/build/plugins/withDangerousMod.js.map +1 -1
- package/build/plugins/withIosBaseMods.d.ts +1 -1
- package/build/plugins/withIosBaseMods.js +26 -118
- package/build/plugins/withIosBaseMods.js.map +1 -1
- package/build/plugins/withMod.d.ts +1 -1
- package/build/plugins/withMod.js +24 -59
- package/build/plugins/withMod.js.map +1 -1
- package/build/plugins/withPlugins.js +0 -9
- package/build/plugins/withPlugins.js.map +1 -1
- package/build/plugins/withRunOnce.js +3 -9
- package/build/plugins/withRunOnce.js.map +1 -1
- package/build/plugins/withStaticPlugin.js +21 -43
- package/build/plugins/withStaticPlugin.js.map +1 -1
- package/build/utils/BuildProperties.types.d.ts +2 -2
- package/build/utils/BuildProperties.types.js.map +1 -1
- package/build/utils/Updates.d.ts +3 -1
- package/build/utils/Updates.js +18 -77
- package/build/utils/Updates.js.map +1 -1
- package/build/utils/XML.d.ts +1 -1
- package/build/utils/XML.js +7 -44
- package/build/utils/XML.js.map +1 -1
- package/build/utils/commonCodeMod.js +2 -10
- package/build/utils/commonCodeMod.js.map +1 -1
- package/build/utils/errors.d.ts +1 -1
- package/build/utils/errors.js +3 -11
- package/build/utils/errors.js.map +1 -1
- package/build/utils/fs.js +1 -12
- package/build/utils/fs.js.map +1 -1
- package/build/utils/generateCode.d.ts +1 -1
- package/build/utils/generateCode.js +8 -25
- package/build/utils/generateCode.js.map +1 -1
- package/build/utils/history.d.ts +1 -1
- package/build/utils/history.js +0 -6
- package/build/utils/history.js.map +1 -1
- package/build/utils/matchBrackets.d.ts +3 -3
- package/build/utils/matchBrackets.js +2 -17
- package/build/utils/matchBrackets.js.map +1 -1
- package/build/utils/modules.js +0 -10
- package/build/utils/modules.js.map +1 -1
- package/build/utils/obj.js +0 -4
- package/build/utils/obj.js.map +1 -1
- package/build/utils/plugin-resolver.js +25 -69
- package/build/utils/plugin-resolver.js.map +1 -1
- package/build/utils/sortObject.js +4 -10
- package/build/utils/sortObject.js.map +1 -1
- package/build/utils/versions.js +0 -10
- package/build/utils/versions.js.map +1 -1
- package/build/utils/warnings.js +1 -9
- package/build/utils/warnings.js.map +1 -1
- package/package.json +5 -5
|
@@ -11,24 +11,20 @@ exports.getObjectAsResourceGroup = getObjectAsResourceGroup;
|
|
|
11
11
|
exports.getObjectAsResourceItems = getObjectAsResourceItems;
|
|
12
12
|
exports.getResourceItemsAsObject = getResourceItemsAsObject;
|
|
13
13
|
exports.readResourcesXMLAsync = readResourcesXMLAsync;
|
|
14
|
-
|
|
15
14
|
function _XML() {
|
|
16
15
|
const data = require("../utils/XML");
|
|
17
|
-
|
|
18
16
|
_XML = function () {
|
|
19
17
|
return data;
|
|
20
18
|
};
|
|
21
|
-
|
|
22
19
|
return data;
|
|
23
20
|
}
|
|
24
|
-
|
|
25
21
|
const fallbackResourceString = `<?xml version="1.0" encoding="utf-8"?><resources></resources>`;
|
|
22
|
+
|
|
26
23
|
/**
|
|
27
24
|
* Read an XML file while providing a default fallback for resource files.
|
|
28
25
|
*
|
|
29
26
|
* @param options path to the XML file, returns a fallback XML if the path doesn't exist.
|
|
30
27
|
*/
|
|
31
|
-
|
|
32
28
|
async function readResourcesXMLAsync({
|
|
33
29
|
path,
|
|
34
30
|
fallback = fallbackResourceString
|
|
@@ -36,34 +32,31 @@ async function readResourcesXMLAsync({
|
|
|
36
32
|
const xml = await (0, _XML().readXMLAsync)({
|
|
37
33
|
path,
|
|
38
34
|
fallback
|
|
39
|
-
});
|
|
40
|
-
|
|
35
|
+
});
|
|
36
|
+
// Ensure the type is expected.
|
|
41
37
|
if (!xml.resources) {
|
|
42
38
|
xml.resources = {};
|
|
43
39
|
}
|
|
44
|
-
|
|
45
40
|
return xml;
|
|
46
41
|
}
|
|
42
|
+
|
|
47
43
|
/**
|
|
48
44
|
* Ensure the provided xml has a `resources` object (the expected shape).
|
|
49
45
|
*
|
|
50
46
|
* @param xml
|
|
51
47
|
*/
|
|
52
|
-
|
|
53
|
-
|
|
54
48
|
function ensureDefaultResourceXML(xml) {
|
|
55
49
|
if (!xml) {
|
|
56
50
|
xml = {
|
|
57
51
|
resources: {}
|
|
58
52
|
};
|
|
59
53
|
}
|
|
60
|
-
|
|
61
54
|
if (!xml.resources) {
|
|
62
55
|
xml.resources = {};
|
|
63
56
|
}
|
|
64
|
-
|
|
65
57
|
return xml;
|
|
66
58
|
}
|
|
59
|
+
|
|
67
60
|
/**
|
|
68
61
|
* Build a `ResourceItemXML` given its `name` and `value`. This makes things a bit more readable.
|
|
69
62
|
*
|
|
@@ -72,8 +65,6 @@ function ensureDefaultResourceXML(xml) {
|
|
|
72
65
|
*
|
|
73
66
|
* @param props name and value strings.
|
|
74
67
|
*/
|
|
75
|
-
|
|
76
|
-
|
|
77
68
|
function buildResourceItem({
|
|
78
69
|
name,
|
|
79
70
|
value,
|
|
@@ -86,21 +77,16 @@ function buildResourceItem({
|
|
|
86
77
|
},
|
|
87
78
|
_: value
|
|
88
79
|
};
|
|
89
|
-
|
|
90
80
|
if (targetApi) {
|
|
91
81
|
item.$['tools:targetApi'] = targetApi;
|
|
92
82
|
}
|
|
93
|
-
|
|
94
83
|
if (translatable !== undefined) {
|
|
95
84
|
item.$['translatable'] = String(translatable);
|
|
96
85
|
}
|
|
97
|
-
|
|
98
86
|
return item;
|
|
99
87
|
}
|
|
100
|
-
|
|
101
88
|
function buildResourceGroup(parent) {
|
|
102
89
|
var _parent$items;
|
|
103
|
-
|
|
104
90
|
return {
|
|
105
91
|
$: {
|
|
106
92
|
name: parent.name,
|
|
@@ -109,44 +95,39 @@ function buildResourceGroup(parent) {
|
|
|
109
95
|
item: (_parent$items = parent.items) !== null && _parent$items !== void 0 ? _parent$items : []
|
|
110
96
|
};
|
|
111
97
|
}
|
|
112
|
-
|
|
113
98
|
function findResourceGroup(xml, group) {
|
|
114
99
|
var _xml$filter, _xml$filter$call;
|
|
115
|
-
|
|
116
100
|
const app = xml === null || xml === void 0 ? void 0 : (_xml$filter = xml.filter) === null || _xml$filter === void 0 ? void 0 : (_xml$filter$call = _xml$filter.call(xml, ({
|
|
117
101
|
$: head
|
|
118
102
|
}) => {
|
|
119
103
|
let matches = head.name === group.name;
|
|
120
|
-
|
|
121
104
|
if (group.parent != null && matches) {
|
|
122
105
|
matches = head.parent === group.parent;
|
|
123
106
|
}
|
|
124
|
-
|
|
125
107
|
return matches;
|
|
126
108
|
})) === null || _xml$filter$call === void 0 ? void 0 : _xml$filter$call[0];
|
|
127
109
|
return app !== null && app !== void 0 ? app : null;
|
|
128
110
|
}
|
|
111
|
+
|
|
129
112
|
/**
|
|
130
113
|
* Helper to convert a basic XML object into a simple k/v pair.
|
|
131
114
|
*
|
|
132
115
|
* @param xml
|
|
133
116
|
* @returns
|
|
134
117
|
*/
|
|
135
|
-
|
|
136
|
-
|
|
137
118
|
function getResourceItemsAsObject(xml) {
|
|
138
|
-
return xml.reduce((prev, curr) => ({
|
|
119
|
+
return xml.reduce((prev, curr) => ({
|
|
120
|
+
...prev,
|
|
139
121
|
[curr.$.name]: curr._
|
|
140
122
|
}), {});
|
|
141
123
|
}
|
|
124
|
+
|
|
142
125
|
/**
|
|
143
126
|
* Helper to convert a basic k/v object to a ResourceItemXML array.
|
|
144
127
|
*
|
|
145
128
|
* @param xml
|
|
146
129
|
* @returns
|
|
147
130
|
*/
|
|
148
|
-
|
|
149
|
-
|
|
150
131
|
function getObjectAsResourceItems(obj) {
|
|
151
132
|
return Object.entries(obj).map(([name, value]) => ({
|
|
152
133
|
$: {
|
|
@@ -155,7 +136,6 @@ function getObjectAsResourceItems(obj) {
|
|
|
155
136
|
_: value
|
|
156
137
|
}));
|
|
157
138
|
}
|
|
158
|
-
|
|
159
139
|
function getObjectAsResourceGroup(group) {
|
|
160
140
|
return {
|
|
161
141
|
$: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Resources.js","names":["fallbackResourceString","readResourcesXMLAsync","path","fallback","xml","readXMLAsync","resources","ensureDefaultResourceXML","buildResourceItem","name","value","targetApi","translatable","item","$","_","undefined","String","buildResourceGroup","parent","items","findResourceGroup","group","app","filter","head","matches","getResourceItemsAsObject","reduce","prev","curr","getObjectAsResourceItems","obj","Object","entries","map","getObjectAsResourceGroup"],"sources":["../../src/android/Resources.ts"],"sourcesContent":["import { readXMLAsync, XMLObject } from '../utils/XML';\n\nexport type ResourceGroupXML = {\n $: {\n name: string;\n parent: string;\n };\n item: ResourceItemXML[];\n};\n\nexport type ResourceXML = {\n resources: {\n $?: {\n 'xmlns:tools'?: string;\n };\n color?: ResourceItemXML[];\n string?: ResourceItemXML[];\n style?: ResourceGroupXML[];\n // Add more if needed...\n };\n};\n\nexport type ResourceItemXML = {\n _: string;\n $: {\n name: string;\n 'tools:targetApi'?: string;\n translatable?: string;\n };\n};\n/**\n * Name of the resource folder.\n */\nexport type ResourceKind =\n | 'values'\n | 'values-night'\n | 'values-v23'\n | 'values-night-v23'\n | 'drawable';\n\nconst fallbackResourceString = `<?xml version=\"1.0\" encoding=\"utf-8\"?><resources></resources>`;\n\n/**\n * Read an XML file while providing a default fallback for resource files.\n *\n * @param options path to the XML file, returns a fallback XML if the path doesn't exist.\n */\nexport async function readResourcesXMLAsync({\n path,\n fallback = fallbackResourceString,\n}: {\n path: string;\n fallback?: string | null;\n}): Promise<ResourceXML> {\n const xml = await readXMLAsync({ path, fallback });\n // Ensure the type is expected.\n if (!xml.resources) {\n xml.resources = {};\n }\n return xml as ResourceXML;\n}\n\n/**\n * Ensure the provided xml has a `resources` object (the expected shape).\n *\n * @param xml\n */\nexport function ensureDefaultResourceXML(xml: XMLObject): ResourceXML {\n if (!xml) {\n xml = { resources: {} };\n }\n if (!xml.resources) {\n xml.resources = {};\n }\n\n return xml as ResourceXML;\n}\n\n/**\n * Build a `ResourceItemXML` given its `name` and `value`. This makes things a bit more readable.\n *\n * - JSON: `{ $: { name }, _: value }`\n * - XML: `<item name=\"NAME\">VALUE</item>`\n *\n * @param props name and value strings.\n */\nexport function buildResourceItem({\n name,\n value,\n targetApi,\n translatable,\n}: {\n name: string;\n value: string;\n targetApi?: string;\n translatable?: boolean;\n}): ResourceItemXML {\n const item: ResourceItemXML = { $: { name }, _: value };\n if (targetApi) {\n item.$['tools:targetApi'] = targetApi;\n }\n if (translatable !== undefined) {\n item.$['translatable'] = String(translatable);\n }\n return item;\n}\n\nexport function buildResourceGroup(parent: {\n name: string;\n parent: string;\n items?: ResourceItemXML[];\n}): ResourceGroupXML {\n return {\n $: { name: parent.name, parent: parent.parent },\n item: parent.items ?? [],\n };\n}\n\nexport function findResourceGroup(\n xml: ResourceGroupXML[] | undefined,\n group: { name: string; parent?: string }\n): ResourceGroupXML | null {\n const app = xml?.filter?.(({ $: head }) => {\n let matches = head.name === group.name;\n if (group.parent != null && matches) {\n matches = head.parent === group.parent;\n }\n return matches;\n })?.[0];\n return app ?? null;\n}\n\n/**\n * Helper to convert a basic XML object into a simple k/v pair.\n *\n * @param xml\n * @returns\n */\nexport function getResourceItemsAsObject(xml: ResourceItemXML[]): Record<string, string> | null {\n return xml.reduce(\n (prev, curr) => ({\n ...prev,\n [curr.$.name]: curr._,\n }),\n {}\n );\n}\n\n/**\n * Helper to convert a basic k/v object to a ResourceItemXML array.\n *\n * @param xml\n * @returns\n */\nexport function getObjectAsResourceItems(obj: Record<string, string>): ResourceItemXML[] {\n return Object.entries(obj).map(([name, value]) => ({\n $: { name },\n _: value,\n }));\n}\n\nexport function getObjectAsResourceGroup(group: {\n name: string;\n parent: string;\n item: Record<string, string>;\n}): ResourceGroupXML {\n return {\n $: {\n name: group.name,\n parent: group.parent,\n },\n item: getObjectAsResourceItems(group.item),\n };\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Resources.js","names":["fallbackResourceString","readResourcesXMLAsync","path","fallback","xml","readXMLAsync","resources","ensureDefaultResourceXML","buildResourceItem","name","value","targetApi","translatable","item","$","_","undefined","String","buildResourceGroup","parent","items","findResourceGroup","group","app","filter","head","matches","getResourceItemsAsObject","reduce","prev","curr","getObjectAsResourceItems","obj","Object","entries","map","getObjectAsResourceGroup"],"sources":["../../src/android/Resources.ts"],"sourcesContent":["import { readXMLAsync, XMLObject } from '../utils/XML';\n\nexport type ResourceGroupXML = {\n $: {\n name: string;\n parent: string;\n };\n item: ResourceItemXML[];\n};\n\nexport type ResourceXML = {\n resources: {\n $?: {\n 'xmlns:tools'?: string;\n };\n color?: ResourceItemXML[];\n string?: ResourceItemXML[];\n style?: ResourceGroupXML[];\n // Add more if needed...\n };\n};\n\nexport type ResourceItemXML = {\n _: string;\n $: {\n name: string;\n 'tools:targetApi'?: string;\n translatable?: string;\n };\n};\n/**\n * Name of the resource folder.\n */\nexport type ResourceKind =\n | 'values'\n | 'values-night'\n | 'values-v23'\n | 'values-night-v23'\n | 'drawable';\n\nconst fallbackResourceString = `<?xml version=\"1.0\" encoding=\"utf-8\"?><resources></resources>`;\n\n/**\n * Read an XML file while providing a default fallback for resource files.\n *\n * @param options path to the XML file, returns a fallback XML if the path doesn't exist.\n */\nexport async function readResourcesXMLAsync({\n path,\n fallback = fallbackResourceString,\n}: {\n path: string;\n fallback?: string | null;\n}): Promise<ResourceXML> {\n const xml = await readXMLAsync({ path, fallback });\n // Ensure the type is expected.\n if (!xml.resources) {\n xml.resources = {};\n }\n return xml as ResourceXML;\n}\n\n/**\n * Ensure the provided xml has a `resources` object (the expected shape).\n *\n * @param xml\n */\nexport function ensureDefaultResourceXML(xml: XMLObject): ResourceXML {\n if (!xml) {\n xml = { resources: {} };\n }\n if (!xml.resources) {\n xml.resources = {};\n }\n\n return xml as ResourceXML;\n}\n\n/**\n * Build a `ResourceItemXML` given its `name` and `value`. This makes things a bit more readable.\n *\n * - JSON: `{ $: { name }, _: value }`\n * - XML: `<item name=\"NAME\">VALUE</item>`\n *\n * @param props name and value strings.\n */\nexport function buildResourceItem({\n name,\n value,\n targetApi,\n translatable,\n}: {\n name: string;\n value: string;\n targetApi?: string;\n translatable?: boolean;\n}): ResourceItemXML {\n const item: ResourceItemXML = { $: { name }, _: value };\n if (targetApi) {\n item.$['tools:targetApi'] = targetApi;\n }\n if (translatable !== undefined) {\n item.$['translatable'] = String(translatable);\n }\n return item;\n}\n\nexport function buildResourceGroup(parent: {\n name: string;\n parent: string;\n items?: ResourceItemXML[];\n}): ResourceGroupXML {\n return {\n $: { name: parent.name, parent: parent.parent },\n item: parent.items ?? [],\n };\n}\n\nexport function findResourceGroup(\n xml: ResourceGroupXML[] | undefined,\n group: { name: string; parent?: string }\n): ResourceGroupXML | null {\n const app = xml?.filter?.(({ $: head }) => {\n let matches = head.name === group.name;\n if (group.parent != null && matches) {\n matches = head.parent === group.parent;\n }\n return matches;\n })?.[0];\n return app ?? null;\n}\n\n/**\n * Helper to convert a basic XML object into a simple k/v pair.\n *\n * @param xml\n * @returns\n */\nexport function getResourceItemsAsObject(xml: ResourceItemXML[]): Record<string, string> | null {\n return xml.reduce(\n (prev, curr) => ({\n ...prev,\n [curr.$.name]: curr._,\n }),\n {}\n );\n}\n\n/**\n * Helper to convert a basic k/v object to a ResourceItemXML array.\n *\n * @param xml\n * @returns\n */\nexport function getObjectAsResourceItems(obj: Record<string, string>): ResourceItemXML[] {\n return Object.entries(obj).map(([name, value]) => ({\n $: { name },\n _: value,\n }));\n}\n\nexport function getObjectAsResourceGroup(group: {\n name: string;\n parent: string;\n item: Record<string, string>;\n}): ResourceGroupXML {\n return {\n $: {\n name: group.name,\n parent: group.parent,\n },\n item: getObjectAsResourceItems(group.item),\n };\n}\n"],"mappings":"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"}
|
package/build/android/Scheme.js
CHANGED
|
@@ -11,107 +11,86 @@ exports.hasScheme = hasScheme;
|
|
|
11
11
|
exports.removeScheme = removeScheme;
|
|
12
12
|
exports.setScheme = setScheme;
|
|
13
13
|
exports.withScheme = void 0;
|
|
14
|
-
|
|
15
14
|
function _androidPlugins() {
|
|
16
15
|
const data = require("../plugins/android-plugins");
|
|
17
|
-
|
|
18
16
|
_androidPlugins = function () {
|
|
19
17
|
return data;
|
|
20
18
|
};
|
|
21
|
-
|
|
22
19
|
return data;
|
|
23
20
|
}
|
|
24
|
-
|
|
25
21
|
function _warnings() {
|
|
26
22
|
const data = require("../utils/warnings");
|
|
27
|
-
|
|
28
23
|
_warnings = function () {
|
|
29
24
|
return data;
|
|
30
25
|
};
|
|
31
|
-
|
|
32
26
|
return data;
|
|
33
27
|
}
|
|
34
|
-
|
|
35
28
|
const withScheme = (0, _androidPlugins().createAndroidManifestPlugin)(setScheme, 'withScheme');
|
|
36
29
|
exports.withScheme = withScheme;
|
|
37
|
-
|
|
38
30
|
function getScheme(config) {
|
|
39
31
|
if (Array.isArray(config.scheme)) {
|
|
40
32
|
const validate = value => typeof value === 'string';
|
|
41
|
-
|
|
42
33
|
return config.scheme.filter(validate);
|
|
43
34
|
} else if (typeof config.scheme === 'string') {
|
|
44
35
|
return [config.scheme];
|
|
45
36
|
}
|
|
46
|
-
|
|
47
37
|
return [];
|
|
48
|
-
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// This plugin used to remove the unused schemes but this is unpredictable because other plugins could add schemes.
|
|
49
41
|
// The only way to reliably remove schemes from the project is to nuke the file and regenerate the code (`expo prebuild --clean`).
|
|
50
42
|
// Regardless, having extra schemes isn't a fatal issue and therefore a tolerable compromise is to just add new schemes that aren't currently present.
|
|
51
|
-
|
|
52
|
-
|
|
53
43
|
function setScheme(config, androidManifest) {
|
|
54
44
|
var _config$android, _config$android2;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
...getScheme((_config$android = config.android) !== null && _config$android !== void 0 ? _config$android : {})];
|
|
58
|
-
|
|
45
|
+
const schemes = [...getScheme(config),
|
|
46
|
+
// @ts-ignore: TODO: android.scheme is an unreleased -- harder to add to turtle v1.
|
|
47
|
+
...getScheme((_config$android = config.android) !== null && _config$android !== void 0 ? _config$android : {})];
|
|
48
|
+
// Add the package name to the list of schemes for easier Google auth and parity with Turtle v1.
|
|
59
49
|
if ((_config$android2 = config.android) !== null && _config$android2 !== void 0 && _config$android2.package) {
|
|
60
50
|
schemes.push(config.android.package);
|
|
61
51
|
}
|
|
62
|
-
|
|
63
52
|
if (schemes.length === 0) {
|
|
64
53
|
return androidManifest;
|
|
65
54
|
}
|
|
66
|
-
|
|
67
55
|
if (!ensureManifestHasValidIntentFilter(androidManifest)) {
|
|
68
56
|
(0, _warnings().addWarningAndroid)('scheme', `Cannot add schemes because the provided manifest does not have a valid Activity with \`android:launchMode="singleTask"\``, 'https://expo.fyi/setup-android-uri-scheme');
|
|
69
57
|
return androidManifest;
|
|
70
|
-
}
|
|
71
|
-
|
|
58
|
+
}
|
|
72
59
|
|
|
60
|
+
// Get the current schemes and remove them from the list of schemes to add.
|
|
73
61
|
const currentSchemes = getSchemesFromManifest(androidManifest);
|
|
74
|
-
|
|
75
62
|
for (const uri of currentSchemes) {
|
|
76
63
|
const index = schemes.indexOf(uri);
|
|
77
64
|
if (index > -1) schemes.splice(index, 1);
|
|
78
|
-
}
|
|
79
|
-
|
|
65
|
+
}
|
|
80
66
|
|
|
67
|
+
// Now add all of the remaining schemes.
|
|
81
68
|
for (const uri of schemes) {
|
|
82
69
|
androidManifest = appendScheme(uri, androidManifest);
|
|
83
70
|
}
|
|
84
|
-
|
|
85
71
|
return androidManifest;
|
|
86
72
|
}
|
|
87
|
-
|
|
88
73
|
function isValidRedirectIntentFilter({
|
|
89
74
|
actions,
|
|
90
75
|
categories
|
|
91
76
|
}) {
|
|
92
77
|
return actions.includes('android.intent.action.VIEW') && !categories.includes('android.intent.category.LAUNCHER');
|
|
93
78
|
}
|
|
94
|
-
|
|
95
79
|
function propertiesFromIntentFilter(intentFilter) {
|
|
96
80
|
var _intentFilter$action$, _intentFilter$action, _intentFilter$categor, _intentFilter$categor2, _intentFilter$data$fi, _intentFilter$data, _intentFilter$data$fi2;
|
|
97
|
-
|
|
98
81
|
const actions = (_intentFilter$action$ = intentFilter === null || intentFilter === void 0 ? void 0 : (_intentFilter$action = intentFilter.action) === null || _intentFilter$action === void 0 ? void 0 : _intentFilter$action.map(data => {
|
|
99
82
|
var _data$$;
|
|
100
|
-
|
|
101
83
|
return data === null || data === void 0 ? void 0 : (_data$$ = data.$) === null || _data$$ === void 0 ? void 0 : _data$$['android:name'];
|
|
102
84
|
})) !== null && _intentFilter$action$ !== void 0 ? _intentFilter$action$ : [];
|
|
103
85
|
const categories = (_intentFilter$categor = intentFilter === null || intentFilter === void 0 ? void 0 : (_intentFilter$categor2 = intentFilter.category) === null || _intentFilter$categor2 === void 0 ? void 0 : _intentFilter$categor2.map(data => {
|
|
104
86
|
var _data$$2;
|
|
105
|
-
|
|
106
87
|
return data === null || data === void 0 ? void 0 : (_data$$2 = data.$) === null || _data$$2 === void 0 ? void 0 : _data$$2['android:name'];
|
|
107
88
|
})) !== null && _intentFilter$categor !== void 0 ? _intentFilter$categor : [];
|
|
108
89
|
const data = (_intentFilter$data$fi = intentFilter === null || intentFilter === void 0 ? void 0 : (_intentFilter$data = intentFilter.data) === null || _intentFilter$data === void 0 ? void 0 : (_intentFilter$data$fi2 = _intentFilter$data.filter(data => {
|
|
109
90
|
var _data$$3;
|
|
110
|
-
|
|
111
91
|
return data === null || data === void 0 ? void 0 : (_data$$3 = data.$) === null || _data$$3 === void 0 ? void 0 : _data$$3['android:scheme'];
|
|
112
92
|
})) === null || _intentFilter$data$fi2 === void 0 ? void 0 : _intentFilter$data$fi2.map(data => {
|
|
113
93
|
var _data$$4, _data$$5;
|
|
114
|
-
|
|
115
94
|
return {
|
|
116
95
|
scheme: data === null || data === void 0 ? void 0 : (_data$$4 = data.$) === null || _data$$4 === void 0 ? void 0 : _data$$4['android:scheme'],
|
|
117
96
|
host: data === null || data === void 0 ? void 0 : (_data$$5 = data.$) === null || _data$$5 === void 0 ? void 0 : _data$$5['android:host']
|
|
@@ -123,39 +102,31 @@ function propertiesFromIntentFilter(intentFilter) {
|
|
|
123
102
|
data
|
|
124
103
|
};
|
|
125
104
|
}
|
|
126
|
-
|
|
127
105
|
function getSingleTaskIntentFilters(androidManifest) {
|
|
128
106
|
if (!Array.isArray(androidManifest.manifest.application)) return [];
|
|
129
107
|
let outputSchemes = [];
|
|
130
|
-
|
|
131
108
|
for (const application of androidManifest.manifest.application) {
|
|
132
109
|
const {
|
|
133
110
|
activity
|
|
134
|
-
} = application;
|
|
135
|
-
|
|
111
|
+
} = application;
|
|
112
|
+
// @ts-ignore
|
|
136
113
|
const activities = Array.isArray(activity) ? activity : [activity];
|
|
137
114
|
const singleTaskActivities = activities.filter(activity => {
|
|
138
115
|
var _activity$$;
|
|
139
|
-
|
|
140
116
|
return (activity === null || activity === void 0 ? void 0 : (_activity$$ = activity.$) === null || _activity$$ === void 0 ? void 0 : _activity$$['android:launchMode']) === 'singleTask';
|
|
141
117
|
});
|
|
142
|
-
|
|
143
118
|
for (const activity of singleTaskActivities) {
|
|
144
119
|
const intentFilters = activity['intent-filter'];
|
|
145
120
|
outputSchemes = outputSchemes.concat(intentFilters);
|
|
146
121
|
}
|
|
147
122
|
}
|
|
148
|
-
|
|
149
123
|
return outputSchemes;
|
|
150
124
|
}
|
|
151
|
-
|
|
152
125
|
function getSchemesFromManifest(androidManifest, requestedHost = null) {
|
|
153
126
|
const outputSchemes = [];
|
|
154
127
|
const singleTaskIntentFilters = getSingleTaskIntentFilters(androidManifest);
|
|
155
|
-
|
|
156
128
|
for (const intentFilter of singleTaskIntentFilters) {
|
|
157
129
|
const properties = propertiesFromIntentFilter(intentFilter);
|
|
158
|
-
|
|
159
130
|
if (isValidRedirectIntentFilter(properties) && properties.data) {
|
|
160
131
|
for (const {
|
|
161
132
|
scheme,
|
|
@@ -167,33 +138,26 @@ function getSchemesFromManifest(androidManifest, requestedHost = null) {
|
|
|
167
138
|
}
|
|
168
139
|
}
|
|
169
140
|
}
|
|
170
|
-
|
|
171
141
|
return outputSchemes;
|
|
172
142
|
}
|
|
173
|
-
|
|
174
143
|
function ensureManifestHasValidIntentFilter(androidManifest) {
|
|
175
144
|
if (!Array.isArray(androidManifest.manifest.application)) {
|
|
176
145
|
return false;
|
|
177
146
|
}
|
|
178
|
-
|
|
179
147
|
for (const application of androidManifest.manifest.application) {
|
|
180
148
|
for (const activity of application.activity || []) {
|
|
181
149
|
var _activity$$2;
|
|
182
|
-
|
|
183
150
|
if ((activity === null || activity === void 0 ? void 0 : (_activity$$2 = activity.$) === null || _activity$$2 === void 0 ? void 0 : _activity$$2['android:launchMode']) === 'singleTask') {
|
|
184
151
|
for (const intentFilter of activity['intent-filter'] || []) {
|
|
185
152
|
// Parse valid intent filters...
|
|
186
153
|
const properties = propertiesFromIntentFilter(intentFilter);
|
|
187
|
-
|
|
188
154
|
if (isValidRedirectIntentFilter(properties)) {
|
|
189
155
|
return true;
|
|
190
156
|
}
|
|
191
157
|
}
|
|
192
|
-
|
|
193
158
|
if (!activity['intent-filter']) {
|
|
194
159
|
activity['intent-filter'] = [];
|
|
195
160
|
}
|
|
196
|
-
|
|
197
161
|
activity['intent-filter'].push({
|
|
198
162
|
action: [{
|
|
199
163
|
$: {
|
|
@@ -214,28 +178,22 @@ function ensureManifestHasValidIntentFilter(androidManifest) {
|
|
|
214
178
|
}
|
|
215
179
|
}
|
|
216
180
|
}
|
|
217
|
-
|
|
218
181
|
return false;
|
|
219
182
|
}
|
|
220
|
-
|
|
221
183
|
function hasScheme(scheme, androidManifest) {
|
|
222
184
|
const schemes = getSchemesFromManifest(androidManifest);
|
|
223
185
|
return schemes.includes(scheme);
|
|
224
186
|
}
|
|
225
|
-
|
|
226
187
|
function appendScheme(scheme, androidManifest) {
|
|
227
188
|
if (!Array.isArray(androidManifest.manifest.application)) {
|
|
228
189
|
return androidManifest;
|
|
229
190
|
}
|
|
230
|
-
|
|
231
191
|
for (const application of androidManifest.manifest.application) {
|
|
232
192
|
for (const activity of application.activity || []) {
|
|
233
193
|
var _activity$$3;
|
|
234
|
-
|
|
235
194
|
if ((activity === null || activity === void 0 ? void 0 : (_activity$$3 = activity.$) === null || _activity$$3 === void 0 ? void 0 : _activity$$3['android:launchMode']) === 'singleTask') {
|
|
236
195
|
for (const intentFilter of activity['intent-filter'] || []) {
|
|
237
196
|
const properties = propertiesFromIntentFilter(intentFilter);
|
|
238
|
-
|
|
239
197
|
if (isValidRedirectIntentFilter(properties)) {
|
|
240
198
|
if (!intentFilter.data) intentFilter.data = [];
|
|
241
199
|
intentFilter.data.push({
|
|
@@ -245,49 +203,38 @@ function appendScheme(scheme, androidManifest) {
|
|
|
245
203
|
});
|
|
246
204
|
}
|
|
247
205
|
}
|
|
248
|
-
|
|
249
206
|
break;
|
|
250
207
|
}
|
|
251
208
|
}
|
|
252
209
|
}
|
|
253
|
-
|
|
254
210
|
return androidManifest;
|
|
255
211
|
}
|
|
256
|
-
|
|
257
212
|
function removeScheme(scheme, androidManifest) {
|
|
258
213
|
if (!Array.isArray(androidManifest.manifest.application)) {
|
|
259
214
|
return androidManifest;
|
|
260
215
|
}
|
|
261
|
-
|
|
262
216
|
for (const application of androidManifest.manifest.application) {
|
|
263
217
|
for (const activity of application.activity || []) {
|
|
264
218
|
var _activity$$4;
|
|
265
|
-
|
|
266
219
|
if ((activity === null || activity === void 0 ? void 0 : (_activity$$4 = activity.$) === null || _activity$$4 === void 0 ? void 0 : _activity$$4['android:launchMode']) === 'singleTask') {
|
|
267
220
|
for (const intentFilter of activity['intent-filter'] || []) {
|
|
268
221
|
// Parse valid intent filters...
|
|
269
222
|
const properties = propertiesFromIntentFilter(intentFilter);
|
|
270
|
-
|
|
271
223
|
if (isValidRedirectIntentFilter(properties)) {
|
|
272
224
|
for (const dataKey in (intentFilter === null || intentFilter === void 0 ? void 0 : intentFilter.data) || []) {
|
|
273
225
|
var _intentFilter$data2, _data$$6;
|
|
274
|
-
|
|
275
226
|
const data = (_intentFilter$data2 = intentFilter.data) === null || _intentFilter$data2 === void 0 ? void 0 : _intentFilter$data2[dataKey];
|
|
276
|
-
|
|
277
227
|
if ((data === null || data === void 0 ? void 0 : (_data$$6 = data.$) === null || _data$$6 === void 0 ? void 0 : _data$$6['android:scheme']) === scheme) {
|
|
278
228
|
var _intentFilter$data3;
|
|
279
|
-
|
|
280
229
|
(_intentFilter$data3 = intentFilter.data) === null || _intentFilter$data3 === void 0 ? true : delete _intentFilter$data3[dataKey];
|
|
281
230
|
}
|
|
282
231
|
}
|
|
283
232
|
}
|
|
284
233
|
}
|
|
285
|
-
|
|
286
234
|
break;
|
|
287
235
|
}
|
|
288
236
|
}
|
|
289
237
|
}
|
|
290
|
-
|
|
291
238
|
return androidManifest;
|
|
292
239
|
}
|
|
293
240
|
//# sourceMappingURL=Scheme.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Scheme.js","names":["withScheme","createAndroidManifestPlugin","setScheme","getScheme","config","Array","isArray","scheme","validate","value","filter","androidManifest","schemes","android","package","push","length","ensureManifestHasValidIntentFilter","addWarningAndroid","currentSchemes","getSchemesFromManifest","uri","index","indexOf","splice","appendScheme","isValidRedirectIntentFilter","actions","categories","includes","propertiesFromIntentFilter","intentFilter","action","map","data","$","category","host","getSingleTaskIntentFilters","manifest","application","outputSchemes","activity","activities","singleTaskActivities","intentFilters","concat","requestedHost","singleTaskIntentFilters","properties","hasScheme","removeScheme","dataKey"],"sources":["../../src/android/Scheme.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config-types';\n\nimport { createAndroidManifestPlugin } from '../plugins/android-plugins';\nimport { addWarningAndroid } from '../utils/warnings';\nimport { AndroidManifest, ManifestActivity } from './Manifest';\n\nexport type IntentFilterProps = {\n actions: string[];\n categories: string[];\n data: {\n scheme: string;\n host?: string;\n }[];\n};\n\nexport const withScheme = createAndroidManifestPlugin(setScheme, 'withScheme');\n\nexport function getScheme(config: { scheme?: string | string[] }): string[] {\n if (Array.isArray(config.scheme)) {\n const validate = (value: any): value is string => typeof value === 'string';\n\n return config.scheme.filter<string>(validate);\n } else if (typeof config.scheme === 'string') {\n return [config.scheme];\n }\n return [];\n}\n\n// This plugin used to remove the unused schemes but this is unpredictable because other plugins could add schemes.\n// The only way to reliably remove schemes from the project is to nuke the file and regenerate the code (`expo prebuild --clean`).\n// Regardless, having extra schemes isn't a fatal issue and therefore a tolerable compromise is to just add new schemes that aren't currently present.\nexport function setScheme(\n config: Pick<ExpoConfig, 'scheme' | 'android'>,\n androidManifest: AndroidManifest\n) {\n const schemes = [\n ...getScheme(config),\n // @ts-ignore: TODO: android.scheme is an unreleased -- harder to add to turtle v1.\n ...getScheme(config.android ?? {}),\n ];\n // Add the package name to the list of schemes for easier Google auth and parity with Turtle v1.\n if (config.android?.package) {\n schemes.push(config.android.package);\n }\n if (schemes.length === 0) {\n return androidManifest;\n }\n\n if (!ensureManifestHasValidIntentFilter(androidManifest)) {\n addWarningAndroid(\n 'scheme',\n `Cannot add schemes because the provided manifest does not have a valid Activity with \\`android:launchMode=\"singleTask\"\\``,\n 'https://expo.fyi/setup-android-uri-scheme'\n );\n return androidManifest;\n }\n\n // Get the current schemes and remove them from the list of schemes to add.\n const currentSchemes = getSchemesFromManifest(androidManifest);\n for (const uri of currentSchemes) {\n const index = schemes.indexOf(uri);\n if (index > -1) schemes.splice(index, 1);\n }\n\n // Now add all of the remaining schemes.\n for (const uri of schemes) {\n androidManifest = appendScheme(uri, androidManifest);\n }\n\n return androidManifest;\n}\n\nfunction isValidRedirectIntentFilter({ actions, categories }: IntentFilterProps): boolean {\n return (\n actions.includes('android.intent.action.VIEW') &&\n !categories.includes('android.intent.category.LAUNCHER')\n );\n}\n\nfunction propertiesFromIntentFilter(intentFilter: any): IntentFilterProps {\n const actions = intentFilter?.action?.map((data: any) => data?.$?.['android:name']) ?? [];\n const categories = intentFilter?.category?.map((data: any) => data?.$?.['android:name']) ?? [];\n const data =\n intentFilter?.data\n ?.filter((data: any) => data?.$?.['android:scheme'])\n ?.map((data: any) => ({\n scheme: data?.$?.['android:scheme'],\n host: data?.$?.['android:host'],\n })) ?? [];\n return {\n actions,\n categories,\n data,\n };\n}\n\nfunction getSingleTaskIntentFilters(androidManifest: AndroidManifest): any[] {\n if (!Array.isArray(androidManifest.manifest.application)) return [];\n\n let outputSchemes: any[] = [];\n for (const application of androidManifest.manifest.application) {\n const { activity } = application;\n // @ts-ignore\n const activities = Array.isArray(activity) ? activity : [activity];\n const singleTaskActivities = (activities as ManifestActivity[]).filter(\n (activity) => activity?.$?.['android:launchMode'] === 'singleTask'\n );\n for (const activity of singleTaskActivities) {\n const intentFilters = activity['intent-filter'];\n outputSchemes = outputSchemes.concat(intentFilters);\n }\n }\n return outputSchemes;\n}\n\nexport function getSchemesFromManifest(\n androidManifest: AndroidManifest,\n requestedHost: string | null = null\n): string[] {\n const outputSchemes: string[] = [];\n\n const singleTaskIntentFilters = getSingleTaskIntentFilters(androidManifest);\n for (const intentFilter of singleTaskIntentFilters) {\n const properties = propertiesFromIntentFilter(intentFilter);\n if (isValidRedirectIntentFilter(properties) && properties.data) {\n for (const { scheme, host } of properties.data) {\n if (requestedHost === null || !host || host === requestedHost) {\n outputSchemes.push(scheme);\n }\n }\n }\n }\n\n return outputSchemes;\n}\n\nexport function ensureManifestHasValidIntentFilter(androidManifest: AndroidManifest): boolean {\n if (!Array.isArray(androidManifest.manifest.application)) {\n return false;\n }\n\n for (const application of androidManifest.manifest.application) {\n for (const activity of application.activity || []) {\n if (activity?.$?.['android:launchMode'] === 'singleTask') {\n for (const intentFilter of activity['intent-filter'] || []) {\n // Parse valid intent filters...\n const properties = propertiesFromIntentFilter(intentFilter);\n if (isValidRedirectIntentFilter(properties)) {\n return true;\n }\n }\n if (!activity['intent-filter']) {\n activity['intent-filter'] = [];\n }\n\n activity['intent-filter'].push({\n action: [{ $: { 'android:name': 'android.intent.action.VIEW' } }],\n category: [\n { $: { 'android:name': 'android.intent.category.DEFAULT' } },\n { $: { 'android:name': 'android.intent.category.BROWSABLE' } },\n ],\n });\n return true;\n }\n }\n }\n return false;\n}\n\nexport function hasScheme(scheme: string, androidManifest: AndroidManifest): boolean {\n const schemes = getSchemesFromManifest(androidManifest);\n return schemes.includes(scheme);\n}\n\nexport function appendScheme(scheme: string, androidManifest: AndroidManifest): AndroidManifest {\n if (!Array.isArray(androidManifest.manifest.application)) {\n return androidManifest;\n }\n\n for (const application of androidManifest.manifest.application) {\n for (const activity of application.activity || []) {\n if (activity?.$?.['android:launchMode'] === 'singleTask') {\n for (const intentFilter of activity['intent-filter'] || []) {\n const properties = propertiesFromIntentFilter(intentFilter);\n if (isValidRedirectIntentFilter(properties)) {\n if (!intentFilter.data) intentFilter.data = [];\n intentFilter.data.push({\n $: { 'android:scheme': scheme },\n });\n }\n }\n break;\n }\n }\n }\n return androidManifest;\n}\n\nexport function removeScheme(scheme: string, androidManifest: AndroidManifest): AndroidManifest {\n if (!Array.isArray(androidManifest.manifest.application)) {\n return androidManifest;\n }\n\n for (const application of androidManifest.manifest.application) {\n for (const activity of application.activity || []) {\n if (activity?.$?.['android:launchMode'] === 'singleTask') {\n for (const intentFilter of activity['intent-filter'] || []) {\n // Parse valid intent filters...\n const properties = propertiesFromIntentFilter(intentFilter);\n if (isValidRedirectIntentFilter(properties)) {\n for (const dataKey in intentFilter?.data || []) {\n const data = intentFilter.data?.[dataKey];\n if (data?.$?.['android:scheme'] === scheme) {\n delete intentFilter.data?.[dataKey];\n }\n }\n }\n }\n break;\n }\n }\n }\n\n return androidManifest;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Scheme.js","names":["withScheme","createAndroidManifestPlugin","setScheme","getScheme","config","Array","isArray","scheme","validate","value","filter","androidManifest","schemes","android","package","push","length","ensureManifestHasValidIntentFilter","addWarningAndroid","currentSchemes","getSchemesFromManifest","uri","index","indexOf","splice","appendScheme","isValidRedirectIntentFilter","actions","categories","includes","propertiesFromIntentFilter","intentFilter","action","map","data","$","category","host","getSingleTaskIntentFilters","manifest","application","outputSchemes","activity","activities","singleTaskActivities","intentFilters","concat","requestedHost","singleTaskIntentFilters","properties","hasScheme","removeScheme","dataKey"],"sources":["../../src/android/Scheme.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config-types';\n\nimport { createAndroidManifestPlugin } from '../plugins/android-plugins';\nimport { addWarningAndroid } from '../utils/warnings';\nimport { AndroidManifest, ManifestActivity } from './Manifest';\n\nexport type IntentFilterProps = {\n actions: string[];\n categories: string[];\n data: {\n scheme: string;\n host?: string;\n }[];\n};\n\nexport const withScheme = createAndroidManifestPlugin(setScheme, 'withScheme');\n\nexport function getScheme(config: { scheme?: string | string[] }): string[] {\n if (Array.isArray(config.scheme)) {\n const validate = (value: any): value is string => typeof value === 'string';\n\n return config.scheme.filter<string>(validate);\n } else if (typeof config.scheme === 'string') {\n return [config.scheme];\n }\n return [];\n}\n\n// This plugin used to remove the unused schemes but this is unpredictable because other plugins could add schemes.\n// The only way to reliably remove schemes from the project is to nuke the file and regenerate the code (`expo prebuild --clean`).\n// Regardless, having extra schemes isn't a fatal issue and therefore a tolerable compromise is to just add new schemes that aren't currently present.\nexport function setScheme(\n config: Pick<ExpoConfig, 'scheme' | 'android'>,\n androidManifest: AndroidManifest\n) {\n const schemes = [\n ...getScheme(config),\n // @ts-ignore: TODO: android.scheme is an unreleased -- harder to add to turtle v1.\n ...getScheme(config.android ?? {}),\n ];\n // Add the package name to the list of schemes for easier Google auth and parity with Turtle v1.\n if (config.android?.package) {\n schemes.push(config.android.package);\n }\n if (schemes.length === 0) {\n return androidManifest;\n }\n\n if (!ensureManifestHasValidIntentFilter(androidManifest)) {\n addWarningAndroid(\n 'scheme',\n `Cannot add schemes because the provided manifest does not have a valid Activity with \\`android:launchMode=\"singleTask\"\\``,\n 'https://expo.fyi/setup-android-uri-scheme'\n );\n return androidManifest;\n }\n\n // Get the current schemes and remove them from the list of schemes to add.\n const currentSchemes = getSchemesFromManifest(androidManifest);\n for (const uri of currentSchemes) {\n const index = schemes.indexOf(uri);\n if (index > -1) schemes.splice(index, 1);\n }\n\n // Now add all of the remaining schemes.\n for (const uri of schemes) {\n androidManifest = appendScheme(uri, androidManifest);\n }\n\n return androidManifest;\n}\n\nfunction isValidRedirectIntentFilter({ actions, categories }: IntentFilterProps): boolean {\n return (\n actions.includes('android.intent.action.VIEW') &&\n !categories.includes('android.intent.category.LAUNCHER')\n );\n}\n\nfunction propertiesFromIntentFilter(intentFilter: any): IntentFilterProps {\n const actions = intentFilter?.action?.map((data: any) => data?.$?.['android:name']) ?? [];\n const categories = intentFilter?.category?.map((data: any) => data?.$?.['android:name']) ?? [];\n const data =\n intentFilter?.data\n ?.filter((data: any) => data?.$?.['android:scheme'])\n ?.map((data: any) => ({\n scheme: data?.$?.['android:scheme'],\n host: data?.$?.['android:host'],\n })) ?? [];\n return {\n actions,\n categories,\n data,\n };\n}\n\nfunction getSingleTaskIntentFilters(androidManifest: AndroidManifest): any[] {\n if (!Array.isArray(androidManifest.manifest.application)) return [];\n\n let outputSchemes: any[] = [];\n for (const application of androidManifest.manifest.application) {\n const { activity } = application;\n // @ts-ignore\n const activities = Array.isArray(activity) ? activity : [activity];\n const singleTaskActivities = (activities as ManifestActivity[]).filter(\n (activity) => activity?.$?.['android:launchMode'] === 'singleTask'\n );\n for (const activity of singleTaskActivities) {\n const intentFilters = activity['intent-filter'];\n outputSchemes = outputSchemes.concat(intentFilters);\n }\n }\n return outputSchemes;\n}\n\nexport function getSchemesFromManifest(\n androidManifest: AndroidManifest,\n requestedHost: string | null = null\n): string[] {\n const outputSchemes: string[] = [];\n\n const singleTaskIntentFilters = getSingleTaskIntentFilters(androidManifest);\n for (const intentFilter of singleTaskIntentFilters) {\n const properties = propertiesFromIntentFilter(intentFilter);\n if (isValidRedirectIntentFilter(properties) && properties.data) {\n for (const { scheme, host } of properties.data) {\n if (requestedHost === null || !host || host === requestedHost) {\n outputSchemes.push(scheme);\n }\n }\n }\n }\n\n return outputSchemes;\n}\n\nexport function ensureManifestHasValidIntentFilter(androidManifest: AndroidManifest): boolean {\n if (!Array.isArray(androidManifest.manifest.application)) {\n return false;\n }\n\n for (const application of androidManifest.manifest.application) {\n for (const activity of application.activity || []) {\n if (activity?.$?.['android:launchMode'] === 'singleTask') {\n for (const intentFilter of activity['intent-filter'] || []) {\n // Parse valid intent filters...\n const properties = propertiesFromIntentFilter(intentFilter);\n if (isValidRedirectIntentFilter(properties)) {\n return true;\n }\n }\n if (!activity['intent-filter']) {\n activity['intent-filter'] = [];\n }\n\n activity['intent-filter'].push({\n action: [{ $: { 'android:name': 'android.intent.action.VIEW' } }],\n category: [\n { $: { 'android:name': 'android.intent.category.DEFAULT' } },\n { $: { 'android:name': 'android.intent.category.BROWSABLE' } },\n ],\n });\n return true;\n }\n }\n }\n return false;\n}\n\nexport function hasScheme(scheme: string, androidManifest: AndroidManifest): boolean {\n const schemes = getSchemesFromManifest(androidManifest);\n return schemes.includes(scheme);\n}\n\nexport function appendScheme(scheme: string, androidManifest: AndroidManifest): AndroidManifest {\n if (!Array.isArray(androidManifest.manifest.application)) {\n return androidManifest;\n }\n\n for (const application of androidManifest.manifest.application) {\n for (const activity of application.activity || []) {\n if (activity?.$?.['android:launchMode'] === 'singleTask') {\n for (const intentFilter of activity['intent-filter'] || []) {\n const properties = propertiesFromIntentFilter(intentFilter);\n if (isValidRedirectIntentFilter(properties)) {\n if (!intentFilter.data) intentFilter.data = [];\n intentFilter.data.push({\n $: { 'android:scheme': scheme },\n });\n }\n }\n break;\n }\n }\n }\n return androidManifest;\n}\n\nexport function removeScheme(scheme: string, androidManifest: AndroidManifest): AndroidManifest {\n if (!Array.isArray(androidManifest.manifest.application)) {\n return androidManifest;\n }\n\n for (const application of androidManifest.manifest.application) {\n for (const activity of application.activity || []) {\n if (activity?.$?.['android:launchMode'] === 'singleTask') {\n for (const intentFilter of activity['intent-filter'] || []) {\n // Parse valid intent filters...\n const properties = propertiesFromIntentFilter(intentFilter);\n if (isValidRedirectIntentFilter(properties)) {\n for (const dataKey in intentFilter?.data || []) {\n const data = intentFilter.data?.[dataKey];\n if (data?.$?.['android:scheme'] === scheme) {\n delete intentFilter.data?.[dataKey];\n }\n }\n }\n }\n break;\n }\n }\n }\n\n return androidManifest;\n}\n"],"mappings":"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"}
|