Skip to content

Commit 4e898c6

Browse files
committed
wip against #706
1 parent 81738f2 commit 4e898c6

File tree

4 files changed

+192
-15
lines changed

4 files changed

+192
-15
lines changed

core/lib/asset_copy.js

Lines changed: 105 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,111 @@
11
"use strict";
22
const plutils = require('./utilities');
3-
let fs = require('fs-extra'); // eslint-disable-line
3+
const _ = require('lodash');
4+
const path = require('path');
5+
const process = require('process');
46

5-
const asset_copy = () => {
6-
const copyDirectory = (sourceDirectoryPath, destDirectoryPath) => {
7-
return fs.copy(sourceDirectoryPath, destDirectoryPath);
7+
let copy = require('recursive-copy'); // eslint-disable-line
8+
let chokidar = require('chokidar'); // eslint-disable-line
9+
10+
const asset_copier = () => {
11+
12+
const transform_paths = (directories) => {
13+
//create array with all source keys minus our blacklist
14+
const dirs = {};
15+
const blackList = ['root', 'patterns', 'data', 'meta', 'annotations', 'styleguide', 'patternlabFiles'];
16+
_.each(directories.source, (dir, key) => {
17+
18+
if (blackList.includes(key)) {
19+
return;
20+
}
21+
22+
if (!dirs.key) {
23+
dirs[key] = {};
24+
}
25+
});
26+
27+
// loop through all source keys
28+
_.each(dirs, (dir, key) => {
29+
// add source key path
30+
dirs[key].source = directories.source[key];
31+
32+
// add public key path
33+
dirs[key].public = directories.public[key];
34+
});
35+
return dirs;
36+
};
37+
38+
const copyFile = (p, dest, options) => {
39+
copy(
40+
p,
41+
dest,
42+
options
43+
).on(copy.events.COPY_FILE_COMPLETE, (copyOperation) => {
44+
console.log(`Moved ${p} to ${dest}`);
45+
});
46+
};
47+
48+
const asset_copy = (assetDirectories, patternlab, options) => {
49+
//take our configured paths and sanitize best we can to only the assets
50+
const dirs = transform_paths(assetDirectories);
51+
52+
//find out where we are
53+
const basePath = path.resolve(process.cwd());
54+
55+
const copyOptions =
56+
{
57+
overwrite: true
58+
};
59+
60+
console.log(60, dirs)
61+
62+
//loop through each directory asset object (source / public pairing)
63+
_.each(dirs, (dir, key) => {
64+
65+
//if we want to watch files, do so, otherwise just copy each file
66+
if (options.watch) {
67+
console.log(49, `watching ${path.resolve(basePath, dir.source)}`);
68+
const watcher = chokidar.watch(
69+
path.resolve(basePath, dir.source),
70+
{
71+
ignored: /(^|[\/\\])\../,
72+
ignoreInitial: true,
73+
awaitWriteFinish : {
74+
stabilityThreshold: 1000,
75+
pollInterval: 100
76+
}
77+
}
78+
);
79+
80+
//watch for changes and copy
81+
watcher.on('addDir', (p) => {
82+
const destination = path.resolve(basePath, dir.public + '/' + path.basename(p));
83+
copyFile(p, destination, copyOptions);
84+
}).on('add', (p) => {
85+
const destination = path.resolve(basePath, dir.public + '/' + path.basename(p));
86+
copyFile(p, destination, copyOptions);
87+
}).on('change', (p) => {
88+
const destination = path.resolve(basePath, dir.public + '/' + path.basename(p));
89+
copyFile(p, destination, copyOptions);
90+
});
91+
92+
} else {
93+
//just copy
94+
const destination = path.resolve(basePath, dir.public);
95+
copyFile(dir.source, destination, copyOptions);
96+
}
97+
});
898
};
99+
100+
return {
101+
copyAssets: (assetDirectories, patternlab, options) => {
102+
asset_copy(assetDirectories, patternlab, options);
103+
},
104+
transformConfigPaths: (paths) => {
105+
return transform_paths(paths);
106+
}
107+
};
108+
9109
};
10110

11-
module.exports = asset_copy;
111+
module.exports = asset_copier;

core/lib/patternlab.js

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ const CompileState = require('./object_factory').CompileState;
3434
let fs = require('fs-extra'); // eslint-disable-line
3535
let ui_builder = require('./ui_builder'); // eslint-disable-line
3636
let pattern_exporter = new pe(); // eslint-disable-line
37-
let assetCopy = require('./asset_copy');
37+
let assetCopier = require('./asset_copy'); // eslint-disable-line
3838

3939
const pattern_assembler = new pa();
4040
const lineage_hunter = new lh();
@@ -654,14 +654,15 @@ const patternlab_engine = function (config) {
654654
v: function () {
655655
return getVersion();
656656
},
657-
build: function (callback, deletePatternDir) {
657+
build: function (callback, deletePatternDir, options) {
658658
if (patternlab && patternlab.isBusy) {
659659
console.log('Pattern Lab is busy building a previous run - returning early.');
660660
return Promise.resolve();
661661
}
662662
patternlab.isBusy = true;
663663
return buildPatterns(deletePatternDir).then(() => {
664664
new ui_builder().buildFrontend(patternlab);
665+
assetCopier().copyAssets(patternlab.config.paths, patternlab, {watch: false});
665666
printDebug();
666667
patternlab.isBusy = false;
667668
callback();
@@ -693,11 +694,6 @@ const patternlab_engine = function (config) {
693694
},
694695
getSupportedTemplateExtensions: function () {
695696
return getSupportedTemplateExtensions();
696-
},
697-
copyAssets: function () {
698-
699-
// accept a filtered list of assets to copy. or use the default inferred from the config
700-
assetCopy()
701697
}
702698
};
703699
};

package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,20 @@
55
"main": "./core/lib/patternlab.js",
66
"dependencies": {
77
"async": "^2.1.2",
8-
"dive": "^0.5.0",
98
"chalk": "^1.1.3",
9+
"chokidar": "^1.7.0",
10+
"dive": "^0.5.0",
1011
"diveSync": "^0.3.0",
1112
"fs-extra": "^0.30.0",
1213
"fs-promise": "^1.0.0",
1314
"glob": "^7.0.0",
15+
"graphlib": "^2.1.1",
1416
"js-beautify": "^1.6.3",
1517
"js-yaml": "^3.6.1",
1618
"lodash": "~4.13.1",
1719
"markdown-it": "^6.0.1",
1820
"node-fetch": "^1.6.0",
19-
"graphlib": "^2.1.1"
21+
"recursive-copy": "^2.0.6"
2022
},
2123
"devDependencies": {
2224
"eslint": "^3.5.0",
@@ -53,7 +55,7 @@
5355
"license": "MIT",
5456
"scripts": {
5557
"lint": "eslint core/**/*.js",
56-
"pretest" : "npm run lint",
58+
"pretest": "npm run lint",
5759
"test": "tap test/*_tests.js --reporter spec --coverage"
5860
},
5961
"engines": {

test/asset_copy_tests.js

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
"use strict";
2+
3+
var tap = require('tap');
4+
var rewire = require("rewire");
5+
var _ = require('lodash');
6+
var eol = require('os').EOL;
7+
var Pattern = require('../core/lib/object_factory').Pattern;
8+
var extend = require('util')._extend;
9+
var ac = rewire('../core/lib/asset_copy');
10+
var path = require('path');
11+
var config = require('./util/patternlab-config.json');
12+
13+
var engineLoader = require('../core/lib/pattern_engines');
14+
engineLoader.loadAllEngines(config);
15+
16+
//set up a global mocks - we don't want to be writing/rendering any files right now
17+
// var chokidarMock = {
18+
// watch: function (path, data, cb) { }
19+
// };
20+
21+
// ac.__set__({
22+
// 'chokidar': chokidarMock,
23+
// });
24+
25+
const assetCopier = ac();
26+
27+
function createFakePatternLab(customProps) {
28+
var pl = {
29+
config: {
30+
paths: {
31+
source: {
32+
img: './test/img',
33+
css: './test/css'
34+
},
35+
public: {
36+
img: './test/output/img',
37+
css: './test/output/css'
38+
}
39+
},
40+
styleGuideExcludes: [ ],
41+
debug: false,
42+
outputFileSuffixes: {
43+
rendered: '.rendered',
44+
rawTemplate: '',
45+
markupOnly: '.markup-only'
46+
}
47+
},
48+
data: {}
49+
};
50+
return extend(pl, customProps);
51+
}
52+
53+
// tap.test('transformConfigPaths takes configuration.paths() and maps to a better key store', function (test) {
54+
// //arrange
55+
// var patternlab = createFakePatternLab({});
56+
57+
// //act
58+
// var result = assetCopy.transformConfigPaths(patternlab.config.paths);
59+
60+
// //assert
61+
// test.equals(result.img.source, './test/img');
62+
// test.equals(result.img.public, './test/output/img');
63+
// test.equals(result.css.source, './test/css');
64+
// test.equals(result.css.public, './test/output/css');
65+
// test.end();
66+
// });
67+
68+
tap.test('assetCopier does stuff', function(test) {
69+
//arrange
70+
var patternlab = createFakePatternLab({});
71+
72+
//act
73+
74+
assetCopier.copyAssets(patternlab.config.paths, {});
75+
76+
//assert
77+
78+
test.end();
79+
})

0 commit comments

Comments
 (0)