@m3rcena/eco 0.0.0-stage → 14.28.1

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 (44) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/DOCUMENTATION.md +869 -0
  3. package/LICENSE +191 -0
  4. package/README.md +182 -2
  5. package/assets/logo.png +0 -0
  6. package/dist/host-Bmld-WtZ.cjs +6163 -0
  7. package/dist/host-Bmld-WtZ.cjs.map +1 -0
  8. package/dist/host-XZmTzNyx.d.cts +1833 -0
  9. package/dist/host-XZmTzNyx.d.cts.map +1 -0
  10. package/dist/host-_xxHiG2p.d.mts +1833 -0
  11. package/dist/host-_xxHiG2p.d.mts.map +1 -0
  12. package/dist/host-qJNVzdDa.mjs +5894 -0
  13. package/dist/host-qJNVzdDa.mjs.map +1 -0
  14. package/dist/host.cjs +4 -0
  15. package/dist/host.d.cts +2 -0
  16. package/dist/host.d.mts +2 -0
  17. package/dist/host.mjs +2 -0
  18. package/dist/index.cjs +1440 -0
  19. package/dist/index.cjs.map +1 -0
  20. package/dist/index.d.cts +339 -0
  21. package/dist/index.d.cts.map +1 -0
  22. package/dist/index.d.mts +339 -0
  23. package/dist/index.d.mts.map +1 -0
  24. package/dist/index.mjs +1371 -0
  25. package/dist/index.mjs.map +1 -0
  26. package/dist/register.cjs +46 -0
  27. package/dist/register.cjs.map +1 -0
  28. package/dist/register.d.cts +6 -0
  29. package/dist/register.d.cts.map +1 -0
  30. package/dist/register.d.mts +6 -0
  31. package/dist/register.d.mts.map +1 -0
  32. package/dist/register.mjs +44 -0
  33. package/dist/register.mjs.map +1 -0
  34. package/dist/resolver.cjs +305 -0
  35. package/dist/resolver.cjs.map +1 -0
  36. package/dist/resolver.d.cts +40 -0
  37. package/dist/resolver.d.cts.map +1 -0
  38. package/dist/resolver.d.mts +40 -0
  39. package/dist/resolver.d.mts.map +1 -0
  40. package/dist/resolver.mjs +296 -0
  41. package/dist/resolver.mjs.map +1 -0
  42. package/dist/rolldown-runtime-CmQyd0Gu.cjs +27 -0
  43. package/dist/rolldown-runtime-D3PmRqjj.mjs +4 -0
  44. package/package.json +94 -4
