Module

core.asset.asset_core

Asset dataclass for static file representation.

The Asset class represents a static file (image, CSS, JS, font, etc.) and provides methods for processing, optimization, fingerprinting, and output writing.

Key Methods:

  • minify(): Minify CSS/JS content
  • bundle_css(): Resolve @import statements into single file
  • optimize(): Optimize images
  • hash(): Generate fingerprint for cache-busting
  • copy_to_output(): Write processed asset to output directory

Classes

Asset dataclass
Represents a static asset file (image, CSS, JS, etc.).
17

Represents a static asset file (image, CSS, JS, etc.).

Attributes

Name Type Description
source_path Path

Path to the source asset file

output_path Path | None

Path where the asset will be copied

asset_type str | None

Type of asset (css, js, image, font, etc.)

fingerprint str | None

Hash-based fingerprint for cache busting

minified bool

Whether the asset has been minified

optimized bool

Whether the asset has been optimized

bundled bool

Whether CSS @import statements have been inlined

logical_path Path | None
_bundled_content str | None
_minified_content str | None
_optimized_image Any

Methods 9

is_css_entry_point
Check if this asset is a CSS entry point that should be bundled. Entry points …
0 bool
def is_css_entry_point(self) -> bool

Check if this asset is a CSS entry point that should be bundled.

Entry points are CSS files named 'style.css' at any level. These files typically contain @import statements that pull in other CSS.

Returns

bool

True if this is a CSS entry point (e.g., style.css)

is_css_module
Check if this asset is a CSS module (imported by an entry point). CSS modules …
0 bool
def is_css_module(self) -> bool

Check if this asset is a CSS module (imported by an entry point).

CSS modules are CSS files that are NOT entry points. They should be bundled into entry points, not copied separately.

Returns

bool

True if this is a CSS module (e.g., components/buttons.css)

is_js_entry_point
Check if this asset is a JS entry point for bundling. The JS bundle entry poin…
0 bool
def is_js_entry_point(self) -> bool

Check if this asset is a JS entry point for bundling.

The JS bundle entry point is named 'bundle.js' and contains all theme JavaScript concatenated together.

Returns

bool

True if this is a JS bundle entry point

is_js_module
Check if this asset is a JS module (should be bundled, not copied separately). …
0 bool
def is_js_module(self) -> bool

Check if this asset is a JS module (should be bundled, not copied separately).

JS modules are individual JS files that will be bundled into bundle.js. They should not be copied separately when bundling is enabled.

Excludes:

  • Third-party libraries (*.min.js) - copied separately for caching
  • The bundle entry point itself
Returns

bool

True if this is a JS module that should be bundled

minify
Minify the asset (for CSS and JS).
0 Asset
def minify(self) -> Asset

Minify the asset (for CSS and JS).

Returns

Asset

Self for method chaining

bundle_css
Bundle CSS by resolving all @import statements recursively. This creates a sin…
0 str
def bundle_css(self) -> str

Bundle CSS by resolving all @import statements recursively.

This creates a single CSS file from an entry point that has @imports. Works without any external dependencies.

Preserves @layer blocks when bundling @import statements.

Returns

str

Bundled CSS content as a string

hash
Generate a hash-based fingerprint for the asset.
0 str
def hash(self) -> str

Generate a hash-based fingerprint for the asset.

Returns

str

Hash string (first 8 characters of SHA256)

optimize
Optimize the asset (especially for images).
0 Asset
def optimize(self) -> Asset

Optimize the asset (especially for images).

Returns

Asset

Self for method chaining

copy_to_output
Copy the asset to the output directory.
2 Path
def copy_to_output(self, output_dir: Path, use_fingerprint: bool = True) -> Path

Copy the asset to the output directory.

Parameters 2
output_dir Path

Output directory path

use_fingerprint bool

Whether to include fingerprint in filename

Returns

Path

Path where the asset was copied

Internal Methods 8
__post_init__
Determine asset type from file extension.
0 None
def __post_init__(self) -> None

Determine asset type from file extension.

_determine_type
Determine the asset type from the file extension.
0 str
def _determine_type(self) -> str

Determine the asset type from the file extension.

Returns

str

Asset type string

_minify_css
Minify CSS content using simple, safe minifier. This minifier: - Removes comme…
0 None
def _minify_css(self) -> None

Minify CSS content using simple, safe minifier.

This minifier:

  • Removes comments and unnecessary whitespace
  • Transforms CSS nesting syntax for browser compatibility
  • Preserves all other CSS syntax (@layer, @import, etc.)

For CSS entry points (style.css), this should be called AFTER bundling.

_minify_js
Minify JavaScript content.
0 None
def _minify_js(self) -> None

Minify JavaScript content.

_hash_source_chunks
Yield byte chunks representing the content that should drive fingerprinting. P…
0 Iterator[bytes]
def _hash_source_chunks(self) -> Iterator[bytes]

Yield byte chunks representing the content that should drive fingerprinting.

Prefers minified (or bundled) content so hashes match the bytes we actually emit. Falls back to the original file contents when no in-memory transform exists.

Returns

Iterator[bytes]

_optimize_image
Optimize image assets.
0 None
def _optimize_image(self) -> None

Optimize image assets.

_cleanup_old_fingerprints_prepare
Remove outdated fingerprinted siblings before writing the new file. This ensur…
1 None
def _cleanup_old_fingerprints_prepare(self, output_dir: Path) -> None

Remove outdated fingerprinted siblings before writing the new file.

This ensures only one fingerprinted version exists at a time, preventing stale files from being served.

Parameters 1
output_dir Path

Output directory where assets are written

__repr__
0 str
def __repr__(self) -> str
Returns

str