@schalkneethling/miyagi-core 4.0.2

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 (138) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +43 -0
  3. package/api/app.js +39 -0
  4. package/api/index.js +236 -0
  5. package/bin/miyagi.js +2 -0
  6. package/dist/css/iframe.css +31 -0
  7. package/dist/css/main.css +1 -0
  8. package/dist/js/_iframe-links-DdifIr4P.js +1 -0
  9. package/dist/js/_mock-data-Dypo4Bl_.js +1 -0
  10. package/dist/js/_prism-By3NMwUd.js +1 -0
  11. package/dist/js/iframe.build.js +1 -0
  12. package/dist/js/iframe.js +1 -0
  13. package/dist/js/index-BKDKaBC6.js +1 -0
  14. package/dist/js/jsontree.js +1 -0
  15. package/dist/js/main.build.js +1 -0
  16. package/dist/js/main.js +1 -0
  17. package/frontend/assets/css/iframe/accordion-tabs.css +77 -0
  18. package/frontend/assets/css/iframe/jsontree.js.css +325 -0
  19. package/frontend/assets/css/iframe/prism.css +132 -0
  20. package/frontend/assets/css/iframe/styleguide/colors.css +61 -0
  21. package/frontend/assets/css/iframe/styleguide/fonts.css +37 -0
  22. package/frontend/assets/css/iframe/styleguide/index.css +109 -0
  23. package/frontend/assets/css/iframe/styleguide/spacings.css +21 -0
  24. package/frontend/assets/css/iframe.css +410 -0
  25. package/frontend/assets/css/main/menu/config-switcher.css +49 -0
  26. package/frontend/assets/css/main/menu/config-switchers.css +67 -0
  27. package/frontend/assets/css/main/menu/goto.css +24 -0
  28. package/frontend/assets/css/main/menu/nav.css +113 -0
  29. package/frontend/assets/css/main/menu/search.css +64 -0
  30. package/frontend/assets/css/main/menu/title.css +40 -0
  31. package/frontend/assets/css/main/menu.css +114 -0
  32. package/frontend/assets/css/main/reset.css +217 -0
  33. package/frontend/assets/css/main.css +71 -0
  34. package/frontend/assets/css/shared.css +34 -0
  35. package/frontend/assets/css/tokens.css +112 -0
  36. package/frontend/assets/favicon.ico +0 -0
  37. package/frontend/assets/js/_accordion-tabs.js +403 -0
  38. package/frontend/assets/js/_goto.js +63 -0
  39. package/frontend/assets/js/_iframe-links.js +19 -0
  40. package/frontend/assets/js/_is-triggered.js +15 -0
  41. package/frontend/assets/js/_main.js +379 -0
  42. package/frontend/assets/js/_mock-data.js +13 -0
  43. package/frontend/assets/js/_prism.js +1098 -0
  44. package/frontend/assets/js/_search.js +190 -0
  45. package/frontend/assets/js/_socket.js +9 -0
  46. package/frontend/assets/js/config-switcher/development-mode.js +49 -0
  47. package/frontend/assets/js/config-switcher/index.js +63 -0
  48. package/frontend/assets/js/config-switcher/text-direction.js +30 -0
  49. package/frontend/assets/js/config-switcher/theme.js +87 -0
  50. package/frontend/assets/js/iframe.build.js +43 -0
  51. package/frontend/assets/js/iframe.js +52 -0
  52. package/frontend/assets/js/jsontree.js +979 -0
  53. package/frontend/assets/js/main.build.js +40 -0
  54. package/frontend/assets/js/main.js +42 -0
  55. package/frontend/assets/js/styleguide/color-converter.js +741 -0
  56. package/frontend/assets/js/styleguide/index.js +119 -0
  57. package/frontend/views/component_variation.twig.miyagi +57 -0
  58. package/frontend/views/design-tokens/colors.twig.miyagi +43 -0
  59. package/frontend/views/design-tokens/sizes.twig.miyagi +35 -0
  60. package/frontend/views/design-tokens/typography.twig.miyagi +38 -0
  61. package/frontend/views/iframe_component.twig.miyagi +141 -0
  62. package/frontend/views/iframe_component_variation.twig.miyagi +55 -0
  63. package/frontend/views/iframe_index.twig.miyagi +14 -0
  64. package/frontend/views/layouts/iframe_default.twig.miyagi +22 -0
  65. package/frontend/views/main.twig.miyagi +24 -0
  66. package/frontend/views/menu/config-switchers.twig.miyagi +83 -0
  67. package/frontend/views/menu/goto.twig.miyagi +9 -0
  68. package/frontend/views/menu/menu.twig.miyagi +21 -0
  69. package/frontend/views/menu/nav.twig.miyagi +95 -0
  70. package/frontend/views/menu/search.twig.miyagi +13 -0
  71. package/frontend/views/menu/title.twig.miyagi +24 -0
  72. package/index.js +3 -0
  73. package/lib/build/index.js +1020 -0
  74. package/lib/cli/app.js +38 -0
  75. package/lib/cli/component.js +56 -0
  76. package/lib/cli/index.js +5 -0
  77. package/lib/cli/lint.js +180 -0
  78. package/lib/config.js +74 -0
  79. package/lib/default-config.js +105 -0
  80. package/lib/generator/component.js +199 -0
  81. package/lib/generator/mocks.js +201 -0
  82. package/lib/helpers.js +184 -0
  83. package/lib/i18n/en.js +91 -0
  84. package/lib/i18n/index.js +17 -0
  85. package/lib/index.js +166 -0
  86. package/lib/init/args.js +55 -0
  87. package/lib/init/config.js +330 -0
  88. package/lib/init/engines.js +65 -0
  89. package/lib/init/index.js +102 -0
  90. package/lib/init/rendering.js +12 -0
  91. package/lib/init/router.js +249 -0
  92. package/lib/init/static.js +133 -0
  93. package/lib/init/twing/cache.js +34 -0
  94. package/lib/init/twing/functions.js +51 -0
  95. package/lib/init/views.js +19 -0
  96. package/lib/init/watcher.js +402 -0
  97. package/lib/logger.js +94 -0
  98. package/lib/mocks/get.js +111 -0
  99. package/lib/mocks/index.js +9 -0
  100. package/lib/mocks/resolve/ref.js +484 -0
  101. package/lib/mocks/resolve/tpl.js +246 -0
  102. package/lib/mocks/resolve.js +205 -0
  103. package/lib/render/helpers.js +51 -0
  104. package/lib/render/index.js +38 -0
  105. package/lib/render/views/iframe/component.docs.js +77 -0
  106. package/lib/render/views/iframe/component.js +338 -0
  107. package/lib/render/views/iframe/design-tokens/colors.js +52 -0
  108. package/lib/render/views/iframe/design-tokens/index.js +9 -0
  109. package/lib/render/views/iframe/design-tokens/sizes.js +49 -0
  110. package/lib/render/views/iframe/design-tokens/typography.js +52 -0
  111. package/lib/render/views/iframe/docs.js +68 -0
  112. package/lib/render/views/iframe/index.js +44 -0
  113. package/lib/render/views/iframe/variation.js +116 -0
  114. package/lib/render/views/iframe/variation.standalone.js +89 -0
  115. package/lib/render/views/main/component.docs.js +53 -0
  116. package/lib/render/views/main/component.js +74 -0
  117. package/lib/render/views/main/design-tokens.js +53 -0
  118. package/lib/render/views/main/docs.js +47 -0
  119. package/lib/render/views/main/index.js +46 -0
  120. package/lib/state/components.js +132 -0
  121. package/lib/state/css.js +50 -0
  122. package/lib/state/docs.js +111 -0
  123. package/lib/state/file-contents.js +207 -0
  124. package/lib/state/helpers.js +86 -0
  125. package/lib/state/index.js +56 -0
  126. package/lib/state/menu/index.js +275 -0
  127. package/lib/state/menu/structure.js +146 -0
  128. package/lib/state/partials.js +23 -0
  129. package/lib/state/source-tree.js +75 -0
  130. package/lib/styleguide/color-names.js +150 -0
  131. package/lib/styleguide/colors.js +135 -0
  132. package/lib/styleguide/helpers.js +37 -0
  133. package/lib/styleguide/index.js +17 -0
  134. package/lib/styleguide/media-queries.js +26 -0
  135. package/lib/styleguide/spacings.js +35 -0
  136. package/lib/styleguide/typography.js +61 -0
  137. package/lib/validator/mocks.js +105 -0
  138. package/package.json +117 -0
