feat: optimze plugin system
This commit is contained in:
		
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,8 +1,9 @@
 | 
			
		||||
.rollup.cache
 | 
			
		||||
.yarn*
 | 
			
		||||
.vscode
 | 
			
		||||
.theia
 | 
			
		||||
node_modules
 | 
			
		||||
dist
 | 
			
		||||
package-lock.json
 | 
			
		||||
yarn.lock
 | 
			
		||||
packages/nashorn/docs
 | 
			
		||||
!packages/types/dist
 | 
			
		||||
 
 | 
			
		||||
@@ -23,3 +23,4 @@ wallaby.js
 | 
			
		||||
type_definitions
 | 
			
		||||
tsconfig.tsbuildinfo
 | 
			
		||||
*.tsbuildinfo
 | 
			
		||||
.rollup.cache
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								lerna.json
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								lerna.json
									
									
									
									
									
								
							@@ -1,16 +1,15 @@
 | 
			
		||||
{
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "useWorkspaces": true,
 | 
			
		||||
    "npmClient": "yarn",
 | 
			
		||||
    "packages": [
 | 
			
		||||
        "packages/*"
 | 
			
		||||
    ],
 | 
			
		||||
    "command": {
 | 
			
		||||
        "run": {
 | 
			
		||||
            "stream": true
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
  "version": "0.27.3",
 | 
			
		||||
  "npmClient": "yarn",
 | 
			
		||||
  "packages": [
 | 
			
		||||
    "packages/*"
 | 
			
		||||
  ],
 | 
			
		||||
  "command": {
 | 
			
		||||
    "run": {
 | 
			
		||||
      "stream": true
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "publishConfig": {
 | 
			
		||||
    "access": "public"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -10,18 +10,19 @@
 | 
			
		||||
        "clean": "lerna run clean",
 | 
			
		||||
        "watch": "lerna run watch --parallel",
 | 
			
		||||
        "build": "lerna run build",
 | 
			
		||||
        "ug": "yarn upgrade-interactive --latest",
 | 
			
		||||
        "ug": "yarn upgrade-interactive",
 | 
			
		||||
        "np": "./script/push.sh",
 | 
			
		||||
        "lsp": "npm login -scope=@ccms",
 | 
			
		||||
        "lp": "lerna publish --verify-access --force-publish",
 | 
			
		||||
        "lpb": "lerna publish --preid beta --dist-tag beta --verify-access --force-publish",
 | 
			
		||||
        "lpc": "lerna publish --canary --preid beta --pre-dist-tag beta --verify-access --force-publish",
 | 
			
		||||
        "lpf": "lerna publish from-package --yes"
 | 
			
		||||
        "lpf": "lerna publish from-package --yes",
 | 
			
		||||
        "sync": "./script/sync.sh"
 | 
			
		||||
    },
 | 
			
		||||
    "workspaces": [
 | 
			
		||||
        "packages/*"
 | 
			
		||||
    ],
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "lerna": "^6.4.1"
 | 
			
		||||
        "lerna": "^7.1.4"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/amqp",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript amqp package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
@@ -19,12 +19,12 @@
 | 
			
		||||
        "test": "echo \"Error: run tests from root\" && exit 1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@ccms/api": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/common": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/container": "^0.27.3-beta.0"
 | 
			
		||||
        "@ccms/api": "^0.27.3",
 | 
			
		||||
        "@ccms/common": "^0.27.3",
 | 
			
		||||
        "@ccms/container": "^0.27.3"
 | 
			
		||||
    },
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@ccms/nashorn": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/nashorn": "^0.27.3",
 | 
			
		||||
        "@javatypes/amqp-client": "^0.0.3",
 | 
			
		||||
        "@javatypes/spring-amqp": "^0.0.3",
 | 
			
		||||
        "@javatypes/spring-rabbit": "^0.0.3",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/api",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript api package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
@@ -19,9 +19,9 @@
 | 
			
		||||
        "test": "echo \"Error: run tests from root\" && exit 1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@ccms/common": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/container": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/polyfill": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/common": "^0.27.3",
 | 
			
		||||
        "@ccms/container": "^0.27.3",
 | 
			
		||||
        "@ccms/polyfill": "^0.27.3",
 | 
			
		||||
        "base64-js": "^1.5.1",
 | 
			
		||||
        "source-map-builder": "^0.0.7"
 | 
			
		||||
    },
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ export namespace event {
 | 
			
		||||
        public EventPriority = EventPriority;
 | 
			
		||||
 | 
			
		||||
        private mapEvent = [];
 | 
			
		||||
        private listenerMap = [];
 | 
			
		||||
        private pluginEventMap = [];
 | 
			
		||||
        private cacheSlowEventKey = {};
 | 
			
		||||
 | 
			
		||||
        protected baseEventDir = '';
 | 
			
		||||
@@ -140,16 +140,15 @@ export namespace event {
 | 
			
		||||
            // @ts-ignore
 | 
			
		||||
            let executor = exec.name || exec.executor || '[anonymous]'
 | 
			
		||||
            // noinspection JSUnusedGlobalSymbols
 | 
			
		||||
            var listener = this.register(
 | 
			
		||||
            let listener = this.register(
 | 
			
		||||
                eventCls,
 | 
			
		||||
                this.createExecute(name, exec, eventCls),
 | 
			
		||||
                priority,
 | 
			
		||||
                ignoreCancel
 | 
			
		||||
            )
 | 
			
		||||
            var listenerMap = this.listenerMap
 | 
			
		||||
            // add to cache Be used for close plugin to close event
 | 
			
		||||
            if (!listenerMap[name]) listenerMap[name] = []
 | 
			
		||||
            var off = () => {
 | 
			
		||||
            if (!this.pluginEventMap[name]) this.pluginEventMap[name] = []
 | 
			
		||||
            let off = () => {
 | 
			
		||||
                if (off['offed']) return
 | 
			
		||||
                off['offed'] = true
 | 
			
		||||
                this.unregister(eventCls, listener)
 | 
			
		||||
@@ -159,7 +158,7 @@ export namespace event {
 | 
			
		||||
                    exec: executor
 | 
			
		||||
                }))
 | 
			
		||||
            }
 | 
			
		||||
            listenerMap[name].push(off)
 | 
			
		||||
            this.pluginEventMap[name].push(off)
 | 
			
		||||
            // noinspection JSUnresolvedVariable
 | 
			
		||||
            console.debug(i18n.translate("ms.api.event.register", {
 | 
			
		||||
                name,
 | 
			
		||||
@@ -176,10 +175,10 @@ export namespace event {
 | 
			
		||||
         * @param plugin 插件
 | 
			
		||||
         */
 | 
			
		||||
        disable(plugin: any) {
 | 
			
		||||
            var eventCache = this.listenerMap[plugin.description.name]
 | 
			
		||||
            var eventCache = this.pluginEventMap[plugin.description.name]
 | 
			
		||||
            if (eventCache) {
 | 
			
		||||
                eventCache.forEach((off: () => any) => off())
 | 
			
		||||
                delete this.listenerMap[plugin.description.name]
 | 
			
		||||
                delete this.pluginEventMap[plugin.description.name]
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,12 @@ const UUID = Java.type('java.util.UUID')
 | 
			
		||||
const Math = Java.type('java.lang.Math')
 | 
			
		||||
 | 
			
		||||
export namespace particle {
 | 
			
		||||
    @injectable()
 | 
			
		||||
    export abstract class ParticleSpawner {
 | 
			
		||||
        abstract spawn(location: any, particle: Particle)
 | 
			
		||||
        abstract spawnToPlayer(player: any, location: any, particle: Particle)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 表示一个特效对象
 | 
			
		||||
     *
 | 
			
		||||
@@ -498,10 +504,4 @@ export namespace particle {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @injectable()
 | 
			
		||||
    export abstract class ParticleSpawner {
 | 
			
		||||
        abstract spawn(location: any, particle: Particle)
 | 
			
		||||
        abstract spawnToPlayer(player: any, location: any, particle: Particle)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								packages/api/src/service.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								packages/api/src/service.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
export namespace service {
 | 
			
		||||
    export class ServiceManager {
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,6 +1,8 @@
 | 
			
		||||
import { plugin } from './index'
 | 
			
		||||
import { EventEmitter } from 'events'
 | 
			
		||||
import { injectable } from '@ccms/container'
 | 
			
		||||
 | 
			
		||||
import { plugin } from './index'
 | 
			
		||||
 | 
			
		||||
const AtomicInteger = Java.type("java.util.concurrent.atomic.AtomicInteger")
 | 
			
		||||
 | 
			
		||||
export namespace task {
 | 
			
		||||
@@ -79,7 +81,7 @@ export namespace task {
 | 
			
		||||
    /**
 | 
			
		||||
     * 任务抽象
 | 
			
		||||
     */
 | 
			
		||||
    export abstract class Task implements Cancelable {
 | 
			
		||||
    export abstract class Task extends EventEmitter implements Cancelable {
 | 
			
		||||
        protected func: Function
 | 
			
		||||
        protected isAsync: boolean = false;
 | 
			
		||||
        protected laterTime: number = 0;
 | 
			
		||||
@@ -88,7 +90,10 @@ export namespace task {
 | 
			
		||||
        protected taskId: number
 | 
			
		||||
        protected innerTask: any
 | 
			
		||||
 | 
			
		||||
        private cancelled: boolean = false
 | 
			
		||||
 | 
			
		||||
        constructor(owner: plugin.Plugin, func: Function, id: number) {
 | 
			
		||||
            super()
 | 
			
		||||
            this.owner = owner
 | 
			
		||||
            this.func = func
 | 
			
		||||
            this.taskId = id
 | 
			
		||||
@@ -134,20 +139,35 @@ export namespace task {
 | 
			
		||||
         */
 | 
			
		||||
        cancel(): boolean {
 | 
			
		||||
            let result = this.cancel0()
 | 
			
		||||
            process.emit('task.finish', this)
 | 
			
		||||
            this.finish()
 | 
			
		||||
            this.cancelled = true
 | 
			
		||||
            return result
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected run(...args: any[]): void {
 | 
			
		||||
            try {
 | 
			
		||||
                this.emit('before', this)
 | 
			
		||||
                if (this.cancelled) { return }
 | 
			
		||||
                this.func(...args)
 | 
			
		||||
                !this.interval && process.emit('task.finish', this)
 | 
			
		||||
            } catch (ex: any) {
 | 
			
		||||
                console.console('§4插件执行任务时发生错误', ex)
 | 
			
		||||
                console.ex(ex)
 | 
			
		||||
                this.emit('after', this)
 | 
			
		||||
            } catch (error: any) {
 | 
			
		||||
                this.emit('error', error)
 | 
			
		||||
                if (!error.processed) {
 | 
			
		||||
                    console.console('§4插件执行任务时发生错误', error)
 | 
			
		||||
                    console.ex(error)
 | 
			
		||||
                    this.cancel()
 | 
			
		||||
                }
 | 
			
		||||
            } finally {
 | 
			
		||||
                this.emit('finally', this)
 | 
			
		||||
                if (!this.interval && !this.cancelled) { this.finish() }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected finish() {
 | 
			
		||||
            process.emit('task.finish', this)
 | 
			
		||||
            this.emit('finish', this)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * 提交任务
 | 
			
		||||
         * @param args 任务参数
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/bukkit",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript bukkit package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
@@ -25,8 +25,8 @@
 | 
			
		||||
        "typescript": "^4.9.5"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@ccms/api": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/common": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/container": "^0.27.3-beta.0"
 | 
			
		||||
        "@ccms/api": "^0.27.3",
 | 
			
		||||
        "@ccms/common": "^0.27.3",
 | 
			
		||||
        "@ccms/container": "^0.27.3"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/bungee",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript bungee package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
@@ -25,8 +25,8 @@
 | 
			
		||||
        "typescript": "^4.9.5"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@ccms/api": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/common": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/container": "^0.27.3-beta.0"
 | 
			
		||||
        "@ccms/api": "^0.27.3",
 | 
			
		||||
        "@ccms/common": "^0.27.3",
 | 
			
		||||
        "@ccms/container": "^0.27.3"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/common",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript common package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
@@ -19,7 +19,7 @@
 | 
			
		||||
        "test": "echo \"Error: run tests from root\" && exit 1"
 | 
			
		||||
    },
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@ccms/nashorn": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/nashorn": "^0.27.3",
 | 
			
		||||
        "@javatypes/jdk": "^0.0.3",
 | 
			
		||||
        "reflect-metadata": "^0.1.13",
 | 
			
		||||
        "rimraf": "^4.1.2",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/compile",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript compile package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/container",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript container package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
@@ -19,7 +19,7 @@
 | 
			
		||||
        "test": "echo \"Error: run tests from root\" && exit 1"
 | 
			
		||||
    },
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@ccms/nashorn": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/nashorn": "^0.27.3",
 | 
			
		||||
        "reflect-metadata": "^0.1.13",
 | 
			
		||||
        "rimraf": "^4.1.2",
 | 
			
		||||
        "typescript": "^4.9.5"
 | 
			
		||||
 
 | 
			
		||||
@@ -154,8 +154,9 @@ export const reduceMetadata = (ctx: interfaces.Context): any => {
 | 
			
		||||
function initAutowired(container: Container) {
 | 
			
		||||
    container.bind(ioc.Autowired).toDynamicValue((ctx) => {
 | 
			
		||||
        var metadata: any = reduceMetadata(ctx)
 | 
			
		||||
        let key = Object.toString.call(metadata.named)
 | 
			
		||||
        let key = Object.prototype.toString.call(metadata.named)
 | 
			
		||||
        if (key === "[object Function]" || key === "[object Symbol]") { return container.get(metadata.named) }
 | 
			
		||||
        console.warn('container autowired', metadata.named, 'failed. Error: illegal serviceIdentifier type', key)
 | 
			
		||||
        return undefined
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/core",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript core package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
@@ -24,8 +24,8 @@
 | 
			
		||||
        "typescript": "^4.9.5"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@ccms/api": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/container": "^0.27.3-beta.0"
 | 
			
		||||
        "@ccms/api": "^0.27.3",
 | 
			
		||||
        "@ccms/container": "^0.27.3"
 | 
			
		||||
    },
 | 
			
		||||
    "gitHead": "781524f83e52cad26d7c480513e3c525df867121"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/database",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript database package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
@@ -25,7 +25,7 @@
 | 
			
		||||
        "typescript": "^4.9.5"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@ccms/api": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/container": "^0.27.3-beta.0"
 | 
			
		||||
        "@ccms/api": "^0.27.3",
 | 
			
		||||
        "@ccms/container": "^0.27.3"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/i18n",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript i18n package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
@@ -19,7 +19,7 @@
 | 
			
		||||
        "test": "echo \"Error: run tests from root\" && exit 1"
 | 
			
		||||
    },
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@ccms/nashorn": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/nashorn": "^0.27.3",
 | 
			
		||||
        "@types/js-yaml": "^4.0.5",
 | 
			
		||||
        "reflect-metadata": "^0.1.13",
 | 
			
		||||
        "rimraf": "^4.1.2",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/keyvalue",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript keyvalue package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
@@ -19,12 +19,12 @@
 | 
			
		||||
        "test": "echo \"Error: run tests from root\" && exit 1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@ccms/api": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/common": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/container": "^0.27.3-beta.0"
 | 
			
		||||
        "@ccms/api": "^0.27.3",
 | 
			
		||||
        "@ccms/common": "^0.27.3",
 | 
			
		||||
        "@ccms/container": "^0.27.3"
 | 
			
		||||
    },
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@ccms/nashorn": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/nashorn": "^0.27.3",
 | 
			
		||||
        "@javatypes/amqp-client": "^0.0.3",
 | 
			
		||||
        "@javatypes/spring-amqp": "^0.0.3",
 | 
			
		||||
        "@javatypes/spring-rabbit": "^0.0.3",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/molang",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "A fast parser for Minecraft's MoLang",
 | 
			
		||||
    "main": "dist/index.js",
 | 
			
		||||
    "types": "dist/index.d.ts",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/nashorn",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript nashorn package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/nodejs",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript nodejs package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
@@ -19,7 +19,7 @@
 | 
			
		||||
        "test": "echo \"Error: run tests from root\" && exit 1"
 | 
			
		||||
    },
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@ccms/nashorn": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/nashorn": "^0.27.3",
 | 
			
		||||
        "reflect-metadata": "^0.1.13",
 | 
			
		||||
        "rimraf": "^4.1.2",
 | 
			
		||||
        "tslib": "^2.5.0",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/nukkit",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript nukkit package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
@@ -25,8 +25,8 @@
 | 
			
		||||
        "typescript": "^4.9.5"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@ccms/api": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/common": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/container": "^0.27.3-beta.0"
 | 
			
		||||
        "@ccms/api": "^0.27.3",
 | 
			
		||||
        "@ccms/common": "^0.27.3",
 | 
			
		||||
        "@ccms/container": "^0.27.3"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/plugin",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript plugin package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
@@ -26,10 +26,10 @@
 | 
			
		||||
        "typescript": "^4.9.5"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@ccms/api": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/common": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/container": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/i18n": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/api": "^0.27.3",
 | 
			
		||||
        "@ccms/common": "^0.27.3",
 | 
			
		||||
        "@ccms/container": "^0.27.3",
 | 
			
		||||
        "@ccms/i18n": "^0.27.3",
 | 
			
		||||
        "@ccms/verify": "^0.25.1",
 | 
			
		||||
        "crypto-js": "^4.1.1",
 | 
			
		||||
        "js-yaml": "^4.1.0"
 | 
			
		||||
 
 | 
			
		||||
@@ -15,51 +15,51 @@ export class PluginCommandManager {
 | 
			
		||||
        process.on('plugin.after.disable', this.unregistryCommand.bind(this))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private registryCommand(pluginInstance: plugin.Plugin) {
 | 
			
		||||
        let cmds = getPluginCommandMetadata(pluginInstance)
 | 
			
		||||
        let tabs = getPluginTabCompleterMetadata(pluginInstance)
 | 
			
		||||
    public registryCommand(pluginInstance: plugin.Plugin, executor: any = pluginInstance) {
 | 
			
		||||
        let cmds = getPluginCommandMetadata(executor)
 | 
			
		||||
        let tabs = getPluginTabCompleterMetadata(executor)
 | 
			
		||||
        for (const cmd of cmds) {
 | 
			
		||||
            if (!this.ServerChecker.check(cmd.servers)) {
 | 
			
		||||
                console.debug(`[${pluginInstance.description.name}] ${cmd.target.constructor.name} incompatible command ${cmd.name} server(${cmd.servers}) ignore.`)
 | 
			
		||||
                continue
 | 
			
		||||
            }
 | 
			
		||||
            for (let command of [cmd.name, ...cmd.alias]) {
 | 
			
		||||
                let [cmdExecutor, cmdCompleter] = this.generateAutoMainCommand(pluginInstance, cmd, tabs.get(command))
 | 
			
		||||
                let [cmdExecutor, cmdCompleter] = this.generateAutoMainCommand(pluginInstance, executor, cmd, tabs.get(command))
 | 
			
		||||
                this.CommandManager.on(pluginInstance, command, {
 | 
			
		||||
                    cmd: cmdExecutor.bind(pluginInstance),
 | 
			
		||||
                    tab: cmdCompleter?.bind(pluginInstance)
 | 
			
		||||
                    cmd: cmdExecutor.bind(executor),
 | 
			
		||||
                    tab: cmdCompleter?.bind(executor)
 | 
			
		||||
                })
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private unregistryCommand(pluginInstance: plugin.Plugin) {
 | 
			
		||||
        let cmds = getPluginCommandMetadata(pluginInstance)
 | 
			
		||||
    public unregistryCommand(pluginInstance: plugin.Plugin, executor: any = pluginInstance) {
 | 
			
		||||
        let cmds = getPluginCommandMetadata(executor)
 | 
			
		||||
        for (const cmd of cmds) {
 | 
			
		||||
            if (!this.ServerChecker.check(cmd.servers)) {
 | 
			
		||||
                console.debug(`[${pluginInstance.description.name}] ${cmd.target.constructor.name} incompatible command ${cmd.name} server(${cmd.servers}) ignore.`)
 | 
			
		||||
                continue
 | 
			
		||||
            }
 | 
			
		||||
            for (let command of [cmd.name, ...cmd.alias]) {
 | 
			
		||||
                this.CommandManager.off(pluginInstance, command)
 | 
			
		||||
                this.CommandManager.off(executor, command)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private generateAutoMainCommand(pluginInstance: plugin.Plugin, cmd: interfaces.CommandMetadata, tab: interfaces.CommandMetadata) {
 | 
			
		||||
        let cmdExecutor = pluginInstance[cmd.executor]
 | 
			
		||||
        let cmdCompleter = tab ? pluginInstance[tab.executor] : undefined
 | 
			
		||||
        let cmdSubCache = Object.keys(pluginInstance.constructor.prototype).filter(s => s.startsWith('cmd')).map(s => s.substring(3))
 | 
			
		||||
    private generateAutoMainCommand(pluginInstance: plugin.Plugin, executor: any, cmd: interfaces.CommandMetadata, tab: interfaces.CommandMetadata) {
 | 
			
		||||
        let cmdExecutor = executor[cmd.executor]
 | 
			
		||||
        let cmdCompleter = tab ? executor[tab.executor] : undefined
 | 
			
		||||
        let cmdSubCache = Object.keys(executor.constructor.prototype).filter(s => s.startsWith('cmd')).map(s => s.substring(3))
 | 
			
		||||
        if (cmd.autoMain) {
 | 
			
		||||
            cmdExecutor = (sender: any, command: string, args: string[]) => {
 | 
			
		||||
                let subcommand = args[0]
 | 
			
		||||
                let cmdKey = 'cmd' + subcommand
 | 
			
		||||
                if (!cmdSubCache.includes(subcommand)) {
 | 
			
		||||
                    if (!pluginInstance[cmd.executor].apply(pluginInstance, [sender, command, args])) {
 | 
			
		||||
                    if (!executor[cmd.executor].apply(executor, [sender, command, args])) {
 | 
			
		||||
                        subcommand && pluginInstance.logger.sender(sender, `§4未知的命令: §b/${command} §c${subcommand}`)
 | 
			
		||||
                        pluginInstance.logger.sender(
 | 
			
		||||
                            sender,
 | 
			
		||||
                            pluginInstance['cmdhelp'] ?
 | 
			
		||||
                            executor['cmdhelp'] ?
 | 
			
		||||
                                `§6请执行 §b/${command} §ahelp §6查看帮助!` :
 | 
			
		||||
                                [
 | 
			
		||||
                                    `§6插件: §b${pluginInstance.description.name}`,
 | 
			
		||||
@@ -69,7 +69,7 @@ export class PluginCommandManager {
 | 
			
		||||
                    }
 | 
			
		||||
                    return
 | 
			
		||||
                }
 | 
			
		||||
                let subcommandexec = pluginInstance[cmdKey]
 | 
			
		||||
                let subcommandexec = executor[cmdKey]
 | 
			
		||||
                let permission: string
 | 
			
		||||
                if (cmd.permission && sender.hasPermission) {
 | 
			
		||||
                    if (typeof cmd.permission == "string") {
 | 
			
		||||
@@ -82,7 +82,7 @@ export class PluginCommandManager {
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                args.shift()
 | 
			
		||||
                return subcommandexec.apply(pluginInstance, [sender, ...args])
 | 
			
		||||
                return subcommandexec.apply(executor, [sender, ...args])
 | 
			
		||||
            }
 | 
			
		||||
            let originCompleter = cmdCompleter
 | 
			
		||||
            cmdCompleter = (sender: any, command: string, args: string[]) => {
 | 
			
		||||
@@ -95,7 +95,7 @@ export class PluginCommandManager {
 | 
			
		||||
                    }
 | 
			
		||||
                    if (!sender.hasPermission(permission)) { return [] }
 | 
			
		||||
                }
 | 
			
		||||
                return (args.length == 1 ? cmdSubCache : []).concat(originCompleter?.apply(pluginInstance, [sender, command, args]) || [])
 | 
			
		||||
                return (args.length == 1 ? cmdSubCache : []).concat(originCompleter?.apply(executor, [sender, command, args]) || [])
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (!cmdCompleter) { console.debug(`[${pluginInstance.description.name}] command ${cmd.name} is not registry tabCompleter`) }
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,8 @@ export class PluginEventManager {
 | 
			
		||||
    @Autowired()
 | 
			
		||||
    private nativePluginChecker: server.NativePluginChecker
 | 
			
		||||
 | 
			
		||||
    private listenerMap = [];
 | 
			
		||||
 | 
			
		||||
    constructor() {
 | 
			
		||||
        process.on('plugin.before.enable', this.registryListener.bind(this))
 | 
			
		||||
        process.on('plugin.after.disable', this.unregistryListener.bind(this))
 | 
			
		||||
@@ -20,8 +22,9 @@ export class PluginEventManager {
 | 
			
		||||
        return this.eventManager.mapEventName().toFixed(0)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private registryListener(pluginInstance: plugin.Plugin) {
 | 
			
		||||
        let events = getPluginListenerMetadata(pluginInstance)
 | 
			
		||||
    public registryListener(pluginInstance: plugin.Plugin, listener: any = pluginInstance) {
 | 
			
		||||
        let events = getPluginListenerMetadata(listener)
 | 
			
		||||
        let execes = []
 | 
			
		||||
        for (const event of events) {
 | 
			
		||||
            // ignore space listener
 | 
			
		||||
            if (!this.serverChecker.check(event.servers)) {
 | 
			
		||||
@@ -35,13 +38,25 @@ export class PluginEventManager {
 | 
			
		||||
            }
 | 
			
		||||
            // here must bind this to pluginInstance
 | 
			
		||||
            let exec = event.target[event.executor]
 | 
			
		||||
            let execBinded = exec.bind(pluginInstance)
 | 
			
		||||
            let execBinded = exec.bind(listener)
 | 
			
		||||
            execBinded.executor = event.executor
 | 
			
		||||
            exec.off = this.eventManager.listen(pluginInstance, event.name, execBinded, event.priority, event.ignoreCancel)
 | 
			
		||||
            execes.push(exec)
 | 
			
		||||
        }
 | 
			
		||||
        let off = () => {
 | 
			
		||||
            if (off['offed']) return
 | 
			
		||||
            off['offed'] = true
 | 
			
		||||
            execes.forEach((off: () => any) => off())
 | 
			
		||||
        }
 | 
			
		||||
        listener.off = off
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private unregistryListener(pluginInstance: plugin.Plugin) {
 | 
			
		||||
        this.eventManager.disable(pluginInstance)
 | 
			
		||||
    private unregistryListener(pluginInstance: plugin.Plugin, listener: any = pluginInstance) {
 | 
			
		||||
        if (listener && listener.off) {
 | 
			
		||||
            listener.off()
 | 
			
		||||
        }
 | 
			
		||||
        if (pluginInstance) {
 | 
			
		||||
            this.eventManager.disable(pluginInstance)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,9 @@ export * from './manager'
 | 
			
		||||
export * from './decorators'
 | 
			
		||||
export * from './interfaces'
 | 
			
		||||
 | 
			
		||||
export * from './event'
 | 
			
		||||
export * from './command'
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
    plugin as JSPlugin,
 | 
			
		||||
    cmd as Cmd,
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@ export namespace interfaces {
 | 
			
		||||
    @injectable()
 | 
			
		||||
    export abstract class Plugin implements plugin.Plugin {
 | 
			
		||||
        public description: plugin.PluginMetadata
 | 
			
		||||
        public logger: Console
 | 
			
		||||
        public logger: MiaoScriptConsole
 | 
			
		||||
        @inject(server.Console)
 | 
			
		||||
        private Console: MiaoScriptConsole
 | 
			
		||||
 | 
			
		||||
@@ -28,6 +28,11 @@ export namespace interfaces {
 | 
			
		||||
            return dataFolder.getAbsolutePath()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public registryCommand(executor: any) { }
 | 
			
		||||
        public unregistryCommand(executor: any) { }
 | 
			
		||||
        public registryListener(listener: any) { }
 | 
			
		||||
        public unregistryListener(listener: any) { }
 | 
			
		||||
 | 
			
		||||
        public load() { }
 | 
			
		||||
        public enable() { }
 | 
			
		||||
        public disable() { }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/polyfill",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript polyfill package",
 | 
			
		||||
    "author": "MiaoWoo <admin@yumc.pw>",
 | 
			
		||||
    "homepage": "https://github.com/circlecloud/ms.git",
 | 
			
		||||
@@ -14,12 +14,12 @@
 | 
			
		||||
        "test": "echo \"Error: run tests from root\" && exit 1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@ccms/i18n": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/nodejs": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/i18n": "^0.27.3",
 | 
			
		||||
        "@ccms/nodejs": "^0.27.3",
 | 
			
		||||
        "core-js": "^3.27.2"
 | 
			
		||||
    },
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@ccms/nashorn": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/nashorn": "^0.27.3",
 | 
			
		||||
        "reflect-metadata": "^0.1.13",
 | 
			
		||||
        "rimraf": "^4.1.2",
 | 
			
		||||
        "typescript": "^4.9.5"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/protocol",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript protocol package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/qrcode",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript qrcode package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/sponge",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript sponge package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
@@ -25,8 +25,8 @@
 | 
			
		||||
        "typescript": "^4.9.5"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@ccms/api": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/common": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/container": "^0.27.3-beta.0"
 | 
			
		||||
        "@ccms/api": "^0.27.3",
 | 
			
		||||
        "@ccms/common": "^0.27.3",
 | 
			
		||||
        "@ccms/container": "^0.27.3"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/spring",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript spring package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
@@ -24,9 +24,9 @@
 | 
			
		||||
        "typescript": "^4.9.5"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@ccms/api": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/common": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/container": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/database": "^0.27.3-beta.0"
 | 
			
		||||
        "@ccms/api": "^0.27.3",
 | 
			
		||||
        "@ccms/common": "^0.27.3",
 | 
			
		||||
        "@ccms/container": "^0.27.3",
 | 
			
		||||
        "@ccms/database": "^0.27.3"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/web",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript web package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
@@ -29,7 +29,7 @@
 | 
			
		||||
        "typescript": "^4.9.5"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@ccms/api": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/container": "^0.27.3-beta.0"
 | 
			
		||||
        "@ccms/api": "^0.27.3",
 | 
			
		||||
        "@ccms/container": "^0.27.3"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/websocket",
 | 
			
		||||
    "version": "0.27.3-beta.0",
 | 
			
		||||
    "version": "0.27.3",
 | 
			
		||||
    "description": "MiaoScript websocket package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
@@ -24,7 +24,7 @@
 | 
			
		||||
        "parseuri": "^0.0.6"
 | 
			
		||||
    },
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@ccms/nashorn": "^0.27.3-beta.0",
 | 
			
		||||
        "@ccms/nashorn": "^0.27.3",
 | 
			
		||||
        "@javatypes/tomcat-websocket-api": "^0.0.3",
 | 
			
		||||
        "reflect-metadata": "^0.1.13",
 | 
			
		||||
        "rimraf": "^4.1.2",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,5 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
for package in `ls packages`; do
 | 
			
		||||
    echo $package
 | 
			
		||||
    pushd packages/$package
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								script/sync.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										3
									
								
								script/sync.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
for PACKAGE in `ls packages`;do
 | 
			
		||||
    echo "${PACKAGE} $(curl -s "https://registry-direct.npmmirror.com/@ccms/${PACKAGE}/sync?sync_upstream=true" -X 'PUT')"
 | 
			
		||||
done
 | 
			
		||||
		Reference in New Issue
	
	Block a user