Compare commits

..
32 Commits
Author SHA1 Message Date
Hare 3e32df5761 chore: optimize Dockerfile for pnpm usage and build process 2024-12-18 07:14:14 +09:00
Hare 992c99d2fb update: refine layout and spacing in blog styles and article page 2024-12-18 07:14:01 +09:00
Hare 5c05db4580 update: layout styles in overview and article pages 2024-12-18 06:34:55 +09:00
Hare bafa8e4d18 change: add rehypeAutolinkHeadings plugin to article compiler 2024-12-18 06:07:46 +09:00
Hare b529e96a6b update: add headings overview 2024-12-18 06:02:28 +09:00
Hare 7f395bcfaa Merge branch 'master' into develop 2024-10-23 21:39:13 +09:00
Hare 97600ed402 change: svelte default to temp logo 2024-10-23 21:38:33 +09:00
Hare ae48a85ece change: discord invite link 2024-10-23 20:17:39 +09:00
Hare 9f162e83c4 Merge pull request 'fix: Clone and analyze the repository correctly' (#15) from develop into master
Reviewed-on: #15
2024-09-27 00:49:42 +09:00
Hare e4548bf10b Merge branch 'master' into develop 2024-09-27 00:49:35 +09:00
Hare 5b441ff0cf fix: Clone and analyze the repository correctly 2024-09-27 00:48:22 +09:00
Hare 76bd2a5e1b Merge pull request 'develop' (#14) from develop into master
Reviewed-on: #14
2024-09-27 00:17:58 +09:00
Hare e3a83ee561 Merge branch 'master' into develop 2024-09-27 00:17:51 +09:00
Hare dd057dd335 Refactor: Update imports for server modules 2024-09-27 00:16:57 +09:00
Hare f11bdf15fc fix typo #2 2024-09-26 23:44:12 +09:00
Hare 5ec1839ec7 fix typo 2024-09-26 23:43:51 +09:00
Hare 2fdcc1633d Merge pull request 'fix: initializing git during build' (#13) from develop into master
Reviewed-on: #13
2024-09-26 23:37:15 +09:00
Hare 6173dffba3 fix: initializing git during build 2024-09-26 23:36:12 +09:00
Hare e389a3d2f9 Merge branch 'develop' 2024-09-26 23:12:09 +09:00
Hare 4e2422fa09 Merge pull request 'feat-google-analytics' (#11) from feat-google-analytics into develop
Reviewed-on: #11
2024-09-26 23:07:52 +09:00
Hare 8d09641e5d Remove articles subproject 2024-09-26 23:06:41 +09:00
Hare 2b6e3bfa9f feat: Add Google Analytics tracking code to layout component 2024-09-26 23:05:42 +09:00
Hare 3797e33450 Merge branch 'develop' of gitea.hareworks.net:Hare/blog.hareworks.net into develop 2024-09-26 22:59:34 +09:00
Hare db831b0683 Merge pull request 'feat-git' (#10) from feat-git into master
Reviewed-on: #10
2024-09-25 23:30:08 +09:00
Hare c08bb9dcef Merge branch 'master' into feat-git 2024-09-25 23:29:55 +09:00
Hare 121cb60a5f feat: Add ress.css for global CSS reset 2024-09-18 17:31:39 +09:00
Hare e251697e92 Update blog logo and URL in README.md 2024-09-18 14:54:07 +09:00
Hare 58ce0f28c7 Merge pull request 'feat: codeblock highlighter and styling' (#9) from develop into master
Reviewed-on: #9
2024-09-07 02:49:35 +09:00
Hare 1637776b12 Merge branch 'master' into develop 2024-09-07 02:49:23 +09:00
Hare 19d63ed0d5 Merge pull request 'style tweaks' (#8) from develop into master
Reviewed-on: #8
2024-09-03 21:37:03 +09:00
Hare 41674ea6a1 Merge pull request 'feat: change article managment: git submodules to dynamic git clone&pull' (#7) from develop into master
Reviewed-on: #7
2024-09-03 07:01:14 +09:00
Hare 78d733ace6 Merge pull request 'chore: fix git install target from builder to runner' (#6) from develop into master
Reviewed-on: #6
2024-09-03 05:24:49 +09:00
26 changed files with 3505 additions and 4380 deletions
+6 -33
View File
@@ -1,38 +1,11 @@
# create-svelte
# blog.hareworks.net
Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/main/packages/create-svelte).
<img src="./static/img/logo.png" width="200">
## Creating a project
## About
If you're seeing this, you've probably already done this step. Congrats!
This is the source code for my blog at [blog.hareworks.net](https://blog.hareworks.net).
```bash
# create a new project in the current directory
npm create svelte@latest
## Made with SvelteKit
# create a new project in my-app
npm create svelte@latest my-app
```
## Developing
Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
```bash
npm run dev
# or start the server and open the app in a new browser tab
npm run dev -- --open
```
## Building
To create a production version of your app:
```bash
npm run build
```
You can preview the production build with `npm run preview`.
> To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment.
This blog is made with SvelteKit.
Submodule articles deleted from d1d724d117
+11 -6
View File
@@ -1,19 +1,24 @@
# For Build
FROM node:22-slim as builder
FROM node:22-slim AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
RUN corepack enable
WORKDIR /app
COPY package.json ./
COPY package-lock.json ./
COPY pnpm-lock.yaml ./
COPY tsconfig.json ./
RUN npm ci
FROM base AS builder
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile
COPY . .
RUN pnpm run build
RUN npm run build
# For Run
FROM node:22-slim
FROM base
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile
WORKDIR /app
-4149
View File
File diff suppressed because it is too large Load Diff
+25 -23
View File
@@ -1,6 +1,6 @@
{
"name": "blog.hareworks.net",
"version": "0.0.1",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "vite dev",
@@ -13,32 +13,34 @@
"format": "prettier --write ."
},
"devDependencies": {
"@playwright/test": "^1.28.1",
"@sveltejs/adapter-auto": "^3.0.0",
"@sveltejs/adapter-node": "^5.2.2",
"@sveltejs/kit": "^2.0.0",
"@sveltejs/vite-plugin-svelte": "^4.0.0-next.6",
"@types/eslint": "^9.6.0",
"@types/pg": "^8.11.6",
"eslint": "^9.0.0",
"@playwright/test": "^1.49.1",
"@sveltejs/adapter-auto": "^3.3.1",
"@sveltejs/adapter-node": "^5.2.10",
"@sveltejs/kit": "^2.12.1",
"@sveltejs/vite-plugin-svelte": "^5.0.2",
"@types/eslint": "^9.6.1",
"@types/pg": "^8.11.10",
"eslint": "^9.17.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-svelte": "^2.36.0",
"globals": "^15.0.0",
"prettier": "^3.1.1",
"prettier-plugin-svelte": "^3.1.2",
"shiki": "^1.16.2",
"svelte": "^5.0.0-next.1",
"svelte-check": "^3.6.0",
"typescript": "^5.0.0",
"typescript-eslint": "^8.0.0",
"vite": "^5.0.3"
"eslint-plugin-svelte": "^2.46.1",
"globals": "^15.13.0",
"prettier": "^3.4.2",
"prettier-plugin-svelte": "^3.3.2",
"shiki": "^1.24.2",
"svelte": "^5.14.1",
"svelte-check": "4.1.1",
"typescript": "^5.7.2",
"typescript-eslint": "^8.18.1",
"vite": "^6.0.3"
},
"type": "module",
"dependencies": {
"dotenv": "^16.4.5",
"dotenv": "^16.4.7",
"mdsvex": "^0.12.3",
"pg": "^8.12.0",
"sass": "^1.77.8",
"simple-git": "^3.26.0"
"pg": "^8.13.1",
"rehype-autolink-headings": "^7.1.0",
"rehype-slug": "^6.0.0",
"sass": "^1.83.0",
"simple-git": "^3.27.0"
}
}
+3127
View File
File diff suppressed because it is too large Load Diff
+4 -2
View File
@@ -1,9 +1,11 @@
import type { Handle } from '@sveltejs/kit'
import { getConnection } from '$lib/server/database/get_connection'
import { getPool } from '$lib/server/database/pool';
import git from '$lib/server/git';
export const handle: Handle = async ({ event, resolve }) => {
const pg = getConnection();
const pg = getPool;
event.locals.db = pg;
event.locals.git = git;
const result = await resolve(event);
return result;
+2 -1
View File
@@ -1,4 +1,5 @@
@import '../variables.scss';
@forward './ress.css';
@forward '../variables.scss';
@font-face {
font-family: 'ZenKakuGothicNew-Regular';
+36 -3
View File
@@ -7,15 +7,16 @@
color: var(--color-text);
padding-left: 2rem;
padding-left: 0rem;
box-sizing: border-box;
h1 {
position: relative;
width: auto;
font-size: 1.8rem;
margin-bottom: 0.5rem;
margin-left: -1rem;
padding: 1.5rem 0 0.25rem 0;
margin: 0 0 0.75rem 0rem;
border-bottom: 1px solid var(--color-outline);
}
hr {
@@ -27,6 +28,7 @@
}
h2 {
padding: 1rem 0 0.25rem 0;
font-size: 1.5rem;
position: relative;
@@ -71,6 +73,37 @@
}
}
ul,
ol {
list-style: none;
padding: 0;
margin: 0;
}
li {
position: relative;
padding-left: 1rem;
margin-bottom: 0.5rem;
&::before {
content: '';
position: absolute;
top: 0;
left: 0;
color: var(--color-concept);
}
}
ul > li {
&::before {
content: '';
}
}
ol > li {
counter-increment: item;
&::before {
content: counter(item) '.';
}
}
blockquote {
position: relative;
font-size: 1.1rem;
+68
View File
@@ -0,0 +1,68 @@
<script lang="ts">
export let html: string;
const headings: {
level: number;
id: string;
text: string;
}[] = [];
html.match(/<h(\d) id="([^"]+)">([^<]+)<\/h\d>/g)?.forEach((match) => {
console.log(match);
const [, level, id, text] = match.match(/<h(\d) id="([^"]+)">([^<]+)<\/h\d>/)!;
headings.push({ level: +level, id, text });
});
let output = '';
let lastLevel = 1;
headings.forEach(({ level, id, text }) => {
console.log(level, id, text);
if (level > lastLevel) {
output += '<ul>';
} else if (level < lastLevel) {
output += '</li></ul>'.repeat(lastLevel - level);
} else {
if (output !== '') {
}
}
output += `<li><a href="#${id}">${text}</a>`;
lastLevel = level;
});
output += '</li>'.repeat(lastLevel);
</script>
<div class="overview">
<ul>
{@html output}
</ul>
</div>
<style lang="scss">
.overview {
margin: 0;
padding: 0;
:global(ul) {
list-style-type: none;
margin-left: 0.5em;
padding-left: 0.25em;
border-left: 1px solid var(--line-primary);
box-sizing: border-box;
}
ul {
border-left: none;
}
:global(li) {
padding: 0.5em 0.5em 0;
box-sizing: border-box;
}
:global(a) {
text-decoration: none;
color: var(--text-primary);
padding: 0.15em 0.4em;
border-radius: 0.25em;
text-wrap: nowrap;
box-sizing: border-box;
&:hover {
background-color: rgba(255, 255, 255, 0.1);
}
}
}
</style>
+36 -11
View File
@@ -5,6 +5,7 @@
import Footer from '$lib/components/footer.svelte';
import * as publish from '$lib/publish';
import FormattedDate from '$lib/components/formatted_date.svelte';
import Overview from '$lib/components/overview.svelte';
import type { Article } from '$lib/article';
export let data: Article;
@@ -32,6 +33,7 @@
</div> -->
<div class="container">
<main>
<div class="content">
<div class="title">
<h1>{data.title}</h1>
<div class="meta">
@@ -66,6 +68,12 @@
</div>
<Footer />
</div>
</div>
<div class="card-container">
<div class="card">
<Overview html={data.content} />
</div>
</div>
</main>
</div>
@@ -100,30 +108,47 @@
height: 100%;
object-fit: cover;
}
.card {
position: fixed;
top: 0;
right: 0;
}
main {
box-sizing: border-box;
color: white;
display: flex;
flex-direction: row;
justify-content: center;
align-items: start;
.content {
border: 1px solid var(--line-primary);
border-top: none;
border-bottom: none;
box-sizing: border-box;
color: white;
min-height: 100%;
padding: 100px 100px 0 100px;
max-width: 900px;
margin: 0;
}
}
.card-container {
position: sticky;
top: 0;
background-color: var(--background-primary);
box-sizing: border-box;
padding: 20px;
padding-top: 100px;
max-width: 800px;
margin: 0 auto;
display: flex;
flex-direction: column;
justify-content: space-between;
overflow: visible;
.card {
width: 100px;
padding: 0.5em 0;
overflow: visible;
}
}
.title {
h1 {
font-size: 2rem;
text-align: center;
margin: 0;
margin: 0 -30px 0 -30px;
padding: 12px;
border-bottom: 1px solid rgba(255, 255, 255, 0.3);
box-sizing: border-box;
+1
View File
@@ -0,0 +1 @@
html{-webkit-text-size-adjust:100%;box-sizing:border-box;-moz-tab-size:4;tab-size:4;word-break:normal}*,:after,:before{background-repeat:no-repeat;box-sizing:inherit}:after,:before{text-decoration:inherit;vertical-align:inherit}*{margin:0;padding:0}hr{color:inherit;height:0;overflow:visible}details,main{display:block}summary{display:list-item}small{font-size:80%}[hidden]{display:none}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}a{background-color:transparent}a:active,a:hover{outline-width:0}code,kbd,pre,samp{font-family:monospace,monospace}pre{font-size:1em}b,strong{font-weight:bolder}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-color:inherit;text-indent:0}iframe{border-style:none}input{border-radius:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}textarea{overflow:auto;resize:vertical}button,input,optgroup,select,textarea{font:inherit}optgroup{font-weight:700}button{overflow:visible}button,select{text-transform:none}[role=button],[type=button],[type=reset],[type=submit],button{cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button:-moz-focusring{outline:1px dotted ButtonText}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}button,input,select,textarea{background-color:transparent;border-style:none}a:focus,button:focus,input:focus,select:focus,textarea:focus{outline-width:0}select{-moz-appearance:none;-webkit-appearance:none}select::-ms-expand{display:none}select::-ms-value{color:currentColor}legend{border:0;color:inherit;display:table;max-width:100%;white-space:normal}::-webkit-file-upload-button{-webkit-appearance:button;color:inherit;font:inherit}[disabled]{cursor:default}img{border-style:none}progress{vertical-align:baseline}[aria-busy=true]{cursor:progress}[aria-controls]{cursor:pointer}[aria-disabled=true]{cursor:default}
@@ -2,7 +2,8 @@
import { compile, escapeSvelte } from "mdsvex";
import { createHighlighter } from "shiki";
import { kanagawa_dark as theme } from "$lib/kanagawa"
import rehypeAutolinkHeadings from "rehype-autolink-headings";
import rehypeSlug from "rehype-slug";
const highlighter = await createHighlighter({
themes: [theme],
@@ -19,5 +20,6 @@ export default async function compileArticle(code: string) {
return html;
},
},
rehypePlugins: [rehypeAutolinkHeadings, rehypeSlug],
});
}
@@ -1,90 +1,22 @@
// initialize
import type { Postgres } from '$lib/server/database';
import type { Postgres } from '$lib/server/database/postgres';
import { type SimpleGit, CheckRepoActions } from 'simple-git';
import fs from 'fs';
import compile from '$lib/server/article';
import article_git from '$lib/server/aritcle-git';
import compileArticle from '$lib/server/article_compiler';
import type { TableSchema } from '$lib/server/database/table';
import server_table from '$lib/server/database/table';
import { format } from '$lib/scripts/formatted_date';
export default async function init(db: Postgres) {
await cloneRepo();
await createTable(db, [
{
name: 'article',
columns: [
{ name: 'seq', type: 'serial', constraint: 'primary key' },
{ name: 'id', type: 'text', constraint: 'not null' },
{ name: 'released_at', type: 'timestamp', constraint: 'not null' },
{ name: 'updated_at', type: 'timestamp', constraint: 'not null' },
{ name: 'author', type: 'text', constraint: 'not null' },
{ name: 'email', type: 'text', constraint: 'not null' },
{ name: 'title', type: 'text', constraint: 'not null' },
{ name: 'category', type: 'text', constraint: 'not null' },
{ name: 'tags', type: 'text[]', constraint: 'not null' },
{ name: 'image', type: 'text', constraint: '' },
{ name: 'publish', type: 'text', constraint: 'not null' },
{ name: 'content', type: 'text', constraint: 'not null' },
],
},
{
name: 'article_comment',
columns: [
{ name: 'id', type: 'serial', constraint: 'primary key' },
{ name: 'article', type: 'integer', constraint: 'not null' },
{ name: 'posted_at', type: 'timestamp', constraint: 'not null' },
{ name: 'content', type: 'text', constraint: 'not null' },
],
},
{
name: 'thread',
columns: [
{ name: 'seq', type: 'serial', constraint: 'primary key' },
{ name: 'id', type: 'text', constraint: 'not null' },
{ name: 'title', type: 'text', constraint: 'not null' },
{ name: 'category', type: 'text', constraint: 'not null' },
{ name: 'created_at', type: 'timestamp', constraint: 'not null' },
{ name: 'updated_at', type: 'timestamp', constraint: 'not null' },
{ name: 'tags', type: 'text[]', constraint: 'not null' },
{ name: 'content', type: 'text', constraint: 'not null' },
],
},
{
name: 'thread_post',
columns: [
{ name: 'seq', type: 'serial', constraint: 'primary key' },
{ name: 'thread_id', type: 'integer', constraint: 'not null' },
{ name: 'title', type: 'text', constraint: 'not null' },
{ name: 'posted_at', type: 'timestamp', constraint: 'not null' },
{ name: 'content', type: 'text', constraint: 'not null' },
],
},
{
name: 'thread_comment',
columns: [
{ name: 'id', type: 'serial', constraint: 'primary key' },
{ name: 'thread', type: 'integer', constraint: 'not null' },
{ name: 'posted_at', type: 'timestamp', constraint: 'not null' },
{ name: 'content', type: 'text', constraint: 'not null' },
],
},
{
name: 'tag',
columns: [
{ name: 'seq', type: 'serial', constraint: 'primary key' },
{ name: 'name', type: 'text', constraint: 'not null' },
{ name: 'ref_count', type: 'integer', constraint: 'not null' },
],
}
]);
const load = async (db: Postgres, git: SimpleGit) => {
const articleFiles = await crawlArticles(db);
await db.query('update tag set ref_count = 0');
for (const { path, id } of articleFiles) {
console.log(`Processing ${id}...`);
await db.begin();
let i = 0;
for (const { path, id } of articleFiles) {
await db.savepoint(`load${i}`);
console.log(`Processing ${id}...`);
try {
const gitlog = await article_git.log({
const gitlog = await git.log({
file: path.slice(11),
strictDate: true,
});
@@ -101,7 +33,7 @@ export default async function init(db: Postgres) {
console.log(`Author: ${author} <${email}>\nReleased at: ${format(released_at)}\nUpdated at: ${format(updated_at)}`);
const category = path.split('/')[3];
const compiled = await compile(fs.readFileSync(path, 'utf-8'));
const compiled = await compileArticle(fs.readFileSync(path, 'utf-8'));
const title = compiled.data.fm.title;
const tags: string[] = compiled.data.fm.tags;
const image = compiled.data.fm.image;
@@ -135,36 +67,29 @@ export default async function init(db: Postgres) {
}
} catch (err) {
console.log(err);
await db.rollback();
await db.rollbackTo(`load${i}`);
} finally {
console.log('');
await db.releaseSavepoint(`load${i}`);
i++;
}
}
await db.commit();
}
}
await db.release();
}
type ArticleFileItem = {
path: string,
id: string,
}
export type TableSchema = {
name: string,
columns: {
name: string,
type: string,
constraint: string,
}[],
}
const cloneRepo = async () => {
if (fs.existsSync('./articles/')) {
const cloneRepo = async (git: SimpleGit) => {
const isRepoRoot = await git.checkIsRepo(CheckRepoActions.IS_REPO_ROOT);
if (isRepoRoot) {
console.log('Pulling articles from git..');
await article_git.pull();
await git.pull();
} else {
console.log('Cloning articles from git..');
await article_git.clone('git@gitea.hareworks.net:Hare/blog-articles.git', 'articles');
await git.clone('git@gitea.hareworks.net:Hare/blog-articles.git', './');
}
}
@@ -206,3 +131,14 @@ const crawlArticles = async (db: Postgres): Promise<ArticleFileItem[]> => {
scanDir('./articles/article');
return articleFiles;
}
export async function init(db: Postgres, git: SimpleGit) {
await createTable(db, server_table);
await cloneRepo(git);
await load(db, git);
}
export async function reload(db: Postgres, git: SimpleGit) {
await cloneRepo(git);
await load(db, git);
}
@@ -12,12 +12,13 @@ const connectionString = `postgres://${PG_USER}:${PG_PASS}@${PG_HOST}:${PG_PORT}
let pool = new Pool({ connectionString });
export const getConnection = () => pool;
export const getPool = pool;
export const reConnect = async () => {
pool = new Pool({ connectionString });
}
import init_db from '$lib/server/database/init';
import PG from '$lib/server/database';
await init_db(await PG(pool));
import { init as init_data} from '$lib/server/data_loader';
import PG from '$lib/server/database/postgres';
import git from '$lib/server/git';
await init_data(await PG(pool), git);
@@ -24,9 +24,21 @@ export class Postgres {
await this.client!.query('commit');
}
async savepoint(name: string) {
await this.client!.query(`savepoint ${name}`);
}
async rollback() {
await this.client!.query('rollback');
}
async rollbackTo(name: string) {
await this.client!.query(`rollback to ${name}`);
}
async releaseSavepoint(name: string) {
await this.client!.query(`release savepoint ${name}`);
}
}
export default async (
+77
View File
@@ -0,0 +1,77 @@
export type TableSchema = {
name: string,
columns: {
name: string,
type: string,
constraint: string,
}[],
}
export default [
{
name: 'article',
columns: [
{ name: 'seq', type: 'serial', constraint: 'primary key' },
{ name: 'id', type: 'text', constraint: 'not null' },
{ name: 'released_at', type: 'timestamp', constraint: 'not null' },
{ name: 'updated_at', type: 'timestamp', constraint: 'not null' },
{ name: 'author', type: 'text', constraint: 'not null' },
{ name: 'email', type: 'text', constraint: 'not null' },
{ name: 'title', type: 'text', constraint: 'not null' },
{ name: 'category', type: 'text', constraint: 'not null' },
{ name: 'tags', type: 'text[]', constraint: 'not null' },
{ name: 'image', type: 'text', constraint: '' },
{ name: 'publish', type: 'text', constraint: 'not null' },
{ name: 'content', type: 'text', constraint: 'not null' },
],
},
{
name: 'article_comment',
columns: [
{ name: 'id', type: 'serial', constraint: 'primary key' },
{ name: 'article', type: 'integer', constraint: 'not null' },
{ name: 'posted_at', type: 'timestamp', constraint: 'not null' },
{ name: 'content', type: 'text', constraint: 'not null' },
],
},
{
name: 'thread',
columns: [
{ name: 'seq', type: 'serial', constraint: 'primary key' },
{ name: 'id', type: 'text', constraint: 'not null' },
{ name: 'title', type: 'text', constraint: 'not null' },
{ name: 'category', type: 'text', constraint: 'not null' },
{ name: 'created_at', type: 'timestamp', constraint: 'not null' },
{ name: 'updated_at', type: 'timestamp', constraint: 'not null' },
{ name: 'tags', type: 'text[]', constraint: 'not null' },
{ name: 'content', type: 'text', constraint: 'not null' },
],
},
{
name: 'thread_post',
columns: [
{ name: 'seq', type: 'serial', constraint: 'primary key' },
{ name: 'thread_id', type: 'integer', constraint: 'not null' },
{ name: 'title', type: 'text', constraint: 'not null' },
{ name: 'posted_at', type: 'timestamp', constraint: 'not null' },
{ name: 'content', type: 'text', constraint: 'not null' },
],
},
{
name: 'thread_comment',
columns: [
{ name: 'id', type: 'serial', constraint: 'primary key' },
{ name: 'thread', type: 'integer', constraint: 'not null' },
{ name: 'posted_at', type: 'timestamp', constraint: 'not null' },
{ name: 'content', type: 'text', constraint: 'not null' },
],
},
{
name: 'tag',
columns: [
{ name: 'seq', type: 'serial', constraint: 'primary key' },
{ name: 'name', type: 'text', constraint: 'not null' },
{ name: 'ref_count', type: 'integer', constraint: 'not null' },
],
}
] as TableSchema[];
@@ -1,7 +1,9 @@
import fs from 'fs';
import { simpleGit, } from 'simple-git';
import type { SimpleGit, SimpleGitOptions } from 'simple-git';
console.log(process.cwd()+'/articles');
fs.mkdirSync(process.cwd()+'/articles', { recursive: true });
export const gitOptions: Partial<SimpleGitOptions> = {
baseDir: process.cwd()+'/articles',
binary: 'git',
+13
View File
@@ -2,4 +2,17 @@
import '$lib/app.scss';
</script>
<svelte:head>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-6D99J1R7DX"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-6D99J1R7DX');
</script>
</svelte:head>
<slot />
+1 -1
View File
@@ -1,6 +1,6 @@
import { error } from '@sveltejs/kit';
import type { PageServerLoad } from './$types';
import PG from '$lib/server/database';
import PG from '$lib/server/database/postgres';
import { format } from '$lib/scripts/formatted_date';
let data: {
+4 -4
View File
@@ -6,9 +6,9 @@ import {
TOKEN
} from '$env/static/private'
import PG from '$lib/server/database';
// import { building } from '$app/environment';
import init_db from '$lib/server/database/init';
import PG from '$lib/server/database/postgres';
import { building } from '$app/environment';
import { reload as reload_data } from '$lib/server/data_loader';
export const POST: RequestHandler = async ({ url, locals }) => {
const token = url.searchParams.get('token');
@@ -17,6 +17,6 @@ export const POST: RequestHandler = async ({ url, locals }) => {
return error(401, 'Unauthorized');
}
await init_db(await PG(locals.db));
if (!building) await reload_data(await PG(locals.db), locals.git);
return new Response(String(token));
};
@@ -1,6 +1,6 @@
import type { Article } from '$lib/article';
import type { PageServerLoad } from './$types';
import PG from '$lib/server/database';
import PG from '$lib/server/database/postgres';
import { error } from '@sveltejs/kit';
export const load: PageServerLoad = async ({ params, locals }) => {
@@ -1,6 +1,6 @@
import type { Article } from '$lib/article';
import type { PageServerLoad } from './$types';
import PG from '$lib/server/database';
import PG from '$lib/server/database/postgres';
import { error } from '@sveltejs/kit';
export const load: PageServerLoad = async ({ params, locals }) => {
+1 -1
View File
@@ -1,5 +1,5 @@
import { redirect } from '@sveltejs/kit';
export function load() {
throw redirect(308, 'https://discord.gg/9RfkJeQQfB');
throw redirect(308, 'https://discord.gg/hbHzw7JkFq');
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 10 KiB

-5
View File
@@ -3,14 +3,9 @@ import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
/** @type {import('@sveltejs/kit').Config} */
const config = {
// Consult https://kit.svelte.dev/docs/integrations#preprocessors
// for more information about preprocessors
preprocess: vitePreprocess(),
kit: {
// adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
// If your environment is not supported, or you settled on a specific environment, switch out the adapter.
// See https://kit.svelte.dev/docs/adapters for more information about adapters.
adapter: adapter()
}
};