svelteesp32 3.0.2 → 3.1.1
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/README.md +38 -37
- package/dist/commandLine.js +9 -9
- package/dist/cppCode.d.ts +49 -0
- package/dist/cppCode.js +107 -985
- package/dist/cppCodeAsync.d.ts +2 -0
- package/dist/cppCodeAsync.js +101 -0
- package/dist/cppCodeEspIdf.d.ts +2 -1
- package/dist/cppCodeEspIdf.js +172 -266
- package/dist/cppCodePsychic.d.ts +2 -0
- package/dist/cppCodePsychic.js +105 -0
- package/dist/cppCodeWebserver.d.ts +2 -0
- package/dist/cppCodeWebserver.js +118 -0
- package/dist/file.js +16 -19
- package/dist/index.js +2 -0
- package/dist/pipeline.js +34 -2
- package/package.json +7 -10
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.genPsychicCpp = void 0;
|
|
4
|
+
const cppCode_1 = require("./cppCode");
|
|
5
|
+
const genPsychicHandlerBody = (d, source, path) => {
|
|
6
|
+
const lines = [];
|
|
7
|
+
const etagCheck = (0, cppCode_1.sw)(d.etag, {
|
|
8
|
+
always: [
|
|
9
|
+
` if (request->hasHeader("If-None-Match") && request->header("If-None-Match").equals(etag_${source.dataname})) {`,
|
|
10
|
+
` response->setCode(304);`,
|
|
11
|
+
` ${d.definePrefix}_onFileServed("${path}", 304);`,
|
|
12
|
+
` return response->send();`,
|
|
13
|
+
` }`
|
|
14
|
+
].join('\n'),
|
|
15
|
+
compiler: [
|
|
16
|
+
` #ifdef ${d.definePrefix}_ENABLE_ETAG`,
|
|
17
|
+
` if (request->hasHeader("If-None-Match") && request->header("If-None-Match").equals(etag_${source.dataname})) {`,
|
|
18
|
+
` response->setCode(304);`,
|
|
19
|
+
` ${d.definePrefix}_onFileServed("${path}", 304);`,
|
|
20
|
+
` return response->send();`,
|
|
21
|
+
` }`,
|
|
22
|
+
` #endif`
|
|
23
|
+
].join('\n')
|
|
24
|
+
});
|
|
25
|
+
if (etagCheck)
|
|
26
|
+
lines.push(etagCheck);
|
|
27
|
+
lines.push(` response->setContentType("${source.mime}");`);
|
|
28
|
+
const gzipEncoding = (0, cppCode_1.sw)(d.gzip, {
|
|
29
|
+
always: source.isGzip ? ` response->addHeader("Content-Encoding", "gzip");` : '',
|
|
30
|
+
compiler: source.isGzip
|
|
31
|
+
? [
|
|
32
|
+
` #ifdef ${d.definePrefix}_ENABLE_GZIP`,
|
|
33
|
+
` response->addHeader("Content-Encoding", "gzip");`,
|
|
34
|
+
` #endif`
|
|
35
|
+
].join('\n')
|
|
36
|
+
: ''
|
|
37
|
+
});
|
|
38
|
+
if (gzipEncoding)
|
|
39
|
+
lines.push(gzipEncoding);
|
|
40
|
+
const cacheHeaders = (0, cppCode_1.sw)(d.etag, {
|
|
41
|
+
always: [
|
|
42
|
+
` response->addHeader("Cache-Control", "${(0, cppCode_1.cacheCtrl)(source)}");`,
|
|
43
|
+
` response->addHeader("ETag", etag_${source.dataname});`
|
|
44
|
+
].join('\n'),
|
|
45
|
+
compiler: [
|
|
46
|
+
` #ifdef ${d.definePrefix}_ENABLE_ETAG`,
|
|
47
|
+
` response->addHeader("Cache-Control", "${(0, cppCode_1.cacheCtrl)(source)}");`,
|
|
48
|
+
` response->addHeader("ETag", etag_${source.dataname});`,
|
|
49
|
+
` #endif`
|
|
50
|
+
].join('\n')
|
|
51
|
+
});
|
|
52
|
+
if (cacheHeaders)
|
|
53
|
+
lines.push(cacheHeaders);
|
|
54
|
+
lines.push((0, cppCode_1.sw)(d.gzip, {
|
|
55
|
+
always: ` response->setContent(datagzip_${source.dataname}, ${source.lengthGzip});`,
|
|
56
|
+
never: ` response->setContent(data_${source.dataname}, ${source.length});`,
|
|
57
|
+
compiler: [
|
|
58
|
+
` #ifdef ${d.definePrefix}_ENABLE_GZIP`,
|
|
59
|
+
` response->setContent(datagzip_${source.dataname}, ${source.lengthGzip});`,
|
|
60
|
+
` #else`,
|
|
61
|
+
` response->setContent(data_${source.dataname}, ${source.length});`,
|
|
62
|
+
` #endif`
|
|
63
|
+
].join('\n')
|
|
64
|
+
}), ` ${d.definePrefix}_onFileServed("${path}", 200);`, ` return response->send();`);
|
|
65
|
+
return lines.join('\n');
|
|
66
|
+
};
|
|
67
|
+
const genPsychicCpp = (d) => {
|
|
68
|
+
const lines = [
|
|
69
|
+
`//engine: PsychicHttpServer`,
|
|
70
|
+
`//config: ${d.config}`,
|
|
71
|
+
...(d.created ? [`//created: ${d.now}`] : []),
|
|
72
|
+
'//',
|
|
73
|
+
(0, cppCode_1.genCommonHeader)(d),
|
|
74
|
+
'//',
|
|
75
|
+
'#include <Arduino.h>',
|
|
76
|
+
'#include <PsychicHttp.h>',
|
|
77
|
+
'#include <PsychicHttpsServer.h>',
|
|
78
|
+
'//',
|
|
79
|
+
(0, cppCode_1.genDataArrays)(d, false),
|
|
80
|
+
'//',
|
|
81
|
+
(0, cppCode_1.genEtagArrays)(d),
|
|
82
|
+
'//',
|
|
83
|
+
(0, cppCode_1.genManifest)(d),
|
|
84
|
+
'//',
|
|
85
|
+
(0, cppCode_1.genHook)(d),
|
|
86
|
+
'//',
|
|
87
|
+
'// Http Handlers',
|
|
88
|
+
`void ${d.methodName}(PsychicHttpServer * server) {`
|
|
89
|
+
];
|
|
90
|
+
for (const source of d.sources) {
|
|
91
|
+
const path = `${d.basePath}/${source.filename}`;
|
|
92
|
+
const serverPrefix = source.isDefault && !d.basePath ? 'server->defaultEndpoint = ' : '';
|
|
93
|
+
lines.push('//', `// ${source.filename}`, ` ${serverPrefix}server->on("${path}", HTTP_GET, [](PsychicRequest * request, PsychicResponse * response) {`, genPsychicHandlerBody(d, source, path), ` });`);
|
|
94
|
+
if (source.isDefault && d.basePath)
|
|
95
|
+
lines.push('//', `// ${source.filename} (base path route)`, ` server->on("${d.basePath}", HTTP_GET, [](PsychicRequest * request, PsychicResponse * response) {`, genPsychicHandlerBody(d, source, d.basePath), ` });`);
|
|
96
|
+
}
|
|
97
|
+
if (d.spa && d.spaSource && d.basePath) {
|
|
98
|
+
const source = d.spaSource;
|
|
99
|
+
const path = `${d.basePath}/${source.filename}`;
|
|
100
|
+
lines.push('//', `// SPA catch-all: unmatched routes serve ${source.filename}`, ` server->on("${d.basePath}/*", HTTP_GET, [](PsychicRequest * request, PsychicResponse * response) {`, genPsychicHandlerBody(d, source, path), ` });`);
|
|
101
|
+
}
|
|
102
|
+
lines.push('}');
|
|
103
|
+
return lines.join('\n');
|
|
104
|
+
};
|
|
105
|
+
exports.genPsychicCpp = genPsychicCpp;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.genWebserverCpp = void 0;
|
|
4
|
+
const cppCode_1 = require("./cppCode");
|
|
5
|
+
const genWebserverHandlerBody = (d, source, path) => {
|
|
6
|
+
const lines = [];
|
|
7
|
+
const etagCheck = (0, cppCode_1.sw)(d.etag, {
|
|
8
|
+
always: [
|
|
9
|
+
` if (server->hasHeader("If-None-Match") && server->header("If-None-Match").equals(etag_${source.dataname})) {`,
|
|
10
|
+
` server->send(304);`,
|
|
11
|
+
` ${d.definePrefix}_onFileServed("${path}", 304);`,
|
|
12
|
+
` return;`,
|
|
13
|
+
` }`
|
|
14
|
+
].join('\n'),
|
|
15
|
+
compiler: [
|
|
16
|
+
` #ifdef ${d.definePrefix}_ENABLE_ETAG`,
|
|
17
|
+
` if (server->hasHeader("If-None-Match") && server->header("If-None-Match").equals(etag_${source.dataname})) {`,
|
|
18
|
+
` server->send(304);`,
|
|
19
|
+
` ${d.definePrefix}_onFileServed("${path}", 304);`,
|
|
20
|
+
` return;`,
|
|
21
|
+
` }`,
|
|
22
|
+
` #endif`
|
|
23
|
+
].join('\n')
|
|
24
|
+
});
|
|
25
|
+
if (etagCheck)
|
|
26
|
+
lines.push(etagCheck);
|
|
27
|
+
const cacheHeaders = (0, cppCode_1.sw)(d.etag, {
|
|
28
|
+
always: [
|
|
29
|
+
` server->sendHeader("Cache-Control", "${(0, cppCode_1.cacheCtrl)(source)}");`,
|
|
30
|
+
` server->sendHeader("ETag", etag_${source.dataname});`
|
|
31
|
+
].join('\n'),
|
|
32
|
+
compiler: [
|
|
33
|
+
` #ifdef ${d.definePrefix}_ENABLE_ETAG`,
|
|
34
|
+
` server->sendHeader("Cache-Control", "${(0, cppCode_1.cacheCtrl)(source)}");`,
|
|
35
|
+
` server->sendHeader("ETag", etag_${source.dataname});`,
|
|
36
|
+
` #endif`
|
|
37
|
+
].join('\n')
|
|
38
|
+
});
|
|
39
|
+
if (cacheHeaders)
|
|
40
|
+
lines.push(cacheHeaders);
|
|
41
|
+
lines.push((0, cppCode_1.sw)(d.gzip, {
|
|
42
|
+
always: [
|
|
43
|
+
...(source.isGzip ? [` server->sendHeader("Content-Encoding", "gzip");`] : []),
|
|
44
|
+
` server->setContentLength(${source.lengthGzip});`,
|
|
45
|
+
` server->send(200, "${source.mime}", "");`,
|
|
46
|
+
` ${d.definePrefix}_sendChunked(server, datagzip_${source.dataname}, ${source.lengthGzip});`
|
|
47
|
+
].join('\n'),
|
|
48
|
+
never: [
|
|
49
|
+
` server->setContentLength(${source.length});`,
|
|
50
|
+
` server->send(200, "${source.mime}", "");`,
|
|
51
|
+
` ${d.definePrefix}_sendChunked(server, data_${source.dataname}, ${source.length});`
|
|
52
|
+
].join('\n'),
|
|
53
|
+
compiler: [
|
|
54
|
+
` #ifdef ${d.definePrefix}_ENABLE_GZIP`,
|
|
55
|
+
...(source.isGzip ? [` server->sendHeader("Content-Encoding", "gzip");`] : []),
|
|
56
|
+
` server->setContentLength(${source.lengthGzip});`,
|
|
57
|
+
` server->send(200, "${source.mime}", "");`,
|
|
58
|
+
` ${d.definePrefix}_sendChunked(server, datagzip_${source.dataname}, ${source.lengthGzip});`,
|
|
59
|
+
` #else`,
|
|
60
|
+
` server->setContentLength(${source.length});`,
|
|
61
|
+
` server->send(200, "${source.mime}", "");`,
|
|
62
|
+
` ${d.definePrefix}_sendChunked(server, data_${source.dataname}, ${source.length});`,
|
|
63
|
+
` #endif`
|
|
64
|
+
].join('\n')
|
|
65
|
+
}), ` ${d.definePrefix}_onFileServed("${path}", 200);`);
|
|
66
|
+
return lines.join('\n');
|
|
67
|
+
};
|
|
68
|
+
const genWebserverCpp = (d) => {
|
|
69
|
+
const lines = [
|
|
70
|
+
`//engine: Arduino WebServer`,
|
|
71
|
+
`//config: ${d.config}`,
|
|
72
|
+
...(d.created ? [`//created: ${d.now}`] : []),
|
|
73
|
+
'//',
|
|
74
|
+
(0, cppCode_1.genCommonHeader)(d),
|
|
75
|
+
'//',
|
|
76
|
+
'#include <Arduino.h>',
|
|
77
|
+
'#include <WebServer.h>',
|
|
78
|
+
'//',
|
|
79
|
+
(0, cppCode_1.genDataArrays)(d, true),
|
|
80
|
+
'//',
|
|
81
|
+
(0, cppCode_1.genEtagArrays)(d),
|
|
82
|
+
'//',
|
|
83
|
+
(0, cppCode_1.genManifest)(d),
|
|
84
|
+
'//',
|
|
85
|
+
(0, cppCode_1.genHook)(d),
|
|
86
|
+
'//',
|
|
87
|
+
`// Chunked send helper for PROGMEM data`,
|
|
88
|
+
`static inline void ${d.definePrefix}_sendChunked(WebServer * server, const uint8_t * data, size_t len) {`,
|
|
89
|
+
` const size_t chunkSize = 4096;`,
|
|
90
|
+
` for (size_t offset = 0; offset < len; offset += chunkSize) {`,
|
|
91
|
+
` size_t remaining = len - offset;`,
|
|
92
|
+
` size_t toSend = remaining < chunkSize ? remaining : chunkSize;`,
|
|
93
|
+
` server->sendContent_P((const char *)(data + offset), toSend);`,
|
|
94
|
+
` }`,
|
|
95
|
+
`}`,
|
|
96
|
+
'//',
|
|
97
|
+
'// Http Handlers',
|
|
98
|
+
`void ${d.methodName}(WebServer * server) {`
|
|
99
|
+
];
|
|
100
|
+
for (const source of d.sources) {
|
|
101
|
+
const path = `${d.basePath}/${source.filename}`;
|
|
102
|
+
const defaultPath = d.basePath || '/';
|
|
103
|
+
lines.push('//', `// ${source.filename}`, ` server->on("${path}", HTTP_GET, [server]() {`, genWebserverHandlerBody(d, source, path), ` });`);
|
|
104
|
+
if (source.isDefault)
|
|
105
|
+
lines.push(` server->on("${defaultPath}", HTTP_GET, [server]() {`, genWebserverHandlerBody(d, source, defaultPath), ` });`);
|
|
106
|
+
}
|
|
107
|
+
if (d.spa && d.spaSource) {
|
|
108
|
+
const source = d.spaSource;
|
|
109
|
+
const path = `${d.basePath}/${source.filename}`;
|
|
110
|
+
lines.push('//', `// SPA catch-all: unmatched routes serve ${source.filename}`, ` server->onNotFound([server]() {`, ` if (server->method() != HTTP_GET) { server->send(404, "text/plain", "Not found"); return; }`);
|
|
111
|
+
if (d.basePath)
|
|
112
|
+
lines.push(` if (!server->uri().startsWith("${d.basePath}/") && server->uri() != "${d.basePath}") { server->send(404, "text/plain", "Not found"); return; }`);
|
|
113
|
+
lines.push(genWebserverHandlerBody(d, source, path), ` });`);
|
|
114
|
+
}
|
|
115
|
+
lines.push('}');
|
|
116
|
+
return lines.join('\n');
|
|
117
|
+
};
|
|
118
|
+
exports.genWebserverCpp = genWebserverCpp;
|
package/dist/file.js
CHANGED
|
@@ -7,7 +7,6 @@ exports.getFiles = void 0;
|
|
|
7
7
|
const node_crypto_1 = require("node:crypto");
|
|
8
8
|
const node_fs_1 = require("node:fs");
|
|
9
9
|
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
-
const picomatch_1 = __importDefault(require("picomatch"));
|
|
11
10
|
const tinyglobby_1 = require("tinyglobby");
|
|
12
11
|
const consoleColor_1 = require("./consoleColor");
|
|
13
12
|
const errorMessages_1 = require("./errorMessages");
|
|
@@ -38,17 +37,6 @@ const shouldSkipFile = (filename, allFilenames) => {
|
|
|
38
37
|
}
|
|
39
38
|
return false;
|
|
40
39
|
};
|
|
41
|
-
const isExcluded = (filename, excludePatterns) => {
|
|
42
|
-
if (excludePatterns.length === 0)
|
|
43
|
-
return false;
|
|
44
|
-
const normalizedFilename = filename.replace(/\\/g, '/');
|
|
45
|
-
const isMatch = (0, picomatch_1.default)(excludePatterns, {
|
|
46
|
-
dot: true,
|
|
47
|
-
noglobstar: false,
|
|
48
|
-
matchBase: false
|
|
49
|
-
});
|
|
50
|
-
return isMatch(normalizedFilename);
|
|
51
|
-
};
|
|
52
40
|
const getFiles = (options) => {
|
|
53
41
|
const allFilenames = (0, tinyglobby_1.globSync)('**/*', {
|
|
54
42
|
cwd: options.sourcepath,
|
|
@@ -59,13 +47,22 @@ const getFiles = (options) => {
|
|
|
59
47
|
const withoutCompressed = allFilenames.filter((filename) => !shouldSkipFile(filename, allFilenames));
|
|
60
48
|
const excludePatterns = options.exclude;
|
|
61
49
|
const excludedFiles = [];
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
50
|
+
let filenames = withoutCompressed;
|
|
51
|
+
if (excludePatterns.length > 0) {
|
|
52
|
+
const allowedSet = new Set((0, tinyglobby_1.globSync)('**/*', {
|
|
53
|
+
cwd: options.sourcepath,
|
|
54
|
+
onlyFiles: true,
|
|
55
|
+
dot: false,
|
|
56
|
+
followSymbolicLinks: false,
|
|
57
|
+
ignore: excludePatterns
|
|
58
|
+
}));
|
|
59
|
+
filenames = [];
|
|
60
|
+
for (const filename of withoutCompressed)
|
|
61
|
+
if (allowedSet.has(filename))
|
|
62
|
+
filenames.push(filename);
|
|
63
|
+
else
|
|
64
|
+
excludedFiles.push(filename);
|
|
65
|
+
}
|
|
69
66
|
if (excludedFiles.length > 0) {
|
|
70
67
|
console.log(`\nExcluded ${excludedFiles.length} file(s):`);
|
|
71
68
|
const displayLimit = 10;
|
package/dist/index.js
CHANGED
|
@@ -40,3 +40,5 @@ Object.defineProperty(exports, "formatSize", { enumerable: true, get: function (
|
|
|
40
40
|
Object.defineProperty(exports, "formatSizePrecise", { enumerable: true, get: function () { return pipeline_2.formatSizePrecise; } });
|
|
41
41
|
Object.defineProperty(exports, "shouldUseGzip", { enumerable: true, get: function () { return pipeline_2.shouldUseGzip; } });
|
|
42
42
|
Object.defineProperty(exports, "updateExtensionGroup", { enumerable: true, get: function () { return pipeline_2.updateExtensionGroup; } });
|
|
43
|
+
if (require.main === module)
|
|
44
|
+
main();
|
package/dist/pipeline.js
CHANGED
|
@@ -8,11 +8,43 @@ exports.runPipeline = runPipeline;
|
|
|
8
8
|
const node_fs_1 = require("node:fs");
|
|
9
9
|
const node_path_1 = __importDefault(require("node:path"));
|
|
10
10
|
const node_zlib_1 = require("node:zlib");
|
|
11
|
-
const mime_types_1 = require("mime-types");
|
|
12
11
|
const consoleColor_1 = require("./consoleColor");
|
|
13
12
|
const cppCode_1 = require("./cppCode");
|
|
14
13
|
const errorMessages_1 = require("./errorMessages");
|
|
15
14
|
const file_1 = require("./file");
|
|
15
|
+
const MIME_TYPES = {
|
|
16
|
+
html: 'text/html',
|
|
17
|
+
htm: 'text/html',
|
|
18
|
+
css: 'text/css',
|
|
19
|
+
js: 'text/javascript',
|
|
20
|
+
mjs: 'text/javascript',
|
|
21
|
+
json: 'application/json',
|
|
22
|
+
png: 'image/png',
|
|
23
|
+
jpg: 'image/jpeg',
|
|
24
|
+
jpeg: 'image/jpeg',
|
|
25
|
+
gif: 'image/gif',
|
|
26
|
+
svg: 'image/svg+xml',
|
|
27
|
+
ico: 'image/x-icon',
|
|
28
|
+
webp: 'image/webp',
|
|
29
|
+
woff: 'font/woff',
|
|
30
|
+
woff2: 'font/woff2',
|
|
31
|
+
ttf: 'font/ttf',
|
|
32
|
+
otf: 'font/otf',
|
|
33
|
+
eot: 'application/vnd.ms-fontobject',
|
|
34
|
+
mp3: 'audio/mpeg',
|
|
35
|
+
wav: 'audio/wav',
|
|
36
|
+
mp4: 'video/mp4',
|
|
37
|
+
webm: 'video/webm',
|
|
38
|
+
ogg: 'audio/ogg',
|
|
39
|
+
txt: 'text/plain',
|
|
40
|
+
xml: 'application/xml',
|
|
41
|
+
pdf: 'application/pdf',
|
|
42
|
+
map: 'application/json'
|
|
43
|
+
};
|
|
44
|
+
const mimeLookup = (filename) => {
|
|
45
|
+
const extension = node_path_1.default.extname(filename).slice(1).toLowerCase();
|
|
46
|
+
return MIME_TYPES[extension] ?? false;
|
|
47
|
+
};
|
|
16
48
|
const GZIP_MIN_SIZE = 1024;
|
|
17
49
|
const GZIP_MIN_REDUCTION_RATIO = 0.85;
|
|
18
50
|
const shouldUseGzip = (originalSize, compressedSize) => originalSize > GZIP_MIN_SIZE && compressedSize < originalSize * GZIP_MIN_REDUCTION_RATIO;
|
|
@@ -194,7 +226,7 @@ function runPipeline(options) {
|
|
|
194
226
|
const longestFilename = [...files.keys()].reduce((p, c) => Math.max(c.length, p), 0);
|
|
195
227
|
for (const [originalFilename, fileData] of files) {
|
|
196
228
|
const { content, hash: sha256 } = fileData;
|
|
197
|
-
const rawMime = (
|
|
229
|
+
const rawMime = mimeLookup(originalFilename);
|
|
198
230
|
if (!rawMime)
|
|
199
231
|
console.log((0, consoleColor_1.yellowLog)(` [${originalFilename}] unknown MIME type for extension '${node_path_1.default.extname(originalFilename)}', using text/plain`));
|
|
200
232
|
const mimeType = rawMime || 'text/plain';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "svelteesp32",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.1",
|
|
4
4
|
"description": "Convert Svelte (or any frontend) JS application to serve it from ESP32 webserver (PsychicHttp)",
|
|
5
5
|
"author": "BCsabaEngine",
|
|
6
6
|
"license": "ISC",
|
|
@@ -71,12 +71,11 @@
|
|
|
71
71
|
],
|
|
72
72
|
"devDependencies": {
|
|
73
73
|
"@eslint/js": "^10.0.1",
|
|
74
|
-
"@types/
|
|
75
|
-
"@types/node": "^25.6.0",
|
|
74
|
+
"@types/node": "^25.7.0",
|
|
76
75
|
"@types/picomatch": "^4.0.3",
|
|
77
|
-
"@typescript-eslint/eslint-plugin": "^8.59.
|
|
78
|
-
"@typescript-eslint/parser": "^8.59.
|
|
79
|
-
"@vitest/coverage-v8": "^4.1.
|
|
76
|
+
"@typescript-eslint/eslint-plugin": "^8.59.3",
|
|
77
|
+
"@typescript-eslint/parser": "^8.59.3",
|
|
78
|
+
"@vitest/coverage-v8": "^4.1.6",
|
|
80
79
|
"eslint": "^10.3.0",
|
|
81
80
|
"eslint-config-prettier": "^10.1.8",
|
|
82
81
|
"eslint-plugin-simple-import-sort": "^13.0.0",
|
|
@@ -85,9 +84,10 @@
|
|
|
85
84
|
"memfs": "^4.57.2",
|
|
86
85
|
"nodemon": "^3.1.14",
|
|
87
86
|
"prettier": "^3.8.3",
|
|
87
|
+
"ts-node": "^10.9.2",
|
|
88
88
|
"tsx": "^4.21.0",
|
|
89
89
|
"typescript": "^6.0.3",
|
|
90
|
-
"vitest": "^4.1.
|
|
90
|
+
"vitest": "^4.1.6"
|
|
91
91
|
},
|
|
92
92
|
"peerDependencies": {
|
|
93
93
|
"vite": ">=5"
|
|
@@ -98,9 +98,6 @@
|
|
|
98
98
|
}
|
|
99
99
|
},
|
|
100
100
|
"dependencies": {
|
|
101
|
-
"handlebars": "^4.7.9",
|
|
102
|
-
"mime-types": "^3.0.2",
|
|
103
|
-
"picomatch": "^4.0.4",
|
|
104
101
|
"tinyglobby": "^0.2.16"
|
|
105
102
|
}
|
|
106
103
|
}
|