diff --git a/Cargo.lock b/Cargo.lock index 5e348c38e3..b9764ba93e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2504,7 +2504,6 @@ dependencies = [ "crossbeam-channel", "datamodel-renderer", "dialoguer", - "dprint-plugin-typescript", "flate2", "globset", "ignore", @@ -2523,13 +2522,10 @@ dependencies = [ "serde_json", "serde_yaml", "swc", - "swc_common", - "swc_ecma_ast 0.94.14", - "swc_ecma_transforms", - "swc_ecmascript", "tar", "tiny_http", "tokio", + "typescript", "walkdir", ] @@ -6559,6 +6555,20 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +[[package]] +name = "typescript" +version = "0.0.3-dev.0" +dependencies = [ + "anyhow", + "dprint-plugin-typescript", + "lazy_static", + "string_cache", + "swc_common", + "swc_ecma_ast 0.94.14", + "swc_ecma_transforms", + "swc_ecmascript", +] + [[package]] name = "ucd-trie" version = "0.1.5" @@ -7066,8 +7076,10 @@ dependencies = [ "anyhow", "clap", "common", + "project-root", "schemars", "serde_json", + "typescript", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 3c7d627c62..a61e897727 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,11 @@ [workspace] -members = ["typegate/native", "meta-cli", "libs/common", "libs/xtask"] +members = [ + "typegate/native", + "meta-cli", + "libs/common", + "libs/typescript", + "libs/xtask", +] [patch.crates-io] # https://github.com/prisma/quaint/issues/392 diff --git a/libs/common/src/typegraph.rs b/libs/common/src/typegraph.rs index 4653fcf11d..963b118140 100644 --- a/libs/common/src/typegraph.rs +++ b/libs/common/src/typegraph.rs @@ -12,10 +12,8 @@ use std::collections::HashMap; #[derive(Serialize, Deserialize, Debug)] pub struct Typegraph { pub types: Vec, - #[serde(default)] pub materializers: Vec, pub runtimes: Vec, - #[serde(default)] pub policies: Vec, pub meta: TypeMeta, } @@ -26,15 +24,26 @@ pub struct Cors { pub allow_origin: Vec, pub allow_headers: Vec, pub expose_headers: Vec, + #[serde(default)] + pub allow_methods: Vec, pub allow_credentials: bool, pub max_age: Option, } +#[cfg_attr(feature = "codegen", derive(JsonSchema))] +#[derive(Serialize, Deserialize, Debug)] +#[serde(rename_all = "lowercase")] +pub enum AuthProtocol { + OAuth2, + Jwk, + Basic, +} + #[cfg_attr(feature = "codegen", derive(JsonSchema))] #[derive(Serialize, Deserialize, Debug)] pub struct Auth { pub name: String, - pub protocol: String, + pub protocol: AuthProtocol, pub auth_data: HashMap, } @@ -69,10 +78,10 @@ pub struct TypeNodeBase { pub description: Option, #[serde(default)] pub injection: Option, - #[serde(default)] - pub inject: Option, + #[serde(default, skip_serializing_if = "serde_json::Value::is_null")] + pub inject: Value, #[serde(default, rename = "enum")] - pub enum_: Option>, + pub enum_: Option>, #[serde(default)] pub config: HashMap, } diff --git a/libs/typescript/Cargo.toml b/libs/typescript/Cargo.toml new file mode 100644 index 0000000000..f99ef67837 --- /dev/null +++ b/libs/typescript/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "typescript" +version = "0.0.3-dev.0" +edition = "2021" + +[dependencies] +anyhow = "1.0.68" +swc_common = { version = "0.29.10", features = ["tty-emitter"] } +swc_ecma_ast = "0.94.14" +swc_ecmascript = { version = "0.205.47", features = [ + "visit", + "transforms", + "typescript-parser", + "parser", + "codegen", +] } +swc_ecma_transforms = { version = "0.198.26", features = ["typescript"] } +string_cache = "0.8.4" +dprint-plugin-typescript = "0.80.2" +lazy_static = "1.4.0" diff --git a/libs/typescript/src/lib.rs b/libs/typescript/src/lib.rs new file mode 100644 index 0000000000..7926cf2ab9 --- /dev/null +++ b/libs/typescript/src/lib.rs @@ -0,0 +1,32 @@ +// Copyright Metatype OÜ under the Elastic License 2.0 (ELv2). See LICENSE.md for usage. + +pub mod parser; + +pub use dprint_plugin_typescript as dprint_plugin; +pub use string_cache; +pub use swc_common; +pub use swc_ecma_ast as ast; +pub use swc_ecmascript::*; + +use anyhow::Result; +use dprint_plugin::configuration::Configuration; +use lazy_static::lazy_static; +use std::path::Path; + +lazy_static! { + static ref TS_FORMAT_CONFIG: Configuration = { + use dprint_plugin_typescript::configuration::*; + ConfigurationBuilder::new() + .line_width(80) + .prefer_hanging(true) + .prefer_single_line(false) + .next_control_flow_position(NextControlFlowPosition::SameLine) + .union_and_intersection_type_prefer_hanging(false) + .union_and_intersection_type_prefer_single_line(false) + .build() + }; +} + +pub fn format_text>(path: P, source: &str) -> Result { + Ok(dprint_plugin::format_text(path.as_ref(), source, &TS_FORMAT_CONFIG)?.unwrap()) +} diff --git a/meta-cli/src/ts/parser.rs b/libs/typescript/src/parser.rs similarity index 99% rename from meta-cli/src/ts/parser.rs rename to libs/typescript/src/parser.rs index 74d8c100cc..2dafec4c67 100644 --- a/meta-cli/src/ts/parser.rs +++ b/libs/typescript/src/parser.rs @@ -226,7 +226,7 @@ where /// Parses a string as a TypeScript module and /// generates its [`Module`] and [`SourceMap`]. -fn parse_module_source(source: String) -> Result<(Module, Lrc)> { +pub fn parse_module_source(source: String) -> Result<(Module, Lrc)> { let cm: Lrc = Default::default(); let handler = Handler::with_tty_emitter(ColorConfig::Auto, true, false, Some(cm.clone())); diff --git a/libs/xtask/Cargo.toml b/libs/xtask/Cargo.toml index 7d96c81fcc..3f233413ea 100644 --- a/libs/xtask/Cargo.toml +++ b/libs/xtask/Cargo.toml @@ -3,11 +3,11 @@ name = "xtask" version = "0.0.3-dev.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] anyhow = "1.0.68" clap = { version = "4.0.32", features = ["derive"] } common = { path = "../common", features = ["codegen"] } +typescript = { path = "../typescript" } schemars = { version = "0.8.11", features = [] } serde_json = "1.0.91" +project-root = "0.2.2" diff --git a/libs/xtask/src/codegen/jsonschema.rs b/libs/xtask/src/codegen/jsonschema.rs index f3b626eeb6..e8ab8063db 100644 --- a/libs/xtask/src/codegen/jsonschema.rs +++ b/libs/xtask/src/codegen/jsonschema.rs @@ -21,6 +21,7 @@ pub fn run() -> Result<()> { .create(true) .open(path) .context("Opening the output file")?; + file.set_len(0)?; let schema = schema_for!(Typegraph); serde_json::to_writer_pretty(&mut file, &schema)?; writeln!(file)?; diff --git a/libs/xtask/src/codegen/mod.rs b/libs/xtask/src/codegen/mod.rs index c905bb55cb..227848471d 100644 --- a/libs/xtask/src/codegen/mod.rs +++ b/libs/xtask/src/codegen/mod.rs @@ -1,6 +1,7 @@ // Copyright Metatype OÜ under the Elastic License 2.0 (ELv2). See LICENSE.md for usage. mod jsonschema; +mod typescript; use anyhow::Result; use clap::Parser; @@ -12,7 +13,10 @@ pub struct Codegen { type CodegenEntry = (&'static str, fn() -> Result<()>); -const CODEGEN_ENTRIES: &[CodegenEntry] = &[("jsonschema", jsonschema::run)]; +const CODEGEN_ENTRIES: &[CodegenEntry] = &[ + ("jsonschema", jsonschema::run), + ("typescript", typescript::run), +]; impl Codegen { pub fn run(&self) -> Result<()> { diff --git a/libs/xtask/src/codegen/typescript.rs b/libs/xtask/src/codegen/typescript.rs new file mode 100644 index 0000000000..2dfd21a9f4 --- /dev/null +++ b/libs/xtask/src/codegen/typescript.rs @@ -0,0 +1,245 @@ +// Copyright Metatype OÜ under the Elastic License 2.0 (ELv2). See LICENSE.md for usage. + +use anyhow::{anyhow, bail, Context, Result}; +use std::io::Write; +use std::path::Path; +use std::process::Command; +use std::{env, fs}; +use typescript::ast::*; +use typescript::codegen; +use typescript::parser::parse_module_source; +use typescript::string_cache::Atom; +use typescript::swc_common::{sync::Lrc, SourceMap, DUMMY_SP}; + +pub fn run() -> Result<()> { + println!("Generating TypeScript type definitions for typegraph..."); + + let jsonschema_path = + &env::var("TG_JSONSCHEMA_OUT").context("TG_JSONSCHEMA_OUT env variable required")?; + + let path = &env::var("TG_TYPESCRIPT_OUT") + .context("Reading codegen out file from env variable") + .context("TG_TYPESCRIPT_OUT env variable required")?; + let path = Path::new(path); + + let p = Command::new("pnpm") + .args([ + "dlx", + "github:metatypedev/json-schema-to-typescript#feat/boolean-schemas-2", + jsonschema_path, + "--no-additionalProperties", + "--booleanSchemas", + ]) + .output() + .context("Executing command script from json-schema-to-typescript")?; + + fs::create_dir_all( + path.parent() + .ok_or_else(|| anyhow!("{path:?} does not have a parent directory"))?, + ) + .context("Creating directory")?; + + let code = String::from_utf8(p.stdout) + .context("Parsing json-schema-to-typescript output into a string")?; + let (module, cm) = parse_module_source(code) + .context("Parsing typescript file generated by json-schema-to-typescript")?; + + let (idx, variants) = find_union_type(&module, "TypeNode")? + .ok_or_else(|| anyhow!("Could not find union type 'TypeNode'"))?; + + let exports = variants + .into_iter() + .map(|v| -> Result<_> { + let name = get_type_node_name(&v)?; + Ok(( + ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(export_type(v, &name))), + name, + )) + }) + .collect::>>()?; + + let (mut exports, names): (Vec<_>, Vec<_>) = exports.into_iter().unzip(); + + exports.push(ModuleItem::ModuleDecl(ModuleDecl::ExportDecl( + export_union_type(&names), + ))); + + let mut module = module; + module.body.splice(idx..=idx, exports); + let mut buffer = vec![]; + print_module(cm, &module, &mut buffer)?; + + let code = typescript::format_text(path, std::str::from_utf8(&buffer)?)?; + + let license_header = + fs::read_to_string(project_root::get_project_root()?.join("dev/license-header.txt"))?; + let lint_ignore_directive = "deno-lint-ignore-file no-explicit-any"; + + println!("Writing at {path:?}"); + let mut file = fs::File::options() + .write(true) + .create(true) + .open(path) + .with_context(|| format!("Opening output file {path:?}"))?; + + file.set_len(0)?; + write!( + file, + "// {license_header}\n// {lint_ignore_directive}\n\n{code}" + ) + .with_context(|| format!("Writing to output file {path:?}"))?; + println!(" > written at {:?}", path.canonicalize()?); + + Ok(()) +} + +fn print_module(cm: Lrc, module: &Module, writer: W) -> Result<()> { + let mut emitter = codegen::Emitter { + cfg: codegen::Config { + target: EsVersion::latest(), + ascii_only: true, + minify: false, + omit_last_semi: true, + }, + cm: cm.clone(), + comments: None, + // TODO different new_line for OSes? + wr: codegen::text_writer::JsWriter::new(cm, "\n", writer, None), + }; + + emitter.emit_module(module)?; + + Ok(()) +} + +/// Find the exported union type with name `name` and return a clone of its variants +#[allow(clippy::vec_box)] +fn find_union_type(module: &Module, name: &str) -> Result>)>> { + let found = module + .body + .iter() + .enumerate() + .filter_map(|(idx, item)| match item { + ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl { + span: _, + decl: Decl::TsTypeAlias(t), + })) => { + // + if &t.id.sym == name { + Some((idx, t.type_ann.as_ref())) + } else { + None + } + } + _ => None, + }) + .collect::>(); + + if found.len() > 1 { + bail!("Found more than one items named '{name}'"); + } + + if let Some((idx, type_ann)) = found.into_iter().next() { + match type_ann { + TsType::TsUnionOrIntersectionType(TsUnionOrIntersectionType::TsUnionType( + TsUnionType { span: _, types }, + )) => Ok(Some((idx, types.clone()))), + _ => Ok(None), + } + } else { + Ok(None) + } +} + +fn export_type(typ: Box, name: &str) -> ExportDecl { + ExportDecl { + span: DUMMY_SP, + decl: Decl::TsTypeAlias(Box::new(TsTypeAliasDecl { + span: DUMMY_SP, + declare: false, + id: Ident { + span: DUMMY_SP, + sym: Atom::from(name), + optional: false, + }, + type_params: None, + type_ann: typ, + })), + } +} + +fn export_union_type(names: &[String]) -> ExportDecl { + ExportDecl { + span: DUMMY_SP, + decl: Decl::TsTypeAlias(Box::new(TsTypeAliasDecl { + span: DUMMY_SP, + declare: false, + id: Ident::new(Atom::from("TypeNode"), DUMMY_SP), + type_params: None, + type_ann: Box::new(TsType::TsUnionOrIntersectionType( + TsUnionOrIntersectionType::TsUnionType(TsUnionType { + span: DUMMY_SP, + types: names + .iter() + .map(|n| { + Box::new(TsType::TsTypeRef(TsTypeRef { + span: DUMMY_SP, + type_name: TsEntityName::Ident(Ident { + span: DUMMY_SP, + sym: Atom::from(n.as_str()), + optional: false, + }), + type_params: None, + })) + }) + .collect::>(), + }), + )), + })), + } +} + +fn get_type_node_name(t: &TsType) -> Result { + match t { + TsType::TsTypeLit(t) => { + let s = t + .members + .iter() + .filter_map(|e| match e { + TsTypeElement::TsPropertySignature(s) => { + let TsPropertySignature { key, type_ann, .. } = s; + let key = match key.as_ref() { + Expr::Ident(i) => Some((*i.sym).to_owned()), + _ => None, + }; + key.filter(|k| k == "type").map(|_| type_ann) + } + _ => None, + }) + .flatten() + .collect::>(); + + if s.len() > 1 { + bail!("Found more than one 'type' property") + } + let name = s + .into_iter() + .next() + .ok_or_else(|| anyhow!("Could not found 'type' property in {t:?}"))?; + + let mut name = match name.type_ann.as_ref() { + TsType::TsLitType(TsLitType { + span: _, + lit: TsLit::Str(s), + }) => s.value.as_ref().to_owned(), + _ => bail!("Expected a literal string, got {name:?}"), + }; + if let Some(c) = name.get_mut(0..1) { + c.make_ascii_uppercase(); + } + name.push_str("Node"); + Ok(name) + } + _ => bail!("Expected a type literal for {t:?}"), + } +} diff --git a/meta-cli/Cargo.toml b/meta-cli/Cargo.toml index afa4b24d66..5061f90c1c 100644 --- a/meta-cli/Cargo.toml +++ b/meta-cli/Cargo.toml @@ -11,19 +11,28 @@ documentation = "https://metatype.dev" repository = "https://github.com/metatypedev/metatype" include = ["src"] keywords = ["api", "composition", "typesystem", "graphql", "ecosystem"] -categories = ["accessibility", "api-bindings", "data-structures", "development-tools", "wasm"] +categories = [ + "accessibility", + "api-bindings", + "data-structures", + "development-tools", + "wasm", +] [[bin]] name = "meta" path = "src/main.rs" [dependencies] -dprint-plugin-typescript = "0.80.2" + +self_update = { version = "0.34.0", features = [ + "archive-tar", + "archive-zip", + "compression-flate2", + "compression-zip-deflate", + "compression-zip-bzip2", +] } swc = "0.232.52" -swc_common = { version = "0.29.10", features = ["tty-emitter"] } -swc_ecma_ast = "0.94.14" -swc_ecmascript = { version = "0.205.47", features = ["visit", "transforms", "typescript-parser", "parser", "codegen"] } -swc_ecma_transforms = "0.198.26" datamodel-renderer = { git = "https://github.com/prisma/prisma-engines" } prisma-models = { git = "https://github.com/prisma/prisma-engines" } lazy_static = "1.4.0" @@ -47,8 +56,8 @@ flate2 = "1.0.25" tar = "0.4.38" base64 = "0.21.0" common = { path = "../libs/common" } +typescript = { path = "../libs/typescript" } walkdir = "2.3.2" -self_update = { version = "0.34.0", features = ["archive-tar", "archive-zip", "compression-flate2", "compression-zip-deflate", "compression-zip-bzip2"] } serde_yaml = "0.9.16" pathdiff = "0.2.1" diff --git a/meta-cli/src/codegen/deno.rs b/meta-cli/src/codegen/deno.rs index 5c602dd7f7..8f481fe791 100644 --- a/meta-cli/src/codegen/deno.rs +++ b/meta-cli/src/codegen/deno.rs @@ -2,8 +2,6 @@ use anyhow::{bail, Context, Result}; use common::typegraph::{TypeNode, Typegraph}; -use dprint_plugin_typescript::{configuration::Configuration, format_text}; -use lazy_static::lazy_static; use serde::{Deserialize, Serialize}; use serde_json::Value; use std::cell::RefCell; @@ -12,19 +10,7 @@ use std::fmt::Write as _; use std::fs::File; use std::io::Write; use std::path::{Path, PathBuf}; - -lazy_static! { - static ref TS_FORMAT_CONFIG: Configuration = { - use dprint_plugin_typescript::configuration::*; - ConfigurationBuilder::new() - .line_width(80) - .prefer_hanging(true) - .prefer_single_line(false) - .quote_style(QuoteStyle::PreferSingle) - .next_control_flow_position(NextControlFlowPosition::SameLine) - .build() - }; -} +use typescript as ts; #[derive(Serialize, Deserialize, Debug)] struct ImportFuncMatData { @@ -187,9 +173,7 @@ impl<'a> Codegen<'a> { .into_iter() .map(|(name, code)| -> Result { let path = self.ts_modules.remove(&name).unwrap().path; - let code = format_text(&path, &code, &TS_FORMAT_CONFIG) - .context("could not format code")? - .unwrap(); // TODO no unwrap + let code = ts::format_text(&path, &code).context("could not format code")?; Ok(ModuleCode { path, code }) }) .collect::>>() @@ -229,10 +213,10 @@ impl<'a> Codegen<'a> { if !mod_path.as_ref().exists() { return HashSet::new(); } - let module = crate::ts::parser::parse_module(mod_path.as_ref()) + let module = ts::parser::parse_module(mod_path.as_ref()) .unwrap_or_else(|_| panic!("could not load module: {:?}", mod_path.as_ref())); - crate::ts::parser::get_exported_functions(&module.body) + ts::parser::get_exported_functions(&module.body) } /// Returns `true` if the function named `name` should be generated in the specified file. @@ -387,7 +371,6 @@ mod tests { use crate::config::Config; use crate::tests::utils::ensure_venv; use crate::typegraph::TypegraphLoader; - use std::io::Read; #[test] fn codegen() -> Result<()> { diff --git a/meta-cli/src/main.rs b/meta-cli/src/main.rs index 93a311dbc5..803183c50f 100644 --- a/meta-cli/src/main.rs +++ b/meta-cli/src/main.rs @@ -5,7 +5,6 @@ mod codegen; mod config; #[cfg(test)] mod tests; -mod ts; mod typegraph; mod utils; diff --git a/meta-cli/src/ts/mod.rs b/meta-cli/src/ts/mod.rs deleted file mode 100644 index fc2e6fbeb9..0000000000 --- a/meta-cli/src/ts/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -// Copyright Metatype OÜ under the Elastic License 2.0 (ELv2). See LICENSE.md for usage. - -pub mod parser; diff --git a/meta-cli/src/typegraph.rs b/meta-cli/src/typegraph.rs index 69b6745147..755cc70248 100644 --- a/meta-cli/src/typegraph.rs +++ b/meta-cli/src/typegraph.rs @@ -12,8 +12,8 @@ use std::process::Command; use walkdir::{DirEntry, WalkDir}; use crate::config::Config; -use crate::ts::parser::{transform_module, transform_script}; use crate::utils::ensure_venv; +use typescript::parser::{transform_module, transform_script}; pub type LoaderResult = HashMap>>; diff --git a/typegate/src/auth/auth.ts b/typegate/src/auth/auth.ts index e6a5fc8c20..fc635c7243 100644 --- a/typegate/src/auth/auth.ts +++ b/typegate/src/auth/auth.ts @@ -4,11 +4,8 @@ import { JWKAuth } from "./protocols/jwt.ts"; import { BasicAuth } from "./protocols/basic.ts"; import { OAuth2Auth } from "./protocols/oauth2.ts"; -export type AuthDS = { - name: string; - protocol: "oauth2" | "jwk" | "basic"; - auth_data: Record; -}; +import type { Auth as AuthDS } from "../types/typegraph.ts"; +export { AuthDS }; // localhost:7890/biscuicuits/auth/github?redirect_uri=localhost:7890/biscuicuits export const nextAuthorizationHeader = "Next-Authorization"; diff --git a/typegate/src/runtimes/random.ts b/typegate/src/runtimes/random.ts index 81c90469a4..d05372e50d 100644 --- a/typegate/src/runtimes/random.ts +++ b/typegate/src/runtimes/random.ts @@ -63,7 +63,7 @@ export class RandomRuntime extends Runtime { const config = typ.config ?? {}; if (Object.prototype.hasOwnProperty.call(config, "gen")) { const { gen, ...arg } = config; - return this.chance[gen](arg); + return this.chance[gen as string](arg); } switch (typ.type) { diff --git a/typegate/src/type_node.ts b/typegate/src/type_node.ts index d2a908be8b..6eeea945d1 100644 --- a/typegate/src/type_node.ts +++ b/typegate/src/type_node.ts @@ -19,78 +19,34 @@ type Injection = | { injection: "context"; inject: string } | { injection: "raw"; inject: string /* json */ }; -type TypeNodeBase = - & { - // type: string; - title: string; - description?: string; - runtime: number; - policies: Array; - config?: Record; - } - & Injection; - -export type OptionalNode = TypeNodeBase & { - type: "optional"; - item: number; - default_value: any; -}; - -export type BooleanNode = TypeNodeBase & { type: "boolean" }; - -export type NumberNode = TypeNodeBase & { - type: "number"; - minimum?: number; - exclusiveMinimum?: number; - exclusiveMaximum?: number; - multipleOf?: number; -}; - -export type IntegerNode = { type: "integer" } & Omit; - -export type StringNode = TypeNodeBase & { - type: "string"; - format?: string; - pattern?: string; - minLength?: number; - maxLength?: number; -}; - -export type ObjectNode = TypeNodeBase & { - type: "object"; - properties: Record; - required?: string[]; -}; - -export type ArrayNode = TypeNodeBase & { - type: "array"; - items: number; - minItems?: number; - maxItems?: number; - uniqueItems?: boolean; -}; - -export type FunctionNode = TypeNodeBase & { - type: "function"; - input: number; - output: number; - materializer: number; - rate_weight: number | null; - rate_calls: boolean; +import type { + AnyNode, + ArrayNode, + BooleanNode, + FunctionNode, + IntegerNode, + NumberNode, + ObjectNode, + OptionalNode, + StringNode, + TypeNode, +} from "./types/typegraph.ts"; + +export type { + AnyNode, + ArrayNode, + BooleanNode, + FunctionNode, + IntegerNode, + NumberNode, + ObjectNode, + OptionalNode, + StringNode, + TypeNode, }; export type QuantifierNode = OptionalNode | ArrayNode; -export type TypeNode = - | OptionalNode - | BooleanNode - | NumberNode - | IntegerNode - | StringNode - | ObjectNode - | ArrayNode - | FunctionNode; - // // Runtimes diff --git a/typegate/src/typegraph.ts b/typegate/src/typegraph.ts index 20b83928de..780c2b7054 100644 --- a/typegate/src/typegraph.ts +++ b/typegate/src/typegraph.ts @@ -12,7 +12,7 @@ import { RandomRuntime } from "./runtimes/random.ts"; import { Runtime } from "./runtimes/Runtime.ts"; import { ensure, envOrFail } from "./utils.ts"; -import { Auth, AuthDS, nextAuthorizationHeader } from "./auth/auth.ts"; +import { Auth, nextAuthorizationHeader } from "./auth/auth.ts"; import * as semver from "std/semver/mod.ts"; import { @@ -38,52 +38,16 @@ import { } from "./types.ts"; import { S3Runtime } from "./runtimes/s3.ts"; -interface TypePolicy { - name: string; - materializer: number; -} - -export interface TypeMaterializer { - name: string; - runtime: number; - data: Record; -} +import type { + Cors, + Materializer as TypeMaterializer, + Policy as TypePolicy, + Rate, + TGRuntime as TypeRuntime, + Typegraph as TypeGraphDS, +} from "./types/typegraph.ts"; -export interface TypeRuntime { - name: string; - data: Record; -} - -export interface Rate { - window_limit: number; - window_sec: number; - query_limit: number; - local_excess: number; - context_identifier: string; -} - -export interface TypeMeta { - secrets: Array; - cors: { - allow_origin: Array; - allow_methods: Array; - allow_headers: Array; - expose_headers: Array; - allow_credentials: boolean; - max_age: number | null; - }; - auths: Array; - rate: Rate | null; - version: string; -} - -export interface TypeGraphDS { - types: Array; - materializers: Array; - runtimes: Array; - policies: Array; - meta: TypeMeta; -} +export { Cors, Rate, TypeGraphDS, TypeMaterializer, TypePolicy, TypeRuntime }; export type RuntimeResolver = Record; diff --git a/typegate/src/typegraphs/introspection.json b/typegate/src/typegraphs/introspection.json index e9b71b37f1..5b33636bd7 100644 --- a/typegate/src/typegraphs/introspection.json +++ b/typegate/src/typegraphs/introspection.json @@ -1 +1 @@ -{"types":[{"type":"object","title":"introspection","runtime":0,"policies":[],"config":{},"properties":{"__type":1,"__schema":64},"required":[]},{"type":"function","title":"function_75","runtime":1,"policies":[0],"config":{},"input":2,"output":4,"materializer":2,"rate_weight":null,"rate_calls":false},{"type":"object","title":"object_73","runtime":1,"policies":[],"config":{},"properties":{"name":3},"required":[]},{"type":"string","title":"string_72","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_74","runtime":1,"policies":[],"config":{},"item":5,"default_value":null},{"type":"object","title":"type","runtime":1,"policies":[],"config":{},"properties":{"interfaces":40,"possibleTypes":42,"specifiedByURL":11,"inputFields":57,"enumValues":44,"ofType":63,"description":9,"fields":13,"name":7,"kind":6},"required":[]},{"type":"string","title":"type_kind","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_31","runtime":1,"policies":[],"config":{},"item":8,"default_value":null},{"type":"string","title":"string_30","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_33","runtime":1,"policies":[],"config":{},"item":10,"default_value":null},{"type":"string","title":"string_32","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_35","runtime":1,"policies":[],"config":{},"item":12,"default_value":null},{"type":"string","title":"string_34","runtime":1,"policies":[],"config":{}},{"type":"function","title":"function_41","runtime":1,"policies":[],"config":{},"input":14,"output":17,"materializer":1,"rate_weight":null,"rate_calls":false},{"type":"object","title":"object_38","runtime":1,"policies":[],"config":{},"properties":{"includeDeprecated":15},"required":[]},{"type":"optional","title":"optional_37","runtime":1,"policies":[],"config":{},"item":16,"default_value":null},{"type":"boolean","title":"boolean_36","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_40","runtime":1,"policies":[],"config":{},"item":18,"default_value":null},{"type":"array","title":"array_39","runtime":1,"policies":[],"config":{},"items":19},{"type":"object","title":"field","runtime":1,"policies":[],"config":{},"properties":{"description":21,"args":23,"deprecationReason":38,"name":20,"isDeprecated":37,"type":5},"required":[]},{"type":"string","title":"string_17","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_19","runtime":1,"policies":[],"config":{},"item":22,"default_value":null},{"type":"string","title":"string_18","runtime":1,"policies":[],"config":{}},{"type":"function","title":"function_24","runtime":1,"policies":[],"config":{},"input":24,"output":27,"materializer":1,"rate_weight":null,"rate_calls":false},{"type":"object","title":"object_22","runtime":1,"policies":[],"config":{},"properties":{"includeDeprecated":25},"required":[]},{"type":"optional","title":"optional_21","runtime":1,"policies":[],"config":{},"item":26,"default_value":null},{"type":"boolean","title":"boolean_20","runtime":1,"policies":[],"config":{}},{"type":"array","title":"array_23","runtime":1,"policies":[],"config":{},"items":28},{"type":"object","title":"input_value","runtime":1,"policies":[],"config":{},"properties":{"deprecationReason":35,"description":30,"name":29,"isDeprecated":34,"type":5,"defaultValue":32},"required":[]},{"type":"string","title":"string_8","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_10","runtime":1,"policies":[],"config":{},"item":31,"default_value":null},{"type":"string","title":"string_9","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_12","runtime":1,"policies":[],"config":{},"item":33,"default_value":null},{"type":"string","title":"string_11","runtime":1,"policies":[],"config":{}},{"type":"boolean","title":"boolean_13","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_15","runtime":1,"policies":[],"config":{},"item":36,"default_value":null},{"type":"string","title":"string_14","runtime":1,"policies":[],"config":{}},{"type":"boolean","title":"boolean_25","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_27","runtime":1,"policies":[],"config":{},"item":39,"default_value":null},{"type":"string","title":"string_26","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_43","runtime":1,"policies":[],"config":{},"item":41,"default_value":null},{"type":"array","title":"array_42","runtime":1,"policies":[],"config":{},"items":5},{"type":"optional","title":"optional_45","runtime":1,"policies":[],"config":{},"item":43,"default_value":null},{"type":"array","title":"array_44","runtime":1,"policies":[],"config":{},"items":5},{"type":"function","title":"function_51","runtime":1,"policies":[],"config":{},"input":45,"output":48,"materializer":1,"rate_weight":null,"rate_calls":false},{"type":"object","title":"object_48","runtime":1,"policies":[],"config":{},"properties":{"includeDeprecated":46},"required":[]},{"type":"optional","title":"optional_47","runtime":1,"policies":[],"config":{},"item":47,"default_value":null},{"type":"boolean","title":"boolean_46","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_50","runtime":1,"policies":[],"config":{},"item":49,"default_value":null},{"type":"array","title":"array_49","runtime":1,"policies":[],"config":{},"items":50},{"type":"object","title":"enum_value","runtime":1,"policies":[],"config":{},"properties":{"name":51,"description":52,"isDeprecated":54,"deprecationReason":55},"required":[]},{"type":"string","title":"string_1","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_3","runtime":1,"policies":[],"config":{},"item":53,"default_value":null},{"type":"string","title":"string_2","runtime":1,"policies":[],"config":{}},{"type":"boolean","title":"boolean_4","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_6","runtime":1,"policies":[],"config":{},"item":56,"default_value":null},{"type":"string","title":"string_5","runtime":1,"policies":[],"config":{}},{"type":"function","title":"function_57","runtime":1,"policies":[],"config":{},"input":58,"output":61,"materializer":1,"rate_weight":null,"rate_calls":false},{"type":"object","title":"object_54","runtime":1,"policies":[],"config":{},"properties":{"includeDeprecated":59},"required":[]},{"type":"optional","title":"optional_53","runtime":1,"policies":[],"config":{},"item":60,"default_value":null},{"type":"boolean","title":"boolean_52","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_56","runtime":1,"policies":[],"config":{},"item":62,"default_value":null},{"type":"array","title":"array_55","runtime":1,"policies":[],"config":{},"items":28},{"type":"optional","title":"optional_86","runtime":1,"policies":[],"config":{},"item":5,"default_value":null},{"type":"function","title":"function_84","runtime":1,"policies":[0],"config":{},"input":65,"output":66,"materializer":3,"rate_weight":null,"rate_calls":false},{"type":"object","title":"object_83","runtime":1,"policies":[],"config":{},"properties":{},"required":[]},{"type":"object","title":"schema","runtime":1,"policies":[],"config":{},"properties":{"directives":72,"description":67,"queryType":5,"mutationType":70,"types":69,"subscriptionType":71},"required":[]},{"type":"optional","title":"optional_77","runtime":1,"policies":[],"config":{},"item":68,"default_value":null},{"type":"string","title":"string_76","runtime":1,"policies":[],"config":{}},{"type":"array","title":"array_78","runtime":1,"policies":[],"config":{},"items":5},{"type":"optional","title":"optional_79","runtime":1,"policies":[],"config":{},"item":5,"default_value":null},{"type":"optional","title":"optional_80","runtime":1,"policies":[],"config":{},"item":5,"default_value":null},{"type":"array","title":"array_81","runtime":1,"policies":[],"config":{},"items":73},{"type":"object","title":"directive","runtime":1,"policies":[],"config":{},"properties":{"locations":78,"name":74,"args":80,"description":75,"isRepeatable":77},"required":[]},{"type":"string","title":"string_60","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_62","runtime":1,"policies":[],"config":{},"item":76,"default_value":null},{"type":"string","title":"string_61","runtime":1,"policies":[],"config":{}},{"type":"boolean","title":"boolean_63","runtime":1,"policies":[],"config":{}},{"type":"array","title":"array_64","runtime":1,"policies":[],"config":{},"items":79},{"type":"string","title":"directive_location","runtime":1,"policies":[],"config":{}},{"type":"function","title":"function_69","runtime":1,"policies":[],"config":{},"input":81,"output":84,"materializer":1,"rate_weight":null,"rate_calls":false},{"type":"object","title":"object_67","runtime":1,"policies":[],"config":{},"properties":{"includeDeprecated":82},"required":[]},{"type":"optional","title":"optional_66","runtime":1,"policies":[],"config":{},"item":83,"default_value":null},{"type":"boolean","title":"boolean_65","runtime":1,"policies":[],"config":{}},{"type":"array","title":"array_68","runtime":1,"policies":[],"config":{},"items":28}],"materializers":[{"name":"function","runtime":0,"data":{"script":"var _my_lambda=()=>true;","serial":false}},{"name":"resolver","runtime":1,"data":{"serial":false}},{"name":"getType","runtime":1,"data":{"serial":false}},{"name":"getSchema","runtime":1,"data":{"serial":false}}],"runtimes":[{"name":"deno","data":{"permissions":{},"worker":"default"}},{"name":"typegraph","data":{}}],"policies":[{"name":"__allow_all","materializer":0}],"meta":{"secrets":[],"cors":{"allow_origin":[],"allow_headers":[],"expose_headers":[],"allow_credentials":true,"max_age":null},"auths":[],"rate":null,"version":"0.0.1"}} +{"types":[{"type":"object","title":"introspection","runtime":0,"policies":[],"config":{},"properties":{"__schema":64,"__type":1},"required":[]},{"type":"function","title":"function_75","runtime":1,"policies":[0],"config":{},"input":2,"output":4,"materializer":2,"rate_weight":null,"rate_calls":false},{"type":"object","title":"object_73","runtime":1,"policies":[],"config":{},"properties":{"name":3},"required":[]},{"type":"string","title":"string_72","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_74","runtime":1,"policies":[],"config":{},"item":5,"default_value":null},{"type":"object","title":"type","runtime":1,"policies":[],"config":{},"properties":{"ofType":63,"inputFields":57,"name":7,"fields":13,"possibleTypes":42,"enumValues":44,"description":9,"specifiedByURL":11,"kind":6,"interfaces":40},"required":[]},{"type":"string","title":"type_kind","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_31","runtime":1,"policies":[],"config":{},"item":8,"default_value":null},{"type":"string","title":"string_30","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_33","runtime":1,"policies":[],"config":{},"item":10,"default_value":null},{"type":"string","title":"string_32","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_35","runtime":1,"policies":[],"config":{},"item":12,"default_value":null},{"type":"string","title":"string_34","runtime":1,"policies":[],"config":{}},{"type":"function","title":"function_41","runtime":1,"policies":[],"config":{},"input":14,"output":17,"materializer":1,"rate_weight":null,"rate_calls":false},{"type":"object","title":"object_38","runtime":1,"policies":[],"config":{},"properties":{"includeDeprecated":15},"required":[]},{"type":"optional","title":"optional_37","runtime":1,"policies":[],"config":{},"item":16,"default_value":null},{"type":"boolean","title":"boolean_36","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_40","runtime":1,"policies":[],"config":{},"item":18,"default_value":null},{"type":"array","title":"array_39","runtime":1,"policies":[],"config":{},"items":19},{"type":"object","title":"field","runtime":1,"policies":[],"config":{},"properties":{"isDeprecated":37,"args":23,"description":21,"deprecationReason":38,"name":20,"type":5},"required":[]},{"type":"string","title":"string_17","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_19","runtime":1,"policies":[],"config":{},"item":22,"default_value":null},{"type":"string","title":"string_18","runtime":1,"policies":[],"config":{}},{"type":"function","title":"function_24","runtime":1,"policies":[],"config":{},"input":24,"output":27,"materializer":1,"rate_weight":null,"rate_calls":false},{"type":"object","title":"object_22","runtime":1,"policies":[],"config":{},"properties":{"includeDeprecated":25},"required":[]},{"type":"optional","title":"optional_21","runtime":1,"policies":[],"config":{},"item":26,"default_value":null},{"type":"boolean","title":"boolean_20","runtime":1,"policies":[],"config":{}},{"type":"array","title":"array_23","runtime":1,"policies":[],"config":{},"items":28},{"type":"object","title":"input_value","runtime":1,"policies":[],"config":{},"properties":{"defaultValue":32,"description":30,"type":5,"deprecationReason":35,"name":29,"isDeprecated":34},"required":[]},{"type":"string","title":"string_8","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_10","runtime":1,"policies":[],"config":{},"item":31,"default_value":null},{"type":"string","title":"string_9","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_12","runtime":1,"policies":[],"config":{},"item":33,"default_value":null},{"type":"string","title":"string_11","runtime":1,"policies":[],"config":{}},{"type":"boolean","title":"boolean_13","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_15","runtime":1,"policies":[],"config":{},"item":36,"default_value":null},{"type":"string","title":"string_14","runtime":1,"policies":[],"config":{}},{"type":"boolean","title":"boolean_25","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_27","runtime":1,"policies":[],"config":{},"item":39,"default_value":null},{"type":"string","title":"string_26","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_43","runtime":1,"policies":[],"config":{},"item":41,"default_value":null},{"type":"array","title":"array_42","runtime":1,"policies":[],"config":{},"items":5},{"type":"optional","title":"optional_45","runtime":1,"policies":[],"config":{},"item":43,"default_value":null},{"type":"array","title":"array_44","runtime":1,"policies":[],"config":{},"items":5},{"type":"function","title":"function_51","runtime":1,"policies":[],"config":{},"input":45,"output":48,"materializer":1,"rate_weight":null,"rate_calls":false},{"type":"object","title":"object_48","runtime":1,"policies":[],"config":{},"properties":{"includeDeprecated":46},"required":[]},{"type":"optional","title":"optional_47","runtime":1,"policies":[],"config":{},"item":47,"default_value":null},{"type":"boolean","title":"boolean_46","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_50","runtime":1,"policies":[],"config":{},"item":49,"default_value":null},{"type":"array","title":"array_49","runtime":1,"policies":[],"config":{},"items":50},{"type":"object","title":"enum_value","runtime":1,"policies":[],"config":{},"properties":{"description":52,"isDeprecated":54,"deprecationReason":55,"name":51},"required":[]},{"type":"string","title":"string_1","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_3","runtime":1,"policies":[],"config":{},"item":53,"default_value":null},{"type":"string","title":"string_2","runtime":1,"policies":[],"config":{}},{"type":"boolean","title":"boolean_4","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_6","runtime":1,"policies":[],"config":{},"item":56,"default_value":null},{"type":"string","title":"string_5","runtime":1,"policies":[],"config":{}},{"type":"function","title":"function_57","runtime":1,"policies":[],"config":{},"input":58,"output":61,"materializer":1,"rate_weight":null,"rate_calls":false},{"type":"object","title":"object_54","runtime":1,"policies":[],"config":{},"properties":{"includeDeprecated":59},"required":[]},{"type":"optional","title":"optional_53","runtime":1,"policies":[],"config":{},"item":60,"default_value":null},{"type":"boolean","title":"boolean_52","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_56","runtime":1,"policies":[],"config":{},"item":62,"default_value":null},{"type":"array","title":"array_55","runtime":1,"policies":[],"config":{},"items":28},{"type":"optional","title":"optional_86","runtime":1,"policies":[],"config":{},"item":5,"default_value":null},{"type":"function","title":"function_84","runtime":1,"policies":[0],"config":{},"input":65,"output":66,"materializer":3,"rate_weight":null,"rate_calls":false},{"type":"object","title":"object_83","runtime":1,"policies":[],"config":{},"properties":{},"required":[]},{"type":"object","title":"schema","runtime":1,"policies":[],"config":{},"properties":{"subscriptionType":71,"directives":72,"mutationType":70,"types":69,"queryType":5,"description":67},"required":[]},{"type":"optional","title":"optional_77","runtime":1,"policies":[],"config":{},"item":68,"default_value":null},{"type":"string","title":"string_76","runtime":1,"policies":[],"config":{}},{"type":"array","title":"array_78","runtime":1,"policies":[],"config":{},"items":5},{"type":"optional","title":"optional_79","runtime":1,"policies":[],"config":{},"item":5,"default_value":null},{"type":"optional","title":"optional_80","runtime":1,"policies":[],"config":{},"item":5,"default_value":null},{"type":"array","title":"array_81","runtime":1,"policies":[],"config":{},"items":73},{"type":"object","title":"directive","runtime":1,"policies":[],"config":{},"properties":{"description":75,"name":74,"args":80,"isRepeatable":77,"locations":78},"required":[]},{"type":"string","title":"string_60","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_62","runtime":1,"policies":[],"config":{},"item":76,"default_value":null},{"type":"string","title":"string_61","runtime":1,"policies":[],"config":{}},{"type":"boolean","title":"boolean_63","runtime":1,"policies":[],"config":{}},{"type":"array","title":"array_64","runtime":1,"policies":[],"config":{},"items":79},{"type":"string","title":"directive_location","runtime":1,"policies":[],"config":{}},{"type":"function","title":"function_69","runtime":1,"policies":[],"config":{},"input":81,"output":84,"materializer":1,"rate_weight":null,"rate_calls":false},{"type":"object","title":"object_67","runtime":1,"policies":[],"config":{},"properties":{"includeDeprecated":82},"required":[]},{"type":"optional","title":"optional_66","runtime":1,"policies":[],"config":{},"item":83,"default_value":null},{"type":"boolean","title":"boolean_65","runtime":1,"policies":[],"config":{}},{"type":"array","title":"array_68","runtime":1,"policies":[],"config":{},"items":28}],"materializers":[{"name":"function","runtime":0,"data":{"script":"var _my_lambda=()=>true;","serial":false}},{"name":"resolver","runtime":1,"data":{"serial":false}},{"name":"getType","runtime":1,"data":{"serial":false}},{"name":"getSchema","runtime":1,"data":{"serial":false}}],"runtimes":[{"name":"deno","data":{"worker":"default","permissions":{}}},{"name":"typegraph","data":{}}],"policies":[{"name":"__allow_all","materializer":0}],"meta":{"secrets":[],"cors":{"allow_origin":[],"allow_headers":[],"expose_headers":[],"allow_methods":[],"allow_credentials":true,"max_age":null},"auths":[],"rate":null,"version":"0.0.1"}} diff --git a/typegate/src/typegraphs/prisma_migration.json b/typegate/src/typegraphs/prisma_migration.json index befb2e0b88..886189517a 100644 --- a/typegate/src/typegraphs/prisma_migration.json +++ b/typegate/src/typegraphs/prisma_migration.json @@ -1 +1 @@ -{"types":[{"type":"object","title":"typegate/prisma_migration","runtime":0,"policies":[],"config":{},"properties":{"diff":1,"deploy":33,"apply":11,"create":23},"required":[]},{"type":"function","title":"function_17","runtime":1,"policies":[0],"config":{},"input":2,"output":7,"materializer":1,"rate_weight":null,"rate_calls":true},{"type":"object","title":"object_12","runtime":1,"policies":[],"config":{},"properties":{"typegraph":3,"runtime":4,"script":6},"required":[]},{"type":"string","title":"string_8","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_10","runtime":1,"policies":[],"config":{},"item":5,"default_value":null},{"type":"string","title":"string_9","runtime":1,"policies":[],"config":{}},{"type":"boolean","title":"boolean_11","runtime":1,"policies":[],"config":{}},{"type":"object","title":"object_16","runtime":1,"policies":[],"config":{},"properties":{"diff":8,"runtimeName":10},"required":[]},{"type":"optional","title":"optional_14","runtime":1,"policies":[],"config":{},"item":9,"default_value":null},{"type":"string","title":"string_13","runtime":1,"policies":[],"config":{}},{"type":"string","title":"string_15","runtime":1,"policies":[],"config":{}},{"type":"function","title":"function_23","runtime":1,"policies":[0],"config":{},"input":12,"output":19,"materializer":2,"rate_weight":null,"rate_calls":true},{"type":"object","title":"object_7","runtime":1,"policies":[],"config":{},"properties":{"typegraph":13,"resetDatabase":18,"runtime":14,"migrations":16},"required":[]},{"type":"string","title":"string_2","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_4","runtime":1,"policies":[],"config":{},"item":15,"default_value":null},{"type":"string","title":"string_3","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_6","runtime":1,"policies":[],"config":{},"item":17,"default_value":null},{"type":"string","title":"string_5","runtime":1,"policies":[],"config":{}},{"type":"boolean","title":"boolean_18","runtime":1,"policies":[],"config":{}},{"type":"object","title":"object_22","runtime":1,"policies":[],"config":{},"properties":{"databaseReset":20,"appliedMigrations":21},"required":[]},{"type":"boolean","title":"boolean_19","runtime":1,"policies":[],"config":{}},{"type":"array","title":"array_21","runtime":1,"policies":[],"config":{},"items":22},{"type":"string","title":"string_20","runtime":1,"policies":[],"config":{}},{"type":"function","title":"function_32","runtime":1,"policies":[0],"config":{},"input":24,"output":27,"materializer":3,"rate_weight":null,"rate_calls":true},{"type":"object","title":"object_7","runtime":1,"policies":[],"config":{},"properties":{"typegraph":13,"name":25,"runtime":14,"migrations":16,"apply":26},"required":[]},{"type":"string","title":"string_24","runtime":1,"policies":[],"config":{}},{"type":"boolean","title":"boolean_25","runtime":1,"policies":[],"config":{}},{"type":"object","title":"object_31","runtime":1,"policies":[],"config":{},"properties":{"migrations":31,"createdMigrationName":28,"appliedMigrations":29,"runtimeName":32},"required":[]},{"type":"string","title":"string_26","runtime":1,"policies":[],"config":{}},{"type":"array","title":"array_28","runtime":1,"policies":[],"config":{},"items":30},{"type":"string","title":"string_27","runtime":1,"policies":[],"config":{}},{"type":"string","title":"string_29","runtime":1,"policies":[],"config":{}},{"type":"string","title":"string_30","runtime":1,"policies":[],"config":{}},{"type":"function","title":"function_38","runtime":1,"policies":[0],"config":{},"input":34,"output":36,"materializer":4,"rate_weight":null,"rate_calls":true},{"type":"object","title":"object_7","runtime":1,"policies":[],"config":{},"properties":{"typegraph":13,"runtime":14,"migrations":35},"required":[]},{"type":"string","title":"string_33","runtime":1,"policies":[],"config":{}},{"type":"object","title":"object_37","runtime":1,"policies":[],"config":{},"properties":{"appliedMigrations":38,"migrationCount":37},"required":[]},{"type":"integer","title":"integer_34","runtime":1,"policies":[],"config":{}},{"type":"array","title":"array_36","runtime":1,"policies":[],"config":{},"items":39},{"type":"string","title":"string_35","runtime":1,"policies":[],"config":{}}],"materializers":[{"name":"function","runtime":0,"data":{"script":"var _my_lambda=(_args,{context})=>context.user===\"admin\";","serial":false}},{"name":"diff","runtime":1,"data":{"serial":false}},{"name":"apply","runtime":1,"data":{"serial":true}},{"name":"create","runtime":1,"data":{"serial":true}},{"name":"deploy","runtime":1,"data":{"serial":true}}],"runtimes":[{"name":"deno","data":{"worker":"default","permissions":{}}},{"name":"prisma_migration","data":{}}],"policies":[{"name":"admin_only","materializer":0}],"meta":{"secrets":[],"cors":{"allow_origin":[],"allow_headers":[],"expose_headers":[],"allow_credentials":true,"max_age":null},"auths":[{"name":"basic","protocol":"basic","auth_data":{"users":["admin"]}}],"rate":{"window_limit":128,"window_sec":60,"query_limit":8,"context_identifier":"user","local_excess":5},"version":"0.0.1"}} +{"types":[{"type":"object","title":"typegate/prisma_migration","runtime":0,"policies":[],"config":{},"properties":{"apply":11,"diff":1,"create":23,"deploy":33},"required":[]},{"type":"function","title":"function_17","runtime":1,"policies":[0],"config":{},"input":2,"output":7,"materializer":1,"rate_weight":null,"rate_calls":true},{"type":"object","title":"object_12","runtime":1,"policies":[],"config":{},"properties":{"script":6,"typegraph":3,"runtime":4},"required":[]},{"type":"string","title":"string_8","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_10","runtime":1,"policies":[],"config":{},"item":5,"default_value":null},{"type":"string","title":"string_9","runtime":1,"policies":[],"config":{}},{"type":"boolean","title":"boolean_11","runtime":1,"policies":[],"config":{}},{"type":"object","title":"object_16","runtime":1,"policies":[],"config":{},"properties":{"runtimeName":10,"diff":8},"required":[]},{"type":"optional","title":"optional_14","runtime":1,"policies":[],"config":{},"item":9,"default_value":null},{"type":"string","title":"string_13","runtime":1,"policies":[],"config":{}},{"type":"string","title":"string_15","runtime":1,"policies":[],"config":{}},{"type":"function","title":"function_23","runtime":1,"policies":[0],"config":{},"input":12,"output":19,"materializer":2,"rate_weight":null,"rate_calls":true},{"type":"object","title":"object_7","runtime":1,"policies":[],"config":{},"properties":{"runtime":14,"migrations":16,"resetDatabase":18,"typegraph":13},"required":[]},{"type":"string","title":"string_2","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_4","runtime":1,"policies":[],"config":{},"item":15,"default_value":null},{"type":"string","title":"string_3","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_6","runtime":1,"policies":[],"config":{},"item":17,"default_value":null},{"type":"string","title":"string_5","runtime":1,"policies":[],"config":{}},{"type":"boolean","title":"boolean_18","runtime":1,"policies":[],"config":{}},{"type":"object","title":"object_22","runtime":1,"policies":[],"config":{},"properties":{"databaseReset":20,"appliedMigrations":21},"required":[]},{"type":"boolean","title":"boolean_19","runtime":1,"policies":[],"config":{}},{"type":"array","title":"array_21","runtime":1,"policies":[],"config":{},"items":22},{"type":"string","title":"string_20","runtime":1,"policies":[],"config":{}},{"type":"function","title":"function_32","runtime":1,"policies":[0],"config":{},"input":24,"output":27,"materializer":3,"rate_weight":null,"rate_calls":true},{"type":"object","title":"object_7","runtime":1,"policies":[],"config":{},"properties":{"name":25,"migrations":16,"apply":26,"typegraph":13,"runtime":14},"required":[]},{"type":"string","title":"string_24","runtime":1,"policies":[],"config":{}},{"type":"boolean","title":"boolean_25","runtime":1,"policies":[],"config":{}},{"type":"object","title":"object_31","runtime":1,"policies":[],"config":{},"properties":{"runtimeName":32,"createdMigrationName":28,"appliedMigrations":29,"migrations":31},"required":[]},{"type":"string","title":"string_26","runtime":1,"policies":[],"config":{}},{"type":"array","title":"array_28","runtime":1,"policies":[],"config":{},"items":30},{"type":"string","title":"string_27","runtime":1,"policies":[],"config":{}},{"type":"string","title":"string_29","runtime":1,"policies":[],"config":{}},{"type":"string","title":"string_30","runtime":1,"policies":[],"config":{}},{"type":"function","title":"function_38","runtime":1,"policies":[0],"config":{},"input":34,"output":36,"materializer":4,"rate_weight":null,"rate_calls":true},{"type":"object","title":"object_7","runtime":1,"policies":[],"config":{},"properties":{"typegraph":13,"migrations":35,"runtime":14},"required":[]},{"type":"string","title":"string_33","runtime":1,"policies":[],"config":{}},{"type":"object","title":"object_37","runtime":1,"policies":[],"config":{},"properties":{"migrationCount":37,"appliedMigrations":38},"required":[]},{"type":"integer","title":"integer_34","runtime":1,"policies":[],"config":{}},{"type":"array","title":"array_36","runtime":1,"policies":[],"config":{},"items":39},{"type":"string","title":"string_35","runtime":1,"policies":[],"config":{}}],"materializers":[{"name":"function","runtime":0,"data":{"script":"var _my_lambda=(_args,{context})=>context.user===\"admin\";","serial":false}},{"name":"diff","runtime":1,"data":{"serial":false}},{"name":"apply","runtime":1,"data":{"serial":true}},{"name":"create","runtime":1,"data":{"serial":true}},{"name":"deploy","runtime":1,"data":{"serial":true}}],"runtimes":[{"name":"deno","data":{"permissions":{},"worker":"default"}},{"name":"prisma_migration","data":{}}],"policies":[{"name":"admin_only","materializer":0}],"meta":{"secrets":[],"cors":{"allow_origin":[],"allow_headers":[],"expose_headers":[],"allow_methods":[],"allow_credentials":true,"max_age":null},"auths":[{"name":"basic","protocol":"basic","auth_data":{"users":["admin"]}}],"rate":{"window_limit":128,"window_sec":60,"query_limit":8,"context_identifier":"user","local_excess":5},"version":"0.0.1"}} diff --git a/typegate/src/typegraphs/typegate.json b/typegate/src/typegraphs/typegate.json index 9b24fff0ab..0642b4ce7d 100644 --- a/typegate/src/typegraphs/typegate.json +++ b/typegate/src/typegraphs/typegate.json @@ -1 +1 @@ -{"types":[{"type":"object","title":"typegate","runtime":0,"policies":[],"config":{},"properties":{"addTypegraph":15,"removeTypegraph":19,"typegraphs":1,"typegraph":7},"required":[]},{"type":"function","title":"function_10","runtime":1,"policies":[0],"config":{},"input":2,"output":3,"materializer":1,"rate_weight":null,"rate_calls":true},{"type":"object","title":"object_8","runtime":1,"policies":[],"config":{},"properties":{},"required":[]},{"type":"array","title":"array_9","runtime":1,"policies":[],"config":{},"items":4},{"type":"object","title":"typegraph","runtime":1,"policies":[],"config":{},"properties":{"url":6,"name":5},"required":[]},{"type":"string","title":"string_4","runtime":1,"policies":[],"config":{}},{"type":"string","title":"string_5","runtime":1,"policies":[],"config":{},"format":"uri"},{"type":"function","title":"function_14","runtime":1,"policies":[0],"config":{},"input":8,"output":10,"materializer":3,"rate_weight":null,"rate_calls":true},{"type":"object","title":"object_12","runtime":1,"policies":[],"config":{},"properties":{"name":9},"required":[]},{"type":"string","title":"string_11","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_13","runtime":1,"policies":[],"config":{},"item":11,"default_value":null},{"type":"object","title":"typegraph","runtime":1,"policies":[],"config":{},"properties":{"name":5,"url":6,"serialized":12},"required":[]},{"type":"function","title":"function_3","runtime":1,"policies":[],"config":{},"input":13,"output":14,"materializer":2,"rate_weight":null,"rate_calls":false},{"type":"object","title":"object_2","runtime":1,"policies":[],"config":{},"properties":{},"required":[]},{"type":"string","title":"string_1","runtime":1,"policies":[],"config":{}},{"type":"function","title":"function_18","runtime":1,"policies":[0],"config":{},"input":16,"output":18,"materializer":4,"rate_weight":null,"rate_calls":true},{"type":"object","title":"object_16","runtime":1,"policies":[],"config":{},"properties":{"fromString":17},"required":[]},{"type":"string","title":"string_15","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_17","runtime":1,"policies":[],"config":{},"item":4,"default_value":null},{"type":"function","title":"function_22","runtime":1,"policies":[0],"config":{},"input":20,"output":22,"materializer":5,"rate_weight":null,"rate_calls":true},{"type":"object","title":"object_20","runtime":1,"policies":[],"config":{},"properties":{"name":21},"required":[]},{"type":"string","title":"string_19","runtime":1,"policies":[],"config":{}},{"type":"integer","title":"integer_21","runtime":1,"policies":[],"config":{}}],"materializers":[{"name":"function","runtime":0,"data":{"script":"var _my_lambda=(_args,{context})=>context.user===\"admin\";","serial":false}},{"name":"typegraphs","runtime":1,"data":{"serial":false}},{"name":"serializedTypegraph","runtime":1,"data":{"serial":false}},{"name":"typegraph","runtime":1,"data":{"serial":false}},{"name":"addTypegraph","runtime":1,"data":{"serial":true}},{"name":"removeTypegraph","runtime":1,"data":{"serial":true}}],"runtimes":[{"name":"deno","data":{"worker":"default","permissions":{}}},{"name":"typegate","data":{}}],"policies":[{"name":"admin_only","materializer":0}],"meta":{"secrets":[],"cors":{"allow_origin":["*"],"allow_headers":["*"],"expose_headers":[],"allow_credentials":true,"max_age":null},"auths":[{"name":"basic","protocol":"basic","auth_data":{"users":["admin"]}}],"rate":{"window_limit":128,"window_sec":60,"query_limit":8,"context_identifier":"user","local_excess":5},"version":"0.0.1"}} +{"types":[{"type":"object","title":"typegate","runtime":0,"policies":[],"config":{},"properties":{"removeTypegraph":19,"addTypegraph":15,"typegraphs":1,"typegraph":7},"required":[]},{"type":"function","title":"function_10","runtime":1,"policies":[0],"config":{},"input":2,"output":3,"materializer":1,"rate_weight":null,"rate_calls":true},{"type":"object","title":"object_8","runtime":1,"policies":[],"config":{},"properties":{},"required":[]},{"type":"array","title":"array_9","runtime":1,"policies":[],"config":{},"items":4},{"type":"object","title":"typegraph","runtime":1,"policies":[],"config":{},"properties":{"url":6,"name":5},"required":[]},{"type":"string","title":"string_4","runtime":1,"policies":[],"config":{}},{"type":"string","title":"string_5","runtime":1,"policies":[],"config":{},"format":"uri"},{"type":"function","title":"function_14","runtime":1,"policies":[0],"config":{},"input":8,"output":10,"materializer":3,"rate_weight":null,"rate_calls":true},{"type":"object","title":"object_12","runtime":1,"policies":[],"config":{},"properties":{"name":9},"required":[]},{"type":"string","title":"string_11","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_13","runtime":1,"policies":[],"config":{},"item":11,"default_value":null},{"type":"object","title":"typegraph","runtime":1,"policies":[],"config":{},"properties":{"name":5,"url":6,"serialized":12},"required":[]},{"type":"function","title":"function_3","runtime":1,"policies":[],"config":{},"input":13,"output":14,"materializer":2,"rate_weight":null,"rate_calls":false},{"type":"object","title":"object_2","runtime":1,"policies":[],"config":{},"properties":{},"required":[]},{"type":"string","title":"string_1","runtime":1,"policies":[],"config":{}},{"type":"function","title":"function_18","runtime":1,"policies":[0],"config":{},"input":16,"output":18,"materializer":4,"rate_weight":null,"rate_calls":true},{"type":"object","title":"object_16","runtime":1,"policies":[],"config":{},"properties":{"fromString":17},"required":[]},{"type":"string","title":"string_15","runtime":1,"policies":[],"config":{}},{"type":"optional","title":"optional_17","runtime":1,"policies":[],"config":{},"item":4,"default_value":null},{"type":"function","title":"function_22","runtime":1,"policies":[0],"config":{},"input":20,"output":22,"materializer":5,"rate_weight":null,"rate_calls":true},{"type":"object","title":"object_20","runtime":1,"policies":[],"config":{},"properties":{"name":21},"required":[]},{"type":"string","title":"string_19","runtime":1,"policies":[],"config":{}},{"type":"integer","title":"integer_21","runtime":1,"policies":[],"config":{}}],"materializers":[{"name":"function","runtime":0,"data":{"script":"var _my_lambda=(_args,{context})=>context.user===\"admin\";","serial":false}},{"name":"typegraphs","runtime":1,"data":{"serial":false}},{"name":"serializedTypegraph","runtime":1,"data":{"serial":false}},{"name":"typegraph","runtime":1,"data":{"serial":false}},{"name":"addTypegraph","runtime":1,"data":{"serial":true}},{"name":"removeTypegraph","runtime":1,"data":{"serial":true}}],"runtimes":[{"name":"deno","data":{"worker":"default","permissions":{}}},{"name":"typegate","data":{}}],"policies":[{"name":"admin_only","materializer":0}],"meta":{"secrets":[],"cors":{"allow_origin":["*"],"allow_headers":["*"],"expose_headers":[],"allow_methods":[],"allow_credentials":true,"max_age":null},"auths":[{"name":"basic","protocol":"basic","auth_data":{"users":["admin"]}}],"rate":{"window_limit":128,"window_sec":60,"query_limit":8,"context_identifier":"user","local_excess":5},"version":"0.0.1"}} diff --git a/typegate/src/types/typegraph.ts b/typegate/src/types/typegraph.ts new file mode 100644 index 0000000000..31aa992209 --- /dev/null +++ b/typegate/src/types/typegraph.ts @@ -0,0 +1,214 @@ +// Copyright Metatype OÜ under the Elastic License 2.0 (ELv2). See LICENSE.md for usage. + +// deno-lint-ignore-file no-explicit-any + +export type AuthProtocol = "oauth2" | "jwk" | "basic"; +export type OptionalNode = { + config?: { + [k: string]: unknown; + }; + default_value?: any; + description?: string | null; + enum?: any[] | null; + inject?: any; + injection?: string | null; + item: number; + policies: number[]; + runtime: number; + title: string; + type: "optional"; +}; +export type BooleanNode = { + config?: { + [k: string]: unknown; + }; + description?: string | null; + enum?: any[] | null; + inject?: any; + injection?: string | null; + policies: number[]; + runtime: number; + title: string; + type: "boolean"; +}; +export type NumberNode = { + config?: { + [k: string]: unknown; + }; + description?: string | null; + enum?: any[] | null; + exclusiveMaximum?: number | null; + exclusiveMinimum?: number | null; + inject?: any; + injection?: string | null; + maximum?: number | null; + minimum?: number | null; + multipleOf?: number | null; + policies: number[]; + runtime: number; + title: string; + type: "number"; +}; +export type IntegerNode = { + config?: { + [k: string]: unknown; + }; + description?: string | null; + enum?: any[] | null; + exclusiveMaximum?: number | null; + exclusiveMinimum?: number | null; + inject?: any; + injection?: string | null; + maximum?: number | null; + minimum?: number | null; + multipleOf?: number | null; + policies: number[]; + runtime: number; + title: string; + type: "integer"; +}; +export type StringNode = { + config?: { + [k: string]: unknown; + }; + description?: string | null; + enum?: any[] | null; + format?: string | null; + inject?: any; + injection?: string | null; + maxLength?: number | null; + minLength?: number | null; + pattern?: string | null; + policies: number[]; + runtime: number; + title: string; + type: "string"; +}; +export type ObjectNode = { + config?: { + [k: string]: unknown; + }; + description?: string | null; + enum?: any[] | null; + inject?: any; + injection?: string | null; + policies: number[]; + properties: { + [k: string]: number; + }; + required?: string[]; + runtime: number; + title: string; + type: "object"; +}; +export type ArrayNode = { + config?: { + [k: string]: unknown; + }; + description?: string | null; + enum?: any[] | null; + inject?: any; + injection?: string | null; + items: number; + maxItems?: number | null; + minItems?: number | null; + policies: number[]; + runtime: number; + title: string; + type: "array"; + uniqueItems?: boolean | null; +}; +export type FunctionNode = { + config?: { + [k: string]: unknown; + }; + description?: string | null; + enum?: any[] | null; + inject?: any; + injection?: string | null; + input: number; + materializer: number; + output: number; + policies: number[]; + rate_calls: boolean; + rate_weight?: number | null; + runtime: number; + title: string; + type: "function"; +}; +export type AnyNode = { + config?: { + [k: string]: unknown; + }; + description?: string | null; + enum?: any[] | null; + inject?: any; + injection?: string | null; + policies: number[]; + runtime: number; + title: string; + type: "any"; +}; +export type TypeNode = + | OptionalNode + | BooleanNode + | NumberNode + | IntegerNode + | StringNode + | ObjectNode + | ArrayNode + | FunctionNode + | AnyNode; +export interface Typegraph { + materializers: Materializer[]; + meta: TypeMeta; + policies: Policy[]; + runtimes: TGRuntime[]; + types: TypeNode[]; +} +export interface Materializer { + data: { + [k: string]: unknown; + }; + name: string; + runtime: number; +} +export interface TypeMeta { + auths: Auth[]; + cors: Cors; + rate?: Rate | null; + secrets: string[]; + version: string; +} +export interface Auth { + auth_data: { + [k: string]: unknown; + }; + name: string; + protocol: AuthProtocol; +} +export interface Cors { + allow_credentials: boolean; + allow_headers: string[]; + allow_methods?: string[]; + allow_origin: string[]; + expose_headers: string[]; + max_age?: number | null; +} +export interface Rate { + context_identifier?: string | null; + local_excess: number; + query_limit: number; + window_limit: number; + window_sec: number; +} +export interface Policy { + materializer: number; + name: string; +} +export interface TGRuntime { + data: { + [k: string]: unknown; + }; + name: string; +} diff --git a/website/static/typegraph.json b/website/static/typegraph.json index 1807e53b91..6622f9ffba 100644 --- a/website/static/typegraph.json +++ b/website/static/typegraph.json @@ -3,13 +3,14 @@ "title": "Typegraph", "type": "object", "required": [ + "materializers", "meta", + "policies", "runtimes", "types" ], "properties": { "materializers": { - "default": [], "type": "array", "items": { "$ref": "#/definitions/Materializer" @@ -19,7 +20,6 @@ "$ref": "#/definitions/TypeMeta" }, "policies": { - "default": [], "type": "array", "items": { "$ref": "#/definitions/Policy" @@ -55,10 +55,18 @@ "type": "string" }, "protocol": { - "type": "string" + "$ref": "#/definitions/AuthProtocol" } } }, + "AuthProtocol": { + "type": "string", + "enum": [ + "oauth2", + "jwk", + "basic" + ] + }, "Cors": { "type": "object", "required": [ @@ -77,6 +85,13 @@ "type": "string" } }, + "allow_methods": { + "default": [], + "type": "array", + "items": { + "type": "string" + } + }, "allow_origin": { "type": "array", "items": { @@ -263,9 +278,7 @@ ], "items": true }, - "inject": { - "default": null - }, + "inject": true, "injection": { "default": null, "type": [ @@ -331,9 +344,7 @@ ], "items": true }, - "inject": { - "default": null - }, + "inject": true, "injection": { "default": null, "type": [ @@ -408,9 +419,7 @@ ], "format": "double" }, - "inject": { - "default": null - }, + "inject": true, "injection": { "default": null, "type": [ @@ -506,9 +515,7 @@ ], "format": "int64" }, - "inject": { - "default": null - }, + "inject": true, "injection": { "default": null, "type": [ @@ -596,9 +603,7 @@ "null" ] }, - "inject": { - "default": null - }, + "inject": true, "injection": { "default": null, "type": [ @@ -680,9 +685,7 @@ ], "items": true }, - "inject": { - "default": null - }, + "inject": true, "injection": { "default": null, "type": [ @@ -759,9 +762,7 @@ ], "items": true }, - "inject": { - "default": null - }, + "inject": true, "injection": { "default": null, "type": [ @@ -853,9 +854,7 @@ ], "items": true }, - "inject": { - "default": null - }, + "inject": true, "injection": { "default": null, "type": [ @@ -942,9 +941,7 @@ ], "items": true }, - "inject": { - "default": null - }, + "inject": true, "injection": { "default": null, "type": [ diff --git a/whiz.yaml b/whiz.yaml index 23559bc33a..2ece4023e3 100644 --- a/whiz.yaml +++ b/whiz.yaml @@ -52,7 +52,8 @@ libs: workdir: libs watches: - common/**/*.rs - shell: "cargo build -p common" + - typescript/**/*.rs + shell: "cargo build -p common -p typescript" codegen: depends_on: @@ -62,6 +63,7 @@ codegen: - "libs/xtask/src/**/*.rs" envs: TG_JSONSCHEMA_OUT: website/static/typegraph.json + TG_TYPESCRIPT_OUT: typegate/src/types/typegraph.ts shell: "cargo run --package xtask -- codegen" clean_deno_bindgen_cache: @@ -92,14 +94,7 @@ website: - website_deps website_meta: - workdir: . - watches: - - "meta-cli/src/**/*.rs" - - "website/**/*.py" - shell: "cargo run -p meta-cli -- -C website dev -u admin -p password --port 5001" - envs: - VIRTUAL_ENV: $PWD/examples/.venv - PATH: $PWD/examples/.venv/bin:$PATH + workdir: website + shell: "cargo run -p meta-cli -- dev -u admin -p password --port 5001" depends_on: - - libs - - typegate_native + - meta