@adobe-commerce/elsie 1.0.0-alpha04071347

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 (340) hide show
  1. package/.elsie.js +21 -0
  2. package/.eslintrc.js +18 -0
  3. package/README.md +52 -0
  4. package/__mocks__/svg.js +11 -0
  5. package/bin/builders/build/index.js +20 -0
  6. package/bin/builders/generate/api/index.js +65 -0
  7. package/bin/builders/generate/api/templates/function.js +9 -0
  8. package/bin/builders/generate/api/templates/index.js +7 -0
  9. package/bin/builders/generate/api/templates/story.js +23 -0
  10. package/bin/builders/generate/api/templates/unit-test.js +15 -0
  11. package/bin/builders/generate/component/index.js +87 -0
  12. package/bin/builders/generate/component/templates/Component.js +43 -0
  13. package/bin/builders/generate/component/templates/css.js +24 -0
  14. package/bin/builders/generate/component/templates/index.js +8 -0
  15. package/bin/builders/generate/component/templates/stories.js +46 -0
  16. package/bin/builders/generate/component/templates/unit-test.js +19 -0
  17. package/bin/builders/generate/config/index.js +54 -0
  18. package/bin/builders/generate/config/templates/elsie.js +29 -0
  19. package/bin/builders/generate/container/index.js +65 -0
  20. package/bin/builders/generate/container/templates/Component.js +18 -0
  21. package/bin/builders/generate/container/templates/index.js +8 -0
  22. package/bin/builders/generate/container/templates/stories.js +34 -0
  23. package/bin/builders/generate/container/templates/unit-test.js +19 -0
  24. package/bin/builders/generate/index.js +283 -0
  25. package/bin/builders/gql/createOrClearDirectory.js +33 -0
  26. package/bin/builders/gql/getSchemaRef.js +25 -0
  27. package/bin/builders/gql/index.js +71 -0
  28. package/bin/builders/lint/index.js +5 -0
  29. package/bin/builders/serve/index.js +44 -0
  30. package/bin/builders/storybook/index.js +5 -0
  31. package/bin/builders/test/index.js +5 -0
  32. package/bin/index.js +26 -0
  33. package/bin/lib/cli.js +8 -0
  34. package/bin/lib/config.js +12 -0
  35. package/bin/lib/log-message.js +11 -0
  36. package/bin/lib/string.js +26 -0
  37. package/bin/lib/validate-typeof.js +28 -0
  38. package/bin/lib/write-file.js +30 -0
  39. package/bin/lib/write-parent-index.js +45 -0
  40. package/config/eslint.js +113 -0
  41. package/config/jest.js +90 -0
  42. package/config/prettier.js +16 -0
  43. package/config/setEnvVars.js +14 -0
  44. package/config/storybook/addon.js +130 -0
  45. package/config/storybook/components/FileTree/FileTree.jsx +192 -0
  46. package/config/storybook/components/FileTree/index.js +10 -0
  47. package/config/storybook/components/Flex/Flex.jsx +21 -0
  48. package/config/storybook/components/Flex/Flex.module.css +29 -0
  49. package/config/storybook/components/Flex/index.js +10 -0
  50. package/config/storybook/components/OptionsTable/OptionsTable.jsx +88 -0
  51. package/config/storybook/components/OptionsTable/OptionsTable.module.css +104 -0
  52. package/config/storybook/components/OptionsTable/index.js +10 -0
  53. package/config/storybook/components/Panel/Panel.module.css +56 -0
  54. package/config/storybook/components/Panel/Panel.tsx +46 -0
  55. package/config/storybook/components/Panel/index.ts +10 -0
  56. package/config/storybook/components/Screenshot/Screenshot.jsx +23 -0
  57. package/config/storybook/components/Screenshot/Screenshot.module.css +28 -0
  58. package/config/storybook/components/Screenshot/index.js +10 -0
  59. package/config/storybook/components/Steps/Steps.jsx +21 -0
  60. package/config/storybook/components/Steps/Steps.module.css +43 -0
  61. package/config/storybook/components/Steps/index.js +10 -0
  62. package/config/storybook/components/StoryWrapper/StoryWrapper.jsx +18 -0
  63. package/config/storybook/components/StoryWrapper/StoryWrapper.module.css +22 -0
  64. package/config/storybook/components/StoryWrapper/index.js +10 -0
  65. package/config/storybook/components/Summary/Summary.jsx +19 -0
  66. package/config/storybook/components/Summary/Summary.module.css +20 -0
  67. package/config/storybook/components/Summary/index.js +10 -0
  68. package/config/storybook/components/Variants/Variants.js +57 -0
  69. package/config/storybook/components/Variants/docs.css +48 -0
  70. package/config/storybook/components/Variants/index.js +10 -0
  71. package/config/storybook/components/video/index.jsx +28 -0
  72. package/config/storybook/manager.js +23 -0
  73. package/config/storybook/preview.jsx +88 -0
  74. package/config/storybook/theming/fonts.css +68 -0
  75. package/config/storybook/theming/logo.svg +19 -0
  76. package/config/storybook/theming/manager.css +63 -0
  77. package/config/storybook/theming/preview.css +93 -0
  78. package/config/storybook/theming/theme.js +61 -0
  79. package/config/tsconfig-base.json +16 -0
  80. package/config/tsconfig-preact.json +15 -0
  81. package/config/vite.mjs +306 -0
  82. package/package.json +113 -0
  83. package/post-release.sh +5 -0
  84. package/src/components/Accordion/Accordion.css +88 -0
  85. package/src/components/Accordion/Accordion.stories.tsx +582 -0
  86. package/src/components/Accordion/Accordion.tsx +177 -0
  87. package/src/components/Accordion/index.ts +11 -0
  88. package/src/components/ActionButton/ActionButton.css +100 -0
  89. package/src/components/ActionButton/ActionButton.stories.tsx +169 -0
  90. package/src/components/ActionButton/ActionButton.tsx +53 -0
  91. package/src/components/ActionButton/index.ts +10 -0
  92. package/src/components/ActionButtonGroup/ActionButtonGroup.css +77 -0
  93. package/src/components/ActionButtonGroup/ActionButtonGroup.stories.tsx +97 -0
  94. package/src/components/ActionButtonGroup/ActionButtonGroup.tsx +91 -0
  95. package/src/components/ActionButtonGroup/index.ts +10 -0
  96. package/src/components/AlertBanner/AlertBanner.css +144 -0
  97. package/src/components/AlertBanner/AlertBanner.stories.tsx +165 -0
  98. package/src/components/AlertBanner/AlertBanner.tsx +90 -0
  99. package/src/components/AlertBanner/index.ts +11 -0
  100. package/src/components/Breadcrumbs/Breadcrumbs.css +60 -0
  101. package/src/components/Breadcrumbs/Breadcrumbs.stories.tsx +195 -0
  102. package/src/components/Breadcrumbs/Breadcrumbs.tsx +71 -0
  103. package/src/components/Breadcrumbs/index.ts +11 -0
  104. package/src/components/Button/Button.css +213 -0
  105. package/src/components/Button/Button.mdx +133 -0
  106. package/src/components/Button/Button.stories.tsx +398 -0
  107. package/src/components/Button/Button.tsx +121 -0
  108. package/src/components/Button/index.ts +11 -0
  109. package/src/components/Card/Card.css +34 -0
  110. package/src/components/Card/Card.stories.tsx +76 -0
  111. package/src/components/Card/Card.tsx +34 -0
  112. package/src/components/Card/index.ts +10 -0
  113. package/src/components/CartItem/CartItem.css +509 -0
  114. package/src/components/CartItem/CartItem.stories.tsx +628 -0
  115. package/src/components/CartItem/CartItem.tsx +467 -0
  116. package/src/components/CartItem/CartItemSkeleton.tsx +38 -0
  117. package/src/components/CartItem/index.ts +12 -0
  118. package/src/components/CartList/CartList.css +35 -0
  119. package/src/components/CartList/CartList.stories.tsx +111 -0
  120. package/src/components/CartList/CartList.tsx +40 -0
  121. package/src/components/CartList/index.ts +11 -0
  122. package/src/components/Checkbox/Checkbox.css +255 -0
  123. package/src/components/Checkbox/Checkbox.stories.tsx +290 -0
  124. package/src/components/Checkbox/Checkbox.tsx +138 -0
  125. package/src/components/Checkbox/index.ts +10 -0
  126. package/src/components/ColorSwatch/ColorSwatch.css +132 -0
  127. package/src/components/ColorSwatch/ColorSwatch.stories.tsx +274 -0
  128. package/src/components/ColorSwatch/ColorSwatch.tsx +127 -0
  129. package/src/components/ColorSwatch/index.ts +11 -0
  130. package/src/components/ContentGrid/ContentGrid.css +54 -0
  131. package/src/components/ContentGrid/ContentGrid.stories.tsx +137 -0
  132. package/src/components/ContentGrid/ContentGrid.tsx +57 -0
  133. package/src/components/ContentGrid/index.ts +11 -0
  134. package/src/components/Divider/Divider.css +22 -0
  135. package/src/components/Divider/Divider.stories.tsx +62 -0
  136. package/src/components/Divider/Divider.tsx +33 -0
  137. package/src/components/Divider/index.ts +11 -0
  138. package/src/components/Field/Field.css +83 -0
  139. package/src/components/Field/Field.stories.tsx +238 -0
  140. package/src/components/Field/Field.tsx +84 -0
  141. package/src/components/Field/index.ts +10 -0
  142. package/src/components/Header/Header.css +56 -0
  143. package/src/components/Header/Header.stories.tsx +180 -0
  144. package/src/components/Header/Header.tsx +81 -0
  145. package/src/components/Header/index.ts +11 -0
  146. package/src/components/Icon/Icon.css +26 -0
  147. package/src/components/Icon/Icon.stories.helpers.jsx +21 -0
  148. package/src/components/Icon/Icon.stories.tsx +98 -0
  149. package/src/components/Icon/Icon.tsx +112 -0
  150. package/src/components/Icon/index.ts +10 -0
  151. package/src/components/IllustratedMessage/IllustratedMessage.css +61 -0
  152. package/src/components/IllustratedMessage/IllustratedMessage.stories.tsx +126 -0
  153. package/src/components/IllustratedMessage/IllustratedMessage.tsx +78 -0
  154. package/src/components/IllustratedMessage/index.ts +11 -0
  155. package/src/components/Image/Image.css +52 -0
  156. package/src/components/Image/Image.stories.tsx +89 -0
  157. package/src/components/Image/Image.tsx +66 -0
  158. package/src/components/Image/index.ts +10 -0
  159. package/src/components/ImageSwatch/ImageSwatch.css +154 -0
  160. package/src/components/ImageSwatch/ImageSwatch.stories.tsx +310 -0
  161. package/src/components/ImageSwatch/ImageSwatch.tsx +123 -0
  162. package/src/components/ImageSwatch/index.ts +11 -0
  163. package/src/components/InLineAlert/InLineAlert.css +116 -0
  164. package/src/components/InLineAlert/InLineAlert.stories.tsx +326 -0
  165. package/src/components/InLineAlert/InLineAlert.tsx +128 -0
  166. package/src/components/InLineAlert/index.ts +11 -0
  167. package/src/components/Incrementer/Incrementer.css +165 -0
  168. package/src/components/Incrementer/Incrementer.stories.tsx +172 -0
  169. package/src/components/Incrementer/Incrementer.tsx +192 -0
  170. package/src/components/Incrementer/index.ts +10 -0
  171. package/src/components/Input/Input.css +304 -0
  172. package/src/components/Input/Input.stories.tsx +155 -0
  173. package/src/components/Input/Input.tsx +166 -0
  174. package/src/components/Input/index.ts +11 -0
  175. package/src/components/InputDate/InputDate.css +56 -0
  176. package/src/components/InputDate/InputDate.stories.tsx +117 -0
  177. package/src/components/InputDate/InputDate.tsx +120 -0
  178. package/src/components/InputDate/index.ts +11 -0
  179. package/src/components/InputPassword/InputPassword.css +31 -0
  180. package/src/components/InputPassword/InputPassword.stories.tsx +148 -0
  181. package/src/components/InputPassword/InputPassword.tsx +135 -0
  182. package/src/components/InputPassword/PasswordStatusIndicator/PasswordStatusIndicator.css +31 -0
  183. package/src/components/InputPassword/PasswordStatusIndicator/PasswordStatusIndicator.tsx +96 -0
  184. package/src/components/InputPassword/PasswordStatusIndicator/index.ts +11 -0
  185. package/src/components/InputPassword/index.ts +11 -0
  186. package/src/components/Modal/Modal.css +125 -0
  187. package/src/components/Modal/Modal.stories.tsx +250 -0
  188. package/src/components/Modal/Modal.tsx +157 -0
  189. package/src/components/Modal/index.ts +10 -0
  190. package/src/components/Pagination/Pagination.css +95 -0
  191. package/src/components/Pagination/Pagination.stories.tsx +117 -0
  192. package/src/components/Pagination/Pagination.tsx +149 -0
  193. package/src/components/Pagination/index.ts +11 -0
  194. package/src/components/Picker/Picker.css +220 -0
  195. package/src/components/Picker/Picker.stories.tsx +318 -0
  196. package/src/components/Picker/Picker.tsx +203 -0
  197. package/src/components/Picker/index.ts +10 -0
  198. package/src/components/Price/Price.css +57 -0
  199. package/src/components/Price/Price.stories.tsx +110 -0
  200. package/src/components/Price/Price.tsx +75 -0
  201. package/src/components/Price/index.ts +10 -0
  202. package/src/components/PriceRange/PriceRange.css +66 -0
  203. package/src/components/PriceRange/PriceRange.stories.tsx +240 -0
  204. package/src/components/PriceRange/PriceRange.tsx +248 -0
  205. package/src/components/PriceRange/index.ts +11 -0
  206. package/src/components/ProgressSpinner/ProgressSpinner.css +91 -0
  207. package/src/components/ProgressSpinner/ProgressSpinner.stories.tsx +300 -0
  208. package/src/components/ProgressSpinner/ProgressSpinner.tsx +86 -0
  209. package/src/components/ProgressSpinner/index.ts +11 -0
  210. package/src/components/RadioButton/RadioButton.css +134 -0
  211. package/src/components/RadioButton/RadioButton.stories.tsx +126 -0
  212. package/src/components/RadioButton/RadioButton.tsx +86 -0
  213. package/src/components/RadioButton/index.ts +11 -0
  214. package/src/components/Skeleton/Skeleton.css +145 -0
  215. package/src/components/Skeleton/Skeleton.stories.tsx +265 -0
  216. package/src/components/Skeleton/Skeleton.tsx +133 -0
  217. package/src/components/Skeleton/index.ts +10 -0
  218. package/src/components/Tag/Tag.css +26 -0
  219. package/src/components/Tag/Tag.stories.tsx +103 -0
  220. package/src/components/Tag/Tag.tsx +38 -0
  221. package/src/components/Tag/index.ts +11 -0
  222. package/src/components/TextArea/TextArea.css +140 -0
  223. package/src/components/TextArea/TextArea.stories.tsx +130 -0
  224. package/src/components/TextArea/TextArea.tsx +89 -0
  225. package/src/components/TextArea/index.ts +11 -0
  226. package/src/components/TextSwatch/TextSwatch.css +152 -0
  227. package/src/components/TextSwatch/TextSwatch.stories.tsx +277 -0
  228. package/src/components/TextSwatch/TextSwatch.tsx +131 -0
  229. package/src/components/TextSwatch/index.ts +11 -0
  230. package/src/components/ToggleButton/ToggleButton.css +95 -0
  231. package/src/components/ToggleButton/ToggleButton.stories.tsx +190 -0
  232. package/src/components/ToggleButton/ToggleButton.tsx +75 -0
  233. package/src/components/ToggleButton/index.ts +11 -0
  234. package/src/components/UIProvider/UIProvider.css +140 -0
  235. package/src/components/UIProvider/UIProvider.tsx +61 -0
  236. package/src/components/UIProvider/debugger.css +47 -0
  237. package/src/components/UIProvider/index.ts +10 -0
  238. package/src/components/UIProvider/normalize.css +26 -0
  239. package/src/components/index.ts +49 -0
  240. package/src/docs/API/event-bus.mdx +52 -0
  241. package/src/docs/API/graphql.mdx +214 -0
  242. package/src/docs/API/initializer.mdx +119 -0
  243. package/src/docs/API/render.mdx +125 -0
  244. package/src/docs/Design/colors.mdx +202 -0
  245. package/src/docs/Design/designBlocks.jsx +87 -0
  246. package/src/docs/Design/getTokenData.ts +28 -0
  247. package/src/docs/Design/grid.mdx +365 -0
  248. package/src/docs/Design/overview.mdx +69 -0
  249. package/src/docs/Design/shapes.mdx +100 -0
  250. package/src/docs/Design/spacing.mdx +22 -0
  251. package/src/docs/Design/typography.mdx +126 -0
  252. package/src/docs/Utilities/classList.mdx +52 -0
  253. package/src/docs/Utilities/debounce.mdx +49 -0
  254. package/src/docs/Utilities/deepmerge.mdx +12 -0
  255. package/src/docs/Utilities/getFormErrors.mdx +41 -0
  256. package/src/docs/Utilities/getFormValues.mdx +38 -0
  257. package/src/docs/assets/Banner.png +0 -0
  258. package/src/docs/assets/Colors.png +0 -0
  259. package/src/docs/assets/DropinBanner.png +0 -0
  260. package/src/docs/assets/ShapeStyles.png +0 -0
  261. package/src/docs/assets/Spacing.png +0 -0
  262. package/src/docs/assets/Typography.png +0 -0
  263. package/src/docs/cli-usage.mdx +181 -0
  264. package/src/docs/components/overview.mdx +124 -0
  265. package/src/docs/quick-start.mdx +245 -0
  266. package/src/docs/slots.mdx +211 -0
  267. package/src/docs/welcome.mdx +52 -0
  268. package/src/i18n/en_US.json +146 -0
  269. package/src/i18n/index.ts +26 -0
  270. package/src/icons/Add.svg +9 -0
  271. package/src/icons/AddressBook.svg +3 -0
  272. package/src/icons/Bulk.svg +24 -0
  273. package/src/icons/Burger.svg +5 -0
  274. package/src/icons/Card.svg +7 -0
  275. package/src/icons/Cart.svg +11 -0
  276. package/src/icons/Check.svg +8 -0
  277. package/src/icons/CheckWithCircle.svg +4 -0
  278. package/src/icons/ChevronDown.svg +3 -0
  279. package/src/icons/ChevronRight.svg +8 -0
  280. package/src/icons/ChevronUp.svg +3 -0
  281. package/src/icons/Close.svg +4 -0
  282. package/src/icons/Coupon.svg +3 -0
  283. package/src/icons/Date.svg +4 -0
  284. package/src/icons/Delivery.svg +11 -0
  285. package/src/icons/EmptyBox.svg +3 -0
  286. package/src/icons/Eye.svg +3 -0
  287. package/src/icons/EyeClose.svg +3 -0
  288. package/src/icons/Gift.svg +3 -0
  289. package/src/icons/GiftCard.svg +3 -0
  290. package/src/icons/Heart.svg +3 -0
  291. package/src/icons/HeartFilled.svg +3 -0
  292. package/src/icons/InfoFilled.svg +3 -0
  293. package/src/icons/Locker.svg +11 -0
  294. package/src/icons/Minus.svg +3 -0
  295. package/src/icons/Order.svg +6 -0
  296. package/src/icons/OrderError.svg +15 -0
  297. package/src/icons/OrderSuccess.svg +15 -0
  298. package/src/icons/PaymentError.svg +16 -0
  299. package/src/icons/Placeholder.svg +3 -0
  300. package/src/icons/PlaceholderFilled.svg +4 -0
  301. package/src/icons/Search.svg +9 -0
  302. package/src/icons/SearchFilled.svg +10 -0
  303. package/src/icons/Sort.svg +12 -0
  304. package/src/icons/Star.svg +8 -0
  305. package/src/icons/Trash.svg +7 -0
  306. package/src/icons/User.svg +5 -0
  307. package/src/icons/View.svg +14 -0
  308. package/src/icons/Wallet.svg +6 -0
  309. package/src/icons/Warning.svg +12 -0
  310. package/src/icons/WarningFilled.svg +3 -0
  311. package/src/icons/WarningWithCircle.svg +4 -0
  312. package/src/icons/index.ts +42 -0
  313. package/src/lib/classes.ts +34 -0
  314. package/src/lib/config.ts +24 -0
  315. package/src/lib/debounce.ts +16 -0
  316. package/src/lib/deepmerge.ts +45 -0
  317. package/src/lib/deviceUtils.ts +16 -0
  318. package/src/lib/form-values.ts +31 -0
  319. package/src/lib/i18n.ts +18 -0
  320. package/src/lib/image-params-keymap.ts +36 -0
  321. package/src/lib/index.ts +24 -0
  322. package/src/lib/initializer.ts +134 -0
  323. package/src/lib/is-number.ts +12 -0
  324. package/src/lib/render.tsx +138 -0
  325. package/src/lib/resolve-image.ts +101 -0
  326. package/src/lib/signals.ts +11 -0
  327. package/src/lib/slot.tsx +434 -0
  328. package/src/lib/tests.tsx +47 -0
  329. package/src/lib/types.ts +16 -0
  330. package/src/lib/vcomponent.tsx +42 -0
  331. package/static/assets/images/Card.png +0 -0
  332. package/static/assets/images/example.jpg +0 -0
  333. package/static/assets/images/index.ts +11 -0
  334. package/static/dropin.png +0 -0
  335. package/static/favicon.svg +14 -0
  336. package/storybook-stories.js +21 -0
  337. package/tests/__mocks__/browserMocks.ts +28 -0
  338. package/tests/__mocks__/fileMocks.ts +12 -0
  339. package/tests/__mocks__/styleMock.ts +0 -0
  340. package/types/icons.d.ts +18 -0
