mage-obsidian 1.1.2 → 2.1.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 (180) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -0
  3. package/dist/cli/buildThemes.d.ts +3 -0
  4. package/dist/cli/buildThemes.d.ts.map +1 -0
  5. package/dist/cli/buildThemes.js +219 -0
  6. package/dist/cli/buildThemes.js.map +1 -0
  7. package/dist/config/default.d.ts +16 -0
  8. package/dist/config/default.d.ts.map +1 -0
  9. package/dist/config/default.js +22 -0
  10. package/dist/config/default.js.map +1 -0
  11. package/dist/config/eslint.js +60 -0
  12. package/dist/core/configResolver.d.ts +38 -0
  13. package/dist/core/configResolver.d.ts.map +1 -0
  14. package/dist/core/configResolver.js +102 -0
  15. package/dist/core/configResolver.js.map +1 -0
  16. package/dist/core/contractValidator.d.ts +16 -0
  17. package/dist/core/contractValidator.d.ts.map +1 -0
  18. package/dist/core/contractValidator.js +49 -0
  19. package/dist/core/contractValidator.js.map +1 -0
  20. package/dist/core/cssResolver.d.ts +5 -0
  21. package/dist/core/cssResolver.d.ts.map +1 -0
  22. package/dist/core/cssResolver.js +126 -0
  23. package/dist/core/cssResolver.js.map +1 -0
  24. package/dist/core/generateInterceptors.d.ts +10 -0
  25. package/dist/core/generateInterceptors.d.ts.map +1 -0
  26. package/{src/service → dist/core}/generateInterceptors.js +72 -93
  27. package/dist/core/generateInterceptors.js.map +1 -0
  28. package/dist/core/generateJsconfig.d.ts +45 -0
  29. package/dist/core/generateJsconfig.d.ts.map +1 -0
  30. package/dist/core/generateJsconfig.js +145 -0
  31. package/dist/core/generateJsconfig.js.map +1 -0
  32. package/dist/core/moduleResolver.d.ts +22 -0
  33. package/dist/core/moduleResolver.d.ts.map +1 -0
  34. package/dist/core/moduleResolver.js +177 -0
  35. package/dist/core/moduleResolver.js.map +1 -0
  36. package/dist/core/preCompileFiles.d.ts +6 -0
  37. package/dist/core/preCompileFiles.d.ts.map +1 -0
  38. package/dist/core/preCompileFiles.js +79 -0
  39. package/dist/core/preCompileFiles.js.map +1 -0
  40. package/dist/core/preCompileMagentoFiles.d.ts +3 -0
  41. package/dist/core/preCompileMagentoFiles.d.ts.map +1 -0
  42. package/dist/core/preCompileMagentoFiles.js +28 -0
  43. package/dist/core/preCompileMagentoFiles.js.map +1 -0
  44. package/dist/core/themeResolverSync.d.ts +6 -0
  45. package/dist/core/themeResolverSync.d.ts.map +1 -0
  46. package/dist/core/themeResolverSync.js +65 -0
  47. package/dist/core/themeResolverSync.js.map +1 -0
  48. package/dist/runtime/i18nCore.d.ts +55 -0
  49. package/dist/runtime/i18nCore.d.ts.map +1 -0
  50. package/dist/runtime/i18nCore.js +77 -0
  51. package/dist/runtime/i18nCore.js.map +1 -0
  52. package/dist/runtime/interceptorManager.d.ts +45 -0
  53. package/dist/runtime/interceptorManager.d.ts.map +1 -0
  54. package/{src/service → dist/runtime}/interceptorManager.js +43 -52
  55. package/dist/runtime/interceptorManager.js.map +1 -0
  56. package/dist/runtime/islands.d.ts +45 -0
  57. package/dist/runtime/islands.d.ts.map +1 -0
  58. package/dist/runtime/islands.js +59 -0
  59. package/dist/runtime/islands.js.map +1 -0
  60. package/dist/runtime/sectionStoreCore.d.ts +108 -0
  61. package/dist/runtime/sectionStoreCore.d.ts.map +1 -0
  62. package/dist/runtime/sectionStoreCore.js +189 -0
  63. package/dist/runtime/sectionStoreCore.js.map +1 -0
  64. package/dist/utils/findComponents.d.ts +17 -0
  65. package/dist/utils/findComponents.d.ts.map +1 -0
  66. package/dist/utils/findComponents.js +66 -0
  67. package/dist/utils/findComponents.js.map +1 -0
  68. package/dist/utils/runWithConcurrency.d.ts +10 -0
  69. package/dist/utils/runWithConcurrency.d.ts.map +1 -0
  70. package/dist/utils/runWithConcurrency.js +29 -0
  71. package/dist/utils/runWithConcurrency.js.map +1 -0
  72. package/dist/vite/defaultNodeResolver.d.ts +9 -0
  73. package/dist/vite/defaultNodeResolver.d.ts.map +1 -0
  74. package/dist/vite/defaultNodeResolver.js +19 -0
  75. package/dist/vite/defaultNodeResolver.js.map +1 -0
  76. package/dist/vite/inheritAssetsModuleResolver.d.ts +8 -0
  77. package/dist/vite/inheritAssetsModuleResolver.d.ts.map +1 -0
  78. package/{src/service → dist/vite}/inheritAssetsModuleResolver.js +10 -20
  79. package/dist/vite/inheritAssetsModuleResolver.js.map +1 -0
  80. package/dist/vite/inheritModuleResolver.d.ts +8 -0
  81. package/dist/vite/inheritModuleResolver.d.ts.map +1 -0
  82. package/{src/service → dist/vite}/inheritModuleResolver.js +8 -17
  83. package/dist/vite/inheritModuleResolver.js.map +1 -0
  84. package/dist/vite/interceptorsPlugin.d.ts +10 -0
  85. package/dist/vite/interceptorsPlugin.d.ts.map +1 -0
  86. package/{src/service → dist/vite}/interceptorsPlugin.js +17 -28
  87. package/dist/vite/interceptorsPlugin.js.map +1 -0
  88. package/dist/vite/magentoHrmRewrite.d.ts +6 -0
  89. package/dist/vite/magentoHrmRewrite.d.ts.map +1 -0
  90. package/dist/vite/magentoHrmRewrite.js +45 -0
  91. package/dist/vite/magentoHrmRewrite.js.map +1 -0
  92. package/dist/vite/sharedPlugins.d.ts +35 -0
  93. package/dist/vite/sharedPlugins.d.ts.map +1 -0
  94. package/dist/vite/sharedPlugins.js +52 -0
  95. package/dist/vite/sharedPlugins.js.map +1 -0
  96. package/dist/vite/themeSourceWatcher.d.ts +16 -0
  97. package/dist/vite/themeSourceWatcher.d.ts.map +1 -0
  98. package/dist/vite/themeSourceWatcher.js +91 -0
  99. package/dist/vite/themeSourceWatcher.js.map +1 -0
  100. package/dist/vite/unresolvedModuleGuard.d.ts +17 -0
  101. package/dist/vite/unresolvedModuleGuard.d.ts.map +1 -0
  102. package/dist/vite/unresolvedModuleGuard.js +87 -0
  103. package/dist/vite/unresolvedModuleGuard.js.map +1 -0
  104. package/package.json +89 -13
  105. package/.github/workflows/publish.yml +0 -35
  106. package/jest.config.js +0 -5
  107. package/src/__tests__/__mocks__/configResolver.js +0 -35
  108. package/src/__tests__/fixtures/interceptors/emptyTarget.js +0 -2
  109. package/src/__tests__/fixtures/interceptors/pluginForNonFunction.js +0 -7
  110. package/src/__tests__/fixtures/interceptors/pluginModule.js +0 -13
  111. package/src/__tests__/fixtures/interceptors/targetModule.js +0 -12
  112. package/src/__tests__/fixtures/interceptors/targetNonFunction.js +0 -7
  113. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameA/view/frontend/web/components/ComponentA.vue +0 -0
  114. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameA/view/frontend/web/components/ComponentB.vue +0 -0
  115. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameA/view/frontend/web/css/module.extend.css +0 -0
  116. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameA/view/frontend/web/js/main.js +0 -0
  117. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameA/view/frontend/web/main.js +0 -0
  118. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameA/view/frontend/web/module.config.js +0 -9
  119. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameB/view/frontend/web/components/ComponentA.vue +0 -0
  120. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameB/view/frontend/web/components/ComponentB.vue +0 -0
  121. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameB/view/frontend/web/css/module.extend.css +0 -2
  122. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameB/view/frontend/web/js/main.js +0 -0
  123. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameB/view/frontend/web/module.config.js +0 -7
  124. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameC/view/frontend/web/components/ComponentA.vue +0 -0
  125. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameC/view/frontend/web/components/ComponentB.vue +0 -0
  126. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameC/view/frontend/web/css/module.extend.css +0 -2
  127. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameC/view/frontend/web/js/main.js +0 -0
  128. package/src/__tests__/magento_scenarios/app/code/Vendor/ModuleNameC/view/frontend/web/module.config.js +0 -7
  129. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameA/web/components/ComponentA.vue +0 -0
  130. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameA/web/components/ComponentB.vue +0 -0
  131. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameA/web/css/module.extend.css +0 -0
  132. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameA/web/js/main.js +0 -0
  133. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameA/web/module.config.js +0 -2
  134. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameB/web/components/ComponentA.vue +0 -0
  135. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameB/web/components/ComponentB.vue +0 -0
  136. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameB/web/css/module.extend.css +0 -0
  137. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameB/web/js/main.js +0 -0
  138. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameB/web/module.config.js +0 -2
  139. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameNoConfig/web/components/ComponentA.vue +0 -0
  140. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameNoConfig/web/components/ComponentB.vue +0 -0
  141. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameNoConfig/web/css/module.extend.css +0 -0
  142. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameNoConfig/web/js/main.js +0 -0
  143. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/Vendor_ModuleNameNoConfig/web/module.config.js +0 -2
  144. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/web/components/ComponentA.vue +0 -0
  145. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/web/components/ComponentB.vue +0 -0
  146. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/web/css/theme.source.css +0 -6
  147. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/web/js/main.js +0 -0
  148. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-a/web/theme.config.js +0 -5
  149. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-b/web/css/theme.source.css +0 -6
  150. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-b/web/theme.config.js +0 -5
  151. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-c/Vendor_ModuleNameB/web/components/ComponentA.vue +0 -0
  152. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-c/Vendor_ModuleNameB/web/components/ComponentB.vue +0 -0
  153. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-c/Vendor_ModuleNameB/web/css/module.extend.css +0 -0
  154. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-c/Vendor_ModuleNameB/web/js/main.js +0 -0
  155. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-c/Vendor_ModuleNameB/web/module.config.js +0 -2
  156. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-c/web/css/theme.source.css +0 -6
  157. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-c/web/theme.config.js +0 -2
  158. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-d/web/css/theme.source.css +0 -6
  159. package/src/__tests__/magento_scenarios/app/design/frontend/Vendor/theme-d/web/theme.config.js +0 -3
  160. package/src/__tests__/magento_scenarios/app/etc/mage_obsidian_frontend_modules_a.json +0 -53
  161. package/src/__tests__/magento_scenarios/app/etc/mage_obsidian_frontend_modules_b.json +0 -50
  162. package/src/__tests__/service/generateInterceptors.test.js +0 -196
  163. package/src/__tests__/service/inheritModuleResolver.test.js +0 -61
  164. package/src/__tests__/service/interceptorManager_magento_behavior.test.js +0 -137
  165. package/src/__tests__/service/moduleResolver.test.js +0 -194
  166. package/src/__tests__/service/themeResolverSync.test.js +0 -97
  167. package/src/__tests__/vite-plugins/interceptorsPlugin.test.js +0 -121
  168. package/src/config/default.js +0 -27
  169. package/src/scripts/buildThemes.js +0 -132
  170. package/src/service/configResolver.js +0 -63
  171. package/src/service/cssResolver.js +0 -73
  172. package/src/service/defaultNodeResolver.js +0 -16
  173. package/src/service/magentoHrmRewrite.js +0 -43
  174. package/src/service/moduleResolver.js +0 -178
  175. package/src/service/preCompileFiles.js +0 -37
  176. package/src/service/preCompileMagentoFiles.js +0 -16
  177. package/src/service/setupGlobals.js +0 -19
  178. package/src/service/themeResolverSync.js +0 -67
  179. package/src/utils/findComponents.js +0 -70
  180. /package/{src → dist}/templates/base_main_js_file.js +0 -0
