mirror of
https://github.com/ChenQihan666/MyBlog-Next.git
synced 2026-08-14 07:33:07 +08:00
feat: upgrade to astro v3
Upgrade to astro v3. Update dependencies. Fix codes and features due to migration. BREAKING CHANGE: Astro v3 resolve #111
This commit is contained in:
@@ -131,7 +131,7 @@ All commands are run from the root of the project, from a terminal:
|
|||||||
| Command | Action |
|
| Command | Action |
|
||||||
| :--------------------- | :------------------------------------------------------------------------------------------------------------------------------- |
|
| :--------------------- | :------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| `npm install` | Installs dependencies |
|
| `npm install` | Installs dependencies |
|
||||||
| `npm run dev` | Starts local dev server at `localhost:3000` |
|
| `npm run dev` | Starts local dev server at `localhost:4321` |
|
||||||
| `npm run build` | Build your production site to `./dist/` |
|
| `npm run build` | Build your production site to `./dist/` |
|
||||||
| `npm run preview` | Preview your build locally, before deploying |
|
| `npm run preview` | Preview your build locally, before deploying |
|
||||||
| `npm run format:check` | Check code format with Prettier |
|
| `npm run format:check` | Check code format with Prettier |
|
||||||
|
|||||||
@@ -38,4 +38,5 @@ export default defineConfig({
|
|||||||
exclude: ["@resvg/resvg-js"],
|
exclude: ["@resvg/resvg-js"],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
scopedStyleStrategy: "where",
|
||||||
});
|
});
|
||||||
|
|||||||
Generated
+2600
-9139
File diff suppressed because it is too large
Load Diff
+19
-17
@@ -16,35 +16,37 @@
|
|||||||
"lint": "eslint ."
|
"lint": "eslint ."
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@astrojs/rss": "^2.4.1",
|
"@astrojs/check": "^0.2.0",
|
||||||
|
"@astrojs/rss": "^3.0.0",
|
||||||
"@resvg/resvg-js": "^2.4.1",
|
"@resvg/resvg-js": "^2.4.1",
|
||||||
"astro": "^2.4.5",
|
"astro": "^3.0.13",
|
||||||
"fuse.js": "^6.6.2",
|
"fuse.js": "^6.6.2",
|
||||||
"github-slugger": "^2.0.0",
|
"github-slugger": "^2.0.0",
|
||||||
"remark-collapse": "^0.1.2",
|
"remark-collapse": "^0.1.2",
|
||||||
"remark-toc": "^8.0.1",
|
"remark-toc": "^8.0.1",
|
||||||
"satori": "^0.8.1",
|
"satori": "^0.10.4",
|
||||||
"tailwindcss": "^3.3.2"
|
"tailwindcss": "^3.3.3",
|
||||||
|
"typescript": "^5.2.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@astrojs/react": "^2.1.3",
|
"@astrojs/react": "^3.0.2",
|
||||||
"@astrojs/sitemap": "^1.3.1",
|
"@astrojs/sitemap": "^3.0.0",
|
||||||
"@astrojs/tailwind": "^3.1.2",
|
"@astrojs/tailwind": "^5.0.0",
|
||||||
"@divriots/jampack": "^0.11.2",
|
"@divriots/jampack": "^0.20.1",
|
||||||
"@tailwindcss/typography": "^0.5.9",
|
"@tailwindcss/typography": "^0.5.10",
|
||||||
"@types/github-slugger": "^1.3.0",
|
"@types/github-slugger": "^1.3.0",
|
||||||
"@types/react": "^18.2.6",
|
"@types/react": "^18.2.21",
|
||||||
"@typescript-eslint/parser": "^5.59.5",
|
"@typescript-eslint/parser": "^6.7.0",
|
||||||
"astro-eslint-parser": "^0.14.0",
|
"astro-eslint-parser": "^0.15.0",
|
||||||
"commitizen": "^4.3.0",
|
"commitizen": "^4.3.0",
|
||||||
"cz-conventional-changelog": "^3.3.0",
|
"cz-conventional-changelog": "^3.3.0",
|
||||||
"eslint": "^8.40.0",
|
"eslint": "^8.49.0",
|
||||||
"eslint-plugin-astro": "^0.27.0",
|
"eslint-plugin-astro": "^0.29.0",
|
||||||
"husky": "^8.0.3",
|
"husky": "^8.0.3",
|
||||||
"lint-staged": "^13.2.2",
|
"lint-staged": "^14.0.1",
|
||||||
"prettier": "^2.8.8",
|
"prettier": "^3.0.3",
|
||||||
"prettier-plugin-astro": "^0.12.0",
|
"prettier-plugin-astro": "^0.12.0",
|
||||||
"prettier-plugin-tailwindcss": "^0.2.8",
|
"prettier-plugin-tailwindcss": "^0.5.4",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0"
|
"react-dom": "^18.2.0"
|
||||||
},
|
},
|
||||||
|
|||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
declare module 'remark-collapse';
|
||||||
@@ -16,7 +16,7 @@ breadcrumbList[0] === "posts" &&
|
|||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<a href="/">Home</a>
|
<a href="/">Home</a>
|
||||||
<span aria-hidden="true">></span>
|
<span aria-hidden="true"> > </span>
|
||||||
</li>
|
</li>
|
||||||
{
|
{
|
||||||
breadcrumbList.map((breadcrumb, index) =>
|
breadcrumbList.map((breadcrumb, index) =>
|
||||||
@@ -33,7 +33,7 @@ breadcrumbList[0] === "posts" &&
|
|||||||
) : (
|
) : (
|
||||||
<li>
|
<li>
|
||||||
<a href={`/${breadcrumb}`}>{breadcrumb}</a>
|
<a href={`/${breadcrumb}`}>{breadcrumb}</a>
|
||||||
<span aria-hidden="true">></span>
|
<span aria-hidden="true"> > </span>
|
||||||
</li>
|
</li>
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|||||||
+2
-15
@@ -10,21 +10,8 @@ export interface Props {
|
|||||||
export default function Card({ href, frontmatter, secHeading = true }: Props) {
|
export default function Card({ href, frontmatter, secHeading = true }: Props) {
|
||||||
const { title, pubDatetime, description } = frontmatter;
|
const { title, pubDatetime, description } = frontmatter;
|
||||||
return (
|
return (
|
||||||
<li className="my-6">
|
<li className="list-card">
|
||||||
<a
|
<a href={href}>{secHeading ? <h2>{title}</h2> : <h3>{title}</h3>}</a>
|
||||||
href={href}
|
|
||||||
className="inline-block text-lg font-medium text-skin-accent decoration-dashed underline-offset-4 focus-visible:no-underline focus-visible:underline-offset-0"
|
|
||||||
>
|
|
||||||
{secHeading ? (
|
|
||||||
<h2 className="text-lg font-medium decoration-dashed hover:underline">
|
|
||||||
{title}
|
|
||||||
</h2>
|
|
||||||
) : (
|
|
||||||
<h3 className="text-lg font-medium decoration-dashed hover:underline">
|
|
||||||
{title}
|
|
||||||
</h3>
|
|
||||||
)}
|
|
||||||
</a>
|
|
||||||
<Datetime datetime={pubDatetime} />
|
<Datetime datetime={pubDatetime} />
|
||||||
<p>{description}</p>
|
<p>{description}</p>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
@@ -3,9 +3,6 @@ import { LOGO_IMAGE, SITE } from "@config";
|
|||||||
import Hr from "./Hr.astro";
|
import Hr from "./Hr.astro";
|
||||||
import LinkButton from "./LinkButton.astro";
|
import LinkButton from "./LinkButton.astro";
|
||||||
|
|
||||||
import logoPNG from "/assets/logo.png";
|
|
||||||
import logoSVG from "/assets/logo.svg";
|
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
activeNav?: "posts" | "tags" | "about" | "search";
|
activeNav?: "posts" | "tags" | "about" | "search";
|
||||||
}
|
}
|
||||||
@@ -21,8 +18,8 @@ const { activeNav } = Astro.props;
|
|||||||
{
|
{
|
||||||
LOGO_IMAGE.enable ? (
|
LOGO_IMAGE.enable ? (
|
||||||
<img
|
<img
|
||||||
src={LOGO_IMAGE.svg ? logoSVG : logoPNG}
|
src={`/assets/${LOGO_IMAGE.svg ? "logo.svg" : "logo.png"}`}
|
||||||
alt="AstroPaper Logo"
|
alt={SITE.title}
|
||||||
width={LOGO_IMAGE.width}
|
width={LOGO_IMAGE.width}
|
||||||
height={LOGO_IMAGE.height}
|
height={LOGO_IMAGE.height}
|
||||||
/>
|
/>
|
||||||
@@ -78,7 +75,7 @@ const { activeNav } = Astro.props;
|
|||||||
href="/search"
|
href="/search"
|
||||||
className={`focus-outline p-3 sm:p-1 ${
|
className={`focus-outline p-3 sm:p-1 ${
|
||||||
activeNav === "search" ? "active" : ""
|
activeNav === "search" ? "active" : ""
|
||||||
}`}
|
} flex`}
|
||||||
ariaLabel="search"
|
ariaLabel="search"
|
||||||
title="Search"
|
title="Search"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -2,9 +2,8 @@ import { getCollection } from "astro:content";
|
|||||||
import generateOgImage from "@utils/generateOgImage";
|
import generateOgImage from "@utils/generateOgImage";
|
||||||
import type { APIRoute } from "astro";
|
import type { APIRoute } from "astro";
|
||||||
|
|
||||||
export const get: APIRoute = async ({ params }) => ({
|
export const GET: APIRoute = async ({ params }) =>
|
||||||
body: await generateOgImage(params.ogTitle),
|
new Response(await generateOgImage(params.ogTitle));
|
||||||
});
|
|
||||||
|
|
||||||
const postImportResult = await getCollection("blog", ({ data }) => !data.draft);
|
const postImportResult = await getCollection("blog", ({ data }) => !data.draft);
|
||||||
const posts = Object.values(postImportResult);
|
const posts = Object.values(postImportResult);
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ const socialCount = SOCIALS.filter(social => social.active).length;
|
|||||||
<Header />
|
<Header />
|
||||||
<main id="main-content">
|
<main id="main-content">
|
||||||
<section id="hero">
|
<section id="hero">
|
||||||
<h1>Mingalaba</h1>
|
<h1 class="mr-2">Mingalaba</h1>
|
||||||
<a
|
<a
|
||||||
target="_blank"
|
target="_blank"
|
||||||
href="/rss.xml"
|
href="/rss.xml"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
import { CollectionEntry, getCollection } from "astro:content";
|
import { type CollectionEntry, getCollection } from "astro:content";
|
||||||
import Posts from "@layouts/Posts.astro";
|
import Posts from "@layouts/Posts.astro";
|
||||||
import PostDetails from "@layouts/PostDetails.astro";
|
import PostDetails from "@layouts/PostDetails.astro";
|
||||||
import getSortedPosts from "@utils/getSortedPosts";
|
import getSortedPosts from "@utils/getSortedPosts";
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import getSortedPosts from "@utils/getSortedPosts";
|
|||||||
import slugify from "@utils/slugify";
|
import slugify from "@utils/slugify";
|
||||||
import { SITE } from "@config";
|
import { SITE } from "@config";
|
||||||
|
|
||||||
export async function get() {
|
export async function GET() {
|
||||||
const posts = await getCollection("blog");
|
const posts = await getCollection("blog");
|
||||||
const sortedPosts = getSortedPosts(posts);
|
const sortedPosts = getSortedPosts(posts);
|
||||||
return rss({
|
return rss({
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import Layout from "@layouts/Layout.astro";
|
|||||||
import Main from "@layouts/Main.astro";
|
import Main from "@layouts/Main.astro";
|
||||||
import Header from "@components/Header.astro";
|
import Header from "@components/Header.astro";
|
||||||
import Footer from "@components/Footer.astro";
|
import Footer from "@components/Footer.astro";
|
||||||
import Search from "@components/Search";
|
import SearchBar from "@components/Search";
|
||||||
|
|
||||||
// Retrieve all articles
|
// Retrieve all articles
|
||||||
const posts = await getCollection("blog", ({ data }) => !data.draft);
|
const posts = await getCollection("blog", ({ data }) => !data.draft);
|
||||||
@@ -21,7 +21,7 @@ const searchList = posts.map(({ data }) => ({
|
|||||||
<Layout title={`Search | ${SITE.title}`}>
|
<Layout title={`Search | ${SITE.title}`}>
|
||||||
<Header activeNav="search" />
|
<Header activeNav="search" />
|
||||||
<Main pageTitle="Search" pageDesc="Search any article ...">
|
<Main pageTitle="Search" pageDesc="Search any article ...">
|
||||||
<Search client:load searchList={searchList} />
|
<SearchBar client:load searchList={searchList} />
|
||||||
</Main>
|
</Main>
|
||||||
<Footer />
|
<Footer />
|
||||||
</Layout>
|
</Layout>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
import { CollectionEntry, getCollection } from "astro:content";
|
import { type CollectionEntry, getCollection } from "astro:content";
|
||||||
import Layout from "@layouts/Layout.astro";
|
import Layout from "@layouts/Layout.astro";
|
||||||
import Main from "@layouts/Main.astro";
|
import Main from "@layouts/Main.astro";
|
||||||
import Header from "@components/Header.astro";
|
import Header from "@components/Header.astro";
|
||||||
|
|||||||
@@ -128,4 +128,16 @@
|
|||||||
.focus-outline {
|
.focus-outline {
|
||||||
@apply outline-2 outline-offset-1 outline-skin-fill focus-visible:no-underline focus-visible:outline-dashed;
|
@apply outline-2 outline-offset-1 outline-skin-fill focus-visible:no-underline focus-visible:outline-dashed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Card */
|
||||||
|
.list-card {
|
||||||
|
@apply my-6;
|
||||||
|
}
|
||||||
|
.list-card > a {
|
||||||
|
@apply inline-block text-lg font-medium text-skin-accent decoration-dashed underline-offset-4 focus-visible:no-underline focus-visible:underline-offset-0;
|
||||||
|
}
|
||||||
|
.list-card h2,
|
||||||
|
.list-card h3 {
|
||||||
|
@apply text-lg font-medium decoration-dashed hover:underline;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import satori, { SatoriOptions } from "satori";
|
import satori, { type SatoriOptions } from "satori";
|
||||||
import { SITE } from "@config";
|
import { SITE } from "@config";
|
||||||
import { writeFile } from "node:fs/promises";
|
import { writeFile } from "node:fs/promises";
|
||||||
import { Resvg } from "@resvg/resvg-js";
|
import { Resvg } from "@resvg/resvg-js";
|
||||||
|
|||||||
Reference in New Issue
Block a user