mage-obsidian 1.0.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.
Files changed (71) hide show
  1. package/jest.config.js +5 -0
  2. package/package.json +37 -0
  3. package/src/__tests__/__mocks__/configResolver.js +35 -0
  4. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameA/view/frontend/web/components/ComponentA.vue +0 -0
  5. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameA/view/frontend/web/components/ComponentB.vue +0 -0
  6. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameA/view/frontend/web/css/module.extend.css +0 -0
  7. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameA/view/frontend/web/js/main.js +0 -0
  8. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameA/view/frontend/web/main.js +0 -0
  9. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameA/view/frontend/web/module.config.cjs +9 -0
  10. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameB/view/frontend/web/components/ComponentA.vue +0 -0
  11. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameB/view/frontend/web/components/ComponentB.vue +0 -0
  12. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameB/view/frontend/web/css/module.extend.css +2 -0
  13. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameB/view/frontend/web/js/main.js +0 -0
  14. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameB/view/frontend/web/module.config.cjs +7 -0
  15. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameC/view/frontend/web/components/ComponentA.vue +0 -0
  16. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameC/view/frontend/web/components/ComponentB.vue +0 -0
  17. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameC/view/frontend/web/css/module.extend.css +2 -0
  18. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameC/view/frontend/web/js/main.js +0 -0
  19. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameC/view/frontend/web/module.config.cjs +7 -0
  20. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameA/web/components/ComponentA.vue +0 -0
  21. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameA/web/components/ComponentB.vue +0 -0
  22. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameA/web/css/module.extend.css +0 -0
  23. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameA/web/js/main.js +0 -0
  24. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameA/web/module.config.cjs +8 -0
  25. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameB/web/components/ComponentA.vue +0 -0
  26. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameB/web/components/ComponentB.vue +0 -0
  27. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameB/web/css/module.extend.css +0 -0
  28. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameB/web/js/main.js +0 -0
  29. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameB/web/module.config.cjs +7 -0
  30. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameNoConfig/web/components/ComponentA.vue +0 -0
  31. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameNoConfig/web/components/ComponentB.vue +0 -0
  32. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameNoConfig/web/css/module.extend.css +0 -0
  33. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameNoConfig/web/js/main.js +0 -0
  34. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameNoConfig/web/module.config.cjs +8 -0
  35. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/web/components/ComponentA.vue +0 -0
  36. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/web/components/ComponentB.vue +0 -0
  37. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/web/css/tailwind.source.css +6 -0
  38. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/web/js/main.js +0 -0
  39. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/web/theme.config.cjs +18 -0
  40. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-b/web/css/tailwind.source.css +6 -0
  41. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-b/web/theme.config.cjs +22 -0
  42. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-c/Vendor_ModuleNameB/web/components/ComponentA.vue +0 -0
  43. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-c/Vendor_ModuleNameB/web/components/ComponentB.vue +0 -0
  44. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-c/Vendor_ModuleNameB/web/css/module.extend.css +0 -0
  45. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-c/Vendor_ModuleNameB/web/js/main.js +0 -0
  46. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-c/Vendor_ModuleNameB/web/module.config.cjs +9 -0
  47. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-c/web/css/tailwind.source.css +6 -0
  48. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-c/web/theme.config.cjs +16 -0
  49. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-d/web/css/tailwind.source.css +6 -0
  50. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-d/web/theme.config.cjs +14 -0
  51. package/src/__tests__/magento_scenarios/app/etc/mage_obsidian_frontend_modules_a.json +53 -0
  52. package/src/__tests__/magento_scenarios/app/etc/mage_obsidian_frontend_modules_b.json +50 -0
  53. package/src/__tests__/service/inheritModuleResolver.test.js +69 -0
  54. package/src/__tests__/service/moduleResolver.test.js +192 -0
  55. package/src/__tests__/service/moduleResolverSync.test.js +187 -0
  56. package/src/__tests__/service/themeResolverSync.test.js +164 -0
  57. package/src/config/default.cjs +41 -0
  58. package/src/scripts/buildThemes.js +131 -0
  59. package/src/service/configResolver.cjs +39 -0
  60. package/src/service/cssResolver.js +55 -0
  61. package/src/service/inheritModuleResolver.js +57 -0
  62. package/src/service/magentoHrmRewrite.js +24 -0
  63. package/src/service/moduleResolver.js +103 -0
  64. package/src/service/moduleResolverSync.cjs +84 -0
  65. package/src/service/preCompileFiles.js +37 -0
  66. package/src/service/preCompileMagentoFiles.js +16 -0
  67. package/src/service/setupGlobals.js +19 -0
  68. package/src/service/tailwindResolver.cjs +15 -0
  69. package/src/service/themeResolverSync.cjs +80 -0
  70. package/src/templates/base_main_js_file.js +5 -0
  71. package/src/utils/findComponents.js +70 -0
