@nexus_js/assets 0.9.28 → 0.9.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,171 +1,16 @@
1
1
  # @nexus_js/assets
2
2
 
3
- Nexus asset pipeline — image optimization (AVIF/WebP), responsive srcsets, blur placeholders, and font preloading.
3
+ Nexus asset pipeline — image optimization (AVIF/WebP), font injection, lazy loading.
4
4
 
5
- ## Image Optimization
5
+ ## Documentation
6
6
 
7
- The fastest way to serve optimized images in Nexus.
8
-
9
- ### Basic usage
10
-
11
- In any `.nx` template, import `Image` and interpolate it directly:
12
-
13
- ```nx
14
- ---
15
- import { Image } from '@nexus_js/assets';
16
- ---
17
-
18
- {Image({ src: '/hero.jpg', alt: 'Hero', width: 1200, height: 600 })}
19
- ```
20
-
21
- This generates a `<picture>` element with:
22
- - AVIF source for modern browsers
23
- - WebP fallback
24
- - Original format fallback (`<img>`)
25
- - Responsive `srcset` for breakpoints `[320, 640, 960, 1280, 1920]`
26
- - Lazy loading by default
27
- - Intrinsic `width` / `height` to prevent CLS
28
-
29
- ### Fill mode (hero / background images)
30
-
31
- When the image should fill its container:
32
-
33
- ```nx
34
- ---
35
- import { Image } from '@nexus_js/assets';
36
- ---
37
-
38
- <div style="position:relative;width:100%;height:60vh;">
39
- {Image({ src: '/hero.jpg', alt: 'Hero', fill: true, objectFit: 'cover', priority: true })}
40
- </div>
41
- ```
42
-
43
- `fill` removes `width`/`height` attributes and applies `position:absolute;inset:0` styles. The parent **must** have `position:relative`.
44
-
45
- ### Priority (above-the-fold)
46
-
47
- For images that appear immediately on load:
48
-
49
- ```nx
50
- {Image({ src: '/hero.jpg', alt: 'Hero', width: 1200, height: 600, priority: true })}
51
- ```
52
-
53
- This sets `loading="eager"`, `decoding="sync"`, and `fetchpriority="high"`.
54
-
55
- To also preload the image in `<head>`, return a `link` from your `load()`:
56
-
57
- ```ts
58
- import { renderImagePreloadLink } from '@nexus_js/assets';
59
-
60
- export async function load(ctx) {
61
- return {
62
- head: {
63
- links: [
64
- { rel: 'preload', as: 'image', href: '/_nexus/image?src=%2Fhero.jpg&w=1200&q=80' },
65
- ],
66
- },
67
- };
68
- }
69
- ```
70
-
71
- ### Blur placeholder
72
-
73
- For a smooth loading experience, generate a low-quality placeholder in `load()`:
74
-
75
- ```ts
76
- import { Image, getBlurDataURL } from '@nexus_js/assets';
77
- import { resolve } from 'node:path';
78
-
79
- export async function load(ctx) {
80
- const publicDir = resolve(process.cwd(), 'public');
81
- const blurDataURL = await getBlurDataURL('/hero.jpg', publicDir);
82
- return {
83
- hero: { src: '/hero.jpg', alt: 'Hero', width: 1200, height: 600, blurDataURL },
84
- };
85
- }
86
- ```
87
-
88
- ```nx
89
- {Image(pretext.hero)}
90
- ```
91
-
92
- ### Unoptimized mode
93
-
94
- Bypass the optimizer for SVGs, GIFs, or when you need the original file:
95
-
96
- ```nx
97
- {Image({ src: '/logo.svg', alt: 'Logo', width: 200, height: 200, unoptimized: true })}
98
- ```
99
-
100
- ### Automatic dimensions
101
-
102
- If you don't know the image size ahead of time, read it at runtime:
103
-
104
- ```ts
105
- import { getImageDimensions } from '@nexus_js/assets';
106
- import { resolve } from 'node:path';
107
-
108
- export async function load(ctx) {
109
- const publicDir = resolve(process.cwd(), 'public');
110
- const dims = await getImageDimensions('/photo.jpg', publicDir);
111
- return { photo: { src: '/photo.jpg', alt: 'Photo', ...dims } };
112
- }
113
- ```
114
-
115
- ### Remote images
116
-
117
- External URLs are proxied safely through the optimizer:
118
-
119
- ```nx
120
- {Image({ src: 'https://example.com/photo.jpg', alt: 'Remote', width: 800, height: 600 })}
121
- ```
122
-
123
- Security checks block private IPs, localhost, and non-HTTP(S) protocols automatically.
124
-
125
- ## Full Image Props
126
-
127
- | Prop | Type | Default | Description |
128
- |------|------|---------|-------------|
129
- | `src` | `string` | **required** | Local path (`/hero.jpg`) or remote URL |
130
- | `alt` | `string` | **required** | Accessible description |
131
- | `width` | `number` | — | Intrinsic width (prevents CLS) |
132
- | `height` | `number` | — | Intrinsic height (prevents CLS) |
133
- | `size` | `number` | — | Square shorthand (sets both width and height) |
134
- | `sizes` | `string` | auto | `sizes` attribute for responsive images |
135
- | `priority` | `boolean` | `false` | Eager loading + high fetchpriority |
136
- | `round` | `boolean` | `false` | `border-radius: 50%` |
137
- | `class` | `string` | — | Custom CSS class |
138
- | `quality` | `number` | `80` | 1–100 compression quality |
139
- | `formats` | `ImageFormat[]` | `['avif','webp','original']` | Output format priority |
140
- | `placeholder` | `'blur' \| 'empty' \| 'none'` | `'blur'` | Loading placeholder strategy |
141
- | `blurDataURL` | `string` | — | Inline base64 LQIP |
142
- | `fetchpriority` | `'high' \| 'low' \| 'auto'` | auto | Browser fetch priority hint |
143
- | `fill` | `boolean` | `false` | Fill parent container |
144
- | `objectFit` | `string` | `'cover'` | CSS object-fit (fill mode) |
145
- | `objectPosition` | `string` | `'center'` | CSS object-position (fill mode) |
146
- | `unoptimized` | `boolean` | `false` | Bypass optimization |
147
- | `style` | `string` | — | Additional inline styles |
148
-
149
- ## API Reference
150
-
151
- - `Image(props)` / `renderImage(props)` — generate optimized `<picture>` HTML
152
- - `imageUrl(src, width, format, quality)` — build `/_nexus/image?...` URL
153
- - `getImageDimensions(src, publicDir)` — read width/height via sharp
154
- - `getBlurDataURL(src, publicDir)` — generate base64 LQIP
155
- - `renderImagePreloadLink(props)` — generate `<link rel="preload">` tag
156
- - `generateBlurDataURL(buffer)` — generate LQIP from a Buffer
157
- - `blurFromFile(absolutePath)` — generate LQIP from disk
158
- - `handleImageRequest(request, { publicDir })` — HTTP handler for `/_nexus/image`
159
-
160
- ## Font Optimization
161
-
162
- See `@nexus_js/assets/fonts` for Google Font inlining, preloading, and self-hosted font optimization.
7
+ All guides, API reference, and examples live on **[nexusjs.dev](https://nexusjs.dev)**.
163
8
 
164
9
  ## Links
165
10
 
166
- - **Docs:** https://nexusjs.dev/docs/assets
167
- - **Website:** https://nexusjs.dev
168
- - **Repo:** https://github.com/bierfor/nexus
11
+ - **Website:** [https://nexusjs.dev](https://nexusjs.dev)
12
+ - **Repository:** [github.com/bierfor/nexus](https://github.com/bierfor/nexus) (see `packages/assets/`)
13
+ - **Issues:** [github.com/bierfor/nexus/issues](https://github.com/bierfor/nexus/issues)
169
14
 
170
15
  ## License
171
16
 
package/dist/image.d.ts CHANGED
@@ -34,39 +34,10 @@ export interface ImageProps {
34
34
  quality?: number;
35
35
  /** Output formats in priority order */
36
36
  formats?: ImageFormat[];
37
- /**
38
- * Placeholder strategy.
39
- * - 'blur': Show a real LQIP inline base64 thumbnail until the image loads.
40
- * Pass a precomputed `blurDataURL` (from `generateBlurDataURL`) for best results;
41
- * otherwise falls back to a solid gray background.
42
- * - 'empty': Transparent placeholder, no background fill.
43
- * - 'none': No placeholder at all.
44
- */
37
+ /** Placeholder strategy */
45
38
  placeholder?: 'blur' | 'empty' | 'none';
46
- /**
47
- * Pre-computed base64 LQIP data URI (e.g. from `generateBlurDataURL`).
48
- * When provided alongside `placeholder="blur"`, this is inlined as the
49
- * `background-image` so the user sees a blurred preview immediately.
50
- */
51
- blurDataURL?: string;
52
39
  /** Fetch priority hint */
53
40
  fetchpriority?: 'high' | 'low' | 'auto';
54
- /**
55
- * Fill mode: the image stretches to fill its nearest positioned ancestor.
56
- * Useful for hero sections, backgrounds, and responsive containers.
57
- * When true, width/height are not rendered as attributes; use CSS on the parent.
58
- */
59
- fill?: boolean;
60
- /** Object-fit value when fill mode is active (default: 'cover') */
61
- objectFit?: 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';
62
- /** Object-position value when fill mode is active (default: 'center') */
63
- objectPosition?: string;
64
- /** Bypass optimization and serve the original image URL.
65
- * Useful for SVGs, GIFs, or when you want the browser to handle the image natively.
66
- */
67
- unoptimized?: boolean;
68
- /** Additional inline styles appended to the generated style attribute */
69
- style?: string;
70
41
  }
71
42
  export type ImageFormat = 'avif' | 'webp' | 'png' | 'jpg' | 'original';
72
43
  export interface OptimizedImageSrc {
@@ -87,26 +58,6 @@ export interface ImageHandlerOptions {
87
58
  * This runs on the SERVER at build or request time.
88
59
  */
89
60
  export declare function renderImage(props: ImageProps): string;
90
- /** Alias corto de {@link renderImage} para uso en templates `.nx` */
91
- export declare const Image: typeof renderImage;
92
- /**
93
- * Reads intrinsic width and height from a local image file using sharp metadata.
94
- * Useful when you don't know the dimensions ahead of time.
95
- */
96
- export declare function getImageDimensions(src: string, publicDir: string): Promise<{
97
- width: number;
98
- height: number;
99
- }>;
100
- /**
101
- * Generates a blur data URI from a local public-dir image path.
102
- * Convenience wrapper around `generateBlurDataURL` + `safeResolvePublicPath`.
103
- */
104
- export declare function getBlurDataURL(src: string, publicDir: string): Promise<string>;
105
- /**
106
- * Generates a `<link rel="preload" as="image">` tag for critical above-the-fold images.
107
- * Inject this into `<head>` via `defineHead({ links: [...] })` or the `head` return from `load()`.
108
- */
109
- export declare function renderImagePreloadLink(props: ImageProps): string;
110
61
  /**
111
62
  * Transforms an image URL into an optimized variant URL.
112
63
  * In production, this calls the /_nexus/image endpoint which does real conversion.
@@ -115,25 +66,4 @@ export declare function renderImagePreloadLink(props: ImageProps): string;
115
66
  export declare function imageUrl(src: string, width: number, format: ImageFormat | 'original', quality: number): string;
116
67
  /** HTTP handler for the /_nexus/image endpoint */
117
68
  export declare function handleImageRequest(request: Request, options?: ImageHandlerOptions): Promise<Response>;
118
- /**
119
- * Generates a tiny 10×10 blurred JPEG encoded as a base64 data URI.
120
- * Inline this into `ImageProps.blurDataURL` so `renderImage` can embed it
121
- * directly in the HTML without a round-trip fetch.
122
- *
123
- * ```ts
124
- * // In a server load function or SSR route:
125
- * const blurDataURL = await generateBlurDataURL(imageBuffer);
126
- * return renderImage({ src: '/hero.jpg', alt: 'Hero', blurDataURL });
127
- * ```
128
- */
129
- export declare function generateBlurDataURL(input: Buffer): Promise<string>;
130
- /**
131
- * Generates a LQIP data URI from a local public-dir file path.
132
- * Convenience wrapper around `generateBlurDataURL`.
133
- *
134
- * ```ts
135
- * const blur = await blurFromFile('/absolute/path/to/public/hero.jpg');
136
- * ```
137
- */
138
- export declare function blurFromFile(absolutePath: string): Promise<string>;
139
69
  //# sourceMappingURL=image.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"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"}
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"}
package/dist/image.js CHANGED
@@ -16,8 +16,6 @@
16
16
  * renderImage({ src: "/hero.jpg", alt: "Hero", width: 1280, height: 720, priority: true })
17
17
  */
18
18
  import { readFile } from 'node:fs/promises';
19
- import { lookup } from 'node:dns/promises';
20
- import { isIP } from 'node:net';
21
19
  import { join, resolve, sep } from 'node:path';
22
20
  import sharp from 'sharp';
23
21
  /** Default responsive breakpoints (px) */
@@ -29,30 +27,17 @@ const DEFAULT_FORMATS = ['avif', 'webp', 'original'];
29
27
  * This runs on the SERVER at build or request time.
30
28
  */
31
29
  export function renderImage(props) {
32
- 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;
30
+ const { src, alt, priority = false, round = false, quality = 80, formats = DEFAULT_FORMATS, placeholder = 'blur', fetchpriority, } = props;
33
31
  const w = props.size ?? props.width;
34
32
  const h = props.size ?? props.height;
35
33
  const loading = priority ? 'eager' : 'lazy';
36
34
  const decoding = priority ? 'sync' : 'async';
37
35
  const fp = fetchpriority ?? (priority ? 'high' : 'auto');
38
- const classAttr = props.class ? ` class="${props.class}"` : '';
39
- // ── Unoptimized passthrough (SVGs, GIFs, or explicit opt-out) ─────────────
40
- if (unoptimized) {
41
- const dimAttrs = !fill && w && h ? `width="${w}" height="${h}"` : '';
42
- const fillStyle = fill
43
- ? `position:absolute;top:0;left:0;width:100%;height:100%;object-fit:${objectFit};object-position:${objectPosition};`
44
- : '';
45
- const roundStyle = round ? 'border-radius:50%;' : '';
46
- const extraStyle = style ? (style.endsWith(';') ? style : style + ';') : '';
47
- const styleAttr = fillStyle || roundStyle || extraStyle
48
- ? ` style="${fillStyle}${roundStyle}${extraStyle}"`
49
- : '';
50
- return `<img${classAttr}${styleAttr} src="${escapeAttr(src)}" alt="${escapeAttr(alt)}" ${dimAttrs}loading="${loading}" decoding="${decoding}" fetchpriority="${fp}" data-nx-img>`;
51
- }
52
- const widths = w && !fill ? getResponsiveWidths(w) : DEFAULT_WIDTHS;
36
+ const widths = w ? getResponsiveWidths(w) : DEFAULT_WIDTHS;
53
37
  const sizesAttr = props.sizes ?? defaultSizes(widths);
54
38
  const roundStyle = round ? 'border-radius:50%;' : '';
55
- const aspectStyle = w && h && !fill ? `aspect-ratio:${w}/${h};` : '';
39
+ const aspectStyle = w && h ? `aspect-ratio:${w}/${h};` : '';
40
+ const classAttr = props.class ? ` class="${props.class}"` : '';
56
41
  // Build <source> elements for modern formats
57
42
  const sources = formats
58
43
  .filter((f) => f !== 'original')
@@ -67,33 +52,14 @@ export function renderImage(props) {
67
52
  const fallbackSrcset = widths
68
53
  .map((width) => `${imageUrl(src, width, 'original', quality)} ${width}w`)
69
54
  .join(', ');
70
- const dimensionAttrs = !fill && w && h
71
- ? `width="${w}" height="${h}"`
72
- : '';
73
- // ── Placeholder / blur strategy ──────────────────────────────────────────
74
- let pictureExtraAttrs = '';
75
- let imgStyleAttr = '';
76
- let imgOnload = '';
77
- const fillStyle = fill
78
- ? `position:absolute;top:0;left:0;width:100%;height:100%;object-fit:${objectFit};object-position:${objectPosition};`
79
- : '';
80
- const extraStyle = style ? (style.endsWith(';') ? style : style + ';') : '';
81
- if (placeholder === 'blur') {
82
- const bgImage = blurDataURL
83
- ? `background-image:url("${blurDataURL}");background-size:cover;background-position:center;`
84
- : 'background:var(--nx-img-blur,#e8e8e8);';
85
- pictureExtraAttrs =
86
- ` data-nx-blur style="${aspectStyle}${roundStyle}${fillStyle}overflow:hidden;${bgImage}${extraStyle}"`;
87
- imgStyleAttr = ` style="opacity:0;transition:opacity 0.4s ease;"`;
88
- imgOnload = ` onload="this.style.opacity='1';this.parentElement.removeAttribute('data-nx-blur')"`;
89
- }
90
- else {
91
- const combined = `${aspectStyle}${roundStyle}${fillStyle}${extraStyle}`;
92
- pictureExtraAttrs = combined
93
- ? ` style="${combined}"`
94
- : '';
95
- }
96
- return `<picture${classAttr}${pictureExtraAttrs}>
55
+ const dimensionAttrs = [
56
+ w ? `width="${w}"` : '',
57
+ h ? `height="${h}"` : '',
58
+ ].filter(Boolean).join(' ');
59
+ const blurAttr = placeholder === 'blur'
60
+ ? ` data-nx-blur style="${aspectStyle}${roundStyle}background:var(--nx-img-blur,#f0f0f0)"`
61
+ : ` style="${aspectStyle}${roundStyle}"`;
62
+ return `<picture${classAttr}>
97
63
  ${sources}
98
64
  <img
99
65
  src="${imageUrl(src, w ?? 800, 'original', quality)}"
@@ -103,51 +69,11 @@ export function renderImage(props) {
103
69
  ${dimensionAttrs}
104
70
  loading="${loading}"
105
71
  decoding="${decoding}"
106
- fetchpriority="${fp}"${imgStyleAttr}${imgOnload}
72
+ fetchpriority="${fp}"${blurAttr}
107
73
  data-nx-img
108
74
  >
109
75
  </picture>`;
110
76
  }
111
- /** Alias corto de {@link renderImage} para uso en templates `.nx` */
112
- export const Image = renderImage;
113
- /**
114
- * Reads intrinsic width and height from a local image file using sharp metadata.
115
- * Useful when you don't know the dimensions ahead of time.
116
- */
117
- export async function getImageDimensions(src, publicDir) {
118
- const path = safeResolvePublicPath(publicDir, src);
119
- if (!path) {
120
- throw new Error(`Invalid image path: ${src}`);
121
- }
122
- const meta = await sharp(path).metadata();
123
- if (!meta.width || !meta.height) {
124
- throw new Error(`Could not read dimensions from: ${src}`);
125
- }
126
- return { width: meta.width, height: meta.height };
127
- }
128
- /**
129
- * Generates a blur data URI from a local public-dir image path.
130
- * Convenience wrapper around `generateBlurDataURL` + `safeResolvePublicPath`.
131
- */
132
- export async function getBlurDataURL(src, publicDir) {
133
- const path = safeResolvePublicPath(publicDir, src);
134
- if (!path) {
135
- throw new Error(`Invalid image path: ${src}`);
136
- }
137
- return blurFromFile(path);
138
- }
139
- /**
140
- * Generates a `<link rel="preload" as="image">` tag for critical above-the-fold images.
141
- * Inject this into `<head>` via `defineHead({ links: [...] })` or the `head` return from `load()`.
142
- */
143
- export function renderImagePreloadLink(props) {
144
- const { src, unoptimized = false, quality = 80 } = props;
145
- if (unoptimized) {
146
- return `<link rel="preload" as="image" href="${escapeAttr(src)}">`;
147
- }
148
- const w = props.size ?? props.width ?? 800;
149
- return `<link rel="preload" as="image" href="${imageUrl(src, w, 'original', quality)}" imagesrcset="${imageUrl(src, w, 'original', quality)}" imagesizes="${props.sizes ?? '100vw'}">`;
150
- }
151
77
  /**
152
78
  * Transforms an image URL into an optimized variant URL.
153
79
  * In production, this calls the /_nexus/image endpoint which does real conversion.
@@ -164,7 +90,6 @@ export function imageUrl(src, width, format, quality) {
164
90
  return `/_nexus/image?src=${encodeURIComponent(src)}&w=${width}&f=${format}&q=${quality}`;
165
91
  }
166
92
  const REMOTE_MAX_BYTES = 12 * 1024 * 1024;
167
- const REMOTE_MAX_REDIRECTS = 5;
168
93
  /** HTTP handler for the /_nexus/image endpoint */
169
94
  export async function handleImageRequest(request, options = {}) {
170
95
  const url = new URL(request.url);
@@ -174,7 +99,6 @@ export async function handleImageRequest(request, options = {}) {
174
99
  const hasExplicitFormat = url.searchParams.has('f');
175
100
  const formatParam = (url.searchParams.get('f') ?? 'original');
176
101
  const quality = Math.min(Math.max(parseInt(url.searchParams.get('q') ?? '80', 10) || 80, 1), 100);
177
- const isBlurRequest = url.searchParams.get('blur') === '1';
178
102
  // Only honor `f=` when present. Omitted `f` means "original" raster (JPEG/PNG), not Accept-based AVIF/WebP,
179
103
  // so <picture><source type=avif> and <img> fallback stay distinct.
180
104
  const outputFormat = hasExplicitFormat ? formatParam : 'original';
@@ -188,23 +112,12 @@ export async function handleImageRequest(request, options = {}) {
188
112
  if (!remoteUrl.startsWith('https://') && !remoteUrl.startsWith('http://')) {
189
113
  return new Response('Invalid URL', { status: 400 });
190
114
  }
191
- let parsed;
192
- try {
193
- parsed = new URL(remoteUrl);
194
- }
195
- catch {
196
- return new Response('Invalid URL', { status: 400 });
197
- }
198
- const safe = await isSafeRemoteUrl(parsed);
199
- if (!safe) {
200
- return new Response('URL blocked', { status: 400 });
201
- }
202
- const fetched = await fetchRemoteImage(parsed);
115
+ const fetched = await fetchRemoteImage(remoteUrl);
203
116
  if (!fetched) {
204
117
  return new Response('Failed to fetch image', { status: 502 });
205
118
  }
206
119
  input = fetched;
207
- sourceLabel = parsed.toString();
120
+ sourceLabel = remoteUrl;
208
121
  }
209
122
  else if (src) {
210
123
  if (!options.publicDir) {
@@ -225,22 +138,6 @@ export async function handleImageRequest(request, options = {}) {
225
138
  else {
226
139
  return new Response('Missing src or url', { status: 400 });
227
140
  }
228
- if (isBlurRequest) {
229
- // Return a tiny LQIP JPEG (10×10, blurred) for inline data URI use.
230
- const blurBuf = await sharp(input)
231
- .resize(10, 10, { fit: 'inside', withoutEnlargement: false })
232
- .blur(3)
233
- .jpeg({ quality: 20, mozjpeg: true })
234
- .toBuffer();
235
- return new Response(new Uint8Array(blurBuf), {
236
- status: 200,
237
- headers: {
238
- ...cacheHeaders,
239
- 'content-type': 'image/jpeg',
240
- 'x-nexus-image-source': encodeURIComponent(sourceLabel.slice(0, 200)),
241
- },
242
- });
243
- }
244
141
  const { body, contentType } = await encodeWithSharp(input, width, outputFormat, quality);
245
142
  return new Response(new Uint8Array(body), {
246
143
  status: 200,
@@ -270,47 +167,20 @@ async function fetchRemoteImage(remoteUrl) {
270
167
  const ac = new AbortController();
271
168
  const t = setTimeout(() => ac.abort(), 15_000);
272
169
  try {
273
- let current = typeof remoteUrl === 'string' ? new URL(remoteUrl) : remoteUrl;
274
- for (let i = 0; i <= REMOTE_MAX_REDIRECTS; i++) {
275
- const res = await fetch(current.toString(), {
276
- signal: ac.signal,
277
- headers: {
278
- 'user-agent': 'NexusImage/1.0',
279
- 'accept': 'image/avif,image/webp,image/*,*/*;q=0.8',
280
- },
281
- redirect: 'manual',
282
- });
283
- if (res.status >= 300 && res.status < 400) {
284
- const loc = res.headers.get('location');
285
- if (!loc)
286
- return null;
287
- let next;
288
- try {
289
- next = new URL(loc, current);
290
- }
291
- catch {
292
- return null;
293
- }
294
- const safe = await isSafeRemoteUrl(next);
295
- if (!safe)
296
- return null;
297
- current = next;
298
- continue;
299
- }
300
- if (!res.ok)
301
- return null;
302
- const ct = (res.headers.get('content-type') ?? '').toLowerCase();
303
- if (ct && !ct.startsWith('image/'))
304
- return null;
305
- const len = res.headers.get('content-length');
306
- if (len && Number(len) > REMOTE_MAX_BYTES)
307
- return null;
308
- const buf = Buffer.from(await res.arrayBuffer());
309
- if (buf.length > REMOTE_MAX_BYTES)
310
- return null;
311
- return buf;
312
- }
313
- return null;
170
+ const res = await fetch(remoteUrl, {
171
+ signal: ac.signal,
172
+ headers: { 'user-agent': 'NexusImage/1.0' },
173
+ redirect: 'follow',
174
+ });
175
+ if (!res.ok)
176
+ return null;
177
+ const len = res.headers.get('content-length');
178
+ if (len && Number(len) > REMOTE_MAX_BYTES)
179
+ return null;
180
+ const buf = Buffer.from(await res.arrayBuffer());
181
+ if (buf.length > REMOTE_MAX_BYTES)
182
+ return null;
183
+ return buf;
314
184
  }
315
185
  catch {
316
186
  return null;
@@ -319,79 +189,6 @@ async function fetchRemoteImage(remoteUrl) {
319
189
  clearTimeout(t);
320
190
  }
321
191
  }
322
- async function isSafeRemoteUrl(u) {
323
- if (u.protocol !== 'http:' && u.protocol !== 'https:')
324
- return false;
325
- if (u.username || u.password)
326
- return false;
327
- const hostname = u.hostname;
328
- if (!hostname)
329
- return false;
330
- const lower = hostname.toLowerCase();
331
- if (lower === 'localhost' || lower.endsWith('.localhost'))
332
- return false;
333
- const ipType = isIP(hostname);
334
- if (ipType) {
335
- return !isPrivateIp(hostname);
336
- }
337
- try {
338
- const addrs = await lookup(hostname, { all: true, verbatim: true });
339
- if (!addrs.length)
340
- return false;
341
- for (const a of addrs) {
342
- if (isPrivateIp(a.address))
343
- return false;
344
- }
345
- }
346
- catch {
347
- return false;
348
- }
349
- return true;
350
- }
351
- function isPrivateIp(ip) {
352
- if (ip.includes(':')) {
353
- const norm = ip.toLowerCase();
354
- if (norm === '::' || norm === '::1')
355
- return true;
356
- if (norm.startsWith('fe80:'))
357
- return true;
358
- if (norm.startsWith('fc') || norm.startsWith('fd'))
359
- return true;
360
- if (norm.startsWith('ff'))
361
- return true;
362
- return false;
363
- }
364
- const parts = ip.split('.').map(p => Number(p));
365
- if (parts.length !== 4 || parts.some(n => !Number.isInteger(n) || n < 0 || n > 255))
366
- return true;
367
- const a = parts[0];
368
- const b = parts[1];
369
- if (a === undefined)
370
- return true;
371
- if (a === 0)
372
- return true;
373
- if (a === 10)
374
- return true;
375
- if (a === 127)
376
- return true;
377
- if (a === 169 && b === 254)
378
- return true;
379
- if (a === 172 && b !== undefined && b >= 16 && b <= 31)
380
- return true;
381
- if (a === 172 && b !== undefined && b >= 16 && b <= 31)
382
- return true;
383
- if (a === 192 && b === 168)
384
- return true;
385
- if (a === 100 && b !== undefined && b >= 64 && b <= 127)
386
- return true;
387
- if (a === 192 && b === 0)
388
- return true;
389
- if (a === 198 && b !== undefined && (b === 18 || b === 19))
390
- return true;
391
- if (a >= 224)
392
- return true;
393
- return false;
394
- }
395
192
  async function encodeWithSharp(input, width, outputFormat, quality) {
396
193
  let pipeline = sharp(input).rotate().resize({
397
194
  width,
@@ -433,36 +230,4 @@ function defaultSizes(widths) {
433
230
  function escapeAttr(str) {
434
231
  return str.replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
435
232
  }
436
- // ── LQIP (Low Quality Image Placeholder) ───────────────────────────────────
437
- /**
438
- * Generates a tiny 10×10 blurred JPEG encoded as a base64 data URI.
439
- * Inline this into `ImageProps.blurDataURL` so `renderImage` can embed it
440
- * directly in the HTML without a round-trip fetch.
441
- *
442
- * ```ts
443
- * // In a server load function or SSR route:
444
- * const blurDataURL = await generateBlurDataURL(imageBuffer);
445
- * return renderImage({ src: '/hero.jpg', alt: 'Hero', blurDataURL });
446
- * ```
447
- */
448
- export async function generateBlurDataURL(input) {
449
- const buf = await sharp(input)
450
- .resize(10, 10, { fit: 'inside', withoutEnlargement: false })
451
- .blur(3)
452
- .jpeg({ quality: 30, mozjpeg: true })
453
- .toBuffer();
454
- return `data:image/jpeg;base64,${buf.toString('base64')}`;
455
- }
456
- /**
457
- * Generates a LQIP data URI from a local public-dir file path.
458
- * Convenience wrapper around `generateBlurDataURL`.
459
- *
460
- * ```ts
461
- * const blur = await blurFromFile('/absolute/path/to/public/hero.jpg');
462
- * ```
463
- */
464
- export async function blurFromFile(absolutePath) {
465
- const input = await readFile(absolutePath);
466
- return generateBlurDataURL(input);
467
- }
468
233
  //# sourceMappingURL=image.js.map
package/dist/image.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"image.js","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAC;AA4C1B,0CAA0C;AAC1C,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAEnD,qDAAqD;AACrD,MAAM,eAAe,GAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AAEpE;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAiB;IAC3C,MAAM,EACJ,GAAG,EACH,GAAG,EACH,QAAQ,GAAG,KAAK,EAChB,KAAK,GAAG,KAAK,EACb,OAAO,GAAG,EAAE,EACZ,OAAO,GAAG,eAAe,EACzB,WAAW,GAAG,MAAM,EACpB,aAAa,GACd,GAAG,KAAK,CAAC;IAEV,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC;IACpC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;IAErC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7C,MAAM,EAAE,GAAG,aAAa,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAEzD,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;IAC3D,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IAEtD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/D,6CAA6C;IAC7C,MAAM,OAAO,GAAG,OAAO;SACpB,MAAM,CAAC,CAAC,CAAC,EAAyC,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC;SACtE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACd,MAAM,MAAM,GAAG,MAAM;aAClB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,KAAK,GAAG,CAAC;aACpE,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,uBAAuB,MAAM,aAAa,MAAM,YAAY,SAAS,IAAI,CAAC;IACnF,CAAC,CAAC;SACD,IAAI,CAAC,QAAQ,CAAC,CAAC;IAElB,iBAAiB;IACjB,MAAM,cAAc,GAAG,MAAM;SAC1B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,IAAI,KAAK,GAAG,CAAC;SACxE,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,cAAc,GAAG;QACrB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACvB,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;KACzB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE5B,MAAM,QAAQ,GAAG,WAAW,KAAK,MAAM;QACrC,CAAC,CAAC,wBAAwB,WAAW,GAAG,UAAU,wCAAwC;QAC1F,CAAC,CAAC,WAAW,WAAW,GAAG,UAAU,GAAG,CAAC;IAE3C,OAAO,WAAW,SAAS;MACvB,OAAO;;aAEA,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC;gBACzC,cAAc;eACf,SAAS;aACX,UAAU,CAAC,GAAG,CAAC;QACpB,cAAc;iBACL,OAAO;kBACN,QAAQ;uBACH,EAAE,IAAI,QAAQ;;;aAGxB,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CACtB,GAAW,EACX,KAAa,EACb,MAAgC,EAChC,OAAe;IAEf,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5D,mDAAmD;QACnD,OAAO,qBAAqB,kBAAkB,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,MAAM,MAAM,OAAO,EAAE,CAAC;IAC5F,CAAC;IACD,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,OAAO,qBAAqB,kBAAkB,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,OAAO,EAAE,CAAC;IAChF,CAAC;IACD,OAAO,qBAAqB,kBAAkB,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,MAAM,MAAM,OAAO,EAAE,CAAC;AAC5F,CAAC;AAED,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1C,kDAAkD;AAClD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAgB,EAChB,UAA+B,EAAE;IAEjC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACnG,MAAM,iBAAiB,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,UAAU,CAA6B,CAAC;IAC1F,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAElG,4GAA4G;IAC5G,mEAAmE;IACnE,MAAM,YAAY,GAA6B,iBAAiB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;IAE5F,MAAM,YAAY,GAAG;QACnB,eAAe,EAAE,qCAAqC;KAC9C,CAAC;IAEX,IAAI,CAAC;QACH,IAAI,KAAa,CAAC;QAClB,IAAI,WAAmB,CAAC;QAExB,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1E,OAAO,IAAI,QAAQ,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAClD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,IAAI,QAAQ,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,KAAK,GAAG,OAAO,CAAC;YAChB,WAAW,GAAG,SAAS,CAAC;QAC1B,CAAC;aAAM,IAAI,GAAG,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBACvB,OAAO,IAAI,QAAQ,CAAC,kEAAkE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAC3G,CAAC;YACD,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAC3D,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACvD,CAAC;YACD,IAAI,CAAC;gBACH,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACpD,CAAC;YACD,WAAW,GAAG,GAAG,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,QAAQ,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QACzF,OAAO,IAAI,QAAQ,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE;YACxC,MAAM,EAAE,GAAG;YACX,OAAO,EAAE;gBACP,GAAG,YAAY;gBACf,cAAc,EAAE,WAAW;gBAC3B,sBAAsB,EAAE,kBAAkB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aACtE;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,IAAI,QAAQ,CAAC,8BAA8B,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAiB,EAAE,GAAW;IAC3D,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC3C,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,SAAiB;IAC/C,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;IACjC,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;YACjC,MAAM,EAAE,EAAE,CAAC,MAAM;YACjB,OAAO,EAAE,EAAE,YAAY,EAAE,gBAAgB,EAAE;YAC3C,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9C,IAAI,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,gBAAgB;YAAE,OAAO,IAAI,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACjD,IAAI,GAAG,CAAC,MAAM,GAAG,gBAAgB;YAAE,OAAO,IAAI,CAAC;QAC/C,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,KAAa,EACb,KAAa,EACb,YAAsC,EACtC,OAAe;IAEf,IAAI,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC;QAC1C,KAAK;QACL,kBAAkB,EAAE,IAAI;QACxB,GAAG,EAAE,QAAQ;KACd,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;IAE3C,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IACjD,CAAC;IACD,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QACvE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;IAClD,CAAC;IAED,qDAAqD;IACrD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IACjD,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IACvE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,QAAQ,GAAG,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,YAAY,CAAC,MAAgB;IACpC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtC,OAAO,GAAG,CAAC,CAAC,CAAC,eAAe,GAAG,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACjE,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACjF,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- export { renderImage, Image, imageUrl, handleImageRequest, generateBlurDataURL, blurFromFile, getImageDimensions, getBlurDataURL, renderImagePreloadLink, } from './image.js';
2
- export type { ImageProps, ImageFormat, OptimizedImageSrc, ImageHandlerOptions, } from './image.js';
1
+ export { renderImage, imageUrl, handleImageRequest } from './image.js';
2
+ export type { ImageProps, ImageFormat, OptimizedImageSrc, ImageHandlerOptions } from './image.js';
3
3
  export { optimizeFonts, extractFontPreloads } from './fonts.js';
4
4
  export type { FontConfig, FontStrategy, GoogleFont, LocalFont, FontOutput } from './fonts.js';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"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
+ {"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"}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { renderImage, Image, imageUrl, handleImageRequest, generateBlurDataURL, blurFromFile, getImageDimensions, getBlurDataURL, renderImagePreloadLink, } from './image.js';
1
+ export { renderImage, imageUrl, handleImageRequest } from './image.js';
2
2
  export { optimizeFonts, extractFontPreloads } from './fonts.js';
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,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"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nexus_js/assets",
3
- "version": "0.9.28",
3
+ "version": "0.9.29",
4
4
  "description": "Nexus asset pipeline — image optimization (AVIF/WebP), font injection, lazy loading",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -36,10 +36,6 @@
36
36
  "bugs": {
37
37
  "url": "https://github.com/bierfor/nexus/issues"
38
38
  },
39
- "funding": {
40
- "type": "individual",
41
- "url": "https://buymeacoffee.com/bierfor084"
42
- },
43
39
  "keywords": [
44
40
  "nexus",
45
41
  "framework",
@@ -61,7 +57,6 @@
61
57
  "scripts": {
62
58
  "build": "tsc -p tsconfig.json",
63
59
  "dev": "tsc -p tsconfig.json --watch",
64
- "typecheck": "tsc --noEmit -p tsconfig.json",
65
60
  "clean": "rm -rf dist"
66
61
  }
67
62
  }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=image.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"image.test.d.ts","sourceRoot":"","sources":["../src/image.test.ts"],"names":[],"mappings":""}
@@ -1,180 +0,0 @@
1
- import { describe, it, expect, beforeAll, afterAll } from 'vitest';
2
- import { renderImage, Image, imageUrl, getImageDimensions, getBlurDataURL, renderImagePreloadLink, } from './image.js';
3
- import { mkdir, writeFile, rm } from 'node:fs/promises';
4
- import { join } from 'node:path';
5
- import sharp from 'sharp';
6
- const TMP_DIR = join(process.cwd(), 'tmp-test-assets');
7
- async function createTestImage(filename, width, height) {
8
- const buf = await sharp({ create: { width, height, channels: 3, background: { r: 100, g: 150, b: 200 } } })
9
- .jpeg({ quality: 80 })
10
- .toBuffer();
11
- const path = join(TMP_DIR, filename);
12
- await writeFile(path, buf);
13
- return path;
14
- }
15
- describe('renderImage', () => {
16
- it('emits <picture> with AVIF and WebP sources', () => {
17
- const html = renderImage({ src: '/hero.jpg', alt: 'Hero', width: 1280, height: 720 });
18
- expect(html).toContain('<picture');
19
- expect(html).toContain('type="image/avif"');
20
- expect(html).toContain('type="image/webp"');
21
- expect(html).toContain('<img');
22
- expect(html).toContain('alt="Hero"');
23
- expect(html).toContain('width="1280"');
24
- expect(html).toContain('height="720"');
25
- });
26
- it('omits width/height when fill is true', () => {
27
- const html = renderImage({ src: '/bg.jpg', alt: 'Background', fill: true });
28
- expect(html).not.toContain('width=');
29
- expect(html).not.toContain('height=');
30
- expect(html).toContain('position:absolute');
31
- expect(html).toContain('object-fit:cover');
32
- });
33
- it('supports custom objectFit and objectPosition in fill mode', () => {
34
- const html = renderImage({
35
- src: '/bg.jpg',
36
- alt: 'Background',
37
- fill: true,
38
- objectFit: 'contain',
39
- objectPosition: 'top left',
40
- });
41
- expect(html).toContain('object-fit:contain');
42
- expect(html).toContain('object-position:top left');
43
- });
44
- it('emits plain <img> when unoptimized is true', () => {
45
- const html = renderImage({ src: '/logo.svg', alt: 'Logo', width: 200, height: 200, unoptimized: true });
46
- expect(html).not.toContain('<picture');
47
- expect(html).toContain('<img');
48
- expect(html).toContain('src="/logo.svg"');
49
- expect(html).not.toContain('/_nexus/image');
50
- });
51
- it('includes width/height on unoptimized when not fill', () => {
52
- const html = renderImage({ src: '/logo.svg', alt: 'Logo', width: 200, height: 200, unoptimized: true });
53
- expect(html).toContain('width="200"');
54
- expect(html).toContain('height="200"');
55
- });
56
- it('omits width/height on unoptimized when fill', () => {
57
- const html = renderImage({ src: '/logo.svg', alt: 'Logo', unoptimized: true, fill: true });
58
- expect(html).not.toContain('width=');
59
- expect(html).not.toContain('height=');
60
- expect(html).toContain('position:absolute');
61
- });
62
- it('sets eager loading and high fetchpriority when priority is true', () => {
63
- const html = renderImage({ src: '/hero.jpg', alt: 'Hero', width: 1280, height: 720, priority: true });
64
- expect(html).toContain('loading="eager"');
65
- expect(html).toContain('fetchpriority="high"');
66
- expect(html).toContain('decoding="sync"');
67
- });
68
- it('sets lazy loading by default', () => {
69
- const html = renderImage({ src: '/hero.jpg', alt: 'Hero', width: 1280, height: 720 });
70
- expect(html).toContain('loading="lazy"');
71
- expect(html).toContain('decoding="async"');
72
- });
73
- it('includes round style when round is true', () => {
74
- const html = renderImage({ src: '/avatar.jpg', alt: 'Avatar', size: 64, round: true });
75
- expect(html).toContain('border-radius:50%');
76
- });
77
- it('includes custom class attribute', () => {
78
- const html = renderImage({ src: '/hero.jpg', alt: 'Hero', width: 1280, height: 720, class: 'my-img' });
79
- expect(html).toContain('class="my-img"');
80
- });
81
- it('supports size shorthand', () => {
82
- const html = renderImage({ src: '/icon.jpg', alt: 'Icon', size: 64 });
83
- expect(html).toContain('width="64"');
84
- expect(html).toContain('height="64"');
85
- });
86
- it('escapes alt text with quotes', () => {
87
- const html = renderImage({ src: '/x.jpg', alt: 'A "great" photo', width: 100, height: 100 });
88
- expect(html).toContain('alt="A &quot;great&quot; photo"');
89
- });
90
- it('applies additional inline style', () => {
91
- const html = renderImage({ src: '/x.jpg', alt: 'X', width: 100, height: 100, style: 'border:1px solid red;' });
92
- expect(html).toContain('border:1px solid red;');
93
- });
94
- it('generates blur placeholder when blurDataURL is provided', () => {
95
- const html = renderImage({
96
- src: '/hero.jpg',
97
- alt: 'Hero',
98
- width: 1280,
99
- height: 720,
100
- blurDataURL: 'data:image/jpeg;base64,abc123',
101
- });
102
- expect(html).toContain('data-nx-blur');
103
- expect(html).toContain('background-image:url("data:image/jpeg;base64,abc123")');
104
- expect(html).toContain('opacity:0');
105
- });
106
- it('falls back to solid background when blurDataURL is missing', () => {
107
- const html = renderImage({ src: '/hero.jpg', alt: 'Hero', width: 1280, height: 720 });
108
- expect(html).toContain('data-nx-blur');
109
- expect(html).toContain('background:var(--nx-img-blur,#e8e8e8)');
110
- });
111
- it('can disable placeholder', () => {
112
- const html = renderImage({ src: '/hero.jpg', alt: 'Hero', width: 1280, height: 720, placeholder: 'none' });
113
- expect(html).not.toContain('data-nx-blur');
114
- });
115
- });
116
- describe('Image alias', () => {
117
- it('is the same function as renderImage', () => {
118
- expect(Image).toBe(renderImage);
119
- });
120
- });
121
- describe('imageUrl', () => {
122
- it('builds local optimized URL with format', () => {
123
- const url = imageUrl('/photo.jpg', 800, 'webp', 85);
124
- expect(url).toBe('/_nexus/image?src=%2Fphoto.jpg&w=800&f=webp&q=85');
125
- });
126
- it('builds local original URL without format param', () => {
127
- const url = imageUrl('/photo.jpg', 800, 'original', 85);
128
- expect(url).toBe('/_nexus/image?src=%2Fphoto.jpg&w=800&q=85');
129
- });
130
- it('builds remote URL with url param', () => {
131
- const url = imageUrl('https://example.com/img.jpg', 640, 'avif', 80);
132
- expect(url).toBe('/_nexus/image?url=https%3A%2F%2Fexample.com%2Fimg.jpg&w=640&f=avif&q=80');
133
- });
134
- });
135
- describe('renderImagePreloadLink', () => {
136
- it('generates preload link for optimized image', () => {
137
- const link = renderImagePreloadLink({ src: '/hero.jpg', alt: 'Hero', width: 1280, height: 720, priority: true });
138
- expect(link).toContain('<link rel="preload" as="image"');
139
- expect(link).toContain('/_nexus/image');
140
- });
141
- it('generates preload link for unoptimized image', () => {
142
- const link = renderImagePreloadLink({ src: '/logo.svg', alt: 'Logo', unoptimized: true });
143
- expect(link).toBe('<link rel="preload" as="image" href="/logo.svg">');
144
- });
145
- });
146
- describe('getImageDimensions', () => {
147
- beforeAll(async () => {
148
- await mkdir(TMP_DIR, { recursive: true });
149
- await createTestImage('test-400x300.jpg', 400, 300);
150
- });
151
- afterAll(async () => {
152
- await rm(TMP_DIR, { recursive: true, force: true });
153
- });
154
- it('reads width and height from a JPEG', async () => {
155
- const dims = await getImageDimensions('/test-400x300.jpg', TMP_DIR);
156
- expect(dims.width).toBe(400);
157
- expect(dims.height).toBe(300);
158
- });
159
- it('throws on invalid path', async () => {
160
- await expect(getImageDimensions('/../escape.jpg', TMP_DIR)).rejects.toThrow('Invalid image path');
161
- });
162
- });
163
- describe('getBlurDataURL', () => {
164
- beforeAll(async () => {
165
- await mkdir(TMP_DIR, { recursive: true });
166
- await createTestImage('blur-test.jpg', 200, 200);
167
- });
168
- afterAll(async () => {
169
- await rm(TMP_DIR, { recursive: true, force: true });
170
- });
171
- it('returns a base64 data URI', async () => {
172
- const uri = await getBlurDataURL('/blur-test.jpg', TMP_DIR);
173
- expect(uri).toMatch(/^data:image\/jpeg;base64,/);
174
- expect(uri.length).toBeGreaterThan(100);
175
- });
176
- it('throws on invalid path', async () => {
177
- await expect(getBlurDataURL('/../escape.jpg', TMP_DIR)).rejects.toThrow('Invalid image path');
178
- });
179
- });
180
- //# sourceMappingURL=image.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"image.test.js","sourceRoot":"","sources":["../src/image.test.ts"],"names":[],"mappings":"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"}