@cmmn/tools 1.9.1 → 1.9.3
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/bundle/bundle.js +19 -4
- package/bundle/esbuild.config.js +56 -253
- package/bundle/getConfigs.js +18 -7
- package/compile/compile.js +2 -0
- package/package.json +3 -5
package/bundle/bundle.js
CHANGED
|
@@ -13,16 +13,31 @@ export async function bundle(...options) {
|
|
|
13
13
|
stats: options.includes('--stats'),
|
|
14
14
|
});
|
|
15
15
|
const configs = configOptions.flatMap(x => new ConfigCreator(x).getConfig());
|
|
16
|
-
const contexts = await Promise.all(configs.map(x =>
|
|
16
|
+
const contexts = await Promise.all(configs.map(async x =>
|
|
17
|
+
[x, await esbuild.context(x)]
|
|
18
|
+
));
|
|
17
19
|
|
|
18
20
|
if (options.includes('--watch')) {
|
|
19
|
-
for (let context of contexts) {
|
|
20
|
-
await context.watch(
|
|
21
|
+
for (let [name, context] of contexts) {
|
|
22
|
+
await context.watch();
|
|
21
23
|
}
|
|
22
24
|
}else {
|
|
23
|
-
|
|
25
|
+
const logs = [];
|
|
26
|
+
for (let [config, context] of contexts) {
|
|
27
|
+
const result = await context.rebuild();
|
|
28
|
+
const project = path.relative(process.cwd(), config.absWorkingDir);
|
|
29
|
+
const name = config.entryPoints[0].out;
|
|
30
|
+
let log = logs.find(x => x.project === project && x.name === name);
|
|
31
|
+
if (!log){
|
|
32
|
+
logs.push(log = {project, name});
|
|
33
|
+
}
|
|
34
|
+
for (let [name, value] of Object.entries(result.metafile.outputs)) {
|
|
35
|
+
if (!name.endsWith('js')) continue;
|
|
36
|
+
log[config.format+"."+config.platform] = `${(value.bytes/(2**10)).toFixed(1)} Kb`;
|
|
37
|
+
}
|
|
24
38
|
await context.dispose();
|
|
25
39
|
}
|
|
40
|
+
console.table(logs);
|
|
26
41
|
}
|
|
27
42
|
}
|
|
28
43
|
|
package/bundle/esbuild.config.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import {readFileSync} from "node:fs";
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fs from "node:fs";
|
|
4
3
|
import { lessLoader } from 'esbuild-plugin-less';
|
|
4
|
+
import {platform} from "os";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* @typedef {import(rollup).RollupOptions} RollupOptions
|
|
@@ -23,6 +23,7 @@ export class ConfigCreator {
|
|
|
23
23
|
* outDir: string,
|
|
24
24
|
* html: string,
|
|
25
25
|
* browser: boolean,
|
|
26
|
+
* platform: string,
|
|
26
27
|
* dedupe: string[],
|
|
27
28
|
* target: string
|
|
28
29
|
* inject: string
|
|
@@ -42,6 +43,7 @@ export class ConfigCreator {
|
|
|
42
43
|
external: [],
|
|
43
44
|
name: 'index',
|
|
44
45
|
outDir: 'dist/bundle',
|
|
46
|
+
platform: 'node,browser',
|
|
45
47
|
...options
|
|
46
48
|
};
|
|
47
49
|
if (options.rootDir)
|
|
@@ -52,194 +54,51 @@ export class ConfigCreator {
|
|
|
52
54
|
return path.join(this.root, this.options.outDir);
|
|
53
55
|
}
|
|
54
56
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
57
|
+
getHtmlPlugin(){
|
|
58
|
+
if (!this.options.html)
|
|
59
|
+
return [];
|
|
60
|
+
return [
|
|
61
|
+
{
|
|
62
|
+
name: 'esbuild-html-plugin',
|
|
63
|
+
setup: (build) => { build.onEnd(async result => {
|
|
64
|
+
const inject = [
|
|
65
|
+
`<script type="importmap">${this.importMaps}</script>`
|
|
66
|
+
];
|
|
67
|
+
for (let [key, value] of Object.entries(result.metafile.outputs)){
|
|
68
|
+
if (value.entryPoint !== this.options.input) continue;
|
|
69
|
+
const file = path.relative(this.outDir, path.join(this.root, key));
|
|
70
|
+
inject.push(`<script type="module" src="/${file}"/>`)
|
|
71
|
+
if (value.cssBundle) {
|
|
72
|
+
const file = path.relative(this.outDir, path.join(this.root, value.cssBundle));
|
|
73
|
+
inject.push(`<style rel="stylesheet" href="/${file}"/>`)
|
|
74
|
+
}
|
|
75
|
+
const html = await fs.promises.readFile(path.join(this.root, this.options.html));
|
|
76
|
+
await fs.promises.writeFile(
|
|
77
|
+
path.join(this.outDir, 'index.html'),
|
|
78
|
+
html.toString().replace('</head>', `${inject.map(x => `\t${x}\n`).join('')}</head>`)
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
}); }
|
|
82
|
+
}
|
|
83
|
+
];
|
|
84
|
+
|
|
64
85
|
}
|
|
65
|
-
//
|
|
66
|
-
// /**
|
|
67
|
-
// *
|
|
68
|
-
// * @returns {OutputOptions}
|
|
69
|
-
// */
|
|
70
|
-
// get output() {
|
|
71
|
-
// // const output = `${this.options.name ?? 'index'}-${this.options.module}${this.options.minify ? '.min' : ''}.js`;
|
|
72
|
-
// return this.options.module.split(',').map(module => ({
|
|
73
|
-
// entryFileNames: this.getOutputFileName(module, this.options.minify),
|
|
74
|
-
// // file: output,
|
|
75
|
-
// dir: this.outDir,
|
|
76
|
-
// sourcemap: this.options.minify ? true : 'inline',
|
|
77
|
-
// format: module,
|
|
78
|
-
// globals: module === 'umd' ? (Array.isArray(this.options.external) ? Object.fromEntries(this.options.external.map(x => [x, x])) : this.options.external) : [],
|
|
79
|
-
// assetFileNames: "assets/[name][extname]",
|
|
80
|
-
// chunkFileNames: "chunks/[name].js",
|
|
81
|
-
// name: this.options.global ?? 'global',
|
|
82
|
-
// sourcemapPathTransform: sourceMap => {
|
|
83
|
-
// const p = path.relative(this.root, path.resolve(this.outDir, sourceMap));
|
|
84
|
-
// return path.join('/', this.options.package, p);
|
|
85
|
-
// }
|
|
86
|
-
// }));
|
|
87
|
-
// }
|
|
88
|
-
//
|
|
89
|
-
// get html() {
|
|
90
|
-
// return html({
|
|
91
|
-
// publicPath: '/',
|
|
92
|
-
// dir: this.outDir,
|
|
93
|
-
// inject: false,
|
|
94
|
-
// template: (x) => {
|
|
95
|
-
// let inject = (this.options.inject === "json") ? `<script>
|
|
96
|
-
// globalThis.assets = ${JSON.stringify(Object.keys(x.bundle.bundle))};
|
|
97
|
-
// </script>`: Object.keys(x.bundle.bundle).map(key => {
|
|
98
|
-
// if (key.endsWith('css'))
|
|
99
|
-
// return `<link rel="stylesheet" href="${this.options.base ?? ''}/${key}" >`;
|
|
100
|
-
// if (key.endsWith('js'))
|
|
101
|
-
// return `<script type="module" defer src="${this.options.base ?? ''}/${key}"></script>`;
|
|
102
|
-
// }).join('\n');
|
|
103
|
-
// if (!this.options.minify) {
|
|
104
|
-
// const importMaps = Object.fromEntries(this.options.external
|
|
105
|
-
// .map(key => key.replace('.*', '/'))
|
|
106
|
-
// .map(key => [key, `/external/${this.options.alias?.[key] ?? key}`]));
|
|
107
|
-
// inject = `<script type="importmap" >${JSON.stringify({
|
|
108
|
-
// imports: importMaps
|
|
109
|
-
// })}</script>` + inject;
|
|
110
|
-
// }
|
|
111
|
-
// if (this.options.base){
|
|
112
|
-
// inject = `<base href="${this.options.base}">` + inject;
|
|
113
|
-
// }
|
|
114
|
-
// const html = fs.readFileSync(path.join(this.root, this.options.html), 'utf8')
|
|
115
|
-
// const interpolated = new Function(...Object.keys(this.options), `return \`${html}\`;`)(...Object.values(this.options));
|
|
116
|
-
// return interpolated.replace('</head>', inject + '</head>');
|
|
117
|
-
// }
|
|
118
|
-
// });
|
|
119
|
-
// }
|
|
120
|
-
//
|
|
121
|
-
// get devServer() {
|
|
122
|
-
// return serve({
|
|
123
|
-
// open: false,
|
|
124
|
-
// contentBase: [this.outDir, path.join(this.root, 'assets')],
|
|
125
|
-
// port: this.options.port,
|
|
126
|
-
// historyApiFallback: true
|
|
127
|
-
// });
|
|
128
|
-
// }
|
|
129
|
-
//
|
|
130
|
-
// get livereload() {
|
|
131
|
-
// return livereload({
|
|
132
|
-
// watch: [this.outDir, path.join(this.root, 'assets'), this.options.html],
|
|
133
|
-
// verbose: false, // Disable console output
|
|
134
|
-
// // other livereload options
|
|
135
|
-
// port: 12345,
|
|
136
|
-
// delay: 300,
|
|
137
|
-
// })
|
|
138
|
-
// }
|
|
139
|
-
//
|
|
140
|
-
// get visualizer() {
|
|
141
|
-
// return visualizer({
|
|
142
|
-
// open: true,
|
|
143
|
-
// sourcemap: true,
|
|
144
|
-
// template: 'treemap',
|
|
145
|
-
// brotliSize: true,
|
|
146
|
-
//
|
|
147
|
-
// filename: path.join(this.outDir, '/stats.html')
|
|
148
|
-
// })
|
|
149
|
-
// }
|
|
150
|
-
//
|
|
151
|
-
// get plugins() {
|
|
152
|
-
// const result = [
|
|
153
|
-
// replace({
|
|
154
|
-
// 'process.env.NODE_ENV': JSON.stringify(this.options.minify ? 'production' : 'development'),
|
|
155
|
-
// preventAssignment: true
|
|
156
|
-
// }),
|
|
157
|
-
// ...Styles(this),
|
|
158
|
-
// commonjs({
|
|
159
|
-
// requireReturnsDefault: "namespace",
|
|
160
|
-
// transformMixedEsModules: true,
|
|
161
|
-
// defaultIsModuleExports: true,
|
|
162
|
-
// }),
|
|
163
|
-
// nodeResolve({
|
|
164
|
-
// browser: this.options.browser,
|
|
165
|
-
// dedupe: this.options.dedupe || [],
|
|
166
|
-
// preferBuiltins: !this.options.browser
|
|
167
|
-
// }),
|
|
168
|
-
// sourcemaps(),
|
|
169
|
-
// builtins(),
|
|
170
|
-
// /*this.options.styles === 'modules' ? postCSS({
|
|
171
|
-
// mode: [
|
|
172
|
-
// "inject",
|
|
173
|
-
// {container: "head", prepend: true, attributes: {id: "global"}},
|
|
174
|
-
// ],
|
|
175
|
-
// plugins: [
|
|
176
|
-
// flexbugs,
|
|
177
|
-
// ],
|
|
178
|
-
// modules: {
|
|
179
|
-
// root: ''
|
|
180
|
-
// },
|
|
181
|
-
// namedExports: false,
|
|
182
|
-
// autoModules: true,
|
|
183
|
-
// }) : */
|
|
184
|
-
// Styles(this),
|
|
185
|
-
//
|
|
186
|
-
// string({
|
|
187
|
-
// include: /\.(html|svg|less)$/,
|
|
188
|
-
// exclude: /\.module\.css/
|
|
189
|
-
// }),
|
|
190
|
-
// json(),
|
|
191
|
-
//
|
|
192
|
-
// ];
|
|
193
|
-
// if (this.options.alias) {
|
|
194
|
-
// result.unshift(alias({
|
|
195
|
-
// entries: Object.entries(this.options.alias).map(([key, value]) => ({
|
|
196
|
-
// find: key,
|
|
197
|
-
// replacement: value.replace('<root>', this.root)
|
|
198
|
-
// }))
|
|
199
|
-
// }));
|
|
200
|
-
// }
|
|
201
|
-
// if (this.options.minify && this.options.mount){
|
|
202
|
-
// const toCopy = Object.entries(this.options.mount).map(([to, from]) => {
|
|
203
|
-
// return {src: from + '/*', dest: join(this.outDir, to)}
|
|
204
|
-
// });
|
|
205
|
-
// result.push(copy({
|
|
206
|
-
// targets: toCopy
|
|
207
|
-
// }));
|
|
208
|
-
// }
|
|
209
|
-
// if (this.options.html || this.options.input.endsWith('.html')) {
|
|
210
|
-
// result.push(this.html);
|
|
211
|
-
// result.push(watcher([path.join(this.root, this.options.html)]))
|
|
212
|
-
// }
|
|
213
|
-
// if (this.options.stats) {
|
|
214
|
-
// result.push(this.visualizer);
|
|
215
|
-
// }
|
|
216
|
-
// if (this.options.minify) {
|
|
217
|
-
// result.push(terser({
|
|
218
|
-
// module: true,
|
|
219
|
-
// ecma: 2020,
|
|
220
|
-
// compress: true,
|
|
221
|
-
// keep_classnames: false,
|
|
222
|
-
// keep_fnames: false,
|
|
223
|
-
// mangle: true,
|
|
224
|
-
// output: {
|
|
225
|
-
// comments: false
|
|
226
|
-
// }
|
|
227
|
-
// }));
|
|
228
|
-
// }
|
|
229
|
-
// if (this.options.devServer && this.options.port) {
|
|
230
|
-
// result.push(this.devServer, this.livereload);
|
|
231
|
-
// }
|
|
232
|
-
// return result;
|
|
233
|
-
// }
|
|
234
|
-
//
|
|
235
|
-
// getExternals() {
|
|
236
|
-
// if (!this.options.external)
|
|
237
|
-
// return [];
|
|
238
|
-
// if (Array.isArray(this.options.external))
|
|
239
|
-
// return this.options.external.map(s => new RegExp(s));
|
|
240
|
-
// return Object.keys(this.options.external).map(s => new RegExp(s));
|
|
241
|
-
// }
|
|
242
86
|
|
|
87
|
+
get platforms(){
|
|
88
|
+
return this.options.platform.split(',');
|
|
89
|
+
}
|
|
90
|
+
get modules(){
|
|
91
|
+
return this.options.module.split(',');
|
|
92
|
+
}
|
|
93
|
+
getOutExtension(format, platform){
|
|
94
|
+
const ext = (this.options.minify ? '.min' : '') + {
|
|
95
|
+
es: '.js',
|
|
96
|
+
cjs: '.cjs'
|
|
97
|
+
}[format];
|
|
98
|
+
if (this.platforms.length == 1)
|
|
99
|
+
return ext;
|
|
100
|
+
return "."+platform+ext;
|
|
101
|
+
}
|
|
243
102
|
/**
|
|
244
103
|
* @returns {RollupOptions[]}
|
|
245
104
|
*/
|
|
@@ -247,7 +106,7 @@ export class ConfigCreator {
|
|
|
247
106
|
if (this.options.external && typeof this.options.external === "string")
|
|
248
107
|
this.options.external = [this.options.external]
|
|
249
108
|
console.log(this.options.name, this.options);
|
|
250
|
-
return this.
|
|
109
|
+
return this.modules.flatMap(format => this.platforms.map(platform => ({
|
|
251
110
|
entryPoints: [
|
|
252
111
|
{ out: this.options.name, in: this.options.input }
|
|
253
112
|
],
|
|
@@ -258,81 +117,25 @@ export class ConfigCreator {
|
|
|
258
117
|
outdir: 'dist/bundle',
|
|
259
118
|
metafile: true,
|
|
260
119
|
absWorkingDir: this.root,
|
|
120
|
+
treeShaking: this.options.minify,
|
|
261
121
|
format: ({
|
|
262
122
|
es: 'esm'
|
|
263
123
|
})[format] ?? format,
|
|
264
124
|
outExtension: {
|
|
265
|
-
'.js':
|
|
266
|
-
es: '.js',
|
|
267
|
-
cjs: '.cjs'
|
|
268
|
-
}[format]
|
|
125
|
+
'.js': this.getOutExtension(format, platform)
|
|
269
126
|
},
|
|
270
|
-
platform:
|
|
127
|
+
platform: platform,
|
|
271
128
|
tsconfig: 'tsconfig.json',
|
|
272
|
-
external: ["*.woff2", "*.woff", ...this.options.external
|
|
129
|
+
external: ["*.woff2", "*.woff", ...this.options.external],
|
|
273
130
|
define: {
|
|
274
131
|
'process.env.NODE_ENV': '"production"'
|
|
275
132
|
},
|
|
276
133
|
publicPath: '/',
|
|
134
|
+
alias: this.options.alias,
|
|
277
135
|
plugins: [
|
|
278
136
|
lessLoader(),
|
|
279
|
-
...
|
|
280
|
-
files: [{
|
|
281
|
-
entryPoints: [this.options.input],
|
|
282
|
-
filename: 'index.html',
|
|
283
|
-
scriptLoading: 'module',
|
|
284
|
-
htmlTemplate: readFileSync(this.options.html).toString().replace('</head>', `<script type="importmap">
|
|
285
|
-
${JSON.stringify({
|
|
286
|
-
imports: Object.fromEntries(this.options.external
|
|
287
|
-
.map(key => key.replace('*', '/'))
|
|
288
|
-
.map(key => [key, `/external/${this.options.alias?.[key] ?? key}`]))
|
|
289
|
-
})}
|
|
290
|
-
</script>`),
|
|
291
|
-
// if (!this.options.minify) {
|
|
292
|
-
// const importMaps = Object.fromEntries(this.options.external
|
|
293
|
-
// .map(key => key.replace('.*', '/'))
|
|
294
|
-
// .map(key => [key, `/external/${this.options.alias?.[key] ?? key}`]));
|
|
295
|
-
// inject = `<script type="importmap" >${JSON.stringify({
|
|
296
|
-
// imports: importMaps
|
|
297
|
-
// })}</script>` + inject;
|
|
298
|
-
// }
|
|
299
|
-
// extraScripts: [
|
|
300
|
-
// `data:text/javascript,new EventSource('/esbuild').addEventListener('change', () => location.reload())`,
|
|
301
|
-
// ],
|
|
302
|
-
define: {
|
|
303
|
-
}
|
|
304
|
-
}]
|
|
305
|
-
})] : []),
|
|
137
|
+
...this.getHtmlPlugin(),
|
|
306
138
|
],
|
|
307
|
-
|
|
308
|
-
// output: this.output,
|
|
309
|
-
// external: (this.options.minify && this.options.browser) ? [] : this.getExternals(),
|
|
310
|
-
// manualChunks: this.options.chunks,
|
|
311
|
-
// onwarn(warning) {
|
|
312
|
-
// switch (warning.code) {
|
|
313
|
-
// case 'CIRCULAR_DEPENDENCY':
|
|
314
|
-
// return;
|
|
315
|
-
// case 'THIS_IS_UNDEFINED':
|
|
316
|
-
// console.log(`${warning.message} at`);
|
|
317
|
-
// console.log(`\t${warning.id}`);
|
|
318
|
-
// break;
|
|
319
|
-
// case 'PLUGIN_WARNING':
|
|
320
|
-
// console.log(`${warning.message} at`);
|
|
321
|
-
// console.log(`\t${warning.id}`);
|
|
322
|
-
// break;
|
|
323
|
-
// default:
|
|
324
|
-
// console.warn(`\t${warning.code}(!) ${warning.message}`)
|
|
325
|
-
// }
|
|
326
|
-
//
|
|
327
|
-
// },
|
|
328
|
-
// plugins: this.plugins,
|
|
329
|
-
// preserveEntrySignatures: true,
|
|
330
|
-
// treeshake: this.options.minify ? "recommended" : "safest",
|
|
331
|
-
// watch: {
|
|
332
|
-
// buildDelay: 300,
|
|
333
|
-
// clearScreen: false,
|
|
334
|
-
// exclude: this.getExternals().concat(path.join(this.root, this.outDir)),
|
|
335
|
-
// }
|
|
336
|
-
}));
|
|
139
|
+
})));
|
|
337
140
|
}
|
|
338
141
|
}
|
package/bundle/getConfigs.js
CHANGED
|
@@ -16,19 +16,30 @@ function getPackageConfigs(rootDir, options, name = null) {
|
|
|
16
16
|
return [];
|
|
17
17
|
const results = [];
|
|
18
18
|
const pkg = JSON.parse(fs.readFileSync(pckPath));
|
|
19
|
-
if (
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
if (pkg.workspaces){
|
|
20
|
+
const dirs = pkg.workspaces.flatMap(pkg => fg.sync([pkg], {
|
|
21
|
+
absolute: true,
|
|
22
|
+
globstar: true,
|
|
23
|
+
onlyDirectories: true,
|
|
24
|
+
cwd: rootDir
|
|
24
25
|
}));
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
dirs.forEach(d => results.push(...getPackageConfigs(d, options, name)));
|
|
27
|
+
}
|
|
28
|
+
if (pkg.cmmn) {
|
|
29
|
+
if (name) {
|
|
27
30
|
results.push(getProjectConfig(rootDir, pkg.cmmn[name], {
|
|
28
31
|
...options,
|
|
29
32
|
name,
|
|
30
33
|
package: pkg.name,
|
|
31
34
|
}));
|
|
35
|
+
} else {
|
|
36
|
+
for (let name in pkg.cmmn) {
|
|
37
|
+
results.push(getProjectConfig(rootDir, pkg.cmmn[name], {
|
|
38
|
+
...options,
|
|
39
|
+
name,
|
|
40
|
+
package: pkg.name,
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
32
43
|
}
|
|
33
44
|
}
|
|
34
45
|
return results;
|
package/compile/compile.js
CHANGED
|
@@ -38,6 +38,8 @@ function createProgram(rootNames, options, host, oldProgram, configFileParsingDi
|
|
|
38
38
|
options.declarationDir = resolve(options.configFilePath, '../dist/typings');
|
|
39
39
|
options.baseUrl = resolve(options.configFilePath, '../');
|
|
40
40
|
options.tsBuildInfoFile = resolve(options.configFilePath, '../dist/ts.buildinfo');
|
|
41
|
+
// options.excludeDirectories.baseUrl = options.baseUrl;
|
|
42
|
+
// options.includeDirectories.baseUrl = options.baseUrl;
|
|
41
43
|
if (!cleanedBaseDirs.has(options.baseUrl)){
|
|
42
44
|
fs.rmSync(options.outDir, {recursive: true, force: true});
|
|
43
45
|
fs.rmSync(options.declarationDir, {recursive: true, force: true});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cmmn/tools",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.3",
|
|
4
4
|
"description": "Compilation, bundling, code generator, testing.",
|
|
5
5
|
"main": "dist/rollup.config.js",
|
|
6
6
|
"type": "module",
|
|
@@ -41,7 +41,6 @@
|
|
|
41
41
|
"test/*"
|
|
42
42
|
],
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@craftamap/esbuild-plugin-html": "0.6.1",
|
|
45
44
|
"@jest/globals": "27.x.x",
|
|
46
45
|
"@swc/jest": "0.2.17",
|
|
47
46
|
"@testdeck/jest": "0.2.0",
|
|
@@ -59,10 +58,9 @@
|
|
|
59
58
|
"less": "^4",
|
|
60
59
|
"live-server": "1.2.2",
|
|
61
60
|
"sinon": "10.x.x",
|
|
62
|
-
"ts-jest": "29.x.x"
|
|
63
|
-
"unique-slug": "*"
|
|
61
|
+
"ts-jest": "29.x.x"
|
|
64
62
|
},
|
|
65
63
|
"author": "",
|
|
66
64
|
"license": "ISC",
|
|
67
|
-
"gitHead": "
|
|
65
|
+
"gitHead": "5b83506f4132e1876b5573f7245d8bc759fcb92d"
|
|
68
66
|
}
|