Skip to content

Commit

Permalink
Namespace export bug (#170)
Browse files Browse the repository at this point in the history
* Namespace export bug

* Version bump
  • Loading branch information
lucasavila00 authored Apr 30, 2024
1 parent ef7709e commit 41ed8b7
Show file tree
Hide file tree
Showing 15 changed files with 189 additions and 95 deletions.
8 changes: 8 additions & 0 deletions examples/standalone-parser/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# node-server

## 1.0.24

### Patch Changes

- Updated dependencies
- @beff/cli@0.0.27
- @beff/client@0.0.27

## 1.0.23

### Patch Changes
Expand Down
4 changes: 2 additions & 2 deletions examples/standalone-parser/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "standalone-parser",
"version": "1.0.23",
"version": "1.0.24",
"description": "",
"main": "index.js",
"scripts": {
Expand All @@ -11,7 +11,7 @@
"author": "",
"license": "ISC",
"dependencies": {
"@beff/cli": "workspace:^0.0.26",
"@beff/cli": "workspace:^0.0.27",
"@beff/client": "workspace:^",
"vitest": "^0.34.4",
"zod": "^3.23.5"
Expand Down
1 change: 1 addition & 0 deletions examples/standalone-parser/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export enum OtherEnum {
}

export const ARR1 = ["A", "B"] as const;
export type ARR1 = (typeof ARR1)[number];

export const ARR2 = [...ARR1, "C"] as const;

Expand Down
6 changes: 6 additions & 0 deletions packages/beff-cli/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# @beff/cli

## 0.0.27

### Patch Changes

- namespace export bug

## 0.0.26

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/beff-cli/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@beff/cli",
"version": "0.0.26",
"version": "0.0.27",
"description": "",
"bin": {
"beff": "./bin/index.js"
Expand Down
8 changes: 8 additions & 0 deletions packages/beff-client/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# @beff/client

## 0.0.27

### Patch Changes

- namespace export bug
- Updated dependencies
- @beff/cli@0.0.27

## 0.0.26

### Patch Changes
Expand Down
4 changes: 2 additions & 2 deletions packages/beff-client/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@beff/client",
"version": "0.0.26",
"version": "0.0.27",
"description": "",
"main": "dist/cjs/index.js",
"scripts": {
Expand All @@ -20,7 +20,7 @@
"author": "",
"license": "ISC",
"dependencies": {
"@beff/cli": "workspace:^0.0.26"
"@beff/cli": "workspace:^0.0.27"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^6.7.2",
Expand Down
126 changes: 62 additions & 64 deletions packages/beff-core/src/import_resolver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ impl<'a, R: FsModuleResolver> Visit for ImportsVisitor<'a, R> {
match &n.decl {
Decl::TsInterface(n) => {
let TsInterfaceDecl { id, .. } = &**n;
self.symbol_exports.insert(
self.symbol_exports.insert_type(
id.sym.clone(),
Rc::new(SymbolExport::TsInterfaceDecl {
decl: Rc::new(*n.clone()),
Expand All @@ -126,7 +126,7 @@ impl<'a, R: FsModuleResolver> Visit for ImportsVisitor<'a, R> {
}
Decl::TsEnum(decl) => {
let TsEnumDecl { id, .. } = &**decl;
self.symbol_exports.insert(
self.symbol_exports.insert_type(
id.sym.clone(),
Rc::new(SymbolExport::TsEnumDecl {
decl: Rc::new(*decl.clone()),
Expand All @@ -142,7 +142,7 @@ impl<'a, R: FsModuleResolver> Visit for ImportsVisitor<'a, R> {
span,
..
} = &**a;
self.symbol_exports.insert(
self.symbol_exports.insert_type(
id.sym.clone(),
Rc::new(SymbolExport::TsType {
ty: Rc::new(*type_ann.clone()),
Expand All @@ -162,7 +162,7 @@ impl<'a, R: FsModuleResolver> Visit for ImportsVisitor<'a, R> {
name: name.clone(),
span: it.span,
});
self.symbol_exports.insert(name, export);
self.symbol_exports.insert_value(name, export);
}
}
}
Expand All @@ -174,46 +174,48 @@ impl<'a, R: FsModuleResolver> Visit for ImportsVisitor<'a, R> {

fn visit_named_export(&mut self, n: &NamedExport) {
match &n.src {
Some(src) => {
Some(_src) => {
//
for s in &n.specifiers {
match s {
ExportSpecifier::Default(_) => {}
ExportSpecifier::Namespace(ExportNamespaceSpecifier { name, .. }) => {
if let ModuleExportName::Ident(id) = name {
if let Some(file_name) = self.resolve_import(&src.value) {
self.symbol_exports.insert(
id.sym.clone(),
Rc::new(SymbolExport::StarOfOtherFile {
reference: ImportReference::Star {
file_name: file_name.clone(),
span: id.span,
}
.into(),
span: id.span,
}),
)
}
}
ExportSpecifier::Namespace(ExportNamespaceSpecifier { .. }) => {
panic!("ExportSpecifier::Namespace(ExportNamespaceSpecifier is not supported")
// if let ModuleExportName::Ident(id) = name {
// if let Some(file_name) = self.resolve_import(&src.value) {
// self.symbol_exports.insert(
// id.sym.clone(),
// Rc::new(SymbolExport::StarOfOtherFile {
// reference: ImportReference::Star {
// file_name: file_name.clone(),
// span: id.span,
// }
// .into(),
// span: id.span,
// }),
// )
// }
// }
}
ExportSpecifier::Named(ExportNamedSpecifier { orig, exported, .. }) => {
if let ModuleExportName::Ident(id) = orig {
let name = match exported {
Some(ModuleExportName::Ident(ex)) => ex.sym.clone(),
Some(ModuleExportName::Str(st)) => st.value.clone(),
None => id.sym.clone(),
};
if let Some(file_name) = self.resolve_import(&src.value) {
self.symbol_exports.insert(
name,
Rc::new(SymbolExport::SomethingOfOtherFile {
something: id.sym.clone(),
file: file_name.clone(),
span: id.span,
}),
)
}
}
ExportSpecifier::Named(ExportNamedSpecifier { .. }) => {
panic!("ExportSpecifier::Named(ExportNamedSpecifier is not supported")
// if let ModuleExportName::Ident(id) = orig {
// let name = match exported {
// Some(ModuleExportName::Ident(ex)) => ex.sym.clone(),
// Some(ModuleExportName::Str(st)) => st.value.clone(),
// None => id.sym.clone(),
// };
// if let Some(file_name) = self.resolve_import(&src.value) {
// self.symbol_exports.insert(
// name,
// Rc::new(SymbolExport::SomethingOfOtherFile {
// something: id.sym.clone(),
// file: file_name.clone(),
// span: id.span,
// }),
// )
// }
// }
}
}
}
Expand Down Expand Up @@ -302,7 +304,7 @@ pub fn parse_and_bind<R: FsModuleResolver>(
let renamed = unresolved.renamed;
let k = (unresolved.name.clone(), unresolved.span);
if let Some((params, ty)) = locals.content.type_aliases.get(&k) {
symbol_exports.insert(
symbol_exports.insert_type(
renamed.clone(),
Rc::new(SymbolExport::TsType {
ty: ty.clone(),
Expand All @@ -315,7 +317,7 @@ pub fn parse_and_bind<R: FsModuleResolver>(
}

if let Some(enum_) = locals.content.enums.get(&k) {
symbol_exports.insert(
symbol_exports.insert_type(
renamed,
Rc::new(SymbolExport::TsEnumDecl {
decl: enum_.clone(),
Expand All @@ -326,7 +328,7 @@ pub fn parse_and_bind<R: FsModuleResolver>(
}

if let Some(intf) = locals.content.interfaces.get(&k) {
symbol_exports.insert(
symbol_exports.insert_type(
renamed,
Rc::new(SymbolExport::TsInterfaceDecl {
decl: intf.clone(),
Expand All @@ -337,29 +339,25 @@ pub fn parse_and_bind<R: FsModuleResolver>(
}
if let Some(import) = v.imports.get(&k) {
match &**import {
ImportReference::Named {
orig,
file_name,
span,
} => {
let it = Rc::new(SymbolExport::SomethingOfOtherFile {
something: orig.as_ref().clone(),
file: file_name.clone(),
span: *span,
});
symbol_exports.insert(renamed, it);
continue;
ImportReference::Named { .. } => {
// let it = Rc::new(SymbolExport::SomethingOfOtherFile {
// something: orig.as_ref().clone(),
// file: file_name.clone(),
// span: *span,
// });
// symbol_exports.insert(renamed, it);
// continue;
panic!("ImportReference::Named is not supported")
}
ImportReference::Star { span, .. } => {
symbol_exports.insert(
renamed,
Rc::new(SymbolExport::StarOfOtherFile {
reference: import.clone(),
span: *span,
}),
);

continue;
ImportReference::Star { .. } => {
// symbol_exports.insert(
// renamed,
// Rc::new(SymbolExport::StarOfOtherFile {
// reference: import.clone(),
// span: *span,
// }),
// );
panic!("ImportReference::Star is not supported")
}
ImportReference::Default { .. } => {
continue;
Expand Down
40 changes: 33 additions & 7 deletions packages/beff-core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,8 @@ impl ImportReference {
}
#[derive(Debug, Clone)]
pub struct SymbolsExportsModule {
named: HashMap<JsWord, Rc<SymbolExport>>,
named_types: HashMap<JsWord, Rc<SymbolExport>>,
named_values: HashMap<JsWord, Rc<SymbolExport>>,
extends: Vec<BffFileName>,
}
impl Default for SymbolsExportsModule {
Expand All @@ -149,20 +150,45 @@ impl Default for SymbolsExportsModule {
impl SymbolsExportsModule {
pub fn new() -> SymbolsExportsModule {
SymbolsExportsModule {
named: HashMap::new(),
named_types: HashMap::new(),
named_values: HashMap::new(),
extends: Vec::new(),
}
}
pub fn insert_value(&mut self, name: JsWord, export: Rc<SymbolExport>) {
self.named_values.insert(name, export);
}

pub fn get_value<R: FileManager>(
&self,
name: &JsWord,
files: &mut R,
) -> Option<Rc<SymbolExport>> {
self.named_values.get(name).cloned().or_else(|| {
for it in &self.extends {
let file = files.get_or_fetch_file(it)?;
let res = file.symbol_exports.get_value(name, files);
if let Some(it) = res {
return Some(it.clone());
}
}
None
})
}

pub fn insert(&mut self, name: JsWord, export: Rc<SymbolExport>) {
self.named.insert(name, export);
pub fn insert_type(&mut self, name: JsWord, export: Rc<SymbolExport>) {
self.named_types.insert(name, export);
}

pub fn get<R: FileManager>(&self, name: &JsWord, files: &mut R) -> Option<Rc<SymbolExport>> {
self.named.get(name).cloned().or_else(|| {
pub fn get_type<R: FileManager>(
&self,
name: &JsWord,
files: &mut R,
) -> Option<Rc<SymbolExport>> {
self.named_types.get(name).cloned().or_else(|| {
for it in &self.extends {
let file = files.get_or_fetch_file(it)?;
let res = file.symbol_exports.get(name, files);
let res = file.symbol_exports.get_type(name, files);
if let Some(it) = res {
return Some(it.clone());
}
Expand Down
Loading

0 comments on commit 41ed8b7

Please sign in to comment.