@kanjijs/common 1.0.0-alpha.4 → 1.0.0-alpha.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.
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- export * from './types';
2
- export * from './env';
3
- export * from './logger';
4
- export * from './utils/errors';
5
- export * from './utils/helpers';
6
- export * from './utils/decorators';
7
- export * from './utils/exception-filter';
8
- export * from './utils/cacheable';
1
+ export * from './types.js';
2
+ export * from './env.js';
3
+ export * from './logger.js';
4
+ export * from './utils/errors.js';
5
+ export * from './utils/helpers.js';
6
+ export * from './utils/decorators.js';
7
+ export * from './utils/exception-filter.js';
8
+ export * from './utils/cacheable.js';
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
- export * from './types';
2
- export * from './env';
3
- export * from './logger';
4
- export * from './utils/errors';
5
- export * from './utils/helpers';
6
- export * from './utils/decorators';
7
- export * from './utils/exception-filter';
8
- export * from './utils/cacheable';
1
+ export * from './types.js';
2
+ export * from './env.js';
3
+ export * from './logger.js';
4
+ export * from './utils/errors.js';
5
+ export * from './utils/helpers.js';
6
+ export * from './utils/decorators.js';
7
+ export * from './utils/exception-filter.js';
8
+ export * from './utils/cacheable.js';
9
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kanjijs/common",
3
- "version": "1.0.0-alpha.4",
3
+ "version": "1.0.0-alpha.6",
4
4
  "main": "./dist/index.js",
