@aromix/core 0.0.0 → 0.1.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.
package/dist/index.js CHANGED
@@ -1,10 +1,3 @@
1
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
- }) : x)(function(x) {
4
- if (typeof require !== "undefined") return require.apply(this, arguments);
5
- throw Error('Dynamic require of "' + x + '" is not supported');
6
- });
7
-
8
1
  // src/build.ts
9
2
  function build(options) {
10
3
  return options;
@@ -15,6 +8,10 @@ function config(config2) {
15
8
  return typeof config2 === "function" ? config2() : config2;
16
9
  }
17
10
 
11
+ // src/entity/builder.ts
12
+ var Builder = class {
13
+ };
14
+
18
15
  // src/entity/entity.ts
19
16
  function entity(options) {
20
17
  }
@@ -49,505 +46,20 @@ var Codec = {
49
46
  function toFetchHandler() {
50
47
  }
51
48
 
52
- // src/hook/impl.ts
53
- function hook(on, run) {
54
- return { on, run };
55
- }
56
-
57
- // src/load.ts
58
- function detectRuntime() {
59
- if (typeof globalThis.Deno !== "undefined") return "deno";
60
- if (typeof globalThis.Bun !== "undefined") return "bun";
61
- if (typeof process !== "undefined" && process.versions?.node) return "node";
62
- return "worker";
63
- }
64
- var RUNTIME = detectRuntime();
65
- function makeNodeAdapter() {
66
- const fs = __require("fs");
67
- const path = __require("path");
68
- const statCache = /* @__PURE__ */ new Map();
69
- return {
70
- cwd: () => process.cwd(),
71
- readdir: (dir) => fs.readdirSync(dir),
72
- lstat: (p) => {
73
- if (statCache.has(p)) return statCache.get(p);
74
- const s = fs.lstatSync(p);
75
- const result = { isFile: s.isFile(), isDirectory: s.isDirectory() };
76
- statCache.set(p, result);
77
- return result;
78
- },
79
- exists: (p) => {
80
- try {
81
- fs.accessSync(p);
82
- return true;
83
- } catch {
84
- return false;
85
- }
86
- },
87
- readText: (p) => fs.readFileSync(p, "utf8"),
88
- resolve: (...parts) => path.resolve(...parts),
89
- join: (...parts) => path.join(...parts),
90
- relative: (from, to) => path.relative(from, to),
91
- sep: path.sep
92
- };
93
- }
94
- function makeDenoAdapter() {
95
- const deno = globalThis.Deno;
96
- const statCache = /* @__PURE__ */ new Map();
97
- const join = (...parts) => parts.reduce((a, b) => a.replace(/\/+$/, "") + "/" + b.replace(/^\/+/, ""));
98
- const resolve = (...parts) => {
99
- let base = parts[0].startsWith("/") ? parts[0] : join(deno.cwd(), parts[0]);
100
- for (let i = 1; i < parts.length; i++) {
101
- const p = parts[i];
102
- base = p.startsWith("/") ? p : join(base, p);
103
- }
104
- const segments = base.split("/");
105
- const out = [];
106
- for (const s of segments) {
107
- if (s === "..") out.pop();
108
- else if (s !== ".") out.push(s);
109
- }
110
- return out.join("/") || "/";
111
- };
112
- return {
113
- cwd: () => deno.cwd(),
114
- readdir: (dir) => [...deno.readDirSync(dir)].map((e) => e.name),
115
- lstat: (p) => {
116
- if (statCache.has(p)) return statCache.get(p);
117
- const s = deno.lstatSync(p);
118
- const result = { isFile: s.isFile, isDirectory: s.isDirectory };
119
- statCache.set(p, result);
120
- return result;
121
- },
122
- exists: (p) => {
123
- try {
124
- deno.lstatSync(p);
125
- return true;
126
- } catch {
127
- return false;
128
- }
129
- },
130
- readText: (p) => deno.readTextFileSync(p),
131
- resolve,
132
- join,
133
- relative: (from, to) => {
134
- const f = from.split("/").filter(Boolean);
135
- const t = to.split("/").filter(Boolean);
136
- let i = 0;
137
- while (i < f.length && f[i] === t[i]) i++;
138
- return [...f.slice(i).map(() => ".."), ...t.slice(i)].join("/") || ".";
139
- },
140
- sep: "/"
141
- };
142
- }
143
- function makeWorkerAdapter() {
144
- const noFS = (method) => () => {
145
- throw new Error(
146
- `load(): filesystem access unavailable in Cloudflare Workers (called: ${method}). Only pre-resolved paths or alias-only patterns are supported.`
147
- );
148
- };
149
- return {
150
- cwd: noFS("cwd"),
151
- readdir: noFS("readdir"),
152
- lstat: noFS("lstat"),
153
- exists: () => false,
154
- readText: noFS("readText"),
155
- resolve: (...parts) => parts.join("/").replace(/\/+/g, "/"),
156
- join: (...parts) => parts.join("/").replace(/\/+/g, "/"),
157
- relative: noFS("relative"),
158
- sep: "/"
159
- };
160
- }
161
- function makeAdapter() {
162
- if (RUNTIME === "deno") return makeDenoAdapter();
163
- if (RUNTIME === "worker") return makeWorkerAdapter();
164
- return makeNodeAdapter();
165
- }
166
- function expandBraces(pattern) {
167
- const open = pattern.indexOf("{");
168
- if (open === -1) return [pattern];
169
- let depth = 0;
170
- let close = -1;
171
- for (let i = open; i < pattern.length; i++) {
172
- if (pattern[i] === "{") depth++;
173
- else if (pattern[i] === "}") {
174
- depth--;
175
- if (depth === 0) {
176
- close = i;
177
- break;
178
- }
179
- }
180
- }
181
- if (close === -1) return [pattern];
182
- const prefix = pattern.slice(0, open);
183
- const suffix = pattern.slice(close + 1);
184
- const inner = pattern.slice(open + 1, close);
185
- const parts = [];
186
- let buf = "";
187
- let d = 0;
188
- for (const ch of inner) {
189
- if (ch === "{") {
190
- d++;
191
- buf += ch;
192
- } else if (ch === "}") {
193
- d--;
194
- buf += ch;
195
- } else if (ch === "," && d === 0) {
196
- parts.push(buf);
197
- buf = "";
198
- } else buf += ch;
199
- }
200
- parts.push(buf);
201
- const results = [];
202
- for (const part of parts) {
203
- for (const expanded of expandBraces(prefix + part + suffix)) {
204
- results.push(expanded);
205
- }
206
- }
207
- return results;
208
- }
209
- function globToRegex(glob, opts = {}) {
210
- let src = "^";
211
- let i = 0;
212
- const len = glob.length;
213
- while (i < len) {
214
- const ch = glob[i];
215
- if (ch === "*") {
216
- if (glob[i + 1] === "*") {
217
- src += opts.globstar !== false ? ".*" : "[^/]*";
218
- i += 2;
219
- if (glob[i] === "/") i++;
220
- continue;
221
- }
222
- src += "[^/]*";
223
- } else if (ch === "?") {
224
- src += "[^/]";
225
- } else if (".+^${}|[]()\\".includes(ch)) {
226
- src += "\\" + ch;
227
- } else {
228
- src += ch;
229
- }
230
- i++;
231
- }
232
- src += "$";
233
- return new RegExp(src);
234
- }
235
- var HIDDEN = /(^|[/\\])\.[^/\\.]/;
236
- function walkSync(fs, baseDir, globParts, currentDir, opts) {
237
- if (globParts.length === 0) return [];
238
- const results = [];
239
- const [head, ...rest] = globParts;
240
- const isLast = rest.length === 0;
241
- let entries;
242
- try {
243
- entries = fs.readdir(currentDir);
244
- } catch {
245
- return results;
246
- }
247
- if (head === "**") {
248
- for (const name of entries) {
249
- const full = fs.join(currentDir, name);
250
- if (!opts.dot && HIDDEN.test(name)) continue;
251
- let stat;
252
- try {
253
- stat = fs.lstat(full);
254
- } catch {
255
- continue;
256
- }
257
- if (stat.isDirectory) {
258
- results.push(...walkSync(fs, baseDir, globParts, full, opts));
259
- if (rest.length > 0) {
260
- results.push(...walkSync(fs, baseDir, rest, full, opts));
261
- }
262
- } else if (stat.isFile) {
263
- if (rest.length === 0) results.push(full);
264
- else {
265
- }
266
- }
267
- }
268
- return results;
269
- }
270
- const regex = globToRegex(head, { globstar: false });
271
- for (const name of entries) {
272
- if (!opts.dot && HIDDEN.test(name)) continue;
273
- if (!regex.test(name)) continue;
274
- const full = fs.join(currentDir, name);
275
- let stat;
276
- try {
277
- stat = fs.lstat(full);
278
- } catch {
279
- continue;
280
- }
281
- if (isLast) {
282
- if (stat.isFile) results.push(full);
283
- else if (stat.isDirectory && !opts.filesOnly) results.push(full);
284
- } else {
285
- if (stat.isDirectory) {
286
- results.push(...walkSync(fs, baseDir, rest, full, opts));
287
- }
288
- }
289
- }
290
- return results;
291
- }
292
- function resolveGlob(fsAdapter, pattern, opts) {
293
- const sep = /[/\\]/;
294
- const parts = pattern.split(sep);
295
- let staticParts = [];
296
- let globParts = [];
297
- let inGlob = false;
298
- for (const p of parts) {
299
- if (!inGlob && !p.includes("*") && !p.includes("?")) {
300
- staticParts.push(p);
301
- } else {
302
- inGlob = true;
303
- globParts.push(p);
304
- }
305
- }
306
- const baseDir = fsAdapter.resolve(opts.cwd, staticParts.join("/"));
307
- if (globParts.length === 0) {
308
- try {
309
- const stat = fsAdapter.lstat(baseDir);
310
- if (opts.filesOnly && !stat.isFile) return [];
311
- return [baseDir];
312
- } catch {
313
- return [];
314
- }
315
- }
316
- return walkSync(fsAdapter, baseDir, globParts, baseDir, opts);
317
- }
318
- var aliasCache = /* @__PURE__ */ new Map();
319
- function findTsconfig(fsAdapter, startDir) {
320
- let dir = startDir;
321
- while (true) {
322
- const candidate = fsAdapter.join(dir, "tsconfig.json");
323
- if (fsAdapter.exists(candidate)) return candidate;
324
- const parent = fsAdapter.resolve(dir, "..");
325
- if (parent === dir) return null;
326
- dir = parent;
327
- }
328
- }
329
- function loadTsconfig(fsAdapter, tsconfigPath) {
330
- if (aliasCache.has(tsconfigPath)) return aliasCache.get(tsconfigPath);
331
- try {
332
- const raw = fsAdapter.readText(tsconfigPath);
333
- const cleaned = raw.replace(/\/\/[^\n]*/g, "");
334
- const json = JSON.parse(cleaned);
335
- const co = json?.compilerOptions ?? {};
336
- const baseUrl = co.baseUrl ? fsAdapter.resolve(fsAdapter.join(tsconfigPath, ".."), co.baseUrl) : fsAdapter.join(tsconfigPath, "..");
337
- const paths = co.paths ?? {};
338
- const result = { paths, baseUrl };
339
- aliasCache.set(tsconfigPath, result);
340
- return result;
341
- } catch {
342
- aliasCache.set(tsconfigPath, null);
343
- return null;
344
- }
345
- }
346
- function resolveAliases(pattern, aliasMap) {
347
- const { paths, baseUrl } = aliasMap;
348
- for (const [key, targets] of Object.entries(paths)) {
349
- const aliasRegex = new RegExp("^" + key.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, "(.*)") + "$");
350
- const match = pattern.match(aliasRegex);
351
- if (!match) continue;
352
- const capture = match[1] ?? "";
353
- return targets.map((target) => {
354
- const concrete = target.includes("*") ? target.replace("*", capture) : target;
355
- return concrete.startsWith("/") ? concrete : `${baseUrl}/${concrete}`.replace(/\/+/g, "/");
356
- });
357
- }
358
- return [pattern];
359
- }
360
- function load(pattern, options = {}) {
361
- const fsAdapter = makeAdapter();
362
- const cwd = options.cwd ?? (RUNTIME !== "worker" ? fsAdapter.cwd() : "/");
363
- const dot = options.dot ?? false;
364
- const filesOnly = options.filesOnly ?? true;
365
- let aliasMap = null;
366
- if (RUNTIME !== "worker") {
367
- const tsconfigPath = options.tsconfig ? fsAdapter.resolve(cwd, options.tsconfig) : findTsconfig(fsAdapter, cwd);
368
- if (tsconfigPath) {
369
- aliasMap = loadTsconfig(fsAdapter, tsconfigPath);
370
- }
371
- }
372
- const patterns = Array.isArray(pattern) ? pattern : [pattern];
373
- const seen = /* @__PURE__ */ new Set();
374
- const results = [];
375
- for (const rawPattern of patterns) {
376
- const aliasExpanded = aliasMap ? resolveAliases(rawPattern, aliasMap) : [rawPattern];
377
- for (const aliasPattern of aliasExpanded) {
378
- const braceExpanded = expandBraces(aliasPattern);
379
- for (const globPattern of braceExpanded) {
380
- if (RUNTIME === "worker") {
381
- if (!seen.has(globPattern)) {
382
- seen.add(globPattern);
383
- results.push(globPattern);
384
- }
385
- continue;
386
- }
387
- const matches = resolveGlob(fsAdapter, globPattern, { cwd, dot, filesOnly });
388
- for (const m of matches) {
389
- if (!seen.has(m)) {
390
- seen.add(m);
391
- results.push(m);
392
- }
393
- }
394
- }
395
- }
396
- }
397
- return results;
398
- }
399
- function clearCache() {
400
- aliasCache.clear();
401
- }
402
-
403
49
  // src/make/impl.ts
404
50
  function make() {
405
51
  }
406
52
 
407
- // src/make/util.ts
408
- function filter(hooks, on) {
409
- return hooks.filter((h) => h.on === on).map((h) => h.run);
410
- }
411
-
412
53
  // src/plugin.ts
413
54
  function plugin() {
414
55
  }
415
-
416
- // src/program/types.ts
417
- var programMeta = /* @__PURE__ */ Symbol("aromix.program.meta");
418
-
419
- // src/program/impl.ts
420
- function program(config2) {
421
- const meta = {
422
- name: config2.name,
423
- deps: config2.deps ?? {},
424
- hooks: config2.hooks ?? [],
425
- routes: []
426
- };
427
- return {
428
- [programMeta]: meta,
429
- command(options) {
430
- meta.routes.push({
431
- type: "command",
432
- options
433
- });
434
- },
435
- stream(options) {
436
- meta.routes.push({
437
- type: "stream",
438
- options
439
- });
440
- },
441
- socket(options) {
442
- meta.routes.push({
443
- type: "socket",
444
- options
445
- });
446
- }
447
- };
448
- }
449
-
450
- // src/service/facade.ts
451
- function hasKey(obj, key) {
452
- if (typeof key === "symbol") {
453
- return Object.getOwnPropertySymbols(obj).includes(key);
454
- }
455
- return Object.hasOwn(obj, key);
456
- }
457
- var NativeKeys = /* @__PURE__ */ new Set([
458
- ...Object.getOwnPropertyNames(Object.prototype),
459
- ...Object.getOwnPropertySymbols(Object.prototype),
460
- ...Object.getOwnPropertyNames(Function.prototype),
461
- ...Object.getOwnPropertySymbols(Function.prototype)
462
- ]);
463
- function addInstanceProperties(serviceInstance, targetObj) {
464
- const ownKeys = [...Object.getOwnPropertyNames(serviceInstance), ...Object.getOwnPropertySymbols(serviceInstance)];
465
- for (const key of ownKeys) {
466
- if (hasKey(targetObj, key)) continue;
467
- const descriptor = Object.getOwnPropertyDescriptor(serviceInstance, key);
468
- if (typeof descriptor.value === "function") continue;
469
- if (descriptor.get || descriptor.set) continue;
470
- Object.defineProperty(targetObj, key, {
471
- get: () => serviceInstance[key],
472
- set: (v) => serviceInstance[key] = v,
473
- enumerable: true,
474
- configurable: true
475
- });
476
- }
477
- }
478
- function addPrototypeProperties(serviceInstance, targetObj) {
479
- let currentProto = Object.getPrototypeOf(serviceInstance);
480
- while (currentProto && currentProto !== Object.prototype) {
481
- const protoKeys = [...Object.getOwnPropertyNames(currentProto), ...Object.getOwnPropertySymbols(currentProto)];
482
- for (const key of protoKeys) {
483
- if (hasKey(targetObj, key)) continue;
484
- if (NativeKeys.has(key)) continue;
485
- const descriptor = Object.getOwnPropertyDescriptor(currentProto, key);
486
- if (descriptor.get || descriptor.set) {
487
- Object.defineProperty(targetObj, key, {
488
- get: descriptor.get ? () => descriptor.get.call(serviceInstance) : void 0,
489
- set: descriptor.set ? (v) => descriptor.set.call(serviceInstance, v) : void 0,
490
- enumerable: true,
491
- configurable: true
492
- });
493
- } else if (typeof descriptor.value === "function") {
494
- targetObj[key] = descriptor.value.bind(serviceInstance);
495
- }
496
- }
497
- currentProto = Object.getPrototypeOf(currentProto);
498
- }
499
- }
500
- function createFacadeObj(serviceInstance) {
501
- const targetObj = {};
502
- addInstanceProperties(serviceInstance, targetObj);
503
- addPrototypeProperties(serviceInstance, targetObj);
504
- Object.defineProperty(targetObj, "constructor", {
505
- get: () => serviceInstance.constructor,
506
- enumerable: false,
507
- configurable: true
508
- });
509
- return targetObj;
510
- }
511
-
512
- // src/service/service.ts
513
- var ServiceToken = /* @__PURE__ */ Symbol.for("aromix.service.token");
514
- var ServiceRegistry = /* @__PURE__ */ new Map();
515
- function provide() {
516
- return (target) => {
517
- const token = crypto.randomUUID();
518
- target[ServiceToken] = token;
519
- };
520
- }
521
- function inject(Service) {
522
- const token = Service[ServiceToken];
523
- if (!token) {
524
- throw new Error(`Class ${Service.name} is not marked as injectable. Use @provide().`);
525
- }
526
- if (!ServiceRegistry.has(token)) {
527
- ServiceRegistry.set(Service, new Service());
528
- }
529
- let instance = ServiceRegistry.get(Service);
530
- return instance;
531
- }
532
- inject.facade = (Service) => {
533
- const instance = inject(Service);
534
- return createFacadeObj(instance);
535
- };
536
56
  export {
57
+ Builder,
537
58
  Codec,
538
59
  build,
539
- clearCache,
540
60
  config,
541
- createFacadeObj,
542
61
  entity,
543
- filter,
544
- hook,
545
- inject,
546
- load,
547
62
  make,
548
63
  plugin,
549
- program,
550
- programMeta,
551
- provide,
552
64
  toFetchHandler
553
65
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aromix/core",
3
- "version": "0.0.0",
3
+ "version": "0.1.1",
4
4
  "description": "Core runtime-agnostic framework for Aromix",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -27,6 +27,7 @@
27
27
  "files": [
28
28
  "dist"
29
29
  ],
30
+ "types": "./dist/index.d.ts",
30
31
  "exports": {
31
32
  ".": {
32
33
  "types": "./dist/index.d.ts",