Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions apps/ghost-blog-buster/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@
"start": "jiti ./src/cli.ts",
"dev": "tsup --watch",
"build": "tsup ./src/cli.ts --format esm --dts",
"clean": "rimraf .turbo node_modules dist",
"clean": "rimraf .turbo dist",
"nuke": "rimraf .turbo node_modules dist",
"test": "vitest run",
"test:watch": "vitest",
"test-ci": "vitest run --coverage.enabled --coverage.reporter='text-summary'",
Expand All @@ -50,19 +51,20 @@
"typescript": "catalog:",
"vite": "catalog:",
"vite-tsconfig-paths": "catalog:",
"vitest": "catalog:"
"vitest": "catalog:",
"rimraf": "catalog:"
},
"dependencies": {
"@clack/core": "^0.5.0",
"@clack/prompts": "^0.11.0",
"@ts-ghost/admin-api": "^5.0.0",
"@ts-ghost/content-api": "^4.2.0",
"@ts-ghost/admin-api": "workspace:*",
"@ts-ghost/content-api": "workspace:*",
"configstore": "^7.0.0",
"js-yaml": "^4.1.0",
"node-html-markdown": "^1.3.0",
"picocolors": "^1.0.0",
"yargs": "^17.7.2",
"zod": "3.23.8"
"zod": "catalog:"
},
"publishConfig": {
"access": "public"
Expand Down
13 changes: 7 additions & 6 deletions docs/src/components/icons.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,15 @@ import {
Twitter,
type IconNode as LucideIcon,
} from "lucide-react";
import { SVGProps } from "react";

export type Icon = LucideIcon;

export const Icons = {
sun: SunMedium,
moon: Moon,
twitter: Twitter,
logo: (props: LucideProps) => (
logo: (props: SVGProps<SVGSVGElement>) => (
<svg width="234" height="234" viewBox="0 0 234 234" {...props}>
<g clipPath="url(#clip0_103_24)">
<g clipPath="url(#clip1_103_24)">
Expand Down Expand Up @@ -41,31 +42,31 @@ export const Icons = {
</defs>
</svg>
),
gitHub: (props: LucideProps) => (
gitHub: (props: SVGProps<SVGSVGElement>) => (
<svg viewBox="0 0 438.549 438.549" {...props}>
<path
fill="currentColor"
d="M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z"
></path>
</svg>
),
javascript: (props: LucideProps) => (
javascript: (props: SVGProps<SVGSVGElement>) => (
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" {...props}>
<path
fill="currentColor"
d="M0 0h24v24H0V0zm22.034 18.276c-.175-1.095-.888-2.015-3.003-2.873-.736-.345-1.554-.585-1.797-1.14-.091-.33-.105-.51-.046-.705.15-.646.915-.84 1.515-.66.39.12.75.42.976.9 1.034-.676 1.034-.676 1.755-1.125-.27-.42-.404-.601-.586-.78-.63-.705-1.469-1.065-2.834-1.034l-.705.089c-.676.165-1.32.525-1.71 1.005-1.14 1.291-.811 3.541.569 4.471 1.365 1.02 3.361 1.244 3.616 2.205.24 1.17-.87 1.545-1.966 1.41-.811-.18-1.26-.586-1.755-1.336l-1.83 1.051c.21.48.45.689.81 1.109 1.74 1.756 6.09 1.666 6.871-1.004.029-.09.24-.705.074-1.65l.046.067zm-8.983-7.245h-2.248c0 1.938-.009 3.864-.009 5.805 0 1.232.063 2.363-.138 2.711-.33.689-1.18.601-1.566.48-.396-.196-.597-.466-.83-.855-.063-.105-.11-.196-.127-.196l-1.825 1.125c.305.63.75 1.172 1.324 1.517.855.51 2.004.675 3.207.405.783-.226 1.458-.691 1.811-1.411.51-.93.402-2.07.397-3.346.012-2.054 0-4.109 0-6.179l.004-.056z"
/>
</svg>
),
typescript: (props: LucideProps) => (
typescript: (props: SVGProps<SVGSVGElement>) => (
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" {...props}>
<path
fill="currentColor"
d="M1.125 0C.502 0 0 .502 0 1.125v21.75C0 23.498.502 24 1.125 24h21.75c.623 0 1.125-.502 1.125-1.125V1.125C24 .502 23.498 0 22.875 0zm17.363 9.75c.612 0 1.154.037 1.627.111a6.38 6.38 0 0 1 1.306.34v2.458a3.95 3.95 0 0 0-.643-.361 5.093 5.093 0 0 0-.717-.26 5.453 5.453 0 0 0-1.426-.2c-.3 0-.573.028-.819.086a2.1 2.1 0 0 0-.623.242c-.17.104-.3.229-.393.374a.888.888 0 0 0-.14.49c0 .196.053.373.156.529.104.156.252.304.443.444s.423.276.696.41c.273.135.582.274.926.416.47.197.892.407 1.266.628.374.222.695.473.963.753.268.279.472.598.614.957.142.359.214.776.214 1.253 0 .657-.125 1.21-.373 1.656a3.033 3.033 0 0 1-1.012 1.085 4.38 4.38 0 0 1-1.487.596c-.566.12-1.163.18-1.79.18a9.916 9.916 0 0 1-1.84-.164 5.544 5.544 0 0 1-1.512-.493v-2.63a5.033 5.033 0 0 0 3.237 1.2c.333 0 .624-.03.872-.09.249-.06.456-.144.623-.25.166-.108.29-.234.373-.38a1.023 1.023 0 0 0-.074-1.089 2.12 2.12 0 0 0-.537-.5 5.597 5.597 0 0 0-.807-.444 27.72 27.72 0 0 0-1.007-.436c-.918-.383-1.602-.852-2.053-1.405-.45-.553-.676-1.222-.676-2.005 0-.614.123-1.141.369-1.582.246-.441.58-.804 1.004-1.089a4.494 4.494 0 0 1 1.47-.629 7.536 7.536 0 0 1 1.77-.201zm-15.113.188h9.563v2.166H9.506v9.646H6.789v-9.646H3.375z"
/>
</svg>
),
prisma: (props: LucideProps) => (
prisma: (props: SVGProps<SVGSVGElement>) => (
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" {...props}>
<path
fill="currentColor"
Expand All @@ -74,7 +75,7 @@ export const Icons = {
</svg>
),
bash: TerminalSquare,
menu: (props: LucideProps) => (
menu: (props: SVGProps<SVGSVGElement>) => (
<svg fill="none" width="24" height="24" viewBox="0 0 24 24" stroke="currentColor" {...props}>
<g>
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M4 6h16" />
Expand Down
4 changes: 2 additions & 2 deletions docs/src/components/mdx/code-block.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export function Codeblock(props: CodeblockProps) {
<Icon
data-language-icon
data-theme={theme}
className="text-foreground absolute left-4 top-4 z-20 h-5 w-5"
className="text-foreground absolute top-4 left-4 z-20 h-5 w-5"
/>
)}
<button
Expand All @@ -49,7 +49,7 @@ export function Codeblock(props: CodeblockProps) {
void window.navigator.clipboard.writeText(ref.current.innerText);
setTimeout(() => setCopied(false), 1500);
}}
className="text-muted-foreground hover:bg-muted absolute right-2 top-[10px] z-20 h-8 w-8 cursor-pointer rounded"
className="text-muted-foreground hover:bg-muted absolute top-[10px] right-2 z-20 h-8 w-8 cursor-pointer rounded"
>
<div className="relative h-full w-full p-1">
<Copy className={cn("absolute h-6 w-6 p-0 transition-all", copied && "scale-0")} />
Expand Down
2 changes: 1 addition & 1 deletion docs/tsconfig.tsbuildinfo

Large diffs are not rendered by default.

12 changes: 8 additions & 4 deletions examples/nextjs/app/[slug]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,22 +1,26 @@
import { ghostAdminAPI } from "~/ghost";
import Link from "next/link";
import { notFound, redirect } from "next/navigation";
import { ghostAdminAPI } from "~/ghost";

async function getBlogPost(slug: string) {
const response = await ghostAdminAPI.posts.read({ slug }).formats({ html: true }).fetch();
const response = await ghostAdminAPI.posts
.read({ slug })
.formats({ html: true })
.fields({ title: true, html: true })
.fetch();
if (!response.success) {
console.log(response.errors.join(", "));
return null;
}
return response.data;
const post = response.data;
return post;
}

interface PostProps {
params: { slug: string };
}

export default async function PostPage({ params }: PostProps) {
console.log(params);
const post = await getBlogPost(params.slug);

if (!post) {
Expand Down
14 changes: 14 additions & 0 deletions examples/nextjs/app/ghost.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,17 @@ export const ghostContentAPI = new TSGhostContentAPI(
process.env.GHOST_CONTENT_API_KEY || "",
"v6.0",
);

async function getBlogPost(slug: string) {
const response = await ghostAdminAPI.posts
.read({ slug })
.formats({ html: true })
.fields({ title: true, html: true })
.fetch();
if (!response.success) {
console.log(response.errors.join(", "));
return null;
}
const post = response.data;
return post;
}
7 changes: 0 additions & 7 deletions examples/nextjs/next.config.mjs

This file was deleted.

7 changes: 7 additions & 0 deletions examples/nextjs/next.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import type { NextConfig } from "next";

const nextConfig: NextConfig = {
/* config options here */
};

export default nextConfig;
16 changes: 8 additions & 8 deletions examples/nextjs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,21 @@
"@ts-ghost/content-api": "workspace:*",
"@ts-ghost/core-api": "workspace:*",
"@types/node": "catalog:",
"@types/react": "19.2.2",
"@types/react-dom": "19.2.2",
"next": "16.0.0",
"react": "19.2.0",
"react-dom": "19.2.0",
"@types/react": "19.2.7",
"@types/react-dom": "19.2.3",
"next": "16.1.1",
"react": "19.2.3",
"react-dom": "19.2.3",
"typescript": "catalog:"
},
"pnpm": {
"overrides": {
"@types/react": "19.2.2",
"@types/react-dom": "19.2.2"
"@types/react": "19.2.7",
"@types/react-dom": "19.2.3"
}
},
"devDependencies": {
"eslint": "catalog:eslint",
"eslint-config-next": "catalog:eslint"
"eslint-config-next": "16.1.1"
}
}
18 changes: 10 additions & 8 deletions examples/nextjs/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
{
"compilerOptions": {
"target": "es5",
"target": "esnext",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"checkJs": true,
"skipLibCheck": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"noUnusedLocals": false,
"noUnusedParameters": false,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "node",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"jsx": "react-jsx",
"incremental": true,
"plugins": [
{
Expand All @@ -25,10 +25,12 @@
}
},
"include": [
".next/types/**/*.ts",
"next-env.d.ts",
"next.config.mjs",
"app",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts",
".next/dev/types/**/*.ts",
"**/*.mts"
],
"exclude": ["node_modules"]
}
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"docs:dev": "pnpm --filter=@ts-ghost/docs dev",
"remix:dev": "pnpm --filter=@examples/remix dev",
"build": "turbo run build",
"clean": "turbo run clean",
"test": "turbo run test",
"test:integration": "turbo run test:integration",
"test:integration:watch": "turbo run test:integration:watch",
Expand Down
10 changes: 6 additions & 4 deletions packages/ts-ghost-admin-api/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@
"scripts": {
"dev": "tsup --watch",
"build": "tsup",
"clean": "rimraf .turbo node_modules dist",
"clean": "rimraf .turbo dist",
"nuke": "rimraf .turbo node_modules dist",
"test": "vitest run",
"test:watch": "vitest",
"test:coverage": "vitest run --coverage",
Expand All @@ -53,12 +54,13 @@
"vite": "catalog:",
"vite-tsconfig-paths": "catalog:",
"vitest": "catalog:",
"zod": "^3.22.2"
"zod": "catalog:",
"rimraf": "catalog:"
},
"dependencies": {
"@ts-ghost/core-api": "^6.2.0",
"@ts-ghost/core-api": "workspace:*",
"validator": "^13.11.0",
"zod": "3.23.8"
"zod": "catalog:"
},
"publishConfig": {
"access": "public"
Expand Down
52 changes: 28 additions & 24 deletions packages/ts-ghost-admin-api/src/schemas/members.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,63 +2,64 @@ import { z } from "zod";
import { baseMembersSchema } from "@ts-ghost/core-api";

export const adminMembersCreateSchema = z.object({
email: z.string({ description: "The email address of the member" }).email(),
name: z.string({ description: "The name of the member" }).optional(),
note: z.string({ description: "(nullable) A note about the member" }).optional(),
geolocation: z.string({ description: "(nullable) The geolocation of the member" }).optional(),
email: z.email().meta({ description: "The email address of the member" }),
name: z.string().meta({ description: "The name of the member" }).optional(),
note: z.string().meta({ description: "(nullable) A note about the member" }).optional(),
geolocation: z.string().meta({ description: "(nullable) The geolocation of the member" }).optional(),
labels: z
.array(
z.union([
z.object({
id: z.string({ description: "The ID of the label" }),
id: z.string().meta({ description: "The ID of the label" }),
}),
z.object({
name: z.string({ description: "The name of the label" }),
name: z.string().meta({ description: "The name of the label" }),
}),
z.object({
slug: z.string({ description: "The slug of the label" }),
slug: z.string().meta({ description: "The slug of the label" }),
}),
]),
{ description: "The labels associated with the member" },
)
.meta({ description: "The labels associated with the member" })
.optional(),
products: z
.array(
z.union([
z.object({
id: z.string({ description: "The ID of the subscription" }),
id: z.string().meta({ description: "The ID of the subscription" }),
}),
z.object({
name: z.string({ description: "The name of the subscription" }),
name: z.string().meta({ description: "The name of the subscription" }),
}),
z.object({
slug: z.string({ description: "The slug of the subscription" }),
slug: z.string().meta({ description: "The slug of the subscription" }),
}),
]),
{
description: `The products associated with the member, they correspond to a stripe product.
If given the member status will be 'comped' as given away a subscription.`,
},
)
.meta({
description: `The products associated with the member, they correspond to a stripe product.
If given the member status will be 'comped' as given away a subscription.`,
})
.optional(),
// newsletters and subscribed exclude each other. `subscribed`
newsletters: z
.array(
z.union([
z.object({
id: z.string({ description: "The ID of the newsletter" }),
id: z.string().meta({ description: "The ID of the newsletter" }),
}),
z.object({
name: z.string({ description: "The name of the newsletter" }),
name: z.string().meta({ description: "The name of the newsletter" }),
}),
]),
{
description: `Specifing newsletter to subscribe to via id or name, incompatible with the \`subscribed\` property`,
},
)
.meta({
description: `Specifing newsletter to subscribe to via id or name, incompatible with the \`subscribed\` property`,
})
.optional(),
subscribed: z
.boolean({
.boolean()
.meta({
description:
"Will subscribe the user to the default Newsletter, incompatible with the `newsletters` property",
})
Expand All @@ -81,9 +82,12 @@ export const adminMembersSchema = baseMembersSchema.merge(
newsletters: z.array(
z.object({
id: z.string(),
name: z.string({ description: "Public name for the newsletter" }),
description: z.string({ description: "(nullable) Public description of the newsletter" }).nullish(),
status: z.union([z.literal("active"), z.literal("archived")], {
name: z.string().meta({ description: "Public name for the newsletter" }),
description: z
.string()
.meta({ description: "(nullable) Public description of the newsletter" })
.nullish(),
status: z.union([z.literal("active"), z.literal("archived")]).meta({
description: "active or archived - denotes if the newsletter is active or archived",
}),
}),
Expand Down
2 changes: 1 addition & 1 deletion packages/ts-ghost-admin-api/src/schemas/newsletters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ export const adminNewsletterCreateSchema = z.object({
name: z.string(),
description: z.string().max(3000).optional(),
sender_name: z.string(),
sender_email: z.string().email().nullish(),
sender_email: z.email().nullish(),
sender_reply_to: z.string().optional(),
status: z.union([z.literal("active"), z.literal("archived")]).optional(),
subscribe_on_signup: z.boolean().optional(),
Expand Down
Loading