UNPKG

7.73 kBJavaScriptView Raw
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', // required field, PhoneGap Build replace it with title from config.xml
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 // platform parametr can be one from SUPPORTED_PLATFORMS or 'all'
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 // options argument required fields
194 // options = {
195 // urn,
196 // port,
197 // identityToken,
198 // serviceAddress,
199 // projectPath
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})();