@vitella-ssr/pinia 0.1.0 → 0.1.2

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,2 +1,34 @@
1
1
  # @vitella-ssr/pinia
2
- This is a plugin for Vitella that enables the use of pinia as part of a Vitella SSR application
2
+
3
+ Pinia adapter for Vitella. Extends the Vue adapter with per-request Pinia state creation, automatic serialization of store state into `window.__INITIAL_STATE__`, and client-side hydration.
4
+
5
+ ```ts
6
+ // vitella.config.ts
7
+ import { vitellaPlugin } from '@vitella-ssr/core'
8
+ import { piniaVueAdapter } from '@vitella-ssr/pinia'
9
+
10
+ export default {
11
+ plugins: [vitellaPlugin({
12
+ appShell: 'src/app.html',
13
+ adapter: piniaVueAdapter,
14
+ })],
15
+ }
16
+ ```
17
+
18
+ ```ts
19
+ // src/stores/counter.ts
20
+ import { defineStore } from 'pinia'
21
+
22
+ export const useCounterStore = defineStore('counter', {
23
+ state: () => ({ count: 0 }),
24
+ })
25
+ ```
26
+
27
+ ```vue
28
+ <!-- src/pages/index.vue -->
29
+ <script setup>
30
+ import { useCounterStore } from '../stores/counter'
31
+ const counter = useCounterStore()
32
+ counter.count++ // persisted and hydrated automatically
33
+ </script>
34
+ ```
@@ -0,0 +1,3 @@
1
+ import type { Adapter } from '@vitella-ssr/core';
2
+ export declare const piniaVueAdapter: Adapter;
3
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAQhD,eAAO,MAAM,eAAe,EAAE,OAwF7B,CAAA"}
@@ -0,0 +1,82 @@
1
+ import { vueAdapter } from '@vitella-ssr/vue';
2
+ import { createPiniaSSR } from './server.js';
3
+ function escapeHtml(s) {
4
+ return s.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
5
+ }
6
+ export const piniaVueAdapter = {
7
+ ...vueAdapter,
8
+ name: 'pinia-vue',
9
+ render: async ({ component, loadData, layout }) => {
10
+ const { createSSRApp, h } = await import('vue');
11
+ const { renderToString } = await import('vue/server-renderer');
12
+ const ssrContext = {};
13
+ const { pinia, serialize } = createPiniaSSR();
14
+ const app = createSSRApp({
15
+ render() {
16
+ if (layout) {
17
+ return h(layout, null, {
18
+ default: () => h(component, loadData),
19
+ });
20
+ }
21
+ return h(component, loadData);
22
+ },
23
+ });
24
+ app.use(pinia);
25
+ const html = await renderToString(app, ssrContext);
26
+ const piniaState = serialize();
27
+ if (Object.keys(piniaState).length > 0) {
28
+ loadData.pinia = piniaState;
29
+ }
30
+ const headData = ssrContext.head;
31
+ if (!headData)
32
+ return html;
33
+ let head = '';
34
+ if (headData.meta) {
35
+ head += headData.meta
36
+ .map((m) => `<meta${m.charset ? ` charset="${escapeHtml(m.charset)}"` : ''}${m.name ? ` name="${escapeHtml(m.name)}"` : ''}${m.property ? ` property="${escapeHtml(m.property)}"` : ''}${m.content ? ` content="${escapeHtml(m.content)}"` : ''}>`)
37
+ .join('\n ');
38
+ }
39
+ if (headData.link) {
40
+ head += headData.link
41
+ .map((l) => `<link rel="${escapeHtml(l.rel)}" href="${escapeHtml(l.href)}">`)
42
+ .join('\n ');
43
+ }
44
+ return {
45
+ html,
46
+ title: headData.title,
47
+ head: head || undefined,
48
+ };
49
+ },
50
+ getClientEntry(page, pagePath, layout) {
51
+ if (!/^[a-zA-Z0-9_./@[\]-]+$/.test(pagePath)) {
52
+ throw new Error(`Invalid pagePath: ${pagePath}`);
53
+ }
54
+ if (layout && !/^[a-zA-Z0-9_./@[\]-]+$/.test(layout)) {
55
+ throw new Error(`Invalid layout: ${layout}`);
56
+ }
57
+ if (layout) {
58
+ return [
59
+ `import { createSSRApp, h } from 'vue'`,
60
+ `import { hydratePinia } from '@vitella-ssr/pinia'`,
61
+ `import Layout from ${JSON.stringify(layout)}`,
62
+ `import Page from ${JSON.stringify(pagePath)}`,
63
+ `const __initState = typeof window !== 'undefined' ? window.__INITIAL_STATE__ || {} : {}`,
64
+ `const pinia = hydratePinia()`,
65
+ `const app = createSSRApp({ render() { return h(Layout, null, { default: () => h(Page, __initState) }) } })`,
66
+ `app.use(pinia)`,
67
+ `app.mount('#app')`,
68
+ ].join('\n');
69
+ }
70
+ return [
71
+ `import { createSSRApp } from 'vue'`,
72
+ `import { hydratePinia } from '@vitella-ssr/pinia'`,
73
+ `import Page from ${JSON.stringify(pagePath)}`,
74
+ `const __initState = typeof window !== 'undefined' ? window.__INITIAL_STATE__ || {} : {}`,
75
+ `const pinia = hydratePinia()`,
76
+ `const app = createSSRApp(Page, __initState)`,
77
+ `app.use(pinia)`,
78
+ `app.mount('#app')`,
79
+ ].join('\n');
80
+ },
81
+ };
82
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,OAAO,CAAA;AAEnD,wBAAgB,YAAY,IAAI,UAAU,CAAC,OAAO,WAAW,CAAC,CAW7D"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,OAAO,CAAA;AAEnD,wBAAgB,YAAY,IAAI,UAAU,CAAC,OAAO,WAAW,CAAC,CAY7D"}
package/dist/client.js CHANGED
@@ -4,6 +4,8 @@ export function hydratePinia() {
4
4
  if (typeof window !== 'undefined' && window.__INITIAL_STATE__?.pinia) {
5
5
  const state = window.__INITIAL_STATE__.pinia;
6
6
  for (const [key, value] of Object.entries(state)) {
7
+ if (key === '__proto__' || key === 'constructor')
8
+ continue;
7
9
  pinia.state.value[key] = value;
8
10
  }
9
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,OAAO,CAAA;AAEnD,MAAM,UAAU,YAAY;IAC1B,MAAM,KAAK,GAAG,WAAW,EAAE,CAAA;IAE3B,IAAI,OAAO,MAAM,KAAK,WAAW,IAAK,MAAc,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC;QAC9E,MAAM,KAAK,GAAI,MAAc,CAAC,iBAAiB,CAAC,KAAkC,CAAA;QAClF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QAChC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,OAAO,CAAA;AAEnD,MAAM,UAAU,YAAY;IAC1B,MAAM,KAAK,GAAG,WAAW,EAAE,CAAA;IAE3B,IAAI,OAAO,MAAM,KAAK,WAAW,IAAK,MAAc,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC;QAC9E,MAAM,KAAK,GAAI,MAAc,CAAC,iBAAiB,CAAC,KAAkC,CAAA;QAClF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,aAAa;gBAAE,SAAQ;YAC1D,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QAChC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export { createPiniaSSR } from './server.js';
2
2
  export { hydratePinia } from './client.js';
3
+ export { piniaVueAdapter } from './adapter.js';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export { createPiniaSSR } from './server.js';
2
2
  export { hydratePinia } from './client.js';
3
+ export { piniaVueAdapter } from './adapter.js';
3
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vitella-ssr/pinia",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "A plugin to support Pinia in Vitella",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",