@@ -0,0 +1,296 @@
1
+ import { t as __require } from "./rolldown-runtime-D3PmRqjj.mjs";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ // src/resolver.ts
5
+ /**
6
+ * @m3rcena/eco - Rust-Style Submodule & Path Resolver
7
+ *
8
+ * Inspired by Cargo's workspace and [patch.crates-io] resolver algorithm.
9
+ * Enables zero-friction consumption of @m3rcena packages via Git submodules,
10
+ * local vendor paths, or standard NPM registry installs without code changes.
11
+ *
12
+ * @copyright 2026 M3rcena Development. All rights reserved.
13
+ * @license Apache-2.0
14
+ */
15
+ const KNOWN_PACKAGES = {
16
+ "@m3rcena/weky": {
17
+ aliases: [
18
+ "m3rcena-weky",
19
+ "weky",
20
+ "weky-manager"
21
+ ],
22
+ envVar: "M3RCENA_WEKY_PATH"
23
+ },
24
+ "@m3rcena/eco": {
25
+ aliases: [
26
+ "m3rcena-eco",
27
+ "eco",
28
+ "economy"
29
+ ],
30
+ envVar: "M3RCENA_ECO_PATH"
31
+ },
32
+ "@m3rcena/bridge": {
33
+ aliases: [
34
+ "m3rcena-bridge",
35
+ "bridge",
36
+ "m3rcena-core"
37
+ ],
38
+ envVar: "M3RCENA_BRIDGE_PATH"
39
+ }
40
+ };
41
+ const CANDIDATE_CONTAINERS = [
42
+ ".",
43
+ "submodules",
44
+ "submodule",
45
+ "vendor",
46
+ "packages",
47
+ "libs",
48
+ "modules"
49
+ ];
50
+ function isTypeScriptRuntime() {
51
+ if (typeof process.isBun !== "undefined") return true;
52
+ if (typeof process.isDeno !== "undefined") return true;
53
+ const execArgv = process.execArgv.join(" ");
54
+ if (/tsx|ts-node|@swc\/register|ts-loader/.test(execArgv)) return true;
55
+ if (process.argv[1]?.endsWith(".ts") || process.argv[1]?.endsWith(".mts")) return true;
56
+ if (process.env.M3RCENA_PREFER_SOURCE === "true" || process.env.M3RCENA_PREFER_SOURCE === "1") return true;
57
+ return false;
58
+ }
59
+ function findProjectRoot(startDir = process.cwd()) {
60
+ let current = path.resolve(startDir);
61
+ for (let i = 0; i < 6; i++) {
62
+ const pkgJson = path.join(current, "package.json");
63
+ if (fs.existsSync(pkgJson)) return current;
64
+ const parent = path.dirname(current);
65
+ if (parent === current) break;
66
+ current = parent;
67
+ }
68
+ return path.resolve(startDir);
69
+ }
70
+ function loadResolverConfig(cwd = process.cwd()) {
71
+ const root = findProjectRoot(cwd);
72
+ const resolverFile = path.join(root, "m3rcena.resolver.json");
73
+ if (fs.existsSync(resolverFile)) try {
74
+ return JSON.parse(fs.readFileSync(resolverFile, "utf-8"));
75
+ } catch {}
76
+ const pkgJsonPath = path.join(root, "package.json");
77
+ if (fs.existsSync(pkgJsonPath)) try {
78
+ const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8"));
79
+ if (pkg.m3rcena && typeof pkg.m3rcena === "object") return pkg.m3rcena;
80
+ } catch {}
81
+ return null;
82
+ }
83
+ function inspectSubmoduleDirectory(dirPath, expectedName) {
84
+ if (!fs.existsSync(dirPath)) return { isValid: false };
85
+ try {
86
+ if (!fs.statSync(dirPath).isDirectory()) return { isValid: false };
87
+ const pkgPath = path.join(dirPath, "package.json");
88
+ if (fs.existsSync(pkgPath)) {
89
+ const data = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
90
+ if (data.name === expectedName) return {
91
+ isValid: true,
92
+ version: data.version
93
+ };
94
+ }
95
+ if (fs.existsSync(path.join(dirPath, "src", "index.ts"))) return { isValid: true };
96
+ } catch {
97
+ return { isValid: false };
98
+ }
99
+ return { isValid: false };
100
+ }
101
+ function resolveSubmoduleEntryPoint(dirPath, preferSource) {
102
+ const srcTs = path.join(dirPath, "src", "index.ts");
103
+ const distMjs = path.join(dirPath, "dist", "index.mjs");
104
+ const distCjs = path.join(dirPath, "dist", "index.cjs");
105
+ const isBuilt = fs.existsSync(distMjs) || fs.existsSync(distCjs);
106
+ if (preferSource && fs.existsSync(srcTs)) return {
107
+ entryPath: srcTs,
108
+ type: "source",
109
+ isBuilt
110
+ };
111
+ if (fs.existsSync(distMjs)) return {
112
+ entryPath: distMjs,
113
+ type: "dist",
114
+ isBuilt: true
115
+ };
116
+ if (fs.existsSync(distCjs)) return {
117
+ entryPath: distCjs,
118
+ type: "dist",
119
+ isBuilt: true
120
+ };
121
+ if (fs.existsSync(srcTs)) return {
122
+ entryPath: srcTs,
123
+ type: "source",
124
+ isBuilt: false
125
+ };
126
+ return {
127
+ entryPath: dirPath,
128
+ type: "dist",
129
+ isBuilt
130
+ };
131
+ }
132
+ function resolvePackage(packageName, options = {}) {
133
+ const root = findProjectRoot(options.cwd ?? process.cwd());
134
+ const cfg = loadResolverConfig(root);
135
+ const pkgMeta = KNOWN_PACKAGES[packageName];
136
+ const preferSource = options.preferSource ?? cfg?.preferSource ?? isTypeScriptRuntime();
137
+ const rootInspected = inspectSubmoduleDirectory(root, packageName);
138
+ if (rootInspected.isValid) {
139
+ const ep = resolveSubmoduleEntryPoint(root, preferSource);
140
+ return {
141
+ name: packageName,
142
+ status: "submodule",
143
+ type: ep.type,
144
+ path: ep.entryPath,
145
+ rootDirectory: root,
146
+ version: rootInspected.version,
147
+ isBuilt: ep.isBuilt
148
+ };
149
+ }
150
+ if (options.overrides?.[packageName]) {
151
+ const customPath = path.resolve(root, options.overrides[packageName]);
152
+ const inspected = inspectSubmoduleDirectory(customPath, packageName);
153
+ if (inspected.isValid) {
154
+ const ep = resolveSubmoduleEntryPoint(customPath, preferSource);
155
+ return {
156
+ name: packageName,
157
+ status: "submodule",
158
+ type: ep.type,
159
+ path: ep.entryPath,
160
+ rootDirectory: customPath,
161
+ version: inspected.version,
162
+ isBuilt: ep.isBuilt
163
+ };
164
+ }
165
+ }
166
+ const envVal = process.env[pkgMeta.envVar];
167
+ if (envVal) {
168
+ const customPath = path.resolve(root, envVal);
169
+ const inspected = inspectSubmoduleDirectory(customPath, packageName);
170
+ if (inspected.isValid) {
171
+ const ep = resolveSubmoduleEntryPoint(customPath, preferSource);
172
+ return {
173
+ name: packageName,
174
+ status: "submodule",
175
+ type: ep.type,
176
+ path: ep.entryPath,
177
+ rootDirectory: customPath,
178
+ version: inspected.version,
179
+ isBuilt: ep.isBuilt
180
+ };
181
+ }
182
+ }
183
+ if (cfg?.packages?.[packageName]) {
184
+ const customPath = path.resolve(root, cfg.packages[packageName]);
185
+ const inspected = inspectSubmoduleDirectory(customPath, packageName);
186
+ if (inspected.isValid) {
187
+ const ep = resolveSubmoduleEntryPoint(customPath, preferSource);
188
+ return {
189
+ name: packageName,
190
+ status: "submodule",
191
+ type: ep.type,
192
+ path: ep.entryPath,
193
+ rootDirectory: customPath,
194
+ version: inspected.version,
195
+ isBuilt: ep.isBuilt
196
+ };
197
+ }
198
+ }
199
+ const candidateContainers = [
200
+ options.submodulesDir,
201
+ cfg?.submodulesDir,
202
+ process.env.M3RCENA_SUBMODULES_DIR,
203
+ ...CANDIDATE_CONTAINERS
204
+ ].filter((c) => typeof c === "string" && c.trim().length > 0);
205
+ const searchRoots = [
206
+ root,
207
+ path.resolve(root, ".."),
208
+ path.resolve(root, "../..")
209
+ ];
210
+ for (const sRoot of searchRoots) for (const container of candidateContainers) for (const alias of pkgMeta.aliases) {
211
+ const candidateDir = path.resolve(sRoot, container, alias);
212
+ const inspected = inspectSubmoduleDirectory(candidateDir, packageName);
213
+ if (inspected.isValid) {
214
+ const ep = resolveSubmoduleEntryPoint(candidateDir, preferSource);
215
+ return {
216
+ name: packageName,
217
+ status: "submodule",
218
+ type: ep.type,
219
+ path: ep.entryPath,
220
+ rootDirectory: candidateDir,
221
+ version: inspected.version,
222
+ isBuilt: ep.isBuilt
223
+ };
224
+ }
225
+ }
226
+ try {
227
+ return {
228
+ name: packageName,
229
+ status: "npm",
230
+ type: "registry",
231
+ path: __require.resolve(packageName, { paths: [root, process.cwd()] })
232
+ };
233
+ } catch {
234
+ const nmPath = path.join(root, "node_modules", packageName);
235
+ if (fs.existsSync(nmPath)) return {
236
+ name: packageName,
237
+ status: "npm",
238
+ type: "registry",
239
+ path: nmPath
240
+ };
241
+ }
242
+ return {
243
+ name: packageName,
244
+ status: "missing",
245
+ type: "registry",
246
+ path: packageName
247
+ };
248
+ }
249
+ function getAllPackageResolutions(options = {}) {
250
+ return {
251
+ "@m3rcena/weky": resolvePackage("@m3rcena/weky", options),
252
+ "@m3rcena/eco": resolvePackage("@m3rcena/eco", options),
253
+ "@m3rcena/bridge": resolvePackage("@m3rcena/bridge", options)
254
+ };
255
+ }
256
+ function generateTsConfigPaths(options = {}) {
257
+ const resolutions = getAllPackageResolutions(options);
258
+ const root = findProjectRoot(options.cwd ?? process.cwd());
259
+ const paths = {};
260
+ for (const [name, res] of Object.entries(resolutions)) if (res.status === "submodule" && res.rootDirectory) {
261
+ const rel = path.relative(root, res.rootDirectory).replace(/\\/g, "/");
262
+ const cleanRel = !rel || rel === "." ? "." : rel.startsWith(".") ? rel : `./${rel}`;
263
+ paths[name] = [
264
+ `${cleanRel}/src`,
265
+ `${cleanRel}/dist/index.mjs`,
266
+ cleanRel
267
+ ];
268
+ if (name === "@m3rcena/bridge") paths["@m3rcena/bridge/client"] = [`${cleanRel}/src/client`, `${cleanRel}/dist/client.mjs`];
269
+ }
270
+ return paths;
271
+ }
272
+ function printResolutionSummary(options = {}) {
273
+ const resolutions = getAllPackageResolutions(options);
274
+ const cyan = (s) => `\x1b[36m${s}\x1b[39m`;
275
+ const green = (s) => `\x1b[32m${s}\x1b[39m`;
276
+ const yellow = (s) => `\x1b[33m${s}\x1b[39m`;
277
+ const gray = (s) => `\x1b[90m${s}\x1b[39m`;
278
+ const bold = (s) => `\x1b[1m${s}\x1b[22m`;
279
+ console.log(cyan("┌────────────────────────────────────────────────────────────────────────┐"));
280
+ console.log(cyan("│") + bold(" 🦀 M3RCENA RUST-STYLE SUBMODULE RESOLVER ") + cyan("│"));
281
+ console.log(cyan("├────────────────────────────────────────────────────────────────────────┤"));
282
+ for (const [name, res] of Object.entries(resolutions)) {
283
+ const padName = name.padEnd(16);
284
+ if (res.status === "submodule") {
285
+ const mode = res.type === "source" ? yellow("[SOURCE]") : green("[DIST]");
286
+ const ver = res.version ? `v${res.version}` : "local";
287
+ const shortPath = res.rootDirectory ? path.basename(res.rootDirectory) : res.path;
288
+ console.log(cyan("│") + ` ${bold(padName)} -> ${green("submodule")} ${mode} ${gray(ver)} ${gray(`(${shortPath})`)}`.padEnd(79) + cyan("│"));
289
+ } else if (res.status === "npm") console.log(cyan("│") + ` ${bold(padName)} -> ${cyan("npm registry")} ${gray("(node_modules)")}`.padEnd(79) + cyan("│"));
290
+ else console.log(cyan("│") + ` ${bold(padName)} -> ${gray("not installed")}`.padEnd(79) + cyan("│"));
291
+ }
292
+ console.log(cyan("└────────────────────────────────────────────────────────────────────────┘"));
293
+ }
294
+ export { findProjectRoot, generateTsConfigPaths, getAllPackageResolutions, isTypeScriptRuntime, loadResolverConfig, printResolutionSummary, resolvePackage };
295
+
296
+ //# sourceMappingURL=resolver.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.mjs","names":[],"sources":["../src/resolver.ts"],"sourcesContent":["/**\n * @m3rcena/eco - Rust-Style Submodule & Path Resolver\n *\n * Inspired by Cargo's workspace and [patch.crates-io] resolver algorithm.\n * Enables zero-friction consumption of @m3rcena packages via Git submodules,\n * local vendor paths, or standard NPM registry installs without code changes.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport type M3rcenaPackageName = \"@m3rcena/weky\" | \"@m3rcena/eco\" | \"@m3rcena/bridge\";\n\nexport interface PackageResolution {\n name: M3rcenaPackageName;\n status: \"submodule\" | \"npm\" | \"missing\";\n type: \"source\" | \"dist\" | \"registry\";\n path: string;\n rootDirectory?: string;\n version?: string;\n isBuilt?: boolean;\n}\n\nexport interface ResolverOptions {\n cwd?: string;\n submodulesDir?: string;\n preferSource?: boolean;\n overrides?: Partial<Record<M3rcenaPackageName, string>>;\n silent?: boolean;\n}\n\nexport interface M3rcenaResolverConfig {\n submodulesDir?: string;\n preferSource?: boolean;\n packages?: Partial<Record<M3rcenaPackageName, string>>;\n}\n\nconst KNOWN_PACKAGES: Record<M3rcenaPackageName, { aliases: string[]; envVar: string }> = {\n \"@m3rcena/weky\": {\n aliases: [\"m3rcena-weky\", \"weky\", \"weky-manager\"],\n envVar: \"M3RCENA_WEKY_PATH\",\n },\n \"@m3rcena/eco\": {\n aliases: [\"m3rcena-eco\", \"eco\", \"economy\"],\n envVar: \"M3RCENA_ECO_PATH\",\n },\n \"@m3rcena/bridge\": {\n aliases: [\"m3rcena-bridge\", \"bridge\", \"m3rcena-core\"],\n envVar: \"M3RCENA_BRIDGE_PATH\",\n },\n};\n\nconst CANDIDATE_CONTAINERS = [\n \".\",\n \"submodules\",\n \"submodule\",\n \"vendor\",\n \"packages\",\n \"libs\",\n \"modules\",\n];\n\nexport function isTypeScriptRuntime(): boolean {\n if (typeof (process as any).isBun !== \"undefined\") return true;\n if (typeof (process as any).isDeno !== \"undefined\") return true;\n const execArgv = process.execArgv.join(\" \");\n if (/tsx|ts-node|@swc\\/register|ts-loader/.test(execArgv)) return true;\n if (process.argv[1]?.endsWith(\".ts\") || process.argv[1]?.endsWith(\".mts\")) return true;\n if (process.env.M3RCENA_PREFER_SOURCE === \"true\" || process.env.M3RCENA_PREFER_SOURCE === \"1\") return true;\n return false;\n}\n\nexport function findProjectRoot(startDir: string = process.cwd()): string {\n let current = path.resolve(startDir);\n for (let i = 0; i < 6; i++) {\n const pkgJson = path.join(current, \"package.json\");\n if (fs.existsSync(pkgJson)) {\n return current;\n }\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return path.resolve(startDir);\n}\n\nexport function loadResolverConfig(cwd: string = process.cwd()): M3rcenaResolverConfig | null {\n const root = findProjectRoot(cwd);\n const resolverFile = path.join(root, \"m3rcena.resolver.json\");\n if (fs.existsSync(resolverFile)) {\n try {\n return JSON.parse(fs.readFileSync(resolverFile, \"utf-8\")) as M3rcenaResolverConfig;\n } catch {\n // Ignore\n }\n }\n\n const pkgJsonPath = path.join(root, \"package.json\");\n if (fs.existsSync(pkgJsonPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, \"utf-8\"));\n if (pkg.m3rcena && typeof pkg.m3rcena === \"object\") {\n return pkg.m3rcena as M3rcenaResolverConfig;\n }\n } catch {\n // Ignore\n }\n }\n\n return null;\n}\n\nfunction inspectSubmoduleDirectory(dirPath: string, expectedName: M3rcenaPackageName): { isValid: boolean; version?: string } {\n if (!fs.existsSync(dirPath)) return { isValid: false };\n try {\n const stat = fs.statSync(dirPath);\n if (!stat.isDirectory()) return { isValid: false };\n\n const pkgPath = path.join(dirPath, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n const data = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n if (data.name === expectedName) {\n return { isValid: true, version: data.version };\n }\n }\n\n if (fs.existsSync(path.join(dirPath, \"src\", \"index.ts\"))) {\n return { isValid: true };\n }\n } catch {\n return { isValid: false };\n }\n return { isValid: false };\n}\n\nfunction resolveSubmoduleEntryPoint(dirPath: string, preferSource: boolean): { entryPath: string; type: \"source\" | \"dist\"; isBuilt: boolean } {\n const srcTs = path.join(dirPath, \"src\", \"index.ts\");\n const distMjs = path.join(dirPath, \"dist\", \"index.mjs\");\n const distCjs = path.join(dirPath, \"dist\", \"index.cjs\");\n const isBuilt = fs.existsSync(distMjs) || fs.existsSync(distCjs);\n\n if (preferSource && fs.existsSync(srcTs)) {\n return { entryPath: srcTs, type: \"source\", isBuilt };\n }\n\n if (fs.existsSync(distMjs)) {\n return { entryPath: distMjs, type: \"dist\", isBuilt: true };\n }\n if (fs.existsSync(distCjs)) {\n return { entryPath: distCjs, type: \"dist\", isBuilt: true };\n }\n\n if (fs.existsSync(srcTs)) {\n return { entryPath: srcTs, type: \"source\", isBuilt: false };\n }\n\n return { entryPath: dirPath, type: \"dist\", isBuilt };\n}\n\nexport function resolvePackage(packageName: M3rcenaPackageName, options: ResolverOptions = {}): PackageResolution {\n const root = findProjectRoot(options.cwd ?? process.cwd());\n const cfg = loadResolverConfig(root);\n const pkgMeta = KNOWN_PACKAGES[packageName];\n\n const preferSource = options.preferSource ?? cfg?.preferSource ?? isTypeScriptRuntime();\n\n // 0. Current project check: if root itself IS the requested package\n const rootInspected = inspectSubmoduleDirectory(root, packageName);\n if (rootInspected.isValid) {\n const ep = resolveSubmoduleEntryPoint(root, preferSource);\n return {\n name: packageName,\n status: \"submodule\",\n type: ep.type,\n path: ep.entryPath,\n rootDirectory: root,\n version: rootInspected.version,\n isBuilt: ep.isBuilt,\n };\n }\n\n if (options.overrides?.[packageName]) {\n const customPath = path.resolve(root, options.overrides[packageName]!);\n const inspected = inspectSubmoduleDirectory(customPath, packageName);\n if (inspected.isValid) {\n const ep = resolveSubmoduleEntryPoint(customPath, preferSource);\n return {\n name: packageName,\n status: \"submodule\",\n type: ep.type,\n path: ep.entryPath,\n rootDirectory: customPath,\n version: inspected.version,\n isBuilt: ep.isBuilt,\n };\n }\n }\n\n const envVal = process.env[pkgMeta.envVar];\n if (envVal) {\n const customPath = path.resolve(root, envVal);\n const inspected = inspectSubmoduleDirectory(customPath, packageName);\n if (inspected.isValid) {\n const ep = resolveSubmoduleEntryPoint(customPath, preferSource);\n return {\n name: packageName,\n status: \"submodule\",\n type: ep.type,\n path: ep.entryPath,\n rootDirectory: customPath,\n version: inspected.version,\n isBuilt: ep.isBuilt,\n };\n }\n }\n\n if (cfg?.packages?.[packageName]) {\n const customPath = path.resolve(root, cfg.packages[packageName]!);\n const inspected = inspectSubmoduleDirectory(customPath, packageName);\n if (inspected.isValid) {\n const ep = resolveSubmoduleEntryPoint(customPath, preferSource);\n return {\n name: packageName,\n status: \"submodule\",\n type: ep.type,\n path: ep.entryPath,\n rootDirectory: customPath,\n version: inspected.version,\n isBuilt: ep.isBuilt,\n };\n }\n }\n\n const candidateContainers = [\n options.submodulesDir,\n cfg?.submodulesDir,\n process.env.M3RCENA_SUBMODULES_DIR,\n ...CANDIDATE_CONTAINERS,\n ].filter((c): c is string => typeof c === \"string\" && c.trim().length > 0);\n\n const searchRoots = [root, path.resolve(root, \"..\"), path.resolve(root, \"../..\")];\n\n for (const sRoot of searchRoots) {\n for (const container of candidateContainers) {\n for (const alias of pkgMeta.aliases) {\n const candidateDir = path.resolve(sRoot, container, alias);\n const inspected = inspectSubmoduleDirectory(candidateDir, packageName);\n if (inspected.isValid) {\n const ep = resolveSubmoduleEntryPoint(candidateDir, preferSource);\n return {\n name: packageName,\n status: \"submodule\",\n type: ep.type,\n path: ep.entryPath,\n rootDirectory: candidateDir,\n version: inspected.version,\n isBuilt: ep.isBuilt,\n };\n }\n }\n }\n }\n\n try {\n const resolvedNpm = require.resolve(packageName, { paths: [root, process.cwd()] });\n return {\n name: packageName,\n status: \"npm\",\n type: \"registry\",\n path: resolvedNpm,\n };\n } catch {\n const nmPath = path.join(root, \"node_modules\", packageName);\n if (fs.existsSync(nmPath)) {\n return {\n name: packageName,\n status: \"npm\",\n type: \"registry\",\n path: nmPath,\n };\n }\n }\n\n return {\n name: packageName,\n status: \"missing\",\n type: \"registry\",\n path: packageName,\n };\n}\n\nexport function getAllPackageResolutions(options: ResolverOptions = {}): Record<M3rcenaPackageName, PackageResolution> {\n return {\n \"@m3rcena/weky\": resolvePackage(\"@m3rcena/weky\", options),\n \"@m3rcena/eco\": resolvePackage(\"@m3rcena/eco\", options),\n \"@m3rcena/bridge\": resolvePackage(\"@m3rcena/bridge\", options),\n };\n}\n\nexport function generateTsConfigPaths(options: ResolverOptions = {}): Record<string, string[]> {\n const resolutions = getAllPackageResolutions(options);\n const root = findProjectRoot(options.cwd ?? process.cwd());\n const paths: Record<string, string[]> = {};\n\n for (const [name, res] of Object.entries(resolutions)) {\n if (res.status === \"submodule\" && res.rootDirectory) {\n const rel = path.relative(root, res.rootDirectory).replace(/\\\\/g, \"/\");\n const cleanRel = !rel || rel === \".\" ? \".\" : (rel.startsWith(\".\") ? rel : `./${rel}`);\n paths[name] = [`${cleanRel}/src`, `${cleanRel}/dist/index.mjs`, cleanRel];\n if (name === \"@m3rcena/bridge\") {\n paths[\"@m3rcena/bridge/client\"] = [`${cleanRel}/src/client`, `${cleanRel}/dist/client.mjs`];\n }\n }\n }\n\n return paths;\n}\n\nexport function printResolutionSummary(options: ResolverOptions = {}): void {\n const resolutions = getAllPackageResolutions(options);\n const cyan = (s: string) => `\\x1b[36m${s}\\x1b[39m`;\n const green = (s: string) => `\\x1b[32m${s}\\x1b[39m`;\n const yellow = (s: string) => `\\x1b[33m${s}\\x1b[39m`;\n const gray = (s: string) => `\\x1b[90m${s}\\x1b[39m`;\n const bold = (s: string) => `\\x1b[1m${s}\\x1b[22m`;\n\n console.log(cyan(\"┌────────────────────────────────────────────────────────────────────────┐\"));\n console.log(cyan(\"│\") + bold(\" 🦀 M3RCENA RUST-STYLE SUBMODULE RESOLVER \") + cyan(\"│\"));\n console.log(cyan(\"├────────────────────────────────────────────────────────────────────────┤\"));\n\n for (const [name, res] of Object.entries(resolutions)) {\n const padName = name.padEnd(16);\n if (res.status === \"submodule\") {\n const mode = res.type === \"source\" ? yellow(\"[SOURCE]\") : green(\"[DIST]\");\n const ver = res.version ? `v${res.version}` : \"local\";\n const shortPath = res.rootDirectory ? path.basename(res.rootDirectory) : res.path;\n console.log(\n cyan(\"│\") +\n ` ${bold(padName)} -> ${green(\"submodule\")} ${mode} ${gray(ver)} ${gray(`(${shortPath})`)}`.padEnd(79) +\n cyan(\"│\")\n );\n } else if (res.status === \"npm\") {\n console.log(cyan(\"│\") + ` ${bold(padName)} -> ${cyan(\"npm registry\")} ${gray(\"(node_modules)\")}`.padEnd(79) + cyan(\"│\"));\n } else {\n console.log(cyan(\"│\") + ` ${bold(padName)} -> ${gray(\"not installed\")}`.padEnd(79) + cyan(\"│\"));\n }\n }\n\n console.log(cyan(\"└────────────────────────────────────────────────────────────────────────┘\"));\n}\n"],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ // \0rolldown/runtime.js
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
+ key = keys[i];
11
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
+ get: ((k) => from[k]).bind(null, key),
13
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
+ });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
19
+ value: mod,
20
+ enumerable: true
21
+ }) : target, mod));
22
+ Object.defineProperty(exports, "__toESM", {
23
+ enumerable: true,
24
+ get: function() {
25
+ return __toESM;
26
+ }
27
+ });
@@ -0,0 +1,4 @@
1
+ import { createRequire } from "node:module";
2
+ // \0rolldown/runtime.js
3
+ var __require = /* #__PURE__ */ (() => createRequire(import.meta.url))();
4
+ export { __require as t };
package/package.json CHANGED
@@ -1,6 +1,96 @@
1
1
  {
2
2
  "name": "@m3rcena/eco",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "14.28.1",
4
+ "description": "The ultimate Discord.js v14 economy engine. Dual wallet/bank, career jobs, items & inventory, businesses, interactive casino gambling, robbery, market trading, and web dashboard bridge.",
5
+ "main": "./dist/index.cjs",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.cts",
8
+ "exports": {
9
+ ".": {
10
+ "development": "./src/index.ts",
11
+ "import": {
12
+ "types": "./dist/index.d.mts",
13
+ "default": "./dist/index.mjs"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.cts",
17
+ "default": "./dist/index.cjs"
18
+ }
19
+ },
20
+ "./resolver": {
21
+ "types": "./dist/resolver.d.mts",
22
+ "import": "./dist/resolver.mjs",
23
+ "require": "./dist/resolver.cjs"
24
+ },
25
+ "./register": {
26
+ "types": "./dist/register.d.mts",
27
+ "import": "./dist/register.mjs",
28
+ "require": "./dist/register.cjs"
29
+ },
30
+ "./host": {
31
+ "types": "./dist/host.d.mts",
32
+ "import": "./dist/host.mjs",
33
+ "require": "./dist/host.cjs"
34
+ },
35
+ "./source": "./src/index.ts",
36
+ "./package.json": "./package.json"
37
+ },
38
+ "files": [
39
+ "dist",
40
+ "assets",
41
+ "DOCUMENTATION.md",
42
+ "CHANGELOG.md",
43
+ "README.md",
44
+ "LICENSE"
45
+ ],
46
+ "publishConfig": {
47
+ "access": "public"
48
+ },
49
+ "scripts": {
50
+ "build": "tsdown",
51
+ "prepare": "tsdown",
52
+ "dev": "tsdown --watch",
53
+ "host": "tsx src/host.ts",
54
+ "typecheck": "tsc --noEmit",
55
+ "test": "tsx test/index.test.ts && tsx test/database.test.ts && tsx test/connector.test.ts && tsx test/submodule.test.ts"
56
+ },
57
+ "keywords": [
58
+ "m3rcena",
59
+ "eco",
60
+ "economy",
61
+ "discord-economy",
62
+ "discord.js",
63
+ "discord.js-v14",
64
+ "components-v2",
65
+ "casino",
66
+ "blackjack",
67
+ "inventory",
68
+ "banking",
69
+ "businesses",
70
+ "jobs"
71
+ ],
72
+ "author": "M3rcena <https://github.com/M3rcena>",
73
+ "license": "Apache-2.0",
74
+ "repository": {
75
+ "type": "git",
76
+ "url": "git+https://github.com/M3rcena/m3rcena-eco.git"
77
+ },
78
+ "bugs": {
79
+ "url": "https://github.com/M3rcena/m3rcena-eco/issues"
80
+ },
81
+ "homepage": "https://github.com/M3rcena/m3rcena-eco#readme",
82
+ "engines": {
83
+ "node": ">=22.0.0"
84
+ },
85
+ "dependencies": {
86
+ "@m3rcena/bridge": "^14.28.1",
87
+ "@napi-rs/canvas": "^0.1.68",
88
+ "discord.js": "^14.28.1"
89
+ },
90
+ "devDependencies": {
91
+ "@types/node": "^26.6.6",
92
+ "tsdown": "^0.23.4",
93
+ "tsx": "^4.23.15",
94
+ "typescript": "^7.0.2"
95
+ }
96
+ }