1 | (function () {
|
2 | 'use strict';
|
3 |
|
4 | var request = require('request');
|
5 | var fs = require('fs');
|
6 | var execSync = require('child_process').execSync;
|
7 | var path = require('path');
|
8 | var archiver = require('archiver');
|
9 | var _ = require('underscore');
|
10 |
|
11 | var BASE_URL = 'https://build.phonegap.com/api/v1/';
|
12 |
|
13 | var writeIntegrationFile = function (options, callback) {
|
14 | var getIntegrationScript;
|
15 | var scriptTemplatePath = path.join(__dirname, '/templates/integration-template.txt');
|
16 | var packageScriptPath = path.join(options.projectPath, '/www/js/integration.js');
|
17 | var viewerEndpoint = options.serviceAddress + '/viewer';
|
18 | var widgetURL = options.serviceAddress + '/viewer/content/widgets/' + options.urn +
|
19 | '/index.html?parent=file%3A%2F%2F&token=' + encodeURIComponent(options.token);
|
20 | var widgetName = options.urn.split(':').pop();
|
21 |
|
22 | _.templateSettings = {
|
23 | interpolate: /\{\{(.+?)\}\}/g
|
24 | };
|
25 | fs.readFile(scriptTemplatePath, 'utf8', function (error, template) {
|
26 | if (error) {
|
27 | callback(error);
|
28 | return;
|
29 | }
|
30 |
|
31 | getIntegrationScript = _.template(template);
|
32 | fs.writeFile(packageScriptPath, getIntegrationScript({
|
33 | widgetURL: widgetURL,
|
34 | widgetUrn: options.urn,
|
35 | widgetName: widgetName,
|
36 | viewerEndpoint: viewerEndpoint
|
37 | }), callback);
|
38 | });
|
39 | };
|
40 |
|
41 | exports.SUPPORTED_PLATFORMS = [
|
42 | 'android',
|
43 | 'ios'
|
44 | ];
|
45 |
|
46 | exports.getKeys = function (accessToken, callback) {
|
47 | var url = BASE_URL + 'keys?access_token=' + accessToken;
|
48 |
|
49 | request.get(url, function (error, response) {
|
50 | if (error) {
|
51 | callback(error);
|
52 | return;
|
53 | }
|
54 |
|
55 | if (response.statusCode === 200) {
|
56 | callback(null, JSON.parse(response.body).keys);
|
57 | } else {
|
58 | callback(new Error('Unexpected response from build.phonegap.com.'));
|
59 | }
|
60 | });
|
61 | };
|
62 |
|
63 | exports.registerPhonegapApp = function (accessToken, packagePath, keys, callback) {
|
64 | var form, req;
|
65 |
|
66 | req = request.post(BASE_URL + 'apps?access_token=' + accessToken, function (error, response) {
|
67 | var body;
|
68 |
|
69 | if (error) {
|
70 | callback(error);
|
71 | return;
|
72 | }
|
73 |
|
74 | body = JSON.parse(response.body);
|
75 | if (response.statusCode === 201) {
|
76 | callback(null, {
|
77 | id: body.id,
|
78 | title: body.title
|
79 | });
|
80 | } else {
|
81 | callback(body.error);
|
82 | }
|
83 | });
|
84 | form = req.form();
|
85 | form.append('data', JSON.stringify({
|
86 | title: 'temp',
|
87 | create_method: 'file',
|
88 | keys: keys
|
89 | }));
|
90 | form.append('file', fs.createReadStream(packagePath));
|
91 | };
|
92 |
|
93 | exports.createPhonegapPackage = function (projectPath, name) {
|
94 | execSync('npm run phonegap create "' + path.resolve(projectPath) + '" -- --name="' + name +
|
95 | '" --template="' + path.join(__dirname, 'templates/phonegap-template') + '"', {
|
96 | stdio: 'inherit',
|
97 | cwd: __dirname
|
98 | });
|
99 | };
|
100 |
|
101 | exports.generatePhonegapZipPackage = function (sourcePath, zipPath, callback) {
|
102 | var zipPackage = archiver.create('zip');
|
103 | var zipStream = fs.createWriteStream(zipPath);
|
104 |
|
105 | zipStream.on('close', function () {
|
106 | callback();
|
107 | });
|
108 | zipPackage.on('error', function (error) {
|
109 | callback(error);
|
110 | });
|
111 | zipPackage.pipe(zipStream);
|
112 | zipPackage.append(fs.createReadStream(path.join(sourcePath, 'config.xml')), {
|
113 | name: 'config.xml'
|
114 | });
|
115 | zipPackage.directory(path.join(sourcePath, 'www'), 'www');
|
116 | zipPackage.finalize();
|
117 | };
|
118 |
|
119 |
|
120 | exports.buildPhonegapApp = function (appId, platform, accessToken, callback) {
|
121 | var url = BASE_URL + 'apps/' + appId + '/build';
|
122 |
|
123 | if (platform !== 'all') {
|
124 | url += '/' + platform;
|
125 | }
|
126 | url += '?access_token=' + accessToken;
|
127 |
|
128 | request.post(url, function (error, response) {
|
129 | if (error) {
|
130 | callback(error);
|
131 | return;
|
132 | }
|
133 |
|
134 | if (response.statusCode === 202) {
|
135 | callback();
|
136 | } else {
|
137 | callback(new Error('Unable to start build. Unexpected response from build.phonegap.com.'));
|
138 | }
|
139 | });
|
140 | };
|
141 |
|
142 | exports.updatePhonegapApp = function (appId, accessToken, packagePath, callback) {
|
143 | request.put(BASE_URL + 'apps/' + appId + '?access_token=' + accessToken,
|
144 | function (error, response) {
|
145 | var body, responseError;
|
146 |
|
147 | if (error) {
|
148 | callback(error);
|
149 | return;
|
150 | }
|
151 |
|
152 | body = JSON.parse(response.body);
|
153 | switch (response.statusCode) {
|
154 | case 200:
|
155 | break;
|
156 | case 401:
|
157 | responseError = new Error('Invalid PhoneGap Id');
|
158 | break;
|
159 | case 404:
|
160 | responseError = new Error(body.error);
|
161 | break;
|
162 | default:
|
163 | responseError = new Error('Unexpected response from build.phonegap.com');
|
164 | break;
|
165 | }
|
166 | callback(responseError);
|
167 | })
|
168 | .form()
|
169 | .append('file', fs.createReadStream(packagePath));
|
170 | };
|
171 |
|
172 | exports.getDownloadLink = function (appId, platform, accessToken, callback) {
|
173 | request.get({
|
174 | url: BASE_URL + 'apps/' + appId + '/' + platform + '?access_token=' + accessToken,
|
175 | followRedirect: false
|
176 | }, function (error, response) {
|
177 | var body;
|
178 |
|
179 | if (error) {
|
180 | callback(error);
|
181 | return;
|
182 | }
|
183 |
|
184 | body = JSON.parse(response.body);
|
185 | if (response.statusCode === 302) {
|
186 | callback(null, JSON.parse(response.body).location);
|
187 | } else {
|
188 | callback(new Error(body.error));
|
189 | }
|
190 | });
|
191 | };
|
192 |
|
193 |
|
194 |
|
195 |
|
196 |
|
197 |
|
198 |
|
199 |
|
200 |
|
201 |
|
202 | exports.setIntegration = function (options, callback) {
|
203 | request.post(
|
204 | options.serviceAddress + '/rest-services/tokens/access',
|
205 | {
|
206 | body: {
|
207 | scope: {
|
208 | widgets: [
|
209 | options.urn
|
210 | ]
|
211 | },
|
212 | domains: [
|
213 | 'file://',
|
214 | 'http://localhost:' + options.port
|
215 | ]
|
216 | },
|
217 | json: true,
|
218 | headers: {
|
219 | 'Content-Type': 'application/json',
|
220 | 'Authorization': 'Bearer ' + options.identityToken
|
221 | }
|
222 | },
|
223 | function (error, response) {
|
224 | if (error) {
|
225 | callback(error);
|
226 | return;
|
227 | }
|
228 |
|
229 | options.token = response.body.accessToken;
|
230 | writeIntegrationFile(options, callback);
|
231 | }
|
232 | );
|
233 | };
|
234 | })();
|