use-js 0.0.1

Feature-gated facade crate for RustUse JavaScript ecosystem primitives
Documentation
#![forbid(unsafe_code)]
#![doc = include_str!("../README.md")]

pub mod prelude;

#[cfg(feature = "angular")]
pub mod angular {
    pub use use_angular::*;
}
#[cfg(feature = "astro")]
pub mod astro {
    pub use use_astro::*;
}
#[cfg(feature = "bun")]
pub mod bun {
    pub use use_bun::*;
}
#[cfg(feature = "deno")]
pub mod deno {
    pub use use_deno::*;
}
#[cfg(feature = "ecmascript")]
pub mod ecmascript {
    pub use use_ecmascript::*;
}
#[cfg(feature = "export")]
pub mod export {
    pub use use_js_export::*;
}
#[cfg(feature = "identifier")]
pub mod identifier {
    pub use use_js_identifier::*;
}
#[cfg(feature = "import")]
pub mod import {
    pub use use_js_import::*;
}
#[cfg(feature = "keyword")]
pub mod keyword {
    pub use use_js_keyword::*;
}
#[cfg(feature = "jquery")]
pub mod jquery {
    pub use use_jquery::*;
}
#[cfg(feature = "lit")]
pub mod lit {
    pub use use_lit::*;
}
#[cfg(feature = "module")]
pub mod module {
    pub use use_js_module::*;
}
#[cfg(feature = "next")]
pub mod next {
    pub use use_next::*;
}
#[cfg(feature = "node-js")]
pub mod node_js {
    pub use use_node_js::*;
}
#[cfg(feature = "npm")]
pub mod npm {
    pub use use_npm::*;
}
#[cfg(feature = "nuxt")]
pub mod nuxt {
    pub use use_nuxt::*;
}
#[cfg(feature = "package-json")]
pub mod package_json {
    pub use use_package_json::*;
}
#[cfg(feature = "pnpm")]
pub mod pnpm {
    pub use use_pnpm::*;
}
#[cfg(feature = "preact")]
pub mod preact {
    pub use use_preact::*;
}
#[cfg(feature = "qwik")]
pub mod qwik {
    pub use use_qwik::*;
}
#[cfg(feature = "react")]
pub mod react {
    pub use use_react::*;
}
#[cfg(feature = "remix")]
pub mod remix {
    pub use use_remix::*;
}
#[cfg(feature = "solid")]
pub mod solid {
    pub use use_solid::*;
}
#[cfg(feature = "storybook")]
pub mod storybook {
    pub use use_storybook::*;
}
#[cfg(feature = "svelte")]
pub mod svelte {
    pub use use_svelte::*;
}
#[cfg(feature = "ts")]
pub mod ts {
    pub use use_ts::*;
}
#[cfg(feature = "tsconfig")]
pub mod tsconfig {
    pub use use_tsconfig::*;
}
#[cfg(feature = "value")]
pub mod value {
    pub use use_js_value::*;
}
#[cfg(feature = "vite")]
pub mod vite {
    pub use use_vite::*;
}
#[cfg(feature = "vue")]
pub mod vue {
    pub use use_vue::*;
}
#[cfg(feature = "yarn")]
pub mod yarn {
    pub use use_yarn::*;
}

