@primate/vue 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,5 @@
1
1
  # Vue
2
2
 
3
- This handler module supports SSR and serves Vue SFC components with the .vue
4
- extension.
3
+ This handler serves Vue (SFC) components with the `vue` file extension.
5
4
 
6
5
  ## [Documentation](https://primatejs.com/modules/vue)
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@primate/vue",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Primate Vue module",
5
5
  "homepage": "https://primatejs.com/modules/vue",
6
6
  "bugs": "https://github.com/primatejs/primate/issues",
7
7
  "license": "MIT",
8
8
  "files": [
9
9
  "src/**/*.js",
10
+ "src/errors.json",
10
11
  "!src/**/*.spec.js"
11
12
  ],
12
13
  "repository": {
@@ -15,11 +16,12 @@
15
16
  "directory": "packages/vue"
16
17
  },
17
18
  "dependencies": {
18
- "runtime-compat": "^0.24.1",
19
+ "@primate/frontend": "^0.2.0",
20
+ "runtime-compat": "^0.25.7",
19
21
  "vue": "^3.3.4"
20
22
  },
21
23
  "peerDependencies": {
22
- "primate": "0.21"
24
+ "primate": "0.22"
23
25
  },
24
26
  "type": "module",
25
27
  "main": "./src/exports.js"
package/src/errors.js ADDED
@@ -0,0 +1,6 @@
1
+ import {Path} from "runtime-compat/fs";
2
+ import {Logger} from "primate";
3
+
4
+ const json = await new Path(import.meta.url).up(1).join("errors.json").json();
5
+
6
+ export default Logger.err(json.errors, json.module);
@@ -0,0 +1,10 @@
1
+ {
2
+ "module": "primate/vue",
3
+ "errors": {
4
+ "MissingComponent": {
5
+ "message": "missing component {0}",
6
+ "fix": "create {1} or remove route function",
7
+ "level": "Error"
8
+ }
9
+ }
10
+ }
package/src/module.js CHANGED
@@ -1,43 +1,56 @@
1
1
  import {Response, Status, MediaType} from "runtime-compat/http";
2
+ import * as base from "@primate/frontend";
2
3
  import {createSSRApp} from "vue";
3
4
  import {renderToString} from "vue/server-renderer";
4
- import {parse} from "vue/compiler-sfc";
5
+ import {parse, compileTemplate} from "vue/compiler-sfc";
5
6
 
6
- const render = (template, props) => {
7
- const app = createSSRApp({data: () => props, template});
8
- return renderToString(app);
9
- };
7
+ const handler = config => (name, props = {}, {status = Status.OK, page} = {}) =>
8
+ async app => {
9
+ const {make} = config;
10
10
 
11
- const handler = (name, props = {}, {status = Status.OK} = {}) => async app => {
12
- const {build, config} = app;
13
- const target = build.paths.server.join(config.build.app).join(`${name}.js`);
14
- const body = await render(await target.text(), props);
11
+ const imported = await make(name, props);
12
+ const component = createSSRApp({
13
+ render: imported.component.render,
14
+ data: () => props,
15
+ });
16
+ const body = await renderToString(component);
15
17
 
16
- return new Response(await app.render({body}), {
17
- status,
18
- headers: {...app.headers(), "Content-Type": MediaType.TEXT_HTML},
19
- });
20
- };
18
+ return new Response(await app.render({body, page}), {
19
+ status,
20
+ headers: {...app.headers(), "Content-Type": MediaType.TEXT_HTML},
21
+ });
22
+ };
23
+
24
+ export default ({
25
+ directory,
26
+ dynamicProps,
27
+ extension = "vue",
28
+ } = {}) => {
29
+ const rootname = "vue";
21
30
 
22
- export default _ => ({
23
- name: "@primate/vue",
24
- register(app, next) {
25
- app.register("vue", handler);
26
- return next(app);
27
- },
28
- async compile(app, next) {
29
- const source = app.build.paths.components;
30
- const target = app.build.paths.server.join(app.config.build.app);
31
- await target.file.create();
32
- const vue = ".vue";
33
- const components = await source.list(filename => filename.endsWith(vue));
34
- await Promise.all(components.map(async component => {
35
- const file = await component.file.read();
36
- const {descriptor} = parse(file);
37
- const to = target.join(`${component.path}.js`.replace(source, ""));
38
- await to.file.write(descriptor.template.content);
39
- }));
31
+ return {
32
+ name: "primate:vue",
33
+ register(app, next) {
34
+ app.register(extension, handler(base.register({app, rootname})));
40
35
 
41
- return next(app);
42
- },
43
- });
36
+ return next(app);
37
+ },
38
+ async compile(app, next) {
39
+ await base.compile({
40
+ app,
41
+ directory: directory ?? app.config.location.components,
42
+ extension,
43
+ rootname,
44
+ dynamicProps,
45
+ compile(file) {
46
+ return compileTemplate({
47
+ source: parse(file).descriptor.template.content,
48
+ id: "1",
49
+ }).code;
50
+ },
51
+ });
52
+
53
+ return next(app);
54
+ },
55
+ };
56
+ };