@zohodesk/react-cli 0.0.1-beta.17 → 0.0.1-beta.171

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.
Files changed (292) hide show
  1. package/.eslintignore +1 -0
  2. package/.eslintrc.js +49 -10
  3. package/.prettierrc +6 -0
  4. package/CHANGELOG.md +5 -0
  5. package/README.md +859 -0
  6. package/bin/cli.js +215 -46
  7. package/cert/Tsicsezwild-22-23.crt +37 -0
  8. package/cert/Tsicsezwild-22-23.key +27 -0
  9. package/docs/CustomChunks.md +26 -0
  10. package/docs/DevStart.md +18 -0
  11. package/docs/HoverActive.md +12 -0
  12. package/docs/InstallNode.md +28 -0
  13. package/docs/TODOS.md +10 -0
  14. package/docs/ValueReplacer.md +60 -0
  15. package/docs/warnings_while_install.txt +35 -0
  16. package/files/eslintrc.js +62 -0
  17. package/files/prettierrc.js +3 -0
  18. package/lib/babel/cmjs-plugins-presets.js +24 -0
  19. package/lib/babel/es-plugins-presets.js +34 -0
  20. package/lib/common/getEntries.js +33 -46
  21. package/lib/common/getPublicPathConfig.js +40 -0
  22. package/lib/common/index.js +24 -19
  23. package/lib/common/splitChunks.js +110 -25
  24. package/lib/common/sslcertUpdater.js +59 -0
  25. package/lib/common/templateParameters.js +25 -0
  26. package/lib/common/testPattern.js +69 -0
  27. package/lib/common/valueReplacer.js +55 -0
  28. package/lib/configs/jest.config.js +31 -27
  29. package/lib/configs/libAlias.js +31 -0
  30. package/lib/configs/webpack.component.umd.config.js +46 -53
  31. package/lib/configs/webpack.css.umd.config.js +47 -46
  32. package/lib/configs/webpack.dev.config.js +99 -84
  33. package/lib/configs/webpack.docs.config.js +65 -57
  34. package/lib/configs/webpack.impact.config.js +109 -0
  35. package/lib/configs/webpack.prod.config.js +147 -104
  36. package/lib/hooks/docsProptypeHook.js +32 -38
  37. package/lib/jest/commitedFilesResult.js +144 -71
  38. package/lib/jest/coverageCollector.js +68 -35
  39. package/lib/jest/jsonMaker.js +54 -0
  40. package/lib/jest/preProcessors/cssPreprocessor.js +16 -18
  41. package/lib/jest/preProcessors/jsPreprocessor.js +5 -6
  42. package/lib/jest/preProcessors/otherFilesPreprocessor.js +5 -6
  43. package/lib/jest/result.js +92 -42
  44. package/lib/jest/run.js +75 -28
  45. package/lib/jest/setup.js +103 -102
  46. package/lib/loaderUtils/configsAssetsLoaders.js +117 -0
  47. package/lib/loaderUtils/getCSSLoaders.js +113 -0
  48. package/lib/loaderUtils/getDevJsLoaders.js +35 -23
  49. package/lib/loaderUtils/index.js +14 -7
  50. package/lib/loaders/docsLoader.js +15 -15
  51. package/lib/loaders/docsPropsLoader.js +14 -17
  52. package/lib/loaders/fileBountryLoader.js +17 -0
  53. package/lib/loaders/fileLoader.js +47 -38
  54. package/lib/loaders/scriptInstrumentLoader.js +23 -20
  55. package/lib/loaders/selectorMappingLoader.js +75 -0
  56. package/lib/loaders/workerLoader.js +136 -0
  57. package/lib/middlewares/HMRMiddleware.js +90 -72
  58. package/lib/middlewares/SSTMiddleware.js +21 -0
  59. package/lib/pluginUtils/getDevPlugins.js +177 -30
  60. package/lib/pluginUtils/getDocsPlugins.js +36 -15
  61. package/lib/pluginUtils/getLibraryImactPlugins.js +23 -0
  62. package/lib/pluginUtils/getLibraryPlugins.js +8 -10
  63. package/lib/pluginUtils/getProdPlugins.js +244 -37
  64. package/lib/pluginUtils/getServerPlugins.js +8 -11
  65. package/lib/pluginUtils/getUMDCSSPlugins.js +14 -18
  66. package/lib/pluginUtils/getUMDComponentPlugins.js +14 -9
  67. package/lib/pluginUtils/index.js +36 -43
  68. package/lib/plugins/CdnChangePlugin.js +77 -0
  69. package/lib/plugins/CleanupStatsPlugin.js +28 -0
  70. package/lib/plugins/EFCPlugin.js +241 -0
  71. package/lib/plugins/EFCPlugin.md +6 -0
  72. package/lib/plugins/EFCTemplatePlugin.js +151 -0
  73. package/lib/plugins/I18NInjectIntoIndexPlugin.js +141 -0
  74. package/lib/plugins/I18nSplitPlugin/I18nDebugPlugin.js +60 -0
  75. package/lib/plugins/I18nSplitPlugin/I18nDependency.js +44 -0
  76. package/lib/plugins/I18nSplitPlugin/I18nDownlodLogic.js +266 -0
  77. package/lib/plugins/I18nSplitPlugin/I18nFilesEmitter.js +183 -0
  78. package/lib/plugins/I18nSplitPlugin/I18nKeysIdentifer.js +100 -0
  79. package/lib/plugins/I18nSplitPlugin/I18nSplit.md +95 -0
  80. package/lib/plugins/I18nSplitPlugin/README.md +25 -0
  81. package/lib/plugins/I18nSplitPlugin/index.js +185 -0
  82. package/lib/plugins/I18nSplitPlugin/utils/collectI18nKeys.js +64 -0
  83. package/lib/plugins/I18nSplitPlugin/utils/getI18nFileUrlPathTemplate.js +13 -0
  84. package/lib/plugins/I18nSplitPlugin/utils/getI18nKeysFormModules.js +26 -0
  85. package/lib/plugins/I18nSplitPlugin/utils/hashUtils.js +40 -0
  86. package/lib/plugins/I18nSplitPlugin/utils/index.js +31 -0
  87. package/lib/plugins/I18nSplitPlugin/utils/propertiesUtils.js +112 -0
  88. package/lib/plugins/ManifestPlugin.js +86 -0
  89. package/lib/plugins/ModuleStatsPlugin.js +98 -97
  90. package/lib/plugins/OptimizeJSPlugin.js +41 -0
  91. package/lib/plugins/PublicPathCallbackPlugin.js +63 -0
  92. package/lib/plugins/PublicPathChangePlugin.js +226 -0
  93. package/lib/plugins/ReportGeneratePlugin.js +181 -0
  94. package/lib/plugins/RequireVariablePublicPlugin.js +30 -0
  95. package/lib/plugins/ResourceHintsPlugin.js +67 -0
  96. package/lib/plugins/RtlSplitPlugin/OverwriteCssPathForRTL.js +80 -0
  97. package/lib/plugins/RtlSplitPlugin/RtlCssPlugin.js +82 -0
  98. package/lib/plugins/RtlSplitPlugin/RtrSplit.md +30 -0
  99. package/lib/plugins/RtlSplitPlugin/replaceCssDirTemplate.js +26 -0
  100. package/lib/plugins/ScriptInstrumentPlugin.js +22 -37
  101. package/lib/plugins/ServiceWorkerPlugin.js +107 -0
  102. package/lib/plugins/ShadowDOMSupportPlugin.js +270 -0
  103. package/lib/plugins/SourceMapHookPlugin.js +25 -59
  104. package/lib/plugins/TPHashMappingPlugin.js +67 -0
  105. package/lib/plugins/UglifyCSSPlugin.js +39 -0
  106. package/lib/plugins/UnusedFilesFindPlugin.js +150 -97
  107. package/lib/plugins/index.js +127 -37
  108. package/lib/plugins/libraryImpactPlugin.js +190 -0
  109. package/lib/plugins/webpackwatchrunplugin.js +26 -0
  110. package/lib/postcss-plugins/ExcludePlugin.js +23 -0
  111. package/lib/postcss-plugins/RTLSplitPlugin.js +138 -0
  112. package/lib/postcss-plugins/ValueReplacer.js +46 -0
  113. package/lib/postcss-plugins/__test__/hoverActivePlugin.spec.js +22 -0
  114. package/lib/postcss-plugins/__test__/test1Input.css +39 -0
  115. package/lib/postcss-plugins/__test__/test1Output.css +39 -0
  116. package/lib/postcss-plugins/hoverActivePlugin.js +368 -0
  117. package/lib/postcss-plugins/variableModifier.js +243 -0
  118. package/lib/schemas/index.js +541 -65
  119. package/lib/servers/clusterHubServer.js +22 -26
  120. package/lib/servers/devBuild.js +102 -0
  121. package/lib/servers/docsServer.js +3 -5
  122. package/lib/servers/docsServerCore.js +94 -79
  123. package/lib/servers/getCliPath.js +28 -0
  124. package/lib/servers/helpServer.js +19 -21
  125. package/lib/servers/httpsOptions.js +18 -0
  126. package/lib/servers/impactServer.js +123 -115
  127. package/lib/servers/mockserver.js +44 -0
  128. package/lib/servers/nowatchserver.js +200 -0
  129. package/lib/servers/scrServer.js +147 -0
  130. package/lib/servers/server.js +134 -132
  131. package/lib/servers/ssServer.js +106 -70
  132. package/lib/sh/reportPublish.sh +16 -10
  133. package/lib/templates/CoverageScriptTemplate.js +45 -18
  134. package/lib/templates/WMSTemplate.js +17 -18
  135. package/lib/templates/linterConstant.js +10 -0
  136. package/lib/utils/babelPresets.js +12 -4
  137. package/lib/utils/buildstats.html +148 -0
  138. package/lib/utils/clean.js +12 -11
  139. package/lib/utils/copy.js +16 -109
  140. package/lib/utils/copyTimezones.js +21 -0
  141. package/lib/utils/createEventStream.js +24 -19
  142. package/lib/utils/cssClassNameGenerate.js +77 -0
  143. package/lib/utils/cssURLReplacer.js +136 -0
  144. package/lib/utils/dependencyPostPublish.js +42 -0
  145. package/lib/utils/fileUtils.js +125 -0
  146. package/lib/utils/folderIterator.js +47 -0
  147. package/lib/utils/getComponents.js +126 -0
  148. package/lib/utils/getCurrentBranch.js +11 -17
  149. package/lib/utils/getDependenciesImpactList.js +151 -0
  150. package/lib/utils/getHash.js +26 -0
  151. package/lib/utils/getIp.js +20 -0
  152. package/lib/utils/getOptions.js +113 -28
  153. package/lib/utils/getServerURL.js +25 -8
  154. package/lib/utils/index.js +283 -68
  155. package/lib/utils/init.js +2 -2
  156. package/lib/utils/initPreCommitHook.js +47 -27
  157. package/lib/utils/jsonHelper.js +106 -0
  158. package/lib/utils/libraryImpactConfig.js +63 -0
  159. package/lib/utils/lint/addScripts.js +27 -0
  160. package/lib/utils/lint/checkExistingConfig.js +67 -0
  161. package/lib/utils/lint/copyConfigs.js +24 -0
  162. package/lib/utils/lint/index.js +54 -0
  163. package/lib/utils/lint/lintScripts.js +11 -0
  164. package/lib/utils/lint/lintSetup.js +31 -0
  165. package/lib/utils/lint/lintStagedPreCommitHook.js +7 -0
  166. package/lib/utils/lint/question.js +30 -0
  167. package/lib/utils/lintReporter.js +142 -0
  168. package/lib/utils/mailSender.js +16 -25
  169. package/lib/utils/pullOrigin.js +28 -0
  170. package/lib/utils/reinstallDependencies.js +133 -0
  171. package/lib/utils/removeAttributes.js +25 -23
  172. package/lib/utils/repoClone.js +59 -63
  173. package/lib/utils/request.js +64 -77
  174. package/lib/utils/resultSchema.json +73 -0
  175. package/lib/utils/rtl.js +59 -0
  176. package/lib/utils/setEnvVariables.js +13 -0
  177. package/lib/utils/ssTestHack.js +48 -0
  178. package/lib/utils/switchBranch.js +28 -0
  179. package/lib/utils/urlConcat.js +22 -0
  180. package/lib/utils/useExitCleanup.js +55 -0
  181. package/npm8.md +9 -0
  182. package/package.json +96 -64
  183. package/postpublish.js +6 -0
  184. package/templates/app/.eslintrc.js +140 -0
  185. package/templates/app/README.md +12 -12
  186. package/templates/app/app/index.html +24 -8
  187. package/templates/app/app/properties/ApplicationResources_en_US.properties +1 -1
  188. package/templates/app/app/properties/i18nkeys.json +3 -3
  189. package/templates/app/docs/all.html +69 -69
  190. package/templates/app/mockapi/index.js +18 -13
  191. package/templates/app/package.json +37 -17
  192. package/templates/app/src/actions/SampleActions/index.js +37 -0
  193. package/templates/app/src/actions/index.js +65 -0
  194. package/templates/app/src/appUrls.js +19 -0
  195. package/templates/app/src/components/Alert/Alert.js +134 -0
  196. package/templates/app/src/components/Alert/Alert.module.css +79 -0
  197. package/templates/app/src/components/FreezeLayer/FreezeLayer.css +37 -0
  198. package/templates/app/src/components/FreezeLayer/FreezeLayer.js +84 -0
  199. package/templates/app/src/components/Sample/Sample.module.css +11 -0
  200. package/templates/app/src/components/Sample/SampleList.js +61 -0
  201. package/templates/app/src/components/Slider/Slider.css +41 -0
  202. package/templates/app/src/components/Slider/Slider.js +55 -0
  203. package/templates/app/src/containers/AlertContainer/index.js +15 -0
  204. package/templates/app/src/containers/AppContainer/index.js +96 -0
  205. package/templates/app/src/containers/AppContainer/index.module.css +27 -0
  206. package/templates/app/src/containers/CustomMatch/index.js +65 -0
  207. package/templates/app/src/containers/DevTools/index.js +10 -0
  208. package/templates/app/src/containers/Header/index.js +67 -0
  209. package/templates/app/src/containers/Header/index.module.css +43 -0
  210. package/templates/app/src/containers/Redirect/index.js +63 -0
  211. package/templates/app/src/containers/Redirector/index.js +47 -0
  212. package/templates/app/src/containers/SampleListContainer/ListContainer.js +42 -0
  213. package/templates/app/src/containers/SampleListContainer/ListContainer.module.css +3 -0
  214. package/templates/app/src/historyChange.js +5 -0
  215. package/templates/app/src/index.html +10 -0
  216. package/templates/app/src/index.js +24 -0
  217. package/templates/app/src/middleware/PromiseMiddleware.js +59 -0
  218. package/templates/app/src/reducers/alertData.js +11 -0
  219. package/templates/app/src/reducers/index.js +6 -0
  220. package/templates/app/src/reducers/samples.js +19 -0
  221. package/templates/app/src/store/configureStore.dev.js +51 -0
  222. package/templates/app/src/store/configureStore.js +5 -0
  223. package/templates/app/src/store/configureStore.prod.js +26 -0
  224. package/templates/app/src/util/Common.js +5 -0
  225. package/templates/app/src/util/RequestAPI.js +132 -0
  226. package/templates/appold/README.md +12 -0
  227. package/templates/appold/app/index.html +8 -0
  228. package/templates/appold/app/properties/ApplicationResources_en_US.properties +1 -0
  229. package/templates/appold/app/properties/i18nkeys.json +3 -0
  230. package/templates/appold/docs/all.html +69 -0
  231. package/templates/appold/mockapi/index.js +13 -0
  232. package/templates/{app → appold}/mockapi/tickets.json +0 -0
  233. package/templates/appold/package.json +17 -0
  234. package/templates/appold/src/components/Text/Text.css +0 -0
  235. package/templates/appold/src/components/Text/Text.js +23 -0
  236. package/templates/appold/src/components/Text/__tests__/Text.spec.js +30 -0
  237. package/templates/appold/src/components/Text/docs/Text__default.docs.js +16 -0
  238. package/templates/appold/src/components/docs.js +1 -0
  239. package/templates/appold/src/components/index.js +5 -0
  240. package/templates/appold/src/index.js +13 -0
  241. package/templates/docs/all.html +1 -1
  242. package/templates/docs/component.html +110 -69
  243. package/templates/docs/components.html +221 -0
  244. package/templates/docs/css/component.css +12 -14
  245. package/templates/docs/css/componentTest.css +7 -0
  246. package/templates/docs/css/style.css +150 -206
  247. package/templates/docs/impactReportTemplate.html +154 -0
  248. package/templates/docs/index.html +1482 -1336
  249. package/templates/library/src/index.js +0 -0
  250. package/.npmignore +0 -3
  251. package/cert/cert.pem +0 -129
  252. package/cert/key.pem +0 -27
  253. package/lib/common/getInsertAt.js +0 -36
  254. package/lib/common/getInsertIntoFunction.js +0 -13
  255. package/lib/configs/webpack.server.config.js +0 -93
  256. package/lib/plugins/ChunkManifestReplacePlugin.js +0 -94
  257. package/lib/plugins/RuntimePublicPathPlugin.js +0 -46
  258. package/lib/rmcntrlm.sh +0 -14
  259. package/lib/servers/nodeServer.js +0 -238
  260. package/lib/templates/HMRTemplate.js +0 -256
  261. package/lib/templates/publicPathTemplate.js +0 -16
  262. package/lib/utils/setConfig.js +0 -14
  263. package/node_modules/history/CHANGES.md +0 -395
  264. package/node_modules/history/DOMUtils.js +0 -3
  265. package/node_modules/history/ExecutionEnvironment.js +0 -3
  266. package/node_modules/history/LICENSE +0 -21
  267. package/node_modules/history/LocationUtils.js +0 -3
  268. package/node_modules/history/PathUtils.js +0 -3
  269. package/node_modules/history/README.md +0 -282
  270. package/node_modules/history/cjs/history.js +0 -933
  271. package/node_modules/history/cjs/history.min.js +0 -1
  272. package/node_modules/history/createBrowserHistory.js +0 -3
  273. package/node_modules/history/createHashHistory.js +0 -3
  274. package/node_modules/history/createMemoryHistory.js +0 -3
  275. package/node_modules/history/createTransitionManager.js +0 -3
  276. package/node_modules/history/es/DOMUtils.js +0 -7
  277. package/node_modules/history/es/ExecutionEnvironment.js +0 -7
  278. package/node_modules/history/es/LocationUtils.js +0 -7
  279. package/node_modules/history/es/PathUtils.js +0 -7
  280. package/node_modules/history/es/createBrowserHistory.js +0 -7
  281. package/node_modules/history/es/createHashHistory.js +0 -7
  282. package/node_modules/history/es/createMemoryHistory.js +0 -7
  283. package/node_modules/history/es/createTransitionManager.js +0 -7
  284. package/node_modules/history/es/warnAboutDeprecatedESMImport.js +0 -35
  285. package/node_modules/history/esm/history.js +0 -904
  286. package/node_modules/history/index.js +0 -7
  287. package/node_modules/history/package.json +0 -134
  288. package/node_modules/history/umd/history.js +0 -1059
  289. package/node_modules/history/umd/history.min.js +0 -1
  290. package/node_modules/history/warnAboutDeprecatedCJSRequire.js +0 -35
  291. package/templates/app/.npmignore +0 -9
  292. package/templates/library/.npmignore +0 -9
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _utils = require("../utils");
9
+
10
+ class WebpackWatchRunPlugin {
11
+ apply(compiler) {
12
+ compiler.hooks.watchRun.tap('WatchRun', comp => {
13
+ const changedTimes = comp.watchFileSystem.watcher.mtimes;
14
+ const changedFiles = Object.keys(changedTimes).map(file => `\n ${file}`).join('');
15
+
16
+ if (changedFiles.length) {
17
+ (0, _utils.log)('====================================');
18
+ (0, _utils.log)('NEW BUILD FILES CHANGED:', changedFiles);
19
+ (0, _utils.log)('====================================');
20
+ }
21
+ });
22
+ }
23
+
24
+ }
25
+
26
+ exports.default = WebpackWatchRunPlugin;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ var _postcss = _interopRequireDefault(require("postcss"));
4
+
5
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
6
+
7
+ module.exports = _postcss.default.plugin('postcss-exclude-files', opts => {
8
+ const {
9
+ plugins
10
+ } = opts;
11
+ return (root, result) => {
12
+ const inputFile = root.source.input.file;
13
+ let isIgnoredFile = opts.ignore.some(file => inputFile.indexOf(file) !== -1);
14
+
15
+ if (!isIgnoredFile) {
16
+ const handler = response => response.messages.forEach(msg => result.messages.push(msg));
17
+
18
+ return (0, _postcss.default)(plugins).process(root, {
19
+ from: undefined
20
+ }).then(handler);
21
+ }
22
+ };
23
+ });
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.separateRtlAndLtr = separateRtlAndLtr;
7
+ exports.separateSingleDir = separateSingleDir;
8
+
9
+ var postcss = _interopRequireWildcard(require("postcss"));
10
+
11
+ 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); }
12
+
13
+ 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; }
14
+
15
+ const oppositeDir = {
16
+ ltr: 'rtl',
17
+ rtl: 'ltr'
18
+ };
19
+
20
+ function compareSelector(selector1, selector2) {
21
+ // console.log({ selector1, selector2 }, selector1 === selector2);
22
+ return selector1 === selector2;
23
+ }
24
+
25
+ const directionRegexs = {
26
+ ltr: /\[dir=ltr\]/,
27
+ rtl: /\[dir=rtl\]/
28
+ };
29
+
30
+ const getRegex = dir => directionRegexs[dir];
31
+
32
+ const getOppositeRegex = dir => getRegex(oppositeDir[dir]);
33
+
34
+ function selectorMinifySameDir(selector, direction) {
35
+ // NOTE: if this rule is same dir as current need
36
+ // then we can just remove that [dir=ltr] or [dir=rtl]
37
+ // it just for minimaze selector
38
+ const regex = getRegex(direction);
39
+ return selector.replace(regex, '').trim();
40
+ }
41
+ /**
42
+ * this funtion will remove given rule,
43
+ * if given selector and it's previous sibiling rule selector are same
44
+ * current rule properties will move to previous sibiling rule.
45
+ * @param {Rule} rule current rule
46
+ */
47
+
48
+
49
+ function mergeIfSameSelector(rule) {
50
+ // NOTE: to merge dublicate selector rules
51
+ const prev = rule.prev();
52
+
53
+ if (prev && compareSelector(prev.selector, rule.selector)) {
54
+ rule.each(decl => {
55
+ prev.append(decl);
56
+ });
57
+ rule.remove();
58
+ }
59
+ }
60
+ /**
61
+ * this funtion will remove given rule,
62
+ * if given selector and it's previous sibiling rule selector are same
63
+ * current rule properties will move to previous sibiling rule.
64
+ * @param {Rule} rule current rule
65
+ */
66
+
67
+
68
+ function removeIfOppsiteDirRule(rule, direction, rootOptions) {
69
+ // console.log({ rule, type: rule.type });
70
+ const selectors = rule.selector.split(/\s*,\s*/); // NOTE: if we use opposite dir selector as custom override reason,
71
+ // and compain normal selector with it, In this case
72
+ // we just a have to remove that selector only not full rule
73
+
74
+ const oppositeDirRegex = getOppositeRegex(direction);
75
+ let remainingSelectors = selectors.filter(selector => !oppositeDirRegex.test(selector));
76
+
77
+ if (!rootOptions.disableMiniFiySelector) {
78
+ remainingSelectors = remainingSelectors.map(selector => selectorMinifySameDir(selector, direction));
79
+ }
80
+
81
+ if (remainingSelectors.length) {
82
+ rule.selector = remainingSelectors.join(', ');
83
+ } else {
84
+ // NOTE: every selector is opposite dir then we have to remove the rule
85
+ rule.remove();
86
+ }
87
+ }
88
+
89
+ function removeIfOppsiteDirKeyframe(rule, direction) {
90
+ let name = rule.params;
91
+ let keyFrameDirName = name.slice(name.lastIndexOf('-') + 1);
92
+
93
+ if (keyFrameDirName === oppositeDir[direction]) {
94
+ // console.log({ m: 'removed', keyFrameName: rule.params });
95
+ rule.remove();
96
+ }
97
+ }
98
+
99
+ function separateSingleDir(root, direction, rootOptions) {
100
+ root.walkRules(rule => {
101
+ removeIfOppsiteDirRule(rule, direction, rootOptions);
102
+ mergeIfSameSelector(rule);
103
+ });
104
+ root.walkAtRules(rule => {
105
+ removeIfOppsiteDirKeyframe(rule, direction);
106
+ });
107
+ return root;
108
+ }
109
+
110
+ function separateRtlAndLtr(css, rootOptions) {
111
+ // let processor = postcss([]).process(css);
112
+ let root = postcss.parse(css); // let { root } = processor;
113
+ // console.log(processor, root);
114
+ // NOTE: I did first rtl then ltr , Because for ltr I use original root ref
115
+
116
+ const rtlRoot = separateSingleDir(root.clone(), 'rtl', rootOptions); // console.log('############################');
117
+
118
+ const ltrRoot = separateSingleDir(root, 'ltr', rootOptions);
119
+ return {
120
+ ltrRoot,
121
+ rtlRoot,
122
+ ltr: ltrRoot.toString(),
123
+ rtl: rtlRoot.toString()
124
+ };
125
+ } // NOTE: to test in https://astexplorer.net/
126
+ // you can test with sample input https://astexplorer.net/#/gist/a892a509eb585099355ef53ef094f836/1ca70d5f7af3b88ca4910296e12f118e9712c874
127
+ // export default postcss.plugin('postcss-rtl-remove', (options = {}) =>
128
+ // // Work with options here
129
+ // root => {
130
+ // const rtlRoot = separateSingleDir(root.clone(), 'rtl');
131
+ // const ltrRoot = separateSingleDir(root, 'ltr');
132
+ // // root.append(postcss.comment({ text: 'comment' }));
133
+ // root.append(postcss.comment({ text: 'this is spliting part ' }));
134
+ // root.append(rtlRoot);
135
+ // //console.log({root, roots:root+""}, root+"")
136
+ // // Transform CSS AST here
137
+ // }
138
+ // );
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ var _postcss = _interopRequireDefault(require("postcss"));
4
+
5
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
6
+
7
+ // module.exports = postcss.plugin('postcss-value-replacer', opts => {
8
+ // const { plugins } = opts;
9
+ // return (root, result) => {
10
+ // const inputFile = root.source.input.file;
11
+ // let isIgnoredFile= opts.ignore.some(file => inputFile.indexOf(file)!==-1);
12
+ // if (!isIgnoredFile) {
13
+ // const handler = response =>
14
+ // response.messages.forEach(msg => result.messages.push(msg));
15
+ // return postcss(plugins)
16
+ // .process(root, { from: undefined })
17
+ // .then(handler);
18
+ // }
19
+ // };
20
+ // });
21
+ // export default
22
+ module.exports = _postcss.default.plugin('postcss-value-replacer', (valueReplacer = {}) => // Work with options here
23
+ root => {
24
+ root.walkDecls(decl => {
25
+ valueReplacer.forEach(obj => {
26
+ if (obj.props.indexOf(decl.prop) !== -1) {
27
+ let ks = Object.keys(obj.values).sort((a, b) => b.length - a.length);
28
+ ks.forEach(k => {
29
+ decl.value = decl.value.replace(k, obj.values[k]);
30
+ }); //decl.value = obj.values[decl.value];
31
+ }
32
+ }); //console.log({root, roots:root+""}, root+"")
33
+ // Transform CSS AST here
34
+ }); // root.walkDecls(decl => {
35
+ // valueReplacer.forEach(obj => {
36
+ // if (
37
+ // obj.props.indexOf(decl.prop) !== -1 &&
38
+ // obj.values[decl.value] !== undefined
39
+ // ) {
40
+ // decl.value = obj.values[decl.value];
41
+ // }
42
+ // });
43
+ // //console.log({root, roots:root+""}, root+"")
44
+ // // Transform CSS AST here
45
+ // });
46
+ });
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ const fs = require('fs');
4
+
5
+ const postcss = require('postcss');
6
+
7
+ function expectRunPostCss(inputFile, outputfile, cb) {
8
+ const inputStr = fs.readFileSync(inputFile, 'utf-8');
9
+ postcss(plugins).process(inputStr, {
10
+ from,
11
+ to
12
+ }).then(result => {
13
+ expect(result.css).toBe(fs.readFileSync(outputfile, 'utf-8'));
14
+ cb();
15
+ });
16
+ }
17
+
18
+ describe('To Check Hover active postcss Plugin ', () => {
19
+ test('should handle normal rule hover', cb => {
20
+ expectRunPostCss('test1Input.css', 'test1Output.css', cb);
21
+ });
22
+ });
@@ -0,0 +1,39 @@
1
+ /*Hover_active:ignore*/
2
+ g,a:hover{
3
+ color : red
4
+ }
5
+ /*Hover:ignore*/
6
+ h:hover{
7
+ background : yellow
8
+ }
9
+
10
+ /* Hover_active:ignore */
11
+ g,d+e:hover{
12
+ color : black
13
+ }
14
+
15
+ g,d e:hover{
16
+ color : black
17
+ }
18
+
19
+ @media screen and (max-width:61.25em){
20
+ /* Hover_active:ignore */
21
+ a,b,a:hover, b:hover{
22
+ background-color : blue
23
+ }
24
+ a + b,a:hover + b:hover{
25
+ background-color : blue
26
+ }
27
+ a b:hover{
28
+ background-color : blue
29
+ }
30
+
31
+ .cc:hover {
32
+ color: red;
33
+ }
34
+
35
+ c:hover{
36
+ color : red
37
+ }
38
+
39
+ }
@@ -0,0 +1,39 @@
1
+ /*Hover_active:ignore*/
2
+ g,a:hover{
3
+ color : red
4
+ }
5
+ /*Hover:ignore*/
6
+ h:hover{
7
+ background : yellow
8
+ }
9
+
10
+ /* Hover_active:ignore */
11
+ g,d+e:hover{
12
+ color : black
13
+ }
14
+
15
+ g,d e:hover{
16
+ color : black
17
+ }
18
+
19
+ @media screen and (max-width:61.25em){
20
+ /* Hover_active:ignore */
21
+ a,b,a:hover, b:hover{
22
+ background-color : blue
23
+ }
24
+ a + b,a:hover + b:hover{
25
+ background-color : blue
26
+ }
27
+ a b:hover{
28
+ background-color : blue
29
+ }
30
+
31
+ .cc:hover {
32
+ color: red;
33
+ }
34
+
35
+ c:hover{
36
+ color : red
37
+ }
38
+
39
+ }
@@ -0,0 +1,368 @@
1
+ "use strict";
2
+
3
+ var _postcss = _interopRequireDefault(require("postcss"));
4
+
5
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
6
+
7
+ /**
8
+ * we have give support for ignore(exclude) comments
9
+ * These are the comments' keyword
10
+ */
11
+ const hoverIgnoreQuery = 'Hover:ignore',
12
+ activeIgnoreQuery = 'Active:ignore',
13
+ hoverActiveIgnoreQuery = 'HoverActive:ignore';
14
+ const medHoverIgnoreQuery = 'MedHover:ignore',
15
+ medActiveIgnoreQuery = 'MedActive:ignore',
16
+ medHoverActiveIgnoreQuery = 'MedHoverActive:ignore';
17
+ let hoverMedQuerySuffix = '';
18
+ let hoverNoneMedQuerySuffix = '';
19
+ const ruleIgnoreCommentRegex = /(Hover:ignore|Active:ignore|HoverActive:ignore)/g;
20
+ const mediaQueryIgnoreCommentRegex = /(MedHover:ignore|MedActive:ignore|MedHoverActive:ignore)/g;
21
+
22
+ function isComment(node) {
23
+ return node && node.type === 'comment' && node.text !== undefined;
24
+ }
25
+
26
+ function isHoverPresent(atrule) {
27
+ let hoverPresent = false;
28
+ atrule.walkRules(rule => {
29
+ if (rule.selector.includes('hover')) {
30
+ hoverPresent = true;
31
+ }
32
+ });
33
+ return hoverPresent;
34
+ }
35
+
36
+ module.exports = _postcss.default.plugin('postcss-mobile-hover', mediaQueryHoverActiveString => rootOriginal => {
37
+ const hoverRules = [];
38
+ let positionsObj = {};
39
+ hoverMedQuerySuffix = mediaQueryHoverActiveString.hover;
40
+ hoverNoneMedQuerySuffix = mediaQueryHoverActiveString.none;
41
+
42
+ function isRuleHasIgnoreComment(index, type) {
43
+ const prevNode = rootOriginal.nodes[index - 1];
44
+
45
+ if (isComment(prevNode)) {
46
+ return prevNode.text === type;
47
+ }
48
+
49
+ return false;
50
+ }
51
+
52
+ function isMediaQueryHasIgnoreComment(node, type) {
53
+ if (isComment(node)) {
54
+ return node.text === type;
55
+ }
56
+
57
+ return false;
58
+ }
59
+
60
+ function hasIgnoreComment({
61
+ index,
62
+ atrule,
63
+ type
64
+ }) {
65
+ if (type.match(mediaQueryIgnoreCommentRegex)) {
66
+ return isMediaQueryHasIgnoreComment(atrule.nodes[index - 1], type.slice(3));
67
+ }
68
+
69
+ if (type.match(ruleIgnoreCommentRegex)) {
70
+ return isRuleHasIgnoreComment(index, type);
71
+ }
72
+
73
+ return false;
74
+ }
75
+
76
+ function getPositionsOfHoverAndActiveMedQueries(parent) {
77
+ const allNodes = rootOriginal.nodes;
78
+ const hoverMediaQuery = `${parent.params} and ${hoverMedQuerySuffix}`;
79
+ const hoverNoneMediaQuery = `${parent.params} and ${hoverNoneMedQuerySuffix}`;
80
+ const positions = {
81
+ hovMed: allNodes[positionsObj[hoverMediaQuery]],
82
+ actMed: allNodes[positionsObj[hoverNoneMediaQuery]]
83
+ };
84
+ return positions;
85
+ }
86
+
87
+ function handleMedHoverAndHoverActiveIgnore(atrule, index) {
88
+ return !hasIgnoreComment({
89
+ atrule,
90
+ index,
91
+ type: medHoverIgnoreQuery
92
+ }) && !hasIgnoreComment({
93
+ atrule,
94
+ index,
95
+ type: medHoverActiveIgnoreQuery
96
+ });
97
+ }
98
+
99
+ function handleMedActiveAndHoverActiveIgnore(atrule, index) {
100
+ return !hasIgnoreComment({
101
+ atrule,
102
+ index,
103
+ type: medActiveIgnoreQuery
104
+ }) && !hasIgnoreComment({
105
+ atrule,
106
+ index,
107
+ type: medHoverActiveIgnoreQuery
108
+ });
109
+ }
110
+
111
+ function handleHoverAndHoverActiveIgnore(index) {
112
+ return !hasIgnoreComment({
113
+ index,
114
+ type: hoverIgnoreQuery
115
+ }) && !hasIgnoreComment({
116
+ index,
117
+ type: hoverActiveIgnoreQuery
118
+ });
119
+ }
120
+
121
+ function handleActiveAndHoverActiveIgnore(index) {
122
+ return !hasIgnoreComment({
123
+ index,
124
+ type: activeIgnoreQuery
125
+ }) && !hasIgnoreComment({
126
+ index,
127
+ type: hoverActiveIgnoreQuery
128
+ });
129
+ }
130
+
131
+ function handleAllIgnoreCases(index) {
132
+ return !hasIgnoreComment({
133
+ index,
134
+ type: activeIgnoreQuery
135
+ }) && !hasIgnoreComment({
136
+ index,
137
+ type: hoverIgnoreQuery
138
+ }) && !hasIgnoreComment({
139
+ index,
140
+ type: hoverActiveIgnoreQuery
141
+ });
142
+ }
143
+
144
+ function mediaCommaQuery(rule, index) {
145
+ if (rule.parent.params !== undefined && !rule.parent.params.includes('hover')) {
146
+ //console.log(hovMed, actMed);
147
+ let newSelector = '';
148
+ let {
149
+ hovMed,
150
+ actMed
151
+ } = getPositionsOfHoverAndActiveMedQueries(rule.parent);
152
+ let hovQueries = [];
153
+ let actQueries = [];
154
+ rule.selector.split(/\s*,\s*/).forEach(_subrule => {
155
+ let subrule = _subrule.trim();
156
+
157
+ let clone = rule.clone();
158
+
159
+ if (subrule.includes('hover')) {
160
+ clone.selector = subrule;
161
+
162
+ if (handleMedHoverAndHoverActiveIgnore(rule.parent, index)) {
163
+ hovQueries.push(subrule);
164
+ }
165
+
166
+ if (handleMedActiveAndHoverActiveIgnore(rule.parent, index)) {
167
+ actQueries.push(subrule);
168
+ }
169
+ } else {
170
+ newSelector += `${subrule}, `;
171
+ }
172
+ });
173
+
174
+ if (hovQueries.length > 0) {
175
+ let clone = rule.clone();
176
+ clone.selector = hovQueries.join(',');
177
+ hovMed.append(clone);
178
+ }
179
+
180
+ if (actQueries.length > 0) {
181
+ let clone = rule.clone();
182
+ clone.selector = actQueries.join(',');
183
+ actMed.append(clone.clone({
184
+ selector: clone.selector.replace(/:hover/gi, ':active')
185
+ }));
186
+ }
187
+
188
+ if (handleMedHoverAndHoverActiveIgnore(rule.parent, index)) {
189
+ rule.selector = newSelector.substring(0, newSelector.length - 2);
190
+ }
191
+
192
+ if (rule.selector === '') {
193
+ rule.remove();
194
+ }
195
+ }
196
+ }
197
+
198
+ function mediaQuery(rule, index) {
199
+ if (rule.parent.params !== undefined && !rule.parent.params.includes('hover')) {
200
+ let {
201
+ hovMed,
202
+ actMed
203
+ } = getPositionsOfHoverAndActiveMedQueries(rule.parent);
204
+
205
+ if (rule.selector.includes('hover') && hovMed !== undefined && rule.parent.type === 'atrule') {
206
+ if (handleMedHoverAndHoverActiveIgnore(rule.parent, index)) {
207
+ hovMed.append(rule);
208
+ }
209
+
210
+ if (handleMedActiveAndHoverActiveIgnore(rule.parent, index)) {
211
+ actMed.append(rule.clone({
212
+ selector: rule.selector.replace(/:hover/gi, ':active')
213
+ }));
214
+ }
215
+ }
216
+ }
217
+ }
218
+
219
+ function commaQuery(rule, index) {
220
+ //console.log("comma" , rule.selector.split('\n'));
221
+ let newSelector = '';
222
+ let hovQueries = [];
223
+ rule.selector.split(/\s*,\s*/).forEach(_subrule => {
224
+ let subrule = _subrule.trim();
225
+
226
+ if (subrule.includes('hover')) {
227
+ // hoverRules.push({ rule: clone, index });
228
+ hovQueries.push(subrule);
229
+ } else {
230
+ newSelector += `${subrule}, `;
231
+ }
232
+ });
233
+
234
+ if (hovQueries.length > 0) {
235
+ let clone = rule.clone();
236
+ clone.selector = hovQueries.join(',');
237
+ hoverRules.push({
238
+ rule: clone,
239
+ index
240
+ });
241
+ }
242
+
243
+ if (handleHoverAndHoverActiveIgnore(index)) {
244
+ rule.selector = newSelector.substring(0, newSelector.length - 2).trim();
245
+ }
246
+
247
+ if (rule.selector === '') {
248
+ rule.remove();
249
+ }
250
+ } // Start by identifying all :hover rules
251
+
252
+
253
+ rootOriginal.walkAtRules(atrule => {
254
+ const hoverQuery = `${atrule.params} and ${hoverMedQuerySuffix}`;
255
+ const activeQuery = `${atrule.params} and ${hoverNoneMedQuerySuffix}`;
256
+
257
+ if (isHoverPresent(atrule)) {
258
+ if (!positionsObj[hoverQuery] && !positionsObj[activeQuery]) {
259
+ rootOriginal.append({
260
+ name: 'media',
261
+ params: hoverQuery
262
+ });
263
+ positionsObj[hoverQuery] = rootOriginal.nodes.length - 1;
264
+ rootOriginal.append({
265
+ name: 'media',
266
+ params: activeQuery
267
+ });
268
+ positionsObj[activeQuery] = rootOriginal.nodes.length - 1;
269
+ }
270
+ }
271
+ });
272
+ rootOriginal.walkRules(/:hover/i, (rule, index) => {
273
+ // media hover query with ',' ' ' '+'
274
+ // console.log("media query" , rule.selector)
275
+ if (rule.parent.type === 'atrule' && rule.selector.includes(',')) {
276
+ //console.log("media comma", rule.selector)
277
+ mediaCommaQuery(rule, index);
278
+ } else {
279
+ // plus, space and other media queries
280
+ //console.log("media", rule.selector)
281
+ mediaQuery(rule, index);
282
+ } // usual hover query
283
+
284
+
285
+ if (!rule.selector.match(/,+| +|\++/g) && rule.parent !== undefined && rule.parent.name === undefined) {
286
+ hoverRules.push({
287
+ rule,
288
+ index
289
+ });
290
+ } //usual hover query with ',' ' ' '+'
291
+
292
+
293
+ if (rule.selector.match(/,+| +|\++/g) && rule.parent.name === undefined) {
294
+ if (rule.selector.includes(',')) {
295
+ commaQuery(rule, index);
296
+ } else if (rule.selector.match(/ +|\++/g)) {
297
+ //console.log("plus or space" , rule.selector);
298
+ if (rule.selector.includes('hover')) {
299
+ hoverRules.push({
300
+ rule,
301
+ index
302
+ }); //rule.remove();
303
+ }
304
+ }
305
+ }
306
+ }); // If there are any :hover rules in the input, then create media queries
307
+ // to automatically translate it into :active on touch-based devices
308
+
309
+ if (hoverRules.length > 0) {
310
+ // Create a media query targetting devices that actually support
311
+ // hover
312
+ const hoverQuery = rootOriginal.append({
313
+ name: 'media',
314
+ params: `${hoverMedQuerySuffix}`
315
+ }).last; // Create a media query targetting devices that don't support hover
316
+ // (ie. devices where we should fall back to :active instead)
317
+
318
+ const activeQuery = rootOriginal.append({
319
+ name: 'media',
320
+ params: `${hoverNoneMedQuerySuffix}`
321
+ }).last; // Loop through the hover rules and apply them to each of the media
322
+ // queries
323
+ // eslint-disable-next-line no-labels
324
+
325
+ outerLoop: for (const hoverRule of hoverRules) {
326
+ // determine if the rule has been nested inside another media
327
+ // query; in that case bail out as we have no way of reliably
328
+ // nesting these queries
329
+ let parentRule = hoverRule.rule.parent;
330
+
331
+ while (parentRule) {
332
+ if (parentRule.type === 'atrule' && parentRule.name === 'media') {
333
+ // eslint-disable-next-line no-labels
334
+ continue outerLoop;
335
+ }
336
+
337
+ parentRule = parentRule.parent;
338
+ } // Push a clone of the :hover rule 'as is' to queries where we
339
+ // expect the user's device to support hover
340
+ // ieQuery.append(hoverRule.clone());
341
+
342
+
343
+ if (handleHoverAndHoverActiveIgnore(hoverRule.index)) {
344
+ hoverQuery.append(hoverRule.rule.clone());
345
+ } // Push a clone of the :hover rule, where we transform the
346
+ // selector to :active to the query targetting devices that
347
+ // don't support hover
348
+
349
+
350
+ if (handleActiveAndHoverActiveIgnore(hoverRule.index)) {
351
+ activeQuery.append(hoverRule.rule.clone({
352
+ selector: hoverRule.rule.selector.replace(/:hover/gi, ':active')
353
+ }));
354
+ } // remove legacy rule from output
355
+
356
+
357
+ if (handleAllIgnoreCases(hoverRule.index)) {
358
+ hoverRule.rule.remove();
359
+ }
360
+ }
361
+ }
362
+
363
+ rootOriginal.walkAtRules(atrule => {
364
+ if (atrule !== undefined && atrule.nodes !== undefined && atrule.nodes.length === 0 || atrule.nodes === undefined) {
365
+ atrule.remove();
366
+ }
367
+ });
368
+ });