package/.elsie.js ADDED
@@ -0,0 +1,21 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+
10
+ module.exports = {
11
+ name: 'Base',
12
+ components: [
13
+ {
14
+ id: 'Components',
15
+ root: './src/components',
16
+ importAliasRoot: '@adobe-commerce/elsie/components',
17
+ cssPrefix: 'dropin',
18
+ default: true,
19
+ },
20
+ ],
21
+ };
package/.eslintrc.js ADDED
@@ -0,0 +1,18 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+
10
+ const baseConfig = require('./config/eslint');
11
+
12
+ module.exports = {
13
+ ...baseConfig,
14
+ rules: {
15
+ ...baseConfig.rules,
16
+ 'no-restricted-imports': 'off'
17
+ }
18
+ };
package/README.md ADDED
@@ -0,0 +1,52 @@
1
+ # Elsie
2
+
3
+ ## CLI Commands
4
+
5
+ ### Run Storybook and serve with hot reload
6
+
7
+ ```bash
8
+ yarn dev
9
+ ```
10
+
11
+ ### Run tests with Jest
12
+
13
+ ```bash
14
+ yarn test
15
+ ```
16
+
17
+ ### Link CLI (development mode)
18
+
19
+ ```bash
20
+ yarn link --global
21
+ ```
22
+
23
+ ```bash
24
+ elsie --help
25
+ ```
26
+
27
+ ### Generate a new UI Component
28
+
29
+ ```bash
30
+ elsie generate component -n <ComponentName>
31
+ ```
32
+
33
+ ### Generate a new UI Patterns
34
+
35
+ ```bash
36
+ elsie generate component -n <ComponentName> -g Patterns
37
+ ```
38
+
39
+ # Dependencies
40
+
41
+ These build dependencies are needed to develop your Storefront SDK project. Note: you may opt not to use it if you want to keep control of dependencies on your own.
42
+
43
+ ## Dependencies Included:
44
+
45
+ - **Storybook** and addons
46
+ - **Vite** and plugins
47
+ - **TypeScript** and type definitions
48
+ - **Jest** and presets
49
+ - **rimraf**
50
+ - **dotenv**
51
+
52
+ For a detail manifest of dependencies see [/packages/elsie/package.json]
@@ -0,0 +1,11 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+
10
+ const SVGComponent = 'svg';
11
+ export default SVGComponent;
@@ -0,0 +1,20 @@
1
+ const path = require('path');
2
+
3
+ module.exports = async function generateResourceBuilder({ argv }) {
4
+ const { build } = await import('vite');
5
+
6
+ const configFile =
7
+ argv?.config ?? path.resolve(__dirname, '../../../config/vite.mjs');
8
+
9
+ const outDir = argv?.outDir ?? 'dist';
10
+
11
+ const isProd = process.env.NODE_ENV !== 'development';
12
+
13
+ await build({
14
+ mode: isProd ? 'production' : 'development',
15
+ build: { emptyOutDir: true, outDir },
16
+ clearScreen: true,
17
+ configFile,
18
+ });
19
+ process.exit(0);
20
+ };
@@ -0,0 +1,65 @@
1
+ const path = require('path');
2
+ const fs = require('fs');
3
+ const writeFile = require('../../../lib/write-file');
4
+ const writeParentIndex = require('../../../lib/write-parent-index');
5
+ const config = require('../../../lib/config');
6
+ const m = require('../../../lib/log-message');
7
+
8
+ // Templates
9
+ const templateFunction = require('./templates/function');
10
+ const templateStory = require('./templates/story');
11
+ const templateTest = require('./templates/unit-test');
12
+ const templateIndex = require('./templates/index');
13
+
14
+ module.exports = async function newApiBuilder({ pathname, force }) {
15
+ try {
16
+ const { name, api } = config();
17
+
18
+ const { root, importAliasRoot } = api;
19
+
20
+ const basename = path.basename(pathname);
21
+
22
+ const importPath = importAliasRoot && `${importAliasRoot}/${basename}`;
23
+
24
+ const dir = path.resolve(process.cwd(), root, pathname.replace(/^\//, ''));
25
+
26
+ // Create new directory
27
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
28
+
29
+ // Write Storybook Story file
30
+ await writeFile(
31
+ path.resolve(dir, `${basename}.mdx`),
32
+ templateStory({ name, basename, pathname, importPath }),
33
+ force
34
+ );
35
+
36
+ // Write Jest Test file
37
+ await writeFile(
38
+ path.resolve(dir, `${basename}.test.ts`),
39
+ templateTest({ name, basename, pathname, importPath }),
40
+ force
41
+ );
42
+
43
+ // Write Function file
44
+ await writeFile(
45
+ path.resolve(dir, `${basename}.ts`),
46
+ templateFunction({ basename, importPath }),
47
+ force
48
+ );
49
+
50
+ // Write Index file
51
+ await writeFile(
52
+ path.resolve(dir, 'index.ts'),
53
+ templateIndex({ importPath, basename }),
54
+ force
55
+ );
56
+
57
+ // Update parent index.ts
58
+ writeParentIndex(path.resolve(dir, '../index.ts'), {
59
+ pathname,
60
+ importAliasRoot,
61
+ });
62
+ } catch (error) {
63
+ console.error(m(error, 'error'));
64
+ }
65
+ };
@@ -0,0 +1,9 @@
1
+ const { stripIndent } = require('common-tags');
2
+
3
+ module.exports = ({ basename }) => {
4
+ return `${stripIndent`
5
+ export const ${basename} = () => {
6
+ return 'Howdy!';
7
+ }
8
+ `}\n`;
9
+ };
@@ -0,0 +1,7 @@
1
+ const { source } = require('common-tags');
2
+
3
+ module.exports = ({ basename, importPath = '.' }) => {
4
+ return `${source`
5
+ export * from '${importPath}/${basename}';
6
+ `}\n`;
7
+ };
@@ -0,0 +1,23 @@
1
+ const { source } = require('common-tags');
2
+
3
+ module.exports = ({ pathname, basename, importPath = '.' }) => {
4
+ return `${source`
5
+ import { Meta } from '@storybook/blocks';
6
+
7
+ <Meta title="API/${pathname}" />
8
+
9
+ # ${basename}
10
+
11
+ A function that returns "Howdy World!".
12
+
13
+ \`\`\`ts
14
+ import { ${basename} } from '${importPath}';
15
+ \`\`\`
16
+
17
+ ## Usage
18
+
19
+ \`\`\`ts
20
+ ${basename}();
21
+ \`\`\`
22
+ `}\n`;
23
+ };
@@ -0,0 +1,15 @@
1
+ const { source } = require('common-tags');
2
+
3
+ module.exports = ({ name, basename, pathname, importPath = '.' }) => {
4
+ return `${source`
5
+ import { ${basename} } from '${importPath}';
6
+
7
+ describe('${name}/api/${pathname}', () => {
8
+ test('returns value', () => {
9
+ const value = ${basename}();
10
+
11
+ expect(value).toEqual('Howdy!');
12
+ });
13
+ });
14
+ `}\n`;
15
+ };
@@ -0,0 +1,87 @@
1
+ const path = require('path');
2
+ const fs = require('fs');
3
+ const writeFile = require('../../../lib/write-file');
4
+ const writeParentIndex = require('../../../lib/write-parent-index');
5
+ const config = require('../../../lib/config')();
6
+ const m = require('../../../lib/log-message');
7
+
8
+ // Templates
9
+ const templateComponent = require('./templates/Component');
10
+ const templateStyles = require('./templates/css');
11
+ const templateStory = require('./templates/stories');
12
+ const templateTest = require('./templates/unit-test');
13
+ const templateIndex = require('./templates/index');
14
+
15
+ module.exports = async function newComponentBuilder({
16
+ pathname,
17
+ group,
18
+ force,
19
+ }) {
20
+ try {
21
+ const componentGroup = config.components.find((x) => x.id === group);
22
+
23
+ if (!componentGroup) return null;
24
+
25
+ const name = config.name;
26
+
27
+ const { root, importAliasRoot, skipCSS } = componentGroup;
28
+
29
+ const cssPrefix = componentGroup.cssPrefix
30
+ ? `${componentGroup.cssPrefix}-`
31
+ : '';
32
+
33
+ const basename = path.basename(pathname);
34
+
35
+ const importPath = importAliasRoot && `${importAliasRoot}/${basename}`;
36
+
37
+ const dir = path.resolve(process.cwd(), root, pathname.replace(/^\//, ''));
38
+
39
+ // Create new directory
40
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
41
+
42
+ if (!skipCSS) {
43
+ // Write CSS
44
+ await writeFile(
45
+ path.resolve(dir, `${basename}.css`),
46
+ templateStyles({ basename, cssPrefix }),
47
+ force
48
+ );
49
+ }
50
+
51
+ // Write Storybook Stories file
52
+ await writeFile(
53
+ path.resolve(dir, `${basename}.stories.tsx`),
54
+ templateStory({ name, basename, pathname, group, importPath }),
55
+ force
56
+ );
57
+
58
+ // Write Jest Test file
59
+ await writeFile(
60
+ path.resolve(dir, `${basename}.test.tsx`),
61
+ templateTest({ name, basename, pathname, group, importPath, cssPrefix }),
62
+ force
63
+ );
64
+
65
+ // Write Component file
66
+ await writeFile(
67
+ path.resolve(dir, `${basename}.tsx`),
68
+ templateComponent({ basename, importPath, skipCSS, cssPrefix }),
69
+ force
70
+ );
71
+
72
+ // Write Index file
73
+ await writeFile(
74
+ path.resolve(dir, 'index.ts'),
75
+ templateIndex({ basename, importPath }),
76
+ force
77
+ );
78
+
79
+ // Update parent index.ts
80
+ writeParentIndex(path.resolve(dir, '../index.ts'), {
81
+ pathname,
82
+ importAliasRoot,
83
+ });
84
+ } catch (error) {
85
+ console.error(m(error, 'error'));
86
+ }
87
+ };
@@ -0,0 +1,43 @@
1
+ const { stripIndent } = require('common-tags');
2
+ const { hyphenatedName } = require('../../../../lib/string');
3
+
4
+ module.exports = ({ basename, importPath = '.', skipCSS, cssPrefix }) => {
5
+ const _name = hyphenatedName(basename);
6
+
7
+ if (skipCSS)
8
+ return `${stripIndent`
9
+ import { FunctionComponent } from 'preact';
10
+ import { HTMLAttributes } from 'preact/compat';
11
+
12
+ export interface ${basename}Props extends HTMLAttributes<HTMLDivElement> {}
13
+
14
+ export const ${basename}: FunctionComponent<${basename}Props> = ({ children, ...props }) => {
15
+ return (
16
+ <div {...props}>
17
+ {children}
18
+ </div>
19
+ );
20
+ };
21
+ `}\n`;
22
+
23
+ return `${stripIndent`
24
+ import { FunctionComponent } from 'preact';
25
+ import { HTMLAttributes } from 'preact/compat';
26
+ import { classes } from '@adobe-commerce/elsie/lib';
27
+ import '${importPath}/${basename}.css';
28
+
29
+ export interface ${basename}Props extends HTMLAttributes<HTMLDivElement> {}
30
+
31
+ export const ${basename}: FunctionComponent<${basename}Props> = ({
32
+ className,
33
+ children,
34
+ ...props
35
+ }) => {
36
+ return (
37
+ <div {...props} className={classes(['${cssPrefix}${_name}', className])}>
38
+ {children}
39
+ </div>
40
+ );
41
+ };
42
+ `}\n`;
43
+ };
@@ -0,0 +1,24 @@
1
+ const { source } = require('common-tags');
2
+ const { hyphenatedName } = require('../../../../lib/string');
3
+
4
+ module.exports = ({ basename, cssPrefix }) => {
5
+ const _name = hyphenatedName(basename);
6
+
7
+ return `${source`
8
+ /* https://cssguidelin.es/#bem-like-naming */
9
+
10
+ /* .${cssPrefix}${_name} { } */
11
+
12
+ /* Medium (portrait tablets and large phones, 768px and up) */
13
+ /* @media only screen and (min-width: 768px) { } */
14
+
15
+ /* Large (landscape tablets, 1024px and up) */
16
+ /* @media only screen and (min-width: 1024px) { } */
17
+
18
+ /* XLarge (laptops/desktops, 1366px and up) */
19
+ /* @media only screen and (min-width: 1366px) { } */
20
+
21
+ /* XXlarge (large laptops and desktops, 1920px and up) */
22
+ /* @media only screen and (min-width: 1920px) { } */
23
+ `}\n`;
24
+ };
@@ -0,0 +1,8 @@
1
+ const { source } = require('common-tags');
2
+
3
+ module.exports = ({ basename, importPath = '.' }) => {
4
+ return `${source`
5
+ export * from '${importPath}/${basename}';
6
+ export { ${basename} as default } from '${importPath}/${basename}';
7
+ `}\n`;
8
+ };
@@ -0,0 +1,46 @@
1
+ const { source } = require('common-tags');
2
+
3
+ module.exports = ({ name, pathname, basename, group, importPath = '.' }) => {
4
+ return `${source`
5
+ // https://storybook.js.org/docs/7.0/preact/writing-stories/introduction
6
+ import type { Meta, StoryObj } from '@storybook/preact';
7
+ import { ${basename} as component, ${basename}Props } from '${importPath}';
8
+
9
+ /**
10
+ * Use ${basename}s to [replace this text with components purpose].
11
+ */
12
+ const meta: Meta<${basename}Props> = {
13
+ title: '${`${group}/`}${pathname}',
14
+ component,
15
+ argTypes: {
16
+ children: {
17
+ description: 'Add text to the ${basename}.',
18
+ table: {
19
+ type: { summary: 'string' },
20
+ defaultValue: { summary: '${basename} defaultValue for children.' },
21
+ },
22
+ },
23
+ onClick: {
24
+ description: 'Add a click handler.',
25
+ table: {
26
+ type: { summary: 'function' },
27
+ },
28
+ action: 'onClick',
29
+ },
30
+ },
31
+ };
32
+
33
+ export default meta;
34
+
35
+ type Story = StoryObj<${basename}Props>;
36
+
37
+ /**
38
+ * <${basename}>👋 Hello from your new ${basename} story!</${basename}>
39
+ */
40
+ export const ${basename}: Story = {
41
+ args: {
42
+ children: "👋 Hello from your new ${basename} story!",
43
+ },
44
+ };
45
+ `}\n`;
46
+ };
@@ -0,0 +1,19 @@
1
+ const { source } = require('common-tags');
2
+
3
+ module.exports = ({ name, basename, pathname, group, importPath = '.' }) => {
4
+ return `${source`
5
+ /** https://preactjs.com/guide/v10/preact-testing-library/ */
6
+
7
+ import { render } from '@adobe-commerce/elsie/lib/tests';
8
+
9
+ import { ${basename} } from '${importPath}';
10
+
11
+ describe('${name}/${group}/${pathname}', () => {
12
+ test('renders', () => {
13
+ const { container } = render(<${basename} />);
14
+
15
+ expect(!!container).toEqual(true);
16
+ });
17
+ });
18
+ `}\n`;
19
+ };
@@ -0,0 +1,54 @@
1
+ const path = require('path');
2
+ const fs = require('fs/promises');
3
+ const m = require('../../../lib/log-message');
4
+ const writeFile = require('../../../lib/write-file');
5
+
6
+ const configTemplate = require('./templates/elsie');
7
+
8
+ module.exports = async function newConfigBuilder({ name, force }) {
9
+ const filename = path.resolve(process.cwd(), './.elsie.js');
10
+
11
+ const importPath = `@/${name.toLowerCase()}`;
12
+
13
+ const content = configTemplate({ name, importPath });
14
+
15
+ const value = `${importPath}/*`;
16
+
17
+ const fileWritten = await writeFile(filename, content, force);
18
+
19
+ if (!fileWritten) return;
20
+
21
+ // Update tsconfig.json alias
22
+ try {
23
+ const tsconfigPath = path.resolve(process.cwd(), './tsconfig.json');
24
+
25
+ const file = await fs.open(tsconfigPath, 'r+');
26
+
27
+ const fileBuffer = await fs.readFile(file, 'utf-8');
28
+ const tsconfig = JSON.parse(fileBuffer);
29
+
30
+ if (tsconfig.compilerOptions?.paths[value]) {
31
+ console.log(m(`\x1b[33m$tsconfig.json \x1b[0mis up to date`, 'success'));
32
+ return;
33
+ }
34
+
35
+ const newTsConfig = {
36
+ ...tsconfig,
37
+ compilerOptions: {
38
+ ...tsconfig.compilerOptions,
39
+ paths: { ...tsconfig.compilerOptions?.paths, [value]: ['./src/*'] },
40
+ },
41
+ };
42
+
43
+ await fs.writeFile(tsconfigPath, JSON.stringify(newTsConfig, null, 2));
44
+
45
+ console.log(m(`\x1b[33mtsconfig.json \x1b[0mupdated`, 'updated'));
46
+ } catch {
47
+ console.log(
48
+ m(
49
+ `Update your \x1b[33mtsconfig.json\x1b[0m to include path \x1b[33m"paths": { "${value}": ["./src/*'] }\x1b[0m`,
50
+ 'warning'
51
+ )
52
+ );
53
+ }
54
+ };
@@ -0,0 +1,29 @@
1
+ const { source } = require('common-tags');
2
+
3
+ module.exports = ({ name, importPath }) =>
4
+ `${source`
5
+ module.exports = {
6
+ name: '${name}',
7
+ api: {
8
+ root: './src/api',
9
+ importAliasRoot: '${importPath}/api',
10
+ },
11
+ components: [
12
+ {
13
+ id: 'Components',
14
+ root: './src/components',
15
+ importAliasRoot: '${importPath}/components',
16
+ cssPrefix: '${name.toLowerCase()}',
17
+ default: true,
18
+ },
19
+ ],
20
+ containers: {
21
+ root: './src/containers',
22
+ importAliasRoot: '${importPath}/containers',
23
+ },
24
+ schema: {
25
+ endpoint: process.env.ENDPOINT,
26
+ headers: {}
27
+ }
28
+ };
29
+ `}\n`;
@@ -0,0 +1,65 @@
1
+ const path = require('path');
2
+ const fs = require('fs');
3
+ const writeFile = require('../../../lib/write-file');
4
+ const writeParentIndex = require('../../../lib/write-parent-index');
5
+ const config = require('../../../lib/config')();
6
+ const m = require('../../../lib/log-message');
7
+
8
+ // Templates
9
+ const templateComponent = require('./templates/Component');
10
+ const templateStory = require('./templates/stories');
11
+ const templateTest = require('./templates/unit-test');
12
+ const templateIndex = require('./templates/index');
13
+
14
+ module.exports = async function newContainerBuilder({ pathname, force }) {
15
+ try {
16
+ const name = config.name;
17
+
18
+ const { root, importAliasRoot } = config.containers;
19
+
20
+ const basename = path.basename(pathname);
21
+
22
+ const importPath = importAliasRoot && `${importAliasRoot}/${basename}`;
23
+
24
+ const dir = path.resolve(process.cwd(), root, pathname.replace(/^\//, ''));
25
+
26
+ // Create new directory
27
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
28
+
29
+ // Write Storybook Stories file
30
+ await writeFile(
31
+ path.resolve(dir, `${basename}.stories.tsx`),
32
+ templateStory({ basename, pathname, importPath }),
33
+ force
34
+ );
35
+
36
+ // Write Jest Test file
37
+ await writeFile(
38
+ path.resolve(dir, `${basename}.test.tsx`),
39
+ templateTest({ name, basename, pathname, importPath }),
40
+ force
41
+ );
42
+
43
+ // Write Container file
44
+ await writeFile(
45
+ path.resolve(dir, `${basename}.tsx`),
46
+ templateComponent({ basename, importPath }),
47
+ force
48
+ );
49
+
50
+ // Write Index file
51
+ await writeFile(
52
+ path.resolve(dir, 'index.ts'),
53
+ templateIndex({ basename, importPath }),
54
+ force
55
+ );
56
+
57
+ // Update parent index.ts
58
+ writeParentIndex(path.resolve(dir, '../index.ts'), {
59
+ pathname,
60
+ importAliasRoot,
61
+ });
62
+ } catch (error) {
63
+ console.error(m(error, 'error'));
64
+ }
65
+ };
@@ -0,0 +1,18 @@
1
+ const { stripIndent } = require('common-tags');
2
+
3
+ module.exports = ({ basename }) => {
4
+ return `${stripIndent`
5
+ import { HTMLAttributes } from 'preact/compat';
6
+ import { Container } from '@adobe-commerce/elsie/lib';
7
+
8
+ export interface ${basename}Props extends HTMLAttributes<HTMLDivElement> {}
9
+
10
+ export const ${basename}: Container<${basename}Props> = ({ children, ...props }) => {
11
+ return (
12
+ <div {...props}>
13
+ {children}
14
+ </div>
15
+ );
16
+ };
17
+ `}\n`;
18
+ };
@@ -0,0 +1,8 @@
1
+ const { source } = require('common-tags');
2
+
3
+ module.exports = ({ basename, importPath = '.' }) => {
4
+ return `${source`
5
+ export * from '${importPath}/${basename}';
6
+ export { ${basename} as default } from '${importPath}/${basename}';
7
+ `}\n`;
8
+ };