@lukman-ss/moke-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -0
- package/dist/application.d.ts +5 -0
- package/dist/application.d.ts.map +1 -0
- package/dist/application.js +12 -0
- package/dist/application.js.map +1 -0
- package/dist/container.d.ts +17 -0
- package/dist/container.d.ts.map +1 -0
- package/dist/container.js +91 -0
- package/dist/container.js.map +1 -0
- package/dist/decorators.d.ts +12 -0
- package/dist/decorators.d.ts.map +1 -0
- package/dist/decorators.js +21 -0
- package/dist/decorators.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +5 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +9 -0
- package/dist/logger.js.map +1 -0
- package/dist/providers.d.ts +21 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +2 -0
- package/dist/providers.js.map +1 -0
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# @lukman-ss/moke-core
|
|
2
|
+
|
|
3
|
+
Core module for Moke web framework. Provides IoC Container, Dependency Injection, and Application Bootstrap.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Container**: IoC Container for resolving dependencies.
|
|
8
|
+
- **Decorators**: `@Injectable()` for class registration.
|
|
9
|
+
- **Factory**: `MokeFactory` to bootstrap the application.
|
|
10
|
+
- **Logger**: Standard `MokeLogger`.
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
import { Injectable, MokeFactory, MokeLogger } from '@lukman-ss/moke-core';
|
|
16
|
+
|
|
17
|
+
@Injectable()
|
|
18
|
+
class AppService {
|
|
19
|
+
constructor(private logger: MokeLogger) {}
|
|
20
|
+
|
|
21
|
+
run() {
|
|
22
|
+
this.logger.log('App is running');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@Injectable()
|
|
27
|
+
class AppModule {
|
|
28
|
+
constructor(private appService: AppService) {}
|
|
29
|
+
|
|
30
|
+
start() {
|
|
31
|
+
this.appService.run();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const app = MokeFactory.create(AppModule);
|
|
36
|
+
app.start();
|
|
37
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,qBAAa,WAAW;IACtB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;CAS5C"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Container } from './container.js';
|
|
2
|
+
import { MokeLogger } from './logger.js';
|
|
3
|
+
export class MokeFactory {
|
|
4
|
+
static create(module) {
|
|
5
|
+
const container = new Container();
|
|
6
|
+
// Default providers
|
|
7
|
+
container.instance(MokeLogger, new MokeLogger());
|
|
8
|
+
const app = container.resolve(module);
|
|
9
|
+
return app;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=application.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"application.js","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,OAAO,WAAW;IACtB,MAAM,CAAC,MAAM,CAAI,MAAsB;QACrC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;QAElC,oBAAoB;QACpB,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,UAAU,EAAE,CAAC,CAAC;QAEjD,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACtC,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { Token } from './types.js';
|
|
3
|
+
import { ProviderDefinition, Scope } from './providers.js';
|
|
4
|
+
export declare class Container {
|
|
5
|
+
private registrations;
|
|
6
|
+
bind<T>(token: Token<T>, providerDef: ProviderDefinition<T>, scope?: Scope): void;
|
|
7
|
+
singleton<T>(token: Token<T>, providerDef?: ProviderDefinition<T>): void;
|
|
8
|
+
transient<T>(token: Token<T>, providerDef?: ProviderDefinition<T>): void;
|
|
9
|
+
instance<T>(token: Token<T>, value: T): void;
|
|
10
|
+
factory<T>(token: Token<T>, factory: (container: Container) => T | Promise<T>, scope?: Scope): void;
|
|
11
|
+
has<T>(token: Token<T>): boolean;
|
|
12
|
+
resolve<T>(token: Token<T>): T;
|
|
13
|
+
private resolveProvider;
|
|
14
|
+
private instantiateClass;
|
|
15
|
+
private getTokenKey;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=container.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAe,KAAK,EAAkB,MAAM,YAAY,CAAC;AAChE,OAAO,EAAY,kBAAkB,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AASrE,qBAAa,SAAS;IACpB,OAAO,CAAC,aAAa,CAAwC;IAE7D,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,KAAK,GAAE,KAAmB;IAavF,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAIjE,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAIjE,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;IAQrC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,GAAE,KAAmB;IAIzG,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO;IAIhC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IA0B9B,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,WAAW;CAMpB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { INJECT_METADATA_KEY } from './decorators.js';
|
|
3
|
+
export class Container {
|
|
4
|
+
registrations = new Map();
|
|
5
|
+
bind(token, providerDef, scope = 'singleton') {
|
|
6
|
+
const key = this.getTokenKey(token);
|
|
7
|
+
let provider;
|
|
8
|
+
if (typeof providerDef === 'function') {
|
|
9
|
+
provider = { provide: token, useClass: providerDef };
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
provider = providerDef;
|
|
13
|
+
}
|
|
14
|
+
this.registrations.set(key, { provider, scope });
|
|
15
|
+
}
|
|
16
|
+
singleton(token, providerDef) {
|
|
17
|
+
this.bind(token, providerDef || token, 'singleton');
|
|
18
|
+
}
|
|
19
|
+
transient(token, providerDef) {
|
|
20
|
+
this.bind(token, providerDef || token, 'transient');
|
|
21
|
+
}
|
|
22
|
+
instance(token, value) {
|
|
23
|
+
this.registrations.set(this.getTokenKey(token), {
|
|
24
|
+
provider: { provide: token, useValue: value },
|
|
25
|
+
scope: 'singleton',
|
|
26
|
+
instance: value
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
factory(token, factory, scope = 'singleton') {
|
|
30
|
+
this.bind(token, { provide: token, useFactory: factory }, scope);
|
|
31
|
+
}
|
|
32
|
+
has(token) {
|
|
33
|
+
return this.registrations.has(this.getTokenKey(token));
|
|
34
|
+
}
|
|
35
|
+
resolve(token) {
|
|
36
|
+
const key = this.getTokenKey(token);
|
|
37
|
+
if (!this.registrations.has(key)) {
|
|
38
|
+
if (typeof token === 'function') {
|
|
39
|
+
this.singleton(token);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
throw new Error(`Cannot resolve dependency for token: ${String(key)}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const reg = this.registrations.get(key);
|
|
46
|
+
if (reg.scope === 'singleton' && 'instance' in reg) {
|
|
47
|
+
return reg.instance;
|
|
48
|
+
}
|
|
49
|
+
const instance = this.resolveProvider(reg.provider);
|
|
50
|
+
if (reg.scope === 'singleton') {
|
|
51
|
+
reg.instance = instance;
|
|
52
|
+
}
|
|
53
|
+
return instance;
|
|
54
|
+
}
|
|
55
|
+
resolveProvider(provider) {
|
|
56
|
+
if ('useValue' in provider) {
|
|
57
|
+
return provider.useValue;
|
|
58
|
+
}
|
|
59
|
+
if ('useFactory' in provider) {
|
|
60
|
+
return provider.useFactory(this);
|
|
61
|
+
}
|
|
62
|
+
if ('useExisting' in provider) {
|
|
63
|
+
return this.resolve(provider.useExisting);
|
|
64
|
+
}
|
|
65
|
+
if ('useClass' in provider) {
|
|
66
|
+
return this.instantiateClass(provider.useClass);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
instantiateClass(target) {
|
|
70
|
+
const paramTypes = Reflect.getMetadata('design:paramtypes', target) || [];
|
|
71
|
+
const explicitInjections = Reflect.getOwnMetadata(INJECT_METADATA_KEY, target) || [];
|
|
72
|
+
const injections = paramTypes.map((type, index) => {
|
|
73
|
+
const explicit = explicitInjections.find(e => e.index === index);
|
|
74
|
+
if (explicit) {
|
|
75
|
+
return this.resolve(explicit.token);
|
|
76
|
+
}
|
|
77
|
+
if (!type || type === Object) {
|
|
78
|
+
throw new Error(`Cannot resolve constructor dependency at index ${index} for ${target.name}. Type is unknown or an interface. Use @Inject().`);
|
|
79
|
+
}
|
|
80
|
+
return this.resolve(type);
|
|
81
|
+
});
|
|
82
|
+
return new target(...injections);
|
|
83
|
+
}
|
|
84
|
+
getTokenKey(token) {
|
|
85
|
+
if (typeof token === 'object' && token !== null && 'key' in token) {
|
|
86
|
+
return token.key;
|
|
87
|
+
}
|
|
88
|
+
return token;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { Token } from './types.js';
|
|
3
|
+
export declare const INJECT_METADATA_KEY: unique symbol;
|
|
4
|
+
export declare function Inject(token: Token): ParameterDecorator;
|
|
5
|
+
/**
|
|
6
|
+
* Marks a class as injectable.
|
|
7
|
+
* Currently permissive: Moke Container can resolve classes without this decorator,
|
|
8
|
+
* provided they do not rely on TypeScript emitDecoratorMetadata for constructor arguments.
|
|
9
|
+
* Using @Injectable() forces TypeScript to emit design:paramtypes metadata.
|
|
10
|
+
*/
|
|
11
|
+
export declare function Injectable(): ClassDecorator;
|
|
12
|
+
//# sourceMappingURL=decorators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,eAAO,MAAM,mBAAmB,eAAwB,CAAC;AAOzD,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,kBAAkB,CAMvD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,cAAc,CAI3C"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
export const INJECT_METADATA_KEY = Symbol('moke:inject');
|
|
3
|
+
export function Inject(token) {
|
|
4
|
+
return (target, propertyKey, parameterIndex) => {
|
|
5
|
+
const injections = Reflect.getOwnMetadata(INJECT_METADATA_KEY, target) || [];
|
|
6
|
+
injections.push({ index: parameterIndex, token });
|
|
7
|
+
Reflect.defineMetadata(INJECT_METADATA_KEY, injections, target);
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Marks a class as injectable.
|
|
12
|
+
* Currently permissive: Moke Container can resolve classes without this decorator,
|
|
13
|
+
* provided they do not rely on TypeScript emitDecoratorMetadata for constructor arguments.
|
|
14
|
+
* Using @Injectable() forces TypeScript to emit design:paramtypes metadata.
|
|
15
|
+
*/
|
|
16
|
+
export function Injectable() {
|
|
17
|
+
return (target) => {
|
|
18
|
+
Reflect.defineMetadata('injectable', true, target);
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=decorators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAG1B,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;AAOzD,MAAM,UAAU,MAAM,CAAC,KAAY;IACjC,OAAO,CAAC,MAAc,EAAE,WAAwC,EAAE,cAAsB,EAAE,EAAE;QAC1F,MAAM,UAAU,GAAqB,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/F,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,CAAC,MAAW,EAAE,EAAE;QACrB,OAAO,CAAC,cAAc,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAU;IACrB,GAAG,CAAC,OAAO,EAAE,MAAM;IAInB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;CAGtC"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAU;IACrB,GAAG,CAAC,OAAe;QACjB,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,KAAc;QACnC,OAAO,CAAC,KAAK,CAAC,gBAAgB,OAAO,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Constructor, Token } from './types.js';
|
|
2
|
+
import { Container } from './container.js';
|
|
3
|
+
export type Scope = 'singleton' | 'transient';
|
|
4
|
+
export interface ProviderBase<T = any> {
|
|
5
|
+
provide: Token<T>;
|
|
6
|
+
}
|
|
7
|
+
export interface ClassProvider<T = any> extends ProviderBase<T> {
|
|
8
|
+
useClass: Constructor<T>;
|
|
9
|
+
}
|
|
10
|
+
export interface ValueProvider<T = any> extends ProviderBase<T> {
|
|
11
|
+
useValue: T;
|
|
12
|
+
}
|
|
13
|
+
export interface FactoryProvider<T = any> extends ProviderBase<T> {
|
|
14
|
+
useFactory: (container: Container) => T | Promise<T>;
|
|
15
|
+
}
|
|
16
|
+
export interface ExistingProvider<T = any> extends ProviderBase<T> {
|
|
17
|
+
useExisting: Token<T>;
|
|
18
|
+
}
|
|
19
|
+
export type Provider<T = any> = ClassProvider<T> | ValueProvider<T> | FactoryProvider<T> | ExistingProvider<T>;
|
|
20
|
+
export type ProviderDefinition<T = any> = Provider<T> | Constructor<T>;
|
|
21
|
+
//# sourceMappingURL=providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,MAAM,KAAK,GAAG,WAAW,GAAG,WAAW,CAAC;AAE9C,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,GAAG;IACnC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;CACnB;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IAC7D,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IAC7D,QAAQ,EAAE,CAAC,CAAC;CACb;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IAC/D,UAAU,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IAChE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;CACvB;AAED,MAAM,MAAM,QAAQ,CAAC,CAAC,GAAG,GAAG,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAE/G,MAAM,MAAM,kBAAkB,CAAC,CAAC,GAAG,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":""}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type Constructor<T = unknown> = new (...args: any[]) => T;
|
|
2
|
+
export interface InjectionToken<T> {
|
|
3
|
+
readonly key: symbol;
|
|
4
|
+
readonly description?: string;
|
|
5
|
+
readonly __type_brand?: T;
|
|
6
|
+
}
|
|
7
|
+
export type Token<T = unknown> = Constructor<T> | string | symbol | InjectionToken<T>;
|
|
8
|
+
export declare function createToken<T>(description?: string): InjectionToken<T>;
|
|
9
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,OAAO,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAEjE,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;CAC3B;AAED,MAAM,MAAM,KAAK,CAAC,CAAC,GAAG,OAAO,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;AAEtF,wBAAgB,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAKtE"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,WAAW,CAAI,WAAoB;IACjD,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,WAAW,CAAC;QACxB,WAAW;KACS,CAAC;AACzB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lukman-ss/moke-core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Core module for Moke web framework. Provides IoC Container, Dependency Injection, and Application Bootstrap.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=18.0.0"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "npm run clean && tsc",
|
|
22
|
+
"clean": "node -e \"fs.rmSync('dist', {recursive:true, force:true})\"",
|
|
23
|
+
"test": "cross-env TS_NODE_PROJECT=tsconfig.test.json mocha --loader=ts-node/esm \"test/**/*.test.ts\"",
|
|
24
|
+
"test:watch": "cross-env TS_NODE_PROJECT=tsconfig.test.json mocha --loader=ts-node/esm --watch \"test/**/*.test.ts\"",
|
|
25
|
+
"typecheck": "tsc --noEmit",
|
|
26
|
+
"prepublishOnly": "npm run build"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"reflect-metadata": "^0.1.13"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/chai": "^5.2.3",
|
|
33
|
+
"@types/mocha": "^10.0.10",
|
|
34
|
+
"chai": "^6.2.2",
|
|
35
|
+
"cross-env": "^10.1.0",
|
|
36
|
+
"mocha": "^11.8.0",
|
|
37
|
+
"ts-node": "^10.9.2",
|
|
38
|
+
"typescript": "^5.2.2"
|
|
39
|
+
}
|
|
40
|
+
}
|