purgetss 5.2.2 → 5.3.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.
package/index.js CHANGED
@@ -16,6 +16,8 @@ module.exports.colores = colores;
16
16
  const purgeLabel = colores.purgeLabel;
17
17
  const helpers = require(path.resolve(__dirname, './lib/helpers'));
18
18
 
19
+ let purgingDebug = false;
20
+
19
21
  const logger = {
20
22
  info: function(...args) {
21
23
  console.log(purgeLabel, args.join(' '));
@@ -42,7 +44,7 @@ const projectPurgeTSSFolder = cwd + '/purgetss';
42
44
  const projectConfigJS = cwd + '/purgetss/config.js';
43
45
  const projectTailwindTSS = cwd + '/purgetss/tailwind.tss';
44
46
  const projectPurgeTSSFontsFolder = cwd + '/purgetss/fonts';
45
- const projecrFontAwesomeTSS = cwd + '/purgetss/fontawesome.tss';
47
+ const projectFontAwesomeTSS = cwd + '/purgetss/fontawesome.tss';
46
48
 
47
49
  // js icon modules
48
50
  const srcLibFA = path.resolve(__dirname, './dist/fontawesome.js');
@@ -94,6 +96,7 @@ const srcMaterialDesignIconsTSSFile = path.resolve(__dirname, './dist/materialde
94
96
  const srcConfigFile = path.resolve(__dirname, './lib/templates/purgetss.config.js');
95
97
 
96
98
  const configFile = (fs.existsSync(projectConfigJS)) ? require(projectConfigJS) : require(srcConfigFile);
99
+ if (!configFile.purge) configFile.purge = { mode: 'all' };
97
100
  const configOptions = (configFile.purge && configFile.purge.options) ? configFile.purge.options : false;
98
101
  const srcJMKFile = (isInstalledGlobally) ? path.resolve(__dirname, './lib/templates/alloy.jmk') : path.resolve(__dirname, './lib/templates/alloy-local.jmk');
99
102
 
@@ -101,10 +104,11 @@ const srcJMKFile = (isInstalledGlobally) ? path.resolve(__dirname, './lib/templa
101
104
 
102
105
  //! Command: purgetss
103
106
  function purgeClasses(options) {
107
+ purgingDebug = options.debug;
104
108
  if (alloyProject()) {
105
109
  start();
106
110
 
107
- init();
111
+ init(options);
108
112
 
109
113
  backupOriginalAppTss();
110
114
 
@@ -139,19 +143,19 @@ function purgeClasses(options) {
139
143
  }
140
144
  module.exports.purgeClasses = purgeClasses;
141
145
 
142
- function init() {
146
+ function init(options) {
143
147
  // config file
144
148
  if (!fs.existsSync(projectConfigJS)) {
145
149
  createConfigFile();
146
150
  }
147
151
 
148
152
  // tailwind.tss
149
- if (!fs.existsSync(projectTailwindTSS)) {
153
+ if (!fs.existsSync(projectTailwindTSS) || options.all) {
150
154
  buildCustomTailwind('file created!');
151
155
  }
152
156
 
153
157
  // definitios file
154
- if (!fs.existsSync(cwd + '/purgetss/definitions.css')) {
158
+ if (!fs.existsSync(cwd + '/purgetss/definitions.css') || options.all) {
155
159
  createDefinitionsFile();
156
160
  }
157
161
 
@@ -461,11 +465,11 @@ function buildCustomFonts(options) {
461
465
  }
462
466
 
463
467
  if (files.length > 0) {
464
- console.log();
465
-
466
- finish(`Finished building ${chalk.yellow('fonts.tss')} in`);
467
468
 
468
469
  createDefinitionsFile();
470
+
471
+ console.log();
472
+ finish(`Finished building ${chalk.yellow('fonts.tss')} in`);
469
473
  } else {
470
474
  logger.info('No fonts found in', chalk.yellow('./purgetss/fonts'), 'folder!');
471
475
  }
@@ -495,7 +499,7 @@ function processCustomFontAwesomeTSS(CSSFile, templateTSS, resetTSS, fontFamilie
495
499
 
496
500
  tssClasses += processFontawesomeStyles(data);
497
501
 
498
- fs.writeFileSync(projecrFontAwesomeTSS, tssClasses, err => {
502
+ fs.writeFileSync(projectFontAwesomeTSS, tssClasses, err => {
499
503
  throw err;
500
504
  });
501
505
 
@@ -762,9 +766,7 @@ function purgeCustomFonts(uniqueClasses, cleanUniqueClasses) {
762
766
  if (fs.existsSync(cwd + '/purgetss/fonts.tss')) {
763
767
  let purgedClasses = '\n// Custom Fonts styles\n';
764
768
 
765
- let sourceTSS = fs.readFileSync(cwd + '/purgetss/fonts.tss', 'utf8').split(/\r?\n/);
766
-
767
- purgedClasses += purgeFontIcons(sourceTSS, uniqueClasses, 'Purging Custom Fonts styles...', cleanUniqueClasses, []);
769
+ purgedClasses += purgeFontIcons(cwd + '/purgetss/fonts.tss', uniqueClasses, 'Purging Custom Fonts styles...', cleanUniqueClasses, []);
768
770
 
769
771
  return (purgedClasses === '\n// Custom Fonts styles\n') ? '' : purgedClasses;
770
772
  }
@@ -940,6 +942,8 @@ function getClassesOnlyFromXMLFiles() {
940
942
  }
941
943
 
942
944
  function getUniqueClasses() {
945
+ localStart();
946
+
943
947
  let viewPaths = getViewPaths();
944
948
 
945
949
  let allClasses = [];
@@ -965,6 +969,8 @@ function getUniqueClasses() {
965
969
  }
966
970
  });
967
971
 
972
+ localFinish('Get Unique Classes');
973
+
968
974
  return uniqueClasses.sort();
969
975
  }
970
976
 
@@ -986,6 +992,7 @@ function filterCharacters(uniqueClass) {
986
992
  !uniqueClass.includes('=') &&
987
993
  !uniqueClass.includes('L(') &&
988
994
  !uniqueClass.endsWith(',') &&
995
+ !uniqueClass.endsWith('.') &&
989
996
  !uniqueClass.endsWith('/');
990
997
  }
991
998
 
@@ -993,21 +1000,25 @@ function filterCharacters(uniqueClass) {
993
1000
  function buildCustomTailwind(message = 'file created!') {
994
1001
  const defaultColors = require('tailwindcss/colors');
995
1002
  const defaultTheme = require('tailwindcss/defaultTheme');
1003
+ const defaultThemeWidth = defaultTheme.width({ theme: () => (defaultTheme.spacing) });
1004
+ const defaultThemeHeight = defaultTheme.height({ theme: () => (defaultTheme.spacing) });
996
1005
 
997
1006
  removeDeprecatedColors(defaultColors);
998
1007
 
999
1008
  // !Prepare values
1000
1009
  configFile.theme.extend = configFile.theme.extend ?? {};
1001
1010
 
1011
+ let tiResets = { full: '100%' };
1012
+
1002
1013
  let allWidthsCombined = (configFile.theme.spacing)
1003
- ? { ...{ full: '100%', auto: '', screen: '' }, ...configFile.theme.spacing }
1004
- : { ...defaultTheme.width({ theme: () => (defaultTheme.spacing) }) };
1014
+ ? { ...configFile.theme.spacing, ...tiResets }
1015
+ : { ...defaultThemeWidth };
1005
1016
  let allHeightsCombined = (configFile.theme.spacing)
1006
- ? { ...{ full: '100%', auto: '', screen: '' }, ...configFile.theme.spacing }
1007
- : { ...defaultTheme.width({ theme: () => (defaultTheme.spacing) }), ...defaultTheme.height({ theme: () => (defaultTheme.spacing) }) };
1017
+ ? { ...configFile.theme.spacing, ...tiResets }
1018
+ : { ...defaultThemeHeight };
1008
1019
  let allSpacingCombined = (configFile.theme.spacing)
1009
- ? { ...{ full: '100%', auto: '', screen: '' }, ...configFile.theme.spacing }
1010
- : { ...defaultTheme.spacing, ...defaultTheme.width({ theme: () => (defaultTheme.spacing) }), ...defaultTheme.height({ theme: () => (defaultTheme.spacing) }) };
1020
+ ? { ...configFile.theme.spacing, ...tiResets }
1021
+ : { ...defaultThemeWidth, ...defaultThemeHeight };
1011
1022
 
1012
1023
  let overwritten = {
1013
1024
  width: configFile.theme.width ?? allWidthsCombined,
@@ -1019,20 +1030,25 @@ function buildCustomTailwind(message = 'file created!') {
1019
1030
  //! Remove unnecessary values
1020
1031
  removeFitMaxMin(overwritten);
1021
1032
 
1022
- let base = { colors: {}, spacing: {}, width: {}, height: {} };
1033
+ let base = {
1034
+ colors: {},
1035
+ spacing: {},
1036
+ width: {},
1037
+ height: {},
1038
+ columns: { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12 },
1039
+ delay: { 0: '0ms', 25: '25ms', 50: '50ms', 250: '250ms', 350: '350ms', 400: '400ms', 450: '450ms', 600: '600ms', 800: '800ms', 900: '900ms', 2000: '2000ms', 3000: '3000ms', 4000: '4000ms', 5000: '5000ms' }
1040
+ };
1023
1041
 
1024
1042
  _.merge(base.colors, overwritten.colors, configFile.theme.extend.colors);
1025
1043
  _.merge(base.spacing, overwritten.spacing, configFile.theme.extend.spacing);
1026
1044
  _.merge(base.width, overwritten.spacing, configFile.theme.extend.spacing, overwritten.width, configFile.theme.extend.width);
1027
1045
  _.merge(base.height, overwritten.spacing, configFile.theme.extend.spacing, overwritten.height, configFile.theme.extend.height);
1028
1046
 
1029
- // Fix any '.333333%' value to '.333334%' to propertly fit the screen
1030
1047
  fixPercentages(base.width);
1031
1048
  fixPercentages(base.height);
1032
1049
  fixPercentages(base.spacing);
1033
1050
 
1034
1051
  let configThemeFile = {};
1035
-
1036
1052
  //! Process custom Window, View and ImageView
1037
1053
  configThemeFile.Window = (configFile.theme.Window && configFile.theme.Window.apply)
1038
1054
  ? _.merge({ apply: configFile.theme.Window.apply }, configFile.theme.Window)
@@ -1052,9 +1068,13 @@ function buildCustomTailwind(message = 'file created!') {
1052
1068
  configThemeFile.height = base.height;
1053
1069
  configThemeFile.width = base.width;
1054
1070
  configThemeFile.margin = combineKeys(configFile.theme, base.spacing, 'margin');
1071
+ configThemeFile.margin2 = combineKeys(configFile.theme, base.spacing, 'margin');
1055
1072
 
1056
1073
  //! Properties with constant values
1074
+ // configThemeFile.audioStreamType = {};
1075
+ // configThemeFile.category = {};
1057
1076
  configThemeFile.accessibilityHidden = {};
1077
+ configThemeFile.accessoryType = {};
1058
1078
  configThemeFile.activeIconIsMask = {};
1059
1079
  configThemeFile.activityEnterTransition = {};
1060
1080
  configThemeFile.activityExitTransition = {};
@@ -1066,6 +1086,8 @@ function buildCustomTailwind(message = 'file created!') {
1066
1086
  configThemeFile.activitySharedElementReenterTransition = {};
1067
1087
  configThemeFile.activitySharedElementReturnTransition = {};
1068
1088
  configThemeFile.alertDialogStyle = {};
1089
+ configThemeFile.allowsBackForwardNavigationGestures = {};
1090
+ configThemeFile.allowsLinkPreview = {};
1069
1091
  configThemeFile.allowsMultipleSelectionDuringEditing = {};
1070
1092
  configThemeFile.allowsMultipleSelectionInteraction = {};
1071
1093
  configThemeFile.allowsSelection = {};
@@ -1078,6 +1100,7 @@ function buildCustomTailwind(message = 'file created!') {
1078
1100
  configThemeFile.autofillType = {};
1079
1101
  configThemeFile.autoLink = {};
1080
1102
  configThemeFile.autoreverse = {};
1103
+ configThemeFile.autorotate = {};
1081
1104
  configThemeFile.backgroundBlendMode = {};
1082
1105
  configThemeFile.backgroundLinearGradient = {};
1083
1106
  configThemeFile.backgroundRadialGradient = {};
@@ -1085,14 +1108,26 @@ function buildCustomTailwind(message = 'file created!') {
1085
1108
  configThemeFile.borderStyle = {};
1086
1109
  configThemeFile.bubbleParent = {};
1087
1110
  configThemeFile.buttonStyle = {};
1088
- configThemeFile.cacheSize = {};
1111
+ configThemeFile.cacheMode = {};
1112
+ configThemeFile.cachePolicy = {};
1113
+ configThemeFile.calendarViewShown = {};
1114
+ configThemeFile.canCancelEvents = {};
1089
1115
  configThemeFile.canDelete = {};
1116
+ configThemeFile.canEdit = {};
1117
+ configThemeFile.canInsert = {};
1118
+ configThemeFile.canMove = {};
1090
1119
  configThemeFile.canScroll = {};
1091
1120
  configThemeFile.caseInsensitiveSearch = {};
1121
+ configThemeFile.checkable = {};
1122
+ configThemeFile.clearButtonMode = {};
1123
+ configThemeFile.clearOnEdit = {};
1092
1124
  configThemeFile.clipMode = {};
1125
+ configThemeFile.contentHeightAndWidth = {};
1126
+ configThemeFile.datePickerStyle = {};
1093
1127
  configThemeFile.defaultItemTemplate = {};
1094
1128
  configThemeFile.dimBackgroundForSearch = {};
1095
1129
  configThemeFile.disableBounce = {};
1130
+ configThemeFile.disableContextMenu = {};
1096
1131
  configThemeFile.displayCaps = {};
1097
1132
  configThemeFile.displayHomeAsUp = {};
1098
1133
  configThemeFile.displayUtilities = {};
@@ -1101,11 +1136,13 @@ function buildCustomTailwind(message = 'file created!') {
1101
1136
  configThemeFile.drawerIndicatorEnabled = {};
1102
1137
  configThemeFile.drawerLockMode = {};
1103
1138
  configThemeFile.dropShadow = {};
1139
+ configThemeFile.duration = {};
1104
1140
  configThemeFile.editable = {};
1105
1141
  configThemeFile.editing = {};
1106
1142
  configThemeFile.ellipsize = {};
1107
1143
  configThemeFile.enableCopy = {};
1108
1144
  configThemeFile.enabled = {};
1145
+ configThemeFile.enableJavascriptInterface = {};
1109
1146
  configThemeFile.enableReturnKey = {};
1110
1147
  configThemeFile.enableZoomControls = {};
1111
1148
  configThemeFile.exitOnClose = {};
@@ -1116,15 +1153,25 @@ function buildCustomTailwind(message = 'file created!') {
1116
1153
  configThemeFile.filterAnchored = {};
1117
1154
  configThemeFile.filterAttribute = {};
1118
1155
  configThemeFile.filterCaseInsensitive = {};
1156
+ configThemeFile.filterTouchesWhenObscured = {};
1157
+ configThemeFile.flags = {};
1119
1158
  configThemeFile.flagSecure = {};
1120
1159
  configThemeFile.flip = {};
1160
+ configThemeFile.focusable = {};
1121
1161
  configThemeFile.fontStyle = {};
1122
1162
  configThemeFile.footerDividersEnabled = {};
1163
+ configThemeFile.format24 = {};
1123
1164
  configThemeFile.fullscreen = {};
1165
+ configThemeFile.gravity = {};
1124
1166
  configThemeFile.gridColumnsStartEnd = {};
1125
1167
  configThemeFile.gridFlow = {};
1126
1168
  configThemeFile.gridSystem = {};
1169
+ configThemeFile.hasCheck = {};
1170
+ configThemeFile.hasChild = {};
1171
+ configThemeFile.hasDetail = {};
1127
1172
  configThemeFile.headerDividersEnabled = {};
1173
+ configThemeFile.hiddenBehavior = {};
1174
+ configThemeFile.hideLoadIndicator = {};
1128
1175
  configThemeFile.hidesBackButton = {};
1129
1176
  configThemeFile.hidesBarsOnSwipe = {};
1130
1177
  configThemeFile.hidesBarsOnTap = {};
@@ -1132,41 +1179,57 @@ function buildCustomTailwind(message = 'file created!') {
1132
1179
  configThemeFile.hideSearchOnSelection = {};
1133
1180
  configThemeFile.hideShadow = {};
1134
1181
  configThemeFile.hidesSearchBarWhenScrolling = {};
1182
+ configThemeFile.hintType = {};
1135
1183
  configThemeFile.hires = {};
1136
1184
  configThemeFile.homeButtonEnabled = {};
1137
1185
  configThemeFile.homeIndicatorAutoHidden = {};
1186
+ configThemeFile.horizontalWrap = {};
1138
1187
  configThemeFile.html = {};
1188
+ configThemeFile.icon = {};
1139
1189
  configThemeFile.iconified = {};
1140
1190
  configThemeFile.iconifiedByDefault = {};
1141
1191
  configThemeFile.iconIsMask = {};
1192
+ configThemeFile.ignoreSslError = {};
1193
+ configThemeFile.imageTouchFeedback = {};
1194
+ configThemeFile.includeFontPadding = {};
1142
1195
  configThemeFile.includeOpaqueBars = {};
1196
+ configThemeFile.inputType = {};
1143
1197
  configThemeFile.items = {};
1144
1198
  configThemeFile.keepScreenOn = {};
1145
1199
  configThemeFile.keepSectionsInSearch = {};
1146
1200
  configThemeFile.keyboardAppearance = {};
1147
1201
  configThemeFile.keyboardDismissMode = {};
1202
+ configThemeFile.keyboardDisplayRequiresUserAction = {};
1148
1203
  configThemeFile.keyboardType = {};
1149
1204
  configThemeFile.largeTitleDisplayMode = {};
1150
1205
  configThemeFile.largeTitleEnabled = {};
1151
1206
  configThemeFile.layout = {};
1152
1207
  configThemeFile.lazyLoadingEnabled = {};
1208
+ configThemeFile.leftButtonMode = {};
1153
1209
  configThemeFile.leftDrawerLockMode = {};
1210
+ configThemeFile.lightTouchEnabled = {};
1154
1211
  configThemeFile.listViewStyle = {};
1155
1212
  configThemeFile.loginKeyboardType = {};
1156
1213
  configThemeFile.loginReturnKeyType = {};
1214
+ configThemeFile.mixedContentMode = {};
1157
1215
  configThemeFile.modal = {};
1158
1216
  configThemeFile.moveable = {};
1159
1217
  configThemeFile.moving = {};
1218
+ configThemeFile.nativeSpinner = {};
1160
1219
  configThemeFile.navBarHidden = {};
1220
+ configThemeFile.navigationMode = {};
1161
1221
  configThemeFile.orientationModes = {};
1162
1222
  configThemeFile.origin = {};
1163
1223
  configThemeFile.overlayEnabled = {};
1224
+ configThemeFile.overrideCurrentAnimation = {};
1164
1225
  configThemeFile.overScrollMode = {};
1165
1226
  configThemeFile.pagingControl = {};
1166
1227
  configThemeFile.pagingControlOnTop = {};
1167
1228
  configThemeFile.passwordKeyboardType = {};
1229
+ configThemeFile.passwordMask = {};
1168
1230
  configThemeFile.pickerType = {};
1169
1231
  configThemeFile.placement = {};
1232
+ configThemeFile.pluginState = {};
1170
1233
  configThemeFile.preventCornerOverlap = {};
1171
1234
  configThemeFile.preventDefaultImage = {};
1172
1235
  configThemeFile.previewActionStyle = {};
@@ -1176,14 +1239,15 @@ function buildCustomTailwind(message = 'file created!') {
1176
1239
  configThemeFile.progressIndicatorLocation = {};
1177
1240
  configThemeFile.progressIndicatorType = {};
1178
1241
  configThemeFile.pruneSectionsOnEdit = {};
1179
- configThemeFile.repeat = {};
1180
- configThemeFile.requestOrientation = {};
1242
+ configThemeFile.rDrawable = {};
1243
+ configThemeFile.requestedOrientation = {};
1181
1244
  configThemeFile.resultsSeparatorStyle = {};
1182
1245
  configThemeFile.returnKeyType = {};
1246
+ configThemeFile.reverse = {};
1247
+ configThemeFile.rightButtonMode = {};
1183
1248
  configThemeFile.rightDrawerLockMode = {};
1184
- configThemeFile.rowAndColumnCount = {};
1249
+ configThemeFile.scalesPageToFit = {};
1185
1250
  configThemeFile.scrollable = {};
1186
- configThemeFile.scrollableRegion = {};
1187
1251
  configThemeFile.scrollIndicators = {};
1188
1252
  configThemeFile.scrollIndicatorStyle = {};
1189
1253
  configThemeFile.scrollingEnabled = {};
@@ -1192,19 +1256,23 @@ function buildCustomTailwind(message = 'file created!') {
1192
1256
  configThemeFile.searchAsChild = {};
1193
1257
  configThemeFile.searchBarStyle = {};
1194
1258
  configThemeFile.searchHidden = {};
1195
- configThemeFile.sectionHeaderTopPadding = {};
1259
+ configThemeFile.selectionGranularity = {};
1260
+ configThemeFile.selectionOpens = {};
1196
1261
  configThemeFile.selectionStyle = {};
1197
1262
  configThemeFile.separatorStyle = {};
1198
1263
  configThemeFile.shiftMode = {};
1199
1264
  configThemeFile.showAsAction = {};
1200
1265
  configThemeFile.showBookmark = {};
1201
1266
  configThemeFile.showCancel = {};
1267
+ configThemeFile.showHorizontalScrollIndicator = {};
1202
1268
  configThemeFile.showSearchBarInNavBar = {};
1203
1269
  configThemeFile.showSelectionCheck = {};
1270
+ configThemeFile.showUndoRedoActions = {};
1204
1271
  configThemeFile.showVerticalScrollIndicator = {};
1205
1272
  configThemeFile.smoothScrollOnTabClick = {};
1206
1273
  configThemeFile.statusBarStyle = {};
1207
1274
  configThemeFile.submitEnabled = {};
1275
+ configThemeFile.suppressReturn = {};
1208
1276
  configThemeFile.sustainedPerformanceMode = {};
1209
1277
  configThemeFile.swipeToClose = {};
1210
1278
  configThemeFile.switchStyle = {};
@@ -1226,70 +1294,117 @@ function buildCustomTailwind(message = 'file created!') {
1226
1294
  configThemeFile.useCompatPadding = {};
1227
1295
  configThemeFile.useSpinner = {};
1228
1296
  configThemeFile.verticalAlign = {};
1297
+ configThemeFile.verticalBounce = {};
1298
+ configThemeFile.verticalMargin = {};
1229
1299
  configThemeFile.viewShadow = {};
1300
+ configThemeFile.willHandleTouches = {};
1230
1301
  configThemeFile.willScrollOnStatusTap = {};
1231
1302
  configThemeFile.windowPixelFormat = {};
1232
1303
  configThemeFile.windowSoftInputMode = {};
1233
1304
  configThemeFile.wobble = {};
1234
1305
 
1235
1306
  //! Configurable properties
1307
+ configThemeFile.activeTab = combineKeys(configFile.theme, base.columns, 'activeTab');
1308
+ configThemeFile.backgroundLeftCap = combineKeys(configFile.theme, base.spacing, 'backgroundLeftCap');
1309
+ configThemeFile.backgroundPaddingBottom = combineKeys(configFile.theme, base.height, 'backgroundPaddingBottom');
1310
+ configThemeFile.backgroundPaddingLeft = combineKeys(configFile.theme, base.spacing, 'backgroundPaddingLeft');
1311
+ configThemeFile.backgroundPaddingRight = combineKeys(configFile.theme, base.spacing, 'backgroundPaddingRight');
1312
+ configThemeFile.backgroundPaddingTop = combineKeys(configFile.theme, base.height, 'backgroundPaddingTop');
1313
+ configThemeFile.backgroundTopCap = combineKeys(configFile.theme, base.spacing, 'backgroundTopCap');
1236
1314
  configThemeFile.borderRadius = combineKeys(configFile.theme, defaultBorderRadius, 'borderRadius');
1237
1315
  configThemeFile.borderWidth = combineKeys(configFile.theme, defaultTheme.borderWidth, 'borderWidth');
1238
1316
  configThemeFile.bottomNavigation = combineKeys(configFile.theme, base.spacing, 'bottomNavigation');
1317
+ configThemeFile.cacheSize = combineKeys(configFile.theme, base.columns, 'cacheSize');
1318
+ configThemeFile.columnCount = combineKeys(configFile.theme, base.columns, 'columnCount');
1319
+ configThemeFile.contentHeight = combineKeys(configFile.theme, base.height, 'contentHeight');
1320
+ configThemeFile.contentWidth = combineKeys(configFile.theme, base.width, 'contentWidth');
1321
+ configThemeFile.countDownDuration = combineKeys(configFile.theme, { ...base.delay, ...defaultTheme.transitionDuration }, 'countDownDuration');
1239
1322
  configThemeFile.elevation = combineKeys(configFile.theme, base.spacing, 'elevation');
1240
1323
  configThemeFile.fontFamily = combineKeys(configFile.theme, {}, 'fontFamily');
1241
1324
  configThemeFile.fontSize = combineKeys(configFile.theme, defaultTheme.fontSize, 'fontSize');
1242
1325
  configThemeFile.fontWeight = combineKeys(configFile.theme, defaultTheme.fontWeight, 'fontWeight');
1243
1326
  configThemeFile.gap = combineKeys(configFile.theme, base.spacing, 'margin');
1327
+ configThemeFile.indentionLevel = combineKeys(configFile.theme, base.spacing, 'indentionLevel');
1328
+ configThemeFile.keyboardToolbarHeight = combineKeys(configFile.theme, base.height, 'keyboardToolbarHeight');
1329
+ configThemeFile.leftButtonPadding = combineKeys(configFile.theme, base.spacing, 'leftButtonPadding');
1244
1330
  configThemeFile.leftWidth = combineKeys(configFile.theme, base.width, 'leftWidth');
1331
+ configThemeFile.lines = combineKeys(configFile.theme, base.columns, 'lines');
1245
1332
  configThemeFile.maxElevation = combineKeys(configFile.theme, base.spacing, 'maxElevation');
1333
+ configThemeFile.maxLines = combineKeys(configFile.theme, base.columns, 'maxLines');
1246
1334
  configThemeFile.maxRowHeight = combineKeys(configFile.theme, base.height, 'maxRowHeight');
1335
+ configThemeFile.maxZoomScale = combineKeys(configFile.theme, { ...{ 5: '.05', 10: '.10', 25: '.25' }, ...defaultTheme.scale }, 'maxZoomScale');
1336
+ configThemeFile.minimumFontSize = combineKeys(configFile.theme, defaultTheme.fontSize, 'minimumFontSize');
1247
1337
  configThemeFile.minRowHeight = combineKeys(configFile.theme, base.height, 'minRowHeight');
1338
+ configThemeFile.minZoomScale = combineKeys(configFile.theme, { ...{ 5: '.05', 10: '.10', 25: '.25' }, ...defaultTheme.scale }, 'minZoomScale');
1339
+ configThemeFile.offsets = combineKeys(configFile.theme, base.height, 'offsets');
1248
1340
  configThemeFile.opacity = combineKeys(configFile.theme, defaultTheme.opacity, 'opacity');
1249
1341
  configThemeFile.padding = combineKeys(configFile.theme, base.spacing, 'padding');
1250
1342
  configThemeFile.pagingControlAlpha = combineKeys(configFile.theme, defaultTheme.opacity, 'pagingControlAlpha');
1251
1343
  configThemeFile.pagingControlHeight = combineKeys(configFile.theme, base.height, 'pagingControlHeight');
1252
- configThemeFile.pagingControlTimeout = combineKeys(configFile.theme, { ...{ '0': '0ms', '25': '25ms', '50': '50ms', '2000': '2000ms', '3000': '3000ms', '4000': '4000ms', '5000': '5000ms' }, ...defaultTheme.transitionDelay }, 'pagingControlTimeout');
1344
+ configThemeFile.pagingControlTimeout = combineKeys(configFile.theme, { ...base.delay, ...defaultTheme.transitionDelay }, 'pagingControlTimeout');
1345
+ configThemeFile.repeat = combineKeys(configFile.theme, base.columns, 'repeat');
1346
+ configThemeFile.repeatCount = combineKeys(configFile.theme, base.columns, 'repeatCount');
1347
+ configThemeFile.rightButtonPadding = combineKeys(configFile.theme, base.spacing, 'rightButtonPadding');
1253
1348
  configThemeFile.rightWidth = combineKeys(configFile.theme, base.width, 'rightWidth');
1254
1349
  configThemeFile.rotate = combineKeys(configFile.theme, defaultTheme.rotate, 'rotate');
1350
+ configThemeFile.rowCount = combineKeys(configFile.theme, base.columns, 'rowCount');
1255
1351
  configThemeFile.rowHeight = combineKeys(configFile.theme, base.height, 'rowHeight');
1256
1352
  configThemeFile.scale = combineKeys(configFile.theme, { ...{ 5: '.05', 10: '.10', 25: '.25' }, ...defaultTheme.scale }, 'scale');
1353
+ configThemeFile.sectionHeaderTopPadding = combineKeys(configFile.theme, base.height, 'sectionHeaderTopPadding');
1257
1354
  configThemeFile.separatorHeight = combineKeys(configFile.theme, base.height, 'separatorHeight');
1258
1355
  configThemeFile.shadowRadius = combineKeys(configFile.theme, base.spacing, 'shadowRadius');
1259
- configThemeFile.transitionDelay = combineKeys(configFile.theme, { ...{ '0': '0ms', '25': '25ms', '50': '50ms', '250': '250ms', '350': '350ms', '400': '400ms', '450': '450ms', '600': '600ms', '800': '800ms', '900': '900ms', '2000': '2000ms', '3000': '3000ms', '4000': '4000ms', '5000': '5000ms' }, ...defaultTheme.transitionDelay }, 'transitionDelay');
1260
- configThemeFile.transitionDuration = combineKeys(configFile.theme, { ...{ '0': '0ms', '25': '25ms', '50': '50ms', '250': '250ms', '350': '350ms', '400': '400ms', '450': '450ms', '600': '600ms', '800': '800ms', '900': '900ms', '2000': '2000ms', '3000': '3000ms', '4000': '4000ms', '5000': '5000ms' }, ...defaultTheme.transitionDuration }, 'transitionDuration');
1356
+ configThemeFile.timeout = combineKeys(configFile.theme, { ...base.delay, ...defaultTheme.transitionDelay }, 'timeout');
1357
+ configThemeFile.transitionDelay = combineKeys(configFile.theme, { ...base.delay, ...defaultTheme.transitionDelay }, 'transitionDelay');
1358
+ configThemeFile.transitionDuration = combineKeys(configFile.theme, { ...base.delay, ...defaultTheme.transitionDuration }, 'transitionDuration');
1261
1359
  configThemeFile.zIndex = combineKeys(configFile.theme, defaultTheme.zIndex, 'zIndex');
1360
+ configThemeFile.zoomScale = combineKeys(configFile.theme, { ...{ 5: '.05', 10: '.10', 25: '.25' }, ...defaultTheme.scale }, 'zoomScale');
1262
1361
 
1263
1362
  //! Color related properties
1264
1363
  configThemeFile.activeTintColor = combineKeys(configFile.theme, base.colors, 'activeTintColor');
1265
1364
  configThemeFile.activeTitleColor = combineKeys(configFile.theme, base.colors, 'activeTitleColor');
1266
1365
  configThemeFile.backgroundColor = combineKeys(configFile.theme, base.colors, 'backgroundColor');
1366
+ configThemeFile.backgroundDisabledColor = combineKeys(configFile.theme, base.colors, 'backgroundDisabledColor');
1367
+ configThemeFile.backgroundFocusedColor = combineKeys(configFile.theme, base.colors, 'backgroundFocusedColor');
1267
1368
  configThemeFile.backgroundGradient = combineKeys(configFile.theme, base.colors, 'backgroundGradient');
1268
1369
  configThemeFile.backgroundSelectedColor = combineKeys(configFile.theme, base.colors, 'backgroundSelectedColor');
1370
+ configThemeFile.backgroundSelectedGradient = combineKeys(configFile.theme, base.colors, 'backgroundSelectedGradient');
1371
+ configThemeFile.badgeColor = combineKeys(configFile.theme, base.colors, 'badgeColor');
1269
1372
  configThemeFile.barColor = combineKeys(configFile.theme, base.colors, 'barColor');
1270
1373
  configThemeFile.borderColor = combineKeys(configFile.theme, base.colors, 'borderColor');
1271
1374
  configThemeFile.currentPageIndicatorColor = combineKeys(configFile.theme, base.colors, 'currentPageIndicatorColor');
1375
+ configThemeFile.dateTimeColor = combineKeys(configFile.theme, base.colors, 'dateTimeColor');
1272
1376
  configThemeFile.disabledColor = combineKeys(configFile.theme, base.colors, 'disabledColor');
1273
1377
  configThemeFile.dropShadowColor = combineKeys(configFile.theme, base.colors, 'shadowColor');
1378
+ configThemeFile.highlightedColor = combineKeys(configFile.theme, base.colors, 'highlightedColor');
1274
1379
  configThemeFile.hintTextColor = combineKeys(configFile.theme, base.colors, 'hintTextColor');
1380
+ configThemeFile.imageTouchFeedbackColor = combineKeys(configFile.theme, base.colors, 'imageTouchFeedbackColor');
1275
1381
  configThemeFile.indicatorColor = combineKeys(configFile.theme, base.colors, 'indicatorColor');
1382
+ configThemeFile.keyboardToolbarColor = combineKeys(configFile.theme, base.colors, 'keyboardToolbarColor');
1276
1383
  configThemeFile.navTintColor = combineKeys(configFile.theme, base.colors, 'navTintColor');
1384
+ configThemeFile.onTintColor = combineKeys(configFile.theme, base.colors, 'onTintColor');
1277
1385
  configThemeFile.pageIndicatorColor = combineKeys(configFile.theme, base.colors, 'pageIndicatorColor');
1278
1386
  configThemeFile.pagingControlColor = combineKeys(configFile.theme, base.colors, 'pagingControlColor');
1387
+ configThemeFile.placeholder = combineKeys(configFile.theme, base.colors, 'placeholder');
1388
+ configThemeFile.pullBackgroundColor = combineKeys(configFile.theme, base.colors, 'pullBackgroundColor');
1279
1389
  configThemeFile.resultsBackgroundColor = combineKeys(configFile.theme, base.colors, 'resultsBackgroundColor');
1280
1390
  configThemeFile.resultsSeparatorColor = combineKeys(configFile.theme, base.colors, 'resultsSeparatorColor');
1281
1391
  configThemeFile.selectedButtonColor = combineKeys(configFile.theme, base.colors, 'selectedButtonColor');
1282
1392
  configThemeFile.selectedColor = combineKeys(configFile.theme, base.colors, 'selectedColor');
1393
+ configThemeFile.selectedSubtitleColor = combineKeys(configFile.theme, base.colors, 'selectedSubtitleColor');
1283
1394
  configThemeFile.selectedTextColor = combineKeys(configFile.theme, base.colors, 'selectedTextColor');
1284
1395
  configThemeFile.separatorColor = combineKeys(configFile.theme, base.colors, 'separatorColor');
1396
+ configThemeFile.subtitleColor = combineKeys(configFile.theme, base.colors, 'subtitleColor');
1285
1397
  configThemeFile.tabsBackgroundColor = combineKeys(configFile.theme, base.colors, 'tabsBackgroundColor');
1286
1398
  configThemeFile.tabsBackgroundSelectedColor = combineKeys(configFile.theme, base.colors, 'tabsBackgroundSelectedColor');
1287
1399
  configThemeFile.textColor = combineKeys(configFile.theme, base.colors, 'textColor');
1400
+ configThemeFile.thumbTintColor = combineKeys(configFile.theme, base.colors, 'thumbTintColor');
1288
1401
  configThemeFile.tintColor = combineKeys(configFile.theme, base.colors, 'tintColor');
1289
1402
  configThemeFile.titleAttributesColor = combineKeys(configFile.theme, base.colors, 'titleAttributesColor');
1290
1403
  configThemeFile.titleAttributesShadowColor = combineKeys(configFile.theme, base.colors, 'titleAttributesShadowColor');
1291
1404
  configThemeFile.titleColor = combineKeys(configFile.theme, base.colors, 'titleColor');
1405
+ configThemeFile.titleTextColor = combineKeys(configFile.theme, base.colors, 'titleTextColor');
1292
1406
  configThemeFile.touchFeedbackColor = combineKeys(configFile.theme, base.colors, 'touchFeedbackColor');
1407
+ configThemeFile.trackTintColor = combineKeys(configFile.theme, base.colors, 'trackTintColor');
1293
1408
  configThemeFile.viewShadowColor = combineKeys(configFile.theme, base.colors, 'viewShadowColor');
1294
1409
 
1295
1410
  // !Some final cleanup
@@ -1383,10 +1498,16 @@ function createDefinitionsFile() {
1383
1498
  classDefinitions += fs.readFileSync(cwd + '/purgetss/fonts.tss', 'utf8').replace(/\n\/\*\*\n([\s\S]*?)\*\/\n/g, '');
1384
1499
  }
1385
1500
 
1386
- if (fs.existsSync(projecrFontAwesomeTSS)) {
1387
- classDefinitions += fs.readFileSync(projecrFontAwesomeTSS, 'utf8');
1501
+ if (fs.existsSync(projectFontAwesomeTSS)) {
1502
+ classDefinitions += fs.readFileSync(projectFontAwesomeTSS, 'utf8');
1503
+ } else {
1504
+ classDefinitions += fs.readFileSync(srcFontAwesomeTSSFile, 'utf8');
1388
1505
  }
1389
1506
 
1507
+ classDefinitions += fs.readFileSync(srcFramework7FontTSSFile, 'utf8');
1508
+
1509
+ classDefinitions += fs.readFileSync(srcMaterialDesignIconsTSSFile, 'utf8');
1510
+
1390
1511
  classDefinitions = classDefinitions
1391
1512
  .replace(`'ImageView[platform=ios]': { hires: true }\n`, '')
1392
1513
  .replace(`'View': { width: Ti.UI.SIZE, height: Ti.UI.SIZE }\n`, '')
@@ -1395,7 +1516,7 @@ function createDefinitionsFile() {
1395
1516
  .replace(/{(.*)}/g, '{}')
1396
1517
  .replace(/\[(.*)\]/g, '')
1397
1518
  .replace(/\/\/(.*)\n/g, '')
1398
- .replace(/\n\n/g, '\n');
1519
+ .replace(/\n/g, '');
1399
1520
 
1400
1521
  fs.writeFileSync(cwd + '/purgetss/definitions.css', `/* Class definitions */${classDefinitions}`);
1401
1522
 
@@ -1405,8 +1526,12 @@ function createDefinitionsFile() {
1405
1526
  //! Build tailwind's custom values
1406
1527
  function helperToBuildCustomTailwindClasses(key, value) {
1407
1528
  switch (key) {
1529
+ // case 'audioStreamType':
1530
+ // case 'category':
1408
1531
  case 'accessibilityHidden':
1532
+ case 'accessoryType':
1409
1533
  case 'activeIconIsMask':
1534
+ case 'activeTab':
1410
1535
  case 'activeTintColor':
1411
1536
  case 'activeTitleColor':
1412
1537
  case 'activityEnterTransition':
@@ -1419,6 +1544,8 @@ function helperToBuildCustomTailwindClasses(key, value) {
1419
1544
  case 'activitySharedElementReenterTransition':
1420
1545
  case 'activitySharedElementReturnTransition':
1421
1546
  case 'alertDialogStyle':
1547
+ case 'allowsBackForwardNavigationGestures':
1548
+ case 'allowsLinkPreview':
1422
1549
  case 'allowsMultipleSelectionDuringEditing':
1423
1550
  case 'allowsMultipleSelectionInteraction':
1424
1551
  case 'allowsSelection':
@@ -1431,13 +1558,24 @@ function helperToBuildCustomTailwindClasses(key, value) {
1431
1558
  case 'autofillType':
1432
1559
  case 'autoLink':
1433
1560
  case 'autoreverse':
1561
+ case 'autorotate':
1434
1562
  case 'backgroundBlendMode':
1435
1563
  case 'backgroundColor':
1564
+ case 'backgroundDisabledColor':
1565
+ case 'backgroundFocusedColor':
1436
1566
  case 'backgroundGradient':
1567
+ case 'backgroundLeftCap':
1437
1568
  case 'backgroundLinearGradient':
1569
+ case 'backgroundPaddingBottom':
1570
+ case 'backgroundPaddingLeft':
1571
+ case 'backgroundPaddingRight':
1572
+ case 'backgroundPaddingTop':
1438
1573
  case 'backgroundRadialGradient':
1439
1574
  case 'backgroundRepeat':
1440
1575
  case 'backgroundSelectedColor':
1576
+ case 'backgroundSelectedGradient':
1577
+ case 'backgroundTopCap':
1578
+ case 'badgeColor':
1441
1579
  case 'barColor':
1442
1580
  case 'borderColor':
1443
1581
  case 'borderRadius':
@@ -1446,15 +1584,33 @@ function helperToBuildCustomTailwindClasses(key, value) {
1446
1584
  case 'bottomNavigation':
1447
1585
  case 'bubbleParent':
1448
1586
  case 'buttonStyle':
1587
+ case 'cacheMode':
1588
+ case 'cachePolicy':
1449
1589
  case 'cacheSize':
1590
+ case 'calendarViewShown':
1591
+ case 'canCancelEvents':
1450
1592
  case 'canDelete':
1593
+ case 'canEdit':
1594
+ case 'canInsert':
1595
+ case 'canMove':
1451
1596
  case 'canScroll':
1452
1597
  case 'caseInsensitiveSearch':
1598
+ case 'checkable':
1599
+ case 'clearButtonMode':
1600
+ case 'clearOnEdit':
1453
1601
  case 'clipMode':
1602
+ case 'columnCount':
1603
+ case 'contentHeight':
1604
+ case 'contentHeightAndWidth':
1605
+ case 'contentWidth':
1606
+ case 'countDownDuration':
1454
1607
  case 'currentPageIndicatorColor':
1608
+ case 'datePickerStyle':
1609
+ case 'dateTimeColor':
1455
1610
  case 'defaultItemTemplate':
1456
1611
  case 'dimBackgroundForSearch':
1457
1612
  case 'disableBounce':
1613
+ case 'disableContextMenu':
1458
1614
  case 'disabledColor':
1459
1615
  case 'displayCaps':
1460
1616
  case 'displayHomeAsUp':
@@ -1465,12 +1621,14 @@ function helperToBuildCustomTailwindClasses(key, value) {
1465
1621
  case 'drawerLockMode':
1466
1622
  case 'dropShadow':
1467
1623
  case 'dropShadowColor':
1624
+ case 'duration':
1468
1625
  case 'editable':
1469
1626
  case 'editing':
1470
1627
  case 'elevation':
1471
1628
  case 'ellipsize':
1472
1629
  case 'enableCopy':
1473
1630
  case 'enabled':
1631
+ case 'enableJavascriptInterface':
1474
1632
  case 'enableReturnKey':
1475
1633
  case 'enableZoomControls':
1476
1634
  case 'exitOnClose':
@@ -1481,20 +1639,30 @@ function helperToBuildCustomTailwindClasses(key, value) {
1481
1639
  case 'filterAnchored':
1482
1640
  case 'filterAttribute':
1483
1641
  case 'filterCaseInsensitive':
1642
+ case 'filterTouchesWhenObscured':
1643
+ case 'flags':
1484
1644
  case 'flagSecure':
1485
1645
  case 'flip':
1646
+ case 'focusable':
1486
1647
  case 'fontFamily':
1487
1648
  case 'fontSize':
1488
1649
  case 'fontStyle':
1489
1650
  case 'fontWeight':
1490
1651
  case 'footerDividersEnabled':
1652
+ case 'format24':
1491
1653
  case 'fullscreen':
1492
1654
  case 'gap':
1655
+ case 'gravity':
1493
1656
  case 'gridColumnsStartEnd':
1494
1657
  case 'gridFlow':
1495
1658
  case 'gridSystem':
1659
+ case 'hasCheck':
1660
+ case 'hasChild':
1661
+ case 'hasDetail':
1496
1662
  case 'headerDividersEnabled':
1497
1663
  case 'height':
1664
+ case 'hiddenBehavior':
1665
+ case 'hideLoadIndicator':
1498
1666
  case 'hidesBackButton':
1499
1667
  case 'hidesBarsOnSwipe':
1500
1668
  case 'hidesBarsOnTap':
@@ -1502,44 +1670,72 @@ function helperToBuildCustomTailwindClasses(key, value) {
1502
1670
  case 'hideSearchOnSelection':
1503
1671
  case 'hideShadow':
1504
1672
  case 'hidesSearchBarWhenScrolling':
1673
+ case 'highlightedColor':
1505
1674
  case 'hintTextColor':
1675
+ case 'hintType':
1506
1676
  case 'hires':
1507
1677
  case 'homeButtonEnabled':
1508
1678
  case 'homeIndicatorAutoHidden':
1679
+ case 'horizontalWrap':
1509
1680
  case 'html':
1681
+ case 'icon':
1510
1682
  case 'iconified':
1511
1683
  case 'iconifiedByDefault':
1512
1684
  case 'iconIsMask':
1685
+ case 'ignoreSslError':
1686
+ case 'imageTouchFeedback':
1687
+ case 'imageTouchFeedbackColor':
1688
+ case 'includeFontPadding':
1513
1689
  case 'includeOpaqueBars':
1690
+ case 'indentionLevel':
1514
1691
  case 'indicatorColor':
1692
+ case 'inputType':
1515
1693
  case 'items':
1516
1694
  case 'keepScreenOn':
1517
1695
  case 'keepSectionsInSearch':
1518
1696
  case 'keyboardAppearance':
1519
1697
  case 'keyboardDismissMode':
1698
+ case 'keyboardDisplayRequiresUserAction':
1699
+ case 'keyboardToolbarColor':
1700
+ case 'keyboardToolbarHeight':
1520
1701
  case 'keyboardType':
1521
1702
  case 'largeTitleDisplayMode':
1522
1703
  case 'largeTitleEnabled':
1523
1704
  case 'layout':
1524
1705
  case 'lazyLoadingEnabled':
1706
+ case 'leftButtonMode':
1707
+ case 'leftButtonPadding':
1525
1708
  case 'leftDrawerLockMode':
1526
1709
  case 'leftWidth':
1710
+ case 'lightTouchEnabled':
1711
+ case 'lines':
1527
1712
  case 'listViewStyle':
1528
1713
  case 'loginKeyboardType':
1529
1714
  case 'loginReturnKeyType':
1530
1715
  case 'margin':
1716
+ case 'margin2':
1531
1717
  case 'maxElevation':
1718
+ case 'maxLines':
1532
1719
  case 'maxRowHeight':
1720
+ case 'maxZoomScale':
1721
+ case 'minimumFontSize':
1533
1722
  case 'minRowHeight':
1723
+ case 'minZoomScale':
1724
+ case 'mixedContentMode':
1534
1725
  case 'modal':
1535
1726
  case 'moveable':
1536
1727
  case 'moving':
1728
+ case 'nativeSpinner':
1537
1729
  case 'navBarHidden':
1730
+ case 'navigationMode':
1538
1731
  case 'navTintColor':
1732
+ case 'offsets':
1733
+ case 'onTintColor':
1539
1734
  case 'opacity':
1540
1735
  case 'orientationModes':
1541
1736
  case 'origin':
1542
1737
  case 'overlayEnabled':
1738
+ case 'overrideCurrentAnimation':
1543
1739
  case 'overScrollMode':
1544
1740
  case 'padding':
1545
1741
  case 'pageIndicatorColor':
@@ -1550,8 +1746,11 @@ function helperToBuildCustomTailwindClasses(key, value) {
1550
1746
  case 'pagingControlOnTop':
1551
1747
  case 'pagingControlTimeout':
1552
1748
  case 'passwordKeyboardType':
1749
+ case 'passwordMask':
1553
1750
  case 'pickerType':
1751
+ case 'placeholder':
1554
1752
  case 'placement':
1753
+ case 'pluginState':
1555
1754
  case 'preventCornerOverlap':
1556
1755
  case 'preventDefaultImage':
1557
1756
  case 'previewActionStyle':
@@ -1561,20 +1760,26 @@ function helperToBuildCustomTailwindClasses(key, value) {
1561
1760
  case 'progressIndicatorLocation':
1562
1761
  case 'progressIndicatorType':
1563
1762
  case 'pruneSectionsOnEdit':
1763
+ case 'pullBackgroundColor':
1764
+ case 'rDrawable':
1564
1765
  case 'repeat':
1565
- case 'requestOrientation':
1766
+ case 'repeatCount':
1767
+ case 'requestedOrientation':
1566
1768
  case 'resultsBackgroundColor':
1567
1769
  case 'resultsSeparatorColor':
1568
1770
  case 'resultsSeparatorStyle':
1569
1771
  case 'returnKeyType':
1772
+ case 'reverse':
1773
+ case 'rightButtonMode':
1774
+ case 'rightButtonPadding':
1570
1775
  case 'rightDrawerLockMode':
1571
1776
  case 'rightWidth':
1572
1777
  case 'rotate':
1573
- case 'rowAndColumnCount':
1778
+ case 'rowCount':
1574
1779
  case 'rowHeight':
1575
1780
  case 'scale':
1781
+ case 'scalesPageToFit':
1576
1782
  case 'scrollable':
1577
- case 'scrollableRegion':
1578
1783
  case 'scrollIndicators':
1579
1784
  case 'scrollIndicatorStyle':
1580
1785
  case 'scrollingEnabled':
@@ -1586,7 +1791,10 @@ function helperToBuildCustomTailwindClasses(key, value) {
1586
1791
  case 'sectionHeaderTopPadding':
1587
1792
  case 'selectedButtonColor':
1588
1793
  case 'selectedColor':
1794
+ case 'selectedSubtitleColor':
1589
1795
  case 'selectedTextColor':
1796
+ case 'selectionGranularity':
1797
+ case 'selectionOpens':
1590
1798
  case 'selectionStyle':
1591
1799
  case 'separatorColor':
1592
1800
  case 'separatorHeight':
@@ -1597,12 +1805,16 @@ function helperToBuildCustomTailwindClasses(key, value) {
1597
1805
  case 'showAsAction':
1598
1806
  case 'showBookmark':
1599
1807
  case 'showCancel':
1808
+ case 'showHorizontalScrollIndicator':
1600
1809
  case 'showSearchBarInNavBar':
1601
1810
  case 'showSelectionCheck':
1811
+ case 'showUndoRedoActions':
1602
1812
  case 'showVerticalScrollIndicator':
1603
1813
  case 'smoothScrollOnTabClick':
1604
1814
  case 'statusBarStyle':
1605
1815
  case 'submitEnabled':
1816
+ case 'subtitleColor':
1817
+ case 'suppressReturn':
1606
1818
  case 'sustainedPerformanceMode':
1607
1819
  case 'swipeToClose':
1608
1820
  case 'switchStyle':
@@ -1617,16 +1829,20 @@ function helperToBuildCustomTailwindClasses(key, value) {
1617
1829
  case 'textAlign':
1618
1830
  case 'textColor':
1619
1831
  case 'theme':
1832
+ case 'thumbTintColor':
1620
1833
  case 'tiMedia':
1834
+ case 'timeout':
1621
1835
  case 'tintColor':
1622
1836
  case 'titleAttributesColor':
1623
1837
  case 'titleAttributesShadow':
1624
1838
  case 'titleAttributesShadowColor':
1625
1839
  case 'titleColor':
1840
+ case 'titleTextColor':
1626
1841
  case 'toolbarEnabled':
1627
1842
  case 'touchEnabled':
1628
1843
  case 'touchFeedback':
1629
1844
  case 'touchFeedbackColor':
1845
+ case 'trackTintColor':
1630
1846
  case 'transition':
1631
1847
  case 'transitionDelay':
1632
1848
  case 'transitionDuration':
@@ -1634,14 +1850,18 @@ function helperToBuildCustomTailwindClasses(key, value) {
1634
1850
  case 'useCompatPadding':
1635
1851
  case 'useSpinner':
1636
1852
  case 'verticalAlign':
1853
+ case 'verticalBounce':
1854
+ case 'verticalMargin':
1637
1855
  case 'viewShadow':
1638
1856
  case 'viewShadowColor':
1639
1857
  case 'width':
1858
+ case 'willHandleTouches':
1640
1859
  case 'willScrollOnStatusTap':
1641
1860
  case 'windowPixelFormat':
1642
1861
  case 'windowSoftInputMode':
1643
1862
  case 'wobble':
1644
1863
  case 'zIndex':
1864
+ case 'zoomScale':
1645
1865
  return helpers[key](value);
1646
1866
 
1647
1867
  default: return helpers.customRules(value, key);
@@ -1787,6 +2007,8 @@ function backupOriginalAppTss() {
1787
2007
 
1788
2008
  //! Copy Reset template
1789
2009
  function copyResetTemplateAnd_appTSS() {
2010
+ localStart();
2011
+
1790
2012
  logger.info('Copying Reset styles...');
1791
2013
 
1792
2014
  let tempPurged = fs.readFileSync(srcResetTSSFile, 'utf8');
@@ -1800,6 +2022,8 @@ function copyResetTemplateAnd_appTSS() {
1800
2022
  }
1801
2023
  }
1802
2024
 
2025
+ localFinish('Copying Reset and ' + chalk.yellow('_app.tss') + ' styles...');
2026
+
1803
2027
  return tempPurged;
1804
2028
  }
1805
2029
 
@@ -1814,15 +2038,28 @@ function finish(customMessage = 'Finished purging in') {
1814
2038
  logger.info(customMessage, chalk.green(`${endTime.getSeconds()}s ${endTime.getMilliseconds()}ms`));
1815
2039
  }
1816
2040
 
2041
+ let localStartTime;
2042
+ function localStart() {
2043
+ localStartTime = new Date();
2044
+ };
2045
+
2046
+ function localFinish(customMessage = 'Finished purging in') {
2047
+ let localEndTime = new Date(new Date() - localStartTime);
2048
+ if (purgingDebug) logger.info(customMessage, chalk.green(`${localEndTime.getSeconds()}s ${localEndTime.getMilliseconds()}ms`));
2049
+ }
2050
+
1817
2051
  //! Purge Functions
1818
2052
  //! Tailwind
1819
2053
  function purgeTailwind(uniqueClasses) {
2054
+ localStart();
2055
+
1820
2056
  let purgedClasses = '\n// Main styles\n';
1821
2057
  let tailwindClasses = fs.readFileSync(projectTailwindTSS, 'utf8').split(/\r?\n/);
1822
2058
 
1823
2059
  if (`// config.js file updated on: ${getFileUpdatedDate(projectConfigJS)}` !== tailwindClasses[6]) {
1824
2060
  logger.info(chalk.yellow('config.js'), 'file updated!, rebuilding tailwind.tss...');
1825
2061
  buildCustomTailwind('file updated!');
2062
+ createDefinitionsFile();
1826
2063
  tailwindClasses = fs.readFileSync(projectTailwindTSS, 'utf8').split(/\r?\n/);
1827
2064
  }
1828
2065
 
@@ -1942,6 +2179,10 @@ function purgeTailwind(uniqueClasses) {
1942
2179
  // Add arbitrary values
1943
2180
  purgedClasses += (arbitraryValues !== '\n// Styles with arbitrary values\n') ? arbitraryValues : '';
1944
2181
 
2182
+ let mensaje = 'Purging ' + chalk.yellow('Custom Tailwind') + ' styles...';
2183
+
2184
+ localFinish(mensaje);
2185
+
1945
2186
  return purgedClasses;
1946
2187
  }
1947
2188
 
@@ -1955,8 +2196,8 @@ function purgeFontAwesome(uniqueClasses, cleanUniqueClasses) {
1955
2196
  let purgedClasses = '';
1956
2197
  let purgingMessage = '';
1957
2198
 
1958
- if (fs.existsSync(projecrFontAwesomeTSS)) {
1959
- sourceFolder = projecrFontAwesomeTSS;
2199
+ if (fs.existsSync(projectFontAwesomeTSS)) {
2200
+ sourceFolder = projectFontAwesomeTSS;
1960
2201
  purgedClasses = '\n// Pro/Beta Font Awesome styles\n';
1961
2202
  purgingMessage = `Purging ${chalk.yellow('Pro/Beta Font Awesome')} styles...')`;
1962
2203
  } else {
@@ -1965,9 +2206,7 @@ function purgeFontAwesome(uniqueClasses, cleanUniqueClasses) {
1965
2206
  purgingMessage = `Purging Default Font Awesome styles...`;
1966
2207
  }
1967
2208
 
1968
- let sourceTSS = fs.readFileSync(sourceFolder, 'utf8').split(/\r?\n/);
1969
-
1970
- purgedClasses += purgeFontIcons(sourceTSS, uniqueClasses, purgingMessage, cleanUniqueClasses, ['fa', 'fat', 'fas', 'fal', 'far', 'fab', 'fa-thin', 'fa-solid', 'fa-light', 'fa-regular', 'fa-brands', 'fontawesome', 'fontawesome-thin', 'fontawesome-solid', 'fontawesome-light', 'fontawesome-regular', 'fontawesome-brands']);
2209
+ purgedClasses += purgeFontIcons(sourceFolder, uniqueClasses, purgingMessage, cleanUniqueClasses, ['fa', 'fat', 'fas', 'fal', 'far', 'fab', 'fa-thin', 'fa-solid', 'fa-light', 'fa-regular', 'fa-brands', 'fontawesome', 'fontawesome-thin', 'fontawesome-solid', 'fontawesome-light', 'fontawesome-regular', 'fontawesome-brands']);
1971
2210
 
1972
2211
  return (purgedClasses === '\n// Pro/Beta Font Awesome styles\n' || purgedClasses === '\n// Default Font Awesome styles\n') ? '' : purgedClasses;
1973
2212
  }
@@ -1976,9 +2215,7 @@ function purgeFontAwesome(uniqueClasses, cleanUniqueClasses) {
1976
2215
  function purgeMaterialDesign(uniqueClasses, cleanUniqueClasses) {
1977
2216
  let purgedClasses = '\n// Material Design Icons styles\n';
1978
2217
 
1979
- let sourceTSS = fs.readFileSync(srcMaterialDesignIconsTSSFile, 'utf8').split(/\r?\n/);
1980
-
1981
- purgedClasses += purgeFontIcons(sourceTSS, uniqueClasses, 'Purging Material Design Icons styles...', cleanUniqueClasses, ['md', 'mdo', 'mdr', 'mds', 'mdt', '.materialdesign', '.materialdesign-round', '.materialdesign-sharp', '.materialdesign-two-tone', '.materialdesign-outlined', '.material-icons', '.material-icons-round', '.material-icons-sharp', '.material-icons-two-tone', '.material-icons-outlined']);
2218
+ purgedClasses += purgeFontIcons(srcMaterialDesignIconsTSSFile, uniqueClasses, 'Purging Material Design Icons styles...', cleanUniqueClasses, ['md', 'mdo', 'mdr', 'mds', 'mdt', '.materialdesign', '.materialdesign-round', '.materialdesign-sharp', '.materialdesign-two-tone', '.materialdesign-outlined', '.material-icons', '.material-icons-round', '.material-icons-sharp', '.material-icons-two-tone', '.material-icons-outlined']);
1982
2219
 
1983
2220
  return (purgedClasses === '\n// Material Design Icons styles\n') ? '' : purgedClasses;
1984
2221
  }
@@ -1987,52 +2224,42 @@ function purgeMaterialDesign(uniqueClasses, cleanUniqueClasses) {
1987
2224
  function purgeFramework7(uniqueClasses, cleanUniqueClasses) {
1988
2225
  let purgedClasses = '\n// Framework7 styles\n';
1989
2226
 
1990
- let sourceTSS = fs.readFileSync(srcFramework7FontTSSFile, 'utf8').split(/\r?\n/);
1991
-
1992
- purgedClasses += purgeFontIcons(sourceTSS, uniqueClasses, 'Purging Framework7 Icons styles...', cleanUniqueClasses, ['f7', 'f7i', 'framework7']);
2227
+ purgedClasses += purgeFontIcons(srcFramework7FontTSSFile, uniqueClasses, 'Purging Framework7 Icons styles...', cleanUniqueClasses, ['f7', 'f7i', 'framework7']);
1993
2228
 
1994
2229
  return (purgedClasses === '\n// Framework7 styles\n') ? '' : purgedClasses;
1995
2230
  }
1996
2231
 
1997
- function purgeFontIcons(sourceTSS, uniqueClasses, message, cleanUniqueClasses, prefixes) {
2232
+ function purgeFontIcons(sourceFolder, uniqueClasses, message, cleanUniqueClasses, prefixes) {
2233
+ localStart();
2234
+
1998
2235
  let purgedClasses = '';
1999
- let soc = sourceTSS.toString();
2000
-
2001
- if (prefixes.length > 0) {
2002
- if (cleanUniqueClasses.some(element => prefixes.includes(element))) {
2003
- logger.info(message);
2004
- uniqueClasses.forEach(className => {
2005
- let cleanClassName = cleanClassNameFn(className);
2006
- if (soc.includes(`'.${cleanClassName}'`)) {
2007
- sourceTSS.forEach(line => {
2008
- if (line.startsWith(`'.${cleanClassName}'`)) {
2009
- purgedClasses += helpers.checkPlatformAndDevice(line, uniqueClasses[uniqueClasses.indexOf(className)]);
2010
- }
2011
- });
2012
- }
2013
- });
2014
- }
2015
- } else {
2236
+ let sourceTSS = fs.readFileSync(sourceFolder, 'utf8');
2237
+
2238
+ if (cleanUniqueClasses.some(element => sourceTSS.includes(`'.${element}'`))) {
2016
2239
  logger.info(message);
2240
+ let sourceTSSFile = sourceTSS.split(/\r?\n/);
2017
2241
  uniqueClasses.forEach(className => {
2018
2242
  let cleanClassName = cleanClassNameFn(className);
2019
- if (soc.includes(`'.${cleanClassName}'`)) {
2020
- sourceTSS.forEach(line => {
2021
- if (line.startsWith(`'.${cleanClassName}'`)) {
2022
- purgedClasses += helpers.checkPlatformAndDevice(line, uniqueClasses[uniqueClasses.indexOf(className)]);
2023
- }
2024
- });
2243
+ if (sourceTSS.includes(`'.${cleanClassName}'`)) {
2244
+ let newLine = _.filter(sourceTSSFile, s => s.indexOf(`'.${cleanClassName}'`) !== -1)[0];
2245
+ purgedClasses += helpers.checkPlatformAndDevice(newLine, className);
2025
2246
  }
2026
2247
  });
2027
2248
  }
2028
2249
 
2250
+ localFinish(message);
2251
+
2029
2252
  return purgedClasses;
2030
2253
  }
2031
2254
 
2032
2255
  function saveFile(file, data) {
2256
+ localStart();
2257
+
2033
2258
  fs.writeFileSync(file, data, err => {
2034
2259
  throw err;
2035
2260
  });
2261
+
2262
+ localFinish(`Saving ${chalk.yellow('app.tss')}...`);
2036
2263
  }
2037
2264
 
2038
2265
  function createJMKFile() {