@bagelink/blox 1.13.4 → 1.14.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.
Files changed (47) hide show
  1. package/dist/CmsPageView.vue.d.ts.map +1 -1
  2. package/dist/PreviewApp-BrthGx2F.js +4 -0
  3. package/dist/PreviewApp-CV_Uh9-d.cjs +4 -0
  4. package/dist/PreviewApp.vue.d.ts.map +1 -1
  5. package/dist/PreviewApp.vue_vue_type_style_index_0_lang-BkGWMbsE.js +185 -0
  6. package/dist/PreviewApp.vue_vue_type_style_index_0_lang-CFS05Itn.cjs +184 -0
  7. package/dist/PreviewRenderer.d.ts.map +1 -1
  8. package/dist/bridge.d.ts +1 -0
  9. package/dist/bridge.d.ts.map +1 -1
  10. package/dist/core-CPXNfJ-Z.js +460 -0
  11. package/dist/core-D1FiZJtz.cjs +459 -0
  12. package/dist/core.d.ts.map +1 -1
  13. package/dist/createBloxApp.d.ts +107 -0
  14. package/dist/createBloxApp.d.ts.map +1 -0
  15. package/dist/defineBlock.d.ts +19 -4
  16. package/dist/defineBlock.d.ts.map +1 -1
  17. package/dist/index.cjs +87 -604
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.mjs +86 -602
  21. package/dist/{prerender-CjJwDXkC.cjs → prerender-Bi7YtzSp.cjs} +48 -46
  22. package/dist/{prerender-oMLxrKGs.js → prerender-D3Q4jKXm.js} +51 -49
  23. package/dist/schema.d.ts +2 -0
  24. package/dist/schema.d.ts.map +1 -1
  25. package/dist/ssg/cli.cjs +17 -5
  26. package/dist/ssg/cli.mjs +17 -5
  27. package/dist/ssg/client.cjs +9 -7
  28. package/dist/ssg/client.d.ts +1 -1
  29. package/dist/ssg/client.d.ts.map +1 -1
  30. package/dist/ssg/client.mjs +3 -1
  31. package/dist/ssg/createSSREntry.d.ts +73 -0
  32. package/dist/ssg/createSSREntry.d.ts.map +1 -0
  33. package/dist/ssg/index.cjs +116 -8
  34. package/dist/ssg/index.d.ts +2 -0
  35. package/dist/ssg/index.d.ts.map +1 -1
  36. package/dist/ssg/index.mjs +93 -6
  37. package/dist/ssg/prerender.d.ts.map +1 -1
  38. package/dist/style.css +5 -46
  39. package/dist/vite-plugin.cjs +142 -3
  40. package/dist/vite-plugin.d.ts +22 -21
  41. package/dist/vite-plugin.d.ts.map +1 -1
  42. package/dist/vite-plugin.mjs +142 -3
  43. package/package.json +4 -1
  44. package/dist/PreviewApp-BZNzZkit.js +0 -4
  45. package/dist/PreviewApp-C1WvJWI4.cjs +0 -4
  46. package/dist/constants-BjitNk-W.js +0 -8
  47. package/dist/constants-CFB_pMvT.cjs +0 -7
@@ -1,15 +1,39 @@
1
1
  "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (let key of __getOwnPropNames(from))
11
+ if (!__hasOwnProp.call(to, key) && key !== except)
12
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
+ }
14
+ return to;
15
+ };
16
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
+ // If the importer is in node compatibility mode or this is not an ESM
18
+ // file that has been converted to a CommonJS file using a Babel-
19
+ // compatible transform (i.e. "__esModule" has not been set), then set
20
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
+ mod
23
+ ));
2
24
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const prerender = require("../prerender-CjJwDXkC.cjs");
25
+ const prerender = require("../prerender-Bi7YtzSp.cjs");
4
26
  const ssg_client = require("./client.cjs");
