@nexus_js/assets 0.9.27 → 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 +6 -161
- package/dist/image.d.ts +1 -71
- package/dist/image.d.ts.map +1 -1
- package/dist/image.js +29 -264
- package/dist/image.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -6
- package/dist/image.test.d.ts +0 -2
- package/dist/image.test.d.ts.map +0 -1
- package/dist/image.test.js +0 -180
- package/dist/image.test.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,171 +1,16 @@
|
|
|
1
1
|
# @nexus_js/assets
|
|
2
2
|
|
|
3
|
-
Nexus asset pipeline — image optimization (AVIF/WebP),
|
|
3
|
+
Nexus asset pipeline — image optimization (AVIF/WebP), font injection, lazy loading.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Documentation
|
|
6
6
|
|
|
7
|
-
|
|
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
|
-
- **
|
|
167
|
-
- **
|
|
168
|
-
- **
|
|
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
|
package/dist/image.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
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',
|
|
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
|
|
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
|
|
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 =
|
|
71
|
-
? `width="${w}"
|
|
72
|
-
: ''
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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}"${
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
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, '"').replace(/</g, '<').replace(/>/g, '>');
|
|
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":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { renderImage,
|
|
2
|
-
export type { ImageProps, ImageFormat, OptimizedImageSrc, ImageHandlerOptions
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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,
|
|
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,
|
|
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.
|
|
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
|
}
|
package/dist/image.test.d.ts
DELETED
package/dist/image.test.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"image.test.d.ts","sourceRoot":"","sources":["../src/image.test.ts"],"names":[],"mappings":""}
|
package/dist/image.test.js
DELETED
|
@@ -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 "great" 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
|
package/dist/image.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"image.test.js","sourceRoot":"","sources":["../src/image.test.ts"],"names":[],"mappings":"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"}
|