vueless 0.0.4 → 0.0.5

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 (318) hide show
  1. package/package.json +1 -1
  2. package/src/library.web-types-gen/index.js +17 -0
  3. package/src/library.web-types-gen/lib/build.js +252 -0
  4. package/src/library.web-types-gen/lib/config.js +32 -0
  5. package/src/library.web-types-gen/package.json +3 -0
  6. package/src/plugin.vite/index.js +59 -0
  7. package/src/plugin.vite/services/iconResolver.service.js +291 -0
  8. package/src/plugin.vite/services/svgLoader.service.js +76 -0
  9. package/src/plugin.vite/services/tailwindSafelist.service.js +195 -0
  10. package/src/plugin.vite/services/unpluginComponentsResolver.js +172 -0
  11. package/src/service.storybook/index.js +91 -0
  12. package/src/ui.button/Docs.mdx +16 -0
  13. package/src/ui.button/composables/attrs.composable.js +41 -0
  14. package/src/ui.button/configs/default.config.js +165 -0
  15. package/src/ui.button/constants/index.js +5 -0
  16. package/src/ui.button/index.stories.js +166 -0
  17. package/src/ui.button/index.vue +152 -0
  18. package/src/ui.button-link/Docs.mdx +16 -0
  19. package/src/ui.button-link/composables/attrs.composable.js +99 -0
  20. package/src/ui.button-link/configs/default.config.js +80 -0
  21. package/src/ui.button-link/constants/index.js +5 -0
  22. package/src/ui.button-link/index.stories.js +158 -0
  23. package/src/ui.button-link/index.vue +226 -0
  24. package/src/ui.button-toggle/Docs.mdx +16 -0
  25. package/src/ui.button-toggle/composables/attrs.composable.js +16 -0
  26. package/src/ui.button-toggle/configs/default.config.js +12 -0
  27. package/src/ui.button-toggle/constants/index.js +7 -0
  28. package/src/ui.button-toggle/index.stories.js +155 -0
  29. package/src/ui.button-toggle/index.vue +128 -0
  30. package/src/ui.button-toggle-item/Docs.mdx +16 -0
  31. package/src/ui.button-toggle-item/composables/attrs.composable.js +53 -0
  32. package/src/ui.button-toggle-item/configs/default.config.js +58 -0
  33. package/src/ui.button-toggle-item/constants/index.js +5 -0
  34. package/src/ui.button-toggle-item/index.stories.js +77 -0
  35. package/src/ui.button-toggle-item/index.vue +147 -0
  36. package/src/ui.container-accordion/composables/attrs.composable.js +45 -0
  37. package/src/ui.container-accordion/configs/default.config.js +32 -0
  38. package/src/ui.container-accordion/constants/index.js +5 -0
  39. package/src/ui.container-accordion/index.stories.js +89 -0
  40. package/src/ui.container-accordion/index.vue +95 -0
  41. package/src/ui.container-card/Docs.mdx +16 -0
  42. package/src/ui.container-card/composable/attrs.composable.js +56 -0
  43. package/src/ui.container-card/configs/default.config.js +31 -0
  44. package/src/ui.container-card/constants/index.js +5 -0
  45. package/src/ui.container-card/index.stories.js +170 -0
  46. package/src/ui.container-card/index.vue +146 -0
  47. package/src/ui.container-divider/Docs.mdx +16 -0
  48. package/src/ui.container-divider/configs/default.config.js +79 -0
  49. package/src/ui.container-divider/index.stories.js +124 -0
  50. package/src/ui.container-group/Docs.mdx +16 -0
  51. package/src/ui.container-group/composables/attrs.composable.js +44 -0
  52. package/src/ui.container-group/configs/default.config.js +29 -0
  53. package/src/ui.container-group/constants/index.js +5 -0
  54. package/src/ui.container-group/index.stories.js +88 -0
  55. package/src/ui.container-group/index.vue +106 -0
  56. package/src/ui.container-groups/Docs.mdx +16 -0
  57. package/src/ui.container-groups/composables/attrs.composable.js +12 -0
  58. package/src/ui.container-groups/configs/default.config.js +3 -0
  59. package/src/ui.container-groups/index.stories.js +45 -0
  60. package/src/ui.container-groups/index.vue +33 -0
  61. package/src/ui.container-modal/Docs.mdx +16 -0
  62. package/src/ui.container-modal/composables/attrs.composable.js +90 -0
  63. package/src/ui.container-modal/configs/default.config.js +69 -0
  64. package/src/ui.container-modal/constants/index.js +5 -0
  65. package/src/ui.container-modal/index.stories.js +170 -0
  66. package/src/ui.container-modal/index.vue +335 -0
  67. package/src/ui.container-modal-confirm/Docs.mdx +16 -0
  68. package/src/ui.container-modal-confirm/composable/attrs.composable.js +20 -0
  69. package/src/ui.container-modal-confirm/configs/default.config.js +15 -0
  70. package/src/ui.container-modal-confirm/constants/index.js +5 -0
  71. package/src/ui.container-modal-confirm/index.stories.js +209 -0
  72. package/src/ui.container-modal-confirm/index.vue +182 -0
  73. package/src/ui.container-page/Docs.mdx +16 -0
  74. package/src/ui.container-page/composables/attrs.composable.js +96 -0
  75. package/src/ui.container-page/configs/default.config.js +71 -0
  76. package/src/ui.container-page/constants/index.js +5 -0
  77. package/src/ui.container-page/index.stories.js +147 -0
  78. package/src/ui.container-page/index.vue +271 -0
  79. package/src/ui.container-row/Docs.mdx +16 -0
  80. package/src/ui.container-row/composables/attrs.composable.js +23 -0
  81. package/src/ui.container-row/configs/default.config.js +14 -0
  82. package/src/ui.container-row/constants/index.js +5 -0
  83. package/src/ui.container-row/index.stories.js +81 -0
  84. package/src/ui.container-row/index.vue +45 -0
  85. package/src/ui.data-list/composables/attrs.composable.js +45 -0
  86. package/src/ui.data-list/configs/default.config.js +32 -0
  87. package/src/ui.data-list/constants/index.js +5 -0
  88. package/src/ui.data-list/index.stories.js +91 -0
  89. package/src/ui.data-list/index.vue +258 -0
  90. package/src/ui.data-table/Docs.mdx +16 -0
  91. package/src/ui.data-table-cell/configs/default.config.js +19 -0
  92. package/src/ui.dropdown-badge/Docs.mdx +16 -0
  93. package/src/ui.dropdown-badge/composables/attrs.composable.js +63 -0
  94. package/src/ui.dropdown-badge/configs/default.config.js +34 -0
  95. package/src/ui.dropdown-badge/constants/index.js +5 -0
  96. package/src/ui.dropdown-badge/index.stories.js +126 -0
  97. package/src/ui.dropdown-badge/index.vue +233 -0
  98. package/src/ui.dropdown-button/Docs.mdx +16 -0
  99. package/src/ui.dropdown-button/composables/attrs.composable.js +63 -0
  100. package/src/ui.dropdown-button/configs/default.config.js +37 -0
  101. package/src/ui.dropdown-button/constants/index.js +14 -0
  102. package/src/ui.dropdown-button/index.stories.js +158 -0
  103. package/src/ui.dropdown-button/index.vue +271 -0
  104. package/src/ui.dropdown-item/Docs.mdx +16 -0
  105. package/src/ui.dropdown-item/composables/attrs.composable.js +13 -0
  106. package/src/ui.dropdown-item/configs/default.config.js +16 -0
  107. package/src/ui.dropdown-item/index.stories.js +30 -0
  108. package/src/ui.dropdown-item/index.vue +53 -0
  109. package/src/ui.dropdown-link/Docs.mdx +16 -0
  110. package/src/ui.dropdown-link/composables/attrs.composable.js +65 -0
  111. package/src/ui.dropdown-link/configs/default.config.js +37 -0
  112. package/src/ui.dropdown-link/constants/index.js +5 -0
  113. package/src/ui.dropdown-link/index.stories.js +127 -0
  114. package/src/ui.dropdown-link/index.vue +260 -0
  115. package/src/ui.dropdown-list/Docs.mdx +16 -0
  116. package/src/ui.dropdown-list/composables/attrs.composable.js +93 -0
  117. package/src/ui.dropdown-list/composables/usePointer.js +77 -0
  118. package/src/ui.dropdown-list/configs/default.config.js +74 -0
  119. package/src/ui.dropdown-list/constants/index.js +5 -0
  120. package/src/ui.dropdown-list/index.stories.js +76 -0
  121. package/src/ui.dropdown-list/index.vue +282 -0
  122. package/src/ui.form-calendar/Docs.mdx +52 -0
  123. package/src/ui.form-calendar/components/DayView.vue +268 -0
  124. package/src/ui.form-calendar/components/MonthView.vue +114 -0
  125. package/src/ui.form-calendar/components/YearView.vue +118 -0
  126. package/src/ui.form-calendar/constants/index.js +71 -0
  127. package/src/ui.form-calendar/index.stories.js +59 -0
  128. package/src/ui.form-calendar/index.vue +738 -0
  129. package/src/ui.form-calendar/services/calendar.service.js +189 -0
  130. package/src/ui.form-calendar/services/formatting.service.js +180 -0
  131. package/src/ui.form-checkbox/Docs.mdx +16 -0
  132. package/src/ui.form-checkbox/configs/default.config.js +69 -0
  133. package/src/ui.form-checkbox/index.stories.js +147 -0
  134. package/src/ui.form-checkbox-group/Docs.mdx +16 -0
  135. package/src/ui.form-checkbox-group/composables/attrs.composable.js +17 -0
  136. package/src/ui.form-checkbox-group/configs/default.config.js +5 -0
  137. package/src/ui.form-checkbox-group/constants/index.js +5 -0
  138. package/src/ui.form-checkbox-group/index.stories.js +45 -0
  139. package/src/ui.form-checkbox-group/index.vue +143 -0
  140. package/src/ui.form-checkbox-multi-state/Docs.mdx +16 -0
  141. package/src/ui.form-checkbox-multi-state/composables/attrs.composable.js +24 -0
  142. package/src/ui.form-checkbox-multi-state/configs/default.config.js +9 -0
  143. package/src/ui.form-checkbox-multi-state/constants/index.js +5 -0
  144. package/src/ui.form-checkbox-multi-state/index.stories.js +59 -0
  145. package/src/ui.form-checkbox-multi-state/index.vue +133 -0
  146. package/src/ui.form-color-picker/composables/attrs.composable.js +44 -0
  147. package/src/ui.form-color-picker/configs/default.config.js +52 -0
  148. package/src/ui.form-color-picker/constants/index.js +5 -0
  149. package/src/ui.form-color-picker/index.stories.js +63 -0
  150. package/src/ui.form-color-picker/index.vue +168 -0
  151. package/src/ui.form-date-picker/Docs.mdx +52 -0
  152. package/src/ui.form-date-picker/composables/attrs.composable.js +22 -0
  153. package/src/ui.form-date-picker/configs/default.config.js +26 -0
  154. package/src/ui.form-date-picker/constants/index.js +5 -0
  155. package/src/ui.form-date-picker/index.stories.js +132 -0
  156. package/src/ui.form-date-picker/index.vue +253 -0
  157. package/src/ui.form-date-picker-range/constants/index.js +23 -0
  158. package/src/ui.form-date-picker-range/index.stories.js +135 -0
  159. package/src/ui.form-date-picker-range/index.vue +929 -0
  160. package/src/ui.form-date-picker-range/services/dateRange.service.js +116 -0
  161. package/src/ui.form-input/Docs.mdx +16 -0
  162. package/src/ui.form-input/assets/fonts/text-security-disc.woff +0 -0
  163. package/src/ui.form-input/composables/attrs.composable.js +66 -0
  164. package/src/ui.form-input/configs/default.config.js +72 -0
  165. package/src/ui.form-input/constants/index.js +5 -0
  166. package/src/ui.form-input/index.stories.js +166 -0
  167. package/src/ui.form-input/index.vue +385 -0
  168. package/src/ui.form-input-file/composables/attrs.composable.js +82 -0
  169. package/src/ui.form-input-file/configs/default.config.js +59 -0
  170. package/src/ui.form-input-file/constants/index.js +5 -0
  171. package/src/ui.form-input-file/index.stories.js +86 -0
  172. package/src/ui.form-input-file/index.vue +385 -0
  173. package/src/ui.form-input-money/Docs.mdx +16 -0
  174. package/src/ui.form-input-money/composables/attrs.composable.js +13 -0
  175. package/src/ui.form-input-money/composables/useFormatCurrency.js +82 -0
  176. package/src/ui.form-input-money/configs/default.config.js +16 -0
  177. package/src/ui.form-input-money/constants/index.js +5 -0
  178. package/src/ui.form-input-money/index.stories.js +126 -0
  179. package/src/ui.form-input-money/index.vue +264 -0
  180. package/src/ui.form-input-money/services/format.service.js +72 -0
  181. package/src/ui.form-input-number/Docs.mdx +16 -0
  182. package/src/ui.form-input-number/composables/attrs.composable.js +47 -0
  183. package/src/ui.form-input-number/configs/default.config.js +33 -0
  184. package/src/ui.form-input-number/constants/index.js +5 -0
  185. package/src/ui.form-input-number/index.stories.js +103 -0
  186. package/src/ui.form-input-number/index.vue +159 -0
  187. package/src/ui.form-input-rating/composables/attrs.composable.js +34 -0
  188. package/src/ui.form-input-rating/constants/index.js +5 -0
  189. package/src/ui.form-input-search/composables/attrs.composable.js +21 -0
  190. package/src/ui.form-input-search/configs/default.config.js +20 -0
  191. package/src/ui.form-input-search/constants/index.js +5 -0
  192. package/src/ui.form-input-search/index.stories.js +90 -0
  193. package/src/ui.form-input-search/index.vue +212 -0
  194. package/src/ui.form-label/Docs.mdx +16 -0
  195. package/src/ui.form-label/composables/attrs.composable.js +65 -0
  196. package/src/ui.form-label/configs/default.config.js +95 -0
  197. package/src/ui.form-label/constants/index.js +13 -0
  198. package/src/ui.form-label/index.stories.js +107 -0
  199. package/src/ui.form-label/index.vue +170 -0
  200. package/src/ui.form-radio/Docs.mdx +16 -0
  201. package/src/ui.form-radio/composables/attrs.composable.js +34 -0
  202. package/src/ui.form-radio/configs/default.config.js +47 -0
  203. package/src/ui.form-radio/constants/index.js +5 -0
  204. package/src/ui.form-radio/index.stories.js +71 -0
  205. package/src/ui.form-radio/index.vue +169 -0
  206. package/src/ui.form-radio-card/Docs.mdx +16 -0
  207. package/src/ui.form-radio-card/constants/index.js +5 -0
  208. package/src/ui.form-radio-card/index.stories.js +149 -0
  209. package/src/ui.form-radio-card/services/variant.service.js +15 -0
  210. package/src/ui.form-radio-group/Docs.mdx +16 -0
  211. package/src/ui.form-radio-group/composables/attrs.composable.js +27 -0
  212. package/src/ui.form-radio-group/configs/default.config.js +18 -0
  213. package/src/ui.form-radio-group/constants/index.js +5 -0
  214. package/src/ui.form-radio-group/index.stories.js +42 -0
  215. package/src/ui.form-radio-group/index.vue +127 -0
  216. package/src/ui.form-select/Docs.mdx +16 -0
  217. package/src/ui.form-select/composables/attrs.composable.js +172 -0
  218. package/src/ui.form-select/configs/default.config.js +138 -0
  219. package/src/ui.form-select/constants/index.js +19 -0
  220. package/src/ui.form-select/index.stories.js +339 -0
  221. package/src/ui.form-select/index.vue +719 -0
  222. package/src/ui.form-select/services/select.service.js +98 -0
  223. package/src/ui.form-switch/composables/attrs.composable.js +77 -0
  224. package/src/ui.form-switch/configs/default.config.js +76 -0
  225. package/src/ui.form-switch/constants/index.js +5 -0
  226. package/src/ui.form-switch/index.stories.js +93 -0
  227. package/src/ui.form-switch/index.vue +198 -0
  228. package/src/ui.form-switch/services/variant.service.js +31 -0
  229. package/src/ui.form-textarea/Docs.mdx +16 -0
  230. package/src/ui.form-textarea/composables/attrs.composable.js +52 -0
  231. package/src/ui.form-textarea/configs/default.config.js +68 -0
  232. package/src/ui.form-textarea/constants/index.js +5 -0
  233. package/src/ui.form-textarea/index.stories.js +151 -0
  234. package/src/ui.form-textarea/index.vue +284 -0
  235. package/src/ui.image-avatar/composables/attrs.composable.js +34 -0
  236. package/src/ui.image-avatar/configs/default.config.js +42 -0
  237. package/src/ui.image-avatar/constants/index.js +5 -0
  238. package/src/ui.image-avatar/default-avatar.png +0 -0
  239. package/src/ui.image-avatar/index.stories.js +107 -0
  240. package/src/ui.image-avatar/index.vue +121 -0
  241. package/src/ui.image-icon/Docs.mdx +16 -0
  242. package/src/ui.image-icon/index.stories.js +110 -0
  243. package/src/ui.image-logo/configs/default.config.js +38 -0
  244. package/src/ui.image-logo/index.stories.js +84 -0
  245. package/src/ui.loader-top/components/TopProgress.vue +277 -0
  246. package/src/ui.navigation-pagination/composables/attrs.composable.js +41 -0
  247. package/src/ui.navigation-pagination/configs/default.config.js +24 -0
  248. package/src/ui.navigation-pagination/constants/index.js +8 -0
  249. package/src/ui.navigation-pagination/index.stories.js +52 -0
  250. package/src/ui.navigation-pagination/index.vue +275 -0
  251. package/src/ui.navigation-stepper/composables/attrs.composable.js +25 -0
  252. package/src/ui.navigation-stepper/configs/default.config.js +13 -0
  253. package/src/ui.navigation-stepper/constants/index.js +5 -0
  254. package/src/ui.navigation-stepper/index.stories.js +30 -0
  255. package/src/ui.navigation-stepper/index.vue +128 -0
  256. package/src/ui.navigation-tab/composables/attrs.composable.js +30 -0
  257. package/src/ui.navigation-tab/configs/default.config.js +22 -0
  258. package/src/ui.navigation-tab/constants/index.js +5 -0
  259. package/src/ui.navigation-tab/index.stories.js +57 -0
  260. package/src/ui.navigation-tab/index.vue +85 -0
  261. package/src/ui.navigation-tabs/composables/attrs.composable.js +24 -0
  262. package/src/ui.navigation-tabs/configs/default.config.js +14 -0
  263. package/src/ui.navigation-tabs/constants/index.js +5 -0
  264. package/src/ui.navigation-tabs/index.stories.js +69 -0
  265. package/src/ui.navigation-tabs/index.vue +99 -0
  266. package/src/ui.notify/index.stories.js +102 -0
  267. package/src/ui.other-dot/composables/attrs.composable.js +32 -0
  268. package/src/ui.other-dot/configs/default.config.js +21 -0
  269. package/src/ui.other-dot/constants/index.js +5 -0
  270. package/src/ui.other-dot/index.stories.js +77 -0
  271. package/src/ui.other-dot/index.vue +52 -0
  272. package/src/ui.other-loader/composables/attrs.composable.js +51 -0
  273. package/src/ui.other-loader/configs/default.config.js +47 -0
  274. package/src/ui.other-loader/constants/index.js +5 -0
  275. package/src/ui.other-loader/index.stories.js +78 -0
  276. package/src/ui.other-loader/index.vue +136 -0
  277. package/src/ui.text-alert/composables/attrs.composable.js +48 -0
  278. package/src/ui.text-alert/configs/default.config.js +51 -0
  279. package/src/ui.text-alert/constatns/index.js +5 -0
  280. package/src/ui.text-alert/index.stories.js +157 -0
  281. package/src/ui.text-alert/index.vue +121 -0
  282. package/src/ui.text-badge/Docs.mdx +16 -0
  283. package/src/ui.text-badge/composables/attrs.composable.js +49 -0
  284. package/src/ui.text-badge/configs/default.config.js +51 -0
  285. package/src/ui.text-badge/constants/index.js +5 -0
  286. package/src/ui.text-badge/index.stories.js +190 -0
  287. package/src/ui.text-badge/index.vue +120 -0
  288. package/src/ui.text-block/composables/attrs.composable.js +31 -0
  289. package/src/ui.text-block/configs/default.config.js +35 -0
  290. package/src/ui.text-block/constatns/index.js +5 -0
  291. package/src/ui.text-block/index.stories.js +112 -0
  292. package/src/ui.text-block/index.vue +76 -0
  293. package/src/ui.text-empty/Docs.mdx +16 -0
  294. package/src/ui.text-empty/configs/default.config.js +30 -0
  295. package/src/ui.text-empty/index.stories.js +106 -0
  296. package/src/ui.text-file/composables/attrs.composable.js +37 -0
  297. package/src/ui.text-file/configs/default.config.js +15 -0
  298. package/src/ui.text-file/index.stories.js +29 -0
  299. package/src/ui.text-file/index.vue +93 -0
  300. package/src/ui.text-files/composables/attrs.composable.js +19 -0
  301. package/src/ui.text-files/configs/default.config.js +9 -0
  302. package/src/ui.text-files/constants/index.js +5 -0
  303. package/src/ui.text-files/index.stories.js +32 -0
  304. package/src/ui.text-files/index.vue +87 -0
  305. package/src/ui.text-header/Docs.mdx +16 -0
  306. package/src/ui.text-header/composables/attrs.composable.js +34 -0
  307. package/src/ui.text-header/constants/index.js +5 -0
  308. package/src/ui.text-header/index.stories.js +106 -0
  309. package/src/ui.text-header/index.vue +83 -0
  310. package/src/ui.text-money/Docs.mdx +16 -0
  311. package/src/ui.text-money/assets/credit.svg +7 -0
  312. package/src/ui.text-money/assets/debit.svg +12 -0
  313. package/src/ui.text-money/composables/attrs.composable.js +65 -0
  314. package/src/ui.text-money/constants/index.js +7 -0
  315. package/src/ui.text-money/index.stories.js +265 -0
  316. package/src/ui.text-money/index.vue +204 -0
  317. package/src/ui.text-money/services/money.services.js +24 -0
  318. package/src/ui.viewport/index.vue +78 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vueless",
