47 lines
3.1 KiB
TypeScript
47 lines
3.1 KiB
TypeScript
// Bundled (esbuild, node) by scripts/e2e-preview-assets.mjs: a version-history snapshot whose header, body and
|
|||
|
|
// design carry uploads exactly as the AssetPicker stores them (the same-origin panel proxy URL), turned into the
|
||
|
|
// Preview document by the REAL buildSnapshotPreviewHtml (the same export + absolute-URL step as TopBar's Preview),
|
||
|
|
// plus the published body for the backend publish check.
|
||
|
|
import { editorProxyUrl } from '../src/sitesmith/editor-asset-urls';
|
||
|
|
import { buildSnapshotPreviewHtml, type Snapshot } from '../src/utils/history-restore';
|
||
|
|
import { exportBodyHtml } from '../src/utils/html-export';
|
||
|
|
import { flattenTreeForCraft } from '../src/utils/craft-tree';
|
||
|
|
import { inlinePreviewAssets, collectPreviewAssetUrls } from '../src/utils/preview-assets';
|
||
|
|
|
||
|
|
export const SITE_ID = 7;
|
||
|
|
export const FILES = ['1700000000_aa11bb22_hero.png', '1700000001_bb22cc33_logo+v2.png', 'my photo.png', 'café.png', 'poster.png', 'fav.png'];
|
||
|
|
export const OTHER_SITE_FILE = 'other-site.png';
|
||
|
|
const U = (i: number) => editorProxyUrl(SITE_ID, FILES[i]);
|
||
|
|
const n = (type: string, props: Record<string, unknown>, nodes?: any[]) => ({ type: { resolvedName: type }, props, ...(nodes ? { nodes } : {}) });
|
||
|
|
const state = (tree: any) => JSON.stringify(flattenTreeForCraft(tree).nodes);
|
||
|
|
|
||
|
|
const header = state(n('Container', { node_id: 'ROOT', tag: 'div' }, [
|
||
|
|
n('Navbar', { node_id: 'nav', logoType: 'image', logoImage: U(1), logoUrl: '/', links: [{ text: 'Home', href: '/' }] }),
|
||
|
|
]));
|
||
|
|
const page = state(n('Container', { node_id: 'ROOT', tag: 'div' }, [
|
||
|
|
n('BackgroundSection', { node_id: 'bg', bgImage: U(0), overlayOpacity: 0.2 }, [n('Heading', { node_id: 'h', text: 'Hello', level: 'h1' })]),
|
||
|
|
n('ImageBlock', { node_id: 'i1', src: U(0), alt: 'plain' }),
|
||
|
|
n('ImageBlock', { node_id: 'i2', src: U(1), alt: 'plus' }),
|
||
|
|
n('ImageBlock', { node_id: 'i3', src: U(2), alt: 'space' }),
|
||
|
|
n('ImageBlock', { node_id: 'i4', src: U(3), alt: 'unicode' }),
|
||
|
|
n('Container', { node_id: 'c', tag: 'div', style: { minHeight: '60px', backgroundImage: `url(${U(0)})` } }),
|
||
|
|
n('HtmlBlock', { node_id: 'html', code:
|
||
|
|
`<img id="rich" src="${U(0)}" alt="rich"><img id="srcset" alt="srcset" src="${U(2)}" srcset="${U(0)} 1x, ${U(3)} 2x">`
|
||
|
|
+ `<video id="vid" poster="${U(4)}" width="40" height="30"></video>`
|
||
|
|
+ `<a id="lnk" href="${U(0)}">full size</a>`
|
||
|
|
+ `<img id="other" alt="other" src="${editorProxyUrl(8, OTHER_SITE_FILE)}">` }),
|
||
|
|
n('ImageBlock', { node_id: 'i5', src: editorProxyUrl(SITE_ID, 'does-not-exist.png'), alt: 'missing' }),
|
||
|
|
]));
|
||
|
|
|
||
|
|
export const SNAPSHOT: Snapshot = {
|
||
|
|
pages_craft_state: [{ id: 'p1', name: 'Home', slug: 'index', craftState: page }],
|
||
|
|
header_craft_state: header,
|
||
|
|
footer_craft_state: null,
|
||
|
|
design: { favicon: U(5) },
|
||
|
|
} as unknown as Snapshot;
|
||
|
|
|
||
|
|
/** The Preview document as origin/main hands it to the sandboxed tab (proxy URLs made absolute on `origin`). */
|
||
|
|
export function previewHtml(origin: string): string { return buildSnapshotPreviewHtml(SNAPSHOT, 0, origin); }
|
||
|
|
/** The page body Save/Publish sends (no Preview step involved). */
|
||
|
|
export function publishBody(): string { return exportBodyHtml(header).html + exportBodyHtml(page).html; }
|
||
|
|
export { inlinePreviewAssets, collectPreviewAssetUrls };
|