@nexus_js/assets
Advanced tools
| export {}; | ||
| //# sourceMappingURL=image.test.d.ts.map |
| {"version":3,"file":"image.test.d.ts","sourceRoot":"","sources":["../src/image.test.ts"],"names":[],"mappings":""} |
| import { describe, it, expect, beforeAll, afterAll } from 'vitest'; | ||
| import { renderImage, Image, imageUrl, getImageDimensions, getBlurDataURL, renderImagePreloadLink, } from './image.js'; | ||
| import { mkdir, writeFile, rm } from 'node:fs/promises'; | ||
| import { join } from 'node:path'; | ||
| import sharp from 'sharp'; | ||
| const TMP_DIR = join(process.cwd(), 'tmp-test-assets'); | ||
| async function createTestImage(filename, width, height) { | ||
| const buf = await sharp({ create: { width, height, channels: 3, background: { r: 100, g: 150, b: 200 } } }) | ||
| .jpeg({ quality: 80 }) | ||
| .toBuffer(); | ||
| const path = join(TMP_DIR, filename); | ||
| await writeFile(path, buf); | ||
| return path; | ||
| } | ||
| describe('renderImage', () => { | ||
| it('emits <picture> with AVIF and WebP sources', () => { | ||
| const html = renderImage({ src: '/hero.jpg', alt: 'Hero', width: 1280, height: 720 }); | ||
| expect(html).toContain('<picture'); | ||
| expect(html).toContain('type="image/avif"'); | ||
| expect(html).toContain('type="image/webp"'); | ||
| expect(html).toContain('<img'); | ||
| expect(html).toContain('alt="Hero"'); | ||
| expect(html).toContain('width="1280"'); | ||
| expect(html).toContain('height="720"'); | ||
| }); | ||
| it('omits width/height when fill is true', () => { | ||
| const html = renderImage({ src: '/bg.jpg', alt: 'Background', fill: true }); | ||
| expect(html).not.toContain('width='); | ||
| expect(html).not.toContain('height='); | ||
| expect(html).toContain('position:absolute'); | ||
| expect(html).toContain('object-fit:cover'); | ||
| }); | ||
| it('supports custom objectFit and objectPosition in fill mode', () => { | ||
| const html = renderImage({ | ||
| src: '/bg.jpg', | ||
| alt: 'Background', | ||
| fill: true, | ||
| objectFit: 'contain', | ||
| objectPosition: 'top left', | ||
| }); | ||
| expect(html).toContain('object-fit:contain'); | ||
| expect(html).toContain('object-position:top left'); | ||
| }); | ||
| it('emits plain <img> when unoptimized is true', () => { | ||
| const html = renderImage({ src: '/logo.svg', alt: 'Logo', width: 200, height: 200, unoptimized: true }); | ||
| expect(html).not.toContain('<picture'); | ||
| expect(html).toContain('<img'); | ||
| expect(html).toContain('src="/logo.svg"'); | ||
| expect(html).not.toContain('/_nexus/image'); | ||
| }); | ||
| it('includes width/height on unoptimized when not fill', () => { | ||
| const html = renderImage({ src: '/logo.svg', alt: 'Logo', width: 200, height: 200, unoptimized: true }); | ||
| expect(html).toContain('width="200"'); | ||
| expect(html).toContain('height="200"'); | ||
| }); | ||
| it('omits width/height on unoptimized when fill', () => { | ||
| const html = renderImage({ src: '/logo.svg', alt: 'Logo', unoptimized: true, fill: true }); | ||
| expect(html).not.toContain('width='); | ||
| expect(html).not.toContain('height='); | ||
| expect(html).toContain('position:absolute'); | ||
| }); | ||
| it('sets eager loading and high fetchpriority when priority is true', () => { | ||
| const html = renderImage({ src: '/hero.jpg', alt: 'Hero', width: 1280, height: 720, priority: true }); | ||
| expect(html).toContain('loading="eager"'); | ||
| expect(html).toContain('fetchpriority="high"'); | ||
| expect(html).toContain('decoding="sync"'); | ||
| }); | ||
| it('sets lazy loading by default', () => { | ||
| const html = renderImage({ src: '/hero.jpg', alt: 'Hero', width: 1280, height: 720 }); | ||
| expect(html).toContain('loading="lazy"'); | ||
| expect(html).toContain('decoding="async"'); | ||
| }); | ||
| it('includes round style when round is true', () => { | ||
| const html = renderImage({ src: '/avatar.jpg', alt: 'Avatar', size: 64, round: true }); | ||
| expect(html).toContain('border-radius:50%'); | ||
| }); | ||
| it('includes custom class attribute', () => { | ||
| const html = renderImage({ src: '/hero.jpg', alt: 'Hero', width: 1280, height: 720, class: 'my-img' }); | ||
| expect(html).toContain('class="my-img"'); | ||
| }); | ||
| it('supports size shorthand', () => { | ||
| const html = renderImage({ src: '/icon.jpg', alt: 'Icon', size: 64 }); | ||
| expect(html).toContain('width="64"'); | ||
| expect(html).toContain('height="64"'); | ||
| }); | ||
| it('escapes alt text with quotes', () => { | ||
| const html = renderImage({ src: '/x.jpg', alt: 'A "great" photo', width: 100, height: 100 }); | ||
| expect(html).toContain('alt="A "great" photo"'); | ||
| }); | ||
| it('applies additional inline style', () => { | ||
| const html = renderImage({ src: '/x.jpg', alt: 'X', width: 100, height: 100, style: 'border:1px solid red;' }); | ||
| expect(html).toContain('border:1px solid red;'); | ||
| }); | ||
| it('generates blur placeholder when blurDataURL is provided', () => { | ||
| const html = renderImage({ | ||
| src: '/hero.jpg', | ||
| alt: 'Hero', | ||
| width: 1280, | ||
| height: 720, | ||
| blurDataURL: 'data:image/jpeg;base64,abc123', | ||
| }); | ||
| expect(html).toContain('data-nx-blur'); | ||
| expect(html).toContain('background-image:url("data:image/jpeg;base64,abc123")'); | ||
| expect(html).toContain('opacity:0'); | ||
| }); | ||
| it('falls back to solid background when blurDataURL is missing', () => { | ||
| const html = renderImage({ src: '/hero.jpg', alt: 'Hero', width: 1280, height: 720 }); | ||
| expect(html).toContain('data-nx-blur'); | ||
| expect(html).toContain('background:var(--nx-img-blur,#e8e8e8)'); | ||
| }); | ||
| it('can disable placeholder', () => { | ||
| const html = renderImage({ src: '/hero.jpg', alt: 'Hero', width: 1280, height: 720, placeholder: 'none' }); | ||
| expect(html).not.toContain('data-nx-blur'); | ||
| }); | ||
| }); | ||
| describe('Image alias', () => { | ||
| it('is the same function as renderImage', () => { | ||
| expect(Image).toBe(renderImage); | ||
| }); | ||
| }); | ||
| describe('imageUrl', () => { | ||
| it('builds local optimized URL with format', () => { | ||
| const url = imageUrl('/photo.jpg', 800, 'webp', 85); | ||
| expect(url).toBe('/_nexus/image?src=%2Fphoto.jpg&w=800&f=webp&q=85'); | ||
| }); | ||
| it('builds local original URL without format param', () => { | ||
| const url = imageUrl('/photo.jpg', 800, 'original', 85); | ||
| expect(url).toBe('/_nexus/image?src=%2Fphoto.jpg&w=800&q=85'); | ||
| }); | ||
| it('builds remote URL with url param', () => { | ||
| const url = imageUrl('https://example.com/img.jpg', 640, 'avif', 80); | ||
| expect(url).toBe('/_nexus/image?url=https%3A%2F%2Fexample.com%2Fimg.jpg&w=640&f=avif&q=80'); | ||
| }); | ||
| }); | ||
| describe('renderImagePreloadLink', () => { | ||
| it('generates preload link for optimized image', () => { | ||
| const link = renderImagePreloadLink({ src: '/hero.jpg', alt: 'Hero', width: 1280, height: 720, priority: true }); | ||
| expect(link).toContain('<link rel="preload" as="image"'); | ||
| expect(link).toContain('/_nexus/image'); | ||
| }); | ||
| it('generates preload link for unoptimized image', () => { | ||
| const link = renderImagePreloadLink({ src: '/logo.svg', alt: 'Logo', unoptimized: true }); | ||
| expect(link).toBe('<link rel="preload" as="image" href="/logo.svg">'); | ||
| }); | ||
| }); | ||
| describe('getImageDimensions', () => { | ||
| beforeAll(async () => { | ||
| await mkdir(TMP_DIR, { recursive: true }); | ||
| await createTestImage('test-400x300.jpg', 400, 300); | ||
| }); | ||
| afterAll(async () => { | ||
| await rm(TMP_DIR, { recursive: true, force: true }); | ||
| }); | ||
| it('reads width and height from a JPEG', async () => { | ||
| const dims = await getImageDimensions('/test-400x300.jpg', TMP_DIR); | ||
| expect(dims.width).toBe(400); | ||
| expect(dims.height).toBe(300); | ||
| }); | ||
| it('throws on invalid path', async () => { | ||
| await expect(getImageDimensions('/../escape.jpg', TMP_DIR)).rejects.toThrow('Invalid image path'); | ||
| }); | ||
| }); | ||
| describe('getBlurDataURL', () => { | ||
| beforeAll(async () => { | ||
| await mkdir(TMP_DIR, { recursive: true }); | ||
| await createTestImage('blur-test.jpg', 200, 200); | ||
| }); | ||
| afterAll(async () => { | ||
| await rm(TMP_DIR, { recursive: true, force: true }); | ||
| }); | ||
| it('returns a base64 data URI', async () => { | ||
| const uri = await getBlurDataURL('/blur-test.jpg', TMP_DIR); | ||
| expect(uri).toMatch(/^data:image\/jpeg;base64,/); | ||
| expect(uri.length).toBeGreaterThan(100); | ||
| }); | ||
| it('throws on invalid path', async () => { | ||
| await expect(getBlurDataURL('/../escape.jpg', TMP_DIR)).rejects.toThrow('Invalid image path'); | ||
| }); | ||
| }); | ||
| //# sourceMappingURL=image.test.js.map |
| {"version":3,"file":"image.test.js","sourceRoot":"","sources":["../src/image.test.ts"],"names":[],"mappings":"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"} |
+71
-1
@@ -37,6 +37,35 @@ /** | ||
| formats?: ImageFormat[]; | ||
| /** Placeholder strategy */ | ||
| /** | ||
| * Placeholder strategy. | ||
| * - 'blur': Show a real LQIP inline base64 thumbnail until the image loads. | ||
| * Pass a precomputed `blurDataURL` (from `generateBlurDataURL`) for best results; | ||
| * otherwise falls back to a solid gray background. | ||
| * - 'empty': Transparent placeholder, no background fill. | ||
| * - 'none': No placeholder at all. | ||
| */ | ||
| placeholder?: 'blur' | 'empty' | 'none'; | ||
| /** | ||
| * Pre-computed base64 LQIP data URI (e.g. from `generateBlurDataURL`). | ||
| * When provided alongside `placeholder="blur"`, this is inlined as the | ||
| * `background-image` so the user sees a blurred preview immediately. | ||
| */ | ||
| blurDataURL?: string; | ||
| /** Fetch priority hint */ | ||
| fetchpriority?: 'high' | 'low' | 'auto'; | ||
| /** | ||
| * Fill mode: the image stretches to fill its nearest positioned ancestor. | ||
| * Useful for hero sections, backgrounds, and responsive containers. | ||
| * When true, width/height are not rendered as attributes; use CSS on the parent. | ||
| */ | ||
| fill?: boolean; | ||
| /** Object-fit value when fill mode is active (default: 'cover') */ | ||
| objectFit?: 'cover' | 'contain' | 'fill' | 'none' | 'scale-down'; | ||
| /** Object-position value when fill mode is active (default: 'center') */ | ||
| objectPosition?: string; | ||
| /** Bypass optimization and serve the original image URL. | ||
| * Useful for SVGs, GIFs, or when you want the browser to handle the image natively. | ||
| */ | ||
| unoptimized?: boolean; | ||
| /** Additional inline styles appended to the generated style attribute */ | ||
| style?: string; | ||
| } | ||
@@ -62,3 +91,23 @@ export type ImageFormat = 'avif' | 'webp' | 'png' | 'jpg' | 'original'; | ||
| export declare function renderImage(props: ImageProps): string; | ||
| /** Alias corto de {@link renderImage} para uso en templates `.nx` */ | ||
| export declare const Image: typeof renderImage; | ||
| /** | ||
| * Reads intrinsic width and height from a local image file using sharp metadata. | ||
| * Useful when you don't know the dimensions ahead of time. | ||
| */ | ||
| export declare function getImageDimensions(src: string, publicDir: string): Promise<{ | ||
| width: number; | ||
| height: number; | ||
| }>; | ||
| /** | ||
| * Generates a blur data URI from a local public-dir image path. | ||
| * Convenience wrapper around `generateBlurDataURL` + `safeResolvePublicPath`. | ||
| */ | ||
| export declare function getBlurDataURL(src: string, publicDir: string): Promise<string>; | ||
| /** | ||
| * Generates a `<link rel="preload" as="image">` tag for critical above-the-fold images. | ||
| * Inject this into `<head>` via `defineHead({ links: [...] })` or the `head` return from `load()`. | ||
| */ | ||
| export declare function renderImagePreloadLink(props: ImageProps): string; | ||
| /** | ||
| * Transforms an image URL into an optimized variant URL. | ||
@@ -71,2 +120,23 @@ * In production, this calls the /_nexus/image endpoint which does real conversion. | ||
| export declare function handleImageRequest(request: Request, options?: ImageHandlerOptions): Promise<Response>; | ||
| /** | ||
| * Generates a tiny 10×10 blurred JPEG encoded as a base64 data URI. | ||
| * Inline this into `ImageProps.blurDataURL` so `renderImage` can embed it | ||
| * directly in the HTML without a round-trip fetch. | ||
| * | ||
| * ```ts | ||
| * // In a server load function or SSR route: | ||
| * const blurDataURL = await generateBlurDataURL(imageBuffer); | ||
| * return renderImage({ src: '/hero.jpg', alt: 'Hero', blurDataURL }); | ||
| * ``` | ||
| */ | ||
| export declare function generateBlurDataURL(input: Buffer): Promise<string>; | ||
| /** | ||
| * Generates a LQIP data URI from a local public-dir file path. | ||
| * Convenience wrapper around `generateBlurDataURL`. | ||
| * | ||
| * ```ts | ||
| * const blur = await blurFromFile('/absolute/path/to/public/hero.jpg'); | ||
| * ``` | ||
| */ | ||
| export declare function blurFromFile(absolutePath: string): Promise<string>; | ||
| //# sourceMappingURL=image.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kCAAkC;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACxC,0BAA0B;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;CACzC;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,uEAAuE;AACvE,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAiErD;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,WAAW,GAAG,UAAU,EAChC,OAAO,EAAE,MAAM,GACd,MAAM,CASR;AAID,kDAAkD;AAClD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,QAAQ,CAAC,CA8DnB"} | ||
| {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"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"} |
+264
-29
@@ -19,2 +19,4 @@ /** | ||
| import { readFile } from 'node:fs/promises'; | ||
| import { lookup } from 'node:dns/promises'; | ||
| import { isIP } from 'node:net'; | ||
| import { join, resolve, sep } from 'node:path'; | ||
@@ -31,3 +33,3 @@ import sharp from 'sharp'; | ||
| export function renderImage(props) { | ||
| const { src, alt, priority = false, round = false, quality = 80, formats = DEFAULT_FORMATS, placeholder = 'blur', fetchpriority, } = props; | ||
| const { src, alt, priority = false, round = false, quality = 80, formats = DEFAULT_FORMATS, placeholder = 'blur', blurDataURL, fetchpriority, fill = false, objectFit = 'cover', objectPosition = 'center', unoptimized = false, style, } = props; | ||
| const w = props.size ?? props.width; | ||
@@ -38,7 +40,20 @@ const h = props.size ?? props.height; | ||
| const fp = fetchpriority ?? (priority ? 'high' : 'auto'); | ||
| const widths = w ? getResponsiveWidths(w) : DEFAULT_WIDTHS; | ||
| const classAttr = props.class ? ` class="${props.class}"` : ''; | ||
| // ── Unoptimized passthrough (SVGs, GIFs, or explicit opt-out) ───────────── | ||
| if (unoptimized) { | ||
| const dimAttrs = !fill && w && h ? `width="${w}" height="${h}"` : ''; | ||
| const fillStyle = fill | ||
| ? `position:absolute;top:0;left:0;width:100%;height:100%;object-fit:${objectFit};object-position:${objectPosition};` | ||
| : ''; | ||
| const roundStyle = round ? 'border-radius:50%;' : ''; | ||
| const extraStyle = style ? (style.endsWith(';') ? style : style + ';') : ''; | ||
| const styleAttr = fillStyle || roundStyle || extraStyle | ||
| ? ` style="${fillStyle}${roundStyle}${extraStyle}"` | ||
| : ''; | ||
| return `<img${classAttr}${styleAttr} src="${escapeAttr(src)}" alt="${escapeAttr(alt)}" ${dimAttrs}loading="${loading}" decoding="${decoding}" fetchpriority="${fp}" data-nx-img>`; | ||
| } | ||
| const widths = w && !fill ? getResponsiveWidths(w) : DEFAULT_WIDTHS; | ||
| const sizesAttr = props.sizes ?? defaultSizes(widths); | ||
| const roundStyle = round ? 'border-radius:50%;' : ''; | ||
| const aspectStyle = w && h ? `aspect-ratio:${w}/${h};` : ''; | ||
| const classAttr = props.class ? ` class="${props.class}"` : ''; | ||
| const aspectStyle = w && h && !fill ? `aspect-ratio:${w}/${h};` : ''; | ||
| // Build <source> elements for modern formats | ||
@@ -58,10 +73,29 @@ const sources = formats | ||
| .join(', '); | ||
| const dimensionAttrs = [ | ||
| w ? `width="${w}"` : '', | ||
| h ? `height="${h}"` : '', | ||
| ].filter(Boolean).join(' '); | ||
| const blurAttr = placeholder === 'blur' | ||
| ? ` data-nx-blur style="${aspectStyle}${roundStyle}background:var(--nx-img-blur,#f0f0f0)"` | ||
| : ` style="${aspectStyle}${roundStyle}"`; | ||
| return `<picture${classAttr}> | ||
| const dimensionAttrs = !fill && w && h | ||
| ? `width="${w}" height="${h}"` | ||
| : ''; | ||
| // ── Placeholder / blur strategy ────────────────────────────────────────── | ||
| let pictureExtraAttrs = ''; | ||
| let imgStyleAttr = ''; | ||
| let imgOnload = ''; | ||
| const fillStyle = fill | ||
| ? `position:absolute;top:0;left:0;width:100%;height:100%;object-fit:${objectFit};object-position:${objectPosition};` | ||
| : ''; | ||
| const extraStyle = style ? (style.endsWith(';') ? style : style + ';') : ''; | ||
| if (placeholder === 'blur') { | ||
| const bgImage = blurDataURL | ||
| ? `background-image:url("${blurDataURL}");background-size:cover;background-position:center;` | ||
| : 'background:var(--nx-img-blur,#e8e8e8);'; | ||
| pictureExtraAttrs = | ||
| ` data-nx-blur style="${aspectStyle}${roundStyle}${fillStyle}overflow:hidden;${bgImage}${extraStyle}"`; | ||
| imgStyleAttr = ` style="opacity:0;transition:opacity 0.4s ease;"`; | ||
| imgOnload = ` onload="this.style.opacity='1';this.parentElement.removeAttribute('data-nx-blur')"`; | ||
| } | ||
| else { | ||
| const combined = `${aspectStyle}${roundStyle}${fillStyle}${extraStyle}`; | ||
| pictureExtraAttrs = combined | ||
| ? ` style="${combined}"` | ||
| : ''; | ||
| } | ||
| return `<picture${classAttr}${pictureExtraAttrs}> | ||
| ${sources} | ||
@@ -76,3 +110,3 @@ <img | ||
| decoding="${decoding}" | ||
| fetchpriority="${fp}"${blurAttr} | ||
| fetchpriority="${fp}"${imgStyleAttr}${imgOnload} | ||
| data-nx-img | ||
@@ -82,3 +116,43 @@ > | ||
| } | ||
| /** Alias corto de {@link renderImage} para uso en templates `.nx` */ | ||
| export const Image = renderImage; | ||
| /** | ||
| * Reads intrinsic width and height from a local image file using sharp metadata. | ||
| * Useful when you don't know the dimensions ahead of time. | ||
| */ | ||
| export async function getImageDimensions(src, publicDir) { | ||
| const path = safeResolvePublicPath(publicDir, src); | ||
| if (!path) { | ||
| throw new Error(`Invalid image path: ${src}`); | ||
| } | ||
| const meta = await sharp(path).metadata(); | ||
| if (!meta.width || !meta.height) { | ||
| throw new Error(`Could not read dimensions from: ${src}`); | ||
| } | ||
| return { width: meta.width, height: meta.height }; | ||
| } | ||
| /** | ||
| * Generates a blur data URI from a local public-dir image path. | ||
| * Convenience wrapper around `generateBlurDataURL` + `safeResolvePublicPath`. | ||
| */ | ||
| export async function getBlurDataURL(src, publicDir) { | ||
| const path = safeResolvePublicPath(publicDir, src); | ||
| if (!path) { | ||
| throw new Error(`Invalid image path: ${src}`); | ||
| } | ||
| return blurFromFile(path); | ||
| } | ||
| /** | ||
| * Generates a `<link rel="preload" as="image">` tag for critical above-the-fold images. | ||
| * Inject this into `<head>` via `defineHead({ links: [...] })` or the `head` return from `load()`. | ||
| */ | ||
| export function renderImagePreloadLink(props) { | ||
| const { src, unoptimized = false, quality = 80 } = props; | ||
| if (unoptimized) { | ||
| return `<link rel="preload" as="image" href="${escapeAttr(src)}">`; | ||
| } | ||
| const w = props.size ?? props.width ?? 800; | ||
| return `<link rel="preload" as="image" href="${imageUrl(src, w, 'original', quality)}" imagesrcset="${imageUrl(src, w, 'original', quality)}" imagesizes="${props.sizes ?? '100vw'}">`; | ||
| } | ||
| /** | ||
| * Transforms an image URL into an optimized variant URL. | ||
@@ -99,2 +173,3 @@ * In production, this calls the /_nexus/image endpoint which does real conversion. | ||
| const REMOTE_MAX_BYTES = 12 * 1024 * 1024; | ||
| const REMOTE_MAX_REDIRECTS = 5; | ||
| /** HTTP handler for the /_nexus/image endpoint */ | ||
@@ -109,2 +184,3 @@ export async function handleImageRequest(request, options = {}) { | ||
| const quality = Math.min(Math.max(parseInt(url.searchParams.get('q') ?? '80', 10) || 80, 1), 100); | ||
| const isBlurRequest = url.searchParams.get('blur') === '1'; | ||
| // Only honor `f=` when present. Omitted `f` means "original" raster (JPEG/PNG), not Accept-based AVIF/WebP, | ||
@@ -123,3 +199,14 @@ // so <picture><source type=avif> and <img> fallback stay distinct. | ||
| } | ||
| const fetched = await fetchRemoteImage(remoteUrl); | ||
| let parsed; | ||
| try { | ||
| parsed = new URL(remoteUrl); | ||
| } | ||
| catch { | ||
| return new Response('Invalid URL', { status: 400 }); | ||
| } | ||
| const safe = await isSafeRemoteUrl(parsed); | ||
| if (!safe) { | ||
| return new Response('URL blocked', { status: 400 }); | ||
| } | ||
| const fetched = await fetchRemoteImage(parsed); | ||
| if (!fetched) { | ||
@@ -129,3 +216,3 @@ return new Response('Failed to fetch image', { status: 502 }); | ||
| input = fetched; | ||
| sourceLabel = remoteUrl; | ||
| sourceLabel = parsed.toString(); | ||
| } | ||
@@ -151,2 +238,18 @@ else if (src) { | ||
| } | ||
| if (isBlurRequest) { | ||
| // Return a tiny LQIP JPEG (10×10, blurred) for inline data URI use. | ||
| const blurBuf = await sharp(input) | ||
| .resize(10, 10, { fit: 'inside', withoutEnlargement: false }) | ||
| .blur(3) | ||
| .jpeg({ quality: 20, mozjpeg: true }) | ||
| .toBuffer(); | ||
| return new Response(new Uint8Array(blurBuf), { | ||
| status: 200, | ||
| headers: { | ||
| ...cacheHeaders, | ||
| 'content-type': 'image/jpeg', | ||
| 'x-nexus-image-source': encodeURIComponent(sourceLabel.slice(0, 200)), | ||
| }, | ||
| }); | ||
| } | ||
| const { body, contentType } = await encodeWithSharp(input, width, outputFormat, quality); | ||
@@ -181,16 +284,43 @@ return new Response(new Uint8Array(body), { | ||
| try { | ||
| const res = await fetch(remoteUrl, { | ||
| signal: ac.signal, | ||
| headers: { 'user-agent': 'NexusImage/1.0' }, | ||
| redirect: 'follow', | ||
| }); | ||
| if (!res.ok) | ||
| return null; | ||
| const len = res.headers.get('content-length'); | ||
| if (len && Number(len) > REMOTE_MAX_BYTES) | ||
| return null; | ||
| const buf = Buffer.from(await res.arrayBuffer()); | ||
| if (buf.length > REMOTE_MAX_BYTES) | ||
| return null; | ||
| return buf; | ||
| let current = typeof remoteUrl === 'string' ? new URL(remoteUrl) : remoteUrl; | ||
| for (let i = 0; i <= REMOTE_MAX_REDIRECTS; i++) { | ||
| const res = await fetch(current.toString(), { | ||
| signal: ac.signal, | ||
| headers: { | ||
| 'user-agent': 'NexusImage/1.0', | ||
| 'accept': 'image/avif,image/webp,image/*,*/*;q=0.8', | ||
| }, | ||
| redirect: 'manual', | ||
| }); | ||
| if (res.status >= 300 && res.status < 400) { | ||
| const loc = res.headers.get('location'); | ||
| if (!loc) | ||
| return null; | ||
| let next; | ||
| try { | ||
| next = new URL(loc, current); | ||
| } | ||
| catch { | ||
| return null; | ||
| } | ||
| const safe = await isSafeRemoteUrl(next); | ||
| if (!safe) | ||
| return null; | ||
| current = next; | ||
| continue; | ||
| } | ||
| if (!res.ok) | ||
| return null; | ||
| const ct = (res.headers.get('content-type') ?? '').toLowerCase(); | ||
| if (ct && !ct.startsWith('image/')) | ||
| return null; | ||
| const len = res.headers.get('content-length'); | ||
| if (len && Number(len) > REMOTE_MAX_BYTES) | ||
| return null; | ||
| const buf = Buffer.from(await res.arrayBuffer()); | ||
| if (buf.length > REMOTE_MAX_BYTES) | ||
| return null; | ||
| return buf; | ||
| } | ||
| return null; | ||
| } | ||
@@ -204,2 +334,75 @@ catch { | ||
| } | ||
| async function isSafeRemoteUrl(u) { | ||
| if (u.protocol !== 'http:' && u.protocol !== 'https:') | ||
| return false; | ||
| if (u.username || u.password) | ||
| return false; | ||
| const hostname = u.hostname; | ||
| if (!hostname) | ||
| return false; | ||
| const lower = hostname.toLowerCase(); | ||
| if (lower === 'localhost' || lower.endsWith('.localhost')) | ||
| return false; | ||
| const ipType = isIP(hostname); | ||
| if (ipType) { | ||
| return !isPrivateIp(hostname); | ||
| } | ||
| try { | ||
| const addrs = await lookup(hostname, { all: true, verbatim: true }); | ||
| if (!addrs.length) | ||
| return false; | ||
| for (const a of addrs) { | ||
| if (isPrivateIp(a.address)) | ||
| return false; | ||
| } | ||
| } | ||
| catch { | ||
| return false; | ||
| } | ||
| return true; | ||
| } | ||
| function isPrivateIp(ip) { | ||
| if (ip.includes(':')) { | ||
| const norm = ip.toLowerCase(); | ||
| if (norm === '::' || norm === '::1') | ||
| return true; | ||
| if (norm.startsWith('fe80:')) | ||
| return true; | ||
| if (norm.startsWith('fc') || norm.startsWith('fd')) | ||
| return true; | ||
| if (norm.startsWith('ff')) | ||
| return true; | ||
| return false; | ||
| } | ||
| const parts = ip.split('.').map(p => Number(p)); | ||
| if (parts.length !== 4 || parts.some(n => !Number.isInteger(n) || n < 0 || n > 255)) | ||
| return true; | ||
| const a = parts[0]; | ||
| const b = parts[1]; | ||
| if (a === undefined) | ||
| return true; | ||
| if (a === 0) | ||
| return true; | ||
| if (a === 10) | ||
| return true; | ||
| if (a === 127) | ||
| return true; | ||
| if (a === 169 && b === 254) | ||
| return true; | ||
| if (a === 172 && b !== undefined && b >= 16 && b <= 31) | ||
| return true; | ||
| if (a === 172 && b !== undefined && b >= 16 && b <= 31) | ||
| return true; | ||
| if (a === 192 && b === 168) | ||
| return true; | ||
| if (a === 100 && b !== undefined && b >= 64 && b <= 127) | ||
| return true; | ||
| if (a === 192 && b === 0) | ||
| return true; | ||
| if (a === 198 && b !== undefined && (b === 18 || b === 19)) | ||
| return true; | ||
| if (a >= 224) | ||
| return true; | ||
| return false; | ||
| } | ||
| async function encodeWithSharp(input, width, outputFormat, quality) { | ||
@@ -246,2 +449,34 @@ let pipeline = sharp(input).rotate().resize({ | ||
| } | ||
| // ── LQIP (Low Quality Image Placeholder) ─────────────────────────────────── | ||
| /** | ||
| * Generates a tiny 10×10 blurred JPEG encoded as a base64 data URI. | ||
| * Inline this into `ImageProps.blurDataURL` so `renderImage` can embed it | ||
| * directly in the HTML without a round-trip fetch. | ||
| * | ||
| * ```ts | ||
| * // In a server load function or SSR route: | ||
| * const blurDataURL = await generateBlurDataURL(imageBuffer); | ||
| * return renderImage({ src: '/hero.jpg', alt: 'Hero', blurDataURL }); | ||
| * ``` | ||
| */ | ||
| export async function generateBlurDataURL(input) { | ||
| const buf = await sharp(input) | ||
| .resize(10, 10, { fit: 'inside', withoutEnlargement: false }) | ||
| .blur(3) | ||
| .jpeg({ quality: 30, mozjpeg: true }) | ||
| .toBuffer(); | ||
| return `data:image/jpeg;base64,${buf.toString('base64')}`; | ||
| } | ||
| /** | ||
| * Generates a LQIP data URI from a local public-dir file path. | ||
| * Convenience wrapper around `generateBlurDataURL`. | ||
| * | ||
| * ```ts | ||
| * const blur = await blurFromFile('/absolute/path/to/public/hero.jpg'); | ||
| * ``` | ||
| */ | ||
| export async function blurFromFile(absolutePath) { | ||
| const input = await readFile(absolutePath); | ||
| return generateBlurDataURL(input); | ||
| } | ||
| //# sourceMappingURL=image.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"image.js","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"image.js","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"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"} |
+2
-2
@@ -1,5 +0,5 @@ | ||
| export { renderImage, imageUrl, handleImageRequest } from './image.js'; | ||
| export type { ImageProps, ImageFormat, OptimizedImageSrc, ImageHandlerOptions } from './image.js'; | ||
| export { renderImage, Image, imageUrl, handleImageRequest, generateBlurDataURL, blurFromFile, getImageDimensions, getBlurDataURL, renderImagePreloadLink, } from './image.js'; | ||
| export type { ImageProps, ImageFormat, OptimizedImageSrc, ImageHandlerOptions, } from './image.js'; | ||
| export { optimizeFonts, extractFontPreloads } from './fonts.js'; | ||
| export type { FontConfig, FontStrategy, GoogleFont, LocalFont, FontOutput } from './fonts.js'; | ||
| //# sourceMappingURL=index.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAClG,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAChE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,KAAK,EACL,QAAQ,EACR,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,sBAAsB,GACvB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAChE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"} |
+1
-1
@@ -1,3 +0,3 @@ | ||
| export { renderImage, imageUrl, handleImageRequest } from './image.js'; | ||
| export { renderImage, Image, imageUrl, handleImageRequest, generateBlurDataURL, blurFromFile, getImageDimensions, getBlurDataURL, renderImagePreloadLink, } from './image.js'; | ||
| export { optimizeFonts, extractFontPreloads } from './fonts.js'; | ||
| //# sourceMappingURL=index.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEvE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,KAAK,EACL,QAAQ,EACR,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAOpB,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"} |
+6
-1
| { | ||
| "name": "@nexus_js/assets", | ||
| "version": "0.9.29", | ||
| "version": "0.9.30", | ||
| "description": "Nexus asset pipeline — image optimization (AVIF/WebP), font injection, lazy loading", | ||
@@ -39,2 +39,6 @@ "type": "module", | ||
| }, | ||
| "funding": { | ||
| "type": "individual", | ||
| "url": "https://buymeacoffee.com/bierfor084" | ||
| }, | ||
| "keywords": [ | ||
@@ -61,4 +65,5 @@ "nexus", | ||
| "dev": "tsc -p tsconfig.json --watch", | ||
| "typecheck": "tsc --noEmit -p tsconfig.json", | ||
| "clean": "rm -rf dist" | ||
| } | ||
| } |
+161
-6
| # @nexus_js/assets | ||
| Nexus asset pipeline — image optimization (AVIF/WebP), font injection, lazy loading. | ||
| Nexus asset pipeline — image optimization (AVIF/WebP), responsive srcsets, blur placeholders, and font preloading. | ||
| ## Documentation | ||
| ## Image Optimization | ||
| All guides, API reference, and examples live on **[nexusjs.dev](https://nexusjs.dev)**. | ||
| The fastest way to serve optimized images in Nexus. | ||
| ### Basic usage | ||
| In any `.nx` template, import `Image` and interpolate it directly: | ||
| ```nx | ||
| --- | ||
| import { Image } from '@nexus_js/assets'; | ||
| --- | ||
| {Image({ src: '/hero.jpg', alt: 'Hero', width: 1200, height: 600 })} | ||
| ``` | ||
| This generates a `<picture>` element with: | ||
| - AVIF source for modern browsers | ||
| - WebP fallback | ||
| - Original format fallback (`<img>`) | ||
| - Responsive `srcset` for breakpoints `[320, 640, 960, 1280, 1920]` | ||
| - Lazy loading by default | ||
| - Intrinsic `width` / `height` to prevent CLS | ||
| ### Fill mode (hero / background images) | ||
| When the image should fill its container: | ||
| ```nx | ||
| --- | ||
| import { Image } from '@nexus_js/assets'; | ||
| --- | ||
| <div style="position:relative;width:100%;height:60vh;"> | ||
| {Image({ src: '/hero.jpg', alt: 'Hero', fill: true, objectFit: 'cover', priority: true })} | ||
| </div> | ||
| ``` | ||
| `fill` removes `width`/`height` attributes and applies `position:absolute;inset:0` styles. The parent **must** have `position:relative`. | ||
| ### Priority (above-the-fold) | ||
| For images that appear immediately on load: | ||
| ```nx | ||
| {Image({ src: '/hero.jpg', alt: 'Hero', width: 1200, height: 600, priority: true })} | ||
| ``` | ||
| This sets `loading="eager"`, `decoding="sync"`, and `fetchpriority="high"`. | ||
| To also preload the image in `<head>`, return a `link` from your `load()`: | ||
| ```ts | ||
| import { renderImagePreloadLink } from '@nexus_js/assets'; | ||
| export async function load(ctx) { | ||
| return { | ||
| head: { | ||
| links: [ | ||
| { rel: 'preload', as: 'image', href: '/_nexus/image?src=%2Fhero.jpg&w=1200&q=80' }, | ||
| ], | ||
| }, | ||
| }; | ||
| } | ||
| ``` | ||
| ### Blur placeholder | ||
| For a smooth loading experience, generate a low-quality placeholder in `load()`: | ||
| ```ts | ||
| import { Image, getBlurDataURL } from '@nexus_js/assets'; | ||
| import { resolve } from 'node:path'; | ||
| export async function load(ctx) { | ||
| const publicDir = resolve(process.cwd(), 'public'); | ||
| const blurDataURL = await getBlurDataURL('/hero.jpg', publicDir); | ||
| return { | ||
| hero: { src: '/hero.jpg', alt: 'Hero', width: 1200, height: 600, blurDataURL }, | ||
| }; | ||
| } | ||
| ``` | ||
| ```nx | ||
| {Image(pretext.hero)} | ||
| ``` | ||
| ### Unoptimized mode | ||
| Bypass the optimizer for SVGs, GIFs, or when you need the original file: | ||
| ```nx | ||
| {Image({ src: '/logo.svg', alt: 'Logo', width: 200, height: 200, unoptimized: true })} | ||
| ``` | ||
| ### Automatic dimensions | ||
| If you don't know the image size ahead of time, read it at runtime: | ||
| ```ts | ||
| import { getImageDimensions } from '@nexus_js/assets'; | ||
| import { resolve } from 'node:path'; | ||
| export async function load(ctx) { | ||
| const publicDir = resolve(process.cwd(), 'public'); | ||
| const dims = await getImageDimensions('/photo.jpg', publicDir); | ||
| return { photo: { src: '/photo.jpg', alt: 'Photo', ...dims } }; | ||
| } | ||
| ``` | ||
| ### Remote images | ||
| External URLs are proxied safely through the optimizer: | ||
| ```nx | ||
| {Image({ src: 'https://example.com/photo.jpg', alt: 'Remote', width: 800, height: 600 })} | ||
| ``` | ||
| Security checks block private IPs, localhost, and non-HTTP(S) protocols automatically. | ||
| ## Full Image Props | ||
| | Prop | Type | Default | Description | | ||
| |------|------|---------|-------------| | ||
| | `src` | `string` | **required** | Local path (`/hero.jpg`) or remote URL | | ||
| | `alt` | `string` | **required** | Accessible description | | ||
| | `width` | `number` | — | Intrinsic width (prevents CLS) | | ||
| | `height` | `number` | — | Intrinsic height (prevents CLS) | | ||
| | `size` | `number` | — | Square shorthand (sets both width and height) | | ||
| | `sizes` | `string` | auto | `sizes` attribute for responsive images | | ||
| | `priority` | `boolean` | `false` | Eager loading + high fetchpriority | | ||
| | `round` | `boolean` | `false` | `border-radius: 50%` | | ||
| | `class` | `string` | — | Custom CSS class | | ||
| | `quality` | `number` | `80` | 1–100 compression quality | | ||
| | `formats` | `ImageFormat[]` | `['avif','webp','original']` | Output format priority | | ||
| | `placeholder` | `'blur' \| 'empty' \| 'none'` | `'blur'` | Loading placeholder strategy | | ||
| | `blurDataURL` | `string` | — | Inline base64 LQIP | | ||
| | `fetchpriority` | `'high' \| 'low' \| 'auto'` | auto | Browser fetch priority hint | | ||
| | `fill` | `boolean` | `false` | Fill parent container | | ||
| | `objectFit` | `string` | `'cover'` | CSS object-fit (fill mode) | | ||
| | `objectPosition` | `string` | `'center'` | CSS object-position (fill mode) | | ||
| | `unoptimized` | `boolean` | `false` | Bypass optimization | | ||
| | `style` | `string` | — | Additional inline styles | | ||
| ## API Reference | ||
| - `Image(props)` / `renderImage(props)` — generate optimized `<picture>` HTML | ||
| - `imageUrl(src, width, format, quality)` — build `/_nexus/image?...` URL | ||
| - `getImageDimensions(src, publicDir)` — read width/height via sharp | ||
| - `getBlurDataURL(src, publicDir)` — generate base64 LQIP | ||
| - `renderImagePreloadLink(props)` — generate `<link rel="preload">` tag | ||
| - `generateBlurDataURL(buffer)` — generate LQIP from a Buffer | ||
| - `blurFromFile(absolutePath)` — generate LQIP from disk | ||
| - `handleImageRequest(request, { publicDir })` — HTTP handler for `/_nexus/image` | ||
| ## Font Optimization | ||
| See `@nexus_js/assets/fonts` for Google Font inlining, preloading, and self-hosted font optimization. | ||
| ## Links | ||
| - **Website:** [https://nexusjs.dev](https://nexusjs.dev) | ||
| - **Repository:** [github.com/bierfor/nexus](https://github.com/bierfor/nexus) (see `packages/assets/`) | ||
| - **Issues:** [github.com/bierfor/nexus/issues](https://github.com/bierfor/nexus/issues) | ||
| - **Docs:** https://nexusjs.dev/docs/assets | ||
| - **Website:** https://nexusjs.dev | ||
| - **Repo:** https://github.com/bierfor/nexus | ||
@@ -15,0 +170,0 @@ ## License |
Network access
Supply chain riskThis module accesses the network.
Found 2 instances
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
83764
113.77%19
26.67%982
97.59%173
861.11%3
50%4
100%