-
Notifications
You must be signed in to change notification settings - Fork 1
/
prepare_hook.js
115 lines (94 loc) · 3.95 KB
/
prepare_hook.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/**
* Copyright 2018 Ayogo Health Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
"use strict";
const configPatches = {
android: function(context, scope) {
const et = require('elementtree');
let intentFilter = et.Element('intent-filter');
intentFilter.set('android:label', '@string/launcher_name');
intentFilter.set('android:autoVerify', 'true');
et.SubElement(intentFilter, 'action').set('android:name', 'android.intent.action.VIEW');
et.SubElement(intentFilter, 'category').set('android:name', 'android.intent.category.DEFAULT');
et.SubElement(intentFilter, 'category').set('android:name', 'android.intent.category.BROWSABLE');
let data = et.SubElement(intentFilter, 'data');
data.set('android:scheme', scope.protocol.replace(/:/, ''));
data.set('android:host', scope.host);
if (scope.pathname) {
data.set('android:pathPrefix', scope.pathname);
}
return [{
target: 'app/src/main/AndroidManifest.xml',
parent: '/manifest/application/activity',
xmls: [intentFilter]
}];
},
ios: function(context, scope) {
const et = require('elementtree');
let array = et.Element('array');
let applink = et.SubElement(array, 'string');
applink.text = 'applinks:' + scope.host;
let continuation = et.SubElement(array, 'string');
continuation.text = 'activitycontinuation:' + scope.host;
let credentials = et.SubElement(array, 'string');
credentials.text = 'webcredentials:' + scope.host;
return [{
target: '*/Entitlements-Debug.plist',
parent: 'com.apple.developer.associated-domains',
xmls: [array]
}, {
target: '*/Entitlements-Release.plist',
parent: 'com.apple.developer.associated-domains',
xmls: [array]
}];
}
};
class PatchConfig {
constructor(context, scope) {
this.context = context;
this.scope = scope;
this.id = this.name = 'cordova-plugin-app-scope';
}
getConfigFiles(platform) {
if (configPatches[platform]) {
return configPatches[platform](this.context, this.scope);
} else {
return [];
}
}
}
module.exports = function(context) {
// Module imports
const path = require('path');
const url = require('url');
const common = context.requireCordovaModule('cordova-common');
const utils = context.requireCordovaModule('cordova-lib/src/cordova/util');
// Global-ish variables
const projectRoot = context.opts.projectRoot;
const configFile = new common.ConfigParser(utils.projectConfig(projectRoot));
context.opts.platforms.forEach(platform => {
const scope = configFile.getPreference('scope', platform);
if (!scope) {
common.events.emit('warn', 'No scope preference defined. Skipping URL association setup for ' + platform);
return;
}
const scopeUrl = url.URL ? new url.URL(scope) : url.parse(scope);
const platformRoot = path.join(projectRoot, 'platforms', platform);
const platformJson = common.PlatformJson.load(platformRoot, platform);
const patchConfig = new PatchConfig(context, scopeUrl);
const munger = new common.ConfigChanges.PlatformMunger(platform, platformRoot, platformJson);
munger.add_plugin_changes(patchConfig, {}, true, true).save_all();
});
}