3
- "version": "0.0.4",
3
+ "version": "0.0.5",
4
4
  "license": "MIT",
5
5
  "description": "Vue Styleless Component Framework.",
6
6
  "homepage": "https://vueless.com",
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import minimist from "minimist";
3
+ import { extractConfig } from "./lib/config.js";
4
+ import build from "./lib/build.js";
5
+
6
+ const {
7
+ _: pathArray,
8
+ configFile,
9
+ watch,
10
+ cwd,
11
+ } = minimist(process.argv.slice(2), {
12
+ alias: { c: "configFile", w: "watch" },
13
+ });
14
+
15
+ const conf = await extractConfig(cwd || process.cwd(), watch, configFile, pathArray);
16
+
17
+ build(conf);
@@ -0,0 +1,252 @@
1
+ import path from "path";
2
+ import { globbySync } from "globby";
3
+ import * as chokidar from "chokidar";
4
+ import { parse } from "vue-docgen-api";
5
+ import * as fs from "fs";
6
+ import mkdirp from "mkdirp";
7
+ import _ from "lodash-es";
8
+ import { merge } from "lodash-es";
9
+
10
+ export default async function build(config) {
11
+ config.componentsRoot = path.resolve(config.cwd, config.componentsRoot);
12
+ config.outFile = path.resolve(config.cwd, config.outFile);
13
+
14
+ // then create the watcher if necessary
15
+ const { watcher, componentFiles } = getSources(config.components, config.componentsRoot);
16
+
17
+ // eslint-disable-next-line no-console
18
+ console.log("Building web-types to " + config.outFile);
19
+
20
+ const cache = {};
21
+ const buildWebTypesBound = rebuild.bind(null, config, componentFiles, cache, watcher);
22
+
23
+ try {
24
+ await buildWebTypesBound();
25
+ } catch (e) {
26
+ // eslint-disable-next-line no-console
27
+ console.error("Error building web-types: " + e.message);
28
+ await watcher.close();
29
+
30
+ return;
31
+ }
32
+
33
+ if (config.watch) {
34
+ watcher
35
+ .on("add", buildWebTypesBound)
36
+ .on("change", buildWebTypesBound)
37
+ .on("unlink", async (filePath) => {
38
+ // eslint-disable-next-line no-console
39
+ console.log("Rebuilding on file removal " + filePath);
40
+ delete cache[filePath];
41
+ await writeDownWebTypesFile(config, Object.values(cache), config.outFile);
42
+ });
43
+ } else {
44
+ await watcher.close();
45
+ }
46
+ }
47
+
48
+ function getSources(components, cwd) {
49
+ const watcher = chokidar.watch(components, { cwd });
50
+
51
+ const allComponentFiles = globbySync(components, { cwd });
52
+
53
+ return { watcher, componentFiles: allComponentFiles };
54
+ }
55
+
56
+ async function rebuild(config, files, cachedContent, watcher, changedFilePath) {
57
+ const cacheWebTypesContent = async (filePath) => {
58
+ cachedContent[filePath.replace(/\\/g, "/")] = await extractInformation(
59
+ path.join(config.componentsRoot, filePath),
60
+ config,
61
+ );
62
+
63
+ return true;
64
+ };
65
+
66
+ if (changedFilePath) {
67
+ // eslint-disable-next-line no-console
68
+ console.log("Rebuilding on update file " + changedFilePath);
69
+
70
+ try {
71
+ // if in chokidar mode (watch), the path of the file that was just changed
72
+ // is passed as an argument. We only affect the changed file and avoid re-parsing the rest
73
+ await cacheWebTypesContent(changedFilePath);
74
+ } catch (e) {
75
+ throw new Error(
76
+ `Error building file ${config.outFile} when file ${changedFilePath} has changed: ${e.message}`,
77
+ );
78
+ }
79
+ } else {
80
+ try {
81
+ // if we are initializing the current file, parse all components
82
+ await Promise.all(files.map(cacheWebTypesContent));
83
+ } catch (e) {
84
+ throw new Error(`Error building file ${config.outFile}: ${e.message}`);
85
+ }
86
+ }
87
+
88
+ // and finally save all concatenated values to the markdown file
89
+ await writeDownWebTypesFile(config, Object.values(cachedContent), config.outFile);
90
+ }
91
+
92
+ async function writeDownWebTypesFile(config, definitions, destFilePath) {
93
+ const destFolder = path.dirname(destFilePath);
94
+
95
+ await mkdirp(destFolder);
96
+ let writeStream = fs.createWriteStream(destFilePath);
97
+ const contents = {
98
+ framework: "vue",
99
+ name: config.packageName,
100
+ version: config.packageVersion,
101
+ contributions: {
102
+ html: {
103
+ "description-markup": config.descriptionMarkup,
104
+ "types-syntax": config.typesSyntax,
105
+ tags: _(definitions)
106
+ .flatMap((d) => d.tags || [])
107
+ .orderBy("name", "asc")
108
+ .value(),
109
+ attributes: _(definitions)
110
+ .flatMap((d) => d.attributes || [])
111
+ .orderBy("name", "asc")
112
+ .value(),
113
+ "vue-filters": _(definitions)
114
+ .flatMap((d) => d["vue-filters"] || [])
115
+ .orderBy("name", "asc")
116
+ .value(),
117
+ },
118
+ },
119
+ };
120
+
121
+ const html = contents.contributions.html;
122
+
123
+ if (html.tags?.length == 0) html.tags = undefined;
124
+ if (html.attributes?.length == 0) html.attributes = undefined;
125
+ if (html["vue-filters"]?.length == 0) html["vue-filters"] = undefined;
126
+
127
+ writeStream.write(JSON.stringify(contents, null, 2));
128
+
129
+ // close the stream
130
+ writeStream.close();
131
+ }
132
+
133
+ function ensureRelative(path) {
134
+ // The .replace() is a fix for paths that end up like "./src\\components\\General\\VerticalButton.vue" on windows machines.
135
+ return (path.startsWith("./") || path.startsWith("../") ? path : "./" + path).replace(/\\/g, "/");
136
+ }
137
+
138
+ async function extractInformation(absolutePath, config) {
139
+ const doc = await parse(absolutePath, config.apiOptions);
140
+ const name = doc.name || doc.displayName;
141
+ let description = doc.description?.trim() ?? "";
142
+
143
+ // Get default component config
144
+ const configPath = path.join(path.dirname(absolutePath), "configs/default.config.js");
145
+ let globalConfig = null;
146
+ let defaultConfig = null;
147
+ let defaultValues = null;
148
+
149
+ if (fs.existsSync(configPath)) {
150
+ const defaultConfigFile = fs.readFileSync(configPath).toString();
151
+ const globalConfigFile = fs.readFileSync(config.cwd + "/vueless.config.js").toString();
152
+
153
+ defaultConfig = getDefaultConfigJson(defaultConfigFile);
154
+ globalConfig = getGlobalConfigJson(globalConfigFile, name);
155
+ defaultValues = merge(defaultConfig.defaultVariants, globalConfig[name]?.defaultVariants);
156
+ }
157
+
158
+ function getDefaultConfigJson(fileContents) {
159
+ const objectStartIndex = fileContents.indexOf("{");
160
+ const variablePattern = /([^:]+):\s*(?!true|false|undefined)([a-zA-Z_]\w*)/g;
161
+ let objectString = fileContents
162
+ .substring(objectStartIndex)
163
+ .replace("};", "}")
164
+ .replace(/undefined/g, '"undefined"')
165
+ .replace(variablePattern, (match, key) => key + ": {}");
166
+
167
+ return eval("(" + objectString + ")"); // Converting into JS object
168
+ }
169
+
170
+ function getGlobalConfigJson(fileContents, componentName) {
171
+ const startIndex = fileContents.indexOf(`${componentName}:`);
172
+
173
+ // find index of the last closing bracket
174
+ let endIndex = -1;
175
+ let braceCount = 0;
176
+
177
+ for (let i = startIndex; i < fileContents.length; i++) {
178
+ if (fileContents[i] === "{") {
179
+ braceCount++;
180
+ } else if (fileContents[i] === "}") {
181
+ braceCount--;
182
+
183
+ if (braceCount === 0) {
184
+ endIndex = i;
185
+ break;
186
+ }
187
+ }
188
+ }
189
+
190
+ // Get component config raw string
191
+ const rawString = fileContents.slice(startIndex, endIndex);
192
+
193
+ // If the stings are present in config but commented - remove them
194
+ const stringWithoutComments = rawString.replace(/\/\/.*$/gm, "");
195
+
196
+ // Check if final JSON string is valid: TODO: find better solution
197
+ if (!stringWithoutComments.includes("}")) return {};
198
+
199
+ const jsonString = `{${stringWithoutComments}\n}}`
200
+ .replace(/[`']/g, '"')
201
+ .replace(/(\w+)\s*: /g, '"$1":')
202
+ .replace(/,\s*}/g, "}");
203
+
204
+ return JSON.parse(jsonString);
205
+ }
206
+
207
+ doc.docsBlocks?.forEach((block) => {
208
+ if (description.length > 0) {
209
+ if (config.descriptionMarkup === "html") {
210
+ description += "<br/><br/>";
211
+ } else {
212
+ description += "\n\n";
213
+ }
214
+ }
215
+
216
+ description += block;
217
+ });
218
+
219
+ return {
220
+ tags: [
221
+ {
222
+ name,
223
+ description,
224
+ attributes: doc.props?.map((prop) => ({
225
+ name: prop.name,
226
+ required: prop.required,
227
+ description: prop.tags?.ignore ? "@ignore: " + prop.description : prop.description,
228
+ value: {
229
+ kind: "expression",
230
+ type: prop.values ? `'${prop.values.join("' | '")}'` : prop.type?.name ?? "any",
231
+ },
232
+ default:
233
+ defaultValues && prop.name in defaultValues
234
+ ? defaultValues[prop.name].toString()
235
+ : prop.defaultValue?.value.toString(),
236
+ })),
237
+ events: doc.events?.map((event) => ({
238
+ name: event.name,
239
+ description: event.description,
240
+ })),
241
+ slots: doc.slots?.map((slot) => ({
242
+ name: slot.name,
243
+ description: slot.description,
244
+ })),
245
+ source: {
246
+ module: ensureRelative(path.relative(config.cwd, absolutePath)).substring(1), // TODO: maybe substring should be removed when it turns to package
247
+ symbol: doc.exportName,
248
+ },
249
+ },
250
+ ],
251
+ };
252
+ }
@@ -0,0 +1,32 @@
1
+ import path from "path";
2
+ import fs from "fs";
3
+ import { readFile } from "fs/promises";
4
+
5
+ export async function extractConfig(cwd, watch = false, configFileFromCmd, pathArray = []) {
6
+ const configFilePath = configFileFromCmd
7
+ ? path.resolve(cwd, configFileFromCmd)
8
+ : path.join(cwd, "web-types.config.js");
9
+ const [componentsFromCmd, outFileFromCmd] = pathArray;
10
+
11
+ const fileContent = await readFile(path.join(cwd, "package.json"), "utf-8");
12
+ const packageJson = JSON.parse(fileContent);
13
+
14
+ let additionalConfig = {};
15
+
16
+ if (fs.existsSync(configFilePath)) {
17
+ additionalConfig = await import(configFilePath);
18
+ }
19
+
20
+ return {
21
+ cwd,
22
+ watch,
23
+ componentsRoot: configFilePath ? path.dirname(configFilePath) : cwd,
24
+ components: componentsFromCmd || "(.vueless/**/*.vue|src/components/**/*.vue)",
25
+ outFile: outFileFromCmd || packageJson["web-types"] || "./web-types.json",
26
+ packageName: packageJson["name"],
27
+ packageVersion: packageJson["version"],
28
+ typesSyntax: "typescript",
29
+ descriptionMarkup: "markdown",
30
+ ...additionalConfig,
31
+ };
32
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
@@ -0,0 +1,59 @@
1
+ /* eslint-disable no-console */
2
+
3
+ import UnpluginVueComponents from "unplugin-vue-components/vite";
4
+ import unpluginComponentsResolver from "./services/unpluginComponentsResolver";
5
+ import { copyIcons, removeIcons } from "./services/iconResolver.service";
6
+ import { loadSvg } from "./services/svgLoader.service";
7
+ import { createTailwindSafelist } from "./services/tailwindSafelist.service";
8
+
9
+ /* Automatically importing Vueless components on demand */
10
+ export const VuelessUnpluginComponents = (options) =>
11
+ UnpluginVueComponents({
12
+ resolvers: [unpluginComponentsResolver],
13
+ dts: false,
14
+ ...options,
15
+ });
16
+
17
+ /*
18
+ – Creates tailwind colors safelist (collect only used on the project colors).
19
+ – Collects SVG icons for build (UIcon bundle size optimization).
20
+ – Loads SVG images as a Vue components.
21
+ */
22
+ export const Vueless = function (options = {}) {
23
+ /* remove icons if server stopped */
24
+ process.on("SIGINT", () => {
25
+ removeIcons(options.debug);
26
+ process.exit(0);
27
+ });
28
+
29
+ return {
30
+ name: "vite-plugin-vue-vueless",
31
+ enforce: "pre",
32
+
33
+ config: () => ({
34
+ define: {
35
+ "process.env": {},
36
+ },
37
+ }),
38
+
39
+ configResolved: (config) => {
40
+ if (config.command === "build") {
41
+ /* collect used in project colors for tailwind safelist */
42
+ createTailwindSafelist();
43
+ /* dynamically copy icons before build */
44
+ copyIcons(options.mode, options.debug);
45
+ }
46
+
47
+ if (config.command === "dev" || config.command === "serve") {
48
+ /* remove dynamically copied icons after build */
49
+ removeIcons(options.debug);
50
+ }
51
+ },
52
+
53
+ /* remove dynamically copied icons after build */
54
+ buildEnd: () => removeIcons(options.debug),
55
+
56
+ /* load SVG images as a Vue components */
57
+ load: async (id) => await loadSvg(id, options),
58
+ };
59
+ };
@@ -0,0 +1,291 @@
1
+ /**
2
+ This scrypt find icon names from the UIcon props and objects across the project
3
+ and copy SVG icons from the default icons library (@material-symbols or other from config)
4
+ to the ".../.generated" folder.
5
+
6
+ Those icons will be used only in the build stage.
7
+ The script is needed to avoid all @material-symbols icons set in the project bundle.
8
+ */
9
+
10
+ /* eslint-disable no-console */
11
+ import fs from "fs";
12
+ import path from "path";
13
+ import { createRequire } from "node:module";
14
+ import { merge } from "lodash-es";
15
+
16
+ import vuelessConfig from "../../../vueless.config.js";
17
+
18
+ const DESTINATION_DIR = "./src/assets/images/.generated";
19
+ const DEFAULT_CONFIG_PATH = ".vueless/ui.image-icon/configs/default.config.js";
20
+ const STORYBOOK_STORY_EXTENSION = ".stories.js";
21
+ const U_ICON = "UIcon";
22
+
23
+ const defaultVariants = getMergedConfig();
24
+ const args = parseArgs();
25
+
26
+ let isDebug = false;
27
+
28
+ // run method manually
29
+ if (args.run) {
30
+ copyIcons(args.mode);
31
+ }
32
+
33
+ // perform icons copy magick... ✨
34
+ export function copyIcons(mode = "src", debug) {
35
+ isDebug = debug || false;
36
+
37
+ removeIcons();
38
+
39
+ const vuelessVueFiles = getFiles(".vueless", ".vue");
40
+ const vuelessJsFiles = getFiles(".vueless", ".js");
41
+ const vuelessLayoutsVueFiles = getFiles(".vueless-layouts", ".vue");
42
+ const vuelessLayoutsJsFiles = getFiles(".vueless-layouts", ".js");
43
+ const vuelessServicesJsFiles = getFiles(".vueless-services", ".js");
44
+
45
+ findAndCopyIcons([
46
+ ...vuelessVueFiles,
47
+ ...vuelessJsFiles,
48
+ ...vuelessLayoutsVueFiles,
49
+ ...vuelessLayoutsJsFiles,
50
+ ...vuelessServicesJsFiles,
51
+ "vueless.config.js",
52
+ "vueless.config.ts",
53
+ ]);
54
+
55
+ if (mode === "src" || mode === "all") {
56
+ const srcVueFiles = getFiles("src", ".vue");
57
+ const srcJsFiles = getFiles("src", ".js");
58
+ const srcTsFiles = getFiles("src", ".ts");
59
+
60
+ findAndCopyIcons([...srcVueFiles, ...srcJsFiles, ...srcTsFiles]);
61
+ }
62
+
63
+ if (mode === "storybook" || mode === "all") {
64
+ const vuelessStoriesJsFiles = getFiles(".vueless", STORYBOOK_STORY_EXTENSION);
65
+
66
+ findAndCopyIcons(vuelessStoriesJsFiles);
67
+ }
68
+ }
69
+
70
+ export function removeIcons() {
71
+ if (fs.existsSync(DESTINATION_DIR)) {
72
+ fs.rmSync(DESTINATION_DIR, { recursive: true, force: true });
73
+
74
+ if (isDebug) {
75
+ console.log("Dynamically copied icons was successfully removed.");
76
+ }
77
+ }
78
+ }
79
+
80
+ function findAndCopyIcons(files) {
81
+ const safelistIcons = getSafelistIcons();
82
+
83
+ safelistIcons.forEach((iconName) => {
84
+ copyFile(iconName, false);
85
+ copyFile(iconName, true);
86
+ });
87
+
88
+ files.forEach(async (file) => {
89
+ const fileContents = fs.existsSync(file) ? fs.readFileSync(file).toString() : "";
90
+
91
+ /* Objects across the project */
92
+ const objectRegExp = /(\{|[^{])[^}]*\b\w*icon\w*:\s*["']([^"']+)["'][^}]*}/gi;
93
+ const objectMatches = fileContents.match(objectRegExp);
94
+
95
+ if (objectMatches) {
96
+ for (const match of objectMatches) {
97
+ const iconNameRegex = /\w*(icon)\w*:\s*["']([^"'\s]+)["']/gi;
98
+ const iconNameMatch = iconNameRegex.exec(match);
99
+ const iconName = iconNameMatch && iconNameMatch[2];
100
+
101
+ const iconFillRegex = /\w*(fill)\w*:\s*(true|false)/gi;
102
+ const fillMatch = iconFillRegex.exec(match);
103
+ const fill = fillMatch ? fillMatch[2] : defaultVariants.fill;
104
+
105
+ try {
106
+ if (iconName) {
107
+ copyFile(iconName, fill);
108
+ }
109
+ } catch (error) {
110
+ // console.log(error);
111
+ }
112
+
113
+ iconNameRegex.lastIndex = 0;
114
+ iconFillRegex.lastIndex = 0;
115
+ }
116
+ }
117
+
118
+ /* UIcon */
119
+ const regexName = /\bname\s*=\s*["']([^"'\s]+)["']/;
120
+ const regexFill = /(:(fill)="([^"]*)"|fill)/;
121
+
122
+ const matchNameArray = fileContents.match(/<UIcon[^>]+>/g);
123
+
124
+ if (matchNameArray) {
125
+ for (const match of matchNameArray) {
126
+ const iconNameMatch = regexName.exec(match);
127
+ const iconFillMatch = regexFill.exec(match);
128
+
129
+ const iconName = iconNameMatch ? iconNameMatch[1] : null;
130
+ const fill = iconFillMatch ? iconFillMatch[1] : defaultVariants.fill;
131
+
132
+ try {
133
+ if (iconName) {
134
+ if (iconFillMatch && iconFillMatch[3]) {
135
+ copyFile(iconName, false);
136
+ copyFile(iconName, true);
137
+ } else {
138
+ copyFile(iconName, fill);
139
+ }
140
+ }
141
+ } catch (error) {
142
+ // console.log(error);
143
+ }
144
+ }
145
+ }
146
+
147
+ /* UIcon with ternary operator */
148
+ const ternaryRegexName = /\bname="[^']*'([^']*)'\s*:\s*'([^']*)'/;
149
+ const ternaryRegexFill = /(:(fill)="([^"]*)"|fill)/;
150
+
151
+ const ternaryMatchNameArray = fileContents.match(/<UIcon[^>]+>/g);
152
+
153
+ if (ternaryMatchNameArray) {
154
+ for (const match of ternaryMatchNameArray) {
155
+ const iconNameMatch = ternaryRegexName.exec(match);
156
+ const iconFillMatch = ternaryRegexFill.exec(match);
157
+
158
+ const fill = iconFillMatch ? iconFillMatch[1] : defaultVariants.fill;
159
+
160
+ try {
161
+ if (iconFillMatch && iconFillMatch[3]) {
162
+ copyFile(iconNameMatch[1], false);
163
+ copyFile(iconNameMatch[2], true);
164
+ copyFile(iconNameMatch[1], false);
165
+ copyFile(iconNameMatch[2], true);
166
+ } else {
167
+ copyFile(iconNameMatch[1], fill);
168
+ copyFile(iconNameMatch[2], fill);
169
+ }
170
+ } catch (error) {
171
+ // console.log(error);
172
+ }
173
+ }
174
+ }
175
+ });
176
+ }
177
+
178
+ function getFiles(dirPath, extension, fileList) {
179
+ const files = fs.readdirSync(dirPath);
180
+
181
+ fileList = fileList || [];
182
+
183
+ files.forEach((file) => {
184
+ const filePath = path.join(dirPath, file);
185
+ const stat = fs.statSync(filePath);
186
+
187
+ if (stat.isDirectory()) {
188
+ fileList = getFiles(filePath, extension, fileList);
189
+ } else {
190
+ const isStorybookStory =
191
+ filePath.endsWith(STORYBOOK_STORY_EXTENSION) && extension !== STORYBOOK_STORY_EXTENSION;
192
+
193
+ if (filePath.endsWith(extension) && !isStorybookStory) {
194
+ fileList.push(filePath);
195
+ }
196
+ }
197
+ });
198
+
199
+ return fileList;
200
+ }
201
+
202
+ function copyFile(name, fill) {
203
+ name = name.toLowerCase();
204
+ fill = Boolean(fill);
205
+
206
+ const library = defaultVariants.library;
207
+ const weight = defaultVariants.weight;
208
+ const style = defaultVariants.style;
209
+
210
+ const require = createRequire(import.meta.url);
211
+
212
+ /* eslint-disable prettier/prettier */
213
+ const libraries = {
214
+ "@material-symbols": {
215
+ source: `${library}/svg-${weight}/${style}/${name}${fill ? "-fill" : ""}.svg`,
216
+ destination: `${DESTINATION_DIR}/${library}/svg-${weight}/${style}/${name}${fill ? "-fill" : ""}.svg`,
217
+ },
218
+ "bootstrap-icons": {
219
+ source: `${library}/icons/${name}${fill ? "-fill" : ""}.svg`,
220
+ destination: `${DESTINATION_DIR}/${library}/icons/${name}${fill ? "-fill" : ""}.svg`,
221
+ },
222
+ heroicons: {
223
+ source: `${library}/${style}/${fill ? "solid" : "outline"}/${name}.svg`,
224
+ destination: `${DESTINATION_DIR}/${library}/${style}/${fill ? "solid" : "outline"}/${name}.svg`,
225
+ },
226
+ };
227
+ /* eslint-enable prettier/prettier */
228
+
229
+ const { source, destination } = libraries[library];
230
+
231
+ if (fs.existsSync(destination)) {
232
+ return;
233
+ }
234
+
235
+ const destDir = path.dirname(destination);
236
+
237
+ fs.mkdirSync(destDir, { recursive: true });
238
+ fs.copyFile(require.resolve(source), destination, (err) => {
239
+ if (args.debug || isDebug) {
240
+ err
241
+ ? console.error(`Error copying icon "${name}":`, err)
242
+ : console.log(`Icon "${name}" copied successfully!`);
243
+ }
244
+ });
245
+ }
246
+
247
+ function parseArgs() {
248
+ const args = process.argv.slice(2);
249
+ const parsedArgs = {};
250
+
251
+ let currentKey = null;
252
+
253
+ for (let i = 0; i < args.length; i++) {
254
+ const arg = args[i];
255
+
256
+ if (arg.startsWith("--")) {
257
+ const key = arg.slice(2);
258
+
259
+ parsedArgs[key] = true;
260
+ currentKey = key;
261
+ } else if (currentKey) {
262
+ parsedArgs[currentKey] = arg;
263
+ currentKey = null;
264
+ }
265
+ }
266
+
267
+ return parsedArgs;
268
+ }
269
+
270
+ function getSafelistIcons() {
271
+ return vuelessConfig.component ? vuelessConfig.component[U_ICON]?.safelistIcons || [] : [];
272
+ }
273
+
274
+ function getMergedConfig() {
275
+ if (fs.existsSync(DEFAULT_CONFIG_PATH)) {
276
+ const defaultConfigFile = fs.readFileSync(DEFAULT_CONFIG_PATH).toString();
277
+
278
+ const defaultConfig = getDefaultConfigJson(defaultConfigFile);
279
+ const globalConfig = vuelessConfig.component || {};
280
+
281
+ return merge(defaultConfig.defaultVariants, globalConfig[U_ICON]?.defaultVariants);
282
+ }
283
+ }
284
+
285
+ function getDefaultConfigJson(fileContents) {
286
+ const objectStartIndex = fileContents.indexOf("{");
287
+ const objectString = fileContents.substring(objectStartIndex).replace("};", "}");
288
+
289
+ // indirect eval
290
+ return (0, eval)("(" + objectString + ")"); // Converting into JS object
291
+ }