From 2aaa4263918427ee5164f12573e1dd719d365a1b Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Tue, 11 Jan 2022 18:37:07 -0800 Subject: [PATCH 01/40] Add support for relay compiler imports --- packages/next-swc/crates/core/src/lib.rs | 8 + packages/next-swc/crates/core/src/relay.rs | 158 ++++++++++++++++++ .../next-swc/crates/core/tests/fixture.rs | 39 +++++ .../tests/fixture/relay/artifact-dir/input.js | 7 + .../fixture/relay/artifact-dir/output.js | 3 + .../fixture/relay/no-artifact-dir/input.js | 7 + .../fixture/relay/no-artifact-dir/output.js | 3 + 7 files changed, 225 insertions(+) create mode 100644 packages/next-swc/crates/core/src/relay.rs create mode 100644 packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/input.js create mode 100644 packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/output.js create mode 100644 packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/input.js create mode 100644 packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/output.js diff --git a/packages/next-swc/crates/core/src/lib.rs b/packages/next-swc/crates/core/src/lib.rs index 1a36b3b2b5693e0..e511f7a9feef8bb 100644 --- a/packages/next-swc/crates/core/src/lib.rs +++ b/packages/next-swc/crates/core/src/lib.rs @@ -53,6 +53,7 @@ pub mod next_dynamic; pub mod next_ssg; pub mod page_config; pub mod react_remove_properties; +pub mod relay; pub mod remove_console; pub mod shake_exports; pub mod styled_jsx; @@ -91,6 +92,9 @@ pub struct TransformOptions { #[serde(default)] pub react_remove_properties: Option, + #[serde(default)] + pub relay: Option, + #[serde(default)] pub shake_exports: Option, } @@ -130,6 +134,10 @@ pub fn custom_before_pass( page_config::page_config(opts.is_development, opts.is_page_file), !opts.disable_page_config ), + match &opts.relay { + Some(config) => Either::Left(relay::relay(config.clone(), file.name.clone())), + _ => Either::Right(noop()), + }, match &opts.remove_console { Some(config) if config.truthy() => Either::Left(remove_console::remove_console(config.clone())), diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs new file mode 100644 index 000000000000000..fee27621067f821 --- /dev/null +++ b/packages/next-swc/crates/core/src/relay.rs @@ -0,0 +1,158 @@ +use std::fmt::format; +use std::path::{Path, PathBuf}; +use std::sync::Arc; + +use pathdiff::diff_paths; +use serde::Deserialize; +use swc_atoms::{js_word, JsWord}; +use swc_common::collections::AHashSet; +use swc_common::FileName::Real; +use swc_common::{FileName, SourceFile, Span, DUMMY_SP}; +use swc_ecmascript::ast::*; +use swc_ecmascript::utils::ident::IdentLike; +use swc_ecmascript::utils::Id; +use swc_ecmascript::visit::{noop_fold_type, Fold, FoldWith}; + +#[derive(Clone, Debug, Deserialize)] +pub enum RelayLanguageConfig { + TypeScript, + Flow, + JavaScript, +} + +#[derive(Clone, Debug, Deserialize)] +pub struct Config { + pub artifact_directory: Option, + pub language: RelayLanguageConfig, +} + +impl Config { + fn default() -> Self { + Self { + artifact_directory: None, + language: RelayLanguageConfig::JavaScript, + } + } + + fn file_extension(&mut self) -> &'static str { + match self.language { + RelayLanguageConfig::TypeScript => "ts", + RelayLanguageConfig::Flow => "js", + RelayLanguageConfig::JavaScript => "js", + } + } +} + +#[derive(Clone, Debug, Deserialize)] +pub struct Options { + #[serde(default)] + pub exclude: Vec, +} + +struct Relay { + config: Config, + file_name: FileName, +} + +fn pull_first_operation_name_from_tpl(tpl: TaggedTpl) -> Option { + tpl.tpl + .quasis + .into_iter() + .filter_map(|quasis| { + let template_string_content = String::from(quasis.raw.value.to_string()); + let split_content = template_string_content.split(" ").collect::>(); + + let operation = split_content + .chunks(2) + .filter_map(|slice| { + if slice.len() == 1 { + return None; + } + + let word = slice[0]; + let next_word = slice[1]; + + if word == "query" { + return Some(String::from(next_word)); + } + + None + }) + .next(); + + return operation; + }) + .next() +} + +fn build_require_expr_from_path(path: String) -> Expr { + Expr::Call(CallExpr { + span: Default::default(), + callee: ExprOrSuper::Expr(Box::new(Expr::Ident(Ident::new( + js_word!("require"), + Span::default(), + )))), + args: vec![ExprOrSpread { + spread: None, + expr: Box::new(Expr::Lit(Lit::Str(Str { + span: Default::default(), + value: JsWord::from(path), + has_escape: false, + kind: Default::default(), + }))), + }], + type_args: None, + }) +} + +impl Fold for Relay { + noop_fold_type!(); + + fn fold_expr(&mut self, n: Expr) -> Expr { + if let Expr::TaggedTpl(tpl) = n.clone() { + let operation_name = pull_first_operation_name_from_tpl(tpl); + + if let (Some(operation_name), Real(source_path_buf)) = + (operation_name, self.file_name.clone()) + { + let path_to_source_dir = source_path_buf.parent().unwrap(); + let generated_file_name = format!( + "{}.graphql.{}", + operation_name, + self.config.file_extension().clone() + ); + + let fully_qualified_require_path = match self.config.artifact_directory.clone() { + Some(artifact_directory) => std::env::current_dir() + .unwrap() + .join(artifact_directory) + .join(generated_file_name), + _ => path_to_source_dir + .clone() + .join("__generated__") + .join(generated_file_name), + }; + + let mut require_path = String::from( + diff_paths(fully_qualified_require_path, path_to_source_dir) + .unwrap() + .to_str() + .unwrap(), + ); + + if !require_path.starts_with(".") { + require_path = format!("./{}", require_path); + } + + return build_require_expr_from_path(require_path); + } + } + + n + } +} + +pub fn relay(config: Config, file_name: FileName) -> impl Fold { + println!("NOW IM HERE THO"); + Relay { config, file_name } +} diff --git a/packages/next-swc/crates/core/tests/fixture.rs b/packages/next-swc/crates/core/tests/fixture.rs index e43e4a48a9cf822..aef09f55061fda8 100644 --- a/packages/next-swc/crates/core/tests/fixture.rs +++ b/packages/next-swc/crates/core/tests/fixture.rs @@ -1,3 +1,4 @@ +use next_swc::relay::{relay, RelayLanguageConfig}; use next_swc::{ amp_attributes::amp_attributes, next_dynamic::next_dynamic, @@ -135,6 +136,44 @@ fn page_config_fixture(input: PathBuf) { test_fixture(syntax(), &|_tr| page_config_test(), &input, &output); } +#[fixture("tests/fixture/relay/no-artifact-dir/**/input.js")] +fn relay_no_artifact_dir_fixture(input: PathBuf) { + let output = input.parent().unwrap().join("output.js"); + test_fixture( + syntax(), + &|_tr| { + relay( + next_swc::relay::Config { + artifact_directory: None, + language: RelayLanguageConfig::TypeScript, + }, + FileName::Real(PathBuf::from(input.clone())), + ) + }, + &input, + &output, + ); +} + +#[fixture("tests/fixture/relay/artifact-dir/**/input.js")] +fn relay_fixture(input: PathBuf) { + let output = input.parent().unwrap().join("output.js"); + test_fixture( + syntax(), + &|_tr| { + relay( + next_swc::relay::Config { + artifact_directory: Some(PathBuf::from("some/generated/dir")), + language: RelayLanguageConfig::TypeScript, + }, + FileName::Real(PathBuf::from(input.clone())), + ) + }, + &input, + &output, + ); +} + #[fixture("tests/fixture/remove-console/**/input.js")] fn remove_console_fixture(input: PathBuf) { let output = input.parent().unwrap().join("output.js"); diff --git a/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/input.js b/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/input.js new file mode 100644 index 000000000000000..8a21274fdeda873 --- /dev/null +++ b/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/input.js @@ -0,0 +1,7 @@ +const query = graphql` + query HelloWorldQuery { + a + } +`; + +console.log(query); \ No newline at end of file diff --git a/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/output.js b/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/output.js new file mode 100644 index 000000000000000..b373c641729de76 --- /dev/null +++ b/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/output.js @@ -0,0 +1,3 @@ +const query = require('../../../../../../some/generated/dir/HelloWorldQuery.graphql.ts'); + +console.log(query); \ No newline at end of file diff --git a/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/input.js b/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/input.js new file mode 100644 index 000000000000000..8a21274fdeda873 --- /dev/null +++ b/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/input.js @@ -0,0 +1,7 @@ +const query = graphql` + query HelloWorldQuery { + a + } +`; + +console.log(query); \ No newline at end of file diff --git a/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/output.js b/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/output.js new file mode 100644 index 000000000000000..2ef3f75f3989907 --- /dev/null +++ b/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/output.js @@ -0,0 +1,3 @@ +const query = require('./__generated__/HelloWorldQuery.graphql.ts'); + +console.log(query); \ No newline at end of file From f794fcf499293d5e13cd862f86e345b255ce7083 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Wed, 12 Jan 2022 00:04:25 -0800 Subject: [PATCH 02/40] Add relay deps for integration tests --- package.json | 3 +++ yarn.lock | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 75 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 14127fa457211a1..e45826e4256552d 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "@types/http-proxy": "1.17.3", "@types/jest": "24.0.13", "@types/node": "13.11.0", + "@types/relay-runtime": "13.0.0", "@types/selenium-webdriver": "4.0.15", "@types/sharp": "0.29.3", "@types/string-hash": "1.1.1", @@ -145,6 +146,8 @@ "react-dom": "17.0.2", "react-dom-18": "npm:react-dom@18.0.0-rc.0", "react-ssr-prepass": "1.0.8", + "relay-compiler": "13.0.1", + "relay-runtime": "13.0.1", "release": "6.3.0", "request-promise-core": "1.1.2", "resolve-from": "5.0.0", diff --git a/yarn.lock b/yarn.lock index e11c7c225f34bdb..76519225853785c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2260,6 +2260,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" + integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/runtime@^7.10.2": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.13.tgz#0a21452352b02542db0ffb928ac2d3ca7cb6d66d" @@ -4794,6 +4801,11 @@ "@types/prop-types" "*" csstype "^2.2.0" +"@types/relay-runtime@13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@types/relay-runtime/-/relay-runtime-13.0.0.tgz#d0009275522ff826f2e4dab40419f2db58417ecf" + integrity sha512-yzv6F8EZPWA2rtfFP2qMluS8tsz1q4lfdYxLegCshdAjX5uqxTR2pAliATj9wrzD6OMZF4fl9aU+Y+zmSfm2EA== + "@types/resolve@1.17.1": version "1.17.1" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" @@ -7856,6 +7868,13 @@ cross-fetch@3.0.6, cross-fetch@^3.0.6: dependencies: node-fetch "2.6.1" +cross-fetch@^3.0.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" + integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== + dependencies: + node-fetch "2.6.1" + cross-spawn-async@^2.1.1: version "2.2.5" resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" @@ -9729,6 +9748,24 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.2.tgz#dfae08a85c66a58372993ce2caf30863f569ff94" + integrity sha512-qv+boqYndjElAJHNN3NoM8XuwQZ1j2m3kEvTgdle8IDjr6oUbkEpvABWtj/rQl3vq4ew7dnElBxL4YJAwTVqQQ== + dependencies: + cross-fetch "^3.0.4" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.30" + fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -11428,6 +11465,13 @@ interpret@^2.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" @@ -13396,7 +13440,7 @@ longest-streak@^2.0.0: resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== -loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" dependencies: @@ -16653,6 +16697,13 @@ promise@8.0.1: dependencies: asap "~2.0.3" +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + prompts@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.1.0.tgz#bf90bc71f6065d255ea2bdc0fe6520485c1b45db" @@ -17383,6 +17434,20 @@ rehype-retext@^2.0.1: dependencies: hast-util-to-nlcst "^1.0.0" +relay-compiler@13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/relay-compiler/-/relay-compiler-13.0.1.tgz#09c713647aa7e1d8cf3de9f7fb4ee6a76b32cf26" + integrity sha512-C/qJ7IdfZ140b9JaNpuAP6WhV/Odt/tIq4sUZoTwsaOlhs+1Zu3fvIOoWKTnZT5PC6krRuw1hD7GSX6/paVpTQ== + +relay-runtime@13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-13.0.1.tgz#7e59a07c3b4e8c58d04bc94f6f978822d4128ffb" + integrity sha512-n/+J8PFfLFPVUcz9OG/z2i+adnfk0INwlTkVTw0V6KJe9NI9plc5eRCJwzzwspT4pdCkis5Lcjzvzp4H+0zn8g== + dependencies: + "@babel/runtime" "^7.0.0" + fbjs "^3.0.2" + invariant "^2.2.4" + release@6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/release/-/release-6.3.0.tgz#bbd351d7460948f1ed55ea02b4b2393f98a1637a" @@ -18141,7 +18206,7 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@1.0.5, setimmediate@^1.0.4: +setimmediate@1.0.5, setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= @@ -19796,6 +19861,11 @@ ua-parser-js@0.7.28: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== +ua-parser-js@^0.7.30: + version "0.7.31" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" + integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== + uglify-js@^3.1.4: version "3.7.3" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.3.tgz#f918fce9182f466d5140f24bb0ff35c2d32dcc6a" From 6c966d2bb28b7500be24b98d12dde30023760aa1 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Wed, 12 Jan 2022 00:04:58 -0800 Subject: [PATCH 03/40] Add integration test for Relay SWC Compiler --- .../__generated__/pagesQuery.graphql.ts | 63 +++++++++++++++++++ .../relay-graphql-swc/next.config.js | 9 +++ .../relay-graphql-swc/pages/api/query.ts | 12 ++++ .../relay-graphql-swc/pages/index.tsx | 63 +++++++++++++++++++ test/integration/relay-graphql-swc/relay.json | 6 ++ .../relay-graphql-swc/schema.graphql | 3 + .../relay-graphql-swc/test/index.test.js | 45 +++++++++++++ .../relay-graphql-swc/tsconfig.json | 21 +++++++ 8 files changed, 222 insertions(+) create mode 100644 test/integration/relay-graphql-swc/__generated__/pagesQuery.graphql.ts create mode 100644 test/integration/relay-graphql-swc/next.config.js create mode 100644 test/integration/relay-graphql-swc/pages/api/query.ts create mode 100644 test/integration/relay-graphql-swc/pages/index.tsx create mode 100644 test/integration/relay-graphql-swc/relay.json create mode 100644 test/integration/relay-graphql-swc/schema.graphql create mode 100644 test/integration/relay-graphql-swc/test/index.test.js create mode 100644 test/integration/relay-graphql-swc/tsconfig.json diff --git a/test/integration/relay-graphql-swc/__generated__/pagesQuery.graphql.ts b/test/integration/relay-graphql-swc/__generated__/pagesQuery.graphql.ts new file mode 100644 index 000000000000000..3963e412c615149 --- /dev/null +++ b/test/integration/relay-graphql-swc/__generated__/pagesQuery.graphql.ts @@ -0,0 +1,63 @@ +/** + * @generated SignedSource<<187ead9fb6e7b26d71c9161bda6ab902>> + * @lightSyntaxTransform + * @nogrep + */ + +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck + +import { ConcreteRequest, Query } from 'relay-runtime' +export type pagesQuery$variables = {} +export type pagesQueryVariables = pagesQuery$variables +export type pagesQuery$data = { + readonly greeting: string +} +export type pagesQueryResponse = pagesQuery$data +export type pagesQuery = { + variables: pagesQueryVariables + response: pagesQuery$data +} + +const node: ConcreteRequest = (function () { + var v0 = [ + { + alias: null, + args: null, + kind: 'ScalarField', + name: 'greeting', + storageKey: null, + }, + ] + return { + fragment: { + argumentDefinitions: [], + kind: 'Fragment', + metadata: null, + name: 'pagesQuery', + selections: v0 /*: any*/, + type: 'Query', + abstractKey: null, + }, + kind: 'Request', + operation: { + argumentDefinitions: [], + kind: 'Operation', + name: 'pagesQuery', + selections: v0 /*: any*/, + }, + params: { + cacheID: '167b6de16340efeb876a7787c90e7cec', + id: null, + metadata: {}, + name: 'pagesQuery', + operationKind: 'query', + text: 'query pagesQuery {\n greeting\n}\n', + }, + } +})() + +;(node as any).hash = '4017856344f36f61252354e2eb442d98' + +export default node diff --git a/test/integration/relay-graphql-swc/next.config.js b/test/integration/relay-graphql-swc/next.config.js new file mode 100644 index 000000000000000..961a6179e4461c1 --- /dev/null +++ b/test/integration/relay-graphql-swc/next.config.js @@ -0,0 +1,9 @@ +module.exports = { + experimental: { + relay: { + language: 'typescript', + artifact_directory: + '../../test/integration/relay-graphql-swc/__generated__', + }, + }, +} diff --git a/test/integration/relay-graphql-swc/pages/api/query.ts b/test/integration/relay-graphql-swc/pages/api/query.ts new file mode 100644 index 000000000000000..5ad51e06bc09b14 --- /dev/null +++ b/test/integration/relay-graphql-swc/pages/api/query.ts @@ -0,0 +1,12 @@ +import { NextApiRequest, NextApiResponse } from 'next' + +export default function handler( + req: NextApiRequest, + res: NextApiResponse<{ data: { greeting: string } }> +) { + res.status(200).json({ + data: { + greeting: 'Hello, World!', + }, + }) +} diff --git a/test/integration/relay-graphql-swc/pages/index.tsx b/test/integration/relay-graphql-swc/pages/index.tsx new file mode 100644 index 000000000000000..5b586d43dbd96c3 --- /dev/null +++ b/test/integration/relay-graphql-swc/pages/index.tsx @@ -0,0 +1,63 @@ +import { + Environment, + FetchFunction, + fetchQuery, + graphql, + Network, + RecordSource, + Store, +} from 'relay-runtime' +import { GetServerSideProps } from 'next' +import { pagesQuery } from '../__generated__/pagesQuery.graphql' + +type Props = { greeting: string } + +export default function Index({ greeting }: Props) { + return

{greeting}

+} + +function createGraphQLFetcher(host: string | undefined): FetchFunction { + return async function fetchGraphQL(params, variables) { + const url = host ? `http://${host}/api/query` : `/api/query` + + const response = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query: params.text, + variables, + }), + }) + + return await response.json() + } +} + +export const getServerSideProps: GetServerSideProps = async ({ req }) => { + const environment = new Environment({ + store: new Store(new RecordSource({}), {}), + network: Network.create(createGraphQLFetcher(req.headers.host)), + }) + + const result = await fetchQuery( + environment, + graphql` + query pagesQuery { + greeting + } + `, + {} + ).toPromise() + + if (!result) { + throw new Error( + 'Mock GraphQL Server network request finished without a response!' + ) + } + + return { + props: { greeting: result.greeting }, + } +} diff --git a/test/integration/relay-graphql-swc/relay.json b/test/integration/relay-graphql-swc/relay.json new file mode 100644 index 000000000000000..999698319a66abe --- /dev/null +++ b/test/integration/relay-graphql-swc/relay.json @@ -0,0 +1,6 @@ +{ + "src": "pages", + "schema": "./schema.graphql", + "artifactDirectory": "./__generated__", + "language": "typescript" +} diff --git a/test/integration/relay-graphql-swc/schema.graphql b/test/integration/relay-graphql-swc/schema.graphql new file mode 100644 index 000000000000000..80b6478dc91e585 --- /dev/null +++ b/test/integration/relay-graphql-swc/schema.graphql @@ -0,0 +1,3 @@ +type Query { + greeting: String! +} \ No newline at end of file diff --git a/test/integration/relay-graphql-swc/test/index.test.js b/test/integration/relay-graphql-swc/test/index.test.js new file mode 100644 index 000000000000000..bf1a5fdee3283e5 --- /dev/null +++ b/test/integration/relay-graphql-swc/test/index.test.js @@ -0,0 +1,45 @@ +/* eslint-env jest */ +import { join } from 'path' +import { + findPort, + killApp, + launchApp, + nextBuild, + nextStart, + renderViaHTTP, +} from 'next-test-utils' + +let app +let appPort +const appDir = join(__dirname, '../') + +const runTests = () => { + it('should resolve index page correctly', async () => { + const html = await renderViaHTTP(appPort, '/') + expect(html).toContain('Hello, World!') + }) +} + +describe('Error no pageProps', () => { + describe.only('dev mode', () => { + beforeAll(async () => { + appPort = await findPort() + app = await launchApp(appDir, appPort) + }) + afterAll(() => killApp(app)) + + runTests() + }) + + describe('production mode', () => { + beforeAll(async () => { + await nextBuild(appDir) + appPort = await findPort() + app = await nextStart(appDir, appPort) + }) + + afterAll(() => killApp(app)) + + runTests() + }) +}) diff --git a/test/integration/relay-graphql-swc/tsconfig.json b/test/integration/relay-graphql-swc/tsconfig.json new file mode 100644 index 000000000000000..80ded17adda9c51 --- /dev/null +++ b/test/integration/relay-graphql-swc/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "esModuleInterop": true, + "module": "esnext", + "jsx": "preserve", + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "incremental": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true + }, + "exclude": ["node_modules"], + "include": ["next-env.d.ts", "pages", "api"] +} From 8ee3e6c668053797c3ffad9f58a6f0ce4fdd782e Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Wed, 12 Jan 2022 19:20:21 -0800 Subject: [PATCH 04/40] More exhaustive tests --- .../next-swc/crates/core/tests/fixture.rs | 16 ++++--- .../tests/fixture/relay/artifact-dir/input.js | 7 ---- .../fixture/relay/artifact-dir/input.tsx | 42 +++++++++++++++++++ .../fixture/relay/artifact-dir/output.js | 13 ++++-- .../fixture/relay/no-artifact-dir/input.js | 7 ---- .../fixture/relay/no-artifact-dir/input.tsx | 42 +++++++++++++++++++ .../fixture/relay/no-artifact-dir/output.js | 16 +++++-- 7 files changed, 118 insertions(+), 25 deletions(-) delete mode 100644 packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/input.js create mode 100644 packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/input.tsx delete mode 100644 packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/input.js create mode 100644 packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/input.tsx diff --git a/packages/next-swc/crates/core/tests/fixture.rs b/packages/next-swc/crates/core/tests/fixture.rs index aef09f55061fda8..22d23b3ec6490d2 100644 --- a/packages/next-swc/crates/core/tests/fixture.rs +++ b/packages/next-swc/crates/core/tests/fixture.rs @@ -12,6 +12,7 @@ use next_swc::{ use std::path::PathBuf; use swc_common::{chain, comments::SingleThreadedComments, FileName, Mark, Span, DUMMY_SP}; use swc_ecma_transforms_testing::{test, test_fixture}; +use swc_ecmascript::parser::TsConfig; use swc_ecmascript::{ parser::{EsConfig, Syntax}, transforms::{react::jsx, resolver}, @@ -136,7 +137,7 @@ fn page_config_fixture(input: PathBuf) { test_fixture(syntax(), &|_tr| page_config_test(), &input, &output); } -#[fixture("tests/fixture/relay/no-artifact-dir/**/input.js")] +#[fixture("tests/fixture/relay/no-artifact-dir/**/input.ts*")] fn relay_no_artifact_dir_fixture(input: PathBuf) { let output = input.parent().unwrap().join("output.js"); test_fixture( @@ -145,7 +146,7 @@ fn relay_no_artifact_dir_fixture(input: PathBuf) { relay( next_swc::relay::Config { artifact_directory: None, - language: RelayLanguageConfig::TypeScript, + language: RelayLanguageConfig::Typescript, }, FileName::Real(PathBuf::from(input.clone())), ) @@ -155,16 +156,21 @@ fn relay_no_artifact_dir_fixture(input: PathBuf) { ); } -#[fixture("tests/fixture/relay/artifact-dir/**/input.js")] +#[fixture("tests/fixture/relay/artifact-dir/**/input.ts*")] fn relay_fixture(input: PathBuf) { let output = input.parent().unwrap().join("output.js"); test_fixture( - syntax(), + Syntax::Typescript(TsConfig { + tsx: true, + decorators: false, + dts: false, + no_early_errors: false, + }), &|_tr| { relay( next_swc::relay::Config { artifact_directory: Some(PathBuf::from("some/generated/dir")), - language: RelayLanguageConfig::TypeScript, + language: RelayLanguageConfig::Typescript, }, FileName::Real(PathBuf::from(input.clone())), ) diff --git a/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/input.js b/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/input.js deleted file mode 100644 index 8a21274fdeda873..000000000000000 --- a/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/input.js +++ /dev/null @@ -1,7 +0,0 @@ -const query = graphql` - query HelloWorldQuery { - a - } -`; - -console.log(query); \ No newline at end of file diff --git a/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/input.tsx b/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/input.tsx new file mode 100644 index 000000000000000..1a9ead99155a7ca --- /dev/null +++ b/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/input.tsx @@ -0,0 +1,42 @@ +const variableQuery = graphql` + query InputVariableQuery { + hello + } +` + +fetchQuery(graphql` + query InputUsedInFunctionCallQuery { + hello + } +`) + +function SomeQueryComponent() { + useLazyLoadQuery(graphql` + query InputInHookQuery { + hello + } + `) +} + +const variableMutation = graphql` + query InputVariableMutation { + someMutation + } +` + +commitMutation( + environment, + graphql` + query InputUsedInFunctionCallMutation { + someMutation + } + ` +) + +function SomeMutationComponent() { + useMutation(graphql` + query InputInHookMutation { + someMutation + } + `) +} diff --git a/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/output.js b/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/output.js index b373c641729de76..cc28b024fc0669c 100644 --- a/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/output.js +++ b/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/output.js @@ -1,3 +1,10 @@ -const query = require('../../../../../../some/generated/dir/HelloWorldQuery.graphql.ts'); - -console.log(query); \ No newline at end of file +const variableQuery = require("../../../../../../some/generated/dir/InputVariableQuery.graphql.ts"); +fetchQuery(require("../../../../../../some/generated/dir/InputUsedInFunctionCallQuery.graphql.ts")); +function SomeQueryComponent() { + useLazyLoadQuery(require("../../../../../../some/generated/dir/InputInHookQuery.graphql.ts")); +} +const variableMutation = require("../../../../../../some/generated/dir/InputVariableMutation.graphql.ts"); +commitMutation(environment, require("../../../../../../some/generated/dir/InputUsedInFunctionCallMutation.graphql.ts")); +function SomeMutationComponent() { + useMutation(require("../../../../../../some/generated/dir/InputInHookMutation.graphql.ts")); +} \ No newline at end of file diff --git a/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/input.js b/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/input.js deleted file mode 100644 index 8a21274fdeda873..000000000000000 --- a/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/input.js +++ /dev/null @@ -1,7 +0,0 @@ -const query = graphql` - query HelloWorldQuery { - a - } -`; - -console.log(query); \ No newline at end of file diff --git a/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/input.tsx b/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/input.tsx new file mode 100644 index 000000000000000..8bc789841d4e1eb --- /dev/null +++ b/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/input.tsx @@ -0,0 +1,42 @@ +const variableQuery = graphql` + query InputVariableQuery { + hello + } +` + +fetchQuery(graphql` + query InputUsedInFunctionCallQuery { + hello + } +`) + +function SomeQueryComponent() { + useLazyLoadQuery(graphql` + query InputInHookQuery { + hello + } + `) +} + +const variableMutation = graphql` + query InputVariableMutation { + someMutation + } +` + +commitMutation( + environment, + graphql` + query InputUsedInFunctionCallMutation { + someMutation + } + ` +) + +function SomeMutationComponent() { + useMutation(graphql` + query InputInHookMutation { + someMutation + } + `) +} \ No newline at end of file diff --git a/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/output.js b/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/output.js index 2ef3f75f3989907..72a44bb22ccf983 100644 --- a/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/output.js +++ b/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/output.js @@ -1,3 +1,13 @@ -const query = require('./__generated__/HelloWorldQuery.graphql.ts'); - -console.log(query); \ No newline at end of file +const variableQuery = require('./__generated__/InputVariableQuery.graphql.ts') +fetchQuery(require('./__generated__/InputUsedInFunctionCallQuery.graphql.ts')) +function SomeQueryComponent() { + useLazyLoadQuery(require('./__generated__/InputInHookQuery.graphql.ts')) +} +const variableMutation = require('./__generated__/InputVariableMutation.graphql.ts') +commitMutation( + environment, + require('./__generated__/InputUsedInFunctionCallMutation.graphql.ts') +) +function SomeMutationComponent() { + useMutation(require('./__generated__/InputInHookMutation.graphql.ts')) +} From 46e2534778df8227fecfd0b8da9ac25be14bfd8d Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Wed, 12 Jan 2022 19:22:57 -0800 Subject: [PATCH 05/40] Remove dead code --- packages/next-swc/crates/core/src/relay.rs | 123 +++++++++++---------- 1 file changed, 64 insertions(+), 59 deletions(-) diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index fee27621067f821..b519e065e62551c 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -1,23 +1,18 @@ -use std::fmt::format; -use std::path::{Path, PathBuf}; -use std::sync::Arc; +use std::path::PathBuf; use pathdiff::diff_paths; use serde::Deserialize; use swc_atoms::{js_word, JsWord}; -use swc_common::collections::AHashSet; use swc_common::FileName::Real; -use swc_common::{FileName, SourceFile, Span, DUMMY_SP}; +use swc_common::{FileName, Span}; use swc_ecmascript::ast::*; -use swc_ecmascript::utils::ident::IdentLike; -use swc_ecmascript::utils::Id; -use swc_ecmascript::visit::{noop_fold_type, Fold, FoldWith}; +use swc_ecmascript::visit::{Fold, FoldWith}; #[derive(Clone, Debug, Deserialize)] +#[serde(rename_all = "snake_case")] pub enum RelayLanguageConfig { - TypeScript, + Typescript, Flow, - JavaScript, } #[derive(Clone, Debug, Deserialize)] @@ -27,18 +22,10 @@ pub struct Config { } impl Config { - fn default() -> Self { - Self { - artifact_directory: None, - language: RelayLanguageConfig::JavaScript, - } - } - fn file_extension(&mut self) -> &'static str { match self.language { - RelayLanguageConfig::TypeScript => "ts", + RelayLanguageConfig::Typescript => "ts", RelayLanguageConfig::Flow => "js", - RelayLanguageConfig::JavaScript => "js", } } } @@ -72,7 +59,7 @@ fn pull_first_operation_name_from_tpl(tpl: TaggedTpl) -> Option { let word = slice[0]; let next_word = slice[1]; - if word == "query" { + if word == "query" || word == "subscription" || word == "mutation" { return Some(String::from(next_word)); } @@ -106,53 +93,71 @@ fn build_require_expr_from_path(path: String) -> Expr { } impl Fold for Relay { - noop_fold_type!(); - - fn fold_expr(&mut self, n: Expr) -> Expr { - if let Expr::TaggedTpl(tpl) = n.clone() { - let operation_name = pull_first_operation_name_from_tpl(tpl); - - if let (Some(operation_name), Real(source_path_buf)) = - (operation_name, self.file_name.clone()) - { - let path_to_source_dir = source_path_buf.parent().unwrap(); - let generated_file_name = format!( - "{}.graphql.{}", - operation_name, - self.config.file_extension().clone() - ); - - let fully_qualified_require_path = match self.config.artifact_directory.clone() { - Some(artifact_directory) => std::env::current_dir() - .unwrap() - .join(artifact_directory) - .join(generated_file_name), - _ => path_to_source_dir - .clone() - .join("__generated__") - .join(generated_file_name), - }; - - let mut require_path = String::from( - diff_paths(fully_qualified_require_path, path_to_source_dir) - .unwrap() - .to_str() - .unwrap(), - ); - - if !require_path.starts_with(".") { - require_path = format!("./{}", require_path); + fn fold_expr(&mut self, expr: Expr) -> Expr { + let expr = expr.fold_children_with(self); + + match expr.clone() { + Expr::TaggedTpl(tpl) => { + if let Some(built_expr) = self.build_call_expr_from_tpl(tpl) { + built_expr + } else { + expr } + } + _ => expr, + } + } +} - return build_require_expr_from_path(require_path); +impl Relay { + fn build_call_expr_from_tpl(&mut self, tpl: TaggedTpl) -> Option { + if let Expr::Ident(ident) = *tpl.tag.clone() { + if ident.sym.to_string() != "graphql" { + return None; } } - n + let operation_name = pull_first_operation_name_from_tpl(tpl); + + if let (Some(operation_name), Real(source_path_buf)) = + (operation_name, self.file_name.clone()) + { + let path_to_source_dir = source_path_buf.parent().unwrap(); + let generated_file_name = format!( + "{}.graphql.{}", + operation_name, + self.config.file_extension().clone() + ); + + let fully_qualified_require_path = match self.config.artifact_directory.clone() { + Some(artifact_directory) => std::env::current_dir() + .unwrap() + .join(artifact_directory) + .join(generated_file_name), + _ => path_to_source_dir + .clone() + .join("__generated__") + .join(generated_file_name), + }; + + let mut require_path = String::from( + diff_paths(fully_qualified_require_path, path_to_source_dir) + .unwrap() + .to_str() + .unwrap(), + ); + + if !require_path.starts_with(".") { + require_path = format!("./{}", require_path); + } + + return Some(build_require_expr_from_path(require_path)); + } + + None } } pub fn relay(config: Config, file_name: FileName) -> impl Fold { - println!("NOW IM HERE THO"); Relay { config, file_name } } From 66e6859cd1a34cd13ed81c2189cecbf450721fc9 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Wed, 12 Jan 2022 19:30:02 -0800 Subject: [PATCH 06/40] Pass through relay config from next config --- packages/next/build/swc/options.js | 1 + packages/next/build/webpack-config.ts | 1 + packages/next/server/config-shared.ts | 4 ++++ 3 files changed, 6 insertions(+) diff --git a/packages/next/build/swc/options.js b/packages/next/build/swc/options.js index 103119885e47b0a..27bf7878acce618 100644 --- a/packages/next/build/swc/options.js +++ b/packages/next/build/swc/options.js @@ -75,6 +75,7 @@ function getBaseSWCOptions({ : null, removeConsole: nextConfig?.experimental?.removeConsole, reactRemoveProperties: nextConfig?.experimental?.reactRemoveProperties, + relay: nextConfig?.experimental?.relay, } } diff --git a/packages/next/build/webpack-config.ts b/packages/next/build/webpack-config.ts index bbac49486d94a64..95edeee06d8675b 100644 --- a/packages/next/build/webpack-config.ts +++ b/packages/next/build/webpack-config.ts @@ -1614,6 +1614,7 @@ export default async function getBaseWebpackConfig( removeConsole: config.experimental.removeConsole, reactRemoveProperties: config.experimental.reactRemoveProperties, styledComponents: config.experimental.styledComponents, + relay: config.experimental.relay, }) const cache: any = { diff --git a/packages/next/server/config-shared.ts b/packages/next/server/config-shared.ts index d7270c1612a872d..4788200de37ca69 100644 --- a/packages/next/server/config-shared.ts +++ b/packages/next/server/config-shared.ts @@ -169,6 +169,10 @@ export type NextConfig = { [key: string]: any } & { urlImports?: NonNullable['buildHttp'] outputFileTracingRoot?: string outputStandalone?: boolean + relay?: { + artifactDirectory?: string + language: 'typescript' | 'javascript' + } } } From eb88c71f706bd3c61825f6d00a146603117d1ab1 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Wed, 12 Jan 2022 19:46:16 -0800 Subject: [PATCH 07/40] Run relay compiler when running integration test --- .../relay-graphql-swc/test/index.test.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/test/integration/relay-graphql-swc/test/index.test.js b/test/integration/relay-graphql-swc/test/index.test.js index bf1a5fdee3283e5..5107ddf397fe8ae 100644 --- a/test/integration/relay-graphql-swc/test/index.test.js +++ b/test/integration/relay-graphql-swc/test/index.test.js @@ -1,5 +1,6 @@ /* eslint-env jest */ import { join } from 'path' +import { execSync } from 'child_process' import { findPort, killApp, @@ -20,9 +21,19 @@ const runTests = () => { }) } +const runRelayCompiler = () => { + // Relay expects the current directory to contain a relay.json + // This ensures the CWD is the one with relay.json since running + // the relay-compiler through yarn would make the root of the repo the CWD. + execSync('../../../node_modules/relay-compiler/cli.js relay.json', { + cwd: './test/integration/relay-graphql-swc', + }) +} + describe('Error no pageProps', () => { - describe.only('dev mode', () => { + describe('dev mode', () => { beforeAll(async () => { + runRelayCompiler() appPort = await findPort() app = await launchApp(appDir, appPort) }) @@ -33,6 +44,7 @@ describe('Error no pageProps', () => { describe('production mode', () => { beforeAll(async () => { + runRelayCompiler() await nextBuild(appDir) appPort = await findPort() app = await nextStart(appDir, appPort) From 4ef5e23343b8a3b71746deb0fb1f30db818a405b Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Wed, 12 Jan 2022 19:59:45 -0800 Subject: [PATCH 08/40] Remove more dead code --- packages/next-swc/crates/core/src/relay.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index b519e065e62551c..263ad88a1f3ea8a 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -30,12 +30,6 @@ impl Config { } } -#[derive(Clone, Debug, Deserialize)] -pub struct Options { - #[serde(default)] - pub exclude: Vec, -} - struct Relay { config: Config, file_name: FileName, From 718929c3d0ebf9ab4e8b038a7f42efdc50ef1847 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Thu, 13 Jan 2022 17:47:09 -0800 Subject: [PATCH 09/40] Remove useless to_string and String::from --- packages/next-swc/crates/core/src/relay.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index 263ad88a1f3ea8a..fc33a73b5b9929d 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -40,8 +40,7 @@ fn pull_first_operation_name_from_tpl(tpl: TaggedTpl) -> Option { .quasis .into_iter() .filter_map(|quasis| { - let template_string_content = String::from(quasis.raw.value.to_string()); - let split_content = template_string_content.split(" ").collect::>(); + let split_content = quasis.raw.value.split(" ").collect::>(); let operation = split_content .chunks(2) From 6d03ee9223aac5664a7609afaecf255800d69e11 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Thu, 13 Jan 2022 20:53:17 -0800 Subject: [PATCH 10/40] Remove clone in favor of borrowing --- packages/next-swc/crates/core/src/relay.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index fc33a73b5b9929d..129da1867f2bc3e 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -35,10 +35,10 @@ struct Relay { file_name: FileName, } -fn pull_first_operation_name_from_tpl(tpl: TaggedTpl) -> Option { +fn pull_first_operation_name_from_tpl(tpl: &TaggedTpl) -> Option { tpl.tpl .quasis - .into_iter() + .iter() .filter_map(|quasis| { let split_content = quasis.raw.value.split(" ").collect::>(); @@ -89,7 +89,7 @@ impl Fold for Relay { fn fold_expr(&mut self, expr: Expr) -> Expr { let expr = expr.fold_children_with(self); - match expr.clone() { + match &expr { Expr::TaggedTpl(tpl) => { if let Some(built_expr) = self.build_call_expr_from_tpl(tpl) { built_expr @@ -103,8 +103,8 @@ impl Fold for Relay { } impl Relay { - fn build_call_expr_from_tpl(&mut self, tpl: TaggedTpl) -> Option { - if let Expr::Ident(ident) = *tpl.tag.clone() { + fn build_call_expr_from_tpl(&mut self, tpl: &TaggedTpl) -> Option { + if let Expr::Ident(ident) = &*tpl.tag { if ident.sym.to_string() != "graphql" { return None; } From 523bc25a4182259b48c255472a9e09dfcb3ab43f Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Thu, 13 Jan 2022 20:57:05 -0800 Subject: [PATCH 11/40] Use borrow instead of &* --- packages/next-swc/crates/core/src/relay.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index 129da1867f2bc3e..4581f945db74685 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -1,3 +1,4 @@ +use std::borrow::Borrow; use std::path::PathBuf; use pathdiff::diff_paths; @@ -104,8 +105,8 @@ impl Fold for Relay { impl Relay { fn build_call_expr_from_tpl(&mut self, tpl: &TaggedTpl) -> Option { - if let Expr::Ident(ident) = &*tpl.tag { - if ident.sym.to_string() != "graphql" { + if let Expr::Ident(ident) = tpl.tag.borrow() { + if ident.sym.borrow() != "graphql" { return None; } } From 61826a43971a986f7f1166d8a55d34f8ee18dae9 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Thu, 13 Jan 2022 21:07:14 -0800 Subject: [PATCH 12/40] Removed more clones --- packages/next-swc/crates/core/src/relay.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index 4581f945db74685..c4455608d1af724 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -114,22 +114,21 @@ impl Relay { let operation_name = pull_first_operation_name_from_tpl(tpl); if let (Some(operation_name), Real(source_path_buf)) = - (operation_name, self.file_name.clone()) + (operation_name, self.file_name.borrow()) { let path_to_source_dir = source_path_buf.parent().unwrap(); let generated_file_name = format!( "{}.graphql.{}", operation_name, - self.config.file_extension().clone() + self.config.file_extension() ); - let fully_qualified_require_path = match self.config.artifact_directory.clone() { + let fully_qualified_require_path = match &self.config.artifact_directory { Some(artifact_directory) => std::env::current_dir() .unwrap() .join(artifact_directory) .join(generated_file_name), _ => path_to_source_dir - .clone() .join("__generated__") .join(generated_file_name), }; From eb7daa1b82b2b432d90059a195a94d3d19b2181f Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Thu, 13 Jan 2022 21:48:37 -0800 Subject: [PATCH 13/40] Add relay and remove parking lot core since it doesn't seem like it's being used --- packages/next-swc/Cargo.lock | 1518 +++++++++++++++++++--- packages/next-swc/crates/core/Cargo.toml | 1 + packages/next-swc/crates/wasm/Cargo.toml | 1 - 3 files changed, 1369 insertions(+), 151 deletions(-) diff --git a/packages/next-swc/Cargo.lock b/packages/next-swc/Cargo.lock index 69e5bb882a8f612..634ed2cd6e81972 100644 --- a/packages/next-swc/Cargo.lock +++ b/packages/next-swc/Cargo.lock @@ -33,7 +33,7 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom 0.2.3", + "getrandom 0.2.4", "once_cell", "serde", "version_check", @@ -59,9 +59,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.51" +version = "1.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b26702f315f53b6071259e15dd9d64528213b44d61de1ec926eca7715d62203" +checksum = "84450d0b4a8bd1ba4144ce8ce718fbc5d071358b1e5384bace6536b3d1f2d5b3" [[package]] name = "arrayvec" @@ -89,6 +89,17 @@ dependencies = [ "syn", ] +[[package]] +name = "async-trait" +version = "0.1.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "061a7acccaa286c011ddc30970520b98fa40e00c9d644633fb26b5fc63a265e3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "atty" version = "0.2.14" @@ -145,19 +156,55 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +[[package]] +name = "beef" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "474a626a67200bd107d44179bb3d4fc61891172d11696609264589be6a0e6a43" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "block-buffer" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +dependencies = [ + "block-padding", + "byte-tools", + "byteorder", + "generic-array 0.12.4", +] + [[package]] name = "block-buffer" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "generic-array", + "generic-array 0.14.5", +] + +[[package]] +name = "block-padding" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +dependencies = [ + "byte-tools", ] [[package]] @@ -192,9 +239,15 @@ checksum = "b4ae4235e6dac0694637c763029ecea1a2ec9e4e06ec2729bd21ba4d9c863eb7" [[package]] name = "bumpalo" -version = "3.8.0" +version = "3.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" + +[[package]] +name = "byte-tools" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1e260c3a9040a7c19a12468758f4c16f31a81a1fe087482be9570ec864bb6c" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" [[package]] name = "byteorder" @@ -202,11 +255,33 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "bytes" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" +dependencies = [ + "byteorder", + "iovec", +] + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" +dependencies = [ + "serde", +] + [[package]] name = "cc" version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" +dependencies = [ + "jobserver", +] [[package]] name = "cfg-if" @@ -236,14 +311,52 @@ dependencies = [ ] [[package]] -name = "cloudabi" -version = "0.1.0" +name = "clap" +version = "2.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4344512281c643ae7638bbabc3af17a11307803ec8f0fcad9fae512a8bf36467" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ + "ansi_term", + "atty", "bitflags", + "strsim 0.8.0", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "colored" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4ffc801dacf156c5854b9df4f425a626539c3a6ef7893cc0c5084a23f0b6c59" +dependencies = [ + "atty", + "lazy_static", + "winapi", +] + +[[package]] +name = "common" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "colored", + "indexmap", + "intern", + "log", + "lsp-types", + "md-5", + "rayon", + "serde", ] +[[package]] +name = "common-path" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2382f75942f4b3be3690fe4f86365e9c853c1587d6ee58212cebf6e2a9ccd101" + [[package]] name = "console_error_panic_hook" version = "0.1.7" @@ -254,6 +367,22 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "core-foundation" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + [[package]] name = "cpufeatures" version = "0.2.1" @@ -274,9 +403,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils", @@ -295,9 +424,9 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" +checksum = "97242a70df9b89a65d0b6df3c4bf5b9ce03c5b7309019777fbde37e7537f8762" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils", @@ -308,9 +437,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" +checksum = "cfcae03edb34f947e64acdb1c33ec169824e20657e9ecb61cef6c8c74dcb8120" dependencies = [ "cfg-if 1.0.0", "lazy_static", @@ -352,7 +481,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim", + "strsim 0.9.3", "syn", ] @@ -375,6 +504,8 @@ checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" dependencies = [ "cfg-if 1.0.0", "num_cpus", + "rayon", + "serde", ] [[package]] @@ -386,6 +517,19 @@ dependencies = [ "unreachable", ] +[[package]] +name = "dependency-analyzer" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "fnv", + "graphql-ir", + "graphql-syntax", + "intern", + "relay-transforms", + "schema", +] + [[package]] name = "diff" version = "0.1.12" @@ -398,13 +542,22 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.4", +] + [[package]] name = "digest" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array", + "generic-array 0.14.5", ] [[package]] @@ -431,18 +584,88 @@ dependencies = [ "syn", ] +[[package]] +name = "env_logger" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "errors" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "common", +] + +[[package]] +name = "extract-graphql" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "graphql-syntax", +] + +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" + +[[package]] +name = "fastrand" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "779d043b6a0b90cc4c0ed7ee380a6504394cee7efd7db050e3774eee387324b2" +dependencies = [ + "instant", +] + [[package]] name = "fixedbitset" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" +[[package]] +name = "flatbuffers" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4c5738bcd7fad10315029c50026f83c9da5e4a21f8ed66826f43e0e2bde5f6" +dependencies = [ + "bitflags", + "smallvec", + "thiserror", +] + [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.0.1" @@ -465,6 +688,102 @@ dependencies = [ "syn", ] +[[package]] +name = "futures" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" + +[[package]] +name = "futures" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28560757fe2bb34e79f907794bb6b22ae8b0e5c669b638a1132f2592b19035b4" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3dda0b6588335f360afc675d0564c17a77a2bda81ca178a4b6081bd86c7f0b" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0c8ff0461b82559810cdccfde3215c3f373807f5e5232b71479bff7bb2583d7" + +[[package]] +name = "futures-executor" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29d6d2ff5bb10fb95c85b8ce46538a2e5f5e7fdc755623a7d4529ab8a4ed9d2a" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9d34af5a1aac6fb380f735fe510746c38067c5bf16c7fd250280503c971b2" + +[[package]] +name = "futures-macro" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbd947adfffb0efc70599b3ddcf7b5597bb5fa9e245eb99f62b3a5f7bb8bd3c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3055baccb68d74ff6480350f8d6eb8fcfa3aa11bdc1a1ae3afdd0514617d508" + +[[package]] +name = "futures-task" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ee7c6485c30167ce4dfb83ac568a849fe53274c831081476ee13e0dce1aad72" + +[[package]] +name = "futures-util" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b5cf40b47a271f77a8b1bec03ca09044d99d2372c0de244e66430761127164" +dependencies = [ + "futures 0.1.31", + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + [[package]] name = "fxhash" version = "0.2.1" @@ -476,9 +795,18 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.4" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +dependencies = [ + "typenum", +] + +[[package]] +name = "generic-array" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" dependencies = [ "typenum", "version_check", @@ -497,9 +825,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" dependencies = [ "cfg-if 1.0.0", "libc", @@ -518,6 +846,88 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" +[[package]] +name = "graphql-cli" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "colored", + "common", +] + +[[package]] +name = "graphql-ir" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "common", + "errors", + "fnv", + "graphql-syntax", + "intern", + "lazy_static", + "once_cell", + "schema", + "strsim 0.10.0", + "thiserror", +] + +[[package]] +name = "graphql-syntax" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "common", + "intern", + "logos", + "lsp-types", + "serde", + "thiserror", +] + +[[package]] +name = "graphql-text-printer" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "common", + "fnv", + "graphql-ir", + "graphql-syntax", + "intern", + "schema", +] + +[[package]] +name = "graphql-watchman" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "log", + "serde", + "serde_bser", + "watchman_client", +] + +[[package]] +name = "h2" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9de88456263e249e241fcd211d3954e2c9b0ef7ccfc235a444eb367cae3689" +dependencies = [ + "bytes 1.1.0", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hashbrown" version = "0.11.2" @@ -525,6 +935,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" dependencies = [ "ahash", + "serde", +] + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", ] [[package]] @@ -542,6 +962,86 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "http" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +dependencies = [ + "bytes 1.1.0", + "fnv", + "itoa 1.0.1", +] + +[[package]] +name = "http-body" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +dependencies = [ + "bytes 1.1.0", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "humantime" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" +dependencies = [ + "quick-error", +] + +[[package]] +name = "hyper" +version = "0.14.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7ec3e62bdc98a2f0393a5048e4c30ef659440ea6e0e572965103e72bd836f55" +dependencies = [ + "bytes 1.1.0", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa 0.4.8", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes 1.1.0", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -567,9 +1067,9 @@ checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" [[package]] name = "indexmap" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" dependencies = [ "autocfg", "hashbrown", @@ -578,19 +1078,57 @@ dependencies = [ ] [[package]] -name = "instant" -version = "0.1.12" +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "intern" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "fnv", + "hashbrown", + "indexmap", + "once_cell", + "parking_lot", + "serde", + "serde_bytes", + "serde_derive", + "smallvec", +] + +[[package]] +name = "iovec" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" +dependencies = [ + "libc", +] + +[[package]] +name = "is-macro" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "a322dd16d960e322c3d92f541b4c1a4f0a2e81e1fdeee430d8cecc8b72e8015f" dependencies = [ - "cfg-if 1.0.0", + "Inflector", + "pmutil", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "is-macro" -version = "0.1.9" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a322dd16d960e322c3d92f541b4c1a4f0a2e81e1fdeee430d8cecc8b72e8015f" +checksum = "94b2c46692aee0d1b3aad44e781ac0f0e7db42ef27adaa0a877b627040019813" dependencies = [ "Inflector", "pmutil", @@ -601,9 +1139,9 @@ dependencies = [ [[package]] name = "itertools" -version = "0.10.1" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf" +checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" dependencies = [ "either", ] @@ -614,6 +1152,31 @@ version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" +[[package]] +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + +[[package]] +name = "jobserver" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" +dependencies = [ + "libc", +] + +[[package]] +name = "js-config-loader" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "js-sys" version = "0.3.49" @@ -654,9 +1217,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.108" +version = "0.2.112" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8521a1b57e76b1ec69af7599e75e38e7b7fad6610f037db8c79b127201b5d119" +checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125" [[package]] name = "lock_api" @@ -674,6 +1237,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ "cfg-if 1.0.0", + "value-bag", +] + +[[package]] +name = "logos" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91c49573597a5d6c094f9031617bb1fed15c0db68c81e6546d313414ce107e4" +dependencies = [ + "logos-derive", +] + +[[package]] +name = "logos-derive" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "797b1f8a0571b331c1b47e7db245af3dc634838da7a92b3bef4e30376ae1c347" +dependencies = [ + "beef", + "fnv", + "proc-macro2", + "quote", + "regex-syntax", + "syn", + "utf8-ranges", ] [[package]] @@ -685,6 +1273,25 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "lsp-types" +version = "0.89.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e0dedfd52cc32325598b2631e0eba31b7b708959676a9f837042f276b09a2" +dependencies = [ + "bitflags", + "serde", + "serde_json", + "serde_repr", + "url", +] + +[[package]] +name = "maplit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" + [[package]] name = "matchers" version = "0.1.0" @@ -700,6 +1307,17 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +[[package]] +name = "md-5" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18af3dcaf2b0219366cdb4e2af65a6101457b415c3d1a5c71dd9c2b7c77b9c8" +dependencies = [ + "block-buffer 0.7.3", + "digest 0.8.1", + "opaque-debug 0.2.3", +] + [[package]] name = "memchr" version = "2.4.1" @@ -708,9 +1326,9 @@ checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" [[package]] name = "memoffset" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" dependencies = [ "autocfg", ] @@ -751,6 +1369,28 @@ dependencies = [ "autocfg", ] +[[package]] +name = "mio" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "winapi", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", +] + [[package]] name = "napi" version = "1.8.0" @@ -765,9 +1405,9 @@ dependencies = [ [[package]] name = "napi-build" -version = "1.1.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d46af3cd13ef452354c8704da88bfc4bfa38724ddb38963a5113099749710788" +checksum = "ebd4419172727423cf30351406c54f6cc1b354a2cfb4f1dba3e6cd07f6d5522b" [[package]] name = "napi-derive" @@ -786,6 +1426,24 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67cf20e0081fea04e044aa4adf74cfea8ddc0324eec2894b1c700f4cafc72a56" +[[package]] +name = "native-tls" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "new_debug_unreachable" version = "1.0.4" @@ -802,6 +1460,7 @@ dependencies = [ "fxhash", "pathdiff", "regex", + "relay-compiler", "serde", "serde_json", "styled_components", @@ -862,6 +1521,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "ntapi" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" +dependencies = [ + "winapi", +] + [[package]] name = "num-bigint" version = "0.2.6" @@ -895,9 +1563,9 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" dependencies = [ "hermit-abi", "libc", @@ -914,9 +1582,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.8.0" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" + +[[package]] +name = "opaque-debug" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" [[package]] name = "opaque-debug" @@ -924,15 +1598,71 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "openssl" +version = "0.10.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7ae222234c30df141154f159066c5093ff73b63204dcda7121eb082fc56a95" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "foreign-types", + "libc", + "once_cell", + "openssl-sys", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e46109c383602735fa0a2e48dd2b7c892b048e1bf69e5c3b1d804b7d9c203cb" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "ordered-float" -version = "2.8.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97c9d06878b3a851e8026ef94bf7fef9ba93062cd412601da4d9cf369b1cc62d" +checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87" dependencies = [ "num-traits", ] +[[package]] +name = "ouroboros" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6d5c203fe8d786d9d7bec8203cbbff3eb2cf8410c0d70cfd05b3d5f5d545da" +dependencies = [ + "ouroboros_macro", + "stable_deref_trait", +] + +[[package]] +name = "ouroboros_macro" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "129943a960e6a08c7e70ca5a09f113c273fe7f10ae8420992c78293e3dffdf65" +dependencies = [ + "Inflector", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "output_vt100" version = "0.1.2" @@ -953,9 +1683,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", @@ -964,15 +1694,14 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.8.0" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c361aa727dd08437f2f1447be8b59a33b0edd15e0fcee698f935613d9efbca9b" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" dependencies = [ - "cfg-if 0.1.10", - "cloudabi", + "cfg-if 1.0.0", "instant", "libc", - "redox_syscall 0.1.57", + "redox_syscall", "smallvec", "winapi", ] @@ -995,6 +1724,19 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +[[package]] +name = "persist-query" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "hyper", + "hyper-tls", + "serde", + "serde_json", + "thiserror", + "url", +] + [[package]] name = "petgraph" version = "0.5.1" @@ -1023,7 +1765,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" dependencies = [ "phf_shared", - "rand 0.7.3", + "rand", ] [[package]] @@ -1051,9 +1793,21 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.7" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" +checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe" [[package]] name = "pmutil" @@ -1068,9 +1822,9 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "precomputed-hash" @@ -1122,18 +1876,24 @@ checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" [[package]] name = "proc-macro2" -version = "1.0.32" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" dependencies = [ "unicode-xid", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quote" -version = "1.0.10" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" +checksum = "47aa80447ce4daf1717500037052af176af5d38cc3e571d9ec1c7353fc10c87d" dependencies = [ "proc-macro2", ] @@ -1152,24 +1912,12 @@ checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ "getrandom 0.1.16", "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc 0.2.0", + "rand_chacha", + "rand_core", + "rand_hc", "rand_pcg", ] -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.3", - "rand_hc 0.3.1", -] - [[package]] name = "rand_chacha" version = "0.2.2" @@ -1177,17 +1925,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.3", + "rand_core", ] [[package]] @@ -1199,31 +1937,13 @@ dependencies = [ "getrandom 0.1.16", ] -[[package]] -name = "rand_core" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" -dependencies = [ - "getrandom 0.2.3", -] - [[package]] name = "rand_hc" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", + "rand_core", ] [[package]] @@ -1232,7 +1952,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" dependencies = [ - "rand_core 0.5.1", + "rand_core", ] [[package]] @@ -1260,12 +1980,6 @@ dependencies = [ "num_cpus", ] -[[package]] -name = "redox_syscall" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - [[package]] name = "redox_syscall" version = "0.2.10" @@ -1303,9 +2017,145 @@ checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "relative-path" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9629de8974fd69c97684736786b807edd3da456d3e3f95341dd9d4cbd8f5ad6" +checksum = "73d4caf086b102ab49d0525b721594a555ab55c6556086bbe52a430ad26c3bd7" + +[[package]] +name = "relay-codegen" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "common", + "fnv", + "graphql-ir", + "graphql-syntax", + "hex", + "indexmap", + "intern", + "lazy_static", + "md-5", + "relay-config", + "relay-transforms", + "schema", +] + +[[package]] +name = "relay-compiler" +version = "13.0.1" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "async-trait", + "bincode", + "common", + "common-path", + "dashmap", + "dependency-analyzer", + "env_logger", + "errors", + "extract-graphql", + "fnv", + "futures 0.3.19", + "glob", + "graphql-cli", + "graphql-ir", + "graphql-syntax", + "graphql-text-printer", + "graphql-watchman", + "hex", + "indexmap", + "intern", + "js-config-loader", + "lazy_static", + "log", + "md-5", + "persist-query", + "rayon", + "regex", + "relay-codegen", + "relay-config", + "relay-schema", + "relay-transforms", + "relay-typegen", + "schema", + "schema-diff", + "serde", + "serde_bser", + "serde_json", + "sha-1 0.8.2", + "signedsource", + "structopt", + "thiserror", + "tokio", + "walkdir", + "watchman_client", + "zstd", +] + +[[package]] +name = "relay-config" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "common", + "fnv", + "indexmap", + "intern", + "regex", + "serde", + "serde_json", +] + +[[package]] +name = "relay-schema" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "common", + "intern", + "schema", +] + +[[package]] +name = "relay-transforms" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "common", + "dashmap", + "errors", + "fnv", + "graphql-ir", + "graphql-syntax", + "graphql-text-printer", + "indexmap", + "intern", + "itertools", + "lazy_static", + "once_cell", + "parking_lot", + "regex", + "relay-config", + "schema", + "thiserror", +] + +[[package]] +name = "relay-typegen" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "common", + "fnv", + "graphql-ir", + "indexmap", + "intern", + "itertools", + "lazy_static", + "relay-config", + "relay-transforms", + "schema", +] [[package]] name = "remove_dir_all" @@ -1318,9 +2168,9 @@ dependencies = [ [[package]] name = "retain_mut" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "448296241d034b96c11173591deaa1302f2c17b56092106c1f92c1bc0183a8c9" +checksum = "11000e6ba5020e53e7cc26f73b91ae7d5496b4977851479edb66b694c0675c21" [[package]] name = "rustc-demangle" @@ -1345,9 +2195,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c9613b5a66ab9ba26415184cfc41156594925a9cf3a2057e57f31ff145f6568" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" [[package]] name = "same-file" @@ -1358,6 +2208,55 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +dependencies = [ + "lazy_static", + "winapi", +] + +[[package]] +name = "schema" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "common", + "dashmap", + "flatbuffers", + "fnv", + "graphql-syntax", + "intern", + "lazy_static", + "ouroboros", + "schema-flatbuffer", + "thiserror", +] + +[[package]] +name = "schema-diff" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "common", + "fnv", + "graphql-syntax", + "intern", + "lazy_static", + "relay-config", + "schema", +] + +[[package]] +name = "schema-flatbuffer" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "flatbuffers", +] + [[package]] name = "scoped-tls" version = "1.0.0" @@ -1370,6 +2269,29 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "security-framework" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" version = "0.9.0" @@ -1415,6 +2337,28 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "serde_bser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b929ea725591083cbca8b8ea178ed6efc918eccd40b784e199ce88967104199" +dependencies = [ + "anyhow", + "byteorder", + "bytes 0.4.12", + "serde", + "thiserror", +] + +[[package]] +name = "serde_bytes" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" +dependencies = [ + "serde", +] + [[package]] name = "serde_derive" version = "1.0.133" @@ -1428,11 +2372,11 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.72" +version = "1.0.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0ffa0837f2dfa6fb90868c2b5468cad482e175f7dad97e7421951e663f2b527" +checksum = "ee2bb9cd061c5865d345bb02ca49fcef1391741b672b54a0bf7b679badec3142" dependencies = [ - "itoa", + "itoa 1.0.1", "ryu", "serde", ] @@ -1447,17 +2391,40 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98d0516900518c29efa217c298fa1f4e6c6ffc85ae29fd7f4ee48f176e1a9ed5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sha-1" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" +dependencies = [ + "block-buffer 0.7.3", + "digest 0.8.1", + "fake-simd", + "opaque-debug 0.2.3", +] + [[package]] name = "sha-1" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" dependencies = [ - "block-buffer", + "block-buffer 0.9.0", "cfg-if 1.0.0", "cpufeatures", - "digest", - "opaque-debug", + "digest 0.9.0", + "opaque-debug 0.3.0", ] [[package]] @@ -1469,17 +2436,56 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + +[[package]] +name = "signedsource" +version = "0.0.0" +source = "git+https://github.com/facebook/relay?tag=v13.0.1#e10dba54b46fc01bdf3b6b811853c6f2b3e565b6" +dependencies = [ + "hex", + "lazy_static", + "md-5", + "regex", +] + [[package]] name = "siphasher" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "533494a8f9b724d33625ab53c6c4800f7cc445895924a8ef649222dcb76e938b" +[[package]] +name = "slab" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" + [[package]] name = "smallvec" -version = "1.7.0" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" +checksum = "5dc90fe6c7be1a323296982db1836d1ea9e47b6839496dde9a541bc496df3516" +dependencies = [ + "libc", + "winapi", +] [[package]] name = "sourcemap" @@ -1570,12 +2576,48 @@ dependencies = [ "syn", ] +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + [[package]] name = "strsim" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "structopt" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40b9788f4202aa75c240ecc9c15c65185e6a39ccdeb0fd5d008b98825464c87c" +dependencies = [ + "clap", + "lazy_static", + "structopt-derive", +] + +[[package]] +name = "structopt-derive" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "styled_components" version = "0.9.0" @@ -1592,11 +2634,17 @@ dependencies = [ "tracing", ] +[[package]] +name = "sval" +version = "1.0.0-alpha.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45f6ee7c7b87caf59549e9fe45d6a69c75c8019e79e212a835c5da0e92f0ba08" + [[package]] name = "swc" -version = "0.110.0" +version = "0.110.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28fbf5ca7965aa18b1da211c28ad9b0e7c27c9b4fdcaa5f0f462d838a300bd20" +checksum = "067194a7c7d96c266120bd0e85a8222fd0f7a05664d80aa433cbf6d649bc5fc1" dependencies = [ "ahash", "anyhow", @@ -1654,7 +2702,7 @@ dependencies = [ "crc", "dashmap", "indexmap", - "is-macro", + "is-macro 0.1.9", "once_cell", "parking_lot", "petgraph", @@ -1722,11 +2770,11 @@ dependencies = [ [[package]] name = "swc_css_ast" -version = "0.41.0" +version = "0.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d09734736a9b06e9fd3ab9c63c3edc7c5439d5ad74212feb250bd6e66ddf41c" +checksum = "9fce1e7a03996a9ddd6d975b946a002302334edf5b7fcc2649ddee5f3ca3a4d2" dependencies = [ - "is-macro", + "is-macro 0.2.0", "serde", "string_enum", "swc_atoms", @@ -1803,7 +2851,7 @@ version = "0.63.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79606092f73c188dfd4897cc63ff613c6967fd5f822cb407d2b6b96d4093b211" dependencies = [ - "is-macro", + "is-macro 0.1.9", "num-bigint", "serde", "string_enum", @@ -2035,7 +3083,7 @@ dependencies = [ "ahash", "arrayvec 0.7.2", "indexmap", - "is-macro", + "is-macro 0.1.9", "num-bigint", "ordered-float", "serde", @@ -2142,7 +3190,7 @@ dependencies = [ "once_cell", "regex", "serde", - "sha-1", + "sha-1 0.9.8", "string_enum", "swc_atoms", "swc_common", @@ -2165,7 +3213,7 @@ dependencies = [ "hex", "serde", "serde_json", - "sha-1", + "sha-1 0.9.8", "swc_common", "swc_ecma_ast", "swc_ecma_codegen", @@ -2196,9 +3244,9 @@ dependencies = [ [[package]] name = "swc_ecma_utils" -version = "0.61.0" +version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "164f22342740e5b299f215a511aefa4dbb9be3586248d05d4249c56964815197" +checksum = "cced7e7c38a3ee9124d9bb4725350b14abf1869d796c16adad1928664dd1f1bb" dependencies = [ "once_cell", "rayon", @@ -2225,9 +3273,9 @@ dependencies = [ [[package]] name = "swc_ecmascript" -version = "0.105.0" +version = "0.105.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67db9c61ea3694375eed4ce95a916201b37470b19dad709c84087ebe8cd20c33" +checksum = "6de17d667580684d450e07d4c9e30ffd7c0010d909256fa270744195c3bd9f27" dependencies = [ "swc_ecma_ast", "swc_ecma_codegen", @@ -2366,14 +3414,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ "cfg-if 1.0.0", + "fastrand", "libc", - "rand 0.8.4", - "redox_syscall 0.2.10", + "redox_syscall", "remove_dir_all", "winapi", ] @@ -2407,9 +3455,9 @@ dependencies = [ [[package]] name = "testing_macros" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6976b6f5ffd18755bef29dce0e9e882382d53bc1ed9d414ccd5c0ee7346bc2" +checksum = "adfb26385ca4db3f8aa680824013819e3b9f8d9a1b64b4f83a411e09a61f11c3" dependencies = [ "anyhow", "glob", @@ -2421,6 +3469,15 @@ dependencies = [ "syn", ] +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + [[package]] name = "thiserror" version = "1.0.30" @@ -2475,6 +3532,69 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +[[package]] +name = "tokio" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbbf1c778ec206785635ce8ad57fe52b3009ae9e0c9f574a728f3049d3e55838" +dependencies = [ + "bytes 1.1.0", + "libc", + "memchr", + "mio", + "num_cpus", + "once_cell", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "tokio-macros", + "tracing", + "winapi", +] + +[[package]] +name = "tokio-macros" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +dependencies = [ + "bytes 1.1.0", + "futures-core", + "futures-io", + "futures-sink", + "log", + "pin-project-lite", + "slab", + "tokio", +] + +[[package]] +name = "tower-service" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" + [[package]] name = "tracing" version = "0.1.29" @@ -2536,6 +3656,12 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + [[package]] name = "typed-arena" version = "2.0.1" @@ -2544,9 +3670,9 @@ checksum = "0685c84d5d54d1c26f7d3eb96cd41550adb97baed141a761cf335d3d33bcd0ae" [[package]] name = "typenum" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" [[package]] name = "unicode-bidi" @@ -2563,6 +3689,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" + [[package]] name = "unicode-width" version = "0.1.9" @@ -2594,13 +3726,43 @@ dependencies = [ "idna", "matches", "percent-encoding", + "serde", +] + +[[package]] +name = "utf8-ranges" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ae116fef2b7fea257ed6440d3cfcff7f190865f170cdad00bb6465bf18ecba" + +[[package]] +name = "value-bag" +version = "1.0.0-alpha.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79923f7731dc61ebfba3633098bf3ac533bbd35ccd8c57e7088d9a5eebe0263f" +dependencies = [ + "ctor", + "sval", + "version_check", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + [[package]] name = "version_check" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "void" @@ -2619,6 +3781,16 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" @@ -2639,7 +3811,6 @@ dependencies = [ "console_error_panic_hook", "next-swc", "once_cell", - "parking_lot_core", "path-clean", "serde", "serde_json", @@ -2719,6 +3890,24 @@ version = "0.2.72" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7148f4696fb4960a346eaa60bbfb42a1ac4ebba21f750f75fc1375b098d5ffa" +[[package]] +name = "watchman_client" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1afbab1186833c9b34f64132b80ed4b373ed4eab6f9efa1f55430835200f0a28" +dependencies = [ + "anyhow", + "bytes 1.1.0", + "futures 0.3.19", + "maplit", + "serde", + "serde_bser", + "thiserror", + "tokio", + "tokio-util", + "winapi", +] + [[package]] name = "web-sys" version = "0.3.49" @@ -2759,3 +3948,32 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "zstd" +version = "0.8.0+zstd.1.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afab5e288c9e10bcd910b16ad82cb8028b74b09eccaa5ecd90621f99d3380735" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "4.0.0+zstd.1.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81f02c0811d5455aa82c6bc400cffd8c882f3a2813f5e2245e2b264443305ab2" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "1.5.0+zstd.1.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e6c094340240369025fc6b731b054ee2a834328fa584310ac96aa4baebdc465" +dependencies = [ + "cc", + "libc", +] diff --git a/packages/next-swc/crates/core/Cargo.toml b/packages/next-swc/crates/core/Cargo.toml index 4300161a6ee72c0..ded541d9f914abc 100644 --- a/packages/next-swc/crates/core/Cargo.toml +++ b/packages/next-swc/crates/core/Cargo.toml @@ -25,6 +25,7 @@ swc_node_base = "0.5.1" swc_stylis = "0.42.0" tracing = {version = "0.1.28", features = ["release_max_level_off"]} regex = "1.5" +relay-compiler = { git = "https://github.com/facebook/relay", tag="v13.0.1" } [dev-dependencies] swc_ecma_transforms_testing = "0.56.0" diff --git a/packages/next-swc/crates/wasm/Cargo.toml b/packages/next-swc/crates/wasm/Cargo.toml index 79ac28b8f5e19c1..d2aa21957261072 100644 --- a/packages/next-swc/crates/wasm/Cargo.toml +++ b/packages/next-swc/crates/wasm/Cargo.toml @@ -11,7 +11,6 @@ crate-type = ["cdylib"] anyhow = "1.0.42" console_error_panic_hook = "0.1.6" once_cell = "1.3.1" -parking_lot_core = "=0.8.0" path-clean = "0.1" serde = {version = "1", features = ["derive"]} serde_json = "1" From 4f75ae5688368bbea30e3e972b6c7bbbddaeb430 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Sat, 15 Jan 2022 01:49:13 -0800 Subject: [PATCH 14/40] Switch to relay.config.js --- test/integration/relay-graphql-swc/relay.config.js | 6 ++++++ test/integration/relay-graphql-swc/relay.json | 6 ------ 2 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 test/integration/relay-graphql-swc/relay.config.js delete mode 100644 test/integration/relay-graphql-swc/relay.json diff --git a/test/integration/relay-graphql-swc/relay.config.js b/test/integration/relay-graphql-swc/relay.config.js new file mode 100644 index 000000000000000..f01ef1932d212eb --- /dev/null +++ b/test/integration/relay-graphql-swc/relay.config.js @@ -0,0 +1,6 @@ +module.exports = { + src: 'pages', + schema: './schema.graphql', + artifactDirectory: './__generated__', + language: 'typescript', +} diff --git a/test/integration/relay-graphql-swc/relay.json b/test/integration/relay-graphql-swc/relay.json deleted file mode 100644 index 999698319a66abe..000000000000000 --- a/test/integration/relay-graphql-swc/relay.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "src": "pages", - "schema": "./schema.graphql", - "artifactDirectory": "./__generated__", - "language": "typescript" -} From 46f46f2ac362aee1f6cab72594643917e1c45717 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Sat, 15 Jan 2022 01:50:23 -0800 Subject: [PATCH 15/40] Add relay packages so we can resolve the artifact using their code --- packages/next-swc/Cargo.lock | 3 +++ packages/next-swc/crates/core/Cargo.toml | 3 +++ 2 files changed, 6 insertions(+) diff --git a/packages/next-swc/Cargo.lock b/packages/next-swc/Cargo.lock index 634ed2cd6e81972..0ea0a1f43978e91 100644 --- a/packages/next-swc/Cargo.lock +++ b/packages/next-swc/Cargo.lock @@ -1455,12 +1455,15 @@ name = "next-swc" version = "0.0.0" dependencies = [ "chrono", + "common", "easy-error", "either", "fxhash", + "intern", "pathdiff", "regex", "relay-compiler", + "relay-config", "serde", "serde_json", "styled_components", diff --git a/packages/next-swc/crates/core/Cargo.toml b/packages/next-swc/crates/core/Cargo.toml index ded541d9f914abc..3ca016cad9f6b04 100644 --- a/packages/next-swc/crates/core/Cargo.toml +++ b/packages/next-swc/crates/core/Cargo.toml @@ -26,6 +26,9 @@ swc_stylis = "0.42.0" tracing = {version = "0.1.28", features = ["release_max_level_off"]} regex = "1.5" relay-compiler = { git = "https://github.com/facebook/relay", tag="v13.0.1" } +relay-compiler-intern = { package="intern", git = "https://github.com/facebook/relay", tag="v13.0.1" } +relay-compiler-common = { package = "common", git = "https://github.com/facebook/relay", tag="v13.0.1" } +relay-config = { git = "https://github.com/facebook/relay", tag="v13.0.1" } [dev-dependencies] swc_ecma_transforms_testing = "0.56.0" From 400def30e28d371e66ff16c8b3b890656f54dd54 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Sat, 15 Jan 2022 01:50:51 -0800 Subject: [PATCH 16/40] Use relay to determine artifact directory --- packages/next-swc/crates/core/src/lib.rs | 4 +- packages/next-swc/crates/core/src/relay.rs | 115 +++++++++++---------- packages/next/server/config-shared.ts | 5 +- 3 files changed, 65 insertions(+), 59 deletions(-) diff --git a/packages/next-swc/crates/core/src/lib.rs b/packages/next-swc/crates/core/src/lib.rs index e511f7a9feef8bb..5a87106226ca5b7 100644 --- a/packages/next-swc/crates/core/src/lib.rs +++ b/packages/next-swc/crates/core/src/lib.rs @@ -93,7 +93,7 @@ pub struct TransformOptions { pub react_remove_properties: Option, #[serde(default)] - pub relay: Option, + pub relay: Option, #[serde(default)] pub shake_exports: Option, @@ -135,7 +135,7 @@ pub fn custom_before_pass( !opts.disable_page_config ), match &opts.relay { - Some(config) => Either::Left(relay::relay(config.clone(), file.name.clone())), + Some(config) if *config => Either::Left(relay::relay(file.name.clone())), _ => Either::Right(noop()), }, match &opts.remove_console { diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index c4455608d1af724..fb249a751f04126 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -1,10 +1,12 @@ +use relay_compiler_common::SourceLocationKey; +use relay_compiler_intern::string_key::StringKey; use std::borrow::Borrow; use std::path::PathBuf; +use std::str::FromStr; -use pathdiff::diff_paths; +use relay_compiler::{create_path_for_artifact, ProjectConfig}; use serde::Deserialize; use swc_atoms::{js_word, JsWord}; -use swc_common::FileName::Real; use swc_common::{FileName, Span}; use swc_ecmascript::ast::*; use swc_ecmascript::visit::{Fold, FoldWith}; @@ -16,27 +18,12 @@ pub enum RelayLanguageConfig { Flow, } -#[derive(Clone, Debug, Deserialize)] -pub struct Config { - pub artifact_directory: Option, - pub language: RelayLanguageConfig, -} - -impl Config { - fn file_extension(&mut self) -> &'static str { - match self.language { - RelayLanguageConfig::Typescript => "ts", - RelayLanguageConfig::Flow => "js", - } - } -} - struct Relay { - config: Config, file_name: FileName, + relay_config_for_tests: Option, } -fn pull_first_operation_name_from_tpl(tpl: &TaggedTpl) -> Option { +fn pull_first_operation_name_from_tpl(tpl: &TaggedTpl) -> Option<&str> { tpl.tpl .quasis .iter() @@ -54,7 +41,7 @@ fn pull_first_operation_name_from_tpl(tpl: &TaggedTpl) -> Option { let next_word = slice[1]; if word == "query" || word == "subscription" || word == "mutation" { - return Some(String::from(next_word)); + return Some(next_word); } None @@ -103,7 +90,45 @@ impl Fold for Relay { } } +// This is copied from https://github.com/facebook/relay/blob/main/compiler/crates/relay-compiler/src/build_project/generate_artifacts.rs#L251 +// until the Relay team exposes it for external use. +fn path_for_artifact(project_config: &ProjectConfig, definition_name: &str) -> PathBuf { + let source_file_location_key = SourceLocationKey::Standalone { + // TODO: Figure out why passing in the actual path here causes the requires to be an + // absolute path. + path: StringKey::from_str("NA").unwrap(), + }; + let filename = if let Some(filename_for_artifact) = &project_config.filename_for_artifact { + filename_for_artifact( + source_file_location_key, + StringKey::from_str(definition_name).unwrap(), + ) + } else { + match &project_config.typegen_config.language { + relay_config::TypegenLanguage::Flow => format!("{}.graphql.js", definition_name), + relay_config::TypegenLanguage::TypeScript => format!("{}.graphql.ts", definition_name), + } + }; + create_path_for_artifact(project_config, source_file_location_key, filename) +} + impl Relay { + fn build_require_path(&mut self, operation_name: &str) -> PathBuf { + match &self.relay_config_for_tests { + Some(config) => path_for_artifact(config, operation_name), + _ => { + let config = relay_compiler::config::Config::search( + std::env::current_dir().unwrap().as_path(), + ) + .unwrap(); + + let project_config = &config.projects[&StringKey::from_str("default").unwrap()]; + + path_for_artifact(project_config, operation_name) + } + } + } + fn build_call_expr_from_tpl(&mut self, tpl: &TaggedTpl) -> Option { if let Expr::Ident(ident) = tpl.tag.borrow() { if ident.sym.borrow() != "graphql" { @@ -113,44 +138,28 @@ impl Relay { let operation_name = pull_first_operation_name_from_tpl(tpl); - if let (Some(operation_name), Real(source_path_buf)) = - (operation_name, self.file_name.borrow()) - { - let path_to_source_dir = source_path_buf.parent().unwrap(); - let generated_file_name = format!( - "{}.graphql.{}", - operation_name, - self.config.file_extension() - ); - - let fully_qualified_require_path = match &self.config.artifact_directory { - Some(artifact_directory) => std::env::current_dir() - .unwrap() - .join(artifact_directory) - .join(generated_file_name), - _ => path_to_source_dir - .join("__generated__") - .join(generated_file_name), - }; - - let mut require_path = String::from( - diff_paths(fully_qualified_require_path, path_to_source_dir) - .unwrap() - .to_str() - .unwrap(), - ); - - if !require_path.starts_with(".") { - require_path = format!("./{}", require_path); - } + if let Some(operation_name) = operation_name { + let final_path = self.build_require_path(operation_name); - return Some(build_require_expr_from_path(require_path)); + return Some(build_require_expr_from_path( + final_path.to_str().unwrap().to_string(), + )); } None } } -pub fn relay(config: Config, file_name: FileName) -> impl Fold { - Relay { config, file_name } +pub fn relay(file_name: FileName) -> impl Fold { + Relay { + file_name, + relay_config_for_tests: None, + } +} + +pub fn test_relay(file_name: FileName, relay_config_for_tests: ProjectConfig) -> impl Fold { + Relay { + file_name, + relay_config_for_tests: Some(relay_config_for_tests), + } } diff --git a/packages/next/server/config-shared.ts b/packages/next/server/config-shared.ts index 4788200de37ca69..50114f798237840 100644 --- a/packages/next/server/config-shared.ts +++ b/packages/next/server/config-shared.ts @@ -169,10 +169,7 @@ export type NextConfig = { [key: string]: any } & { urlImports?: NonNullable['buildHttp'] outputFileTracingRoot?: string outputStandalone?: boolean - relay?: { - artifactDirectory?: string - language: 'typescript' | 'javascript' - } + relay?: boolean } } From b6d924fa712315297cb67eec45eb06179c6774ef Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Sat, 15 Jan 2022 01:53:45 -0800 Subject: [PATCH 17/40] Remove artifact dir test since that's handled by the relay packages --- .../next-swc/crates/core/tests/fixture.rs | 40 ++++-------------- .../fixture/relay/artifact-dir/input.tsx | 42 ------------------- .../fixture/relay/artifact-dir/output.js | 10 ----- .../relay/{no-artifact-dir => }/input.tsx | 0 .../fixture/relay/no-artifact-dir/output.js | 13 ------ .../crates/core/tests/fixture/relay/output.js | 13 ++++++ 6 files changed, 21 insertions(+), 97 deletions(-) delete mode 100644 packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/input.tsx delete mode 100644 packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/output.js rename packages/next-swc/crates/core/tests/fixture/relay/{no-artifact-dir => }/input.tsx (100%) delete mode 100644 packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/output.js create mode 100644 packages/next-swc/crates/core/tests/fixture/relay/output.js diff --git a/packages/next-swc/crates/core/tests/fixture.rs b/packages/next-swc/crates/core/tests/fixture.rs index 74f6614b71c8ffe..89c5199dfd04db0 100644 --- a/packages/next-swc/crates/core/tests/fixture.rs +++ b/packages/next-swc/crates/core/tests/fixture.rs @@ -1,4 +1,4 @@ -use next_swc::relay::{relay, RelayLanguageConfig}; +use next_swc::relay::{relay, test_relay, RelayLanguageConfig}; use next_swc::{ amp_attributes::amp_attributes, next_dynamic::next_dynamic, @@ -9,6 +9,9 @@ use next_swc::{ shake_exports::{shake_exports, Config as ShakeExportsConfig}, styled_jsx::styled_jsx, }; +use relay_compiler::config::Config; +use relay_compiler::ProjectConfig; +use relay_config::TypegenLanguage; use std::path::PathBuf; use swc_common::{chain, comments::SingleThreadedComments, FileName, Mark, Span, DUMMY_SP}; use swc_ecma_transforms_testing::{test, test_fixture}; @@ -151,43 +154,16 @@ fn page_config_fixture(input: PathBuf) { test_fixture(syntax(), &|_tr| page_config_test(), &input, &output); } -#[fixture("tests/fixture/relay/no-artifact-dir/**/input.ts*")] +#[fixture("tests/fixture/relay/**/input.ts*")] fn relay_no_artifact_dir_fixture(input: PathBuf) { let output = input.parent().unwrap().join("output.js"); test_fixture( syntax(), &|_tr| { - relay( - next_swc::relay::Config { - artifact_directory: None, - language: RelayLanguageConfig::Typescript, - }, - FileName::Real(PathBuf::from(input.clone())), - ) - }, - &input, - &output, - ); -} + let mut config = ProjectConfig::default(); + config.typegen_config.language = TypegenLanguage::TypeScript; -#[fixture("tests/fixture/relay/artifact-dir/**/input.ts*")] -fn relay_fixture(input: PathBuf) { - let output = input.parent().unwrap().join("output.js"); - test_fixture( - Syntax::Typescript(TsConfig { - tsx: true, - decorators: false, - dts: false, - no_early_errors: false, - }), - &|_tr| { - relay( - next_swc::relay::Config { - artifact_directory: Some(PathBuf::from("some/generated/dir")), - language: RelayLanguageConfig::Typescript, - }, - FileName::Real(PathBuf::from(input.clone())), - ) + test_relay(FileName::Real(PathBuf::from(input.clone())), config) }, &input, &output, diff --git a/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/input.tsx b/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/input.tsx deleted file mode 100644 index 1a9ead99155a7ca..000000000000000 --- a/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/input.tsx +++ /dev/null @@ -1,42 +0,0 @@ -const variableQuery = graphql` - query InputVariableQuery { - hello - } -` - -fetchQuery(graphql` - query InputUsedInFunctionCallQuery { - hello - } -`) - -function SomeQueryComponent() { - useLazyLoadQuery(graphql` - query InputInHookQuery { - hello - } - `) -} - -const variableMutation = graphql` - query InputVariableMutation { - someMutation - } -` - -commitMutation( - environment, - graphql` - query InputUsedInFunctionCallMutation { - someMutation - } - ` -) - -function SomeMutationComponent() { - useMutation(graphql` - query InputInHookMutation { - someMutation - } - `) -} diff --git a/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/output.js b/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/output.js deleted file mode 100644 index cc28b024fc0669c..000000000000000 --- a/packages/next-swc/crates/core/tests/fixture/relay/artifact-dir/output.js +++ /dev/null @@ -1,10 +0,0 @@ -const variableQuery = require("../../../../../../some/generated/dir/InputVariableQuery.graphql.ts"); -fetchQuery(require("../../../../../../some/generated/dir/InputUsedInFunctionCallQuery.graphql.ts")); -function SomeQueryComponent() { - useLazyLoadQuery(require("../../../../../../some/generated/dir/InputInHookQuery.graphql.ts")); -} -const variableMutation = require("../../../../../../some/generated/dir/InputVariableMutation.graphql.ts"); -commitMutation(environment, require("../../../../../../some/generated/dir/InputUsedInFunctionCallMutation.graphql.ts")); -function SomeMutationComponent() { - useMutation(require("../../../../../../some/generated/dir/InputInHookMutation.graphql.ts")); -} \ No newline at end of file diff --git a/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/input.tsx b/packages/next-swc/crates/core/tests/fixture/relay/input.tsx similarity index 100% rename from packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/input.tsx rename to packages/next-swc/crates/core/tests/fixture/relay/input.tsx diff --git a/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/output.js b/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/output.js deleted file mode 100644 index 72a44bb22ccf983..000000000000000 --- a/packages/next-swc/crates/core/tests/fixture/relay/no-artifact-dir/output.js +++ /dev/null @@ -1,13 +0,0 @@ -const variableQuery = require('./__generated__/InputVariableQuery.graphql.ts') -fetchQuery(require('./__generated__/InputUsedInFunctionCallQuery.graphql.ts')) -function SomeQueryComponent() { - useLazyLoadQuery(require('./__generated__/InputInHookQuery.graphql.ts')) -} -const variableMutation = require('./__generated__/InputVariableMutation.graphql.ts') -commitMutation( - environment, - require('./__generated__/InputUsedInFunctionCallMutation.graphql.ts') -) -function SomeMutationComponent() { - useMutation(require('./__generated__/InputInHookMutation.graphql.ts')) -} diff --git a/packages/next-swc/crates/core/tests/fixture/relay/output.js b/packages/next-swc/crates/core/tests/fixture/relay/output.js new file mode 100644 index 000000000000000..bf391cc8ff39716 --- /dev/null +++ b/packages/next-swc/crates/core/tests/fixture/relay/output.js @@ -0,0 +1,13 @@ +const variableQuery = require('__generated__/InputVariableQuery.graphql.ts') +fetchQuery(require('__generated__/InputUsedInFunctionCallQuery.graphql.ts')) +function SomeQueryComponent() { + useLazyLoadQuery(require('__generated__/InputInHookQuery.graphql.ts')) +} +const variableMutation = require('__generated__/InputVariableMutation.graphql.ts') +commitMutation( + environment, + require('__generated__/InputUsedInFunctionCallMutation.graphql.ts') +) +function SomeMutationComponent() { + useMutation(require('__generated__/InputInHookMutation.graphql.ts')) +} From d419ba078d653c812ec73f3c6a5490ab5a84c061 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Sat, 15 Jan 2022 02:01:38 -0800 Subject: [PATCH 18/40] Update tests to use right cwd --- test/integration/relay-graphql-swc/next.config.js | 6 +----- test/integration/relay-graphql-swc/test/index.test.js | 8 ++++---- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/test/integration/relay-graphql-swc/next.config.js b/test/integration/relay-graphql-swc/next.config.js index 961a6179e4461c1..7e32b6ae09cdc5b 100644 --- a/test/integration/relay-graphql-swc/next.config.js +++ b/test/integration/relay-graphql-swc/next.config.js @@ -1,9 +1,5 @@ module.exports = { experimental: { - relay: { - language: 'typescript', - artifact_directory: - '../../test/integration/relay-graphql-swc/__generated__', - }, + relay: true, }, } diff --git a/test/integration/relay-graphql-swc/test/index.test.js b/test/integration/relay-graphql-swc/test/index.test.js index 5107ddf397fe8ae..02f4049d3294b64 100644 --- a/test/integration/relay-graphql-swc/test/index.test.js +++ b/test/integration/relay-graphql-swc/test/index.test.js @@ -25,17 +25,17 @@ const runRelayCompiler = () => { // Relay expects the current directory to contain a relay.json // This ensures the CWD is the one with relay.json since running // the relay-compiler through yarn would make the root of the repo the CWD. - execSync('../../../node_modules/relay-compiler/cli.js relay.json', { + execSync('../../../node_modules/relay-compiler/cli.js', { cwd: './test/integration/relay-graphql-swc', }) } -describe('Error no pageProps', () => { +describe('Relay Compiler Transform', () => { describe('dev mode', () => { beforeAll(async () => { runRelayCompiler() appPort = await findPort() - app = await launchApp(appDir, appPort) + app = await launchApp(appDir, appPort, { cwd: appDir }) }) afterAll(() => killApp(app)) @@ -45,7 +45,7 @@ describe('Error no pageProps', () => { describe('production mode', () => { beforeAll(async () => { runRelayCompiler() - await nextBuild(appDir) + await nextBuild(appDir, [], { cwd: appDir }) appPort = await findPort() app = await nextStart(appDir, appPort) }) From 3830a8db1d1ded2a6b5706c19a8a6c3951c2fb80 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Sat, 15 Jan 2022 02:01:47 -0800 Subject: [PATCH 19/40] Add support for fragments --- packages/next-swc/crates/core/src/relay.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index fb249a751f04126..ec267e99238bcff 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -40,7 +40,11 @@ fn pull_first_operation_name_from_tpl(tpl: &TaggedTpl) -> Option<&str> { let word = slice[0]; let next_word = slice[1]; - if word == "query" || word == "subscription" || word == "mutation" { + if word == "query" + || word == "subscription" + || word == "mutation" + || word == "fragment" + { return Some(next_word); } From cd6ed9c98e6a7e3b812fac52486bb236aa9af6e1 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Sat, 15 Jan 2022 02:13:43 -0800 Subject: [PATCH 20/40] Added the copy trait --- packages/next-swc/crates/core/src/relay.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index f49a7eda82d4057..439c204a9076483 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -11,7 +11,7 @@ use swc_common::{FileName, Span}; use swc_ecmascript::ast::*; use swc_ecmascript::visit::{Fold, FoldWith}; -#[derive(Clone, Debug, Deserialize)] +#[derive(Copy, Clone, Debug, Deserialize)] #[serde(rename_all = "snake_case")] pub enum RelayLanguageConfig { Typescript, From f7cfd1c375acf015dfcf13d57615d7e984c4993f Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Sat, 15 Jan 2022 19:42:42 -0800 Subject: [PATCH 21/40] Address latest kdy1 feedback --- packages/next-swc/crates/core/src/lib.rs | 4 +-- packages/next-swc/crates/core/src/relay.rs | 42 +++++++++------------- 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/packages/next-swc/crates/core/src/lib.rs b/packages/next-swc/crates/core/src/lib.rs index 5a87106226ca5b7..4fb0d6d79ceb77a 100644 --- a/packages/next-swc/crates/core/src/lib.rs +++ b/packages/next-swc/crates/core/src/lib.rs @@ -93,7 +93,7 @@ pub struct TransformOptions { pub react_remove_properties: Option, #[serde(default)] - pub relay: Option, + pub relay: bool, #[serde(default)] pub shake_exports: Option, @@ -135,7 +135,7 @@ pub fn custom_before_pass( !opts.disable_page_config ), match &opts.relay { - Some(config) if *config => Either::Left(relay::relay(file.name.clone())), + true => Either::Left(relay::relay(file.name.clone())), _ => Either::Right(noop()), }, match &opts.remove_console { diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index 439c204a9076483..064c18e90620f7f 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -9,6 +9,7 @@ use serde::Deserialize; use swc_atoms::{js_word, JsWord}; use swc_common::{FileName, Span}; use swc_ecmascript::ast::*; +use swc_ecmascript::utils::{quote_ident, ExprFactory}; use swc_ecmascript::visit::{Fold, FoldWith}; #[derive(Copy, Clone, Debug, Deserialize)] @@ -60,19 +61,14 @@ fn pull_first_operation_name_from_tpl(tpl: &TaggedTpl) -> Option<&str> { fn build_require_expr_from_path(path: String) -> Expr { Expr::Call(CallExpr { span: Default::default(), - callee: Callee::Expr(Box::new(Expr::Ident(Ident::new( - js_word!("require"), - Span::default(), - )))), - args: vec![ExprOrSpread { - spread: None, - expr: Box::new(Expr::Lit(Lit::Str(Str { - span: Default::default(), - value: JsWord::from(path), - has_escape: false, - kind: Default::default(), - }))), - }], + callee: quote_ident!("require").as_callee(), + args: vec![Lit::Str(Str { + span: Default::default(), + value: JsWord::from(path), + has_escape: false, + kind: Default::default(), + }) + .as_arg()], type_args: None, }) } @@ -100,13 +96,10 @@ fn path_for_artifact(project_config: &ProjectConfig, definition_name: &str) -> P let source_file_location_key = SourceLocationKey::Standalone { // TODO: Figure out why passing in the actual path here causes the requires to be an // absolute path. - path: StringKey::from_str("NA").unwrap(), + path: "NA".parse().unwrap(), }; let filename = if let Some(filename_for_artifact) = &project_config.filename_for_artifact { - filename_for_artifact( - source_file_location_key, - StringKey::from_str(definition_name).unwrap(), - ) + filename_for_artifact(source_file_location_key, definition_name.parse().unwrap()) } else { match &project_config.typegen_config.language { relay_config::TypegenLanguage::Flow => format!("{}.graphql.js", definition_name), @@ -121,10 +114,9 @@ impl Relay { match &self.relay_config_for_tests { Some(config) => path_for_artifact(config, operation_name), _ => { - let config = relay_compiler::config::Config::search( - std::env::current_dir().unwrap().as_path(), - ) - .unwrap(); + let config = + relay_compiler::config::Config::search(&std::env::current_dir().unwrap()) + .unwrap(); let project_config = &config.projects[&StringKey::from_str("default").unwrap()]; @@ -134,8 +126,8 @@ impl Relay { } fn build_call_expr_from_tpl(&mut self, tpl: &TaggedTpl) -> Option { - if let Expr::Ident(ident) = tpl.tag.borrow() { - if ident.sym.borrow() != "graphql" { + if let Expr::Ident(ident) = &*tpl.tag { + if &*ident.sym != "graphql" { return None; } } @@ -146,7 +138,7 @@ impl Relay { let final_path = self.build_require_path(operation_name); return Some(build_require_expr_from_path( - final_path.to_str().unwrap().to_string(), + final_path.display().to_string(), )); } From fee2e113c4d0760cb7706e5466bc528d9964770d Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Sat, 15 Jan 2022 19:43:36 -0800 Subject: [PATCH 22/40] Remove some unused imports --- packages/next-swc/crates/core/src/relay.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index 064c18e90620f7f..ff2ee52263ab444 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -1,13 +1,12 @@ use relay_compiler_common::SourceLocationKey; use relay_compiler_intern::string_key::StringKey; -use std::borrow::Borrow; use std::path::PathBuf; use std::str::FromStr; use relay_compiler::{create_path_for_artifact, ProjectConfig}; use serde::Deserialize; -use swc_atoms::{js_word, JsWord}; -use swc_common::{FileName, Span}; +use swc_atoms::JsWord; +use swc_common::FileName; use swc_ecmascript::ast::*; use swc_ecmascript::utils::{quote_ident, ExprFactory}; use swc_ecmascript::visit::{Fold, FoldWith}; From 2b53fa1542308b1f2f7c7d3209f94012784fdab2 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Sun, 16 Jan 2022 17:46:35 -0800 Subject: [PATCH 23/40] Create new integration test for multi project configs --- .../__generated__/pagesQuery.graphql.ts | 63 +++++++++++++ .../project-a/next.config.js | 6 ++ .../project-a}/pages/api/query.ts | 0 .../project-a/pages/index.tsx | 63 +++++++++++++ .../project-a}/tsconfig.json | 2 +- .../project-b/next.config.js | 6 ++ .../project-b/pages/api/query.ts | 12 +++ .../project-b/pages/index.tsx | 63 +++++++++++++ .../project-b/tsconfig.json | 21 +++++ .../relay.config.js | 24 +++++ .../schema.graphql | 0 .../test/index.test.js | 89 +++++++++++++++++++ .../__generated__/pagesQuery.graphql.ts | 63 +++++++++++++ .../next.config.js | 0 .../pages/api/query.ts | 12 +++ .../pages/index.tsx | 0 .../relay.config.js | 0 .../schema.graphql | 3 + .../test/index.test.js | 6 +- .../tsconfig.json | 21 +++++ .../__generated__/pagesQuery.graphql.ts | 63 ------------- 21 files changed, 450 insertions(+), 67 deletions(-) create mode 100644 test/integration/relay-graphql-swc-multi-project/__generated__/pagesQuery.graphql.ts create mode 100644 test/integration/relay-graphql-swc-multi-project/project-a/next.config.js rename test/integration/{relay-graphql-swc => relay-graphql-swc-multi-project/project-a}/pages/api/query.ts (100%) create mode 100644 test/integration/relay-graphql-swc-multi-project/project-a/pages/index.tsx rename test/integration/{relay-graphql-swc => relay-graphql-swc-multi-project/project-a}/tsconfig.json (89%) create mode 100644 test/integration/relay-graphql-swc-multi-project/project-b/next.config.js create mode 100644 test/integration/relay-graphql-swc-multi-project/project-b/pages/api/query.ts create mode 100644 test/integration/relay-graphql-swc-multi-project/project-b/pages/index.tsx create mode 100644 test/integration/relay-graphql-swc-multi-project/project-b/tsconfig.json create mode 100644 test/integration/relay-graphql-swc-multi-project/relay.config.js rename test/integration/{relay-graphql-swc => relay-graphql-swc-multi-project}/schema.graphql (100%) create mode 100644 test/integration/relay-graphql-swc-multi-project/test/index.test.js create mode 100644 test/integration/relay-graphql-swc-single-project/__generated__/pagesQuery.graphql.ts rename test/integration/{relay-graphql-swc => relay-graphql-swc-single-project}/next.config.js (100%) create mode 100644 test/integration/relay-graphql-swc-single-project/pages/api/query.ts rename test/integration/{relay-graphql-swc => relay-graphql-swc-single-project}/pages/index.tsx (100%) rename test/integration/{relay-graphql-swc => relay-graphql-swc-single-project}/relay.config.js (100%) create mode 100644 test/integration/relay-graphql-swc-single-project/schema.graphql rename test/integration/{relay-graphql-swc => relay-graphql-swc-single-project}/test/index.test.js (88%) create mode 100644 test/integration/relay-graphql-swc-single-project/tsconfig.json delete mode 100644 test/integration/relay-graphql-swc/__generated__/pagesQuery.graphql.ts diff --git a/test/integration/relay-graphql-swc-multi-project/__generated__/pagesQuery.graphql.ts b/test/integration/relay-graphql-swc-multi-project/__generated__/pagesQuery.graphql.ts new file mode 100644 index 000000000000000..3963e412c615149 --- /dev/null +++ b/test/integration/relay-graphql-swc-multi-project/__generated__/pagesQuery.graphql.ts @@ -0,0 +1,63 @@ +/** + * @generated SignedSource<<187ead9fb6e7b26d71c9161bda6ab902>> + * @lightSyntaxTransform + * @nogrep + */ + +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck + +import { ConcreteRequest, Query } from 'relay-runtime' +export type pagesQuery$variables = {} +export type pagesQueryVariables = pagesQuery$variables +export type pagesQuery$data = { + readonly greeting: string +} +export type pagesQueryResponse = pagesQuery$data +export type pagesQuery = { + variables: pagesQueryVariables + response: pagesQuery$data +} + +const node: ConcreteRequest = (function () { + var v0 = [ + { + alias: null, + args: null, + kind: 'ScalarField', + name: 'greeting', + storageKey: null, + }, + ] + return { + fragment: { + argumentDefinitions: [], + kind: 'Fragment', + metadata: null, + name: 'pagesQuery', + selections: v0 /*: any*/, + type: 'Query', + abstractKey: null, + }, + kind: 'Request', + operation: { + argumentDefinitions: [], + kind: 'Operation', + name: 'pagesQuery', + selections: v0 /*: any*/, + }, + params: { + cacheID: '167b6de16340efeb876a7787c90e7cec', + id: null, + metadata: {}, + name: 'pagesQuery', + operationKind: 'query', + text: 'query pagesQuery {\n greeting\n}\n', + }, + } +})() + +;(node as any).hash = '4017856344f36f61252354e2eb442d98' + +export default node diff --git a/test/integration/relay-graphql-swc-multi-project/project-a/next.config.js b/test/integration/relay-graphql-swc-multi-project/project-a/next.config.js new file mode 100644 index 000000000000000..80e35cc588f5579 --- /dev/null +++ b/test/integration/relay-graphql-swc-multi-project/project-a/next.config.js @@ -0,0 +1,6 @@ +module.exports = { + experimental: { + relay: true, + externalDir: true, + }, +} diff --git a/test/integration/relay-graphql-swc/pages/api/query.ts b/test/integration/relay-graphql-swc-multi-project/project-a/pages/api/query.ts similarity index 100% rename from test/integration/relay-graphql-swc/pages/api/query.ts rename to test/integration/relay-graphql-swc-multi-project/project-a/pages/api/query.ts diff --git a/test/integration/relay-graphql-swc-multi-project/project-a/pages/index.tsx b/test/integration/relay-graphql-swc-multi-project/project-a/pages/index.tsx new file mode 100644 index 000000000000000..c70a9e48aeb6bb7 --- /dev/null +++ b/test/integration/relay-graphql-swc-multi-project/project-a/pages/index.tsx @@ -0,0 +1,63 @@ +import { + Environment, + FetchFunction, + fetchQuery, + graphql, + Network, + RecordSource, + Store, +} from 'relay-runtime' +import { GetServerSideProps } from 'next' +import { pagesQuery } from '../../__generated__/pagesQuery.graphql' + +type Props = { greeting: string } + +export default function Index({ greeting }: Props) { + return

Project A:{greeting}

+} + +function createGraphQLFetcher(host: string | undefined): FetchFunction { + return async function fetchGraphQL(params, variables) { + const url = host ? `http://${host}/api/query` : `/api/query` + + const response = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query: params.text, + variables, + }), + }) + + return await response.json() + } +} + +export const getServerSideProps: GetServerSideProps = async ({ req }) => { + const environment = new Environment({ + store: new Store(new RecordSource({}), {}), + network: Network.create(createGraphQLFetcher(req.headers.host)), + }) + + const result = await fetchQuery( + environment, + graphql` + query pagesQuery { + greeting + } + `, + {} + ).toPromise() + + if (!result) { + throw new Error( + 'Mock GraphQL Server network request finished without a response!' + ) + } + + return { + props: { greeting: result.greeting }, + } +} diff --git a/test/integration/relay-graphql-swc/tsconfig.json b/test/integration/relay-graphql-swc-multi-project/project-a/tsconfig.json similarity index 89% rename from test/integration/relay-graphql-swc/tsconfig.json rename to test/integration/relay-graphql-swc-multi-project/project-a/tsconfig.json index 80ded17adda9c51..a247e53e341edcb 100644 --- a/test/integration/relay-graphql-swc/tsconfig.json +++ b/test/integration/relay-graphql-swc-multi-project/project-a/tsconfig.json @@ -17,5 +17,5 @@ "isolatedModules": true }, "exclude": ["node_modules"], - "include": ["next-env.d.ts", "pages", "api"] + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"] } diff --git a/test/integration/relay-graphql-swc-multi-project/project-b/next.config.js b/test/integration/relay-graphql-swc-multi-project/project-b/next.config.js new file mode 100644 index 000000000000000..80e35cc588f5579 --- /dev/null +++ b/test/integration/relay-graphql-swc-multi-project/project-b/next.config.js @@ -0,0 +1,6 @@ +module.exports = { + experimental: { + relay: true, + externalDir: true, + }, +} diff --git a/test/integration/relay-graphql-swc-multi-project/project-b/pages/api/query.ts b/test/integration/relay-graphql-swc-multi-project/project-b/pages/api/query.ts new file mode 100644 index 000000000000000..5ad51e06bc09b14 --- /dev/null +++ b/test/integration/relay-graphql-swc-multi-project/project-b/pages/api/query.ts @@ -0,0 +1,12 @@ +import { NextApiRequest, NextApiResponse } from 'next' + +export default function handler( + req: NextApiRequest, + res: NextApiResponse<{ data: { greeting: string } }> +) { + res.status(200).json({ + data: { + greeting: 'Hello, World!', + }, + }) +} diff --git a/test/integration/relay-graphql-swc-multi-project/project-b/pages/index.tsx b/test/integration/relay-graphql-swc-multi-project/project-b/pages/index.tsx new file mode 100644 index 000000000000000..547d72f775ef734 --- /dev/null +++ b/test/integration/relay-graphql-swc-multi-project/project-b/pages/index.tsx @@ -0,0 +1,63 @@ +import { + Environment, + FetchFunction, + fetchQuery, + graphql, + Network, + RecordSource, + Store, +} from 'relay-runtime' +import { GetServerSideProps } from 'next' +import { pagesQuery } from '../../__generated__/pagesQuery.graphql' + +type Props = { greeting: string } + +export default function Index({ greeting }: Props) { + return

