@zohodesk/client_build_tool 0.0.1-0.exp.0.0.3

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 (259) hide show
  1. package/.babelrc +12 -0
  2. package/.lintstagedrc +3 -0
  3. package/.vscode/settings.json +5 -0
  4. package/CHANGELOG.md +84 -0
  5. package/ConfigurationDocumentation.md +567 -0
  6. package/ContributionGuide.md +2 -0
  7. package/NOTES-Dec12.md +12 -0
  8. package/README.md +184 -0
  9. package/README_backup.md +100 -0
  10. package/TODO.md +35 -0
  11. package/cli.js +31 -0
  12. package/docs/BabelCustomizations.md +55 -0
  13. package/docs/CSSCustomPluginsDocumentation.md +71 -0
  14. package/docs/CustomChunksConfiguration.md +0 -0
  15. package/docs/EFCFileTemplate.md +0 -0
  16. package/docs/MockApi.md +61 -0
  17. package/docs/NameTemplateUtility.md +93 -0
  18. package/docs/ServiseWorkerTemplate.md +0 -0
  19. package/docs/SupportedBrowserVersions.md +61 -0
  20. package/helpDocs/check.js +7 -0
  21. package/helpDocs/commmands/build.md +0 -0
  22. package/helpDocs/commmands/start.md +0 -0
  23. package/helpDocs/examples/buildWithContentHash.md +0 -0
  24. package/helpDocs/examples/startDevServer.md +0 -0
  25. package/helpDocs/examples/startWithMockAPI.md +0 -0
  26. package/helpDocs/node18-env.md +30 -0
  27. package/helpDocs/troubleshootings/NewMachineSetup.md +71 -0
  28. package/helpDocs/troubleshootings/README.md +9 -0
  29. package/helpDocs/troubleshootings/hg_install.sh +18 -0
  30. package/helpDocs/troubleshootings/newMachineMac.sh +86 -0
  31. package/helpDocs/troubleshootings/newMachineUbundu.bash +84 -0
  32. package/lib/allCommandsConfigs.js +25 -0
  33. package/lib/commands/build/commandExecutor.js +17 -0
  34. package/lib/commands/build/config.js +12 -0
  35. package/lib/commands/build/optionsProcessor.js +35 -0
  36. package/lib/commands/build/preProcessor.js +12 -0
  37. package/lib/commands/buildEs/commandExecutor.js +33 -0
  38. package/lib/commands/buildEs/config.js +12 -0
  39. package/lib/commands/buildEs/preProcessor.js +17 -0
  40. package/lib/commands/buildLib/commandExecutor.js +33 -0
  41. package/lib/commands/buildLib/config.js +12 -0
  42. package/lib/commands/buildLib/preProcessor.js +17 -0
  43. package/lib/commands/mockserver/commandExecutor.js +43 -0
  44. package/lib/commands/mockserver/config.js +12 -0
  45. package/lib/commands/pre_process/commandExecutor.js +18 -0
  46. package/lib/commands/pre_process/config.js +12 -0
  47. package/lib/commands/start/commandExecutor.js +12 -0
  48. package/lib/commands/start/config.js +12 -0
  49. package/lib/commands/start/optionsProcessor.js +30 -0
  50. package/lib/commands/start/preProcessor.js +12 -0
  51. package/lib/commands/template/commandExecutor.js +28 -0
  52. package/lib/commands/template/config.js +12 -0
  53. package/lib/commands/version/commandExecutor.js +14 -0
  54. package/lib/commands/version/config.js +12 -0
  55. package/lib/commandsRouter.js +74 -0
  56. package/lib/index.js +12 -0
  57. package/lib/logger.js +34 -0
  58. package/lib/schemas/applyValuesToSchema/index.js +34 -0
  59. package/lib/schemas/applyValuesToSchema/isObject.js +10 -0
  60. package/lib/schemas/applyValuesToSchema/isValid.js +14 -0
  61. package/lib/schemas/cliArgsToObject.js +39 -0
  62. package/lib/schemas/defaultConfigValues.js +393 -0
  63. package/lib/schemas/defaultConfigValuesOnly.js +200 -0
  64. package/lib/schemas/deprecatedOptionsHandler.js +67 -0
  65. package/lib/schemas/getNpmVersion.js +22 -0
  66. package/lib/schemas/giveDefaultValue.js +18 -0
  67. package/lib/schemas/npmConfigToObject.js +35 -0
  68. package/lib/schemas/readOptions.js +87 -0
  69. package/lib/schemas/readOptionsForConfigFile.js +42 -0
  70. package/lib/shared/babel/addDefaultPlugins.js +15 -0
  71. package/lib/shared/babel/babelWebConfig.js +54 -0
  72. package/lib/shared/babel/babel_plugins/removeAttributesPlugin.js +23 -0
  73. package/lib/shared/babel/getBabelPlugin.js +42 -0
  74. package/lib/shared/babel/runBabelForJSFile.js +24 -0
  75. package/lib/shared/babel/runBabelForTsFile.js +30 -0
  76. package/lib/shared/bundler/webpack/common/decidePublicPath.js +57 -0
  77. package/lib/shared/bundler/webpack/common/hashUtils.js +20 -0
  78. package/lib/shared/bundler/webpack/common/libAlias.js +31 -0
  79. package/lib/shared/bundler/webpack/common/modeUtils.js +39 -0
  80. package/lib/shared/bundler/webpack/common/nameTemplates.js +105 -0
  81. package/lib/shared/bundler/webpack/common/resourceBasedPublicPath.js +21 -0
  82. package/lib/shared/bundler/webpack/configCustomLoaders.js +10 -0
  83. package/lib/shared/bundler/webpack/cssLoaders.js +16 -0
  84. package/lib/shared/bundler/webpack/custom_plugins/BundleIntegrityReport/index.js +83 -0
  85. package/lib/shared/bundler/webpack/custom_plugins/CdnChangePlugin/index.js +119 -0
  86. package/lib/shared/bundler/webpack/custom_plugins/CdnChangePlugin/webpackCustomJsUrlLoader.js +46 -0
  87. package/lib/shared/bundler/webpack/custom_plugins/CustomScriptLoadingPlugin.js +109 -0
  88. package/lib/shared/bundler/webpack/custom_plugins/EFCTemplatePlugin.js +112 -0
  89. package/lib/shared/bundler/webpack/custom_plugins/I18nNumericIndexPlugin/I18nNumericIndexHtmlInjectorPlugin.js +47 -0
  90. package/lib/shared/bundler/webpack/custom_plugins/I18nNumericIndexPlugin/I18nNumericIndexPlugin.js +190 -0
  91. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/ContributionGuide.md +11 -0
  92. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/I18nFilesEmitPlugin.js +174 -0
  93. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/I18nKeysIdentifer.js +76 -0
  94. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/I18nRuntimeDealerPlugin.js +223 -0
  95. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/I18nSplit.md +95 -0
  96. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/LocaleChunkAssetsStore.js +73 -0
  97. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/ModulesI18nKeysStore.js +88 -0
  98. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/README.md +25 -0
  99. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/constants.js +29 -0
  100. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/createHash.js +24 -0
  101. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/getI18nLoadingRuntimeModule.js +76 -0
  102. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/index.js +39 -0
  103. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/iterateModulesInChunk.js +50 -0
  104. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/optionsHandler.js +68 -0
  105. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/pathCreator.js +23 -0
  106. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/readI18nValues.js +29 -0
  107. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/templateFileName.js +43 -0
  108. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/templateHashHelpers.js +77 -0
  109. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/utils/collectAstKeys.js +98 -0
  110. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/utils/collectI18nKeys.js +66 -0
  111. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/utils/getChunkModules.js +13 -0
  112. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/utils/hashUtils.js +19 -0
  113. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/utils/index.js +31 -0
  114. package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/utils/propertiesUtils.js +129 -0
  115. package/lib/shared/bundler/webpack/custom_plugins/InitialHtmlPlugin.js +60 -0
  116. package/lib/shared/bundler/webpack/custom_plugins/ManifestJsonPlugin/addFilesNamesToManifestJson.js +30 -0
  117. package/lib/shared/bundler/webpack/custom_plugins/ManifestJsonPlugin/createInitialEntries.js +23 -0
  118. package/lib/shared/bundler/webpack/custom_plugins/ManifestJsonPlugin/createManifestJson.js +35 -0
  119. package/lib/shared/bundler/webpack/custom_plugins/ManifestJsonPlugin/findInitialFileNames.js +18 -0
  120. package/lib/shared/bundler/webpack/custom_plugins/ManifestJsonPlugin/index.js +46 -0
  121. package/lib/shared/bundler/webpack/custom_plugins/ManifestJsonPlugin/removeHashFromFileName.js +18 -0
  122. package/lib/shared/bundler/webpack/custom_plugins/RTLSplitPlugin.js +1 -0
  123. package/lib/shared/bundler/webpack/custom_plugins/ResourceHintsPlugin.js +193 -0
  124. package/lib/shared/bundler/webpack/custom_plugins/RtlSplitPlugin/OverwriteCssPathForRTL.js +62 -0
  125. package/lib/shared/bundler/webpack/custom_plugins/RtlSplitPlugin/RtlCssPlugin.js +84 -0
  126. package/lib/shared/bundler/webpack/custom_plugins/RtlSplitPlugin/RtrSplit.md +34 -0
  127. package/lib/shared/bundler/webpack/custom_plugins/RtlSplitPlugin/replaceCssDirTemplate.js +27 -0
  128. package/lib/shared/bundler/webpack/custom_plugins/RuntimeResourceCleanup/index.js +73 -0
  129. package/lib/shared/bundler/webpack/custom_plugins/SelectorWeightPlugin/classHandling.js +20 -0
  130. package/lib/shared/bundler/webpack/custom_plugins/SelectorWeightPlugin/index.js +78 -0
  131. package/lib/shared/bundler/webpack/custom_plugins/SelectorWeightPlugin/selectorWeightPrefixAdder.js +51 -0
  132. package/lib/shared/bundler/webpack/custom_plugins/SelectorWeightPlugin/windowsModification.js +16 -0
  133. package/lib/shared/bundler/webpack/custom_plugins/ServiceWorkerPlugin.js +120 -0
  134. package/lib/shared/bundler/webpack/custom_plugins/ServiceWorkerPluginUtils.js +13 -0
  135. package/lib/shared/bundler/webpack/custom_plugins/SourceMapPlugin/index.js +71 -0
  136. package/lib/shared/bundler/webpack/custom_plugins/TPHashMappingPlugin/addHashToFilePath.js +22 -0
  137. package/lib/shared/bundler/webpack/custom_plugins/TPHashMappingPlugin/index.js +55 -0
  138. package/lib/shared/bundler/webpack/custom_plugins/UglifyCSSPlugin/index.js.js +49 -0
  139. package/lib/shared/bundler/webpack/custom_plugins/VariableConversionCollector/ErrorHandler.js +62 -0
  140. package/lib/shared/bundler/webpack/custom_plugins/VariableConversionCollector/index.js +362 -0
  141. package/lib/shared/bundler/webpack/custom_plugins/custom_attribute_plugin/index.js +80 -0
  142. package/lib/shared/bundler/webpack/custom_plugins/emitAsset.js +14 -0
  143. package/lib/shared/bundler/webpack/custom_plugins/getInitialAssetsFuncTemplate.js +57 -0
  144. package/lib/shared/bundler/webpack/custom_plugins/getInitialI18nAssetsArrayStr.js +87 -0
  145. package/lib/shared/bundler/webpack/defaultVendorPatternList.js +13 -0
  146. package/lib/shared/bundler/webpack/devtoolConfig.js +13 -0
  147. package/lib/shared/bundler/webpack/entryConfig.js +28 -0
  148. package/lib/shared/bundler/webpack/externals.js +17 -0
  149. package/lib/shared/bundler/webpack/getCSSLoaders.js +29 -0
  150. package/lib/shared/bundler/webpack/getFilenameFromModule.js +24 -0
  151. package/lib/shared/bundler/webpack/jsLoaders.js +30 -0
  152. package/lib/shared/bundler/webpack/loaderConfigs/assetLoaders.js +12 -0
  153. package/lib/shared/bundler/webpack/loaderConfigs/babelLoaderConfig.js +18 -0
  154. package/lib/shared/bundler/webpack/loaderConfigs/checkIsPatternsMatchFilename.js +56 -0
  155. package/lib/shared/bundler/webpack/loaderConfigs/configHtmlTemplateLoader.js +18 -0
  156. package/lib/shared/bundler/webpack/loaderConfigs/configPostCssLoader.js +37 -0
  157. package/lib/shared/bundler/webpack/loaderConfigs/configWebWorkerLoader.js +21 -0
  158. package/lib/shared/bundler/webpack/loaderConfigs/configsAssetsLoaders.js +86 -0
  159. package/lib/shared/bundler/webpack/loaderConfigs/cssClassNameGenerate.js +65 -0
  160. package/lib/shared/bundler/webpack/loaderConfigs/getCssLoaderOptions.js +21 -0
  161. package/lib/shared/bundler/webpack/loaderConfigs/i18nIdReplaceLoaderConfig.js +94 -0
  162. package/lib/shared/bundler/webpack/loaders/i18nIdReplaceLoader.js +201 -0
  163. package/lib/shared/bundler/webpack/loaders/miniCssFallBackLoader.js +7 -0
  164. package/lib/shared/bundler/webpack/loaders/workerLoader.js +133 -0
  165. package/lib/shared/bundler/webpack/optimizationConfig.js +56 -0
  166. package/lib/shared/bundler/webpack/outputConfig.js +38 -0
  167. package/lib/shared/bundler/webpack/pluginConfigs/configBundleAnalyzer.js +40 -0
  168. package/lib/shared/bundler/webpack/pluginConfigs/configBundleIntegrityReport.js +36 -0
  169. package/lib/shared/bundler/webpack/pluginConfigs/configCSSMinifierPlugin.js +28 -0
  170. package/lib/shared/bundler/webpack/pluginConfigs/configCdnChangePlugin.js +27 -0
  171. package/lib/shared/bundler/webpack/pluginConfigs/configCopyPublicFolders.js +63 -0
  172. package/lib/shared/bundler/webpack/pluginConfigs/configCustomAttributesPlugin.js +20 -0
  173. package/lib/shared/bundler/webpack/pluginConfigs/configCustomScriptLoadingStrategyPlugin.js +76 -0
  174. package/lib/shared/bundler/webpack/pluginConfigs/configEFCTemplatePlugin.js +46 -0
  175. package/lib/shared/bundler/webpack/pluginConfigs/configEnvVariables.js +51 -0
  176. package/lib/shared/bundler/webpack/pluginConfigs/configHtmlWebpackPlugin.js +56 -0
  177. package/lib/shared/bundler/webpack/pluginConfigs/configI18nNumericIndexPlugin.js +113 -0
  178. package/lib/shared/bundler/webpack/pluginConfigs/configI18nSplitPlugin.js +41 -0
  179. package/lib/shared/bundler/webpack/pluginConfigs/configIgnorePlugin.js +16 -0
  180. package/lib/shared/bundler/webpack/pluginConfigs/configManifestJsonPlugin.js +44 -0
  181. package/lib/shared/bundler/webpack/pluginConfigs/configMiniCSSExtractPlugin.js +24 -0
  182. package/lib/shared/bundler/webpack/pluginConfigs/configProgressPlugin.js +24 -0
  183. package/lib/shared/bundler/webpack/pluginConfigs/configResourceHintsPlugin.js +21 -0
  184. package/lib/shared/bundler/webpack/pluginConfigs/configRtlCssPlugin.js +27 -0
  185. package/lib/shared/bundler/webpack/pluginConfigs/configRuntimeResourceCleanup.js +31 -0
  186. package/lib/shared/bundler/webpack/pluginConfigs/configSelectorWeightPlugin.js +28 -0
  187. package/lib/shared/bundler/webpack/pluginConfigs/configServiceWorkerPlugin.js +40 -0
  188. package/lib/shared/bundler/webpack/pluginConfigs/configSourceMapPlugin.js +20 -0
  189. package/lib/shared/bundler/webpack/pluginConfigs/configTPHashMappingPlugin.js +32 -0
  190. package/lib/shared/bundler/webpack/pluginConfigs/configVariableConversionPlugin.js +25 -0
  191. package/lib/shared/bundler/webpack/plugins.js +77 -0
  192. package/lib/shared/bundler/webpack/resolvers.js +82 -0
  193. package/lib/shared/bundler/webpack/splitChunksConfig.js +116 -0
  194. package/lib/shared/bundler/webpack/statsConfig.js +30 -0
  195. package/lib/shared/bundler/webpack/tsLoaders.js +17 -0
  196. package/lib/shared/bundler/webpack/utils/index.js +31 -0
  197. package/lib/shared/bundler/webpack/utils/object-manipulation.js +87 -0
  198. package/lib/shared/bundler/webpack/utils/updateArrayWithDefault.js +34 -0
  199. package/lib/shared/bundler/webpack/webpackBuild.js +27 -0
  200. package/lib/shared/bundler/webpack/webpackConfig.js +58 -0
  201. package/lib/shared/commands-utils/doBasicRequirementCheck.js +17 -0
  202. package/lib/shared/commands-utils/getCliPath.js +39 -0
  203. package/lib/shared/commands-utils/index.js +29 -0
  204. package/lib/shared/commands-utils/log.js +13 -0
  205. package/lib/shared/commands-utils/readArgsFormCommandLine.js +11 -0
  206. package/lib/shared/commands-utils/readOptionFormCommandLine.js +11 -0
  207. package/lib/shared/commands-utils/spawnSyncIO.js +38 -0
  208. package/lib/shared/constants.js +48 -0
  209. package/lib/shared/fileUtils/copyFile.js +38 -0
  210. package/lib/shared/fileUtils/directoryIterator.js +21 -0
  211. package/lib/shared/fileUtils/watchRun.js +112 -0
  212. package/lib/shared/postcss/custom_postcss_plugins/EmptyPlugin.js +21 -0
  213. package/lib/shared/postcss/custom_postcss_plugins/HoverActivePlugin/constants.js +10 -0
  214. package/lib/shared/postcss/custom_postcss_plugins/HoverActivePlugin/handleIgnores.js +66 -0
  215. package/lib/shared/postcss/custom_postcss_plugins/HoverActivePlugin/index.js +136 -0
  216. package/lib/shared/postcss/custom_postcss_plugins/HoverActivePlugin/insertBefore.js +32 -0
  217. package/lib/shared/postcss/custom_postcss_plugins/HoverActivePlugin/isPreviouslyProcessed.js +20 -0
  218. package/lib/shared/postcss/custom_postcss_plugins/HoverActivePlugin/replaceUtils.js +20 -0
  219. package/lib/shared/postcss/custom_postcss_plugins/HoverActivePlugin/separateHoveredSelectorAndNormalSelector.js +24 -0
  220. package/lib/shared/postcss/custom_postcss_plugins/HoverActivePlugin/specialCases.js +43 -0
  221. package/lib/shared/postcss/custom_postcss_plugins/HoverActivePlugin/typeCheckUtils.js +52 -0
  222. package/lib/shared/postcss/custom_postcss_plugins/RTLSplitPlugin.js +139 -0
  223. package/lib/shared/postcss/custom_postcss_plugins/SelectorReplace.js +90 -0
  224. package/lib/shared/postcss/custom_postcss_plugins/ValueReplacer.js +57 -0
  225. package/lib/shared/postcss/custom_postcss_plugins/VariableModificationPlugin/index.js +347 -0
  226. package/lib/shared/postcss/filterPluginsAllowedForSpecficFile.js +55 -0
  227. package/lib/shared/postcss/getAllowedPostCssPlugins.js +30 -0
  228. package/lib/shared/postcss/getSpecificPostCssPlugin.js +58 -0
  229. package/lib/shared/postcss/runPostCssForCssFile.js +37 -0
  230. package/lib/shared/pre_process/runPreProcess.js +58 -0
  231. package/lib/shared/server/configWebpackDevMiddleware.js +41 -0
  232. package/lib/shared/server/corsHandling.js +30 -0
  233. package/lib/shared/server/getIp.js +30 -0
  234. package/lib/shared/server/getServerURL.js +36 -0
  235. package/lib/shared/server/httpsOptions.js +46 -0
  236. package/lib/shared/server/initExpressApp.js +19 -0
  237. package/lib/shared/server/initialHTMLHandling.js +99 -0
  238. package/lib/shared/server/mockApiHandler.js +67 -0
  239. package/lib/shared/server/mockServer.js +41 -0
  240. package/lib/shared/server/serveContextFiles.js +27 -0
  241. package/lib/shared/server/serverBywebpackDevMiddleware.js +35 -0
  242. package/lib/shared/server/startHttpServer.js +26 -0
  243. package/lib/shared/server/startHttpsServer.js +38 -0
  244. package/lib/shared/server/unwanted/addHttp2Server.js +41 -0
  245. package/lib/shared/server/unwanted/configWebpackDevMiddleware.js +44 -0
  246. package/lib/shared/server/unwanted/mockApiSupport.js +19 -0
  247. package/lib/shared/server/unwanted/websocketMockSetup.js +48 -0
  248. package/lib/shared/server/urlConcat.js +32 -0
  249. package/lib/shared/utils/requireLocalOrGlobal.js +81 -0
  250. package/lib/shared/utils/utils.js +1 -0
  251. package/lib/shared/utils/versionPrint.js +20 -0
  252. package/npm-shrinkwrap.json +5657 -0
  253. package/package.json +64 -0
  254. package/polyfillForOldNodeVersion.js +10 -0
  255. package/templates/app/README.MD +30 -0
  256. package/templates/app/package.json +12 -0
  257. package/templates/library/README.MD +28 -0
  258. package/templates/library/package.json +11 -0
  259. package/templates/wms/index.html +43 -0
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "doBasicRequirementCheck", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _doBasicRequirementCheck.doBasicRequirementCheck;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "readArgsFormCommandLine", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _readArgsFormCommandLine.readArgsFormCommandLine;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "readOptionFormCommandLine", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _readOptionFormCommandLine.readOptionFormCommandLine;
22
+ }
23
+ });
24
+
25
+ var _readArgsFormCommandLine = require("./readArgsFormCommandLine");
26
+
27
+ var _readOptionFormCommandLine = require("./readOptionFormCommandLine");
28
+
29
+ var _doBasicRequirementCheck = require("./doBasicRequirementCheck");
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.log = void 0;
7
+
8
+ let log = (...info) => {
9
+ let print = console;
10
+ print.log(...info);
11
+ };
12
+
13
+ exports.log = log;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.readArgsFormCommandLine = readArgsFormCommandLine;
7
+ const args = process.argv.slice(3);
8
+
9
+ function readArgsFormCommandLine() {
10
+ return args;
11
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.readOptionFormCommandLine = readOptionFormCommandLine;
7
+ const [,, option] = process.argv;
8
+
9
+ function readOptionFormCommandLine() {
10
+ return option;
11
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.defaultSpawnSyncOptions = void 0;
7
+ exports.spawnIO = spawnIO;
8
+ exports.spawnSyncIO = spawnSyncIO;
9
+
10
+ var _child_process = require("child_process");
11
+
12
+ var _logger = require("../../logger");
13
+
14
+ var _getCliPath = require("./getCliPath");
15
+
16
+ const defaultSpawnSyncOptions = {
17
+ stdio: 'inherit'
18
+ };
19
+ exports.defaultSpawnSyncOptions = defaultSpawnSyncOptions;
20
+
21
+ function spawnSyncIO(commandName, args, spawnSyncOptions = defaultSpawnSyncOptions) {
22
+ const command = (0, _getCliPath.getCliPath)(commandName);
23
+ const result = (0, _child_process.spawnSync)(command, args, spawnSyncOptions);
24
+
25
+ if (result.error || result.stderr) {
26
+ (0, _logger.errorLogger)(result.error || result.stderr);
27
+ }
28
+
29
+ return result;
30
+ }
31
+
32
+ function spawnIO(commandName, args, cb) {
33
+ const command = (0, _getCliPath.getCliPath)(commandName); // const result =
34
+
35
+ return (0, _child_process.spawn)(command, args, {
36
+ stdio: 'inherit'
37
+ }, cb); // process.exit(result.status);
38
+ }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.cliRootPath = exports.cliNodeModulesPath = exports.babelrcPath = exports.appPath = exports.appNodeModules = exports.CONFIG_ROOT = exports.BASE_CONFIG_KEY = void 0;
7
+ exports.getTemplatePath = getTemplatePath;
8
+ exports.joinWithAppPath = joinWithAppPath;
9
+ exports.templatesPath = void 0;
10
+
11
+ var _path = _interopRequireWildcard(require("path"));
12
+
13
+ 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); }
14
+
15
+ 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; }
16
+
17
+ const BASE_CONFIG_KEY = 'react-cli';
18
+ exports.BASE_CONFIG_KEY = BASE_CONFIG_KEY;
19
+
20
+ const cliRootPath = _path.default.resolve(__dirname, '..', '..');
21
+
22
+ exports.cliRootPath = cliRootPath;
23
+ const CONFIG_ROOT = 'client-build-config';
24
+ exports.CONFIG_ROOT = CONFIG_ROOT;
25
+
26
+ const cliNodeModulesPath = _path.default.resolve(cliRootPath, 'node_modules');
27
+
28
+ exports.cliNodeModulesPath = cliNodeModulesPath;
29
+ const babelrcPath = (0, _path.join)(cliRootPath, '.babelrc');
30
+ exports.babelrcPath = babelrcPath;
31
+ const appPath = process.cwd();
32
+ exports.appPath = appPath;
33
+
34
+ function joinWithAppPath(filePath) {
35
+ // TODO: test in windows
36
+ return (0, _path.join)(appPath, filePath);
37
+ }
38
+
39
+ ;
40
+ const appNodeModules = joinWithAppPath('node_modules');
41
+ exports.appNodeModules = appNodeModules;
42
+ const templatesPath = (0, _path.join)(__dirname, '..', '..', 'templates');
43
+ exports.templatesPath = templatesPath;
44
+
45
+ function getTemplatePath(...filePath) {
46
+ // TODO: test in windows
47
+ return (0, _path.join)(templatesPath, ...filePath);
48
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.copyFile = copyFile;
7
+ exports.createParentDir = createParentDir;
8
+ exports.writeFile = writeFile;
9
+
10
+ var _fs = require("fs");
11
+
12
+ var _path = _interopRequireDefault(require("path"));
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ function createParentDir(filename) {
17
+ const {
18
+ dir
19
+ } = _path.default.parse(filename);
20
+
21
+ if (!(0, _fs.existsSync)(dir)) {
22
+ (0, _fs.mkdirSync)(dir, {
23
+ recursive: true
24
+ });
25
+ }
26
+ }
27
+
28
+ function copyFile(filename, outputFile) {
29
+ createParentDir(outputFile);
30
+ const readStream = (0, _fs.createReadStream)(filename);
31
+ const writeStream = (0, _fs.createWriteStream)(outputFile);
32
+ return readStream.pipe(writeStream);
33
+ }
34
+
35
+ function writeFile(filename, data) {
36
+ createParentDir(filename);
37
+ return (0, _fs.writeFileSync)(filename, data);
38
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.directoryIterator = directoryIterator;
7
+
8
+ var _fs = require("fs");
9
+
10
+ var _path = require("path");
11
+
12
+ function directoryIterator(filename, callback) {
13
+ if (!(0, _fs.statSync)(filename).isDirectory()) {
14
+ callback(filename);
15
+ return;
16
+ }
17
+
18
+ (0, _fs.readdirSync)(filename).forEach(fileOrDir => {
19
+ directoryIterator((0, _path.join)(filename, fileOrDir), callback);
20
+ });
21
+ }
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.watchRun = watchRun;
7
+
8
+ var _path = _interopRequireDefault(require("path"));
9
+
10
+ var _watcher = _interopRequireDefault(require("watcher"));
11
+
12
+ var _runBabelForJSFile = require("../babel/runBabelForJSFile");
13
+
14
+ var _runBabelForTsFile = require("../babel/runBabelForTsFile");
15
+
16
+ var _runPostCssForCssFile = require("../postcss/runPostCssForCssFile");
17
+
18
+ var _directoryIterator = require("./directoryIterator");
19
+
20
+ var _copyFile = require("./copyFile");
21
+
22
+ var _logger = require("../../logger");
23
+
24
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
+
26
+ const isJs = ext => ext === '.js';
27
+
28
+ const isTs = ext => ext === '.ts' || ext === '.tsx';
29
+
30
+ const isCss = ext => ext === '.css';
31
+
32
+ function watchRun({
33
+ options,
34
+ src,
35
+ target,
36
+ canWatch,
37
+ mode
38
+ }) {
39
+ let updatedFileCount = 0;
40
+
41
+ function doWorkForSeparateFile(filename) {
42
+ const outputFile = filename.replace(src, target);
43
+
44
+ const {
45
+ ext
46
+ } = _path.default.parse(filename);
47
+
48
+ if (isJs(ext)) {
49
+ (0, _runBabelForJSFile.runBabelForJSFile)({
50
+ filename,
51
+ outputFile,
52
+ options,
53
+ mode
54
+ });
55
+ } else if (isCss(ext)) {
56
+ (0, _runPostCssForCssFile.runPostCssForCssFile)({
57
+ filename,
58
+ outputFile,
59
+ options
60
+ });
61
+ } else if (isTs(ext)) {
62
+ (0, _runBabelForTsFile.runBabelForTSFile)({
63
+ filename,
64
+ outputFile,
65
+ options,
66
+ mode
67
+ });
68
+ } else {
69
+ (0, _copyFile.copyFile)(filename, outputFile);
70
+ }
71
+
72
+ updatedFileCount++;
73
+ }
74
+
75
+ function doWork(foldername) {
76
+ updatedFileCount = 0;
77
+ const startTime = Date.now();
78
+ (0, _directoryIterator.directoryIterator)(foldername, filename => {
79
+ try {
80
+ doWorkForSeparateFile(filename);
81
+ } catch (error) {
82
+ (0, _logger.messageLogger)(`ERROR In: ${filename}`);
83
+ (0, _logger.messageLogger)(error);
84
+ }
85
+ });
86
+ (0, _logger.messageLogger)(`Successfully compiled ${updatedFileCount} files with Babel and Post-CSS (${Date.now() - startTime}ms).`);
87
+ }
88
+
89
+ doWork(src);
90
+
91
+ if (canWatch) {
92
+ const watcher = new _watcher.default(src, {
93
+ recursive: true,
94
+ ignoreInitial: true,
95
+ ignore: filename => filename.indexOf('__tests__') !== -1 // remove the test cases
96
+
97
+ });
98
+ watcher.on('all', (event, filename) => {
99
+ if (event === 'unlink' || event === 'unlinkDir') {
100
+ return;
101
+ }
102
+
103
+ doWork(filename); // This is what the library does internally when you pass it a handler directly
104
+ // arguments [0] (event); // => could be any target event: 'add', 'addDir', 'change', 'rename', 'renameDir', 'unlink' or 'unlinkDir'
105
+ // arguments [1] (filename); // => the file system path where the event took place, this is always provided
106
+ // arguments [2] (targetPathNext); // => the file system path "targetPath" got renamed to, this is only provided on 'rename'/'renameDir' events
107
+ });
108
+ watcher.on('error', error => {
109
+ (0, _logger.messageLogger)(error); // => true, "Error" instances are always provided on "error"
110
+ });
111
+ }
112
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ // eslint-disable-next-line no-unused-vars
9
+ const EmptyPlugin = (opts = {}) => ({
10
+ postcssPlugin: 'postcss-empty',
11
+
12
+ // eslint-disable-next-line no-unused-vars
13
+ Once(root, {
14
+ result
15
+ }) {}
16
+
17
+ });
18
+
19
+ EmptyPlugin.postcss = true;
20
+ var _default = EmptyPlugin;
21
+ exports.default = _default;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.HOVER_NOTATION = void 0;
7
+
8
+ /* eslint-disable no-use-before-define */
9
+ const HOVER_NOTATION = ':hover';
10
+ exports.HOVER_NOTATION = HOVER_NOTATION;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.handleIgnores = handleIgnores;
7
+
8
+ var _typeCheckUtils = require("./typeCheckUtils");
9
+
10
+ const hoverIgnoreQuery = 'Hover:ignore';
11
+ const activeIgnoreQuery = 'Active:ignore';
12
+ const hoverActiveIgnoreQuery = 'HoverActive:ignore';
13
+
14
+ function handleIgnore() {
15
+ let isIgnored = false;
16
+ return {
17
+ isIgnored: () => isIgnored,
18
+ update: isGoingTobeIgnored => {
19
+ isIgnored = isGoingTobeIgnored;
20
+ },
21
+ reset: () => {
22
+ isIgnored = false;
23
+ }
24
+ };
25
+ } // eslint-disable-next-line no-unused-vars
26
+
27
+
28
+ function handleIgnores(options) {
29
+ const hoverHandler = handleIgnore();
30
+ const activeHandler = handleIgnore();
31
+
32
+ function generateReturnValue() {
33
+ return {
34
+ hoverIgnored: hoverHandler.isIgnored(),
35
+ activeIgnored: activeHandler.isIgnored()
36
+ };
37
+ }
38
+
39
+ const ignoreCommentMap = {
40
+ [hoverIgnoreQuery]: () => {
41
+ hoverHandler.update(true);
42
+ },
43
+ [activeIgnoreQuery]: () => {
44
+ activeHandler.update(true);
45
+ },
46
+ [hoverActiveIgnoreQuery]: () => {
47
+ hoverHandler.update(true);
48
+ activeHandler.update(true);
49
+ }
50
+ };
51
+ return node => {
52
+ if ((0, _typeCheckUtils.isComment)(node)) {
53
+ const commentText = node.text.trim();
54
+ ignoreCommentMap[commentText] && ignoreCommentMap[commentText](); // NOTE: we return here because this is just comment we can skip it.
55
+
56
+ return generateReturnValue();
57
+ } // NOTE: we get the here. But return after resetting for next. Because these comment Only works for once.
58
+ // Even If we support multiple line Skip we must do it in reset or separate method.
59
+
60
+
61
+ const returnValue = generateReturnValue();
62
+ hoverHandler.reset();
63
+ activeHandler.reset();
64
+ return returnValue;
65
+ };
66
+ }
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _handleIgnores = require("./handleIgnores");
9
+
10
+ var _typeCheckUtils = require("./typeCheckUtils");
11
+
12
+ var _isPreviouslyProcessed = require("./isPreviouslyProcessed");
13
+
14
+ var _insertBefore = require("./insertBefore");
15
+
16
+ var _separateHoveredSelectorAndNormalSelector = require("./separateHoveredSelectorAndNormalSelector");
17
+
18
+ var _replaceUtils = require("./replaceUtils");
19
+
20
+ var _specialCases = require("./specialCases");
21
+
22
+ var _default = config => {
23
+ const hoverMedQuerySuffix = config.hover;
24
+ const activeMedQuerySuffix = config.active;
25
+ return {
26
+ postcssPlugin: 'postcss-mobile-hover',
27
+ Once: function Once(root, params) {
28
+ const getIgnoreStatus = (0, _handleIgnores.handleIgnores)(); // eslint-disable-next-line no-use-before-define
29
+
30
+ const mediaRuleCreatorMap = getMediaRuleMap(params, hoverMedQuerySuffix, activeMedQuerySuffix);
31
+ root.walk(node => {
32
+ const ignoreStatus = getIgnoreStatus(node);
33
+
34
+ if ((0, _typeCheckUtils.isRule)(node) === false) {
35
+ return;
36
+ }
37
+
38
+ if ((0, _typeCheckUtils.isAtRule)(node.parent) && !(0, _typeCheckUtils.isMediaQuery)(node.parent)) {
39
+ return;
40
+ } // NOTE: after previous return we expect rule that are only normal rule or rules that inside media query
41
+
42
+
43
+ const rule = node;
44
+
45
+ if ((0, _isPreviouslyProcessed.isPreviouslyProcessed)(rule, {
46
+ hoverMedQuerySuffix,
47
+ activeMedQuerySuffix
48
+ })) {
49
+ return;
50
+ }
51
+
52
+ const {
53
+ hoveredSelectors,
54
+ normalSelectors
55
+ } = (0, _separateHoveredSelectorAndNormalSelector.separateHoveredSelectorAndNormalSelector)(rule.selector); // NOTE: this if will remove rule if the rule has no normal selectors. and return So be aware.
56
+
57
+ if (hoveredSelectors.length === 0) {
58
+ // || isRuleHasHover(rule) === false
59
+ return;
60
+ }
61
+
62
+ let newHoverMediaQuery = null;
63
+ let newActiveMediaQuery = null;
64
+ let prefix = '';
65
+
66
+ if ((0, _typeCheckUtils.isAtRule)(rule.parent)) {
67
+ prefix = rule.parent.params;
68
+ } else {
69
+ // NOTE: for usual rules we don't need prefix, So use prefix as empty string
70
+ prefix = '';
71
+ }
72
+
73
+ if (!ignoreStatus.hoverIgnored) {
74
+ newHoverMediaQuery = mediaRuleCreatorMap.hoverRule({
75
+ rule,
76
+ hoveredSelectors,
77
+ prefix
78
+ }, params);
79
+ }
80
+
81
+ if (!ignoreStatus.activeIgnored) {
82
+ newActiveMediaQuery = mediaRuleCreatorMap.activeRule({
83
+ rule,
84
+ hoveredSelectors,
85
+ prefix
86
+ }, params);
87
+ }
88
+
89
+ (0, _insertBefore.insertNearBy)(rule, newHoverMediaQuery);
90
+ (0, _insertBefore.insertNearBy)(rule, newActiveMediaQuery);
91
+ (0, _specialCases.hackForComposes)(rule, hoveredSelectors, params);
92
+ (0, _specialCases.removeRuleIfNoNormalSelectors)(normalSelectors, rule);
93
+ });
94
+ }
95
+ };
96
+ };
97
+
98
+ exports.default = _default;
99
+
100
+ function getMediaRuleMap(params, hoverMedQuerySuffix, activeMedQuerySuffix) {
101
+ const {
102
+ AtRule
103
+ } = params;
104
+ return {
105
+ hoverRule({
106
+ rule,
107
+ hoveredSelectors,
108
+ prefix
109
+ }) {
110
+ const newMediaQuery = new AtRule({
111
+ name: 'media',
112
+ params: (0, _isPreviouslyProcessed.concatMediaParams)(prefix, hoverMedQuerySuffix)
113
+ });
114
+ const clonedRule = rule.clone();
115
+ clonedRule.selector = hoveredSelectors.join(',');
116
+ newMediaQuery.append(clonedRule);
117
+ return newMediaQuery;
118
+ },
119
+
120
+ activeRule({
121
+ rule,
122
+ hoveredSelectors,
123
+ prefix
124
+ }) {
125
+ const newMediaQuery = new AtRule({
126
+ name: 'media',
127
+ params: (0, _isPreviouslyProcessed.concatMediaParams)(prefix, activeMedQuerySuffix)
128
+ });
129
+ const clonedRule = rule.clone();
130
+ clonedRule.selector = hoveredSelectors.map(_replaceUtils.replaceHoverToActiveInSelector).join(',');
131
+ newMediaQuery.append(clonedRule);
132
+ return newMediaQuery;
133
+ }
134
+
135
+ };
136
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.insertBefore = insertBefore;
7
+ exports.insertNearBy = insertNearBy;
8
+
9
+ var _typeCheckUtils = require("./typeCheckUtils");
10
+
11
+ function insertBefore(node, newNode) {
12
+ newNode && node.parent.insertBefore(node, newNode);
13
+ return newNode;
14
+ } // function insertAfter(node, newNode) {
15
+ // newNode && node.parent.insertAfter(node, newNode);
16
+ // return newNode;
17
+ // }
18
+
19
+
20
+ function insertNearBy(node, newNode) {
21
+ if (!newNode) {
22
+ return newNode;
23
+ } // we use insertBefore Because we wouldn't end up recursive (repeated) check and creation
24
+
25
+
26
+ if ((0, _typeCheckUtils.isParentAtRule)(node) && (0, _typeCheckUtils.isAtRule)(newNode)) {
27
+ return insertNearBy(node.parent, newNode);
28
+ }
29
+
30
+ return insertBefore(node, newNode); // return insertAfter(node, newNode);
31
+ // return newNode;
32
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.concatMediaParams = concatMediaParams;
7
+ exports.isPreviouslyProcessed = isPreviouslyProcessed;
8
+
9
+ var _typeCheckUtils = require("./typeCheckUtils");
10
+
11
+ function concatMediaParams(prefix, suffix) {
12
+ return prefix ? `${prefix} and ${suffix}` : `${suffix}`;
13
+ }
14
+
15
+ function isPreviouslyProcessed(rule, {
16
+ hoverMedQuerySuffix,
17
+ activeMedQuerySuffix
18
+ }) {
19
+ return (0, _typeCheckUtils.isParentAtRule)(rule) && ((0, _typeCheckUtils.isParentAtRuleContainsParam)(rule, hoverMedQuerySuffix) || (0, _typeCheckUtils.isParentAtRuleContainsParam)(rule, activeMedQuerySuffix));
20
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.replaceHoverToActiveInSelector = exports.removeHoverFromSelector = void 0;
7
+
8
+ var _constants = require("./constants");
9
+
10
+ // function isRuleHasHover(rule) {
11
+ // return isSelectorHasHover(rule.selector);
12
+ // }
13
+ function generateReplacer(baseStr, replaceStr) {
14
+ return (inputStr = '') => inputStr.replaceAll(baseStr, replaceStr);
15
+ }
16
+
17
+ const removeHoverFromSelector = generateReplacer(_constants.HOVER_NOTATION, '');
18
+ exports.removeHoverFromSelector = removeHoverFromSelector;
19
+ const replaceHoverToActiveInSelector = generateReplacer(_constants.HOVER_NOTATION, ':active');
20
+ exports.replaceHoverToActiveInSelector = replaceHoverToActiveInSelector;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.separateHoveredSelectorAndNormalSelector = separateHoveredSelectorAndNormalSelector;
7
+
8
+ var _typeCheckUtils = require("./typeCheckUtils");
9
+
10
+ function separateHoveredSelectorAndNormalSelector(fullselector = '') {
11
+ const hoveredSelectors = [];
12
+ const normalSelectors = [];
13
+ fullselector.split(/\s*,\s*/).forEach(selector => {
14
+ if ((0, _typeCheckUtils.isSelectorHasHover)(selector)) {
15
+ hoveredSelectors.push(selector);
16
+ } else {
17
+ normalSelectors.push(selector);
18
+ }
19
+ });
20
+ return {
21
+ hoveredSelectors,
22
+ normalSelectors
23
+ };
24
+ }