@shoper/cli 0.8.1-5 → 0.8.3-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/build/theme/class/browser/browser.js +1 -0
- package/build/theme/commands/push/theme_push_command.js +7 -2
- package/build/theme/commands/push/ui/theme_invalid_folders_error.js +16 -0
- package/build/theme/utils/push_validators/push_path_validator_utils.js +16 -0
- package/build/theme/utils/push_validators/push_validator_constants.js +8 -0
- package/build/utils/zip/create_zip_utils.js +6 -6
- package/package.json +1 -1
|
@@ -43,6 +43,7 @@ export class Browser {
|
|
|
43
43
|
const id = tabId ?? `tab-${uuid()}`;
|
|
44
44
|
this.#onInfo?.(`Opening new tab ${id}: ${url}`);
|
|
45
45
|
const page = await this.#browser.newPage();
|
|
46
|
+
await page.setCacheEnabled(false);
|
|
46
47
|
await page.goto(url, { waitUntil: 'networkidle2' });
|
|
47
48
|
this.#tabs.set(id, { page, url });
|
|
48
49
|
this.#onInfo?.(`Tab ${id} opened successfully`);
|
|
@@ -25,6 +25,8 @@ import { ThemeError } from '../ui/theme_error.js';
|
|
|
25
25
|
import { mapToPermissionsTree } from '../../utils/directory_validator/directory_validator_utils.js';
|
|
26
26
|
import { mapChecksumToTree } from '../../../utils/checksums/checksums_utils.js';
|
|
27
27
|
import { ThemeUnpermittedActionsError } from './ui/theme_unpermitted_actions_error.js';
|
|
28
|
+
import { validateThemeFolderStructure } from '../../utils/push_validators/push_path_validator_utils.js';
|
|
29
|
+
import { ThemeInvalidFoldersError } from './ui/theme_invalid_folders_error.js';
|
|
28
30
|
import { LOGGER_API_NAME } from '../../../cli/utilities/features/logger/logger_constants.js';
|
|
29
31
|
export class ThemePushCommand extends BaseThemeCommand {
|
|
30
32
|
static summary = 'Uploads your local theme files to the store and overwrites the current version of the theme in your store.';
|
|
@@ -86,8 +88,11 @@ export class ThemePushCommand extends BaseThemeCommand {
|
|
|
86
88
|
permissions: mapToPermissionsTree(permissions),
|
|
87
89
|
rootDirectory: executionContext.themeRootDir
|
|
88
90
|
});
|
|
89
|
-
|
|
90
|
-
|
|
91
|
+
const folderStructureValidation = await validateThemeFolderStructure(executionContext.themeRootDir);
|
|
92
|
+
if (!folderStructureValidation.isValid) {
|
|
93
|
+
renderOnce(React.createElement(ThemeInvalidFoldersError, { invalidDirectories: folderStructureValidation.invalidDirectories }));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
91
96
|
if (!validationResult.isValid) {
|
|
92
97
|
renderOnce(React.createElement(ThemeUnpermittedActionsError, { unpermittedActions: validationResult.unpermittedActions }));
|
|
93
98
|
return;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { List } from '../../../../ui/list/list.js';
|
|
2
|
+
import { Error } from '../../../../ui/message_box/error.js';
|
|
3
|
+
import { Text } from '../../../../ui/text.js';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { ALLOWED_THEME_TOP_LEVEL_DIRECTORIES } from '../../../utils/push_validators/push_validator_constants.js';
|
|
6
|
+
export const ThemeInvalidFoldersError = ({ invalidDirectories }) => {
|
|
7
|
+
const items = invalidDirectories.map((dir) => ({
|
|
8
|
+
content: dir
|
|
9
|
+
}));
|
|
10
|
+
return (React.createElement(Error, { header: "Invalid theme folder structure" },
|
|
11
|
+
React.createElement(Text, null, "The following directories are not allowed in the theme root:"),
|
|
12
|
+
React.createElement(List, { items: items }),
|
|
13
|
+
React.createElement(Text, null,
|
|
14
|
+
"Allowed top-level directories: ",
|
|
15
|
+
ALLOWED_THEME_TOP_LEVEL_DIRECTORIES.join(', '))));
|
|
16
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { getAllDirectoriesNamesInside } from '../../../utils/fs/fs_utils.js';
|
|
2
|
+
import { ALLOWED_THEME_TOP_LEVEL_DIRECTORIES } from './push_validator_constants.js';
|
|
3
|
+
export const validateThemeFolderStructure = async (themeRootDir) => {
|
|
4
|
+
const directories = await getAllDirectoriesNamesInside(themeRootDir, { recursive: false, hidden: true });
|
|
5
|
+
const allowedSet = new Set(ALLOWED_THEME_TOP_LEVEL_DIRECTORIES);
|
|
6
|
+
const invalidDirectories = directories.filter((dir) => {
|
|
7
|
+
if (dir.startsWith('.') && !allowedSet.has(dir)) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
return !allowedSet.has(dir);
|
|
11
|
+
});
|
|
12
|
+
return {
|
|
13
|
+
isValid: invalidDirectories.length === 0,
|
|
14
|
+
invalidDirectories
|
|
15
|
+
};
|
|
16
|
+
};
|
|
@@ -5,7 +5,7 @@ import { createWriteStream } from 'node:fs';
|
|
|
5
5
|
import { StreamReadError } from '../fs/errors/stream_read_error.js';
|
|
6
6
|
import { CreateZipError } from './errors/create_zip_error.js';
|
|
7
7
|
import { StreamWriteError } from '../fs/errors/stream_write_error.js';
|
|
8
|
-
import { join } from '../path_utils.js';
|
|
8
|
+
import { join, toUnixPath } from '../path_utils.js';
|
|
9
9
|
import { AppError } from '../../cli/utilities/features/logger/logs/app_error.js';
|
|
10
10
|
export const createZip = async ({ files, dist, baseDir = process.cwd(), logger }) => {
|
|
11
11
|
const zipfile = new yazl.ZipFile();
|
|
@@ -29,14 +29,14 @@ export const createZip = async ({ files, dist, baseDir = process.cwd(), logger }
|
|
|
29
29
|
code: 'FILE_NOT_FOUND',
|
|
30
30
|
details: { file, baseDir }
|
|
31
31
|
});
|
|
32
|
+
const zipEntryName = toUnixPath(file);
|
|
32
33
|
if (await isDirectory(fullPath)) {
|
|
33
|
-
logger.debug('Adding empty directory to zip', { details: { directory:
|
|
34
|
-
zipfile.addEmptyDirectory(
|
|
34
|
+
logger.debug('Adding empty directory to zip', { details: { directory: zipEntryName } });
|
|
35
|
+
zipfile.addEmptyDirectory(zipEntryName);
|
|
35
36
|
}
|
|
36
37
|
else {
|
|
37
|
-
logger.debug('Adding file to zip', { details: { file, fullPath } });
|
|
38
|
-
zipfile.addFile(fullPath,
|
|
39
|
-
//TODO params
|
|
38
|
+
logger.debug('Adding file to zip', { details: { file: zipEntryName, fullPath } });
|
|
39
|
+
zipfile.addFile(fullPath, zipEntryName, {
|
|
40
40
|
compress: true
|
|
41
41
|
});
|
|
42
42
|
}
|