@storyblok/astro 2.4.1 → 2.5.1
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
|
@@ -110,7 +110,7 @@ In order to link your Astro components to their equivalents you created in Story
|
|
|
110
110
|
|
|
111
111
|
First, you need to load them globally by specifying their name and their path in `astro.config.mjs`:
|
|
112
112
|
|
|
113
|
-
```
|
|
113
|
+
```js
|
|
114
114
|
components: {
|
|
115
115
|
page: "storyblok/Page",
|
|
116
116
|
feature: "storyblok/Feature",
|
|
@@ -140,9 +140,9 @@ components: {
|
|
|
140
140
|
|
|
141
141
|
For each component, use the `storyblokEditable()` function on its root element, passing the `blok` property that they receive:
|
|
142
142
|
|
|
143
|
-
```
|
|
143
|
+
```jsx
|
|
144
144
|
---
|
|
145
|
-
import { storyblokEditable } from
|
|
145
|
+
import { storyblokEditable } from "@storyblok/astro";
|
|
146
146
|
|
|
147
147
|
const { blok } = Astro.props
|
|
148
148
|
---
|
|
@@ -154,10 +154,10 @@ const { blok } = Astro.props
|
|
|
154
154
|
|
|
155
155
|
Finally, you can use the provided `<StoryblokComponent>` for nested components; it will automatically render them (if they have been registered globally beforehand):
|
|
156
156
|
|
|
157
|
-
```
|
|
157
|
+
```jsx
|
|
158
158
|
---
|
|
159
|
-
import { storyblokEditable } from
|
|
160
|
-
import StoryblokComponent from
|
|
159
|
+
import { storyblokEditable } from "@storyblok/astro";
|
|
160
|
+
import StoryblokComponent from "@storyblok/astro/StoryblokComponent.astro";
|
|
161
161
|
|
|
162
162
|
const { blok } = Astro.props
|
|
163
163
|
---
|
|
@@ -189,7 +189,7 @@ For working examples, please refer to the [Live Demo on Stackblitz](https://stac
|
|
|
189
189
|
|
|
190
190
|
Use the `useStoryblokApi` function to have access to an instance of `storyblok-js-client`:
|
|
191
191
|
|
|
192
|
-
```
|
|
192
|
+
```jsx
|
|
193
193
|
---
|
|
194
194
|
import { useStoryblokApi } from "@storyblok/astro";
|
|
195
195
|
import StoryblokComponent from "@storyblok/astro/StoryblokComponent.astro";
|
|
@@ -211,14 +211,14 @@ const story = data.story;
|
|
|
211
211
|
|
|
212
212
|
In order to dynamically generate Astro pages based on the Stories in your Storyblok Space, you can use the [Storyblok Links API](https://www.storyblok.com/docs/api/content-delivery/v2#core-resources/links/links) and the Astro [`getStaticPaths()` function](https://docs.astro.build/en/reference/api-reference/#getstaticpaths) similar to this example:
|
|
213
213
|
|
|
214
|
-
```
|
|
214
|
+
```jsx
|
|
215
215
|
---
|
|
216
216
|
import { useStoryblokApi } from "@storyblok/astro";
|
|
217
217
|
import StoryblokComponent from "@storyblok/astro/StoryblokComponent.astro";
|
|
218
218
|
|
|
219
219
|
export async function getStaticPaths() {
|
|
220
220
|
const storyblokApi = useStoryblokApi();
|
|
221
|
-
|
|
221
|
+
|
|
222
222
|
const { data } = await storyblokApi.get("cdn/links", {
|
|
223
223
|
version: "draft",
|
|
224
224
|
});
|
|
@@ -252,6 +252,23 @@ The Storyblok Bridge is enabled by default. If you would like to disable it or e
|
|
|
252
252
|
|
|
253
253
|
> Note: Since Astro is not a reactive JavaScript framework and renders everything as HTML, the Storyblok Bridge will not provide real-time editing as you may know it from other frameworks. However, it automatically refreshes the site for you whenever you save or publish a story.
|
|
254
254
|
|
|
255
|
+
You can also provide a `StoryblokBridgeConfigV2` configuration object to the `bridge` parameter.
|
|
256
|
+
|
|
257
|
+
```ts
|
|
258
|
+
bridge: {
|
|
259
|
+
customParent?: string,
|
|
260
|
+
preventClicks?: boolean, // Defaults to false.
|
|
261
|
+
resolveRelations?: strings[]
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
- `customParent` is used to provide a custom URL for the Storyblok editor iframe.
|
|
266
|
+
- `preventClicks` prevents the default behaviour of clicks when inside the Storyblok editor.
|
|
267
|
+
- `resolveRelations` may be needed to tell the Storyblok Bridge to resolve the same relations that are already resolved in the API requests via the `resolve_relations` parameter. _Note: this paramenter won't have any effect in Astro, since the Storyblok Bridge will reload the page and thus all the requests needed will be performed after the reload_
|
|
268
|
+
|
|
269
|
+
The provided options will be used to initialize the Storyblok Bridge.
|
|
270
|
+
You can find more information about the Storyblok Bridge and its configuration options on the [In Depth Storyblok Bridge guide](https://www.storyblok.com/docs/guide/in-depth/storyblok-latest-js-v2).
|
|
271
|
+
|
|
255
272
|
If you want to deploy a dedicated preview environment with the Bridge enabled, allowing users of the Storyblok CMS to see their changes being reflected on the frontend directly without having to rebuild the static site, you can enable Server Side Rendering for that particular use case. More information can be found in the [Astro Docs](https://docs.astro.build/en/guides/server-side-rendering/).
|
|
256
273
|
|
|
257
274
|
### Rendering Rich Text
|
|
@@ -261,7 +278,7 @@ Use `renderRichText`, which only supports parsing and returning native HTML tags
|
|
|
261
278
|
|
|
262
279
|
```jsx
|
|
263
280
|
---
|
|
264
|
-
import { renderRichText } from
|
|
281
|
+
import { renderRichText } from "@storyblok/astro";
|
|
265
282
|
|
|
266
283
|
const { blok } = Astro.props
|
|
267
284
|
|
|
@@ -275,17 +292,17 @@ Use the `<RichTextRenderer />` component if you are embedding `bloks` in your ri
|
|
|
275
292
|
|
|
276
293
|
```jsx
|
|
277
294
|
---
|
|
278
|
-
import
|
|
295
|
+
import RichTextRenderer from "@storyblok/astro/RichTextRenderer.astro";
|
|
279
296
|
|
|
280
297
|
const { blok } = Astro.props
|
|
281
298
|
---
|
|
282
299
|
|
|
283
|
-
<RichTextRenderer richTextData=
|
|
300
|
+
<RichTextRenderer richTextData={blok.richtext} />
|
|
284
301
|
```
|
|
285
302
|
|
|
286
303
|
You can also set a **custom Schema and component resolver** by passing the options as the second parameter of the `renderRichText` function:
|
|
287
304
|
|
|
288
|
-
```
|
|
305
|
+
```jsx
|
|
289
306
|
import { RichTextSchema, renderRichText } from "@storyblok/astro";
|
|
290
307
|
import cloneDeep from "clone-deep";
|
|
291
308
|
|
|
@@ -311,9 +328,11 @@ const renderedRichText = renderRichText(blok.text, {
|
|
|
311
328
|
|
|
312
329
|
The same can be done with the `<RichTextRenderer />` component by passing along the options via the `richTextOptions` prop:
|
|
313
330
|
|
|
314
|
-
```
|
|
331
|
+
```jsx
|
|
315
332
|
---
|
|
316
|
-
import { RichTextSchema
|
|
333
|
+
import { RichTextSchema } from "@storyblok/astro";
|
|
334
|
+
import RichTextRenderer from "@storyblok/astro/RichTextRenderer.astro";
|
|
335
|
+
|
|
317
336
|
import cloneDeep from "clone-deep";
|
|
318
337
|
|
|
319
338
|
const mySchema = cloneDeep(RichTextSchema); // you can make a copy of the default RichTextSchema
|
|
@@ -336,7 +355,7 @@ const options = {
|
|
|
336
355
|
};
|
|
337
356
|
---
|
|
338
357
|
|
|
339
|
-
<RichTextRenderer richTextData=
|
|
358
|
+
<RichTextRenderer richTextData={blok.richtext} richTextOptions={options} />
|
|
340
359
|
|
|
341
360
|
```
|
|
342
361
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { StoryblokClient } from "@storyblok/js";
|
|
2
2
|
import type { AstroIntegration } from "astro";
|
|
3
|
-
import type { ISbConfig, ISbRichtext, SbRichTextOptions } from "./types";
|
|
3
|
+
import type { ISbConfig, ISbRichtext, SbRichTextOptions, StoryblokBridgeConfigV2 } from "./types";
|
|
4
4
|
export { storyblokEditable, loadStoryblokBridge, RichTextResolver, RichTextSchema, } from "@storyblok/js";
|
|
5
5
|
export declare function useStoryblokApi(): StoryblokClient;
|
|
6
6
|
export declare function renderRichText(data?: ISbRichtext, options?: SbRichTextOptions): string;
|
|
@@ -18,9 +18,9 @@ export type IntegrationOptions = {
|
|
|
18
18
|
*/
|
|
19
19
|
apiOptions?: ISbConfig;
|
|
20
20
|
/**
|
|
21
|
-
* A boolean to enable/disable the Storyblok JavaScript Bridge. Enabled by default.
|
|
21
|
+
* A boolean to enable/disable the Storyblok JavaScript Bridge or provide a StoryblokBridgeConfigV2 configuration object. Enabled by default.
|
|
22
22
|
*/
|
|
23
|
-
bridge?: boolean;
|
|
23
|
+
bridge?: boolean | StoryblokBridgeConfigV2;
|
|
24
24
|
/**
|
|
25
25
|
* An object containing your Astro components to their Storyblok equivalents.
|
|
26
26
|
* Example:
|
package/dist/storyblok-astro.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
(function(g,h){typeof exports=="object"&&typeof module<"u"?h(exports):typeof define=="function"&&define.amd?define(["exports"],h):(g=typeof globalThis<"u"?globalThis:g||self,h(g.storyblokAstro={}))})(this,function(g){"use strict";function h(r,e,t){const o="virtual:storyblok-init",a="\0"+o;return{name:"vite-plugin-storyblok-init",async resolveId(s){if(s===o)return a},async load(s){if(s===a)return`
|
|
2
2
|
import { storyblokInit, apiPlugin } from "@storyblok/js";
|
|
3
3
|
const { storyblokApi } = storyblokInit({
|
|
4
4
|
accessToken: "${r}",
|
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
apiOptions: ${JSON.stringify(t)},
|
|
7
7
|
});
|
|
8
8
|
export const storyblokApiInstance = storyblokApi;
|
|
9
|
-
`}}}const x=/[\p{Lu}]/u,R=/[\p{Ll}]/u,k=/^[\p{Lu}](?![\p{Lu}])/gu
|
|
9
|
+
`}}}const x=/[\p{Lu}]/u,R=/[\p{Ll}]/u,k=/^[\p{Lu}](?![\p{Lu}])/gu,$=/([\p{Alpha}\p{N}_]|$)/u,b=/[_.\- ]+/,O=new RegExp("^"+b.source),v=new RegExp(b.source+$.source,"gu"),I=new RegExp("\\d+"+$.source,"gu"),N=(r,e,t,o)=>{let a=!1,s=!1,n=!1,f=!1;for(let l=0;l<r.length;l++){const i=r[l];f=l>2?r[l-3]==="-":!0,a&&x.test(i)?(r=r.slice(0,l)+"-"+r.slice(l),a=!1,n=s,s=!0,l++):s&&n&&R.test(i)&&(!f||o)?(r=r.slice(0,l-1)+"-"+r.slice(l-1),n=s,s=!1,a=!0):(a=e(i)===i&&t(i)!==i,n=s,s=t(i)===i&&e(i)!==i)}return r},L=(r,e)=>(k.lastIndex=0,r.replace(k,t=>e(t))),M=(r,e)=>(v.lastIndex=0,I.lastIndex=0,r.replace(v,(t,o)=>e(o)).replace(I,t=>e(t)));function w(r,e){if(!(typeof r=="string"||Array.isArray(r)))throw new TypeError("Expected the input to be `string | string[]`");if(e={pascalCase:!1,preserveConsecutiveUppercase:!1,...e},Array.isArray(r)?r=r.map(s=>s.trim()).filter(s=>s.length).join("-"):r=r.trim(),r.length===0)return"";const t=e.locale===!1?s=>s.toLowerCase():s=>s.toLocaleLowerCase(e.locale),o=e.locale===!1?s=>s.toUpperCase():s=>s.toLocaleUpperCase(e.locale);return r.length===1?b.test(r)?"":e.pascalCase?o(r):t(r):(r!==t(r)&&(r=N(r,t,o,e.preserveConsecutiveUppercase)),r=r.replace(O,""),r=e.preserveConsecutiveUppercase?L(r,t):t(r),e.pascalCase&&(r=o(r.charAt(0))+r.slice(1)),M(r,o))}function P(r,e,t,o){const a="virtual:storyblok-components",s="\0"+a;return{name:"vite-plugin-storyblok-components",async resolveId(n){if(n===a)return s},async load(n){if(n===s){const f=[],l=[];for await(const[c,d]of Object.entries(e)){const p=await this.resolve("/"+r+"/"+d+".astro");if(p)f.push(`import ${w(c)} from "${p.id}"`);else if(t)l.push(c);else throw new Error(`Component could not be found for blok "${c}"! Does "${"/"+r+"/"+d}.astro" exist?`)}let i="";if(t)if(i=",FallbackComponent",o){const c=await this.resolve("/"+r+"/"+o+".astro");if(!c)throw new Error(`Custom fallback component could not be found. Does "${"/"+r+"/"+o}.astro" exist?`);f.push(`import FallbackComponent from "${c.id}"`)}else f.push("import FallbackComponent from '@storyblok/astro/FallbackComponent.astro';");if(Object.values(e).length)return`${f.join(";")};export default {${Object.keys(e).filter(c=>!l.includes(c)).map(c=>w(c)).join(",")}${i}}`;if(t)return`${f[0]} export default {${i.replace(",","")}}`;throw new Error(`Currently, no Storyblok components are registered in astro.config.mjs.
|
|
10
|
+
Please register your components or enable the fallback component.
|
|
11
|
+
Detailed information can be found here: https://github.com/storyblok/storyblok-astro`)}}}}function _(r){const e="virtual:storyblok-options",t="\0"+e;return{name:"vite-plugin-storyblok-options",async resolveId(o){if(o===e)return t},async load(o){if(o===t)return`export default ${JSON.stringify(r)}`}}}let T=!1;const E=[],z=r=>new Promise((e,t)=>{if(typeof window>"u"||(window.storyblokRegisterEvent=a=>{if(window.location===window.parent.location){console.warn("You are not in Draft Mode or in the Visual Editor.");return}T?a():E.push(a)},document.getElementById("storyblok-javascript-bridge")))return;const o=document.createElement("script");o.async=!0,o.src=r,o.id="storyblok-javascript-bridge",o.onerror=a=>t(a),o.onload=a=>{E.forEach(s=>s()),T=!0,e(a)},document.getElementsByTagName("head")[0].appendChild(o)});var D=Object.defineProperty,U=(r,e,t)=>e in r?D(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,C=(r,e,t)=>(U(r,typeof e!="symbol"?e+"":e,t),t);const q=function(r,e){const t={};for(const o in r){const a=r[o];e.indexOf(o)>-1&&a!==null&&(t[o]=a)}return t},B=r=>r==="email",F=()=>({singleTag:"hr"}),J=()=>({tag:"blockquote"}),K=()=>({tag:"ul"}),V=r=>({tag:["pre",{tag:"code",attrs:r.attrs}]}),G=()=>({singleTag:"br"}),W=r=>({tag:`h${r.attrs.level}`}),H=r=>({singleTag:[{tag:"img",attrs:q(r.attrs,["src","alt","title"])}]}),Y=()=>({tag:"li"}),Q=()=>({tag:"ol"}),X=()=>({tag:"p"}),Z=r=>({tag:[{tag:"span",attrs:{["data-type"]:"emoji",["data-name"]:r.attrs.name,emoji:r.attrs.emoji}}]}),ee=()=>({tag:"b"}),te=()=>({tag:"strike"}),re=()=>({tag:"u"}),oe=()=>({tag:"strong"}),se=()=>({tag:"code"}),ae=()=>({tag:"i"}),ne=r=>{const e={...r.attrs},{linktype:t="url"}=r.attrs;if(B(t)&&(e.href=`mailto:${e.href}`),e.anchor&&(e.href=`${e.href}#${e.anchor}`,delete e.anchor),e.custom){for(const o in e.custom)e[o]=e.custom[o];delete e.custom}return{tag:[{tag:"a",attrs:e}]}},le=r=>({tag:[{tag:"span",attrs:r.attrs}]}),ie=()=>({tag:"sub"}),ce=()=>({tag:"sup"}),ge=r=>({tag:[{tag:"span",attrs:r.attrs}]}),ue=r=>{var e;return(e=r.attrs)!=null&&e.color?{tag:[{tag:"span",attrs:{style:`background-color:${r.attrs.color};`}}]}:{tag:""}},fe=r=>{var e;return(e=r.attrs)!=null&&e.color?{tag:[{tag:"span",attrs:{style:`color:${r.attrs.color}`}}]}:{tag:""}},S={nodes:{horizontal_rule:F,blockquote:J,bullet_list:K,code_block:V,hard_break:G,heading:W,image:H,list_item:Y,ordered_list:Q,paragraph:X,emoji:Z},marks:{bold:ee,strike:te,underline:re,strong:oe,code:se,italic:ae,link:ne,styled:le,subscript:ie,superscript:ce,anchor:ge,highlight:ue,textStyle:fe}},de=function(r){const e={"&":"&","<":"<",">":">",'"':""","'":"'"},t=/[&<>"']/g,o=RegExp(t.source);return r&&o.test(r)?r.replace(t,a=>e[a]):r};class A{constructor(e){C(this,"marks"),C(this,"nodes"),e||(e=S),this.marks=e.marks||[],this.nodes=e.nodes||[]}addNode(e,t){this.nodes[e]=t}addMark(e,t){this.marks[e]=t}render(e,t={optimizeImages:!1}){if(e&&e.content&&Array.isArray(e.content)){let o="";return e.content.forEach(a=>{o+=this.renderNode(a)}),t.optimizeImages?this.optimizeImages(o,t.optimizeImages):o}return console.warn(`The render method must receive an Object with a "content" field.
|
|
10
12
|
The "content" field must be an array of nodes as the type ISbRichtext.
|
|
11
13
|
ISbRichtext:
|
|
12
14
|
content?: ISbRichtext[]
|
|
@@ -29,14 +31,14 @@
|
|
|
29
31
|
}
|
|
30
32
|
],
|
|
31
33
|
type: 'doc'
|
|
32
|
-
}`),""}optimizeImages(e,t){let o=0,a=0,s="",n="";typeof t!="boolean"&&(typeof t.width=="number"&&t.width>0&&(s+=`width="${t.width}" `,o=t.width),typeof t.height=="number"&&t.height>0&&(s+=`height="${t.height}" `,a=t.height),(t.loading==="lazy"||t.loading==="eager")&&(s+=`loading="${t.loading}" `),typeof t.class=="string"&&t.class.length>0&&(s+=`class="${t.class}" `),t.filters&&(typeof t.filters.blur=="number"&&t.filters.blur>=0&&t.filters.blur<=100&&(n+=`:blur(${t.filters.blur})`),typeof t.filters.brightness=="number"&&t.filters.brightness>=-100&&t.filters.brightness<=100&&(n+=`:brightness(${t.filters.brightness})`),t.filters.fill&&(t.filters.fill.match(/[0-9A-Fa-f]{6}/g)||t.filters.fill==="transparent")&&(n+=`:fill(${t.filters.fill})`),t.filters.format&&["webp","png","jpeg"].includes(t.filters.format)&&(n+=`:format(${t.filters.format})`),typeof t.filters.grayscale=="boolean"&&t.filters.grayscale&&(n+=":grayscale()"),typeof t.filters.quality=="number"&&t.filters.quality>=0&&t.filters.quality<=100&&(n+=`:quality(${t.filters.quality})`),t.filters.rotate&&[90,180,270].includes(t.filters.rotate)&&(n+=`:rotate(${t.filters.rotate})`),n.length>0&&(n="/filters"+n))),s.length>0&&(e=e.replace(/<img/g,`<img ${s.trim()}`));const f=o>0||a>0||n.length>0?`${o}x${a}${n}`:"";return e=e.replace(/a.storyblok.com\/f\/(\d+)\/([^.]+)\.(gif|jpg|jpeg|png|tif|tiff|bmp)/g,`a.storyblok.com/f/$1/$2.$3/m/${f}`),typeof t!="boolean"&&(t.sizes||t.srcset)&&(e=e.replace(/<img.*?src=["|'](.*?)["|']/g,l=>{var i,c;const d=l.match(/a.storyblok.com\/f\/(\d+)\/([^.]+)\.(gif|jpg|jpeg|png|tif|tiff|bmp)/g);if(d&&d.length>0){const p={srcset:(i=t.srcset)==null?void 0:i.map(
|
|
34
|
+
}`),""}optimizeImages(e,t){let o=0,a=0,s="",n="";typeof t!="boolean"&&(typeof t.width=="number"&&t.width>0&&(s+=`width="${t.width}" `,o=t.width),typeof t.height=="number"&&t.height>0&&(s+=`height="${t.height}" `,a=t.height),(t.loading==="lazy"||t.loading==="eager")&&(s+=`loading="${t.loading}" `),typeof t.class=="string"&&t.class.length>0&&(s+=`class="${t.class}" `),t.filters&&(typeof t.filters.blur=="number"&&t.filters.blur>=0&&t.filters.blur<=100&&(n+=`:blur(${t.filters.blur})`),typeof t.filters.brightness=="number"&&t.filters.brightness>=-100&&t.filters.brightness<=100&&(n+=`:brightness(${t.filters.brightness})`),t.filters.fill&&(t.filters.fill.match(/[0-9A-Fa-f]{6}/g)||t.filters.fill==="transparent")&&(n+=`:fill(${t.filters.fill})`),t.filters.format&&["webp","png","jpeg"].includes(t.filters.format)&&(n+=`:format(${t.filters.format})`),typeof t.filters.grayscale=="boolean"&&t.filters.grayscale&&(n+=":grayscale()"),typeof t.filters.quality=="number"&&t.filters.quality>=0&&t.filters.quality<=100&&(n+=`:quality(${t.filters.quality})`),t.filters.rotate&&[90,180,270].includes(t.filters.rotate)&&(n+=`:rotate(${t.filters.rotate})`),n.length>0&&(n="/filters"+n))),s.length>0&&(e=e.replace(/<img/g,`<img ${s.trim()}`));const f=o>0||a>0||n.length>0?`${o}x${a}${n}`:"";return e=e.replace(/a.storyblok.com\/f\/(\d+)\/([^.]+)\.(gif|jpg|jpeg|png|tif|tiff|bmp)/g,`a.storyblok.com/f/$1/$2.$3/m/${f}`),typeof t!="boolean"&&(t.sizes||t.srcset)&&(e=e.replace(/<img.*?src=["|'](.*?)["|']/g,l=>{var i,c;const d=l.match(/a.storyblok.com\/f\/(\d+)\/([^.]+)\.(gif|jpg|jpeg|png|tif|tiff|bmp)/g);if(d&&d.length>0){const p={srcset:(i=t.srcset)==null?void 0:i.map(u=>{if(typeof u=="number")return`//${d}/m/${u}x0${n} ${u}w`;if(typeof u=="object"&&u.length===2){let y=0,j=0;return typeof u[0]=="number"&&(y=u[0]),typeof u[1]=="number"&&(j=u[1]),`//${d}/m/${y}x${j}${n} ${y}w`}}).join(", "),sizes:(c=t.sizes)==null?void 0:c.map(u=>u).join(", ")};let m="";return p.srcset&&(m+=`srcset="${p.srcset}" `),p.sizes&&(m+=`sizes="${p.sizes}" `),l.replace(/<img/g,`<img ${m.trim()}`)}return l})),e}renderNode(e){const t=[];e.marks&&e.marks.forEach(a=>{const s=this.getMatchingMark(a);s&&s.tag!==""&&t.push(this.renderOpeningTag(s.tag))});const o=this.getMatchingNode(e);return o&&o.tag&&t.push(this.renderOpeningTag(o.tag)),e.content?e.content.forEach(a=>{t.push(this.renderNode(a))}):e.text?t.push(de(e.text)):o&&o.singleTag?t.push(this.renderTag(o.singleTag," /")):o&&o.html?t.push(o.html):e.type==="emoji"&&t.push(this.renderEmoji(e)),o&&o.tag&&t.push(this.renderClosingTag(o.tag)),e.marks&&e.marks.slice(0).reverse().forEach(a=>{const s=this.getMatchingMark(a);s&&s.tag!==""&&t.push(this.renderClosingTag(s.tag))}),t.join("")}renderTag(e,t){return e.constructor===String?`<${e}${t}>`:e.map(o=>{if(o.constructor===String)return`<${o}${t}>`;{let a=`<${o.tag}`;if(o.attrs)for(const s in o.attrs){const n=o.attrs[s];n!==null&&(a+=` ${s}="${n}"`)}return`${a}${t}>`}}).join("")}renderOpeningTag(e){return this.renderTag(e,"")}renderClosingTag(e){return e.constructor===String?`</${e}>`:e.slice(0).reverse().map(t=>t.constructor===String?`</${t}>`:`</${t.tag}>`).join("")}getMatchingNode(e){const t=this.nodes[e.type];if(typeof t=="function")return t(e)}getMatchingMark(e){const t=this.marks[e.type];if(typeof t=="function")return t(e)}renderEmoji(e){if(e.attrs.emoji)return e.attrs.emoji;const t=[{tag:"img",attrs:{src:e.attrs.fallbackImage,draggable:"false",loading:"lazy",align:"absmiddle"}}];return this.renderTag(t," /")}}const pe=r=>{if(typeof r!="object"||typeof r._editable>"u")return{};const e=JSON.parse(r._editable.replace(/^<!--#storyblok#/,"").replace(/-->$/,""));return{"data-blok-c":JSON.stringify(e),"data-blok-uid":e.id+"-"+e.uid}};let he;const be="https://app.storyblok.com/f/storyblok-v2-latest.js",me=(r,e)=>{r.addNode("blok",t=>{let o="";return t.attrs.body.forEach(a=>{o+=e(a.component,a)}),{html:o}})},ye=r=>{var e,t;return!r||((e=r==null?void 0:r.content)==null?void 0:e[0].type)!=="blok"&&!((t=r==null?void 0:r.content)!=null&&t[0].content)},ke=(r,e,t)=>{let o=t||he;if(!o){console.error("Please initialize the Storyblok SDK before calling the renderRichText function");return}return ye(r)?"":(e&&(o=new A(e.schema),e.resolver&&me(o,e.resolver)),o.render(r))},$e=()=>z(be);function ve(){return globalThis.storyblokApiInstance||console.error("storyblokApiInstance has not been initialized correctly"),globalThis.storyblokApiInstance}function Ie(r,e){const t=globalThis.storyblokApiInstance.richTextResolver;if(!t){console.error("Please initialize the Storyblok SDK before calling the renderRichText function");return}return ke(r,e,t)}function we(r){const e={useCustomApi:!1,bridge:!0,componentsDir:"src",enableFallbackComponent:!1,...r};return{name:"@storyblok/astro",hooks:{"astro:config:setup":({injectScript:t,updateConfig:o})=>{if(o({vite:{plugins:[h(e.accessToken,e.useCustomApi,e.apiOptions),P(e.componentsDir,e.components,e.enableFallbackComponent,e.customFallbackComponent),_(e)]}}),t("page-ssr",`
|
|
33
35
|
import { storyblokApiInstance } from "virtual:storyblok-init";
|
|
34
36
|
globalThis.storyblokApiInstance = storyblokApiInstance;
|
|
35
|
-
`),e.bridge
|
|
37
|
+
`),e.bridge){const a={...e.bridge};t("page",`
|
|
36
38
|
import { loadStoryblokBridge } from "@storyblok/astro";
|
|
37
39
|
loadStoryblokBridge().then(() => {
|
|
38
40
|
const { StoryblokBridge, location } = window;
|
|
39
|
-
const storyblokInstance = new StoryblokBridge();
|
|
41
|
+
const storyblokInstance = new StoryblokBridge(${JSON.stringify(a)});
|
|
40
42
|
|
|
41
43
|
storyblokInstance.on(["published", "change"], (event) => {
|
|
42
44
|
if (!event.slugChanged) {
|
|
@@ -44,4 +46,4 @@
|
|
|
44
46
|
}
|
|
45
47
|
});
|
|
46
48
|
});
|
|
47
|
-
`)}}}}
|
|
49
|
+
`)}}}}}g.RichTextResolver=A,g.RichTextSchema=S,g.default=we,g.loadStoryblokBridge=$e,g.renderRichText=Ie,g.storyblokEditable=pe,g.useStoryblokApi=ve,Object.defineProperties(g,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
package/dist/storyblok-astro.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
function
|
|
1
|
+
function x(r, e, t) {
|
|
2
2
|
const o = "virtual:storyblok-init", a = "\0" + o;
|
|
3
3
|
return {
|
|
4
4
|
name: "vite-plugin-storyblok-init",
|
|
@@ -20,14 +20,14 @@ function T(r, e, t) {
|
|
|
20
20
|
}
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
|
-
const
|
|
23
|
+
const T = /[\p{Lu}]/u, A = /[\p{Ll}]/u, y = /^[\p{Lu}](?![\p{Lu}])/gu, C = /([\p{Alpha}\p{N}_]|$)/u, b = /[_.\- ]+/, S = new RegExp("^" + b.source), k = new RegExp(b.source + C.source, "gu"), $ = new RegExp("\\d+" + C.source, "gu"), j = (r, e, t, o) => {
|
|
24
24
|
let a = !1, s = !1, n = !1, u = !1;
|
|
25
25
|
for (let l = 0; l < r.length; l++) {
|
|
26
26
|
const i = r[l];
|
|
27
|
-
u = l > 2 ? r[l - 3] === "-" : !0, a &&
|
|
27
|
+
u = l > 2 ? r[l - 3] === "-" : !0, a && T.test(i) ? (r = r.slice(0, l) + "-" + r.slice(l), a = !1, n = s, s = !0, l++) : s && n && A.test(i) && (!u || o) ? (r = r.slice(0, l - 1) + "-" + r.slice(l - 1), n = s, s = !1, a = !0) : (a = e(i) === i && t(i) !== i, n = s, s = t(i) === i && e(i) !== i);
|
|
28
28
|
}
|
|
29
29
|
return r;
|
|
30
|
-
}, R = (r, e) => (y.lastIndex = 0, r.replace(y, (t) => e(t))),
|
|
30
|
+
}, R = (r, e) => (y.lastIndex = 0, r.replace(y, (t) => e(t))), O = (r, e) => (k.lastIndex = 0, $.lastIndex = 0, r.replace(k, (t, o) => e(o)).replace($, (t) => e(t)));
|
|
31
31
|
function v(r, e) {
|
|
32
32
|
if (!(typeof r == "string" || Array.isArray(r)))
|
|
33
33
|
throw new TypeError("Expected the input to be `string | string[]`");
|
|
@@ -38,9 +38,9 @@ function v(r, e) {
|
|
|
38
38
|
}, Array.isArray(r) ? r = r.map((s) => s.trim()).filter((s) => s.length).join("-") : r = r.trim(), r.length === 0)
|
|
39
39
|
return "";
|
|
40
40
|
const t = e.locale === !1 ? (s) => s.toLowerCase() : (s) => s.toLocaleLowerCase(e.locale), o = e.locale === !1 ? (s) => s.toUpperCase() : (s) => s.toLocaleUpperCase(e.locale);
|
|
41
|
-
return r.length === 1 ?
|
|
41
|
+
return r.length === 1 ? b.test(r) ? "" : e.pascalCase ? o(r) : t(r) : (r !== t(r) && (r = j(r, t, o, e.preserveConsecutiveUppercase)), r = r.replace(S, ""), r = e.preserveConsecutiveUppercase ? R(r, t) : t(r), e.pascalCase && (r = o(r.charAt(0)) + r.slice(1)), O(r, o));
|
|
42
42
|
}
|
|
43
|
-
function
|
|
43
|
+
function N(r, e, t, o) {
|
|
44
44
|
const a = "virtual:storyblok-components", s = "\0" + a;
|
|
45
45
|
return {
|
|
46
46
|
name: "vite-plugin-storyblok-components",
|
|
@@ -81,7 +81,15 @@ function O(r, e, t, o) {
|
|
|
81
81
|
u.push(
|
|
82
82
|
"import FallbackComponent from '@storyblok/astro/FallbackComponent.astro';"
|
|
83
83
|
);
|
|
84
|
-
|
|
84
|
+
if (Object.values(e).length)
|
|
85
|
+
return `${u.join(";")};export default {${Object.keys(e).filter((c) => !l.includes(c)).map((c) => v(c)).join(",")}${i}}`;
|
|
86
|
+
if (t)
|
|
87
|
+
return `${u[0]} export default {${i.replace(",", "")}}`;
|
|
88
|
+
throw new Error(
|
|
89
|
+
`Currently, no Storyblok components are registered in astro.config.mjs.
|
|
90
|
+
Please register your components or enable the fallback component.
|
|
91
|
+
Detailed information can be found here: https://github.com/storyblok/storyblok-astro`
|
|
92
|
+
);
|
|
85
93
|
}
|
|
86
94
|
}
|
|
87
95
|
};
|
|
@@ -101,7 +109,7 @@ function L(r) {
|
|
|
101
109
|
};
|
|
102
110
|
}
|
|
103
111
|
let I = !1;
|
|
104
|
-
const w = [],
|
|
112
|
+
const w = [], P = (r) => new Promise((e, t) => {
|
|
105
113
|
if (typeof window > "u" || (window.storyblokRegisterEvent = (a) => {
|
|
106
114
|
if (window.location === window.parent.location) {
|
|
107
115
|
console.warn("You are not in Draft Mode or in the Visual Editor.");
|
|
@@ -115,7 +123,7 @@ const w = [], z = (r) => new Promise((e, t) => {
|
|
|
115
123
|
w.forEach((s) => s()), I = !0, e(a);
|
|
116
124
|
}, document.getElementsByTagName("head")[0].appendChild(o);
|
|
117
125
|
});
|
|
118
|
-
var
|
|
126
|
+
var z = Object.defineProperty, M = (r, e, t) => e in r ? z(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t, E = (r, e, t) => (M(r, typeof e != "symbol" ? e + "" : e, t), t);
|
|
119
127
|
const _ = function(r, e) {
|
|
120
128
|
const t = {};
|
|
121
129
|
for (const o in r) {
|
|
@@ -339,8 +347,8 @@ class fe {
|
|
|
339
347
|
if (typeof g == "number")
|
|
340
348
|
return `//${f}/m/${g}x0${n} ${g}w`;
|
|
341
349
|
if (typeof g == "object" && g.length === 2) {
|
|
342
|
-
let h = 0,
|
|
343
|
-
return typeof g[0] == "number" && (h = g[0]), typeof g[1] == "number" && (
|
|
350
|
+
let h = 0, m = 0;
|
|
351
|
+
return typeof g[0] == "number" && (h = g[0]), typeof g[1] == "number" && (m = g[1]), `//${f}/m/${h}x${m}${n} ${h}w`;
|
|
344
352
|
}
|
|
345
353
|
}).join(", "),
|
|
346
354
|
sizes: (c = t.sizes) == null ? void 0 : c.map((g) => g).join(", ")
|
|
@@ -434,10 +442,10 @@ const de = "https://app.storyblok.com/f/storyblok-v2-latest.js", he = (r, e) =>
|
|
|
434
442
|
html: o
|
|
435
443
|
};
|
|
436
444
|
});
|
|
437
|
-
},
|
|
445
|
+
}, be = (r) => {
|
|
438
446
|
var e, t;
|
|
439
447
|
return !r || ((e = r == null ? void 0 : r.content) == null ? void 0 : e[0].type) !== "blok" && !((t = r == null ? void 0 : r.content) != null && t[0].content);
|
|
440
|
-
},
|
|
448
|
+
}, me = (r, e, t) => {
|
|
441
449
|
let o = t || pe;
|
|
442
450
|
if (!o) {
|
|
443
451
|
console.error(
|
|
@@ -445,8 +453,8 @@ const de = "https://app.storyblok.com/f/storyblok-v2-latest.js", he = (r, e) =>
|
|
|
445
453
|
);
|
|
446
454
|
return;
|
|
447
455
|
}
|
|
448
|
-
return
|
|
449
|
-
}, ke = () =>
|
|
456
|
+
return be(r) ? "" : (e && (o = new fe(e.schema), e.resolver && he(o, e.resolver)), o.render(r));
|
|
457
|
+
}, ke = () => P(de);
|
|
450
458
|
function $e() {
|
|
451
459
|
return globalThis.storyblokApiInstance || console.error("storyblokApiInstance has not been initialized correctly"), globalThis.storyblokApiInstance;
|
|
452
460
|
}
|
|
@@ -458,7 +466,7 @@ function ve(r, e) {
|
|
|
458
466
|
);
|
|
459
467
|
return;
|
|
460
468
|
}
|
|
461
|
-
return
|
|
469
|
+
return me(r, e, t);
|
|
462
470
|
}
|
|
463
471
|
function Ie(r) {
|
|
464
472
|
const e = {
|
|
@@ -472,15 +480,15 @@ function Ie(r) {
|
|
|
472
480
|
name: "@storyblok/astro",
|
|
473
481
|
hooks: {
|
|
474
482
|
"astro:config:setup": ({ injectScript: t, updateConfig: o }) => {
|
|
475
|
-
o({
|
|
483
|
+
if (o({
|
|
476
484
|
vite: {
|
|
477
485
|
plugins: [
|
|
478
|
-
|
|
486
|
+
x(
|
|
479
487
|
e.accessToken,
|
|
480
488
|
e.useCustomApi,
|
|
481
489
|
e.apiOptions
|
|
482
490
|
),
|
|
483
|
-
|
|
491
|
+
N(
|
|
484
492
|
e.componentsDir,
|
|
485
493
|
e.components,
|
|
486
494
|
e.enableFallbackComponent,
|
|
@@ -495,13 +503,17 @@ function Ie(r) {
|
|
|
495
503
|
import { storyblokApiInstance } from "virtual:storyblok-init";
|
|
496
504
|
globalThis.storyblokApiInstance = storyblokApiInstance;
|
|
497
505
|
`
|
|
498
|
-
), e.bridge
|
|
499
|
-
|
|
500
|
-
|
|
506
|
+
), e.bridge) {
|
|
507
|
+
const a = { ...e.bridge };
|
|
508
|
+
t(
|
|
509
|
+
"page",
|
|
510
|
+
`
|
|
501
511
|
import { loadStoryblokBridge } from "@storyblok/astro";
|
|
502
512
|
loadStoryblokBridge().then(() => {
|
|
503
513
|
const { StoryblokBridge, location } = window;
|
|
504
|
-
const storyblokInstance = new StoryblokBridge(
|
|
514
|
+
const storyblokInstance = new StoryblokBridge(${JSON.stringify(
|
|
515
|
+
a
|
|
516
|
+
)});
|
|
505
517
|
|
|
506
518
|
storyblokInstance.on(["published", "change"], (event) => {
|
|
507
519
|
if (!event.slugChanged) {
|
|
@@ -510,7 +522,8 @@ function Ie(r) {
|
|
|
510
522
|
});
|
|
511
523
|
});
|
|
512
524
|
`
|
|
513
|
-
|
|
525
|
+
);
|
|
526
|
+
}
|
|
514
527
|
}
|
|
515
528
|
}
|
|
516
529
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@storyblok/astro",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.1",
|
|
4
4
|
"description": "Official Astro integration for the Storyblok Headless CMS",
|
|
5
5
|
"main": "./dist/storyblok-astro.js",
|
|
6
6
|
"module": "./dist/storyblok-astro.mjs",
|
|
@@ -39,14 +39,14 @@
|
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@cypress/vite-dev-server": "^5.0.5",
|
|
41
41
|
"@rollup/plugin-dynamic-import-vars": "^2.0.3",
|
|
42
|
-
"@types/node": "20.3.
|
|
43
|
-
"astro": "2.7.
|
|
44
|
-
"cypress": "^12.
|
|
42
|
+
"@types/node": "20.3.3",
|
|
43
|
+
"astro": "2.7.3",
|
|
44
|
+
"cypress": "^12.16.0",
|
|
45
45
|
"eslint-plugin-cypress": "^2.13.3",
|
|
46
46
|
"start-server-and-test": "^2.0.0",
|
|
47
|
-
"typescript": "5.1.
|
|
47
|
+
"typescript": "5.1.6",
|
|
48
48
|
"vite": "^4.3.9",
|
|
49
|
-
"vite-plugin-dts": "^
|
|
49
|
+
"vite-plugin-dts": "^3.0.3"
|
|
50
50
|
},
|
|
51
51
|
"repository": {
|
|
52
52
|
"type": "git",
|
|
File without changes
|