@zohodesk/react-cli 1.0.3 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. package/README.md +26 -1
  2. package/bin/cli.js +18 -4
  3. package/docs/ComposeMinification.md +13 -0
  4. package/docs/ReactLive.md +10 -0
  5. package/docs/patternFiltering.md +57 -0
  6. package/lib/common/buildEs.js +12 -0
  7. package/lib/configs/webpack.dev.config.js +3 -0
  8. package/lib/configs/webpack.docs.config.js +8 -1
  9. package/lib/configs/webpack.impact.config.js +2 -0
  10. package/lib/configs/webpack.prod.config.js +3 -0
  11. package/lib/loaderUtils/getCSSLoaders.js +77 -46
  12. package/lib/loaderUtils/tests/windowsModification.test.js +10 -0
  13. package/lib/loaderUtils/windowsModification.js +6 -1
  14. package/lib/loaders/composeLoader.js +172 -0
  15. package/lib/loaders/docsLoader.js +15 -7
  16. package/lib/loaders/reactLiveConvertor.js +105 -0
  17. package/lib/pluginUtils/getDevPlugins.js +10 -3
  18. package/lib/pluginUtils/getProdPlugins.js +8 -3
  19. package/lib/pluginUtils/getUMDCSSPlugins.js +1 -1
  20. package/lib/pluginUtils/getUMDComponentPlugins.js +1 -1
  21. package/lib/plugins/{UglifyCSSPlugin.js → MinifyPlugin.js} +3 -3
  22. package/lib/plugins/SelectorPlugin.js +63 -40
  23. package/lib/plugins/VariableConversionCollector.js +40 -97
  24. package/lib/plugins/index.js +7 -7
  25. package/lib/plugins/utils/classHandling.js +35 -0
  26. package/lib/plugins/utils/fileHandling.js +107 -0
  27. package/lib/plugins/utils/tests/fileHandling.test.js +30 -0
  28. package/lib/plugins/variableConvertorUtils.js +131 -0
  29. package/lib/postcss-plugins/EmptyPlugin.js +8 -0
  30. package/lib/postcss-plugins/ExcludePlugin.js +1 -1
  31. package/lib/postcss-plugins/ValueReplacer.js +5 -14
  32. package/lib/postcss-plugins/variableModificationPlugin/index.js +2 -19
  33. package/lib/schemas/index.js +75 -4
  34. package/lib/servers/server.js +2 -2
  35. package/lib/utils/cssClassNameGenerate.js +34 -9
  36. package/lib/utils/getOptions.js +45 -0
  37. package/lib/utils/selectorReplacer.js +47 -0
  38. package/lib/utils/variableConverter.js +89 -0
  39. package/{package-lock.json → npm-shrinkwrap.json} +79 -74
  40. package/package.json +3 -1
  41. package/lib/plugins/composeCommonPlugin.js +0 -30
  42. package/lib/postcss-plugins/variableModifier.js +0 -210
package/README.md CHANGED
@@ -44,6 +44,30 @@ Now to run app
44
44
 
45
45
  # Change Logs
46
46
 
