@omnia/tooling-vue 8.0.100-vnext → 8.0.101-dev
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/internal-do-not-import-from-here/config/omnia.fx.core_a2892051-fd9f-4056-ae8d-30d16d48417d.manifest.json +1 -0
- package/internal-do-not-import-from-here/config/omnia.fx.ux.libs_0fe5c5f2-8d89-485b-afd4-36fe3ff5943a.manifest.json +1 -0
- package/internal-do-not-import-from-here/config/omnia.fx.ux_dee030cc-4ab3-4158-bb06-8049f5c67542.manifest.json +1 -0
- package/internal-do-not-import-from-here/config/omnia.fx_a5a89056-b5f5-475d-8518-a1f55090379d.manifest.json +1 -0
- package/internal-do-not-import-from-here/config/omnia.vendor.manifest.json +1 -1
- package/internal-do-not-import-from-here/config/tooling.output.json +1 -1
- package/internal-do-not-import-from-here/config/wctypings.d.ts +4456 -1521
- package/internal-do-not-import-from-here/shared.d.ts +11 -6
- package/internal-do-not-import-from-here/shared.js +32 -12
- package/internal-do-not-import-from-here/tasks/ComponentDocRegistrations.js +1 -1
- package/internal-do-not-import-from-here/tasks/bundle.js +120 -399
- package/internal-do-not-import-from-here/tasks/doc.d.ts +3 -1
- package/internal-do-not-import-from-here/tasks/doc.js +407 -391
- package/internal-do-not-import-from-here/tasks/vendor.js +22 -16
- package/internal-do-not-import-from-here/vite/hmr/graph.js +3 -1
- package/internal-do-not-import-from-here/vite/hmr/vueJsx.js +3 -2
- package/internal-do-not-import-from-here/vite/index.js +1 -1
- package/internal-do-not-import-from-here/vite/plugins/OmniaPlugin.js +1 -1
- package/internal-do-not-import-from-here/webpack-loaders/doc-loader.d.ts +1 -0
- package/internal-do-not-import-from-here/webpack-loaders/doc-loader.js +11 -0
- package/internal-do-not-import-from-here/webpack-loaders/esbuild-custom-loader.d.ts +1 -0
- package/internal-do-not-import-from-here/webpack-loaders/esbuild-custom-loader.js +10 -0
- package/internal-do-not-import-from-here/webpack-loaders/ts-loader.d.ts +5 -2
- package/internal-do-not-import-from-here/webpack-loaders/ts-loader.js +8 -0
- package/internal-do-not-import-from-here/webpack-loaders/tsx-loader.d.ts +3 -3
- package/internal-do-not-import-from-here/webpack-loaders/tsx-loader.js +3 -0
- package/internal-do-not-import-from-here/webpack-loaders/wc-loader.d.ts +1 -1
- package/internal-do-not-import-from-here/webpack-loaders/wc-loader.js +5 -1
- package/internal-do-not-import-from-here/webpack-plugins/stylexjs/index.d.ts +53 -0
- package/internal-do-not-import-from-here/webpack-plugins/stylexjs/index.js +194 -0
- package/internal-do-not-import-from-here/webpack-plugins/stylexjs/loader.d.ts +9 -0
- package/internal-do-not-import-from-here/webpack-plugins/stylexjs/loader.js +23 -0
- package/package.json +10 -10
|
@@ -14,7 +14,8 @@ const fx_models_1 = require("@omnia/fx-models");
|
|
|
14
14
|
const $ = tslib_1.__importStar(require("../variables"));
|
|
15
15
|
const shared_1 = require("../shared");
|
|
16
16
|
const tooling_1 = require("@omnia/tooling");
|
|
17
|
-
const
|
|
17
|
+
const doc_1 = require("./doc");
|
|
18
|
+
const stylexjs_1 = require("../webpack-plugins/stylexjs");
|
|
18
19
|
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
|
19
20
|
const ConcatSource = require('webpack-core/lib/ConcatSource');
|
|
20
21
|
const CircularDependencyPlugin = require('circular-dependency-plugin');
|
|
@@ -40,19 +41,24 @@ $.tooling.core.registerBuildTask({
|
|
|
40
41
|
return new Promise(function (resolve, reject) {
|
|
41
42
|
buildEntries()
|
|
42
43
|
.then((result) => {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
44
|
+
if (process.argv.length > 0 && process.argv.find(argv => argv === "--package") !== undefined) {
|
|
45
|
+
resolve(result);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
let startTime = new Date().getTime();
|
|
49
|
+
tooling_1.utils.log("Typescript checking...");
|
|
50
|
+
const spawn = require("child_process").spawn;
|
|
51
|
+
spawn("node", [path_1.default.resolve(__dirname, "./tsc.js")], { stdio: "inherit", })
|
|
52
|
+
.on('exit', (code) => {
|
|
53
|
+
if (code == 0) {
|
|
54
|
+
tooling_1.utils.logTime('Done - Typescript', startTime);
|
|
55
|
+
resolve(result);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
process.exit(code);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
56
62
|
}, reject);
|
|
57
63
|
});
|
|
58
64
|
}
|
|
@@ -197,11 +203,12 @@ function buildEntries(serve = false) {
|
|
|
197
203
|
var componentRegistry = $.composers.ComponentRegistry;
|
|
198
204
|
let componentRegistrations = componentRegistry.getRegistrations();
|
|
199
205
|
const serviceInfo = $.composers.ServiceManifestRegistry.getServiceInfo();
|
|
200
|
-
if (serviceInfo.serviceType === tooling_composers_1.ServiceTypes.WebApp) {
|
|
201
|
-
await generateComponentTypingsAndDoc(componentRegistrations);
|
|
202
|
-
}
|
|
203
206
|
startTime = new Date().getTime();
|
|
204
207
|
$.tooling.logTime("Found [" + componentRegistrations.length + "] component registrations", startTime);
|
|
208
|
+
let componentEntries = createVueEntryFormComponentRegistrations(componentRegistrations);
|
|
209
|
+
if (serviceInfo.serviceType === tooling_composers_1.ServiceTypes.WebApp) {
|
|
210
|
+
await (0, doc_1.generateComponentTypingsAndDoc)(componentRegistrations);
|
|
211
|
+
}
|
|
205
212
|
var resourceRegistry = $.composers.ResourceRegistry;
|
|
206
213
|
let resourceBundlesWithBuildOptions = resourceRegistry.getRegisteredResourceBundles(shared_1.convertManifestPathToEntryPath);
|
|
207
214
|
$.tooling.logTime("Found [" + resourceBundlesWithBuildOptions?.size + "] resource bundles", startTime);
|
|
@@ -217,7 +224,6 @@ function buildEntries(serve = false) {
|
|
|
217
224
|
console.log("debug " + res[0] + " has build options for paths " + resource.paths + " buildoptions: " + JSON.stringify(resource.buildOptions));
|
|
218
225
|
}
|
|
219
226
|
}
|
|
220
|
-
let componentEntries = createVueEntryFormRegistrations(componentRegistrations);
|
|
221
227
|
var entries = $.merge(componentEntries, resourceEntries);
|
|
222
228
|
if (checkDuplicateWebpackEntryPoints(entries)) {
|
|
223
229
|
$.tooling.log('Build manifests metadata have error that found duplicated resource path', $.tooling.LogTypes.Error);
|
|
@@ -252,248 +258,7 @@ function buildEntries(serve = false) {
|
|
|
252
258
|
}
|
|
253
259
|
});
|
|
254
260
|
}
|
|
255
|
-
|
|
256
|
-
tooling_1.utils.log("Generate components typings and documentation running...");
|
|
257
|
-
var startTime = new Date().getTime();
|
|
258
|
-
let DefineVueType;
|
|
259
|
-
(function (DefineVueType) {
|
|
260
|
-
DefineVueType[DefineVueType["Prop"] = 0] = "Prop";
|
|
261
|
-
DefineVueType[DefineVueType["Model"] = 1] = "Model";
|
|
262
|
-
DefineVueType[DefineVueType["Slot"] = 2] = "Slot";
|
|
263
|
-
DefineVueType[DefineVueType["Emit"] = 4] = "Emit";
|
|
264
|
-
})(DefineVueType || (DefineVueType = {}));
|
|
265
|
-
const docResult = {};
|
|
266
|
-
function getPropertyFunctionTypeAsString(type) {
|
|
267
|
-
let params = "";
|
|
268
|
-
if (type.params?.length > 0) {
|
|
269
|
-
type.params.forEach(p => {
|
|
270
|
-
params += `${p.value}:${getPropertyType(p.typeAnnotation)}, `;
|
|
271
|
-
});
|
|
272
|
-
params = params.replace(/,\s*$/, "");
|
|
273
|
-
}
|
|
274
|
-
return `(${params}) => ${getPropertyType(type.typeAnnotation)}`;
|
|
275
|
-
}
|
|
276
|
-
function getPropertyType(tsType) {
|
|
277
|
-
let result = "";
|
|
278
|
-
if (tsType.type === "TsTypeAnnotation") {
|
|
279
|
-
return getPropertyType(tsType.typeAnnotation);
|
|
280
|
-
}
|
|
281
|
-
switch (tsType.type) {
|
|
282
|
-
case "TsLiteralType":
|
|
283
|
-
result = tsType.literal.value;
|
|
284
|
-
break;
|
|
285
|
-
case "TsKeywordType":
|
|
286
|
-
result = tsType.kind;
|
|
287
|
-
break;
|
|
288
|
-
case "TsTypeReference":
|
|
289
|
-
result = tsType.typeName.value;
|
|
290
|
-
break;
|
|
291
|
-
case "TsFunctionType":
|
|
292
|
-
result = getPropertyFunctionTypeAsString(tsType);
|
|
293
|
-
break;
|
|
294
|
-
default:
|
|
295
|
-
break;
|
|
296
|
-
}
|
|
297
|
-
return result;
|
|
298
|
-
}
|
|
299
|
-
function getNameProperty(ce, result) {
|
|
300
|
-
const identifier = ce.callee?.property?.value;
|
|
301
|
-
if (identifier) {
|
|
302
|
-
switch (identifier) {
|
|
303
|
-
case "name":
|
|
304
|
-
result.name = ce.arguments[0].expression.value;
|
|
305
|
-
getNameProperty(ce.callee.object, result);
|
|
306
|
-
break;
|
|
307
|
-
case "vModel":
|
|
308
|
-
result.type = DefineVueType.Model;
|
|
309
|
-
result.propertyTypeAsString = getPropertyType(ce.typeArguments.params[0]);
|
|
310
|
-
result.name = result.name ? `v-model:${result.name}` : result.name;
|
|
311
|
-
break;
|
|
312
|
-
case "slots":
|
|
313
|
-
result.type = DefineVueType.Slot;
|
|
314
|
-
result.propertyTypeAsObject = {};
|
|
315
|
-
ce.typeArguments.params[0].members
|
|
316
|
-
.forEach(m => {
|
|
317
|
-
result.propertyTypeAsObject[m.key.value] = getPropertyType(m.typeAnnotation);
|
|
318
|
-
});
|
|
319
|
-
break;
|
|
320
|
-
case "prop":
|
|
321
|
-
result.type = DefineVueType.Prop;
|
|
322
|
-
result.propertyTypeAsString = getPropertyType(ce.typeArguments.params[0]);
|
|
323
|
-
break;
|
|
324
|
-
case "emit":
|
|
325
|
-
result.type = DefineVueType.Emit;
|
|
326
|
-
result.propertyTypeAsString = getPropertyType(ce.typeArguments.params[0]);
|
|
327
|
-
break;
|
|
328
|
-
default:
|
|
329
|
-
getNameProperty(ce.callee.object, result);
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
async function buildDoc(wc) {
|
|
334
|
-
try {
|
|
335
|
-
const wcPath = (0, shared_1.convertManifestPathToEntryPath)(wc.manifestPath, [wc.componentOptions.entryPoint])[0];
|
|
336
|
-
const wcParseResult = await (0, core_1.parseFile)(wcPath, {
|
|
337
|
-
syntax: 'typescript',
|
|
338
|
-
target: 'es2020',
|
|
339
|
-
tsx: true,
|
|
340
|
-
decorators: true,
|
|
341
|
-
dynamicImport: true
|
|
342
|
-
});
|
|
343
|
-
wcParseResult.body.forEach(b => {
|
|
344
|
-
if (b.type === 'ExportDefaultExpression'
|
|
345
|
-
&& b.expression.callee?.value === "defineVueWebComponent") {
|
|
346
|
-
b.expression.arguments[0].expression
|
|
347
|
-
.properties?.filter(p => p.key.value === "props"
|
|
348
|
-
|| p.key.value === "emits")
|
|
349
|
-
?.forEach(propsIdentifier => {
|
|
350
|
-
if (propsIdentifier) {
|
|
351
|
-
propsIdentifier.value
|
|
352
|
-
.properties?.forEach(p => {
|
|
353
|
-
const em = p.arguments;
|
|
354
|
-
if (em?.callee?.property?.value === "doc$") {
|
|
355
|
-
const PropertyResult = {
|
|
356
|
-
type: null,
|
|
357
|
-
propertyTypeAsString: "",
|
|
358
|
-
name: ""
|
|
359
|
-
};
|
|
360
|
-
getNameProperty(em, PropertyResult);
|
|
361
|
-
if (!docResult[wc.componentOptions.elementName]) {
|
|
362
|
-
docResult[wc.componentOptions.elementName] = {
|
|
363
|
-
emits: {},
|
|
364
|
-
models: {},
|
|
365
|
-
props: {},
|
|
366
|
-
slots: {}
|
|
367
|
-
};
|
|
368
|
-
}
|
|
369
|
-
switch (PropertyResult.type) {
|
|
370
|
-
case DefineVueType.Prop:
|
|
371
|
-
docResult[wc.componentOptions.elementName].props[PropertyResult.name] = {
|
|
372
|
-
type: PropertyResult.propertyTypeAsString,
|
|
373
|
-
description: em.arguments[0].expression.value
|
|
374
|
-
};
|
|
375
|
-
break;
|
|
376
|
-
case DefineVueType.Model:
|
|
377
|
-
docResult[wc.componentOptions.elementName].models[PropertyResult.name] = {
|
|
378
|
-
type: PropertyResult.propertyTypeAsString,
|
|
379
|
-
description: em.arguments[0].expression.value
|
|
380
|
-
};
|
|
381
|
-
break;
|
|
382
|
-
case DefineVueType.Emit:
|
|
383
|
-
docResult[wc.componentOptions.elementName].emits[PropertyResult.name] = {
|
|
384
|
-
type: PropertyResult.propertyTypeAsString,
|
|
385
|
-
description: em.arguments[0].expression.value
|
|
386
|
-
};
|
|
387
|
-
break;
|
|
388
|
-
case DefineVueType.Slot:
|
|
389
|
-
em.arguments[0].expression
|
|
390
|
-
.properties
|
|
391
|
-
.forEach(p => {
|
|
392
|
-
const slotName = p.key.value;
|
|
393
|
-
docResult[wc.componentOptions.elementName].slots[slotName] = {
|
|
394
|
-
type: PropertyResult.propertyTypeAsObject[slotName],
|
|
395
|
-
description: p.value.value
|
|
396
|
-
};
|
|
397
|
-
});
|
|
398
|
-
break;
|
|
399
|
-
default:
|
|
400
|
-
break;
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
});
|
|
404
|
-
}
|
|
405
|
-
});
|
|
406
|
-
}
|
|
407
|
-
});
|
|
408
|
-
}
|
|
409
|
-
catch (ex) {
|
|
410
|
-
tooling_1.utils.log(`Have a exception when extract doc$ for web component manifest -> ${wc.manifestPath}`, tooling_1.utils.LogTypes.Error);
|
|
411
|
-
console.error(ex);
|
|
412
|
-
throw new Error("Exit, have an exception.");
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
let docPath = $.path.resolve(__dirname, "ComponentDocRegistrations.ts");
|
|
416
|
-
;
|
|
417
|
-
const wcNamespace = getBuildOption()?.webComponentNamespace;
|
|
418
|
-
const info = shared_1.ConfigurationManager.outputInfo.get();
|
|
419
|
-
info.wc = {
|
|
420
|
-
namespace: wcNamespace,
|
|
421
|
-
mappings: {}
|
|
422
|
-
};
|
|
423
|
-
let wcTypings = wcNamespace ? `
|
|
424
|
-
//{{importWC}}
|
|
425
|
-
declare global {
|
|
426
|
-
namespace JSX {
|
|
427
|
-
interface Element { }
|
|
428
|
-
interface ElementClass { }
|
|
429
|
-
|
|
430
|
-
interface IntrinsicElements {
|
|
431
|
-
//{{elementName}}
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
declare global {
|
|
437
|
-
let ${wcNamespace}: {
|
|
438
|
-
//{{nselementName}}
|
|
439
|
-
};
|
|
440
|
-
}
|
|
441
|
-
`
|
|
442
|
-
: `
|
|
443
|
-
//{{importWC}}
|
|
444
|
-
declare global {
|
|
445
|
-
namespace JSX {
|
|
446
|
-
interface Element { }
|
|
447
|
-
interface ElementClass { }
|
|
448
|
-
|
|
449
|
-
interface IntrinsicElements {
|
|
450
|
-
//{{elementName}}
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
}`;
|
|
454
|
-
if ($.isExtensionEnv) {
|
|
455
|
-
wcTypings = `import { VueComponentBaseProps } from "@omnia/fx/ux";
|
|
456
|
-
${wcTypings}`;
|
|
457
|
-
}
|
|
458
|
-
else {
|
|
459
|
-
wcTypings = `import { VueComponentBaseProps } from "../../../../client/fx/ux/index";
|
|
460
|
-
${wcTypings}`;
|
|
461
|
-
}
|
|
462
|
-
await tooling_1.utils.asyncForEach(componentRegistrations, async (wc) => {
|
|
463
|
-
wcTypings = generateWebComponentTypings(wc, wcTypings, info);
|
|
464
|
-
await buildDoc(wc);
|
|
465
|
-
});
|
|
466
|
-
if (Object.keys(docResult).length > 0) {
|
|
467
|
-
fsExtra.outputFileSync(docPath, `
|
|
468
|
-
import { extendApi } from "@omnia/fx";
|
|
469
|
-
import { ComponentDoc } from "@omnia/fx-models";
|
|
470
|
-
|
|
471
|
-
extendApi(api => api.fx.docs.registrations, api => {
|
|
472
|
-
|
|
473
|
-
const registrations: { [elementName: string]: ComponentDoc } = ${JSON.stringify(docResult)}
|
|
474
|
-
|
|
475
|
-
Object.keys(registrations).forEach(elementName => {
|
|
476
|
-
api.register(elementName, registrations[elementName]);
|
|
477
|
-
});
|
|
478
|
-
});
|
|
479
|
-
`);
|
|
480
|
-
// create dynamic doc manifest
|
|
481
|
-
$.composers.ManifestRegistry.setCurrentManifestPath(`${path_1.default.relative(tooling_1.utils.root(""), path_1.default.resolve(__dirname))}/`);
|
|
482
|
-
$.composers
|
|
483
|
-
.Composer
|
|
484
|
-
.registerManifest(getBuildOption().docResourceManifestId || new fx_models_1.Guid(`${tooling_1.utils.generateGuid()}`), "omnia.fx.docs.components.registraions")
|
|
485
|
-
.registerResources({
|
|
486
|
-
resourcePaths: ["./ComponentDocRegistrations.ts"]
|
|
487
|
-
})
|
|
488
|
-
.withTarget(fx_models_1.ClientManifestTargetTypes.Docs)
|
|
489
|
-
.extendApi(api => api.fx.docs.registrations);
|
|
490
|
-
$.composers.ManifestRegistry.setCurrentManifestPath();
|
|
491
|
-
}
|
|
492
|
-
shared_1.ConfigurationManager.webComponentTypings.update(wcTypings);
|
|
493
|
-
shared_1.ConfigurationManager.outputInfo.update(info);
|
|
494
|
-
tooling_1.utils.logTime('Done - Generate components typings and documentation', startTime);
|
|
495
|
-
}
|
|
496
|
-
function buildManifestMetadatas(entries) {
|
|
261
|
+
function buildManifestMetadata(entries) {
|
|
497
262
|
return new Promise(function (resolve, reject) {
|
|
498
263
|
try {
|
|
499
264
|
var startTime = new Date().getTime();
|
|
@@ -580,7 +345,7 @@ function beforeBundleManifest(entries) {
|
|
|
580
345
|
// isRunBuildMetadata = !isEqual(entries, cachedEntries);
|
|
581
346
|
// }
|
|
582
347
|
// }
|
|
583
|
-
if ($.fs.existsSync(cachedEntriesPath)) {
|
|
348
|
+
if (!isBuildWebpackManifestOnly() && $.fs.existsSync(cachedEntriesPath)) {
|
|
584
349
|
let cachedEntries = require(cachedEntriesPath);
|
|
585
350
|
isRunBuildMetadata = !isEqual(entries, cachedEntries);
|
|
586
351
|
}
|
|
@@ -612,9 +377,15 @@ function beforeBundleManifest(entries) {
|
|
|
612
377
|
fsExtra.writeJsonSync(manifestPath, content);
|
|
613
378
|
}
|
|
614
379
|
});
|
|
615
|
-
|
|
380
|
+
buildManifestMetadata(entriesToBuild).then(() => {
|
|
616
381
|
fsExtra.ensureFileSync(cachedEntriesPath);
|
|
617
382
|
fsExtra.writeJsonSync(cachedEntriesPath, entries);
|
|
383
|
+
if (isBuildWebpackManifestOnly()) {
|
|
384
|
+
fsExtra.copyFileSync(`${outDirManifestMetadata}/omnia.fx.core_a2892051-fd9f-4056-ae8d-30d16d48417d.manifest.json`, "client/tooling/vue/config/omnia.fx.core_a2892051-fd9f-4056-ae8d-30d16d48417d.manifest.json");
|
|
385
|
+
fsExtra.copyFileSync(`${outDirManifestMetadata}/omnia.fx_a5a89056-b5f5-475d-8518-a1f55090379d.manifest.json`, "client/tooling/vue/config/omnia.fx_a5a89056-b5f5-475d-8518-a1f55090379d.manifest.json");
|
|
386
|
+
fsExtra.copyFileSync(`${outDirManifestMetadata}/omnia.fx.ux_dee030cc-4ab3-4158-bb06-8049f5c67542.manifest.json`, "client/tooling/vue/config/omnia.fx.ux_dee030cc-4ab3-4158-bb06-8049f5c67542.manifest.json");
|
|
387
|
+
fsExtra.copyFileSync(`${outDirManifestMetadata}/omnia.fx.ux.libs_0fe5c5f2-8d89-485b-afd4-36fe3ff5943a.manifest.json`, "client/tooling/vue/config/omnia.fx.ux.libs_0fe5c5f2-8d89-485b-afd4-36fe3ff5943a.manifest.json");
|
|
388
|
+
}
|
|
618
389
|
resolve(entries);
|
|
619
390
|
});
|
|
620
391
|
}
|
|
@@ -754,12 +525,15 @@ function afterGenerateManifestsMetadata() {
|
|
|
754
525
|
.then(resolve, reject);
|
|
755
526
|
});
|
|
756
527
|
}
|
|
528
|
+
function isBuildWebpackManifestOnly() {
|
|
529
|
+
return process.argv?.find(argv => argv === "--webpackManifest") !== undefined;
|
|
530
|
+
}
|
|
757
531
|
function minifyBundles() {
|
|
758
532
|
return new Promise(function (resolve, reject) {
|
|
759
533
|
if (process.argv.length > 0 && process.argv.find(argv => argv === "--minify") !== undefined) {
|
|
760
534
|
let startTime = new Date().getTime();
|
|
761
535
|
$.tooling.log('Minify bundles running...');
|
|
762
|
-
const jsPaths = (0, globby_1.globbySync)([`${$.tooling.utils.root($.tooling.composer.OmniaOutput.OutputBundlePath)}/*.js`]);
|
|
536
|
+
const jsPaths = (0, globby_1.globbySync)([`${$.tooling.utils.root($.tooling.composer.OmniaOutput.OutputBundlePath).replace(/\\/g, "/")}/*.js`]);
|
|
763
537
|
let promises = [];
|
|
764
538
|
jsPaths.forEach(filePath => {
|
|
765
539
|
promises.push(new Promise(async (resolve, reject) => {
|
|
@@ -816,6 +590,25 @@ function createVueWebpackConfig(currentEntry, entries, bundleOutputDir, viteHmrO
|
|
|
816
590
|
...referenceManifests,
|
|
817
591
|
extractCss,
|
|
818
592
|
new $.omniaWebpackPlugins.NamedModulesPlugin(buildModuleName()),
|
|
593
|
+
new stylexjs_1.StylexPlugin({
|
|
594
|
+
// filename: 'styles.[contenthash].css',
|
|
595
|
+
filename: `${Object.keys(entry)[0]}.css`,
|
|
596
|
+
// get webpack mode and set value for dev
|
|
597
|
+
dev: false,
|
|
598
|
+
// Use statically generated CSS files and not runtime injected CSS.
|
|
599
|
+
// Even in development.
|
|
600
|
+
runtimeInjection: false,
|
|
601
|
+
// optional. default: 'x'
|
|
602
|
+
classNamePrefix: 'o',
|
|
603
|
+
// Required for CSS variable support
|
|
604
|
+
unstable_moduleResolution: {
|
|
605
|
+
// type: 'commonJS' | 'haste'
|
|
606
|
+
// default: 'commonJS'
|
|
607
|
+
type: 'commonJS',
|
|
608
|
+
// The absolute path to the root directory of your project
|
|
609
|
+
rootDir: __dirname,
|
|
610
|
+
},
|
|
611
|
+
}),
|
|
819
612
|
];
|
|
820
613
|
if (!buildOption.detectCircularDependencyOptions || buildOption.detectCircularDependencyOptions.disable !== true) {
|
|
821
614
|
plugins.unshift(new CircularDependencyPlugin({
|
|
@@ -888,10 +681,10 @@ function createVueWebpackConfig(currentEntry, entries, bundleOutputDir, viteHmrO
|
|
|
888
681
|
plugins.push(new $.omniaWebpackPlugins.ChunkAssets(function (compilation, fileName) {
|
|
889
682
|
chunkAsset(entries, compilation, fileName, viteHmrOption);
|
|
890
683
|
}));
|
|
891
|
-
let webpackEntries = {};
|
|
892
|
-
Object.keys(entry).forEach(name => {
|
|
893
|
-
|
|
894
|
-
})
|
|
684
|
+
// let webpackEntries = {};
|
|
685
|
+
// Object.keys(entry).forEach(name => {
|
|
686
|
+
// webpackEntries[name] = { import: entry[name] }
|
|
687
|
+
// })
|
|
895
688
|
return {
|
|
896
689
|
mode: 'production',
|
|
897
690
|
devtool: false,
|
|
@@ -919,7 +712,7 @@ function createVueWebpackConfig(currentEntry, entries, bundleOutputDir, viteHmrO
|
|
|
919
712
|
'@microsoft/signalr$': '@microsoft/signalr/dist/webworker/signalr.js',
|
|
920
713
|
}),
|
|
921
714
|
},
|
|
922
|
-
target: ['web', 'es2022'],
|
|
715
|
+
target: ['web', 'es2022'], // Will change ES6 when stop support IE11
|
|
923
716
|
output: {
|
|
924
717
|
//library: {
|
|
925
718
|
// type: "umd"
|
|
@@ -954,8 +747,8 @@ function createVueWebpackConfig(currentEntry, entries, bundleOutputDir, viteHmrO
|
|
|
954
747
|
}
|
|
955
748
|
return false;
|
|
956
749
|
},
|
|
957
|
-
// use: 'null-loader',
|
|
958
750
|
use: [
|
|
751
|
+
// 'null-loader',
|
|
959
752
|
{
|
|
960
753
|
loader: path_1.default.resolve(__dirname, $.isExtensionEnv ? '../webpack-loaders/ingore-vuetify-locale.js' : '../webpack-loaders/ingore-vuetify-locale.ts'),
|
|
961
754
|
}
|
|
@@ -1069,7 +862,7 @@ function createWebpackConfigForManifestMetadata(entry, metadataOutputDir) {
|
|
|
1069
862
|
var entensionId = getServiceId();
|
|
1070
863
|
return Object.assign({}, getBaseWebpackConfigForManifestMetadata(entry, metadataOutputDir), {
|
|
1071
864
|
plugins: [
|
|
1072
|
-
...buildReferenceManifestFromConfig(),
|
|
865
|
+
...buildReferenceManifestFromConfig(Object.keys(entry)[0]),
|
|
1073
866
|
new $.omniaWebpackPlugins.NamedModulesPlugin(buildModuleName()),
|
|
1074
867
|
new $.webpack.DllPlugin({
|
|
1075
868
|
entryOnly: false,
|
|
@@ -1297,9 +1090,10 @@ function createCombinedManfest(omniaServiceId, manifestIds, targetManifestId, ta
|
|
|
1297
1090
|
if (manifestIds &&
|
|
1298
1091
|
targetManifestId &&
|
|
1299
1092
|
manifestIds.length > 0) {
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1093
|
+
const manifestIdToFileNameMap = {};
|
|
1094
|
+
const targetJsFileName = `${targetManifestName ? targetManifestName + "_" : ""}${targetManifestId}.js`;
|
|
1095
|
+
const targetCssFileName = `${targetManifestName ? targetManifestName + "_" : ""}${targetManifestId}.css`;
|
|
1096
|
+
manifestIdToFileNameMap[targetManifestId] = targetJsFileName;
|
|
1303
1097
|
$.tooling.log("Creating manifest group bundle [" + targetManifestId + "]", $.tooling.LogTypes.HeadLine);
|
|
1304
1098
|
let omniaServiceId = getServiceId();
|
|
1305
1099
|
manifestIds.sort((manifestId1, manifestId2) => {
|
|
@@ -1316,18 +1110,32 @@ function createCombinedManfest(omniaServiceId, manifestIds, targetManifestId, ta
|
|
|
1316
1110
|
}
|
|
1317
1111
|
return result;
|
|
1318
1112
|
});
|
|
1319
|
-
|
|
1113
|
+
const jsBundleNames = [];
|
|
1114
|
+
const cssBundleNames = [];
|
|
1320
1115
|
for (let i = 0; i < manifestIds.length; i++) {
|
|
1321
1116
|
let manifest = $.composers.LoadableManifestRegistry.getRegisteredManifest(manifestIds[i]);
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1117
|
+
jsBundleNames[i] = outputDir + `/${manifest.resourceName ? manifest.resourceName + "_" : ""}${manifest.resourceId}.js`;
|
|
1118
|
+
const cssFilePath = outputDir + `/${manifest.resourceName ? manifest.resourceName + "_" : ""}${manifest.resourceId}.css`;
|
|
1119
|
+
if (!fsExtra.existsSync(jsBundleNames[i])) {
|
|
1120
|
+
throw new Error("Error, can't create combined bundle: " + targetJsFileName + " can't find bundle to include: " + jsBundleNames[i]);
|
|
1121
|
+
}
|
|
1122
|
+
if (fsExtra.existsSync(cssFilePath)) {
|
|
1123
|
+
cssBundleNames.push(cssFilePath);
|
|
1325
1124
|
}
|
|
1326
|
-
manifestIdToFileNameMap[manifestIds[i]] =
|
|
1125
|
+
manifestIdToFileNameMap[manifestIds[i]] = jsBundleNames[i];
|
|
1327
1126
|
$.tooling.log("Adding manifest bundle [" + manifestIds[i] + "] to group", $.tooling.LogTypes.Info);
|
|
1328
1127
|
}
|
|
1329
|
-
let
|
|
1330
|
-
|
|
1128
|
+
let mergedCssContent = "";
|
|
1129
|
+
cssBundleNames.forEach(filePath => {
|
|
1130
|
+
mergedCssContent = `${mergedCssContent}
|
|
1131
|
+
${fsExtra.readFileSync(filePath, 'utf8')}
|
|
1132
|
+
`;
|
|
1133
|
+
});
|
|
1134
|
+
if (mergedCssContent) {
|
|
1135
|
+
fsExtra.writeFileSync(`${outputDir}/${targetCssFileName}`, mergedCssContent);
|
|
1136
|
+
}
|
|
1137
|
+
let mergedJsContent = "";
|
|
1138
|
+
jsBundleNames.forEach(filePath => {
|
|
1331
1139
|
let manifestId = "";
|
|
1332
1140
|
let currentFilename = $.path.basename(filePath);
|
|
1333
1141
|
for (let id in manifestIdToFileNameMap) {
|
|
@@ -1340,13 +1148,13 @@ function createCombinedManfest(omniaServiceId, manifestIds, targetManifestId, ta
|
|
|
1340
1148
|
throw Error("Couldn't extract manifest id from filename: " + currentFilename);
|
|
1341
1149
|
}
|
|
1342
1150
|
let content = fsExtra.readFileSync(filePath, 'utf8');
|
|
1343
|
-
|
|
1344
|
-
${
|
|
1151
|
+
mergedJsContent = `
|
|
1152
|
+
${mergedJsContent}
|
|
1345
1153
|
/* Start of resource:${manifestId} */omniaWebpackJsonp["bb000000-0000-bbbb-0000-0000000000bb"]["${fx_models_1.OmniaResourceManifests.FxCore.toString()}"]("06e712d2-9897-4891-9353-148547efe61c").ManifestResourceLoader.registerWebComponentFromGroupBundle("${omniaServiceId}", "${manifestId}", "${targetManifestId}", function(){
|
|
1346
1154
|
${content}
|
|
1347
1155
|
})//End of resource:${manifestId} `;
|
|
1348
1156
|
});
|
|
1349
|
-
fsExtra.writeFileSync(`${outputDir}/${
|
|
1157
|
+
fsExtra.writeFileSync(`${outputDir}/${targetJsFileName}`, `/******/ if (typeof omniaLoader === 'undefined') {
|
|
1350
1158
|
/******/ globalThis['omniaLoader'] = {};
|
|
1351
1159
|
/******/ }
|
|
1352
1160
|
/******/ omniaLoader['${omniaServiceId}'] = omniaLoader['${omniaServiceId}'] || {};
|
|
@@ -1355,7 +1163,7 @@ ${content}
|
|
|
1355
1163
|
/******/
|
|
1356
1164
|
}
|
|
1357
1165
|
/******/ omniaLoader['${omniaServiceId}']['${targetManifestId}'] = function () {
|
|
1358
|
-
${
|
|
1166
|
+
${mergedJsContent}
|
|
1359
1167
|
}
|
|
1360
1168
|
${$.composers.LoadableManifestRegistry.isDefineWithNoDependency(targetManifestId) ? `omniaLoader['${omniaServiceId}']['${targetManifestId}']()` : ''}`, 'utf8');
|
|
1361
1169
|
$.tooling.log("Done - Creating manifest group bundle for manifest id: " + targetManifestId, $.tooling.LogTypes.HeadLine);
|
|
@@ -1439,12 +1247,17 @@ function buildReferenceManifest(currentEntry, entries) {
|
|
|
1439
1247
|
var manifests = [];
|
|
1440
1248
|
var dynamicReferenceManifests = [];
|
|
1441
1249
|
let buildOptions = getBuildOption();
|
|
1442
|
-
if (buildOptions && buildOptions.bundleOptions && buildOptions.bundleOptions.commonsChunk)
|
|
1443
|
-
return dynamicReferenceManifests.concat(buildReferenceManifestFromConfig());
|
|
1444
1250
|
var currentEntryName = Object.keys(currentEntry)[0];
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1251
|
+
if (buildOptions && buildOptions.bundleOptions && buildOptions.bundleOptions.commonsChunk)
|
|
1252
|
+
return dynamicReferenceManifests.concat(buildReferenceManifestFromConfig(currentEntryName));
|
|
1253
|
+
// exclude pre-built webpack manifest
|
|
1254
|
+
if ($.isExtensionEnv
|
|
1255
|
+
|| (currentEntryName.indexOf(fx_models_1.OmniaResourceManifests.Vendor.toString()) === -1
|
|
1256
|
+
&& currentEntryName.indexOf(vendorProdId) === -1
|
|
1257
|
+
// && currentEntryName.indexOf(OmniaResourceManifests.FxCore.toString()) === -1
|
|
1258
|
+
// && currentEntryName.indexOf(OmniaResourceManifests.Fx.toString()) === -1
|
|
1259
|
+
// && currentEntryName.indexOf(OmniaResourceManifests.FxUx.toString()) === -1
|
|
1260
|
+
)) {
|
|
1448
1261
|
Object.keys(entries).forEach((entryName) => {
|
|
1449
1262
|
if (entryName !== currentEntryName) {
|
|
1450
1263
|
if ($.fs.existsSync($.tooling.utils.root(outDirManifestMetadata + "/" + entryName + ".manifest.json"))) {
|
|
@@ -1458,14 +1271,14 @@ function buildReferenceManifest(currentEntry, entries) {
|
|
|
1458
1271
|
}
|
|
1459
1272
|
});
|
|
1460
1273
|
}
|
|
1461
|
-
manifests = buildReferenceManifestFromConfig().concat(dynamicReferenceManifests).concat(manifests);
|
|
1274
|
+
manifests = buildReferenceManifestFromConfig(currentEntryName).concat(dynamicReferenceManifests).concat(manifests);
|
|
1462
1275
|
return manifests;
|
|
1463
1276
|
}
|
|
1464
1277
|
function cleanUpComposer() {
|
|
1465
1278
|
$.composers.ManifestRegistry.clearState();
|
|
1466
1279
|
}
|
|
1467
1280
|
exports.cleanUpComposer = cleanUpComposer;
|
|
1468
|
-
function buildReferenceManifestFromConfig() {
|
|
1281
|
+
function buildReferenceManifestFromConfig(entryName) {
|
|
1469
1282
|
var manifests = [];
|
|
1470
1283
|
let buildOptions = getBuildOption();
|
|
1471
1284
|
if (buildOptions.reference) {
|
|
@@ -1477,6 +1290,17 @@ function buildReferenceManifestFromConfig() {
|
|
|
1477
1290
|
}));
|
|
1478
1291
|
}
|
|
1479
1292
|
}
|
|
1293
|
+
if (!isBuildWebpackManifestOnly() && buildOptions.webpackManifests) {
|
|
1294
|
+
for (let manifestPath of buildOptions.webpackManifests) {
|
|
1295
|
+
if (manifestPath.indexOf(entryName) === -1) {
|
|
1296
|
+
manifests.push(new $.omniaWebpackPlugins.DllReferencePlugin({
|
|
1297
|
+
context: $.tooling.utils.root(""),
|
|
1298
|
+
manifest: $.tooling.utils.root(manifestPath),
|
|
1299
|
+
// name: `md${++trackingModuleRefId}` //require('md5')(manifestPath)
|
|
1300
|
+
}));
|
|
1301
|
+
}
|
|
1302
|
+
}
|
|
1303
|
+
}
|
|
1480
1304
|
if ($.isExtensionEnv) {
|
|
1481
1305
|
_registeredReferenceManifests.forEach(manifest => {
|
|
1482
1306
|
manifests.push(new $.omniaWebpackPlugins.DllReferencePlugin({
|
|
@@ -1556,89 +1380,18 @@ function getServiceId() {
|
|
|
1556
1380
|
return serviceId;
|
|
1557
1381
|
}
|
|
1558
1382
|
exports.getServiceId = getServiceId;
|
|
1559
|
-
function
|
|
1560
|
-
let foundTypes = {};
|
|
1561
|
-
componentRegistrations.forEach((comp) => {
|
|
1562
|
-
let defPaths = comp.componentOptions.typings;
|
|
1563
|
-
if (defPaths) {
|
|
1564
|
-
let isChildSpec = false;
|
|
1565
|
-
defPaths.forEach((defPath) => {
|
|
1566
|
-
let entryPointPath = (0, shared_1.convertManifestPathToEntryPath)(comp.manifestPath, [defPath])[0];
|
|
1567
|
-
let contents = $.fs.readFileSync(entryPointPath, 'utf8');
|
|
1568
|
-
let wcEl = getWcElement(contents, isChildSpec);
|
|
1569
|
-
if (wcEl) {
|
|
1570
|
-
//Now lets find the interface mapped to element
|
|
1571
|
-
//example /*@WebComponentInterface("omfx-dialog")*/
|
|
1572
|
-
let interfaceToken = `/*@WebComponentInterface("${wcEl}")*/`;
|
|
1573
|
-
let interfaceIndex = contents.indexOf(interfaceToken);
|
|
1574
|
-
if (interfaceIndex > -1) {
|
|
1575
|
-
let wcProps = [];
|
|
1576
|
-
let intf = contents.substring(interfaceIndex);
|
|
1577
|
-
let nextIsDomProp = false;
|
|
1578
|
-
intf = intf
|
|
1579
|
-
.substring(intf.indexOf("{") + 1, intf.indexOf("}"))
|
|
1580
|
-
.replace(/\?/g, '')
|
|
1581
|
-
.trim()
|
|
1582
|
-
.split(/\r\n|\r|\n/g).forEach((group) => {
|
|
1583
|
-
/*@DomProperty*/
|
|
1584
|
-
let sub = group.trim();
|
|
1585
|
-
if (sub.indexOf("/*@DomProperty*/") > -1) {
|
|
1586
|
-
nextIsDomProp = true;
|
|
1587
|
-
return;
|
|
1588
|
-
}
|
|
1589
|
-
if (nextIsDomProp) {
|
|
1590
|
-
if (sub.indexOf(':')) {
|
|
1591
|
-
sub = sub.split(':')[0];
|
|
1592
|
-
}
|
|
1593
|
-
if (sub) {
|
|
1594
|
-
if (!foundTypes[wcEl]) {
|
|
1595
|
-
foundTypes[wcEl] = [];
|
|
1596
|
-
}
|
|
1597
|
-
foundTypes[wcEl].push(sub);
|
|
1598
|
-
}
|
|
1599
|
-
nextIsDomProp = false;
|
|
1600
|
-
}
|
|
1601
|
-
});
|
|
1602
|
-
}
|
|
1603
|
-
}
|
|
1604
|
-
isChildSpec = true;
|
|
1605
|
-
});
|
|
1606
|
-
}
|
|
1607
|
-
});
|
|
1608
|
-
return foundTypes;
|
|
1609
|
-
}
|
|
1610
|
-
var lastWcElement = "";
|
|
1611
|
-
function getWcElement(contents, isChildSpec) {
|
|
1612
|
-
if (isChildSpec) {
|
|
1613
|
-
if (lastWcElement === "") {
|
|
1614
|
-
new Error("Cant find the /*@DomProperty*/ on the parent interface for the WebComponent definition");
|
|
1615
|
-
}
|
|
1616
|
-
return lastWcElement;
|
|
1617
|
-
}
|
|
1618
|
-
else {
|
|
1619
|
-
lastWcElement = "";
|
|
1620
|
-
}
|
|
1621
|
-
let wcElToken = "/*@WebComponent*/";
|
|
1622
|
-
let wcElIndex = contents.indexOf(wcElToken);
|
|
1623
|
-
let wcEl = "";
|
|
1624
|
-
if (wcElIndex > -1) {
|
|
1625
|
-
wcEl = contents.substring(wcElIndex);
|
|
1626
|
-
wcEl = wcEl.substring(wcEl.indexOf('"') + 1);
|
|
1627
|
-
wcEl = wcEl.substring(0, wcEl.indexOf('"'));
|
|
1628
|
-
lastWcElement = wcEl;
|
|
1629
|
-
}
|
|
1630
|
-
return lastWcElement;
|
|
1631
|
-
}
|
|
1632
|
-
function createVueEntryFormRegistrations(registrations) {
|
|
1383
|
+
function createVueEntryFormComponentRegistrations(registrations) {
|
|
1633
1384
|
let entryPaths = {};
|
|
1634
1385
|
for (let r of registrations) {
|
|
1635
|
-
if (r.componentOptions.entryPoint.endsWith('.
|
|
1386
|
+
if (r.componentOptions.entryPoint.endsWith('.tsx')
|
|
1387
|
+
|| r.componentOptions.entryPoint.endsWith('.vue')) {
|
|
1636
1388
|
let entryPointPath = (0, shared_1.convertManifestPathToEntryPath)(r.manifestPath, [r.componentOptions.entryPoint]);
|
|
1637
1389
|
let entryId = r.manifest.resourceId;
|
|
1638
1390
|
if (r.manifest.resourceName) {
|
|
1639
1391
|
entryId = `${r.manifest.resourceName}_${entryId}`;
|
|
1640
1392
|
}
|
|
1641
|
-
|
|
1393
|
+
r.componentOptions.entryPointPath = entryPointPath[0];
|
|
1394
|
+
entryPaths[entryId.toString()] = entryPointPath;
|
|
1642
1395
|
}
|
|
1643
1396
|
else {
|
|
1644
1397
|
$.tooling.log('The OmniaFx build system only supports .jsx, .vue and .tsx based components at the moment ', $.tooling.LogTypes.Error);
|
|
@@ -1958,35 +1711,3 @@ function sortString(a, b) {
|
|
|
1958
1711
|
}
|
|
1959
1712
|
return -1;
|
|
1960
1713
|
}
|
|
1961
|
-
function generateWebComponentTypings(wc, template, info) {
|
|
1962
|
-
// export default defineVueWebComponent
|
|
1963
|
-
let wcPath = (0, shared_1.convertManifestPathToEntryPath)(wc.manifestPath, [wc.componentOptions.entryPoint])[0];
|
|
1964
|
-
let content = fsExtra.readFileSync(wcPath, 'utf8');
|
|
1965
|
-
if (content.indexOf("defineVueWebComponent") > -1) {
|
|
1966
|
-
if (!new RegExp('export\\s+default\\s+').test(content)) {
|
|
1967
|
-
throw new Error(`Missing statement 'export default a vue web component' in ${wcPath}`);
|
|
1968
|
-
}
|
|
1969
|
-
let friendlyManifestId = `wc${wc.manifest.resourceId.toString().replace(/-/g, '').toLowerCase()}`;
|
|
1970
|
-
let importPath = wcPath.substring(0, wcPath.lastIndexOf('.tsx'));
|
|
1971
|
-
if (importPath.indexOf("./") === 0) {
|
|
1972
|
-
importPath = importPath.replace("./", "");
|
|
1973
|
-
}
|
|
1974
|
-
if ($.isExtensionEnv) {
|
|
1975
|
-
importPath = `../../../../${importPath}`;
|
|
1976
|
-
}
|
|
1977
|
-
else {
|
|
1978
|
-
importPath = `../../../../${importPath}`;
|
|
1979
|
-
}
|
|
1980
|
-
let elementNamePascalCase = wc.componentOptions.elementName.replace("omfx-", "").replace(/-([a-z])/g, function (g) { return g[1].toUpperCase(); });
|
|
1981
|
-
elementNamePascalCase = elementNamePascalCase[0].toUpperCase() + elementNamePascalCase.substring(1, elementNamePascalCase.length);
|
|
1982
|
-
info.wc.mappings[elementNamePascalCase] = wc.componentOptions.elementName;
|
|
1983
|
-
return template
|
|
1984
|
-
.replace(/\/\/{{importWC}}/, `import ${friendlyManifestId} from '${importPath}';
|
|
1985
|
-
//{{importWC}}`)
|
|
1986
|
-
.replace(/\/\/{{elementName}}/, `"${wc.componentOptions.elementName}": typeof ${friendlyManifestId}.propsDefinition & Omit<VueComponentBaseProps, keyof typeof ${friendlyManifestId}.propsDefinition>
|
|
1987
|
-
//{{elementName}}`)
|
|
1988
|
-
.replace(/\/\/{{nselementName}}/, `"${elementNamePascalCase}": { new(...args: any[]): { $props: typeof ${friendlyManifestId}.propsDefinition & Omit<VueComponentBaseProps, keyof typeof ${friendlyManifestId}.propsDefinition> } }
|
|
1989
|
-
//{{nselementName}}`);
|
|
1990
|
-
}
|
|
1991
|
-
return template;
|
|
1992
|
-
}
|