1
+ 'use strict' ;
2
+
3
+ var url = require ( 'url' ) ,
4
+ path = require ( 'path' ) ;
5
+
6
+ var Q = require ( 'q' ) ;
7
+
8
+ var lib = require ( 'manifoldjs-lib' ) ;
9
+
10
+ var log = lib . log ,
11
+ manifestTools = lib . manifestTools ,
12
+ projectBuilder = lib . projectBuilder ,
13
+ utils = lib . utils ;
14
+
15
+ var build = require ( './package' ) ;
16
+
17
+ function getW3cManifest ( siteUrl , manifestLocation , callback ) {
18
+ function resolveStartURL ( err , manifestInfo ) {
19
+ if ( err ) {
20
+ return callback ( err , manifestInfo ) ;
21
+ }
22
+
23
+ return manifestTools . validateAndNormalizeStartUrl ( siteUrl , manifestInfo , callback ) ;
24
+ }
25
+
26
+ if ( siteUrl ) {
27
+ var parsedSiteUrl = url . parse ( siteUrl ) ;
28
+ if ( ! parsedSiteUrl . hostname ) {
29
+ return callback ( new Error ( 'The site URL is not a valid URL.' ) ) ;
30
+ }
31
+ }
32
+
33
+ if ( manifestLocation ) {
34
+ var parsedManifestUrl = url . parse ( manifestLocation ) ;
35
+ if ( parsedManifestUrl && parsedManifestUrl . host ) {
36
+ // download manifest from remote location
37
+ log . info ( 'Downloading manifest from ' + manifestLocation + '...' ) ;
38
+ manifestTools . downloadManifestFromUrl ( manifestLocation , resolveStartURL ) ;
39
+ } else {
40
+ // read local manifest file
41
+ log . info ( 'Reading manifest file ' + manifestLocation + '...' ) ;
42
+ manifestTools . getManifestFromFile ( manifestLocation , resolveStartURL ) ;
43
+ }
44
+ } else if ( siteUrl ) {
45
+ // scan a site to retrieve its manifest
46
+ log . info ( 'Scanning ' + siteUrl + ' for manifest...' ) ;
47
+ manifestTools . getManifestFromSite ( siteUrl , resolveStartURL ) ;
48
+ } else {
49
+ return callback ( new Error ( 'A site URL or manifest should be specified.' ) ) ;
50
+ }
51
+ }
52
+
53
+ function generateApp ( program ) {
54
+
55
+ var siteUrl = program . args [ 0 ] ;
56
+ var rootDir = program . directory ? path . resolve ( program . directory ) : process . cwd ( ) ;
57
+ var platforms = program . platforms . split ( / [ \s , ] + / ) ;
58
+
59
+ var deferred = Q . defer ( ) ;
60
+ getW3cManifest ( siteUrl , program . manifest , function ( err , manifestInfo ) {
61
+ if ( err ) {
62
+ return deferred . reject ( err ) ;
63
+ }
64
+
65
+ // Fix #145: don't require a short name
66
+ manifestInfo . content . short_name = manifestInfo . content . short_name ||
67
+ manifestInfo . content . name ||
68
+ manifestInfo . default . short_name ;
69
+
70
+ // if specified as a parameter, override the app's short name
71
+ if ( program . shortname ) {
72
+ manifestInfo . content . short_name = program . shortname ;
73
+ }
74
+
75
+ log . debug ( 'Manifest contents:\n' + JSON . stringify ( manifestInfo . content , null , 4 ) ) ;
76
+
77
+ // add generatedFrom value to manifestInfo for telemetry
78
+ manifestInfo . generatedFrom = 'CLI' ;
79
+
80
+ // Create the apps for the specified platforms
81
+ return projectBuilder . createApps ( manifestInfo , rootDir , platforms , program ) . then ( function ( projectDir ) {
82
+ if ( program . build ) {
83
+ program . args [ 1 ] = projectDir ;
84
+ return build ( program ) . catch ( function ( err ) {
85
+ log . warn ( 'One or more platforms could not be built successfully. Correct any errors and then run manifoldjs package [project-directory] [options] to build the applications.' ) ;
86
+ // return deferred.reject(err);
87
+ } ) ;
88
+ }
89
+ } )
90
+ . then ( function ( ) {
91
+ log . info ( 'The application(s) are ready.' ) ;
92
+ return deferred . resolve ( ) ;
93
+ } )
94
+ . catch ( function ( err ) {
95
+ return deferred . reject ( err ) ;
96
+ } ) ;
97
+ } ) ;
98
+
99
+ return deferred . promise ;
100
+ } ;
101
+
102
+ module . exports = generateApp ;
0 commit comments