kempo 1.0.0

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 (194) hide show
  1. package/.gitattributes +2 -0
  2. package/LICENSE +21 -0
  3. package/README.md +2 -0
  4. package/dist/components/Card.js +1 -0
  5. package/dist/components/CodeEditor.js +1 -0
  6. package/dist/components/Component.js +1 -0
  7. package/dist/components/Dialog.js +1 -0
  8. package/dist/components/FocusCapture.js +1 -0
  9. package/dist/components/Icon.js +1 -0
  10. package/dist/components/Import.js +1 -0
  11. package/dist/components/LazyComponent.js +1 -0
  12. package/dist/components/ReactiveComponent.js +1 -0
  13. package/dist/components/ReactiveLazyComponent.js +1 -0
  14. package/dist/components/Resize.js +1 -0
  15. package/dist/components/Search.js +1 -0
  16. package/dist/components/ShowMore.js +1 -0
  17. package/dist/components/SideMenu.js +1 -0
  18. package/dist/components/Split.js +1 -0
  19. package/dist/components/Tabs.js +1 -0
  20. package/dist/components/ThemeSwitcher.js +1 -0
  21. package/dist/components/Timestamp.js +1 -0
  22. package/dist/components/WebSnippetEditor.js +1 -0
  23. package/dist/index.js +1 -0
  24. package/dist/kempo-hljs.css +1 -0
  25. package/dist/kempo-styles.css +1 -0
  26. package/dist/kempo-vars.css +1 -0
  27. package/dist/kempo.css +1 -0
  28. package/dist/kempo.js +1 -0
  29. package/dist/utils/cli.js +1 -0
  30. package/dist/utils/cookie.js +1 -0
  31. package/dist/utils/debounce.js +1 -0
  32. package/dist/utils/drag.js +1 -0
  33. package/dist/utils/element.js +1 -0
  34. package/dist/utils/formatTimestamp.js +1 -0
  35. package/dist/utils/fuzzyMatch.js +1 -0
  36. package/dist/utils/getPreferredTheme.js +1 -0
  37. package/dist/utils/loadCss.js +1 -0
  38. package/dist/utils/loadScript.js +1 -0
  39. package/dist/utils/object.js +1 -0
  40. package/dist/utils/string.js +1 -0
  41. package/dist/utils/toFunction.js +1 -0
  42. package/dist/utils/type.js +1 -0
  43. package/dist/utils/waitFrames.js +1 -0
  44. package/docs/components/_template.html +22 -0
  45. package/docs/components/card.html +35 -0
  46. package/docs/components/codeeditor.html +29 -0
  47. package/docs/components/component.html +88 -0
  48. package/docs/components/dialog.html +89 -0
  49. package/docs/components/icon.html +73 -0
  50. package/docs/components/import.html +34 -0
  51. package/docs/components/lazycomponent.html +50 -0
  52. package/docs/components/resize.html +107 -0
  53. package/docs/components/show-more.html +92 -0
  54. package/docs/components/sidemenu.html +97 -0
  55. package/docs/components/split.html +70 -0
  56. package/docs/components/tabs.html +33 -0
  57. package/docs/components/websnippeteditor.html +42 -0
  58. package/docs/index.html +17 -0
  59. package/docs/kempo/components/Card.js +1 -0
  60. package/docs/kempo/components/CodeEditor.js +1 -0
  61. package/docs/kempo/components/Collapse.js +1 -0
  62. package/docs/kempo/components/Component.js +1 -0
  63. package/docs/kempo/components/Dialog.js +1 -0
  64. package/docs/kempo/components/FocusCapture.js +1 -0
  65. package/docs/kempo/components/Icon.js +1 -0
  66. package/docs/kempo/components/Import.js +1 -0
  67. package/docs/kempo/components/LazyComponent.js +1 -0
  68. package/docs/kempo/components/ReactiveComponent.js +1 -0
  69. package/docs/kempo/components/ReactiveLazyComponent.js +1 -0
  70. package/docs/kempo/components/Resize.js +1 -0
  71. package/docs/kempo/components/Search.js +1 -0
  72. package/docs/kempo/components/ShowMore.js +1 -0
  73. package/docs/kempo/components/SideMenu.js +1 -0
  74. package/docs/kempo/components/Split.js +1 -0
  75. package/docs/kempo/components/Tabs.js +1 -0
  76. package/docs/kempo/components/ThemeSwitcher.js +1 -0
  77. package/docs/kempo/components/Timestamp.js +1 -0
  78. package/docs/kempo/components/WebSnippetEditor.js +1 -0
  79. package/docs/kempo/icons/arrow-down-double.svg +1 -0
  80. package/docs/kempo/icons/arrow-up-double.svg +1 -0
  81. package/docs/kempo/icons/close.svg +2 -0
  82. package/docs/kempo/icons/compare.svg +1 -0
  83. package/docs/kempo/icons/dark-mode.svg +1 -0
  84. package/docs/kempo/icons/delete.svg +1 -0
  85. package/docs/kempo/icons/filter-off.svg +1 -0
  86. package/docs/kempo/icons/filter.svg +1 -0
  87. package/docs/kempo/icons/light-mode.svg +1 -0
  88. package/docs/kempo/icons/menu.svg +1 -0
  89. package/docs/kempo/icons/pause.svg +1 -0
  90. package/docs/kempo/icons/play.svg +1 -0
  91. package/docs/kempo/icons/search.svg +1 -0
  92. package/docs/kempo/icons/settings.svg +1 -0
  93. package/docs/kempo/icons/storage.svg +1 -0
  94. package/docs/kempo/icons/trash-x.svg +1 -0
  95. package/docs/kempo/index.js +1 -0
  96. package/docs/kempo/kempo-hljs.css +1 -0
  97. package/docs/kempo/kempo-styles.css +1 -0
  98. package/docs/kempo/kempo-vars.css +1 -0
  99. package/docs/kempo/kempo.css +1 -0
  100. package/docs/kempo/kempo.js +1 -0
  101. package/docs/kempo/utils/cli.js +1 -0
  102. package/docs/kempo/utils/cookie.js +1 -0
  103. package/docs/kempo/utils/debounce.js +1 -0
  104. package/docs/kempo/utils/drag.js +1 -0
  105. package/docs/kempo/utils/element.js +1 -0
  106. package/docs/kempo/utils/formatTimestamp.js +1 -0
  107. package/docs/kempo/utils/fuzzyMatch.js +1 -0
  108. package/docs/kempo/utils/getPreferredTheme.js +1 -0
  109. package/docs/kempo/utils/loadCss.js +1 -0
  110. package/docs/kempo/utils/loadScript.js +1 -0
  111. package/docs/kempo/utils/object.js +1 -0
  112. package/docs/kempo/utils/string.js +1 -0
  113. package/docs/kempo/utils/toFunction.js +1 -0
  114. package/docs/kempo/utils/type.js +1 -0
  115. package/docs/kempo/utils/waitFrames.js +1 -0
  116. package/docs/nav-1.inc.html +66 -0
  117. package/docs/nav.inc.html +66 -0
  118. package/docs/search.json +94 -0
  119. package/docs/styles/_template.html +22 -0
  120. package/docs/styles/borders-spacing.html +193 -0
  121. package/docs/styles/buttons.html +113 -0
  122. package/docs/styles/colors.html +65 -0
  123. package/docs/styles/displays-layouts.html +156 -0
  124. package/docs/styles/embed-1.html +35 -0
  125. package/docs/styles/inputs.html +89 -0
  126. package/docs/styles/tables.html +143 -0
  127. package/docs/styles/typography.html +116 -0
  128. package/icons/arrow-down-double.svg +1 -0
  129. package/icons/arrow-up-double.svg +1 -0
  130. package/icons/close.svg +2 -0
  131. package/icons/compare.svg +1 -0
  132. package/icons/dark-mode.svg +1 -0
  133. package/icons/delete.svg +1 -0
  134. package/icons/filter-off.svg +1 -0
  135. package/icons/filter.svg +1 -0
  136. package/icons/light-mode.svg +1 -0
  137. package/icons/menu.svg +1 -0
  138. package/icons/pause.svg +1 -0
  139. package/icons/play.svg +1 -0
  140. package/icons/search.svg +1 -0
  141. package/icons/settings.svg +1 -0
  142. package/icons/storage.svg +1 -0
  143. package/icons/trash-x.svg +1 -0
  144. package/kempo/components/Card.js +65 -0
  145. package/kempo/components/CodeEditor.js +141 -0
  146. package/kempo/components/Component.js +109 -0
  147. package/kempo/components/Dialog.js +277 -0
  148. package/kempo/components/FocusCapture.js +30 -0
  149. package/kempo/components/Icon.js +60 -0
  150. package/kempo/components/Import.js +40 -0
  151. package/kempo/components/LazyComponent.js +40 -0
  152. package/kempo/components/ReactiveComponent.js +11 -0
  153. package/kempo/components/ReactiveLazyComponent.js +11 -0
  154. package/kempo/components/Resize.js +168 -0
  155. package/kempo/components/Search.js +136 -0
  156. package/kempo/components/ShowMore.js +82 -0
  157. package/kempo/components/SideMenu.js +156 -0
  158. package/kempo/components/Split.js +133 -0
  159. package/kempo/components/Tabs.js +254 -0
  160. package/kempo/components/ThemeSwitcher.js +77 -0
  161. package/kempo/components/Timestamp.js +25 -0
  162. package/kempo/components/WebSnippetEditor.js +159 -0
  163. package/kempo/kempo-hljs.css +145 -0
  164. package/kempo/kempo-styles.css +893 -0
  165. package/kempo/kempo-vars.css +154 -0
  166. package/kempo/kempo.js +48 -0
  167. package/kempo/utils/cli.js +54 -0
  168. package/kempo/utils/cookie.js +16 -0
  169. package/kempo/utils/debounce.js +9 -0
  170. package/kempo/utils/drag.js +74 -0
  171. package/kempo/utils/element.js +69 -0
  172. package/kempo/utils/formatTimestamp.js +11 -0
  173. package/kempo/utils/fuzzyMatch.js +55 -0
  174. package/kempo/utils/getPreferredTheme.js +1 -0
  175. package/kempo/utils/loadCss.js +10 -0
  176. package/kempo/utils/loadScript.js +10 -0
  177. package/kempo/utils/object.js +177 -0
  178. package/kempo/utils/string.js +54 -0
  179. package/kempo/utils/toFunction.js +24 -0
  180. package/kempo/utils/type.js +8 -0
  181. package/kempo/utils/waitFrames.js +17 -0
  182. package/package.json +33 -0
  183. package/scripts/build.js +131 -0
  184. package/scripts/docs.js +14 -0
  185. package/test/components/SuiteList.js +26 -0
  186. package/test/components/Test.js +357 -0
  187. package/test/index.html +49 -0
  188. package/test/index.js +25 -0
  189. package/test/suite.html +45 -0
  190. package/test/suites.inc.html +4 -0
  191. package/test/tests/components/Component.test.js +138 -0
  192. package/test/tests/utils/cli.test.js +113 -0
  193. package/test/tests/utils/cookie.test.js +87 -0
  194. package/test/tests/utils/debounce.test.js +71 -0
