@shrub/vue-server 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/esm/index.js +2 -0
- package/dist/esm/model-service.js +28 -0
- package/dist/esm/module.js +114 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +14 -0
- package/dist/model-service.d.ts +5 -0
- package/dist/model-service.js +31 -0
- package/dist/module.d.ts +61 -0
- package/dist/module.js +122 -0
- package/package.json +40 -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,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 { Singleton } from "@shrub/core";
|
|
8
|
+
import { ModelService } from "@shrub/model";
|
|
9
|
+
import { JSONSerializer } from "@sprig/serialization";
|
|
10
|
+
let ServerModelService = class ServerModelService extends ModelService {
|
|
11
|
+
get hasModels() {
|
|
12
|
+
for (const key of Object.keys(this.models)) {
|
|
13
|
+
// make sure the property has an actual object and not just undefined/null
|
|
14
|
+
if (this.models[key]) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
serialize() {
|
|
21
|
+
return new JSONSerializer().serialize(this.models);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
ServerModelService = __decorate([
|
|
25
|
+
Singleton
|
|
26
|
+
], ServerModelService);
|
|
27
|
+
export { ServerModelService };
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RlbC1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHdEQsSUFBYSxrQkFBa0IsR0FBL0IsTUFBYSxrQkFBbUIsU0FBUSxZQUFZO0lBQ2hELElBQUksU0FBUztRQUNULEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDeEMsMEVBQTBFO1lBQzFFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbEIsT0FBTyxJQUFJLENBQUM7YUFDZjtTQUNKO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELFNBQVM7UUFDTCxPQUFPLElBQUksY0FBYyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2RCxDQUFDO0NBQ0osQ0FBQTtBQWZZLGtCQUFrQjtJQUQ5QixTQUFTO0dBQ0csa0JBQWtCLENBZTlCO1NBZlksa0JBQWtCIn0=
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import Vue from "vue";
|
|
2
|
+
import { ModuleLoader } from "@shrub/core";
|
|
3
|
+
import { IModelService, ModelModule } from "@shrub/model";
|
|
4
|
+
import { IVueConfiguration, VueModule } from "@shrub/vue";
|
|
5
|
+
import { ServerModelService } from "./model-service";
|
|
6
|
+
/**
|
|
7
|
+
* Loads the specified modules (along with the VueServerModule) and returns a Vue SSR render handler.
|
|
8
|
+
* Example usage in the server entry file:
|
|
9
|
+
*
|
|
10
|
+
* export default bootstrap([modules]);
|
|
11
|
+
*
|
|
12
|
+
* Note: modules will be loaded/created for each request so it's important that module instances passed
|
|
13
|
+
* into the bootstrap function not maintain state.
|
|
14
|
+
*/
|
|
15
|
+
export function bootstrap(modules, builder) {
|
|
16
|
+
modules = [...modules, VueServerModule];
|
|
17
|
+
return async (context) => {
|
|
18
|
+
// modules are loaded asynchronously so wait for them to finish loading and grab the modules collection
|
|
19
|
+
const collection = await ModuleLoader.load({ modules, settings: context.settings });
|
|
20
|
+
if (context.models) {
|
|
21
|
+
// inject the model objects so that they are available when rendering server-side
|
|
22
|
+
const service = collection.services.get(IModelService);
|
|
23
|
+
for (const key in context.models) {
|
|
24
|
+
service.set(key, context.models[key]);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (context.beginRender) {
|
|
28
|
+
// this allows server components the ability to configure the service collection before rendering it server-side
|
|
29
|
+
// the services collection captured/used by the current module is the same one passed into the component when rendered
|
|
30
|
+
await context.beginRender(collection.services);
|
|
31
|
+
}
|
|
32
|
+
const instance = collection.getInstance(VueServerModule);
|
|
33
|
+
let { app, router } = instance.createApp();
|
|
34
|
+
context.rendered = () => {
|
|
35
|
+
// if model state has been captured during SSR set it as the context so it can be loaded client side
|
|
36
|
+
const modelService = app.$services.get(IModelService);
|
|
37
|
+
if (modelService.hasModels) {
|
|
38
|
+
// by setting context.state Vue will inline a global __INITIAL_STATE__ variable
|
|
39
|
+
// https://ssr.vuejs.org/api/#template
|
|
40
|
+
context.state = modelService.serialize();
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
// if a 'builder' is provided invoke it now to allow extending the Vue app instance
|
|
44
|
+
app = builder ? await builder(context, app) : app;
|
|
45
|
+
if (router && context.url) {
|
|
46
|
+
// if a router and request url are avaiable update the router to use the request url as its route location
|
|
47
|
+
router.push(context.url);
|
|
48
|
+
// wait until the router has resolved
|
|
49
|
+
return new Promise((resolve, reject) => router.onReady(() => {
|
|
50
|
+
if (!router.getMatchedComponents().length) {
|
|
51
|
+
// no routes matched the request url so reject with a 404
|
|
52
|
+
return reject({ code: 404 });
|
|
53
|
+
}
|
|
54
|
+
resolve(app);
|
|
55
|
+
}, reject));
|
|
56
|
+
}
|
|
57
|
+
return app;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/** Vue module for server side rendered components. */
|
|
61
|
+
export class VueServerModule {
|
|
62
|
+
constructor() {
|
|
63
|
+
this.name = "vue-server";
|
|
64
|
+
this.dependencies = [
|
|
65
|
+
ModelModule,
|
|
66
|
+
VueModule
|
|
67
|
+
];
|
|
68
|
+
}
|
|
69
|
+
initialize(init) {
|
|
70
|
+
// override the vue configuration to prevent mounting to an html element
|
|
71
|
+
init.config(IVueConfiguration).register(({ services }) => ({
|
|
72
|
+
mount: (component, options) => {
|
|
73
|
+
if (this.component) {
|
|
74
|
+
throw new Error("A Vue component has already been mounted.");
|
|
75
|
+
}
|
|
76
|
+
this.services = services;
|
|
77
|
+
this.component = component;
|
|
78
|
+
this.mountOptions = options;
|
|
79
|
+
}
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
configureServices(registration) {
|
|
83
|
+
registration.register(IModelService, ServerModelService);
|
|
84
|
+
}
|
|
85
|
+
createApp() {
|
|
86
|
+
if (!this.component) {
|
|
87
|
+
throw new Error("Vue component has not been mounted.");
|
|
88
|
+
}
|
|
89
|
+
const options = this.getComponentOptions();
|
|
90
|
+
const app = new Vue({
|
|
91
|
+
services: this.services,
|
|
92
|
+
render: h => h(this.component, this.getData()),
|
|
93
|
+
...options
|
|
94
|
+
});
|
|
95
|
+
return { app, router: options.router };
|
|
96
|
+
}
|
|
97
|
+
getComponentOptions() {
|
|
98
|
+
if (this.mountOptions && this.mountOptions.options) {
|
|
99
|
+
return typeof this.mountOptions.options === "function"
|
|
100
|
+
? this.mountOptions.options()
|
|
101
|
+
: this.mountOptions.options;
|
|
102
|
+
}
|
|
103
|
+
return {};
|
|
104
|
+
}
|
|
105
|
+
getData() {
|
|
106
|
+
if (this.mountOptions && this.mountOptions.data) {
|
|
107
|
+
return typeof this.mountOptions.data === "function"
|
|
108
|
+
? this.mountOptions.data()
|
|
109
|
+
: this.mountOptions.data;
|
|
110
|
+
}
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEdBQW9DLE1BQU0sS0FBSyxDQUFDO0FBRXZELE9BQU8sRUFBc0osWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9MLE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFELE9BQU8sRUFBRSxpQkFBaUIsRUFBb0IsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBcUNyRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsT0FBc0MsRUFBRSxPQUFxQztJQUNuRyxPQUFPLEdBQUcsQ0FBQyxHQUFHLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztJQUN4QyxPQUFPLEtBQUssRUFBQyxPQUFPLEVBQUMsRUFBRTtRQUNuQix1R0FBdUc7UUFDdkcsTUFBTSxVQUFVLEdBQUcsTUFBTSxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUVwRixJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDaEIsaUZBQWlGO1lBQ2pGLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3ZELEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtnQkFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3pDO1NBQ0o7UUFFRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUU7WUFDckIsZ0hBQWdIO1lBQ2hILHNIQUFzSDtZQUN0SCxNQUFN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
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./module";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
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("./module"), exports);
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXlCIn0=
|
|
@@ -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.ServerModelService = void 0;
|
|
10
|
+
const core_1 = require("@shrub/core");
|
|
11
|
+
const model_1 = require("@shrub/model");
|
|
12
|
+
const serialization_1 = require("@sprig/serialization");
|
|
13
|
+
let ServerModelService = class ServerModelService extends model_1.ModelService {
|
|
14
|
+
get hasModels() {
|
|
15
|
+
for (const key of Object.keys(this.models)) {
|
|
16
|
+
// make sure the property has an actual object and not just undefined/null
|
|
17
|
+
if (this.models[key]) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
serialize() {
|
|
24
|
+
return new serialization_1.JSONSerializer().serialize(this.models);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
ServerModelService = __decorate([
|
|
28
|
+
core_1.Singleton
|
|
29
|
+
], ServerModelService);
|
|
30
|
+
exports.ServerModelService = ServerModelService;
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tb2RlbC1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLHNDQUF3QztBQUN4Qyx3Q0FBNEM7QUFDNUMsd0RBQXNEO0FBR3RELElBQWEsa0JBQWtCLEdBQS9CLE1BQWEsa0JBQW1CLFNBQVEsb0JBQVk7SUFDaEQsSUFBSSxTQUFTO1FBQ1QsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN4QywwRUFBMEU7WUFDMUUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNsQixPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsU0FBUztRQUNMLE9BQU8sSUFBSSw4QkFBYyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2RCxDQUFDO0NBQ0osQ0FBQTtBQWZZLGtCQUFrQjtJQUQ5QixnQkFBUztHQUNHLGtCQUFrQixDQWU5QjtBQWZZLGdEQUFrQiJ9
|
package/dist/module.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import Vue from "vue";
|
|
2
|
+
import Router from "vue-router";
|
|
3
|
+
import { IModule, IModuleInitializer, IModuleSettingsCollection, IServiceCollection, IServiceRegistration, ModuleInstanceOrConstructor } from "@shrub/core";
|
|
4
|
+
import { ModelModule } from "@shrub/model";
|
|
5
|
+
import { VueModule } from "@shrub/vue";
|
|
6
|
+
/**
|
|
7
|
+
* Defines a user context that gets passed into the SSR render function.
|
|
8
|
+
* Vue checks for and uses a few properties internally and the rest are
|
|
9
|
+
* user defined and used by the render function itself.
|
|
10
|
+
*/
|
|
11
|
+
export interface IVueSSRContext {
|
|
12
|
+
/** An optional callback that the vue-server module will invoke just before the Vue app/component is rendered. */
|
|
13
|
+
beginRender?: (services: IServiceCollection) => Promise<void>;
|
|
14
|
+
/** An optional callback that Vue will invoke when the app as finished rendering. */
|
|
15
|
+
rendered?: (context: IVueSSRContext) => void;
|
|
16
|
+
/** Optional set of models that will get injected before rendering server-side and also serialized and set as the state to pass to the client. */
|
|
17
|
+
models?: {
|
|
18
|
+
readonly [key: string]: any;
|
|
19
|
+
};
|
|
20
|
+
/** Optional module settings that will be passed down to the modules when rendering server-side. */
|
|
21
|
+
settings?: IModuleSettingsCollection;
|
|
22
|
+
/** Opional url identifying the current request url and is needed when the main SSR component uses a vue-router. */
|
|
23
|
+
url?: string;
|
|
24
|
+
[key: string]: any;
|
|
25
|
+
}
|
|
26
|
+
/** The render function expected to be exported for Vue SSR rendering. */
|
|
27
|
+
export interface IVueSSRRenderHandler {
|
|
28
|
+
(context: IVueSSRContext): Promise<Vue>;
|
|
29
|
+
}
|
|
30
|
+
/** The callback for extending the Vue SSR render handling function. */
|
|
31
|
+
export interface IVueSSRRenderHandlerBuilder {
|
|
32
|
+
(context: IVueSSRContext, app: Vue): Promise<Vue>;
|
|
33
|
+
}
|
|
34
|
+
/** The result when creating a Vue app for SSR rendering. */
|
|
35
|
+
export interface IVueSSRCreateResult {
|
|
36
|
+
readonly app: Vue;
|
|
37
|
+
readonly router?: Router;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Loads the specified modules (along with the VueServerModule) and returns a Vue SSR render handler.
|
|
41
|
+
* Example usage in the server entry file:
|
|
42
|
+
*
|
|
43
|
+
* export default bootstrap([modules]);
|
|
44
|
+
*
|
|
45
|
+
* Note: modules will be loaded/created for each request so it's important that module instances passed
|
|
46
|
+
* into the bootstrap function not maintain state.
|
|
47
|
+
*/
|
|
48
|
+
export declare function bootstrap(modules: ModuleInstanceOrConstructor[], builder?: IVueSSRRenderHandlerBuilder): IVueSSRRenderHandler;
|
|
49
|
+
/** Vue module for server side rendered components. */
|
|
50
|
+
export declare class VueServerModule implements IModule {
|
|
51
|
+
private services?;
|
|
52
|
+
private component?;
|
|
53
|
+
private mountOptions?;
|
|
54
|
+
readonly name = "vue-server";
|
|
55
|
+
readonly dependencies: (typeof ModelModule | typeof VueModule)[];
|
|
56
|
+
initialize(init: IModuleInitializer): void;
|
|
57
|
+
configureServices(registration: IServiceRegistration): void;
|
|
58
|
+
createApp(): IVueSSRCreateResult;
|
|
59
|
+
private getComponentOptions;
|
|
60
|
+
private getData;
|
|
61
|
+
}
|
package/dist/module.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
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.VueServerModule = exports.bootstrap = 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 vue_2 = require("@shrub/vue");
|
|
11
|
+
const model_service_1 = require("./model-service");
|
|
12
|
+
/**
|
|
13
|
+
* Loads the specified modules (along with the VueServerModule) and returns a Vue SSR render handler.
|
|
14
|
+
* Example usage in the server entry file:
|
|
15
|
+
*
|
|
16
|
+
* export default bootstrap([modules]);
|
|
17
|
+
*
|
|
18
|
+
* Note: modules will be loaded/created for each request so it's important that module instances passed
|
|
19
|
+
* into the bootstrap function not maintain state.
|
|
20
|
+
*/
|
|
21
|
+
function bootstrap(modules, builder) {
|
|
22
|
+
modules = [...modules, VueServerModule];
|
|
23
|
+
return async (context) => {
|
|
24
|
+
// modules are loaded asynchronously so wait for them to finish loading and grab the modules collection
|
|
25
|
+
const collection = await core_1.ModuleLoader.load({ modules, settings: context.settings });
|
|
26
|
+
if (context.models) {
|
|
27
|
+
// inject the model objects so that they are available when rendering server-side
|
|
28
|
+
const service = collection.services.get(model_1.IModelService);
|
|
29
|
+
for (const key in context.models) {
|
|
30
|
+
service.set(key, context.models[key]);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (context.beginRender) {
|
|
34
|
+
// this allows server components the ability to configure the service collection before rendering it server-side
|
|
35
|
+
// the services collection captured/used by the current module is the same one passed into the component when rendered
|
|
36
|
+
await context.beginRender(collection.services);
|
|
37
|
+
}
|
|
38
|
+
const instance = collection.getInstance(VueServerModule);
|
|
39
|
+
let { app, router } = instance.createApp();
|
|
40
|
+
context.rendered = () => {
|
|
41
|
+
// if model state has been captured during SSR set it as the context so it can be loaded client side
|
|
42
|
+
const modelService = app.$services.get(model_1.IModelService);
|
|
43
|
+
if (modelService.hasModels) {
|
|
44
|
+
// by setting context.state Vue will inline a global __INITIAL_STATE__ variable
|
|
45
|
+
// https://ssr.vuejs.org/api/#template
|
|
46
|
+
context.state = modelService.serialize();
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
// if a 'builder' is provided invoke it now to allow extending the Vue app instance
|
|
50
|
+
app = builder ? await builder(context, app) : app;
|
|
51
|
+
if (router && context.url) {
|
|
52
|
+
// if a router and request url are avaiable update the router to use the request url as its route location
|
|
53
|
+
router.push(context.url);
|
|
54
|
+
// wait until the router has resolved
|
|
55
|
+
return new Promise((resolve, reject) => router.onReady(() => {
|
|
56
|
+
if (!router.getMatchedComponents().length) {
|
|
57
|
+
// no routes matched the request url so reject with a 404
|
|
58
|
+
return reject({ code: 404 });
|
|
59
|
+
}
|
|
60
|
+
resolve(app);
|
|
61
|
+
}, reject));
|
|
62
|
+
}
|
|
63
|
+
return app;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
exports.bootstrap = bootstrap;
|
|
67
|
+
/** Vue module for server side rendered components. */
|
|
68
|
+
class VueServerModule {
|
|
69
|
+
constructor() {
|
|
70
|
+
this.name = "vue-server";
|
|
71
|
+
this.dependencies = [
|
|
72
|
+
model_1.ModelModule,
|
|
73
|
+
vue_2.VueModule
|
|
74
|
+
];
|
|
75
|
+
}
|
|
76
|
+
initialize(init) {
|
|
77
|
+
// override the vue configuration to prevent mounting to an html element
|
|
78
|
+
init.config(vue_2.IVueConfiguration).register(({ services }) => ({
|
|
79
|
+
mount: (component, options) => {
|
|
80
|
+
if (this.component) {
|
|
81
|
+
throw new Error("A Vue component has already been mounted.");
|
|
82
|
+
}
|
|
83
|
+
this.services = services;
|
|
84
|
+
this.component = component;
|
|
85
|
+
this.mountOptions = options;
|
|
86
|
+
}
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
configureServices(registration) {
|
|
90
|
+
registration.register(model_1.IModelService, model_service_1.ServerModelService);
|
|
91
|
+
}
|
|
92
|
+
createApp() {
|
|
93
|
+
if (!this.component) {
|
|
94
|
+
throw new Error("Vue component has not been mounted.");
|
|
95
|
+
}
|
|
96
|
+
const options = this.getComponentOptions();
|
|
97
|
+
const app = new vue_1.default({
|
|
98
|
+
services: this.services,
|
|
99
|
+
render: h => h(this.component, this.getData()),
|
|
100
|
+
...options
|
|
101
|
+
});
|
|
102
|
+
return { app, router: options.router };
|
|
103
|
+
}
|
|
104
|
+
getComponentOptions() {
|
|
105
|
+
if (this.mountOptions && this.mountOptions.options) {
|
|
106
|
+
return typeof this.mountOptions.options === "function"
|
|
107
|
+
? this.mountOptions.options()
|
|
108
|
+
: this.mountOptions.options;
|
|
109
|
+
}
|
|
110
|
+
return {};
|
|
111
|
+
}
|
|
112
|
+
getData() {
|
|
113
|
+
if (this.mountOptions && this.mountOptions.data) {
|
|
114
|
+
return typeof this.mountOptions.data === "function"
|
|
115
|
+
? this.mountOptions.data()
|
|
116
|
+
: this.mountOptions.data;
|
|
117
|
+
}
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
exports.VueServerModule = VueServerModule;
|
|
122
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4Q0FBdUQ7QUFFdkQsc0NBQStMO0FBQy9MLHdDQUEwRDtBQUMxRCxvQ0FBNEU7QUFDNUUsbURBQXFEO0FBcUNyRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxPQUFzQyxFQUFFLE9BQXFDO0lBQ25HLE9BQU8sR0FBRyxDQUFDLEdBQUcsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sS0FBSyxFQUFDLE9BQU8sRUFBQyxFQUFFO1FBQ25CLHVHQUF1RztRQUN2RyxNQUFNLFVBQVUsR0FBRyxNQUFNLG1CQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUVwRixJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDaEIsaUZBQWlGO1lBQ2pGLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLHFCQUFhLENBQUMsQ0FBQztZQUN2RCxLQUFLLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7Z0JBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUN6QztTQUNKO1FBRUQsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFO1lBQ3JCLGdIQUFnSDtZQUNoSCxzSEFBc0g7WUFDdEgsTUFBTSxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNsRDtRQUVELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDekQsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMs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
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@shrub/vue-server",
|
|
3
|
+
"description": "A module that extends the Vue module for server-side rendering support.",
|
|
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
|
+
"engines": {
|
|
20
|
+
"node": ">=10.18.0"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc -b .",
|
|
24
|
+
"build:esm": "tsc -p tsconfig.esm.json",
|
|
25
|
+
"clean": "rimraf ./dist && rimraf tsconfig.tsbuildinfo",
|
|
26
|
+
"watch": "tsc -b . -w"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"vue": "^2.6.10",
|
|
30
|
+
"vue-router": "^3.1.3",
|
|
31
|
+
"vue-server-renderer": "^2.6.10"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@shrub/core": "0.5.26",
|
|
35
|
+
"@shrub/model": "0.5.26",
|
|
36
|
+
"@shrub/vue": "0.5.26",
|
|
37
|
+
"@sprig/serialization": "0.1.69"
|
|
38
|
+
},
|
|
39
|
+
"gitHead": "bd8e68fee891bb035f6506401851cf993c1c614e"
|
|
40
|
+
}
|