UNPKG

2.98 kBJavaScriptView Raw
1'use strict';
2
3const execSync = require('child_process').execSync;
4const BroccoliPlugin = require('broccoli-plugin');
5const path = require('path');
6const MergeTrees = require('broccoli-merge-trees');
7// const stew = require('broccoli-stew');
8// const log = stew.log;
9// const map = stew.map;
10const fs = require('fs');
11const Funnel = require('broccoli-funnel');
12const stringUtils = require("ember-cli-string-utils");
13
14class MyPlugin extends BroccoliPlugin {
15 constructor(inputNodes, memo) {
16 super(inputNodes);
17
18 this.memo = memo;
19 }
20
21 build() {
22 let tailwindBinary = require.resolve('tailwindcss').replace('index.js', 'cli.js');
23 let tailwindPath = path.join(this.inputPaths[0], 'app', 'styles', 'tailwind');
24 let configFile = path.join(tailwindPath, 'config', 'tailwind.js');
25 let modulesFile = path.join(tailwindPath, 'config', 'modules.css');
26 let outputFile = path.join(this.outputPath, 'app', 'styles', 'tailwind.css');
27
28 execSync(`${tailwindBinary} build ${modulesFile} -c ${configFile} -o ${outputFile}`);
29 }
30}
31
32class AnotherPlugin extends BroccoliPlugin {
33 build() {
34 let modulesPath = path.join(this.inputPaths[0], 'ember-cli-tailwind');
35 let modules = fs.readdirSync(modulesPath);
36
37 let data = modules.reduce((data, moduleName) => {
38 let modulePath = path.join(modulesPath, moduleName)
39 let contents = require(modulePath);
40 let key = stringUtils.camelize(moduleName.replace('.js', ''));
41
42 data[key] = contents;
43
44 delete require.cache[require.resolve(modulePath)]
45
46 return data;
47 }, {});
48
49 let dataString = JSON.stringify(data);
50 let outputPath = path.join(this.outputPath, 'ember-cli-tailwind');
51 fs.mkdirSync(outputPath);
52 fs.writeFileSync(path.join(outputPath, 'modules.js'), `export default ${dataString}`);
53 }
54}
55
56module.exports = {
57 name: 'ember-cli-tailwind',
58
59 isDevelopingAddon() {
60 return true;
61 },
62
63 included() {
64 this._super.included.apply(this, arguments);
65
66 this.import('vendor/etw.css');
67 },
68
69 treeForApp(tree) {
70 let trees = [ tree ];
71
72 let tailwindModulesPaths = [ this.parent.root ];
73 if (this.project.isEmberCLIAddon()) {
74 tailwindModulesPaths = tailwindModulesPaths.concat([ 'tests', 'dummy' ]);
75 }
76 tailwindModulesPaths = tailwindModulesPaths.concat([ 'app', 'styles', 'tailwind' ]);
77 let tailwindModulesPath = path.join.apply(this, tailwindModulesPaths);
78 let tailwindNodeModulesTree = new Funnel(tailwindModulesPath, {
79 exclude: [ 'config' ],
80 destDir: 'ember-cli-tailwind'
81 });
82
83 let tailwindES6Modules = new AnotherPlugin([ tailwindNodeModulesTree ]);
84 trees.push(tailwindES6Modules);
85
86 return new MergeTrees(trees);
87 },
88
89 preprocessTree(type, tree) {
90 let trees = tree ? [ tree ] : [];
91
92 if (type === 'css' && tree._annotation === "TreeMerger (stylesAndVendor)") {
93 let newTree = new MyPlugin([ tree ], this.memo);
94 trees.push(newTree);
95 }
96
97 return new MergeTrees(trees);
98 }
99
100};