@@ -0,0 +1,150 @@
1
+ export default [
2
+ "aliceblue",
3
+ "antiquewhite",
4
+ "aqua",
5
+ "aquamarine",
6
+ "azure",
7
+ "beige",
8
+ "bisque",
9
+ "black",
10
+ "blanchedalmond",
11
+ "blue",
12
+ "blueviolet",
13
+ "brown",
14
+ "burlywood",
15
+ "cadetblue",
16
+ "chartreuse",
17
+ "chocolate",
18
+ "coral",
19
+ "cornflowerblue",
20
+ "cornsilk",
21
+ "crimson",
22
+ "cyan",
23
+ "darkblue",
24
+ "darkcyan",
25
+ "darkgoldenrod",
26
+ "darkgray",
27
+ "darkgreen",
28
+ "darkgrey",
29
+ "darkkhaki",
30
+ "darkmagenta",
31
+ "darkolivegreen",
32
+ "darkorange",
33
+ "darkorchid",
34
+ "darkred",
35
+ "darksalmon",
36
+ "darkseagreen",
37
+ "darkslateblue",
38
+ "darkslategray",
39
+ "darkslategrey",
40
+ "darkturquoise",
41
+ "darkviolet",
42
+ "deeppink",
43
+ "deepskyblue",
44
+ "dimgray",
45
+ "dimgrey",
46
+ "dodgerblue",
47
+ "firebrick",
48
+ "floralwhite",
49
+ "forestgreen",
50
+ "fuchsia",
51
+ "gainsboro",
52
+ "ghostwhite",
53
+ "gold",
54
+ "goldenrod",
55
+ "gray",
56
+ "green",
57
+ "greenyellow",
58
+ "grey",
59
+ "honeydew",
60
+ "hotpink",
61
+ "indianred",
62
+ "indigo",
63
+ "ivory",
64
+ "khaki",
65
+ "lavender",
66
+ "lavenderblush",
67
+ "lawngreen",
68
+ "lemonchiffon",
69
+ "lightblue",
70
+ "lightcoral",
71
+ "lightcyan",
72
+ "lightgoldenrodyellow",
73
+ "lightgray",
74
+ "lightgreen",
75
+ "lightgrey",
76
+ "lightpink",
77
+ "lightsalmon",
78
+ "lightseagreen",
79
+ "lightskyblue",
80
+ "lightslategray",
81
+ "lightslategrey",
82
+ "lightsteelblue",
83
+ "lightyellow",
84
+ "lime",
85
+ "limegreen",
86
+ "linen",
87
+ "magenta",
88
+ "maroon",
89
+ "mediumaquamarine",
90
+ "mediumblue",
91
+ "mediumorchid",
92
+ "mediumpurple",
93
+ "mediumseagreen",
94
+ "mediumslateblue",
95
+ "mediumspringgreen",
96
+ "mediumturquoise",
97
+ "mediumvioletred",
98
+ "midnightblue",
99
+ "mintcream",
100
+ "mistyrose",
101
+ "moccasin",
102
+ "navajowhite",
103
+ "navy",
104
+ "oldlace",
105
+ "olive",
106
+ "olivedrab",
107
+ "orange",
108
+ "orangered",
109
+ "orchid",
110
+ "palegoldenrod",
111
+ "palegreen",
112
+ "paleturquoise",
113
+ "palevioletred",
114
+ "papayawhip",
115
+ "peachpuff",
116
+ "peru",
117
+ "pink",
118
+ "plum",
119
+ "powderblue",
120
+ "purple",
121
+ "rebeccapurple",
122
+ "red",
123
+ "rosybrown",
124
+ "royalblue",
125
+ "saddlebrown",
126
+ "salmon",
127
+ "sandybrown",
128
+ "seagreen",
129
+ "seashell",
130
+ "sienna",
131
+ "silver",
132
+ "skyblue",
133
+ "slateblue",
134
+ "slategray",
135
+ "slategrey",
136
+ "snow",
137
+ "springgreen",
138
+ "steelblue",
139
+ "tan",
140
+ "teal",
141
+ "thistle",
142
+ "tomato",
143
+ "turquoise",
144
+ "violet",
145
+ "wheat",
146
+ "white",
147
+ "whitesmoke",
148
+ "yellow",
149
+ "yellowgreen",
150
+ ];
@@ -0,0 +1,135 @@
1
+ import { getCustomProperties } from "./helpers.js";
2
+ import colorNames from "./color-names.js";
3
+
4
+ /**
5
+ * @param {object} obj
6
+ * @param {string} prefix
7
+ * @returns {Array}
8
+ */
9
+ export default function getColors(obj, prefix) {
10
+ const types = ["typo", "decoration"];
11
+ const uppercasedPrefix = prefix.toUpperCase();
12
+
13
+ const colors = getCustomProperties(obj, prefix)
14
+ .filter(({ property, value }) => {
15
+ const lowerCasedValue = value.toLowerCase();
16
+ return (
17
+ property.match(`--${prefix}-(.)*`) &&
18
+ (lowerCasedValue.startsWith("rgb(") ||
19
+ lowerCasedValue.startsWith("rgba(") ||
20
+ (lowerCasedValue.startsWith("#") &&
21
+ Boolean(lowerCasedValue.match(new RegExp(/^#[a-f0-9]{3,8}$/)))) ||
22
+ lowerCasedValue.startsWith("hsl(") ||
23
+ lowerCasedValue.startsWith("hsla(") ||
24
+ (lowerCasedValue.startsWith("var(--") &&
25
+ lowerCasedValue.endsWith(")")) ||
26
+ colorNames.includes(value))
27
+ );
28
+ })
29
+ .map(({ property, value }) => {
30
+ const lowerCasedValue = value.toLowerCase();
31
+ const whitesArr = [
32
+ "#fff",
33
+ "#ffff",
34
+ "#ffffff",
35
+ "#ffffffff",
36
+ "hsl(0,0%,100%)",
37
+ "hsl(0, 0%,100%)",
38
+ "hsl(0,0%, 100%)",
39
+ "hsl(0, 0%, 100%)",
40
+ "rgb(255,255,255)",
41
+ "rgb(255, 255,255)",
42
+ "rgb(255,255, 255)",
43
+ "rgb(255, 255, 255)",
44
+ "rgba(255,255,255,1)",
45
+ "rgba(255, 255,255,1)",
46
+ "rgba(255, 255, 255,1)",
47
+ "rgba(255, 255,255, 1)",
48
+ "rgba(255,255, 255,1)",
49
+ "rgba(255,255, 255, 1)",
50
+ "rgba(255,255,255, 1)",
51
+ "rgba(255, 255, 255, 1)",
52
+ "white",
53
+ `var(--${uppercasedPrefix}-white)`,
54
+ ];
55
+
56
+ types.forEach((type) => {
57
+ const uppercasedType = type.toUpperCase();
58
+
59
+ whitesArr.push(
60
+ `rgba(var(--${uppercasedPrefix}-${uppercasedType}-white-r),var(--${uppercasedPrefix}-${uppercasedType}-white-g),var(--${uppercasedPrefix}-${uppercasedType}-white-b))`,
61
+ `rgba(var(--${uppercasedPrefix}-${uppercasedType}-white-r), var(--${uppercasedPrefix}-${uppercasedType}-white-g), var(--${uppercasedPrefix}-${uppercasedType}-white-b))`,
62
+ `rgbaa(var(--${uppercasedPrefix}-${uppercasedType}-white-r),var(--${uppercasedPrefix}-${uppercasedType}-white-g),var(--${uppercasedPrefix}-${uppercasedType}-white-b),var(--${uppercasedPrefix}-${uppercasedType}-white-a))`,
63
+ `rgbaa(var(--${uppercasedPrefix}-${uppercasedType}-white-r), var(--${uppercasedPrefix}-${uppercasedType}-white-g), var(--${uppercasedPrefix}-${uppercasedType}-white-b), var(--${uppercasedPrefix}-${uppercasedType}-white-a))`,
64
+ );
65
+ });
66
+
67
+ const whites = new Set(whitesArr);
68
+ const customPropertyWithoutPrefix = property.replace(`--${prefix}-`, "");
69
+ const name = customPropertyWithoutPrefix
70
+ .replace(`${types[0]}-`, "")
71
+ .replace(`${types[1]}-`, "");
72
+ let type;
73
+
74
+ types.forEach((t) => {
75
+ if (
76
+ customPropertyWithoutPrefix.toUpperCase().startsWith(t.toUpperCase())
77
+ ) {
78
+ type = t;
79
+ }
80
+ });
81
+
82
+ return {
83
+ name,
84
+ type,
85
+ customProp: property,
86
+ values: ["RGB", "Hex", "HSL"],
87
+ isWhite: whites.has(lowerCasedValue),
88
+ };
89
+ });
90
+
91
+ const deduped = [
92
+ {
93
+ type: "all",
94
+ styles: [],
95
+ },
96
+ ];
97
+
98
+ types.forEach((type) => {
99
+ deduped.push({
100
+ type,
101
+ styles: [],
102
+ });
103
+ });
104
+
105
+ colors.forEach((color) => {
106
+ const t = color.type || "all";
107
+
108
+ if (
109
+ !deduped
110
+ .find(({ type }) => type === t)
111
+ .styles.find(({ name }) => name === color.name)
112
+ ) {
113
+ deduped
114
+ .find(({ type }) => type === t)
115
+ .styles.push({
116
+ name: color.name,
117
+ customProp: color.customProp,
118
+ values: color.values,
119
+ isWhite: color.isWhite,
120
+ });
121
+ }
122
+ });
123
+
124
+ return deduped.map((entry) => {
125
+ entry.styles = entry.styles.sort((a, b) => {
126
+ const aUppercase = a.name.toUpperCase();
127
+ const bUppercase = b.name.toUpperCase();
128
+
129
+ if (aUppercase > bUppercase) return 1;
130
+ if (aUppercase < bUppercase) return -1;
131
+ return 0;
132
+ });
133
+ return entry;
134
+ });
135
+ }
@@ -0,0 +1,37 @@
1
+ export const getCustomProperties = function (obj, property, endsWith) {
2
+ var result = [];
3
+
4
+ if (obj instanceof Array) {
5
+ for (var i = 0; i < obj.length; i++) {
6
+ result = [...result, ...getCustomProperties(obj[i], property, endsWith)];
7
+ }
8
+ } else {
9
+ for (const prop in obj) {
10
+ if (prop == "property") {
11
+ if (endsWith) {
12
+ if (obj[prop].endsWith(`-${property}`)) {
13
+ result.push({
14
+ property: obj.property,
15
+ value: obj.value,
16
+ });
17
+ }
18
+ } else {
19
+ if (obj[prop].startsWith(`--${property}-`)) {
20
+ result.push({
21
+ property: obj.property,
22
+ value: obj.value,
23
+ });
24
+ }
25
+ }
26
+ }
27
+ if (obj[prop] instanceof Object || obj[prop] instanceof Array) {
28
+ result = [
29
+ ...result,
30
+ ...getCustomProperties(obj[prop], property, endsWith),
31
+ ];
32
+ }
33
+ }
34
+ }
35
+
36
+ return result;
37
+ };
@@ -0,0 +1,17 @@
1
+ import colors from "./colors.js";
2
+ import typography from "./typography.js";
3
+ import spacings from "./spacings.js";
4
+ import mediaQueries from "./media-queries.js";
5
+
6
+ export const getColors = (obj, prefix) => {
7
+ return colors(obj, prefix);
8
+ };
9
+ export const getTypography = (obj, prefix) => {
10
+ return typography(obj, prefix);
11
+ };
12
+ export const getSpacings = (obj, prefix) => {
13
+ return spacings(obj, prefix);
14
+ };
15
+ export const getMediaQueries = (obj) => {
16
+ return mediaQueries(obj);
17
+ };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @param {object} obj
3
+ * @returns {Array}
4
+ */
5
+ export default function getMediaQueries(obj) {
6
+ var result = [];
7
+
8
+ if (obj instanceof Array) {
9
+ for (var i = 0; i < obj.length; i++) {
10
+ result = [...result, ...getMediaQueries(obj[i])];
11
+ }
12
+ } else {
13
+ for (const prop in obj) {
14
+ if (prop == "type") {
15
+ if (obj[prop] === "media") {
16
+ result.push(obj.media);
17
+ }
18
+ }
19
+ if (obj[prop] instanceof Object || obj[prop] instanceof Array) {
20
+ result = [...result, ...getMediaQueries(obj[prop])];
21
+ }
22
+ }
23
+ }
24
+
25
+ return result.filter((v, i, a) => a.indexOf(v) === i);
26
+ }
@@ -0,0 +1,35 @@
1
+ import { getCustomProperties } from "./helpers.js";
2
+
3
+ /**
4
+ * @param {object} obj
5
+ * @param {string} prefix
6
+ * @returns {Array}
7
+ */
8
+ export default function getSpacings(obj, prefix) {
9
+ const spacings = [];
10
+
11
+ getCustomProperties(obj, prefix).forEach(({ property, value, mq }) => {
12
+ // filter out negative spacings
13
+ if (property.startsWith(`--${prefix}-`) && !value.startsWith("-")) {
14
+ spacings.push({
15
+ name: property.replace(`--${prefix}-`, ""),
16
+ customProp: property,
17
+ value,
18
+ mq,
19
+ });
20
+ }
21
+ });
22
+
23
+ const deduped = {};
24
+
25
+ spacings.forEach((e) => {
26
+ if (!deduped[e.name]) {
27
+ deduped[e.name] = {
28
+ customProp: e.customProp,
29
+ value: e.value,
30
+ };
31
+ }
32
+ });
33
+
34
+ return Object.entries(deduped);
35
+ }
@@ -0,0 +1,61 @@
1
+ import { getCustomProperties } from "./helpers.js";
2
+
3
+ /**
4
+ * @param {object} obj
5
+ * @param {string} prefix
6
+ * @returns {Array}
7
+ */
8
+ export default function getTypography(obj, prefix) {
9
+ const props = [
10
+ "font-family",
11
+ "font-feature-settings",
12
+ "font-kerning",
13
+ "font-size-adjust",
14
+ "font-size",
15
+ "font-stretch",
16
+ "font-style",
17
+ "font-variant-caps",
18
+ "font-variant",
19
+ "font-weight",
20
+ "letter-spacing",
21
+ "line-height",
22
+ "text-shadow",
23
+ "text-transform",
24
+ ];
25
+
26
+ const deduped = {};
27
+
28
+ props.forEach((prop) => {
29
+ getCustomProperties(obj, prop, true).forEach(({ property }) => {
30
+ if (property.startsWith(`--${prefix}-`)) {
31
+ const name = property
32
+ .replace(`--${prefix}-`, "")
33
+ .replace(`-${prop}`, "");
34
+ const customPropName = property.replace(`-${prop}`, "");
35
+
36
+ if (!deduped[name]) {
37
+ deduped[name] = {
38
+ customProp: customPropName,
39
+ values: [],
40
+ };
41
+ }
42
+
43
+ if (!deduped[name].values.find(({ value }) => value === property)) {
44
+ deduped[name].values.push({
45
+ label: prop,
46
+ value: property,
47
+ });
48
+ }
49
+ }
50
+ });
51
+ });
52
+
53
+ return Object.entries(deduped).sort((a, b) => {
54
+ const aUppercase = a[0].toUpperCase();
55
+ const bUppercase = b[0].toUpperCase();
56
+
57
+ if (aUppercase > bUppercase) return 1;
58
+ if (aUppercase < bUppercase) return -1;
59
+ return 0;
60
+ });
61
+ }
@@ -0,0 +1,105 @@
1
+ import jsYaml from "js-yaml";
2
+ import deepMerge from "deepmerge";
3
+ import log from "../logger.js";
4
+ import { t } from "../i18n/index.js";
5
+
6
+ /**
7
+ * Module for validating mock data against JSON schema
8
+ * @module validatorSchema
9
+ * @param {object} component
10
+ * @param {Array} dataArray - an array with mock data
11
+ * @param {boolean} [noCli]
12
+ * @returns {null|object[]} null if there is no schema or an array with booleans defining the validity of the entries in the data array
13
+ */
14
+ export default function validateMockData(component, dataArray, noCli) {
15
+ const componentSchema =
16
+ global.state.fileContents[component.paths.schema.full];
17
+
18
+ if (componentSchema) {
19
+ const schemas = [];
20
+
21
+ Object.entries(global.state.fileContents).forEach(([key, value]) => {
22
+ if (
23
+ key.endsWith(
24
+ `${global.config.files.schema.name}.${global.config.files.schema.extension}`,
25
+ )
26
+ ) {
27
+ const arr = Array.isArray(value) ? value : [value];
28
+
29
+ arr.forEach((schema) => {
30
+ if (schema && componentSchema.$id !== schema.$id) {
31
+ schemas.push(schema);
32
+ }
33
+ });
34
+ }
35
+ });
36
+
37
+ const validity = [];
38
+ let validate;
39
+ let jsonSchemaValidator;
40
+
41
+ try {
42
+ jsonSchemaValidator = new global.config.schema.ajv(
43
+ deepMerge(
44
+ {
45
+ allErrors: true,
46
+ schemas: schemas.map((schema, i) => {
47
+ if (!schema.$id) {
48
+ schema.$id = i.toString();
49
+ }
50
+ return schema;
51
+ }),
52
+ },
53
+ global.config.schema.options || {},
54
+ ),
55
+ );
56
+ validate = jsonSchemaValidator.compile(componentSchema);
57
+ } catch (e) {
58
+ const message = e.toString();
59
+ if (!noCli) {
60
+ log("error", `${component.paths.dir.short}:\n${message}`, e);
61
+ }
62
+ return [
63
+ {
64
+ type: "schema",
65
+ data: [{ message }],
66
+ },
67
+ ];
68
+ }
69
+
70
+ if (validate && dataArray) {
71
+ dataArray.forEach((entry) => {
72
+ const valid = validate(entry?.resolved ?? {});
73
+ if (!valid && !noCli) {
74
+ validate.errors.forEach((error) => {
75
+ log(
76
+ "error",
77
+ `${component.paths.dir.short} # ${entry.name}\n${jsYaml.dump(error)}`,
78
+ );
79
+ });
80
+ }
81
+
82
+ if (!valid) {
83
+ validity.push({
84
+ variant: entry.name,
85
+ data: validate.errors,
86
+ });
87
+ }
88
+ });
89
+ }
90
+
91
+ return validity.map((item) => ({
92
+ type: "mocks",
93
+ ...item,
94
+ }));
95
+ }
96
+
97
+ if (!global.config.isBuild && !noCli) {
98
+ log(
99
+ "warn",
100
+ `${component.paths.dir.short}: ${t("validator.mocks.noSchemaFound")}`,
101
+ );
102
+ }
103
+
104
+ return null;
105
+ }
package/package.json ADDED
@@ -0,0 +1,117 @@
1
+ {
2
+ "name": "@schalkneethling/miyagi-core",
3
+ "version": "4.0.2",
4
+ "description": "miyagi is a component development tool for JavaScript template engines.",
5
+ "main": "index.js",
6
+ "author": "Schalk Neethling <schalkneethling@duck.com>, Michael Großklaus <mail@mgrossklaus.de> (https://www.mgrossklaus.de)",
7
+ "license": "MIT",
8
+ "homepage": "https://www.miyagi.dev",
9
+ "bugs": "https://github.com/miyagi-dev/miyagi/issues",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git@github.com:miyagi-dev/miyagi.git"
13
+ },
14
+ "type": "module",
15
+ "keywords": [
16
+ "components",
17
+ "pattern",
18
+ "library",
19
+ "html",
20
+ "frontend"
21
+ ],
22
+ "engines": {
23
+ "node": ">=20.11.0"
24
+ },
25
+ "files": [
26
+ "api",
27
+ "bin",
28
+ "dist",
29
+ "frontend",
30
+ "index.js",
31
+ "lib"
32
+ ],
33
+ "bin": {
34
+ "miyagi": "./bin/miyagi.js"
35
+ },
36
+ "dependencies": {
37
+ "@adobe/css-tools": "^4.4.4",
38
+ "@stoplight/json-schema-sampler": "^0.3.0",
39
+ "ajv": "^8.17.1",
40
+ "anymatch": "^3.1.3",
41
+ "cookie-parser": "^1.4.7",
42
+ "deepmerge": "^4.3.1",
43
+ "directory-tree": "^3.5.2",
44
+ "express": "^5.1.0",
45
+ "js-yaml": "^4.1.0",
46
+ "marked": "^16.4.1",
47
+ "node-watch": "^0.7.4",
48
+ "twing": "7.2.2",
49
+ "ws": "^8.18.3",
50
+ "yargs": "^18.0.0"
51
+ },
52
+ "devDependencies": {
53
+ "@eslint/js": "^9.39.2",
54
+ "@rollup/plugin-node-resolve": "^16.0.3",
55
+ "@rollup/plugin-terser": "^0.4.4",
56
+ "@types/node": "^24.10.0",
57
+ "@vitest/coverage-v8": "^4.0.6",
58
+ "cssnano": "^7.1.2",
59
+ "eslint": "^9.39.0",
60
+ "eslint-plugin-jsdoc": "^61.1.11",
61
+ "globals": "^15.15.0",
62
+ "gulp": "^5.0.1",
63
+ "gulp-postcss": "^10.0.0",
64
+ "postcss": "^8.5.6",
65
+ "postcss-import": "^16.1.1",
66
+ "pre-commit": "^1.2.2",
67
+ "prettier": "^3.6.2",
68
+ "rollup": "^4.52.5",
69
+ "stylelint": "^16.25.0",
70
+ "stylelint-config-standard": "^39.0.1",
71
+ "typescript-eslint": "^8.46.2",
72
+ "vitest": "^4.0.6"
73
+ },
74
+ "scripts": {
75
+ "build": "gulp build",
76
+ "test": "vitest run --coverage --coverage.include=api --coverage.include=lib",
77
+ "lint": "stylelint frontend/assets/css/ && eslint lib/ && eslint frontend/assets/js/",
78
+ "fix": "eslint lib/ --fix && eslint frontend/assets/js/ --fix",
79
+ "release": "standard-version"
80
+ },
81
+ "browserslist": [
82
+ "last 2 versions",
83
+ "> 2%",
84
+ "not ie <= 11",
85
+ "not ie_mob <= 11",
86
+ "not op_mini all",
87
+ "not op_mob < 100",
88
+ "not baidu < 100",
89
+ "not and_qq < 100",
90
+ "not dead"
91
+ ],
92
+ "pnpm": {
93
+ "overrides": {
94
+ "json-pointer": ">=0.6.2",
95
+ "minimist": "^1.2.6",
96
+ "globals": "^15.8.0"
97
+ }
98
+ },
99
+ "stylelint": {
100
+ "extends": [
101
+ "stylelint-config-standard"
102
+ ],
103
+ "rules": {
104
+ "custom-property-pattern": null,
105
+ "declaration-block-no-redundant-longhand-properties": null,
106
+ "keyframes-name-pattern": null,
107
+ "no-descending-specificity": null,
108
+ "number-max-precision": 5,
109
+ "selector-class-pattern": null,
110
+ "media-feature-range-notation": null
111
+ }
112
+ },
113
+ "pre-commit": [
114
+ "lint",
115
+ "test"
116
+ ]
117
+ }