//! Transform-runner boundary for the `omena-query` facade.
//!
//! `omena-query` remains the consumer-facing analysis facade, but it should not
//! directly depend on every transform-family crate. This boundary groups the
//! transform planner, executor, target planner, printer, and egg witness surface
//! behind one dependency while preserving the existing query API.
use serde::Serialize;
mod plugin_api;
mod plugins;
pub use plugin_api::*;
pub use plugins::{built_in_omena_plugins, execute_built_in_omena_plugin};
#[allow(deprecated)]
pub use omena_bundler::{
BundleDependencyResolutionDisclosureV0, BundleResolutionAuthorityV0, EmissionCycleClassV0,
EmissionCycleDialectV0, EmissionOrderingPolicyV0, InstanceReachabilityDerivationV0,
LinkedEmissionArtifactV0, LinkedEmissionItemMaterializationErrorV0,
LinkedEmissionMaterializationErrorV0, LinkedEmissionModuleRegionV0,
LinkedEmissionOrderEntryRegionV0, LinkedStylesheetV0, LinkedStylesheetWithEmissionItemsV0,
TransformBundleAssetUrlRewriteSummaryV0, TransformBundleDependencyResolutionV0,
TransformBundleEdgeKind, TransformBundleEmissionAdmissionV0,
TransformBundleEmissionItemProjectionV0, TransformBundleInstanceReachabilityInputV0,
TransformBundleLinkErrorV0, TransformBundleLinkOptionsV0, TransformBundleLinkProjectionSetV0,
TransformBundleLinkerProjectionV0, TransformBundleModuleInputV0,
TransformBundleParsedModuleInputV0, TransformBundleReachabilityAnalysisV0,
TransformBundleReachabilityUnanalyzedCauseV0, TransformBundleResolvedDependencyV0,
TransformBundleSemanticReachabilityInputV0, TransformBundleSourceSummaryV0,
TransformBundleTransformedModuleV0, bundle_edge_is_module_dependency,
evaluate_omena_transform_bundle_projection_emission_admission_with_resolved_dependencies_and_options,
link_legacy_path_inferred_bundle, link_omena_transform_bundle_modules,
link_omena_transform_bundle_modules_with_options,
link_omena_transform_bundle_modules_with_semantic_reachability,
link_omena_transform_bundle_modules_with_semantic_reachability_and_metadata,
link_omena_transform_bundle_projection_with_emission_items_and_resolved_dependencies_and_options,
link_omena_transform_bundle_projection_with_resolved_dependencies_and_options,
link_resolved_bundle, materialize_omena_transform_bundle_linked_stylesheet,
materialize_omena_transform_bundle_linked_stylesheet_with_emission_items,
normalize_omena_transform_bundle_path,
project_omena_transform_bundle_linker_and_emission_items,
project_omena_transform_bundle_linker_and_emission_items_from_parsed_modules,
project_omena_transform_bundle_linker_and_emission_items_from_parsed_modules_with_instance_reachability,
project_omena_transform_bundle_linker_inputs,
project_omena_transform_bundle_linker_inputs_from_parsed_modules,
rewrite_omena_transform_bundle_asset_urls_in_source,
summarize_omena_transform_bundle_from_source,
};
pub use omena_transform_cst::{
MinifyPassClassificationV0, MinifyPassProfileClassV0,
NATIVE_CSS_STATIC_EVAL_DIALECT_RESTRICTION_V0, NATIVE_CSS_STATIC_EVAL_OPT_IN_POLICY_V0,
NATIVE_CSS_STATIC_EVAL_SPEC_SNAPSHOT_V0, STRICT_VERIFICATION_BUILD_PROFILE_ID_V0,
TRANSFORM_PASS_CATALOG_LEN, TransformBuildProfileV0, TransformPassKind,
TransformStrictPolicyDescriptorV0, all_transform_pass_kinds, closed_world_minify_build_profile,
default_minify_build_profiles, default_minify_pass_classifications, safe_minify_build_profile,
semantic_minify_build_profile, strict_policy_descriptor_for_profile,
strict_verification_build_profile, transform_pass_requires_closed_world_bundle,
transform_pass_sort_ordinal, with_transform_pass_sort_ordinal_overrides_for_test,
};
pub use omena_transform_egg::{
EggRewriteSourceWitnessV0, TransformEggPlanV0, execute_egg_rewrite_witnesses_for_css_source,
plan_egg_rewrite_passes_for_source,
};
pub use omena_transform_passes::{
CssModuleTokenCollisionPathScopeV0, CssModuleTokenCollisionV0,
CssModuleTokenInterfaceMismatchV0, CssModuleTokenOwnershipCensusV0, CssModuleTokenOwnershipV0,
CustomPropertyLeastFixedPointSummaryV0, ExternalCssCstCoverageV0,
ExternalCssSemanticChangeClassificationV0, ExternalCssSemanticChangeKindV0,
ExternalCssSemanticChangeV0, ExternalCssSemanticDiffV0, ExternalCssSemanticEntryV0,
RollbackReceiptV0, RollbackScopeV0, TransformCascadeEnvironmentDeclarationV0,
TransformCascadeEnvironmentV0, TransformClassNameRewriteV0,
TransformCssModuleComposesResolutionV0, TransformCssModuleValueResolutionV0, TransformDecision,
TransformDesignTokenRouteV0, TransformExecutionContextV0, TransformExecutionPolicyV0,
TransformExecutionSummaryV0, TransformImportInlineV0, TransformLessInlineLiteralPlaceholderV0,
TransformModuleCssModuleContextV0, TransformModuleEvaluationNativeEditV0,
TransformModuleEvaluationNativeReplacementV0, TransformModuleEvaluationOracleV0,
TransformModuleEvaluationV0, TransformModuleQualifiedExecutionErrorV0,
TransformModuleQualifiedShakeSummaryV0, TransformPassExecutionOutcomeV0, TransformPassPlanV0,
TransformSemanticGuaranteeTierV0, TransformSemanticPreservationDecisionV0,
TransformStrictPolicyEventV0, TransformStrictPolicyReasonV0, TransformStrictPolicySummaryV0,
TransformVendorPrefixPolicyV0, TransformWinnerEqualityAbsenceReasonV0,
TransformWinnerEqualityAbsenceV0, TransformWinnerEqualityAxisV0,
classify_transform_reachability_precision, compare_external_css_semantic_changes_v0,
compare_transform_css_semantics_v0,
execute_transform_passes_on_module_with_dialect_context_and_closed_world_bundle,
execute_transform_passes_on_module_with_dialect_context_policy_and_closed_world_bundle,
execute_transform_passes_on_module_with_dialect_context_policy_and_closed_world_bundle_and_retained_class_names,
execute_transform_passes_on_source_with_dialect_and_context,
execute_transform_passes_on_source_with_dialect_context_and_closed_world_bundle,
execute_transform_passes_on_source_with_dialect_context_and_policy,
execute_transform_passes_on_source_with_dialect_context_closed_world_bundle_and_precision,
execute_transform_passes_on_source_with_dialect_context_closed_world_bundle_precision_and_policy,
expand_css_nested_selector, external_css_adoption_boundary_is_complete_v0,
external_css_semantic_diff_is_total_v0, inline_css_imports,
inline_css_imports_for_static_module_evaluation, parse_static_css_cascade_value,
plan_transform_passes, reduce_static_numeric_expression,
resolve_static_css_modules_local_value_resolutions_from_source,
restore_less_inline_literal_placeholders,
summarize_static_css_custom_property_fixed_point_from_source,
};
/// Compatibility aliases for the superseded trace name.
/// Owner: `omena-query-transform-runner` maintainers. Removal condition: not
/// before 1.0, after downstream migration and zero audited non-compat uses.
#[cfg(feature = "transform-catalog-trace")]
#[allow(deprecated)]
#[deprecated(
since = "0.4.0",
note = "use the TransformCatalog trace surface; removal is not before 1.0 and requires downstream migration plus zero audited non-compatibility uses"
)]
pub use omena_transform_passes::{
LawvereDifferentialCommutativityWitnessV0, LawvereModelTraceV0, TransformPassParallelPlanV0,
evaluate_lawvere_reorderability_with_differential_corpus,
execute_transform_passes_on_source_with_lawvere_trace_and_dialect,
plan_transform_passes_parallel_lawvere_layers,
};
#[cfg(feature = "transform-catalog-trace")]
pub use omena_transform_passes::{
ReorderabilityCertificateV0, TransformCatalogDifferentialCommutativityWitnessV0,
TransformCatalogModelTraceV0, TransformCatalogTransformPassParallelPlanV0,
evaluate_transform_catalog_reorderability_with_differential_corpus,
execute_transform_passes_on_source_with_transform_catalog_trace_and_dialect,
plan_transform_passes_parallel_transform_catalog_layers,
};
pub use omena_transform_print::{
PrettyFormatOptionsV0, StyleDialect, TransformPrintArtifactV0, TransformPrintMode,
TransformPrintOptionsV0, TransformSourceMapCompositionV0, TransformSourceMapPointV0,
TransformSourceMapSegmentV0, TransformSourceMapV3V0,
compose_transform_source_map_v3_with_upstream_map, default_print_options,
print_transform_cst_source_with_dialect_and_pretty_options,
print_transform_execution_artifact_with_dialect_and_source, serialize_transform_source_map_v3,
serialize_transform_source_map_v3_with_source_contents, transform_source_map_point,
};
pub use omena_transform_target::{
TargetFeatureSupportV0, TargetTransformOptionsV0, TransformTargetPlanV0,
TransformTargetQueryPlanV0, conservative_target_options, modern_feature_support,
plan_target_transforms, plan_target_transforms_from_query,
};
pub const OMENA_QUERY_TRANSFORM_RUNNER_COLLAPSED_CRATES_V0: [&str; 6] = [
"omena-bundler",
"omena-transform-cst",
"omena-transform-egg",
"omena-transform-passes",
"omena-transform-print",
"omena-transform-target",
];
pub fn materialize_transform_module_evaluation_native_edits(
input_css: &str,
native_edits: &[TransformModuleEvaluationNativeEditV0],
) -> Option<String> {
if native_edits.is_empty() {
return None;
}
let mut edits = native_edits.to_vec();
edits.sort_by_key(|edit| edit.start);
let mut previous_end = 0usize;
for edit in &edits {
if edit.start < previous_end
|| edit.start > edit.end
|| edit.end > input_css.len()
|| !input_css.is_char_boundary(edit.start)
|| !input_css.is_char_boundary(edit.end)
{
return None;
}
previous_end = edit.end;
}
let mut output = input_css.to_string();
for edit in edits.iter().rev() {
output.replace_range(edit.start..edit.end, edit.replacement.as_str());
}
Some(output)
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct OmenaQueryTransformRunnerBoundaryV0 {
pub schema_version: &'static str,
pub product: &'static str,
pub boundary_kind: &'static str,
pub collapsed_transform_crate_count: usize,
pub collapsed_transform_crates: Vec<&'static str>,
pub direct_query_dependency_replacement: &'static str,
pub ready_surfaces: Vec<&'static str>,
}
pub fn summarize_omena_query_transform_runner_boundary_with_transform_catalog_v0()
-> OmenaQueryTransformRunnerBoundaryV0 {
let ready_surfaces = vec![
"transformPlannerBoundary",
"transformExecutorBoundary",
"transformPrinterBoundary",
"transformSourceMapV3SerializerBoundary",
"transformTargetPlannerBoundary",
"transformEggWitnessBoundary",
];
#[cfg(feature = "transform-catalog-trace")]
let mut ready_surfaces = ready_surfaces;
#[cfg(feature = "transform-catalog-trace")]
ready_surfaces.push("transformCatalogTraceBoundary");
OmenaQueryTransformRunnerBoundaryV0 {
schema_version: "0",
product: "omena-query-transform-runner.boundary",
boundary_kind: "query-transform-runner-split",
collapsed_transform_crate_count: OMENA_QUERY_TRANSFORM_RUNNER_COLLAPSED_CRATES_V0.len(),
collapsed_transform_crates: OMENA_QUERY_TRANSFORM_RUNNER_COLLAPSED_CRATES_V0.to_vec(),
direct_query_dependency_replacement: "omena-query-transform-runner",
ready_surfaces,
}
}
#[deprecated(
since = "0.4.0",
note = "use summarize_omena_query_transform_runner_boundary_with_transform_catalog_v0; removal is not before 1.0 and requires downstream migration plus zero audited non-compatibility uses"
)]
pub fn summarize_omena_query_transform_runner_boundary_v0() -> OmenaQueryTransformRunnerBoundaryV0 {
#[cfg(feature = "transform-catalog-trace")]
let mut summary = summarize_omena_query_transform_runner_boundary_with_transform_catalog_v0();
#[cfg(not(feature = "transform-catalog-trace"))]
let summary = summarize_omena_query_transform_runner_boundary_with_transform_catalog_v0();
#[cfg(feature = "transform-catalog-trace")]
if let Some(surface) = summary
.ready_surfaces
.iter_mut()
.find(|surface| **surface == "transformCatalogTraceBoundary")
{
*surface = "transformLawvereTraceBoundary";
}
summary
}
#[cfg(test)]
mod tests {
use super::*;
/// Exact pre-1.0 transform-runner boundary projection retained for wire
/// compatibility. Owner: `omena-query-transform-runner` maintainers.
/// Removal is not before 1.0 and requires downstream migration plus zero
/// audited non-compatibility uses.
#[cfg(feature = "transform-catalog-trace")]
#[deprecated(
since = "0.4.0",
note = "compatibility projection; removal is not before 1.0 and requires downstream migration plus zero audited non-compatibility uses"
)]
const COMPATIBILITY_TRANSFORM_RUNNER_BOUNDARY_JSON_V0: &str = r#"{"schemaVersion":"0","product":"omena-query-transform-runner.boundary","boundaryKind":"query-transform-runner-split","collapsedTransformCrateCount":6,"collapsedTransformCrates":["omena-bundler","omena-transform-cst","omena-transform-egg","omena-transform-passes","omena-transform-print","omena-transform-target"],"directQueryDependencyReplacement":"omena-query-transform-runner","readySurfaces":["transformPlannerBoundary","transformExecutorBoundary","transformPrinterBoundary","transformSourceMapV3SerializerBoundary","transformTargetPlannerBoundary","transformEggWitnessBoundary","transformLawvereTraceBoundary"]}"#;
#[test]
fn transform_runner_boundary_collapses_transform_family_for_query() {
let summary = summarize_omena_query_transform_runner_boundary_with_transform_catalog_v0();
assert_eq!(summary.collapsed_transform_crate_count, 6);
assert_eq!(
summary.collapsed_transform_crates,
OMENA_QUERY_TRANSFORM_RUNNER_COLLAPSED_CRATES_V0
);
assert!(
summary
.ready_surfaces
.contains(&"transformExecutorBoundary")
);
assert!(
summary
.ready_surfaces
.contains(&"transformTargetPlannerBoundary")
);
}
#[cfg(feature = "transform-catalog-trace")]
#[test]
#[allow(deprecated)]
fn transform_runner_boundary_preserves_legacy_and_canonical_serialized_projections()
-> Result<(), serde_json::Error> {
let legacy = serde_json::to_string(&summarize_omena_query_transform_runner_boundary_v0())?;
let canonical = serde_json::to_string(
&summarize_omena_query_transform_runner_boundary_with_transform_catalog_v0(),
)?;
assert_eq!(legacy, COMPATIBILITY_TRANSFORM_RUNNER_BOUNDARY_JSON_V0);
assert_eq!(
canonical,
r#"{"schemaVersion":"0","product":"omena-query-transform-runner.boundary","boundaryKind":"query-transform-runner-split","collapsedTransformCrateCount":6,"collapsedTransformCrates":["omena-bundler","omena-transform-cst","omena-transform-egg","omena-transform-passes","omena-transform-print","omena-transform-target"],"directQueryDependencyReplacement":"omena-query-transform-runner","readySurfaces":["transformPlannerBoundary","transformExecutorBoundary","transformPrinterBoundary","transformSourceMapV3SerializerBoundary","transformTargetPlannerBoundary","transformEggWitnessBoundary","transformCatalogTraceBoundary"]}"#
);
Ok(())
}
#[test]
fn transform_runner_materializes_sorted_native_edits() {
let input_css = ".button { color: red; margin: 1px; }";
let color_start = input_css.find("red").unwrap_or(input_css.len());
let margin_start = input_css.find("1px").unwrap_or(input_css.len());
let output = materialize_transform_module_evaluation_native_edits(
input_css,
&[
TransformModuleEvaluationNativeEditV0 {
start: margin_start,
end: margin_start + "1px".len(),
replacement: "2px".to_string(),
edit_kind: "value".to_string(),
abstract_value: None,
abstract_value_kind: None,
},
TransformModuleEvaluationNativeEditV0 {
start: color_start,
end: color_start + "red".len(),
replacement: "blue".to_string(),
edit_kind: "value".to_string(),
abstract_value: None,
abstract_value_kind: None,
},
],
);
assert_eq!(
output.as_deref(),
Some(".button { color: blue; margin: 2px; }")
);
}
#[test]
fn transform_runner_rejects_overlapping_native_edits() {
let output = materialize_transform_module_evaluation_native_edits(
"abcdef",
&[
TransformModuleEvaluationNativeEditV0 {
start: 1,
end: 4,
replacement: "x".to_string(),
edit_kind: "value".to_string(),
abstract_value: None,
abstract_value_kind: None,
},
TransformModuleEvaluationNativeEditV0 {
start: 3,
end: 5,
replacement: "y".to_string(),
edit_kind: "value".to_string(),
abstract_value: None,
abstract_value_kind: None,
},
],
);
assert_eq!(output, None);
}
}