In this article, we will review loadJson function in Tsup source code.
We will look at:
loadJson function definition.
jsoncParse function definition.
Where is loadJson invoked?
loadJson function definition
At line 10, in a file named load.ts, in Tsup source code, you will find the below code:
const loadJson = async (filepath: string) => {
try {
return jsoncParse(await fs.promises.readFile(filepath, 'utf8'))
} catch (error) {
if (error instanceof Error) {
throw new Error(
`Failed to parse ${path.relative(process.cwd(), filepath)}: ${
error.message
}`,
)
} else {
throw error
}
}
}
jsoncParse
is returned by this loadJson function and is called with a parameter:
return jsoncParse(await fs.promises.readFile(filepath, 'utf8'))
In the catch block, if the error is an instance of error, a new error is thrown otherwise, the error is simply thrown. There must be a reason behind this way of handling the error, which i do not know yet.
jsoncParse function definition
At line 132 in utils.ts in Tsup source code, you will find this code below:
export function jsoncParse(data: string) {
try {
return new Function(`return ${strip(data).trim()}`)()
} catch {
// Silently ignore any error
// That's what tsc/jsonc-parser did after all
return {}
}
}
This jsoncParse function returns a new function that returns the following function
return new Function(`return ${strip(data).trim()}`)()
and then this function is invoked.
Function
The Function
object provides methods for functions. In JavaScript, every function is actually a Function
object.
Below is an example picked mdn documentation.
// Create a global property with `var`
var x = 10;
function createFunction1() {
const x = 20;
return new Function("return x;"); // this `x` refers to global `x`
}
function createFunction2() {
const x = 20;
function f() {
return x; // this `x` refers to the local `x` above
}
return f;
}
const f1 = createFunction1();
console.log(f1()); // 10
const f2 = createFunction2();
console.log(f2()); // 20
Here, we can see that jsoncParse returns the code below:
return new Function(`return ${strip(data).trim()}`)()
Strip is imported as shown below:
import strip from 'strip-json-comments'
Read more strip-json-comments.
Where is loadJson invoked?
At line 60, in load.ts file, in a function named loadTsupConfig, you will find the below code:
if (configPath) {
if (configPath.endsWith('.json')) {
let data = await loadJson(configPath)
So this is where loadjson is invoked.
About me
Hey, my name is Ramu Narasinga. I study codebase architecture in large open-source projects.
Top comments (1)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.