5
- const constants = require("../constants-CFB_pMvT.cjs");
27
+ const pinia = require("pinia");
28
+ const vue = require("vue");
29
+ const core = require("../core-D1FiZJtz.cjs");
6
30
  async function renderBloxSsgPage(options) {
7
31
  const {
8
32
  url,
9
33
  resolvedData,
10
34
  renderToString,
11
35
  createAppForUrl,
12
- stateWindowKey = constants.BLOX_STATE_WINDOW_KEY,
36
+ stateWindowKey = ssg_client.BLOX_STATE_WINDOW_KEY,
13
37
  website = null,
14
38
  websiteId = "",
15
39
  collections
@@ -25,8 +49,8 @@ async function renderBloxSsgPage(options) {
25
49
  await router.isReady();
26
50
  const html = await renderToString(app);
27
51
  const stateScript = resolvedData != null ? `<script>window[${JSON.stringify(stateWindowKey)}]=${JSON.stringify({ [url]: resolvedData })};${"<"}/script>` : "";
28
- const collectionsScript = collections && Object.keys(collections).length > 0 ? `<script>window[${JSON.stringify(constants.BLOX_COLLECTIONS_WINDOW_KEY)}]=${JSON.stringify(collections)};${"<"}/script>` : "";
29
- const websiteIdScript = websiteId ? `<script>window[${JSON.stringify(constants.BLOX_WEBSITE_ID_WINDOW_KEY)}]=${JSON.stringify(websiteId)};${"<"}/script>` : "";
52
+ const collectionsScript = collections && Object.keys(collections).length > 0 ? `<script>window[${JSON.stringify(ssg_client.BLOX_COLLECTIONS_WINDOW_KEY)}]=${JSON.stringify(collections)};${"<"}/script>` : "";
53
+ const websiteIdScript = websiteId ? `<script>window[${JSON.stringify(ssg_client.BLOX_WEBSITE_ID_WINDOW_KEY)}]=${JSON.stringify(websiteId)};${"<"}/script>` : "";
30
54
  const head = prerender.buildPageHead({
31
55
  url,
32
56
  resolvedData,
@@ -44,6 +68,89 @@ async function renderBloxSsgPage(options) {
44
68
  }
45
69
  }
46
70
  }
71
+ let _websiteId = null;
72
+ function createBloxSSREntry(options) {
73
+ var _a;
74
+ const {
75
+ rootComponent,
76
+ createRouter,
77
+ modules,
78
+ websiteName,
79
+ store,
80
+ locale = "en",
81
+ supportedLocales = [locale],
82
+ plugins = [],
83
+ globalComponents = {}
84
+ } = options;
85
+ const apiBase = options.apiBase ?? (typeof process !== "undefined" ? (_a = process.env) == null ? void 0 : _a.BAGELINK_API_URL : void 0) ?? "https://api.bagel.to";
86
+ async function getWebsiteId() {
87
+ if (_websiteId) return _websiteId;
88
+ const res = await fetch(`${apiBase}/cms/websites`);
89
+ const data = await res.json();
90
+ const sites = Array.isArray(data) ? data : (data == null ? void 0 : data.data) ?? [];
91
+ const site = sites.find((s) => s.name === websiteName);
92
+ if (!(site == null ? void 0 : site.id)) throw new Error(`Website "${websiteName}" not found`);
93
+ _websiteId = site.id;
94
+ return _websiteId;
95
+ }
96
+ async function fetchResolvedPage(urlPath) {
97
+ const websiteId = await getWebsiteId();
98
+ const url = `${apiBase}/cms/websites/${websiteId}/resolve-path?path=${encodeURIComponent(urlPath)}&locale=${locale}`;
99
+ const res = await fetch(url);
100
+ if (!res.ok) throw new Error(`resolve-path ${res.status}: ${urlPath}`);
101
+ return res.json();
102
+ }
103
+ function buildApp(url) {
104
+ const router = createRouter("memory", url);
105
+ const app = vue.createSSRApp(rootComponent);
106
+ const pinia$1 = pinia.createPinia();
107
+ pinia$1.use(({ store: s }) => {
108
+ s.router = vue.markRaw(router);
109
+ });
110
+ const blox = core.createBlox({
111
+ modules,
112
+ websiteName,
113
+ store,
114
+ defaultLocale: locale,
115
+ supportedLocales,
116
+ router
117
+ });
118
+ for (const plugin of plugins) {
119
+ if (Array.isArray(plugin)) {
120
+ const [p, ...args] = plugin;
121
+ app.use(p, ...args);
122
+ } else {
123
+ app.use(plugin);
124
+ }
125
+ }
126
+ blox.install(app, {});
127
+ app.use(pinia$1);
128
+ app.use(router);
129
+ for (const [name, comp] of Object.entries(globalComponents)) {
130
+ app.component(name, comp);
131
+ }
132
+ return { app, router };
133
+ }
134
+ async function render(url, ctx) {
135
+ let resolvedData = null;
136
+ try {
137
+ resolvedData = await fetchResolvedPage(url);
138
+ } catch (e) {
139
+ console.warn(`[prerender] Could not resolve: ${url} — ${e.message}`);
140
+ }
141
+ const { renderToString } = await import("vue/server-renderer");
142
+ return renderBloxSsgPage({
143
+ url,
144
+ resolvedData,
145
+ renderToString,
146
+ createAppForUrl: buildApp,
147
+ website: ctx.website,
148
+ websiteId: ctx.websiteId,
149
+ collections: ctx.collections
150
+ });
151
+ }
152
+ return { render };
153
+ }
47
154
  exports.buildPageHead = prerender.buildPageHead;
48
155
  exports.buildSiteHead = prerender.buildSiteHead;
49
156
  exports.fetchCmsPrerenderPaths = prerender.fetchCmsPrerenderPaths;
@@ -53,11 +160,12 @@ exports.generateRobotsTxt = prerender.generateRobotsTxt;
53
160
  exports.generateSitemapXml = prerender.generateSitemapXml;
54
161
  exports.polyfillBloxSsgGlobals = prerender.polyfillBloxSsgGlobals;
55
162
  exports.prerender = prerender.prerender;
163
+ exports.BLOX_COLLECTIONS_WINDOW_KEY = ssg_client.BLOX_COLLECTIONS_WINDOW_KEY;
164
+ exports.BLOX_STATE_WINDOW_KEY = ssg_client.BLOX_STATE_WINDOW_KEY;
165
+ exports.BLOX_WEBSITE_ID_WINDOW_KEY = ssg_client.BLOX_WEBSITE_ID_WINDOW_KEY;
56
166
  exports.getCollectionCache = ssg_client.getCollectionCache;
57
167
  exports.getEmbeddedWebsiteId = ssg_client.getEmbeddedWebsiteId;
58
168
  exports.installBloxStateCache = ssg_client.installBloxStateCache;
59
169
  exports.installCollectionCache = ssg_client.installCollectionCache;
60
- exports.BLOX_COLLECTIONS_WINDOW_KEY = constants.BLOX_COLLECTIONS_WINDOW_KEY;
61
- exports.BLOX_STATE_WINDOW_KEY = constants.BLOX_STATE_WINDOW_KEY;
62
- exports.BLOX_WEBSITE_ID_WINDOW_KEY = constants.BLOX_WEBSITE_ID_WINDOW_KEY;
170
+ exports.createBloxSSREntry = createBloxSSREntry;
63
171
  exports.renderBloxSsgPage = renderBloxSsgPage;
@@ -13,6 +13,8 @@ export { getCollectionCache, getEmbeddedWebsiteId, installCollectionCache } from
13
13
  * - SEO asset generation (sitemap.xml, robots.txt, _redirects)
14
14
  */
15
15
  export { BLOX_COLLECTIONS_WINDOW_KEY, BLOX_STATE_WINDOW_KEY, BLOX_WEBSITE_ID_WINDOW_KEY } from './constants';
16
+ export { createBloxSSREntry } from './createSSREntry';
17
+ export type { BloxSSREntry, CreateBloxSSREntryOptions } from './createSSREntry';
16
18
  export { polyfillBloxSsgGlobals } from './polyfill-node';
17
19
  export { prerender } from './prerender';
18
20
  export type { PrerenderOptions, PrerenderResult, RenderContext, RenderResult } from './prerender';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ssg/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACvE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AACrG;;;;;;;;;;GAUG;AACH,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAA;AAC5G,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACjG,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAA;AACrH,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ssg/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACvE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AACrG;;;;;;;;;;GAUG;AACH,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAA;AAC5G,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,YAAY,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAA;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACjG,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAA;AACrH,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA"}
@@ -1,7 +1,10 @@
1
- import { b as buildPageHead } from "../prerender-oMLxrKGs.js";
2
- import { d, f, a, g, e, h, p, c } from "../prerender-oMLxrKGs.js";
1
+ import { b as buildPageHead } from "../prerender-D3Q4jKXm.js";
2
+ import { d, c, f, g, e, h, p, a } from "../prerender-D3Q4jKXm.js";
3
+ import { BLOX_STATE_WINDOW_KEY, BLOX_COLLECTIONS_WINDOW_KEY, BLOX_WEBSITE_ID_WINDOW_KEY } from "./client.mjs";
3
4
  import { getCollectionCache, getEmbeddedWebsiteId, installBloxStateCache, installCollectionCache } from "./client.mjs";
4
- import { B as BLOX_STATE_WINDOW_KEY, a as BLOX_COLLECTIONS_WINDOW_KEY, b as BLOX_WEBSITE_ID_WINDOW_KEY } from "../constants-BjitNk-W.js";
5
+ import { createPinia } from "pinia";
6
+ import { createSSRApp, markRaw } from "vue";
7
+ import { c as createBlox } from "../core-CPXNfJ-Z.js";
5
8
  async function renderBloxSsgPage(options) {
6
9
  const {
7
10
  url,
@@ -43,14 +46,98 @@ async function renderBloxSsgPage(options) {
43
46
  }
44
47
  }
45
48
  }
49
+ let _websiteId = null;
50
+ function createBloxSSREntry(options) {
51
+ var _a;
52
+ const {
53
+ rootComponent,
54
+ createRouter,
55
+ modules,
56
+ websiteName,
57
+ store,
58
+ locale = "en",
59
+ supportedLocales = [locale],
60
+ plugins = [],
61
+ globalComponents = {}
62
+ } = options;
63
+ const apiBase = options.apiBase ?? (typeof process !== "undefined" ? (_a = process.env) == null ? void 0 : _a.BAGELINK_API_URL : void 0) ?? "https://api.bagel.to";
64
+ async function getWebsiteId() {
65
+ if (_websiteId) return _websiteId;
66
+ const res = await fetch(`${apiBase}/cms/websites`);
67
+ const data = await res.json();
68
+ const sites = Array.isArray(data) ? data : (data == null ? void 0 : data.data) ?? [];
69
+ const site = sites.find((s) => s.name === websiteName);
70
+ if (!(site == null ? void 0 : site.id)) throw new Error(`Website "${websiteName}" not found`);
71
+ _websiteId = site.id;
72
+ return _websiteId;
73
+ }
74
+ async function fetchResolvedPage(urlPath) {
75
+ const websiteId = await getWebsiteId();
76
+ const url = `${apiBase}/cms/websites/${websiteId}/resolve-path?path=${encodeURIComponent(urlPath)}&locale=${locale}`;
77
+ const res = await fetch(url);
78
+ if (!res.ok) throw new Error(`resolve-path ${res.status}: ${urlPath}`);
79
+ return res.json();
80
+ }
81
+ function buildApp(url) {
82
+ const router = createRouter("memory", url);
83
+ const app = createSSRApp(rootComponent);
84
+ const pinia = createPinia();
85
+ pinia.use(({ store: s }) => {
86
+ s.router = markRaw(router);
87
+ });
88
+ const blox = createBlox({
89
+ modules,
90
+ websiteName,
91
+ store,
92
+ defaultLocale: locale,
93
+ supportedLocales,
94
+ router
95
+ });
96
+ for (const plugin of plugins) {
97
+ if (Array.isArray(plugin)) {
98
+ const [p2, ...args] = plugin;
99
+ app.use(p2, ...args);
100
+ } else {
101
+ app.use(plugin);
102
+ }
103
+ }
104
+ blox.install(app, {});
105
+ app.use(pinia);
106
+ app.use(router);
107
+ for (const [name, comp] of Object.entries(globalComponents)) {
108
+ app.component(name, comp);
109
+ }
110
+ return { app, router };
111
+ }
112
+ async function render(url, ctx) {
113
+ let resolvedData = null;
114
+ try {
115
+ resolvedData = await fetchResolvedPage(url);
116
+ } catch (e2) {
117
+ console.warn(`[prerender] Could not resolve: ${url} — ${e2.message}`);
118
+ }
119
+ const { renderToString } = await import("vue/server-renderer");
120
+ return renderBloxSsgPage({
121
+ url,
122
+ resolvedData,
123
+ renderToString,
124
+ createAppForUrl: buildApp,
125
+ website: ctx.website,
126
+ websiteId: ctx.websiteId,
127
+ collections: ctx.collections
128
+ });
129
+ }
130
+ return { render };
131
+ }
46
132
  export {
47
133
  BLOX_COLLECTIONS_WINDOW_KEY,
48
134
  BLOX_STATE_WINDOW_KEY,
49
135
  BLOX_WEBSITE_ID_WINDOW_KEY,
50
136
  buildPageHead,
51
137
  d as buildSiteHead,
52
- f as fetchCmsPrerenderPaths,
53
- a as fetchCmsSiteData,
138
+ createBloxSSREntry,
139
+ c as fetchCmsPrerenderPaths,
140
+ f as fetchCmsSiteData,
54
141
  g as generateNetlifyRedirects,
55
142
  e as generateRobotsTxt,
56
143
  h as generateSitemapXml,
@@ -59,6 +146,6 @@ export {
59
146
  installBloxStateCache,
60
147
  installCollectionCache,
61
148
  p as polyfillBloxSsgGlobals,
62
- c as prerender,
149
+ a as prerender,
63
150
  renderBloxSsgPage
64
151
  };
@@ -1 +1 @@
1
- {"version":3,"file":"prerender.d.ts","sourceRoot":"","sources":["../../src/ssg/prerender.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAS1C,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAA;AAEhE,MAAM,WAAW,gBAAgB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,YAAY,CAAC,EAAE,WAAW,GAAG,WAAW,EAAE,CAAA;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACrB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;IAC5B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kDAAkD;IAClD,SAAS,CAAC,EAAE,aAAa,EAAE,CAAA;IAC3B,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAA;IACzC,QAAQ,EAAE,MAAM,CAAA;IAChB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;IAC5B,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;CACf;AAMD,MAAM,WAAW,eAAe;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IAC7D,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;CACvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAAC,EAC/B,IAAoB,EACpB,YAA4B,EAC5B,WAA0C,EAC1C,KAAU,EACV,KAAY,EACZ,YAAiB,EACjB,QAAgB,EAChB,QAAe,EACf,IAAY,EACZ,OAAc,EACd,SAAc,EACd,SAAc,EACd,WAAgB,GAChB,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CA4HlD"}
1
+ {"version":3,"file":"prerender.d.ts","sourceRoot":"","sources":["../../src/ssg/prerender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAc1C,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAA;AAEhE,MAAM,WAAW,gBAAgB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,YAAY,CAAC,EAAE,WAAW,GAAG,WAAW,EAAE,CAAA;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACrB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;IAC5B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kDAAkD;IAClD,SAAS,CAAC,EAAE,aAAa,EAAE,CAAA;IAC3B,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAA;IACzC,QAAQ,EAAE,MAAM,CAAA;IAChB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;IAC5B,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;CACf;AAMD,MAAM,WAAW,eAAe;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IAC7D,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;CACvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAAC,EAC/B,IAAoB,EACpB,YAA4B,EAC5B,WAA0C,EAC1C,KAAU,EACV,KAAY,EACZ,YAAiB,EACjB,QAAgB,EAChB,QAAe,EACf,IAAY,EACZ,OAAc,EACd,SAAc,EACd,SAAc,EACd,WAAgB,GAChB,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CA4HlD"}
package/dist/style.css CHANGED
@@ -10,9 +10,11 @@
10
10
  animation: blox-nav-slide 1s ease-in-out infinite;
11
11
  }
12
12
  @keyframes blox-nav-slide {
13
- 0% { transform: translateX(-100%);
13
+ 0% {
14
+ transform: translateX(-100%);
14
15
  }
15
- 100% { transform: translateX(100%);
16
+ 100% {
17
+ transform: translateX(100%);
16
18
  }
17
19
  }
18
20
 
@@ -22,48 +24,5 @@
22
24
  body {
23
25
  margin: 0;
24
26
  }
25
- .blox-block-wrapper {
26
- position: relative;
27
- cursor: pointer;
28
- }
29
- .blox-block-overlay {
30
- position: absolute;
31
- inset: 0;
32
- z-index: 10;
33
- pointer-events: auto;
34
- transition:
35
- box-shadow 0.12s,
36
- background 0.12s;
37
- }
38
- .blox-block--hovered .blox-block-overlay {
39
- box-shadow: inset 0 0 0 2px rgba(99, 102, 241, 0.5);
40
- background: rgba(99, 102, 241, 0.04);
41
- }
42
- .blox-block--selected .blox-block-overlay {
43
- box-shadow: inset 0 0 0 3px #6366f1;
44
- background: rgba(99, 102, 241, 0.06);
45
- }
46
27
 
47
- /* Label badge */
48
- .blox-block-label {
49
- position: absolute;
50
- top: 0;
51
- left: 0;
52
- z-index: 20;
53
- padding: 2px 8px;
54
- font-size: 11px;
55
- font-family: system-ui, sans-serif;
56
- font-weight: 600;
57
- line-height: 20px;
58
- letter-spacing: 0.02em;
59
- text-transform: uppercase;
60
- color: #6366f1;
61
- background: rgba(99, 102, 241, 0.1);
62
- border-bottom-right-radius: 4px;
63
- pointer-events: none;
64
- white-space: nowrap;
65
- }
66
- .blox-block-label--selected {
67
- color: #fff;
68
- background: #6366f1;
69
- }
28
+ /* Block selection styles are applied via inline styles in PreviewRenderer */
@@ -1,5 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const node_module = require("node:module");
4
+ const path = require("node:path");
5
+ const process = require("node:process");
3
6
  var comma = ",".charCodeAt(0);
4
7
  var semicolon = ";".charCodeAt(0);
5
8
  var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
@@ -1069,8 +1072,143 @@ class MagicString {
1069
1072
  return this._replaceRegexp(searchValue, replacement);
1070
1073
  }
1071
1074
  }
1072
- function bloxPlugin() {
1073
- return {
1075
+ function bloxPlugin(options = {}) {
1076
+ const enableSSR = options.ssr ?? false;
1077
+ const plugins = [];
1078
+ if (enableSSR) {
1079
+ plugins.push({
1080
+ name: "vite-plugin-blox-ssr",
1081
+ enforce: "pre",
1082
+ config(_config, { command }) {
1083
+ const cwd = process.cwd();
1084
+ function resolveVuePaths() {
1085
+ const bases = [path.join(cwd, "..", "package.json"), path.join(cwd, "package.json")];
1086
+ for (const base of bases) {
1087
+ try {
1088
+ const req = node_module.createRequire(base);
1089
+ const vueEntry = req.resolve("vue");
1090
+ const vueDir = path.dirname(path.dirname(vueEntry));
1091
+ return {
1092
+ "vue": vueEntry,
1093
+ "vue/server-renderer": path.join(vueDir, "server-renderer", "index.mjs"),
1094
+ "@vue/server-renderer": req.resolve("@vue/server-renderer")
1095
+ };
1096
+ } catch {
1097
+ continue;
1098
+ }
1099
+ }
1100
+ return {};
1101
+ }
1102
+ const dedupe = [
1103
+ "vue",
1104
+ "vue-router",
1105
+ "@vue/runtime-core",
1106
+ "@vue/runtime-dom",
1107
+ "@vue/reactivity",
1108
+ "pinia"
1109
+ ];
1110
+ const alias = resolveVuePaths();
1111
+ const ssrConfig = {
1112
+ resolve: {
1113
+ dedupe,
1114
+ alias
1115
+ }
1116
+ };
1117
+ return ssrConfig;
1118
+ }
1119
+ });
1120
+ plugins.push({
1121
+ name: "vite-plugin-blox-ssr-build",
1122
+ enforce: "pre",
1123
+ config(config) {
1124
+ var _a, _b, _c, _d, _e, _f, _g;
1125
+ if ((_a = config.build) == null ? void 0 : _a.ssr) {
1126
+ return {
1127
+ build: {
1128
+ rollupOptions: {
1129
+ input: ((_c = (_b = config.build) == null ? void 0 : _b.rollupOptions) == null ? void 0 : _c.input) ?? "src/main.server.ts",
1130
+ output: ((_e = (_d = config.build) == null ? void 0 : _d.rollupOptions) == null ? void 0 : _e.output) ?? {
1131
+ dir: "dist/server",
1132
+ format: "esm"
1133
+ },
1134
+ external: [
1135
+ "vue",
1136
+ "vue-router",
1137
+ "vue/server-renderer",
1138
+ "@vue/server-renderer",
1139
+ ...Array.isArray((_g = (_f = config.build) == null ? void 0 : _f.rollupOptions) == null ? void 0 : _g.external) ? config.build.rollupOptions.external : []
1140
+ ]
1141
+ }
1142
+ }
1143
+ };
1144
+ }
1145
+ return {};
1146
+ }
1147
+ });
1148
+ }
1149
+ if (options.autoCollections ?? false) {
1150
+ const discoveredCollections = /* @__PURE__ */ new Map();
1151
+ const VIRTUAL_ID = "virtual:blox-collections";
1152
+ const RESOLVED_VIRTUAL_ID = `\0${VIRTUAL_ID}`;
1153
+ plugins.push({
1154
+ name: "vite-plugin-blox-collections",
1155
+ enforce: "pre",
1156
+ resolveId(id) {
1157
+ if (id === VIRTUAL_ID) return RESOLVED_VIRTUAL_ID;
1158
+ },
1159
+ load(id) {
1160
+ if (id === RESOLVED_VIRTUAL_ID) {
1161
+ const entries = [...discoveredCollections.values()];
1162
+ return `export default ${JSON.stringify(entries)}`;
1163
+ }
1164
+ },
1165
+ transform(code, id) {
1166
+ if (!id.endsWith(".vue")) return;
1167
+ const namePatterns = [
1168
+ /collectionName\s*:\s*['"]([^'"]+)['"]/g,
1169
+ /collection_name\s*:\s*['"]([^'"]+)['"]/g,
1170
+ /collection\s*:\s*['"]([^'"]+)['"]/g
1171
+ ];
1172
+ const storeRe = /store\s*:\s*['"]([^'"]+)['"]/g;
1173
+ const stores = [];
1174
+ let storeMatch;
1175
+ while ((storeMatch = storeRe.exec(code)) !== null) {
1176
+ stores.push(storeMatch[1]);
1177
+ }
1178
+ const listItemsRe = /listItems\s*\(\s*['"]([^'"]+)['"]/g;
1179
+ let listMatch;
1180
+ while ((listMatch = listItemsRe.exec(code)) !== null) {
1181
+ const collectionName = listMatch[1];
1182
+ const key = `*/${collectionName}`;
1183
+ if (!discoveredCollections.has(key)) {
1184
+ discoveredCollections.set(key, { store: "*", collection: collectionName });
1185
+ }
1186
+ }
1187
+ for (const pattern of namePatterns) {
1188
+ let match;
1189
+ while ((match = pattern.exec(code)) !== null) {
1190
+ const collection = match[1];
1191
+ if (["name", "label", "icon", "description", "type"].includes(collection)) continue;
1192
+ const store = stores[0] ?? "*";
1193
+ const key = `${store}/${collection}`;
1194
+ if (!discoveredCollections.has(key)) {
1195
+ discoveredCollections.set(key, { store, collection });
1196
+ }
1197
+ }
1198
+ }
1199
+ },
1200
+ generateBundle() {
1201
+ if (discoveredCollections.size === 0) return;
1202
+ const entries = [...discoveredCollections.values()];
1203
+ this.emitFile({
1204
+ type: "asset",
1205
+ fileName: ".blox-collections.json",
1206
+ source: JSON.stringify(entries, null, 2)
1207
+ });
1208
+ }
1209
+ });
1210
+ }
1211
+ plugins.push({
1074
1212
  name: "vite-plugin-blox",
1075
1213
  enforce: "pre",
1076
1214
  transform(code, id) {
@@ -1163,6 +1301,7 @@ ${openTag}${remaining}${closeTag}`;
1163
1301
  map: s.generateMap({ hires: true })
1164
1302
  };
1165
1303
  }
1166
- };
1304
+ });
1305
+ return plugins;
1167
1306
  }
1168
1307
  exports.bloxPlugin = bloxPlugin;
@@ -1,25 +1,26 @@
1
1
  import { Plugin } from 'vite';
2
+ export interface BloxPluginOptions {
3
+ /**
4
+ * Enable SSR-aware config injection.
5
+ * When true, adds `resolve.dedupe`, `resolve.alias` for Vue,
6
+ * and SSR build rollup options automatically.
7
+ * @default false
8
+ */
9
+ ssr?: boolean;
10
+ /**
11
+ * Enable collection auto-discovery from block source files.
12
+ * When true, scans `.vue` files for datastore collection references
13
+ * and emits a `virtual:blox-collections` module and a
14
+ * `.blox-collections.json` manifest in the output directory.
15
+ * @default false
16
+ */
17
+ autoCollections?: boolean;
18
+ }
2
19
  /**
3
- * Vite plugin that hoists `defineBlock(...)` out of `<script setup>` into a
4
- * plain `<script>` block. Also hoists any variables referenced by defineBlock
5
- * (e.g. `const schema = defineSchema(...)`) and the relevant imports.
6
- *
7
- * @example
8
- * ```vue
9
- * <script setup lang="ts">
10
- * import { defineBlock } from '@bagelink/blox'
11
- * import { defineSchema, $ } from '@bagelink/vue'
12
- *
13
- * // Either inline:
14
- * defineBlock({ name: 'hero', label: 'Hero', schema: defineSchema({ ... }) })
15
- *
16
- * // Or via variable (also hoisted automatically):
17
- * const schema = defineSchema({ ... })
18
- * defineBlock({ name: 'hero', label: 'Hero', schema })
19
- *
20
- * defineProps<HeroProps>()
21
- * </script>
22
- * ```
20
+ * Vite plugin that:
21
+ * 1. Hoists `defineBlock(...)` out of `<script setup>` into a plain `<script>` block.
22
+ * 2. (When `ssr: true`) Injects Vue dedupe, alias, and SSR rollup config
23
+ * so consumer `vite.config.ts` doesn't need any of that boilerplate.
23
24
  */
24
- export declare function bloxPlugin(): Plugin;
25
+ export declare function bloxPlugin(options?: BloxPluginOptions): Plugin[];
25
26
  //# sourceMappingURL=vite-plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAGlC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,UAAU,IAAI,MAAM,CA+HnC"}
1
+ {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,MAAM,CAAA;AAM9C,MAAM,WAAW,iBAAiB;IACjC;;;;;OAKG;IACH,GAAG,CAAC,EAAE,OAAO,CAAA;IACb;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,MAAM,EAAE,CA4SpE"}