@@ -1,22 +1,17 @@
1
- import generateInterceptorsService from './generateInterceptors.js';
2
-
1
+ import generateInterceptorsService from "../core/generateInterceptors.js";
3
2
  export default function interceptorsPlugin(options = {}) {
4
3
  const { themeName } = options;
5
- let interceptorsMap = new Map(); // path -> interceptorData
6
-
4
+ const interceptorsMap = new Map(); // path -> interceptorData
7
5
  return {
8
- name: 'mage-obsidian:interceptors',
9
- enforce: 'pre',
10
-
6
+ name: "mage-obsidian:interceptors",
7
+ enforce: "pre",
11
8
  async buildStart() {
12
9
  if (!themeName) {
13
- console.warn('[mage-obsidian:interceptors] themeName option is missing. Interceptors will not be generated.');
10
+ console.warn("[mage-obsidian:interceptors] themeName option is missing. Interceptors will not be generated.");
14
11
  return;
15
12
  }
16
-
17
13
  try {
18
14
  const interceptors = await generateInterceptorsService.generateInterceptors(themeName);
19
-
20
15
  // Create a map for fast lookup by file path
21
16
  for (const key in interceptors) {
22
17
  const data = interceptors[key];
@@ -24,47 +19,41 @@ export default function interceptorsPlugin(options = {}) {
24
19
  interceptorsMap.set(data.targetPath, data);
25
20
  }
26
21
  }
27
- } catch (error) {
28
- console.error('[mage-obsidian:interceptors] Failed to generate interceptors:', error);
22
+ }
23
+ catch (error) {
24
+ console.error("[mage-obsidian:interceptors] Failed to generate interceptors:", error);
29
25
  }
30
26
  },
31
-
32
27
  async resolveId(source, importer) {
33
28
  // Skip if we haven't loaded interceptors or if it's a virtual module
34
- if (interceptorsMap.size === 0 || source.startsWith('\0')) return null;
35
-
29
+ if (interceptorsMap.size === 0 || source.startsWith("\0"))
30
+ return null;
36
31
  // Try to resolve the import to a full path
37
32
  const resolution = await this.resolve(source, importer, { skipSelf: true });
38
-
39
- if (!resolution || !resolution.id) return null;
40
-
33
+ if (!resolution || !resolution.id)
34
+ return null;
41
35
  // Clean up the ID (remove query params)
42
- const resolvedId = resolution.id.split('?')[0];
43
-
36
+ const resolvedId = resolution.id.split("?")[0];
44
37
  if (interceptorsMap.has(resolvedId)) {
45
38
  const virtualId = `\0interceptor:${resolvedId}`;
46
-
47
39
  // Check if we are inside the interceptor trying to import the original
48
40
  if (importer === virtualId) {
49
41
  return null; // Allow original import
50
42
  }
51
-
52
43
  return virtualId;
53
44
  }
54
-
55
45
  return null;
56
46
  },
57
-
58
47
  load(id) {
59
- if (id.startsWith('\0interceptor:')) {
60
- const originalPath = id.slice('\0interceptor:'.length);
48
+ if (id.startsWith("\0interceptor:")) {
49
+ const originalPath = id.slice("\0interceptor:".length);
61
50
  const data = interceptorsMap.get(originalPath);
62
-
63
51
  if (data) {
64
52
  return data.source;
65
53
  }
66
54
  }
67
55
  return null;
68
- }
56
+ },
69
57
  };
70
58
  }