5
5
  "files": [
6
6
  "dist"
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=cacheable.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cacheable.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/cacheable.spec.ts"],"names":[],"mappings":""}
@@ -1,150 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- import { describe, it, expect, beforeEach } from 'bun:test';
11
- import { Cacheable, _cacheStore } from '../utils/cacheable.js';
12
- describe('@Cacheable', () => {
13
- beforeEach(() => {
14
- _cacheStore.clear();
15
- });
16
- it('should cache synchronous method results', () => {
17
- let callCount = 0;
18
- class TestService {
19
- getData(id) {
20
- callCount++;
21
- return `data-${id}`;
22
- }
23
- }
24
- __decorate([
25
- Cacheable({ ttl: 1 }),
26
- __metadata("design:type", Function),
27
- __metadata("design:paramtypes", [Number]),
28
- __metadata("design:returntype", String)
29
- ], TestService.prototype, "getData", null);
30
- const service = new TestService();
31
- // Primera llamada - ejecuta original
32
- expect(service.getData(1)).toBe('data-1');
33
- expect(callCount).toBe(1);
34
- // Segunda llamada - obtiene del cache
35
- expect(service.getData(1)).toBe('data-1');
36
- expect(callCount).toBe(1);
37
- // Llamada con diferente argumento - ejecuta original
38
- expect(service.getData(2)).toBe('data-2');
39
- expect(callCount).toBe(2);
40
- });
41
- it('should preserve "this" context', () => {
42
- class TestService {
43
- prefix = 'prefix';
44
- getData(id) {
45
- return `${this.prefix}-${id}`;
46
- }
47
- }
48
- __decorate([
49
- Cacheable({ ttl: 1 }),
50
- __metadata("design:type", Function),
51
- __metadata("design:paramtypes", [Number]),
52
- __metadata("design:returntype", String)
53
- ], TestService.prototype, "getData", null);
54
- const service = new TestService();
55
- expect(service.getData(1)).toBe('prefix-1');
56
- });
57
- it('should handle async methods and cache resolved values', async () => {
58
- let callCount = 0;
59
- class TestService {
60
- async getData(id) {
61
- callCount++;
62
- return `async-data-${id}`;
63
- }
64
- }
65
- __decorate([
66
- Cacheable({ ttl: 1 }),
67
- __metadata("design:type", Function),
68
- __metadata("design:paramtypes", [Number]),
69
- __metadata("design:returntype", Promise)
70
- ], TestService.prototype, "getData", null);
71
- const service = new TestService();
72
- // Primera llamada - asíncrona
73
- const result1 = await service.getData(1);
74
- expect(result1).toBe('async-data-1');
75
- expect(callCount).toBe(1);
76
- // Segunda llamada - asíncrona, desde cache
77
- const result2 = await service.getData(1);
78
- expect(result2).toBe('async-data-1');
79
- expect(callCount).toBe(1);
80
- });
81
- it('should respect custom cache key generator', () => {
82
- let callCount = 0;
83
- class TestService {
84
- getData(id, _ignored) {
85
- callCount++;
86
- return `val-${id}`;
87
- }
88
- }
89
- __decorate([
90
- Cacheable({
91
- ttl: 1,
92
- // Generar clave custom omitiendo el segundo argumento
93
- key: (id) => `custom-key:${id}`,
94
- }),
95
- __metadata("design:type", Function),
96
- __metadata("design:paramtypes", [Number, String]),
97
- __metadata("design:returntype", String)
98
- ], TestService.prototype, "getData", null);
99
- const service = new TestService();
100
- expect(service.getData(1, 'foo')).toBe('val-1');
101
- expect(callCount).toBe(1);
102
- // Segunda llamada con diferente segundo argumento, pero misma key generada
103
- expect(service.getData(1, 'bar')).toBe('val-1');
104
- expect(callCount).toBe(1);
105
- });
106
- it('should bypass cache if ttl is 0 or less', () => {
107
- let callCount = 0;
108
- class TestService {
109
- getData(id) {
110
- callCount++;
111
- return `data-${id}`;
112
- }
113
- }
114
- __decorate([
115
- Cacheable({ ttl: 0 }),
116
- __metadata("design:type", Function),
117
- __metadata("design:paramtypes", [Number]),
118
- __metadata("design:returntype", String)
119
- ], TestService.prototype, "getData", null);
120
- const service = new TestService();
121
- expect(service.getData(1)).toBe('data-1');
122
- expect(callCount).toBe(1);
123
- expect(service.getData(1)).toBe('data-1');
124
- expect(callCount).toBe(2); // no cacheado
125
- });
126
- it('should expire cache entries after ttl', async () => {
127
- let callCount = 0;
128
- class TestService {
129
- // 50ms TTL para el test
130
- getData(id) {
131
- callCount++;
132
- return `data-${id}`;
133
- }
134
- }
135
- __decorate([
136
- Cacheable({ ttl: 0.05 }),
137
- __metadata("design:type", Function),
138
- __metadata("design:paramtypes", [Number]),
139
- __metadata("design:returntype", String)
140
- ], TestService.prototype, "getData", null);
141
- const service = new TestService();
142
- expect(service.getData(1)).toBe('data-1');
143
- expect(callCount).toBe(1);
144
- // Esperar 100ms
145
- await new Promise((resolve) => setTimeout(resolve, 100));
146
- expect(service.getData(1)).toBe('data-1');
147
- expect(callCount).toBe(2); // expirado y re-ejecutado
148
- });
149
- });
150
- //# sourceMappingURL=cacheable.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cacheable.spec.js","sourceRoot":"","sources":["../../src/__tests__/cacheable.spec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=logger.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/logger.spec.ts"],"names":[],"mappings":""}
@@ -1,29 +0,0 @@
1
- import { describe, it, expect, spyOn, afterEach } from 'bun:test';
2
- import { DefaultConsoleLogger } from '../logger.js';
3
- describe('DefaultConsoleLogger', () => {
4
- let logSpy = spyOn(console, 'log').mockImplementation(() => { });
5
- let warnSpy = spyOn(console, 'warn').mockImplementation(() => { });
6
- let errorSpy = spyOn(console, 'error').mockImplementation(() => { });
7
- afterEach(() => {
8
- logSpy.mockClear();
9
- warnSpy.mockClear();
10
- errorSpy.mockClear();
11
- });
12
- it('should print log messages without throwing', () => {
13
- const logger = new DefaultConsoleLogger();
14
- logger.log('Normal info message');
15
- logger.log('Hono router method GET /users - 200 - +5ms', 'Router');
16
- expect(logSpy).toHaveBeenCalled();
17
- });
18
- it('should print warnings without throwing', () => {
19
- const logger = new DefaultConsoleLogger();
20
- logger.warn('Some warning message', 'Contracts');
21
- expect(warnSpy).toHaveBeenCalled();
22
- });
23
- it('should print errors without throwing', () => {
24
- const logger = new DefaultConsoleLogger();
25
- logger.error('Critical failure message', 'stacktrace-mock-data', 'InstanceLoader');
26
- expect(errorSpy).toHaveBeenCalled();
27
- });
28
- });
29
- //# sourceMappingURL=logger.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.spec.js","sourceRoot":"","sources":["../../src/__tests__/logger.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAI,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAChE,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClE,IAAI,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEpE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,SAAS,EAAE,CAAC;QACnB,OAAO,CAAC,SAAS,EAAE,CAAC;QACpB,QAAQ,CAAC,SAAS,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,MAAM,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,4CAA4C,EAAE,QAAQ,CAAC,CAAC;QAEnE,MAAM,CAAC,MAAM,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,WAAW,CAAC,CAAC;QAEjD,MAAM,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,sBAAsB,EAAE,gBAAgB,CAAC,CAAC;QAEnF,MAAM,CAAC,QAAQ,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}