create-kide-app 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js CHANGED
@@ -118,6 +118,13 @@ async function main() {
118
118
  cpSync(path.join(targetDir, "db.ts"), path.join(projectDir, "src/cms/core/db.ts"));
119
119
  cpSync(path.join(targetDir, "drizzle.config.ts"), path.join(projectDir, "drizzle.config.ts"));
120
120
 
121
+ if (target === "cloudflare") {
122
+ cpSync(path.join(targetDir, "storage.ts"), path.join(projectDir, "src/cms/core/storage.ts"));
123
+ const uploadsRouteDir = path.join(projectDir, "src/pages/uploads");
124
+ mkdirSync(uploadsRouteDir, { recursive: true });
125
+ cpSync(path.join(targetDir, "uploads-route.ts"), path.join(uploadsRouteDir, "[...path].ts"));
126
+ }
127
+
121
128
  const pkgPath = path.join(projectDir, "package.json");
122
129
  const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
123
130
 
@@ -127,14 +134,13 @@ async function main() {
127
134
  delete pkg.dependencies["@astrojs/node"];
128
135
  pkg.dependencies["@astrojs/cloudflare"] = "^13.0.0";
129
136
 
130
- delete pkg.dependencies["better-sqlite3"];
131
- delete pkg.dependencies["sharp"];
132
- if (pkg.devDependencies) delete pkg.devDependencies["@types/better-sqlite3"];
133
- if (pkg.pnpm?.onlyBuiltDependencies) {
134
- pkg.pnpm.onlyBuiltDependencies = pkg.pnpm.onlyBuiltDependencies.filter((d) => d !== "better-sqlite3");
135
- if (pkg.pnpm.onlyBuiltDependencies.length === 0) delete pkg.pnpm.onlyBuiltDependencies;
136
- if (Object.keys(pkg.pnpm).length === 0) delete pkg.pnpm;
137
+ // Move better-sqlite3 to devDependencies — drizzle-kit needs it to push schema to local D1
138
+ if (pkg.dependencies["better-sqlite3"]) {
139
+ if (!pkg.devDependencies) pkg.devDependencies = {};
140
+ pkg.devDependencies["better-sqlite3"] = pkg.dependencies["better-sqlite3"];
141
+ delete pkg.dependencies["better-sqlite3"];
137
142
  }
143
+ delete pkg.dependencies["sharp"];
138
144
 
139
145
  let wranglerContent = readFileSync(path.join(targetDir, "wrangler.toml"), "utf-8");
140
146
  wranglerContent = wranglerContent.replaceAll("{{PROJECT_NAME}}", projectName);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-kide-app",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "description": "Scaffold a new Kide CMS project",
5
5
  "author": "Matti Hernesniemi",
6
6
  "license": "MIT",
@@ -1,11 +1,18 @@
1
+ import { readdirSync } from "node:fs";
1
2
  import { defineConfig } from "drizzle-kit";
2
3
 
4
+ function getLocalD1Path() {
5
+ const dir = ".wrangler/state/v3/d1/miniflare-D1DatabaseObject";
6
+ const file = readdirSync(dir).find((f) => f.endsWith(".sqlite") && f !== "*.sqlite");
7
+ if (!file) throw new Error(`No D1 sqlite file found in ${dir}`);
8
+ return `${dir}/${file}`;
9
+ }
10
+
3
11
  export default defineConfig({
4
12
  schema: "./src/cms/.generated/schema.ts",
5
13
  out: "./src/cms/migrations",
6
14
  dialect: "sqlite",
7
15
  dbCredentials: {
8
- // For local dev with wrangler, point to the local D1 database
9
- url: ".wrangler/state/v3/d1/miniflare-D1DatabaseObject/*.sqlite",
16
+ url: getLocalD1Path(),
10
17
  },
11
18
  });
@@ -0,0 +1,25 @@
1
+ import { env } from "cloudflare:workers";
2
+
3
+ function getBucket(): R2Bucket {
4
+ const bucket = (env as any).CMS_ASSETS as R2Bucket | undefined;
5
+ if (!bucket) throw new Error("R2 bucket binding CMS_ASSETS not found. Check wrangler.toml.");
6
+ return bucket;
7
+ }
8
+
9
+ function toKey(storagePath: string): string {
10
+ return storagePath.startsWith("/") ? storagePath.slice(1) : storagePath;
11
+ }
12
+
13
+ export async function putFile(storagePath: string, data: ArrayBuffer | Uint8Array): Promise<void> {
14
+ await getBucket().put(toKey(storagePath), data);
15
+ }
16
+
17
+ export async function getFile(storagePath: string): Promise<ArrayBuffer | null> {
18
+ const obj = await getBucket().get(toKey(storagePath));
19
+ if (!obj) return null;
20
+ return obj.arrayBuffer();
21
+ }
22
+
23
+ export async function deleteFile(storagePath: string): Promise<void> {
24
+ await getBucket().delete(toKey(storagePath));
25
+ }
@@ -0,0 +1,36 @@
1
+ import type { APIRoute } from "astro";
2
+ import { getFile } from "@/cms/core/storage";
3
+
4
+ export const prerender = false;
5
+
6
+ const MIME_TYPES: Record<string, string> = {
7
+ ".jpg": "image/jpeg",
8
+ ".jpeg": "image/jpeg",
9
+ ".png": "image/png",
10
+ ".gif": "image/gif",
11
+ ".webp": "image/webp",
12
+ ".avif": "image/avif",
13
+ ".svg": "image/svg+xml",
14
+ ".pdf": "application/pdf",
15
+ ".mp4": "video/mp4",
16
+ ".webm": "video/webm",
17
+ };
18
+
19
+ export const GET: APIRoute = async ({ params }) => {
20
+ const filePath = `/uploads/${params.path}`;
21
+ const data = await getFile(filePath);
22
+
23
+ if (!data) {
24
+ return new Response("Not found", { status: 404 });
25
+ }
26
+
27
+ const ext = filePath.substring(filePath.lastIndexOf(".")).toLowerCase();
28
+ const contentType = MIME_TYPES[ext] || "application/octet-stream";
29
+
30
+ return new Response(data, {
31
+ headers: {
32
+ "Content-Type": contentType,
33
+ "Cache-Control": "public, max-age=31536000, immutable",
34
+ },
35
+ });
36
+ };