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
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024 Jeanmarcos
3
+ Copyright (c) 2024 Jeanmarcos Juarez
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,4 +1,5 @@
1
1
  [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/Q5Q816Z9WN)
2
+
2
3
  # MageObsidian JS Utils
3
4
 
4
5
  [![License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://opensource.org/licenses/MIT)
@@ -0,0 +1,3 @@
1
+ #! /usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=buildThemes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildThemes.d.ts","sourceRoot":"","sources":["../../src/cli/buildThemes.ts"],"names":[],"mappings":""}
@@ -0,0 +1,219 @@
1
+ #! /usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { execSync, spawn } from "child_process";
4
+ import os from "os";
5
+ import readlineSync from "readline-sync";
6
+ import fs from "fs";
7
+ import path from "path";
8
+ import chalk from "chalk";
9
+ import configResolver from "../core/configResolver.js";
10
+ import preCompileMagentoFiles from "../core/preCompileMagentoFiles.js";
11
+ import runWithConcurrency from "../utils/runWithConcurrency.js";
12
+ import dotenv from "dotenv";
13
+ dotenv.config();
14
+ const program = new Command();
15
+ program
16
+ .option("--theme <theme>", "Specify the active theme")
17
+ .option("--dev-server", "Run the development server for a specific theme")
18
+ .option("--typecheck", "Type-check theme sources with vue-tsc instead of building");
19
+ program.parse(process.argv);
20
+ const options = program.opts();
21
+ const themesConfig = configResolver.getMagentoConfig().themes;
22
+ if (options.devServer && !options.theme) {
23
+ console.error(chalk.red("Error: The --theme option is required when using --dev-server."));
24
+ process.exit(1);
25
+ }
26
+ const theme = options.theme || "all";
27
+ const executeCommand = (command) => {
28
+ try {
29
+ execSync(command, { stdio: "inherit" });
30
+ }
31
+ catch (error) {
32
+ console.error(chalk.red(`Command failed: ${command}`), error);
33
+ process.exit(1);
34
+ }
35
+ };
36
+ function tryCreateEnvFile() {
37
+ const defaultEnvVars = {
38
+ VITE_SERVER_HOST: "phpfpm",
39
+ VITE_SERVER_PORT: "5173",
40
+ VITE_SERVER_SECURE: "true",
41
+ VITE_HMR_PATH: "/__vite_ping",
42
+ MAGENTO_HOST: "magento.test",
43
+ VITE_SERVER_ALLOWED_HOSTS: "magento.test,localhost",
44
+ };
45
+ console.log(chalk.blue("Creating `.env` file with default or user-provided values..."));
46
+ const envFilePath = path.resolve(process.cwd(), ".env");
47
+ if (fs.existsSync(envFilePath)) {
48
+ console.log(chalk.green(".env file already exists."));
49
+ return;
50
+ }
51
+ let envContent = "";
52
+ for (const [key, defaultValue] of Object.entries(defaultEnvVars)) {
53
+ const userInput = readlineSync.question(chalk.yellow(`Enter value for ${key} (default: ${defaultValue}): `), {
54
+ defaultInput: defaultValue,
55
+ });
56
+ envContent += `${key}=${userInput || defaultValue}\n`;
57
+ }
58
+ fs.writeFileSync(envFilePath, envContent);
59
+ console.log(chalk.green(".env file created successfully."));
60
+ }
61
+ function validateEnv() {
62
+ const requiredEnvVars = [
63
+ "VITE_SERVER_HOST",
64
+ "VITE_SERVER_PORT",
65
+ "VITE_SERVER_SECURE",
66
+ "VITE_HMR_PATH",
67
+ "MAGENTO_HOST",
68
+ "VITE_SERVER_ALLOWED_HOSTS",
69
+ ];
70
+ const missingEnvVars = [];
71
+ for (const envVar of requiredEnvVars) {
72
+ if (!process.env[envVar]) {
73
+ missingEnvVars.push(envVar);
74
+ }
75
+ }
76
+ if (missingEnvVars.length > 0) {
77
+ console.error(chalk.red(`Missing required environment variables: ${missingEnvVars.join(", ")}`));
78
+ tryCreateEnvFile();
79
+ console.log(chalk.green("Please restart the script after setting up the .env file."));
80
+ process.exit(1);
81
+ }
82
+ }
83
+ /**
84
+ * Build a single theme in its own child process. Each child gets its own
85
+ * CURRENT_THEME env so several themes can build concurrently without sharing
86
+ * in-process state. Output is buffered and printed as a labeled block on exit
87
+ * to keep parallel logs readable. Never rejects — failures surface via the
88
+ * returned exit code so sibling builds aren't aborted.
89
+ *
90
+ * @param {string} themeName
91
+ * @returns {Promise<{ themeName: string, code: number }>}
92
+ */
93
+ const spawnBuild = (themeName) => new Promise((resolve) => {
94
+ const child = spawn("vite build", {
95
+ shell: true,
96
+ env: { ...process.env, CURRENT_THEME: themeName },
97
+ });
98
+ const chunks = [];
99
+ child.stdout.on("data", (data) => chunks.push(data));
100
+ child.stderr.on("data", (data) => chunks.push(data));
101
+ const finish = (code) => {
102
+ console.log(chalk.cyan(`\n=== ${themeName} ===`));
103
+ process.stdout.write(Buffer.concat(chunks).toString());
104
+ if (code === 0) {
105
+ console.log(chalk.green(`✓ ${themeName} built`));
106
+ }
107
+ else {
108
+ console.error(chalk.red(`✗ ${themeName} failed (exit ${code})`));
109
+ }
110
+ resolve({ themeName, code });
111
+ };
112
+ child.on("close", finish);
113
+ child.on("error", (error) => {
114
+ chunks.push(Buffer.from(String(error?.stack ?? error)));
115
+ finish(1);
116
+ });
117
+ });
118
+ const buildThemes = async (themeNames) => {
119
+ const cores = os.cpus()?.length ?? 2;
120
+ const limit = Math.max(1, Math.min(themeNames.length, cores - 1));
121
+ console.log(chalk.cyan(`Building ${themeNames.length} theme(s) (concurrency ${limit}): ${themeNames.join(", ")}`));
122
+ const results = await runWithConcurrency(themeNames, (themeName) => spawnBuild(themeName), limit);
123
+ const failed = results.filter((result) => result.code !== 0);
124
+ if (failed.length > 0) {
125
+ console.error(chalk.red(`Build failed for: ${failed.map((result) => result.themeName).join(", ")}`));
126
+ process.exit(1);
127
+ }
128
+ };
129
+ /**
130
+ * Type-check one assembled theme with vue-tsc. The theme's generated
131
+ * tsconfig.typecheck.json (materialized by precompile) carries the full
132
+ * `Vendor_Module::` paths, so every cross-module seam resolves. vue-tsc (not
133
+ * plain tsc) is required to check inside `<script setup lang="ts">` SFCs. Output
134
+ * is buffered and printed as a labeled block; never rejects — failures surface
135
+ * via the exit code so sibling themes still run.
136
+ *
137
+ * @param {string} themeName
138
+ * @returns {Promise<{ themeName: string, code: number }>}
139
+ */
140
+ const spawnTypecheck = (themeName) => new Promise((resolve) => {
141
+ const themeDefinition = configResolver.getThemeDefinition(themeName);
142
+ const tsconfigPath = path.join(themeDefinition.src, "tsconfig.typecheck.json");
143
+ const child = spawn(`vue-tsc --noEmit -p "${tsconfigPath}"`, {
144
+ shell: true,
145
+ env: { ...process.env, CURRENT_THEME: themeName },
146
+ });
147
+ const chunks = [];
148
+ child.stdout.on("data", (data) => chunks.push(data));
149
+ child.stderr.on("data", (data) => chunks.push(data));
150
+ const finish = (code) => {
151
+ console.log(chalk.cyan(`\n=== ${themeName} (typecheck) ===`));
152
+ process.stdout.write(Buffer.concat(chunks).toString());
153
+ if (code === 0) {
154
+ console.log(chalk.green(`✓ ${themeName} type-checks`));
155
+ }
156
+ else {
157
+ console.error(chalk.red(`✗ ${themeName} has type errors (exit ${code})`));
158
+ }
159
+ resolve({ themeName, code });
160
+ };
161
+ child.on("close", finish);
162
+ child.on("error", (error) => {
163
+ chunks.push(Buffer.from(String(error?.stack ?? error)));
164
+ finish(1);
165
+ });
166
+ });
167
+ const typecheckThemes = async (themeNames) => {
168
+ // Materialize each theme's tsconfig.typecheck.json + inheritance map in-process
169
+ // (idempotent, cached by contract hash) before spawning vue-tsc against it.
170
+ for (const themeName of themeNames) {
171
+ await preCompileMagentoFiles(themeName);
172
+ }
173
+ console.log(chalk.cyan(`Type-checking ${themeNames.length} theme(s): ${themeNames.join(", ")}`));
174
+ const results = await runWithConcurrency(themeNames, (themeName) => spawnTypecheck(themeName), 1);
175
+ const failed = results.filter((result) => result.code !== 0);
176
+ if (failed.length > 0) {
177
+ console.error(chalk.red(`Type check failed for: ${failed.map((r) => r.themeName).join(", ")}`));
178
+ process.exit(1);
179
+ }
180
+ };
181
+ const runDevServer = (themeName) => {
182
+ console.log(chalk.cyan(`Starting development server for theme: ${themeName}`));
183
+ try {
184
+ const theme = themesConfig[themeName];
185
+ if (!theme) {
186
+ console.error(chalk.red(`Theme "${themeName}" does not exist.`));
187
+ process.exit(1);
188
+ }
189
+ process.env.CURRENT_THEME = themeName;
190
+ executeCommand("vite");
191
+ }
192
+ catch (error) {
193
+ console.error(chalk.red(`Failed to start development server for theme "${themeName}":`), error);
194
+ }
195
+ };
196
+ validateEnv();
197
+ if (options.devServer) {
198
+ runDevServer(theme);
199
+ }
200
+ else {
201
+ let themeNames;
202
+ if (theme === "all") {
203
+ themeNames = Object.keys(themesConfig);
204
+ }
205
+ else if (themesConfig[theme]) {
206
+ themeNames = [theme];
207
+ }
208
+ else {
209
+ console.error(chalk.red(`Theme "${theme}" does not exist.`));
210
+ process.exit(1);
211
+ }
212
+ if (options.typecheck) {
213
+ await typecheckThemes(themeNames);
214
+ }
215
+ else {
216
+ await buildThemes(themeNames);
217
+ }
218
+ }
219
+ //# sourceMappingURL=buildThemes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildThemes.js","sourceRoot":"","sources":["../../src/cli/buildThemes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare const MAGENTO_ROOT: string;
2
+ export declare const DEPENDENCY_CONFIG_FILENAME = "mage_obsidian_frontend_modules.json";
3
+ export declare const MAGENTO_CONFIG_RELATIVE_PATH = "app/etc/";
4
+ export declare const DEPENDENCY_CONFIG_FILE_PATH: string;
5
+ export declare const MODULE_WEB_PATH = "view/frontend/web/";
6
+ export declare const MODULE_TEMPLATES_PATH = "view/frontend/templates";
7
+ export declare const THEME_MODULE_WEB_PATH = "web/";
8
+ export declare const MODULE_CSS_FOLDER = "css";
9
+ export declare const THEME_CSS_FOLDER = "css";
10
+ export declare const OUTPUT_THEME_DIR = "web/generated";
11
+ export declare const OUTPUT_JS_DIR = "js/";
12
+ export declare const OUTPUT_CSS_DIR = "css/";
13
+ export declare const PRECOMPILED_FOLDER = ".precompiled";
14
+ export declare const INTERCEPTORS_FOLDER = "interceptors";
15
+ export declare const ALL_JS_VUE_FILES_WITH_INHERITANCE_FILE_NAME = "allJsVueFilesWithInheritance.json";
16
+ //# sourceMappingURL=default.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.d.ts","sourceRoot":"","sources":["../../src/config/default.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,YAAY,QAEc,CAAC;AAExC,eAAO,MAAM,0BAA0B,wCAAwC,CAAC;AAChF,eAAO,MAAM,4BAA4B,aAAa,CAAC;AACvD,eAAO,MAAM,2BAA2B,QAIvC,CAAC;AAEF,eAAO,MAAM,eAAe,uBAAuB,CAAC;AACpD,eAAO,MAAM,qBAAqB,4BAA4B,CAAC;AAC/D,eAAO,MAAM,qBAAqB,SAAS,CAAC;AAC5C,eAAO,MAAM,iBAAiB,QAAQ,CAAC;AAEvC,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAEtC,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAChD,eAAO,MAAM,aAAa,QAAQ,CAAC;AACnC,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AACjD,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAElD,eAAO,MAAM,2CAA2C,sCAAsC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import path from "node:path";
2
+ // The Vite harness runs from the `vite/` dir one level below the Magento root.
3
+ // Allow an explicit root override so the engine is not tied to that cwd layout
4
+ // (e.g. when invoked from elsewhere or in tests).
5
+ export const MAGENTO_ROOT = process.env.MAGE_OBSIDIAN_MAGENTO_ROOT
6
+ ? path.resolve(process.env.MAGE_OBSIDIAN_MAGENTO_ROOT)
7
+ : path.resolve(process.cwd(), "..");
8
+ export const DEPENDENCY_CONFIG_FILENAME = "mage_obsidian_frontend_modules.json";
9
+ export const MAGENTO_CONFIG_RELATIVE_PATH = "app/etc/";
10
+ export const DEPENDENCY_CONFIG_FILE_PATH = path.resolve(MAGENTO_ROOT, MAGENTO_CONFIG_RELATIVE_PATH, DEPENDENCY_CONFIG_FILENAME);
11
+ export const MODULE_WEB_PATH = "view/frontend/web/";
12
+ export const MODULE_TEMPLATES_PATH = "view/frontend/templates";
13
+ export const THEME_MODULE_WEB_PATH = "web/";
14
+ export const MODULE_CSS_FOLDER = "css";
15
+ export const THEME_CSS_FOLDER = "css";
16
+ export const OUTPUT_THEME_DIR = "web/generated";
17
+ export const OUTPUT_JS_DIR = "js/";
18
+ export const OUTPUT_CSS_DIR = "css/";
19
+ export const PRECOMPILED_FOLDER = ".precompiled";
20
+ export const INTERCEPTORS_FOLDER = "interceptors";
21
+ export const ALL_JS_VUE_FILES_WITH_INHERITANCE_FILE_NAME = "allJsVueFilesWithInheritance.json";
22
+ //# sourceMappingURL=default.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.js","sourceRoot":"","sources":["../../src/config/default.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,+EAA+E;AAC/E,+EAA+E;AAC/E,kDAAkD;AAClD,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B;IAC9D,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;IACtD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAExC,MAAM,CAAC,MAAM,0BAA0B,GAAG,qCAAqC,CAAC;AAChF,MAAM,CAAC,MAAM,4BAA4B,GAAG,UAAU,CAAC;AACvD,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC,OAAO,CACnD,YAAY,EACZ,4BAA4B,EAC5B,0BAA0B,CAC7B,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,oBAAoB,CAAC;AACpD,MAAM,CAAC,MAAM,qBAAqB,GAAG,yBAAyB,CAAC;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAC5C,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAEvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAEtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAChD,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC;AACnC,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AACrC,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AACjD,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAElD,MAAM,CAAC,MAAM,2CAA2C,GAAG,mCAAmC,CAAC"}
@@ -0,0 +1,60 @@
1
+ import js from "@eslint/js";
2
+ import globals from "globals";
3
+ import pluginVue from "eslint-plugin-vue";
4
+ import tseslint from "typescript-eslint";
5
+ import prettier from "eslint-config-prettier/flat";
6
+
7
+ /**
8
+ * Shared flat ESLint preset for the MageObsidian stack. Consumers spread the
9
+ * default export and add their own `files`/`ignores`. Every plugin is imported
10
+ * here (inside the mage-obsidian package), so a consuming repo only needs
11
+ * `eslint` itself installed — the plugins resolve relative to this file.
12
+ *
13
+ * JS today, TypeScript after the engine migration: the TS rules are scoped to
14
+ * `*.ts*` and the Vue `<script>` parser is already the TS parser, so `.vue`
15
+ * files lint whether their script block is JS or TS.
16
+ */
17
+ const unusedVarsOptions = {
18
+ argsIgnorePattern: "^_",
19
+ varsIgnorePattern: "^_",
20
+ caughtErrors: "none",
21
+ };
22
+
23
+ export default tseslint.config(
24
+ js.configs.recommended,
25
+ {
26
+ languageOptions: {
27
+ ecmaVersion: "latest",
28
+ sourceType: "module",
29
+ globals: { ...globals.node, ...globals.browser },
30
+ },
31
+ },
32
+ {
33
+ // Plain JS (author code, engine bits not yet migrated): the base rule.
34
+ files: ["**/*.{js,mjs,cjs}"],
35
+ rules: {
36
+ "no-unused-vars": ["error", unusedVarsOptions],
37
+ },
38
+ },
39
+ {
40
+ files: ["**/*.{ts,mts,cts,tsx}"],
41
+ extends: [tseslint.configs.recommended],
42
+ rules: {
43
+ // tseslint disables the base rule for TS; use the TS-aware one so
44
+ // labels in function-type annotations aren't flagged as unused.
45
+ "@typescript-eslint/no-unused-vars": ["error", unusedVarsOptions],
46
+ // Lenient migration baseline: the engine is typed progressively, so
47
+ // explicit `any` is allowed but surfaced as a warning (ratchet
48
+ // target, alongside tsconfig `strict`).
49
+ "@typescript-eslint/no-explicit-any": "warn",
50
+ },
51
+ },
52
+ {
53
+ files: ["**/*.vue"],
54
+ extends: [pluginVue.configs["flat/recommended"]],
55
+ languageOptions: {
56
+ parserOptions: { parser: tseslint.parser },
57
+ },
58
+ },
59
+ prettier,
60
+ );
@@ -0,0 +1,38 @@
1
+ interface ModuleDefinition {
2
+ src: string;
3
+ [key: string]: any;
4
+ }
5
+ interface ThemeDefinition {
6
+ src: string;
7
+ parent?: string;
8
+ [key: string]: any;
9
+ }
10
+ export declare const getMagentoConfig: () => any;
11
+ export declare const getContractHash: () => any;
12
+ export declare const getModulesConfigArray: () => [string, ModuleDefinition][];
13
+ export declare const getThemesConfigArray: () => [string, ThemeDefinition][];
14
+ export declare const getAllMagentoModulesEnabled: () => any;
15
+ export declare const isDev: () => boolean;
16
+ export declare const getOutputDirFromTheme: (themePath: any) => string;
17
+ export declare const getModuleDefinition: (moduleName: any) => ModuleDefinition;
18
+ export declare const getThemeDefinition: (themeName: any) => ThemeDefinition;
19
+ export declare const MODE: string;
20
+ export declare function resolveLibPath(lib: any): string;
21
+ export declare function resolveNodePath(packageName: any): string;
22
+ export declare function resolveLibRealPath(lib: any): any;
23
+ declare const _default: {
24
+ getMagentoConfig: () => any;
25
+ getContractHash: () => any;
26
+ getModulesConfigArray: () => [string, ModuleDefinition][];
27
+ getThemesConfigArray: () => [string, ThemeDefinition][];
28
+ getAllMagentoModulesEnabled: () => any;
29
+ isDev: () => boolean;
30
+ getOutputDirFromTheme: (themePath: any) => string;
31
+ getModuleDefinition: (moduleName: any) => ModuleDefinition;
32
+ getThemeDefinition: (themeName: any) => ThemeDefinition;
33
+ resolveLibPath: typeof resolveLibPath;
34
+ resolveNodePath: typeof resolveNodePath;
35
+ resolveLibRealPath: typeof resolveLibRealPath;
36
+ };
37
+ export default _default;
38
+ //# sourceMappingURL=configResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configResolver.d.ts","sourceRoot":"","sources":["../../src/core/configResolver.ts"],"names":[],"mappings":"AAYA,UAAU,gBAAgB;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,UAAU,eAAe;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAmED,eAAO,MAAM,gBAAgB,WAAsB,CAAC;AACpD,eAAO,MAAM,eAAe,WAG3B,CAAC;AACF,eAAO,MAAM,qBAAqB,QACW,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,CAAC;AAC1E,eAAO,MAAM,oBAAoB,QACW,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,CAAC;AACxE,eAAO,MAAM,2BAA2B,WAAiC,CAAC;AAC1E,eAAO,MAAM,KAAK,eAA4C,CAAC;AAE/D,eAAO,MAAM,qBAAqB,GAAI,cAAS,WAA8C,CAAC;AAE9F,eAAO,MAAM,mBAAmB,GAAI,eAAU,KAAG,gBACZ,CAAC;AAEtC,eAAO,MAAM,kBAAkB,GAAI,cAAS,KAAG,eAAkD,CAAC;AAElG,eAAO,MAAM,IAAI,QAAuB,CAAC;AAEzC,wBAAgB,cAAc,CAAC,GAAG,KAAA,UAEjC;AAED,wBAAgB,eAAe,CAAC,WAAW,KAAA,UAQ1C;AAED,wBAAgB,kBAAkB,CAAC,GAAG,KAAA,OAErC;;;;iCA/B4C,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE;gCAE7B,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE;;;;8CAMtB,gBAAgB;4CAGlB,eAAe;;;;;AAsB9D,wBAaE"}
@@ -0,0 +1,102 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import crypto from "node:crypto";
4
+ import { DEPENDENCY_CONFIG_FILE_PATH, OUTPUT_THEME_DIR } from "../config/default.js";
5
+ import { validateContract } from "./contractValidator.js";
6
+ const REGENERATE_HINT = "Try running `bin/magento mage-obsidian:frontend:config --generate` to generate the configuration file.";
7
+ // Cached contract, invalidated by the file's mtime. A per-process `const` read
8
+ // at import time never picked up a regenerated contract (e.g. a module enabled
9
+ // while a long-lived dev server runs), so caches keyed only by theme served
10
+ // stale results. Reloading on mtime change makes the contract — and the hash
11
+ // derived from it — track the file.
12
+ let cached = null; // { mtimeMs, config, hash }
13
+ function fail(message, extra = []) {
14
+ console.error(message);
15
+ extra.forEach((line) => console.error(line));
16
+ console.error(REGENERATE_HINT);
17
+ process.exit(1);
18
+ }
19
+ function loadContract() {
20
+ let stats;
21
+ try {
22
+ stats = fs.statSync(DEPENDENCY_CONFIG_FILE_PATH);
23
+ }
24
+ catch (error) {
25
+ fail(`Error reading configuration file at ${DEPENDENCY_CONFIG_FILE_PATH}: ${error.message}`);
26
+ }
27
+ if (cached && cached.mtimeMs === stats.mtimeMs) {
28
+ return cached.config;
29
+ }
30
+ let config;
31
+ try {
32
+ config = JSON.parse(fs.readFileSync(DEPENDENCY_CONFIG_FILE_PATH, "utf-8"));
33
+ }
34
+ catch (error) {
35
+ fail(`Error reading or parsing configuration file at ${DEPENDENCY_CONFIG_FILE_PATH}: ${error.message}`);
36
+ }
37
+ const validation = validateContract(config);
38
+ if (!validation.ok) {
39
+ fail(`Invalid MageObsidian frontend contract at ${DEPENDENCY_CONFIG_FILE_PATH}:`, [
40
+ ...validation.errors.map((message) => ` - ${message}`),
41
+ "If the version differs, the PHP module and JS engine are out of sync — align their versions, then regenerate.",
42
+ ]);
43
+ }
44
+ // Hash the parts that change the build graph (which modules/themes exist and
45
+ // their resolution). Caches downstream key on this so a changed module set
46
+ // invalidates them, rather than serving a result keyed only by theme name.
47
+ const hash = crypto
48
+ .createHash("sha1")
49
+ .update(JSON.stringify({
50
+ modules: config.modules,
51
+ themes: config.themes,
52
+ allModules: config.allModules,
53
+ }))
54
+ .digest("hex");
55
+ cached = { mtimeMs: stats.mtimeMs, config, hash };
56
+ return config;
57
+ }
58
+ const getContract = () => loadContract();
59
+ export const getMagentoConfig = () => getContract();
60
+ export const getContractHash = () => {
61
+ getContract();
62
+ return cached.hash;
63
+ };
64
+ export const getModulesConfigArray = () => Object.entries(getContract().modules);
65
+ export const getThemesConfigArray = () => Object.entries(getContract().themes);
66
+ export const getAllMagentoModulesEnabled = () => getContract().allModules;
67
+ export const isDev = () => getContract().mode !== "production";
68
+ export const getOutputDirFromTheme = (themePath) => path.resolve(themePath, OUTPUT_THEME_DIR);
69
+ export const getModuleDefinition = (moduleName) => getContract().modules[moduleName];
70
+ export const getThemeDefinition = (themeName) => getContract().themes[themeName];
71
+ export const MODE = process.env.NODE_ENV;
72
+ export function resolveLibPath(lib) {
73
+ return path.join(getContract().LIB_PATH, lib);
74
+ }
75
+ export function resolveNodePath(packageName) {
76
+ try {
77
+ const resolvedPath = import.meta.resolve(packageName);
78
+ return resolvedPath.replace("file://", "");
79
+ }
80
+ catch (error) {
81
+ console.error(`The package ${packageName} can't be resolved.`);
82
+ throw error;
83
+ }
84
+ }
85
+ export function resolveLibRealPath(lib) {
86
+ return MODE === "production" ? lib : resolveNodePath(lib);
87
+ }
88
+ export default {
89
+ getMagentoConfig,
90
+ getContractHash,
91
+ getModulesConfigArray,
92
+ getThemesConfigArray,
93
+ getAllMagentoModulesEnabled,
94
+ isDev,
95
+ getOutputDirFromTheme,
96
+ getModuleDefinition,
97
+ getThemeDefinition,
98
+ resolveLibPath,
99
+ resolveNodePath,
100
+ resolveLibRealPath,
101
+ };
102
+ //# sourceMappingURL=configResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configResolver.js","sourceRoot":"","sources":["../../src/core/configResolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare const EXPECTED_SCHEMA_VERSION = "1.0.0";
2
+ export declare const REQUIRED_CONTRACT_KEYS: string[];
3
+ /**
4
+ * Validate the parsed frontend contract.
5
+ *
6
+ * Pure: no IO, no process exit. The caller decides how to react to errors.
7
+ *
8
+ * @param {unknown} config Parsed contract object.
9
+ * @param {string} [expectedVersion] Schema version the caller expects.
10
+ * @returns {{ ok: boolean, errors: string[] }}
11
+ */
12
+ export declare function validateContract(config: any, expectedVersion?: string): {
13
+ ok: boolean;
14
+ errors: any[];
15
+ };
16
+ //# sourceMappingURL=contractValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contractValidator.d.ts","sourceRoot":"","sources":["../../src/core/contractValidator.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,uBAAuB,UAAU,CAAC;AAI/C,eAAO,MAAM,sBAAsB,UAgBlC,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,KAAA,EAAE,eAAe,SAA0B;;;EAqBjF"}
@@ -0,0 +1,49 @@
1
+ // Contract version this build engine understands. Must match
2
+ // ConfigInterface::SCHEMA_VERSION on the PHP side; a mismatch means the module
3
+ // and the JS engine are out of sync and the contract cannot be trusted.
4
+ export const EXPECTED_SCHEMA_VERSION = "1.0.0";
5
+ // Top-level keys the engine reads off the generated contract. Kept in step with
6
+ // the JSON schema in module-modern-frontend/src/etc.
7
+ export const REQUIRED_CONTRACT_KEYS = [
8
+ "schema_version",
9
+ "mode",
10
+ "modules",
11
+ "themes",
12
+ "allModules",
13
+ "VUE_COMPONENTS_PATH",
14
+ "JS_PATH",
15
+ "FOLDERS_TO_WATCH",
16
+ "ALLOWED_EXTENSIONS",
17
+ "MODULE_CSS_EXTEND_FILE",
18
+ "MODULE_CONFIG_FILE",
19
+ "THEME_CONFIG_FILE",
20
+ "THEME_CSS_SOURCE_FILE",
21
+ "THEME_FILES_PATH",
22
+ "LIB_PATH",
23
+ ];
24
+ /**
25
+ * Validate the parsed frontend contract.
26
+ *
27
+ * Pure: no IO, no process exit. The caller decides how to react to errors.
28
+ *
29
+ * @param {unknown} config Parsed contract object.
30
+ * @param {string} [expectedVersion] Schema version the caller expects.
31
+ * @returns {{ ok: boolean, errors: string[] }}
32
+ */
33
+ export function validateContract(config, expectedVersion = EXPECTED_SCHEMA_VERSION) {
34
+ if (config === null || typeof config !== "object" || Array.isArray(config)) {
35
+ return { ok: false, errors: ["Contract is not a JSON object."] };
36
+ }
37
+ const errors = [];
38
+ if (config.schema_version !== expectedVersion) {
39
+ errors.push(`Schema version mismatch: this build engine expects "${expectedVersion}" ` +
40
+ `but the contract is "${config.schema_version ?? "(missing)"}".`);
41
+ }
42
+ for (const key of REQUIRED_CONTRACT_KEYS) {
43
+ if (!Object.prototype.hasOwnProperty.call(config, key)) {
44
+ errors.push(`Missing required key "${key}".`);
45
+ }
46
+ }
47
+ return { ok: errors.length === 0, errors };
48
+ }
49
+ //# sourceMappingURL=contractValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contractValidator.js","sourceRoot":"","sources":["../../src/core/contractValidator.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,+EAA+E;AAC/E,wEAAwE;AACxE,MAAM,CAAC,MAAM,uBAAuB,GAAG,OAAO,CAAC;AAE/C,gFAAgF;AAChF,qDAAqD;AACrD,MAAM,CAAC,MAAM,sBAAsB,GAAG;IAClC,gBAAgB;IAChB,MAAM;IACN,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,qBAAqB;IACrB,SAAS;IACT,kBAAkB;IAClB,oBAAoB;IACpB,wBAAwB;IACxB,oBAAoB;IACpB,mBAAmB;IACnB,uBAAuB;IACvB,kBAAkB;IAClB,UAAU;CACb,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,uBAAuB;IAC9E,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACzE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,gCAAgC,CAAC,EAAE,CAAC;IACrE,CAAC;IAED,MAAM,MAAM,GAAG,EAAE,CAAC;IAElB,IAAI,MAAM,CAAC,cAAc,KAAK,eAAe,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CACP,uDAAuD,eAAe,IAAI;YACtE,wBAAwB,MAAM,CAAC,cAAc,IAAI,WAAW,IAAI,CACvE,CAAC;IACN,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,sBAAsB,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;YACrD,MAAM,CAAC,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;QAClD,CAAC;IACL,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,5 @@
1
+ declare function getTemplateSources(themeName: any): Promise<string>;
2
+ declare function getCssImports(themeName: any): Promise<string>;
3
+ export default getCssImports;
4
+ export { getTemplateSources };
5
+ //# sourceMappingURL=cssResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cssResolver.d.ts","sourceRoot":"","sources":["../../src/core/cssResolver.ts"],"names":[],"mappings":"AAsFA,iBAAe,kBAAkB,CAAC,SAAS,KAAA,mBAmB1C;AAkBD,iBAAe,aAAa,CAAC,SAAS,KAAA,mBA0BrC;AAED,eAAe,aAAa,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,CAAC"}