@genexus/mercury 0.19.2 → 0.21.0
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/dist/assets/MERCURY_ASSETS.d.ts +28 -0
- package/dist/assets/MERCURY_ASSETS.js +1 -1
- package/dist/assets/MERCURY_ASSETS.ts +23130 -23102
- package/dist/assets/icons/patterns-default-associated/dark/default-associated-modified.svg +16 -0
- package/dist/assets/icons/patterns-default-associated/dark/default-associated-synchronized.svg +16 -0
- package/dist/assets/icons/patterns-default-associated/light/default-associated-modified.svg +16 -0
- package/dist/assets/icons/patterns-default-associated/light/default-associated-synchronized.svg +16 -0
- package/dist/bundles/css/all.css +1 -1
- package/dist/bundles/css/base/base-globant.css +1 -1
- package/dist/bundles/css/base/base.css +1 -1
- package/dist/bundles/css/base/icons.css +1 -1
- package/dist/bundles/css/components/accordion.css +1 -1
- package/dist/bundles/css/components/button.css +1 -1
- package/dist/bundles/css/components/chat.css +1 -1
- package/dist/bundles/css/components/code.css +1 -1
- package/dist/bundles/css/components/combo-box.css +1 -1
- package/dist/bundles/css/components/dialog.css +1 -1
- package/dist/bundles/css/components/dropdown.css +1 -1
- package/dist/bundles/css/components/edit.css +1 -1
- package/dist/bundles/css/components/flexible-layout.css +1 -1
- package/dist/bundles/css/components/icon.css +1 -1
- package/dist/bundles/css/components/list-box.css +1 -1
- package/dist/bundles/css/components/markdown-viewer.css +1 -1
- package/dist/bundles/css/components/navigation-list.css +1 -1
- package/dist/bundles/css/components/pills.css +1 -1
- package/dist/bundles/css/components/segmented-control.css +1 -1
- package/dist/bundles/css/components/slider.css +1 -1
- package/dist/bundles/css/components/switch.css +1 -1
- package/dist/bundles/css/components/tab.css +1 -1
- package/dist/bundles/css/components/tabular-grid.css +1 -1
- package/dist/bundles/css/components/tooltip.css +1 -1
- package/dist/bundles/css/utils/form--full.css +1 -1
- package/dist/bundles/css/utils/form.css +1 -1
- package/dist/bundles/css/utils/spacing.css +1 -1
- package/dist/cli/bundle.js +185 -17
- package/dist/cli/internal/constants.d.ts +3 -12
- package/dist/cli/internal/constants.js +4 -13
- package/dist/cli/internal/create-bundles-with-custom-paths.d.ts +10 -2
- package/dist/cli/internal/create-bundles-with-custom-paths.js +102 -55
- package/dist/cli/internal/file-management.d.ts +3 -2
- package/dist/cli/internal/file-management.js +45 -12
- package/dist/cli/internal/print-utils.d.ts +6 -6
- package/dist/cli/internal/print-utils.js +14 -12
- package/dist/cli/internal/transpile-bundle-and-create-mappings.d.ts +2 -3
- package/dist/cli/internal/transpile-bundle-and-create-mappings.js +37 -66
- package/dist/cli/internal/types.d.ts +0 -1
- package/dist/cli/internal/utils.d.ts +11 -8
- package/dist/cli/internal/utils.js +27 -22
- package/dist/cli/internal/validate-args.js +7 -1
- package/dist/cli/internal/watch-fs.d.ts +3 -0
- package/dist/cli/internal/watch-fs.js +92 -0
- package/dist/cli/mercury.js +2 -2
- package/package.json +17 -12
- package/dist/bundles/js/all.js +0 -1
- package/dist/bundles/js/base/base-globant.js +0 -1
- package/dist/bundles/js/base/base.js +0 -1
- package/dist/bundles/js/base/icons.js +0 -1
- package/dist/bundles/js/bundle-mappings.js +0 -237
- package/dist/bundles/js/chameleon/scrollbar.js +0 -1
- package/dist/bundles/js/components/accordion.js +0 -1
- package/dist/bundles/js/components/button.js +0 -1
- package/dist/bundles/js/components/chat.js +0 -1
- package/dist/bundles/js/components/checkbox.js +0 -1
- package/dist/bundles/js/components/code.js +0 -1
- package/dist/bundles/js/components/combo-box.js +0 -1
- package/dist/bundles/js/components/dialog.js +0 -1
- package/dist/bundles/js/components/dropdown.js +0 -1
- package/dist/bundles/js/components/edit.js +0 -1
- package/dist/bundles/js/components/flexible-layout.js +0 -1
- package/dist/bundles/js/components/icon.js +0 -1
- package/dist/bundles/js/components/layout-splitter.js +0 -1
- package/dist/bundles/js/components/list-box.js +0 -1
- package/dist/bundles/js/components/markdown-viewer.js +0 -1
- package/dist/bundles/js/components/navigation-list.js +0 -1
- package/dist/bundles/js/components/pills.js +0 -1
- package/dist/bundles/js/components/radio-group.js +0 -1
- package/dist/bundles/js/components/segmented-control.js +0 -1
- package/dist/bundles/js/components/sidebar.js +0 -1
- package/dist/bundles/js/components/slider.js +0 -1
- package/dist/bundles/js/components/switch.js +0 -1
- package/dist/bundles/js/components/tab.js +0 -1
- package/dist/bundles/js/components/tabular-grid.js +0 -1
- package/dist/bundles/js/components/ticket-list.js +0 -1
- package/dist/bundles/js/components/tooltip.js +0 -1
- package/dist/bundles/js/components/tree-view.js +0 -1
- package/dist/bundles/js/components/widget.js +0 -1
- package/dist/bundles/js/resets/box-sizing.js +0 -1
- package/dist/bundles/js/utils/elevation.js +0 -1
- package/dist/bundles/js/utils/form--full.js +0 -1
- package/dist/bundles/js/utils/form.js +0 -1
- package/dist/bundles/js/utils/layout.js +0 -1
- package/dist/bundles/js/utils/spacing.js +0 -1
- package/dist/bundles/js/utils/typography.js +0 -1
- package/dist/bundles/scss/all.scss +0 -8
- package/dist/bundles/scss/base/base.scss +0 -24
- package/dist/bundles/scss/base/icons.scss +0 -4
- package/dist/bundles/scss/chameleon/scrollbar.scss +0 -3
- package/dist/bundles/scss/components/accordion.scss +0 -3
- package/dist/bundles/scss/components/button.scss +0 -8
- package/dist/bundles/scss/components/chat.scss +0 -3
- package/dist/bundles/scss/components/checkbox.scss +0 -3
- package/dist/bundles/scss/components/code.scss +0 -3
- package/dist/bundles/scss/components/combo-box.scss +0 -3
- package/dist/bundles/scss/components/dialog.scss +0 -3
- package/dist/bundles/scss/components/dropdown.scss +0 -3
- package/dist/bundles/scss/components/edit.scss +0 -3
- package/dist/bundles/scss/components/flexible-layout.scss +0 -3
- package/dist/bundles/scss/components/icon.scss +0 -8
- package/dist/bundles/scss/components/layout-splitter.scss +0 -3
- package/dist/bundles/scss/components/list-box.scss +0 -3
- package/dist/bundles/scss/components/markdown-viewer.scss +0 -3
- package/dist/bundles/scss/components/navigation-list.scss +0 -3
- package/dist/bundles/scss/components/pills.scss +0 -3
- package/dist/bundles/scss/components/radio-group.scss +0 -3
- package/dist/bundles/scss/components/segmented-control.scss +0 -3
- package/dist/bundles/scss/components/sidebar.scss +0 -3
- package/dist/bundles/scss/components/slider.scss +0 -3
- package/dist/bundles/scss/components/switch.scss +0 -3
- package/dist/bundles/scss/components/tab.scss +0 -3
- package/dist/bundles/scss/components/tabular-grid.scss +0 -10
- package/dist/bundles/scss/components/ticket-list.scss +0 -3
- package/dist/bundles/scss/components/tooltip.scss +0 -3
- package/dist/bundles/scss/components/tree-view.scss +0 -3
- package/dist/bundles/scss/components/widget.scss +0 -3
- package/dist/bundles/scss/resets/box-sizing.scss +0 -3
- package/dist/bundles/scss/utils/elevation.scss +0 -4
- package/dist/bundles/scss/utils/form--full.scss +0 -20
- package/dist/bundles/scss/utils/form.scss +0 -4
- package/dist/bundles/scss/utils/layout.scss +0 -4
- package/dist/bundles/scss/utils/spacing.scss +0 -4
- package/dist/bundles/scss/utils/typography.scss +0 -9
- package/dist/mercury.scss +0 -24789
|
@@ -1,86 +1,57 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import * as sass from "sass";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { printBundleWasTranspiled } from "./print-utils.js";
|
|
4
|
+
import { BASE_BUNDLE, BASE_GLOBANT_BUNDLE, BASE_GLOBANT_CSS_FILE, CSS_BUNDLES_OUT_DIR, DEFAULT_FONT_FACE_PATH, DEFAULT_ICONS_PATH, SCSS_BUNDLES_INPUT_DIR, SCSS_BUNDLES_OUT_DIR } from "./constants.js";
|
|
5
|
+
import { replacePlaceholdersInBundle, sanitizeBundleName } from "./utils.js";
|
|
7
6
|
const transpileBundle = (filePath, globant) => sass.compile(filePath, {
|
|
8
7
|
loadPaths: [globant ? "src/config/globant" : "src/config/default"],
|
|
9
8
|
style: "compressed"
|
|
10
9
|
}).css;
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
const BUNDLES = [];
|
|
14
|
-
const addBaseGlobantFile = (fileMetadata, cssOutDir, jsOutDir) => {
|
|
10
|
+
let BUNDLES = [];
|
|
11
|
+
const transpileGlobantCssFile = async (fileMetadata, cssOutDir) => {
|
|
15
12
|
const { filePath } = fileMetadata;
|
|
16
13
|
BUNDLES.push({
|
|
17
14
|
fileDir: fileMetadata.dir
|
|
18
15
|
.replace(SCSS_BUNDLES_OUT_DIR, "")
|
|
19
|
-
.replace("\\", "/")
|
|
20
|
-
bundleNameWithBackSlash: filePath
|
|
21
|
-
.replace(SCSS_BUNDLES_OUT_DIR, "")
|
|
22
|
-
.replace(BASE_SCSS_FILE, BASE_GLOBANT_FILE)
|
|
16
|
+
.replace("\\", "/")
|
|
23
17
|
});
|
|
24
18
|
const transpiledBundle = transpileBundle(filePath, true);
|
|
25
19
|
// Store the CSS file with its default values
|
|
26
|
-
fs.
|
|
27
|
-
// Store the CSS file in a JS file with placeholders for the values
|
|
28
|
-
fs.writeFileSync(path.join(jsOutDir, BASE_GLOBANT_JS_FILE), `export const bundle = \`${transpiledBundle}\`;`);
|
|
29
|
-
printBundleWasTranspiled(filePath.replace(BASE_SCSS_FILE, BASE_GLOBANT_SCSS_FILE));
|
|
20
|
+
await fs.writeFile(path.join(cssOutDir, BASE_GLOBANT_CSS_FILE), replacePlaceholdersInBundle(transpiledBundle, DEFAULT_FONT_FACE_PATH, DEFAULT_ICONS_PATH));
|
|
30
21
|
};
|
|
31
|
-
export const transpileCssBundleWithPlaceholder = (fileMetadata) => {
|
|
32
|
-
const { fileName
|
|
33
|
-
|
|
34
|
-
const
|
|
22
|
+
export const transpileCssBundleWithPlaceholder = async (fileMetadata, args) => {
|
|
23
|
+
const { fileName } = fileMetadata;
|
|
24
|
+
let actualFilePath = fileMetadata.filePath;
|
|
25
|
+
const hasGlobantVariant = args?.globant ?? false;
|
|
26
|
+
const cssOutDir = fileMetadata.dir.replace(SCSS_BUNDLES_INPUT_DIR, CSS_BUNDLES_OUT_DIR);
|
|
35
27
|
const fileNameCssExt = fileName.replace(".scss", ".css");
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
28
|
+
const bundleName = sanitizeBundleName(actualFilePath.replace(SCSS_BUNDLES_INPUT_DIR, "").replace(".scss", ""));
|
|
29
|
+
// There is no need to generate the base-globant.css file, since the base.css
|
|
30
|
+
// file already contains this file
|
|
31
|
+
if (hasGlobantVariant) {
|
|
32
|
+
if (bundleName === BASE_GLOBANT_BUNDLE) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// Replace the content of the base bundle with the Globant variant
|
|
36
|
+
if (bundleName === BASE_BUNDLE) {
|
|
37
|
+
actualFilePath = actualFilePath.replace(BASE_BUNDLE, BASE_GLOBANT_BUNDLE);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// The Globant variant is not forced, so we are creating both bundles, the
|
|
41
|
+
// base/base and base/base-globant bundles
|
|
42
|
+
else if (bundleName === BASE_BUNDLE) {
|
|
43
|
+
transpileGlobantCssFile({
|
|
44
|
+
dir: fileMetadata.dir,
|
|
45
|
+
fileName: fileName.replace(BASE_BUNDLE, BASE_GLOBANT_BUNDLE),
|
|
46
|
+
filePath: actualFilePath
|
|
47
|
+
}, cssOutDir);
|
|
48
|
+
}
|
|
40
49
|
BUNDLES.push({
|
|
41
50
|
fileDir: fileMetadata.dir
|
|
42
|
-
.replace(
|
|
43
|
-
.replace("\\", "/")
|
|
44
|
-
bundleNameWithBackSlash
|
|
51
|
+
.replace(SCSS_BUNDLES_INPUT_DIR, "")
|
|
52
|
+
.replace("\\", "/")
|
|
45
53
|
});
|
|
46
|
-
|
|
47
|
-
if (!CSS_CREATED_DIRS.has(cssOutDir)) {
|
|
48
|
-
fs.mkdirSync(cssOutDir, { recursive: true });
|
|
49
|
-
fs.mkdirSync(jsOutDir, { recursive: true });
|
|
50
|
-
CSS_CREATED_DIRS.add(cssOutDir);
|
|
51
|
-
JS_CREATED_DIRS.add(jsOutDir);
|
|
52
|
-
}
|
|
53
|
-
const transpiledBundle = transpileBundle(filePath, false);
|
|
54
|
+
const transpiledBundle = transpileBundle(actualFilePath, hasGlobantVariant);
|
|
54
55
|
// Store the CSS file with its default values
|
|
55
|
-
fs.
|
|
56
|
-
// Store the CSS file in a JS file with placeholders for the values
|
|
57
|
-
fs.writeFileSync(path.join(jsOutDir, fileNameJsExt), `export const bundle = \`${transpiledBundle}\`;`);
|
|
58
|
-
printBundleWasTranspiled(filePath);
|
|
59
|
-
if (bundleNameWithBackSlash.replaceAll("/", "\\") ===
|
|
60
|
-
BASE_BUNDLE_WITH_BACK_SLASH) {
|
|
61
|
-
addBaseGlobantFile(fileMetadata, cssOutDir, jsOutDir);
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
const createBundleEntryInMappingFile = (bundleName, fileDir, transpiledBundleRef) => ` {
|
|
65
|
-
${BUNDLE_MAPPING_ENTRIES.BUNDLE_NAME}: "${bundleName}",
|
|
66
|
-
${BUNDLE_MAPPING_ENTRIES.FILE_DIR}: "${fileDir}",
|
|
67
|
-
${BUNDLE_MAPPING_ENTRIES.TRANSPILED_BUNDLE}: ${transpiledBundleRef}
|
|
68
|
-
}`;
|
|
69
|
-
export const createBundleMappingsFile = () => {
|
|
70
|
-
let bundleAssociationImports = "";
|
|
71
|
-
let bundleMappingObjectEntries = "";
|
|
72
|
-
BUNDLES.forEach(bundleMetadata => {
|
|
73
|
-
const bundleName = bundleMetadata.bundleNameWithBackSlash
|
|
74
|
-
.replaceAll("\\", "/")
|
|
75
|
-
.substring(1);
|
|
76
|
-
const transpiledBundleRef = getBundleNameWithoutSpecialChars(bundleName);
|
|
77
|
-
const bundleEntry = createBundleEntryInMappingFile(bundleName, bundleMetadata.fileDir, transpiledBundleRef);
|
|
78
|
-
bundleAssociationImports += `import { bundle as ${transpiledBundleRef} } from "./${bundleName}.js";\n`;
|
|
79
|
-
// Concat entries in the object
|
|
80
|
-
bundleMappingObjectEntries +=
|
|
81
|
-
bundleMappingObjectEntries === "" ? bundleEntry : ",\n" + bundleEntry;
|
|
82
|
-
});
|
|
83
|
-
bundleMappingObjectEntries = `\nexport const bundleMappings = [\n${bundleMappingObjectEntries}\n];`;
|
|
84
|
-
// Create the JS file that contains all mappings for the bundle
|
|
85
|
-
fs.writeFileSync(path.join(JS_BUNDLES_OUT_DIR, BUNDLE_MAPPING_FILE), bundleAssociationImports + bundleMappingObjectEntries);
|
|
56
|
+
await fs.writeFile(path.join(cssOutDir, fileNameCssExt), replacePlaceholdersInBundle(transpiledBundle, DEFAULT_FONT_FACE_PATH, DEFAULT_ICONS_PATH));
|
|
86
57
|
};
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
import type { FileMetadata } from "./types";
|
|
1
2
|
export declare const getFileSize: (fileContent: string) => string;
|
|
2
3
|
export declare const getHash: (fileContent: string) => string;
|
|
3
|
-
export declare const
|
|
4
|
+
export declare const getFileNameWithHash: <B extends string, H extends string>(bundleName: B, hash: H) => `${B}-${H}`;
|
|
4
5
|
export declare const replacePlaceholdersInBundle: (transpiledBundle: string, fontFaceValue: string, iconsValue: string) => string;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
export declare const measureTime: (callback: (() => void) | (() => Promise<void>)) => Promise<void>;
|
|
7
|
+
export declare const sanitizeBundleName: (bundleName: string) => string;
|
|
8
|
+
export declare const getBundleFolder: (fileMetadata: FileMetadata) => string;
|
|
9
|
+
export declare const getBundleFolderAndFileBaseDir: (fileMetadata: FileMetadata, outDir: string) => {
|
|
10
|
+
bundleFolder: string;
|
|
11
|
+
fileBaseDirToWrite: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const getFileNameWithoutExt: (fileMetadata: FileMetadata) => string;
|
|
14
|
+
export declare const getBundleName: (fileMetadata: FileMetadata) => string;
|
|
@@ -1,42 +1,47 @@
|
|
|
1
1
|
import crypto from "node:crypto";
|
|
2
2
|
import { styleText } from "node:util";
|
|
3
|
-
import { FONT_FACE_PATH_PLACEHOLDER, ICONS_PATH_PLACEHOLDER, KB
|
|
3
|
+
import { CSS_BUNDLES_OUT_DIR, FONT_FACE_PATH_PLACEHOLDER, HASH_LENGTH, ICONS_PATH_PLACEHOLDER, KB
|
|
4
|
+
// SPECIAL_CHARS_IN_BUNDLE_NAME_REGEX
|
|
5
|
+
} from "./constants.js";
|
|
6
|
+
import path from "node:path";
|
|
4
7
|
export const getFileSize = (fileContent) => {
|
|
5
8
|
const fileLength = fileContent.length;
|
|
6
9
|
if (fileLength < KB) {
|
|
7
|
-
return fileLength + "
|
|
10
|
+
return fileLength + " bytes";
|
|
8
11
|
}
|
|
9
12
|
const fileLengthInKB = fileLength / KB;
|
|
10
13
|
if (fileLengthInKB < KB) {
|
|
11
|
-
return fileLengthInKB + "
|
|
14
|
+
return fileLengthInKB.toFixed(2) + " kB";
|
|
12
15
|
}
|
|
13
16
|
const fileLengthInMB = fileLengthInKB / KB;
|
|
14
17
|
if (fileLengthInMB < KB) {
|
|
15
|
-
return fileLengthInMB.toFixed(
|
|
18
|
+
return fileLengthInMB.toFixed(2) + " MB";
|
|
16
19
|
}
|
|
17
20
|
const fileLengthInGB = fileLengthInMB / KB;
|
|
18
|
-
return fileLengthInGB.toFixed(
|
|
21
|
+
return fileLengthInGB.toFixed(2) + " GB";
|
|
19
22
|
};
|
|
20
|
-
export const getHash = (fileContent) => crypto
|
|
21
|
-
|
|
23
|
+
export const getHash = (fileContent) => crypto
|
|
24
|
+
.createHash("md5")
|
|
25
|
+
.update(fileContent)
|
|
26
|
+
.digest("hex")
|
|
27
|
+
.substring(HASH_LENGTH);
|
|
28
|
+
export const getFileNameWithHash = (bundleName, hash) => `${bundleName}-${hash}`;
|
|
22
29
|
export const replacePlaceholdersInBundle = (transpiledBundle, fontFaceValue, iconsValue) => transpiledBundle
|
|
23
30
|
.replaceAll(ICONS_PATH_PLACEHOLDER, iconsValue)
|
|
24
31
|
.replaceAll(FONT_FACE_PATH_PLACEHOLDER, fontFaceValue);
|
|
25
|
-
|
|
26
|
-
* @example
|
|
27
|
-
* "base/icons" --> "baseIcons"
|
|
28
|
-
* "utils/form--full" --> "utilsFormFull"
|
|
29
|
-
*/
|
|
30
|
-
export const getBundleNameWithoutSpecialChars = (bundleName) => {
|
|
31
|
-
const bundleNameNoSpecialChars = bundleName
|
|
32
|
-
.split(SPECIAL_CHARS_IN_BUNDLE_NAME_REGEX)
|
|
33
|
-
.map(subPath => subPath.charAt(0).toUpperCase() + subPath.slice(1))
|
|
34
|
-
.join("");
|
|
35
|
-
return (bundleNameNoSpecialChars.charAt(0).toLowerCase() +
|
|
36
|
-
bundleNameNoSpecialChars.slice(1));
|
|
37
|
-
};
|
|
38
|
-
export const measureTime = (callback) => {
|
|
32
|
+
export const measureTime = async (callback) => {
|
|
39
33
|
console.time(styleText("green", "Done in"));
|
|
40
|
-
callback();
|
|
34
|
+
await callback();
|
|
41
35
|
console.timeEnd(styleText("green", "Done in"));
|
|
42
36
|
};
|
|
37
|
+
export const sanitizeBundleName = (bundleName) => bundleName.replaceAll("\\", "/").replace(/^\//, "");
|
|
38
|
+
export const getBundleFolder = (fileMetadata) => fileMetadata.dir.split(CSS_BUNDLES_OUT_DIR)[1];
|
|
39
|
+
export const getBundleFolderAndFileBaseDir = (fileMetadata, outDir) => {
|
|
40
|
+
const bundleFolder = getBundleFolder(fileMetadata);
|
|
41
|
+
return {
|
|
42
|
+
bundleFolder,
|
|
43
|
+
fileBaseDirToWrite: path.join(outDir, bundleFolder)
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
export const getFileNameWithoutExt = (fileMetadata) => fileMetadata.fileName.replace(/.css$/, "");
|
|
47
|
+
export const getBundleName = (fileMetadata) => sanitizeBundleName(`${getBundleFolder(fileMetadata)}/${getFileNameWithoutExt(fileMetadata)}`);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DEFAULT_FONT_FACE_PATH, DEFAULT_ICONS_PATH, DEFAULT_OUT_DIR_PATH, SEPARATE_BY_COMMA_REGEX } from "./constants.js";
|
|
2
2
|
import { printArgumentDoesNotExistsError, printDuplicatedArgumentError, printInvalidArgumentError, printMissingFontPathArgumentWarning, printMissingIconsPathArgumentWarning, printMissingOutDirPathArgumentWarning } from "./print-utils.js";
|
|
3
|
+
import { sanitizeBundleName } from "./utils.js";
|
|
3
4
|
const ARGUMENT_VALUE_AND_NAME_SEPARATOR_REGEX = /\s*=\s*/g;
|
|
4
5
|
const ERROR_IN_CHECK = false;
|
|
5
6
|
const SUCCESS_CHECK = true;
|
|
@@ -40,6 +41,9 @@ const checkArgument = (argument) => {
|
|
|
40
41
|
}
|
|
41
42
|
const argNameWithValue = argument.split(ARGUMENT_VALUE_AND_NAME_SEPARATOR_REGEX);
|
|
42
43
|
if (argNameWithValue.length !== 2) {
|
|
44
|
+
if (argNameWithValue[0] === "--watch") {
|
|
45
|
+
return SUCCESS_CHECK;
|
|
46
|
+
}
|
|
43
47
|
printInvalidArgumentError(argument);
|
|
44
48
|
return ERROR_IN_CHECK;
|
|
45
49
|
}
|
|
@@ -109,8 +113,10 @@ export const getArguments = () => {
|
|
|
109
113
|
if (anyWarning) {
|
|
110
114
|
console.log("");
|
|
111
115
|
}
|
|
116
|
+
// Sanitize bundle names to avoid issues with "/" and "\" in paths
|
|
117
|
+
const sanitizedAvoidHash = new Set(avoidHash.map(bundleName => sanitizeBundleName(bundleName)));
|
|
112
118
|
return {
|
|
113
|
-
avoidHash: new Set(
|
|
119
|
+
avoidHash: new Set(sanitizedAvoidHash),
|
|
114
120
|
globant: hasGlobant,
|
|
115
121
|
fontFacePath,
|
|
116
122
|
iconsPath,
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { styleText } from "node:util";
|
|
5
|
+
import readline from "readline";
|
|
6
|
+
/**
|
|
7
|
+
* This debounce value is useful to batch multiples updates attempt into a
|
|
8
|
+
* single compilation. In some cases, multiples files can be changed at one, so
|
|
9
|
+
* if we don't debounce the next compilation, we would trigger to compilations.
|
|
10
|
+
*
|
|
11
|
+
* This case can also happen when performing ESLint on auto-save.
|
|
12
|
+
*/
|
|
13
|
+
const DEBOUNCE = 100; // 100ms
|
|
14
|
+
const progressDictionary = {
|
|
15
|
+
0: "-",
|
|
16
|
+
1: "\\",
|
|
17
|
+
2: "|",
|
|
18
|
+
3: "/"
|
|
19
|
+
};
|
|
20
|
+
let lastRebuildInterval;
|
|
21
|
+
let updateCounter = 0;
|
|
22
|
+
const readLineInterface = readline.createInterface({
|
|
23
|
+
input: process.stdin,
|
|
24
|
+
output: process.stdout
|
|
25
|
+
});
|
|
26
|
+
export const printRebuilding = (firstBuild) => {
|
|
27
|
+
// Hide the cursor to improve the CLI design
|
|
28
|
+
readLineInterface.write("\u001B[?25l");
|
|
29
|
+
// First write
|
|
30
|
+
process.stdout.write(`${styleText("yellow", progressDictionary[(updateCounter % 4)])} ${firstBuild ? "Building bundles..." : "Changes detected. Rebuilding..."}`);
|
|
31
|
+
// Update the left symbol each 100ms
|
|
32
|
+
lastRebuildInterval = setInterval(() => {
|
|
33
|
+
process.stdout.cursorTo(1);
|
|
34
|
+
process.stdout.clearLine(-1);
|
|
35
|
+
process.stdout.cursorTo(0);
|
|
36
|
+
process.stdout.write(`${styleText("yellow", progressDictionary[(updateCounter % 4)])}`);
|
|
37
|
+
updateCounter++;
|
|
38
|
+
}, 100);
|
|
39
|
+
};
|
|
40
|
+
export const stopRebuildingStdout = () => {
|
|
41
|
+
clearInterval(lastRebuildInterval);
|
|
42
|
+
process.stdout.clearLine(0);
|
|
43
|
+
console.log("");
|
|
44
|
+
updateCounter = 0;
|
|
45
|
+
// Show again the cursor
|
|
46
|
+
readLineInterface.write("\u001B[?25h");
|
|
47
|
+
};
|
|
48
|
+
export const watchFileSystemChanges = (callbackToCompile) => {
|
|
49
|
+
// This is a WA to have __filename and __dirname in ES modules
|
|
50
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
51
|
+
const SRC_PATH = path.join(__filename, "../../../../src");
|
|
52
|
+
const BASE_PATH = path.join(SRC_PATH, "base");
|
|
53
|
+
const BUNDLES_PATH = path.join(SRC_PATH, "bundles");
|
|
54
|
+
const COMPONENTS_PATH = path.join(SRC_PATH, "components");
|
|
55
|
+
const MERCURY_SCSS_PATH = path.join(SRC_PATH, "mercury.scss");
|
|
56
|
+
let compileStatus = "idle";
|
|
57
|
+
const performCompilationIfNecessary = () => {
|
|
58
|
+
// The current compilation is waiting to be started, so there is no need to
|
|
59
|
+
// queue another one after the current has finished
|
|
60
|
+
if (compileStatus === "debouncing-compiling") {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// There is no compilation in process. Queue one.
|
|
64
|
+
if (compileStatus === "idle") {
|
|
65
|
+
compileStatus = "debouncing-compiling";
|
|
66
|
+
}
|
|
67
|
+
// There is a compilation in progress. We can set a flag to queue a
|
|
68
|
+
// compilation after the current one has finished
|
|
69
|
+
else {
|
|
70
|
+
if (compileStatus === "compiling") {
|
|
71
|
+
compileStatus = "queued-after-compile";
|
|
72
|
+
}
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
setTimeout(() => {
|
|
76
|
+
compileStatus = "compiling";
|
|
77
|
+
console.time(styleText("green", "Rebuild done in"));
|
|
78
|
+
callbackToCompile().then(() => {
|
|
79
|
+
console.timeEnd(styleText("green", "Rebuild done in"));
|
|
80
|
+
const hasToRecompile = compileStatus === "queued-after-compile";
|
|
81
|
+
compileStatus = "idle";
|
|
82
|
+
if (hasToRecompile) {
|
|
83
|
+
performCompilationIfNecessary();
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}, DEBOUNCE);
|
|
87
|
+
};
|
|
88
|
+
fs.watch(BASE_PATH, { recursive: true }, performCompilationIfNecessary);
|
|
89
|
+
fs.watch(BUNDLES_PATH, { recursive: true }, performCompilationIfNecessary);
|
|
90
|
+
fs.watch(COMPONENTS_PATH, { recursive: true }, performCompilationIfNecessary);
|
|
91
|
+
fs.watch(MERCURY_SCSS_PATH, { recursive: true }, performCompilationIfNecessary);
|
|
92
|
+
};
|
package/dist/cli/mercury.js
CHANGED
|
@@ -3,12 +3,12 @@ import { createBundlesWithCustomPaths } from "./internal/create-bundles-with-cus
|
|
|
3
3
|
import { ensureDirectoryExistsAndItsClear } from "./internal/file-management.js";
|
|
4
4
|
import { getArguments } from "./internal/validate-args.js";
|
|
5
5
|
import { measureTime } from "./internal/utils.js";
|
|
6
|
-
measureTime(() => {
|
|
6
|
+
measureTime(async () => {
|
|
7
7
|
// Improve process visualization
|
|
8
8
|
console.log("");
|
|
9
9
|
const args = getArguments();
|
|
10
10
|
if (args) {
|
|
11
11
|
ensureDirectoryExistsAndItsClear(args.outDirPath);
|
|
12
|
-
createBundlesWithCustomPaths(args);
|
|
12
|
+
await createBundlesWithCustomPaths(args);
|
|
13
13
|
}
|
|
14
14
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@genexus/mercury",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.0",
|
|
4
4
|
"description": "Mercury Design System is a robust and scalable solution designed to improve product development.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -47,35 +47,40 @@
|
|
|
47
47
|
},
|
|
48
48
|
"scripts": {
|
|
49
49
|
"build": "yarn build.js && yarn icons-svg && yarn icons-sass && yarn build.scss && yarn copy-tasks && yarn showcase.scss",
|
|
50
|
-
"build.js": "tsc && esbuild dist/*.js --allow-overwrite --minify --outdir=dist && esbuild dist/assets/*.js --allow-overwrite --minify --outdir=dist/assets",
|
|
50
|
+
"build.js": "tsc && esbuild dist/*.js --allow-overwrite --minify --outdir=dist --log-level=silent && esbuild dist/assets/*.js --allow-overwrite --minify --outdir=dist/assets --log-level=silent",
|
|
51
51
|
"build-no-svg": "yarn build.js && yarn build.scss && yarn copy-tasks",
|
|
52
52
|
"build.scss": "yarn build.scss.base && yarn build.scss.bundles",
|
|
53
|
-
"build.scss.
|
|
54
|
-
"build.scss.base": "scss-bundle -e ./src/mercury.scss -o dist/mercury.scss",
|
|
53
|
+
"build.scss.base": "scss-bundle -e ./src/icons/_generated/categories.scss -o src/icons/_generated/categories-bundled.scss --logLevel=silent",
|
|
55
54
|
"build.scss.bundles": "node dist/cli/bundle.js",
|
|
56
|
-
"build.scss.
|
|
55
|
+
"build.scss.watch": "tsc && yarn build.scss.base && yarn copy-tasks && yarn build.scss.bundles --watch -i=/assets/icons/ -f=/assets/fonts/ --outDir=../showcase/.mercury/ --avoid-hash=base/base",
|
|
57
56
|
"start": "vite --port 5200 --open showcase/button.html",
|
|
58
|
-
"validate.ci": "yarn build-no-svg",
|
|
57
|
+
"validate.ci": "yarn build-no-svg && yarn test",
|
|
59
58
|
"icons-svg": "ssg-svg --srcDir=src/icons/svg-source --outDir=src/assets/icons/_generated/ --configFilePath=src/icons/svg-source/.config/color-states.json --showcaseDir=showcase/icons/ --showcaseBaseHref=../assets/icons/ --logDir=./log --objectFilePath=src/assets/MERCURY_ASSETS.ts --defaultColorType=on-surface",
|
|
60
59
|
"icons-sass": "ssg-sass --srcDir=src/assets/icons/ --outDir=src/icons/_generated/ --configFilePath=src/icons/svg-source/.config/color-states.json --vendorPrefix=",
|
|
61
60
|
"watch.scss": "chokidar src/**/*.scss ../common/**/*.scss -c \"npm run build.scss\"",
|
|
62
61
|
"watch.scss.mac": "chokidar 'src/**/*.scss' '../common/**/*.scss' -c \"npm run build.scss\"",
|
|
63
|
-
"copy-all.css": "fse copy dist/bundles/css/all.css showcase/all.css",
|
|
64
62
|
"copy-tasks": "node copy-tasks.js",
|
|
65
|
-
"showcase.scss": "sass showcase/scss/showcase-sass.scss showcase/css/showcase-sass.css"
|
|
63
|
+
"showcase.scss": "sass showcase/scss/showcase-sass.scss showcase/css/showcase-sass.css",
|
|
64
|
+
"coverage": "yarn playwright install && vitest watch run --coverage",
|
|
65
|
+
"test": "yarn playwright install && vitest",
|
|
66
|
+
"test.watch": "yarn playwright install && vitest watch"
|
|
66
67
|
},
|
|
67
68
|
"license": "Apache-2.0",
|
|
68
69
|
"devDependencies": {
|
|
69
|
-
"@atao60/fse-cli": "^0.1.9",
|
|
70
70
|
"@genexus/chameleon-controls-library": "~6.5.0",
|
|
71
71
|
"@genexus/svg-sass-generator": "1.1.24",
|
|
72
|
+
"@vitest/browser": "~3.1.1",
|
|
73
|
+
"@vitest/coverage-v8": "~3.1.1",
|
|
74
|
+
"@vitest/ui": "~3.1.1",
|
|
72
75
|
"@types/node": "~22.10.5",
|
|
73
76
|
"chokidar": "^3.6.0",
|
|
74
77
|
"chokidar-cli": "^3.0.0",
|
|
75
|
-
"esbuild": "0.
|
|
76
|
-
"
|
|
78
|
+
"esbuild": "0.25.0",
|
|
79
|
+
"playwright": "~1.51.1",
|
|
80
|
+
"sass": "~1.86.3",
|
|
77
81
|
"scss-bundle": "~3.1.2",
|
|
78
82
|
"typescript": "~5.5.3",
|
|
79
|
-
"vite": "~
|
|
83
|
+
"vite": "~6.2.5",
|
|
84
|
+
"vitest": "~3.1.1"
|
|
80
85
|
}
|
|
81
86
|
}
|