@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,402 @@
1
+ /**
2
+ * Module for watching user file changes
3
+ * @module initWatcher
4
+ */
5
+
6
+ import anymatch from "anymatch";
7
+ import fs from "fs";
8
+ import path from "path";
9
+ import watch from "node-watch";
10
+ import { WebSocketServer } from "ws";
11
+ import getConfig from "../config.js";
12
+ import yargs from "./args.js";
13
+ import setState from "../state/index.js";
14
+ import { readFile } from "../state/file-contents.js";
15
+ import * as helpers from "../helpers.js";
16
+ import log from "../logger.js";
17
+ import { t } from "../i18n/index.js";
18
+ import setEngines from "./engines.js";
19
+ import setStatic from "./static.js";
20
+ import setViews from "./views.js";
21
+
22
+ let triggeredEvents = [];
23
+ let timeout;
24
+
25
+ /**
26
+ * @param {boolean} [reload] - is true if the page should be reloaded
27
+ * @param {boolean} [reloadParent] - is true if the parent window should be reloaded
28
+ */
29
+ function changeFileCallback(reload, reloadParent) {
30
+ if (reload && global.config.ui.reload) {
31
+ // ioInstance.emit("fileChanged", reloadParent);
32
+ sockets.forEach((ws) => {
33
+ ws.send(reloadParent ? "reloadParent" : "");
34
+ });
35
+ }
36
+
37
+ triggeredEvents = [];
38
+ log("success", `${t("updatingDone")}\n`);
39
+ }
40
+
41
+ /**
42
+ * @param {Array} triggered - the triggered events
43
+ * @param {Array} events - array of events to check against
44
+ * @returns {boolean} is true if the triggered events include the events to check against
45
+ */
46
+ function triggeredEventsIncludes(triggered, events) {
47
+ const flattened = triggered.map((event) => event.event);
48
+
49
+ for (let i = 0; i < flattened.length; i += 1) {
50
+ if (events.includes(flattened[i])) {
51
+ return true;
52
+ }
53
+ }
54
+
55
+ return false;
56
+ }
57
+
58
+ /**
59
+ * @param {object[]} events - array of event objects
60
+ * @returns {Promise<object>} the updated state.fileContents object
61
+ */
62
+ async function updateFileContents(events) {
63
+ const data = helpers.cloneDeep(global.state.fileContents);
64
+
65
+ try {
66
+ await Promise.all(
67
+ events.map(async ({ changedPath }) => {
68
+ const fullPath = path.join(process.cwd(), changedPath);
69
+
70
+ if (
71
+ fs.existsSync(changedPath) &&
72
+ fs.lstatSync(changedPath).isFile() &&
73
+ (helpers.fileIsTemplateFile(changedPath) ||
74
+ helpers.fileIsDataFile(changedPath) ||
75
+ helpers.fileIsDocumentationFile(changedPath) ||
76
+ helpers.fileIsSchemaFile(changedPath))
77
+ ) {
78
+ try {
79
+ const result = await readFile(changedPath);
80
+ data[fullPath] = result;
81
+ return Promise.resolve();
82
+ } catch (err) {
83
+ return Promise.reject(err.message);
84
+ }
85
+ } else {
86
+ delete data[fullPath];
87
+ return Promise.resolve();
88
+ }
89
+ }),
90
+ );
91
+
92
+ return data;
93
+ } catch (err) {
94
+ log("error", err);
95
+ }
96
+ }
97
+
98
+ /**
99
+ *
100
+ */
101
+ async function handleFileChange() {
102
+ for (const extension of global.config.extensions) {
103
+ const ext = Array.isArray(extension) ? extension[0] : extension;
104
+ const opts =
105
+ Array.isArray(extension) && extension[1] ? extension[1] : { locales: {} };
106
+
107
+ if (ext.callbacks?.fileChanged) {
108
+ await ext.callbacks.fileChanged(opts);
109
+ }
110
+ }
111
+
112
+ // a directory has been changed
113
+ if (
114
+ triggeredEvents.some(
115
+ ({ changedPath }) =>
116
+ fs.existsSync(changedPath) && fs.lstatSync(changedPath).isDirectory(),
117
+ )
118
+ ) {
119
+ await setState({
120
+ sourceTree: true,
121
+ fileContents: true,
122
+ menu: true,
123
+ partials: true,
124
+ });
125
+
126
+ changeFileCallback(true, true);
127
+ }
128
+
129
+ // removed a directory or file
130
+ else if (triggeredEventsIncludes(triggeredEvents, ["remove"])) {
131
+ await setState({
132
+ sourceTree: true,
133
+ fileContents: await updateFileContents(triggeredEvents),
134
+ menu: true,
135
+ partials: true,
136
+ });
137
+
138
+ changeFileCallback(true, true);
139
+ // updated file is a template file
140
+ } else if (
141
+ triggeredEvents.filter((event) =>
142
+ helpers.fileIsTemplateFile(event.changedPath),
143
+ ).length > 0
144
+ ) {
145
+ if (
146
+ Object.keys(global.state.partials).includes(
147
+ triggeredEvents[0].changedPath.replace(
148
+ path.join(global.config.components.folder, "/"),
149
+ "",
150
+ ),
151
+ )
152
+ ) {
153
+ // updated
154
+ await setState({
155
+ fileContents: await updateFileContents(triggeredEvents),
156
+ });
157
+
158
+ changeFileCallback(true, false);
159
+ } else {
160
+ // added
161
+ await setState({
162
+ fileContents: await updateFileContents(triggeredEvents),
163
+ sourceTree: true,
164
+ menu: true,
165
+ partials: true,
166
+ });
167
+
168
+ changeFileCallback(true, true);
169
+ }
170
+ // updated file is a mock file
171
+ } else if (
172
+ triggeredEvents.some(({ changedPath }) =>
173
+ helpers.fileIsDataFile(changedPath),
174
+ )
175
+ ) {
176
+ const hasBeenAdded = !Object.keys(global.state.fileContents).includes(
177
+ path.join(process.cwd(), triggeredEvents[0].changedPath),
178
+ );
179
+
180
+ await setState({
181
+ fileContents: await updateFileContents(triggeredEvents),
182
+ sourceTree: hasBeenAdded,
183
+ menu: true,
184
+ });
185
+
186
+ changeFileCallback(true, true);
187
+ // updated file is a doc file
188
+ } else if (
189
+ triggeredEvents.some(({ changedPath }) =>
190
+ helpers.fileIsDocumentationFile(changedPath),
191
+ )
192
+ ) {
193
+ const hasBeenAdded = !Object.keys(global.state.fileContents).includes(
194
+ path.join(process.cwd(), triggeredEvents[0].changedPath),
195
+ );
196
+
197
+ await setState({
198
+ fileContents: await updateFileContents(triggeredEvents),
199
+ sourceTree: hasBeenAdded,
200
+ menu: hasBeenAdded,
201
+ });
202
+
203
+ changeFileCallback(true, hasBeenAdded);
204
+ // updated file is a schema file
205
+ } else if (
206
+ triggeredEvents.some(({ changedPath }) =>
207
+ helpers.fileIsSchemaFile(changedPath),
208
+ )
209
+ ) {
210
+ await setState({
211
+ fileContents: await updateFileContents(triggeredEvents),
212
+ });
213
+
214
+ changeFileCallback(true, false);
215
+ // updated file is an asset file
216
+ } else if (
217
+ triggeredEvents.some(({ changedPath }) =>
218
+ helpers.fileIsAssetFile(changedPath),
219
+ )
220
+ ) {
221
+ if (global.config.ui.reloadAfterChanges.componentAssets) {
222
+ changeFileCallback(true, false);
223
+ }
224
+ // updated file is a css file
225
+ } else if (
226
+ triggeredEvents.find(({ changedPath }) => {
227
+ return changedPath.endsWith(".css");
228
+ })
229
+ ) {
230
+ // updated file contains custom properties for the styleguide
231
+ if (
232
+ triggeredEvents.find(({ changedPath }) => {
233
+ return global.config.assets.customProperties.files.includes(
234
+ changedPath,
235
+ );
236
+ })
237
+ ) {
238
+ await setState({
239
+ css: true,
240
+ });
241
+ } else {
242
+ await setState({
243
+ menu: true,
244
+ });
245
+ }
246
+
247
+ if (global.config.ui.reloadAfterChanges.componentAssets) {
248
+ changeFileCallback(true, false);
249
+ }
250
+ // updated file is a js file
251
+ } else if (
252
+ triggeredEvents.find(({ changedPath }) => {
253
+ return changedPath.endsWith(".js");
254
+ })
255
+ ) {
256
+ await setState({
257
+ menu: true,
258
+ });
259
+
260
+ if (global.config.ui.reloadAfterChanges.componentAssets) {
261
+ changeFileCallback(true, false);
262
+ }
263
+ } else {
264
+ await setState({
265
+ sourceTree: true,
266
+ fileContents: true,
267
+ menu: true,
268
+ partials: true,
269
+ });
270
+
271
+ changeFileCallback(true, true);
272
+ }
273
+ }
274
+
275
+ const sockets = [];
276
+
277
+ /**
278
+ * @param {object} server
279
+ */
280
+ export default function Watcher(server) {
281
+ const wss = new WebSocketServer({ noServer: true });
282
+
283
+ wss.on("connection", function open(ws) {
284
+ sockets.push(ws);
285
+ });
286
+
287
+ server.on("upgrade", (request, socket, head) => {
288
+ wss.handleUpgrade(request, socket, head, (ws) => {
289
+ wss.emit("connection", ws, request);
290
+ });
291
+ });
292
+
293
+ const { components, docs, assets, extensions } = global.config;
294
+
295
+ const foldersToWatch = [
296
+ ...assets.folder.map((f) => path.join(global.config.assets.root, f)),
297
+ ...assets.css
298
+ .filter(
299
+ (f) =>
300
+ !f.startsWith("http://") &&
301
+ !f.startsWith("https://") &&
302
+ !f.startsWith("://"),
303
+ )
304
+ .map((f) => path.join(global.config.assets.root, f)),
305
+ ...assets.js
306
+ .map((file) => file.src)
307
+ .filter(
308
+ (f) =>
309
+ !f.startsWith("http://") &&
310
+ !f.startsWith("https://") &&
311
+ !f.startsWith("://"),
312
+ )
313
+ .map((f) => path.join(global.config.assets.root, f)),
314
+ ];
315
+
316
+ if (components.folder) {
317
+ foldersToWatch.push(components.folder);
318
+ }
319
+
320
+ if (docs?.folder && fs.existsSync(docs.folder)) {
321
+ foldersToWatch.push(docs.folder);
322
+ }
323
+
324
+ for (const extension of extensions) {
325
+ const ext = Array.isArray(extension) ? extension[0] : extension;
326
+ const opts =
327
+ Array.isArray(extension) && extension[1] ? extension[1] : { locales: {} };
328
+
329
+ if (ext.extendWatcher) {
330
+ const watch = ext.extendWatcher(opts);
331
+ foldersToWatch.push(path.join(watch.folder, watch.lang));
332
+ }
333
+ }
334
+
335
+ if (global.config.userFileName && global.config.ui.watchConfigFile) {
336
+ fs.watch(global.config.userFileName, async (eventType) => {
337
+ if (eventType === "change") {
338
+ configurationFileUpdated();
339
+ }
340
+ });
341
+ }
342
+
343
+ let watcher;
344
+
345
+ try {
346
+ watcher = watch(
347
+ foldersToWatch.filter((folder) => fs.existsSync(folder)),
348
+ {
349
+ recursive: true,
350
+ filter(f, skip) {
351
+ if (anymatch(components.ignores, f)) return skip;
352
+ return true;
353
+ },
354
+ },
355
+ );
356
+ } catch (e) {
357
+ log("error", e);
358
+ }
359
+
360
+ if (watcher) {
361
+ watcher.on("change", (event, changedPath) => {
362
+ triggeredEvents.push({ event, changedPath });
363
+
364
+ if (!timeout) {
365
+ console.clear();
366
+ log("info", t("updatingStarted"));
367
+ timeout = setTimeout(() => {
368
+ timeout = null;
369
+ handleFileChange();
370
+ }, 10);
371
+ }
372
+ });
373
+ } else {
374
+ log("error", t("watchingFilesFailed"));
375
+ }
376
+ }
377
+
378
+ /**
379
+ * @returns {Promise<void>}
380
+ */
381
+ async function configurationFileUpdated() {
382
+ log("info", t("updatingConfiguration"));
383
+
384
+ const config = await getConfig(yargs.argv);
385
+
386
+ if (config) {
387
+ global.config = config;
388
+ await setEngines();
389
+ await setState({
390
+ sourceTree: true,
391
+ menu: true,
392
+ partials: true,
393
+ fileContents: true,
394
+ css: true,
395
+ });
396
+ setStatic();
397
+ setViews();
398
+
399
+ log("success", `${t("updatingConfigurationDone")}\n`);
400
+ changeFileCallback(true, true);
401
+ }
402
+ }
package/lib/logger.js ADDED
@@ -0,0 +1,94 @@
1
+ const COLORS = {
2
+ grey: "\x1b[90m",
3
+ red: "\x1b[31m",
4
+ yellow: "\x1b[33m",
5
+ green: "\x1b[32m",
6
+ cyan: "\x1b[36m",
7
+ white: "\x1b[37m",
8
+ reset: "\x1b[0m",
9
+ };
10
+
11
+ const TYPES = {
12
+ error: { console: "error", label: "Error", color: "red" },
13
+ warn: { console: "warn", label: "Warning", color: "yellow" },
14
+ success: { console: "log", label: "Success", color: "green" },
15
+ info: { console: "info", label: "Info", color: "cyan" },
16
+ };
17
+
18
+ /**
19
+ * @param {string} type
20
+ * @param {string|null} message
21
+ * @param {string|Error} [verboseMessage]
22
+ */
23
+ export default function log(type, message, verboseMessage) {
24
+ if (process.env.MIYAGI_JS_API) return;
25
+ if (!(type in TYPES)) return;
26
+
27
+ const date = new Date();
28
+ const year = date.getFullYear();
29
+ const month = pad(date.getMonth() + 1);
30
+ const day = pad(date.getDate());
31
+ const hours = pad(date.getHours());
32
+ const minutes = pad(date.getMinutes());
33
+ const seconds = pad(date.getSeconds());
34
+ const dateStr = `${year}/${month}/${day} ${hours}:${minutes}:${seconds}`;
35
+ const params = {
36
+ type: TYPES[type].console,
37
+ dateStr,
38
+ color: TYPES[type].color,
39
+ label: TYPES[type].label,
40
+ };
41
+
42
+ if (message) {
43
+ printMessage({
44
+ ...params,
45
+ message,
46
+ });
47
+ }
48
+
49
+ if (process.env.VERBOSE && verboseMessage) {
50
+ if (type === "error") {
51
+ console.error(verboseMessage);
52
+ return;
53
+ }
54
+
55
+ printMessage({
56
+ ...params,
57
+ message: verboseMessage,
58
+ });
59
+ }
60
+ }
61
+
62
+ /**
63
+ * @param {string} color
64
+ * @param {string} str
65
+ * @returns {string}
66
+ */
67
+ function colorize(color, str) {
68
+ return `${COLORS[color]}${str}`;
69
+ }
70
+
71
+ /**
72
+ * @param {number} value
73
+ * @returns {string}
74
+ */
75
+ function pad(value) {
76
+ return value.toString().padStart(2, "0");
77
+ }
78
+
79
+ /**
80
+ * @param {object} o
81
+ * @param {string} o.type
82
+ * @param {string} o.dateStr
83
+ * @param {string} o.color
84
+ * @param {string} o.label
85
+ * @param {string|Error} o.message
86
+ */
87
+ function printMessage({ type, dateStr, color, label, message }) {
88
+ console[type](
89
+ `${colorize("grey", dateStr)} ${colorize(
90
+ color,
91
+ `${label}:`,
92
+ )} ${COLORS.reset}${message}`,
93
+ );
94
+ }
@@ -0,0 +1,111 @@
1
+ import { resolveData } from "./resolve.js";
2
+ import config from "../default-config.js";
3
+ import * as helpers from "../helpers.js";
4
+
5
+ /**
6
+ * @param {object} component
7
+ * @returns {Promise<[]>}
8
+ */
9
+ export const getComponentData = async function getComponentData(component) {
10
+ if (!component) return null;
11
+
12
+ const componentJson = helpers.cloneDeep(
13
+ global.state.fileContents[
14
+ component.paths.mocks.full(global.config.files.mocks.extension[0])
15
+ ] ||
16
+ global.state.fileContents[
17
+ component.paths.mocks.full(global.config.files.mocks.extension[1])
18
+ ],
19
+ );
20
+
21
+ let context = null;
22
+
23
+ if (componentJson) {
24
+ context = [];
25
+ let componentData = helpers.removeInternalKeys(componentJson);
26
+ const rootData = helpers.cloneDeep(componentData);
27
+ const componentVariations = componentJson.$variants;
28
+ let data;
29
+
30
+ if (Object.keys(componentData).length > 0) {
31
+ data = await resolveData(componentData, component);
32
+ } else {
33
+ data = {
34
+ messages: [],
35
+ merged: componentData,
36
+ resolved: componentData,
37
+ };
38
+ }
39
+
40
+ if (componentVariations) {
41
+ let startIndex = context.length;
42
+ for (const [index, variationJson] of componentVariations.entries()) {
43
+ if (variationJson.$name) {
44
+ const variationData = helpers.removeInternalKeys(variationJson);
45
+
46
+ const { messages, merged, resolved } = await resolveData(
47
+ variationData,
48
+ component,
49
+ rootData,
50
+ );
51
+
52
+ context[startIndex + index] = {
53
+ messages,
54
+ component: component.paths.dir.short,
55
+ resolved: resolved,
56
+ raw: merged,
57
+ name: variationJson.$name,
58
+ };
59
+ }
60
+ }
61
+
62
+ if (Object.keys(data.resolved).length > 0) {
63
+ if (!componentJson.$hidden) {
64
+ context.unshift({
65
+ messages: data.messages,
66
+ component: component.paths.dir.short,
67
+ resolved: data.resolved,
68
+ raw: data.merged,
69
+ name: componentJson.$name || config.defaultVariationName,
70
+ });
71
+ }
72
+ }
73
+
74
+ return context.filter((entry) => entry !== null);
75
+ } else {
76
+ if (Object.keys(componentData).length > 0) {
77
+ const { messages, merged, resolved } = await resolveData(
78
+ componentData,
79
+ component,
80
+ );
81
+
82
+ context.unshift({
83
+ messages,
84
+ component: component.paths.dir.short,
85
+ resolved: componentJson.$hidden ? {} : resolved,
86
+ raw: componentJson.$hidden ? {} : merged,
87
+ name: componentJson.$name || config.defaultVariationName,
88
+ });
89
+ }
90
+
91
+ return context;
92
+ }
93
+ }
94
+
95
+ return context;
96
+ };
97
+
98
+ export const getVariationData = async function getVariationData(
99
+ component,
100
+ variation,
101
+ ) {
102
+ const data = await getComponentData(component);
103
+
104
+ return (
105
+ data?.filter(
106
+ (entry) =>
107
+ entry.name.toLowerCase().replaceAll(" ", "-") ===
108
+ variation.toLowerCase().replaceAll(" ", "-"),
109
+ )[0] ?? null
110
+ );
111
+ };
@@ -0,0 +1,9 @@
1
+ import {
2
+ getComponentData as getComponentDataImport,
3
+ getVariationData as getVariationDataImport,
4
+ } from "./get.js";
5
+ import { resolveData as resolveDataImport } from "./resolve.js";
6
+
7
+ export const getComponentData = getComponentDataImport;
8
+ export const getVariationData = getVariationDataImport;
9
+ export const resolveData = resolveDataImport;