#[cfg(feature = "angular")]
pub use use_angular::{
    AngularArtifactKind, AngularConfigFile, AngularDirectiveName, AngularFileKind,
    AngularModuleName, AngularNameError, AngularSelector, AngularStandaloneMode,
    AngularVersionFamily,
};
#[cfg(feature = "astro")]
pub use use_astro::{
    AstroConfigFile, AstroContentCollectionName, AstroDirectoryKind, AstroFileKind,
    AstroIntegrationName, AstroRenderingMode, AstroTextError, AstroVersionFamily,
};
#[cfg(feature = "bun")]
pub use use_bun::{BunCommand, BunLockfile, BunVersion};
#[cfg(feature = "deno")]
pub use use_deno::{DenoConfigFile, DenoPermission, DenoVersion};
#[cfg(feature = "ecmascript")]
pub use use_ecmascript::{
    ES5, ES2015, ES2016, ES2017, ES2018, ES2019, ES2020, ES2021, ES2022, ES2023, ES2024, ESNEXT,
    EcmaScriptEdition, EcmaScriptParseError, EcmaScriptTarget, EcmaScriptYear,
};
#[cfg(feature = "jquery")]
pub use use_jquery::{
    JqueryAjaxMethod, JqueryEffectName, JqueryEventName, JqueryPluginName, JquerySelector,
    JqueryTextError, JqueryVersionFamily,
};
#[cfg(feature = "export")]
pub use use_js_export::{JsExportKind, JsExportSpecifier, JsExportStatementParts};
#[cfg(feature = "identifier")]
pub use use_js_identifier::{
    JsIdentifier, JsIdentifierError, is_ascii_js_identifier_continue, is_ascii_js_identifier_start,
    is_valid_ascii_js_identifier,
};
#[cfg(feature = "import")]
pub use use_js_import::{JsImportKind, JsImportSpecifier, JsImportStatementParts};
#[cfg(feature = "keyword")]
pub use use_js_keyword::{
    JsKeyword, JsKeywordParseError, JsReservedWord, is_js_keyword, is_js_reserved_word,
};
#[cfg(feature = "module")]
pub use use_js_module::{
    JsModuleFormat, JsModuleKind, JsModuleKindParseError, JsModuleSpecifier, JsModuleSpecifierError,
};
#[cfg(feature = "value")]
pub use use_js_value::JsPrimitiveValue;
#[cfg(feature = "lit")]
pub use use_lit::{
    LitDecoratorName, LitElementName, LitFileKind, LitNameError, LitPropertyName, LitTemplateKind,
};
#[cfg(feature = "next")]
pub use use_next::*;
#[cfg(feature = "node-js")]
pub use use_node_js::{
    NodeMajorVersion, NodePackageManagerPreference, NodeRuntime, NodeVersion, NodeVersionParseError,
};
#[cfg(feature = "npm")]
pub use use_npm::{
    NpmCommand, NpmCommandParseError, NpmPackageSpec, NpmRegistryUrl, NpmScriptCommand,
    NpmTextError,
};
#[cfg(feature = "nuxt")]
pub use use_nuxt::{NuxtConfigFile, NuxtDirectoryKind, NuxtRenderingMode, NuxtVersionFamily};
#[cfg(feature = "package-json")]
pub use use_package_json::{
    DependencyKind, DependencyMap, PackageJson, PackageJsonTextError, PackageName, PackageScript,
    PackageScriptName, PackageType, PackageVersion,
};
#[cfg(feature = "pnpm")]
pub use use_pnpm::{PnpmCommand, PnpmFilter, PnpmLockfile, PnpmTextError, PnpmWorkspace};
#[cfg(feature = "preact")]
pub use use_preact::{
    PreactCompatMode, PreactComponentName, PreactFileKind, PreactHookName, PreactJsxRuntime,
    PreactNameError,
};
#[cfg(feature = "qwik")]
pub use use_qwik::{
    QwikCityRouteKind, QwikComponentName, QwikConfigFile, QwikDirectoryKind, QwikFileKind,
    QwikNameError, QwikOptimizerMode,
};
#[cfg(feature = "react")]
pub use use_react::{
    ReactComponentName, ReactFileKind, ReactHookName, ReactJsxRuntime, ReactNameError,
};
#[cfg(feature = "remix")]
pub use use_remix::*;
#[cfg(feature = "solid")]
pub use use_solid::{
    SolidComponentName, SolidFileKind, SolidJsxRuntime, SolidNameError, SolidPrimitiveKind,
    SolidSignalName,
};
#[cfg(feature = "storybook")]
pub use use_storybook::*;
#[cfg(feature = "svelte")]
pub use use_svelte::{
    SvelteComponentName, SvelteConfigFile, SvelteDirectiveName, SvelteFileKind,
    SvelteKitDirectoryKind, SvelteKitRenderingMode, SvelteNameError,
};
#[cfg(feature = "ts")]
pub use use_ts::{
    TsModuleResolution, TsOptionParseError, TsStrictness, TsTarget, TsTargetParseError,
    TypeScriptVersion, TypeScriptVersionParseError,
};
#[cfg(feature = "tsconfig")]
pub use use_tsconfig::{
    CompilerOptions, TsConfig, TsConfigExclude, TsConfigExtends, TsConfigInclude, TsConfigTextError,
};
#[cfg(feature = "vite")]
pub use use_vite::{ViteConfigFile, ViteFrameworkPreset, ViteMode, VitePluginName, ViteTextError};
#[cfg(feature = "vue")]
pub use use_vue::{VueApiStyle, VueComponentName, VueDirectiveName, VueFileKind, VueNameError};
#[cfg(feature = "yarn")]
pub use use_yarn::{YarnCommand, YarnLockfile, YarnTextError, YarnVersionFamily, YarnWorkspace};