package/jest.config.js ADDED
@@ -0,0 +1,5 @@
1
+ export default {
2
+ testEnvironment: 'node',
3
+ transform: {},
4
+ testPathIgnorePatterns: ['/__tests__/magento_scenarios/','/node_modules/', '/__tests__/__mocks__/'],
5
+ };
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "mage-obsidian",
3
+ "version": "1.0.0",
4
+ "description": "Mage Obsidian Ultis",
5
+ "main": "./src/scripts/buildThemes.js",
6
+ "keywords": [
7
+ "Magento",
8
+ "MageObsidian"
9
+ ],
10
+ "author": "Jeanmarcos Juarez",
11
+ "license": "MIT",
12
+ "type": "module",
13
+ "bin": {
14
+ "mage-obsidian:build-themes": "./src/scripts/buildThemes.js"
15
+ },
16
+ "imports": {
17
+ "#utils/*": "./src/utils/*",
18
+ "#config/*": "./src/config/*",
19
+ "#service/*": "./src/service/*"
20
+ },
21
+ "exports": {
22
+ ".": "./src/scripts/buildThemes.js",
23
+ "./service/": "./src/service/",
24
+ "./utils/": "./src/utils/",
25
+ "./config/": "./src/config/"
26
+ },
27
+ "dependencies": {
28
+ "chalk": "^5.3.0",
29
+ "deepmerge": "^4.3.1",
30
+ "jest": "^29.7.0",
31
+ "jest-environment-node": "^29.7.0",
32
+ "readline-sync": "^1.4.10"
33
+ },
34
+ "scripts": {
35
+ "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
36
+ }
37
+ }
@@ -0,0 +1,35 @@
1
+ import path from "path";
2
+ import fs from "fs";
3
+ import { jest } from '@jest/globals';
4
+ import { fileURLToPath } from 'url';
5
+
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+
9
+ const createMockConfigResolver = (scenario) => {
10
+ const configPath = path.resolve(__dirname, `../magento_scenarios/app/etc/mage_obsidian_frontend_modules_${scenario}.json`);
11
+ const magentoConfigJson = fs.readFileSync(configPath, 'utf-8');
12
+ const mockMagentoConfig = JSON.parse(magentoConfigJson);
13
+ for (const key in mockMagentoConfig.modules) {
14
+ let module = mockMagentoConfig.modules[key];
15
+ module.src = path.resolve(__dirname, '..', module.src);
16
+ }
17
+ for (const key in mockMagentoConfig.themes) {
18
+ let theme = mockMagentoConfig.themes[key];
19
+ theme.src = path.resolve(__dirname, '..', theme.src);
20
+ }
21
+ return {
22
+ default: {
23
+ getMagentoConfig: jest.fn(() => mockMagentoConfig),
24
+ getModulesConfigArray: jest.fn(() => Object.entries(mockMagentoConfig.modules)),
25
+ getThemesConfigArray: jest.fn(() => Object.entries(mockMagentoConfig.themes)),
26
+ getAllMagentoModulesEnabled: jest.fn(() => mockMagentoConfig.allModules),
27
+ isDev: jest.fn(() => mockMagentoConfig.mode === 'development'),
28
+ getOutputDirFromTheme: jest.fn((themePath) => `${themePath}/output`),
29
+ getThemeDefinition: jest.fn((themeName) => mockMagentoConfig.themes[themeName]),
30
+ getModuleDefinition: jest.fn((moduleName) => mockMagentoConfig.modules[moduleName]),
31
+ }
32
+ }
33
+ };
34
+
35
+ export default createMockConfigResolver;
@@ -0,0 +1,9 @@
1
+ module.exports = {
2
+ tailwind: {
3
+ theme: { extend: {} },
4
+ plugins: [],
5
+ content: [
6
+ '../templates/**/*.phtml'
7
+ ]
8
+ }
9
+ };
@@ -0,0 +1,7 @@
1
+ module.exports = {
2
+ tailwind: {
3
+ content: [
4
+ '../templates/**/*.phtml'
5
+ ]
6
+ }
7
+ };
@@ -0,0 +1,7 @@
1
+ module.exports = {
2
+ tailwind: {
3
+ content: [
4
+ '../templates/**/*.phtml'
5
+ ]
6
+ }
7
+ };
@@ -0,0 +1,8 @@
1
+ module.exports = {
2
+ tailwind: {
3
+ content: [
4
+ '../templates/**/*.phtml',
5
+ '/from_theme'
6
+ ]
7
+ }
8
+ };
@@ -0,0 +1,7 @@
1
+ module.exports = {
2
+ tailwind: {
3
+ content: [
4
+ '../templates/**/*.phtml'
5
+ ]
6
+ }
7
+ };
@@ -0,0 +1,8 @@
1
+ module.exports = {
2
+ tailwind: {
3
+ content: [
4
+ '../templates/**/*.phtml',
5
+ 'pollo'
6
+ ]
7
+ }
8
+ };
@@ -0,0 +1,6 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ body {
6
+ }
@@ -0,0 +1,18 @@
1
+ module.exports = {
2
+ tailwind: {
3
+ theme: {
4
+ extend: {
5
+ },
6
+ },
7
+ plugins: [],
8
+ content: [
9
+ './**/*.{vue,js}',
10
+ '../**/*.phtml',
11
+ '../*/page_layout/override/base/*.xml',
12
+ ],
13
+ },
14
+ ignoredTailwindConfigFromModules: [],
15
+ ignoredCssFromModules: [
16
+ 'Vendor_ModuleNameA'
17
+ ]
18
+ }
@@ -0,0 +1,6 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ body {
6
+ }
@@ -0,0 +1,22 @@
1
+ module.exports = {
2
+ tailwind: {
3
+ theme: {
4
+ extend: {
5
+ textColor: {
6
+ 'primary': '#3490dc',
7
+ 'secondary': '#ffed4a',
8
+ 'danger': '#e3342f',
9
+ },
10
+ },
11
+ },
12
+ plugins: [],
13
+ content: [
14
+ './**/*.{vue,js}',
15
+ '../**/*.phtml',
16
+ '../*/page_layout/override/base/*.xml',
17
+ ],
18
+ },
19
+ ignoredCssFromModules: [
20
+ 'Vendor_ModuleNameNoConfig'
21
+ ]
22
+ }
@@ -0,0 +1,9 @@
1
+ module.exports = {
2
+ tailwind: {
3
+ plugins: ['test_from_theme'],
4
+ content: [
5
+ '../templates/**/*.phtml',
6
+ '/from_theme'
7
+ ]
8
+ }
9
+ };
@@ -0,0 +1,6 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ body {
6
+ }
@@ -0,0 +1,16 @@
1
+ module.exports = {
2
+ tailwind: {
3
+ theme: {
4
+ extend: {
5
+ },
6
+ },
7
+ plugins: [],
8
+ content: [
9
+ './**/*.{vue,js}',
10
+ '../**/*.phtml',
11
+ '../*/page_layout/override/base/*.xml',
12
+ ],
13
+ },
14
+ includeTailwindConfigFromParentThemes: false,
15
+ ignoredTailwindConfigFromModules: 'all'
16
+ }
@@ -0,0 +1,6 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ body {
6
+ }
@@ -0,0 +1,14 @@
1
+ module.exports = {
2
+ tailwind: {
3
+ theme: {
4
+ extend: {
5
+ },
6
+ },
7
+ plugins: [],
8
+ content: [],
9
+ },
10
+ ignoredTailwindConfigFromModules: [
11
+ 'Vendor_ModuleNameC'
12
+ ],
13
+ includeCssSourceFromParentThemes: false,
14
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "modules": {
3
+ "Vendor_ModuleNameA": {
4
+ "src": "magento_scenarios\/app\/code\/Vendor\/ModuleNameA"
5
+ },
6
+ "Vendor_ModuleNameB": {
7
+ "src": "magento_scenarios\/app\/code\/Vendor\/ModuleNameB"
8
+ },
9
+ "Vendor_ModuleNameC": {
10
+ "src": "magento_scenarios\/app\/code\/Vendor\/ModuleNameC"
11
+ }
12
+ },
13
+ "themes": {
14
+ "Vendor\/theme-a": {
15
+ "src": "magento_scenarios\/app\/design\/frontend\/Vendor\/theme-a",
16
+ "parent": null
17
+ },
18
+ "Vendor\/theme-b": {
19
+ "src": "magento_scenarios\/app\/design\/frontend\/Vendor\/theme-b",
20
+ "parent": "Vendor\/theme-a"
21
+ },
22
+ "Vendor\/theme-c": {
23
+ "src": "magento_scenarios\/app\/design\/frontend\/Vendor\/theme-c",
24
+ "parent": "Vendor\/theme-b"
25
+ },
26
+ "Vendor\/theme-d": {
27
+ "src": "magento_scenarios\/app\/design\/frontend\/Vendor\/theme-d",
28
+ "parent": null
29
+ }
30
+ },
31
+ "allModules": [
32
+ "Vendor_ModuleNameA",
33
+ "Vendor_ModuleNameB",
34
+ "Vendor_ModuleNameC"
35
+ ],
36
+ "VUE_COMPONENTS_PATH": "components",
37
+ "JS_PATH": "js",
38
+ "FOLDERS_TO_WATCH": [
39
+ "components",
40
+ "js"
41
+ ],
42
+ "ALLOWED_EXTENSIONS": [
43
+ "js",
44
+ "vue",
45
+ "cjs",
46
+ "ts"
47
+ ],
48
+ "MODULE_CSS_EXTEND_FILE": "module.extend.css",
49
+ "MODULE_CONFIG_FILE": "module.config.cjs",
50
+ "THEME_CONFIG_FILE": "theme.config.cjs",
51
+ "THEME_TAILWIND_SOURCE_FILE": "tailwind.source.css",
52
+ "LIB_PATH": "lib"
53
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ "modules": {
3
+ "Vendor_ModuleNameA": {
4
+ "src": "magento_scenarios\/app\/code\/Vendor\/ModuleNameA"
5
+ },
6
+ "Vendor_ModuleNameC": {
7
+ "src": "magento_scenarios\/app\/code\/Vendor\/ModuleNameC"
8
+ }
9
+ },
10
+ "themes": {
11
+ "Vendor\/theme-a": {
12
+ "src": "magento_scenarios\/app\/design\/frontend\/Vendor\/theme-a",
13
+ "parent": null
14
+ },
15
+ "Vendor\/theme-b": {
16
+ "src": "magento_scenarios\/app\/design\/frontend\/Vendor\/theme-b",
17
+ "parent": "Vendor\/theme-a"
18
+ },
19
+ "Vendor\/theme-c": {
20
+ "src": "magento_scenarios\/app\/design\/frontend\/Vendor\/theme-c",
21
+ "parent": "Vendor\/theme-b"
22
+ },
23
+ "Vendor\/theme-d": {
24
+ "src": "magento_scenarios\/app\/design\/frontend\/Vendor\/theme-d",
25
+ "parent": null
26
+ }
27
+ },
28
+ "allModules": [
29
+ "Vendor_ModuleNameA",
30
+ "Vendor_ModuleNameB",
31
+ "Vendor_ModuleNameNoConfig"
32
+ ],
33
+ "VUE_COMPONENTS_PATH": "components",
34
+ "JS_PATH": "js",
35
+ "FOLDERS_TO_WATCH": [
36
+ "components",
37
+ "js"
38
+ ],
39
+ "ALLOWED_EXTENSIONS": [
40
+ "js",
41
+ "vue",
42
+ "cjs",
43
+ "ts"
44
+ ],
45
+ "MODULE_CSS_EXTEND_FILE": "module.extend.css",
46
+ "MODULE_CONFIG_FILE": "module.config.cjs",
47
+ "THEME_CONFIG_FILE": "theme.config.cjs",
48
+ "THEME_TAILWIND_SOURCE_FILE": "tailwind.source.css",
49
+ "LIB_PATH": "lib"
50
+ }
@@ -0,0 +1,69 @@
1
+ import { jest } from '@jest/globals';
2
+ import createMockConfigResolver from '../__mocks__/configResolver.js';
3
+ import path from 'path';
4
+ import { fileURLToPath } from 'url';
5
+
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+
9
+ let scenarios = [
10
+ {
11
+ scenario: 'a',
12
+ themes: [
13
+ { code: 'Vendor/theme-a', codeImport: 'Vendor_ModuleNameA::js/test', expected: '/TEST/web/js/test.js' },
14
+ { code: 'Vendor/theme-a', codeImport: 'Vendor_ModuleNameA::js/test.vue', expected: '/TEST/web/js/test.js' },
15
+ { code: 'Vendor/theme-a', codeImport: 'Vendor_ModuleNameA::js/test.css', expected: undefined },
16
+ { code: 'Vendor/theme-a', codeImport: 'Vendor_ModuleNameB::js/test', expected: undefined },
17
+ { code: 'Vendor/theme-a', codeImport: null, expected: undefined },
18
+ { code: 'Vendor/theme-b', codeImport: 'Vendor_ModuleNameA::js/unknown', expected: undefined }
19
+ ]
20
+ }
21
+ ];
22
+
23
+ function mockConfigAndModules(scenario) {
24
+ jest.mock(
25
+ '#service/configResolver.cjs',
26
+ () => createMockConfigResolver(scenario).default
27
+ );
28
+ jest.unstable_mockModule(
29
+ '#service/moduleResolver.js',
30
+ () => ({
31
+ default: {
32
+ getAllJsVueFilesWithInheritanceCached: jest.fn(() => ({
33
+ 'Vendor_ModuleNameA/js/test': '/TEST/web/js/test.js',
34
+ })),
35
+ }
36
+ })
37
+ );
38
+ }
39
+
40
+ async function setupInheritModuleResolver(scenario) {
41
+ mockConfigAndModules(scenario);
42
+ const resolver = await import('#service/inheritModuleResolver.js');
43
+ return resolver.default();
44
+ }
45
+
46
+ describe('inherit-resolver', () => {
47
+ let inheritModuleResolver;
48
+
49
+ beforeEach(() => {
50
+ jest.resetModules();
51
+ });
52
+
53
+ test.each(scenarios.flatMap(({ scenario, themes }) =>
54
+ themes.map(({ code, codeImport, expected }) => ([scenario, code, codeImport, expected]))
55
+ ))('Scenario "%s", Theme "%s", Import "%s"', async (scenario, code, codeImport, expected) => {
56
+ process.env.CURRENT_THEME = code;
57
+ inheritModuleResolver = await setupInheritModuleResolver(scenario);
58
+ const result = await inheritModuleResolver.resolveId.handler(codeImport);
59
+
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
+ );
68
+ });
69
+ });