mage-obsidian 1.0.7 → 1.0.9
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/package.json +3 -2
- package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameA/view/frontend/web/{module.config.cjs → module.config.js} +1 -1
- package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameB/view/frontend/web/{module.config.cjs → module.config.js} +1 -1
- package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameC/view/frontend/web/{module.config.cjs → module.config.js} +1 -1
- package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameA/web/{module.config.cjs → module.config.js} +1 -1
- package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameB/web/{module.config.cjs → module.config.js} +1 -1
- package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameNoConfig/web/{module.config.cjs → module.config.js} +1 -1
- package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/web/{theme.config.cjs → theme.config.js} +5 -6
- package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-b/web/{theme.config.cjs → theme.config.js} +1 -1
- package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-c/Vendor_ModuleNameB/web/{module.config.cjs → module.config.js} +1 -1
- package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-c/web/{theme.config.cjs → theme.config.js} +1 -1
- package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-d/web/{theme.config.cjs → theme.config.js} +1 -1
- package/src/__tests__/magento_scenarios/app/etc/mage_obsidian_frontend_modules_a.json +2 -2
- package/src/__tests__/magento_scenarios/app/etc/mage_obsidian_frontend_modules_b.json +2 -2
- package/src/__tests__/service/inheritModuleResolver.test.js +16 -24
- package/src/__tests__/service/moduleResolver.test.js +9 -7
- package/src/__tests__/service/moduleResolverSync.test.js +20 -19
- package/src/__tests__/service/themeResolverSync.test.js +9 -5
- package/src/config/default.js +26 -0
- package/src/scripts/buildThemes.js +1 -1
- package/src/service/configResolver.js +41 -0
- package/src/service/cssResolver.js +17 -9
- package/src/service/inheritAssetsModuleResolver.js +1 -1
- package/src/service/inheritModuleResolver.js +1 -1
- package/src/service/moduleResolver.js +90 -3
- package/src/service/preCompileFiles.js +1 -1
- package/src/service/tailwindResolver.js +11 -0
- package/src/service/themeResolverSync.js +85 -0
- package/src/config/default.cjs +0 -41
- package/src/service/configResolver.cjs +0 -39
- package/src/service/moduleResolverSync.cjs +0 -84
- package/src/service/tailwindResolver.cjs +0 -15
- package/src/service/themeResolverSync.cjs +0 -80
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mage-obsidian",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"description": "Mage Obsidian Ultis",
|
|
5
5
|
"main": "./src/scripts/buildThemes.js",
|
|
6
6
|
"keywords": [
|
|
@@ -29,7 +29,8 @@
|
|
|
29
29
|
"deepmerge": "^4.3.1",
|
|
30
30
|
"jest": "^29.7.0",
|
|
31
31
|
"jest-environment-node": "^29.7.0",
|
|
32
|
-
"readline-sync": "^1.4.10"
|
|
32
|
+
"readline-sync": "^1.4.10",
|
|
33
|
+
"commander": "^13.1.0"
|
|
33
34
|
},
|
|
34
35
|
"scripts": {
|
|
35
36
|
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
export default {
|
|
2
2
|
tailwind: {
|
|
3
3
|
theme: {
|
|
4
|
-
extend: {
|
|
5
|
-
},
|
|
4
|
+
extend: {},
|
|
6
5
|
},
|
|
7
6
|
plugins: [],
|
|
8
7
|
content: [
|
|
@@ -13,6 +12,6 @@ module.exports = {
|
|
|
13
12
|
},
|
|
14
13
|
ignoredTailwindConfigFromModules: [],
|
|
15
14
|
ignoredCssFromModules: [
|
|
16
|
-
'Vendor_ModuleNameA'
|
|
17
|
-
]
|
|
18
|
-
}
|
|
15
|
+
'Vendor_ModuleNameA',
|
|
16
|
+
],
|
|
17
|
+
};
|
|
@@ -46,8 +46,8 @@
|
|
|
46
46
|
"ts"
|
|
47
47
|
],
|
|
48
48
|
"MODULE_CSS_EXTEND_FILE": "module.extend.css",
|
|
49
|
-
"MODULE_CONFIG_FILE": "module.config.
|
|
50
|
-
"THEME_CONFIG_FILE": "theme.config.
|
|
49
|
+
"MODULE_CONFIG_FILE": "module.config.js",
|
|
50
|
+
"THEME_CONFIG_FILE": "theme.config.js",
|
|
51
51
|
"THEME_CSS_SOURCE_FILE": "theme.source.css",
|
|
52
52
|
"LIB_PATH": "lib"
|
|
53
53
|
}
|
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
"ts"
|
|
44
44
|
],
|
|
45
45
|
"MODULE_CSS_EXTEND_FILE": "module.extend.css",
|
|
46
|
-
"MODULE_CONFIG_FILE": "module.config.
|
|
47
|
-
"THEME_CONFIG_FILE": "theme.config.
|
|
46
|
+
"MODULE_CONFIG_FILE": "module.config.js",
|
|
47
|
+
"THEME_CONFIG_FILE": "theme.config.js",
|
|
48
48
|
"THEME_CSS_SOURCE_FILE": "theme.source.css",
|
|
49
49
|
"LIB_PATH": "lib"
|
|
50
50
|
}
|
|
@@ -21,26 +21,25 @@ let scenarios = [
|
|
|
21
21
|
];
|
|
22
22
|
|
|
23
23
|
function mockConfigAndModules(scenario) {
|
|
24
|
-
jest.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
);
|
|
24
|
+
jest.unstable_mockModule('#service/configResolver.js', () => ({
|
|
25
|
+
__esModule: true,
|
|
26
|
+
default: createMockConfigResolver(scenario).default,
|
|
27
|
+
}));
|
|
28
|
+
|
|
29
|
+
jest.unstable_mockModule('#service/moduleResolver.js', () => ({
|
|
30
|
+
__esModule: true,
|
|
31
|
+
default: {
|
|
32
|
+
getAllJsVueFilesWithInheritanceCached: jest.fn(() => ({
|
|
33
|
+
'Vendor_ModuleNameA/js/test': '/TEST/web/js/test.js',
|
|
34
|
+
})),
|
|
35
|
+
}
|
|
36
|
+
}));
|
|
38
37
|
}
|
|
39
38
|
|
|
40
39
|
async function setupInheritModuleResolver(scenario) {
|
|
41
40
|
mockConfigAndModules(scenario);
|
|
42
|
-
const
|
|
43
|
-
return
|
|
41
|
+
const { default: inheritModuleResolverFactory } = await import('#service/inheritModuleResolver.js');
|
|
42
|
+
return inheritModuleResolverFactory();
|
|
44
43
|
}
|
|
45
44
|
|
|
46
45
|
describe('inherit-resolver', () => {
|
|
@@ -57,13 +56,6 @@ describe('inherit-resolver', () => {
|
|
|
57
56
|
inheritModuleResolver = await setupInheritModuleResolver(scenario);
|
|
58
57
|
const result = await inheritModuleResolver.resolveId.handler(codeImport);
|
|
59
58
|
|
|
60
|
-
expect(result).toEqual(
|
|
61
|
-
expected,
|
|
62
|
-
`Scenario: "${scenario}"
|
|
63
|
-
Theme: "${code}"
|
|
64
|
-
Import: "${codeImport}"
|
|
65
|
-
Expected: ${JSON.stringify(expected, null, 2)}
|
|
66
|
-
Received: ${JSON.stringify(result, null, 2)}`
|
|
67
|
-
);
|
|
59
|
+
expect(result).toEqual(expected);
|
|
68
60
|
});
|
|
69
61
|
});
|
|
@@ -176,17 +176,19 @@ describe('getAllJsVueFilesWithInheritance', () => {
|
|
|
176
176
|
themes.map(({ code, expected }) => ([ scenario, code, expected ]))
|
|
177
177
|
))('Scenario "%s", Theme "%s"', async (scenario, code, expected) => {
|
|
178
178
|
jest.unstable_mockModule(
|
|
179
|
-
'#service/configResolver.
|
|
180
|
-
() =>
|
|
179
|
+
'#service/configResolver.js',
|
|
180
|
+
() => ({
|
|
181
|
+
__esModule: true,
|
|
182
|
+
default: createMockConfigResolver(scenario).default
|
|
183
|
+
})
|
|
181
184
|
);
|
|
182
|
-
|
|
183
|
-
|
|
185
|
+
|
|
186
|
+
const importedModule = await import('#service/moduleResolver.js');
|
|
187
|
+
moduleResolver = importedModule.default;
|
|
184
188
|
|
|
185
189
|
const result = await moduleResolver.getAllJsVueFilesWithInheritance(code);
|
|
186
190
|
|
|
187
|
-
// Mensaje personalizado para errores
|
|
188
191
|
expect(result).toEqual(expected, `Failed for scenario "${scenario}", theme "${code}"`);
|
|
189
192
|
});
|
|
190
|
-
|
|
191
|
-
|
|
192
193
|
});
|
|
194
|
+
|
|
@@ -74,56 +74,56 @@ let scenariosForResolveFileByTheme = [
|
|
|
74
74
|
{
|
|
75
75
|
code: 'Vendor/theme-a',
|
|
76
76
|
moduleName: 'Vendor_ModuleNameA',
|
|
77
|
-
filePath: 'module.config.
|
|
77
|
+
filePath: 'module.config.js',
|
|
78
78
|
includeTailwindConfigFromParentThemes: true,
|
|
79
|
-
expected: 'magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameA/web/module.config.
|
|
79
|
+
expected: 'magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameA/web/module.config.js'
|
|
80
80
|
},
|
|
81
81
|
{
|
|
82
82
|
code: 'Vendor/theme-a',
|
|
83
83
|
moduleName: 'Vendor_ModuleNameA',
|
|
84
|
-
filePath: 'no_exist_file.
|
|
84
|
+
filePath: 'no_exist_file.js',
|
|
85
85
|
includeTailwindConfigFromParentThemes: true,
|
|
86
86
|
expected: null
|
|
87
87
|
},
|
|
88
88
|
{
|
|
89
89
|
code: 'Vendor/theme-b',
|
|
90
90
|
moduleName: 'Vendor_ModuleNameA',
|
|
91
|
-
filePath: 'module.config.
|
|
91
|
+
filePath: 'module.config.js',
|
|
92
92
|
includeTailwindConfigFromParentThemes: true,
|
|
93
|
-
expected: 'magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameA/web/module.config.
|
|
93
|
+
expected: 'magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameA/web/module.config.js'
|
|
94
94
|
},
|
|
95
95
|
{
|
|
96
96
|
code: 'Vendor/theme-b',
|
|
97
97
|
moduleName: 'Vendor_ModuleNameA',
|
|
98
|
-
filePath: 'module.config.
|
|
98
|
+
filePath: 'module.config.js',
|
|
99
99
|
includeTailwindConfigFromParentThemes: false,
|
|
100
100
|
expected: null
|
|
101
101
|
},
|
|
102
102
|
{
|
|
103
103
|
code: 'Vendor/theme-c',
|
|
104
104
|
moduleName: 'Vendor_ModuleNameA',
|
|
105
|
-
filePath: 'module.config.
|
|
105
|
+
filePath: 'module.config.js',
|
|
106
106
|
includeTailwindConfigFromParentThemes: true,
|
|
107
|
-
expected: 'magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameA/web/module.config.
|
|
107
|
+
expected: 'magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameA/web/module.config.js'
|
|
108
108
|
},
|
|
109
109
|
{
|
|
110
110
|
code: 'Vendor/theme-c',
|
|
111
111
|
moduleName: 'Vendor_ModuleNameB',
|
|
112
|
-
filePath: 'module.config.
|
|
112
|
+
filePath: 'module.config.js',
|
|
113
113
|
includeTailwindConfigFromParentThemes: true,
|
|
114
|
-
expected: 'magento_scenarios/app/design/frontend/Vendor/theme-c/Vendor_ModuleNameB/web/module.config.
|
|
114
|
+
expected: 'magento_scenarios/app/design/frontend/Vendor/theme-c/Vendor_ModuleNameB/web/module.config.js'
|
|
115
115
|
},
|
|
116
116
|
{
|
|
117
117
|
code: 'Vendor/theme-d',
|
|
118
118
|
moduleName: 'Vendor_ModuleNameA',
|
|
119
|
-
filePath: 'module.config.
|
|
119
|
+
filePath: 'module.config.js',
|
|
120
120
|
includeTailwindConfigFromParentThemes: false,
|
|
121
121
|
expected: null
|
|
122
122
|
},
|
|
123
123
|
{
|
|
124
124
|
code: 'Vendor/theme-d',
|
|
125
125
|
moduleName: 'Vendor_ModuleNameA',
|
|
126
|
-
filePath: 'module.config.
|
|
126
|
+
filePath: 'module.config.js',
|
|
127
127
|
includeTailwindConfigFromParentThemes: true,
|
|
128
128
|
expected: null
|
|
129
129
|
}
|
|
@@ -140,16 +140,17 @@ for (const scenario of scenariosForResolveFileByTheme) {
|
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
async function setupResolvers(scenario) {
|
|
143
|
-
jest.
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
);
|
|
147
|
-
|
|
148
|
-
|
|
143
|
+
jest.unstable_mockModule('#service/configResolver.js', () => ({
|
|
144
|
+
__esModule: true,
|
|
145
|
+
default: createMockConfigResolver(scenario).default,
|
|
146
|
+
}));
|
|
147
|
+
const moduleResolver = await import('#service/moduleResolver.js');
|
|
148
|
+
const themeResolver = await import('#service/themeResolverSync.js');
|
|
149
149
|
|
|
150
|
-
return {
|
|
150
|
+
return { moduleResolver, themeResolver };
|
|
151
151
|
}
|
|
152
152
|
|
|
153
|
+
|
|
153
154
|
describe('getModuleConfigByThemeConfig', () => {
|
|
154
155
|
beforeEach(() => {
|
|
155
156
|
jest.resetModules();
|
|
@@ -112,14 +112,18 @@ for (const scenario of scenarios) {
|
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
async function setupThemeResolver(scenario) {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
115
|
+
const mock = createMockConfigResolver(scenario);
|
|
116
|
+
|
|
117
|
+
jest.unstable_mockModule('#service/configResolver.js', () => ({
|
|
118
|
+
...mock,
|
|
119
|
+
__esModule: true,
|
|
120
|
+
}));
|
|
121
|
+
|
|
122
|
+
const resolver = await import('#service/themeResolverSync.js');
|
|
120
123
|
return resolver.default;
|
|
121
124
|
}
|
|
122
125
|
|
|
126
|
+
|
|
123
127
|
describe('getThemeConfig', () => {
|
|
124
128
|
let themeResolver;
|
|
125
129
|
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
|
|
4
|
+
const BASE_PATH = process.cwd();
|
|
5
|
+
|
|
6
|
+
export const DEPENDENCY_CONFIG_FILENAME = 'mage_obsidian_frontend_modules.json';
|
|
7
|
+
export const MAGENTO_CONFIG_RELATIVE_PATH = 'app/etc/';
|
|
8
|
+
export const DEPENDENCY_CONFIG_FILE_PATH = path.resolve(
|
|
9
|
+
BASE_PATH,
|
|
10
|
+
'..',
|
|
11
|
+
MAGENTO_CONFIG_RELATIVE_PATH,
|
|
12
|
+
DEPENDENCY_CONFIG_FILENAME
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
export const MODULE_WEB_PATH = 'view/frontend/web/';
|
|
16
|
+
export const THEME_MODULE_WEB_PATH = 'web/';
|
|
17
|
+
export const MODULE_CSS_FOLDER = 'css';
|
|
18
|
+
|
|
19
|
+
export const THEME_CSS_FOLDER = 'css';
|
|
20
|
+
|
|
21
|
+
export const OUTPUT_THEME_DIR = 'web/generated';
|
|
22
|
+
export const OUTPUT_JS_DIR = 'js/';
|
|
23
|
+
export const OUTPUT_CSS_DIR = 'css/';
|
|
24
|
+
export const PRECOMPILED_FOLDER = '.precompiled';
|
|
25
|
+
|
|
26
|
+
export const ALL_JS_VUE_FILES_WITH_INHERITANCE_FILE_NAME = 'allJsVueFilesWithInheritance.json';
|
|
@@ -5,7 +5,7 @@ import readlineSync from 'readline-sync';
|
|
|
5
5
|
import fs from 'fs';
|
|
6
6
|
import path from 'path';
|
|
7
7
|
import chalk from 'chalk';
|
|
8
|
-
import configResolver from '../service/configResolver.
|
|
8
|
+
import configResolver from '../service/configResolver.js';
|
|
9
9
|
import dotenv from 'dotenv';
|
|
10
10
|
dotenv.config();
|
|
11
11
|
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { DEPENDENCY_CONFIG_FILE_PATH, OUTPUT_THEME_DIR } from '../config/default.js';
|
|
4
|
+
|
|
5
|
+
let MAGENTO_CONFIG;
|
|
6
|
+
|
|
7
|
+
try {
|
|
8
|
+
const magentoConfigJson = fs.readFileSync(DEPENDENCY_CONFIG_FILE_PATH, 'utf-8');
|
|
9
|
+
MAGENTO_CONFIG = JSON.parse(magentoConfigJson);
|
|
10
|
+
} catch (error) {
|
|
11
|
+
console.error(`Error reading or parsing configuration file at ${DEPENDENCY_CONFIG_FILE_PATH}:`, error.message);
|
|
12
|
+
console.error('Try running `devcore:frontend:config --generate` to generate the configuration file.');
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const getMagentoConfig = () => MAGENTO_CONFIG;
|
|
17
|
+
|
|
18
|
+
export const getModulesConfigArray = () => Object.entries(MAGENTO_CONFIG.modules);
|
|
19
|
+
export const getThemesConfigArray = () => Object.entries(MAGENTO_CONFIG.themes);
|
|
20
|
+
export const getAllMagentoModulesEnabled = () => MAGENTO_CONFIG.allModules;
|
|
21
|
+
export const isDev = () => MAGENTO_CONFIG.mode !== 'production';
|
|
22
|
+
|
|
23
|
+
export const getOutputDirFromTheme = (themePath) =>
|
|
24
|
+
path.resolve(themePath, OUTPUT_THEME_DIR);
|
|
25
|
+
|
|
26
|
+
export const getModuleDefinition = (moduleName) =>
|
|
27
|
+
MAGENTO_CONFIG.modules[moduleName];
|
|
28
|
+
|
|
29
|
+
export const getThemeDefinition = (themeName) =>
|
|
30
|
+
MAGENTO_CONFIG.themes[themeName];
|
|
31
|
+
|
|
32
|
+
export default {
|
|
33
|
+
getMagentoConfig,
|
|
34
|
+
getModulesConfigArray,
|
|
35
|
+
getThemesConfigArray,
|
|
36
|
+
getAllMagentoModulesEnabled,
|
|
37
|
+
isDev,
|
|
38
|
+
getOutputDirFromTheme,
|
|
39
|
+
getModuleDefinition,
|
|
40
|
+
getThemeDefinition
|
|
41
|
+
};
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
import themeResolver from
|
|
2
|
-
import path from
|
|
3
|
-
import { MODULE_WEB_PATH, THEME_CSS_FOLDER, THEME_MODULE_WEB_PATH } from
|
|
4
|
-
import { resolveFileByTheme } from
|
|
5
|
-
import configResolver from
|
|
6
|
-
import fs from
|
|
7
|
-
|
|
8
|
-
const { getMagentoConfig, getModuleDefinition, getThemeDefinition } = configResolver;
|
|
1
|
+
import themeResolver from './themeResolverSync.js';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { MODULE_WEB_PATH, THEME_CSS_FOLDER, THEME_MODULE_WEB_PATH } from '../config/default.js';
|
|
4
|
+
import { resolveFileByTheme } from './moduleResolver.js';
|
|
5
|
+
import configResolver from './configResolver.js';
|
|
6
|
+
import fs from 'node:fs/promises';
|
|
7
|
+
|
|
8
|
+
const { getMagentoConfig, getModuleDefinition, getThemeDefinition, getModulesConfigArray } = configResolver;
|
|
9
|
+
|
|
9
10
|
const MODULE_CSS_EXTEND_FILE = getMagentoConfig().MODULE_CSS_EXTEND_FILE;
|
|
10
11
|
const THEME_CSS_SOURCE_FILE = getMagentoConfig().THEME_CSS_SOURCE_FILE;
|
|
12
|
+
|
|
11
13
|
async function getThemeImports(themeName, themeConfig) {
|
|
12
14
|
if (!themeConfig) {
|
|
13
15
|
themeConfig = themeResolver.getThemeConfig(themeName);
|
|
@@ -19,6 +21,7 @@ async function getThemeImports(themeName, themeConfig) {
|
|
|
19
21
|
if (themeConfig.includeCssSourceFromParentThemes && themeDefinition.parent) {
|
|
20
22
|
imports += await getThemeImports(themeDefinition.parent, themeConfig);
|
|
21
23
|
}
|
|
24
|
+
|
|
22
25
|
imports += `@import "${path.join(themePath, THEME_MODULE_WEB_PATH, THEME_CSS_FOLDER, THEME_CSS_SOURCE_FILE)}";\n`;
|
|
23
26
|
return imports;
|
|
24
27
|
}
|
|
@@ -31,11 +34,14 @@ function resolveModuleCssSourcePath(moduleName, themeName) {
|
|
|
31
34
|
}
|
|
32
35
|
return moduleConfigSourcePath;
|
|
33
36
|
}
|
|
37
|
+
|
|
34
38
|
async function getCssImports(themeName) {
|
|
35
39
|
const themeConfig = themeResolver.getThemeConfig(themeName);
|
|
36
40
|
const excludedModules = new Set(themeConfig.ignoredCssFromModules || []);
|
|
37
|
-
const modulesConfig =
|
|
41
|
+
const modulesConfig = getModulesConfigArray();
|
|
42
|
+
|
|
38
43
|
let cssImports = '';
|
|
44
|
+
|
|
39
45
|
if (themeConfig.ignoredCssFromModules !== 'all') {
|
|
40
46
|
for (const [moduleName, moduleConfig] of modulesConfig) {
|
|
41
47
|
if (excludedModules.has(moduleName)) continue;
|
|
@@ -45,9 +51,11 @@ async function getCssImports(themeName) {
|
|
|
45
51
|
await fs.access(filePath);
|
|
46
52
|
cssImports += `@import "${filePath}";\n`;
|
|
47
53
|
} catch {
|
|
54
|
+
// ignore if file doesn't exist
|
|
48
55
|
}
|
|
49
56
|
}
|
|
50
57
|
}
|
|
58
|
+
|
|
51
59
|
cssImports += await getThemeImports(themeName);
|
|
52
60
|
return cssImports;
|
|
53
61
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import moduleResolver from "./moduleResolver.js";
|
|
2
2
|
import path from "path";
|
|
3
|
-
import configResolver from "./configResolver.
|
|
3
|
+
import configResolver from "./configResolver.js";
|
|
4
4
|
|
|
5
5
|
export default function customResolverPlugin() {
|
|
6
6
|
const allComponents = moduleResolver.getAllJsVueFilesWithInheritanceCached();
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import path from "path";
|
|
2
|
-
import configResolver from "./configResolver.
|
|
2
|
+
import configResolver from "./configResolver.js";
|
|
3
3
|
import {
|
|
4
4
|
ALL_JS_VUE_FILES_WITH_INHERITANCE_FILE_NAME,
|
|
5
5
|
MODULE_WEB_PATH,
|
|
6
6
|
PRECOMPILED_FOLDER,
|
|
7
7
|
THEME_MODULE_WEB_PATH
|
|
8
|
-
} from "../config/default.
|
|
8
|
+
} from "../config/default.js";
|
|
9
9
|
import getFilesFromFolders from '../utils/findComponents.js'
|
|
10
10
|
import fs from "fs";
|
|
11
11
|
import deepmerge from "deepmerge";
|
|
@@ -97,7 +97,94 @@ async function getAllJsVueFilesWithInheritance(themeName) {
|
|
|
97
97
|
return cachedModulesByTheme[themeName];
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
+
const moduleConfigByThemeCache = new Map();
|
|
101
|
+
|
|
102
|
+
const MODULE_CONFIG_FILE = configResolver.getMagentoConfig().MODULE_CONFIG_FILE;
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Gets the theme configuration file path.
|
|
106
|
+
* @param {string} moduleSrc
|
|
107
|
+
* @returns {string} Full path to the configuration file.
|
|
108
|
+
*/
|
|
109
|
+
function getModuleConfigPath(moduleSrc) {
|
|
110
|
+
return path.join(moduleSrc, 'view/frontend/web/', MODULE_CONFIG_FILE);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function resolveFileByTheme(themeName, moduleName, filePath, includeTailwindConfigFromParentThemes) {
|
|
114
|
+
const theme = configResolver.getMagentoConfig().themes[themeName];
|
|
115
|
+
const fullFilePath = path.join(theme.src, moduleName, 'web', filePath);
|
|
116
|
+
if (fs.existsSync(fullFilePath)) {
|
|
117
|
+
return fullFilePath;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (includeTailwindConfigFromParentThemes && theme.parent) {
|
|
121
|
+
return resolveFileByTheme(theme.parent, moduleName, filePath, includeTailwindConfigFromParentThemes);
|
|
122
|
+
}
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async function resolveModuleConfig(moduleName, themeName, includeTailwindConfigFromParentThemes) {
|
|
127
|
+
const module = configResolver.getMagentoConfig().modules[moduleName];
|
|
128
|
+
let moduleConfigSourcePath = resolveFileByTheme(themeName, moduleName, MODULE_CONFIG_FILE, includeTailwindConfigFromParentThemes);
|
|
129
|
+
|
|
130
|
+
if (!moduleConfigSourcePath && !module) {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
if (!moduleConfigSourcePath) {
|
|
134
|
+
moduleConfigSourcePath = getModuleConfigPath(module.src);
|
|
135
|
+
}
|
|
136
|
+
if (!fs.existsSync(moduleConfigSourcePath)) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Importación dinámica común en ESModules
|
|
141
|
+
const moduleConfig = await import(moduleConfigSourcePath);
|
|
142
|
+
return moduleConfig.default ?? moduleConfig;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Retrieves the Tailwind configuration for a theme synchronously.
|
|
147
|
+
* Uses a cache system to optimize performance.
|
|
148
|
+
* @param {string} themeName - Name of the theme.
|
|
149
|
+
* @param {object} themeConfig
|
|
150
|
+
* @returns {object|null} Tailwind configuration object.
|
|
151
|
+
*/
|
|
152
|
+
async function getModuleConfigByThemeConfig(themeName, themeConfig) {
|
|
153
|
+
if (moduleConfigByThemeCache.has(themeName)) {
|
|
154
|
+
return moduleConfigByThemeCache.get(themeName);
|
|
155
|
+
}
|
|
156
|
+
if (!themeConfig) return null;
|
|
157
|
+
const modules = configResolver.getAllMagentoModulesEnabled();
|
|
158
|
+
let modulesConfig = {};
|
|
159
|
+
|
|
160
|
+
for (const moduleName of modules) {
|
|
161
|
+
let moduleConfig = await resolveModuleConfig(moduleName, themeName, themeConfig.includeTailwindConfigFromParentThemes);
|
|
162
|
+
if (!moduleConfig) continue;
|
|
163
|
+
if (
|
|
164
|
+
themeConfig.ignoredTailwindConfigFromModules === 'all' ||
|
|
165
|
+
themeConfig.ignoredTailwindConfigFromModules.includes(moduleName)
|
|
166
|
+
) {
|
|
167
|
+
moduleConfig.tailwind = {};
|
|
168
|
+
} else if (moduleConfig.tailwind?.content) {
|
|
169
|
+
const moduleSrc = configResolver.getMagentoConfig().modules[moduleName].src;
|
|
170
|
+
moduleConfig.tailwind.content = moduleConfig.tailwind.content.map((content) =>
|
|
171
|
+
path.join(moduleSrc, 'view/frontend/web', content)
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
modulesConfig = deepmerge(modulesConfig, moduleConfig);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
moduleConfigByThemeCache.set(themeName, modulesConfig);
|
|
179
|
+
return modulesConfig;
|
|
180
|
+
}
|
|
181
|
+
|
|
100
182
|
export default {
|
|
101
183
|
getAllJsVueFilesWithInheritance,
|
|
102
|
-
getAllJsVueFilesWithInheritanceCached
|
|
184
|
+
getAllJsVueFilesWithInheritanceCached,
|
|
185
|
+
getModuleConfigByThemeConfig,
|
|
186
|
+
resolveFileByTheme
|
|
103
187
|
};
|
|
188
|
+
|
|
189
|
+
export { getModuleConfigByThemeConfig, resolveFileByTheme };
|
|
190
|
+
|
|
@@ -4,7 +4,7 @@ import moduleResolver from "./moduleResolver.js";
|
|
|
4
4
|
import {
|
|
5
5
|
PRECOMPILED_FOLDER,
|
|
6
6
|
ALL_JS_VUE_FILES_WITH_INHERITANCE_FILE_NAME
|
|
7
|
-
} from "../config/default.
|
|
7
|
+
} from "../config/default.js";
|
|
8
8
|
import getCssImports from "./cssResolver.js";
|
|
9
9
|
import { fileURLToPath } from 'url';
|
|
10
10
|
const __filename = fileURLToPath(import.meta.url);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import themeResolver from './themeResolverSync.js';
|
|
2
|
+
import moduleResolver from './moduleResolver.js';
|
|
3
|
+
import deepmerge from 'deepmerge';
|
|
4
|
+
|
|
5
|
+
export function getTailwindConfigByTheme(themeName) {
|
|
6
|
+
const themeConfig = themeResolver.getThemeConfig(themeName);
|
|
7
|
+
return deepmerge(
|
|
8
|
+
moduleResolver.getModuleConfigByThemeConfig(themeName, themeConfig)?.tailwind ?? {},
|
|
9
|
+
themeConfig?.tailwind ?? {}
|
|
10
|
+
);
|
|
11
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
import deepmerge from "deepmerge";
|
|
5
|
+
import { THEME_MODULE_WEB_PATH } from "../config/default.js";
|
|
6
|
+
import configResolver from "./configResolver.js";
|
|
7
|
+
|
|
8
|
+
const themeConfigCache = new Map();
|
|
9
|
+
const themeConfigPlainCache = new Map();
|
|
10
|
+
|
|
11
|
+
function getThemeConfigPath(themeSrc) {
|
|
12
|
+
return path.join(
|
|
13
|
+
themeSrc,
|
|
14
|
+
THEME_MODULE_WEB_PATH,
|
|
15
|
+
configResolver.getMagentoConfig().THEME_CONFIG_FILE
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async function loadThemeConfig(themeDefinition, themeName) {
|
|
20
|
+
if (!themeDefinition) return null;
|
|
21
|
+
if (themeConfigPlainCache.has(themeName)) return themeConfigPlainCache.get(themeName);
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
const configPath = getThemeConfigPath(themeDefinition.src);
|
|
25
|
+
fs.accessSync(configPath, fs.constants.F_OK);
|
|
26
|
+
|
|
27
|
+
let themeConfig = await import(pathToFileUrl(configPath));
|
|
28
|
+
themeConfig = themeConfig.default ?? themeConfig;
|
|
29
|
+
|
|
30
|
+
themeConfigPlainCache.set(themeName, themeConfig);
|
|
31
|
+
return deepmerge({}, themeConfig);
|
|
32
|
+
} catch (error) {
|
|
33
|
+
console.error(`Failed to load configuration for theme "${themeName}":`, error.message);
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function pathToFileUrl(filePath) {
|
|
39
|
+
const resolvedPath = path.resolve(filePath);
|
|
40
|
+
const fileUrl = new URL(`file://${resolvedPath}`);
|
|
41
|
+
return fileUrl.href;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export async function getThemeConfig(themeName) {
|
|
45
|
+
if (themeConfigCache.has(themeName)) return themeConfigCache.get(themeName);
|
|
46
|
+
|
|
47
|
+
const themeDefinition = configResolver.getMagentoConfig().themes[themeName];
|
|
48
|
+
if (!themeDefinition) return null;
|
|
49
|
+
|
|
50
|
+
let themeConfig = await loadThemeConfig(themeDefinition, themeName);
|
|
51
|
+
if (!themeConfig) return null;
|
|
52
|
+
|
|
53
|
+
themeConfig.includeTailwindConfigFromParentThemes ??= true;
|
|
54
|
+
themeConfig.includeCssSourceFromParentThemes ??= true;
|
|
55
|
+
themeConfig.ignoredCssFromModules ??= [];
|
|
56
|
+
themeConfig.ignoredTailwindConfigFromModules ??= [];
|
|
57
|
+
themeConfig.exposeNpmPackages ??= [];
|
|
58
|
+
themeConfig.tailwind ??= {};
|
|
59
|
+
|
|
60
|
+
if (themeConfig.tailwind?.content) {
|
|
61
|
+
themeConfig.tailwind.content = themeConfig.tailwind.content.map((content) =>
|
|
62
|
+
path.join(themeDefinition.src, "web", content)
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const includeParent = themeConfig.includeTailwindConfigFromParentThemes;
|
|
67
|
+
if (includeParent && themeDefinition.parent) {
|
|
68
|
+
const parentConfig = await getThemeConfig(themeDefinition.parent);
|
|
69
|
+
themeConfig = deepmerge(parentConfig || {}, themeConfig);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
themeConfigCache.set(themeName, themeConfig);
|
|
73
|
+
return themeConfig;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export async function getTailwindThemeConfig(themeName) {
|
|
77
|
+
const themeConfig = await getThemeConfig(themeName);
|
|
78
|
+
return themeConfig?.tailwind ?? {};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Export default con todo
|
|
82
|
+
export default {
|
|
83
|
+
getThemeConfig,
|
|
84
|
+
getTailwindThemeConfig
|
|
85
|
+
};
|
package/src/config/default.cjs
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
const path = require('path');
|
|
2
|
-
const { fileURLToPath } = require('url');
|
|
3
|
-
|
|
4
|
-
const BASE_PATH = process.cwd();
|
|
5
|
-
|
|
6
|
-
const DEPENDENCY_CONFIG_FILENAME = 'mage_obsidian_frontend_modules.json';
|
|
7
|
-
const MAGENTO_CONFIG_RELATIVE_PATH = 'app/etc/';
|
|
8
|
-
const DEPENDENCY_CONFIG_FILE_PATH = path.resolve(
|
|
9
|
-
BASE_PATH,
|
|
10
|
-
'..',
|
|
11
|
-
MAGENTO_CONFIG_RELATIVE_PATH,
|
|
12
|
-
DEPENDENCY_CONFIG_FILENAME
|
|
13
|
-
);
|
|
14
|
-
|
|
15
|
-
const MODULE_WEB_PATH = 'view/frontend/web/';
|
|
16
|
-
const THEME_MODULE_WEB_PATH = 'web/';
|
|
17
|
-
const MODULE_CSS_FOLDER = 'css';
|
|
18
|
-
|
|
19
|
-
const THEME_CSS_FOLDER = 'css';
|
|
20
|
-
|
|
21
|
-
const OUTPUT_THEME_DIR = 'web/generated';
|
|
22
|
-
const OUTPUT_JS_DIR = 'js/';
|
|
23
|
-
const OUTPUT_CSS_DIR = 'css/';
|
|
24
|
-
const PRECOMPILED_FOLDER = '.precompiled';
|
|
25
|
-
|
|
26
|
-
const ALL_JS_VUE_FILES_WITH_INHERITANCE_FILE_NAME = 'allJsVueFilesWithInheritance.json';
|
|
27
|
-
|
|
28
|
-
module.exports = {
|
|
29
|
-
DEPENDENCY_CONFIG_FILENAME,
|
|
30
|
-
MAGENTO_CONFIG_RELATIVE_PATH,
|
|
31
|
-
DEPENDENCY_CONFIG_FILE_PATH,
|
|
32
|
-
MODULE_WEB_PATH,
|
|
33
|
-
THEME_MODULE_WEB_PATH,
|
|
34
|
-
MODULE_CSS_FOLDER,
|
|
35
|
-
THEME_CSS_FOLDER,
|
|
36
|
-
OUTPUT_THEME_DIR,
|
|
37
|
-
OUTPUT_JS_DIR,
|
|
38
|
-
OUTPUT_CSS_DIR,
|
|
39
|
-
PRECOMPILED_FOLDER,
|
|
40
|
-
ALL_JS_VUE_FILES_WITH_INHERITANCE_FILE_NAME,
|
|
41
|
-
};
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
const { DEPENDENCY_CONFIG_FILE_PATH, OUTPUT_THEME_DIR } = require('../config/default.cjs');
|
|
2
|
-
const fs = require('fs');
|
|
3
|
-
const path = require('path');
|
|
4
|
-
|
|
5
|
-
let MAGENTO_CONFIG;
|
|
6
|
-
|
|
7
|
-
try {
|
|
8
|
-
const magentoConfigJson = fs.readFileSync(DEPENDENCY_CONFIG_FILE_PATH, 'utf-8');
|
|
9
|
-
MAGENTO_CONFIG = JSON.parse(magentoConfigJson);
|
|
10
|
-
} catch (error) {
|
|
11
|
-
console.error(`Error reading or parsing configuration file at ${DEPENDENCY_CONFIG_FILE_PATH}:`, error.message);
|
|
12
|
-
console.error('Try running `devcore:frontend:config --generate` to generate the configuration file.');
|
|
13
|
-
process.exit(1); // Termina el proceso si no se puede leer el archivo de configuración
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const getModulesConfigArray = () => Object.entries(MAGENTO_CONFIG.modules);
|
|
17
|
-
const getThemesConfigArray = () => Object.entries(MAGENTO_CONFIG.themes);
|
|
18
|
-
const getAllMagentoModulesEnabled = () => MAGENTO_CONFIG.allModules;
|
|
19
|
-
const isDev = () => MAGENTO_CONFIG.mode !== 'production';
|
|
20
|
-
const getOutputDirFromTheme = (themePath) => path.resolve(themePath, OUTPUT_THEME_DIR);
|
|
21
|
-
|
|
22
|
-
const getModuleDefinition = (moduleName) => {
|
|
23
|
-
return MAGENTO_CONFIG.modules[moduleName];
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const getThemeDefinition = (themeName) => {
|
|
27
|
-
return MAGENTO_CONFIG.themes[themeName];
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
module.exports = {
|
|
31
|
-
getMagentoConfig: () => MAGENTO_CONFIG,
|
|
32
|
-
getModulesConfigArray,
|
|
33
|
-
getThemesConfigArray,
|
|
34
|
-
getAllMagentoModulesEnabled,
|
|
35
|
-
isDev,
|
|
36
|
-
getOutputDirFromTheme,
|
|
37
|
-
getThemeDefinition,
|
|
38
|
-
getModuleDefinition
|
|
39
|
-
};
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
const path = require("path");
|
|
2
|
-
const fs = require("fs");
|
|
3
|
-
const deepmerge = require("deepmerge");
|
|
4
|
-
const configResolver = require("./configResolver.cjs");
|
|
5
|
-
|
|
6
|
-
const moduleConfigByThemeCache = new Map();
|
|
7
|
-
|
|
8
|
-
const MODULE_CONFIG_FILE = configResolver.getMagentoConfig().MODULE_CONFIG_FILE;
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Gets the theme configuration file path.
|
|
12
|
-
* @returns {string} Full path to the configuration file.
|
|
13
|
-
* @param moduleSrc
|
|
14
|
-
*/
|
|
15
|
-
function getModuleConfigPath(moduleSrc) {
|
|
16
|
-
return path.join(moduleSrc, 'view/frontend/web/', MODULE_CONFIG_FILE);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
function resolveFileByTheme(themeName, moduleName, filePath, includeTailwindConfigFromParentThemes) {
|
|
21
|
-
const theme = configResolver.getMagentoConfig().themes[themeName];
|
|
22
|
-
const fullFilePath = path.join(theme.src, moduleName, 'web', filePath);
|
|
23
|
-
if (fs.existsSync(fullFilePath)) {
|
|
24
|
-
return fullFilePath;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
if (includeTailwindConfigFromParentThemes && theme.parent) {
|
|
28
|
-
return resolveFileByTheme(theme.parent, moduleName, filePath, includeTailwindConfigFromParentThemes);
|
|
29
|
-
}
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function resolveModuleConfig(moduleName, themeName, includeTailwindConfigFromParentThemes) {
|
|
34
|
-
const module = configResolver.getMagentoConfig().modules[moduleName];
|
|
35
|
-
let moduleConfigSourcePath = resolveFileByTheme(themeName, moduleName, MODULE_CONFIG_FILE, includeTailwindConfigFromParentThemes);
|
|
36
|
-
if (!moduleConfigSourcePath && !module) {
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
if (!moduleConfigSourcePath) {
|
|
40
|
-
moduleConfigSourcePath = getModuleConfigPath(module.src);
|
|
41
|
-
}
|
|
42
|
-
if (!fs.existsSync(moduleConfigSourcePath)) {
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
return require(moduleConfigSourcePath);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Retrieves the Tailwind configuration for a theme synchronously.
|
|
50
|
-
* Uses a cache system to optimize performance.
|
|
51
|
-
* @param {string} themeName - Name of the theme.
|
|
52
|
-
* @returns {object|null} Tailwind configuration object.
|
|
53
|
-
*/
|
|
54
|
-
function getModuleConfigByThemeConfig(themeName, themeConfig) {
|
|
55
|
-
if (moduleConfigByThemeCache.has(themeName)) {
|
|
56
|
-
return moduleConfigByThemeCache.get(themeName);
|
|
57
|
-
}
|
|
58
|
-
if (!themeConfig) return null;
|
|
59
|
-
const modules = configResolver.getAllMagentoModulesEnabled();
|
|
60
|
-
|
|
61
|
-
let modulesConfig = {};
|
|
62
|
-
|
|
63
|
-
for(const moduleName of modules) {
|
|
64
|
-
let moduleConfig = resolveModuleConfig(moduleName, themeName, themeConfig.includeTailwindConfigFromParentThemes);
|
|
65
|
-
if (!moduleConfig) {
|
|
66
|
-
continue;
|
|
67
|
-
}
|
|
68
|
-
if (themeConfig.ignoredTailwindConfigFromModules === 'all' || themeConfig.ignoredTailwindConfigFromModules.includes(moduleName)) {
|
|
69
|
-
moduleConfig.tailwind = {};
|
|
70
|
-
} else if (moduleConfig.tailwind && moduleConfig.tailwind.content) {
|
|
71
|
-
const moduleSrc = configResolver.getMagentoConfig().modules[moduleName].src;
|
|
72
|
-
moduleConfig.tailwind.content = moduleConfig.tailwind.content.map((content) =>
|
|
73
|
-
path.join(moduleSrc, 'view/frontend/web', content)
|
|
74
|
-
);
|
|
75
|
-
}
|
|
76
|
-
modulesConfig = deepmerge(modulesConfig, moduleConfig);
|
|
77
|
-
}
|
|
78
|
-
return modulesConfig;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
module.exports = {
|
|
82
|
-
getModuleConfigByThemeConfig,
|
|
83
|
-
resolveFileByTheme
|
|
84
|
-
};
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
const themeResolver = require('./themeResolverSync.cjs');
|
|
2
|
-
const moduleResolver = require('./moduleResolverSync.cjs');
|
|
3
|
-
const deepmerge = require('deepmerge');
|
|
4
|
-
|
|
5
|
-
function getTailwindConfigByTheme(themeName) {
|
|
6
|
-
const themeConfig = themeResolver.getThemeConfig(themeName);
|
|
7
|
-
return deepmerge(
|
|
8
|
-
moduleResolver.getModuleConfigByThemeConfig(themeName, themeConfig)?.tailwind ?? {},
|
|
9
|
-
themeConfig?.tailwind ?? {}
|
|
10
|
-
);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
module.exports = {
|
|
14
|
-
getTailwindConfigByTheme
|
|
15
|
-
};
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
const path = require("path");
|
|
2
|
-
const fs = require("fs");
|
|
3
|
-
const deepmerge = require("deepmerge");
|
|
4
|
-
const { THEME_MODULE_WEB_PATH } = require("../config/default.cjs");
|
|
5
|
-
const configResolver = require("./configResolver.cjs");
|
|
6
|
-
|
|
7
|
-
const themeConfigCache = new Map();
|
|
8
|
-
|
|
9
|
-
function getThemeConfigPath(themeSrc) {
|
|
10
|
-
return path.join(themeSrc, THEME_MODULE_WEB_PATH, configResolver.getMagentoConfig().THEME_CONFIG_FILE);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const themeConfigPlainCache = new Map();
|
|
14
|
-
function loadThemeConfig(themeDefinition, themeName) {
|
|
15
|
-
if (!themeDefinition) return null;
|
|
16
|
-
if (themeConfigPlainCache.has(themeName)) return themeConfigPlainCache.get(themeName);
|
|
17
|
-
|
|
18
|
-
try {
|
|
19
|
-
const configPath = getThemeConfigPath(themeDefinition.src);
|
|
20
|
-
fs.accessSync(configPath, fs.constants.F_OK);
|
|
21
|
-
let themeConfig = require(configPath);
|
|
22
|
-
themeConfig = themeConfig.default ?? themeConfig;
|
|
23
|
-
themeConfigPlainCache.set(themeName, themeConfig);
|
|
24
|
-
return deepmerge({}, themeConfig);
|
|
25
|
-
} catch {
|
|
26
|
-
console.error(`Failed to load configuration for theme "${themeName}"`);
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function getThemeConfig(themeName) {
|
|
32
|
-
if (themeConfigCache.has(themeName)) return themeConfigCache.get(themeName);
|
|
33
|
-
|
|
34
|
-
const themeDefinition = configResolver.getMagentoConfig().themes[themeName];
|
|
35
|
-
if (!themeDefinition) return null;
|
|
36
|
-
|
|
37
|
-
let themeConfig = loadThemeConfig(themeDefinition, themeName);
|
|
38
|
-
if (!themeConfig) return null;
|
|
39
|
-
if (themeConfig.includeTailwindConfigFromParentThemes === undefined) {
|
|
40
|
-
themeConfig.includeTailwindConfigFromParentThemes = true;
|
|
41
|
-
}
|
|
42
|
-
if (themeConfig.includeCssSourceFromParentThemes === undefined) {
|
|
43
|
-
themeConfig.includeCssSourceFromParentThemes = true;
|
|
44
|
-
}
|
|
45
|
-
if (themeConfig.ignoredCssFromModules === undefined) {
|
|
46
|
-
themeConfig.ignoredCssFromModules = [];
|
|
47
|
-
}
|
|
48
|
-
if (themeConfig.ignoredTailwindConfigFromModules === undefined) {
|
|
49
|
-
themeConfig.ignoredTailwindConfigFromModules = [];
|
|
50
|
-
}
|
|
51
|
-
if (themeConfig.exposeNpmPackages === undefined) {
|
|
52
|
-
themeConfig.exposeNpmPackages = [];
|
|
53
|
-
}
|
|
54
|
-
if (themeConfig.tailwind === undefined) {
|
|
55
|
-
themeConfig.tailwind = {};
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
if (themeConfig.tailwind?.content) {
|
|
60
|
-
themeConfig.tailwind.content = themeConfig.tailwind.content.map((content) =>
|
|
61
|
-
path.join(themeDefinition.src, "web", content)
|
|
62
|
-
);
|
|
63
|
-
}
|
|
64
|
-
const includeTailwindConfigFromParentThemes = themeConfig.includeTailwindConfigFromParentThemes !== undefined ? themeConfig.includeTailwindConfigFromParentThemes : true;
|
|
65
|
-
if (includeTailwindConfigFromParentThemes && themeDefinition.parent) {
|
|
66
|
-
themeConfig = deepmerge(getThemeConfig(themeDefinition.parent) || {}, themeConfig);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
themeConfigCache.set(themeName, themeConfig);
|
|
70
|
-
return themeConfig;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
function getTailwindThemeConfig(themeName) {
|
|
74
|
-
return getThemeConfig(themeName)?.tailwind ?? {};
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
module.exports = {
|
|
78
|
-
getThemeConfig,
|
|
79
|
-
getTailwindThemeConfig
|
|
80
|
-
};
|