59
+ //# sourceMappingURL=interceptorsPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interceptorsPlugin.js","sourceRoot":"","sources":["../../src/vite/interceptorsPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,MAAM,iCAAiC,CAAC;AAE1E,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,UAAkC,EAAE;IAC3E,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAC9B,MAAM,eAAe,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,0BAA0B;IAE7D,OAAO;QACH,IAAI,EAAE,4BAA4B;QAClC,OAAO,EAAE,KAAK;QAEd,KAAK,CAAC,UAAU;YACZ,IAAI,CAAC,SAAS,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CACR,+FAA+F,CAClG,CAAC;gBACF,OAAO;YACX,CAAC;YAED,IAAI,CAAC;gBACD,MAAM,YAAY,GACd,MAAM,2BAA2B,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;gBAEtE,4CAA4C;gBAC5C,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;oBAC7B,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;oBAC/B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;wBAClB,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBAC/C,CAAC;gBACL,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CACT,+DAA+D,EAC/D,KAAK,CACR,CAAC;YACN,CAAC;QACL,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ;YAC5B,qEAAqE;YACrE,IAAI,eAAe,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YAEvE,2CAA2C;YAC3C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAE5E,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;YAE/C,wCAAwC;YACxC,MAAM,UAAU,GAAG,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAE/C,IAAI,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAClC,MAAM,SAAS,GAAG,iBAAiB,UAAU,EAAE,CAAC;gBAEhD,uEAAuE;gBACvE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBACzB,OAAO,IAAI,CAAC,CAAC,wBAAwB;gBACzC,CAAC;gBAED,OAAO,SAAS,CAAC;YACrB,CAAC;YAED,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,EAAE;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAClC,MAAM,YAAY,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBACvD,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAE/C,IAAI,IAAI,EAAE,CAAC;oBACP,OAAO,IAAI,CAAC,MAAM,CAAC;gBACvB,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QAChB,CAAC;KACJ,CAAC;AACN,CAAC"}
@@ -0,0 +1,6 @@
1
+ declare const _default: () => {
2
+ name: string;
3
+ configureServer(server: any): void;
4
+ };
5
+ export default _default;
6
+ //# sourceMappingURL=magentoHrmRewrite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"magentoHrmRewrite.d.ts","sourceRoot":"","sources":["../../src/vite/magentoHrmRewrite.ts"],"names":[],"mappings":";;;;AAEA,wBAyCE"}
@@ -0,0 +1,45 @@
1
+ import moduleResolver from "../core/moduleResolver.js";
2
+ export default () => {
3
+ const components = moduleResolver.getAllJsVueFilesWithInheritanceCached();
4
+ return {
5
+ name: "handle-magento-routes-middleware",
6
+ configureServer(server) {
7
+ server.middlewares.use((req, res, next) => {
8
+ const url = req.url;
9
+ const matchedKey = Object.keys(components).find((key) => url.includes(key));
10
+ if (matchedKey) {
11
+ const filePath = components[matchedKey];
12
+ let suffix;
13
+ if (matchedKey === "lib/vue") {
14
+ suffix = "/";
15
+ }
16
+ else if (matchedKey.startsWith("lib/")) {
17
+ suffix = "/@fs";
18
+ const fileExtension = filePath.split(".").pop();
19
+ let mimeType = "application/node";
20
+ if (fileExtension === "cjs" ||
21
+ fileExtension === "mjs" ||
22
+ fileExtension === "js")
23
+ mimeType = "application/javascript";
24
+ if (fileExtension === "css")
25
+ mimeType = "text/css";
26
+ if (fileExtension === "json")
27
+ mimeType = "application/json";
28
+ if (fileExtension === "html")
29
+ mimeType = "text/html";
30
+ res.setHeader("Content-Type", mimeType);
31
+ }
32
+ else {
33
+ suffix = "/@fs";
34
+ }
35
+ req.url = `${suffix}${filePath}`;
36
+ next();
37
+ }
38
+ else {
39
+ next();
40
+ }
41
+ });
42
+ },
43
+ };
44
+ };
45
+ //# sourceMappingURL=magentoHrmRewrite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"magentoHrmRewrite.js","sourceRoot":"","sources":["../../src/vite/magentoHrmRewrite.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,2BAA2B,CAAC;AAEvD,eAAe,GAAG,EAAE;IAChB,MAAM,UAAU,GAAG,cAAc,CAAC,qCAAqC,EAAE,CAAC;IAC1E,OAAO;QACH,IAAI,EAAE,kCAAkC;QACxC,eAAe,CAAC,MAAM;YAClB,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACtC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;gBAEpB,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;gBAE5E,IAAI,UAAU,EAAE,CAAC;oBACb,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;oBACxC,IAAI,MAAM,CAAC;oBACX,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;wBAC3B,MAAM,GAAG,GAAG,CAAC;oBACjB,CAAC;yBAAM,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;wBACvC,MAAM,GAAG,MAAM,CAAC;wBAChB,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;wBAChD,IAAI,QAAQ,GAAG,kBAAkB,CAAC;wBAClC,IACI,aAAa,KAAK,KAAK;4BACvB,aAAa,KAAK,KAAK;4BACvB,aAAa,KAAK,IAAI;4BAEtB,QAAQ,GAAG,wBAAwB,CAAC;wBACxC,IAAI,aAAa,KAAK,KAAK;4BAAE,QAAQ,GAAG,UAAU,CAAC;wBACnD,IAAI,aAAa,KAAK,MAAM;4BAAE,QAAQ,GAAG,kBAAkB,CAAC;wBAC5D,IAAI,aAAa,KAAK,MAAM;4BAAE,QAAQ,GAAG,WAAW,CAAC;wBAErD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;oBAC5C,CAAC;yBAAM,CAAC;wBACJ,MAAM,GAAG,MAAM,CAAC;oBACpB,CAAC;oBACD,GAAG,CAAC,GAAG,GAAG,GAAG,MAAM,GAAG,QAAQ,EAAE,CAAC;oBACjC,IAAI,EAAE,CAAC;gBACX,CAAC;qBAAM,CAAC;oBACJ,IAAI,EAAE,CAAC;gBACX,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;KACJ,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * The framework's module-resolution plugin chain: `Vendor_Module::` component
3
+ * and asset resolution plus the node-package fallback. Resolution order is
4
+ * governed by each plugin's resolveId `order` ('pre'/'post'), not by array
5
+ * position, so this group can sit anywhere in a consumer's plugin list.
6
+ *
7
+ * Shared so the dev/build config, component tests, auto-import and the
8
+ * playground all resolve imports through the exact same chain instead of each
9
+ * reimplementing it and drifting.
10
+ */
11
+ export declare function getResolverPlugins(): {
12
+ name: string;
13
+ resolveId: {
14
+ order: string;
15
+ handler(id: string, importer?: string): void;
16
+ };
17
+ }[];
18
+ /**
19
+ * Ensure a theme's precompiled entries exist on disk before a build/test/story
20
+ * run. Idempotent per (theme, contract hash). Any consumer that resolves
21
+ * `Vendor_Module::` imports MUST call this first: without it the resolver map
22
+ * is empty and those imports resolve to undefined with no error.
23
+ */
24
+ export declare function ensurePrecompiled(themeName: any): Promise<void>;
25
+ /**
26
+ * Build Vite's `server.fs.allow` list from the contract. Modules and themes can
27
+ * live outside the Magento root — e.g. symlinked from a monorepo during dev —
28
+ * in which case their real `src` roots are outside the default allow-list and
29
+ * Vite answers 403 for any file under them. A single 403 on a bootstrap module
30
+ * (such as the i18n runtime) aborts the whole ESM graph, so the page renders
31
+ * unstyled with no components. Deriving the list from each module/theme `src`
32
+ * makes the dev server serve sources wherever they physically live.
33
+ */
34
+ export declare function getFsAllowList(rootDir: any): any[];
35
+ //# sourceMappingURL=sharedPlugins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharedPlugins.d.ts","sourceRoot":"","sources":["../../src/vite/sharedPlugins.ts"],"names":[],"mappings":"AAOA;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB;;;;;;IAOjC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,KAAA,iBAE1C;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,OAAO,KAAA,SAQrC"}
@@ -0,0 +1,52 @@
1
+ import inheritModuleResolver from "./inheritModuleResolver.js";
2
+ import inheritAssetsModuleResolver from "./inheritAssetsModuleResolver.js";
3
+ import defaultNodeResolve from "./defaultNodeResolver.js";
4
+ import unresolvedModuleGuard from "./unresolvedModuleGuard.js";
5
+ import preCompileMagentoFiles from "../core/preCompileMagentoFiles.js";
6
+ import configResolver from "../core/configResolver.js";
7
+ /**
8
+ * The framework's module-resolution plugin chain: `Vendor_Module::` component
9
+ * and asset resolution plus the node-package fallback. Resolution order is
10
+ * governed by each plugin's resolveId `order` ('pre'/'post'), not by array
11
+ * position, so this group can sit anywhere in a consumer's plugin list.
12
+ *
13
+ * Shared so the dev/build config, component tests, auto-import and the
14
+ * playground all resolve imports through the exact same chain instead of each
15
+ * reimplementing it and drifting.
16
+ */
17
+ export function getResolverPlugins() {
18
+ return [
19
+ inheritModuleResolver(),
20
+ inheritAssetsModuleResolver(),
21
+ defaultNodeResolve,
22
+ unresolvedModuleGuard(),
23
+ ];
24
+ }
25
+ /**
26
+ * Ensure a theme's precompiled entries exist on disk before a build/test/story
27
+ * run. Idempotent per (theme, contract hash). Any consumer that resolves
28
+ * `Vendor_Module::` imports MUST call this first: without it the resolver map
29
+ * is empty and those imports resolve to undefined with no error.
30
+ */
31
+ export function ensurePrecompiled(themeName) {
32
+ return preCompileMagentoFiles(themeName);
33
+ }
34
+ /**
35
+ * Build Vite's `server.fs.allow` list from the contract. Modules and themes can
36
+ * live outside the Magento root — e.g. symlinked from a monorepo during dev —
37
+ * in which case their real `src` roots are outside the default allow-list and
38
+ * Vite answers 403 for any file under them. A single 403 on a bootstrap module
39
+ * (such as the i18n runtime) aborts the whole ESM graph, so the page renders
40
+ * unstyled with no components. Deriving the list from each module/theme `src`
41
+ * makes the dev server serve sources wherever they physically live.
42
+ */
43
+ export function getFsAllowList(rootDir) {
44
+ const srcRoots = [
45
+ ...configResolver.getModulesConfigArray(),
46
+ ...configResolver.getThemesConfigArray(),
47
+ ]
48
+ .map(([, definition]) => definition?.src)
49
+ .filter(Boolean);
50
+ return [...new Set([rootDir, ...srcRoots])];
51
+ }
52
+ //# sourceMappingURL=sharedPlugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharedPlugins.js","sourceRoot":"","sources":["../../src/vite/sharedPlugins.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,4BAA4B,CAAC;AAC/D,OAAO,2BAA2B,MAAM,kCAAkC,CAAC;AAC3E,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAC1D,OAAO,qBAAqB,MAAM,4BAA4B,CAAC;AAC/D,OAAO,sBAAsB,MAAM,mCAAmC,CAAC;AACvE,OAAO,cAAc,MAAM,2BAA2B,CAAC;AAEvD;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB;IAC9B,OAAO;QACH,qBAAqB,EAAE;QACvB,2BAA2B,EAAE;QAC7B,kBAAkB;QAClB,qBAAqB,EAAE;KAC1B,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAS;IACvC,OAAO,sBAAsB,CAAC,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,OAAO;IAClC,MAAM,QAAQ,GAAG;QACb,GAAG,cAAc,CAAC,qBAAqB,EAAE;QACzC,GAAG,cAAc,CAAC,oBAAoB,EAAE;KAC3C;SACI,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC;SACxC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Dev-only plugin that keeps `Vendor_Module::` resolution live. Precompile runs
3
+ * once at server start and is cached by contract hash; adding or removing a
4
+ * component/js source changes neither, so without this the new file is invisible
5
+ * to both the runtime resolver and the editor jsconfig until a restart. On a
6
+ * structural change we drop the theme cache, rewrite the persisted inheritance
7
+ * map (runtime) and regenerate the theme jsconfig (editor). Writes are
8
+ * idempotent, so the burst of events when the watch dirs are first scanned
9
+ * collapses to a single no-op.
10
+ */
11
+ export default function themeSourceWatcher(themeName: any): {
12
+ name: string;
13
+ apply: string;
14
+ configureServer(server: any): void;
15
+ };
16
+ //# sourceMappingURL=themeSourceWatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themeSourceWatcher.d.ts","sourceRoot":"","sources":["../../src/vite/themeSourceWatcher.ts"],"names":[],"mappings":"AA+BA;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,SAAS,KAAA;;;;EAsDnD"}
@@ -0,0 +1,91 @@
1
+ import path from "node:path";
2
+ import configResolver from "../core/configResolver.js";
3
+ import moduleResolver from "../core/moduleResolver.js";
4
+ import { precompileJs, precompileJsconfig, precompileTsconfig } from "../core/preCompileFiles.js";
5
+ import { MODULE_WEB_PATH } from "../config/default.js";
6
+ const SOURCE_EXT = /\.(vue|ts|js)$/;
7
+ // Build output and engine scratch live under the watched trees but are not
8
+ // authored sources — reacting to them would loop (we write them ourselves).
9
+ const IGNORED = /[/\\](generated|\.precompiled|node_modules)[/\\]/;
10
+ const DEBOUNCE_MS = 150;
11
+ // The source roots whose structure feeds the inheritance map: every opted-in
12
+ // module's web dir plus the theme and its parent chain. Adding/removing a
13
+ // `.vue`/`.ts`/`.js` under these changes what `Vendor_Module::` can resolve.
14
+ function collectWatchDirs(themeName) {
15
+ const dirs = new Set();
16
+ for (const [, definition] of configResolver.getModulesConfigArray()) {
17
+ if (definition?.src)
18
+ dirs.add(path.resolve(definition.src, MODULE_WEB_PATH));
19
+ }
20
+ const themes = configResolver.getMagentoConfig().themes;
21
+ const seen = new Set();
22
+ let name = themeName;
23
+ while (name && themes[name] && !seen.has(name)) {
24
+ seen.add(name);
25
+ if (themes[name].src)
26
+ dirs.add(themes[name].src);
27
+ name = themes[name].parent;
28
+ }
29
+ return [...dirs];
30
+ }
31
+ /**
32
+ * Dev-only plugin that keeps `Vendor_Module::` resolution live. Precompile runs
33
+ * once at server start and is cached by contract hash; adding or removing a
34
+ * component/js source changes neither, so without this the new file is invisible
35
+ * to both the runtime resolver and the editor jsconfig until a restart. On a
36
+ * structural change we drop the theme cache, rewrite the persisted inheritance
37
+ * map (runtime) and regenerate the theme jsconfig (editor). Writes are
38
+ * idempotent, so the burst of events when the watch dirs are first scanned
39
+ * collapses to a single no-op.
40
+ */
41
+ export default function themeSourceWatcher(themeName) {
42
+ return {
43
+ name: "mage-obsidian:theme-source-watcher",
44
+ apply: "serve",
45
+ configureServer(server) {
46
+ for (const dir of collectWatchDirs(themeName)) {
47
+ server.watcher.add(dir);
48
+ }
49
+ let timer = null;
50
+ let running = false;
51
+ let queued = false;
52
+ const regenerate = async () => {
53
+ if (running) {
54
+ queued = true;
55
+ return;
56
+ }
57
+ running = true;
58
+ try {
59
+ moduleResolver.invalidateTheme(themeName);
60
+ await precompileJs(themeName);
61
+ await precompileJsconfig(themeName);
62
+ await precompileTsconfig(themeName);
63
+ server.config.logger.info(`[mage-obsidian] sources changed — refreshed ${themeName} import resolution`);
64
+ }
65
+ catch (error) {
66
+ server.config.logger.error(`[mage-obsidian] failed to refresh import resolution: ${error?.message ?? error}`);
67
+ }
68
+ finally {
69
+ running = false;
70
+ if (queued) {
71
+ queued = false;
72
+ schedule();
73
+ }
74
+ }
75
+ };
76
+ const schedule = () => {
77
+ if (timer)
78
+ clearTimeout(timer);
79
+ timer = setTimeout(regenerate, DEBOUNCE_MS);
80
+ };
81
+ const onChange = (file) => {
82
+ if (!SOURCE_EXT.test(file) || IGNORED.test(file))
83
+ return;
84
+ schedule();
85
+ };
86
+ server.watcher.on("add", onChange);
87
+ server.watcher.on("unlink", onChange);
88
+ },
89
+ };
90
+ }
91
+ //# sourceMappingURL=themeSourceWatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themeSourceWatcher.js","sourceRoot":"","sources":["../../src/vite/themeSourceWatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Fail-loud guard for the framework's `Vendor_Module::` import notation. It runs
3
+ * last in the resolver chain (`order: "post"`), so a `::` specifier only reaches
4
+ * it when none of the earlier resolvers (component, asset, node) could resolve
5
+ * it — i.e. a typo or a missing file. Without this, Rollup externalizes the
6
+ * unknown specifier silently and the import breaks at runtime with no clear
7
+ * cause; here it becomes a build/dev error naming the specifier, the importer,
8
+ * and the closest valid alternatives.
9
+ */
10
+ export default function unresolvedModuleGuard(): {
11
+ name: string;
12
+ resolveId: {
13
+ order: string;
14
+ handler(id: string, importer?: string): void;
15
+ };
16
+ };
17
+ //# sourceMappingURL=unresolvedModuleGuard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unresolvedModuleGuard.d.ts","sourceRoot":"","sources":["../../src/vite/unresolvedModuleGuard.ts"],"names":[],"mappings":"AA6DA;;;;;;;;GAQG;AACH,MAAM,CAAC,OAAO,UAAU,qBAAqB;;;;oBAKrB,MAAM,aAAa,MAAM;;EAWhD"}
@@ -0,0 +1,87 @@
1
+ import moduleResolver from "../core/moduleResolver.js";
2
+ // The part before `::` must look like a Magento module (Vendor_Module) or the
3
+ // special `Theme` namespace. This keeps the guard from firing on unrelated ids
4
+ // (virtual modules, already-resolved absolute paths) that happen to contain `::`.
5
+ const NAMESPACE_PATTERN = /^(Theme|[A-Z][A-Za-z0-9_]*)$/;
6
+ function distance(a, b) {
7
+ const rows = a.length + 1;
8
+ const cols = b.length + 1;
9
+ const dp = Array.from({ length: rows }, () => Array.from({ length: cols }, () => 0));
10
+ for (let i = 0; i < rows; i++)
11
+ dp[i][0] = i;
12
+ for (let j = 0; j < cols; j++)
13
+ dp[0][j] = j;
14
+ for (let i = 1; i < rows; i++) {
15
+ for (let j = 1; j < cols; j++) {
16
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
17
+ dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost);
18
+ }
19
+ }
20
+ return dp[a.length][b.length];
21
+ }
22
+ function suggest(namespace, target) {
23
+ let keys;
24
+ try {
25
+ keys = Object.keys(moduleResolver.getAllJsVueFilesWithInheritanceCached());
26
+ }
27
+ catch {
28
+ // No precompiled cache yet — nothing to suggest from.
29
+ return [];
30
+ }
31
+ const prefix = `${namespace}/`;
32
+ return keys
33
+ .filter((key) => key.startsWith(prefix))
34
+ .map((key) => `${namespace}::${key.slice(prefix.length)}`)
35
+ .map((candidate) => [candidate, distance(candidate, target)])
36
+ .sort((a, b) => a[1] - b[1])
37
+ .slice(0, 3)
38
+ .map(([candidate]) => candidate);
39
+ }
40
+ function buildMessage(id, namespace, rest, importer) {
41
+ const from = importer ? `\n imported by: ${importer}` : "";
42
+ let hint;
43
+ if (rest.startsWith("assets/")) {
44
+ hint =
45
+ `\n Asset not found. Expected a theme override at` +
46
+ ` <theme>/${namespace}/web/${rest} or the module at` +
47
+ ` <module>/view/frontend/web/${rest}.`;
48
+ }
49
+ else {
50
+ const suggestions = suggest(namespace, id);
51
+ hint = suggestions.length
52
+ ? `\n Did you mean:\n${suggestions.map((s) => ` - ${s}`).join("\n")}`
53
+ : `\n Nothing is registered under "${namespace}". Is the module/theme enabled` +
54
+ ` and compatible, and the contract regenerated` +
55
+ ` (bin/magento mage-obsidian:frontend:config --generate)?`;
56
+ }
57
+ return `[mage-obsidian] Unresolved import "${id}".${from}${hint}`;
58
+ }
59
+ /**
60
+ * Fail-loud guard for the framework's `Vendor_Module::` import notation. It runs
61
+ * last in the resolver chain (`order: "post"`), so a `::` specifier only reaches
62
+ * it when none of the earlier resolvers (component, asset, node) could resolve
63
+ * it — i.e. a typo or a missing file. Without this, Rollup externalizes the
64
+ * unknown specifier silently and the import breaks at runtime with no clear
65
+ * cause; here it becomes a build/dev error naming the specifier, the importer,
66
+ * and the closest valid alternatives.
67
+ */
68
+ export default function unresolvedModuleGuard() {
69
+ return {
70
+ name: "unresolved-module-guard",
71
+ resolveId: {
72
+ order: "post",
73
+ handler(id, importer) {
74
+ if (!id || id[0] === "\0")
75
+ return;
76
+ const separator = id.indexOf("::");
77
+ if (separator === -1)
78
+ return;
79
+ const namespace = id.slice(0, separator);
80
+ if (!NAMESPACE_PATTERN.test(namespace))
81
+ return;
82
+ throw new Error(buildMessage(id, namespace, id.slice(separator + 2), importer));
83
+ },
84
+ },
85
+ };
86
+ }
87
+ //# sourceMappingURL=unresolvedModuleGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unresolvedModuleGuard.js","sourceRoot":"","sources":["../../src/vite/unresolvedModuleGuard.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,8 +1,16 @@
1
1
  {
2
2
  "name": "mage-obsidian",
3
- "version": "1.1.2",
3
+ "version": "2.1.0",
4
4
  "description": "Mage Obsidian Ultis",
5
- "main": "./src/scripts/buildThemes.js",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/mage-obsidian/js-package-utils.git"
8
+ },
9
+ "main": "./dist/cli/buildThemes.js",
10
+ "types": "./dist/cli/buildThemes.d.ts",
11
+ "files": [
12
+ "dist"
13
+ ],
6
14
  "keywords": [
7
15
  "Magento",
8
16
  "MageObsidian"
@@ -11,31 +19,99 @@
11
19
  "license": "MIT",
12
20
  "type": "module",
13
21
  "bin": {
14
- "mage-obsidian:build-themes": "./src/scripts/buildThemes.js"
22
+ "mage-obsidian:build-themes": "./dist/cli/buildThemes.js"
15
23
  },
16
24
  "imports": {
25
+ "#core/*": "./src/core/*",
26
+ "#vite/*": "./src/vite/*",
27
+ "#runtime/*": "./src/runtime/*",
28
+ "#cli/*": "./src/cli/*",
17
29
  "#utils/*": "./src/utils/*",
18
- "#config/*": "./src/config/*",
19
- "#service/*": "./src/service/*"
30
+ "#config/*": "./src/config/*"
20
31
  },
21
32
  "exports": {
22
- ".": "./src/scripts/buildThemes.js",
23
- "./service/": "./src/service/",
24
- "./utils/": "./src/utils/",
25
- "./config/": "./src/config/",
26
- "./service/*": "./src/service/*"
33
+ ".": {
34
+ "types": "./dist/cli/buildThemes.d.ts",
35
+ "default": "./dist/cli/buildThemes.js"
36
+ },
37
+ "./core/*.ts": {
38
+ "types": "./dist/core/*.d.ts",
39
+ "default": "./dist/core/*.js"
40
+ },
41
+ "./core/*": {
42
+ "types": "./dist/core/*.d.ts",
43
+ "default": "./dist/core/*.js"
44
+ },
45
+ "./vite/*.ts": {
46
+ "types": "./dist/vite/*.d.ts",
47
+ "default": "./dist/vite/*.js"
48
+ },
49
+ "./vite/*": {
50
+ "types": "./dist/vite/*.d.ts",
51
+ "default": "./dist/vite/*.js"
52
+ },
53
+ "./runtime/*.ts": {
54
+ "types": "./dist/runtime/*.d.ts",
55
+ "default": "./dist/runtime/*.js"
56
+ },
57
+ "./runtime/*": {
58
+ "types": "./dist/runtime/*.d.ts",
59
+ "default": "./dist/runtime/*.js"
60
+ },
61
+ "./cli/*.ts": {
62
+ "types": "./dist/cli/*.d.ts",
63
+ "default": "./dist/cli/*.js"
64
+ },
65
+ "./cli/*": {
66
+ "types": "./dist/cli/*.d.ts",
67
+ "default": "./dist/cli/*.js"
68
+ },
69
+ "./utils/*.ts": {
70
+ "types": "./dist/utils/*.d.ts",
71
+ "default": "./dist/utils/*.js"
72
+ },
73
+ "./utils/*": {
74
+ "types": "./dist/utils/*.d.ts",
75
+ "default": "./dist/utils/*.js"
76
+ },
77
+ "./config/*.ts": {
78
+ "types": "./dist/config/*.d.ts",
79
+ "default": "./dist/config/*.js"
80
+ },
81
+ "./config/*": {
82
+ "types": "./dist/config/*.d.ts",
83
+ "default": "./dist/config/*.js"
84
+ }
27
85
  },
28
86
  "dependencies": {
29
87
  "chalk": "^5.4.1",
30
88
  "commander": "^13.1.0",
31
89
  "deepmerge": "^4.3.1",
90
+ "dotenv": "^16.6.1",
32
91
  "readline-sync": "^1.4.10"
33
92
  },
34
93
  "devDependencies": {
35
- "jest": "^29.7.0",
36
- "jest-environment-node": "^29.7.0"
94
+ "@eslint/js": "^10.0.1",
95
+ "@types/node": "^22.19.21",
96
+ "eslint": "^10.5.0",
97
+ "eslint-config-prettier": "^10.1.8",
98
+ "eslint-plugin-vue": "^10.9.2",
99
+ "globals": "^17.6.0",
100
+ "oxlint": "^1.70.0",
101
+ "prettier": "^3.8.4",
102
+ "typescript": "^5.9.3",
103
+ "typescript-eslint": "^8.61.1",
104
+ "vitest": "^3.2.6"
37
105
  },
38
106
  "scripts": {
39
- "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
107
+ "build": "tsc -p tsconfig.build.json && node scripts/copy-assets.mjs",
108
+ "test": "vitest run",
109
+ "test:watch": "vitest",
110
+ "typecheck": "tsc --noEmit",
111
+ "lint": "eslint .",
112
+ "lint:fix": "eslint . --fix",
113
+ "lint:fast": "oxlint",
114
+ "format": "prettier --write .",
115
+ "format:check": "prettier --check ."
40
116
  }
41
117
  }