@@ -18,9 +18,13 @@ const updateNotifier = require('update-notifier');
18
18
const logger = require ( './lib/log' ) ;
19
19
const PatternGraph = require ( './lib/pattern_graph' ) . PatternGraph ;
20
20
const CompileState = require ( './lib/object_factory' ) . CompileState ;
21
- const pa = require ( './lib/pattern_assembler' ) ;
22
21
const pe = require ( './lib/pattern_exporter' ) ;
23
22
const lh = require ( './lib/lineage_hunter' ) ;
23
+ const markModifiedPatterns = require ( './lib/markModifiedPatterns' ) ;
24
+ const parseAllLinks = require ( './lib/parseAllLinks' ) ;
25
+ const processMetaPattern = require ( './lib/processMetaPattern' ) ;
26
+ const render = require ( './lib/render' ) ;
27
+ const Pattern = require ( './lib/object_factory' ) . Pattern ;
24
28
25
29
const defaultConfig = require ( '../patternlab-config.json' ) ;
26
30
@@ -30,7 +34,6 @@ let assetCopier = require('./lib/asset_copy'); // eslint-disable-line
30
34
let pattern_exporter = new pe ( ) ; // eslint-disable-line
31
35
let serve = require ( './lib/serve' ) ; // eslint-disable-line
32
36
33
- const pattern_assembler = new pa ( ) ;
34
37
const lineage_hunter = new lh ( ) ;
35
38
36
39
//bootstrap update notifier
@@ -39,7 +42,6 @@ updateNotifier({
39
42
updateCheckInterval : 1000 * 60 * 60 * 24 // notify at most once a day
40
43
} ) . notify ( ) ;
41
44
42
-
43
45
/**
44
46
* Returns the standardized default config
45
47
*
@@ -136,7 +138,7 @@ const patternlab_module = function (config) {
136
138
137
139
function cleanBuildDirectory ( incrementalBuildsEnabled ) {
138
140
if ( incrementalBuildsEnabled ) {
139
- logger . log . info ( "Incremental builds enabled." ) ;
141
+ logger . info ( "Incremental builds enabled." ) ;
140
142
} else {
141
143
// needs to be done BEFORE processing patterns
142
144
fs . removeSync ( paths . public . patterns ) ;
@@ -153,7 +155,7 @@ const patternlab_module = function (config) {
153
155
const graph = patternlab . graph = loadPatternGraph ( deletePatternDir ) ;
154
156
const graphNeedsUpgrade = ! PatternGraph . checkVersion ( graph ) ;
155
157
if ( graphNeedsUpgrade ) {
156
- logger . log . info ( "Due to an upgrade, a complete rebuild is required and the public/patterns directory was deleted. " +
158
+ logger . info ( "Due to an upgrade, a complete rebuild is required and the public/patterns directory was deleted. " +
157
159
"Incremental build is available again on the next successful run." ) ;
158
160
159
161
// Ensure that the freshly built graph has the latest version again.
@@ -177,79 +179,97 @@ const patternlab_module = function (config) {
177
179
178
180
//now that all the main patterns are known, look for any links that might be within data and expand them
179
181
//we need to do this before expanding patterns & partials into extendedTemplates, otherwise we could lose the data -> partial reference
180
- pattern_assembler . parse_data_links ( patternlab ) ;
182
+ parseAllLinks ( patternlab ) ;
181
183
182
184
//diveSync again to recursively include partials, filling out the
183
185
//extendedTemplate property of the patternlab.patterns elements
184
186
// TODO we can reduce the time needed by only processing changed patterns and their partials
185
187
patternlab . processAllPatternsRecursive ( paths . source . patterns , patternlab ) ;
186
188
187
189
//take the user defined head and foot and process any data and patterns that apply
188
- // GTP: should these really be invoked from outside?
189
- patternlab . processHeadPattern ( ) ;
190
- patternlab . processFootPattern ( ) ;
191
-
192
- //cascade any patternStates
193
- lineage_hunter . cascade_pattern_states ( patternlab ) ;
194
-
195
- //set pattern-specific header if necessary
196
- let head ;
197
- if ( patternlab . userHead ) {
198
- head = patternlab . userHead ;
199
- } else {
200
- head = patternlab . header ;
201
- }
190
+ const headPatternPromise = processMetaPattern ( `_00-head.${ patternlab . config . patternExtension } ` , 'userHead' , patternlab ) ;
191
+ const footPatternPromise = processMetaPattern ( `_01-foot.${ patternlab . config . patternExtension } ` , 'userFoot' , patternlab ) ;
202
192
203
- //set the pattern-specific header by compiling the general-header with data, and then adding it to the meta header
204
- patternlab . data . patternLabHead = pattern_assembler . renderPattern ( patternlab . header , {
205
- cacheBuster : patternlab . cacheBuster
206
- } ) ;
193
+ return Promise . all ( [ headPatternPromise , footPatternPromise ] ) . then ( ( ) => {
207
194
208
- // If deletePatternDir == true or graph needs to be updated
209
- // rebuild all patterns
210
- let patternsToBuild = null ;
195
+ //cascade any patternStates
196
+ lineage_hunter . cascade_pattern_states ( patternlab ) ;
211
197
212
- // If deletePatternDir == true or graph needs to be updated
213
- // rebuild all patterns
214
- patternsToBuild = null ;
215
-
216
- if ( patternlab . incrementalBuildsEnabled ) {
217
- // When the graph was loaded from file, some patterns might have been moved/deleted between runs
218
- // so the graph data become out of sync
219
- patternlab . graph . sync ( ) . forEach ( n => {
220
- logger . log . info ( "[Deleted/Moved] " + n ) ;
221
- } ) ;
222
-
223
- // TODO Find created or deleted files
224
- const now = new Date ( ) . getTime ( ) ;
225
- pattern_assembler . mark_modified_patterns ( now , patternlab ) ;
226
- patternsToBuild = patternlab . graph . compileOrder ( ) ;
227
- } else {
228
- // build all patterns, mark all to be rebuilt
229
- patternsToBuild = patternlab . patterns ;
230
- for ( const p of patternsToBuild ) {
231
- p . compileState = CompileState . NEEDS_REBUILD ;
198
+ //set pattern-specific header if necessary
199
+ let head ;
200
+ if ( patternlab . userHead ) {
201
+ head = patternlab . userHead ;
202
+ } else {
203
+ head = patternlab . header ;
232
204
}
233
- }
234
205
235
- //render all patterns last, so lineageR works
236
- return patternsToBuild
237
- . reduce ( ( previousPromise , pattern ) => {
238
- return previousPromise . then ( ( ) => patternlab . renderSinglePattern ( pattern , head ) ) ;
239
- } , Promise . resolve ( ) )
240
- . then ( ( ) => {
241
- // Saves the pattern graph when all files have been compiled
242
- PatternGraph . storeToFile ( patternlab ) ;
243
- if ( patternlab . config . exportToGraphViz ) {
244
- PatternGraph . exportToDot ( patternlab , "dependencyGraph.dot" ) ;
245
- logger . log . info ( `Exported pattern graph to ${ path . join ( config . paths . public . root , "dependencyGraph.dot" ) } ` ) ;
206
+ //set the pattern-specific header by compiling the general-header with data, and then adding it to the meta header
207
+ return render ( Pattern . createEmpty ( { extendedTemplate : patternlab . header } ) , {
208
+ cacheBuster : patternlab . cacheBuster
209
+ } ) . then ( ( results ) => {
210
+ patternlab . data . patternLabHead = results ;
211
+
212
+ // If deletePatternDir == true or graph needs to be updated
213
+ // rebuild all patterns
214
+ let patternsToBuild = null ;
215
+
216
+ // If deletePatternDir == true or graph needs to be updated
217
+ // rebuild all patterns
218
+ patternsToBuild = null ;
219
+
220
+ if ( patternlab . incrementalBuildsEnabled ) {
221
+ // When the graph was loaded from file, some patterns might have been moved/deleted between runs
222
+ // so the graph data become out of sync
223
+ patternlab . graph . sync ( ) . forEach ( n => {
224
+ logger . info ( "[Deleted/Moved] " + n ) ;
225
+ } ) ;
226
+
227
+ // TODO Find created or deleted files
228
+ const now = new Date ( ) . getTime ( ) ;
229
+ markModifiedPatterns ( now , patternlab ) ;
230
+ patternsToBuild = patternlab . graph . compileOrder ( ) ;
231
+ } else {
232
+ // build all patterns, mark all to be rebuilt
233
+ patternsToBuild = patternlab . patterns ;
234
+ for ( const p of patternsToBuild ) {
235
+ p . compileState = CompileState . NEEDS_REBUILD ;
236
+ }
246
237
}
247
238
248
- //export patterns if necessary
249
- pattern_exporter . export_patterns ( patternlab ) ;
239
+ //render all patterns last, so lineageR works
240
+ return patternsToBuild
241
+ . reduce ( ( previousPromise , pattern ) => {
242
+ return previousPromise . then ( ( ) => patternlab . renderSinglePattern ( pattern , head ) ) ;
243
+ } , Promise . resolve ( ) )
244
+ . then ( ( ) => {
245
+ // Saves the pattern graph when all files have been compiled
246
+ PatternGraph . storeToFile ( patternlab ) ;
247
+ if ( patternlab . config . exportToGraphViz ) {
248
+ PatternGraph . exportToDot ( patternlab , "dependencyGraph.dot" ) ;
249
+ logger . info ( `Exported pattern graph to ${ path . join ( config . paths . public . root , "dependencyGraph.dot" ) } ` ) ;
250
+ }
251
+
252
+ //export patterns if necessary
253
+ pattern_exporter . export_patterns ( patternlab ) ;
254
+
255
+ } ) . catch ( reason => {
256
+ console . log ( reason ) ;
257
+ logger . error ( 'Error rendering patterns' ) ;
258
+ } ) ;
259
+
260
+ } ) . catch ( reason => {
261
+ console . log ( reason ) ;
262
+ logger . error ( 'Error rendering pattern lab header' ) ;
250
263
} ) ;
251
- } ) . catch ( ( err ) => {
252
- logger . info ( 'Error in buildPatterns():' , err ) ;
264
+
265
+ } ) . catch ( reason => {
266
+ console . log ( reason ) ;
267
+ logger . error ( 'Error processing meta patterns' ) ;
268
+ } ) ;
269
+
270
+ } ) . catch ( reason => {
271
+ console . log ( reason ) ;
272
+ logger . error ( 'Error in buildPatterns()' ) ;
253
273
} ) ;
254
274
}
255
275
@@ -286,26 +306,28 @@ const patternlab_module = function (config) {
286
306
patternlab . isBusy = true ;
287
307
return buildPatterns ( options . cleanPublic ) . then ( ( ) => {
288
308
289
- new ui_builder ( ) . buildFrontend ( patternlab ) ;
290
- assetCopier ( ) . copyAssets ( patternlab . config . paths , patternlab , options ) ;
309
+ return new ui_builder ( ) . buildFrontend ( patternlab ) . then ( ( ) => {
291
310
292
- this . events . on ( 'patternlab-pattern-change' , ( ) => {
293
- if ( ! patternlab . isBusy ) {
294
- options . cleanPublic = false ;
295
- return this . build ( options ) ;
296
- }
297
- return Promise . resolve ( ) ;
298
- } ) ;
311
+ assetCopier ( ) . copyAssets ( patternlab . config . paths , patternlab , options ) ;
299
312
300
- this . events . on ( 'patternlab-global -change' , ( ) => {
301
- if ( ! patternlab . isBusy ) {
302
- options . cleanPublic = true ; //rebuild everything
303
- return this . build ( options ) ;
304
- }
305
- return Promise . resolve ( ) ;
306
- } ) ;
313
+ this . events . on ( 'patternlab-pattern -change' , ( ) => {
314
+ if ( ! patternlab . isBusy ) {
315
+ options . cleanPublic = false ;
316
+ return this . build ( options ) ;
317
+ }
318
+ return Promise . resolve ( ) ;
319
+ } ) ;
307
320
308
- patternlab . isBusy = false ;
321
+ this . events . on ( 'patternlab-global-change' , ( ) => {
322
+ if ( ! patternlab . isBusy ) {
323
+ options . cleanPublic = true ; //rebuild everything
324
+ return this . build ( options ) ;
325
+ }
326
+ return Promise . resolve ( ) ;
327
+ } ) ;
328
+
329
+ patternlab . isBusy = false ;
330
+ } ) ;
309
331
} ) ;
310
332
} ,
311
333
@@ -384,6 +406,7 @@ const patternlab_module = function (config) {
384
406
options . watch = true ;
385
407
return this . build ( options ) . then ( function ( ) {
386
408
serve ( patternlab ) ;
409
+ return Promise . resolve ( ) ;
387
410
} ) ;
388
411
} ,
389
412
0 commit comments