1
1
const { parse, relative, join, basename, extname } = require ( "path" ) ;
2
+ const { promisify } = require ( 'util' ) ;
2
3
const { convertSlashesInPath } = require ( "./projectHelpers" ) ;
3
4
4
5
module . exports = function ( source ) {
5
6
this . value = source ;
6
7
const { ignore } = this . query ;
8
+ const callback = this . async ( ) ;
7
9
8
10
const { XmlParser } = require ( "tns-core-modules/xml" ) ;
9
11
10
- let namespaces = [ ] ;
12
+ const resolvePromise = promisify ( this . resolve ) ;
13
+ const promises = [ ] ;
14
+
15
+ const namespaces = [ ] ;
11
16
const parser = new XmlParser ( ( event ) => {
12
17
const { namespace, elementName } = event ;
13
18
const moduleName = `${ namespace } /${ elementName } ` ;
@@ -20,83 +25,91 @@ module.exports = function (source) {
20
25
) {
21
26
const localNamespacePath = join ( this . rootContext , namespace ) ;
22
27
const localModulePath = join ( localNamespacePath , elementName ) ;
23
- const resolvedPath = tryResolve ( localNamespacePath ) ||
24
- tryResolve ( localModulePath ) ;
25
-
26
- if ( ! resolvedPath ) {
27
- const xml = tryResolve ( `${ localModulePath } .xml` ) ;
28
- if ( ! xml ) {
29
- namespaces . push ( { name : namespace , path : namespace } ) ;
30
- namespaces . push ( { name : moduleName , path : namespace } ) ;
31
-
32
- return ;
33
- } else {
34
- namespaces . push ( { name : `${ moduleName } .xml` , path : xml } ) ;
35
- namespaces . push ( { name : moduleName , path : xml } ) ;
36
- this . addDependency ( xml ) ;
37
- }
38
-
39
- const css = tryResolve ( `${ localModulePath } .css` ) ;
40
- if ( css ) {
41
- namespaces . push ( { name : `${ moduleName } .css` , path : css } ) ;
42
- this . addDependency ( css ) ;
43
- }
44
-
45
- return ;
46
- }
47
-
48
- this . addDependency ( resolvedPath ) ;
49
-
50
- namespaces . push ( { name : namespace , path : resolvedPath } ) ;
51
- namespaces . push ( { name : moduleName , path : resolvedPath } ) ;
52
-
53
- const { dir, name } = parse ( resolvedPath ) ;
54
- const noExtFilename = join ( dir , name ) ;
55
-
56
- const xml = tryResolve ( `${ noExtFilename } .xml` ) ;
57
- if ( xml ) {
58
- this . addDependency ( xml ) ;
59
- namespaces . push ( { name : `${ moduleName } .xml` , path : xml } ) ;
60
- }
61
-
62
- const css = tryResolve ( `${ noExtFilename } .css` ) ;
63
- if ( css ) {
64
- this . addDependency ( css ) ;
65
- namespaces . push ( { name : `${ moduleName } .css` , path : css } ) ;
66
- }
28
+
29
+ const pathResolved = ( resolvedPath ) => {
30
+ this . addDependency ( resolvedPath ) ;
31
+
32
+ namespaces . push ( { name : namespace , path : resolvedPath } ) ;
33
+ namespaces . push ( { name : moduleName , path : resolvedPath } ) ;
34
+
35
+ const { dir, name } = parse ( resolvedPath ) ;
36
+ const noExtFilename = join ( dir , name ) ;
37
+
38
+ return Promise . all ( [
39
+ resolvePromise ( this . context , `${ noExtFilename } .xml` )
40
+ . then ( ( xml ) => {
41
+ this . addDependency ( xml ) ;
42
+ namespaces . push ( { name : `${ moduleName } .xml` , path : xml } ) ;
43
+ } )
44
+ . catch ( ( err ) => { } ) ,
45
+
46
+ resolvePromise ( this . context , `${ noExtFilename } .css` )
47
+ . then ( ( xml ) => {
48
+ this . addDependency ( xml ) ;
49
+ namespaces . push ( { name : `${ moduleName } .css` , path : css } ) ;
50
+ } )
51
+ . catch ( ( err ) => { } )
52
+ ] ) ;
53
+ } ;
54
+
55
+ promises . push ( resolvePromise ( this . context , localNamespacePath )
56
+ . then ( path => pathResolved ( path ) )
57
+ . catch ( ( ) => {
58
+ return promise = resolvePromise ( this . context , localModulePath )
59
+ . then ( path => pathResolved ( path ) )
60
+ . catch ( ( ) => {
61
+ return Promise . all ( [
62
+ resolvePromise ( this . context , `${ localModulePath } .xml` )
63
+ . then ( ( xml ) => {
64
+ namespaces . push ( { name : `${ moduleName } .xml` , path : xml } ) ;
65
+ namespaces . push ( { name : moduleName , path : xml } ) ;
66
+ this . addDependency ( xml ) ;
67
+ } )
68
+ . catch ( ( ) => {
69
+ namespaces . push ( { name : namespace , path : namespace } ) ;
70
+ namespaces . push ( { name : moduleName , path : namespace } ) ;
71
+ } ) ,
72
+
73
+ resolvePromise ( this . context , `${ localModulePath } .css` )
74
+ . then ( ( css ) => {
75
+ namespaces . push ( { name : `${ moduleName } .css` , path : css } ) ;
76
+ this . addDependency ( css ) ;
77
+ } )
78
+ . catch ( ( ) => { } )
79
+ ] ) ;
80
+
81
+ } ) ;
82
+ } )
83
+ ) ;
67
84
}
68
85
} , undefined , true ) ;
69
86
70
87
parser . parse ( source ) ;
71
88
72
- const moduleRegisters = namespaces
73
- . map ( convertPath )
74
- . map ( n =>
75
- `global.registerModule("${ n . name } ", function() { return require("${ n . path } "); });`
76
- )
77
- . join ( "" ) ;
89
+ Promise . all ( promises ) . then ( ( ) => {
90
+ const moduleRegisters = namespaces
91
+ . map ( convertPath )
92
+ . map ( n =>
93
+ `global.registerModule("${ n . name } ", function() { return require("${ n . path } "); });`
94
+ )
95
+ . join ( "" ) ;
96
+
97
+ // escape special whitespace characters
98
+ // see: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Issue_with_plain_JSON.stringify_for_use_as_JavaScript
99
+ const json = JSON . stringify ( source )
100
+ . replace ( / \u2028 / g, '\\u2028' )
101
+ . replace ( / \u2029 / g, '\\u2029' ) ;
78
102
79
- // escape special whitespace characters
80
- // see: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Issue_with_plain_JSON.stringify_for_use_as_JavaScript
81
- const json = JSON . stringify ( source )
82
- . replace ( / \u2028 / g, '\\u2028' )
83
- . replace ( / \u2029 / g, '\\u2029' ) ;
103
+ const wrapped = `${ moduleRegisters } \nmodule.exports = ${ json } ` ;
84
104
85
- const wrapped = `${ moduleRegisters } \nmodule.exports = ${ json } ;` ;
105
+ callback ( null , wrapped ) ;
106
+ } ) . catch ( ( err ) => {
107
+ callback ( err ) ;
108
+ } )
86
109
87
- this . callback ( null , wrapped ) ;
88
110
}
89
111
90
112
function convertPath ( obj ) {
91
113
obj . path = convertSlashesInPath ( obj . path ) ;
92
114
return obj ;
93
115
}
94
-
95
- function tryResolve ( path ) {
96
- try {
97
- return require . resolve ( path ) ;
98
- } catch ( e ) {
99
- // The path couldn't be resolved
100
- return ;
101
- }
102
- }
0 commit comments