@@ -0,0 +1,177 @@
1
+ import {
2
+ typeOf,
3
+ isType
4
+ } from './type.js';
5
+
6
+ export const toJson = (obj) => {
7
+ return JSON.stringify(obj, (key, value) => {
8
+ if (key !== '' && value === obj) {
9
+ return '<<Circular Reference>>';
10
+ } else if (typeof(Element) !== 'undefined' && value instanceof Element) {
11
+ return value.outerHTML;
12
+ } else if(typeOf(value) === 'function'){
13
+ return `<<Function ${key}>>`;
14
+ }
15
+ return value;
16
+ });
17
+ };
18
+
19
+ export const flattenObject = (
20
+ obj,
21
+ maxDepth = 100,
22
+ prevDepth = 0,
23
+ parentKeys = []
24
+ ) => {
25
+ const thisDepth = prevDepth + 1;
26
+ if (obj === null) return {};
27
+ return Object.keys(obj).reduce((o, k) => {
28
+ const v = obj[k];
29
+ const key = [...parentKeys, k].join('.');
30
+ if (typeOf(Element) !== 'undefined' && v instanceof Element) {
31
+ return {
32
+ ...o,
33
+ [key]: v.outerHTML
34
+ };
35
+ } else if (v === null) {
36
+ return {
37
+ ...o,
38
+ [key]: null
39
+ };
40
+ } else if (typeof v === 'object') {
41
+ if (maxDepth <= thisDepth) {
42
+ return {
43
+ ...o,
44
+ [key]: '<<Max Depth Reached>>'
45
+ };
46
+ } else {
47
+ return {
48
+ ...o,
49
+ ...flattenObject(v, maxDepth, thisDepth, [...parentKeys, k])
50
+ };
51
+ }
52
+ } else {
53
+ return {
54
+ ...o,
55
+ [key]: v
56
+ };
57
+ }
58
+ }, {});
59
+ };
60
+
61
+ export const flattenedObjects = (...objects) => objects.map(o=>flattenObject(o));
62
+
63
+ export const objectSummary = (object, maxLength = 100) => {
64
+ if (typeof object === 'object') {
65
+ const flatObject = flattenObject(object);
66
+ const kvp = []; // key value pairs
67
+ Object.keys(flatObject).forEach((key) => {
68
+ kvp.push(`${key} = ${objectSummary(flatObject[key])}`);
69
+ });
70
+ return kvp.join(', ').substring(0, maxLength);
71
+ } else {
72
+ return `${object}`.substring(0, maxLength);
73
+ }
74
+ };
75
+
76
+ export const clone = (obj) => {
77
+ const type = typeof obj;
78
+ const Element =
79
+ typeof window === 'undefined' ? class Element {} : window.Element; // So this can run in Node
80
+ if (obj instanceof Element) {
81
+ return obj.outerHTML;
82
+ } else if (obj === null) {
83
+ return null;
84
+ } else if (
85
+ ['string', 'number', 'boolean', 'undefined', 'bigint'].includes(type)
86
+ ) {
87
+ return obj;
88
+ } else if (type === 'symbol') {
89
+ return '<<SYMBOL>>';
90
+ } else if (type === 'function') {
91
+ return '<<function>>';
92
+ } else if (obj instanceof Array) {
93
+ return obj.map((item) => clone(item));
94
+ } else if (type === 'object') {
95
+ return Object.keys(obj).reduce((r, k) => {
96
+ return {
97
+ ...r,
98
+ [k]: clone(obj[k])
99
+ };
100
+ }, {});
101
+ } else {
102
+ return obj;
103
+ }
104
+ };
105
+
106
+ export const equalObjs = (...objs) => {
107
+ if (objs.length < 2) return true;
108
+ const first = toJson(objs[0]);
109
+ for (let i = 1; i < objs.length; i++) {
110
+ if (first !== toJson(objs[i])) return false;
111
+ }
112
+ return true;
113
+ };
114
+
115
+ const pruneVar = (value) => {
116
+ if (typeof value === 'undefined') {
117
+ return [undefined, true];
118
+ } else if (typeof value === 'string') {
119
+ return [value, value === ''];
120
+ } else if (value instanceof Array) {
121
+ return [value, value.length === 0];
122
+ } else if (value === null) {
123
+ return [value, false];
124
+ } else if (typeof value === 'object') {
125
+ // eslint-disable-next-line no-use-before-define
126
+ return pruneObject(value);
127
+ }
128
+ return [value, false];
129
+ };
130
+ const pruneObject = (object) => {
131
+ const results = {};
132
+ Object.keys(object).forEach((key) => {
133
+ const [pruned, isBlank] = pruneVar(object[key]);
134
+ if (!isBlank) {
135
+ results[key] = pruned;
136
+ }
137
+ });
138
+ return [results, Object.keys(results).length === 0];
139
+ };
140
+ export const prune = (object) => {
141
+ return pruneObject(object)[0]
142
+ }
143
+ export const getAllKeys = (...objects) => [...new Set(objects.map(o => Object.keys(o)).flat())];
144
+ export const getDifferencesKeys = (...objects) => {
145
+ return getAllKeys(...objects)
146
+ .map(k => new Set(objects.map(o => o[k])).size !== 1 ? k : null)
147
+ .filter(k => k !== null);
148
+ }
149
+ export const diff = (obj1, obj2) => {
150
+ const result = {};
151
+
152
+ function compareValues(path, value1, value2) {
153
+ if (Array.isArray(value1) && Array.isArray(value2)) {
154
+ if (value1.length !== value2.length || !value1.every((v, i) => v === value2[i])) {
155
+ result[path.join('.')] = { newValue: value1, oldValue: value2 };
156
+ }
157
+ } else if (typeof value1 === 'object' && typeof value2 === 'object') {
158
+ compareObjects([...path], value1, value2);
159
+ } else if (value1 !== value2) {
160
+ result[path.join('.')] = { newValue: value1, oldValue: value2 };
161
+ }
162
+ }
163
+
164
+ function compareObjects(path, obj1, obj2) {
165
+ for (const key in obj1) {
166
+ if (obj1.hasOwnProperty(key)) {
167
+ const value1 = obj1[key];
168
+ const value2 = obj2[key];
169
+
170
+ compareValues([...path, key], value1, value2);
171
+ }
172
+ }
173
+ }
174
+
175
+ compareObjects([], obj1, obj2);
176
+ return result;
177
+ }
@@ -0,0 +1,54 @@
1
+ export const camelToDash = (str) => str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
2
+ export const dashToCamel = (str) => str.replace(/-([a-z])/g, (_, group) => group.toUpperCase());
3
+ export const isCamelCase = (str) => /[a-z][A-Z]/.test(str);
4
+ export const getCase = (str) => {
5
+ if(isCamelCase(str)){
6
+ return {
7
+ camel: str,
8
+ dash: camelToDash(str)
9
+ }
10
+ } else {
11
+ return {
12
+ camel: dashToCamel(str),
13
+ dash: str
14
+ }
15
+ }
16
+ }
17
+ export const escapeHTML = str => str.replace(/[&<>"'/]/g, match => {
18
+ switch (match) {
19
+ case '&':
20
+ return '&amp;';
21
+ case '<':
22
+ return '&lt;';
23
+ case '>':
24
+ return '&gt;';
25
+ case '"':
26
+ return '&quot;';
27
+ case "'":
28
+ return '&#39;';
29
+ case '/':
30
+ return '&#x2F;';
31
+ default:
32
+ return match;
33
+ }
34
+ });
35
+ export const unescapeHTML = str => str.replace(/&amp;|&lt;|&gt;|&quot;|&#39;|&#x2F;/g, match => {
36
+ switch (match) {
37
+ case '&amp;':
38
+ return '&';
39
+ case '&lt;':
40
+ return '<';
41
+ case '&gt;':
42
+ return '>';
43
+ case '&quot;':
44
+ return '"';
45
+ case '&#39;':
46
+ return "'";
47
+ case '&#x2F;':
48
+ return '/';
49
+ default:
50
+ return match;
51
+ }
52
+ });
53
+ export const trim = (str, chars) => str.replace(new RegExp(`^[${chars}]+|[${chars}]+$`, 'g'), '');
54
+ export const compoundKey = keys => trim(keys.join('.'), '.');
@@ -0,0 +1,24 @@
1
+ export default (v) => {
2
+ if (typeof v === 'function') {
3
+ return v;
4
+ }
5
+ if (typeof v === 'string') {
6
+ const parts = v.split('.');
7
+ let current = window;
8
+ for (const part of parts) {
9
+ current = current[part];
10
+ if (current === undefined) {
11
+ break;
12
+ }
13
+ }
14
+ if (typeof current === 'function') {
15
+ return current;
16
+ }
17
+ try {
18
+ return new Function(v);
19
+ } catch (e) {
20
+ console.error('Failed to create function from string:', e);
21
+ }
22
+ }
23
+ return () => v;
24
+ };
@@ -0,0 +1,8 @@
1
+ export const typeOf = value => {
2
+ if(value === null) return 'null';
3
+ else if(value instanceof Array) return 'array';
4
+ else if(typeof(Element) !== 'undefined' && value instanceof Element) return 'element';
5
+ else return typeof(value);
6
+ }
7
+
8
+ export const isType = (value, type) => typeOf(value) === type;
@@ -0,0 +1,17 @@
1
+ export default (frameCount = 1) => {
2
+ return new Promise((resolve) => {
3
+ let frames = 0;
4
+
5
+ function frameHandler() {
6
+ frames++;
7
+
8
+ if (frames >= frameCount) {
9
+ resolve();
10
+ } else {
11
+ requestAnimationFrame(frameHandler);
12
+ }
13
+ }
14
+
15
+ requestAnimationFrame(frameHandler);
16
+ });
17
+ }
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "kempo",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "A web component library",
6
+ "main": "dist/index.js",
7
+ "scripts": {
8
+ "test": "node ./scrips/test.js",
9
+ "build": "node ./scripts/build.js",
10
+ "docs": "node ./scripts/build.js && node ./scripts/docs.js"
11
+ },
12
+ "author": "Dustin Poissant",
13
+ "license": "MIT",
14
+ "dependencies": {
15
+ "express": "^4.18.3"
16
+ },
17
+ "devDependencies": {
18
+ "fs-extra": "^11.2.0",
19
+ "terser": "^5.29.2"
20
+ },
21
+ "directories": {
22
+ "doc": "docs",
23
+ "test": "test"
24
+ },
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/dustinpoissant/kempo.git"
28
+ },
29
+ "bugs": {
30
+ "url": "https://github.com/dustinpoissant/kempo/issues"
31
+ },
32
+ "homepage": "https://github.com/dustinpoissant/kempo#readme"
33
+ }
@@ -0,0 +1,131 @@
1
+ import fs from 'fs/promises';
2
+ import fse from 'fs-extra';
3
+ import { minify } from 'terser';
4
+
5
+ console.log('Loading utils');
6
+ const components = (await fs.readdir('./kempo/components/')).map(f=>f.substring(0,f.length-3));
7
+ let complete = 0;
8
+
9
+ console.log('Loading Component Source Code');
10
+ process.stdout.write(`0/${components.length} = 0%`);
11
+ const componentCode = {};
12
+ await Promise.all(components.map( async component => {
13
+ componentCode[component] = await fs.readFile(`./kempo/components/${component}.js`, 'utf-8');
14
+ process.stdout.write("\r");
15
+ complete++;
16
+ process.stdout.write(`${complete}/${components.length} = ${Math.round((complete/components.length)*100)}%`);
17
+ }));
18
+ process.stdout.write("\n");
19
+
20
+ complete = 0;
21
+ console.log('Minifying Component Source Code');
22
+ process.stdout.write(`0/${components.length} = 0%`);
23
+ const minifiedCompontents = {};
24
+ await Promise.all(components.map( async componentFile => {
25
+ minifiedCompontents[componentFile] = (await minify(componentCode[componentFile])).code
26
+ process.stdout.write("\r");
27
+ complete++;
28
+ process.stdout.write(`${complete}/${components.length} = ${Math.round((complete/components.length)*100)}%`);
29
+ }));
30
+ process.stdout.write("\n");
31
+
32
+ complete = 0;
33
+ console.log('Saving Minified Components to dist/');
34
+ process.stdout.write(`0/${components.length} = 0%`);
35
+ await fse.ensureDir('./dist/components');
36
+ await Promise.all(components.map( async component => {
37
+ await fs.writeFile(`./dist/components/${component}.js`, minifiedCompontents[component], 'utf-8');
38
+ process.stdout.write("\r");
39
+ complete++;
40
+ process.stdout.write(`${complete}/${components.length} = ${Math.round((complete/components.length)*100)}%`);
41
+ }));
42
+ process.stdout.write("\n");
43
+
44
+ console.log('Loading Utils');
45
+ const utils = (await fs.readdir('./kempo/utils/')).map(f=>f.substring(0,f.length-3));
46
+ complete = 0;
47
+
48
+ console.log('Loading Utils Source Code');
49
+ process.stdout.write(`0/${utils.length} = 0%`);
50
+ const utilCode = {};
51
+ await Promise.all(utils.map( async util => {
52
+ utilCode[util] = await fs.readFile(`./kempo/utils/${util}.js`, 'utf-8');
53
+ process.stdout.write("\r");
54
+ complete++;
55
+ process.stdout.write(`${complete}/${utils.length} = ${Math.round((complete/utils.length)*100)}%`);
56
+ }));
57
+ process.stdout.write("\n");
58
+
59
+ complete = 0;
60
+ console.log('Minifying Utils Source Code');
61
+ process.stdout.write(`0/${utils.length} = 0%`);
62
+ const minifiedUtils = {};
63
+ await Promise.all(utils.map( async utilFile => {
64
+ minifiedUtils[utilFile] = (await minify(utilCode[utilFile])).code
65
+ process.stdout.write("\r");
66
+ complete++;
67
+ process.stdout.write(`${complete}/${utils.length} = ${Math.round((complete/utils.length)*100)}%`);
68
+ }));
69
+ process.stdout.write("\n");
70
+
71
+ complete = 0;
72
+ console.log('Saving Minified Utils to dist/');
73
+ process.stdout.write(`0/${utils.length} = 0%`);
74
+ await fse.ensureDir('./dist/utils');
75
+ await Promise.all(utils.map( async util => {
76
+ await fs.writeFile(`./dist/utils/${util}.js`, minifiedUtils[util], 'utf-8');
77
+ process.stdout.write("\r");
78
+ complete++;
79
+ process.stdout.write(`${complete}/${utils.length} = ${Math.round((complete/utils.length)*100)}%`);
80
+ }));
81
+ process.stdout.write("\n");
82
+
83
+ console.log('Generatoring export file');
84
+ const main = `
85
+ ${components.map( component => `import ${component} from './components/${component}.js';` ).join('')}
86
+ ${utils.map( util => `import ${util} from './utils/${util}.js';` ).join('')}
87
+ export default {
88
+ ${components.map( component => `${component}`).join(',')},
89
+ ${utils.map( util => `${util}`).join(',')}
90
+ };
91
+ `;
92
+ const minifiedMain = (await minify(main)).code;
93
+ console.log('Saving minified main entry file');
94
+ await fs.writeFile('./dist/index.js', minifiedMain, 'utf-8');
95
+
96
+ console.log('Loading kempo.js');
97
+ const kempoJS = await fs.readFile('./kempo/kempo.js', 'utf-8');
98
+ console.log('Minifying kempo.js');
99
+ const minifiedKempoJs = (await minify(kempoJS)).code;
100
+ console.log('Saving minfiied kempo.js');
101
+ await fs.writeFile('./dist/kempo.js', minifiedKempoJs, 'utf-8');
102
+
103
+ console.log('Loading kempo-vars.css');
104
+ const kempoVarsCSS = await fs.readFile('./kempo/kempo-vars.css', 'utf-8');
105
+ console.log('Minifying kempo-vars.css');
106
+ const minifiedKempoVarsCSS = kempoVarsCSS.replace(/\s*\{\s*/g, '{').replace(/\s*\}\s*/g, '}').replace(/\n/g, '').replace(/\r/g, '').replace(/\s+/g, ' ').replace(/\s*\:\s*/g, ':').replace(/\s*\;\s*/g, ';').replace(/;\}/g, '}');
107
+ console.log('Saving kempo-vars.css');
108
+ await fs.writeFile('./dist/kempo-vars.css', minifiedKempoVarsCSS, 'utf-8');
109
+
110
+ console.log('Loading kempo-styles.css');
111
+ const kempoStylesCSS = await fs.readFile('./kempo/kempo-styles.css', 'utf-8');
112
+ console.log('Minifying kempo-styles.css');
113
+ const miniefiedKempoStylesCSS = kempoStylesCSS.replace(/\s*\{\s*/g, '{').replace(/\s*\}\s*/g, '}').replace(/\n/g, '').replace(/\r/g, '').replace(/\s+/g, ' ').replace(/\s*\:\s*/g, ':').replace(/\s*\;\s*/g, ';').replace(/;\}/g, '}');
114
+ console.log('Saving kempo-styles.css');
115
+ await fs.writeFile('./dist/kempo-styles.css', miniefiedKempoStylesCSS, 'utf-8');
116
+
117
+ console.log('Loading kempo-hljs.css');
118
+ const kempoHljsCSS = await fs.readFile('./kempo/kempo-hljs.css', 'utf-8');
119
+ console.log('Minifying kempo-hljs.css');
120
+ const minifiedKempoHljsCSS = kempoHljsCSS.replace(/\s*\{\s*/g, '{').replace(/\s*\}\s*/g, '}').replace(/\n/g, '').replace(/\r/g, '').replace(/\s+/g, ' ').replace(/\s*\:\s*/g, ':').replace(/\s*\;\s*/g, ';').replace(/;\}/g, '}');
121
+ console.log('Saving kempo-hljs.css');
122
+ await fs.writeFile('./dist/kempo-hljs.css', minifiedKempoHljsCSS, 'utf-8');
123
+
124
+ console.log('Copying dist/ to docs/kempo/');
125
+ await fse.ensureDir('./docs/kempo/icons'); // will also ensure docs/kempo
126
+ await fse.copy('./dist', './docs/kempo')
127
+
128
+ console.log('Copying icons/ to docs/kempo/icons/');
129
+ await fse.copy('./icons', './docs/kempo/icons')
130
+
131
+ console.log('Build Complete');
@@ -0,0 +1,14 @@
1
+ import express from 'express';
2
+ import cli from '../kempo/utils/cli.js';
3
+
4
+ const {
5
+ port = 8083
6
+ } = cli();
7
+
8
+ const app = express();
9
+
10
+ app.use(express.static('docs'));
11
+
12
+ app.listen(port, () => {
13
+ console.log(`Docs Running on: http://localhost:${port}`);
14
+ });
@@ -0,0 +1,26 @@
1
+ import Component from '../kempo/components/Component.js';
2
+ import Card from '../kempo/components/Card.js';
3
+
4
+ export default class SuiteList extends Component {
5
+ async render(force){
6
+ if(await super.render(force)){
7
+ this.innerHTML = '';
8
+ const tests = await (await fetch('/api/tests')).json();
9
+ Object.keys(tests).forEach( category => {
10
+ const $category = new Card(category[0].toUpperCase() + category.slice(1));
11
+ $category.className = 'my';
12
+ tests[category].forEach( suite => {
13
+ const $link = document.createElement('a');
14
+ $link.href = `/suite.html?name=${category}/${suite}`;
15
+ $link.innerHTML = suite;
16
+ $link.className = 'd-b pq';
17
+ $category.appendChild($link);
18
+ });
19
+ this.appendChild($category);
20
+ });
21
+ return true;
22
+ }
23
+ return false;
24
+ }
25
+ }
26
+ window.customElements.define('k-suite-list', SuiteList);