Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: SwcEmitDtsPlugin #8097

Draft
wants to merge 4 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ swc_error_reporters = { version = "=2.0.0" }
swc_html = { version = "=1.0.0" }
swc_html_minifier = { version = "=1.0.0", default-features = false }
swc_node_comments = { version = "=1.0.0" }
swc_typescript = { version = "=1.0.0" }

rspack_dojang = { version = "0.1.9" }
[workspace.metadata.release]
Expand Down
5 changes: 5 additions & 0 deletions crates/node_binding/binding.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,7 @@ export enum BuiltinPluginName {
LightningCssMinimizerRspackPlugin = 'LightningCssMinimizerRspackPlugin',
BundlerInfoRspackPlugin = 'BundlerInfoRspackPlugin',
CssExtractRspackPlugin = 'CssExtractRspackPlugin',
SwcDtsEmitRspackPlugin = 'SwcDtsEmitRspackPlugin',
JsLoaderRspackPlugin = 'JsLoaderRspackPlugin',
LazyCompilationPlugin = 'LazyCompilationPlugin'
}
Expand Down Expand Up @@ -1883,6 +1884,10 @@ export interface RawStatsOptions {
colors: boolean
}

export interface RawSwcDtsEmitRspackPluginOptions {
rootDir?: string
}

export interface RawSwcJsMinimizerOptions {
compress: any
mangle: any
Expand Down
9 changes: 9 additions & 0 deletions crates/rspack_binding_options/src/options/raw_builtins/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ mod raw_banner;
mod raw_bundle_info;
mod raw_copy;
mod raw_css_extract;
mod raw_swc_dts_emit;
mod raw_html;
mod raw_ignore;
mod raw_lazy_compilation;
Expand Down Expand Up @@ -86,6 +87,7 @@ pub use self::{
use self::{
raw_bundle_info::{RawBundlerInfoModeWrapper, RawBundlerInfoPluginOptions},
raw_css_extract::RawCssExtractPluginOption,
raw_swc_dts_emit::RawSwcDtsEmitRspackPluginOptions,
raw_lazy_compilation::{JsBackend, RawLazyCompilationOption},
raw_mf::{RawConsumeSharedPluginOptions, RawContainerReferencePluginOptions, RawProvideOptions},
raw_runtime_chunk::RawRuntimeChunkOptions,
Expand Down Expand Up @@ -174,6 +176,7 @@ pub enum BuiltinPluginName {
LightningCssMinimizerRspackPlugin,
BundlerInfoRspackPlugin,
CssExtractRspackPlugin,
SwcDtsEmitRspackPlugin,

// rspack js adapter plugins
// naming format follow XxxRspackPlugin
Expand Down Expand Up @@ -487,6 +490,12 @@ impl BuiltinPlugin {
.boxed();
plugins.push(plugin);
}
BuiltinPluginName::SwcDtsEmitRspackPlugin => {
let plugin = rspack_loader_swc::PluginSwcDtsEmit::new(
downcast_into::<RawSwcDtsEmitRspackPluginOptions>(self.options)?.into(),
).boxed();
plugins.push(plugin);
}
BuiltinPluginName::JsLoaderRspackPlugin => {
plugins
.push(JsLoaderRspackPlugin::new(downcast_into::<JsLoaderRunner>(self.options)?).boxed());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
use rspack_loader_swc::{SwcDtsEmitOptions};
use napi_derive::napi;

#[napi(object, object_to_js = false)]
pub struct RawSwcDtsEmitRspackPluginOptions {
pub root_dir: Option<String>,
}

impl From<RawSwcDtsEmitRspackPluginOptions> for SwcDtsEmitOptions {
fn from(value: RawSwcDtsEmitRspackPluginOptions) -> Self {
Self {
root_dir: value.root_dir.unwrap(),
}
}
}
1 change: 1 addition & 0 deletions crates/rspack_core/src/concatenated_module.rs
Original file line number Diff line number Diff line change
Expand Up @@ -544,6 +544,7 @@ impl Module for ConcatenatedModule {
json_data: Default::default(),
top_level_declarations: Some(Default::default()),
module_concatenation_bailout: Default::default(),
parse_meta: Default::default(),
};
self.clear_diagnostics();

Expand Down
5 changes: 4 additions & 1 deletion crates/rspack_core/src/module.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ use rspack_sources::Source;
use rspack_util::atom::Atom;
use rspack_util::ext::{AsAny, DynHash};
use rspack_util::source_map::ModuleSourceMapConfig;
use rustc_hash::FxHashSet as HashSet;
use rustc_hash::{FxHashMap as HashMap, FxHashSet as HashSet};

use crate::concatenated_module::ConcatenatedModule;
use crate::dependencies_block::dependencies_block_update_hash;
Expand Down Expand Up @@ -56,6 +56,8 @@ pub struct BuildInfo {
pub json_data: Option<JsonValue>,
pub top_level_declarations: Option<HashSet<Atom>>,
pub module_concatenation_bailout: Option<String>,

pub parse_meta: HashMap<String, String>,
}

impl Default for BuildInfo {
Expand All @@ -74,6 +76,7 @@ impl Default for BuildInfo {
json_data: None,
top_level_declarations: None,
module_concatenation_bailout: None,
parse_meta: HashMap::default(),
}
}
}
Expand Down
1 change: 1 addition & 0 deletions crates/rspack_core/src/normal_module.rs
Original file line number Diff line number Diff line change
Expand Up @@ -481,6 +481,7 @@ impl Module for NormalModule {
}

build_info.cacheable = loader_result.cacheable;
build_info.parse_meta = loader_result.parse_meta.clone();
build_info.file_dependencies = loader_result.file_dependencies;
build_info.context_dependencies = loader_result.context_dependencies;
build_info.missing_dependencies = loader_result.missing_dependencies;
Expand Down
3 changes: 3 additions & 0 deletions crates/rspack_loader_swc/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ jsonc-parser = { version = "0.23.0", features = ["serde"] }
rspack_ast = { version = "0.1.0", path = "../rspack_ast" }
rspack_core = { version = "0.1.0", path = "../rspack_core" }
rspack_error = { version = "0.1.0", path = "../rspack_error" }
rspack_hook = { version = "0.1.0", path = "../rspack_hook" }
rspack_loader_runner = { version = "0.1.0", path = "../rspack_loader_runner" }
rspack_plugin_javascript = { version = "0.1.0", path = "../rspack_plugin_javascript" }
rspack_util = { version = "0.1.0", path = "../rspack_util" }
Expand All @@ -34,5 +35,7 @@ stacker = { workspace = true }
swc_config = { workspace = true }
swc_core = { workspace = true, features = ["base", "ecma_ast", "common"] }
swc_plugin_import = { version = "0.1.5", path = "../swc_plugin_import" }
swc_typescript = { workspace = true }
tokio = { workspace = true }
tracing = { workspace = true }
url = "2.5.0"
26 changes: 26 additions & 0 deletions crates/rspack_loader_swc/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,29 @@

mod compiler;
mod options;
mod plugin;
mod transformer;

use std::default::Default;
use std::sync::Arc;

use compiler::{IntoJsAst, SwcCompiler};
use options::SwcCompilerOptionsWithAdditional;
pub use options::SwcLoaderJsOptions;
pub use plugin::{PluginSwcDtsEmit, SwcDtsEmitOptions};
use rspack_core::{rspack_sources::SourceMap, Mode, RunnerContext};
use rspack_error::{error, AnyhowError, Diagnostic, Result};
use rspack_loader_runner::{Identifiable, Identifier, Loader, LoaderContext};
use rspack_plugin_javascript::ast::{self, SourceMapConfig};
use rspack_plugin_javascript::TransformOutput;
use rspack_util::source_map::SourceMapKind;
use swc_config::{config_types::MergingOption, merge::Merge};
use swc_core::alloc::collections::FxHashMap;

Check failure on line 22 in crates/rspack_loader_swc/src/lib.rs

View workflow job for this annotation

GitHub Actions / Rust check

unused import: `swc_core::alloc::collections::FxHashMap`
use swc_core::base::config::SourceMapsConfig;
use swc_core::base::config::{InputSourceMap, OutputCharset, TransformConfig};
use swc_core::ecma::codegen::to_code_with_comments;
use swc_core::ecma::visit::VisitWith;
use swc_typescript::fast_dts::FastDts;
use transformer::IdentCollector;

#[derive(Debug)]
Expand Down Expand Up @@ -81,6 +87,8 @@
swc_options
};

let name = (swc_options).filename.clone();

let source_map_kind: SourceMapKind = match swc_options.config.source_maps {
Some(SourceMapsConfig::Bool(false)) => SourceMapKind::empty(),
_ => loader_context.context.module_source_map_kind,
Expand Down Expand Up @@ -121,6 +129,23 @@
inline_script: Some(false),
keep_comments: Some(true),
};
let emit_dts = built.syntax.typescript() && built.emit_isolated_dts;

let program = &built.program;
if emit_dts && program.is_module() {
let mut module = program.clone().expect_module();
let mut checker = FastDts::new(Arc::new(swc_core::common::FileName::Custom(name)));
let issues = checker.transform(&mut module);
for issue in issues {
error!(issue);
}
let dts_code = to_code_with_comments(Some(&built.comments), &module);
loader_context
.parse_meta
.entry("swc-loader-dts-extract".into())
.and_modify(|v| v.push_str(&dts_code))
.or_insert(dts_code);
}

let program = tokio::task::block_in_place(|| c.transform(built).map_err(AnyhowError::from))?;
if source_map_kind.enabled() {
Expand All @@ -130,6 +155,7 @@
program.visit_with(&mut v);
codegen_options.source_map_config.names = v.names;
}

let ast = c.into_js_ast(program);
let TransformOutput { code, map } = ast::stringify(&ast, codegen_options)?;

Expand Down
81 changes: 81 additions & 0 deletions crates/rspack_loader_swc/src/plugin.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
use std::sync::Arc;

use rspack_core::{
Compilation, CompilationFinishModules, CompilationParams, CompilerCompilation, Plugin,

Check failure on line 4 in crates/rspack_loader_swc/src/plugin.rs

View workflow job for this annotation

GitHub Actions / Rust check

unused imports: `CompilationParams` and `CompilerCompilation`
PluginContext,
};
use rspack_error::Result;
use rspack_hook::{plugin, plugin_hook};

#[derive(Debug)]
pub struct SwcDtsEmitOptions {
pub root_dir: String,
}

#[plugin]
#[derive(Debug)]
pub struct PluginSwcDtsEmit {
pub(crate) options: Arc<SwcDtsEmitOptions>,
}

impl Eq for PluginSwcDtsEmit {}

impl PartialEq for PluginSwcDtsEmit {
fn eq(&self, other: &Self) -> bool {
Arc::ptr_eq(&self.options, &other.options)
}
}

const PLUGIN_NAME: &str = "rspack.SwcDtsEmitPlugin";

impl PluginSwcDtsEmit {
pub fn new(options: SwcDtsEmitOptions) -> Self {
Self::new_inner(Arc::new(options))
}
}

#[plugin_hook(CompilationFinishModules for PluginSwcDtsEmit)]
async fn finish_modules(&self, compilation: &mut Compilation) -> Result<()> {
let module_graph = compilation.get_module_graph();

for (_, a) in module_graph.modules() {
let meta = &a.build_info().expect("fuck").parse_meta;
dbg!(meta);

Check failure on line 43 in crates/rspack_loader_swc/src/plugin.rs

View workflow job for this annotation

GitHub Actions / Rust check

the `dbg!` macro is intended as a debugging tool
}
Ok(())
}

// #[plugin_hook(CompilerCompilation for PluginSwcDtsEmit)]
// async fn compilation(
// &self,
// compilation: &mut Compilation,
// params: &mut CompilationParams,
// ) -> Result<()> {
// Ok(())
// }

impl Plugin for PluginSwcDtsEmit {
fn name(&self) -> &'static str {
PLUGIN_NAME
}

fn apply(
&self,
ctx: PluginContext<&mut rspack_core::ApplyContext>,
_options: &rspack_core::CompilerOptions,
) -> Result<()> {
// ctx
// .context
// .compiler_hooks
// .compilation
// .tap(compilation::new(self));

ctx
.context
.compilation_hooks
.finish_modules
.tap(finish_modules::new(self));

Ok(())
}
}
26 changes: 25 additions & 1 deletion packages/rspack/etc/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ import { RawProgressPluginOptions } from '@rspack/binding';
import { RawProvideOptions } from '@rspack/binding';
import { RawRuntimeChunkOptions } from '@rspack/binding';
import { RawSourceMapDevToolPluginOptions } from '@rspack/binding';
import { RawSwcDtsEmitRspackPluginOptions } from '@rspack/binding';
import { registerGlobalTrace } from '@rspack/binding';
import { RspackOptionsNormalized as RspackOptionsNormalized_2 } from '.';
import sources = require('../compiled/webpack-sources');
Expand Down Expand Up @@ -7665,6 +7666,7 @@ declare namespace rspackExports {
EvalSourceMapDevToolPlugin,
EvalDevToolModulePlugin,
CssExtractRspackPlugin,
SwcDtsEmitRspackPlugin,
ContextReplacementPlugin,
SwcLoaderEnvConfig,
SwcLoaderEsParserConfig,
Expand Down Expand Up @@ -13101,6 +13103,23 @@ type StringCallback = (err: NodeJS.ErrnoException | null, data?: string) => void
// @public (undocumented)
type StringOrBufferCallback = (err: NodeJS.ErrnoException | null, data?: string | Buffer) => void;

// @public (undocumented)
export class SwcDtsEmitRspackPlugin {
constructor(options: SwcDtsEmitRspackPluginOptions);
// (undocumented)
apply(compiler: Compiler): void;
// (undocumented)
normalizeOptions(options: SwcDtsEmitRspackPluginOptions): RawSwcDtsEmitRspackPluginOptions;
// (undocumented)
options: SwcDtsEmitRspackPluginOptions;
}

// @public (undocumented)
interface SwcDtsEmitRspackPluginOptions {
// (undocumented)
rootDir: string;
}

// @public (undocumented)
export const SwcJsMinimizerRspackPlugin: {
new (options?: SwcJsMinimizerRspackPluginOptions | undefined): {
Expand Down Expand Up @@ -13155,11 +13174,15 @@ export interface SwcLoaderEnvConfig {

// @public (undocumented)
export interface SwcLoaderEsParserConfig {
allowReturnOutsideFunction?: boolean;
allowSuperOutsideMethod?: boolean;
autoAccessors?: boolean;
decorators?: boolean;
decoratorsBeforeExport?: boolean;
explicitResourceManagement?: boolean;
exportDefaultFrom?: boolean;
functionBind?: boolean;
importAssertions?: boolean;
importAttributes?: boolean;
jsx?: boolean;
// (undocumented)
syntax: "ecmascript";
Expand All @@ -13176,6 +13199,7 @@ export interface SwcLoaderJscConfig {
cacheRoot?: string;
plugins?: Array<[string, Record<string, any>]>;
disableBuiltinTransformsForInternalTesting?: boolean;
emitIsolatedDts?: boolean;
};
externalHelpers?: boolean;
keepClassNames?: boolean;
Expand Down
Loading
Loading