southpaw 0.2.7

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 (169) hide show
  1. package/README.md +51 -0
  2. package/api/client.ts +83 -0
  3. package/api/helpers/fs.ts +98 -0
  4. package/api/helpers/stream.ts +6 -0
  5. package/api/index.ts +50 -0
  6. package/api/server.ts +566 -0
  7. package/constants/fonts.ts +1583 -0
  8. package/constants/icons.ts +2124 -0
  9. package/constants/langs.ts +2592 -0
  10. package/constants/ssr-loading.tsx +17 -0
  11. package/contexts/dev.tsx +124 -0
  12. package/hooks/useDebounceCb.ts +21 -0
  13. package/modules/app.tsx +102 -0
  14. package/modules/behaviors.ts +161 -0
  15. package/modules/component.tsx +483 -0
  16. package/modules/config/index.ts +8 -0
  17. package/modules/database.ts +25 -0
  18. package/modules/document.tsx +23 -0
  19. package/modules/error.tsx +16 -0
  20. package/modules/page/autozoom.tsx +92 -0
  21. package/modules/page/browser.tsx +166 -0
  22. package/modules/page/index.tsx +327 -0
  23. package/modules/page/insert-modal.tsx +225 -0
  24. package/modules/page/inspect/index.tsx +237 -0
  25. package/modules/page/inspect/wrapper.tsx +88 -0
  26. package/modules/page/knobs/action.tsx +58 -0
  27. package/modules/page/knobs/color.tsx +78 -0
  28. package/modules/page/knobs/helpers.ts +71 -0
  29. package/modules/page/knobs/icon.tsx +85 -0
  30. package/modules/page/knobs/linker.tsx +188 -0
  31. package/modules/page/knobs/list-json.tsx +149 -0
  32. package/modules/page/knobs/list-text.tsx +129 -0
  33. package/modules/page/knobs/number.tsx +84 -0
  34. package/modules/page/knobs/segmented.tsx +81 -0
  35. package/modules/page/knobs/select.tsx +89 -0
  36. package/modules/page/knobs/size.tsx +106 -0
  37. package/modules/page/knobs/switch.tsx +75 -0
  38. package/modules/page/knobs/text.tsx +93 -0
  39. package/modules/page/left-tabs.tsx +36 -0
  40. package/modules/page/right-tabs.tsx +31 -0
  41. package/modules/page/seo.tsx +69 -0
  42. package/modules/page/tree.tsx +860 -0
  43. package/modules/state.ts +787 -0
  44. package/modules/store.ts +37 -0
  45. package/modules/theme.ts +105 -0
  46. package/modules/translations.ts +15 -0
  47. package/package.json +68 -0
  48. package/scripts/bin.js +607 -0
  49. package/scripts/test.js +145 -0
  50. package/themes/base.tsx +8962 -0
  51. package/themes/index.ts +4 -0
  52. package/themes/m2.ts +39 -0
  53. package/themes/newspaper.ts +39 -0
  54. package/types/api.ts +57 -0
  55. package/types/fiber_node.ts +69 -0
  56. package/types/react_element.ts +14 -0
  57. package/ui/accordion.tsx +70 -0
  58. package/ui/actionicon.tsx +41 -0
  59. package/ui/affix.tsx +14 -0
  60. package/ui/alert.tsx +37 -0
  61. package/ui/anchor.tsx +52 -0
  62. package/ui/arrow.tsx +116 -0
  63. package/ui/aspectratio.tsx +21 -0
  64. package/ui/autocomplete.tsx +34 -0
  65. package/ui/avatar.tsx +36 -0
  66. package/ui/backgroundimage.tsx +16 -0
  67. package/ui/badge.tsx +28 -0
  68. package/ui/blockquote.tsx +15 -0
  69. package/ui/blocks/faq.tsx +145 -0
  70. package/ui/blocks/features.tsx +167 -0
  71. package/ui/blocks/footer.tsx +182 -0
  72. package/ui/blocks/herobanner.tsx +391 -0
  73. package/ui/blocks/index.ts +44 -0
  74. package/ui/blocks/leftnav.tsx +141 -0
  75. package/ui/blocks/pricing.tsx +210 -0
  76. package/ui/blocks/testimonials.tsx +149 -0
  77. package/ui/blocks/uidocs.tsx +1429 -0
  78. package/ui/box.tsx +27 -0
  79. package/ui/breadcrumbs.tsx +33 -0
  80. package/ui/burger.tsx +23 -0
  81. package/ui/button.tsx +85 -0
  82. package/ui/card.tsx +28 -0
  83. package/ui/center.tsx +26 -0
  84. package/ui/checkbox.tsx +35 -0
  85. package/ui/chip.tsx +32 -0
  86. package/ui/closebutton.tsx +15 -0
  87. package/ui/code.tsx +104 -0
  88. package/ui/collapse.tsx +16 -0
  89. package/ui/colorinput.tsx +32 -0
  90. package/ui/colorpicker.tsx +26 -0
  91. package/ui/colorswatch.tsx +17 -0
  92. package/ui/combobox.tsx +80 -0
  93. package/ui/container.tsx +27 -0
  94. package/ui/dialog.tsx +15 -0
  95. package/ui/divider.tsx +58 -0
  96. package/ui/drawer.tsx +28 -0
  97. package/ui/fieldset.tsx +15 -0
  98. package/ui/filebutton.tsx +23 -0
  99. package/ui/fileinput.tsx +36 -0
  100. package/ui/flex.tsx +139 -0
  101. package/ui/focustrap.tsx +15 -0
  102. package/ui/form.tsx +26 -0
  103. package/ui/grid.tsx +69 -0
  104. package/ui/highlight.tsx +15 -0
  105. package/ui/hoverable.tsx +66 -0
  106. package/ui/hovercard.tsx +45 -0
  107. package/ui/icon.tsx +76 -0
  108. package/ui/image.tsx +32 -0
  109. package/ui/index.ts +1355 -0
  110. package/ui/indicator.tsx +42 -0
  111. package/ui/infobox.tsx +200 -0
  112. package/ui/input.tsx +18 -0
  113. package/ui/inviewport.tsx +23 -0
  114. package/ui/jsoninput.tsx +35 -0
  115. package/ui/kbd.tsx +20 -0
  116. package/ui/list.tsx +33 -0
  117. package/ui/loader.tsx +26 -0
  118. package/ui/loadingoverlay.tsx +22 -0
  119. package/ui/mark.tsx +15 -0
  120. package/ui/menu.tsx +89 -0
  121. package/ui/modal.tsx +27 -0
  122. package/ui/multiselect.tsx +42 -0
  123. package/ui/nativeselect.tsx +17 -0
  124. package/ui/navlink.tsx +40 -0
  125. package/ui/notification.tsx +25 -0
  126. package/ui/numberformatter.tsx +15 -0
  127. package/ui/numberinput.tsx +37 -0
  128. package/ui/overlay.tsx +15 -0
  129. package/ui/pagination.tsx +21 -0
  130. package/ui/paper.tsx +33 -0
  131. package/ui/passwordinput.tsx +36 -0
  132. package/ui/pill.tsx +17 -0
  133. package/ui/pillsinput.tsx +37 -0
  134. package/ui/pininput.tsx +30 -0
  135. package/ui/popover.tsx +43 -0
  136. package/ui/portal.tsx +15 -0
  137. package/ui/progress.tsx +49 -0
  138. package/ui/props.ts +91 -0
  139. package/ui/propsDef.ts +38 -0
  140. package/ui/radio.tsx +30 -0
  141. package/ui/rating.tsx +25 -0
  142. package/ui/ringprogress.tsx +17 -0
  143. package/ui/scrollarea.tsx +27 -0
  144. package/ui/segmentedcontrol.tsx +38 -0
  145. package/ui/select.tsx +43 -0
  146. package/ui/simplegrid.tsx +23 -0
  147. package/ui/skeleton.tsx +15 -0
  148. package/ui/slider.tsx +31 -0
  149. package/ui/space.tsx +19 -0
  150. package/ui/spoiler.tsx +23 -0
  151. package/ui/stepper.tsx +63 -0
  152. package/ui/switch.tsx +29 -0
  153. package/ui/table.tsx +93 -0
  154. package/ui/tabs.tsx +80 -0
  155. package/ui/tagsinput.tsx +19 -0
  156. package/ui/terminal.tsx +44 -0
  157. package/ui/text.tsx +168 -0
  158. package/ui/textarea.tsx +36 -0
  159. package/ui/textinput.tsx +34 -0
  160. package/ui/timeline.tsx +30 -0
  161. package/ui/title.tsx +42 -0
  162. package/ui/tooltip.tsx +32 -0
  163. package/ui/transition.tsx +21 -0
  164. package/ui/tree.tsx +42 -0
  165. package/ui/typographystylesprovider.tsx +20 -0
  166. package/ui/unstyledbutton.tsx +18 -0
  167. package/ui/video.tsx +16 -0
  168. package/ui/visuallyhidden.tsx +15 -0
  169. package/utils/index.ts +76 -0
