@zohodesk/react-cli 1.1.8 → 1.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -0
- package/bin/cli.js +16 -12
- package/docs/CustomChunks.md +12 -9
- package/lib/common/splitChunks.js +65 -45
- package/lib/common/testPattern.js +9 -9
- package/lib/configs/webpack.dev.config.js +6 -3
- package/lib/configs/webpack.docs.config.js +4 -2
- package/lib/configs/webpack.impact.config.js +4 -2
- package/lib/configs/webpack.prod.config.js +6 -3
- package/lib/deprecationLogger.js +41 -0
- package/lib/loaderUtils/getCSSLoaders.js +24 -7
- package/lib/pluginUtils/getDevPlugins.js +3 -2
- package/lib/pluginUtils/getProdPlugins.js +1 -1
- package/lib/plugins/ReportGeneratePlugin.js +8 -6
- package/lib/plugins/ResourceHintsPlugin.js +13 -3
- package/lib/plugins/UnusedFilesFindPlugin.js +7 -5
- package/lib/plugins/utils/fileHandling.js +35 -38
- package/lib/schemas/index.js +19 -36
- package/lib/utils/deprecationSupport.js +128 -0
- package/lib/utils/getOptions.js +19 -79
- package/lib/utils/index.js +14 -12
- package/lib/utils/initPreCommitHook.js +5 -5
- package/lib/utils/log.js +11 -0
- package/lib/utils/pullOrigin.js +3 -3
- package/lib/utils/reinstallDependencies.js +3 -3
- package/lib/utils/switchBranch.js +4 -2
- package/package.json +1 -1
- package/templates/docs/css/markdown.css +1 -1
package/README.md
CHANGED
@@ -43,6 +43,29 @@ Now to run app
|
|
43
43
|
---
|
44
44
|
|
45
45
|
# Change Logs
|
46
|
+
# 1.1.9 (25-7-2023)
|
47
|
+
|
48
|
+
**Features:-**
|
49
|
+
|
50
|
+
- we have added config file support for react-cli schema. the default config file name `build.config.js` support added. In `build.config.js` you must export configuration object under `config` key. And Note: `build.config.js` is high priority then `package.json` `react-cli` config.
|
51
|
+
- added support for using regex expression to get group of chunks chunkId via Resource Hint plugin prefetch/preload hook.
|
52
|
+
only will be activate when `resourceHints` => `allowPrefetchingMultipleChunks` as `true`
|
53
|
+
- added support for pattern as function for custom chunks split logic.
|
54
|
+
- added options to split chunks base config in the key `app` => `customChunksBaseConfig` as object
|
55
|
+
- added `postCssPluginOrder` feature :
|
56
|
+
- If `app > postCssPluginOrder` or `docs > postCssPluginOrder` is set to "false", default plugin order will be followed.
|
57
|
+
- If `app > postCssPluginOrder` or `docs > postCssPluginOrder` is set to "true", order preserved in `plugins` Object will be considered.
|
58
|
+
- If `app > postCssPluginOrder` or `docs > postCssPluginOrder` is set to an array with plugins in a custom order, the custom order will be considered.
|
59
|
+
|
60
|
+
- We use the same plugin names as in `patterns` for the plugins to execute successfully.
|
61
|
+
|
62
|
+
|
63
|
+
**Issue Fix**
|
64
|
+
- fixed file path separator issue with split chunks config for vendor exclude list for windows (that was work well for mac and ubuntu only issue in windows).
|
65
|
+
- fixed cssUniqueness pattern not working in docs.
|
66
|
+
|
67
|
+
**Changes**
|
68
|
+
- previously all custom chunks are enforce true, no we have given support for enforce false for chunks on splitChunks config.
|
46
69
|
|
47
70
|
# 1.1.8
|
48
71
|
|
@@ -56,6 +79,20 @@ Now to run app
|
|
56
79
|
For more info please refer to :
|
57
80
|
[details](https://zgit.csez.zohocorpin.com/zohodesk/react-cli/-/blob/2.0.0/docs/MarkdownParser.md)
|
58
81
|
|
82
|
+
|
83
|
+
# 1.1.6-exp.2
|
84
|
+
- fixed file path separator issue with split chunks config for vendor exclude list.
|
85
|
+
- added support for not doing enforce true for chunks on splitchunks config.
|
86
|
+
|
87
|
+
# 1.1.5-exp.5
|
88
|
+
- fixed the issues regarding custom chunks base config schema.
|
89
|
+
|
90
|
+
# 1.1.5-exp.4
|
91
|
+
- added support for using regex expression to get group of chunks chunkId via Resource Hint plugin prefetch/preload hook.
|
92
|
+
|
93
|
+
# 1.1.5-exp.3
|
94
|
+
- added options to split chunks base config
|
95
|
+
- added support for passing custom chunks split logic as function.
|
59
96
|
# 1.1.6
|
60
97
|
|
61
98
|
**Issue Fix**
|
package/bin/cli.js
CHANGED
@@ -3,13 +3,17 @@
|
|
3
3
|
const path = require('path');
|
4
4
|
const { existsSync } = require('fs');
|
5
5
|
const { spawnSync: _spawnSync, spawn } = require('child_process');
|
6
|
-
const
|
6
|
+
const getOptions = require('../lib/utils/getOptions.js').default;
|
7
7
|
|
8
|
-
const { log } = require('../lib/utils');
|
8
|
+
const { log } = require('../lib/utils/log.js');
|
9
9
|
const { getCliPath } = require('../lib/servers/getCliPath.js');
|
10
10
|
//initPreCommitHook();
|
11
11
|
|
12
|
-
const
|
12
|
+
const [, , option] = process.argv;
|
13
|
+
const args = process.argv.slice(3);
|
14
|
+
const appPath = process.cwd();
|
15
|
+
|
16
|
+
const options = getOptions({ start: true, build: true, docs: true }[option]);
|
13
17
|
|
14
18
|
function spawnSync(...args) {
|
15
19
|
const result = _spawnSync(...args);
|
@@ -28,10 +32,6 @@ const {
|
|
28
32
|
reportPath: reportPath
|
29
33
|
} = esLintOptions || {};
|
30
34
|
|
31
|
-
const [, , option] = process.argv;
|
32
|
-
const args = process.argv.slice(3);
|
33
|
-
const appPath = process.cwd();
|
34
|
-
|
35
35
|
const webpack = getCliPath('webpack');
|
36
36
|
|
37
37
|
const nodemon = getCliPath('nodemon');
|
@@ -48,10 +48,14 @@ if (preprocesserPath && existsSync(preprocesserPath)) {
|
|
48
48
|
switch (option) {
|
49
49
|
case 'start':
|
50
50
|
case 'docs':
|
51
|
-
spawn(
|
52
|
-
|
53
|
-
|
54
|
-
|
51
|
+
spawn(
|
52
|
+
preprocessCli,
|
53
|
+
[preprocesserPath, '--watch', path.parse(preprocesserPath).dir],
|
54
|
+
{
|
55
|
+
stdio: 'inherit',
|
56
|
+
cwd: path.parse(preprocesserPath).dir
|
57
|
+
}
|
58
|
+
);
|
55
59
|
// NOTE: it's ok if we not close this here
|
56
60
|
// Because when node server stops this program willbe closed So this nodemon will be killed as well
|
57
61
|
break;
|
@@ -270,7 +274,7 @@ switch (option) {
|
|
270
274
|
require.resolve('../lib/servers/mockserver.js'),
|
271
275
|
'--delay',
|
272
276
|
'2500ms',
|
273
|
-
'watch',
|
277
|
+
'--watch',
|
274
278
|
`${appPath + path.sep}mockapi`
|
275
279
|
].concat(args),
|
276
280
|
{ stdio: 'inherit' }
|
package/docs/CustomChunks.md
CHANGED
@@ -4,23 +4,26 @@ In react-cli we provide options to create custom chunks.
|
|
4
4
|
This Custom Chunk Option is array of Object
|
5
5
|
that Object keys are
|
6
6
|
|
7
|
-
- `pattern` regex pattern as string
|
8
|
-
- `name` chunk name
|
9
|
-
- `size` is count which is
|
7
|
+
- `pattern` **{ String | Function | Array<String> }** regex pattern as string and custom logic to split chunks can be defined using function
|
8
|
+
- `name` **{ String }** chunk name
|
9
|
+
- `size` **{ Number }** is count which is minimum chunk duplicated or need in chunks
|
10
10
|
|
11
11
|
> Since 0.0.1-exp.164.1
|
12
12
|
|
13
13
|
extra features in custom chunks :-
|
14
14
|
for more details [SplitChunkPlugin](https://webpack.js.org/plugins/split-chunks-plugin/) webpack
|
15
15
|
|
16
|
-
- `minChunks`: `minChunks` is
|
17
|
-
- `rules`: `rules` is same as `pattern` with some easy hooks
|
16
|
+
- `minChunks`: `minChunks` is alias of `size` default value is `2`,
|
17
|
+
- `rules`: `rules` is same as `pattern` with some easy hooks **(removed after v1.1.5)**
|
18
18
|
- use `/` for both windows and linux we will replace internally
|
19
19
|
- for `.*` we need to use `*`
|
20
20
|
- we can consider rules as regex when the `rules-string` has any of these `*`, `^`, `$`. So if you want regex then kindly use `*` in your `rules-string` for force regex
|
21
21
|
- `chunks`: by this option we can specify , default value is `all`,
|
22
22
|
- `priority`: priority default value is `-10 * (index + 2)`,
|
23
|
-
- `enforce`: enforce default value is true
|
24
|
-
- `maxSize`: maxSize, default value is 0
|
25
|
-
- `minSize`: minSize, default value is 20000
|
26
|
-
|
23
|
+
- `enforce`: enforce default value is `true`,
|
24
|
+
- `maxSize`: maxSize, default value is `0`,
|
25
|
+
- `minSize`: minSize, default value is `20000`,
|
26
|
+
- `reuseExistingChunk` If the current chunk contains modules already split out from the main bundle, it will be reused instead of a new one being generated. This can affect the resulting file name of the chunk.
|
27
|
+
- `automaticNamePrefix` with this you can specify for chunks created through that specified config. default value `''`.
|
28
|
+
- `cacheGroupName`: `cacheGroupName` is alias of `name`, But it won't work as chunk name, instead it will just work as key in cacheGroup.
|
29
|
+
<!-- includeDependency: includeDependency default value is `false` -->
|
@@ -15,35 +15,53 @@ var _testPattern = require("./testPattern");
|
|
15
15
|
|
16
16
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
const isWindows = _os.default.platform().toLowerCase() === 'win32';
|
19
|
+
const ps = _path.default.sep;
|
20
|
+
const options = (0, _utils.getOptions)();
|
21
|
+
const {
|
22
22
|
app: {
|
23
23
|
vendorExclude,
|
24
24
|
customChunks,
|
25
|
-
vendorInclude
|
25
|
+
vendorInclude,
|
26
|
+
customChunksBaseConfig
|
26
27
|
}
|
27
28
|
} = options;
|
29
|
+
const reactBundleIncludeList = ['react', 'react-dom', 'react-redux', 'react-transition-group', 'scheduler', 'prop-types'];
|
30
|
+
const vendorExcludeList = ['script-loader', 'raw-loader', ...reactBundleIncludeList, ...vendorExclude.map(vendorPath => vendorPath.replace(/[/\\]/g, _path.default.sep))];
|
31
|
+
const vendorIncludeList = [...vendorInclude].map(vendorPath => vendorPath.replace(/[/\\]/g, _path.default.sep));
|
28
32
|
|
29
|
-
|
30
|
-
|
33
|
+
const isVendor = function isVendor(module) {
|
34
|
+
const {
|
31
35
|
userRequest
|
32
36
|
} = module;
|
33
|
-
|
34
|
-
excludeList = [...excludeList, ...vendorExclude];
|
35
|
-
return userRequest && (vendorInclude.some(item => userRequest.indexOf(item) !== -1) || userRequest.indexOf('node_modules') >= 0 && userRequest.endsWith('.css') === false && userRequest.endsWith('publicPathConfig.js') === false && excludeList.every(item => userRequest.indexOf(`node_modules${ps}${item}${ps}`) === -1));
|
37
|
+
return userRequest && (vendorIncludeList.some(item => userRequest.indexOf(item) !== -1) || userRequest.indexOf('node_modules') >= 0 && userRequest.endsWith('.css') === false && userRequest.endsWith('publicPathConfig.js') === false && vendorExcludeList.every(item => userRequest.indexOf(`node_modules${ps}${item}${ps}`) === -1));
|
36
38
|
};
|
37
39
|
|
38
|
-
|
39
|
-
|
40
|
+
const isReact = module => {
|
41
|
+
const {
|
40
42
|
userRequest
|
41
43
|
} = module;
|
42
|
-
|
43
|
-
return userRequest && reactBundle.some(pkg => userRequest.indexOf(`node_modules${ps}${pkg}${ps}`) >= 0);
|
44
|
+
return userRequest && reactBundleIncludeList.some(pkg => userRequest.indexOf(`node_modules${ps}${pkg}${ps}`) >= 0);
|
44
45
|
};
|
45
46
|
|
46
|
-
|
47
|
+
function rulesMatcher(pattern) {
|
48
|
+
if (typeof pattern === 'function') {
|
49
|
+
return pattern;
|
50
|
+
}
|
51
|
+
|
52
|
+
if (Array.isArray(pattern)) {
|
53
|
+
return ({
|
54
|
+
userRequest
|
55
|
+
}) => (0, _testPattern.testPattern)(userRequest, pattern);
|
56
|
+
}
|
57
|
+
|
58
|
+
return new RegExp(isWindows ? pattern.replace(/\//g, '\\') : pattern);
|
59
|
+
}
|
60
|
+
|
61
|
+
const baseSplitChunkConfig = Object.assign({
|
62
|
+
minSize: 15000
|
63
|
+
}, customChunksBaseConfig);
|
64
|
+
const specificCacheGroupConfig = {
|
47
65
|
'react.vendor': {
|
48
66
|
name: 'react.vendor',
|
49
67
|
chunks: 'all',
|
@@ -63,45 +81,35 @@ let defaultChunks = {
|
|
63
81
|
priority: -10
|
64
82
|
}
|
65
83
|
};
|
66
|
-
|
84
|
+
const customChunksConfig = {};
|
67
85
|
customChunks.map((obj, index) => ({
|
68
86
|
name: obj.name,
|
69
|
-
|
87
|
+
chunks: obj.chunks || 'all',
|
70
88
|
minChunks: obj.minChunks || obj.size || 2,
|
71
|
-
|
72
|
-
// includeDepenency: obj.includeDepenency || false,
|
89
|
+
pattern: obj.pattern,
|
73
90
|
priority: obj.priority || -10 * (index + 2),
|
74
|
-
enforce: obj.enforce
|
75
|
-
maxSize: obj.maxSize,
|
76
|
-
// || 0,
|
91
|
+
enforce: obj.enforce,
|
77
92
|
minSize: obj.minSize,
|
78
93
|
// || 20000,
|
79
|
-
|
80
|
-
|
94
|
+
maxSize: obj.maxSize,
|
95
|
+
// || 0,
|
96
|
+
reuseExistingChunk: obj.reuseExistingChunk,
|
97
|
+
cacheGroupName: obj.cacheGroupName || obj.name
|
98
|
+
})).forEach(({
|
81
99
|
name,
|
82
|
-
|
100
|
+
chunks = 'all',
|
83
101
|
minChunks,
|
84
|
-
|
102
|
+
pattern,
|
85
103
|
priority,
|
86
|
-
// includeDepenency,
|
87
104
|
enforce,
|
88
105
|
minSize,
|
89
106
|
maxSize,
|
90
|
-
|
107
|
+
reuseExistingChunk,
|
108
|
+
cacheGroupName
|
91
109
|
}) => {
|
92
|
-
|
93
|
-
|
94
|
-
test: rules ? m => {
|
95
|
-
const {
|
96
|
-
userRequest
|
97
|
-
} = m;
|
98
|
-
return (0, _testPattern.testPattern)(userRequest, rules); // return (
|
99
|
-
// pkgs.some(p => isRelated(userRequest, p)) ||
|
100
|
-
// (includeDepenency && isDependency(m, pkgs))
|
101
|
-
// );
|
102
|
-
} : new RegExp(isWindows ? pattern.replace(/\//g, '\\') : pattern),
|
110
|
+
const obj = {
|
111
|
+
test: rulesMatcher(pattern),
|
103
112
|
chunks,
|
104
|
-
enforce,
|
105
113
|
minChunks,
|
106
114
|
priority
|
107
115
|
};
|
@@ -114,13 +122,25 @@ customChunks.map((obj, index) => ({
|
|
114
122
|
obj.maxSize = maxSize;
|
115
123
|
}
|
116
124
|
|
117
|
-
|
125
|
+
if (enforce !== false) {
|
126
|
+
obj.enforce = true;
|
127
|
+
}
|
128
|
+
|
129
|
+
if (name !== undefined) {
|
130
|
+
obj.name = name;
|
131
|
+
}
|
132
|
+
|
133
|
+
if (reuseExistingChunk !== undefined) {
|
134
|
+
obj.reuseExistingChunk = reuseExistingChunk;
|
135
|
+
}
|
136
|
+
|
137
|
+
customChunksConfig[cacheGroupName] = obj;
|
118
138
|
});
|
119
|
-
|
120
|
-
minSize: 12000,
|
139
|
+
const splitChunkConfig = Object.assign({}, baseSplitChunkConfig, {
|
121
140
|
cacheGroups: Object.assign({
|
122
141
|
default: false,
|
123
142
|
vendors: false
|
124
|
-
},
|
125
|
-
};
|
143
|
+
}, specificCacheGroupConfig, customChunksConfig)
|
144
|
+
});
|
145
|
+
var _default = splitChunkConfig;
|
126
146
|
exports.default = _default;
|
@@ -13,25 +13,25 @@ var _path = require("path");
|
|
13
13
|
const isWindows = _path.sep !== '/'; // this function will return true if pattern matched
|
14
14
|
|
15
15
|
function _testPattern(req, pattern) {
|
16
|
-
let
|
16
|
+
let modifiedPattern = pattern;
|
17
17
|
|
18
|
-
if (/[*.$^]/.test(
|
18
|
+
if (/[*.$^]/.test(modifiedPattern)) {
|
19
19
|
if (isWindows) {
|
20
|
-
//
|
21
|
-
|
20
|
+
// modifiedPattern = pattern.replace(/\//g, ps.replace(/\\/g, '\\\\'));
|
21
|
+
modifiedPattern = modifiedPattern.replace(/\//g, '\\\\');
|
22
22
|
}
|
23
23
|
|
24
|
-
|
25
|
-
const re = new RegExp(
|
24
|
+
modifiedPattern = modifiedPattern.replace(/\./g, '\\.').replace(/\*/g, '.*');
|
25
|
+
const re = new RegExp(modifiedPattern);
|
26
26
|
return re.test(req);
|
27
27
|
}
|
28
28
|
|
29
29
|
if (isWindows) {
|
30
|
-
//
|
31
|
-
|
30
|
+
// modifiedPattern = pattern.replace(/\//g, ps.replace(/\\/g, '\\\\'));
|
31
|
+
modifiedPattern = modifiedPattern.replace(/\//g, '\\');
|
32
32
|
}
|
33
33
|
|
34
|
-
return req.indexOf(
|
34
|
+
return req.indexOf(modifiedPattern) !== -1;
|
35
35
|
}
|
36
36
|
|
37
37
|
function testPattern(req, pattern) {
|
@@ -39,7 +39,8 @@ const {
|
|
39
39
|
selectorReplace,
|
40
40
|
devConsoleExculde,
|
41
41
|
sourcemap,
|
42
|
-
crossorigin
|
42
|
+
crossorigin,
|
43
|
+
postCssPluginOrder
|
43
44
|
}
|
44
45
|
} = options;
|
45
46
|
const {
|
@@ -109,7 +110,8 @@ module.exports = {
|
|
109
110
|
selectorWeightConfig,
|
110
111
|
classNameBlob: '[local]',
|
111
112
|
cssUniqueness: false,
|
112
|
-
selectorReplace: null
|
113
|
+
selectorReplace: null,
|
114
|
+
postCssPluginOrder
|
113
115
|
})
|
114
116
|
} : null, {
|
115
117
|
test: seperateCssModules ? /\.module\.css$/ : /(\.module)?\.css$/,
|
@@ -124,7 +126,8 @@ module.exports = {
|
|
124
126
|
cssUniqueness,
|
125
127
|
selectorReplace,
|
126
128
|
cssHashSelectors,
|
127
|
-
classNamePrefix
|
129
|
+
classNamePrefix,
|
130
|
+
postCssPluginOrder
|
128
131
|
})
|
129
132
|
}, (0, _configsAssetsLoaders.configImageLoader)(nameTemplate), (0, _configsAssetsLoaders.configFontLoader)(nameTemplate), (0, _configsAssetsLoaders.configSVGLoader)(nameTemplate), (0, _configsAssetsLoaders.configVideoLoader)(nameTemplate), (0, _configsAssetsLoaders.configAudioLoader)(nameTemplate), {
|
130
133
|
test: /\.tmpl$/,
|
@@ -28,7 +28,8 @@ const {
|
|
28
28
|
selectorWeightConfig,
|
29
29
|
cssHashSelectors,
|
30
30
|
classNamePrefix,
|
31
|
-
selectorReplace
|
31
|
+
selectorReplace,
|
32
|
+
postCssPluginOrder
|
32
33
|
},
|
33
34
|
app: {
|
34
35
|
folder
|
@@ -87,7 +88,8 @@ module.exports = isSSTest => ({
|
|
87
88
|
cssUniqueness,
|
88
89
|
selectorReplace,
|
89
90
|
cssHashSelectors,
|
90
|
-
classNamePrefix
|
91
|
+
classNamePrefix,
|
92
|
+
postCssPluginOrder
|
91
93
|
})
|
92
94
|
}, (0, _configsAssetsLoaders.configImageLoader)(nameTemplate), (0, _configsAssetsLoaders.configFontLoader)(nameTemplate), (0, _configsAssetsLoaders.configSVGLoader)(nameTemplate), (0, _configsAssetsLoaders.configAudioLoader)(nameTemplate), (0, _configsAssetsLoaders.configVideoLoader)(nameTemplate), {
|
93
95
|
test: /\.html$/,
|
@@ -27,7 +27,8 @@ const {
|
|
27
27
|
selectorWeightConfig,
|
28
28
|
cssHashSelectors,
|
29
29
|
enableChunkHash,
|
30
|
-
classNamePrefix
|
30
|
+
classNamePrefix,
|
31
|
+
postCssPluginOrder
|
31
32
|
},
|
32
33
|
app: {
|
33
34
|
folder
|
@@ -86,7 +87,8 @@ module.exports = {
|
|
86
87
|
cssUniqueness,
|
87
88
|
selectorReplace: null,
|
88
89
|
cssHashSelectors,
|
89
|
-
classNamePrefix
|
90
|
+
classNamePrefix,
|
91
|
+
postCssPluginOrder
|
90
92
|
})
|
91
93
|
}, (0, _configsAssetsLoaders.configImageLoader)(nameTemplate), (0, _configsAssetsLoaders.configFontLoader)(nameTemplate), (0, _configsAssetsLoaders.configSVGLoader)(nameTemplate), (0, _configsAssetsLoaders.configAudioLoader)(nameTemplate), (0, _configsAssetsLoaders.configVideoLoader)(nameTemplate), {
|
92
94
|
test: /\.html$/,
|
@@ -44,7 +44,8 @@ const {
|
|
44
44
|
selectorReplace,
|
45
45
|
removePropTypes,
|
46
46
|
devConsoleExculde,
|
47
|
-
crossorigin
|
47
|
+
crossorigin,
|
48
|
+
postCssPluginOrder
|
48
49
|
}
|
49
50
|
} = options;
|
50
51
|
let {
|
@@ -160,7 +161,8 @@ module.exports = {
|
|
160
161
|
mediaQueryHoverActiveString,
|
161
162
|
classNameBlob: '[local]',
|
162
163
|
cssUniqueness: false,
|
163
|
-
selectorReplace: null
|
164
|
+
selectorReplace: null,
|
165
|
+
postCssPluginOrder
|
164
166
|
})
|
165
167
|
} : null, {
|
166
168
|
test: seperateCssModules ? /\.module\.css$/ : /\.css$/,
|
@@ -175,7 +177,8 @@ module.exports = {
|
|
175
177
|
cssUniqueness,
|
176
178
|
selectorReplace,
|
177
179
|
cssHashSelectors,
|
178
|
-
classNamePrefix
|
180
|
+
classNamePrefix,
|
181
|
+
postCssPluginOrder
|
179
182
|
})
|
180
183
|
}, {
|
181
184
|
test: /\.jpe?g$|\.gif$|\.png$/,
|
@@ -0,0 +1,41 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.deprecateMessage = deprecateMessage;
|
7
|
+
exports.deprecateOption = deprecateOption;
|
8
|
+
exports.deprecationLoggerEnd = deprecationLoggerEnd;
|
9
|
+
exports.deprecationLoggerStart = deprecationLoggerStart;
|
10
|
+
|
11
|
+
var _logger = require("./logger");
|
12
|
+
|
13
|
+
function deprecateMessage(message) {
|
14
|
+
// eslint-disable-next-line no-use-before-define
|
15
|
+
deprecationLoggerStart();
|
16
|
+
(0, _logger.messageLogger)('\x1b[36m%s\x1b[0m', message);
|
17
|
+
}
|
18
|
+
|
19
|
+
function printLine() {
|
20
|
+
deprecateMessage('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! \n ');
|
21
|
+
}
|
22
|
+
|
23
|
+
let isFirstDeprecation = false;
|
24
|
+
|
25
|
+
function deprecateOption(previousObjPath = '', newObjPath = '', message = '') {
|
26
|
+
deprecateMessage(`Please move "${previousObjPath.split('.').join(' > ')}" to "${newObjPath.split('.').join(' > ')}" following option ${message}`);
|
27
|
+
}
|
28
|
+
|
29
|
+
function deprecationLoggerStart() {
|
30
|
+
if (!isFirstDeprecation) {
|
31
|
+
isFirstDeprecation = true;
|
32
|
+
printLine();
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
36
|
+
function deprecationLoggerEnd() {
|
37
|
+
if (isFirstDeprecation) {
|
38
|
+
isFirstDeprecation = false;
|
39
|
+
printLine();
|
40
|
+
}
|
41
|
+
}
|
@@ -18,6 +18,20 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
18
18
|
const fs = require('fs');
|
19
19
|
|
20
20
|
const options = (0, _utils.getOptions)();
|
21
|
+
const defaultPostCssPluginOrder = ['valueReplacer', 'selectorReplace', 'hasRTL', 'hoverActive', 'combinerMediaQuery', 'cssVariableReplacement', 'selectorWeight', 'minifier', 'composeMinification'];
|
22
|
+
|
23
|
+
function calculatePostCssPluginOrder(postCssPluginOrder, pluginOrder) {
|
24
|
+
// if(typeof postCssPluginOrder === Boolean)
|
25
|
+
if (Array.isArray(postCssPluginOrder)) {
|
26
|
+
return postCssPluginOrder;
|
27
|
+
}
|
28
|
+
|
29
|
+
if (postCssPluginOrder) {
|
30
|
+
return pluginOrder;
|
31
|
+
}
|
32
|
+
|
33
|
+
return defaultPostCssPluginOrder.filter(value => pluginOrder.includes(value));
|
34
|
+
}
|
21
35
|
|
22
36
|
const getCSSLoaders = optionsObj => {
|
23
37
|
const {
|
@@ -29,7 +43,8 @@ const getCSSLoaders = optionsObj => {
|
|
29
43
|
cssUniqueness,
|
30
44
|
selectorReplace,
|
31
45
|
cssHashSelectors,
|
32
|
-
classNamePrefix
|
46
|
+
classNamePrefix,
|
47
|
+
postCssPluginOrder
|
33
48
|
} = optionsObj;
|
34
49
|
const {
|
35
50
|
devCssFileBountry
|
@@ -51,10 +66,11 @@ const getCSSLoaders = optionsObj => {
|
|
51
66
|
cssLoaderOptions.modules.localIdentName = classNameBlob;
|
52
67
|
} else {
|
53
68
|
cssLoaderOptions.modules.getLocalIdent = (0, _cssClassNameGenerate.default)(cssUniqueness, cssHashSelectors, classNamePrefix, patterns);
|
54
|
-
}
|
69
|
+
}
|
55
70
|
|
71
|
+
const pluginOrder = calculatePostCssPluginOrder(postCssPluginOrder, Object.keys(plugins).filter(x => plugins[x] !== false)); // console.log('selector weight config : ', selectorWeightConfig);
|
56
72
|
|
57
|
-
|
73
|
+
const postcssPlugins = [plugins.valueReplacer && require('../postcss-plugins/ValueReplacer')(valueReplacer), plugins.hasRTL && require('@zohodesk/postcss-rtl')({
|
58
74
|
addPrefixToSelector: function addPrefixToSelector(selector, prefix) {
|
59
75
|
if (prefix === '[dir]') {
|
60
76
|
return selector;
|
@@ -62,7 +78,7 @@ const getCSSLoaders = optionsObj => {
|
|
62
78
|
|
63
79
|
return `${prefix} ${selector}`; // Make selectors like [dir=rtl] > .selector
|
64
80
|
}
|
65
|
-
}), plugins.combinerMediaQuery && require('postcss-combine-media-query')(), plugins.hoverActive && require('../postcss-plugins/hoverActivePlugin')(mediaQueryHoverActiveString), plugins.cssVariableReplacement && fs.existsSync(cssVariableReplacementConfig) && require('../postcss-plugins/variableModificationPlugin/index').plugin(cssVariableReplacementConfig) // ,
|
81
|
+
}), plugins.selectorReplace && require('../postcss-plugins/SelectorReplace')(selectorReplace), plugins.combinerMediaQuery && require('postcss-combine-media-query')(), plugins.hoverActive && require('../postcss-plugins/hoverActivePlugin')(mediaQueryHoverActiveString), plugins.cssVariableReplacement && fs.existsSync(cssVariableReplacementConfig) && require('../postcss-plugins/variableModificationPlugin/index').plugin(cssVariableReplacementConfig) // ,
|
66
82
|
// plugins.composeMinification &&
|
67
83
|
// require('../postcss-plugins/composePlugin')()
|
68
84
|
].filter(Boolean);
|
@@ -141,13 +157,14 @@ const getCSSLoaders = optionsObj => {
|
|
141
157
|
*/
|
142
158
|
// console.log(params.resourcePath);
|
143
159
|
// console.log(postcssPlugins);
|
144
|
-
const
|
160
|
+
const finalPostcssPlugins = (0, _fileHandling.isFileNameMatchingPattern)({
|
145
161
|
filename: params.resourcePath,
|
146
162
|
filterObject: patterns,
|
147
|
-
plugins: postcssPlugins
|
163
|
+
plugins: postcssPlugins,
|
164
|
+
order: pluginOrder
|
148
165
|
}); // postcssPlugins that are allowed
|
149
166
|
|
150
|
-
return
|
167
|
+
return finalPostcssPlugins.length > 0 ? finalPostcssPlugins : [require('../postcss-plugins/EmptyPlugin')()];
|
151
168
|
}
|
152
169
|
}
|
153
170
|
} : null, plugins.composeMinification ? {
|
@@ -72,7 +72,8 @@ const getDevPlugins = (options, publicPath) => {
|
|
72
72
|
enableRTLSplit
|
73
73
|
},
|
74
74
|
i18n,
|
75
|
-
unusedFiles
|
75
|
+
unusedFiles,
|
76
|
+
resourceHints
|
76
77
|
} = options;
|
77
78
|
const hasEFC = newOptionForEnableEFC || prevOptionForEnableEFC;
|
78
79
|
const cssLTRFileNameTempalte = enableRTLSplit ? 'css/[name].ltr.css' : 'css/[name].css';
|
@@ -94,7 +95,7 @@ const getDevPlugins = (options, publicPath) => {
|
|
94
95
|
filename: cssLTRFileNameTempalte,
|
95
96
|
// ignoreOrder: true,
|
96
97
|
chunkFilename: cssLTRFileNameTempalte
|
97
|
-
}), new _plugins.ResourceHintsPlugin()];
|
98
|
+
}), new _plugins.ResourceHintsPlugin(resourceHints)];
|
98
99
|
|
99
100
|
if (enableRTLSplit) {
|
100
101
|
pluginsArr.push(new _RtlCssPlugin.RtlCssPlugin({
|
@@ -107,7 +107,7 @@ const getProdPlugins = (options, publicPath = '') => {
|
|
107
107
|
// ignoreOrder: true,
|
108
108
|
filename: cssLTRFileNameTempalte,
|
109
109
|
chunkFilename: cssLTRFileNameTempalte
|
110
|
-
}), new _plugins.ResourceHintsPlugin(), new _plugins.MinifyPlugin()];
|
110
|
+
}), new _plugins.ResourceHintsPlugin(options.resourceHints), new _plugins.MinifyPlugin()];
|
111
111
|
|
112
112
|
if (enableRTLSplit) {
|
113
113
|
pluginsArr.push(new _RtlCssPlugin.RtlCssPlugin({
|
@@ -13,6 +13,8 @@ var _redis = _interopRequireDefault(require("redis"));
|
|
13
13
|
|
14
14
|
var _utils = require("../utils");
|
15
15
|
|
16
|
+
var _log = require("../utils/log");
|
17
|
+
|
16
18
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
17
19
|
|
18
20
|
let options = (0, _utils.getOptions)();
|
@@ -68,10 +70,10 @@ class reportGeneratePlugin {
|
|
68
70
|
let client = _redis.default.createClient(redisPort, redisHost);
|
69
71
|
|
70
72
|
client.on('connect', () => {
|
71
|
-
(0,
|
73
|
+
(0, _log.log)('Redis client connected');
|
72
74
|
});
|
73
75
|
client.on('error', err => {
|
74
|
-
(0,
|
76
|
+
(0, _log.log)(`Something went wrong ${err}`);
|
75
77
|
});
|
76
78
|
|
77
79
|
if (_fs.default.existsSync(_path.default.resolve(process.cwd(), 'build', 'stats.json'))) {
|
@@ -80,7 +82,7 @@ class reportGeneratePlugin {
|
|
80
82
|
statsJSON = JSON.parse(statsJSON);
|
81
83
|
let finalObj = {};
|
82
84
|
let branchName = branch ? branch : (0, _utils.getCurrentBranch)();
|
83
|
-
(0,
|
85
|
+
(0, _log.log)(branchName);
|
84
86
|
statsJSON.assets.forEach(assetObj => {
|
85
87
|
let nameSplitList = assetObj.name.split('/')[assetObj.name.split('/').length - 1].split('.'); // eslint-disable-line
|
86
88
|
|
@@ -111,7 +113,7 @@ class reportGeneratePlugin {
|
|
111
113
|
};
|
112
114
|
client.get(branchName, (err, reply) => {
|
113
115
|
if (err) {
|
114
|
-
(0,
|
116
|
+
(0, _log.log)(err);
|
115
117
|
} else {
|
116
118
|
reply = JSON.parse(reply); // eslint-disable-line
|
117
119
|
|
@@ -147,7 +149,7 @@ class reportGeneratePlugin {
|
|
147
149
|
throw err;
|
148
150
|
}
|
149
151
|
|
150
|
-
(0,
|
152
|
+
(0, _log.log)('Stats Json generated!');
|
151
153
|
});
|
152
154
|
}
|
153
155
|
});
|
@@ -169,7 +171,7 @@ class reportGeneratePlugin {
|
|
169
171
|
}
|
170
172
|
|
171
173
|
if (err) {
|
172
|
-
(0,
|
174
|
+
(0, _log.log)(err);
|
173
175
|
}
|
174
176
|
});
|
175
177
|
}
|