Classes
Asset
dataclass
Represents a static asset file (image, CSS, JS, etc.).
Asset
dataclass 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 …
is_css_entry_point
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
True if this is a CSS entry point (e.g., style.css)bool
—
is_css_module
Check if this asset is a CSS module (imported by an entry point).
CSS modules …
is_css_module
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
True if this is a CSS module (e.g., components/buttons.css)bool
—
is_js_entry_point
Check if this asset is a JS entry point for bundling.
The JS bundle entry poin…
is_js_entry_point
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
True if this is a JS bundle entry pointbool
—
is_js_module
Check if this asset is a JS module (should be bundled, not copied separately).
…
is_js_module
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
True if this is a JS module that should be bundledbool
—
minify
Minify the asset (for CSS and JS).
minify
def minify(self) -> Asset
Minify the asset (for CSS and JS).
Returns
Self for method chainingAsset
—
bundle_css
Bundle CSS by resolving all @import statements recursively.
This creates a sin…
bundle_css
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
Bundled CSS content as a stringstr
—
hash
Generate a hash-based fingerprint for the asset.
hash
def hash(self) -> str
Generate a hash-based fingerprint for the asset.
Returns
Hash string (first 8 characters of SHA256)str
—
optimize
Optimize the asset (especially for images).
optimize
def optimize(self) -> Asset
Optimize the asset (especially for images).
Returns
Self for method chainingAsset
—
copy_to_output
Copy the asset to the output directory.
copy_to_output
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 where the asset was copiedPath
—
Internal Methods 8
__post_init__
Determine asset type from file extension.
__post_init__
def __post_init__(self) -> None
Determine asset type from file extension.
_determine_type
Determine the asset type from the file extension.
_determine_type
def _determine_type(self) -> str
Determine the asset type from the file extension.
Returns
Asset type stringstr
—
_minify_css
Minify CSS content using simple, safe minifier.
This minifier:
- Removes comme…
_minify_css
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.
_minify_js
def _minify_js(self) -> None
Minify JavaScript content.
_hash_source_chunks
Yield byte chunks representing the content that should drive fingerprinting.
P…
_hash_source_chunks
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.
_optimize_image
def _optimize_image(self) -> None
Optimize image assets.
_cleanup_old_fingerprints_prepare
Remove outdated fingerprinted siblings before writing the new file.
This ensur…
_cleanup_old_fingerprints_prepare
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__
__repr__
def __repr__(self) -> str
Returns
str