Project B:{greeting}

+} + +function createGraphQLFetcher(host: string | undefined): FetchFunction { + return async function fetchGraphQL(params, variables) { + const url = host ? `http://${host}/api/query` : `/api/query` + + const response = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query: params.text, + variables, + }), + }) + + return await response.json() + } +} + +export const getServerSideProps: GetServerSideProps = async ({ req }) => { + const environment = new Environment({ + store: new Store(new RecordSource({}), {}), + network: Network.create(createGraphQLFetcher(req.headers.host)), + }) + + const result = await fetchQuery( + environment, + graphql` + query pagesQuery { + greeting + } + `, + {} + ).toPromise() + + if (!result) { + throw new Error( + 'Mock GraphQL Server network request finished without a response!' + ) + } + + return { + props: { greeting: result.greeting }, + } +} diff --git a/test/integration/relay-graphql-swc-multi-project/project-b/tsconfig.json b/test/integration/relay-graphql-swc-multi-project/project-b/tsconfig.json new file mode 100644 index 000000000000000..a247e53e341edcb --- /dev/null +++ b/test/integration/relay-graphql-swc-multi-project/project-b/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "esModuleInterop": true, + "module": "esnext", + "jsx": "preserve", + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "incremental": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true + }, + "exclude": ["node_modules"], + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"] +} diff --git a/test/integration/relay-graphql-swc-multi-project/relay.config.js b/test/integration/relay-graphql-swc-multi-project/relay.config.js new file mode 100644 index 000000000000000..9dd47c837df35ce --- /dev/null +++ b/test/integration/relay-graphql-swc-multi-project/relay.config.js @@ -0,0 +1,24 @@ +module.exports = { + root: './', + sources: { + 'project-a/pages': ['project-a', 'should-fail'], + 'project-b/pages': 'project-b', + }, + projects: { + 'should-fail': { + schema: 'schema.graphql', + language: 'typescript', + output: '__generated__', + }, + 'project-a': { + schema: 'schema.graphql', + language: 'typescript', + output: '__generated__', + }, + 'project-b': { + schema: 'schema.graphql', + language: 'typescript', + output: '__generated__', + }, + }, +} diff --git a/test/integration/relay-graphql-swc/schema.graphql b/test/integration/relay-graphql-swc-multi-project/schema.graphql similarity index 100% rename from test/integration/relay-graphql-swc/schema.graphql rename to test/integration/relay-graphql-swc-multi-project/schema.graphql diff --git a/test/integration/relay-graphql-swc-multi-project/test/index.test.js b/test/integration/relay-graphql-swc-multi-project/test/index.test.js new file mode 100644 index 000000000000000..101845b33e3fcab --- /dev/null +++ b/test/integration/relay-graphql-swc-multi-project/test/index.test.js @@ -0,0 +1,89 @@ +/* eslint-env jest */ +import { join } from 'path' +import { execSync } from 'child_process' +import { + findPort, + killApp, + launchApp, + nextBuild, + nextStart, + renderViaHTTP, +} from 'next-test-utils' + +let app +let appPort +const projectAAppDir = join(__dirname, '../project-a') +const projectBAppDir = join(__dirname, '../project-b') + +const runTests = (project) => { + it('should resolve index page correctly', async () => { + const html = await renderViaHTTP(appPort, '/') + expect(html).toContain(project) + expect(html).toContain(`Hello, World!`) + }) +} + +const runRelayCompiler = () => { + // Relay expects the current directory to contain a relay.json + // This ensures the CWD is the one with relay.json since running + // the relay-compiler through yarn would make the root of the repo the CWD. + execSync('../../../node_modules/relay-compiler/cli.js', { + cwd: './test/integration/relay-graphql-swc-multi-project', + }) +} + +describe('Relay Compiler Transform - Multi Project Config', () => { + beforeAll(() => { + runRelayCompiler() + }) + + describe('dev mode', () => { + describe.only('project-a', () => { + beforeAll(async () => { + appPort = await findPort() + app = await launchApp(projectAAppDir, appPort, { cwd: projectAAppDir }) + }) + + afterAll(() => killApp(app)) + + runTests('Project A') + }) + + describe('project-b', () => { + beforeAll(async () => { + appPort = await findPort() + app = await launchApp(projectBAppDir, appPort, { cwd: projectBAppDir }) + }) + + afterAll(() => killApp(app)) + + runTests('Project B') + }) + }) + + describe('production mode', () => { + describe('project-a', () => { + beforeAll(async () => { + await nextBuild(projectAAppDir, [], { cwd: projectAAppDir }) + appPort = await findPort() + app = await nextStart(projectAAppDir, appPort) + }) + + afterAll(() => killApp(app)) + + runTests('Project A') + }) + + describe('project-b', () => { + beforeAll(async () => { + await nextBuild(projectBAppDir, [], { cwd: projectBAppDir }) + appPort = await findPort() + app = await nextStart(projectBAppDir, appPort) + }) + + afterAll(() => killApp(app)) + + runTests('Project B') + }) + }) +}) diff --git a/test/integration/relay-graphql-swc-single-project/__generated__/pagesQuery.graphql.ts b/test/integration/relay-graphql-swc-single-project/__generated__/pagesQuery.graphql.ts new file mode 100644 index 000000000000000..3963e412c615149 --- /dev/null +++ b/test/integration/relay-graphql-swc-single-project/__generated__/pagesQuery.graphql.ts @@ -0,0 +1,63 @@ +/** + * @generated SignedSource<<187ead9fb6e7b26d71c9161bda6ab902>> + * @lightSyntaxTransform + * @nogrep + */ + +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck + +import { ConcreteRequest, Query } from 'relay-runtime' +export type pagesQuery$variables = {} +export type pagesQueryVariables = pagesQuery$variables +export type pagesQuery$data = { + readonly greeting: string +} +export type pagesQueryResponse = pagesQuery$data +export type pagesQuery = { + variables: pagesQueryVariables + response: pagesQuery$data +} + +const node: ConcreteRequest = (function () { + var v0 = [ + { + alias: null, + args: null, + kind: 'ScalarField', + name: 'greeting', + storageKey: null, + }, + ] + return { + fragment: { + argumentDefinitions: [], + kind: 'Fragment', + metadata: null, + name: 'pagesQuery', + selections: v0 /*: any*/, + type: 'Query', + abstractKey: null, + }, + kind: 'Request', + operation: { + argumentDefinitions: [], + kind: 'Operation', + name: 'pagesQuery', + selections: v0 /*: any*/, + }, + params: { + cacheID: '167b6de16340efeb876a7787c90e7cec', + id: null, + metadata: {}, + name: 'pagesQuery', + operationKind: 'query', + text: 'query pagesQuery {\n greeting\n}\n', + }, + } +})() + +;(node as any).hash = '4017856344f36f61252354e2eb442d98' + +export default node diff --git a/test/integration/relay-graphql-swc/next.config.js b/test/integration/relay-graphql-swc-single-project/next.config.js similarity index 100% rename from test/integration/relay-graphql-swc/next.config.js rename to test/integration/relay-graphql-swc-single-project/next.config.js diff --git a/test/integration/relay-graphql-swc-single-project/pages/api/query.ts b/test/integration/relay-graphql-swc-single-project/pages/api/query.ts new file mode 100644 index 000000000000000..5ad51e06bc09b14 --- /dev/null +++ b/test/integration/relay-graphql-swc-single-project/pages/api/query.ts @@ -0,0 +1,12 @@ +import { NextApiRequest, NextApiResponse } from 'next' + +export default function handler( + req: NextApiRequest, + res: NextApiResponse<{ data: { greeting: string } }> +) { + res.status(200).json({ + data: { + greeting: 'Hello, World!', + }, + }) +} diff --git a/test/integration/relay-graphql-swc/pages/index.tsx b/test/integration/relay-graphql-swc-single-project/pages/index.tsx similarity index 100% rename from test/integration/relay-graphql-swc/pages/index.tsx rename to test/integration/relay-graphql-swc-single-project/pages/index.tsx diff --git a/test/integration/relay-graphql-swc/relay.config.js b/test/integration/relay-graphql-swc-single-project/relay.config.js similarity index 100% rename from test/integration/relay-graphql-swc/relay.config.js rename to test/integration/relay-graphql-swc-single-project/relay.config.js diff --git a/test/integration/relay-graphql-swc-single-project/schema.graphql b/test/integration/relay-graphql-swc-single-project/schema.graphql new file mode 100644 index 000000000000000..80b6478dc91e585 --- /dev/null +++ b/test/integration/relay-graphql-swc-single-project/schema.graphql @@ -0,0 +1,3 @@ +type Query { + greeting: String! +} \ No newline at end of file diff --git a/test/integration/relay-graphql-swc/test/index.test.js b/test/integration/relay-graphql-swc-single-project/test/index.test.js similarity index 88% rename from test/integration/relay-graphql-swc/test/index.test.js rename to test/integration/relay-graphql-swc-single-project/test/index.test.js index 02f4049d3294b64..70537d42032ef0e 100644 --- a/test/integration/relay-graphql-swc/test/index.test.js +++ b/test/integration/relay-graphql-swc-single-project/test/index.test.js @@ -26,12 +26,12 @@ const runRelayCompiler = () => { // This ensures the CWD is the one with relay.json since running // the relay-compiler through yarn would make the root of the repo the CWD. execSync('../../../node_modules/relay-compiler/cli.js', { - cwd: './test/integration/relay-graphql-swc', + cwd: './test/integration/relay-graphql-swc-single-project', }) } -describe('Relay Compiler Transform', () => { - describe('dev mode', () => { +describe('Relay Compiler Transform - Single Project Config', () => { + describe.only('dev mode', () => { beforeAll(async () => { runRelayCompiler() appPort = await findPort() diff --git a/test/integration/relay-graphql-swc-single-project/tsconfig.json b/test/integration/relay-graphql-swc-single-project/tsconfig.json new file mode 100644 index 000000000000000..a247e53e341edcb --- /dev/null +++ b/test/integration/relay-graphql-swc-single-project/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "esModuleInterop": true, + "module": "esnext", + "jsx": "preserve", + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "incremental": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true + }, + "exclude": ["node_modules"], + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"] +} diff --git a/test/integration/relay-graphql-swc/__generated__/pagesQuery.graphql.ts b/test/integration/relay-graphql-swc/__generated__/pagesQuery.graphql.ts deleted file mode 100644 index 6d51570de18fc5d..000000000000000 --- a/test/integration/relay-graphql-swc/__generated__/pagesQuery.graphql.ts +++ /dev/null @@ -1,63 +0,0 @@ -/** - * @generated SignedSource<<187ead9fb6e7b26d71c9161bda6ab902>> - * @lightSyntaxTransform - * @nogrep - */ - -/* tslint:disable */ -/* eslint-disable */ -// @ts-nocheck - -import { ConcreteRequest, Query } from 'relay-runtime'; -export type pagesQuery$variables = {}; -export type pagesQueryVariables = pagesQuery$variables; -export type pagesQuery$data = { - readonly greeting: string; -}; -export type pagesQueryResponse = pagesQuery$data; -export type pagesQuery = { - variables: pagesQueryVariables; - response: pagesQuery$data; -}; - -const node: ConcreteRequest = (function(){ -var v0 = [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "greeting", - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": [], - "kind": "Fragment", - "metadata": null, - "name": "pagesQuery", - "selections": (v0/*: any*/), - "type": "Query", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": [], - "kind": "Operation", - "name": "pagesQuery", - "selections": (v0/*: any*/) - }, - "params": { - "cacheID": "167b6de16340efeb876a7787c90e7cec", - "id": null, - "metadata": {}, - "name": "pagesQuery", - "operationKind": "query", - "text": "query pagesQuery {\n greeting\n}\n" - } -}; -})(); - -(node as any).hash = "4017856344f36f61252354e2eb442d98"; - -export default node; From 5612526512352ad5d0281a6dc378476009f62353 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Sun, 16 Jan 2022 17:47:48 -0800 Subject: [PATCH 24/40] Add support for multi project configs and error handling --- packages/next-swc/crates/core/src/relay.rs | 179 ++++++++++++++++++--- 1 file changed, 159 insertions(+), 20 deletions(-) diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index ff2ee52263ab444..3638bf118abd0f5 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -1,11 +1,15 @@ +use pathdiff::diff_paths; use relay_compiler_common::SourceLocationKey; -use relay_compiler_intern::string_key::StringKey; +use std::borrow::Cow; use std::path::PathBuf; use std::str::FromStr; -use relay_compiler::{create_path_for_artifact, ProjectConfig}; +use relay_compiler::compiler_state::{SourceSet, SourceSetName}; +use relay_compiler::{create_path_for_artifact, FileCategorizer, FileGroup, ProjectConfig}; +use relay_compiler_intern::string_key::StringKey; use serde::Deserialize; use swc_atoms::JsWord; +use swc_common::errors::HANDLER; use swc_common::FileName; use swc_ecmascript::ast::*; use swc_ecmascript::utils::{quote_ident, ExprFactory}; @@ -89,37 +93,120 @@ impl Fold for Relay { } } +#[derive(Debug)] +enum BuildRequirePathError<'a> { + FileNameNotReal, + MultipleSourceSetsFound { + source_set_names: Vec, + path: &'a PathBuf, + }, + ProjectNotFoundForSourceSet { + source_set_name: SourceSetName, + }, + FileNotASourceFile, + CouldNotCategorize { + err: Cow<'static, str>, + path: String, + }, +} + // This is copied from https://github.com/facebook/relay/blob/main/compiler/crates/relay-compiler/src/build_project/generate_artifacts.rs#L251 // until the Relay team exposes it for external use. -fn path_for_artifact(project_config: &ProjectConfig, definition_name: &str) -> PathBuf { +fn path_for_artifact( + root_dir: &PathBuf, + source_path: &PathBuf, + project_config: &ProjectConfig, + definition_name: &str, +) -> PathBuf { let source_file_location_key = SourceLocationKey::Standalone { - // TODO: Figure out why passing in the actual path here causes the requires to be an - // absolute path. - path: "NA".parse().unwrap(), + path: StringKey::from_str(source_path.to_str().unwrap()).unwrap(), }; let filename = if let Some(filename_for_artifact) = &project_config.filename_for_artifact { filename_for_artifact(source_file_location_key, definition_name.parse().unwrap()) } else { match &project_config.typegen_config.language { relay_config::TypegenLanguage::Flow => format!("{}.graphql.js", definition_name), - relay_config::TypegenLanguage::TypeScript => format!("{}.graphql.ts", definition_name), + relay_config::TypegenLanguage::TypeScript => { + format!("{}.graphql.ts", definition_name) + } } }; - create_path_for_artifact(project_config, source_file_location_key, filename) -} + let output_path = create_path_for_artifact(project_config, source_file_location_key, filename); + + if project_config.output.is_some() { + let absolute_output_path = root_dir.join(&output_path); + + let diffed_path = + diff_paths(&absolute_output_path, &source_path.parent().unwrap()).unwrap(); + + return diffed_path; + } + + output_path +} impl Relay { - fn build_require_path(&mut self, operation_name: &str) -> PathBuf { + fn build_require_path( + &mut self, + operation_name: &str, + ) -> Result { match &self.relay_config_for_tests { - Some(config) => path_for_artifact(config, operation_name), + Some(config) => match &self.file_name { + FileName::Real(real_file_path) => Ok(path_for_artifact( + &std::env::current_dir().unwrap(), + &real_file_path, + config, + operation_name, + )), + _ => Err(BuildRequirePathError::FileNameNotReal), + }, _ => { let config = relay_compiler::config::Config::search(&std::env::current_dir().unwrap()) .unwrap(); - let project_config = &config.projects[&StringKey::from_str("default").unwrap()]; + let categorizer = FileCategorizer::from_config(&config); + + match &self.file_name { + FileName::Real(real_file_name) => { + // Make sure we have a path which is relative to the config. + // Otherwise, categorize won't be able to recognize that + // the absolute source path is a child of a source set. + let diffed_path = diff_paths(real_file_name, &config.root_dir).unwrap(); + + let group = categorizer.categorize(diffed_path.as_path()); - path_for_artifact(project_config, operation_name) + match group { + Ok(group) => match group { + FileGroup::Source { source_set } => match source_set { + SourceSet::SourceSetName(source_set_name) => { + let project_config: Option<&ProjectConfig> = + config.projects.get(&source_set_name); + + match project_config { + None => Err(BuildRequirePathError::ProjectNotFoundForSourceSet { source_set_name }), + Some(project_config) => { + Ok(path_for_artifact(&config.root_dir,real_file_name, &project_config, operation_name)) + } + } + } + SourceSet::SourceSetNames(source_set_names) => { + Err(BuildRequirePathError::MultipleSourceSetsFound { + source_set_names, + path: real_file_name, + }) + } + }, + _ => Err(BuildRequirePathError::FileNotASourceFile), + }, + Err(err) => Err(BuildRequirePathError::CouldNotCategorize { + err, + path: real_file_name.display().to_string(), + }), + } + } + _ => Err(BuildRequirePathError::FileNameNotReal), + } } } } @@ -133,15 +220,67 @@ impl Relay { let operation_name = pull_first_operation_name_from_tpl(tpl); - if let Some(operation_name) = operation_name { - let final_path = self.build_require_path(operation_name); + match operation_name { + None => None, + Some(operation_name) => match self.build_require_path(operation_name) { + Ok(final_path) => Some(build_require_expr_from_path( + final_path.display().to_string(), + )), + Err(err) => { + let base_error = "Could not transform GraphQL template to a Relay import."; + let error_message = match err { + BuildRequirePathError::FileNameNotReal => "Source file was not a real \ + file. This is likely a bug and \ + should be reported to Next.JS" + .to_string(), + BuildRequirePathError::MultipleSourceSetsFound { + source_set_names, + path, + } => { + format!( + "Multiple source sets were found for file: {}. Found source sets: \ + [{}]. We could not determine the project config to use for the \ + source file. Please consider narrowing down your source sets.", + path.to_str().unwrap(), + source_set_names + .iter() + .map(|name| name.lookup()) + .collect::>() + .join(", ") + ) + } + BuildRequirePathError::ProjectNotFoundForSourceSet { source_set_name } => { + format!( + "Project could not be found for the source set: {}", + source_set_name + ) + } + BuildRequirePathError::FileNotASourceFile => { + "This file was not considered a source file by the Relay Compiler. \ + This is likely a bug and should be reported to Next.JS" + .to_string() + } + BuildRequirePathError::CouldNotCategorize { path, err } => { + format!( + "Relay was unable to categorize the file at: {}. The underlying \ + error is: {}. \nThis is likely a bug and should be reported to \ + Next.JS", + path, err + ) + } + }; - return Some(build_require_expr_from_path( - final_path.display().to_string(), - )); - } + HANDLER.with(|handler| { + handler.span_err( + tpl.span, + format!("{} {}", base_error, error_message).as_str(), + ); + }); - None + None + } + }, + } } } From 244a4da552ee886c003dbab2a97e8416d8bf5bcd Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Sun, 16 Jan 2022 17:47:57 -0800 Subject: [PATCH 25/40] Update fixture to support new API --- packages/next-swc/crates/core/tests/fixture.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/next-swc/crates/core/tests/fixture.rs b/packages/next-swc/crates/core/tests/fixture.rs index 89c5199dfd04db0..dfb212f85f36d48 100644 --- a/packages/next-swc/crates/core/tests/fixture.rs +++ b/packages/next-swc/crates/core/tests/fixture.rs @@ -1,4 +1,4 @@ -use next_swc::relay::{relay, test_relay, RelayLanguageConfig}; +use next_swc::relay::test_relay; use next_swc::{ amp_attributes::amp_attributes, next_dynamic::next_dynamic, @@ -9,13 +9,11 @@ use next_swc::{ shake_exports::{shake_exports, Config as ShakeExportsConfig}, styled_jsx::styled_jsx, }; -use relay_compiler::config::Config; use relay_compiler::ProjectConfig; use relay_config::TypegenLanguage; use std::path::PathBuf; use swc_common::{chain, comments::SingleThreadedComments, FileName, Mark, Span, DUMMY_SP}; use swc_ecma_transforms_testing::{test, test_fixture}; -use swc_ecmascript::parser::TsConfig; use swc_ecmascript::{ parser::{EsConfig, Syntax}, transforms::{react::jsx, resolver}, @@ -163,7 +161,7 @@ fn relay_no_artifact_dir_fixture(input: PathBuf) { let mut config = ProjectConfig::default(); config.typegen_config.language = TypegenLanguage::TypeScript; - test_relay(FileName::Real(PathBuf::from(input.clone())), config) + test_relay(FileName::Real(PathBuf::from("input.tsx")), config) }, &input, &output, From 8ba09982c1aabbcd5431842d0e686dc79e455f4b Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Sun, 16 Jan 2022 17:54:15 -0800 Subject: [PATCH 26/40] Remove describe.only --- .../relay-graphql-swc-multi-project/test/index.test.js | 2 +- .../relay-graphql-swc-single-project/test/index.test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/integration/relay-graphql-swc-multi-project/test/index.test.js b/test/integration/relay-graphql-swc-multi-project/test/index.test.js index 101845b33e3fcab..605f06c87527948 100644 --- a/test/integration/relay-graphql-swc-multi-project/test/index.test.js +++ b/test/integration/relay-graphql-swc-multi-project/test/index.test.js @@ -38,7 +38,7 @@ describe('Relay Compiler Transform - Multi Project Config', () => { }) describe('dev mode', () => { - describe.only('project-a', () => { + describe('project-a', () => { beforeAll(async () => { appPort = await findPort() app = await launchApp(projectAAppDir, appPort, { cwd: projectAAppDir }) diff --git a/test/integration/relay-graphql-swc-single-project/test/index.test.js b/test/integration/relay-graphql-swc-single-project/test/index.test.js index 70537d42032ef0e..0b19183047878ed 100644 --- a/test/integration/relay-graphql-swc-single-project/test/index.test.js +++ b/test/integration/relay-graphql-swc-single-project/test/index.test.js @@ -31,7 +31,7 @@ const runRelayCompiler = () => { } describe('Relay Compiler Transform - Single Project Config', () => { - describe.only('dev mode', () => { + describe('dev mode', () => { beforeAll(async () => { runRelayCompiler() appPort = await findPort() From 8782671b36c0906ea942f99d19434c0f6e8c5783 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Mon, 17 Jan 2022 02:04:52 -0800 Subject: [PATCH 27/40] Bring back parking lot and bump version to avoid conflicts --- packages/next-swc/Cargo.lock | 1 + packages/next-swc/crates/wasm/Cargo.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/next-swc/Cargo.lock b/packages/next-swc/Cargo.lock index a8cce668dd013f8..26e37096f7f08e1 100644 --- a/packages/next-swc/Cargo.lock +++ b/packages/next-swc/Cargo.lock @@ -3801,6 +3801,7 @@ dependencies = [ "console_error_panic_hook", "next-swc", "once_cell", + "parking_lot_core", "path-clean", "serde", "serde_json", diff --git a/packages/next-swc/crates/wasm/Cargo.toml b/packages/next-swc/crates/wasm/Cargo.toml index d09805d67a17ec1..590357216af36b9 100644 --- a/packages/next-swc/crates/wasm/Cargo.toml +++ b/packages/next-swc/crates/wasm/Cargo.toml @@ -11,6 +11,7 @@ crate-type = ["cdylib"] anyhow = "1.0.42" console_error_panic_hook = "0.1.6" once_cell = "1.3.1" +parking_lot_core = "=0.8.5" path-clean = "0.1" serde = {version = "1", features = ["derive"]} serde_json = "1" From 8343e17509733582f15bfd9eb4cf2453af24b79c Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Mon, 17 Jan 2022 02:11:14 -0800 Subject: [PATCH 28/40] Address latest kdy1 feedback --- packages/next-swc/crates/core/src/relay.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index 3638bf118abd0f5..d8d60dc1530a54d 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -2,11 +2,9 @@ use pathdiff::diff_paths; use relay_compiler_common::SourceLocationKey; use std::borrow::Cow; use std::path::PathBuf; -use std::str::FromStr; use relay_compiler::compiler_state::{SourceSet, SourceSetName}; use relay_compiler::{create_path_for_artifact, FileCategorizer, FileGroup, ProjectConfig}; -use relay_compiler_intern::string_key::StringKey; use serde::Deserialize; use swc_atoms::JsWord; use swc_common::errors::HANDLER; @@ -119,7 +117,7 @@ fn path_for_artifact( definition_name: &str, ) -> PathBuf { let source_file_location_key = SourceLocationKey::Standalone { - path: StringKey::from_str(source_path.to_str().unwrap()).unwrap(), + path: source_path.to_str().unwrap().parse().unwrap(), }; let filename = if let Some(filename_for_artifact) = &project_config.filename_for_artifact { filename_for_artifact(source_file_location_key, definition_name.parse().unwrap()) From 686ff01b23d29a1115012c77283e12458e29dc10 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Mon, 17 Jan 2022 14:39:00 +0000 Subject: [PATCH 29/40] Add note about Relay to the docs --- docs/advanced-features/compiler.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/advanced-features/compiler.md b/docs/advanced-features/compiler.md index ac07f30fe24c165..0ed7b6b9a532b9a 100644 --- a/docs/advanced-features/compiler.md +++ b/docs/advanced-features/compiler.md @@ -94,6 +94,19 @@ const customJestConfig = { module.exports = createJestConfig(customJestConfig) ``` +### Relay + +To enable [Relay](https://relay.dev/) support: + +```js +// next.config.js +module.exports = { + experimental: { + relay: true, + }, +} +``` + ### Remove React Properties Allows to remove JSX properties. This is often used for testing. Similar to `babel-plugin-react-remove-properties`. From 27057e5377174aa2423791609e40c945b5520451 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Mon, 17 Jan 2022 23:07:09 -0800 Subject: [PATCH 30/40] Fix unit tests --- .../relay-graphql-swc-multi-project/relay.config.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/test/integration/relay-graphql-swc-multi-project/relay.config.js b/test/integration/relay-graphql-swc-multi-project/relay.config.js index 9dd47c837df35ce..10af186bc62cba6 100644 --- a/test/integration/relay-graphql-swc-multi-project/relay.config.js +++ b/test/integration/relay-graphql-swc-multi-project/relay.config.js @@ -1,15 +1,10 @@ module.exports = { root: './', sources: { - 'project-a/pages': ['project-a', 'should-fail'], + 'project-a/pages': 'project-a', 'project-b/pages': 'project-b', }, projects: { - 'should-fail': { - schema: 'schema.graphql', - language: 'typescript', - output: '__generated__', - }, 'project-a': { schema: 'schema.graphql', language: 'typescript', From acea05f329793dd5c2f8878adfdc54a9bc5d5fd0 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Mon, 17 Jan 2022 23:23:30 -0800 Subject: [PATCH 31/40] Switch to use a regex :) --- packages/next-swc/crates/core/src/relay.rs | 39 ++++++++-------------- 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index d8d60dc1530a54d..8c6d5155da22a74 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -1,4 +1,5 @@ use pathdiff::diff_paths; +use regex::{Captures, Regex}; use relay_compiler_common::SourceLocationKey; use std::borrow::Cow; use std::path::PathBuf; @@ -25,36 +26,22 @@ struct Relay { relay_config_for_tests: Option, } -fn pull_first_operation_name_from_tpl(tpl: &TaggedTpl) -> Option<&str> { +fn pull_first_operation_name_from_tpl(tpl: &TaggedTpl) -> Option { tpl.tpl .quasis .iter() .filter_map(|quasis| { - let split_content = quasis.raw.value.split(" ").collect::>(); + let regex = Regex::new(r"(fragment|mutation|query) (\w+)").unwrap(); + let capture_group = regex.captures_iter(&quasis.raw.value).next(); - let operation = split_content - .chunks(2) - .filter_map(|slice| { - if slice.len() == 1 { - return None; - } - - let word = slice[0]; - let next_word = slice[1]; - - if word == "query" - || word == "subscription" - || word == "mutation" - || word == "fragment" - { - return Some(next_word); - } + match capture_group { + None => None, + Some(capture_group) => { + let operation_name: &str = &capture_group[2]; - None - }) - .next(); - - return operation; + Some(operation_name.to_string()) + } + } }) .next() } @@ -114,7 +101,7 @@ fn path_for_artifact( root_dir: &PathBuf, source_path: &PathBuf, project_config: &ProjectConfig, - definition_name: &str, + definition_name: String, ) -> PathBuf { let source_file_location_key = SourceLocationKey::Standalone { path: source_path.to_str().unwrap().parse().unwrap(), @@ -146,7 +133,7 @@ fn path_for_artifact( impl Relay { fn build_require_path( &mut self, - operation_name: &str, + operation_name: String, ) -> Result { match &self.relay_config_for_tests { Some(config) => match &self.file_name { From 85ac72c1fb4806626cfc27094299a6b9049955fa Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Mon, 17 Jan 2022 23:28:06 -0800 Subject: [PATCH 32/40] Add support for subscription in regex --- packages/next-swc/crates/core/src/relay.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index 8c6d5155da22a74..70d331528416b01 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -31,7 +31,7 @@ fn pull_first_operation_name_from_tpl(tpl: &TaggedTpl) -> Option { .quasis .iter() .filter_map(|quasis| { - let regex = Regex::new(r"(fragment|mutation|query) (\w+)").unwrap(); + let regex = Regex::new(r"(fragment|mutation|query|subscription) (\w+)").unwrap(); let capture_group = regex.captures_iter(&quasis.raw.value).next(); match capture_group { From 7d358738cb793ae9a5772ca2e8cac897682b3d87 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Tue, 18 Jan 2022 21:08:03 -0800 Subject: [PATCH 33/40] Address kdy1 feedback --- packages/next-swc/Cargo.lock | 1 + packages/next-swc/crates/core/Cargo.toml | 1 + packages/next-swc/crates/core/src/relay.rs | 50 +++++++++------------- 3 files changed, 23 insertions(+), 29 deletions(-) diff --git a/packages/next-swc/Cargo.lock b/packages/next-swc/Cargo.lock index 26e37096f7f08e1..7905b3b637b40db 100644 --- a/packages/next-swc/Cargo.lock +++ b/packages/next-swc/Cargo.lock @@ -1447,6 +1447,7 @@ dependencies = [ "either", "fxhash", "intern", + "once_cell", "pathdiff", "regex", "relay-compiler", diff --git a/packages/next-swc/crates/core/Cargo.toml b/packages/next-swc/crates/core/Cargo.toml index d27897a38c44268..910fe96d5ffec60 100644 --- a/packages/next-swc/crates/core/Cargo.toml +++ b/packages/next-swc/crates/core/Cargo.toml @@ -8,6 +8,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] chrono = "0.4" +once_cell = "1.8.0" easy-error = "1.0.0" either = "1" fxhash = "0.2.1" diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index 70d331528416b01..8fddd64fc19cf21 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -1,12 +1,12 @@ +use once_cell::sync::Lazy; use pathdiff::diff_paths; -use regex::{Captures, Regex}; -use relay_compiler_common::SourceLocationKey; -use std::borrow::Cow; -use std::path::PathBuf; - +use regex::Regex; use relay_compiler::compiler_state::{SourceSet, SourceSetName}; use relay_compiler::{create_path_for_artifact, FileCategorizer, FileGroup, ProjectConfig}; +use relay_compiler_common::SourceLocationKey; use serde::Deserialize; +use std::borrow::Cow; +use std::path::{Path, PathBuf}; use swc_atoms::JsWord; use swc_common::errors::HANDLER; use swc_common::FileName; @@ -27,26 +27,20 @@ struct Relay { } fn pull_first_operation_name_from_tpl(tpl: &TaggedTpl) -> Option { - tpl.tpl - .quasis - .iter() - .filter_map(|quasis| { - let regex = Regex::new(r"(fragment|mutation|query|subscription) (\w+)").unwrap(); - let capture_group = regex.captures_iter(&quasis.raw.value).next(); + tpl.tpl.quasis.iter().find_map(|quasis| { + static OPERATION_REGEX: Lazy = + Lazy::new(|| Regex::new(r"(fragment|mutation|query|subscription) (\w+)").unwrap()); - match capture_group { - None => None, - Some(capture_group) => { - let operation_name: &str = &capture_group[2]; + let capture_group = OPERATION_REGEX.captures_iter(&quasis.raw.value).next(); - Some(operation_name.to_string()) - } - } - }) - .next() + match capture_group { + None => None, + Some(capture_group) => Some(capture_group[2].to_string()), + } + }) } -fn build_require_expr_from_path(path: String) -> Expr { +fn build_require_expr_from_path(path: &str) -> Expr { Expr::Call(CallExpr { span: Default::default(), callee: quote_ident!("require").as_callee(), @@ -98,10 +92,10 @@ enum BuildRequirePathError<'a> { // This is copied from https://github.com/facebook/relay/blob/main/compiler/crates/relay-compiler/src/build_project/generate_artifacts.rs#L251 // until the Relay team exposes it for external use. fn path_for_artifact( - root_dir: &PathBuf, - source_path: &PathBuf, + root_dir: &Path, + source_path: &Path, project_config: &ProjectConfig, - definition_name: String, + definition_name: &str, ) -> PathBuf { let source_file_location_key = SourceLocationKey::Standalone { path: source_path.to_str().unwrap().parse().unwrap(), @@ -133,7 +127,7 @@ fn path_for_artifact( impl Relay { fn build_require_path( &mut self, - operation_name: String, + operation_name: &str, ) -> Result { match &self.relay_config_for_tests { Some(config) => match &self.file_name { @@ -207,10 +201,8 @@ impl Relay { match operation_name { None => None, - Some(operation_name) => match self.build_require_path(operation_name) { - Ok(final_path) => Some(build_require_expr_from_path( - final_path.display().to_string(), - )), + Some(operation_name) => match self.build_require_path(operation_name.as_str()) { + Ok(final_path) => Some(build_require_expr_from_path(final_path.to_str().unwrap())), Err(err) => { let base_error = "Could not transform GraphQL template to a Relay import."; let error_message = match err { From d24ae71151d308ec71c08f5ce4dd848b59733a80 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Sat, 22 Jan 2022 13:22:28 -0800 Subject: [PATCH 34/40] Don't include Relay when targeting wasm --- packages/next-swc/Cargo.lock | 12 ++++++------ packages/next-swc/crates/core/Cargo.toml | 2 ++ packages/next-swc/crates/core/src/lib.rs | 17 +++++++++++++---- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/packages/next-swc/Cargo.lock b/packages/next-swc/Cargo.lock index 7905b3b637b40db..07195be632dc252 100644 --- a/packages/next-swc/Cargo.lock +++ b/packages/next-swc/Cargo.lock @@ -2262,9 +2262,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "security-framework" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" +checksum = "d09d3c15d814eda1d6a836f2f2b56a6abc1446c8a34351cb3180d3db92ffe4ce" dependencies = [ "bitflags", "core-foundation", @@ -2275,9 +2275,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" +checksum = "e90dd10c41c6bfc633da6e0c659bd25d31e0791e5974ac42970267d59eba87f7" dependencies = [ "core-foundation-sys", "libc", @@ -2587,9 +2587,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "structopt" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b9788f4202aa75c240ecc9c15c65185e6a39ccdeb0fd5d008b98825464c87c" +checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" dependencies = [ "clap", "lazy_static", diff --git a/packages/next-swc/crates/core/Cargo.toml b/packages/next-swc/crates/core/Cargo.toml index 910fe96d5ffec60..b62fc75c6288ed5 100644 --- a/packages/next-swc/crates/core/Cargo.toml +++ b/packages/next-swc/crates/core/Cargo.toml @@ -26,6 +26,8 @@ swc_node_base = "0.5.1" swc_stylis = "0.43.0" tracing = {version = "0.1.28", features = ["release_max_level_off"]} regex = "1.5" + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] relay-compiler = { git = "https://github.com/facebook/relay", tag="v13.0.1" } relay-compiler-intern = { package="intern", git = "https://github.com/facebook/relay", tag="v13.0.1" } relay-compiler-common = { package = "common", git = "https://github.com/facebook/relay", tag="v13.0.1" } diff --git a/packages/next-swc/crates/core/src/lib.rs b/packages/next-swc/crates/core/src/lib.rs index 4fb0d6d79ceb77a..4d147f5a475b725 100644 --- a/packages/next-swc/crates/core/src/lib.rs +++ b/packages/next-swc/crates/core/src/lib.rs @@ -53,6 +53,7 @@ pub mod next_dynamic; pub mod next_ssg; pub mod page_config; pub mod react_remove_properties; +#[cfg(not(target_arch = "wasm32"))] pub mod relay; pub mod remove_console; pub mod shake_exports; @@ -104,6 +105,17 @@ pub fn custom_before_pass( file: Arc, opts: &TransformOptions, ) -> impl Fold { + #[cfg(target_arch = "wasm32")] + let relay_plugin = noop(); + + #[cfg(not(target_arch = "wasm32"))] + let relay_plugin = { + match &opts.relay { + true => Either::Left(relay::relay(file.name.clone())), + false => Either::Right(noop()), + } + }; + chain!( disallow_re_export_all_in_page::disallow_re_export_all_in_page(opts.is_page_file), styled_jsx::styled_jsx(cm.clone()), @@ -134,10 +146,7 @@ pub fn custom_before_pass( page_config::page_config(opts.is_development, opts.is_page_file), !opts.disable_page_config ), - match &opts.relay { - true => Either::Left(relay::relay(file.name.clone())), - _ => Either::Right(noop()), - }, + relay_plugin, match &opts.remove_console { Some(config) if config.truthy() => Either::Left(remove_console::remove_console(config.clone())), From aa0f67668f6c2e202074d2ec3b8f5dd8bf68aba5 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Tue, 25 Jan 2022 20:59:57 -0800 Subject: [PATCH 35/40] Update packages/next-swc/crates/core/src/relay.rs Co-authored-by: Tim Neutkens --- packages/next-swc/crates/core/src/relay.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index 8fddd64fc19cf21..42f6412c8621568 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -208,7 +208,7 @@ impl Relay { let error_message = match err { BuildRequirePathError::FileNameNotReal => "Source file was not a real \ file. This is likely a bug and \ - should be reported to Next.JS" + should be reported to Next.js" .to_string(), BuildRequirePathError::MultipleSourceSetsFound { source_set_names, From 4a4a5b6ae7844679ec5986196ed7e459519701c6 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Tue, 25 Jan 2022 21:00:18 -0800 Subject: [PATCH 36/40] Update packages/next-swc/crates/core/src/relay.rs Co-authored-by: Tim Neutkens --- packages/next-swc/crates/core/src/relay.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index 42f6412c8621568..72f1b4272a4455c 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -234,7 +234,7 @@ impl Relay { } BuildRequirePathError::FileNotASourceFile => { "This file was not considered a source file by the Relay Compiler. \ - This is likely a bug and should be reported to Next.JS" + This is likely a bug and should be reported to Next.js" .to_string() } BuildRequirePathError::CouldNotCategorize { path, err } => { From f6cc9d7ba4a0b666420de887986a33b07100b1d8 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Tue, 25 Jan 2022 21:00:23 -0800 Subject: [PATCH 37/40] Update packages/next-swc/crates/core/src/relay.rs Co-authored-by: Tim Neutkens --- packages/next-swc/crates/core/src/relay.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index 72f1b4272a4455c..76bac2f74c5d6a4 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -241,7 +241,7 @@ impl Relay { format!( "Relay was unable to categorize the file at: {}. The underlying \ error is: {}. \nThis is likely a bug and should be reported to \ - Next.JS", + Next.js", path, err ) } From b5f89bc958a5d5bd62428230a29cd578f8f7563b Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Tue, 25 Jan 2022 23:03:33 -0800 Subject: [PATCH 38/40] Add better docs for CouldNotCategorize error --- packages/next-swc/crates/core/src/relay.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index 76bac2f74c5d6a4..d3b655a0bdd116c 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -239,9 +239,10 @@ impl Relay { } BuildRequirePathError::CouldNotCategorize { path, err } => { format!( - "Relay was unable to categorize the file at: {}. The underlying \ - error is: {}. \nThis is likely a bug and should be reported to \ - Next.js", + "Relay was unable to categorize the file at: {}. Ensure your \ + `src` path includes this file in `relay.config.js` The \ + underlying error is: {}. \n\nThis is likely a bug and should be \ + reported to Next.js", path, err ) } From 1682ac31a991042aff857757f97e2344851f9ba1 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Tue, 25 Jan 2022 23:45:54 -0800 Subject: [PATCH 39/40] Add relay: false to full test suite --- packages/next-swc/crates/core/tests/full.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/next-swc/crates/core/tests/full.rs b/packages/next-swc/crates/core/tests/full.rs index 834b14748d920a1..80c5bb051951366 100644 --- a/packages/next-swc/crates/core/tests/full.rs +++ b/packages/next-swc/crates/core/tests/full.rs @@ -59,6 +59,7 @@ fn test(input: &Path, minify: bool) { styled_components: Some(assert_json("{}")), remove_console: None, react_remove_properties: None, + relay: false, shake_exports: None, }; From 464dd979da7f94fbc920243650b458934ebb8754 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Tue, 25 Jan 2022 23:46:07 -0800 Subject: [PATCH 40/40] Prettier fix --- .../relay-graphql-swc-multi-project/schema.graphql | 4 ++-- .../relay-graphql-swc-single-project/schema.graphql | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/integration/relay-graphql-swc-multi-project/schema.graphql b/test/integration/relay-graphql-swc-multi-project/schema.graphql index 80b6478dc91e585..7428cd8c20588a5 100644 --- a/test/integration/relay-graphql-swc-multi-project/schema.graphql +++ b/test/integration/relay-graphql-swc-multi-project/schema.graphql @@ -1,3 +1,3 @@ type Query { - greeting: String! -} \ No newline at end of file + greeting: String! +} diff --git a/test/integration/relay-graphql-swc-single-project/schema.graphql b/test/integration/relay-graphql-swc-single-project/schema.graphql index 80b6478dc91e585..7428cd8c20588a5 100644 --- a/test/integration/relay-graphql-swc-single-project/schema.graphql +++ b/test/integration/relay-graphql-swc-single-project/schema.graphql @@ -1,3 +1,3 @@ type Query { - greeting: String! -} \ No newline at end of file + greeting: String! +}