@arikajs/foundation 0.0.4 → 0.0.6

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 (96) hide show
  1. package/README.md +25 -23
  2. package/dist/ObjectPool.d.ts +9 -0
  3. package/dist/ObjectPool.d.ts.map +1 -0
  4. package/dist/ObjectPool.js +25 -0
  5. package/dist/ObjectPool.js.map +1 -0
  6. package/dist/application/Application.d.ts +47 -15
  7. package/dist/application/Application.d.ts.map +1 -1
  8. package/dist/application/Application.js +121 -50
  9. package/dist/application/Application.js.map +1 -1
  10. package/dist/container/Container.d.ts +22 -0
  11. package/dist/container/Container.d.ts.map +1 -1
  12. package/dist/container/Container.js +60 -7
  13. package/dist/container/Container.js.map +1 -1
  14. package/dist/contracts/Application.d.ts +5 -0
  15. package/dist/contracts/Application.d.ts.map +1 -1
  16. package/dist/examples/basic.d.ts +3 -0
  17. package/dist/examples/basic.d.ts.map +1 -0
  18. package/dist/examples/basic.js +110 -0
  19. package/dist/examples/basic.js.map +1 -0
  20. package/dist/index.d.ts +2 -4
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +3 -6
  23. package/dist/index.js.map +1 -1
  24. package/dist/src/ObjectPool.d.ts +9 -0
  25. package/dist/src/ObjectPool.d.ts.map +1 -0
  26. package/dist/src/ObjectPool.js +25 -0
  27. package/dist/src/ObjectPool.js.map +1 -0
  28. package/dist/src/application/Application.d.ts +105 -0
  29. package/dist/src/application/Application.d.ts.map +1 -0
  30. package/dist/src/application/Application.js +267 -0
  31. package/dist/src/application/Application.js.map +1 -0
  32. package/dist/src/container/Container.d.ts +61 -0
  33. package/dist/src/container/Container.d.ts.map +1 -0
  34. package/dist/src/container/Container.js +126 -0
  35. package/dist/src/container/Container.js.map +1 -0
  36. package/dist/src/contracts/Application.d.ts +20 -0
  37. package/dist/src/contracts/Application.d.ts.map +1 -0
  38. package/dist/src/contracts/Application.js +3 -0
  39. package/dist/src/contracts/Application.js.map +1 -0
  40. package/dist/src/contracts/Kernel.d.ts +24 -0
  41. package/dist/src/contracts/Kernel.d.ts.map +1 -0
  42. package/dist/src/contracts/Kernel.js +3 -0
  43. package/dist/src/contracts/Kernel.js.map +1 -0
  44. package/dist/src/index.d.ts +8 -0
  45. package/dist/src/index.d.ts.map +1 -0
  46. package/dist/src/index.js +28 -0
  47. package/dist/src/index.js.map +1 -0
  48. package/dist/src/providers/ServiceProvider.d.ts +25 -0
  49. package/dist/src/providers/ServiceProvider.d.ts.map +1 -0
  50. package/dist/src/providers/ServiceProvider.js +26 -0
  51. package/dist/src/providers/ServiceProvider.js.map +1 -0
  52. package/dist/tests/application.test.d.ts +2 -0
  53. package/dist/tests/application.test.d.ts.map +1 -0
  54. package/dist/tests/application.test.js +213 -0
  55. package/dist/tests/application.test.js.map +1 -0
  56. package/dist/tests/config.test.d.ts +2 -0
  57. package/dist/tests/config.test.d.ts.map +1 -0
  58. package/dist/tests/config.test.js +120 -0
  59. package/dist/tests/config.test.js.map +1 -0
  60. package/dist/tests/config_helper.test.d.ts +2 -0
  61. package/dist/tests/config_helper.test.d.ts.map +1 -0
  62. package/dist/tests/config_helper.test.js +46 -0
  63. package/dist/tests/config_helper.test.js.map +1 -0
  64. package/dist/tests/container.test.d.ts +2 -0
  65. package/dist/tests/container.test.d.ts.map +1 -0
  66. package/dist/tests/container.test.js +94 -0
  67. package/dist/tests/container.test.js.map +1 -0
  68. package/dist/tests/env.test.d.ts +2 -0
  69. package/dist/tests/env.test.d.ts.map +1 -0
  70. package/dist/tests/env.test.js +101 -0
  71. package/dist/tests/env.test.js.map +1 -0
  72. package/dist/tests/provider.test.d.ts +2 -0
  73. package/dist/tests/provider.test.d.ts.map +1 -0
  74. package/dist/tests/provider.test.js +87 -0
  75. package/dist/tests/provider.test.js.map +1 -0
  76. package/dist/tests/timezone.test.d.ts +2 -0
  77. package/dist/tests/timezone.test.d.ts.map +1 -0
  78. package/dist/tests/timezone.test.js +47 -0
  79. package/dist/tests/timezone.test.js.map +1 -0
  80. package/package.json +13 -11
  81. package/dist/config/Repository.d.ts +0 -41
  82. package/dist/config/Repository.d.ts.map +0 -1
  83. package/dist/config/Repository.js +0 -140
  84. package/dist/config/Repository.js.map +0 -1
  85. package/dist/support/EnvLoader.d.ts +0 -15
  86. package/dist/support/EnvLoader.d.ts.map +0 -1
  87. package/dist/support/EnvLoader.js +0 -58
  88. package/dist/support/EnvLoader.js.map +0 -1
  89. package/dist/support/config.d.ts +0 -18
  90. package/dist/support/config.d.ts.map +0 -1
  91. package/dist/support/config.js +0 -29
  92. package/dist/support/config.js.map +0 -1
  93. package/dist/support/env.d.ts +0 -9
  94. package/dist/support/env.d.ts.map +0 -1
  95. package/dist/support/env.js +0 -32
  96. package/dist/support/env.js.map +0 -1
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const node_test_1 = require("node:test");
40
+ const node_assert_1 = __importDefault(require("node:assert"));
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const os = __importStar(require("os"));
44
+ const config_1 = require("@arikajs/config");
45
+ (0, node_test_1.test)('Repository: get() returns undefined for missing key', () => {
46
+ const repo = new config_1.Repository();
47
+ node_assert_1.default.strictEqual(repo.get('missing'), undefined);
48
+ });
49
+ (0, node_test_1.test)('Repository: get() returns defaultValue for missing key', () => {
50
+ const repo = new config_1.Repository();
51
+ const value = repo.get('missing', 'default');
52
+ node_assert_1.default.strictEqual(value, 'default');
53
+ });
54
+ (0, node_test_1.test)('Repository: get() supports dot notation', () => {
55
+ const repo = new config_1.Repository();
56
+ repo.config = {
57
+ app: {
58
+ name: 'Test App',
59
+ version: '1.0.0',
60
+ },
61
+ };
62
+ node_assert_1.default.strictEqual(repo.get('app.name'), 'Test App');
63
+ node_assert_1.default.strictEqual(repo.get('app.version'), '1.0.0');
64
+ });
65
+ (0, node_test_1.test)('Repository: has() checks if key exists', () => {
66
+ const repo = new config_1.Repository();
67
+ repo.config = {
68
+ app: {
69
+ name: 'Test',
70
+ },
71
+ };
72
+ node_assert_1.default.strictEqual(repo.has('app.name'), true);
73
+ node_assert_1.default.strictEqual(repo.has('app.missing'), false);
74
+ });
75
+ (0, node_test_1.test)('Repository: all() returns all config', () => {
76
+ const repo = new config_1.Repository();
77
+ const config = {
78
+ app: { name: 'Test' },
79
+ db: { host: 'localhost' },
80
+ };
81
+ repo.config = config;
82
+ const all = repo.all();
83
+ node_assert_1.default.deepStrictEqual(all, config);
84
+ // Should be a copy, not the same reference
85
+ node_assert_1.default.notStrictEqual(all, config);
86
+ });
87
+ (0, node_test_1.test)('Repository: loadConfigDirectory() loads JS files', () => {
88
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'arika-config-test-'));
89
+ const configDir = path.join(tmpDir, 'config');
90
+ fs.mkdirSync(configDir, { recursive: true });
91
+ // Create test config files
92
+ fs.writeFileSync(path.join(configDir, 'app.js'), `module.exports = { default: { name: 'Test App' } };`);
93
+ fs.writeFileSync(path.join(configDir, 'database.js'), `module.exports = { default: { host: 'localhost' } };`);
94
+ const repo = new config_1.Repository();
95
+ repo.loadConfigDirectory(configDir);
96
+ node_assert_1.default.strictEqual(repo.get('app.name'), 'Test App');
97
+ node_assert_1.default.strictEqual(repo.get('database.host'), 'localhost');
98
+ // Cleanup
99
+ fs.rmSync(tmpDir, { recursive: true, force: true });
100
+ });
101
+ (0, node_test_1.test)('Repository: loadConfigDirectory() handles missing directory', () => {
102
+ const repo = new config_1.Repository();
103
+ const missingDir = path.join(os.tmpdir(), 'non-existent-config');
104
+ // Should not throw
105
+ repo.loadConfigDirectory(missingDir);
106
+ });
107
+ (0, node_test_1.test)('Repository: markAsBooted() prevents further modifications', () => {
108
+ const repo = new config_1.Repository();
109
+ repo.markAsBooted();
110
+ node_assert_1.default.throws(() => {
111
+ repo.loadConfigDirectory(__dirname);
112
+ }, /Configuration cannot be modified after boot/);
113
+ });
114
+ (0, node_test_1.test)('Repository: isBooted() returns boot status', () => {
115
+ const repo = new config_1.Repository();
116
+ node_assert_1.default.strictEqual(repo.isBooted(), false);
117
+ repo.markAsBooted();
118
+ node_assert_1.default.strictEqual(repo.isBooted(), true);
119
+ });
120
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../tests/config.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAAiC;AACjC,8DAAiC;AACjC,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,4CAA6C;AAE7C,IAAA,gBAAI,EAAC,qDAAqD,EAAE,GAAG,EAAE;IAC/D,MAAM,IAAI,GAAG,IAAI,mBAAU,EAAE,CAAC;IAE9B,qBAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,wDAAwD,EAAE,GAAG,EAAE;IAClE,MAAM,IAAI,GAAG,IAAI,mBAAU,EAAE,CAAC;IAE9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC7C,qBAAM,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,yCAAyC,EAAE,GAAG,EAAE;IACnD,MAAM,IAAI,GAAG,IAAI,mBAAU,EAAE,CAAC;IAC7B,IAAY,CAAC,MAAM,GAAG;QACrB,GAAG,EAAE;YACH,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,OAAO;SACjB;KACF,CAAC;IAEF,qBAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;IACrD,qBAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,wCAAwC,EAAE,GAAG,EAAE;IAClD,MAAM,IAAI,GAAG,IAAI,mBAAU,EAAE,CAAC;IAC7B,IAAY,CAAC,MAAM,GAAG;QACrB,GAAG,EAAE;YACH,IAAI,EAAE,MAAM;SACb;KACF,CAAC;IAEF,qBAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/C,qBAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,sCAAsC,EAAE,GAAG,EAAE;IAChD,MAAM,IAAI,GAAG,IAAI,mBAAU,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG;QACb,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QACrB,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;KAC1B,CAAC;IACD,IAAY,CAAC,MAAM,GAAG,MAAM,CAAC;IAE9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,qBAAM,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACpC,2CAA2C;IAC3C,qBAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,kDAAkD,EAAE,GAAG,EAAE;IAC5D,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9C,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,2BAA2B;IAC3B,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAC9B,qDAAqD,CACtD,CAAC;IACF,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,EACnC,sDAAsD,CACvD,CAAC;IAEF,MAAM,IAAI,GAAG,IAAI,mBAAU,EAAE,CAAC;IAC9B,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAEpC,qBAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;IACrD,qBAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC,CAAC;IAE3D,UAAU;IACV,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,6DAA6D,EAAE,GAAG,EAAE;IACvE,MAAM,IAAI,GAAG,IAAI,mBAAU,EAAE,CAAC;IAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC;IAEjE,mBAAmB;IACnB,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,2DAA2D,EAAE,GAAG,EAAE;IACrE,MAAM,IAAI,GAAG,IAAI,mBAAU,EAAE,CAAC;IAC9B,IAAI,CAAC,YAAY,EAAE,CAAC;IAEpB,qBAAM,CAAC,MAAM,CAAC,GAAG,EAAE;QACjB,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC,EAAE,6CAA6C,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,4CAA4C,EAAE,GAAG,EAAE;IACtD,MAAM,IAAI,GAAG,IAAI,mBAAU,EAAE,CAAC;IAE9B,qBAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,YAAY,EAAE,CAAC;IACpB,qBAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config_helper.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config_helper.test.d.ts","sourceRoot":"","sources":["../../tests/config_helper.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = require("node:test");
7
+ const node_assert_1 = __importDefault(require("node:assert"));
8
+ const Application_1 = require("../src/application/Application");
9
+ const config_1 = require("@arikajs/config");
10
+ (0, node_test_1.test)('config(): returns value from repository', () => {
11
+ const app = new Application_1.Application(__dirname);
12
+ // Manually inject some config for testing
13
+ app.config().config = {
14
+ app: { name: 'Test App' }
15
+ };
16
+ node_assert_1.default.strictEqual((0, config_1.config)('app.name'), 'Test App');
17
+ });
18
+ (0, node_test_1.test)('config(): returns default value if not found', () => {
19
+ new Application_1.Application(__dirname); // Ensure repo is set
20
+ node_assert_1.default.strictEqual((0, config_1.config)('missing', 'default'), 'default');
21
+ });
22
+ (0, node_test_1.test)('Application: make() falls back to config repository', () => {
23
+ const app = new Application_1.Application(__dirname);
24
+ app.config().config = {
25
+ services: {
26
+ api: { key: 'secret' }
27
+ }
28
+ };
29
+ // Should resolve via make() using 'config.' prefix
30
+ node_assert_1.default.strictEqual(app.make('config.services.api.key'), 'secret');
31
+ });
32
+ (0, node_test_1.test)('Application: make() prefers container bindings over config fallback', () => {
33
+ const app = new Application_1.Application(__dirname);
34
+ app.config().config = {
35
+ app: { name: 'From Config' }
36
+ };
37
+ app.instance('config.app.name', 'From Container');
38
+ node_assert_1.default.strictEqual(app.make('config.app.name'), 'From Container');
39
+ });
40
+ (0, node_test_1.test)('Application: make() throws if token not in container and not in config', () => {
41
+ const app = new Application_1.Application(__dirname);
42
+ node_assert_1.default.throws(() => {
43
+ app.make('config.missing.key');
44
+ }, /Container: no binding found for token "config.missing.key"/);
45
+ });
46
+ //# sourceMappingURL=config_helper.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config_helper.test.js","sourceRoot":"","sources":["../../tests/config_helper.test.ts"],"names":[],"mappings":";;;;;AAAA,yCAAiC;AACjC,8DAAiC;AACjC,gEAA6D;AAC7D,4CAAyC;AAEzC,IAAA,gBAAI,EAAC,yCAAyC,EAAE,GAAG,EAAE;IACjD,MAAM,GAAG,GAAG,IAAI,yBAAW,CAAC,SAAS,CAAC,CAAC;IACvC,0CAA0C;IACzC,GAAG,CAAC,MAAM,EAAU,CAAC,MAAM,GAAG;QAC3B,GAAG,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;KAC5B,CAAC;IAEF,qBAAM,CAAC,WAAW,CAAC,IAAA,eAAM,EAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,8CAA8C,EAAE,GAAG,EAAE;IACtD,IAAI,yBAAW,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB;IACjD,qBAAM,CAAC,WAAW,CAAC,IAAA,eAAM,EAAC,SAAS,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,qDAAqD,EAAE,GAAG,EAAE;IAC7D,MAAM,GAAG,GAAG,IAAI,yBAAW,CAAC,SAAS,CAAC,CAAC;IACtC,GAAG,CAAC,MAAM,EAAU,CAAC,MAAM,GAAG;QAC3B,QAAQ,EAAE;YACN,GAAG,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE;SACzB;KACJ,CAAC;IAEF,mDAAmD;IACnD,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,EAAE,QAAQ,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,qEAAqE,EAAE,GAAG,EAAE;IAC7E,MAAM,GAAG,GAAG,IAAI,yBAAW,CAAC,SAAS,CAAC,CAAC;IACtC,GAAG,CAAC,MAAM,EAAU,CAAC,MAAM,GAAG;QAC3B,GAAG,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;KAC/B,CAAC;IAEF,GAAG,CAAC,QAAQ,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IAElD,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,gBAAgB,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,wEAAwE,EAAE,GAAG,EAAE;IAChF,MAAM,GAAG,GAAG,IAAI,yBAAW,CAAC,SAAS,CAAC,CAAC;IAEvC,qBAAM,CAAC,MAAM,CAAC,GAAG,EAAE;QACf,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACnC,CAAC,EAAE,4DAA4D,CAAC,CAAC;AACrE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=container.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.test.d.ts","sourceRoot":"","sources":["../../tests/container.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = require("node:test");
7
+ const node_assert_1 = __importDefault(require("node:assert"));
8
+ const Container_1 = require("../src/container/Container");
9
+ (0, node_test_1.test)('Container: bind and resolve transient service', () => {
10
+ const container = new Container_1.Container();
11
+ let callCount = 0;
12
+ class Logger {
13
+ constructor() {
14
+ callCount++;
15
+ }
16
+ }
17
+ container.bind(Logger, () => new Logger());
18
+ const logger1 = container.resolve(Logger);
19
+ const logger2 = container.resolve(Logger);
20
+ node_assert_1.default.ok(logger1 instanceof Logger);
21
+ node_assert_1.default.ok(logger2 instanceof Logger);
22
+ node_assert_1.default.notStrictEqual(logger1, logger2);
23
+ node_assert_1.default.strictEqual(callCount, 2);
24
+ });
25
+ (0, node_test_1.test)('Container: bind and resolve singleton', () => {
26
+ const container = new Container_1.Container();
27
+ let callCount = 0;
28
+ class Config {
29
+ constructor() {
30
+ callCount++;
31
+ }
32
+ }
33
+ container.singleton(Config, () => new Config());
34
+ const config1 = container.resolve(Config);
35
+ const config2 = container.resolve(Config);
36
+ node_assert_1.default.ok(config1 instanceof Config);
37
+ node_assert_1.default.strictEqual(config1, config2);
38
+ node_assert_1.default.strictEqual(callCount, 1);
39
+ });
40
+ (0, node_test_1.test)('Container: register instance', () => {
41
+ const container = new Container_1.Container();
42
+ const instance = { name: 'test' };
43
+ container.instance('test', instance);
44
+ const resolved = container.resolve('test');
45
+ node_assert_1.default.strictEqual(resolved, instance);
46
+ });
47
+ (0, node_test_1.test)('Container: resolve with string token', () => {
48
+ const container = new Container_1.Container();
49
+ container.instance('app.name', 'My App');
50
+ const name = container.resolve('app.name');
51
+ node_assert_1.default.strictEqual(name, 'My App');
52
+ });
53
+ (0, node_test_1.test)('Container: resolve with symbol token', () => {
54
+ const container = new Container_1.Container();
55
+ const token = Symbol('logger');
56
+ container.instance(token, { log: () => { } });
57
+ const logger = container.resolve(token);
58
+ node_assert_1.default.ok(logger);
59
+ });
60
+ (0, node_test_1.test)('Container: has() checks if token is registered', () => {
61
+ const container = new Container_1.Container();
62
+ node_assert_1.default.strictEqual(container.has('missing'), false);
63
+ container.instance('exists', 'value');
64
+ node_assert_1.default.strictEqual(container.has('exists'), true);
65
+ });
66
+ (0, node_test_1.test)('Container: throws error when resolving unregistered token', () => {
67
+ const container = new Container_1.Container();
68
+ node_assert_1.default.throws(() => {
69
+ container.resolve('not.registered');
70
+ }, /no binding found/);
71
+ });
72
+ (0, node_test_1.test)('Container: factory receives container for dependency resolution', () => {
73
+ const container = new Container_1.Container();
74
+ container.instance('name', 'ArikaJS');
75
+ class Service {
76
+ constructor(name) {
77
+ this.name = name;
78
+ }
79
+ }
80
+ container.bind(Service, (c) => {
81
+ const name = c.resolve('name');
82
+ return new Service(name);
83
+ });
84
+ const service = container.resolve(Service);
85
+ node_assert_1.default.strictEqual(service.name, 'ArikaJS');
86
+ });
87
+ (0, node_test_1.test)('Container: make() and resolve() are aliases', () => {
88
+ const container = new Container_1.Container();
89
+ container.instance('test', 'value');
90
+ const viaMake = container.make('test');
91
+ const viaResolve = container.resolve('test');
92
+ node_assert_1.default.strictEqual(viaMake, viaResolve);
93
+ });
94
+ //# sourceMappingURL=container.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.test.js","sourceRoot":"","sources":["../../tests/container.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=env.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.test.d.ts","sourceRoot":"","sources":["../../tests/env.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const node_test_1 = require("node:test");
40
+ const node_assert_1 = __importDefault(require("node:assert"));
41
+ const path = __importStar(require("path"));
42
+ const fs = __importStar(require("fs"));
43
+ const os = __importStar(require("os"));
44
+ const config_1 = require("@arikajs/config");
45
+ const Application_1 = require("../src/application/Application");
46
+ (0, node_test_1.test)('env(): returns value from process.env', () => {
47
+ process.env.TEST_VAR = 'hello';
48
+ node_assert_1.default.strictEqual((0, config_1.env)('TEST_VAR'), 'hello');
49
+ delete process.env.TEST_VAR;
50
+ });
51
+ (0, node_test_1.test)('env(): returns default value if not set', () => {
52
+ node_assert_1.default.strictEqual((0, config_1.env)('NON_EXISTENT', 'default'), 'default');
53
+ });
54
+ (0, node_test_1.test)('env(): casts boolean strings', () => {
55
+ process.env.TEST_TRUE = 'true';
56
+ process.env.TEST_FALSE = 'false';
57
+ node_assert_1.default.strictEqual((0, config_1.env)('TEST_TRUE'), true);
58
+ node_assert_1.default.strictEqual((0, config_1.env)('TEST_FALSE'), false);
59
+ delete process.env.TEST_TRUE;
60
+ delete process.env.TEST_FALSE;
61
+ });
62
+ (0, node_test_1.test)('env(): casts null and empty strings', () => {
63
+ process.env.TEST_NULL = 'null';
64
+ process.env.TEST_EMPTY = '(empty)';
65
+ node_assert_1.default.strictEqual((0, config_1.env)('TEST_NULL'), null);
66
+ node_assert_1.default.strictEqual((0, config_1.env)('TEST_EMPTY'), '');
67
+ delete process.env.TEST_NULL;
68
+ delete process.env.TEST_EMPTY;
69
+ });
70
+ (0, node_test_1.test)('EnvLoader: loads .env file into process.env', () => {
71
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'arika-env-test-'));
72
+ const envContent = `
73
+ APP_NAME="Arika Test"
74
+ APP_ENV=testing
75
+ # Comment line
76
+ APP_DEBUG=true
77
+ QUOTED_VAL='single-quoted'
78
+ `;
79
+ fs.writeFileSync(path.join(tmpDir, '.env'), envContent);
80
+ config_1.EnvLoader.load(tmpDir);
81
+ node_assert_1.default.strictEqual(process.env.APP_NAME, 'Arika Test');
82
+ node_assert_1.default.strictEqual(process.env.APP_ENV, 'testing');
83
+ node_assert_1.default.strictEqual(process.env.APP_DEBUG, 'true');
84
+ node_assert_1.default.strictEqual(process.env.QUOTED_VAL, 'single-quoted');
85
+ // Cleanup
86
+ delete process.env.APP_NAME;
87
+ delete process.env.APP_ENV;
88
+ delete process.env.APP_DEBUG;
89
+ delete process.env.QUOTED_VAL;
90
+ fs.rmSync(tmpDir, { recursive: true, force: true });
91
+ });
92
+ (0, node_test_1.test)('Application: automatically loads .env from base path', () => {
93
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'arika-app-env-test-'));
94
+ fs.writeFileSync(path.join(tmpDir, '.env'), 'APP_ENV=auto-loaded');
95
+ new Application_1.Application(tmpDir);
96
+ node_assert_1.default.strictEqual((0, config_1.env)('APP_ENV'), 'auto-loaded');
97
+ // Cleanup
98
+ delete process.env.APP_ENV;
99
+ fs.rmSync(tmpDir, { recursive: true, force: true });
100
+ });
101
+ //# sourceMappingURL=env.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.test.js","sourceRoot":"","sources":["../../tests/env.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provider.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.test.d.ts","sourceRoot":"","sources":["../../tests/provider.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = require("node:test");
7
+ const node_assert_1 = __importDefault(require("node:assert"));
8
+ const Application_1 = require("../src/application/Application");
9
+ const ServiceProvider_1 = require("../src/providers/ServiceProvider");
10
+ (0, node_test_1.test)('ServiceProvider: register() is called during boot', async () => {
11
+ const app = new Application_1.Application(__dirname);
12
+ let registered = false;
13
+ class TestProvider extends ServiceProvider_1.ServiceProvider {
14
+ register() {
15
+ registered = true;
16
+ }
17
+ }
18
+ app.register(TestProvider);
19
+ app.config().set('app.key', 'base64:sm957Y1wUYo8Uj8yL1fD7vX+X6y8gG+E6XpXnJz+I=');
20
+ await app.boot();
21
+ node_assert_1.default.strictEqual(registered, true);
22
+ });
23
+ (0, node_test_1.test)('ServiceProvider: boot() is optional', async () => {
24
+ const app = new Application_1.Application(__dirname);
25
+ class TestProvider extends ServiceProvider_1.ServiceProvider {
26
+ register() {
27
+ // No boot() override
28
+ }
29
+ }
30
+ app.register(TestProvider);
31
+ // Should not throw
32
+ app.config().set('app.key', 'base64:sm957Y1wUYo8Uj8yL1fD7vX+X6y8gG+E6XpXnJz+I=');
33
+ await app.boot();
34
+ });
35
+ (0, node_test_1.test)('ServiceProvider: boot() can access other services', async () => {
36
+ const app = new Application_1.Application(__dirname);
37
+ let serviceResolved = false;
38
+ class ServiceProvider1 extends ServiceProvider_1.ServiceProvider {
39
+ register() {
40
+ this.app.instance('service', { name: 'test' });
41
+ }
42
+ }
43
+ class ServiceProvider2 extends ServiceProvider_1.ServiceProvider {
44
+ register() {
45
+ // Register after Provider1
46
+ }
47
+ async boot() {
48
+ const service = this.app.resolve('service');
49
+ serviceResolved = !!service;
50
+ }
51
+ }
52
+ app.register(ServiceProvider1);
53
+ app.register(ServiceProvider2);
54
+ app.config().set('app.key', 'base64:sm957Y1wUYo8Uj8yL1fD7vX+X6y8gG+E6XpXnJz+I=');
55
+ await app.boot();
56
+ node_assert_1.default.strictEqual(serviceResolved, true);
57
+ });
58
+ (0, node_test_1.test)('ServiceProvider: register() can be async', async () => {
59
+ const app = new Application_1.Application(__dirname);
60
+ let registered = false;
61
+ class TestProvider extends ServiceProvider_1.ServiceProvider {
62
+ async register() {
63
+ await new Promise((resolve) => setTimeout(resolve, 10));
64
+ registered = true;
65
+ }
66
+ }
67
+ app.register(TestProvider);
68
+ app.config().set('app.key', 'base64:sm957Y1wUYo8Uj8yL1fD7vX+X6y8gG+E6XpXnJz+I=');
69
+ await app.boot();
70
+ node_assert_1.default.strictEqual(registered, true);
71
+ });
72
+ (0, node_test_1.test)('ServiceProvider: boot() can be async', async () => {
73
+ const app = new Application_1.Application(__dirname);
74
+ let booted = false;
75
+ class TestProvider extends ServiceProvider_1.ServiceProvider {
76
+ register() { }
77
+ async boot() {
78
+ await new Promise((resolve) => setTimeout(resolve, 10));
79
+ booted = true;
80
+ }
81
+ }
82
+ app.register(TestProvider);
83
+ app.config().set('app.key', 'base64:sm957Y1wUYo8Uj8yL1fD7vX+X6y8gG+E6XpXnJz+I=');
84
+ await app.boot();
85
+ node_assert_1.default.strictEqual(booted, true);
86
+ });
87
+ //# sourceMappingURL=provider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.test.js","sourceRoot":"","sources":["../../tests/provider.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=timezone.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timezone.test.d.ts","sourceRoot":"","sources":["../../tests/timezone.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = require("node:test");
7
+ const node_assert_1 = __importDefault(require("node:assert"));
8
+ const Application_1 = require("../src/application/Application");
9
+ (0, node_test_1.test)('Application: applies timezone from config during boot', async (t) => {
10
+ // Save original TZ
11
+ const originalTZ = process.env.TZ;
12
+ // Ensure we start clean for this test
13
+ delete process.env.TZ;
14
+ const app = new Application_1.Application(__dirname);
15
+ app.config().set('app.key', 'base64:sm957Y1wUYo8Uj8yL1fD7vX+X6y8gG+E6XpXnJz+I=');
16
+ app.config().set('app.timezone', 'Asia/Kolkata');
17
+ await app.boot();
18
+ node_assert_1.default.strictEqual(process.env.TZ, 'Asia/Kolkata');
19
+ // Verify Date behavior (optional, but good sanity check)
20
+ // Note: This depends on the system having the timezone data, which most Node environments do
21
+ try {
22
+ const date = new Date('2023-01-01T12:00:00Z');
23
+ // checking the string representation might be flaky across systems if full ICU data isn't present
24
+ // but verifying process.env.TZ is sufficient for the requirement "process.env.TZ = config('app.timezone')"
25
+ node_assert_1.default.ok(process.env.TZ);
26
+ }
27
+ catch (e) {
28
+ // ignore
29
+ }
30
+ // Cleanup
31
+ if (originalTZ) {
32
+ process.env.TZ = originalTZ;
33
+ }
34
+ else {
35
+ delete process.env.TZ;
36
+ }
37
+ });
38
+ (0, node_test_1.test)('Application: does not change TZ if not configured', async () => {
39
+ // Save original TZ
40
+ const originalTZ = process.env.TZ;
41
+ const app = new Application_1.Application(__dirname);
42
+ // No config injected
43
+ app.config().set('app.key', 'base64:sm957Y1wUYo8Uj8yL1fD7vX+X6y8gG+E6XpXnJz+I=');
44
+ await app.boot();
45
+ node_assert_1.default.strictEqual(process.env.TZ, originalTZ); // Should remain unchanged
46
+ });
47
+ //# sourceMappingURL=timezone.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timezone.test.js","sourceRoot":"","sources":["../../tests/timezone.test.ts"],"names":[],"mappings":";;;;;AAAA,yCAAiC;AACjC,8DAAiC;AACjC,gEAA6D;AAE7D,IAAA,gBAAI,EAAC,uDAAuD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACtE,mBAAmB;IACnB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IAElC,sCAAsC;IACtC,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IAEtB,MAAM,GAAG,GAAG,IAAI,yBAAW,CAAC,SAAS,CAAC,CAAC;IAEvC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,mDAAmD,CAAC,CAAC;IACjF,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IAEjD,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAEjB,qBAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IAEnD,yDAAyD;IACzD,6FAA6F;IAC7F,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC9C,kGAAkG;QAClG,2GAA2G;QAC3G,qBAAM,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,SAAS;IACb,CAAC;IAED,UAAU;IACV,IAAI,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,UAAU,CAAC;IAChC,CAAC;SAAM,CAAC;QACJ,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1B,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;IACjE,mBAAmB;IACnB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IAElC,MAAM,GAAG,GAAG,IAAI,yBAAW,CAAC,SAAS,CAAC,CAAC;IACvC,qBAAqB;IAErB,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,mDAAmD,CAAC,CAAC;IACjF,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAEjB,qBAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,0BAA0B;AAC9E,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arikajs/foundation",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "description": "Core application and service container layer for the ArikaJS framework.",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -11,9 +11,10 @@
11
11
  "clean": "rm -rf dist",
12
12
  "prepare": "echo skip",
13
13
  "lint": "eslint src --ext .ts",
14
- "test": "npm run build && npm run build:tests && node scripts/fix-test-imports.js && node --test 'dist/tests/**/*.test.js'",
14
+ "test": "npm run build && npm run build:tests && node --test 'dist/tests/**/*.test.js'",
15
15
  "test:watch": "npm run build && npm run build:tests && node --test --watch 'dist/tests/**/*.test.js'",
16
- "example": "npm run build && node dist/examples/basic.js"
16
+ "example": "npm run build && node dist/examples/basic.js",
17
+ "dev": "tsc -p tsconfig.json --watch"
17
18
  },
18
19
  "files": [
19
20
  "dist"
@@ -32,20 +33,21 @@
32
33
  },
33
34
  "repository": {
34
35
  "type": "git",
35
- "url": "git+https://github.com/arikajs/foundation.git"
36
+ "url": "git+https://github.com/ArikaJs/arikajs.git",
37
+ "directory": "packages/foundation"
36
38
  },
37
39
  "bugs": {
38
- "url": "https://github.com/arikajs/foundation/issues"
40
+ "url": "https://github.com/ArikaJs/arikajs/issues"
39
41
  },
40
- "homepage": "https://github.com/arikajs/foundation#readme",
42
+ "homepage": "https://github.com/ArikaJs/arikajs/tree/main/packages/foundation#readme",
41
43
  "dependencies": {
42
- "dotenv": "^16.4.7"
44
+ "@arikajs/config": "*"
43
45
  },
44
46
  "devDependencies": {
45
- "@arikajs/logging": "^0.0.4",
46
- "@arikajs/http": "^0.0.4",
47
- "@arikajs/database": "^0.0.4",
48
- "@arikajs/cache": "^0.0.4",
47
+ "@arikajs/logging": "*",
48
+ "@arikajs/http": "*",
49
+ "@arikajs/database": "*",
50
+ "@arikajs/cache": "*",
49
51
  "@types/node": "^20.19.31",
50
52
  "typescript": "^5.7.0"
51
53
  },