diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ad0133b
--- /dev/null
+++ b/README.md
@@ -0,0 +1,19 @@
+# oss-services
+
+Various open-source project services by Dudy.
+
+## Apps (`apps/`)
+
+### `apps/swc-plugins/`
+
+- Homepage: https://plugins.swc.rs
+
+This is a web app that lists all the plugins for the [swc](https://swc.rs) project.
+
+## Docs (`docs.`)
+
+### `docs/stc/`
+
+Documentation for the new TypeScript type checker, written in the Rust programming language.
+
+- HomePage: https://stc.dudy.dev
diff --git a/apps/swc-plugins/package.json b/apps/swc-plugins/package.json
index e9a7755..1de50be 100644
--- a/apps/swc-plugins/package.json
+++ b/apps/swc-plugins/package.json
@@ -3,7 +3,7 @@
"version": "0.1.0",
"private": true,
"scripts": {
- "dev": "next dev -p 30000",
+ "dev": "next dev -p 50000",
"build": "next build",
"start": "next start",
"lint": "next lint"
diff --git a/docs/stc/.eslintrc.json b/docs/stc/.eslintrc.json
new file mode 100644
index 0000000..bffb357
--- /dev/null
+++ b/docs/stc/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": "next/core-web-vitals"
+}
diff --git a/docs/stc/.gitignore b/docs/stc/.gitignore
new file mode 100644
index 0000000..c87c9b3
--- /dev/null
+++ b/docs/stc/.gitignore
@@ -0,0 +1,36 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.pnpm-debug.log*
+
+# local env files
+.env*.local
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
diff --git a/docs/stc/README.md b/docs/stc/README.md
new file mode 100644
index 0000000..df6a70e
--- /dev/null
+++ b/docs/stc/README.md
@@ -0,0 +1,3 @@
+# DevMap
+
+개발자를 위한 로드맵입니다.
diff --git a/docs/stc/next.config.js b/docs/stc/next.config.js
new file mode 100644
index 0000000..ee2082d
--- /dev/null
+++ b/docs/stc/next.config.js
@@ -0,0 +1,15 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ reactStrictMode: true,
+ swcMinify: true,
+};
+
+const withNextra = require("nextra")({
+ theme: "nextra-theme-docs",
+ themeConfig: "./theme.config.js",
+ flexsearch: {
+ codeblocks: false,
+ },
+ unstable_staticImage: true,
+});
+module.exports = withNextra(nextConfig);
diff --git a/docs/stc/package.json b/docs/stc/package.json
new file mode 100644
index 0000000..7f3ef1f
--- /dev/null
+++ b/docs/stc/package.json
@@ -0,0 +1,34 @@
+{
+ "name": "stc",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev -p 50001",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint"
+ },
+ "dependencies": {
+ "@vercel/analytics": "^0.1.5",
+ "chart.js": "4.1.2",
+ "chartjs-adapter-date-fns": "3.0.0",
+ "date-fns": "2.29.3",
+ "next": "13.0.6",
+ "nextra": "2.0.1",
+ "nextra-theme-docs": "2.0.1",
+ "react": "^18.0.0",
+ "react-chartjs-2": "5.2.0",
+ "react-dom": "^18.0.0"
+ },
+ "devDependencies": {
+ "@types/node": "17.0.24",
+ "@types/react": "18.0.5",
+ "@types/react-dom": "18.0.1",
+ "autoprefixer": "^10.4.4",
+ "eslint": "8.13.0",
+ "eslint-config-next": "12.1.5",
+ "postcss": "^8.4.12",
+ "tailwindcss": "^3.0.24",
+ "typescript": "4.6.3"
+ }
+}
diff --git a/docs/stc/pages/_app.tsx b/docs/stc/pages/_app.tsx
new file mode 100644
index 0000000..62375ed
--- /dev/null
+++ b/docs/stc/pages/_app.tsx
@@ -0,0 +1,27 @@
+import "nextra-theme-docs/style.css";
+
+import { Analytics } from "@vercel/analytics/react";
+import { NextPage } from "next";
+import { AppProps } from "next/app";
+import { ReactElement, ReactNode } from "react";
+
+// https://nextjs.org/docs/basic-features/layouts#with-typescript
+
+export type NextPageWithLayout = NextPage & {
+ getLayout?: (page: ReactElement) => ReactNode;
+};
+
+type AppPropsWithLayout = AppProps & {
+ Component: NextPageWithLayout;
+};
+
+export default function Nextra({ Component, pageProps }: AppPropsWithLayout) {
+ const getLayout = Component.getLayout ?? ((page) => page);
+
+ return getLayout(
+ <>
+
+
+ >
+ );
+}
diff --git a/docs/stc/pages/_meta.json b/docs/stc/pages/_meta.json
new file mode 100644
index 0000000..7405741
--- /dev/null
+++ b/docs/stc/pages/_meta.json
@@ -0,0 +1,15 @@
+{
+ "index": {
+ "title": "Introduction",
+ "type": "page",
+ "hidden": true
+ },
+ "docs": {
+ "title": "Docs",
+ "type": "page"
+ },
+ "blog": {
+ "title": "Blog",
+ "type": "page"
+ }
+}
diff --git a/docs/stc/pages/blog/_meta.json b/docs/stc/pages/blog/_meta.json
new file mode 100644
index 0000000..76a91da
--- /dev/null
+++ b/docs/stc/pages/blog/_meta.json
@@ -0,0 +1,3 @@
+{
+ "this-week-in-stc": "Status updates"
+}
diff --git a/docs/stc/pages/blog/this-week-in-stc/_meta.json b/docs/stc/pages/blog/this-week-in-stc/_meta.json
new file mode 100644
index 0000000..0e99bf2
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/_meta.json
@@ -0,0 +1,26 @@
+{
+ "frequency-change": "Frequency change",
+ "week-23": "Week 23",
+ "week-22": "Week 22",
+ "week-21": "Week 21",
+ "week-20": "Week 20",
+ "week-19": "Week 19",
+ "week-18": "Week 18",
+ "week-17": "Week 17",
+ "week-16": "Week 16",
+ "week-15": "Week 15",
+ "week-14": "Week 14",
+ "week-13": "Week 13",
+ "week-12": "Week 12",
+ "week-11": "Week 11",
+ "week-10": "Week 10",
+ "week-9": "Week 9",
+ "week-8": "Week 8",
+ "week-7": "Week 7",
+ "week-6": "Week 6",
+ "week-5": "Week 5",
+ "week-4": "Week 4",
+ "week-3": "Week 3",
+ "week-2": "Week 2",
+ "week-1": "Week 1"
+}
diff --git a/docs/stc/pages/blog/this-week-in-stc/frequency-change.mdx b/docs/stc/pages/blog/this-week-in-stc/frequency-change.mdx
new file mode 100644
index 0000000..75f2872
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/frequency-change.mdx
@@ -0,0 +1,9 @@
+---
+title: "Change to the frequency of update posts"
+date: 2023/4/23
+description: "We are changing weekly blog post to monthly blog post."
+author: kdy1
+---
+
+We are changing weekly blog post to monthly blog post.
+This is because we are going to focus on large tasks, which do not have much progress every week.
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-1.mdx b/docs/stc/pages/blog/this-week-in-stc/week-1.mdx
new file mode 100644
index 0000000..76c2e6f
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-1.mdx
@@ -0,0 +1,72 @@
+---
+title: "This week in stc, 1"
+date: 2022/11/13
+description: "The first status update for stc"
+author: kdy1
+---
+
+I'm going to provide a weekly update for the status of [stc][].
+This is the first post.
+
+---
+
+## TL;DR;
+
+Stats:
+
+```
+{
+ required_error: 5155 => 4463,
+ matched_error: 4711 => 5421,
+ extra_error: 1983 => 999,
+ panic: 103 => 89,
+}
+```
+
+This is the diff for [the last commit on November, 6](https://github.com/dudykr/stc/blob/c1e5e0949368f26d2453ed7420aea35edc405507/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on November, 13](https://github.com/dudykr/stc/blob/b451a2921766755bf94199f38489addd1d692897/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug)
+
+## Contributions
+
+Many people contributed to stc, either by contributing developer time or financially.
+
+![Contributors](/images/this-week-in-stc/1/contributors.png)
+
+This is a screenshot for 1 month because this is the first update.
+
+## Noticeable changes
+
+- [#284](https://github.com/dudykr/stc/pull/284): Make `fix()` shallow.
+
+This improve performance by margin.
+`Type` of `stc` has some invariants to make it easier to handle.
+One example of the invariants is that a union cannot include a union as an element, because it causes lots of troubles with the pattern matching of Rust.
+There's a function named `fix`, which ensures that a type satisfies all of the invariants.
+But previously, it was recursive and it was a costly operation.
+It's now shallow and it does not recurse into `Union` nor `Intersection`.
+Performance gain is noticeable.
+The test execution with a x**debug build** previously took 1m 45s, but it now takes 1m 20s.
+
+- [#275](https://github.com/dudykr/stc/pull/275): Determine project structure for LSP.
+
+My plan is to provide a LSP for TypeScript after fixing all type inference bugs.
+I want to make it testable, so I tried various structures.
+While triage, I found a project structure which is testable.
+I decided to use the `examples` directory of cargo to create a LSP binary which can be used for testing.
+Basically, this structure allows **using exactly same code** for testing environment and the release build of stc LSP.
+
+Special thanks to Deno because I referred to the structure of Deno lsp a lot.
+
+- [#245](https://github.com/dudykr/stc/pull/245): Update swc.
+
+This is one of the tasks I wanted to do, but postponed due to the time.
+Divy helped a lot, and I managed to update swc crates.
+This introduced some regressions, but those are all fixed at the moment.
+
+- [#227](https://github.com/dudykr/stc/pull/227): Fix stack overflow of module loader.
+
+This patch fixes the issue which blocked people from trying stc on their own project.
+`stc` could verify a huge TypeScript module if it does not have an import, but this patch reduces the restrictions for real-world project further.
+
+---
+
+[stc]: https://github.com/dudykr/stc
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-10.mdx b/docs/stc/pages/blog/this-week-in-stc/week-10.mdx
new file mode 100644
index 0000000..803e3e8
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-10.mdx
@@ -0,0 +1,45 @@
+---
+title: "This week in stc, 10"
+date: 2023/1/22
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc][], the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ required_error: 4291 => 4248,
+ matched_error: 5814 => 5826,
+ extra_error: 1118 => 929,
+ panic: 29 => 20,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/fcf2e3c58eca78aa46fdbe4c16435225b9a2a663/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on 1/22](https://github.com/dudykr/stc/blob/5442585ceda0487cb40307a24523b0c96d833d8e/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug).
+We changed the way we count the number of errors to make it represent the actual progress more closely.
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/10/contributors.png)
+
+There were lots of Contributions this week.
+Thank you!
+
+## Noticable changes
+
+### builtin update ([#528](https://github.com/dudykr/stc/pull/528))
+
+We updated the builtin types to the latest version.
+
+### `csstype` ([#521](https://github.com/dudykr/stc/pull/521))
+
+`stc` now can process `csstype` package without a false positive.
+
+---
+
+[stc]: https://github.com/dudykr/stc
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-11.mdx b/docs/stc/pages/blog/this-week-in-stc/week-11.mdx
new file mode 100644
index 0000000..d9e2b6a
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-11.mdx
@@ -0,0 +1,31 @@
+---
+title: "This week in stc, 11"
+date: 2023/1/29
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc][], the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ required_error: 4248 => 4183,
+ matched_error: 5826 => 5891,
+ extra_error: 929 => 825,
+ panic: 20 => 18,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/5442585ceda0487cb40307a24523b0c96d833d8e/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on 1/29](https://github.com/dudykr/stc/blob/14d5ac24b3c4324d6384ae5d207f4fef9e3ae1fb/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug).
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/11/contributors.png)
+
+Thank you, everyone!
+
+[stc]: https://github.com/dudykr/stc
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-12.mdx b/docs/stc/pages/blog/this-week-in-stc/week-12.mdx
new file mode 100644
index 0000000..bfbbd8b
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-12.mdx
@@ -0,0 +1,37 @@
+---
+title: "This week in stc, 12"
+date: 2023/2/5
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc][], the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ Matched: 5891 => 5881,
+ Bad (required): 4183 => 4193,
+ Bad (excess): 825 => 714,
+ Bad (panic): 18,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/14d5ac24b3c4324d6384ae5d207f4fef9e3ae1fb/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on 2/5](https://github.com/dudykr/stc/blob/8ea5b02590550cdd7d1e6cbf53a54bc719be99a2/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug). I took vacation this week, so there was a lot of progress.
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/12/contributors.png)
+
+There was one contributor this week, but he's a long-term contributor and he contributed a lot of code. Thank you!
+
+## Noticable changes
+
+### Change of the testing strategy
+
+I'm working to split the official conformance test suite from `tsc` into smaller unit tests. Once it's finished, progress will be much faster.
+
+[stc]: https://github.com/dudykr/stc
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-13.mdx b/docs/stc/pages/blog/this-week-in-stc/week-13.mdx
new file mode 100644
index 0000000..afa091e
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-13.mdx
@@ -0,0 +1,34 @@
+---
+title: "This week in stc, 13"
+date: 2023/2/12
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc](https://github.com/dudykr/stc), the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ Matched: 5881 => 5912,
+ Bad (required): 4193 => 4162,
+ Bad (excess): 714 => 638,
+ Bad (panic): 18,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/8ea5b02590550cdd7d1e6cbf53a54bc719be99a2/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on 2/12](https://github.com/dudykr/stc/blob/b5f1cf11908d89b2a82854249e6f296a0cb5109a/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug).
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/13/contributors.png)
+
+There were so many contributions this week!
+Thank you, everyone!
+
+## Noticable changes
+
+All works were about making stc more compatible with tsc, i.e. making type inference more correct.
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-14.mdx b/docs/stc/pages/blog/this-week-in-stc/week-14.mdx
new file mode 100644
index 0000000..173a712
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-14.mdx
@@ -0,0 +1,30 @@
+---
+title: "This week in stc, 14"
+date: 2023/2/19
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc](https://github.com/dudykr/stc), the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ Matched: 5912 => 5995,
+ Bad (required): 4162 => 3753,
+ Bad (excess): 638 => 927,
+ Bad (panic): 18 => 228,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/b5f1cf11908d89b2a82854249e6f296a0cb5109a/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on 2/19](https://github.com/dudykr/stc/blob/ad91d8ac2936f9befb8dbffb43a687b77402318c/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug).
+The `Bad (panic)` and `Bad (excess)` regressed because we enabled multi-file tests, but the loader for testing is not fully-featured and panics if it does not know how to load a depdendency.
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/14/contributors.png)
+
+Just like last week, there were lots of contributors. Thank you!
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-15.mdx b/docs/stc/pages/blog/this-week-in-stc/week-15.mdx
new file mode 100644
index 0000000..2f1d6b8
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-15.mdx
@@ -0,0 +1,30 @@
+---
+title: "This week in stc, 15"
+date: 2023/2/26
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc](https://github.com/dudykr/stc), the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ Matched: 5995 => 6023,
+ Bad (required): 3753 => 3788,
+ Bad (excess): 927 => 1105,
+ Bad (panic): 228 => 100,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/ad91d8ac2936f9befb8dbffb43a687b77402318c/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on 2/26](https://github.com/dudykr/stc/blob/24599a0028bc1089a940a73df1049a2125cf8d12/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug).
+Although I (@kdy1) went a vacation this week, there were many progress thanks to contributors.
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/15/contributors.png)
+
+There were lots of contributors. Thank you!
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-16.mdx b/docs/stc/pages/blog/this-week-in-stc/week-16.mdx
new file mode 100644
index 0000000..f1c53a7
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-16.mdx
@@ -0,0 +1,39 @@
+---
+title: "This week in stc, 16"
+date: 2023/3/5
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc](https://github.com/dudykr/stc), the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ Matched: 6023 => 6135,
+ Bad (required): 3788 => 3866,
+ Bad (excess): 1105 => 867,
+ Bad (panic): 100 => 105,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/24599a0028bc1089a940a73df1049a2125cf8d12/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on 3/5](https://github.com/dudykr/stc/blob/1fa615e2f3dce751ba0b371ff5cb6122f306c254/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug).
+
+## Noticable changes
+
+### Test suite update ([#785](https://github.com/dudykr/stc/pull/785))
+
+We update the test suite to the latest version, and that's why all numbers in the stats got bigger.
+
+### Lots of refactoring
+
+We did lots of refactoring this week, to make the further development easier.
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/16/contributors.png)
+
+There were lots of contributors. Thank you!
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-17.mdx b/docs/stc/pages/blog/this-week-in-stc/week-17.mdx
new file mode 100644
index 0000000..e4a4687
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-17.mdx
@@ -0,0 +1,31 @@
+---
+title: "This week in stc, 17"
+date: 2023/3/12
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc](https://github.com/dudykr/stc), the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ Matched: 6135 => 6161,
+ Bad (required): 3866 => 3840,
+ Bad (excess): 867 => 847,
+ Bad (panic): 105 => 107,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/1fa615e2f3dce751ba0b371ff5cb6122f306c254/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on 3/12](https://github.com/dudykr/stc/blob/b918d5e0a9cf1a1b1d1cc6e1ff028ba40795817d/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug).
+
+There was no many progress this work, but still some progress.
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/17/contributors.png)
+
+There were lots of contributors. Thank you!
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-18.mdx b/docs/stc/pages/blog/this-week-in-stc/week-18.mdx
new file mode 100644
index 0000000..bdf7c6e
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-18.mdx
@@ -0,0 +1,32 @@
+---
+title: "This week in stc, 18"
+date: 2023/3/19
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc](https://github.com/dudykr/stc), the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ Matched: 6161 => 6248,
+ Bad (required): 3840 => 3753,
+ Bad (excess): 847 => 703,
+ Bad (panic): 107 => 105,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/b918d5e0a9cf1a1b1d1cc6e1ff028ba40795817d/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on 3/19](https://github.com/dudykr/stc/blob/6e52c07298905c8507729b7500d6262c28ef6004/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug).
+
+The stats were drastically improved mainly because there are so many rules that have already been implemented.
+**A test passes only when all relevant rules are implemented.**
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/18/contributors.png)
+
+Thank you all!
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-19.mdx b/docs/stc/pages/blog/this-week-in-stc/week-19.mdx
new file mode 100644
index 0000000..f0da341
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-19.mdx
@@ -0,0 +1,37 @@
+---
+title: "This week in stc, 19"
+date: 2023/3/26
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc](https://github.com/dudykr/stc), the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ Matched: 6248 => 6295,
+ Bad (required): 3753 => 3739,
+ Bad (excess): 703 => 820,
+ Bad (panic): 105 => 107,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/6e52c07298905c8507729b7500d6262c28ef6004/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on 3/26](https://github.com/dudykr/stc/blob/0cdf38b9358728c3ac592baf2bbedc31c507be6f/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug).
+
+Stats regressed because we updated SWC and now the tests for auto-accoessors are marked as extra errors (`Unimplemented`).
+
+## Noticable changes
+
+### SWC update ([#846](https://github.com/dudykr/stc/pull/846))
+
+The previous version of SWC did not support auto-accoessors, but we updated SWC to the latest at the time of authoring PR and now it's parsed.
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/19/contributors.png)
+
+Thank you all!
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-2.mdx b/docs/stc/pages/blog/this-week-in-stc/week-2.mdx
new file mode 100644
index 0000000..66a7470
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-2.mdx
@@ -0,0 +1,140 @@
+---
+title: "This week in stc, 2"
+date: 2022/11/20
+description: "The second status update for stc"
+author: kdy1
+---
+
+This is the second status update for [stc][], the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+{
+ required_error: 4463 => 4350,
+ matched_error: 5421 => 5534,
+ extra_error: 999 => 1051,
+ panic: 89 => 77,
+}
+```
+
+This is the diff for [the last commit on November, 13](https://github.com/dudykr/stc/blob/b451a2921766755bf94199f38489addd1d692897/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on November, 20](https://github.com/dudykr/stc/blob/c897b03cf317a385d5ff0d90a3cd52f399af0a3f/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug)
+
+`extra_error` means a false positive. In other words, it's the number of incorrect errors `stc` emits while it should not.
+Reducing it is the primary focus, but it was increased because I fixed lots of panics.
+If the analyzer panics while analyzing a test case, the stat becomes
+
+```rust
+Stats {
+ required_error: required_error,
+ matched_error: 0,
+ extra_error: 0,
+ panic: 1
+}
+```
+
+When the panic is fixed, the analyzer may emit errors, and some of them are wrong.
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/2/contributors.png)
+
+There were some contributors this week.
+
+## Noticeable changes
+
+- [#315](https://github.com/dudykr/stc/pull/315): Groundwork for RAII-based context for errors.
+
+Debugging [stc][] is a very difficult task.
+To help debugging, [stc][] emits some context information for each errors.
+
+It looks like the below.
+
+```
+ x context:
+ | lhs = number;
+ | rhs = true;
+ | context: `fail!()` called from assign/mod.rs:1840
+ | LHS (final): number;
+ | RHS (final): true;
+ | WrongArgType {
+ | span: Span {
+ | lo: BytePos(
+ | 941,
+ | ),
+ | hi: BytePos(
+ | 945,
+ | ),
+ | ctxt: #0,
+ | },
+ | inner: AssignFailed {
+ | span: Span {
+ | lo: BytePos(
+ | 941,
+ | ),
+ | hi: BytePos(
+ | 945,
+ | ),
+ | ctxt: #0,
+ | },
+ | cause: [],
+ | },
+ | }
+ ,-[$DIR/tests/conformance/types/union/unionTypeConstructSignatures.ts:15:1]
+ 15 | new unionOfDifferentReturnType1(true); // error in type of parameter
+ : ^^^^
+ `----
+```
+
+Previously, these contexts are added by calling `.context` method on the `Result` or the `Error` type, like
+
+```rust
+return Err(ErrorKind::AssignFailed {
+ span,
+ left: box to.clone(),
+ right: box rhs.clone(),
+ right_ident: opts.right_ident_span,
+ cause: vec![],
+}
+.context({
+ format!(
+ "`fail!()` called from assign/mod.rs:{}\nLHS (final): {}\nRHS (final): {}",
+ line!(),
+ dump_type_as_string(&self.cm, to),
+ dump_type_as_string(&self.cm, rhs)
+ )
+}))
+```
+
+But this is problematic because it does not attach additional context if I simply add `?` operator to an expression.
+
+I found a better solution.
+Once migration is done, it will look like
+
+```rust
+let _ctx = ctx!(format!("convert_type_to_type_lit: {:?}", ty));
+
+let ty = self.normalize(Some(span), ty, NormalizeTypeOpts { ..Default::default() })?;
+
+call_other()?;
+```
+
+instead of
+
+```rust
+let ty = self.normalize(Some(span), ty, NormalizeTypeOpts { ..Default::default() })
+ .with_context(|| format!("convert_type_to_type_lit: {:?}", ty));
+
+call_other().with_context(|| format!("convert_type_to_type_lit: {:?}", ty))?;
+```
+
+which is too verbose.
+
+Additionally, this allows tracking errors directly reported.
+In previous version there were no concept of stack.
+So there was no way to add full context to errors generated from the current code path.
+The new version will allow faster debugging.
+
+[stc]: https://github.com/dudykr/stc
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-20.mdx b/docs/stc/pages/blog/this-week-in-stc/week-20.mdx
new file mode 100644
index 0000000..f5a0ceb
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-20.mdx
@@ -0,0 +1,33 @@
+---
+title: "This week in stc, 20"
+date: 2023/4/2
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc](https://github.com/dudykr/stc), the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ Matched: 6295 => 6315,
+ Bad (required): 3739 => 3719,
+ Bad (excess): 820 => 772,
+ Bad (panic): 107 => 106,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/0cdf38b9358728c3ac592baf2bbedc31c507be6f/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on 4/2](https://github.com/dudykr/stc/blob/e8cf60f9aa3fafb41cbf8261d6b82e60b4ce40f4/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug).
+
+Although I (`@kdy1`) was very busy, I and the contributors managed to fix some bugs.
+Actually, I'm working on a new log viewer project for stc.
+It will take some time, but I'm sure that it will make the development of stc much easier.
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/20/contributors.png)
+
+Thank you!
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-21.mdx b/docs/stc/pages/blog/this-week-in-stc/week-21.mdx
new file mode 100644
index 0000000..159fdad
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-21.mdx
@@ -0,0 +1,30 @@
+---
+title: "This week in stc, 21"
+date: 2023/4/9
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc](https://github.com/dudykr/stc), the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ Matched: 6315 => 6326,
+ Bad (required): 3719 => 3708,
+ Bad (excess): 772,
+ Bad (panic): 106 => 73,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/e8cf60f9aa3fafb41cbf8261d6b82e60b4ce40f4/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on 4/9](https://github.com/dudykr/stc/blob/82a663b6d6773023969416dcfe84de0cac5f5bd3/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug).
+We fixed lots of excess errors, but the number regressed while fixing panics.
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/21/contributors.png)
+
+Thank you!
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-22.mdx b/docs/stc/pages/blog/this-week-in-stc/week-22.mdx
new file mode 100644
index 0000000..44bcffa
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-22.mdx
@@ -0,0 +1,30 @@
+---
+title: "This week in stc, 22"
+date: 2023/4/16
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc](https://github.com/dudykr/stc), the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ Matched: 6326 => 6356,
+ Bad (required): 3708 => 3678,
+ Bad (excess): 772 => 744,
+ Bad (panic): 73 => 72,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/82a663b6d6773023969416dcfe84de0cac5f5bd3/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on 4/16](https://github.com/dudykr/stc/blob/dce9791936c6488a187fc988d51361b327fe189d/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug).
+I (`@kdy1`) was too busy because of swc, so I couldn't work on stc a lot.
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/22/contributors.png)
+
+Thank you!
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-23.mdx b/docs/stc/pages/blog/this-week-in-stc/week-23.mdx
new file mode 100644
index 0000000..0e0f6bf
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-23.mdx
@@ -0,0 +1,36 @@
+---
+title: "This week in stc, 23"
+date: 2023/4/16
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc](https://github.com/dudykr/stc), the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+```
+Stats {
+ Matched: 6356 => 6377,
+ Bad (required): 3678 => 3658,
+ Bad (excess): 766,
+ Bad (panic): 74,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/dce9791936c6488a187fc988d51361b327fe189d/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on 4/23](https://github.com/dudykr/stc/blob/18624b68e031b617b1e697705b1059273a6e7d8a/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug).
+The stats regressed because we updated our test suite to match the latest version of TypeScript.
+
+# Noticable changes
+
+## Language server
+
+![Screenshot](/images/this-week-in-stc/23/lsp.png)
+
+We are working on a language server for stc. It is still in early stage, and the main goal is to help us to debug the type checker.
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/23/contributors.png)
+
+Thank you!
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-3.mdx b/docs/stc/pages/blog/this-week-in-stc/week-3.mdx
new file mode 100644
index 0000000..1aadd1b
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-3.mdx
@@ -0,0 +1,36 @@
+---
+title: "This week in stc, 3"
+date: 2022/11/27
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc][], the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ required_error: 4350 => 4338,
+ matched_error: 5534 => 5546,
+ extra_error: 1051 => 991,
+ panic: 77 => 74,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/c897b03cf317a385d5ff0d90a3cd52f399af0a3f/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on November, 27](https://github.com/dudykr/stc/blob/41b76af273b27a172b6f8e50d7ea36f1bf0eda46/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug)
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/3/contributors.png)
+
+There were one contributor this week.
+I took a vacation and I went on a trip, so I didn't have lots of time to do stc work.
+
+## Noticeable changes
+
+There was no noticable change this week.
+
+[stc]: https://github.com/dudykr/stc
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-4.mdx b/docs/stc/pages/blog/this-week-in-stc/week-4.mdx
new file mode 100644
index 0000000..46d0e72
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-4.mdx
@@ -0,0 +1,36 @@
+---
+title: "This week in stc, 4"
+date: 2022/12/04
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc][], the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ required_error: 4338 => 4301,
+ matched_error: 5546 => 5583,
+ extra_error: 991 => 869,
+ panic: 74,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/41b76af273b27a172b6f8e50d7ea36f1bf0eda46/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on December, 4](https://github.com/dudykr/stc/blob/d8b1673e3f145af6a0cb3eb896b02a6798e87df5/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug)
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/4/contributors.png)
+
+There were one contributor this week.
+
+## Noticeable changes
+
+There was no noticable change this week.
+All PRs were steady jobs.
+
+[stc]: https://github.com/dudykr/stc
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-5.mdx b/docs/stc/pages/blog/this-week-in-stc/week-5.mdx
new file mode 100644
index 0000000..cd43bf4
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-5.mdx
@@ -0,0 +1,36 @@
+---
+title: "This week in stc, 5"
+date: 2022/12/11
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc][], the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ required_error: 4301 => 4294,
+ matched_error: 5583 => 5590,
+ extra_error: 869 => 817,
+ panic: 74,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/d8b1673e3f145af6a0cb3eb896b02a6798e87df5/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on December, 11](https://github.com/dudykr/stc/blob/23dd114529f10c5d645887c055cd396d1bfe7b11/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug)
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/5/contributors.png)
+
+There were two contributors this week.
+
+## Noticeable changes
+
+There was no noticable change this week.
+All PRs were steady jobs.
+
+[stc]: https://github.com/dudykr/stc
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-6.mdx b/docs/stc/pages/blog/this-week-in-stc/week-6.mdx
new file mode 100644
index 0000000..09abbb7
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-6.mdx
@@ -0,0 +1,36 @@
+---
+title: "This week in stc, 6"
+date: 2022/12/18
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc][], the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ required_error: 4294 => 4270,
+ matched_error: 5590 => 5614,
+ extra_error: 817 => 761,
+ panic: 74,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/23dd114529f10c5d645887c055cd396d1bfe7b11/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on December, 11](https://github.com/dudykr/stc/blob/d6dc481fd29c9e6e93e268dbd4f11a7b3883a6d2/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug)
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/6/contributors.png)
+
+There were lots of contributors this week.
+Thank you!
+
+## Noticeable change
+
+There were no noticable change, but I'm working on [#414: Ignore wrong test refs](https://github.com/dudykr/stc/pull/414), which makes the testing system stricter. I expect a productivity boost from it.
+
+[stc]: https://github.com/dudykr/stc
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-7.mdx b/docs/stc/pages/blog/this-week-in-stc/week-7.mdx
new file mode 100644
index 0000000..d33317b
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-7.mdx
@@ -0,0 +1,37 @@
+---
+title: "This week in stc, 7"
+date: 2023/1/1
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc][], the new TypeScript type checker written in Rust.
+Note that preivous status update was skipped, because I was too busy.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ required_error: 4270 => 4245,
+ matched_error: 5614 => 5629,
+ extra_error: 761 => 743,
+ panic: 74 => 72,
+}
+```
+
+Note: This is the change of two weeks.
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/d6dc481fd29c9e6e93e268dbd4f11a7b3883a6d2/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on 1/1](https://github.com/dudykr/stc/blob/977a433daae8d5dd51312e2c8921912008396b17/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug)
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/7/contributors.png)
+
+There were more contributors previous week, but GitHub does not provide the data for the previous week.
+Thank you, everyone!
+
+---
+
+[stc]: https://github.com/dudykr/stc
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-8.mdx b/docs/stc/pages/blog/this-week-in-stc/week-8.mdx
new file mode 100644
index 0000000..40f62d4
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-8.mdx
@@ -0,0 +1,34 @@
+---
+title: "This week in stc, 8"
+date: 2023/1/8
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc][], the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ required_error: 4245 => 4237,
+ matched_error: 5639 => 5647,
+ extra_error: 743 => 735,
+ panic: 72 => 71,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/977a433daae8d5dd51312e2c8921912008396b17/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on 1/8](https://github.com/dudykr/stc/blob/b021e8958481fedb12c648f070963b59ccb28128/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug).
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/8/contributors.png)
+
+There were 3 contributors this week.
+Thank you!
+
+---
+
+[stc]: https://github.com/dudykr/stc
diff --git a/docs/stc/pages/blog/this-week-in-stc/week-9.mdx b/docs/stc/pages/blog/this-week-in-stc/week-9.mdx
new file mode 100644
index 0000000..235b74c
--- /dev/null
+++ b/docs/stc/pages/blog/this-week-in-stc/week-9.mdx
@@ -0,0 +1,49 @@
+---
+title: "This week in stc, 9"
+date: 2023/1/15
+description: "The status update for stc"
+author: kdy1
+---
+
+This is the status update for [stc][], the new TypeScript type checker written in Rust.
+
+## TL;DR;
+
+Stats:
+
+```
+Stats {
+ required_error: 4237 => 4291,
+ matched_error: 5647 => 5814,
+ extra_error: 735 => 1118,
+ panic: 71 => 29,
+}
+```
+
+This is the diff for [the commit used for previous status update](https://github.com/dudykr/stc/blob/b021e8958481fedb12c648f070963b59ccb28128/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug) and [the last commit on 1/15](https://github.com/dudykr/stc/blob/fcf2e3c58eca78aa46fdbe4c16435225b9a2a663/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug).
+We changed the way we count the number of errors to make it represent the actual progress more closely.
+
+## Contributions
+
+![Contributors](/images/this-week-in-stc/9/contributors.png)
+
+There were lots of Contributions this week.
+Thank you!
+
+## Noticable changes
+
+### Change the way we count errors ([#487](https://github.com/dudykr/stc/pull/487))
+
+There are matrix tests in the test suite of `tsc`.
+Those tests have one input, but have multiple results, depending on the directives like `@target: es5, es2015, esnext`.
+Previously, we counted them as one test.
+But we now count the matrix tests, which has multiple result, once per the result.
+That's the main reason why the number of `extra_error` increased.
+
+### Remove panic ([#468](https://github.com/dudykr/stc/pull/468), [#493](https://github.com/dudykr/stc/pull/493))
+
+We replaced `panic!` calls with `Unimplemented` errors to make the stats more accurate.
+
+---
+
+[stc]: https://github.com/dudykr/stc
diff --git a/docs/stc/pages/docs/_meta.json b/docs/stc/pages/docs/_meta.json
new file mode 100644
index 0000000..17158f5
--- /dev/null
+++ b/docs/stc/pages/docs/_meta.json
@@ -0,0 +1,5 @@
+{
+ "getting-started": "Getting Started",
+ "roadmap": "Roadmap",
+ "contributing": "Contributing"
+}
diff --git a/docs/stc/pages/docs/contributing.mdx b/docs/stc/pages/docs/contributing.mdx
new file mode 100644
index 0000000..402ad01
--- /dev/null
+++ b/docs/stc/pages/docs/contributing.mdx
@@ -0,0 +1,215 @@
+# Contributing
+
+## Configuring development environment
+
+1. Clone stc.
+2. Run `yarn` in the cloned directory.
+3. (mac only) Install `zld`
+
+```sh
+brew install michaeleisel/zld/zld
+```
+
+## Testing system
+
+If the filename of a test case file described below starts with `.`, it means it's ignored.
+
+## Project structure
+
+### crates/stc_ts_file_analyzer
+
+Frequently used scripts:
+
+- `./scripts/fast.sh`
+
+If no argument is specified, this runs all `base` tests declared in the file analyzer crate.
+This script is fast, so you can run it frequently.
+
+**Note**: This command does not enable logging because it's too verbose.
+
+---
+
+- `./scripts/base.sh`
+
+If no argument is specified, this runs all `base` tests declared in the file analyzer crate.
+This command is slow, so it's recommended to use it like
+
+```bash
+./scripts/base.sh pass_only_tests__pass_only__conformance__types__tuple__variadicTuples1__3_ts
+```
+
+You can get the test name by invoking `./scripts/fast.sh`, `./scripts/test.sh` (from stc_ts_type_checker), or `./scripts/check.sh` (from stc_ts_type_checker).
+
+---
+
+- `./scripts/auto-unignore.sh`
+
+This command can be used to select a task to work on, or verify that your change make more `pass-only`/`errors` tests pass.
+
+**Note**: This command does not enable logging because it's too verbose.
+
+#### tests/base.rs
+
+This test file declares 5 testing systems, `pass`, `pass-only`, `errors`, `tsc`, and `visualize`.
+You should prefer shell scripts in `scripts` directory over direct `cargo test` invokation.
+
+#### tests/pass-only
+
+Any TypeScript file in this directory will be evaluated, and the test systme will ensure that `stc` doesn't emit any error.
+
+#### tests/pass
+
+Any TypeScript file in this directory will be evaluated, the test systme will ensure that `stc` doesn't emit any error, and the type of expressions are printed to a `.swc-stderr` file.
+
+#### tests/errors
+
+Any TypeScript file in this directory will be evaluated, and the test systme will ensure that `stc` emit at least one error.
+In future, we will check the error message as well.
+
+#### tests/tsc
+
+Any TypeScript file in this directory will be evaluated, and the result will be compared with the official TypeScript compiler.
+
+#### tests/visualize
+
+Any TypeScript file in this directory will be evaluated, and the type of expressions are printed to a `.swc-stderr` file.
+
+### crates/stc_ts_type_checker
+
+- `./scripts/check.sh`
+
+You can invoke this script to run all conformance tests, and update stats.
+
+**Note**: This command invokes base tests described above, and aborts if it fails.
+
+---
+
+- `./scripts/test.sh`
+
+You can invoke single conformance test case by using `./scripts/test.sh` from `./crates/stc_ts_type_checker`.
+
+```bash
+./scripts/test.sh staticIndexSignature
+```
+
+will run conformance tests which have `staticIndexSignature` in their test name.
+
+**Note**: This command invokes base tests described above, and aborts if it fails.
+
+#### tests/tsc.rs
+
+This test suite declares the test suite ported from the official TypeScript compiler, `tsc`.
+You are not expected to run this test via `cargo test` directly, and instead you should use `./scripts/test.sh` or `./scripts/check.sh`.
+
+## Workflows
+
+Regardless of the workflow you choose, you should run `./scripts/check.sh` when you are done.
+
+### Using unit test (in file analyzer)
+
+You can run
+
+```bash
+./scripts/auto-unignore.sh
+```
+
+to get list of tasks to work on.
+Select one test input file from the terminal, and reanme it to not have `.` as prefix in their filename.
+
+e.g.
+
+- `.foo/1.ts` => `foo/1.ts`
+- `foo/.1.ts` => `foo/1.ts`
+
+Then, you can run
+
+```bash
+./scripts/fast.sh
+```
+
+to run the tests in a timely manner, or
+
+```bash
+./scripts/base.sh $test_name
+```
+
+to get log messages.
+
+### Using conformance test suite
+
+First, you should find a erroneous test case.
+Typically, you can find one by running `./scripts/check.sh` from `./crates/stc_ts_type_checker`.
+It will print enormous amount of log.
+You should focus on false-positives.
+Each error will contain lots of information required for debugging, with `context:` prefix.
+
+If you want, you can copy the file to `./crates/stc_ts_file_analyzer/tests/...` and run `./scripts/fast.sh` from the file analyzer.
+It's recommended to reduce the test input as much as possible, because `stc` prints enormous amount of log messages in a debug build.
+
+Otherwise, you can use `./scripts/test.sh` from `./crates/stc_ts_type_checker` to run a single test case.
+As `./scripts/test.sh` prints log messags, debugging will be easier.
+
+### Finding test cases with specific excessive errors
+
+You can run `./scripts/errors/find-extra.sh TS2322` from `./crates/stc_ts_type_checker` to find all false-positive `TS2322` errors.
+
+## Debugging tips
+
+### Rustdoc
+
+You can look at [the rustdoc for `Analyzer`](https://rustdoc.stc.dudy.dev/stc_ts_file_analyzer/analyzer/struct.Analyzer.html) to get list of implemented operations.
+
+### Debugging with vscode Debugger
+
+Please copy `.vscode/launch.template.json` and rename it to `.vscode/launch.json`.
+
+In `launch.json`, you can pass the path of the `.ts` file you want to check to the `args` field.
+Then, you can run the type checker with debugger from the debugger panel.
+
+### `print_backtrace()`
+
+If you think some code should not be invoked but seems like it's invoked, you can use `print_backtrace()`.
+It will print the stack trace of the current thread.
+Note that it will automatically exclude useless items from the stack trace.
+
+### Matching over `Type`
+
+To avoid performance drop caused by cloning, `stc` uses `Type::Arc` to share memory.
+But there's a downside for this - you have to call `normalize()` while matching.
+
+e.g.
+
+```rust
+match ty.normalize() {
+}
+```
+
+Note that this is different from `self.normalize(ty)` of `Analyzer`, which is used to expand special types like references, queries, mapped, etc..
+
+### Finding problematic code
+
+Look at the `context:` in the error output, and search it from repository using substring of the context.
+e.g. `tried to assign to a template type` means the error comes from [analyzer/assign/mod.rs#L2208](https://github.com/dudykr/stc/blob/1c73ce5fa87ec789ead108c5c6876e8089b1e5de/crates/stc_ts_file_analyzer/src/analyzer/assign/mod.rs#L2208)
+
+## Troubleshooting
+
+### Windows - `unstable on this platform`
+
+In case if you're using Windows and getting an error
+
+```sh
+error: `-Csplit-debuginfo=unpacked` is unstable on this platform
+```
+
+as a workaround you can try using [WSL](https://learn.microsoft.com/en-us/windows/wsl/).
+
+### `failed to execute command`
+
+If you're getting something like
+
+```sh
+--- stderr
+ thread 'main' panicked at 'failed to execute command: No such file or directory (os error 2)', /home/ubuntu/.cargo/registry/src/github.com-1ecc6299db9ec823/tikv-jemalloc-sys-0.5.2+5.3.0-patched/build.rs:326:19
+```
+
+try running `apt-get install make`. ([related issue](https://github.com/gnzlbg/jemallocator/issues/148#issuecomment-619373613))
diff --git a/docs/stc/pages/docs/getting-started.mdx b/docs/stc/pages/docs/getting-started.mdx
new file mode 100644
index 0000000..9e35bb5
--- /dev/null
+++ b/docs/stc/pages/docs/getting-started.mdx
@@ -0,0 +1,3 @@
+# Getting Started
+
+## Installation
diff --git a/docs/stc/pages/docs/roadmap.mdx b/docs/stc/pages/docs/roadmap.mdx
new file mode 100644
index 0000000..bb447e2
--- /dev/null
+++ b/docs/stc/pages/docs/roadmap.mdx
@@ -0,0 +1,39 @@
+# Roadmap to the alpha
+
+`(*)` in title means it's subject to change.
+
+## Goals regarding `tsc`
+
+As there's no specification of TypeScript, the stc team will treat `tsc` as the specification.
+It means if the behavior of `tsc` and `stc` is different, `stc` will be fixed to match `tsc`, unless explicitly stated in this document.
+
+## Plans
+
+### A new language server
+
+This is the primary goal, and once this is ready, the alpha will be released.
+
+For this,
+
+- the inference of types should be correct
+- there should be no false-positive errors
+- typings should be loaded correctly
+
+### Only `isolatedModules: true`
+
+Ref: https://www.typescriptlang.org/tsconfig#isolatedModules
+
+This is required for proper parallelization. `const enums` are fine if they are imported using module syntax, but **TypeScript namespaces cannot be analyzed in parallel**.
+
+### Better error message
+
+### Better language server
+
+### (\*) A compiler for typings
+
+- This is subject to change.
+
+Many typing packages, including `@types/node`, cannot be analyzed in parallel because they use `namespace` and globals.
+So we can use only one thread for each typing package.
+But actually, this operation is easily cachable, and I expect the effect of caching to be significant.
+So I think it's worth it to provide a pre-compile API for typing packages.
diff --git a/docs/stc/pages/index.mdx b/docs/stc/pages/index.mdx
new file mode 100644
index 0000000..38c2564
--- /dev/null
+++ b/docs/stc/pages/index.mdx
@@ -0,0 +1,200 @@
+---
+title: "STC: Speedy type checker"
+---
+
+import { useSSG } from 'nextra/ssg'
+import { Chart as ChartJS, Colors, LinearScale, TimeScale, PointElement, LineElement, Title, Tooltip, Legend } from 'chart.js'
+import 'chartjs-adapter-date-fns'
+import { Line } from 'react-chartjs-2'
+
+export const normalizeJson = (string) => {
+ // REFER: see https://stackoverflow.com/a/60708762
+ return string.replace(/[\s\n\r\t]/gs, '').replace(/,([}\]])/gs, '$1')
+ .replace(/([,{\[]|)(?:("|'|)([\w_\- ]+)\2:|)("|'|)(.*?)\4([,}\]])/gs, (str, start, q1, index, q2, item, end) => {
+ item = item.replace(/"/gsi, '').trim()
+ if (index) { index = '"'+index.replace(/"/gsi, '').trim() + '"' }
+ if (!item.match(/^[0-9]+(\.[0-9]+|)$/) && !['true','false'].includes(item)) { item = '"' + item + '"' }
+ if (index) { return start + index + ':' + item + end }
+ return start + item + end
+ })
+}
+
+export const getCommits = async (ghToken, owner, repo, filename) => {
+ if (!ghToken || !ghToken.length) {
+ throw new Error('Github API token missing! Please configure it with the environment variable GITHUB_TOKEN')
+ }
+ let commitsPromises = Array(5).fill(null).map(async (_, i) => {
+ const response = await fetch(`https://api.github.com/repos/${owner}/${repo}/commits?path=${filename}&since=2022-11-11T00:00:00Z&per_page=20&page=${i + 1}`, {
+ headers: {
+ 'Authorization': `token ${ghToken}`,
+ },
+ })
+ return await response.json()
+ })
+
+const json = (await Promise.all(commitsPromises)).reduce((acc, curr) => acc.concat(curr))
+return json
+}
+
+export const getStats = async (ghToken, owner, repo, filename) => {
+ const commits = await getCommits(ghToken, owner, repo, filename)
+ const versionFetchers = commits.map(commit => fetch(`https://raw.githubusercontent.com/${owner}/${repo}/${commit.sha}/${filename}`))
+ const allVersions = await Promise.all(versionFetchers)
+ const rawStats = await Promise.all(allVersions.map(r => r.text()))
+ const stats = rawStats.map((statText, index) => {
+ const stringifiedJson = statText.replace('Stats ', '')
+ const stat = JSON.parse(normalizeJson(stringifiedJson))
+ return {
+ ...stat,
+ date: commits[index].commit.author.date,
+ }
+ })
+ return stats
+}
+
+export const getChartableStats = async (ghToken, owner, repo, filename) => {
+ const options = {
+ responsive: true,
+ maintainAspectRatio: false,
+ spanGaps: true,
+ showLine: true,
+ scales: {
+ x: {
+ type: 'time',
+ time: {
+ unit: 'week',
+ },
+ },
+ },
+ plugins: {
+ legend: {
+ position: 'top'
+ },
+ title: {
+ display: false,
+ text: 'STC Development Progress'
+ },
+ }
+ }
+
+const stats = await getStats(ghToken, owner, repo, filename)
+
+const data = {
+datasets: [
+{
+label: 'Required',
+data: stats.map((s) => {
+return {
+x: s.date,
+y: s.required_error,
+}
+}),
+borderColor: '#57A0E5',
+backgroundColor: '#57A0E5',
+},
+{
+label: 'Matched',
+data: stats.map((s) => {
+return {
+x: s.date,
+y: s.matched_error,
+}
+}),
+borderColor: '#9268F6',
+backgroundColor: '#9268F6',
+},
+{
+label: 'Extra',
+data: stats.map((s) => {
+return {
+x: s.date,
+y: s.extra_error,
+}
+}),
+borderColor: '#6DBEBF',
+backgroundColor: '#6DBEBF',
+},
+{
+label: 'Panic',
+data: stats.map((s) => {
+return {
+x: s.date,
+y: s.panic,
+}
+}),
+borderColor: '#ED6D85',
+backgroundColor: '#ED6D85',
+},
+]
+}
+
+return {
+options,
+data,
+}
+}
+
+export const getStaticProps = async ({ params }) => {
+ const ghToken = process.env.GITHUB_TOKEN;
+ const owner = "dudykr";
+ const repo = "stc";
+ const filename = "crates/stc_ts_type_checker/tests/tsc-stats.rust-debug";
+ const data = await getChartableStats(ghToken, owner, repo, filename);
+ return {
+ props: {
+ // We add an `ssg` field to the page props,
+ // which will be provided to the Nextra `useSSG` hook.
+ ssg: {
+ content: btoa(JSON.stringify(data)),
+ },
+ },
+ // The page will be considered as stale and regenerated every 1 hour.
+ revalidate: 60 * 60,
+ };
+};
+
+export const Stats = () => {
+ ChartJS.register(
+ LinearScale,
+ TimeScale,
+ PointElement,
+ LineElement,
+ Title,
+ Tooltip,
+ Legend
+ );
+ // Get the data from SSG, and render it as a component.
+ const { content } = useSSG();
+ const { options, data } = JSON.parse(
+ decodeURIComponent(escape(atob(content)))
+ );
+ return (
+
+ );
+};
+
+The fastest TypeScript type checker written in Rust.
+
+## Status
+
+`stc` is under active development.
+To provide an estimate of the progress, we provide historical statistics.
+
+
+
+- Required means a true negative, which is a type error that is
+ not reported by `stc`.
+
+- Matched means a true positive, which is a type error that is reported
+ by `stc` and correct.
+
+- Extra means a false positive. In other words, it's the number
+ of incorrect errors `stc` emits while it should not.
+
+- Panic means the analyzer panicked while validating input files,
+ due to a logic bug.
diff --git a/docs/stc/public/favicon.ico b/docs/stc/public/favicon.ico
new file mode 100644
index 0000000..718d6fe
Binary files /dev/null and b/docs/stc/public/favicon.ico differ
diff --git a/docs/stc/public/images/this-week-in-stc/1/contributors.png b/docs/stc/public/images/this-week-in-stc/1/contributors.png
new file mode 100644
index 0000000..e715893
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/1/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/10/contributors.png b/docs/stc/public/images/this-week-in-stc/10/contributors.png
new file mode 100644
index 0000000..5facefe
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/10/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/11/contributors.png b/docs/stc/public/images/this-week-in-stc/11/contributors.png
new file mode 100644
index 0000000..4b73217
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/11/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/12/contributors.png b/docs/stc/public/images/this-week-in-stc/12/contributors.png
new file mode 100644
index 0000000..38dcee4
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/12/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/13/contributors.png b/docs/stc/public/images/this-week-in-stc/13/contributors.png
new file mode 100644
index 0000000..95b3508
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/13/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/14/contributors.png b/docs/stc/public/images/this-week-in-stc/14/contributors.png
new file mode 100644
index 0000000..15bcc3e
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/14/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/15/contributors.png b/docs/stc/public/images/this-week-in-stc/15/contributors.png
new file mode 100644
index 0000000..1b00d3e
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/15/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/16/contributors.png b/docs/stc/public/images/this-week-in-stc/16/contributors.png
new file mode 100644
index 0000000..b3cebaa
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/16/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/17/contributors.png b/docs/stc/public/images/this-week-in-stc/17/contributors.png
new file mode 100644
index 0000000..9bb1c1b
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/17/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/18/contributors.png b/docs/stc/public/images/this-week-in-stc/18/contributors.png
new file mode 100644
index 0000000..ea537f1
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/18/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/19/contributors.png b/docs/stc/public/images/this-week-in-stc/19/contributors.png
new file mode 100644
index 0000000..e955282
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/19/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/2/contributors.png b/docs/stc/public/images/this-week-in-stc/2/contributors.png
new file mode 100644
index 0000000..0cc67d3
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/2/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/20/contributors.png b/docs/stc/public/images/this-week-in-stc/20/contributors.png
new file mode 100644
index 0000000..928d271
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/20/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/21/contributors.png b/docs/stc/public/images/this-week-in-stc/21/contributors.png
new file mode 100644
index 0000000..19920cc
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/21/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/22/contributors.png b/docs/stc/public/images/this-week-in-stc/22/contributors.png
new file mode 100644
index 0000000..993083e
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/22/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/23/contributors.png b/docs/stc/public/images/this-week-in-stc/23/contributors.png
new file mode 100644
index 0000000..1af3dd8
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/23/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/23/lsp.png b/docs/stc/public/images/this-week-in-stc/23/lsp.png
new file mode 100644
index 0000000..ded0fc1
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/23/lsp.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/3/contributors.png b/docs/stc/public/images/this-week-in-stc/3/contributors.png
new file mode 100644
index 0000000..2854df2
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/3/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/4/contributors.png b/docs/stc/public/images/this-week-in-stc/4/contributors.png
new file mode 100644
index 0000000..8d7ca8b
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/4/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/5/contributors.png b/docs/stc/public/images/this-week-in-stc/5/contributors.png
new file mode 100644
index 0000000..5adea28
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/5/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/6/contributors.png b/docs/stc/public/images/this-week-in-stc/6/contributors.png
new file mode 100644
index 0000000..72b0a86
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/6/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/7/contributors.png b/docs/stc/public/images/this-week-in-stc/7/contributors.png
new file mode 100644
index 0000000..d8ed6e9
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/7/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/8/contributors.png b/docs/stc/public/images/this-week-in-stc/8/contributors.png
new file mode 100644
index 0000000..f3a79d8
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/8/contributors.png differ
diff --git a/docs/stc/public/images/this-week-in-stc/9/contributors.png b/docs/stc/public/images/this-week-in-stc/9/contributors.png
new file mode 100644
index 0000000..8761fde
Binary files /dev/null and b/docs/stc/public/images/this-week-in-stc/9/contributors.png differ
diff --git a/docs/stc/styles.css b/docs/stc/styles.css
new file mode 100644
index 0000000..cd45743
--- /dev/null
+++ b/docs/stc/styles.css
@@ -0,0 +1,53 @@
+@tailwind utilities;
+
+.docs-search > span {
+ width: 100%;
+}
+
+.algolia-autocomplete .algolia-docsearch-suggestion--category-header span {
+ display: inline-block;
+}
+.algolia-autocomplete .ds-dropdown-menu {
+ width: 500px;
+ min-width: 300px;
+ max-width: calc(100vw - 50px);
+}
+
+[data-reach-skip-link] {
+ @apply sr-only;
+}
+
+[data-reach-skip-link]:focus {
+ @apply not-sr-only fixed top-0 z-50 ml-6 mt-2 bg-white px-6 py-2 text-lg outline-none focus:ring;
+}
+
+code {
+ @apply text-sm;
+}
+
+.prism-code.language-diff .inserted.prefix,
+.prism-code.language-diff .deleted.prefix {
+ user-select: none;
+ @apply opacity-30;
+}
+
+.prism-code.language-diff .inserted.line {
+ @apply text-green-600;
+}
+.prism-code.language-diff .deleted.line {
+ @apply text-red-600;
+}
+
+/* Hack to make the TOC links look better by adjusting kerning */
+article > main + div a.font-semibold {
+ font-weight: 500;
+ letter-spacing: -0.01rem;
+}
+
+.dark .invert-on-dark {
+ filter: invert(1) brightness(1.8);
+}
+
+.dark .docs-container select {
+ background: rgba(17, 17, 17, 1);
+}
diff --git a/docs/stc/theme.config.js b/docs/stc/theme.config.js
new file mode 100644
index 0000000..792dffb
--- /dev/null
+++ b/docs/stc/theme.config.js
@@ -0,0 +1,99 @@
+import { useConfig } from "nextra-theme-docs";
+
+const Head = () => {
+ const { frontMatter, title } = useConfig();
+ return (
+ <>
+
+ {/* Favicons, meta */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
+/** @type import('nextra-theme-docs').DocsThemeConfig */
+export default {
+ project: {
+ link: "https://github.com/dudykr/stc",
+ },
+ editLink: {
+ text: "Edit this page on GitHub",
+ },
+ docsRepositoryBase: "https://github.com/dudykr/oss-docs/blob/main",
+ useNextSeoProps() {
+ return {
+ titleTemplate: "%s – stc",
+ };
+ },
+ toc: {
+ float: true,
+ },
+ head: