/
functions.rs
104 lines (84 loc) 路 3.03 KB
/
functions.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
use crate::error::ApiError;
use napi::{bindgen_prelude::*, JsUnknown};
use napi_derive::napi;
use query_core::{schema::QuerySchemaRef, schema_builder};
use request_handlers::dmmf;
use std::{
collections::{BTreeMap, HashMap},
sync::Arc,
};
#[derive(serde::Serialize, Clone, Copy)]
#[napi(object)]
pub struct Version {
pub commit: &'static str,
pub version: &'static str,
}
#[napi]
pub fn version() -> Version {
Version {
commit: env!("GIT_HASH"),
version: env!("CARGO_PKG_VERSION"),
}
}
#[napi]
pub fn dmmf(datamodel_string: String) -> napi::Result<String> {
let mut schema = psl::validate(datamodel_string.into());
schema
.diagnostics
.to_result()
.map_err(|errors| ApiError::conversion(errors, schema.db.source()))?;
let datasource = schema.configuration.datasources.first();
let datamodel = psl::lift(&schema);
let connector = datasource
.map(|ds| ds.active_connector)
.unwrap_or(&psl::datamodel_connector::EmptyDatamodelConnector);
let referential_integrity = datasource.map(|ds| ds.referential_integrity()).unwrap_or_default();
let internal_data_model = prisma_models::convert(&schema, "".into());
let query_schema: QuerySchemaRef = Arc::new(schema_builder::build(
internal_data_model,
true,
connector,
schema.configuration.preview_features().iter().collect(),
referential_integrity,
));
let dmmf = dmmf::render_dmmf(&datamodel, query_schema);
Ok(serde_json::to_string(&dmmf)?)
}
#[napi]
pub fn get_config(js_env: Env, options: JsUnknown) -> napi::Result<JsUnknown> {
#[derive(serde::Deserialize)]
#[serde(rename_all = "camelCase")]
struct GetConfigOptions {
datamodel: String,
#[serde(default)]
ignore_env_var_errors: bool,
#[serde(default)]
datasource_overrides: BTreeMap<String, String>,
#[serde(default)]
env: HashMap<String, String>,
}
let options: GetConfigOptions = js_env.from_js_value(options)?;
let GetConfigOptions {
datamodel,
ignore_env_var_errors,
datasource_overrides,
env,
} = options;
let overrides: Vec<(_, _)> = datasource_overrides.into_iter().collect();
let mut config = psl::parse_configuration(&datamodel).map_err(|errors| ApiError::conversion(errors, &datamodel))?;
if !ignore_env_var_errors {
config
.resolve_datasource_urls_from_env(&overrides, |key| env.get(key).map(ToString::to_string))
.map_err(|errors| ApiError::conversion(errors, &datamodel))?;
}
let serialized = psl::mcf::config_to_mcf_json_value(&config);
js_env.to_js_value(&serialized)
}
#[napi]
pub fn debug_panic(panic_message: Option<String>) -> napi::Result<()> {
let user_facing = user_facing_errors::Error::from_panic_payload(Box::new(
panic_message.unwrap_or_else(|| "query-engine-node-api debug panic".to_string()),
));
let message = serde_json::to_string(&user_facing).unwrap();
Err(napi::Error::from_reason(message))
}