47
+ # 1.1.1
48
+
49
+ **Issue Fix**
50
+ - docs component name incorrect in windows, when using --enableReactLive issue fixed.
51
+
52
+ **Feature Update**
53
+ - Support for desk-library to use Selector Replace plugin using individual script. To use `react-cli selectorReplacer [source] [target]`
54
+
55
+ # 1.1.0
56
+
57
+ **Feature Update**
58
+ - Support for desk-library to use variable convertion plugin using individual script. To use `react-cli variableConverter [source] [target]`
59
+ - pattern filter changes, new filter system instead of exclude to include or exclude files for plugins.
60
+ For more info please refer to :
61
+ [details](https://zgit.csez.zohocorpin.com/zohodesk/react-cli/-/blob/2.0.0/docs/patternFiltering.md)
62
+ - React Live feature implemented for Docs.
63
+ [details](https://zgit.csez.zohocorpin.com/zohodesk/react-cli/-/blob/2.0.0/docs/ReactLive.md)
64
+
65
+ # 1.0.3-beta.1
66
+
67
+ **Issue Fix**
68
+ - nock api not working issue fixed. This error throwing in @zohodesk/react-cli@1.0.2 version. but working in older versions ( 0.0.1-beta.178 )
69
+
70
+
47
71
  # 1.0.3
48
72
 
49
73
  **Feature Update**
@@ -54,10 +78,11 @@ Now to run app
54
78
  - @zohodesk/client_packages_group@**1.0.1** ==> @zohodesk/client_packages_group@**1.0.2**
55
79
 
56
80
 
81
+
57
82
  # 1.0.2
58
83
 
59
84
  **Feature Update**
60
- - Selector replace plugin made custom postcss-plugin with update to code that was unpublished in package.
85
+ - Selector replace plugin made as a custom postcss-plugin with update to code that was unpublished in package.
61
86
 
62
87
  # 1.0.1
63
88
 
package/bin/cli.js CHANGED
@@ -50,7 +50,7 @@ if (preprocesserPath && existsSync(preprocesserPath)) {
50
50
  case 'docs':
51
51
  spawn(preprocessCli, [preprocesserPath], {
52
52
  stdio: 'inherit',
53
- cwd: preprocesserPath.slice(0, preprocesserPath.lastIndexOf('/') + 1)
53
+ cwd: path.parse(preprocesserPath).dir
54
54
  });
55
55
  // NOTE: it's ok if we not close this here
56
56
  // Because when node server stops this program willbe closed So this nodemon will be killed as well
@@ -116,6 +116,22 @@ switch (option) {
116
116
  { stdio: 'inherit' }
117
117
  );
118
118
 
119
+ process.exit(result.status);
120
+ break;
121
+ case 'variableConverter':
122
+ result = spawnSync(
123
+ 'node',
124
+ [require.resolve('../lib/utils/variableConverter')].concat(args),
125
+ { stdio: 'inherit' }
126
+ );
127
+ process.exit(result.status);
128
+ break;
129
+ case 'selectorReplacer':
130
+ result = spawnSync(
131
+ 'node',
132
+ [require.resolve('../lib/utils/selectorReplacer.js')].concat(args),
133
+ { stdio: 'inherit' }
134
+ );
119
135
  process.exit(result.status);
120
136
  break;
121
137
  case 'valuereplacer':
@@ -215,9 +231,7 @@ switch (option) {
215
231
  case 'devbuild':
216
232
  result = spawnSync(
217
233
  'node',
218
- [
219
- require.resolve('../lib/servers/devBuild')
220
- ].concat(args),
234
+ [require.resolve('../lib/servers/devBuild')].concat(args),
221
235
  // [require.resolve('../lib/servers/staticServer'), '--expose-http2'].concat(args),
222
236
  { stdio: 'inherit' }
223
237
  );
@@ -0,0 +1,13 @@
1
+ # Compose Minification
2
+
3
+ We use this plugin to extract all the common attributes ( margin, padding... ) supported and write them in respective common files( margin.css, padding.css... ) These are further reference to the classname instead of a line of code by composing and adding classnames for the same.
4
+
5
+
6
+ # Feature :
7
+
8
+ * We can enable this plugin by representing the value of ` react-cli > app > plugins > composeMinification ` to `true`.
9
+ * The creation of `margin.css`, `padding.css`, `position.css` and so on will be done initially by a manual script for the application.
10
+ * Further the `composeMinification` plugin converts the `props` of common attributes under check into `compose` and `values` into `compose format` ( m10 from `../margin.css`)
11
+ * On runtime the conversion takes place and classnames for the properties (`margin`, `padding`, so on...) are added with references to respective files and styles are applied.
12
+
13
+
@@ -0,0 +1,10 @@
1
+
2
+ ----> ReactLive <----
3
+
4
+ 1. React Live is a live playground for reactjs (For now we have implemented in our docs)
5
+ 2. So, for this we are using reactLiveConverter.js (src/loaders) to convert the file format.
6
+ 3. We can enable/disable this feature by `npm run docs --enableReactLive=true/false` default value will be `true`.
7
+ 4. Also we can enable/disable this feature by adding `enableReactLive` key inside the package.json under the `docs`.
8
+
9
+ # v1.1.0 update:
10
+ * ReactLive feature implemented.
@@ -0,0 +1,57 @@
1
+ # Pattern filtering
2
+
3
+ As replacement for exclude we now have patterns in place of exclude to include or exclude a file based on its name in package.json.
4
+
5
+
6
+ # Example for patterns :
7
+
8
+ **Old System** :
9
+ To exclude `node_modules` folder from convertion for the `cssVariableReplacement` plugin, we used to have :
10
+
11
+ `react-cli > app > exclude > cssVariableReplacement` as ['node_modules'] in `package.json`
12
+
13
+ Example :
14
+
15
+ "exclude": {
16
+ "cssVariableReplacement": [
17
+ "node_modules"
18
+ ]
19
+ },
20
+
21
+ **New System** :
22
+
23
+ To include all files for convertion for the `valueReplacer` plugin, we now have :
24
+
25
+ `react-cli > app > patterns > valueReplacer` as ['*'] in `package.json`
26
+
27
+ To include `src` files for convertion for the `cssVariableReplacement` plugin, we now have :
28
+
29
+ `react-cli > app > patterns > hoverActive` as ['src'] in `package.json`
30
+
31
+ To exclude `node_modules` files for convertion for the `hoverActive` plugin, we now have :
32
+
33
+ `react-cli > app > patterns > cssVariableReplacement` as ['!node_modules'] in `package.json`
34
+ Here the `!` denotes that the folder structure/file is not to be converted.
35
+
36
+ Example :
37
+
38
+ "patterns": {
39
+ "valueReplacer": [
40
+ "*"
41
+ ],
42
+ "hoverActive": [
43
+ "src"
44
+ ],
45
+ "cssVariableReplacement": [
46
+ "!node_modules"
47
+ ],
48
+ },
49
+
50
+ Note :
51
+ `patterns` also added support for cssUniqueness to be applied to selective files.
52
+
53
+ "patterns" : {
54
+ "cssUniqueness": [
55
+ "*"
56
+ ],
57
+ }
@@ -0,0 +1,12 @@
1
+ // result = spawnSync(
2
+ // babel,
3
+ // [
4
+ // 'src',
5
+ // '--out-dir',
6
+ // 'es',
7
+ // `--presets=${require.resolve('../lib/babel/es-plugins-presets.js')}`,
8
+ // '--copy-files'
9
+ // ].concat(args),
10
+ // { stdio: 'inherit' }
11
+ // );
12
+ "use strict";
@@ -25,6 +25,7 @@ const {
25
25
  outputFolder,
26
26
  plugins,
27
27
  exclude,
28
+ patterns,
28
29
  mediaQueryHoverActiveString,
29
30
  cssVariableReplacementConfig,
30
31
  selectorWeightConfig,
@@ -102,6 +103,7 @@ module.exports = {
102
103
  use: (0, _loaderUtils.getCSSLoaders)({
103
104
  plugins,
104
105
  exclude,
106
+ patterns,
105
107
  mediaQueryHoverActiveString,
106
108
  cssVariableReplacementConfig,
107
109
  selectorWeightConfig,
@@ -114,6 +116,7 @@ module.exports = {
114
116
  use: (0, _loaderUtils.getCSSLoaders)({
115
117
  plugins,
116
118
  exclude,
119
+ patterns,
117
120
  mediaQueryHoverActiveString,
118
121
  cssVariableReplacementConfig,
119
122
  selectorWeightConfig,
@@ -22,11 +22,13 @@ const {
22
22
  cssUniqueness,
23
23
  plugins,
24
24
  exclude,
25
+ patterns,
25
26
  mediaQueryHoverActiveString,
26
27
  cssVariableReplacementConfig,
27
28
  selectorWeightConfig,
28
29
  cssHashSelectors,
29
- classNamePrefix
30
+ classNamePrefix,
31
+ selectorReplace
30
32
  },
31
33
  app: {
32
34
  folder
@@ -77,6 +79,7 @@ module.exports = isSSTest => ({
77
79
  use: (0, _loaderUtils.getCSSLoaders)({
78
80
  plugins,
79
81
  exclude,
82
+ patterns,
80
83
  mediaQueryHoverActiveString,
81
84
  cssVariableReplacementConfig,
82
85
  selectorWeightConfig,
@@ -95,6 +98,10 @@ module.exports = isSSTest => ({
95
98
  interpolate: 'require'
96
99
  }
97
100
  }
101
+ }, {
102
+ test: /\.mjs$/,
103
+ include: /node_modules/,
104
+ type: 'javascript/auto'
98
105
  }, {
99
106
  test: /\.tmpl$/,
100
107
  use: [{
@@ -21,6 +21,7 @@ const {
21
21
  cssUniqueness,
22
22
  plugins,
23
23
  exclude,
24
+ patterns,
24
25
  mediaQueryHoverActiveString,
25
26
  cssVariableReplacementConfig,
26
27
  selectorWeightConfig,
@@ -77,6 +78,7 @@ module.exports = {
77
78
  use: (0, _loaderUtils.getCSSLoaders)({
78
79
  plugins,
79
80
  exclude,
81
+ patterns,
80
82
  mediaQueryHoverActiveString,
81
83
  cssVariableReplacementConfig,
82
84
  selectorWeightConfig,
@@ -29,6 +29,7 @@ const {
29
29
  server,
30
30
  plugins,
31
31
  exclude,
32
+ patterns,
32
33
  mediaQueryHoverActiveString,
33
34
  cssVariableReplacementConfig,
34
35
  selectorWeightConfig,
@@ -153,6 +154,7 @@ module.exports = {
153
154
  use: (0, _loaderUtils.getCSSLoaders)({
154
155
  plugins,
155
156
  exclude,
157
+ patterns,
156
158
  cssVariableReplacementConfig,
157
159
  selectorWeightConfig,
158
160
  mediaQueryHoverActiveString,
@@ -165,6 +167,7 @@ module.exports = {
165
167
  use: (0, _loaderUtils.getCSSLoaders)({
166
168
  plugins,
167
169
  exclude,
170
+ patterns,
168
171
  mediaQueryHoverActiveString,
169
172
  cssVariableReplacementConfig,
170
173
  selectorWeightConfig,
@@ -11,7 +11,7 @@ var _cssClassNameGenerate = _interopRequireDefault(require("../utils/cssClassNam
11
11
 
12
12
  var _utils = require("../utils");
13
13
 
14
- var _windowsModification = require("./windowsModification");
14
+ var _fileHandling = require("../plugins/utils/fileHandling");
15
15
 
16
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
17
 
@@ -19,21 +19,10 @@ const fs = require('fs');
19
19
 
20
20
  const options = (0, _utils.getOptions)();
21
21
 
22
- function excludeEmptyCheckPlugin({
23
- enable,
24
- ignore,
25
- plugins
26
- }) {
27
- return enable ? ignore.length === 0 ? plugins : [require('../postcss-plugins/ExcludePlugin')({
28
- ignore,
29
- plugins
30
- })] : [];
31
- }
32
-
33
22
  const getCSSLoaders = optionsObj => {
34
23
  const {
35
24
  plugins,
36
- exclude,
25
+ patterns,
37
26
  mediaQueryHoverActiveString,
38
27
  cssVariableReplacementConfig,
39
28
  classNameBlob,
@@ -51,10 +40,6 @@ const getCSSLoaders = optionsObj => {
51
40
  const {
52
41
  cssSelectorZipPath
53
42
  } = options.impactService;
54
- const rtlExcludeLocal = (0, _windowsModification.windowsModification)(exclude.rtl);
55
- const hoverActiveExcludeLocal = (0, _windowsModification.windowsModification)(exclude.hoverActive);
56
- const combinerMediaQueryExcludeLocal = (0, _windowsModification.windowsModification)(exclude.combinerMediaQuery);
57
- const cssVariableReplacementExcludeLocal = (0, _windowsModification.windowsModification)(exclude.cssVariableReplacement);
58
43
  const cssLoaderOptions = {
59
44
  // importLoaders: hasRTL||hoverActive ? 1 : 0,
60
45
  importLoaders: 1,
@@ -65,34 +50,19 @@ const getCSSLoaders = optionsObj => {
65
50
  if (classNameBlob) {
66
51
  cssLoaderOptions.modules.localIdentName = classNameBlob;
67
52
  } else {
68
- cssLoaderOptions.modules.getLocalIdent = (0, _cssClassNameGenerate.default)(cssUniqueness, cssHashSelectors, classNamePrefix);
69
- }
70
-
71
- const postcssPlugins = [valueReplacer && require('../postcss-plugins/ValueReplacer')(valueReplacer), selectorReplace && require('../postcss-plugins/SelectorReplace')(selectorReplace), ...excludeEmptyCheckPlugin({
72
- enable: plugins.hasRTL,
73
- ignore: rtlExcludeLocal,
74
- plugins: [require('@zohodesk/postcss-rtl')({
75
- addPrefixToSelector: function addPrefixToSelector(selector, prefix) {
76
- if (prefix === '[dir]') {
77
- return selector;
78
- }
79
-
80
- return `${prefix} ${selector}`; // Make selectors like [dir=rtl] > .selector
53
+ cssLoaderOptions.modules.getLocalIdent = (0, _cssClassNameGenerate.default)(cssUniqueness, cssHashSelectors, classNamePrefix, patterns);
54
+ } // console.log('selector weight config : ', selectorWeightConfig);
55
+
56
+
57
+ let postcssPlugins = [plugins.valueReplacer && require('../postcss-plugins/ValueReplacer')(valueReplacer), plugins.selectorReplace && require('../postcss-plugins/SelectorReplace')(selectorReplace), plugins.hasRTL && require('@zohodesk/postcss-rtl')({
58
+ addPrefixToSelector: function addPrefixToSelector(selector, prefix) {
59
+ if (prefix === '[dir]') {
60
+ return selector;
81
61
  }
82
- })]
83
- }), ...excludeEmptyCheckPlugin({
84
- enable: plugins.combinerMediaQuery,
85
- ignore: combinerMediaQueryExcludeLocal,
86
- plugins: [require('postcss-combine-media-query')]
87
- }), ...excludeEmptyCheckPlugin({
88
- enable: plugins.hoverActive,
89
- ignore: hoverActiveExcludeLocal,
90
- plugins: [require('../postcss-plugins/hoverActivePlugin')(mediaQueryHoverActiveString)]
91
- }), ...excludeEmptyCheckPlugin({
92
- enable: plugins.cssVariableReplacement,
93
- ignore: cssVariableReplacementExcludeLocal,
94
- plugins: [fs.existsSync(cssVariableReplacementConfig) && require('../postcss-plugins/variableModificationPlugin/index').plugin(cssVariableReplacementConfig)]
95
- })].filter(Boolean);
62
+
63
+ return `${prefix} ${selector}`; // Make selectors like [dir=rtl] > .selector
64
+ }
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)].filter(Boolean);
96
66
  return [cssSelectorZipPath && {
97
67
  loader: require.resolve('../loaders/selectorMappingLoader')
98
68
  }, {
@@ -112,10 +82,71 @@ const getCSSLoaders = optionsObj => {
112
82
  loader: 'postcss-loader',
113
83
  options: {
114
84
  ident: 'postcss',
115
- plugins: function () {
116
- return postcssPlugins;
85
+ plugins: function (params) {
86
+ // console.log('check here : ', params.resourcePath);
87
+ // getCSSLoaders for all postcss filtering
88
+
89
+ /*
90
+ input :
91
+ params.resourcePath : 'D:/MyWork/..../desk_client_app/supportapp/src/components/Avatar/Avatar.module.css,
92
+ patterns : [
93
+ // include all files
94
+ "valueReplacer": [
95
+ "*"
96
+ ],
97
+ // include all files
98
+ "selectorReplace": [
99
+ "*"
100
+ ],
101
+ // include src folder, include deskapp folder, exclude node modules
102
+ "hoverActive": [
103
+ "src",
104
+ "deskapp",
105
+ "!node_modules"
106
+ ],
107
+ // include src folder, include deskapp folder, exclude node modules
108
+ "combinerMediaQuery": [
109
+ "src",
110
+ "deskapp",
111
+ "!node_modules"
112
+ ],
113
+ // include src folder, include deskapp folder, exclude node modules
114
+ "hasRTL": [
115
+ "src",
116
+ "deskapp",
117
+ "!node_modules"
118
+ ],
119
+ // include src folder, include deskapp folder, exclude node modules
120
+ "cssVariableReplacement": [
121
+ "src",
122
+ "deskapp",
123
+ "!node_modules"
124
+ ],
125
+ // include src folder, include deskapp folder, exclude node modules
126
+ "selectorWeight": [
127
+ "src",
128
+ "deskapp",
129
+ "!node_modules"
130
+ ],
131
+ // include all files
132
+ "cssUniqueness": [
133
+ "*"
134
+ ]
135
+ ],
136
+
137
+ [ postcssPlugins that are implemented ]
138
+ */
139
+ postcssPlugins = (0, _fileHandling.isFileNameMatchingPattern)({
140
+ filename: params.resourcePath,
141
+ filterObject: patterns,
142
+ plugins: postcssPlugins
143
+ }); // postcssPlugins that are allowed
144
+
145
+ return postcssPlugins.length > 0 ? postcssPlugins : [require('../postcss-plugins/EmptyPlugin')()];
117
146
  }
118
147
  }
148
+ } : null, plugins.composeMinification ? {
149
+ loader: require.resolve('../loaders/composeLoader')
119
150
  } : null].filter(Boolean);
120
151
  };
121
152
 
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ const {
4
+ windowsModificationFile
5
+ } = require('../windowsModification');
6
+
7
+ const tests = ['D:\\MyWork\\React Build\\desk_client_app\\jsapps\\supportapp\\src\\components\\Accessibility\\Accessibility.module.css', 'D:/MyWork/React Build/desk_client_app/jsapps/supportapp/src/components/Accessibility/Accessibility.module.css', 'desk_client_app\\jsapps\\supportapp\\src\\components\\Accessibility\\Accessibility.module.css', 'desk_client_app/jsapps/supportapp/src/components/Accessibility/Accessibility.module.css', 'src\\components\\Accessibility\\Accessibility.module.css', 'src/components/Accessibility/Accessibility.module.css', 'Accessibility.module.css', ''];
8
+ tests.forEach(test => {
9
+ console.log(windowsModificationFile(test));
10
+ });
@@ -4,8 +4,13 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.windowsModification = windowsModification;
7
+ exports.windowsModificationFile = windowsModificationFile;
7
8
  const isWin = process.platform === 'win32';
8
9
 
9
10
  function windowsModification(array) {
10
11
  return isWin ? array && Array.isArray(array) && array.map(r => r.replace(/\//g, '\\')) : array;
11
- }
12
+ }
13
+
14
+ function windowsModificationFile(filename) {
15
+ return isWin ? filename.replace(/\//g, '\\') : filename;
16
+ } // module.exports = { windowsModification, windowsModificationFile };
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+
3
+ var _path = _interopRequireDefault(require("path"));
4
+
5
+ var _postcss = _interopRequireDefault(require("postcss"));
6
+
7
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
+
9
+ const supportedProps = ['margin-top', 'margin-bottom', 'margin-left', 'margin-right', // 'margin',
10
+ 'padding-top', 'padding-bottom', 'padding-left', 'padding-right', // 'padding',
11
+ 'top', 'bottom', 'left', 'right', 'height', 'width', 'min-height', 'min-width', 'max-height', 'max-width'];
12
+ const renameProps = {
13
+ 'margin-top': {
14
+ pos: 'mt',
15
+ neg: 'mt_'
16
+ },
17
+ 'margin-bottom': {
18
+ pos: 'mb',
19
+ neg: 'mb_'
20
+ },
21
+ 'margin-left': {
22
+ pos: 'ml',
23
+ neg: 'ml_'
24
+ },
25
+ 'margin-right': {
26
+ pos: 'mr',
27
+ neg: 'mr_'
28
+ },
29
+ margin: {
30
+ pos: 'm',
31
+ neg: 'm_'
32
+ },
33
+ 'padding-top': {
34
+ pos: 'pt',
35
+ neg: 'pt_'
36
+ },
37
+ 'padding-bottom': {
38
+ pos: 'pb',
39
+ neg: 'pb_'
40
+ },
41
+ 'padding-left': {
42
+ pos: 'pl',
43
+ neg: 'pl_'
44
+ },
45
+ 'padding-right': {
46
+ pos: 'pr',
47
+ neg: 'pr_'
48
+ },
49
+ padding: {
50
+ pos: 'p',
51
+ neg: 'p_'
52
+ },
53
+ top: {
54
+ pos: 'post',
55
+ neg: 'post_'
56
+ },
57
+ bottom: {
58
+ pos: 'posb',
59
+ neg: 'posb_'
60
+ },
61
+ left: {
62
+ pos: 'posl',
63
+ neg: 'posl_'
64
+ },
65
+ right: {
66
+ pos: 'posr',
67
+ neg: 'posr_'
68
+ },
69
+ height: {
70
+ pos: 'h',
71
+ neg: 'h_'
72
+ },
73
+ width: {
74
+ pos: 'w',
75
+ neg: 'w_'
76
+ },
77
+ 'min-height': {
78
+ pos: 'minh',
79
+ neg: 'minh_'
80
+ },
81
+ 'min-width': {
82
+ pos: 'minw',
83
+ neg: 'minw_'
84
+ },
85
+ 'max-height': {
86
+ pos: 'maxh',
87
+ neg: 'maxh_'
88
+ },
89
+ 'max-width': {
90
+ pos: 'maxw',
91
+ neg: 'maxw_'
92
+ }
93
+ };
94
+
95
+ function objToClassName(prop, data) {
96
+ return renameProps[prop] ? data < 0 ? renameProps[prop].neg ? `${renameProps[prop].neg}${data * -1}` : `undef${data * -1}` : renameProps[prop].pos ? `${renameProps[prop].pos}${data}` : `undef${data}` : `undef${data}`;
97
+ }
98
+
99
+ const commonFilePath = {
100
+ 'margin-left': 'src/common/css/margin.css',
101
+ 'margin-right': 'src/common/css/margin.css',
102
+ 'margin-top': 'src/common/css/margin.css',
103
+ 'margin-bottom': 'src/common/css/margin.css',
104
+ 'padding-left': 'src/common/css/padding.css',
105
+ 'padding-right': 'src/common/css/padding.css',
106
+ 'padding-top': 'src/common/css/padding.css',
107
+ 'padding-bottom': 'src/common/css/padding.css',
108
+ top: 'src/common/css/position.css',
109
+ bottom: 'src/common/css/position.css',
110
+ left: 'src/common/css/position.css',
111
+ right: 'src/common/css/position.css',
112
+ height: 'src/common/css/height.css',
113
+ width: 'src/common/css/width.css',
114
+ 'min-height': 'src/common/css/height.css',
115
+ 'min-width': 'src/common/css/width.css',
116
+ 'max-height': 'src/common/css/height.css',
117
+ 'max-width': 'src/common/css/width.css'
118
+ }; // const preNames = {
119
+ // height: 'zd-height-',
120
+ // 'max-height': 'zd-height-',
121
+ // 'min-height': 'zd-height-',
122
+ // width: 'zd-width-',
123
+ // 'max-width': 'zd-width-',
124
+ // 'min-width': 'zd-width-',
125
+ // top: 'zd-position-',
126
+ // bottom: 'zd-position-',
127
+ // left: 'zd-position-',
128
+ // right: 'zd-position-',
129
+ // 'padding-top': 'zd-padding-',
130
+ // 'padding-bottom': 'zd-padding-',
131
+ // 'padding-left': 'zd-padding-',
132
+ // 'padding-right': 'zd-padding-',
133
+ // 'margin-top': 'zd-margin-',
134
+ // 'margin-bottom': 'zd-margin-',
135
+ // 'margin-left': 'zd-margin-',
136
+ // 'margin-right': 'zd-margin-'
137
+ // };
138
+
139
+ function allowParent(rule) {
140
+ return rule.parent.type === 'root' || rule.parent.type === 'atrule' && rule.parent.name === 'media';
141
+ }
142
+
143
+ module.exports = function (source) {
144
+ const {
145
+ resourcePath
146
+ } = this;
147
+
148
+ let root = _postcss.default.parse(source);
149
+
150
+ root.walkRules(rule => {
151
+ rule.walkDecls(decl => {
152
+ if (!allowParent(rule)) {
153
+ return;
154
+ }
155
+
156
+ if (supportedProps.includes(decl.prop) && /px$/gi.test(decl.value) && !/^--/gi.test(decl.prop) && commonFilePath[decl.prop] && !decl.value.includes('calc') && !/[,\s+]+|(\w+)\.|:|(\d+)%/gi.test(rule.selector)) {
157
+ let composeString = `from "${_path.default.relative(_path.default.parse(resourcePath).dir, // resourcePath
158
+ commonFilePath[decl.prop]).replace(/\\/gi, '/')}"`; // n++ < 10 && console.log(composeString);
159
+
160
+ if (!composeString.includes('src')) {
161
+ const cls = objToClassName(decl.prop, parseInt(decl.value));
162
+ composeString = `${cls} ${composeString}`;
163
+ decl.value = composeString;
164
+ decl.prop = 'composes'; // n < 10 && console.log(rule.selector, decl.prop, decl.value);
165
+ }
166
+ }
167
+ });
168
+ });
169
+ const output = root.toString(); // console.log(output);
170
+
171
+ return output;
172
+ };