@@ -0,0 +1,145 @@
1
+ import puppeteer from "puppeteer";
2
+ import next from "next";
3
+ // import nextBuild from "next/dist/build/index.js";
4
+ import express from "express";
5
+ import killPort from "kill-port";
6
+ import fs from "fs";
7
+ import path from "path";
8
+ import { styleText } from "node:util";
9
+
10
+ const __dirname = process.cwd();
11
+ const port = 3001;
12
+ const baseUrl = `http://localhost:${port}`;
13
+ const pagesDir = path.join(__dirname, "src/pages");
14
+ function getRoutes(dir, basePath = "") {
15
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
16
+ return entries.flatMap((entry) => {
17
+ const fullPath = path.join(dir, entry.name);
18
+ const routePath = path.join(basePath, entry.name).replace(/\\/g, "/");
19
+ const entrypath = path.parse(entry.name);
20
+
21
+ if (entry.isDirectory() && entrypath.name !== "api") {
22
+ return getRoutes(fullPath, routePath);
23
+ }
24
+ if (
25
+ entry.isFile() &&
26
+ !["_app", "_document", "_error"].includes(entrypath.name)
27
+ ) {
28
+ let route = routePath.endsWith("index.tsx")
29
+ ? routePath.replace(/\index.tsx?$/, "")
30
+ : routePath.replace(/\.tsx?$/, "");
31
+ return route === "index" ? "/" : `/${route.replace(/\[.*?\]/g, "hello")}`;
32
+ }
33
+ return [];
34
+ });
35
+ }
36
+
37
+ export const testRoutes = async () => {
38
+ try {
39
+ await killPort(port, "tcp");
40
+ console.log(styleText("yellowBright", ` ✓ Port ${port} cleared.`));
41
+ } catch (err) {
42
+ console.error(styleText("yellowBright", ` ⚠️ Warning: ${err.message}`));
43
+ }
44
+ // const dir = path.resolve(process.cwd());
45
+ // await nextBuild.default(dir, {});
46
+ const app = next({
47
+ dev: true,
48
+ turbopack: false,
49
+ quiet: true,
50
+ minimalMode: true,
51
+ port,
52
+ });
53
+ await app.prepare();
54
+ console.log(styleText("greenBright", " ○ Next.js app prepared."));
55
+
56
+ const server = express();
57
+ server.all(/(.*)/, (req, res) => app.getRequestHandler()(req, res));
58
+ server.listen(port, async () => {
59
+ console.log(
60
+ styleText("cyanBright", ` ○ Test server running at ${baseUrl}`),
61
+ );
62
+ const browser = await puppeteer.launch({
63
+ headless: "shell",
64
+ });
65
+ const page = await browser.newPage();
66
+ await page.setViewport({ width: 1080, height: 1024 });
67
+
68
+ const routes = getRoutes(pagesDir);
69
+ console.log(
70
+ styleText("blueBright", ` ○ Testing routes: ${routes.join(", ")}`),
71
+ );
72
+ const finalResults = {
73
+ successful: [],
74
+ failed: [],
75
+ };
76
+ for (const route of routes) {
77
+ console.log(styleText("magenta", ` ○ Testing: ${route}`));
78
+ await page.goto(`${baseUrl}${route}`);
79
+ await page.waitForNetworkIdle();
80
+
81
+ const results = await page.evaluate(async () => {
82
+ const results = [];
83
+ for (const [name, test] of Object.entries(globalThis.tdd || {})) {
84
+ try {
85
+ await test();
86
+ results.push({ name, success: true });
87
+ } catch (error) {
88
+ results.push({
89
+ name,
90
+ success: false,
91
+ error: {
92
+ message: error.message,
93
+ stack: error.stack.split("\n"),
94
+ },
95
+ });
96
+ }
97
+ }
98
+ return results;
99
+ });
100
+ if (results.length === 0) {
101
+ console.log(styleText("gray", " - No tests found "));
102
+ }
103
+ for (const result of results) {
104
+ if (result.success) {
105
+ console.log(
106
+ styleText("bgGreenBright", " ✔ PASSED "),
107
+ styleText("bold", `${result.name}`),
108
+ );
109
+ finalResults.successful.push({
110
+ route,
111
+ name: result.name,
112
+ });
113
+ } else {
114
+ console.log(
115
+ styleText("bgRedBright", " ✖ FAILED "),
116
+ styleText("bold", `${result.name}`),
117
+ styleText(["underline", "redBright"], `${result.error.message}`),
118
+ );
119
+ finalResults.failed.push({
120
+ route,
121
+ name: result.name,
122
+ });
123
+ }
124
+ }
125
+ console.log(styleText("greenBright", ` ✔ Finished testing: ${route}`));
126
+ }
127
+
128
+ await browser.close();
129
+ if (finalResults.failed.length === 0) {
130
+ console.log(styleText("bgGreenBright", " ✔ ALL TESTS PASSED "));
131
+ process.exit();
132
+ } else {
133
+ console.log(
134
+ styleText(
135
+ "bgGreenBright",
136
+ ` ${finalResults.successful.length} ✔ PASSED `,
137
+ ),
138
+ );
139
+ console.log(
140
+ styleText("bgRedBright", ` ${finalResults.failed.length} ✖ FAILED `),
141
+ );
142
+ process.exit(1);
143
+ }
144
+ });
145
+ };