#[cfg(test)]
mod tests {
    #[cfg(all(
        feature = "ecmascript",
        feature = "identifier",
        feature = "package-json",
        feature = "react",
        feature = "node-js"
    ))]
    #[test]
    fn facade_reexports_common_primitives() -> Result<(), Box<dyn std::error::Error>> {
        let target: crate::EcmaScriptTarget = "es2024".parse()?;
        let identifier = crate::JsIdentifier::new("createApp")?;
        let package = crate::PackageName::new("@rustuse/example")?;
        let component = crate::ReactComponentName::new("AppShell")?;

        assert_eq!(target.to_string(), "ES2024");
        assert_eq!(identifier.as_str(), "createApp");
        assert!(package.is_scoped());
        assert_eq!(component.as_str(), "AppShell");
        assert_eq!(
            crate::node_js::NodePackageManagerPreference::Pnpm.as_str(),
            "pnpm"
        );
        Ok(())
    }

    #[cfg(all(
        feature = "astro",
        feature = "angular",
        feature = "preact",
        feature = "svelte",
        feature = "solid",
        feature = "jquery",
        feature = "qwik",
        feature = "lit",
        feature = "vue",
        feature = "nuxt"
    ))]
    #[test]
    fn facade_reexports_frontend_framework_primitives() -> Result<(), Box<dyn std::error::Error>> {
        let integration = crate::AstroIntegrationName::new("@astrojs/mdx")?;
        let angular_selector = crate::AngularSelector::new("app-root")?;
        let preact_component = crate::PreactComponentName::new("AppShell")?;
        let svelte_directive = crate::SvelteDirectiveName::new("on:click")?;
        let solid_signal = crate::SolidSignalName::new("count")?;
        let jquery_event = crate::JqueryEventName::new("click.app")?;
        let qwik_component = crate::QwikComponentName::new("HeroPanel")?;
        let lit_element = crate::LitElementName::new("app-shell")?;
        let vue_component = crate::VueComponentName::new("AppShell")?;

        assert_eq!(integration.as_str(), "@astrojs/mdx");
        assert_eq!(angular_selector.as_str(), "app-root");
        assert_eq!(preact_component.as_str(), "AppShell");
        assert_eq!(svelte_directive.as_str(), "on:click");
        assert_eq!(solid_signal.as_str(), "count");
        assert_eq!(jquery_event.as_str(), "click.app");
        assert_eq!(qwik_component.as_str(), "HeroPanel");
        assert_eq!(lit_element.as_str(), "app-shell");
        assert_eq!(vue_component.as_str(), "AppShell");
        assert_eq!(crate::NuxtRenderingMode::Hybrid.as_str(), "hybrid");
        Ok(())
    }

    #[cfg(all(feature = "next", feature = "remix", feature = "storybook"))]
    #[test]
    fn facade_reexports_route_and_story_primitives() -> Result<(), Box<dyn std::error::Error>> {
        let next_segment = crate::NextJsRouteSegment::new("blog")?;
        let remix_path = crate::RemixRoutePath::new("/products/$productId")?;
        let story_name = crate::StorybookStoryName::new("Primary")?;

        assert_eq!(next_segment.as_str(), "blog");
        assert_eq!(crate::NextJsRuntimeKind::Edge.as_str(), "edge");
        assert!(crate::RemixRouteKind::IndexRoute.is_index_route());
        assert_eq!(remix_path.as_str(), "/products/$productId");
        assert_eq!(story_name.as_str(), "Primary");
        assert_eq!(crate::StorybookControlKind::Select.as_str(), "select");
        Ok(())
    }
}