Init: Create & Init ms Project...
Signed-off-by: MiaoWoo <admin@yumc.pw>
This commit is contained in:
4
packages/container/.gitignore
vendored
Normal file
4
packages/container/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
/node_modules
|
||||
/dist
|
||||
/package-lock.json
|
||||
/yarn.lock
|
22
packages/container/.npmignore
Normal file
22
packages/container/.npmignore
Normal file
@ -0,0 +1,22 @@
|
||||
src
|
||||
test
|
||||
typings
|
||||
bundled
|
||||
build
|
||||
coverage
|
||||
docs
|
||||
wiki
|
||||
gulpfile.js
|
||||
bower.json
|
||||
karma.conf.js
|
||||
tsconfig.json
|
||||
typings.json
|
||||
CONTRIBUTING.md
|
||||
ISSUE_TEMPLATE.md
|
||||
PULL_REQUEST_TEMPLATE.md
|
||||
tslint.json
|
||||
wallaby.js
|
||||
.travis.yml
|
||||
.gitignore
|
||||
.vscode
|
||||
type_definitions
|
32
packages/container/package.json
Normal file
32
packages/container/package.json
Normal file
@ -0,0 +1,32 @@
|
||||
{
|
||||
"name": "@ms/container",
|
||||
"version": "0.0.0",
|
||||
"description": "MiaoScript container package",
|
||||
"keywords": [
|
||||
"miaoscript",
|
||||
"minecraft",
|
||||
"bukkit",
|
||||
"sponge"
|
||||
],
|
||||
"author": "MiaoWoo <admin@yumc.pw>",
|
||||
"homepage": "https://github.com/circlecloud/ms.git",
|
||||
"license": "ISC",
|
||||
"main": "dist/index.js",
|
||||
"publishConfig": {
|
||||
"registry": "https://repo.yumc.pw/repository/npm/"
|
||||
},
|
||||
"scripts": {
|
||||
"clean": "rimraf dist",
|
||||
"watch": "npx tsc --watch",
|
||||
"build": "yarn clean && npx tsc",
|
||||
"test": "echo \"Error: run tests from root\" && exit 1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"reflect-metadata": "^0.1.13",
|
||||
"rimraf": "^3.0.0",
|
||||
"typescript": "^3.6.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"inversify-binding-decorators": "^4.0.0"
|
||||
}
|
||||
}
|
104
packages/container/src/decorators.ts
Normal file
104
packages/container/src/decorators.ts
Normal file
@ -0,0 +1,104 @@
|
||||
import { interfaces, Container } from "inversify";
|
||||
|
||||
let _container: Container;
|
||||
|
||||
const CONTAINER = Symbol.for("@ms/ioc:Container");
|
||||
const INJECTION = Symbol.for("INJECTION");
|
||||
|
||||
function _proxyGetter(
|
||||
proto: any,
|
||||
key: string,
|
||||
resolve: () => any,
|
||||
doCache: boolean
|
||||
) {
|
||||
function getter() {
|
||||
if (doCache && !Reflect.hasMetadata(INJECTION, this, key)) {
|
||||
Reflect.defineMetadata(INJECTION, resolve(), this, key);
|
||||
}
|
||||
if (Reflect.hasMetadata(INJECTION, this, key)) {
|
||||
return Reflect.getMetadata(INJECTION, this, key);
|
||||
} else {
|
||||
return resolve();
|
||||
}
|
||||
}
|
||||
|
||||
function setter(newVal: any) {
|
||||
Reflect.defineMetadata(INJECTION, newVal, this, key);
|
||||
}
|
||||
|
||||
Object.defineProperty(proto, key, {
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
get: getter,
|
||||
set: setter
|
||||
});
|
||||
}
|
||||
|
||||
function initContainer(container: Container) {
|
||||
Reflect.defineMetadata(CONTAINER, container, Reflect);
|
||||
_container = container;
|
||||
}
|
||||
|
||||
function getContainer(): Container {
|
||||
return _container || Reflect.getMetadata(CONTAINER, Reflect)
|
||||
}
|
||||
|
||||
function makePropertyInjectDecorator(doCache: boolean) {
|
||||
return function(serviceIdentifier: interfaces.ServiceIdentifier<any>) {
|
||||
return function(proto: any, key: string): void {
|
||||
let resolve = () => {
|
||||
return getContainer().get(serviceIdentifier);
|
||||
};
|
||||
_proxyGetter(proto, key, resolve, doCache);
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
function makePropertyInjectNamedDecorator(doCache: boolean) {
|
||||
return function(serviceIdentifier: interfaces.ServiceIdentifier<any>, named: string) {
|
||||
return function(proto: any, key: string): void {
|
||||
let resolve = () => {
|
||||
return getContainer().getNamed(serviceIdentifier, named);
|
||||
};
|
||||
_proxyGetter(proto, key, resolve, doCache);
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
function makePropertyInjectTaggedDecorator(doCache: boolean) {
|
||||
return function(serviceIdentifier: interfaces.ServiceIdentifier<any>, key: string, value: any) {
|
||||
return function(proto: any, propertyName: string): void {
|
||||
let resolve = () => {
|
||||
return getContainer().getTagged(serviceIdentifier, key, value);
|
||||
};
|
||||
_proxyGetter(proto, propertyName, resolve, doCache);
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
function makePropertyMultiInjectDecorator(doCache: boolean) {
|
||||
return function(serviceIdentifier: interfaces.ServiceIdentifier<any>) {
|
||||
return function(proto: any, key: string): void {
|
||||
let resolve = () => {
|
||||
return getContainer().getAll(serviceIdentifier);
|
||||
};
|
||||
_proxyGetter(proto, key, resolve, doCache);
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
let doCache = true;
|
||||
|
||||
let lazyInject = makePropertyInjectDecorator(doCache)
|
||||
let lazyInjectNamed = makePropertyInjectNamedDecorator(doCache)
|
||||
let lazyInjectTagged = makePropertyInjectTaggedDecorator(doCache)
|
||||
let lazyMultiInject = makePropertyMultiInjectDecorator(doCache)
|
||||
|
||||
export {
|
||||
initContainer,
|
||||
getContainer,
|
||||
lazyInject,
|
||||
lazyInjectNamed,
|
||||
lazyInjectTagged,
|
||||
lazyMultiInject
|
||||
};
|
23
packages/container/src/index.ts
Normal file
23
packages/container/src/index.ts
Normal file
@ -0,0 +1,23 @@
|
||||
import "reflect-metadata";
|
||||
import { interfaces, Container } from 'inversify';
|
||||
import { fluentProvide } from 'inversify-binding-decorators';
|
||||
|
||||
const provideNamed = (identifier: interfaces.ServiceIdentifier<any>, name: string) => {
|
||||
return fluentProvide(identifier).whenTargetNamed(name).done();
|
||||
};
|
||||
|
||||
const provideSingleton = (identifier: interfaces.ServiceIdentifier<any>) => {
|
||||
return fluentProvide(identifier).inSingletonScope().done();
|
||||
};
|
||||
|
||||
const DefaultContainer = new Container();
|
||||
|
||||
export * from 'inversify'
|
||||
export * from './decorators'
|
||||
export * from 'inversify-binding-decorators'
|
||||
export {
|
||||
fluentProvide,
|
||||
provideNamed,
|
||||
provideSingleton,
|
||||
DefaultContainer
|
||||
};
|
7
packages/container/tsconfig.json
Normal file
7
packages/container/tsconfig.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"extends": "../../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"baseUrl": "src",
|
||||
"outDir": "dist"
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user