@zohodesk/react-cli 1.1.10 → 1.1.11-exp.2
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 +74 -10
- package/bin/cli.js +1 -1
- package/lib/common/runPreProcess.js +19 -14
- package/lib/configs/webpack.css.umd.config.js +3 -2
- package/lib/configs/webpack.dev.config.js +3 -0
- package/lib/configs/webpack.docs.config.js +2 -0
- package/lib/configs/webpack.impact.config.js +2 -0
- package/lib/configs/webpack.prod.config.js +3 -0
- package/lib/loaderUtils/getCSSLoaders.js +3 -2
- package/lib/logger.js +7 -0
- package/lib/pluginUtils/getProdPlugins.js +15 -2
- package/lib/plugins/StatsPlugin.js +174 -0
- package/lib/schemas/index.js +10 -1
- package/lib/utils/cssClassNameGenerate.js +38 -5
- package/lib/utils/getOptions.js +18 -2
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/templates/docs/css/style.css +136 -169
- package/templates/docs/index.html +795 -632
package/README.md
CHANGED
@@ -44,6 +44,66 @@ Now to run app
|
|
44
44
|
|
45
45
|
# Change Logs
|
46
46
|
|
47
|
+
# 1.1.11-exp.2 (11-8-2023)
|
48
|
+
|
49
|
+
**Changes**
|
50
|
+
- Added more customization support for `stats.json` output.
|
51
|
+
- Disabling `bundle-analyser` stats report for our customized stats output based on a flag.
|
52
|
+
|
53
|
+
# 1.1.11-exp.1 (8-8-2023)
|
54
|
+
|
55
|
+
**Changes**
|
56
|
+
|
57
|
+
- Added a new config `stats` to control stats file generation.
|
58
|
+
|
59
|
+
**Features:-**
|
60
|
+
|
61
|
+
- Generating stats.json file for the build assets only in production mode. To use this feature we need to add `stats > enable` or cli flags `enable_stats`.
|
62
|
+
|
63
|
+
# 1.1.11 (4-8-2023)
|
64
|
+
|
65
|
+
**Changes**
|
66
|
+
|
67
|
+
- we have renamed our default config file as `react-cli.config.js` instead of `build.config.js`. But we still support `build.config.js` we will remove it in later major version.
|
68
|
+
|
69
|
+
- Prop-type, Prop description, Default Props support for docs given.
|
70
|
+
- Docs and Docs_Code UI updated.
|
71
|
+
|
72
|
+
**Features:-**
|
73
|
+
|
74
|
+
- custom classname prefix for separate packages now supported.
|
75
|
+
- to use custom classnames for specific patterns, we use the following pattern in `app > customClassNamePrefix` or `docs > customClassNamePrefix` :
|
76
|
+
|
77
|
+
```
|
78
|
+
"customClassNamePrefix" : [
|
79
|
+
{
|
80
|
+
"enable": true,
|
81
|
+
"prefix": "[required-prefix]",
|
82
|
+
"patterns":[
|
83
|
+
"**/[path-name]/**/*.css"
|
84
|
+
]
|
85
|
+
}
|
86
|
+
]
|
87
|
+
```
|
88
|
+
|
89
|
+
For example,
|
90
|
+
|
91
|
+
```
|
92
|
+
"customClassNamePrefix": [
|
93
|
+
{
|
94
|
+
"enable": true,
|
95
|
+
"prefix": "zdSvg",
|
96
|
+
"patterns": [
|
97
|
+
"**/@zohodesk/svg/**/*.css"
|
98
|
+
]
|
99
|
+
},
|
100
|
+
],
|
101
|
+
```
|
102
|
+
|
103
|
+
**Issue Fix:**
|
104
|
+
|
105
|
+
- typo fix, (../src/common/runPreProcess.js) to (../lib/common/runPreProcess.js) in cli.js our code.
|
106
|
+
|
47
107
|
# 1.1.10 (2-8-2023)
|
48
108
|
|
49
109
|
**Issue Fix:**
|
@@ -213,8 +273,8 @@ Now to run app
|
|
213
273
|
|
214
274
|
**Breaking Changes:**
|
215
275
|
|
216
|
-
- We have remove ssl certificate for security reasons.
|
217
|
-
So default https server won't run.
|
276
|
+
- We have remove ssl certificate for security reasons.
|
277
|
+
So default https server won't run.
|
218
278
|
In order to make it work as before you need to specify two things
|
219
279
|
1. install `@zohodesk-private/client_dev_cert`
|
220
280
|
2. `react-cli.app.server.httpsCerts` option example `"httpsCerts": "@zohodesk-private/client_dev_cert"`
|
@@ -230,8 +290,8 @@ Now to run app
|
|
230
290
|
|
231
291
|
**Breaking Changes:**
|
232
292
|
|
233
|
-
- We have remove ssl certificate for security reasons.
|
234
|
-
So default https server won't run.
|
293
|
+
- We have remove ssl certificate for security reasons.
|
294
|
+
So default https server won't run.
|
235
295
|
In order to make it work as before you need to specify two things
|
236
296
|
1. install `@zohodesk-private/client_dev_cert`
|
237
297
|
2. `react-cli.app.server.httpsCerts` option example `"httpsCerts": "@zohodesk-private/client_dev_cert"`
|
@@ -248,8 +308,8 @@ Now to run app
|
|
248
308
|
|
249
309
|
**Breaking Changes:**
|
250
310
|
|
251
|
-
- We have remove ssl certificate for security reasons.
|
252
|
-
So default https server won't run.
|
311
|
+
- We have remove ssl certificate for security reasons.
|
312
|
+
So default https server won't run.
|
253
313
|
In order to make it work as before you need to specify two things
|
254
314
|
1. install `@zohodesk-private/client_dev_cert`
|
255
315
|
2. `react-cli.app.server.httpsCerts` option example `"httpsCerts": "@zohodesk-private/client_dev_cert"`
|
@@ -315,8 +375,8 @@ cli has been updated to fix compose issue faced when classname:hover exists and
|
|
315
375
|
|
316
376
|
**Feature:-**
|
317
377
|
|
318
|
-
- `react-cli.test.classnameFormat` option added to change CssModules (Ex: import style from "./a.module.css" ) className transform template unittest case.
|
319
|
-
|
378
|
+
- `react-cli.test.classnameFormat` option added to change CssModules (Ex: import style from "./a.module.css" ) className transform template unittest case.
|
379
|
+
`classnameFormat` default value `[classname]` you can customize it. Example: `[classname]-[hash]`
|
320
380
|
|
321
381
|
**Changes:-**
|
322
382
|
|
@@ -335,7 +395,7 @@ For an more information and reference, refer to `[details](https://zgit.csez.zoh
|
|
335
395
|
|
336
396
|
# 0.0.1-beta.172
|
337
397
|
|
338
|
-
We have renamed some options, For Our future features convenience.
|
398
|
+
We have renamed some options, For Our future features convenience.
|
339
399
|
We have given fallback support.
|
340
400
|
Deprecation Warnings:-
|
341
401
|
|
@@ -413,7 +473,7 @@ Features:-
|
|
413
473
|
|
414
474
|
# 0.0.1-beta.167.1
|
415
475
|
|
416
|
-
In this version we merged changes from [0.0.1-betaa.138.1](#0.0.1-betaa.138.1).
|
476
|
+
In this version we merged changes from [0.0.1-betaa.138.1](#0.0.1-betaa.138.1).
|
417
477
|
and with [0.0.1-beta.167](#0.0.1-beta.167) version changes.
|
418
478
|
|
419
479
|
# 0.0.1-beta.167
|
@@ -1321,3 +1381,7 @@ impact servise related changes:-
|
|
1321
1381
|
- prod string error fix
|
1322
1382
|
- efc build support
|
1323
1383
|
- single style tag support
|
1384
|
+
|
1385
|
+
```
|
1386
|
+
|
1387
|
+
```
|
package/bin/cli.js
CHANGED
@@ -6,7 +6,7 @@ const getOptions = require('../lib/utils/getOptions.js').default;
|
|
6
6
|
|
7
7
|
const { log } = require('../lib/utils/log.js');
|
8
8
|
const { getCliPath } = require('../lib/servers/getCliPath.js');
|
9
|
-
const { runPreProcess } = require('../
|
9
|
+
const { runPreProcess } = require('../lib/common/runPreProcess.js');
|
10
10
|
//initPreCommitHook();
|
11
11
|
|
12
12
|
const [, , option] = process.argv;
|
@@ -1,16 +1,21 @@
|
|
1
1
|
"use strict";
|
2
2
|
|
3
|
-
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.runPreProcess = runPreProcess;
|
4
7
|
|
5
|
-
|
6
|
-
existsSync
|
7
|
-
} = require('fs');
|
8
|
+
var _path = _interopRequireWildcard(require("path"));
|
8
9
|
|
9
|
-
|
10
|
-
spawn
|
11
|
-
} = require('child_process');
|
10
|
+
var _fs = require("fs");
|
12
11
|
|
13
|
-
|
12
|
+
var _child_process = require("child_process");
|
13
|
+
|
14
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
15
|
+
|
16
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
17
|
+
|
18
|
+
function runPreProcess({
|
14
19
|
options,
|
15
20
|
option,
|
16
21
|
nodemon,
|
@@ -19,17 +24,17 @@ exports.runPreProcess = function runPreProcess({
|
|
19
24
|
const {
|
20
25
|
preprocess
|
21
26
|
} = options;
|
22
|
-
const preprocessorPath = preprocess.runner ?
|
27
|
+
const preprocessorPath = preprocess.runner ? _path.default.join(process.cwd(), preprocess.runner) : '';
|
23
28
|
const preprocessCli = preprocess.stopNodemon ? 'node' : nodemon;
|
24
29
|
|
25
|
-
if (preprocessorPath && existsSync(preprocessorPath)) {
|
26
|
-
const preprocessorDirPath =
|
30
|
+
if (preprocessorPath && (0, _fs.existsSync)(preprocessorPath)) {
|
31
|
+
const preprocessorDirPath = (0, _path.dirname)(preprocessorPath);
|
27
32
|
const watchOptions = preprocessCli === nodemon ? ['--watch', preprocessorDirPath] : []; // eslint-disable-next-line default-case
|
28
33
|
|
29
34
|
switch (option) {
|
30
35
|
case 'start':
|
31
36
|
case 'docs':
|
32
|
-
spawn(preprocessCli, [preprocessorPath, ...watchOptions], {
|
37
|
+
(0, _child_process.spawn)(preprocessCli, [preprocessorPath, ...watchOptions], {
|
33
38
|
stdio: 'inherit',
|
34
39
|
cwd: preprocessorDirPath
|
35
40
|
}); // NOTE: it's ok if we not close this here
|
@@ -53,7 +58,7 @@ exports.runPreProcess = function runPreProcess({
|
|
53
58
|
{
|
54
59
|
const result = spawnSync(preprocessCli, [preprocessorPath, ...watchOptions], {
|
55
60
|
stdio: 'inherit',
|
56
|
-
cwd:
|
61
|
+
cwd: preprocessorDirPath
|
57
62
|
});
|
58
63
|
process.exit(result.status);
|
59
64
|
break;
|
@@ -63,4 +68,4 @@ exports.runPreProcess = function runPreProcess({
|
|
63
68
|
console.error(`preProcessor not exists ${preprocessorPath}`);
|
64
69
|
process.exit(0);
|
65
70
|
}
|
66
|
-
}
|
71
|
+
}
|
@@ -23,7 +23,8 @@ let {
|
|
23
23
|
folder,
|
24
24
|
publicPath,
|
25
25
|
cssHashSelectors,
|
26
|
-
classNamePrefix
|
26
|
+
classNamePrefix,
|
27
|
+
customClassNamePrefix
|
27
28
|
}
|
28
29
|
},
|
29
30
|
packageVersion
|
@@ -83,7 +84,7 @@ module.exports = {
|
|
83
84
|
loader: 'css-loader',
|
84
85
|
options: {
|
85
86
|
modules: {
|
86
|
-
getLocalIdent: (0, _cssClassNameGenerate.default)(cssUniqueness, cssHashSelectors, classNamePrefix)
|
87
|
+
getLocalIdent: (0, _cssClassNameGenerate.default)(cssUniqueness, cssHashSelectors, classNamePrefix, customClassNamePrefix)
|
87
88
|
}
|
88
89
|
}
|
89
90
|
}]
|
@@ -30,6 +30,7 @@ const {
|
|
30
30
|
cssVariableReplacementConfig,
|
31
31
|
selectorWeightConfig,
|
32
32
|
cssUniqueness,
|
33
|
+
customClassNamePrefix,
|
33
34
|
seperateCssModules,
|
34
35
|
changeRuntimeChunkChar,
|
35
36
|
// we are going to use this for fonts file name collide in issue in devmode
|
@@ -108,6 +109,7 @@ module.exports = {
|
|
108
109
|
mediaQueryHoverActiveString,
|
109
110
|
cssVariableReplacementConfig,
|
110
111
|
selectorWeightConfig,
|
112
|
+
customClassNamePrefix,
|
111
113
|
classNameBlob: '[local]',
|
112
114
|
cssUniqueness: false,
|
113
115
|
selectorReplace: null,
|
@@ -124,6 +126,7 @@ module.exports = {
|
|
124
126
|
selectorWeightConfig,
|
125
127
|
classNameBlob: null,
|
126
128
|
cssUniqueness,
|
129
|
+
customClassNamePrefix,
|
127
130
|
selectorReplace,
|
128
131
|
cssHashSelectors,
|
129
132
|
classNamePrefix,
|
@@ -20,6 +20,7 @@ const {
|
|
20
20
|
componentFolder,
|
21
21
|
enableChunkHash,
|
22
22
|
cssUniqueness,
|
23
|
+
customClassNamePrefix,
|
23
24
|
plugins,
|
24
25
|
exclude,
|
25
26
|
patterns,
|
@@ -86,6 +87,7 @@ module.exports = isSSTest => ({
|
|
86
87
|
selectorWeightConfig,
|
87
88
|
classNameBlob: false,
|
88
89
|
cssUniqueness,
|
90
|
+
customClassNamePrefix,
|
89
91
|
selectorReplace,
|
90
92
|
cssHashSelectors,
|
91
93
|
classNamePrefix,
|
@@ -19,6 +19,7 @@ const {
|
|
19
19
|
docs: {
|
20
20
|
componentFolder,
|
21
21
|
cssUniqueness,
|
22
|
+
customClassNamePrefix,
|
22
23
|
plugins,
|
23
24
|
exclude,
|
24
25
|
patterns,
|
@@ -85,6 +86,7 @@ module.exports = {
|
|
85
86
|
selectorWeightConfig,
|
86
87
|
classNameBlob: false,
|
87
88
|
cssUniqueness,
|
89
|
+
customClassNamePrefix,
|
88
90
|
selectorReplace: null,
|
89
91
|
cssHashSelectors,
|
90
92
|
classNamePrefix,
|
@@ -34,6 +34,7 @@ const {
|
|
34
34
|
cssVariableReplacementConfig,
|
35
35
|
selectorWeightConfig,
|
36
36
|
cssUniqueness,
|
37
|
+
customClassNamePrefix,
|
37
38
|
server: {
|
38
39
|
mode
|
39
40
|
},
|
@@ -161,6 +162,7 @@ module.exports = {
|
|
161
162
|
mediaQueryHoverActiveString,
|
162
163
|
classNameBlob: '[local]',
|
163
164
|
cssUniqueness: false,
|
165
|
+
customClassNamePrefix,
|
164
166
|
selectorReplace: null,
|
165
167
|
postCssPluginOrder
|
166
168
|
})
|
@@ -175,6 +177,7 @@ module.exports = {
|
|
175
177
|
selectorWeightConfig,
|
176
178
|
classNameBlob: false,
|
177
179
|
cssUniqueness,
|
180
|
+
customClassNamePrefix,
|
178
181
|
selectorReplace,
|
179
182
|
cssHashSelectors,
|
180
183
|
classNamePrefix,
|
@@ -44,7 +44,8 @@ const getCSSLoaders = optionsObj => {
|
|
44
44
|
selectorReplace,
|
45
45
|
cssHashSelectors,
|
46
46
|
classNamePrefix,
|
47
|
-
postCssPluginOrder
|
47
|
+
postCssPluginOrder,
|
48
|
+
customClassNamePrefix
|
48
49
|
} = optionsObj;
|
49
50
|
const {
|
50
51
|
devCssFileBountry
|
@@ -65,7 +66,7 @@ const getCSSLoaders = optionsObj => {
|
|
65
66
|
if (classNameBlob) {
|
66
67
|
cssLoaderOptions.modules.localIdentName = classNameBlob;
|
67
68
|
} else {
|
68
|
-
cssLoaderOptions.modules.getLocalIdent = (0, _cssClassNameGenerate.default)(cssUniqueness, cssHashSelectors, classNamePrefix, patterns);
|
69
|
+
cssLoaderOptions.modules.getLocalIdent = (0, _cssClassNameGenerate.default)(cssUniqueness, cssHashSelectors, classNamePrefix, customClassNamePrefix, patterns);
|
69
70
|
}
|
70
71
|
|
71
72
|
const pluginOrder = calculatePostCssPluginOrder(postCssPluginOrder, Object.keys(plugins).filter(x => plugins[x] === true)); // console.log('selector weight config : ', selectorWeightConfig);
|
package/lib/logger.js
CHANGED
@@ -5,8 +5,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
});
|
6
6
|
exports.errorLogger = errorLogger;
|
7
7
|
exports.messageLogger = messageLogger;
|
8
|
+
exports.verboseLogger = verboseLogger;
|
8
9
|
exports.warnLogger = warnLogger;
|
9
10
|
|
11
|
+
/* eslint-disable no-console */
|
10
12
|
function messageLogger(...args) {
|
11
13
|
console.log(...args);
|
12
14
|
}
|
@@ -17,4 +19,9 @@ function errorLogger(...args) {
|
|
17
19
|
|
18
20
|
function warnLogger(...args) {
|
19
21
|
console.warn(...args);
|
22
|
+
}
|
23
|
+
|
24
|
+
function verboseLogger(...args) {
|
25
|
+
// TODO: need to be remove when publish happens
|
26
|
+
process.env.VERBOSE === 'true' && console.log('\x1b[33m [verbose] \x1b[0m', ...args);
|
20
27
|
}
|
@@ -35,6 +35,8 @@ var _RtlCssPlugin = require("../plugins/RtlSplitPlugin/RtlCssPlugin");
|
|
35
35
|
|
36
36
|
var _configHtmlWebpackPlugins = require("./configHtmlWebpackPlugins");
|
37
37
|
|
38
|
+
var _StatsPlugin = _interopRequireDefault(require("../plugins/StatsPlugin"));
|
39
|
+
|
38
40
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
39
41
|
|
40
42
|
// eslint-disable-next-line no-unused-vars
|
@@ -88,6 +90,12 @@ const getProdPlugins = (options, publicPath = '') => {
|
|
88
90
|
templateFilePath,
|
89
91
|
localeAttr: efcLocaleAttr
|
90
92
|
} = options.efc;
|
93
|
+
const {
|
94
|
+
enable: enableStats,
|
95
|
+
options: statsOptions,
|
96
|
+
excludeKeys: statsOutputExcludeKeys,
|
97
|
+
fileName: statsFileName
|
98
|
+
} = options.stats;
|
91
99
|
const hasEFC = newOptionForEnableEFC || prevOptionForEnableEFC;
|
92
100
|
const hashTempalate = enableChunkHash ? '.[chunkhash:20]_' : '';
|
93
101
|
const cssLTRFileNameTempalte = `css/[name]${hashTempalate}${enableRTLSplit ? '.ltr' : ''}.css`;
|
@@ -227,9 +235,9 @@ const getProdPlugins = (options, publicPath = '') => {
|
|
227
235
|
if (bundleAnalyze) {
|
228
236
|
pluginsArr.push(new _webpackBundleAnalyzer.BundleAnalyzerPlugin({
|
229
237
|
analyzerMode: 'static',
|
230
|
-
generateStatsFile:
|
238
|
+
generateStatsFile: !enableStats,
|
231
239
|
openAnalyzer: false,
|
232
|
-
statsOptions: {
|
240
|
+
statsOptions: enableStats ? null : {
|
233
241
|
source: false,
|
234
242
|
normal: true,
|
235
243
|
chunks: false,
|
@@ -288,6 +296,11 @@ const getProdPlugins = (options, publicPath = '') => {
|
|
288
296
|
|
289
297
|
|
290
298
|
customAttributes.enable && pluginsArr.push(new _CustomAttributePlugin.CustomAttributePlugin(customAttributes));
|
299
|
+
enableStats && pluginsArr.push(new _StatsPlugin.default({
|
300
|
+
statsOptions,
|
301
|
+
statsOutputExcludeKeys,
|
302
|
+
statsFileName
|
303
|
+
}));
|
291
304
|
return pluginsArr;
|
292
305
|
};
|
293
306
|
|
@@ -0,0 +1,174 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
const fs = require('fs');
|
4
|
+
|
5
|
+
const path = require('path');
|
6
|
+
|
7
|
+
const {
|
8
|
+
Readable
|
9
|
+
} = require('stream');
|
10
|
+
|
11
|
+
const pluginName = 'stats-plugin';
|
12
|
+
const statsSchema = {
|
13
|
+
all: false,
|
14
|
+
children: false,
|
15
|
+
source: false,
|
16
|
+
assets: true,
|
17
|
+
chunks: true,
|
18
|
+
chunkGroups: true,
|
19
|
+
chunkOrigins: true,
|
20
|
+
chunkModules: true,
|
21
|
+
entrypoints: true,
|
22
|
+
modules: true,
|
23
|
+
moduleTrace: true,
|
24
|
+
outputPath: true,
|
25
|
+
performance: true,
|
26
|
+
reasons: true
|
27
|
+
};
|
28
|
+
|
29
|
+
class StatsPlugin {
|
30
|
+
constructor({
|
31
|
+
statsOptions = {},
|
32
|
+
statsOutputExcludeKeys = [],
|
33
|
+
statsFileName = 'stats.json'
|
34
|
+
}) {
|
35
|
+
this.excludeKeysInStat = statsOutputExcludeKeys;
|
36
|
+
this.statsOptions = Object.assign({}, statsSchema, statsOptions);
|
37
|
+
this.statsFileName = statsFileName;
|
38
|
+
}
|
39
|
+
|
40
|
+
apply(compiler) {
|
41
|
+
compiler.hooks.done.tap(pluginName, stats => {
|
42
|
+
const statsJson = stats.toJson(this.statsOptions);
|
43
|
+
this.emitStats(statsJson);
|
44
|
+
});
|
45
|
+
}
|
46
|
+
|
47
|
+
transform(statsJson) {
|
48
|
+
return Object.keys(statsJson).reduce((acc, cur) => {
|
49
|
+
if (this.excludeKeysInStat.includes(cur)) {
|
50
|
+
return acc;
|
51
|
+
}
|
52
|
+
|
53
|
+
acc[cur] = statsJson[cur];
|
54
|
+
return acc;
|
55
|
+
}, {});
|
56
|
+
}
|
57
|
+
|
58
|
+
emitStats(statsJson) {
|
59
|
+
const {
|
60
|
+
outputPath
|
61
|
+
} = statsJson;
|
62
|
+
const transformedStatsJson = this.transform(statsJson);
|
63
|
+
const stringifiedJson = typeof statsJson === 'object' ? JSON.stringify(transformedStatsJson) : transformedStatsJson;
|
64
|
+
fs.writeFile(path.join(outputPath, this.statsFileName), stringifiedJson, err => {
|
65
|
+
if (err) {
|
66
|
+
throw err;
|
67
|
+
}
|
68
|
+
});
|
69
|
+
}
|
70
|
+
|
71
|
+
} // class StatsSerializeStream extends Readable {
|
72
|
+
// constructor(stats) {
|
73
|
+
// super();
|
74
|
+
// this._indentLevel = 0;
|
75
|
+
// this._stringifier = this._stringify(stats);
|
76
|
+
// }
|
77
|
+
// get _indent() {
|
78
|
+
// return ' '.repeat(this._indentLevel);
|
79
|
+
// }
|
80
|
+
// _read() {
|
81
|
+
// let readMore = true;
|
82
|
+
// while (readMore) {
|
83
|
+
// const { value, done } = this._stringifier.next();
|
84
|
+
// if (done) {
|
85
|
+
// this.push(null);
|
86
|
+
// readMore = false;
|
87
|
+
// } else {
|
88
|
+
// readMore = this.push(value);
|
89
|
+
// }
|
90
|
+
// }
|
91
|
+
// }
|
92
|
+
// *_stringify(obj) {
|
93
|
+
// if (
|
94
|
+
// typeof obj === 'string' ||
|
95
|
+
// typeof obj === 'number' ||
|
96
|
+
// typeof obj === 'boolean' ||
|
97
|
+
// obj === null
|
98
|
+
// ) {
|
99
|
+
// yield JSON.stringify(obj);
|
100
|
+
// } else if (Array.isArray(obj)) {
|
101
|
+
// yield '[';
|
102
|
+
// this._indentLevel++;
|
103
|
+
// let isFirst = true;
|
104
|
+
// for (let item of obj) {
|
105
|
+
// if (item === undefined) {
|
106
|
+
// item = null;
|
107
|
+
// }
|
108
|
+
// yield `${isFirst ? '' : ','}\n${this._indent}`;
|
109
|
+
// yield* this._stringify(item);
|
110
|
+
// isFirst = false;
|
111
|
+
// }
|
112
|
+
// this._indentLevel--;
|
113
|
+
// yield obj.length ? `\n${this._indent}]` : ']';
|
114
|
+
// } else {
|
115
|
+
// yield '{';
|
116
|
+
// this._indentLevel++;
|
117
|
+
// let isFirst = true;
|
118
|
+
// const entries = Object.entries(obj);
|
119
|
+
// for (const [itemKey, itemValue] of entries) {
|
120
|
+
// if (itemValue === undefined) {
|
121
|
+
// continue;
|
122
|
+
// }
|
123
|
+
// yield `${isFirst ? '' : ','}\n${this._indent}${JSON.stringify(
|
124
|
+
// itemKey
|
125
|
+
// )}: `;
|
126
|
+
// yield* this._stringify(itemValue);
|
127
|
+
// isFirst = false;
|
128
|
+
// }
|
129
|
+
// this._indentLevel--;
|
130
|
+
// yield entries.length ? `\n${this._indent}}` : '}';
|
131
|
+
// }
|
132
|
+
// }
|
133
|
+
// }
|
134
|
+
// function writeStats(stats, filepath) {
|
135
|
+
// return new Promise((resolve, reject) => {
|
136
|
+
// new StatsSerializeStream(stats)
|
137
|
+
// .on('end', resolve)
|
138
|
+
// .on('error', reject)
|
139
|
+
// .pipe(fs.createWriteStream(filepath));
|
140
|
+
// });
|
141
|
+
// }
|
142
|
+
// class StatsStremPlugin {
|
143
|
+
// constructor({ statsOptions = {}, statsOutputExcludeKeys = [] }) {
|
144
|
+
// this.excludeKeysInStat = statsOutputExcludeKeys;
|
145
|
+
// this.statsOptions = Object.assign({}, statsSchema, statsOptions);
|
146
|
+
// }
|
147
|
+
// apply(compiler) {
|
148
|
+
// compiler.hooks.done.tap(pluginName, stats => {
|
149
|
+
// const statsJson = stats.toJson(this.statsOptions);
|
150
|
+
// this.emitStats(statsJson);
|
151
|
+
// });
|
152
|
+
// }
|
153
|
+
// transform(statsJson) {
|
154
|
+
// return Object.keys(statsJson).reduce((acc, cur) => {
|
155
|
+
// if (this.excludeKeysInStat.includes(cur)) {
|
156
|
+
// return acc;
|
157
|
+
// }
|
158
|
+
// acc[cur] = statsJson[cur];
|
159
|
+
// return acc;
|
160
|
+
// }, {});
|
161
|
+
// }
|
162
|
+
// emitStats(statsJson) {
|
163
|
+
// const { outputPath } = statsJson;
|
164
|
+
// const transformedStatsJson = this.transform(statsJson);
|
165
|
+
// // const stringifiedJson =
|
166
|
+
// // typeof statsJson === 'object'
|
167
|
+
// // ? JSON.stringify(transformedStatsJson)
|
168
|
+
// // : transformedStatsJson;
|
169
|
+
// writeStats(transformedStatsJson, outputPath + 'jos-stats.json');
|
170
|
+
// }
|
171
|
+
// }
|
172
|
+
|
173
|
+
|
174
|
+
module.exports = StatsPlugin;
|
package/lib/schemas/index.js
CHANGED
@@ -15,7 +15,6 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
15
15
|
|
16
16
|
// TODO move deprecated options to separate file and manage seperately
|
17
17
|
var _default = {
|
18
|
-
cliRootPath: null,
|
19
18
|
unstableDepsInverse: {
|
20
19
|
value: false,
|
21
20
|
cli: 'unstable_deps_inverse'
|
@@ -130,6 +129,7 @@ var _default = {
|
|
130
129
|
value: '@zohodesk/client_packages_group',
|
131
130
|
cli: 'module_resolve_path'
|
132
131
|
},
|
132
|
+
customClassNamePrefix: [],
|
133
133
|
// this option only for impact testing
|
134
134
|
devCssFileBountry: {
|
135
135
|
value: '',
|
@@ -357,6 +357,7 @@ var _default = {
|
|
357
357
|
hover: 'all and (min--moz-device-pixel-ratio:0) and (hover: hover), (hover: hover)',
|
358
358
|
none: '(hover: none)'
|
359
359
|
},
|
360
|
+
customClassNamePrefix: [],
|
360
361
|
componentFolder: 'src',
|
361
362
|
cssUniqueness: {
|
362
363
|
value: true,
|
@@ -722,6 +723,14 @@ var _default = {
|
|
722
723
|
cli: 'module_mode'
|
723
724
|
},
|
724
725
|
disableES5Transpile: true
|
726
|
+
},
|
727
|
+
stats: {
|
728
|
+
enable: {
|
729
|
+
value: false,
|
730
|
+
cli: 'enable_stats'
|
731
|
+
},
|
732
|
+
fileName: undefined,
|
733
|
+
options: undefined
|
725
734
|
}
|
726
735
|
};
|
727
736
|
exports.default = _default;
|
@@ -38,14 +38,35 @@ const isSelectorPackage = (resourcePath, packages) => {
|
|
38
38
|
return isValid;
|
39
39
|
};
|
40
40
|
|
41
|
+
function patternBasedClass({
|
42
|
+
customClassNamePrefix,
|
43
|
+
context,
|
44
|
+
relativePath,
|
45
|
+
localName
|
46
|
+
}) {
|
47
|
+
let newName = null;
|
48
|
+
customClassNamePrefix.forEach(obj => {
|
49
|
+
if (obj.enable) {
|
50
|
+
if (obj.patterns && obj.prefix && (0, _fileHandling.isFileNameMatchingPluginPattern)({
|
51
|
+
filename: context.resourcePath,
|
52
|
+
filterArr: obj.patterns
|
53
|
+
})) {
|
54
|
+
const h = (0, _getHash.default)(`${relativePath}-${localName}`, 10);
|
55
|
+
newName = `${obj.prefix}${h}`;
|
56
|
+
}
|
57
|
+
}
|
58
|
+
});
|
59
|
+
return newName;
|
60
|
+
}
|
61
|
+
|
41
62
|
var _default = (unique = true, {
|
42
63
|
filenames,
|
43
64
|
packages
|
44
|
-
}, classNamePrefix, patterns) => (context, localIdentName, localName) => {
|
65
|
+
}, classNamePrefix, customClassNamePrefix, patterns) => (context, localIdentName, localName) => {
|
45
66
|
// console.log(patterns, context.resourcePath);
|
46
|
-
// NOTE: in build
|
67
|
+
// NOTE: in build machine we use date as folder path.
|
47
68
|
// So every time we create new build there is path will alway different
|
48
|
-
// in order to
|
69
|
+
// in order to minimize that problem we try in relative path;
|
49
70
|
// console.log('context.resourcePath', context.resourcePath, context);
|
50
71
|
// let contextResourcePath = context.resourcePath;
|
51
72
|
const filePaths = context.resourcePath.split(_path.default.sep);
|
@@ -53,7 +74,8 @@ var _default = (unique = true, {
|
|
53
74
|
const [fileNameWithoutExt] = fileName.split('.');
|
54
75
|
const cleanFileName = fileNameWithoutExt.replace(/-/g, '_').toLowerCase();
|
55
76
|
|
56
|
-
const relativePath = _path.default.relative(context.rootContext, context.resourcePath);
|
77
|
+
const relativePath = _path.default.relative(context.rootContext, context.resourcePath); // console.log('customClassNamePrefix', customClassNamePrefix);
|
78
|
+
|
57
79
|
/*
|
58
80
|
input :
|
59
81
|
context.resourcePath : 'D:/MyWork/..../desk_client_app/supportapp/src/components/Avatar/Avatar.module.css,
|
@@ -86,7 +108,18 @@ var _default = (unique = true, {
|
|
86
108
|
if (unique) {
|
87
109
|
const h = (0, _getHash.default)(`${relativePath}-${localName}`, 10);
|
88
110
|
return `${classNamePrefix}${h}`;
|
89
|
-
}
|
111
|
+
}
|
112
|
+
|
113
|
+
const patternClass = patternBasedClass({
|
114
|
+
customClassNamePrefix,
|
115
|
+
context,
|
116
|
+
relativePath,
|
117
|
+
localName
|
118
|
+
});
|
119
|
+
|
120
|
+
if (patternClass) {
|
121
|
+
return patternClass;
|
122
|
+
} //css file has case sensitive selector issue so can't toLowerCase
|
90
123
|
//let local = localName.toLowerCase()
|
91
124
|
|
92
125
|
|