Skip to content

Commit

Permalink
Font loader call json parsing fix (vercel#41052)
Browse files Browse the repository at this point in the history
Stringify into one json object instead. Previously parsing would break if a string included a semicolon.

## Bug

- [ ] Related issues linked using `fixes #number`
- [ ] Integration tests added
- [ ] Errors have a helpful link attached, see `contributing.md`

## Feature

- [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR.
- [ ] Related issues linked using `fixes #number`
- [ ] Integration tests added
- [ ] Documentation added
- [ ] Telemetry added. In case of a feature if it's used or not.
- [ ] Errors have a helpful link attached, see `contributing.md`

## Documentation / Examples

- [ ] Make sure the linting passes by running `pnpm lint`
- [ ] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md)
  • Loading branch information
Hannes Bornö authored and BowlingX committed Oct 5, 2022
1 parent f714651 commit 1a549cc
Show file tree
Hide file tree
Showing 17 changed files with 43 additions and 37 deletions.
Expand Up @@ -36,21 +36,26 @@ impl<'a> FontImportsGenerator<'a> {
.collect();

if let Ok(json) = json {
let mut json_values: Vec<String> =
json.iter().map(|value| value.to_string()).collect();
let function_name = match &font_function.function_name {
Some(function) => String::from(&**function),
None => String::new(),
};
let mut values = vec![self.relative_path.to_string(), function_name];
values.append(&mut json_values);
let mut query_json_values = serde_json::Map::new();
query_json_values.insert(
String::from("path"),
Value::String(self.relative_path.to_string()),
);
query_json_values
.insert(String::from("import"), Value::String(function_name));
query_json_values.insert(String::from("arguments"), Value::Array(json));

let query_json = Value::Object(query_json_values);

return Some(ImportDecl {
src: Box::new(Str {
value: JsWord::from(format!(
"{}/target.css?{}",
font_function.loader,
values.join(";")
font_function.loader, query_json
)),
raw: None,
span: DUMMY_SP,
Expand Down
@@ -1,5 +1,5 @@
import firaCode from "@next/font/google/target.css?pages/test.tsx;Abel";
import inter from "@next/font/google/target.css?pages/test.tsx;Inter";
import firaCode from '@next/font/google/target.css?{"arguments":[],"import":"Abel","path":"pages/test.tsx"}';
import inter from '@next/font/google/target.css?{"arguments":[],"import":"Inter","path":"pages/test.tsx"}';
import React from 'react';
export { firaCode };
export { inter };
@@ -1,4 +1,4 @@
import inter1 from '@next/font/google/target.css?pages/test.tsx;Inter;{"variant":"400"}';
import inter2 from '@next/font/google/target.css?pages/test.tsx;Inter;{"variant":"400"}';
import inter1 from '@next/font/google/target.css?{"arguments":[{"variant":"400"}],"import":"Inter","path":"pages/test.tsx"}';
import inter2 from '@next/font/google/target.css?{"arguments":[{"variant":"400"}],"import":"Inter","path":"pages/test.tsx"}';
var i = 10;
var i2 = 20;
@@ -1,7 +1,7 @@
import a from "@next/font/google/target.css?pages/test.tsx;ABeeZee;{}";
import a from "@next/font/google/target.css?pages/test.tsx;ABeeZee;{}";
import a from "@next/font/google/target.css?pages/test.tsx;ABeeZee;{}";
import a from "@next/font/google/target.css?pages/test.tsx;ABeeZee;{}";
import a from '@next/font/google/target.css?{"arguments":[{}],"import":"ABeeZee","path":"pages/test.tsx"}';
import a from '@next/font/google/target.css?{"arguments":[{}],"import":"ABeeZee","path":"pages/test.tsx"}';
import a from '@next/font/google/target.css?{"arguments":[{}],"import":"ABeeZee","path":"pages/test.tsx"}';
import a from '@next/font/google/target.css?{"arguments":[{}],"import":"ABeeZee","path":"pages/test.tsx"}';
const a = fn({
10: 'hello'
});
Expand Down
@@ -1,2 +1,2 @@
import inter from "@next/font/google/target.css?pages/test.tsx;Inter;{};[]";
import inter from '@next/font/google/target.css?{"arguments":[{},[]],"import":"Inter","path":"pages/test.tsx"}';
const a = fn(...{}, ...[]);
@@ -1 +1 @@
import font from 'cool-fonts/target.css?pages/test.tsx;;{"prop":true}';
import font from 'cool-fonts/target.css?{"arguments":[{"prop":true}],"import":"","path":"pages/test.tsx"}';
@@ -1,5 +1,5 @@
import firaCode from "@next/font/google/target.css?pages/test.tsx;Abel";
import inter from "@next/font/google/target.css?pages/test.tsx;Inter";
import firaCode from '@next/font/google/target.css?{"arguments":[],"import":"Abel","path":"pages/test.tsx"}';
import inter from '@next/font/google/target.css?{"arguments":[],"import":"Inter","path":"pages/test.tsx"}';
import React from 'react';
export { firaCode };
export { inter };
@@ -1,5 +1,5 @@
import firaCode from "@next/font/google/target.css?pages/test.tsx;Abel";
import inter from "@next/font/google/target.css?pages/test.tsx;Inter";
import firaCode from '@next/font/google/target.css?{"arguments":[],"import":"Abel","path":"pages/test.tsx"}';
import inter from '@next/font/google/target.css?{"arguments":[],"import":"Inter","path":"pages/test.tsx"}';
import React from 'react';
export { firaCode };
export default inter;
@@ -1,3 +1,3 @@
import firaCode from '@next/font/google/target.css?pages/test.tsx;Fira_Code;{"fallback":["system-ui",{"key":false},[]],"key":{"key2":{}},"preload":true,"variant":"400"}';
import firaCode from '@next/font/google/target.css?{"arguments":[{"fallback":["system-ui",{"key":false},[]],"key":{"key2":{}},"preload":true,"variant":"400"}],"import":"Fira_Code","path":"pages/test.tsx"}';
import React from 'react';
console.log(firaCode);
@@ -1,2 +1,2 @@
import acme1 from 'cool-fonts/target.css?pages/test.tsx;Acme;{"variant":"400"}';
import acme1 from 'cool-fonts/target.css?{"arguments":[{"variant":"400"}],"import":"Acme","path":"pages/test.tsx"}';
import React from 'react';
@@ -1 +1 @@
import geo from '@next/font/google/target.css?pages/test.tsx;Geo;"test";[1.0];{"a":2.0};3.0';
import geo from '@next/font/google/target.css?{"arguments":["test",[1.0],{"a":2.0},3.0],"import":"Geo","path":"pages/test.tsx"}';
@@ -1,3 +1,3 @@
import inter from '@next/font/google/target.css?pages/test.tsx;Inter;{"display":"swap","variant":"900"}';
import inter from '@next/font/google/target.css?pages/test.tsx;Inter;{"display":"swap","variant":"900"}';
import inter from '@next/font/google/target.css?{"arguments":[{"display":"swap","variant":"900"}],"import":"Inter","path":"pages/test.tsx"}';
import inter from '@next/font/google/target.css?{"arguments":[{"display":"swap","variant":"900"}],"import":"Inter","path":"pages/test.tsx"}';
import React from 'react';
@@ -1,3 +1,3 @@
import inter from '@next/font/google/target.css?pages/test.tsx;Inter;{"variant":"900"}';
import fira from 'cool-fonts/target.css?pages/test.tsx;Fira_Code;{"display":"swap","variant":"400"}';
import inter from '@next/font/google/target.css?{"arguments":[{"variant":"900"}],"import":"Inter","path":"pages/test.tsx"}';
import fira from 'cool-fonts/target.css?{"arguments":[{"display":"swap","variant":"400"}],"import":"Fira_Code","path":"pages/test.tsx"}';
import React from 'react';
@@ -1,3 +1,3 @@
import firaCode from '@next/font/google/target.css?pages/test.tsx;Fira_Code;{"fallback":["system-ui"],"variant":"400"}';
import inter from '@next/font/google/target.css?pages/test.tsx;Inter;{"display":"swap","variant":"900"}';
import firaCode from '@next/font/google/target.css?{"arguments":[{"fallback":["system-ui"],"variant":"400"}],"import":"Fira_Code","path":"pages/test.tsx"}';
import inter from '@next/font/google/target.css?{"arguments":[{"display":"swap","variant":"900"}],"import":"Inter","path":"pages/test.tsx"}';
import React from 'react';
@@ -1,3 +1,3 @@
import inter from '@next/font/google/target.css?pages/test.tsx;Inter;{"variant":"900"}';
import fira from '@next/font/google/target.css?pages/test.tsx;Fira_Code;{"display":"swap","variant":"400"}';
import inter from '@next/font/google/target.css?{"arguments":[{"variant":"900"}],"import":"Inter","path":"pages/test.tsx"}';
import fira from '@next/font/google/target.css?{"arguments":[{"display":"swap","variant":"400"}],"import":"Fira_Code","path":"pages/test.tsx"}';
import React from 'react';
@@ -1 +1 @@
import fira from "@next/font/google/target.css?pages/test.tsx;Fira_Code";
import fira from '@next/font/google/target.css?{"arguments":[],"import":"Fira_Code","path":"pages/test.tsx"}';
11 changes: 6 additions & 5 deletions packages/next/build/webpack/loaders/next-font-loader/index.ts
Expand Up @@ -32,11 +32,12 @@ export default async function nextFontLoader(this: any) {
return outputPath
}

// next-swc next_font_loaders turns each function call argument into JSON seperated by semicolons
let [relativeFilePathFromRoot, functionName, ...data] = this.resourceQuery
.slice(1)
.split(';')
data = data.map((value: string) => JSON.parse(value))
// next-swc next_font_loaders turns each font loader call into JSON
const {
path: relativeFilePathFromRoot,
import: functionName,
arguments: data,
} = JSON.parse(this.resourceQuery.slice(1))

try {
const fontLoader: FontLoader = require(path.join(
Expand Down

0 comments on commit 1a549cc

Please sign in to comment.