From 84f90c07ee3827e6f3652dd6c9fab0993ecc8150 Mon Sep 17 00:00:00 2001 From: Konstantin Burkalev Date: Tue, 18 Feb 2025 14:24:52 +0200 Subject: [PATCH] fix(schema-compiler): Correct models transpilation in native in multitenant environments (#9234) * add types to ErrorReporter * update native error reporter to use RefCells instead of Arc Mutex * Revert "update native error reporter to use RefCells instead of Arc Mutex" This reverts commit 406ee85cc5ebc3de066c37922ab408033cfacaee. * pass compiler Id to transpilation native * Fix warn * use cargo insta for snapshot testing * introduce LruCache for transpilation --- packages/cubejs-backend-native/Cargo.lock | 18 ++- packages/cubejs-backend-native/Cargo.toml | 1 + packages/cubejs-backend-native/js/index.ts | 1 + .../cubejs-backend-native/src/transpilers.rs | 50 ++++-- .../src/compiler/DataSchemaCompiler.js | 15 +- .../src/compiler/ErrorReporter.ts | 12 +- .../src/compiler/PrepareCompiler.ts | 5 +- rust/cubenativeutils/Cargo.lock | 23 ++- rust/cubesql/Cargo.lock | 23 ++- rust/cubesql/cubesql/Cargo.toml | 20 ++- rust/cubesqlplanner/Cargo.lock | 25 ++- rust/cubetranspilers/Cargo.lock | 64 ++++++++ rust/cubetranspilers/Cargo.toml | 3 + rust/cubetranspilers/tests/common/mod.rs | 1 + .../tests/cube_prop_ctx_test.rs | 128 +-------------- .../tests/import_export_test.rs | 95 ++--------- ...test__complicated_transform_1st_stage.snap | 150 ++++++++++++++++++ ...test__complicated_transform_2nd_stage.snap | 150 ++++++++++++++++++ .../cube_prop_ctx_test__simple_transform.snap | 40 +++++ ..._export_test__export_const_expression.snap | 14 ++ ...port_test__export_default_declaration.snap | 8 + ...xport_test__export_default_expression.snap | 6 + ...ort_test__export_default_ts_interface.snap | 5 + .../import_export_test__export_named.snap | 8 + ...ort_export_test__import_named_default.snap | 5 + yarn.lock | 32 ---- 26 files changed, 631 insertions(+), 271 deletions(-) create mode 100644 rust/cubetranspilers/tests/snapshots/cube_prop_ctx_test__complicated_transform_1st_stage.snap create mode 100644 rust/cubetranspilers/tests/snapshots/cube_prop_ctx_test__complicated_transform_2nd_stage.snap create mode 100644 rust/cubetranspilers/tests/snapshots/cube_prop_ctx_test__simple_transform.snap create mode 100644 rust/cubetranspilers/tests/snapshots/import_export_test__export_const_expression.snap create mode 100644 rust/cubetranspilers/tests/snapshots/import_export_test__export_default_declaration.snap create mode 100644 rust/cubetranspilers/tests/snapshots/import_export_test__export_default_expression.snap create mode 100644 rust/cubetranspilers/tests/snapshots/import_export_test__export_default_ts_interface.snap create mode 100644 rust/cubetranspilers/tests/snapshots/import_export_test__export_named.snap create mode 100644 rust/cubetranspilers/tests/snapshots/import_export_test__import_named_default.snap diff --git a/packages/cubejs-backend-native/Cargo.lock b/packages/cubejs-backend-native/Cargo.lock index 3e505689905ca..965c9b834449b 100644 --- a/packages/cubejs-backend-native/Cargo.lock +++ b/packages/cubejs-backend-native/Cargo.lock @@ -884,6 +884,7 @@ dependencies = [ "libc", "log", "log-reroute", + "lru", "minijinja", "neon", "once_cell", @@ -1369,6 +1370,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1581,6 +1588,11 @@ name = "hashbrown" version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] name = "heck" @@ -2188,11 +2200,11 @@ dependencies = [ [[package]] name = "lru" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2994eeba8ed550fd9b47a0b38f0242bc3344e496483c6180b69139cc2fa5d1d7" +checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.2", ] [[package]] diff --git a/packages/cubejs-backend-native/Cargo.toml b/packages/cubejs-backend-native/Cargo.toml index d0c33ff5fac01..a03ed00820821 100644 --- a/packages/cubejs-backend-native/Cargo.toml +++ b/packages/cubejs-backend-native/Cargo.toml @@ -48,6 +48,7 @@ tokio = { version = "1", features = ["full", "rt"] } uuid = { version = "1", features = ["v4"] } bytes = "1.5.0" regex = "1.10.2" +lru = "0.13.0" [dependencies.neon] version = "=1" diff --git a/packages/cubejs-backend-native/js/index.ts b/packages/cubejs-backend-native/js/index.ts index bd15636e85684..c745c27a35849 100644 --- a/packages/cubejs-backend-native/js/index.ts +++ b/packages/cubejs-backend-native/js/index.ts @@ -104,6 +104,7 @@ export type SQLInterfaceOptions = { export interface TransformConfig { fileName: string; transpilers: string[]; + compilerId: string; metaData?: { cubeNames: string[]; cubeSymbols: Record>; diff --git a/packages/cubejs-backend-native/src/transpilers.rs b/packages/cubejs-backend-native/src/transpilers.rs index 3d423926adf6d..d9706fd2d7fbb 100644 --- a/packages/cubejs-backend-native/src/transpilers.rs +++ b/packages/cubejs-backend-native/src/transpilers.rs @@ -2,12 +2,15 @@ use crate::node_obj_deserializer::JsValueDeserializer; use crate::node_obj_serializer::NodeObjSerializer; use anyhow::anyhow; use cubetranspilers::{run_transpilers, TransformConfig, Transpilers}; +use lru::LruCache; use neon::context::{Context, FunctionContext, ModuleContext}; use neon::prelude::{JsPromise, JsResult, JsValue, NeonResult}; use neon::types::JsString; use serde::Deserialize; use std::collections::{HashMap, HashSet}; -use std::sync::RwLock; +use std::env; +use std::num::NonZeroUsize; +use std::sync::{LazyLock, Mutex}; #[derive(Deserialize, Default, Clone, Debug)] #[serde(rename_all = "camelCase")] @@ -22,10 +25,25 @@ pub struct TransformMetaData { pub struct TransformRequestConfig { pub file_name: String, pub transpilers: Vec, + pub compiler_id: String, pub meta_data: Option, } -static METADATA_CACHE: RwLock> = RwLock::new(None); +/// It should be equal or more then number of internal libuv threads used by Neon +/// By 01.2025 it defaults to 4. But maybe changed via `UV_THREADPOOL_SIZE` env var. +/// `CUBEJS_TRANSPILER_METADATA_CACHE_SIZE` env var is provided for fine tuning. +/// @see https://docs.libuv.org/en/v1.x/threadpool.html +/// @see https://nodejs.org/api/cli.html#cli_uv_threadpool_size_size +static DEFAULT_CACHE_SIZE: usize = 16; + +static METADATA_CACHE: LazyLock>> = LazyLock::new(|| { + let cache_size = env::var("CUBEJS_TRANSPILER_METADATA_CACHE_SIZE") + .ok() + .and_then(|s| s.parse::().ok()) + .and_then(NonZeroUsize::new) + .unwrap_or(NonZeroUsize::new(DEFAULT_CACHE_SIZE).unwrap()); + Mutex::new(LruCache::new(cache_size)) +}); pub fn register_module(cx: &mut ModuleContext) -> NeonResult<()> { cx.export_function("transpileJs", transpile_js)?; @@ -44,7 +62,7 @@ pub fn transpile_js(mut cx: FunctionContext) -> JsResult { let transform_config: TransformConfig = match transform_request_config { Ok(data) => match data.meta_data { Some(meta_data) => { - let mut config_lock = METADATA_CACHE.write().unwrap(); + let mut config_lock = METADATA_CACHE.lock().unwrap(); let cache = TransformMetaData { cube_names: meta_data.cube_names, cube_symbols: meta_data.cube_symbols, @@ -57,17 +75,27 @@ pub fn transpile_js(mut cx: FunctionContext) -> JsResult { cube_symbols: cache.cube_symbols.clone(), context_symbols: cache.context_symbols.clone(), }; - *config_lock = Some(cache); + config_lock.put(data.compiler_id.clone(), cache); cfg } None => { - let cache = METADATA_CACHE.read().unwrap().clone().unwrap_or_default(); - TransformConfig { - file_name: data.file_name, - transpilers: data.transpilers, - cube_names: cache.cube_names.clone(), - cube_symbols: cache.cube_symbols.clone(), - context_symbols: cache.context_symbols.clone(), + let mut config_lock = METADATA_CACHE.lock().unwrap(); + + match config_lock.get(&data.compiler_id) { + Some(cached) => TransformConfig { + file_name: data.file_name, + transpilers: data.transpilers, + cube_names: cached.cube_names.clone(), + cube_symbols: cached.cube_symbols.clone(), + context_symbols: cached.context_symbols.clone(), + }, + None => TransformConfig { + file_name: data.file_name, + transpilers: data.transpilers, + cube_names: HashSet::new(), + cube_symbols: HashMap::new(), + context_symbols: HashMap::new(), + }, } } }, diff --git a/packages/cubejs-schema-compiler/src/compiler/DataSchemaCompiler.js b/packages/cubejs-schema-compiler/src/compiler/DataSchemaCompiler.js index 181ad13f97419..cfd770fbc9816 100644 --- a/packages/cubejs-schema-compiler/src/compiler/DataSchemaCompiler.js +++ b/packages/cubejs-schema-compiler/src/compiler/DataSchemaCompiler.js @@ -46,6 +46,7 @@ export class DataSchemaCompiler { this.yamlCompiler.dataSchemaCompiler = this; this.pythonContext = null; this.workerPool = null; + this.compilerId = options.compilerId; } compileObjects(compileServices, objects, errorsReport) { @@ -97,6 +98,7 @@ export class DataSchemaCompiler { const transpilationWorkerThreads = getEnv('transpilationWorkerThreads'); const transpilationNative = getEnv('transpilationNative'); + const { compilerId } = this; if (!transpilationNative && transpilationWorkerThreads) { const wc = getEnv('transpilationWorkerThreadsCount'); @@ -141,9 +143,9 @@ export class DataSchemaCompiler { content: ';', }; - await this.transpileJsFile(dummyFile, errorsReport, { cubeNames, cubeSymbols, transpilerNames, contextSymbols: CONTEXT_SYMBOLS }); + await this.transpileJsFile(dummyFile, errorsReport, { cubeNames, cubeSymbols, transpilerNames, contextSymbols: CONTEXT_SYMBOLS, compilerId }); - results = await Promise.all(toCompile.map(f => this.transpileFile(f, errorsReport, { transpilerNames }))); + results = await Promise.all(toCompile.map(f => this.transpileFile(f, errorsReport, { transpilerNames, compilerId }))); } else if (transpilationWorkerThreads) { results = await Promise.all(toCompile.map(f => this.transpileFile(f, errorsReport, { cubeNames, cubeSymbols, transpilerNames }))); } else { @@ -172,7 +174,11 @@ export class DataSchemaCompiler { content: ';', }; - return this.transpileJsFile(dummyFile, errorsReport, { cubeNames: [], cubeSymbols: {}, transpilerNames: [], contextSymbols: {} }); + return this.transpileJsFile( + dummyFile, + errorsReport, + { cubeNames: [], cubeSymbols: {}, transpilerNames: [], contextSymbols: {}, compilerId: this.compilerId } + ); } else if (transpilationWorkerThreads && this.workerPool) { this.workerPool.terminate(); } @@ -219,12 +225,13 @@ export class DataSchemaCompiler { } } - async transpileJsFile(file, errorsReport, { cubeNames, cubeSymbols, contextSymbols, transpilerNames }) { + async transpileJsFile(file, errorsReport, { cubeNames, cubeSymbols, contextSymbols, transpilerNames, compilerId }) { try { if (getEnv('transpilationNative')) { const reqData = { fileName: file.fileName, transpilers: transpilerNames, + compilerId, ...(cubeNames && { metaData: { cubeNames, diff --git a/packages/cubejs-schema-compiler/src/compiler/ErrorReporter.ts b/packages/cubejs-schema-compiler/src/compiler/ErrorReporter.ts index 5e89c2ca1acb0..a4827647587a5 100644 --- a/packages/cubejs-schema-compiler/src/compiler/ErrorReporter.ts +++ b/packages/cubejs-schema-compiler/src/compiler/ErrorReporter.ts @@ -3,6 +3,12 @@ import { codeFrameColumns, SourceLocation } from '@babel/code-frame'; import { UserError } from './UserError'; import { CompileError } from './CompileError'; +export type ErrorLikeObject = { + message: string; +}; + +export type PossibleError = Error | UserError | string | ErrorLikeObject; + export interface CompilerErrorInterface { message: string; plainMessage?: string @@ -141,7 +147,7 @@ export class ErrorReporter { return this.rootReporter().errors; } - public addErrors(errors: any[]) { + public addErrors(errors: PossibleError[]) { errors.forEach((e: any) => { this.error(e); }); } @@ -149,8 +155,8 @@ export class ErrorReporter { return this.rootReporter().warnings; } - public addWarnings(warnings: any[]) { - warnings.forEach((w: any) => { this.warning(w); }); + public addWarnings(warnings: SyntaxErrorInterface[]) { + warnings.forEach(w => { this.warning(w); }); } protected rootReporter(): ErrorReporter { diff --git a/packages/cubejs-schema-compiler/src/compiler/PrepareCompiler.ts b/packages/cubejs-schema-compiler/src/compiler/PrepareCompiler.ts index 70f9f3c454704..57f615c2b7840 100644 --- a/packages/cubejs-schema-compiler/src/compiler/PrepareCompiler.ts +++ b/packages/cubejs-schema-compiler/src/compiler/PrepareCompiler.ts @@ -59,6 +59,8 @@ export const prepareCompiler = (repo: SchemaFileRepository, options: PrepareComp transpilers.push(new CubeCheckDuplicatePropTranspiler()); } + const compilerId = uuidv4(); + const compiler = new DataSchemaCompiler(repo, Object.assign({}, { cubeNameCompilers: [cubeDictionary], preTranspileCubeCompilers: [cubeSymbols, cubeValidator], @@ -80,6 +82,7 @@ export const prepareCompiler = (repo: SchemaFileRepository, options: PrepareComp standalone: options.standalone, nativeInstance, yamlCompiler, + compilerId, }, options)); return { @@ -90,7 +93,7 @@ export const prepareCompiler = (repo: SchemaFileRepository, options: PrepareComp joinGraph, compilerCache, headCommitId: options.headCommitId, - compilerId: uuidv4(), + compilerId, }; }; diff --git a/rust/cubenativeutils/Cargo.lock b/rust/cubenativeutils/Cargo.lock index a428a689435cd..ea0fc681e8e41 100644 --- a/rust/cubenativeutils/Cargo.lock +++ b/rust/cubenativeutils/Cargo.lock @@ -930,6 +930,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1120,6 +1126,17 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + [[package]] name = "heck" version = "0.3.3" @@ -1513,11 +1530,11 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" -version = "0.12.3" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" +checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.2", ] [[package]] diff --git a/rust/cubesql/Cargo.lock b/rust/cubesql/Cargo.lock index ed5cf710e5d61..b31652274001e 100644 --- a/rust/cubesql/Cargo.lock +++ b/rust/cubesql/Cargo.lock @@ -1058,6 +1058,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1261,6 +1267,17 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + [[package]] name = "heck" version = "0.3.3" @@ -1667,11 +1684,11 @@ checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "lru" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2994eeba8ed550fd9b47a0b38f0242bc3344e496483c6180b69139cc2fa5d1d7" +checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" dependencies = [ - "hashbrown 0.14.3", + "hashbrown 0.15.2", ] [[package]] diff --git a/rust/cubesql/cubesql/Cargo.toml b/rust/cubesql/cubesql/Cargo.toml index 09fd88de56436..cdb2cb7ea23e2 100644 --- a/rust/cubesql/cubesql/Cargo.toml +++ b/rust/cubesql/cubesql/Cargo.toml @@ -10,7 +10,10 @@ homepage = "https://cube.dev" [dependencies] arc-swap = "1" -datafusion = { git = 'https://github.com/cube-js/arrow-datafusion.git', rev = "dcf3e4aa26fd112043ef26fa4a78db5dbd443c86", default-features = false, features = ["regex_expressions", "unicode_expressions"] } +datafusion = { git = 'https://github.com/cube-js/arrow-datafusion.git', rev = "dcf3e4aa26fd112043ef26fa4a78db5dbd443c86", default-features = false, features = [ + "regex_expressions", + "unicode_expressions", +] } thiserror = "2" cubeclient = { path = "../cubeclient" } pg-srv = { path = "../pg-srv" } @@ -25,7 +28,7 @@ futures = "0.3.23" rand = "0.8.3" hashbrown = "0.14.3" log = "0.4.21" -rust_decimal = { version = "1.25", features = ["c-repr", "db-postgres"]} +rust_decimal = { version = "1.25", features = ["c-repr", "db-postgres"] } postgres-types = "0.2.3" # Locked, because starting from 1.15 this crate switch from chrono to time # which panic with Could not determine the UTC offset on this system. @@ -38,10 +41,12 @@ uuid = { version = "1", features = ["serde", "v4"] } bincode = "1.3.1" chrono = "0.4.31" chrono-tz = "0.6" -tokio-util = { version = "0.7", features=["compat"] } +tokio-util = { version = "0.7", features = ["compat"] } comfy-table = "7.1.0" bitflags = "1.3.2" -egg = { rev = "952f8c2a1033e5da097d23c523b0d8e392eb532b", git = "https://github.com/cube-js/egg.git", features = ["serde-1"] } +egg = { rev = "952f8c2a1033e5da097d23c523b0d8e392eb532b", git = "https://github.com/cube-js/egg.git", features = [ + "serde-1", +] } paste = "1.0.6" tracing = { version = "0.1.40", features = ["async-await"] } async-stream = "0.3.3" @@ -50,7 +55,7 @@ futures-util = "0.3.23" sha1_smol = "1.0.0" tera = { version = "1", default-features = false } minijinja = { version = "1", features = ["json", "loader"] } -lru = "0.12.1" +lru = "0.13.0" sha2 = "0.10.8" bigdecimal = "0.4.2" indexmap = "1.9.3" @@ -60,7 +65,10 @@ indexmap = "1.9.3" pretty_assertions = "1.0.0" insta = "1.12" portpicker = "0.1.1" -tokio-postgres = { version = "0.7.7", features = ["with-chrono-0_4", "runtime"] } +tokio-postgres = { version = "0.7.7", features = [ + "with-chrono-0_4", + "runtime", +] } rust_decimal = { version = "1.23", features = ["db-tokio-postgres"] } pg_interval = "0.4.1" criterion = { version = "0.4.0", features = ["html_reports"] } diff --git a/rust/cubesqlplanner/Cargo.lock b/rust/cubesqlplanner/Cargo.lock index e983f7b7d4135..c57ded0ad36e7 100644 --- a/rust/cubesqlplanner/Cargo.lock +++ b/rust/cubesqlplanner/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "Inflector" @@ -984,6 +984,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1174,6 +1180,17 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + [[package]] name = "heck" version = "0.3.3" @@ -1567,11 +1584,11 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" -version = "0.12.3" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" +checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.2", ] [[package]] diff --git a/rust/cubetranspilers/Cargo.lock b/rust/cubetranspilers/Cargo.lock index 96877ea25973c..5b40feaf455e7 100644 --- a/rust/cubetranspilers/Cargo.lock +++ b/rust/cubetranspilers/Cargo.lock @@ -240,6 +240,18 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "console" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "windows-sys", +] + [[package]] name = "cpufeatures" version = "0.2.17" @@ -265,6 +277,7 @@ version = "0.1.0" dependencies = [ "anyhow", "indexmap", + "insta", "regex", "serde", "serde_json", @@ -394,6 +407,12 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "equivalent" version = "1.0.1" @@ -685,6 +704,19 @@ dependencies = [ "hashbrown 0.15.2", ] +[[package]] +name = "insta" +version = "1.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71c1b125e30d93896b365e156c33dadfffab45ee8400afcbba4752f59de08a86" +dependencies = [ + "console", + "linked-hash-map", + "once_cell", + "pin-project", + "similar", +] + [[package]] name = "is-macro" version = "0.3.7" @@ -715,6 +747,12 @@ version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -953,6 +991,26 @@ dependencies = [ "siphasher 1.0.1", ] +[[package]] +name = "pin-project" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -1305,6 +1363,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" +[[package]] +name = "similar" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" + [[package]] name = "siphasher" version = "0.3.11" diff --git a/rust/cubetranspilers/Cargo.toml b/rust/cubetranspilers/Cargo.toml index 10355a38201f4..f153ebbea2ead 100644 --- a/rust/cubetranspilers/Cargo.toml +++ b/rust/cubetranspilers/Cargo.toml @@ -12,3 +12,6 @@ swc_core = { version = "13.3.*", features = ["ecma_plugin_transform"] } swc_ecma_parser = "8.0.1" swc_ecma_codegen = "6.1.0" anyhow = "1.0.95" + +[dev-dependencies] +insta = "1" diff --git a/rust/cubetranspilers/tests/common/mod.rs b/rust/cubetranspilers/tests/common/mod.rs index 097812a17b55f..42f2897aee0b2 100644 --- a/rust/cubetranspilers/tests/common/mod.rs +++ b/rust/cubetranspilers/tests/common/mod.rs @@ -16,6 +16,7 @@ impl Emitter for TestEmitter { } } +#[allow(dead_code)] pub fn generate_code(program: &Program, cm: &Lrc) -> String { let mut buf = vec![]; { diff --git a/rust/cubetranspilers/tests/cube_prop_ctx_test.rs b/rust/cubetranspilers/tests/cube_prop_ctx_test.rs index 4fe0b3d992905..1203fd54c94e1 100644 --- a/rust/cubetranspilers/tests/cube_prop_ctx_test.rs +++ b/rust/cubetranspilers/tests/cube_prop_ctx_test.rs @@ -9,6 +9,7 @@ use std::sync::{Arc, LazyLock, Mutex}; use common::{generate_code, TestEmitter}; use cubetranspilers::cube_prop_ctx_transpiler::*; +use insta::assert_snapshot; use swc_core::ecma::ast::{EsVersion, Program}; use swc_core::{ common::{ @@ -206,11 +207,8 @@ fn test_simple_transform() { let output_code = generate_code(&program, &cm); - assert!( - output_code.contains("sql: ()=>`"), - "Output code should contain arrow function for *.sql, got:\n{}", - output_code - ); + assert_snapshot!("simple_transform", output_code); + let diags = diagnostics.lock().unwrap(); assert!( diags.is_empty(), @@ -512,61 +510,8 @@ fn test_complicated_transform_1st_stage() { let output_code = generate_code(&program, &cm); - assert!( - output_code.contains("sql: ()=>`"), - "Output code should contain arrow function for *.sql, got:\n{}", - output_code - ); - assert!( - output_code.contains("sql: (FILTER_GROUP, FILTER_PARAMS)=>`"), - "Output code should contain `sql` arrow function with (FILTER_GROUP, FILTER_PARAMS), got:\n{}", - output_code - ); - assert!( - output_code.contains("measures: ()=>["), - "Output code should contain arrow function for preAggregations.measures, got:\n{}", - output_code - ); - assert!( - output_code.contains("dimensions: ()=>["), - "Output code should contain arrow function for preAggregations.dimensions, got:\n{}", - output_code - ); - assert!( - output_code.contains("timeDimension: ()=>"), - "Output code should contain arrow function for preAggregations.timeDimension, got:\n{}", - output_code - ); - assert!( - output_code.contains("drillMembers: ()=>["), - "Output code should contain arrow function for measure.drillMembers, got:\n{}", - output_code - ); - assert!( - output_code.contains("sql: (CUBE)=>`${CUBE}.status = 'shipped'`"), - "Output code should contain arrow function with CUBE as parameter for *.sql, got:\n{}", - output_code - ); - assert!( - output_code.contains("sql: (SQL_UTILS)=>SQL_UTILS.convertTz(`completed_at`)"), - "Output code should contain arrow function with SQL_UTILS as parameter for *.sql, got:\n{}", - output_code - ); - assert!( - output_code.contains("if: ()=>`true`"), - "Output code should contain arrow function for acl if condition, got:\n{}", - output_code - ); - assert!( - output_code.contains("member: (CUBE)=>`${CUBE}.id`"), - "Output code should contain arrow function for acl rowlevel filters member, got:\n{}", - output_code - ); - assert!( - output_code.contains("values: ()=>["), - "Output code should contain arrow function for acl rowlevel filters values, got:\n{}", - output_code - ); + assert_snapshot!("complicated_transform_1st_stage", output_code); + let diags = diagnostics.lock().unwrap(); assert!( diags.is_empty(), @@ -877,67 +822,8 @@ fn test_complicated_transform_2nd_stage() { let output_code = generate_code(&program, &cm); - assert!( - output_code.contains("sql: ()=>`"), - "Output code should contain arrow function for *.sql, got:\n{}", - output_code - ); - assert!( - output_code - .contains("sql: (zero_sum)=>`CASE WHEN ${zero_sum} = 0 THEN 1 ELSE 1/${zero_sum} end`"), - "Output code should contain arrow function for sql() with local member as param, got:\n{}", - output_code - ); - assert!( - output_code.contains("sql: (FILTER_GROUP, FILTER_PARAMS)=>`"), - "Output code should contain `sql` arrow function with (FILTER_GROUP, FILTER_PARAMS), got:\n{}", - output_code - ); - assert!( - output_code.contains("measures: (count, rolling_count_month)=>["), - "Output code should contain arrow function for preAggregations.measures, got:\n{}", - output_code - ); - assert!( - output_code.contains("dimensions: (status)=>["), - "Output code should contain arrow function for preAggregations.dimensions, got:\n{}", - output_code - ); - assert!( - output_code.contains("timeDimension: (createdAt)=>createdAt"), - "Output code should contain arrow function for preAggregations.timeDimension, got:\n{}", - output_code - ); - assert!( - output_code.contains("drillMembers: (id, createdAt)=>["), - "Output code should contain arrow function for measure.drillMembers, got:\n{}", - output_code - ); - assert!( - output_code.contains("sql: (CUBE)=>`${CUBE}.status = 'shipped'`"), - "Output code should contain arrow function with CUBE as parameter for *.sql, got:\n{}", - output_code - ); - assert!( - output_code.contains("sql: (SQL_UTILS)=>SQL_UTILS.convertTz(`completed_at`)"), - "Output code should contain arrow function with SQL_UTILS as parameter for *.sql, got:\n{}", - output_code - ); - assert!( - output_code.contains("if: ()=>`true`"), - "Output code should contain arrow function for acl if condition, got:\n{}", - output_code - ); - assert!( - output_code.contains("member: (CUBE)=>`${CUBE}.id`"), - "Output code should contain arrow function for acl rowlevel filters member, got:\n{}", - output_code - ); - assert!( - output_code.contains("values: ()=>["), - "Output code should contain arrow function for acl rowlevel filters values, got:\n{}", - output_code - ); + assert_snapshot!("complicated_transform_2nd_stage", output_code); + let diags = diagnostics.lock().unwrap(); assert!( diags.is_empty(), diff --git a/rust/cubetranspilers/tests/import_export_test.rs b/rust/cubetranspilers/tests/import_export_test.rs index c936dc4a4ce63..7e4389ab8d1eb 100644 --- a/rust/cubetranspilers/tests/import_export_test.rs +++ b/rust/cubetranspilers/tests/import_export_test.rs @@ -8,6 +8,7 @@ use std::sync::{Arc, Mutex}; use common::{generate_code, TestEmitter}; use cubetranspilers::import_export_transpiler::*; +use insta::assert_snapshot; use swc_core::ecma::ast::{EsVersion, Program}; use swc_core::{ common::{ @@ -56,16 +57,8 @@ fn test_export_default_declaration() { let output_code = generate_code(&program, &cm); - assert!( - output_code.contains("setExport(function()"), - "Output code should contain setExport call, got:\n{}", - output_code - ); - assert!( - output_code.contains("console.log('exported function')"), - "Output code should contain func body, got:\n{}", - output_code - ); + assert_snapshot!("export_default_declaration", output_code); + let diags = diagnostics.lock().unwrap(); assert!( diags.is_empty(), @@ -112,11 +105,8 @@ fn test_export_default_expression() { let output_code = generate_code(&program, &cm); - assert!( - output_code.contains("setExport(myVar)"), - "Output code should contain setExport call, got:\n{}", - output_code - ); + assert_snapshot!("export_default_expression", output_code); + let diags = diagnostics.lock().unwrap(); assert!( diags.is_empty(), @@ -163,26 +153,7 @@ fn test_export_const_expression() { let output_code = generate_code(&program, &cm); - assert!( - output_code.contains("const sql = (input)=>intput + 5;"), - "Output code should contain original single const definition, got:\n{}", - output_code - ); - assert!( - output_code.contains("addExport({\n sql: sql\n})"), - "Output code should contain addExport call, got:\n{}", - output_code - ); - assert!( - output_code.contains("const a1 = 5, a2 = ()=>111, a3 = (inputA3)=>inputA3 + \"Done\""), - "Output code should contain original multiple const definitions, got:\n{}", - output_code - ); - assert!( - output_code.contains("addExport({\n a1: a1,\n a2: a2,\n a3: a3\n})"), - "Output code should contain addExport call, got:\n{}", - output_code - ); + assert_snapshot!("export_const_expression", output_code); let diags = diagnostics.lock().unwrap(); assert!( @@ -231,26 +202,9 @@ fn test_import_named_default() { program.visit_mut_with(&mut visitor); let output_code = generate_code(&program, &cm); - assert!( - output_code.contains("const"), - "Output code should contain a const declaration, got:\n{}", - output_code - ); - assert!( - output_code.contains("def = require(\"module\")"), - "Output code should contain 'def', got:\n{}", - output_code - ); - assert!( - output_code.contains("foo = require(\"module\").foo"), - "Output code should contain 'foo', got:\n{}", - output_code - ); - assert!( - output_code.contains("baz = require(\"module\").bar"), - "Output code should contain 'baz', got:\n{}", - output_code - ); + + assert_snapshot!("import_named_default", output_code); + let diags = diagnostics.lock().unwrap(); assert!( diags.is_empty(), @@ -347,21 +301,9 @@ fn test_export_named() { program.visit_mut_with(&mut visitor); let output_code = generate_code(&program, &cm); - assert!( - output_code.contains("addExport"), - "Output code should contain addExport call, got:\n{}", - output_code - ); - assert!( - output_code.contains("foo: foo"), - "Output code should contain 'foo', got:\n{}", - output_code - ); - assert!( - output_code.contains("baz: bar"), - "Output code should contain 'baz', got:\n{}", - output_code - ); + + assert_snapshot!("export_named", output_code); + let diags = diagnostics.lock().unwrap(); assert!( diags.is_empty(), @@ -407,16 +349,9 @@ fn test_export_default_ts_interface() { let output_code = generate_code(&program, &cm); // When exporting a TS interface, setExport is called with null as a fallback. - assert!( - output_code.contains("setExport"), - "Output code should contain setExport call, got:\n{}", - output_code - ); - assert!( - output_code.contains("null"), - "Output code should contain 'null' fallback, got:\n{}", - output_code - ); + + assert_snapshot!("export_default_ts_interface", output_code); + let diags = diagnostics.lock().unwrap(); let errors: Vec<_> = diags .iter() diff --git a/rust/cubetranspilers/tests/snapshots/cube_prop_ctx_test__complicated_transform_1st_stage.snap b/rust/cubetranspilers/tests/snapshots/cube_prop_ctx_test__complicated_transform_1st_stage.snap new file mode 100644 index 0000000000000..4fc109996c6db --- /dev/null +++ b/rust/cubetranspilers/tests/snapshots/cube_prop_ctx_test__complicated_transform_1st_stage.snap @@ -0,0 +1,150 @@ +--- +source: tests/cube_prop_ctx_test.rs +expression: output_code +--- +cube(`Orders`, { + sql: (FILTER_GROUP, FILTER_PARAMS)=>` + SELECT * + FROM public.orders + WHERE ${FILTER_GROUP(FILTER_PARAMS.Orders.status.filter('status'))} + `, + preAggregations: { + main_test_range: { + measures: ()=>[ + count, + rolling_count_month + ], + dimensions: ()=>[ + status + ], + timeDimension: ()=>createdAt, + granularity: `day`, + partitionGranularity: `month`, + refreshKey: { + every: `1 day` + }, + buildRangeStart: { + sql: ()=>`SELECT '2021-01-01'::DATE` + }, + build_range_end: { + sql: ()=>`SELECT '2021-12-31'::DATE` + } + } + }, + measures: { + division_error_test: { + sql: ()=>`CASE WHEN ${zero_sum} = 0 THEN 1 ELSE 1/${zero_sum} end`, + type: `sum` + }, + zero_sum: { + sql: ()=>`id`, + type: `sum` + }, + rolling_count_month: { + sql: ()=>`id`, + type: `count`, + rollingWindow: { + trailing: `1 month` + } + }, + count: { + type: `count`, + drillMembers: ()=>[ + id, + createdAt + ], + meta: { + test: 1 + } + }, + countShipped: { + type: `count`, + filters: [ + { + sql: (CUBE)=>`${CUBE}.status = 'shipped'` + } + ], + drillMembers: ()=>[ + id, + createdAt + ] + }, + maxDate: { + type: `max`, + sql: (CUBE)=>`${CUBE.completedAt}` + } + }, + dimensions: { + id: { + sql: ()=>`id`, + type: `number`, + primaryKey: true, + shown: true + }, + status: { + sql: ()=>`status`, + type: `string` + }, + createdAt: { + sql: ()=>`created_at`, + type: `time` + }, + completedAt: { + sql: ()=>`completed_at`, + type: `time` + }, + test_boolean: { + sql: ()=>`CASE WHEN status = 'completed' THEN TRUE ELSE FALSE END`, + type: `boolean` + }, + localTime: { + type: 'time', + sql: (SQL_UTILS)=>SQL_UTILS.convertTz(`completed_at`) + }, + localYear: { + type: 'number', + sql: (SQL_UTILS)=>`EXTRACT(year from ${SQL_UTILS.convertTz('completed_at')})` + } + }, + segments: { + status_completed: { + sql: (CUBE)=>`${CUBE}.status = 'completed'` + } + }, + accessPolicy: [ + { + role: "*", + rowLevel: { + allowAll: true + } + }, + { + role: 'admin', + conditions: [ + { + if: ()=>`true` + } + ], + rowLevel: { + filters: [ + { + member: (CUBE)=>`${CUBE}.id`, + operator: 'equals', + values: ()=>[ + `1`, + `2`, + `3` + ] + } + ] + }, + memberLevel: { + includes: `*`, + excludes: [ + `localTime`, + `completedAt` + ] + } + } + ] +}); diff --git a/rust/cubetranspilers/tests/snapshots/cube_prop_ctx_test__complicated_transform_2nd_stage.snap b/rust/cubetranspilers/tests/snapshots/cube_prop_ctx_test__complicated_transform_2nd_stage.snap new file mode 100644 index 0000000000000..82c5fa1e29911 --- /dev/null +++ b/rust/cubetranspilers/tests/snapshots/cube_prop_ctx_test__complicated_transform_2nd_stage.snap @@ -0,0 +1,150 @@ +--- +source: tests/cube_prop_ctx_test.rs +expression: output_code +--- +cube(`Orders`, { + sql: (FILTER_GROUP, FILTER_PARAMS)=>` + SELECT * + FROM public.orders + WHERE ${FILTER_GROUP(FILTER_PARAMS.Orders.status.filter('status'))} + `, + preAggregations: { + main_test_range: { + measures: (count, rolling_count_month)=>[ + count, + rolling_count_month + ], + dimensions: (status)=>[ + status + ], + timeDimension: (createdAt)=>createdAt, + granularity: `day`, + partitionGranularity: `month`, + refreshKey: { + every: `1 day` + }, + buildRangeStart: { + sql: ()=>`SELECT '2021-01-01'::DATE` + }, + build_range_end: { + sql: ()=>`SELECT '2021-12-31'::DATE` + } + } + }, + measures: { + division_error_test: { + sql: (zero_sum)=>`CASE WHEN ${zero_sum} = 0 THEN 1 ELSE 1/${zero_sum} end`, + type: `sum` + }, + zero_sum: { + sql: ()=>`id`, + type: `sum` + }, + rolling_count_month: { + sql: ()=>`id`, + type: `count`, + rollingWindow: { + trailing: `1 month` + } + }, + count: { + type: `count`, + drillMembers: (id, createdAt)=>[ + id, + createdAt + ], + meta: { + test: 1 + } + }, + countShipped: { + type: `count`, + filters: [ + { + sql: (CUBE)=>`${CUBE}.status = 'shipped'` + } + ], + drillMembers: (id, createdAt)=>[ + id, + createdAt + ] + }, + maxDate: { + type: `max`, + sql: (CUBE)=>`${CUBE.completedAt}` + } + }, + dimensions: { + id: { + sql: ()=>`id`, + type: `number`, + primaryKey: true, + shown: true + }, + status: { + sql: ()=>`status`, + type: `string` + }, + createdAt: { + sql: ()=>`created_at`, + type: `time` + }, + completedAt: { + sql: ()=>`completed_at`, + type: `time` + }, + test_boolean: { + sql: ()=>`CASE WHEN status = 'completed' THEN TRUE ELSE FALSE END`, + type: `boolean` + }, + localTime: { + type: 'time', + sql: (SQL_UTILS)=>SQL_UTILS.convertTz(`completed_at`) + }, + localYear: { + type: 'number', + sql: (SQL_UTILS)=>`EXTRACT(year from ${SQL_UTILS.convertTz('completed_at')})` + } + }, + segments: { + status_completed: { + sql: (CUBE)=>`${CUBE}.status = 'completed'` + } + }, + accessPolicy: [ + { + role: "*", + rowLevel: { + allowAll: true + } + }, + { + role: 'admin', + conditions: [ + { + if: ()=>`true` + } + ], + rowLevel: { + filters: [ + { + member: (CUBE)=>`${CUBE}.id`, + operator: 'equals', + values: ()=>[ + `1`, + `2`, + `3` + ] + } + ] + }, + memberLevel: { + includes: `*`, + excludes: [ + `localTime`, + `completedAt` + ] + } + } + ] +}); diff --git a/rust/cubetranspilers/tests/snapshots/cube_prop_ctx_test__simple_transform.snap b/rust/cubetranspilers/tests/snapshots/cube_prop_ctx_test__simple_transform.snap new file mode 100644 index 0000000000000..291d619e13990 --- /dev/null +++ b/rust/cubetranspilers/tests/snapshots/cube_prop_ctx_test__simple_transform.snap @@ -0,0 +1,40 @@ +--- +source: tests/cube_prop_ctx_test.rs +expression: output_code +--- +cube(`cube1`, { + sql: ()=>`SELECT * FROM table`, + dimensions: { + id: { + sql: ()=>`id`, + type: `number`, + primary_key: true + }, + created_at: { + sql: ()=>`created_at`, + type: `time` + }, + dim1Number: { + sql: ()=>`dim1Number`, + type: `number` + }, + dim2Number: { + sql: ()=>`dim2Number`, + type: `number` + } + }, + measures: { + count: { + type: `count`, + sql: ()=>`id` + }, + measureDim1: { + sql: ()=>`dim1Number`, + type: `max` + }, + measureDim2: { + sql: ()=>`dim1Number`, + type: `min` + } + } +}); diff --git a/rust/cubetranspilers/tests/snapshots/import_export_test__export_const_expression.snap b/rust/cubetranspilers/tests/snapshots/import_export_test__export_const_expression.snap new file mode 100644 index 0000000000000..b4ae3ffe5a765 --- /dev/null +++ b/rust/cubetranspilers/tests/snapshots/import_export_test__export_const_expression.snap @@ -0,0 +1,14 @@ +--- +source: tests/import_export_test.rs +expression: output_code +--- +const sql = (input)=>intput + 5; +addExport({ + sql: sql +}); +const a1 = 5, a2 = ()=>111, a3 = (inputA3)=>inputA3 + "Done"; +addExport({ + a1: a1, + a2: a2, + a3: a3 +}); diff --git a/rust/cubetranspilers/tests/snapshots/import_export_test__export_default_declaration.snap b/rust/cubetranspilers/tests/snapshots/import_export_test__export_default_declaration.snap new file mode 100644 index 0000000000000..2f4ca6461c826 --- /dev/null +++ b/rust/cubetranspilers/tests/snapshots/import_export_test__export_default_declaration.snap @@ -0,0 +1,8 @@ +--- +source: tests/import_export_test.rs +expression: output_code +--- +setExport(function() { + console.log('exported function'); +}); +; diff --git a/rust/cubetranspilers/tests/snapshots/import_export_test__export_default_expression.snap b/rust/cubetranspilers/tests/snapshots/import_export_test__export_default_expression.snap new file mode 100644 index 0000000000000..68db36c47cbad --- /dev/null +++ b/rust/cubetranspilers/tests/snapshots/import_export_test__export_default_expression.snap @@ -0,0 +1,6 @@ +--- +source: tests/import_export_test.rs +expression: output_code +--- +let myVar = 5; +setExport(myVar); diff --git a/rust/cubetranspilers/tests/snapshots/import_export_test__export_default_ts_interface.snap b/rust/cubetranspilers/tests/snapshots/import_export_test__export_default_ts_interface.snap new file mode 100644 index 0000000000000..a1467b7ed3ada --- /dev/null +++ b/rust/cubetranspilers/tests/snapshots/import_export_test__export_default_ts_interface.snap @@ -0,0 +1,5 @@ +--- +source: tests/import_export_test.rs +expression: output_code +--- +setExport(null); diff --git a/rust/cubetranspilers/tests/snapshots/import_export_test__export_named.snap b/rust/cubetranspilers/tests/snapshots/import_export_test__export_named.snap new file mode 100644 index 0000000000000..42d00a232f4b4 --- /dev/null +++ b/rust/cubetranspilers/tests/snapshots/import_export_test__export_named.snap @@ -0,0 +1,8 @@ +--- +source: tests/import_export_test.rs +expression: output_code +--- +addExport({ + foo: foo, + baz: bar +}); diff --git a/rust/cubetranspilers/tests/snapshots/import_export_test__import_named_default.snap b/rust/cubetranspilers/tests/snapshots/import_export_test__import_named_default.snap new file mode 100644 index 0000000000000..dd733cd77069d --- /dev/null +++ b/rust/cubetranspilers/tests/snapshots/import_export_test__import_named_default.snap @@ -0,0 +1,5 @@ +--- +source: tests/import_export_test.rs +expression: output_code +--- +const def = require("module"), foo = require("module").foo, baz = require("module").bar; diff --git a/yarn.lock b/yarn.lock index 6cb127ff844b5..4f0ed1970f745 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5306,18 +5306,6 @@ uuid "9.0.0" winston "3.8.2" -"@cubejs-backend/linter@1.2.4": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@cubejs-backend/linter/-/linter-1.2.4.tgz#b38551ada107d94a3a12bb3f82e582ef6e184096" - integrity sha512-V150xWxBgRptCO4GAdZTuCwY7+FoxlJ1rBYM379LLEX8sLFC4NG0AN8S3vy0YSaUaC3P07ne3CrEILIJLt0JAg== - dependencies: - "@typescript-eslint/eslint-plugin" "^6.12.0" - "@typescript-eslint/parser" "^6.12.0" - eslint "^8.54.0" - eslint-config-airbnb-base "^14.2.1" - eslint-plugin-import "^2.22.1" - eslint-plugin-node "^9.2.0" - "@cubejs-backend/shared@0.33.20": version "0.33.20" resolved "https://registry.yarnpkg.com/@cubejs-backend/shared/-/shared-0.33.20.tgz#3d9fa60041599cca9fe4c04df05daa4b8ab8675f" @@ -5338,26 +5326,6 @@ throttle-debounce "^3.0.1" uuid "^8.3.2" -"@cubejs-backend/shared@1.2.4": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@cubejs-backend/shared/-/shared-1.2.4.tgz#dcdc8a0537cfe9df97f3502bea983204634fbdfd" - integrity sha512-C/BA0ogCRhhtYwYyQkhXTTKLIUtJ1020aybbQ9tbKtlkrd3ab+a166jmtlAD5kDeoIhB08DgMTQjaQGDYh3gBg== - dependencies: - "@oclif/color" "^0.1.2" - bytes "^3.1.0" - cli-progress "^3.9.0" - cross-spawn "^7.0.3" - decompress "^4.2.1" - env-var "^6.3.0" - fs-extra "^9.1.0" - http-proxy-agent "^4.0.1" - moment-range "^4.0.1" - moment-timezone "^0.5.46" - node-fetch "^2.6.1" - shelljs "^0.8.5" - throttle-debounce "^3.0.1" - uuid "^8.3.2" - "@cubejs-infra/post-installer@^0.0.7": version "0.0.7" resolved "https://registry.yarnpkg.com/@cubejs-infra/post-installer/-/post-installer-0.0.7.tgz#a28d2d03e5b7b69a64020d75194a7078cf911d2d"