7 Commits
Author SHA1 Message Date
nosblobs 126ecca9a2 worms 2023-09-11 10:59:51 +01:00
nosblobs 5136b4e8d3 wording updates 2023-09-11 10:36:32 +01:00
nosblobs be66d48998 werds 2023-09-04 22:24:46 +01:00
nosblobs c4ef13ec44 text 2023-09-04 21:45:13 +01:00
nosblobs 2aab29525c This isn't a minor change 2023-09-04 16:58:06 +01:00
nosblobs 8aefc9d0bb Blah 2023-09-04 16:57:40 +01:00
nosblobs 0f5f23f23b First draft 2023-09-04 16:50:18 +01:00
506 changed files with 6131 additions and 10080 deletions
+136 -271
View File
@@ -1,346 +1,211 @@
declare module 'astro:content' {
interface Render {
'.mdx': Promise<{
Content: import('astro').MarkdownInstance<{}>['Content'];
headings: import('astro').MarkdownHeading[];
remarkPluginFrontmatter: Record<string, any>;
}>;
}
}
declare module 'astro:content' {
interface Render {
'.md': Promise<{
Content: import('astro').MarkdownInstance<{}>['Content'];
headings: import('astro').MarkdownHeading[];
remarkPluginFrontmatter: Record<string, any>;
}>;
}
}
declare module 'astro:content' { declare module 'astro:content' {
export { z } from 'astro/zod'; export { z } from 'astro/zod';
export type CollectionEntry<C extends keyof typeof entryMap> =
type Flatten<T> = T extends { [K: string]: infer U } ? U : never; (typeof entryMap)[C][keyof (typeof entryMap)[C]] & Render;
export type CollectionKey = keyof AnyEntryMap;
export type CollectionEntry<C extends CollectionKey> = Flatten<AnyEntryMap[C]>;
export type ContentCollectionKey = keyof ContentEntryMap;
export type DataCollectionKey = keyof DataEntryMap;
// This needs to be in sync with ImageMetadata
export type ImageFunction = () => import('astro/zod').ZodObject<{
src: import('astro/zod').ZodString;
width: import('astro/zod').ZodNumber;
height: import('astro/zod').ZodNumber;
format: import('astro/zod').ZodUnion<
[
import('astro/zod').ZodLiteral<'png'>,
import('astro/zod').ZodLiteral<'jpg'>,
import('astro/zod').ZodLiteral<'jpeg'>,
import('astro/zod').ZodLiteral<'tiff'>,
import('astro/zod').ZodLiteral<'webp'>,
import('astro/zod').ZodLiteral<'gif'>,
import('astro/zod').ZodLiteral<'svg'>,
import('astro/zod').ZodLiteral<'avif'>,
]
>;
}>;
type BaseSchemaWithoutEffects = type BaseSchemaWithoutEffects =
| import('astro/zod').AnyZodObject | import('astro/zod').AnyZodObject
| import('astro/zod').ZodUnion<[BaseSchemaWithoutEffects, ...BaseSchemaWithoutEffects[]]> | import('astro/zod').ZodUnion<import('astro/zod').AnyZodObject[]>
| import('astro/zod').ZodDiscriminatedUnion<string, import('astro/zod').AnyZodObject[]> | import('astro/zod').ZodDiscriminatedUnion<string, import('astro/zod').AnyZodObject[]>
| import('astro/zod').ZodIntersection<BaseSchemaWithoutEffects, BaseSchemaWithoutEffects>; | import('astro/zod').ZodIntersection<
import('astro/zod').AnyZodObject,
import('astro/zod').AnyZodObject
>;
type BaseSchema = type BaseSchema =
| BaseSchemaWithoutEffects | BaseSchemaWithoutEffects
| import('astro/zod').ZodEffects<BaseSchemaWithoutEffects>; | import('astro/zod').ZodEffects<BaseSchemaWithoutEffects>;
export type SchemaContext = { image: ImageFunction }; type BaseCollectionConfig<S extends BaseSchema> = {
schema?: S;
type DataCollectionConfig<S extends BaseSchema> = { slug?: (entry: {
type: 'data'; id: CollectionEntry<keyof typeof entryMap>['id'];
schema?: S | ((context: SchemaContext) => S); defaultSlug: string;
collection: string;
body: string;
data: import('astro/zod').infer<S>;
}) => string | Promise<string>;
}; };
type ContentCollectionConfig<S extends BaseSchema> = {
type?: 'content';
schema?: S | ((context: SchemaContext) => S);
};
type CollectionConfig<S> = ContentCollectionConfig<S> | DataCollectionConfig<S>;
export function defineCollection<S extends BaseSchema>( export function defineCollection<S extends BaseSchema>(
input: CollectionConfig<S> input: BaseCollectionConfig<S>
): CollectionConfig<S>; ): BaseCollectionConfig<S>;
type EntryMapKeys = keyof typeof entryMap;
type AllValuesOf<T> = T extends any ? T[keyof T] : never; type AllValuesOf<T> = T extends any ? T[keyof T] : never;
type ValidContentEntrySlug<C extends keyof ContentEntryMap> = AllValuesOf< type ValidEntrySlug<C extends EntryMapKeys> = AllValuesOf<(typeof entryMap)[C]>['slug'];
ContentEntryMap[C]
>['slug'];
export function getEntryBySlug< export function getEntryBySlug<
C extends keyof ContentEntryMap, C extends keyof typeof entryMap,
E extends ValidContentEntrySlug<C> | (string & {}), E extends ValidEntrySlug<C> | (string & {})
>( >(
collection: C, collection: C,
// Note that this has to accept a regular string too, for SSR // Note that this has to accept a regular string too, for SSR
entrySlug: E entrySlug: E
): E extends ValidContentEntrySlug<C> ): E extends ValidEntrySlug<C>
? Promise<CollectionEntry<C>> ? Promise<CollectionEntry<C>>
: Promise<CollectionEntry<C> | undefined>; : Promise<CollectionEntry<C> | undefined>;
export function getCollection<C extends keyof typeof entryMap, E extends CollectionEntry<C>>(
export function getDataEntryById<C extends keyof DataEntryMap, E extends keyof DataEntryMap[C]>(
collection: C,
entryId: E
): Promise<CollectionEntry<C>>;
export function getCollection<C extends keyof AnyEntryMap, E extends CollectionEntry<C>>(
collection: C, collection: C,
filter?: (entry: CollectionEntry<C>) => entry is E filter?: (entry: CollectionEntry<C>) => entry is E
): Promise<E[]>; ): Promise<E[]>;
export function getCollection<C extends keyof AnyEntryMap>(
collection: C,
filter?: (entry: CollectionEntry<C>) => unknown
): Promise<CollectionEntry<C>[]>;
export function getEntry< type InferEntrySchema<C extends keyof typeof entryMap> = import('astro/zod').infer<
C extends keyof ContentEntryMap, Required<ContentConfig['collections'][C]>['schema']
E extends ValidContentEntrySlug<C> | (string & {}),
>(entry: {
collection: C;
slug: E;
}): E extends ValidContentEntrySlug<C>
? Promise<CollectionEntry<C>>
: Promise<CollectionEntry<C> | undefined>;
export function getEntry<
C extends keyof DataEntryMap,
E extends keyof DataEntryMap[C] | (string & {}),
>(entry: {
collection: C;
id: E;
}): E extends keyof DataEntryMap[C]
? Promise<DataEntryMap[C][E]>
: Promise<CollectionEntry<C> | undefined>;
export function getEntry<
C extends keyof ContentEntryMap,
E extends ValidContentEntrySlug<C> | (string & {}),
>(
collection: C,
slug: E
): E extends ValidContentEntrySlug<C>
? Promise<CollectionEntry<C>>
: Promise<CollectionEntry<C> | undefined>;
export function getEntry<
C extends keyof DataEntryMap,
E extends keyof DataEntryMap[C] | (string & {}),
>(
collection: C,
id: E
): E extends keyof DataEntryMap[C]
? Promise<DataEntryMap[C][E]>
: Promise<CollectionEntry<C> | undefined>;
/** Resolve an array of entry references from the same collection */
export function getEntries<C extends keyof ContentEntryMap>(
entries: {
collection: C;
slug: ValidContentEntrySlug<C>;
}[]
): Promise<CollectionEntry<C>[]>;
export function getEntries<C extends keyof DataEntryMap>(
entries: {
collection: C;
id: keyof DataEntryMap[C];
}[]
): Promise<CollectionEntry<C>[]>;
export function reference<C extends keyof AnyEntryMap>(
collection: C
): import('astro/zod').ZodEffects<
import('astro/zod').ZodString,
C extends keyof ContentEntryMap
? {
collection: C;
slug: ValidContentEntrySlug<C>;
}
: {
collection: C;
id: keyof DataEntryMap[C];
}
>;
// Allow generic `string` to avoid excessive type errors in the config
// if `dev` is not running to update as you edit.
// Invalid collection names will be caught at build time.
export function reference<C extends string>(
collection: C
): import('astro/zod').ZodEffects<import('astro/zod').ZodString, never>;
type ReturnTypeOrOriginal<T> = T extends (...args: any[]) => infer R ? R : T;
type InferEntrySchema<C extends keyof AnyEntryMap> = import('astro/zod').infer<
ReturnTypeOrOriginal<Required<ContentConfig['collections'][C]>['schema']>
>; >;
type ContentEntryMap = { type Render = {
render(): Promise<{
Content: import('astro').MarkdownInstance<{}>['Content'];
headings: import('astro').MarkdownHeading[];
remarkPluginFrontmatter: Record<string, any>;
}>;
};
const entryMap: {
"blog": { "blog": {
"summer.mdx": { "summer.mdx": {
id: "summer.mdx"; id: "summer.mdx",
slug: "summer"; slug: "summer",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"week1.mdx": { "week1.mdx": {
id: "week1.mdx"; id: "week1.mdx",
slug: "week1"; slug: "week1",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"week2.mdx": { "week2.mdx": {
id: "week2.mdx"; id: "week2.mdx",
slug: "week2"; slug: "week2",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"week3.mdx": { "week3.mdx": {
id: "week3.mdx"; id: "week3.mdx",
slug: "week3"; slug: "week3",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"week4.mdx": { "week4.mdx": {
id: "week4.mdx"; id: "week4.mdx",
slug: "week4"; slug: "week4",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"week5-6.mdx": { "week5-6.mdx": {
id: "week5-6.mdx"; id: "week5-6.mdx",
slug: "week5-6"; slug: "week5-6",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"week7-8.mdx": { "week7-8.mdx": {
id: "week7-8.mdx"; id: "week7-8.mdx",
slug: "week7-8"; slug: "week7-8",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"week9-10.mdx": { "week9-10.mdx": {
id: "week9-10.mdx"; id: "week9-10.mdx",
slug: "week9-10"; slug: "week9-10",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"work1.mdx": { "work1.mdx": {
id: "work1.mdx"; id: "work1.mdx",
slug: "work1"; slug: "work1",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"work2.mdx": { "work2.mdx": {
id: "work2.mdx"; id: "work2.mdx",
slug: "work2"; slug: "work2",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"work3.mdx": { "work3.mdx": {
id: "work3.mdx"; id: "work3.mdx",
slug: "work3"; slug: "work3",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"work4.mdx": { "work4.mdx": {
id: "work4.mdx"; id: "work4.mdx",
slug: "work4"; slug: "work4",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"work5.mdx": { "work5.mdx": {
id: "work5.mdx"; id: "work5.mdx",
slug: "work5"; slug: "work5",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"work6.mdx": { "work6.mdx": {
id: "work6.mdx"; id: "work6.mdx",
slug: "work6"; slug: "work6",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"year2022-1.mdx": { "year2022-1.mdx": {
id: "year2022-1.mdx"; id: "year2022-1.mdx",
slug: "year2022-1"; slug: "year2022-1",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"year2022-end.mdx": { "year2022-end.mdx": {
id: "year2022-end.mdx"; id: "year2022-end.mdx",
slug: "year2022-end"; slug: "year2022-end",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"year2022-w1.mdx": { "year2022-w1.mdx": {
id: "year2022-w1.mdx"; id: "year2022-w1.mdx",
slug: "year2022-w1"; slug: "year2022-w1",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"year2022-w2.mdx": { "year2022-w2.mdx": {
id: "year2022-w2.mdx"; id: "year2022-w2.mdx",
slug: "year2022-w2"; slug: "year2022-w2",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"year2022-w3.mdx": { "year2022-w3.mdx": {
id: "year2022-w3.mdx"; id: "year2022-w3.mdx",
slug: "year2022-w3"; slug: "year2022-w3",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"year2023-1.mdx": { "year2023-1.mdx": {
id: "year2023-1.mdx"; id: "year2023-1.mdx",
slug: "year2023-1"; slug: "year2023-1",
body: string; body: string,
collection: "blog"; collection: "blog",
data: InferEntrySchema<"blog"> data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] }; },
"year2024.mdx": { },
id: "year2024.mdx";
slug: "year2024";
body: string;
collection: "blog";
data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] };
};
}; };
type DataEntryMap = {
};
type AnyEntryMap = ContentEntryMap & DataEntryMap;
type ContentConfig = typeof import("../src/content/config"); type ContentConfig = typeof import("../src/content/config");
} }
-12
View File
@@ -4,7 +4,6 @@ dist/
# dependencies # dependencies
node_modules/ node_modules/
.yarn/install-state.gz
# logs # logs
npm-debug.log* npm-debug.log*
@@ -19,14 +18,3 @@ pnpm-debug.log*
# macOS-specific files # macOS-specific files
.DS_Store .DS_Store
# Devenv
.devenv*
devenv.local.nix
devenv.local.yaml
# direnv
.direnv
# pre-commit
.pre-commit-config.yaml
-6
View File
@@ -1,6 +0,0 @@
approvedGitRepositories:
- "**"
enableScripts: true
nodeLinker: node-modules
+1 -3
View File
@@ -1,11 +1,9 @@
FROM node:22 as build FROM node:18 as build
WORKDIR /app WORKDIR /app
COPY package.json package.json COPY package.json package.json
COPY .yarnrc.yml .yarnrc.yml
COPY yarn.lock yarn.lock COPY yarn.lock yarn.lock
COPY tsconfig.json tsconfig.json COPY tsconfig.json tsconfig.json
RUN corepack enable
RUN yarn install RUN yarn install
COPY src ./src COPY src ./src
+11 -20
View File
@@ -2,29 +2,19 @@
This website is built using [Astro](https://astro.build) This website is built using [Astro](https://astro.build)
## CI
For building the image on the server, the command to use is
```bash
devenv tasks run news:build
```
After that, a Caddy image will serve the files generated in the `dist` directory
## 🧞 Commands ## 🧞 Commands
All commands are run from the root of the project, from a terminal: All commands are run from the root of the project, from a terminal:
| Command | Action | | Command | Action |
| :------------------ | :------------------------------------------------- | | :--------------------- | :------------------------------------------------- |
| `npm i -g yarn` | Installs yarn (if needed) | | `npm i -g yarn` | Installs yarn (if needed) |
| `yarn` | Installs dependencies | | `yarn` | Installs dependencies |
| `yarn dev` | Starts local dev server at `localhost:3000` | | `yarn dev` | Starts local dev server at `localhost:3000` |
| `yarn build` | Build your production site to `./dist/` | | `yarn build` | Build your production site to `./dist/` |
| `yarn preview` | Preview your build locally, before deploying | | `yarn preview` | Preview your build locally, before deploying |
| `yarn astro ...` | Run CLI commands like `astro add`, `astro preview` | | `yarn astro ...` | Run CLI commands like `astro add`, `astro preview` |
| `yarn astro --help` | Get help using the Astro CLI | | `yarn astro --help` | Get help using the Astro CLI |
## 🚀 Project Structure ## 🚀 Project Structure
@@ -50,6 +40,7 @@ There's nothing special about `src/components/`, but that's where we like to put
Any static assets, like images, can be placed in the `public/` directory. Any static assets, like images, can be placed in the `public/` directory.
## 👀 Want to learn more? ## 👀 Want to learn more?
Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat). Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat).
+1
View File
@@ -1,4 +1,5 @@
import { defineConfig } from "astro/config"; import { defineConfig } from "astro/config";
// https://astro.build/config // https://astro.build/config
import mdx from "@astrojs/mdx"; import mdx from "@astrojs/mdx";
-12
View File
@@ -1,12 +0,0 @@
#!/usr/bin/env bash
if command -v yarn >/dev/null 2>&1; then
echo "yarn is available"
else
echo "yarn is not installed" >&2
exit 1
fi
yarn install
yarn build
-65
View File
@@ -1,65 +0,0 @@
{
"nodes": {
"devenv": {
"locked": {
"dir": "src/modules",
"lastModified": 1787952362,
"narHash": "sha256-2vxVcc2CO7ihRRqg1OuqsVnOAoQ+kaRu7829hN44xLs=",
"owner": "cachix",
"repo": "devenv",
"rev": "eeced8155ca9d573f5f3e22cbe925e7fbe4e761b",
"type": "github"
},
"original": {
"dir": "src/modules",
"owner": "cachix",
"repo": "devenv",
"type": "github"
}
},
"nixpkgs": {
"inputs": {
"nixpkgs-src": "nixpkgs-src"
},
"locked": {
"lastModified": 1787753358,
"narHash": "sha256-Tl77VbWyAKrOfRNQhL6JbQtb/MLzbYa/1RG1gWWfICk=",
"owner": "cachix",
"repo": "devenv-nixpkgs",
"rev": "256551e45f6303e142ab4a98be1bf243feb77dc0",
"type": "github"
},
"original": {
"owner": "cachix",
"ref": "rolling",
"repo": "devenv-nixpkgs",
"type": "github"
}
},
"nixpkgs-src": {
"flake": false,
"locked": {
"lastModified": 1787394516,
"narHash": "sha256-pRGOQSClnXNI2iLUG6DYpsGvYcuw0drOutVZFTJNw90=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "c8f90650c15282fa8656a041bfbbd2403997a9a7",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"devenv": "devenv",
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}
-19
View File
@@ -1,19 +0,0 @@
{ pkgs, ... }: {
languages = {
javascript = {
enable = true;
package = pkgs.nodejs_22;
yarn = {
enable = true;
package = pkgs.yarn-berry;
};
};
};
tasks."news:install" = {
exec = ''yarn install'';
before = ["news:build"];
};
tasks."news:build" = {
exec = ''yarn build'';
};
}
-18
View File
@@ -1,18 +0,0 @@
# yaml-language-server: $schema=https://devenv.sh/devenv.schema.json
inputs:
nixpkgs:
url: github:cachix/devenv-nixpkgs/rolling
# If you're using non-OSS software, you can set allow_unfree to true.
# allow_unfree: true
# If you're not willing to allow unsupported packages:
# allow_unsupported_system: false
# If you're willing to use a package that's vulnerable
# permitted_insecure_packages:
# - "openssl-1.1.1w"
# If you have more than one devenv you can merge them
#imports:
# - ./backend
+3 -6
View File
@@ -11,15 +11,12 @@
"astro": "astro" "astro": "astro"
}, },
"dependencies": { "dependencies": {
"@astrojs/mdx": "^2.0.2", "@astrojs/mdx": "^0.15.0",
"@astrojs/react": "^3.0.8",
"@astrojs/rss": "^2.1.0", "@astrojs/rss": "^2.1.0",
"@rollup/plugin-dynamic-import-vars": "^2.1.2", "astro": "^2.0.0",
"astro": "^4.0.7",
"astrojs-service-worker": "^0.0.9" "astrojs-service-worker": "^0.0.9"
}, },
"devDependencies": { "devDependencies": {
"sass": "^1.57.1" "sass": "^1.57.1"
}, }
"packageManager": "yarn@4.5.1"
} }

Before

Width:  |  Height:  |  Size: 802 KiB

After

Width:  |  Height:  |  Size: 802 KiB

Before

Width:  |  Height:  |  Size: 2.8 MiB

After

Width:  |  Height:  |  Size: 2.8 MiB

Before

Width:  |  Height:  |  Size: 852 KiB

After

Width:  |  Height:  |  Size: 852 KiB

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Some files were not shown because too many files have changed in this diff Show More