forked from arielsalminen/vue-design-system
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils.js
124 lines (103 loc) · 3 KB
/
utils.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
"use strict"
const path = require("path")
const config = require("../config")
const MiniCssExtractPlugin = require("mini-css-extract-plugin")
const packageConfig = require("../package.json")
exports.assetsPath = function(_path) {
const assetsSubDirectory =
process.env.NODE_ENV === "production"
? config.build.assetsSubDirectory
: config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path)
}
exports.assetsSystemPath = function(_path) {
return path.posix.join(config.system.assetsSubDirectory, _path)
}
exports.cssLoaders = function(options) {
options = options || {}
const cssLoader = {
loader: "css-loader",
options: {
sourceMap: options.sourceMap,
},
}
const postcssLoader = {
loader: "postcss-loader",
options: {
sourceMap: options.sourceMap,
},
}
// generate loader string to be used with extract text plugin
function generateLoaders(loader, loaderOptions) {
const loaders = []
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
loaders.push(MiniCssExtractPlugin.loader)
} else {
loaders.push("vue-style-loader")
}
loaders.push(cssLoader)
if (options.usePostCSS) {
loaders.push(postcssLoader)
}
if (loader) {
loaders.push({
loader: loader + "-loader",
options: Object.assign({}, loaderOptions, {
sourceMap: options.sourceMap,
}),
})
}
return loaders
}
const sassResourcesConfig = {
loader: "sass-resources-loader",
options: {
resources: [
path.resolve(__dirname, "../src/assets/tokens/tokens.scss"),
path.resolve(__dirname, "../src/assets/tokens/tokens.map.scss"),
path.resolve(__dirname, "../src/styles/styles.scss"),
],
},
}
const sassOptions = {
outputStyle: "compressed",
}
// https://vue-loader.vuejs.org/guide/extract-css.html
return {
css: generateLoaders(),
postcss: generateLoaders(),
sass: generateLoaders("sass", Object.assign({ indentedSyntax: true }, sassOptions)).concat(
sassResourcesConfig
),
scss: generateLoaders("sass", sassOptions).concat(sassResourcesConfig),
}
}
// Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function(options) {
const output = []
const loaders = exports.cssLoaders(options)
for (const extension in loaders) {
const loader = loaders[extension]
output.push({
test: new RegExp("\\." + extension + "$"),
use: loader,
})
}
return output
}
exports.createNotifierCallback = () => {
const notifier = require("node-notifier")
return (severity, errors) => {
if (severity !== "error") return
const error = errors[0]
const filename = error.file && error.file.split("!").pop()
notifier.notify({
title: packageConfig.name,
message: severity + ": " + error.name,
subtitle: filename || "",
icon: path.join(__dirname, "logo.png"),
})
}
}