@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.
- package/LICENSE.md +21 -0
- package/README.md +43 -0
- package/api/app.js +39 -0
- package/api/index.js +236 -0
- package/bin/miyagi.js +2 -0
- package/dist/css/iframe.css +31 -0
- package/dist/css/main.css +1 -0
- package/dist/js/_iframe-links-DdifIr4P.js +1 -0
- package/dist/js/_mock-data-Dypo4Bl_.js +1 -0
- package/dist/js/_prism-By3NMwUd.js +1 -0
- package/dist/js/iframe.build.js +1 -0
- package/dist/js/iframe.js +1 -0
- package/dist/js/index-BKDKaBC6.js +1 -0
- package/dist/js/jsontree.js +1 -0
- package/dist/js/main.build.js +1 -0
- package/dist/js/main.js +1 -0
- package/frontend/assets/css/iframe/accordion-tabs.css +77 -0
- package/frontend/assets/css/iframe/jsontree.js.css +325 -0
- package/frontend/assets/css/iframe/prism.css +132 -0
- package/frontend/assets/css/iframe/styleguide/colors.css +61 -0
- package/frontend/assets/css/iframe/styleguide/fonts.css +37 -0
- package/frontend/assets/css/iframe/styleguide/index.css +109 -0
- package/frontend/assets/css/iframe/styleguide/spacings.css +21 -0
- package/frontend/assets/css/iframe.css +410 -0
- package/frontend/assets/css/main/menu/config-switcher.css +49 -0
- package/frontend/assets/css/main/menu/config-switchers.css +67 -0
- package/frontend/assets/css/main/menu/goto.css +24 -0
- package/frontend/assets/css/main/menu/nav.css +113 -0
- package/frontend/assets/css/main/menu/search.css +64 -0
- package/frontend/assets/css/main/menu/title.css +40 -0
- package/frontend/assets/css/main/menu.css +114 -0
- package/frontend/assets/css/main/reset.css +217 -0
- package/frontend/assets/css/main.css +71 -0
- package/frontend/assets/css/shared.css +34 -0
- package/frontend/assets/css/tokens.css +112 -0
- package/frontend/assets/favicon.ico +0 -0
- package/frontend/assets/js/_accordion-tabs.js +403 -0
- package/frontend/assets/js/_goto.js +63 -0
- package/frontend/assets/js/_iframe-links.js +19 -0
- package/frontend/assets/js/_is-triggered.js +15 -0
- package/frontend/assets/js/_main.js +379 -0
- package/frontend/assets/js/_mock-data.js +13 -0
- package/frontend/assets/js/_prism.js +1098 -0
- package/frontend/assets/js/_search.js +190 -0
- package/frontend/assets/js/_socket.js +9 -0
- package/frontend/assets/js/config-switcher/development-mode.js +49 -0
- package/frontend/assets/js/config-switcher/index.js +63 -0
- package/frontend/assets/js/config-switcher/text-direction.js +30 -0
- package/frontend/assets/js/config-switcher/theme.js +87 -0
- package/frontend/assets/js/iframe.build.js +43 -0
- package/frontend/assets/js/iframe.js +52 -0
- package/frontend/assets/js/jsontree.js +979 -0
- package/frontend/assets/js/main.build.js +40 -0
- package/frontend/assets/js/main.js +42 -0
- package/frontend/assets/js/styleguide/color-converter.js +741 -0
- package/frontend/assets/js/styleguide/index.js +119 -0
- package/frontend/views/component_variation.twig.miyagi +57 -0
- package/frontend/views/design-tokens/colors.twig.miyagi +43 -0
- package/frontend/views/design-tokens/sizes.twig.miyagi +35 -0
- package/frontend/views/design-tokens/typography.twig.miyagi +38 -0
- package/frontend/views/iframe_component.twig.miyagi +141 -0
- package/frontend/views/iframe_component_variation.twig.miyagi +55 -0
- package/frontend/views/iframe_index.twig.miyagi +14 -0
- package/frontend/views/layouts/iframe_default.twig.miyagi +22 -0
- package/frontend/views/main.twig.miyagi +24 -0
- package/frontend/views/menu/config-switchers.twig.miyagi +83 -0
- package/frontend/views/menu/goto.twig.miyagi +9 -0
- package/frontend/views/menu/menu.twig.miyagi +21 -0
- package/frontend/views/menu/nav.twig.miyagi +95 -0
- package/frontend/views/menu/search.twig.miyagi +13 -0
- package/frontend/views/menu/title.twig.miyagi +24 -0
- package/index.js +3 -0
- package/lib/build/index.js +1020 -0
- package/lib/cli/app.js +38 -0
- package/lib/cli/component.js +56 -0
- package/lib/cli/index.js +5 -0
- package/lib/cli/lint.js +180 -0
- package/lib/config.js +74 -0
- package/lib/default-config.js +105 -0
- package/lib/generator/component.js +199 -0
- package/lib/generator/mocks.js +201 -0
- package/lib/helpers.js +184 -0
- package/lib/i18n/en.js +91 -0
- package/lib/i18n/index.js +17 -0
- package/lib/index.js +166 -0
- package/lib/init/args.js +55 -0
- package/lib/init/config.js +330 -0
- package/lib/init/engines.js +65 -0
- package/lib/init/index.js +102 -0
- package/lib/init/rendering.js +12 -0
- package/lib/init/router.js +249 -0
- package/lib/init/static.js +133 -0
- package/lib/init/twing/cache.js +34 -0
- package/lib/init/twing/functions.js +51 -0
- package/lib/init/views.js +19 -0
- package/lib/init/watcher.js +402 -0
- package/lib/logger.js +94 -0
- package/lib/mocks/get.js +111 -0
- package/lib/mocks/index.js +9 -0
- package/lib/mocks/resolve/ref.js +484 -0
- package/lib/mocks/resolve/tpl.js +246 -0
- package/lib/mocks/resolve.js +205 -0
- package/lib/render/helpers.js +51 -0
- package/lib/render/index.js +38 -0
- package/lib/render/views/iframe/component.docs.js +77 -0
- package/lib/render/views/iframe/component.js +338 -0
- package/lib/render/views/iframe/design-tokens/colors.js +52 -0
- package/lib/render/views/iframe/design-tokens/index.js +9 -0
- package/lib/render/views/iframe/design-tokens/sizes.js +49 -0
- package/lib/render/views/iframe/design-tokens/typography.js +52 -0
- package/lib/render/views/iframe/docs.js +68 -0
- package/lib/render/views/iframe/index.js +44 -0
- package/lib/render/views/iframe/variation.js +116 -0
- package/lib/render/views/iframe/variation.standalone.js +89 -0
- package/lib/render/views/main/component.docs.js +53 -0
- package/lib/render/views/main/component.js +74 -0
- package/lib/render/views/main/design-tokens.js +53 -0
- package/lib/render/views/main/docs.js +47 -0
- package/lib/render/views/main/index.js +46 -0
- package/lib/state/components.js +132 -0
- package/lib/state/css.js +50 -0
- package/lib/state/docs.js +111 -0
- package/lib/state/file-contents.js +207 -0
- package/lib/state/helpers.js +86 -0
- package/lib/state/index.js +56 -0
- package/lib/state/menu/index.js +275 -0
- package/lib/state/menu/structure.js +146 -0
- package/lib/state/partials.js +23 -0
- package/lib/state/source-tree.js +75 -0
- package/lib/styleguide/color-names.js +150 -0
- package/lib/styleguide/colors.js +135 -0
- package/lib/styleguide/helpers.js +37 -0
- package/lib/styleguide/index.js +17 -0
- package/lib/styleguide/media-queries.js +26 -0
- package/lib/styleguide/spacings.js +35 -0
- package/lib/styleguide/typography.js +61 -0
- package/lib/validator/mocks.js +105 -0
- 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
|
+
}
|
package/lib/mocks/get.js
ADDED
|
@@ -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;
|