@shrub/vue 0.5.26
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/LICENSE +21 -0
- package/dist/component-decorator.d.ts +7 -0
- package/dist/component-decorator.js +29 -0
- package/dist/component-service.d.ts +10 -0
- package/dist/component-service.js +31 -0
- package/dist/component.d.ts +23 -0
- package/dist/component.js +23 -0
- package/dist/esm/component-decorator.js +22 -0
- package/dist/esm/component-service.js +28 -0
- package/dist/esm/component.js +19 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/module.js +109 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +16 -0
- package/dist/module.d.ts +52 -0
- package/dist/module.js +116 -0
- package/package.json +32 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2019 jjvainav
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import Vue, { ComponentOptions } from "vue";
|
|
2
|
+
import { IServiceCollection } from "@shrub/core";
|
|
3
|
+
import { IComponentCollection } from "./component";
|
|
4
|
+
/** Decorator extension for Vue components with added support for features such as dynamic components registered to a Vue component collection. */
|
|
5
|
+
export declare function VueComponent<V extends Vue>(options: ComponentOptions<V> & ThisType<V> & {
|
|
6
|
+
collection?: string | ((services: IServiceCollection) => IComponentCollection);
|
|
7
|
+
}): <VC extends import("vue-class-component/lib/declarations").VueClass<V>>(target: VC) => VC;
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
exports.VueComponent = void 0;
|
|
7
|
+
const vue_class_component_1 = __importDefault(require("vue-class-component"));
|
|
8
|
+
const component_service_1 = require("./component-service");
|
|
9
|
+
/** Decorator extension for Vue components with added support for features such as dynamic components registered to a Vue component collection. */
|
|
10
|
+
function VueComponent(options) {
|
|
11
|
+
if (options.collection) {
|
|
12
|
+
const collection = options.collection;
|
|
13
|
+
const beforeCreate = options.beforeCreate;
|
|
14
|
+
options.beforeCreate = function () {
|
|
15
|
+
if (beforeCreate) {
|
|
16
|
+
beforeCreate.call(this);
|
|
17
|
+
}
|
|
18
|
+
const components = typeof collection === "string"
|
|
19
|
+
? this.$services.get(component_service_1.IComponentService).getCollection(collection).getComponents()
|
|
20
|
+
: collection(this.$services).getComponents();
|
|
21
|
+
for (const component of components) {
|
|
22
|
+
this.$options.components[component.id] = component.ctor;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return vue_class_component_1.default(options);
|
|
27
|
+
}
|
|
28
|
+
exports.VueComponent = VueComponent;
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWRlY29yYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wb25lbnQtZGVjb3JhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLDhFQUE0QztBQUc1QywyREFBd0Q7QUFFeEQsa0pBQWtKO0FBQ2xKLFNBQWdCLFlBQVksQ0FBZ0IsT0FBK0g7SUFDdkssSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO1FBQ3BCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQztRQUUxQyxPQUFPLENBQUMsWUFBWSxHQUFHO1lBQ25CLElBQUksWUFBWSxFQUFFO2dCQUNkLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDM0I7WUFFRCxNQUFNLFVBQVUsR0FBRyxPQUFPLFVBQVUsS0FBSyxRQUFRO2dCQUM3QyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMscUNBQWlCLENBQUMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsYUFBYSxFQUFFO2dCQUNqRixDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUVqRCxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRTtnQkFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFtQixTQUFTLENBQUMsSUFBSSxDQUFDO2FBQzVFO1FBQ0wsQ0FBQyxDQUFDO0tBQ0w7SUFFRCxPQUFPLDZCQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQXJCRCxvQ0FxQkMifQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { IComponent, IComponentCollection } from "./component";
|
|
2
|
+
export declare const IComponentService: import("@shrub/core").IService<IComponentService>;
|
|
3
|
+
/** A service that manages a collection of components. */
|
|
4
|
+
export interface IComponentService {
|
|
5
|
+
getCollection<TComponent extends IComponent = IComponent>(id: string): IComponentCollection<TComponent>;
|
|
6
|
+
}
|
|
7
|
+
export declare class ComponentService implements IComponentService {
|
|
8
|
+
private readonly collections;
|
|
9
|
+
getCollection<TComponent extends IComponent = IComponent>(id: string): IComponentCollection<TComponent>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ComponentService = exports.IComponentService = void 0;
|
|
10
|
+
const core_1 = require("@shrub/core");
|
|
11
|
+
const component_1 = require("./component");
|
|
12
|
+
exports.IComponentService = core_1.createService("component-service");
|
|
13
|
+
let ComponentService = class ComponentService {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.collections = new Map();
|
|
16
|
+
}
|
|
17
|
+
getCollection(id) {
|
|
18
|
+
let collection = this.collections.get(id);
|
|
19
|
+
if (!collection) {
|
|
20
|
+
collection = new component_1.ComponentCollection(id);
|
|
21
|
+
this.collections.set(id, collection);
|
|
22
|
+
}
|
|
23
|
+
// TODO: is there anyway to verify/check the generic type?
|
|
24
|
+
return collection;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
ComponentService = __decorate([
|
|
28
|
+
core_1.Singleton
|
|
29
|
+
], ComponentService);
|
|
30
|
+
exports.ComponentService = ComponentService;
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29tcG9uZW50LXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsc0NBQXVEO0FBQ3ZELDJDQUFvRjtBQUV2RSxRQUFBLGlCQUFpQixHQUFHLG9CQUFhLENBQW9CLG1CQUFtQixDQUFDLENBQUM7QUFRdkYsSUFBYSxnQkFBZ0IsR0FBN0IsTUFBYSxnQkFBZ0I7SUFBN0I7UUFDcUIsZ0JBQVcsR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztJQWExRSxDQUFDO0lBWEcsYUFBYSxDQUE2QyxFQUFVO1FBQ2hFLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDYixVQUFVLEdBQUcsSUFBSSwrQkFBbUIsQ0FBYSxFQUFFLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDeEM7UUFFRCwwREFBMEQ7UUFDMUQsT0FBK0MsVUFBVyxDQUFDO0lBQy9ELENBQUM7Q0FDSixDQUFBO0FBZFksZ0JBQWdCO0lBRDVCLGdCQUFTO0dBQ0csZ0JBQWdCLENBYzVCO0FBZFksNENBQWdCIn0=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
declare type Constructor<T> = {
|
|
2
|
+
new (...args: any[]): T;
|
|
3
|
+
};
|
|
4
|
+
export interface IComponent {
|
|
5
|
+
readonly id: string;
|
|
6
|
+
readonly ctor: Constructor<any>;
|
|
7
|
+
}
|
|
8
|
+
export interface IComponentCollection<TComponent extends IComponent = IComponent> {
|
|
9
|
+
getComponent(id: string): TComponent | undefined;
|
|
10
|
+
getComponents(): TComponent[];
|
|
11
|
+
hasComponents(): boolean;
|
|
12
|
+
register(component: TComponent): void;
|
|
13
|
+
}
|
|
14
|
+
export declare class ComponentCollection<TComponent extends IComponent = IComponent> implements IComponentCollection<TComponent> {
|
|
15
|
+
readonly id: string;
|
|
16
|
+
private readonly components;
|
|
17
|
+
constructor(id: string);
|
|
18
|
+
getComponent(id: string): TComponent | undefined;
|
|
19
|
+
getComponents(): TComponent[];
|
|
20
|
+
hasComponents(): boolean;
|
|
21
|
+
register(component: TComponent): void;
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ComponentCollection = void 0;
|
|
4
|
+
class ComponentCollection {
|
|
5
|
+
constructor(id) {
|
|
6
|
+
this.id = id;
|
|
7
|
+
this.components = new Map();
|
|
8
|
+
}
|
|
9
|
+
getComponent(id) {
|
|
10
|
+
return this.components.get(id);
|
|
11
|
+
}
|
|
12
|
+
getComponents() {
|
|
13
|
+
return Array.from(this.components.values());
|
|
14
|
+
}
|
|
15
|
+
hasComponents() {
|
|
16
|
+
return this.components.size > 0;
|
|
17
|
+
}
|
|
18
|
+
register(component) {
|
|
19
|
+
this.components.set(component.id, component);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.ComponentCollection = ComponentCollection;
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFjQSxNQUFhLG1CQUFtQjtJQUc1QixZQUFxQixFQUFVO1FBQVYsT0FBRSxHQUFGLEVBQUUsQ0FBUTtRQUZkLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztJQUc1RCxDQUFDO0lBRUQsWUFBWSxDQUFDLEVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsYUFBYTtRQUNULE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELGFBQWE7UUFDVCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsUUFBUSxDQUFDLFNBQXFCO1FBQzFCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakQsQ0FBQztDQUNKO0FBckJELGtEQXFCQyJ9
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import Component from "vue-class-component";
|
|
2
|
+
import { IComponentService } from "./component-service";
|
|
3
|
+
/** Decorator extension for Vue components with added support for features such as dynamic components registered to a Vue component collection. */
|
|
4
|
+
export function VueComponent(options) {
|
|
5
|
+
if (options.collection) {
|
|
6
|
+
const collection = options.collection;
|
|
7
|
+
const beforeCreate = options.beforeCreate;
|
|
8
|
+
options.beforeCreate = function () {
|
|
9
|
+
if (beforeCreate) {
|
|
10
|
+
beforeCreate.call(this);
|
|
11
|
+
}
|
|
12
|
+
const components = typeof collection === "string"
|
|
13
|
+
? this.$services.get(IComponentService).getCollection(collection).getComponents()
|
|
14
|
+
: collection(this.$services).getComponents();
|
|
15
|
+
for (const component of components) {
|
|
16
|
+
this.$options.components[component.id] = component.ctor;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
return Component(options);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWRlY29yYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnQtZGVjb3JhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sU0FBUyxNQUFNLHFCQUFxQixDQUFDO0FBRzVDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXhELGtKQUFrSjtBQUNsSixNQUFNLFVBQVUsWUFBWSxDQUFnQixPQUErSDtJQUN2SyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUU7UUFDcEIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUN0QyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO1FBRTFDLE9BQU8sQ0FBQyxZQUFZLEdBQUc7WUFDbkIsSUFBSSxZQUFZLEVBQUU7Z0JBQ2QsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMzQjtZQUVELE1BQU0sVUFBVSxHQUFHLE9BQU8sVUFBVSxLQUFLLFFBQVE7Z0JBQzdDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxhQUFhLEVBQUU7Z0JBQ2pGLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRWpELEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFO2dCQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQW1CLFNBQVMsQ0FBQyxJQUFJLENBQUM7YUFDNUU7UUFDTCxDQUFDLENBQUM7S0FDTDtJQUVELE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzlCLENBQUMifQ==
|
|
@@ -0,0 +1,28 @@
|
|
|
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
|
+
import { createService, Singleton } from "@shrub/core";
|
|
8
|
+
import { ComponentCollection } from "./component";
|
|
9
|
+
export const IComponentService = createService("component-service");
|
|
10
|
+
let ComponentService = class ComponentService {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.collections = new Map();
|
|
13
|
+
}
|
|
14
|
+
getCollection(id) {
|
|
15
|
+
let collection = this.collections.get(id);
|
|
16
|
+
if (!collection) {
|
|
17
|
+
collection = new ComponentCollection(id);
|
|
18
|
+
this.collections.set(id, collection);
|
|
19
|
+
}
|
|
20
|
+
// TODO: is there anyway to verify/check the generic type?
|
|
21
|
+
return collection;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
ComponentService = __decorate([
|
|
25
|
+
Singleton
|
|
26
|
+
], ComponentService);
|
|
27
|
+
export { ComponentService };
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50LXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdkQsT0FBTyxFQUFFLG1CQUFtQixFQUFvQyxNQUFNLGFBQWEsQ0FBQztBQUVwRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQW9CLG1CQUFtQixDQUFDLENBQUM7QUFRdkYsSUFBYSxnQkFBZ0IsR0FBN0IsTUFBYSxnQkFBZ0I7SUFBN0I7UUFDcUIsZ0JBQVcsR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztJQWExRSxDQUFDO0lBWEcsYUFBYSxDQUE2QyxFQUFVO1FBQ2hFLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDYixVQUFVLEdBQUcsSUFBSSxtQkFBbUIsQ0FBYSxFQUFFLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDeEM7UUFFRCwwREFBMEQ7UUFDMUQsT0FBK0MsVUFBVyxDQUFDO0lBQy9ELENBQUM7Q0FDSixDQUFBO0FBZFksZ0JBQWdCO0lBRDVCLFNBQVM7R0FDRyxnQkFBZ0IsQ0FjNUI7U0FkWSxnQkFBZ0IifQ==
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export class ComponentCollection {
|
|
2
|
+
constructor(id) {
|
|
3
|
+
this.id = id;
|
|
4
|
+
this.components = new Map();
|
|
5
|
+
}
|
|
6
|
+
getComponent(id) {
|
|
7
|
+
return this.components.get(id);
|
|
8
|
+
}
|
|
9
|
+
getComponents() {
|
|
10
|
+
return Array.from(this.components.values());
|
|
11
|
+
}
|
|
12
|
+
hasComponents() {
|
|
13
|
+
return this.components.size > 0;
|
|
14
|
+
}
|
|
15
|
+
register(component) {
|
|
16
|
+
this.components.set(component.id, component);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFjQSxNQUFNLE9BQU8sbUJBQW1CO0lBRzVCLFlBQXFCLEVBQVU7UUFBVixPQUFFLEdBQUYsRUFBRSxDQUFRO1FBRmQsZUFBVSxHQUFHLElBQUksR0FBRyxFQUFzQixDQUFDO0lBRzVELENBQUM7SUFFRCxZQUFZLENBQUMsRUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxhQUFhO1FBQ1QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsYUFBYTtRQUNULE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxRQUFRLENBQUMsU0FBcUI7UUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0oifQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from "./component-decorator";
|
|
2
|
+
export * from "./component-service";
|
|
3
|
+
export * from "./module";
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsVUFBVSxDQUFDIn0=
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import Vue from "vue";
|
|
2
|
+
import { createConfig } from "@shrub/core";
|
|
3
|
+
import { ModelModule } from "@shrub/model";
|
|
4
|
+
import { ComponentService, IComponentService } from "./component-service";
|
|
5
|
+
Vue.use({
|
|
6
|
+
install(vue) {
|
|
7
|
+
if (!vue.prototype.$key) {
|
|
8
|
+
Object.defineProperty(vue.prototype, "$key", { value: createValueKeyProvider() });
|
|
9
|
+
Vue.mixin({
|
|
10
|
+
beforeCreate: function () {
|
|
11
|
+
if (this.$options.services) {
|
|
12
|
+
this.$services = this.$options.services;
|
|
13
|
+
}
|
|
14
|
+
else if (this.$options.parent && this.$options.parent.$services) {
|
|
15
|
+
this.$services = this.$options.parent.$services;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
export const IVueConfiguration = createConfig();
|
|
23
|
+
function createValueKeyProvider() {
|
|
24
|
+
let nextId = 1;
|
|
25
|
+
return (obj) => {
|
|
26
|
+
if (obj === undefined) {
|
|
27
|
+
return -1;
|
|
28
|
+
}
|
|
29
|
+
if (Array.isArray(obj)) {
|
|
30
|
+
throw new Error("Invalid object");
|
|
31
|
+
}
|
|
32
|
+
if (!obj.__id__) {
|
|
33
|
+
// make sure the property is not configurable/enumerable so that it doesn't get overridden, copied if being cloned, or enumerable
|
|
34
|
+
Object.defineProperty(obj, "__id__", { value: nextId++ });
|
|
35
|
+
}
|
|
36
|
+
return obj.__id__;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export class VueModule {
|
|
40
|
+
constructor() {
|
|
41
|
+
this.name = "vue";
|
|
42
|
+
this.dependencies = [ModelModule];
|
|
43
|
+
}
|
|
44
|
+
initialize({ config }) {
|
|
45
|
+
config(IVueConfiguration).register(() => ({
|
|
46
|
+
mount: (component, options) => {
|
|
47
|
+
if (this.mountData) {
|
|
48
|
+
throw new Error("A component has already been mounted.");
|
|
49
|
+
}
|
|
50
|
+
this.mountData = { component, options };
|
|
51
|
+
}
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
configureServices(registration) {
|
|
55
|
+
registration.register(IComponentService, ComponentService);
|
|
56
|
+
}
|
|
57
|
+
async configure({ settings, services, next }) {
|
|
58
|
+
// mount the element after all dependents have had a chance to configure
|
|
59
|
+
await next();
|
|
60
|
+
if (!this.mountData) {
|
|
61
|
+
// TODO: write a warning to the console
|
|
62
|
+
return Promise.resolve();
|
|
63
|
+
}
|
|
64
|
+
const { component, options } = this.mountData;
|
|
65
|
+
this.mountData = undefined;
|
|
66
|
+
const el = this.getElementId(settings);
|
|
67
|
+
if (!document.getElementById(el.substr(1))) {
|
|
68
|
+
throw new Error(`Element with id (${el}) not found`);
|
|
69
|
+
}
|
|
70
|
+
const componentOptions = this.getComponentOptions(options);
|
|
71
|
+
const router = componentOptions.router;
|
|
72
|
+
const app = new Vue({
|
|
73
|
+
services,
|
|
74
|
+
render: h => h(component, this.getData(options)),
|
|
75
|
+
...componentOptions
|
|
76
|
+
});
|
|
77
|
+
if (router) {
|
|
78
|
+
// need to wait on the router when using SSR
|
|
79
|
+
router.onReady(() => app.$mount(el));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
app.$mount(el);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
getElementId(settings) {
|
|
86
|
+
if (settings.el) {
|
|
87
|
+
// Vue expects the element id to be prefixed with a '#'
|
|
88
|
+
return settings.el[0] === "#" ? settings.el : "#" + settings.el;
|
|
89
|
+
}
|
|
90
|
+
return "#app";
|
|
91
|
+
}
|
|
92
|
+
getComponentOptions(mountOptions) {
|
|
93
|
+
if (mountOptions && mountOptions.options) {
|
|
94
|
+
return typeof mountOptions.options === "function"
|
|
95
|
+
? mountOptions.options()
|
|
96
|
+
: mountOptions.options;
|
|
97
|
+
}
|
|
98
|
+
return {};
|
|
99
|
+
}
|
|
100
|
+
getData(mountOptions) {
|
|
101
|
+
if (mountOptions && mountOptions.data) {
|
|
102
|
+
return typeof mountOptions.data === "function"
|
|
103
|
+
? mountOptions.data()
|
|
104
|
+
: mountOptions.data;
|
|
105
|
+
}
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEdBQW9ELE1BQU0sS0FBSyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxZQUFZLEVBQThGLE1BQU0sYUFBYSxDQUFDO0FBQ3ZJLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUF1QjFFLEdBQUcsQ0FBQyxHQUFHLENBQUM7SUFDSixPQUFPLENBQUMsR0FBZTtRQUNuQixJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7WUFDckIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNsRixHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUNOLFlBQVksRUFBRTtvQkFDVixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFO3dCQUNsQixJQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO3FCQUNsRDt5QkFDSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTt3QkFDdkQsSUFBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7cUJBQzFEO2dCQUNMLENBQUM7YUFDSixDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7Q0FDSixDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLEVBQXFCLENBQUM7QUFrQ25FLFNBQVMsc0JBQXNCO0lBQzNCLElB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
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
__exportStar(require("./component-decorator"), exports);
|
|
14
|
+
__exportStar(require("./component-service"), exports);
|
|
15
|
+
__exportStar(require("./module"), exports);
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQ0Esd0RBQXNDO0FBQ3RDLHNEQUFvQztBQUNwQywyQ0FBeUIifQ==
|
package/dist/module.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import Vue, { ComponentOptions, VueConstructor, VNodeData } from "vue";
|
|
2
|
+
import { IModule, IModuleConfigurator, IModuleInitializer, IServiceCollection, IServiceRegistration } from "@shrub/core";
|
|
3
|
+
import { ModelModule } from "@shrub/model";
|
|
4
|
+
declare module "vue/types/vue" {
|
|
5
|
+
interface Vue {
|
|
6
|
+
/** Utility for assigning or acquiring a unique identifier that is useful for use with v-for. */
|
|
7
|
+
readonly $key: IVueKeyProvider;
|
|
8
|
+
/** Provides access to the global services container. */
|
|
9
|
+
readonly $services: IServiceCollection;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
declare module "vue/types/options" {
|
|
13
|
+
interface ComponentOptions<V extends Vue, Data, Methods, Computed, PropsDef, Props> {
|
|
14
|
+
services?: IServiceCollection;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export declare const IVueConfiguration: import("@shrub/core").IModuleConfigurationType<IVueConfiguration>;
|
|
18
|
+
export interface IVueConfiguration {
|
|
19
|
+
/** Mounts the specified Vue component. */
|
|
20
|
+
mount(component: VueConstructor, options?: IVueMountOptions): void;
|
|
21
|
+
}
|
|
22
|
+
export interface IVueModuleSettings {
|
|
23
|
+
/** The element id to mount to; the default is #app. */
|
|
24
|
+
readonly el?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface IVueMountOptions {
|
|
27
|
+
/** Component options passed to the root Vue component hosting the mounted component. */
|
|
28
|
+
readonly options?: ComponentOptions<Vue> | (() => ComponentOptions<Vue>);
|
|
29
|
+
/** VNodeData passed to the mounted component instance. */
|
|
30
|
+
readonly data?: VNodeData | (() => VNodeData);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* In some situations Vue requires a key when using v-for (https://vuejs.org/v2/guide/list.html#v-for-with-a-Component) and is highly-recommended elsewhere.
|
|
34
|
+
* This provider is useful for objects that don't have a unique identifier, invoking it will assign and return a unique identifier for the object; if one
|
|
35
|
+
* had been previously assigned that value will be returned.
|
|
36
|
+
*
|
|
37
|
+
* Note: this is really only necessary if the list of items is modified (e.g. re-ordered or added/removed); otherwise using the item index maybe good enough.
|
|
38
|
+
*/
|
|
39
|
+
export interface IVueKeyProvider {
|
|
40
|
+
(obj?: object): number;
|
|
41
|
+
}
|
|
42
|
+
export declare class VueModule implements IModule {
|
|
43
|
+
private mountData?;
|
|
44
|
+
readonly name = "vue";
|
|
45
|
+
readonly dependencies: (typeof ModelModule)[];
|
|
46
|
+
initialize({ config }: IModuleInitializer): void;
|
|
47
|
+
configureServices(registration: IServiceRegistration): void;
|
|
48
|
+
configure({ settings, services, next }: IModuleConfigurator): Promise<void>;
|
|
49
|
+
private getElementId;
|
|
50
|
+
private getComponentOptions;
|
|
51
|
+
private getData;
|
|
52
|
+
}
|
package/dist/module.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
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
|
+
exports.VueModule = exports.IVueConfiguration = void 0;
|
|
7
|
+
const vue_1 = __importDefault(require("vue"));
|
|
8
|
+
const core_1 = require("@shrub/core");
|
|
9
|
+
const model_1 = require("@shrub/model");
|
|
10
|
+
const component_service_1 = require("./component-service");
|
|
11
|
+
vue_1.default.use({
|
|
12
|
+
install(vue) {
|
|
13
|
+
if (!vue.prototype.$key) {
|
|
14
|
+
Object.defineProperty(vue.prototype, "$key", { value: createValueKeyProvider() });
|
|
15
|
+
vue_1.default.mixin({
|
|
16
|
+
beforeCreate: function () {
|
|
17
|
+
if (this.$options.services) {
|
|
18
|
+
this.$services = this.$options.services;
|
|
19
|
+
}
|
|
20
|
+
else if (this.$options.parent && this.$options.parent.$services) {
|
|
21
|
+
this.$services = this.$options.parent.$services;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
exports.IVueConfiguration = core_1.createConfig();
|
|
29
|
+
function createValueKeyProvider() {
|
|
30
|
+
let nextId = 1;
|
|
31
|
+
return (obj) => {
|
|
32
|
+
if (obj === undefined) {
|
|
33
|
+
return -1;
|
|
34
|
+
}
|
|
35
|
+
if (Array.isArray(obj)) {
|
|
36
|
+
throw new Error("Invalid object");
|
|
37
|
+
}
|
|
38
|
+
if (!obj.__id__) {
|
|
39
|
+
// make sure the property is not configurable/enumerable so that it doesn't get overridden, copied if being cloned, or enumerable
|
|
40
|
+
Object.defineProperty(obj, "__id__", { value: nextId++ });
|
|
41
|
+
}
|
|
42
|
+
return obj.__id__;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
class VueModule {
|
|
46
|
+
constructor() {
|
|
47
|
+
this.name = "vue";
|
|
48
|
+
this.dependencies = [model_1.ModelModule];
|
|
49
|
+
}
|
|
50
|
+
initialize({ config }) {
|
|
51
|
+
config(exports.IVueConfiguration).register(() => ({
|
|
52
|
+
mount: (component, options) => {
|
|
53
|
+
if (this.mountData) {
|
|
54
|
+
throw new Error("A component has already been mounted.");
|
|
55
|
+
}
|
|
56
|
+
this.mountData = { component, options };
|
|
57
|
+
}
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
configureServices(registration) {
|
|
61
|
+
registration.register(component_service_1.IComponentService, component_service_1.ComponentService);
|
|
62
|
+
}
|
|
63
|
+
async configure({ settings, services, next }) {
|
|
64
|
+
// mount the element after all dependents have had a chance to configure
|
|
65
|
+
await next();
|
|
66
|
+
if (!this.mountData) {
|
|
67
|
+
// TODO: write a warning to the console
|
|
68
|
+
return Promise.resolve();
|
|
69
|
+
}
|
|
70
|
+
const { component, options } = this.mountData;
|
|
71
|
+
this.mountData = undefined;
|
|
72
|
+
const el = this.getElementId(settings);
|
|
73
|
+
if (!document.getElementById(el.substr(1))) {
|
|
74
|
+
throw new Error(`Element with id (${el}) not found`);
|
|
75
|
+
}
|
|
76
|
+
const componentOptions = this.getComponentOptions(options);
|
|
77
|
+
const router = componentOptions.router;
|
|
78
|
+
const app = new vue_1.default({
|
|
79
|
+
services,
|
|
80
|
+
render: h => h(component, this.getData(options)),
|
|
81
|
+
...componentOptions
|
|
82
|
+
});
|
|
83
|
+
if (router) {
|
|
84
|
+
// need to wait on the router when using SSR
|
|
85
|
+
router.onReady(() => app.$mount(el));
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
app.$mount(el);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
getElementId(settings) {
|
|
92
|
+
if (settings.el) {
|
|
93
|
+
// Vue expects the element id to be prefixed with a '#'
|
|
94
|
+
return settings.el[0] === "#" ? settings.el : "#" + settings.el;
|
|
95
|
+
}
|
|
96
|
+
return "#app";
|
|
97
|
+
}
|
|
98
|
+
getComponentOptions(mountOptions) {
|
|
99
|
+
if (mountOptions && mountOptions.options) {
|
|
100
|
+
return typeof mountOptions.options === "function"
|
|
101
|
+
? mountOptions.options()
|
|
102
|
+
: mountOptions.options;
|
|
103
|
+
}
|
|
104
|
+
return {};
|
|
105
|
+
}
|
|
106
|
+
getData(mountOptions) {
|
|
107
|
+
if (mountOptions && mountOptions.data) {
|
|
108
|
+
return typeof mountOptions.data === "function"
|
|
109
|
+
? mountOptions.data()
|
|
110
|
+
: mountOptions.data;
|
|
111
|
+
}
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.VueModule = VueModule;
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4Q0FBdUU7QUFDdkUsc0NBQXVJO0FBQ3ZJLHdDQUEyQztBQUMzQywyREFBMEU7QUF1QjFFLGFBQUcsQ0FBQyxHQUFHLENBQUM7SUFDSixPQUFPLENBQUMsR0FBZTtRQUNuQixJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7WUFDckIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNsRixhQUFHLENBQUMsS0FBSyxDQUFDO2dCQUNOLFlBQVksRUFBRTtvQkFDVixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFO3dCQUNsQixJQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO3FCQUNsRDt5QkFDSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTt3QkFDdkQsSUFBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7cUJBQzFEO2dCQUNMLENBQUM7YUFDSixDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7Q0FDSixDQUFDLENBQUM7QUFFVSxRQUFBLGlCQUFpQixHQUFHLG1CQUFZLEVBQXFCLENBQUM7QUFrQ25FLFNBQVMsc0JBQXNCO0lBQzNCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNmLE9BQU8sQ0FBQyxHQUFZLEVBQUUsRUFBRTtRQUNwQixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7WUFDbkIsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUNiO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUNyQztRQUVELElBQUksQ0FBTyxHQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3BCLGlJQUFpSTtZQUNqSSxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzdEO1FBRUQsT0FBYSxHQUFJLENBQUMsTUFBTSxDQUFDO0lBQzdCLENBQUMsQ0FBQztBQUNOLENBQUM7QUFFRCxNQUFhLFNBQVM7SUFBdEI7UUFHYSxTQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2IsaUJBQVksR0FBRyxDQUFDLG1CQUFXLENBQUMsQ0FBQztJQWdGMUMsQ0FBQztJQTlFRyxVQUFVLENBQUMsRUFBRSxNQUFNLEVBQXNCO1FBQ3JDLE1BQU0sQ0FBQyx5QkFBaUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3RDLEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsRUFBRTtnQkFDMUIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7aUJBQzVEO2dCQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDNUMsQ0FBQztTQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVELGlCQUFpQixDQUFDLFlBQWtDO1FBQ2hELFlBQVksQ0FBQyxRQUFRLENBQUMscUNBQWlCLEVBQUUsb0NBQWdCLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUF1QjtRQUM3RCx3RUFBd0U7UUFDeEUsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUViLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2pCLHVDQUF1QztZQUN2QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUM1QjtRQUVELE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUM5QyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUUzQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQ3hEO1FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0QsTUFBTSxNQUFNLEdBQXFCLGdCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUMxRCxNQUFNLEdBQUcsR0FBRyxJQUFJLGFBQUcsQ0FBQztZQUNoQixRQUFRO1lBQ1IsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELEdBQUcsZ0JBQWdCO1NBQ3RCLENBQUMsQ0FBQztRQUVILElBQUksTUFBTSxFQUFFO1lBQ1IsNENBQTRDO1lBQzVDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3hDO2FBQ0k7WUFDRCxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2xCO0lBQ0wsQ0FBQztJQUVPLFlBQVksQ0FBQyxRQUE0QjtRQUM3QyxJQUFJLFFBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDYix1REFBdUQ7WUFDdkQsT0FBTyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUM7U0FDbkU7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRU8sbUJBQW1CLENBQUMsWUFBK0I7UUFDdkQsSUFBSSxZQUFZLElBQUksWUFBWSxDQUFDLE9BQU8sRUFBRTtZQUN0QyxPQUFPLE9BQU8sWUFBWSxDQUFDLE9BQU8sS0FBSyxVQUFVO2dCQUM3QyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRTtnQkFDeEIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7U0FDOUI7UUFFRCxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFTyxPQUFPLENBQUMsWUFBK0I7UUFDM0MsSUFBSSxZQUFZLElBQUksWUFBWSxDQUFDLElBQUksRUFBRTtZQUNuQyxPQUFPLE9BQU8sWUFBWSxDQUFDLElBQUksS0FBSyxVQUFVO2dCQUMxQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRTtnQkFDckIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7U0FDM0I7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0NBQ0o7QUFwRkQsOEJBb0ZDIn0=
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@shrub/vue",
|
|
3
|
+
"description": "A module that adds support for Vue based apps.",
|
|
4
|
+
"version": "0.5.26",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/jjvainav/shrub.git"
|
|
9
|
+
},
|
|
10
|
+
"main": "dist/index.js",
|
|
11
|
+
"module": "dist/esm/index.js",
|
|
12
|
+
"typings": "dist/index.d.ts",
|
|
13
|
+
"files": [
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc -b .",
|
|
21
|
+
"build:esm": "tsc -p tsconfig.esm.json",
|
|
22
|
+
"clean": "rimraf ./dist && rimraf tsconfig.tsbuildinfo"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@shrub/core": "0.5.26",
|
|
26
|
+
"@shrub/model": "0.5.26",
|
|
27
|
+
"@sprig/serialization": "0.1.69",
|
|
28
|
+
"vue": "^2.6.10",
|
|
29
|
+
"vue-class-component": "^7.1.0"
|
|
30
|
+
},
|
|
31
|
+
"gitHead": "bd8e68fee891bb035f6506401851cf993c1c614e"
|
|
32
|
+
}
|